blob: d11b6a9dbb80bd5ba965ea36d3cf1f40668c97d0 [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
Damien Lespiau8c4dd1d2013-05-31 15:33:21 +010020valid_platforms = ('ctg', 'elk', 'ilk', 'snb', 'ivb', 'vlv', 'hsw', 'bdw',
Damien Lespiau790398b2015-03-31 20:32:33 +030021 'chv', 'skl', 'bxt')
Damien Lespiauc0a07252015-05-19 15:04:03 +010022def parse_platforms(line, p):
Damien Lespiaub9765af2013-05-03 16:08:25 +010023 l = p.split(',')
24 for p in l:
25 if p not in valid_platforms:
Damien Lespiauc0a07252015-05-19 15:04:03 +010026 sys.stdout.write("warning: %s\n" % line)
Damien Lespiaub9765af2013-05-03 16:08:25 +010027 sys.stdout.write("unknown platform %s\n" % p)
28 return l
29
Damien Lespiau17523ef2013-06-06 16:52:09 +010030wa_re = re.compile('(?P<name>W[aA][A-Z0-9][a-zA-Z0-9_]+):(?P<platforms>[a-z,]+)')
31waname_re = re.compile('(?P<name>W[aA][A-Z0-9][a-zA-Z0-9_]+)')
Damien Lespiaub9765af2013-05-03 16:08:25 +010032def parse(me):
33 for line in me.splitlines():
Ben Widawsky0e893192013-05-10 15:25:49 -070034 match = wa_re.search(str(line))
Damien Lespiaub9765af2013-05-03 16:08:25 +010035 if not match:
36 if not verbose:
37 continue
38
39 # Those lines come from a git grep that looks for Wa
40 # names, so if we don't match wa_re here it's because
41 # no platform has been specified
42 name = waname_re.search(line).group('name')
43 path = line[:find_nth(line, ':', 2)]
Damien Lespiauc0a07252015-05-19 15:04:03 +010044 sys.stdout.write("warning: %s\n" % line)
Damien Lespiaub9765af2013-05-03 16:08:25 +010045 sys.stdout.write("%s: no platform for %s\n"
46 % (path, name))
47 continue
48
49 wa_name = match.group('name')
50 platforms = match.group('platforms')
51
52 if wa_name in workarounds:
Damien Lespiauc0a07252015-05-19 15:04:03 +010053 platforms = parse_platforms(line, platforms)
Damien Lespiau397dcb72013-05-10 14:37:10 +010054 for p in platforms:
55 if not p in workarounds[wa_name]:
56 workarounds[wa_name].append(p)
Damien Lespiaub9765af2013-05-03 16:08:25 +010057 else:
Damien Lespiauc0a07252015-05-19 15:04:03 +010058 workarounds[wa_name] = parse_platforms(line, platforms)
Damien Lespiaub9765af2013-05-03 16:08:25 +010059
60
61def execute(cmd):
62 p = subprocess.Popen(cmd, stdout=subprocess.PIPE,
63 stderr=subprocess.PIPE)
64 out, err = p.communicate()
65 return out, err
66
67def parse_options(args):
68 usage = "Usage: list-workarounds [options] path-to-kernel"
69 parser = optparse.OptionParser(usage, version=1.0)
70
71 parser.add_option("-v", "--verbose", action="store_true",
72 dest="verbose", default=False,
73 help="be more verbose")
74
75 parser.add_option("-p", "--platform", dest="platform", default=None,
76 help="List workarounds for the specified platform")
77
78 (options, args) = parser.parse_args()
79
80 return (options, args)
81
82if __name__ == '__main__':
83 (options, args) = parse_options(sys.argv[1:])
84 verbose = options.verbose
85
86 if not len(args):
87 sys.stderr.write("error: A path to a kernel tree is required\n")
88 sys.exit(1)
89
90 kernel_path = args[0]
91 kconfig = os.path.join(kernel_path, 'Kconfig')
92 if not os.path.isfile(kconfig):
93 sys.stderr.write("error: %s does not point to a kernel tree \n"
94 % kernel_path)
95 sys.exit(1)
96
Damien Lespiau81ba0052013-05-23 12:11:26 +010097 i915_dir = os.path.join('drivers', 'gpu', 'drm', 'i915')
Damien Lespiaub9765af2013-05-03 16:08:25 +010098 olddir = os.getcwd()
99 os.chdir(kernel_path)
100 work_arounds, err = execute(['git', 'grep', '-n',
Damien Lespiau17523ef2013-06-06 16:52:09 +0100101 '-e', 'W[aA][A-Z0-9][a-zA-Z0-9_]\+',
Damien Lespiaub9765af2013-05-03 16:08:25 +0100102 i915_dir])
103 os.chdir(olddir)
104 if err:
105 print(err)
106 sys.exit(1)
107
108 parse(work_arounds)
Ben Widawsky0e893192013-05-10 15:25:49 -0700109 for wa in sorted(workarounds.keys()):
Damien Lespiaub9765af2013-05-03 16:08:25 +0100110 if not options.platform:
111 print("%s: %s" % (wa, ', '.join(workarounds[wa])))
112 elif options.platform in workarounds[wa]:
113 print(wa)