blob: 7bfd82dd185cb36ca1114f86e12934d38ff59741 [file] [log] [blame]
Damien Lespiaub9765af2013-05-03 16:08:25 +01001#!/usr/bin/env python
2
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():
32 match = wa_re.search(line)
33 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:
50 workarounds[wa_name] += parse_platforms(platforms)
51 else:
52 workarounds[wa_name] = parse_platforms(platforms)
53
54
55def execute(cmd):
56 p = subprocess.Popen(cmd, stdout=subprocess.PIPE,
57 stderr=subprocess.PIPE)
58 out, err = p.communicate()
59 return out, err
60
61def parse_options(args):
62 usage = "Usage: list-workarounds [options] path-to-kernel"
63 parser = optparse.OptionParser(usage, version=1.0)
64
65 parser.add_option("-v", "--verbose", action="store_true",
66 dest="verbose", default=False,
67 help="be more verbose")
68
69 parser.add_option("-p", "--platform", dest="platform", default=None,
70 help="List workarounds for the specified platform")
71
72 (options, args) = parser.parse_args()
73
74 return (options, args)
75
76if __name__ == '__main__':
77 (options, args) = parse_options(sys.argv[1:])
78 verbose = options.verbose
79
80 if not len(args):
81 sys.stderr.write("error: A path to a kernel tree is required\n")
82 sys.exit(1)
83
84 kernel_path = args[0]
85 kconfig = os.path.join(kernel_path, 'Kconfig')
86 if not os.path.isfile(kconfig):
87 sys.stderr.write("error: %s does not point to a kernel tree \n"
88 % kernel_path)
89 sys.exit(1)
90
91 i915_dir = os.path.join(kernel_path, 'drivers', 'gpu', 'drm', 'i915')
92 olddir = os.getcwd()
93 os.chdir(kernel_path)
94 work_arounds, err = execute(['git', 'grep', '-n',
95 '-e', 'Wa[A-Z0-9][a-zA-Z0-9_]\+',
96 i915_dir])
97 os.chdir(olddir)
98 if err:
99 print(err)
100 sys.exit(1)
101
102 parse(work_arounds)
103 for wa in sorted(workarounds.iterkeys()):
104 if not options.platform:
105 print("%s: %s" % (wa, ', '.join(workarounds[wa])))
106 elif options.platform in workarounds[wa]:
107 print(wa)