xref: /linux/tools/perf/pmu-events/make_legacy_cache.py (revision 9e906a9dead17d81d6c2687f65e159231d0e3286)
1*0012e0faSIan Rogers#!/usr/bin/env python3
2*0012e0faSIan Rogers# SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause)
3*0012e0faSIan Rogersimport json
4*0012e0faSIan Rogers
5*0012e0faSIan Rogershw_cache_id = [
6*0012e0faSIan Rogers    (0, # PERF_COUNT_HW_CACHE_L1D
7*0012e0faSIan Rogers     ["L1-dcache",  "l1-d",     "l1d",      "L1-data",],
8*0012e0faSIan Rogers     [0, 1, 2,], # read, write, prefetch
9*0012e0faSIan Rogers     "Level 1 data cache",
10*0012e0faSIan Rogers     ),
11*0012e0faSIan Rogers    (1, # PERF_COUNT_HW_CACHE_L1I
12*0012e0faSIan Rogers     ["L1-icache",  "l1-i",     "l1i",      "L1-instruction",],
13*0012e0faSIan Rogers     [0, 2,], # read, prefetch
14*0012e0faSIan Rogers     "Level 1 instruction cache",
15*0012e0faSIan Rogers     ),
16*0012e0faSIan Rogers    (2, # PERF_COUNT_HW_CACHE_LL
17*0012e0faSIan Rogers     ["LLC", "L2"],
18*0012e0faSIan Rogers     [0, 1, 2,], # read, write, prefetch
19*0012e0faSIan Rogers     "Last level cache",
20*0012e0faSIan Rogers     ),
21*0012e0faSIan Rogers    (3, # PERF_COUNT_HW_CACHE_DTLB
22*0012e0faSIan Rogers     ["dTLB",   "d-tlb",    "Data-TLB",],
23*0012e0faSIan Rogers     [0, 1, 2,], # read, write, prefetch
24*0012e0faSIan Rogers     "Data TLB",
25*0012e0faSIan Rogers     ),
26*0012e0faSIan Rogers    (4, # PERF_COUNT_HW_CACHE_ITLB
27*0012e0faSIan Rogers     ["iTLB",   "i-tlb",    "Instruction-TLB",],
28*0012e0faSIan Rogers     [0,], # read
29*0012e0faSIan Rogers     "Instruction TLB",
30*0012e0faSIan Rogers     ),
31*0012e0faSIan Rogers    (5, # PERF_COUNT_HW_CACHE_BPU
32*0012e0faSIan Rogers     ["branch", "branches", "bpu",      "btb",      "bpc",],
33*0012e0faSIan Rogers     [0,], # read
34*0012e0faSIan Rogers     "Branch prediction unit",
35*0012e0faSIan Rogers     ),
36*0012e0faSIan Rogers    (6, # PERF_COUNT_HW_CACHE_NODE
37*0012e0faSIan Rogers     ["node",],
38*0012e0faSIan Rogers     [0, 1, 2,], # read, write, prefetch
39*0012e0faSIan Rogers     "Local memory",
40*0012e0faSIan Rogers     ),
41*0012e0faSIan Rogers]
42*0012e0faSIan Rogers
43*0012e0faSIan Rogershw_cache_op = [
44*0012e0faSIan Rogers    (0, # PERF_COUNT_HW_CACHE_OP_READ
45*0012e0faSIan Rogers     ["load",   "loads",    "read",],
46*0012e0faSIan Rogers     "read"),
47*0012e0faSIan Rogers    (1, # PERF_COUNT_HW_CACHE_OP_WRITE
48*0012e0faSIan Rogers     ["store",  "stores",   "write",],
49*0012e0faSIan Rogers     "write"),
50*0012e0faSIan Rogers    (2, # PERF_COUNT_HW_CACHE_OP_PREFETCH
51*0012e0faSIan Rogers     ["prefetch",   "prefetches",   "speculative-read", "speculative-load",],
52*0012e0faSIan Rogers     "prefetch"),
53*0012e0faSIan Rogers]
54*0012e0faSIan Rogers
55*0012e0faSIan Rogershw_cache_result = [
56*0012e0faSIan Rogers    (0, # PERF_COUNT_HW_CACHE_RESULT_ACCESS
57*0012e0faSIan Rogers     ["refs",   "Reference",    "ops",      "access",],
58*0012e0faSIan Rogers     "accesses"),
59*0012e0faSIan Rogers    (1, # PERF_COUNT_HW_CACHE_RESULT_MISS
60*0012e0faSIan Rogers     ["misses", "miss",],
61*0012e0faSIan Rogers     "misses"),
62*0012e0faSIan Rogers]
63*0012e0faSIan Rogers
64*0012e0faSIan Rogersevents = []
65*0012e0faSIan Rogersdef add_event(name: str,
66*0012e0faSIan Rogers              cache_id: int, cache_op: int, cache_result: int,
67*0012e0faSIan Rogers              desc: str,
68*0012e0faSIan Rogers              deprecated: bool) -> None:
69*0012e0faSIan Rogers    # Avoid conflicts with PERF_TYPE_HARDWARE events which are higher priority.
70*0012e0faSIan Rogers    if name in ["branch-misses", "branches"]:
71*0012e0faSIan Rogers        return
72*0012e0faSIan Rogers
73*0012e0faSIan Rogers    # Tweak and deprecate L2 named events.
74*0012e0faSIan Rogers    if name.startswith("L2"):
75*0012e0faSIan Rogers        desc = desc.replace("Last level cache", "Level 2 (or higher) last level cache")
76*0012e0faSIan Rogers        deprecated = True
77*0012e0faSIan Rogers
78*0012e0faSIan Rogers    event = {
79*0012e0faSIan Rogers        "EventName": name,
80*0012e0faSIan Rogers        "BriefDescription": desc,
81*0012e0faSIan Rogers        "LegacyCacheCode": f"0x{cache_id | (cache_op << 8) | (cache_result << 16):06x}",
82*0012e0faSIan Rogers    }
83*0012e0faSIan Rogers
84*0012e0faSIan Rogers    # Deprecate events with the name starting L2 as it is actively
85*0012e0faSIan Rogers    # confusing as on many machines it actually means the L3 cache.
86*0012e0faSIan Rogers    if deprecated:
87*0012e0faSIan Rogers        event["Deprecated"] = "1"
88*0012e0faSIan Rogers    events.append(event)
89*0012e0faSIan Rogers
90*0012e0faSIan Rogersfor (cache_id, names, ops, cache_desc) in hw_cache_id:
91*0012e0faSIan Rogers    for name in names:
92*0012e0faSIan Rogers        add_event(name,
93*0012e0faSIan Rogers                  cache_id,
94*0012e0faSIan Rogers                  0, # PERF_COUNT_HW_CACHE_OP_READ
95*0012e0faSIan Rogers                  0, # PERF_COUNT_HW_CACHE_RESULT_ACCESS
96*0012e0faSIan Rogers                  f"{cache_desc} read accesses.",
97*0012e0faSIan Rogers                  deprecated=True)
98*0012e0faSIan Rogers
99*0012e0faSIan Rogers        for (op, op_names, op_desc) in hw_cache_op:
100*0012e0faSIan Rogers            if op not in ops:
101*0012e0faSIan Rogers                continue
102*0012e0faSIan Rogers            for op_name in op_names:
103*0012e0faSIan Rogers                deprecated = (names[0] != name or op_names[1] != op_name)
104*0012e0faSIan Rogers                add_event(f"{name}-{op_name}",
105*0012e0faSIan Rogers                          cache_id,
106*0012e0faSIan Rogers                          op,
107*0012e0faSIan Rogers                          0, # PERF_COUNT_HW_CACHE_RESULT_ACCESS
108*0012e0faSIan Rogers                          f"{cache_desc} {op_desc} accesses.",
109*0012e0faSIan Rogers                          deprecated)
110*0012e0faSIan Rogers
111*0012e0faSIan Rogers                for (result,  result_names, result_desc) in hw_cache_result:
112*0012e0faSIan Rogers                    for result_name in result_names:
113*0012e0faSIan Rogers                        deprecated = ((names[0] != name or op_names[0] != op_name) or
114*0012e0faSIan Rogers                                      (result == 0) or (result_names[0] != result_name))
115*0012e0faSIan Rogers                        add_event(f"{name}-{op_name}-{result_name}",
116*0012e0faSIan Rogers                                  cache_id, op, result,
117*0012e0faSIan Rogers                                  f"{cache_desc} {op_desc} {result_desc}.",
118*0012e0faSIan Rogers                                  deprecated)
119*0012e0faSIan Rogers
120*0012e0faSIan Rogers        for (result,  result_names, result_desc) in hw_cache_result:
121*0012e0faSIan Rogers            for result_name in result_names:
122*0012e0faSIan Rogers                add_event(f"{name}-{result_name}",
123*0012e0faSIan Rogers                          cache_id,
124*0012e0faSIan Rogers                          0, # PERF_COUNT_HW_CACHE_OP_READ
125*0012e0faSIan Rogers                          result,
126*0012e0faSIan Rogers                          f"{cache_desc} read {result_desc}.",
127*0012e0faSIan Rogers                          deprecated=True)
128*0012e0faSIan Rogers
129*0012e0faSIan Rogersprint(json.dumps(events, indent=2))
130