From 0b25388afec625f1625763db67f25a88a51578e4 Mon Sep 17 00:00:00 2001 From: Danylo Piliaiev Date: Fri, 11 Aug 2023 15:30:47 +0200 Subject: [PATCH] freedreno/registers: Generate python files with reg offsets This would allow us to use register names in python scripts. Signed-off-by: Danylo Piliaiev Part-of: --- src/freedreno/registers/adreno/meson.build | 21 ++++++++++++ src/freedreno/registers/gen_header.py | 37 ++++++++++++++++++++++ 2 files changed, 58 insertions(+) diff --git a/src/freedreno/registers/adreno/meson.build b/src/freedreno/registers/adreno/meson.build index 50eac0963d3..36af2c97374 100644 --- a/src/freedreno/registers/adreno/meson.build +++ b/src/freedreno/registers/adreno/meson.build @@ -32,6 +32,16 @@ xml_files = [ 'adreno_pm4.xml', ] +xml_reg_files = [ + 'a2xx.xml', + 'a3xx.xml', + 'a4xx.xml', + 'a5xx.xml', + 'a6xx.xml', +] + +freedreno_py_header_files = [] + foreach f : xml_files _name = f + '.h' freedreno_xml_header_files += custom_target( @@ -69,3 +79,14 @@ freedreno_xml_header_files += custom_target( command: [prog_python, '@INPUT0@', '--rnn', rnn_src_path, '--xml', '@INPUT1@', 'c-pack-structs'], capture: true, ) + +foreach f : xml_reg_files + _pyname = f.split('.')[0] + '.py' + freedreno_py_header_files += custom_target( + _pyname, + input: [gen_header_py, f], + output: _pyname, + command: [prog_python, '@INPUT0@', '--rnn', rnn_src_path, '--xml', '@INPUT1@', 'py-defines'], + capture: true, + ) +endforeach diff --git a/src/freedreno/registers/gen_header.py b/src/freedreno/registers/gen_header.py index a5efbf707e5..a87e8ed8962 100644 --- a/src/freedreno/registers/gen_header.py +++ b/src/freedreno/registers/gen_header.py @@ -309,6 +309,10 @@ class Reg(object): if self.bitset.inline: self.bitset.dump_regpair_builder(self) + def dump_py(self): + print("\tREG_%s = 0x%08x" % (self.full_name, self.offset)) + + class Parser(object): def __init__(self): self.current_array = None @@ -630,6 +634,17 @@ class Parser(object): self.dump_reg_usages() + + def dump_regs_py(self): + regs = [] + for e in self.file: + if isinstance(e, Reg): + regs.append(e) + + for e in regs: + e.dump_py() + + def dump_reg_variants(self, regname, variants): # Don't bother for things that only have a single variant: if len(variants) == 1: @@ -742,6 +757,25 @@ def dump_c_pack_structs(args): dump_c(args.rnn, args.xml, guard, lambda p: p.dump_structs()) +def dump_py_defines(args): + p = Parser() + + try: + p.parse(args.rnn, args.xml) + except Error as e: + print(e, file=sys.stderr) + exit(1) + + file_name = os.path.splitext(os.path.basename(args.xml))[0] + + print("from enum import IntEnum") + print("class %sRegs(IntEnum):" % file_name.upper()) + + os.path.basename(args.xml) + + p.dump_regs_py() + + def main(): parser = argparse.ArgumentParser() parser.add_argument('--rnn', type=str, required=True) @@ -755,6 +789,9 @@ def main(): parser_c_pack_structs = subparsers.add_parser('c-pack-structs') parser_c_pack_structs.set_defaults(func=dump_c_pack_structs) + parser_py_defines = subparsers.add_parser('py-defines') + parser_py_defines.set_defaults(func=dump_py_defines) + args = parser.parse_args() args.func(args)