1*d83cc019SAndroid Build Coastguard Worker#!/usr/bin/env python3 2*d83cc019SAndroid Build Coastguard Worker 3*d83cc019SAndroid Build Coastguard Workerimport os,sys 4*d83cc019SAndroid Build Coastguard Workerimport optparse 5*d83cc019SAndroid Build Coastguard Workerimport subprocess 6*d83cc019SAndroid Build Coastguard Workerimport re 7*d83cc019SAndroid Build Coastguard Workerimport operator 8*d83cc019SAndroid Build Coastguard Worker 9*d83cc019SAndroid Build Coastguard Worker# map of Workaround names -> (list of platforms) 10*d83cc019SAndroid Build Coastguard Workerworkarounds = {} 11*d83cc019SAndroid Build Coastguard Workerverbose = False 12*d83cc019SAndroid Build Coastguard Worker 13*d83cc019SAndroid Build Coastguard Workerdef find_nth(haystack, needle, n): 14*d83cc019SAndroid Build Coastguard Worker start = haystack.find(needle) 15*d83cc019SAndroid Build Coastguard Worker while start >= 0 and n > 1: 16*d83cc019SAndroid Build Coastguard Worker start = haystack.find(needle, start + len(needle)) 17*d83cc019SAndroid Build Coastguard Worker n -= 1 18*d83cc019SAndroid Build Coastguard Worker return start 19*d83cc019SAndroid Build Coastguard Worker 20*d83cc019SAndroid Build Coastguard Workervalid_platforms = ('ctg', 'elk', 'ilk', 'snb', 'ivb', 'vlv', 'hsw', 'bdw', 21*d83cc019SAndroid Build Coastguard Worker 'chv', 'skl', 'bxt', 'kbl') 22*d83cc019SAndroid Build Coastguard Workerdef parse_platforms(line, p): 23*d83cc019SAndroid Build Coastguard Worker l = p.split(',') 24*d83cc019SAndroid Build Coastguard Worker for p in l: 25*d83cc019SAndroid Build Coastguard Worker if p not in valid_platforms: 26*d83cc019SAndroid Build Coastguard Worker sys.stdout.write("warning: %s\n" % line) 27*d83cc019SAndroid Build Coastguard Worker sys.stdout.write("unknown platform %s\n" % p) 28*d83cc019SAndroid Build Coastguard Worker return l 29*d83cc019SAndroid Build Coastguard Worker 30*d83cc019SAndroid Build Coastguard Workerwa_re = re.compile('(?P<name>W[aA][A-Z0-9][a-zA-Z0-9_]+):(?P<platforms>[a-z,]+)') 31*d83cc019SAndroid Build Coastguard Workerwaname_re = re.compile('(?P<name>W[aA][A-Z0-9][a-zA-Z0-9_]+)') 32*d83cc019SAndroid Build Coastguard Workerdef parse(me): 33*d83cc019SAndroid Build Coastguard Worker for line in me.splitlines(): 34*d83cc019SAndroid Build Coastguard Worker match = wa_re.search(str(line)) 35*d83cc019SAndroid Build Coastguard Worker if not match: 36*d83cc019SAndroid Build Coastguard Worker if not verbose: 37*d83cc019SAndroid Build Coastguard Worker continue 38*d83cc019SAndroid Build Coastguard Worker 39*d83cc019SAndroid Build Coastguard Worker # Those lines come from a git grep that looks for Wa 40*d83cc019SAndroid Build Coastguard Worker # names, so if we don't match wa_re here it's because 41*d83cc019SAndroid Build Coastguard Worker # no platform has been specified 42*d83cc019SAndroid Build Coastguard Worker name = waname_re.search(line).group('name') 43*d83cc019SAndroid Build Coastguard Worker path = line[:find_nth(line, ':', 2)] 44*d83cc019SAndroid Build Coastguard Worker sys.stdout.write("warning: %s\n" % line) 45*d83cc019SAndroid Build Coastguard Worker sys.stdout.write("%s: no platform for %s\n" 46*d83cc019SAndroid Build Coastguard Worker % (path, name)) 47*d83cc019SAndroid Build Coastguard Worker continue 48*d83cc019SAndroid Build Coastguard Worker 49*d83cc019SAndroid Build Coastguard Worker wa_name = match.group('name') 50*d83cc019SAndroid Build Coastguard Worker platforms = match.group('platforms') 51*d83cc019SAndroid Build Coastguard Worker 52*d83cc019SAndroid Build Coastguard Worker if wa_name in workarounds: 53*d83cc019SAndroid Build Coastguard Worker platforms = parse_platforms(line, platforms) 54*d83cc019SAndroid Build Coastguard Worker for p in platforms: 55*d83cc019SAndroid Build Coastguard Worker if not p in workarounds[wa_name]: 56*d83cc019SAndroid Build Coastguard Worker workarounds[wa_name].append(p) 57*d83cc019SAndroid Build Coastguard Worker else: 58*d83cc019SAndroid Build Coastguard Worker workarounds[wa_name] = parse_platforms(line, platforms) 59*d83cc019SAndroid Build Coastguard Worker 60*d83cc019SAndroid Build Coastguard Worker 61*d83cc019SAndroid Build Coastguard Workerdef execute(cmd): 62*d83cc019SAndroid Build Coastguard Worker p = subprocess.Popen(cmd, stdout=subprocess.PIPE, 63*d83cc019SAndroid Build Coastguard Worker stderr=subprocess.PIPE) 64*d83cc019SAndroid Build Coastguard Worker out, err = p.communicate() 65*d83cc019SAndroid Build Coastguard Worker return out, err 66*d83cc019SAndroid Build Coastguard Worker 67*d83cc019SAndroid Build Coastguard Workerdef parse_options(args): 68*d83cc019SAndroid Build Coastguard Worker usage = "Usage: list-workarounds [options] path-to-kernel -k path-to-kernel -m path-to-mesa" 69*d83cc019SAndroid Build Coastguard Worker parser = optparse.OptionParser(usage, version=1.0) 70*d83cc019SAndroid Build Coastguard Worker 71*d83cc019SAndroid Build Coastguard Worker parser.add_option("-k", "--kernel-path", dest="kernel_path", default=None, 72*d83cc019SAndroid Build Coastguard Worker help="path to kernel") 73*d83cc019SAndroid Build Coastguard Worker 74*d83cc019SAndroid Build Coastguard Worker parser.add_option("-m", "--mesa-path", dest="mesa_path", default=None, 75*d83cc019SAndroid Build Coastguard Worker help="path to mesa") 76*d83cc019SAndroid Build Coastguard Worker 77*d83cc019SAndroid Build Coastguard Worker parser.add_option("-v", "--verbose", action="store_true", 78*d83cc019SAndroid Build Coastguard Worker dest="verbose", default=False, 79*d83cc019SAndroid Build Coastguard Worker help="be more verbose") 80*d83cc019SAndroid Build Coastguard Worker 81*d83cc019SAndroid Build Coastguard Worker parser.add_option("-p", "--platform", dest="platform", default=None, 82*d83cc019SAndroid Build Coastguard Worker help="List workarounds for the specified platform") 83*d83cc019SAndroid Build Coastguard Worker 84*d83cc019SAndroid Build Coastguard Worker (options, args) = parser.parse_args() 85*d83cc019SAndroid Build Coastguard Worker return (options, args) 86*d83cc019SAndroid Build Coastguard Worker 87*d83cc019SAndroid Build Coastguard Workerdef print_workarounds(project_root, driver_dir, project): 88*d83cc019SAndroid Build Coastguard Worker olddir = os.getcwd() 89*d83cc019SAndroid Build Coastguard Worker os.chdir(project_root) 90*d83cc019SAndroid Build Coastguard Worker work_arounds, err = execute(['git', 'grep', '-n', 91*d83cc019SAndroid Build Coastguard Worker '-e', 'W[aA][A-Z0-9][a-zA-Z0-9_]\+', 92*d83cc019SAndroid Build Coastguard Worker driver_dir]) 93*d83cc019SAndroid Build Coastguard Worker os.chdir(olddir) 94*d83cc019SAndroid Build Coastguard Worker if err: 95*d83cc019SAndroid Build Coastguard Worker print(err) 96*d83cc019SAndroid Build Coastguard Worker sys.exit(1) 97*d83cc019SAndroid Build Coastguard Worker 98*d83cc019SAndroid Build Coastguard Worker parse(work_arounds) 99*d83cc019SAndroid Build Coastguard Worker print("\nList of workarounds found in %s:" % project) 100*d83cc019SAndroid Build Coastguard Worker for wa in sorted(workarounds.keys()): 101*d83cc019SAndroid Build Coastguard Worker if not options.platform: 102*d83cc019SAndroid Build Coastguard Worker print("%s: %s" % (wa, ', '.join(workarounds[wa]))) 103*d83cc019SAndroid Build Coastguard Worker elif options.platform in workarounds[wa]: 104*d83cc019SAndroid Build Coastguard Worker print(wa) 105*d83cc019SAndroid Build Coastguard Worker 106*d83cc019SAndroid Build Coastguard Worker 107*d83cc019SAndroid Build Coastguard Workerif __name__ == '__main__': 108*d83cc019SAndroid Build Coastguard Worker (options, args) = parse_options(sys.argv) 109*d83cc019SAndroid Build Coastguard Worker verbose = options.verbose 110*d83cc019SAndroid Build Coastguard Worker kernel_path = None 111*d83cc019SAndroid Build Coastguard Worker 112*d83cc019SAndroid Build Coastguard Worker if not len(args) and options.kernel_path == None and options.mesa_path == None: 113*d83cc019SAndroid Build Coastguard Worker sys.stderr.write("error: A path to either a kernel tree or Mesa is required\n") 114*d83cc019SAndroid Build Coastguard Worker sys.exit(1) 115*d83cc019SAndroid Build Coastguard Worker 116*d83cc019SAndroid Build Coastguard Worker if len(args): 117*d83cc019SAndroid Build Coastguard Worker kernel_path = args[0] 118*d83cc019SAndroid Build Coastguard Worker elif options.kernel_path != None: 119*d83cc019SAndroid Build Coastguard Worker kernel_path = options.kernel_path 120*d83cc019SAndroid Build Coastguard Worker 121*d83cc019SAndroid Build Coastguard Worker if kernel_path != None: 122*d83cc019SAndroid Build Coastguard Worker # --- list Kernel workarounds if path is provided --- 123*d83cc019SAndroid Build Coastguard Worker kconfig = os.path.join(kernel_path, 'Kconfig') 124*d83cc019SAndroid Build Coastguard Worker if not os.path.isfile(kconfig): 125*d83cc019SAndroid Build Coastguard Worker sys.stderr.write("error: %s does not point to a kernel tree \n" 126*d83cc019SAndroid Build Coastguard Worker % kernel_path) 127*d83cc019SAndroid Build Coastguard Worker sys.exit(1) 128*d83cc019SAndroid Build Coastguard Worker 129*d83cc019SAndroid Build Coastguard Worker i915_dir = os.path.join('drivers', 'gpu', 'drm', 'i915') 130*d83cc019SAndroid Build Coastguard Worker print_workarounds(kernel_path, i915_dir, "kernel") 131*d83cc019SAndroid Build Coastguard Worker 132*d83cc019SAndroid Build Coastguard Worker # --- list mesa workarounds if path is provided --- 133*d83cc019SAndroid Build Coastguard Worker if options.mesa_path != None: 134*d83cc019SAndroid Build Coastguard Worker # reset workarounds array 135*d83cc019SAndroid Build Coastguard Worker workarounds = {} 136*d83cc019SAndroid Build Coastguard Worker 137*d83cc019SAndroid Build Coastguard Worker mesa_path = options.mesa_path 138*d83cc019SAndroid Build Coastguard Worker i965_dir = os.path.join('src', 'mesa', 'drivers', 'dri', 'i965') 139*d83cc019SAndroid Build Coastguard Worker mesa_dir = os.path.join(mesa_path, i965_dir) 140*d83cc019SAndroid Build Coastguard Worker if not os.path.exists(mesa_dir): 141*d83cc019SAndroid Build Coastguard Worker sys.stderr.write("error: %s does not point to a valid mesa path \n" 142*d83cc019SAndroid Build Coastguard Worker % mesa_path) 143*d83cc019SAndroid Build Coastguard Worker sys.exit(1) 144*d83cc019SAndroid Build Coastguard Worker 145*d83cc019SAndroid Build Coastguard Worker print_workarounds(mesa_path, i965_dir, "Mesa") 146