[igt-dev] [PATCH i-g-t v5 29/34] i915/perf: update import script

Umesh Nerlige Ramappa umesh.nerlige.ramappa at intel.com
Mon Oct 10 18:12:55 UTC 2022


From: Lionel Landwerlin <lionel.g.landwerlin at intel.com>

Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin at intel.com>
---
 lib/i915/perf-configs/mdapi-xml-convert.py | 180 ++++++++++++---------
 lib/i915/perf-configs/oa-bdw.xml           |   2 +-
 lib/i915/perf-configs/oa_guid_registry.py  |  15 +-
 lib/i915/perf-configs/update-guids.py      |  23 +--
 lib/i915/perf.h                            |   1 +
 5 files changed, 131 insertions(+), 90 deletions(-)

diff --git a/lib/i915/perf-configs/mdapi-xml-convert.py b/lib/i915/perf-configs/mdapi-xml-convert.py
index 7b5be901..ba053ae3 100755
--- a/lib/i915/perf-configs/mdapi-xml-convert.py
+++ b/lib/i915/perf-configs/mdapi-xml-convert.py
@@ -45,6 +45,8 @@ import sys
 import time
 import uuid
 
+import codegen
+
 import xml.etree.ElementTree as et
 import xml.sax.saxutils as saxutils
 
@@ -54,6 +56,55 @@ import oa_guid_registry as oa_registry
 # MDAPI configs include writes to some non-config registers,
 # thus the blacklists...
 
