1#!/usr/bin/env python 2# Copyright 2015 The Chromium Authors. All rights reserved. 3# Use of this source code is governed by a BSD-style license that can be 4# found in the LICENSE file. 5 6"""Create a JSON file containing PCI ID-to-name mappings for Intel GPUs. 7 8This script uses upstream Mesa to get the latest PCI ID list. 9The list is used by get_gpu_family() in site_utils.py. 10This script should be run occasionally to keep the list up-to-date. 11""" 12 13import json 14import shutil 15import subprocess as sp 16import tempfile 17 18 19def map_gpu_name(mesa_name): 20 """Map Mesa GPU names to autotest names. 21 """ 22 family_name_map = { 23 'Pineview': 'pinetrail', 24 'Ironlake': 'ironlake', 25 'Sandybridge': 'sandybridge', 26 'Ivybridge': 'ivybridge', 27 'Haswell': 'haswell', 28 'Bay Trail': 'baytrail', 29 'Broadwell': 'broadwell', 30 'Cherryview': 'braswell', 31 'Skylake': 'skylake', 32 'Broxton': 'broxton', 33 'Kabylake': 'kabylake' 34 } 35 36 for name in family_name_map: 37 if name in mesa_name: 38 return family_name_map[name] 39 return '' 40 41 42def main(): 43 """Extract Intel GPU PCI IDs from upstream Mesa and write to JSON file. 44 """ 45 46 in_files = ['i915_pci_ids.h', 'i965_pci_ids.h'] 47 out_file = 'intel_pci_ids.json' 48 remote_repo = 'http://anongit.freedesktop.org/git/mesa/mesa.git' 49 local_repo = tempfile.mkdtemp() 50 51 pci_ids = {} 52 53 cmd = 'git clone --no-checkout --depth 1 %s %s' % (remote_repo, local_repo) 54 55 try: 56 sp.check_call(cmd, shell=True) 57 except sp.CalledProcessError as err: 58 print 'Cannot clone Mesa repo (%d)' % err.returncode 59 exit() 60 61 chipsets = [] 62 cmd = 'cd %s; git show HEAD:include/pci_ids/' % local_repo 63 for id_file in in_files: 64 chipsets.extend(sp.check_output(cmd + id_file, 65 shell=True).splitlines()) 66 shutil.rmtree(local_repo) 67 68 for cset in chipsets: 69 cset_attr = cset[len('CHIPSET('):-2].split(',') 70 71 # Remove leading and trailing spaces and double quotes. 72 for i in range(0, len(cset_attr)): 73 cset_attr[i] = cset_attr[i].strip(' "').rstrip(' "') 74 75 pci_id = cset_attr[0].lower() 76 family_name = map_gpu_name(cset_attr[2]) 77 78 # Ignore GPU families not in family_name_map. 79 if family_name: 80 pci_ids[pci_id] = family_name 81 82 with open(out_file, 'w') as out_f: 83 json.dump(pci_ids, out_f, sort_keys=True, indent=4, 84 separators=(',', ': ')) 85 86 87if __name__ == '__main__': 88 main() 89