summaryrefslogtreecommitdiff
path: root/scripts/list-workarounds
diff options
context:
space:
mode:
authorDamien Lespiau <damien.lespiau@intel.com>2013-05-03 16:08:25 +0100
committerDamien Lespiau <damien.lespiau@intel.com>2013-05-08 13:27:24 +0100
commitb9765af636510fe0896c8e1648a4cd003cd91ca1 (patch)
tree4d2817404338256dec71527077dffd3c0835ad56 /scripts/list-workarounds
parenta417ef7cc8ebe01a3198849db8cf9e6896c54a0b (diff)
scripts: Add a script to list implemented workarounds
We document the implemented workarounds with workaround_name:platforms with platforms being a comma separated list of 3-letters platform names. This scripts gather those tags and output a summary of implemented work arounds. Example usages: $ ./scripts/list-workarounds ~/gfx/sources/linux-2.6/ WaApplyL3ControlAndL3ChickenMode: hsw, ivb, vlv WaCatErrorRejectionIssue: hsw, ivb, vlv WaDisable4x2SubspanOptimization: hsw, ivb WaDisableBackToBackFlipFix: ivb, vlv WaDisableDopClockGating: vlv .... $ ./scripts/list-workarounds ~/gfx/sources/linux-2.6/ -p ivb WaApplyL3ControlAndL3ChickenMode WaCatErrorRejectionIssue WaDisable4x2SubspanOptimization WaDisableBackToBackFlipFix WaDisableEarlyCull ... Signed-off-by: Damien Lespiau <damien.lespiau@intel.com>
Diffstat (limited to 'scripts/list-workarounds')
-rwxr-xr-xscripts/list-workarounds107
1 files changed, 107 insertions, 0 deletions
diff --git a/scripts/list-workarounds b/scripts/list-workarounds
new file mode 100755
index 00000000..7bfd82dd
--- /dev/null
+++ b/scripts/list-workarounds
@@ -0,0 +1,107 @@
+#!/usr/bin/env python
+
+import os,sys
+import optparse
+import subprocess
+import re
+import operator
+
+# map of Workaround names -> (list of platforms)
+workarounds = {}
+verbose = False
+
+def find_nth(haystack, needle, n):
+ start = haystack.find(needle)
+ while start >= 0 and n > 1:
+ start = haystack.find(needle, start + len(needle))
+ n -= 1
+ return start
+
+valid_platforms = ('ctg', 'elk', 'ilk', 'snb', 'ivb', 'vlv', 'hsw')
+def parse_platforms(p):
+ l = p.split(',')
+ for p in l:
+ if p not in valid_platforms:
+ sys.stdout.write("unknown platform %s\n" % p)
+ return l
+
+wa_re = re.compile('(?P<name>Wa[A-Z0-9][a-zA-Z0-9_]+):(?P<platforms>[a-z,]+)')
+waname_re = re.compile('(?P<name>Wa[A-Z0-9][a-zA-Z0-9_]+)')
+def parse(me):
+ for line in me.splitlines():
+ match = wa_re.search(line)
+ if not match:
+ if not verbose:
+ continue
+
+ # Those lines come from a git grep that looks for Wa
+ # names, so if we don't match wa_re here it's because
+ # no platform has been specified
+ name = waname_re.search(line).group('name')
+ path = line[:find_nth(line, ':', 2)]
+ sys.stdout.write("%s: no platform for %s\n"
+ % (path, name))
+ continue
+
+ wa_name = match.group('name')
+ platforms = match.group('platforms')
+
+ if wa_name in workarounds:
+ workarounds[wa_name] += parse_platforms(platforms)
+ else:
+ workarounds[wa_name] = parse_platforms(platforms)
+
+
+def execute(cmd):
+ p = subprocess.Popen(cmd, stdout=subprocess.PIPE,
+ stderr=subprocess.PIPE)
+ out, err = p.communicate()
+ return out, err
+
+def parse_options(args):
+ usage = "Usage: list-workarounds [options] path-to-kernel"
+ parser = optparse.OptionParser(usage, version=1.0)
+
+ parser.add_option("-v", "--verbose", action="store_true",
+ dest="verbose", default=False,
+ help="be more verbose")
+
+ parser.add_option("-p", "--platform", dest="platform", default=None,
+ help="List workarounds for the specified platform")
+
+ (options, args) = parser.parse_args()
+
+ return (options, args)
+
+if __name__ == '__main__':
+ (options, args) = parse_options(sys.argv[1:])
+ verbose = options.verbose
+
+ if not len(args):
+ sys.stderr.write("error: A path to a kernel tree is required\n")
+ sys.exit(1)
+
+ kernel_path = args[0]
+ kconfig = os.path.join(kernel_path, 'Kconfig')
+ if not os.path.isfile(kconfig):
+ sys.stderr.write("error: %s does not point to a kernel tree \n"
+ % kernel_path)
+ sys.exit(1)
+
+ i915_dir = os.path.join(kernel_path, 'drivers', 'gpu', 'drm', 'i915')
+ olddir = os.getcwd()
+ os.chdir(kernel_path)
+ work_arounds, err = execute(['git', 'grep', '-n',
+ '-e', 'Wa[A-Z0-9][a-zA-Z0-9_]\+',
+ i915_dir])
+ os.chdir(olddir)
+ if err:
+ print(err)
+ sys.exit(1)
+
+ parse(work_arounds)
+ for wa in sorted(workarounds.iterkeys()):
+ if not options.platform:
+ print("%s: %s" % (wa, ', '.join(workarounds[wa])))
+ elif options.platform in workarounds[wa]:
+ print(wa)