File: oa-registers-codegen.py

package info (click to toggle)
intel-gpu-tools 2.2-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 63,360 kB
  • sloc: xml: 781,458; ansic: 360,567; python: 8,336; yacc: 2,781; perl: 1,196; sh: 1,177; lex: 487; asm: 227; lisp: 35; makefile: 30
file content (118 lines) | stat: -rw-r--r-- 3,072 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
#!/usr/bin/env python3
#
# SPDX-License-Identifier: MIT
#
# Copyright © 2024 Intel Corporation

import argparse
import os
import sys
import textwrap

import codegen

h = None
c = None


def generate_register_configs(set):
    register_types = {
        'FLEX': 'flex_regs',
        'NOA': 'mux_regs',
        'OA': 'b_counter_regs',
    }

    c("void %s_%s_add_registers(struct intel_xe_perf *perf, struct intel_xe_perf_metric_set *metric_set)" %
      (set.gen.chipset, set.underscore_name))
    c("{")
    c.indent(4)

    # fill in register/values
    register_configs = set.findall('register_config')
    for register_config in register_configs:
        t = register_types[register_config.get('type')]

        availability = register_config.get('availability')
        if availability:
            set.gen.output_availability(set, availability, register_config.get('type') + ' register config')
            c.indent(4)

        c("{")
        c.indent(4)
        c("static const struct intel_xe_perf_register_prog _%s[] = {" % t)
        c.indent(4)
        for register in register_config.findall('register'):
            c("{ .reg = %s, .val = %s }," %
              (register.get('address'), register.get('value')))
        c.outdent(4)
        c("};")
        c("metric_set->%s = _%s;" % (t, t))
        c("metric_set->n_%s = sizeof(_%s) / sizeof(_%s[0]);" % (t, t, t))
        c.outdent(4)
        c("}")

        if availability:
            c.outdent(4)
            c("}")
        c("\n")

    c.outdent(4)
    c("}")


def main():
    global c
    global h
    global xml_equations

    parser = argparse.ArgumentParser()
    parser.add_argument("--header", help="Header file to write")
    parser.add_argument("--code", help="C file to write")
    parser.add_argument("--xml-file", help="Xml file to generate register configurations from")

    args = parser.parse_args()

    # Note: either arg may == None
    h = codegen.Codegen(args.header)
    c = codegen.Codegen(args.code)

    gen = codegen.Gen(args.xml_file, c)

    copyright = textwrap.dedent("""\
        /* Autogenerated file, DO NOT EDIT manually! generated by {} */
        // SPDX-License-Identifier: MIT
        /*
         * Copyright © 2024 Intel Corporation
         */

        """).format(os.path.basename(__file__))


    header_file = os.path.basename(args.header)
    header_define = "__%s__" % header_file.replace('.', '_').upper()

    h(copyright)
    h("#ifndef %s" % header_define)
    h("#define %s" % header_define)
    h("\n")
    h("struct intel_xe_perf;")
    h("struct intel_xe_perf_metric_set;")
    h("\n")
    for set in gen.sets:
        h("void %s_%s_add_registers(struct intel_xe_perf *perf, struct intel_xe_perf_metric_set *metric_set);" %
          (gen.chipset, set.underscore_name))
    h("\n")
    h("#endif /* %s */" % header_define)

    c(copyright)
    c("\n")
    c("#include \"%s\"" % header_file)
    c("#include \"xe/xe_oa.h\"")

    for set in gen.sets:
        c("\n")
        generate_register_configs(set)


if __name__ == '__main__':
    main()