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