xref: /aosp_15_r20/external/igt-gpu-tools/scripts/list-workarounds (revision d83cc019efdc2edc6c4b16e9034a3ceb8d35d77c)
1*d83cc019SAndroid Build Coastguard Worker#!/usr/bin/env python3
2*d83cc019SAndroid Build Coastguard Worker
3*d83cc019SAndroid Build Coastguard Workerimport os,sys
4*d83cc019SAndroid Build Coastguard Workerimport optparse
5*d83cc019SAndroid Build Coastguard Workerimport subprocess
6*d83cc019SAndroid Build Coastguard Workerimport re
7*d83cc019SAndroid Build Coastguard Workerimport operator
8*d83cc019SAndroid Build Coastguard Worker
9*d83cc019SAndroid Build Coastguard Worker# map of Workaround names -> (list of platforms)
10*d83cc019SAndroid Build Coastguard Workerworkarounds = {}
11*d83cc019SAndroid Build Coastguard Workerverbose = False
12*d83cc019SAndroid Build Coastguard Worker
13*d83cc019SAndroid Build Coastguard Workerdef find_nth(haystack, needle, n):
14*d83cc019SAndroid Build Coastguard Worker	start = haystack.find(needle)
15*d83cc019SAndroid Build Coastguard Worker	while start >= 0 and n > 1:
16*d83cc019SAndroid Build Coastguard Worker		start = haystack.find(needle, start + len(needle))
17*d83cc019SAndroid Build Coastguard Worker		n -= 1
18*d83cc019SAndroid Build Coastguard Worker	return start
19*d83cc019SAndroid Build Coastguard Worker
20*d83cc019SAndroid Build Coastguard Workervalid_platforms = ('ctg', 'elk', 'ilk', 'snb', 'ivb', 'vlv', 'hsw', 'bdw',
21*d83cc019SAndroid Build Coastguard Worker		   'chv', 'skl', 'bxt', 'kbl')
22*d83cc019SAndroid Build Coastguard Workerdef parse_platforms(line, p):
23*d83cc019SAndroid Build Coastguard Worker	l =  p.split(',')
24*d83cc019SAndroid Build Coastguard Worker	for p in l:
25*d83cc019SAndroid Build Coastguard Worker		if p not in valid_platforms:
26*d83cc019SAndroid Build Coastguard Worker			sys.stdout.write("warning: %s\n" % line)
27*d83cc019SAndroid Build Coastguard Worker			sys.stdout.write("unknown platform %s\n" % p)
28*d83cc019SAndroid Build Coastguard Worker	return l
29*d83cc019SAndroid Build Coastguard Worker
30*d83cc019SAndroid Build Coastguard Workerwa_re = re.compile('(?P<name>W[aA][A-Z0-9][a-zA-Z0-9_]+):(?P<platforms>[a-z,]+)')
31*d83cc019SAndroid Build Coastguard Workerwaname_re = re.compile('(?P<name>W[aA][A-Z0-9][a-zA-Z0-9_]+)')
32*d83cc019SAndroid Build Coastguard Workerdef parse(me):
33*d83cc019SAndroid Build Coastguard Worker	for line in me.splitlines():
34*d83cc019SAndroid Build Coastguard Worker		match = wa_re.search(str(line))
35*d83cc019SAndroid Build Coastguard Worker		if not match:
36*d83cc019SAndroid Build Coastguard Worker			if not verbose:
37*d83cc019SAndroid Build Coastguard Worker				continue
38*d83cc019SAndroid Build Coastguard Worker
39*d83cc019SAndroid Build Coastguard Worker			# Those lines come from a git grep that looks for Wa
40*d83cc019SAndroid Build Coastguard Worker			# names, so if we don't match wa_re here it's because
41*d83cc019SAndroid Build Coastguard Worker			# no platform has been specified
42*d83cc019SAndroid Build Coastguard Worker			name = waname_re.search(line).group('name')
43*d83cc019SAndroid Build Coastguard Worker			path = line[:find_nth(line, ':', 2)]
44*d83cc019SAndroid Build Coastguard Worker			sys.stdout.write("warning: %s\n" % line)
45*d83cc019SAndroid Build Coastguard Worker			sys.stdout.write("%s: no platform for %s\n"
46*d83cc019SAndroid Build Coastguard Worker					 % (path, name))
47*d83cc019SAndroid Build Coastguard Worker			continue
48*d83cc019SAndroid Build Coastguard Worker
49*d83cc019SAndroid Build Coastguard Worker		wa_name = match.group('name')
50*d83cc019SAndroid Build Coastguard Worker		platforms = match.group('platforms')
51*d83cc019SAndroid Build Coastguard Worker
52*d83cc019SAndroid Build Coastguard Worker		if wa_name in workarounds:
53*d83cc019SAndroid Build Coastguard Worker			platforms = parse_platforms(line, platforms)
54*d83cc019SAndroid Build Coastguard Worker			for p in platforms:
55*d83cc019SAndroid Build Coastguard Worker				if not p in workarounds[wa_name]:
56*d83cc019SAndroid Build Coastguard Worker					workarounds[wa_name].append(p)
57*d83cc019SAndroid Build Coastguard Worker		else:
58*d83cc019SAndroid Build Coastguard Worker			workarounds[wa_name] = parse_platforms(line, platforms)
59*d83cc019SAndroid Build Coastguard Worker
60*d83cc019SAndroid Build Coastguard Worker
61*d83cc019SAndroid Build Coastguard Workerdef execute(cmd):
62*d83cc019SAndroid Build Coastguard Worker	p = subprocess.Popen(cmd, stdout=subprocess.PIPE,
63*d83cc019SAndroid Build Coastguard Worker			     stderr=subprocess.PIPE)
64*d83cc019SAndroid Build Coastguard Worker	out, err = p.communicate()
65*d83cc019SAndroid Build Coastguard Worker	return out, err
66*d83cc019SAndroid Build Coastguard Worker
67*d83cc019SAndroid Build Coastguard Workerdef parse_options(args):
68*d83cc019SAndroid Build Coastguard Worker	usage = "Usage: list-workarounds [options] path-to-kernel -k path-to-kernel -m path-to-mesa"
69*d83cc019SAndroid Build Coastguard Worker	parser = optparse.OptionParser(usage, version=1.0)
70*d83cc019SAndroid Build Coastguard Worker
71*d83cc019SAndroid Build Coastguard Worker	parser.add_option("-k", "--kernel-path", dest="kernel_path", default=None,
72*d83cc019SAndroid Build Coastguard Worker			  help="path to kernel")
73*d83cc019SAndroid Build Coastguard Worker
74*d83cc019SAndroid Build Coastguard Worker	parser.add_option("-m", "--mesa-path", dest="mesa_path", default=None,
75*d83cc019SAndroid Build Coastguard Worker			  help="path to mesa")
76*d83cc019SAndroid Build Coastguard Worker
77*d83cc019SAndroid Build Coastguard Worker	parser.add_option("-v", "--verbose", action="store_true",
78*d83cc019SAndroid Build Coastguard Worker			  dest="verbose", default=False,
79*d83cc019SAndroid Build Coastguard Worker			  help="be more verbose")
80*d83cc019SAndroid Build Coastguard Worker
81*d83cc019SAndroid Build Coastguard Worker	parser.add_option("-p", "--platform", dest="platform", default=None,
82*d83cc019SAndroid Build Coastguard Worker			  help="List workarounds for the specified platform")
83*d83cc019SAndroid Build Coastguard Worker
84*d83cc019SAndroid Build Coastguard Worker	(options, args) = parser.parse_args()
85*d83cc019SAndroid Build Coastguard Worker	return (options, args)
86*d83cc019SAndroid Build Coastguard Worker
87*d83cc019SAndroid Build Coastguard Workerdef print_workarounds(project_root, driver_dir, project):
88*d83cc019SAndroid Build Coastguard Worker	olddir = os.getcwd()
89*d83cc019SAndroid Build Coastguard Worker	os.chdir(project_root)
90*d83cc019SAndroid Build Coastguard Worker	work_arounds, err = execute(['git', 'grep', '-n',
91*d83cc019SAndroid Build Coastguard Worker				     '-e', 'W[aA][A-Z0-9][a-zA-Z0-9_]\+',
92*d83cc019SAndroid Build Coastguard Worker				     driver_dir])
93*d83cc019SAndroid Build Coastguard Worker	os.chdir(olddir)
94*d83cc019SAndroid Build Coastguard Worker	if err:
95*d83cc019SAndroid Build Coastguard Worker		print(err)
96*d83cc019SAndroid Build Coastguard Worker		sys.exit(1)
97*d83cc019SAndroid Build Coastguard Worker
98*d83cc019SAndroid Build Coastguard Worker	parse(work_arounds)
99*d83cc019SAndroid Build Coastguard Worker	print("\nList of workarounds found in %s:" % project)
100*d83cc019SAndroid Build Coastguard Worker	for wa in sorted(workarounds.keys()):
101*d83cc019SAndroid Build Coastguard Worker		if not options.platform:
102*d83cc019SAndroid Build Coastguard Worker			print("%s: %s" % (wa, ', '.join(workarounds[wa])))
103*d83cc019SAndroid Build Coastguard Worker		elif options.platform in workarounds[wa]:
104*d83cc019SAndroid Build Coastguard Worker			print(wa)
105*d83cc019SAndroid Build Coastguard Worker
106*d83cc019SAndroid Build Coastguard Worker
107*d83cc019SAndroid Build Coastguard Workerif __name__ == '__main__':
108*d83cc019SAndroid Build Coastguard Worker	(options, args) = parse_options(sys.argv)
109*d83cc019SAndroid Build Coastguard Worker	verbose = options.verbose
110*d83cc019SAndroid Build Coastguard Worker	kernel_path = None
111*d83cc019SAndroid Build Coastguard Worker
112*d83cc019SAndroid Build Coastguard Worker	if not len(args) and options.kernel_path == None and options.mesa_path == None:
113*d83cc019SAndroid Build Coastguard Worker		sys.stderr.write("error: A path to either a kernel tree or Mesa is required\n")
114*d83cc019SAndroid Build Coastguard Worker		sys.exit(1)
115*d83cc019SAndroid Build Coastguard Worker
116*d83cc019SAndroid Build Coastguard Worker	if len(args):
117*d83cc019SAndroid Build Coastguard Worker		kernel_path = args[0]
118*d83cc019SAndroid Build Coastguard Worker	elif options.kernel_path != None:
119*d83cc019SAndroid Build Coastguard Worker		kernel_path = options.kernel_path
120*d83cc019SAndroid Build Coastguard Worker
121*d83cc019SAndroid Build Coastguard Worker	if kernel_path != None:
122*d83cc019SAndroid Build Coastguard Worker	# --- list Kernel workarounds if path is provided ---
123*d83cc019SAndroid Build Coastguard Worker		kconfig = os.path.join(kernel_path, 'Kconfig')
124*d83cc019SAndroid Build Coastguard Worker		if not os.path.isfile(kconfig):
125*d83cc019SAndroid Build Coastguard Worker			sys.stderr.write("error: %s does not point to a kernel tree \n"
126*d83cc019SAndroid Build Coastguard Worker							% kernel_path)
127*d83cc019SAndroid Build Coastguard Worker			sys.exit(1)
128*d83cc019SAndroid Build Coastguard Worker
129*d83cc019SAndroid Build Coastguard Worker		i915_dir = os.path.join('drivers', 'gpu', 'drm', 'i915')
130*d83cc019SAndroid Build Coastguard Worker		print_workarounds(kernel_path, i915_dir, "kernel")
131*d83cc019SAndroid Build Coastguard Worker
132*d83cc019SAndroid Build Coastguard Worker	# --- list mesa workarounds if path is provided ---
133*d83cc019SAndroid Build Coastguard Worker	if options.mesa_path != None:
134*d83cc019SAndroid Build Coastguard Worker		# reset workarounds array
135*d83cc019SAndroid Build Coastguard Worker		workarounds = {}
136*d83cc019SAndroid Build Coastguard Worker
137*d83cc019SAndroid Build Coastguard Worker		mesa_path = options.mesa_path
138*d83cc019SAndroid Build Coastguard Worker		i965_dir = os.path.join('src', 'mesa', 'drivers', 'dri', 'i965')
139*d83cc019SAndroid Build Coastguard Worker		mesa_dir = os.path.join(mesa_path, i965_dir)
140*d83cc019SAndroid Build Coastguard Worker		if not os.path.exists(mesa_dir):
141*d83cc019SAndroid Build Coastguard Worker			sys.stderr.write("error: %s does not point to a valid mesa path \n"
142*d83cc019SAndroid Build Coastguard Worker							% mesa_path)
143*d83cc019SAndroid Build Coastguard Worker			sys.exit(1)
144*d83cc019SAndroid Build Coastguard Worker
145*d83cc019SAndroid Build Coastguard Worker		print_workarounds(mesa_path, i965_dir, "Mesa")
146