amd/registers: hardcode GC base offsets in the json generator

gfx11 doesn't have the ip_offset file, so we have to do it this way.

Acked-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16328>
This commit is contained in:
Marek Olšák
2022-05-03 14:42:57 -04:00
committed by Marge Bot
parent ceb1339112
commit 3a2f7efe5e
+16 -31
View File
@@ -7,52 +7,49 @@ from canonicalize import json_canonicalize
gfx_versions = {
'gfx6': [
None,
[],
'asic_reg/gca/gfx_6_0_d.h',
'asic_reg/gca/gfx_6_0_sh_mask.h',
'asic_reg/gca/gfx_7_2_enum.h' # the file for gfx6 doesn't exist
],
'gfx7': [
None,
[],
'asic_reg/gca/gfx_7_2_d.h',
'asic_reg/gca/gfx_7_2_sh_mask.h',
'asic_reg/gca/gfx_7_2_enum.h'
],
'gfx8': [
None,
[],
'asic_reg/gca/gfx_8_0_d.h',
'asic_reg/gca/gfx_8_0_sh_mask.h',
'asic_reg/gca/gfx_8_0_enum.h',
],
'gfx81': [
None,
[],
'asic_reg/gca/gfx_8_1_d.h',
'asic_reg/gca/gfx_8_1_sh_mask.h',
'asic_reg/gca/gfx_8_1_enum.h',
],
'gfx9': [
'vega10_ip_offset.h',
[0x00002000, 0x0000A000, 0, 0, 0], # IP_BASE GC_BASE
'asic_reg/gc/gc_9_2_1_offset.h',
'asic_reg/gc/gc_9_2_1_sh_mask.h',
'vega10_enum.h',
],
'gfx10': [
'navi14_ip_offset.h',
[0x00001260, 0x0000A000, 0x02402C00, 0, 0], # IP_BASE GC_BASE
'asic_reg/gc/gc_10_1_0_offset.h',
'asic_reg/gc/gc_10_1_0_sh_mask.h',
'navi10_enum.h',
],
'gfx103': [
'sienna_cichlid_ip_offset.h',
[0x00001260, 0x0000A000, 0x0001C000, 0x02402C00, 0], # IP_BASE GC_BASE
'asic_reg/gc/gc_10_3_0_offset.h',
'asic_reg/gc/gc_10_3_0_sh_mask.h',
'navi10_enum.h', # the file for gfx10.3 doesn't exist
],
}
# match: static const struct IP_BASE GC_BASE ={ { { { 0x00001260, 0x0000A000, 0x02402C00, 0, 0 } },
re_base = re.compile(r'^static const struct IP_BASE.*GC_BASE\s*=\s*{ { { { (\w+), (\w+), (\w+), (\w+), (\w+).*} },\n')
# match: #define mmSDMA0_DEC_START 0x0000
# match: #define ixSDMA0_DEC_START 0x0000
# match: #define regSDMA0_DEC_START 0x0000
@@ -640,32 +637,20 @@ def bitcount(n):
return bin(n).count('1')
def generate_json(gfx_version, amd_headers_path):
gc_base_offsets = gfx_versions[gfx_version][0]
# Add the path to the filenames
filenames = [amd_headers_path + '/' + a if a is not None else None for a in gfx_versions[gfx_version]]
old_gen = filenames[0] is None
filenames = [amd_headers_path + '/' + a for a in gfx_versions[gfx_version][1:]]
# Open the files
files = [open(a, 'r').readlines() if a is not None else None for a in filenames]
# Parse the ip_offset.h file
base_offsets = None
if not old_gen:
for line in files[0]:
r = re_base.match(line)
if r is not None:
base_offsets = r.groups()
if base_offsets is None:
print('Can\'t parse: ' + filenames[0], file=sys.stderr)
sys.exit(1)
# Parse the offset.h file
name = None
offset = None
added_offsets = set()
regs = {}
for line in files[1]:
for line in files[0]:
r = re_offset.match(line)
if r is None:
continue
@@ -673,15 +658,15 @@ def generate_json(gfx_version, amd_headers_path):
if '_BASE_IDX' not in r.group('name'):
name = r.group('name')
offset = int(r.group('value'), 0) * 4
if not old_gen and r.group('mm') == 'mm':
if len(gc_base_offsets) > 0 and r.group('mm') == 'mm':
continue
else:
if name != r.group('name')[:-9]:
print('Warning: "{0}" not preceded by {1} but by {2}'.format(r.group('name'), r.group('name')[:-9], name))
continue
idx = int(r.group('value'))
assert idx < len(base_offsets)
offset += int(base_offsets[idx], 0) * 4
assert idx < len(gc_base_offsets)
offset += gc_base_offsets[idx] * 4
# Remove the _UMD suffix because it was mistakenly added to indicate it's for a User-Mode Driver
if name[-4:] == '_UMD':
@@ -700,7 +685,7 @@ def generate_json(gfx_version, amd_headers_path):
# Parse the sh_mask.h file
shifts = {}
masks = {}
for line in files[2]:
for line in files[1]:
r = re_shift.match(line)
is_shift = r is not None
r = re_mask.match(line) if r is None else r
@@ -729,7 +714,7 @@ def generate_json(gfx_version, amd_headers_path):
name = None
enums = enums_missing[gfx_version] if gfx_version in enums_missing else {}
for line in files[3]:
for line in files[2]:
r = re_enum_begin.match(line)
if r is not None:
name = r.group('name')