You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
146 lines
4.1 KiB
146 lines
4.1 KiB
4 months ago
|
#!/usr/bin/env python3
|
||
|
|
||
|
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', 'bdw',
|
||
|
'chv', 'skl', 'bxt', 'kbl')
|
||
|
def parse_platforms(line, p):
|
||
|
l = p.split(',')
|
||
|
for p in l:
|
||
|
if p not in valid_platforms:
|
||
|
sys.stdout.write("warning: %s\n" % line)
|
||
|
sys.stdout.write("unknown platform %s\n" % p)
|
||
|
return l
|
||
|
|
||
|
wa_re = re.compile('(?P<name>W[aA][A-Z0-9][a-zA-Z0-9_]+):(?P<platforms>[a-z,]+)')
|
||
|
waname_re = re.compile('(?P<name>W[aA][A-Z0-9][a-zA-Z0-9_]+)')
|
||
|
def parse(me):
|
||
|
for line in me.splitlines():
|
||
|
match = wa_re.search(str(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("warning: %s\n" % line)
|
||
|
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:
|
||
|
platforms = parse_platforms(line, platforms)
|
||
|
for p in platforms:
|
||
|
if not p in workarounds[wa_name]:
|
||
|
workarounds[wa_name].append(p)
|
||
|
else:
|
||
|
workarounds[wa_name] = parse_platforms(line, 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 -k path-to-kernel -m path-to-mesa"
|
||
|
parser = optparse.OptionParser(usage, version=1.0)
|
||
|
|
||
|
parser.add_option("-k", "--kernel-path", dest="kernel_path", default=None,
|
||
|
help="path to kernel")
|
||
|
|
||
|
parser.add_option("-m", "--mesa-path", dest="mesa_path", default=None,
|
||
|
help="path to mesa")
|
||
|
|
||
|
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)
|
||
|
|
||
|
def print_workarounds(project_root, driver_dir, project):
|
||
|
olddir = os.getcwd()
|
||
|
os.chdir(project_root)
|
||
|
work_arounds, err = execute(['git', 'grep', '-n',
|
||
|
'-e', 'W[aA][A-Z0-9][a-zA-Z0-9_]\+',
|
||
|
driver_dir])
|
||
|
os.chdir(olddir)
|
||
|
if err:
|
||
|
print(err)
|
||
|
sys.exit(1)
|
||
|
|
||
|
parse(work_arounds)
|
||
|
print("\nList of workarounds found in %s:" % project)
|
||
|
for wa in sorted(workarounds.keys()):
|
||
|
if not options.platform:
|
||
|
print("%s: %s" % (wa, ', '.join(workarounds[wa])))
|
||
|
elif options.platform in workarounds[wa]:
|
||
|
print(wa)
|
||
|
|
||
|
|
||
|
if __name__ == '__main__':
|
||
|
(options, args) = parse_options(sys.argv)
|
||
|
verbose = options.verbose
|
||
|
kernel_path = None
|
||
|
|
||
|
if not len(args) and options.kernel_path == None and options.mesa_path == None:
|
||
|
sys.stderr.write("error: A path to either a kernel tree or Mesa is required\n")
|
||
|
sys.exit(1)
|
||
|
|
||
|
if len(args):
|
||
|
kernel_path = args[0]
|
||
|
elif options.kernel_path != None:
|
||
|
kernel_path = options.kernel_path
|
||
|
|
||
|
if kernel_path != None:
|
||
|
# --- list Kernel workarounds if path is provided ---
|
||
|
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('drivers', 'gpu', 'drm', 'i915')
|
||
|
print_workarounds(kernel_path, i915_dir, "kernel")
|
||
|
|
||
|
# --- list mesa workarounds if path is provided ---
|
||
|
if options.mesa_path != None:
|
||
|
# reset workarounds array
|
||
|
workarounds = {}
|
||
|
|
||
|
mesa_path = options.mesa_path
|
||
|
i965_dir = os.path.join('src', 'mesa', 'drivers', 'dri', 'i965')
|
||
|
mesa_dir = os.path.join(mesa_path, i965_dir)
|
||
|
if not os.path.exists(mesa_dir):
|
||
|
sys.stderr.write("error: %s does not point to a valid mesa path \n"
|
||
|
% mesa_path)
|
||
|
sys.exit(1)
|
||
|
|
||
|
print_workarounds(mesa_path, i965_dir, "Mesa")
|