blob: 3514aed1403d5a73e01af38289001b28f24253f1 [file] [log] [blame]
Ben Widawsky0e893192013-05-10 15:25:49 -07001#!/usr/bin/env python3
Damien Lespiaub9765af2013-05-03 16:08:25 +01002
3import os,sys
4import optparse
5import subprocess
6import re
7import operator
8
9# map of Workaround names -> (list of platforms)
10workarounds = {}
11verbose = False
12
13def find_nth(haystack, needle, n):
14 start = haystack.find(needle)
15 while start >= 0 and n > 1:
16 start = haystack.find(needle, start + len(needle))
17 n -= 1
18 return start
19
20valid_platforms = ('ctg', 'elk', 'ilk', 'snb', 'ivb', 'vlv', 'hsw')
21def parse_platforms(p):
22 l = p.split(',')
23 for p in l:
24 if p not in valid_platforms:
25 sys.stdout.write("unknown platform %s\n" % p)
26 return l
27
28wa_re = re.compile('(?P<name>Wa[A-Z0-9][a-zA-Z0-9_]+):(?P<platforms>[a-z,]+)')
29waname_re = re.compile('(?P<name>Wa[A-Z0-9][a-zA-Z0-9_]+)')
30def parse(me):
31 for line in me.splitlines():
Ben Widawsky0e893192013-05-10 15:25:49 -070032 match = wa_re.search(str(line))
Damien Lespiaub9765af2013-05-03 16:08:25 +010033 if not match:
34 if not verbose:
35 continue
36
37 # Those lines come from a git grep that looks for Wa
38 # names, so if we don't match wa_re here it's because
39 # no platform has been specified
40 name = waname_re.search(line).group('name')
41 path = line[:find_nth(line, ':', 2)]
42 sys.stdout.write("%s: no platform for %s\n"
43 % (path, name))
44 continue
45
46 wa_name = match.group('name')
47 platforms = match.group('platforms')
48
49 if wa_name in workarounds:
Damien Lespiau397dcb72013-05-10 14:37:10 +010050 platforms = parse_platforms(platforms)
51 for p in platforms:
52 if not p in workarounds[wa_name]:
53 workarounds[wa_name].append(p)
Damien Lespiaub9765af2013-05-03 16:08:25 +010054 else:
55 workarounds[wa_name] = parse_platforms(platforms)
56
57
58def execute(cmd):
59 p = subprocess.Popen(cmd, stdout=subprocess.PIPE,
60 stderr=subprocess.PIPE)
61 out, err = p.communicate()
62 return out, err
63
64def parse_options(args):
65 usage = "Usage: list-workarounds [options] path-to-kernel"
66 parser = optparse.OptionParser(usage, version=1.0)
67
68 parser.add_option("-v", "--verbose", action="store_true",
69 dest="verbose", default=False,
70 help="be more verbose")
71
72 parser.add_option("-p", "--platform", dest="platform", default=None,
73 help="List workarounds for the specified platform")
74
75 (options, args) = parser.parse_args()
76
77 return (options, args)
78
79if __name__ == '__main__':
80 (options, args) = parse_options(sys.argv[1:])
81 verbose = options.verbose
82
83 if not len(args):
84 sys.stderr.write("error: A path to a kernel tree is required\n")
85 sys.exit(1)
86
87 kernel_path = args[0]
88 kconfig = os.path.join(kernel_path, 'Kconfig')
89 if not os.path.isfile(kconfig):
90 sys.stderr.write("error: %s does not point to a kernel tree \n"
91 % kernel_path)
92 sys.exit(1)
93
Damien Lespiau81ba0052013-05-23 12:11:26 +010094 i915_dir = os.path.join('drivers', 'gpu', 'drm', 'i915')
Damien Lespiaub9765af2013-05-03 16:08:25 +010095 olddir = os.getcwd()
96 os.chdir(kernel_path)
97 work_arounds, err = execute(['git', 'grep', '-n',
98 '-e', 'Wa[A-Z0-9][a-zA-Z0-9_]\+',
99 i915_dir])
100 os.chdir(olddir)
101 if err:
102 print(err)
103 sys.exit(1)
104
105 parse(work_arounds)
Ben Widawsky0e893192013-05-10 15:25:49 -0700106 for wa in sorted(workarounds.keys()):
Damien Lespiaub9765af2013-05-03 16:08:25 +0100107 if not options.platform:
108 print("%s: %s" % (wa, ', '.join(workarounds[wa])))
109 elif options.platform in workarounds[wa]:
110 print(wa)