+hsw_chipset_params = {
+    'a_offset': 12,
+    'b_offset': 192,
+    'c_offset': 224,
+    'oa_report_size': 256,
+    'registers': {
+        # TODO extend the symbol table for nicer output...
+        0x2710: { 'name': 'OASTARTTRIG1' },
+        0x2714: { 'name': 'OASTARTTRIG1' },
+        0x2718: { 'name': 'OASTARTTRIG1' },
+        0x271c: { 'name': 'OASTARTTRIG1' },
+        0x2720: { 'name': 'OASTARTTRIG1' },
+        0x2724: { 'name': 'OASTARTTRIG6' },
+        0x2728: { 'name': 'OASTARTTRIG7' },
+        0x272c: { 'name': 'OASTARTTRIG8' },
+        0x2740: { 'name': 'OAREPORTTRIG1' },
+        0x2744: { 'name': 'OAREPORTTRIG2' },
+        0x2748: { 'name': 'OAREPORTTRIG3' },
+        0x274c: { 'name': 'OAREPORTTRIG4' },
+        0x2750: { 'name': 'OAREPORTTRIG5' },
+        0x2754: { 'name': 'OAREPORTTRIG6' },
+        0x2758: { 'name': 'OAREPORTTRIG7' },
+        0x275c: { 'name': 'OAREPORTTRIG8' },
+        0x2770: { 'name': 'OACEC0_0' },
+        0x2774: { 'name': 'OACEC0_1' },
+        0x2778: { 'name': 'OACEC1_0' },
+        0x277c: { 'name': 'OACEC1_1' },
+        0x2780: { 'name': 'OACEC2_0' },
+        0x2784: { 'name': 'OACEC2_1' },
+        0x2788: { 'name': 'OACEC3_0' },
+        0x278c: { 'name': 'OACEC3_1' },
+        0x2790: { 'name': 'OACEC4_0' },
+        0x2794: { 'name': 'OACEC4_1' },
+        0x2798: { 'name': 'OACEC5_0' },
+        0x279c: { 'name': 'OACEC5_1' },
+        0x27a0: { 'name': 'OACEC6_0' },
+        0x27a4: { 'name': 'OACEC6_1' },
+        0x27a8: { 'name': 'OACEC7_0' },
+        0x27ac: { 'name': 'OACEC7_1' },
+    },
+    'config_reg_blacklist': {
+        0x2364, # OASTATUS1 register
+    },
+    'register_offsets': {
+        0x1f0: 'PERFCNT 0',
+        0x1f8: 'PERFCNT 1',
+    },
+}
+
 gen8_11_chipset_params = {
     'a_offset': 16,
     'b_offset': 192,
@@ -83,50 +134,7 @@ xehpsdv_chipset_params = {
 }
 
 chipsets = {
-    'HSW': {
-        'a_offset': 12,
-        'b_offset': 192,
-        'c_offset': 224,
-        'oa_report_size': 256,
-        'registers': {
-            # TODO extend the symbol table for nicer output...
-                0x2710: { 'name': 'OASTARTTRIG1' },
-            0x2714: { 'name': 'OASTARTTRIG1' },
-            0x2718: { 'name': 'OASTARTTRIG1' },
-            0x271c: { 'name': 'OASTARTTRIG1' },
-            0x2720: { 'name': 'OASTARTTRIG1' },
-            0x2724: { 'name': 'OASTARTTRIG6' },
-            0x2728: { 'name': 'OASTARTTRIG7' },
-            0x272c: { 'name': 'OASTARTTRIG8' },
-            0x2740: { 'name': 'OAREPORTTRIG1' },
-            0x2744: { 'name': 'OAREPORTTRIG2' },
-            0x2748: { 'name': 'OAREPORTTRIG3' },
-            0x274c: { 'name': 'OAREPORTTRIG4' },
-            0x2750: { 'name': 'OAREPORTTRIG5' },
-            0x2754: { 'name': 'OAREPORTTRIG6' },
-            0x2758: { 'name': 'OAREPORTTRIG7' },
-            0x275c: { 'name': 'OAREPORTTRIG8' },
-            0x2770: { 'name': 'OACEC0_0' },
-            0x2774: { 'name': 'OACEC0_1' },
-            0x2778: { 'name': 'OACEC1_0' },
-            0x277c: { 'name': 'OACEC1_1' },
-            0x2780: { 'name': 'OACEC2_0' },
-            0x2784: { 'name': 'OACEC2_1' },
-            0x2788: { 'name': 'OACEC3_0' },
-            0x278c: { 'name': 'OACEC3_1' },
-            0x2790: { 'name': 'OACEC4_0' },
-            0x2794: { 'name': 'OACEC4_1' },
-            0x2798: { 'name': 'OACEC5_0' },
-            0x279c: { 'name': 'OACEC5_1' },
-            0x27a0: { 'name': 'OACEC6_0' },
-            0x27a4: { 'name': 'OACEC6_1' },
-            0x27a8: { 'name': 'OACEC7_0' },
-            0x27ac: { 'name': 'OACEC7_1' },
-        },
-        'config_reg_blacklist': {
-            0x2364, # OASTATUS1 register
-        },
-    },
+    'HSW': hsw_chipset_params,
     'BDW': gen8_11_chipset_params,
     'CHV': gen8_11_chipset_params,
     'SKL': gen8_11_chipset_params,
@@ -141,8 +149,11 @@ chipsets = {
     'RKL': gen8_11_chipset_params,
     'DG1': gen8_11_chipset_params,
     'ADL': gen8_11_chipset_params,
+    'ACM': xehpsdv_chipset_params,
 }
 
+xehp_plus = ( 'ACM', )
+
 register_types = { 'OA', 'NOA', 'FLEX', 'PM' }
 
 default_set_blacklist = { "RenderDX1x", # TODO: rename to something non 'DX'
@@ -158,23 +169,11 @@ counter_blacklist = {
                          # investiguate how to get this value.
 }
 
-sys_vars = { "EuCoresTotalCount",
-             "EuSlicesTotalCount",
-             "SamplersTotalCount",
-             "EuThreadsCount",
-             "GpuMinFrequencyMHz",
-             "GpuMaxFrequencyMHz",
-             "GpuTimestampFrequency",
-             "SliceMask",
-             "SubsliceMask",
-             "EuSubslicesTotalCount",
-             "EuDualSubslicesTotalCount",
-           }
-
 def underscore(name):
     s = re.sub('MHz', 'Mhz', name)
     s = re.sub('\.', '_', s)
     s = re.sub('(.)([A-Z][a-z]+)', r'\1_\2', s)
+    s = re.sub('#', '_', s)
     return re.sub('([a-z0-9])([A-Z])', r'\1_\2', s).lower()
 
 def print_err(*args):
@@ -215,7 +214,7 @@ def read_token_to_rpn_read(chipset, token, raw_offsets):
                 assert 0
         elif offset < b_offset:
             a_cnt_offset = int((offset - a_offset) / 4)
-            if chipset == "XEHPSDV":
+            if chipset in xehp_plus:
                 # Most A counters are in a contiguous array, except
                 # this A37.
                 if a_cnt_offset == 42:
@@ -246,7 +245,7 @@ def read_token_to_rpn_read(chipset, token, raw_offsets):
                 return "C " + str(idx - 54) + " READ"
             else:
                 return "{0} READ".format(read_value(chipset, offset))
-        elif chipset == "XEHPSDV":
+        elif chipset in xehp_plus:
             # For XEHPSDV the array of accumulated counters is
             # assumed to start with a GPU_TIME then GPU_CLOCK,
             # then 38 A counters, then 8 B counters and finally
@@ -354,10 +353,38 @@ def strip_dx_apis(text):
 
     return stripped.strip()
 
+def add_gpu_core_clocks_if_missing(metric_set, counters, counter_deps):
+    if len(counters) < 1:
+        return
+
+    for name,element in counters.items():
+        if name == 'GpuCoreClocks':
+            return
+
+    print_err("WARNING: add missing GpuCoreClocks counter for MetricSets=\"{0}\"".format(metric_set.get('ShortName')))
+    counter = et.SubElement(metric_set, 'Metric')
+    counter.set("SymbolName", "GpuCoreClocks")
+    counter.set("SignalName", "oa.fixed")
+    counter.set("ShortName", "GPU Core Clocks")
+    counter.set("LongName", "The total number of GPU core clocks elapsed during the measurement.")
+    counter.set("Group", "GPU")
+    counter.set("UsageFlags", "Tier1 Frame Batch Draw")
+    counter.set("MetricType", "EVENT")
+    counter.set("ResultType", "UINT64")
+    counter.set("MetricUnits", "cycles")
+    counter.set("HWUnitType", "GPU")
+    counter.set("SnapshotReportReadEquation", "dw at 0x0c")
+    counter.set("SnapshotReportDeltaFunction", "DELTA 32")
+    counter.set("DeltaReportReadEquation", "qw at 0x08")
+    counter.set("NormalizationEquation", "")
+
+    counters["GpuCoreClocks"] = counter
+    counter_deps["GpuCoreClocks"] = []
+
 # For recursively appending counters in order of dependencies...
 def append_deps_and_counter(mdapi_counter, mdapi_counters, deps,
                             sorted_array, sorted_set):
-    symbol_name = mdapi_counter.get('SymbolName')
+    symbol_name = oa_registry.Registry.sanitize_symbol_name(mdapi_counter.get('SymbolName'))
 
     if symbol_name in sorted_set:
         return
@@ -562,6 +589,7 @@ guids = {}
 guids_xml = et.parse(args.guids)
 for guid in guids_xml.findall(".//guid"):
     hashing_key = oa_registry.Registry.chipset_derive_hash(guid.get('chipset'),
+                                                           guid.get('name'),
                                                            guid.get('mdapi_config_hash'))
     guids[hashing_key] = guid.get('id')
 
@@ -569,6 +597,14 @@ for arg in args.xml:
     mdapi = et.parse(arg)
 
     concurrent_group = mdapi.find(".//ConcurrentGroup")
+    chipset = oa_registry.Registry.chipset_name(concurrent_group.get('SupportedHW'))
+
+    chipset_fullname = chipset
+    if concurrent_group.get('SupportedGT') != None:
+        chipset_fullname = chipset_fullname + oa_registry.Registry.gt_name(concurrent_group.get('SupportedGT'))
+    if chipset not in chipsets:
+        print_err("WARNING: unsupported chipset {0}, consider updating {1}".format(chipset, __file__))
+        continue
 
     for mdapi_set in mdapi.findall(".//MetricSet"):
 
@@ -576,20 +612,12 @@ for arg in args.xml:
         if "OGL" not in apis and "OCL" not in apis and "MEDIA" not in apis:
             continue
 
-        set_symbol_name = mdapi_set.get('SymbolName')
+        set_symbol_name = oa_registry.Registry.sanitize_symbol_name(mdapi_set.get('SymbolName'))
 
         if set_symbol_name in sets:
             print_err("WARNING: duplicate set named \"" + set_symbol_name + "\" (SKIPPING)")
             continue
 
-        chipset = oa_registry.Registry.chipset_name(mdapi_set.get('SupportedHW'))
-        chipset_fullname = chipset
-        if concurrent_group.get('SupportedGT') != None:
-            chipset_fullname = chipset_fullname + oa_registry.Registry.gt_name(concurrent_group.get('SupportedGT'))
-        if chipset not in chipsets:
-            print_err("WARNING: unsupported chipset {0}, consider updating {1}".format(chipset, __file__))
-            continue
-
         if args.whitelist:
             set_whitelist = args.whitelist.split()
             if set_symbol_name not in set_whitelist:
@@ -666,6 +694,7 @@ for arg in args.xml:
 
         mdapi_hw_config_hash = oa_registry.Registry.mdapi_hw_config_hash(mdapi_set)
         guid_hash = oa_registry.Registry.chipset_derive_hash(chipset_fullname.lower(),
+                                                             set_symbol_name,
                                                              mdapi_hw_config_hash)
         hw_config_hash = oa_registry.Registry.hw_config_hash(set)
 
@@ -693,7 +722,7 @@ for arg in args.xml:
         mdapi_counter_deps = {}
 
         for mdapi_counter in mdapi_set.findall("Metrics/Metric"):
-            symbol_name = mdapi_counter.get('SymbolName')
+            symbol_name = oa_registry.Registry.sanitize_symbol_name(mdapi_counter.get('SymbolName'))
 
             if symbol_name in counter_blacklist:
                 continue;
@@ -712,12 +741,13 @@ for arg in args.xml:
             equations = expand_macros(equations)
             equations = equations.replace('$$', "$")
             for token in equations.split():
-                if token[0] == '$' and token[1:] not in sys_vars and token[1:] != "Self":
+                if token[0] == '$' and not codegen.is_hw_var(token) and token[1:] != "Self":
                     deps.append(token[1:])
 
             mdapi_counters[symbol_name] = mdapi_counter
             mdapi_counter_deps[symbol_name] = deps
 
+        add_gpu_core_clocks_if_missing(mdapi_set, mdapi_counters, mdapi_counter_deps)
         sorted_mdapi_counters = sort_counters(mdapi_counters, mdapi_counter_deps)
 
         for mdapi_counter in sorted_mdapi_counters:
@@ -746,11 +776,11 @@ for arg in args.xml:
                 #mdapi_counter.set('DeltaReportReadEquation', '$GpuCoreClocks $GpuTime UDIV')
 
 
-            symbol_name = mdapi_counter.get('SymbolName')
+            symbol_name = oa_registry.Registry.sanitize_symbol_name(mdapi_counter.get('SymbolName'))
 
             counter = et.SubElement(set, 'counter')
             counter.set('name', apply_aliases(mdapi_counter.get('ShortName'), aliases))
-            counter.set('symbol_name', mdapi_counter.get('SymbolName'))
+            counter.set('symbol_name', oa_registry.Registry.sanitize_symbol_name(mdapi_counter.get('SymbolName')))
             counter.set('underscore_name', underscore(mdapi_counter.get('SymbolName')))
             counter.set('description', apply_aliases(mdapi_counter.get('LongName'), aliases))
             counter.set('mdapi_group', apply_aliases(to_text(mdapi_counter.get('Group')), aliases))
@@ -943,7 +973,7 @@ for arg in args.xml:
                         #   print_err("WARNING: Counter equation (\"" + equation + "\") references un-kept raw equation of another counter : MetricSet=\"" + \
                         #             mdapi_set.get('ShortName') + "\" Metric=\"" + mdapi_counter.get('ShortName') + "\"")
 
-                    elif token[1:] not in raw_equations and token[1:] not in sys_vars:
+                    elif token[1:] not in raw_equations and not codegen.is_hw_var(token):
                         print_err("Unknown variable name: \"" + token + "\" in equation \"" + equation + "\"")
 
             symbol_name = counter.get('symbol_name')
@@ -952,7 +982,7 @@ for arg in args.xml:
             equation = equation.replace('$$', "$")
             for token in equation.split():
                 if token[0] == '$':
-                    if token[1:] not in counters and token[1:] not in sys_vars:
+                    if token[1:] not in counters and not codegen.is_hw_var(token):
                         print_err("WARNING: Counter equation (\"" + equation + "\") with unknown variable " + \
                                   token + " (maybe skipped counter): MetricSet=\"" + mdapi_set.get('ShortName') + \
                                   "\" Metric=\"" + mdapi_counter.get('SymbolName') + "(" + mdapi_counter.get('ShortName') + \
diff --git a/lib/i915/perf-configs/oa-bdw.xml b/lib/i915/perf-configs/oa-bdw.xml
index 247fec4f..4fd5dccb 100644
--- a/lib/i915/perf-configs/oa-bdw.xml
+++ b/lib/i915/perf-configs/oa-bdw.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<metrics version="1619078710" merge_md5="">
+<metrics version="1650881753" merge_md5="">
   <set name="Render Metrics Basic set"
        chipset="BDW"
        symbol_name="RenderBasic"
diff --git a/lib/i915/perf-configs/oa_guid_registry.py b/lib/i915/perf-configs/oa_guid_registry.py
index 1e082ddf..50076e95 100644
--- a/lib/i915/perf-configs/oa_guid_registry.py
+++ b/lib/i915/perf-configs/oa_guid_registry.py
@@ -72,16 +72,15 @@ class Registry:
 
         return hashlib.md5(registers_str).hexdigest()
 
-
     @staticmethod
-    def chipset_derive_hash(chipset, hash):
-        """Derive a HW config hash for a given chipset.
+    def chipset_derive_hash(chipset, set_name, hash):
+        """Derive a HW config hash for a given chipset & set name.
 
         This helps us avoiding collisions with identical config across
         different Gen or GT.
         """
 
-        return "%s-%s" % (chipset, hash)
+        return "%s-%s-%s" % (chipset, set_name, hash)
 
 
     @staticmethod
@@ -99,7 +98,9 @@ class Registry:
                            'EHL',
                            'TGL',
                            'RKL',
-                           'DG1' )
+                           'DG1',
+                           'ACM',
+                           'PVC' )
         if name in known_chipsets:
             return name
 
@@ -110,3 +111,7 @@ class Registry:
     @staticmethod
     def gt_name(name):
         return re.sub(' ', '', name)
+
+    @staticmethod
+    def sanitize_symbol_name(text):
+        return text.replace('#', "_")
diff --git a/lib/i915/perf-configs/update-guids.py b/lib/i915/perf-configs/update-guids.py
index d38a7a95..de66b2f3 100755
--- a/lib/i915/perf-configs/update-guids.py
+++ b/lib/i915/perf-configs/update-guids.py
@@ -60,8 +60,10 @@ def print_err(*args):
     sys.stderr.write(' '.join(map(str,args)) + '\n')
 
 def guid_hashing_key(guid_obj):
-    return oa_registry.Registry.chipset_derive_hash(guid_obj['chipset'],
-                                                    guid_obj['mdapi_config_hash'])
+    ret = oa_registry.Registry.chipset_derive_hash(guid_obj['chipset'],
+                                                   guid_obj['name'],
+                                                   guid_obj['mdapi_config_hash'])
+    return ret
 
 parser = argparse.ArgumentParser()
 parser.add_argument("xml", nargs="+", help="XML description of metrics")
@@ -101,6 +103,7 @@ for guid in guids_xml.findall(".//guid"):
 
     if 'mdapi_config_hash' in guid_obj:
         hashing_key = oa_registry.Registry.chipset_derive_hash(guid_obj['chipset'],
+                                                               guid_obj['name'],
                                                                guid_obj['mdapi_config_hash'])
         mdapi_config_hash_guid_table[hashing_key] = guid_obj
 
@@ -121,20 +124,20 @@ for arg in args.xml:
     internal = et.parse(arg)
 
     concurrent_group = internal.find(".//ConcurrentGroup")
+    chipset = oa_registry.Registry.chipset_name(concurrent_group.get('SupportedHW')).lower()
+    if concurrent_group.get('SupportedGT') != None:
+        chipset = chipset + oa_registry.Registry.gt_name(concurrent_group.get('SupportedGT')).lower()
+
 
     for mdapi_set in internal.findall(".//MetricSet"):
 
         mdapi_config_hash = oa_registry.Registry.mdapi_hw_config_hash(mdapi_set)
 
-        chipset = oa_registry.Registry.chipset_name(mdapi_set.get('SupportedHW')).lower()
-        if concurrent_group.get('SupportedGT') != None:
-            chipset = chipset + oa_registry.Registry.gt_name(concurrent_group.get('SupportedGT')).lower()
-
-        set_name = mdapi_set.get('SymbolName')
+        set_name = oa_registry.Registry.sanitize_symbol_name(mdapi_set.get('SymbolName'))
 
         name = chipset + "_" + set_name;
 
-        hashing_key = oa_registry.Registry.chipset_derive_hash(chipset, mdapi_config_hash)
+        hashing_key = oa_registry.Registry.chipset_derive_hash(chipset, set_name, mdapi_config_hash)
         if hashing_key in mdapi_config_hash_guid_table:
             guid_obj = mdapi_config_hash_guid_table[hashing_key]
 
@@ -174,7 +177,9 @@ chipsets = [ 'hsw',
              'bxt', 'glk',
              'cnl',
              'icl', 'ehl',
-             'tglgt1', 'tglgt2', 'rkl', 'dg1', 'adl' ]
+             'tglgt1', 'tglgt2', 'rkl', 'dg1', 'adl',
+             'acmgt1', 'acmgt2', 'acmgt3',
+]
 
 for chipset in chipsets:
     filename = 'oa-' + chipset + '.xml'
diff --git a/lib/i915/perf.h b/lib/i915/perf.h
index 1493da47..ef2a3029 100644
--- a/lib/i915/perf.h
+++ b/lib/i915/perf.h
@@ -189,6 +189,7 @@ typedef enum {
 	INTEL_PERF_LOGICAL_COUNTER_UNIT_EU_ATOMIC_REQUESTS_TO_L3_CACHE_LINES,
 	INTEL_PERF_LOGICAL_COUNTER_UNIT_EU_REQUESTS_TO_L3_CACHE_LINES,
 	INTEL_PERF_LOGICAL_COUNTER_UNIT_EU_BYTES_PER_L3_CACHE_LINE,
+	INTEL_PERF_LOGICAL_COUNTER_UNIT_GBPS,
 
 	INTEL_PERF_LOGICAL_COUNTER_UNIT_MAX
 } intel_perf_logical_counter_unit_t;
-- 
2.25.1



More information about the igt-dev mailing list