1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun 3*4882a593Smuzhiyun #include "req-gen/_begin.h" 4*4882a593Smuzhiyun 5*4882a593Smuzhiyun /* 6*4882a593Smuzhiyun * Based on the document "getPerfCountInfo v1.07" 7*4882a593Smuzhiyun */ 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun /* 10*4882a593Smuzhiyun * #define REQUEST_NAME counter_request_name 11*4882a593Smuzhiyun * #define REQUEST_NUM r_num 12*4882a593Smuzhiyun * #define REQUEST_IDX_KIND starting_index_kind 13*4882a593Smuzhiyun * #include I(REQUEST_BEGIN) 14*4882a593Smuzhiyun * REQUEST( 15*4882a593Smuzhiyun * __field(...) 16*4882a593Smuzhiyun * __field(...) 17*4882a593Smuzhiyun * __array(...) 18*4882a593Smuzhiyun * __count(...) 19*4882a593Smuzhiyun * ) 20*4882a593Smuzhiyun * #include I(REQUEST_END) 21*4882a593Smuzhiyun * 22*4882a593Smuzhiyun * - starting_index_kind is one of the following, depending on the event: 23*4882a593Smuzhiyun * 24*4882a593Smuzhiyun * hw_chip_id: hardware chip id or -1 for current hw chip 25*4882a593Smuzhiyun * partition_id 26*4882a593Smuzhiyun * sibling_part_id, 27*4882a593Smuzhiyun * phys_processor_idx: 28*4882a593Smuzhiyun * 0xffffffffffffffff: or -1, which means it is irrelavant for the event 29*4882a593Smuzhiyun * 30*4882a593Smuzhiyun * __count(offset, bytes, name): 31*4882a593Smuzhiyun * a counter that should be exposed via perf 32*4882a593Smuzhiyun * __field(offset, bytes, name) 33*4882a593Smuzhiyun * a normal field 34*4882a593Smuzhiyun * __array(offset, bytes, name) 35*4882a593Smuzhiyun * an array of bytes 36*4882a593Smuzhiyun * 37*4882a593Smuzhiyun * 38*4882a593Smuzhiyun * @bytes for __count, and __field _must_ be a numeral token 39*4882a593Smuzhiyun * in decimal, not an expression and not in hex. 40*4882a593Smuzhiyun * 41*4882a593Smuzhiyun * 42*4882a593Smuzhiyun * TODO: 43*4882a593Smuzhiyun * - expose secondary index (if any counter ever uses it, only 0xA0 44*4882a593Smuzhiyun * appears to use it right now, and it doesn't have any counters) 45*4882a593Smuzhiyun * - embed versioning info 46*4882a593Smuzhiyun * - include counter descriptions 47*4882a593Smuzhiyun */ 48*4882a593Smuzhiyun #define REQUEST_NAME dispatch_timebase_by_processor 49*4882a593Smuzhiyun #define REQUEST_NUM 0x10 50*4882a593Smuzhiyun #define REQUEST_IDX_KIND "phys_processor_idx=?" 51*4882a593Smuzhiyun #include I(REQUEST_BEGIN) 52*4882a593Smuzhiyun REQUEST(__count(0, 8, processor_time_in_timebase_cycles) 53*4882a593Smuzhiyun __field(0x8, 4, hw_processor_id) 54*4882a593Smuzhiyun __field(0xC, 2, owning_part_id) 55*4882a593Smuzhiyun __field(0xE, 1, processor_state) 56*4882a593Smuzhiyun __field(0xF, 1, version) 57*4882a593Smuzhiyun __field(0x10, 4, hw_chip_id) 58*4882a593Smuzhiyun __field(0x14, 4, phys_module_id) 59*4882a593Smuzhiyun __field(0x18, 4, primary_affinity_domain_idx) 60*4882a593Smuzhiyun __field(0x1C, 4, secondary_affinity_domain_idx) 61*4882a593Smuzhiyun __field(0x20, 4, processor_version) 62*4882a593Smuzhiyun __field(0x24, 2, logical_processor_idx) 63*4882a593Smuzhiyun __field(0x26, 2, reserved) 64*4882a593Smuzhiyun __field(0x28, 4, processor_id_register) 65*4882a593Smuzhiyun __field(0x2C, 4, phys_processor_idx) 66*4882a593Smuzhiyun ) 67*4882a593Smuzhiyun #include I(REQUEST_END) 68*4882a593Smuzhiyun 69*4882a593Smuzhiyun #define REQUEST_NAME entitled_capped_uncapped_donated_idle_timebase_by_partition 70*4882a593Smuzhiyun #define REQUEST_NUM 0x20 71*4882a593Smuzhiyun #define REQUEST_IDX_KIND "sibling_part_id=?" 72*4882a593Smuzhiyun #include I(REQUEST_BEGIN) 73*4882a593Smuzhiyun REQUEST(__field(0, 8, partition_id) 74*4882a593Smuzhiyun __count(0x8, 8, entitled_cycles) 75*4882a593Smuzhiyun __count(0x10, 8, consumed_capped_cycles) 76*4882a593Smuzhiyun __count(0x18, 8, consumed_uncapped_cycles) 77*4882a593Smuzhiyun __count(0x20, 8, cycles_donated) 78*4882a593Smuzhiyun __count(0x28, 8, purr_idle_cycles) 79*4882a593Smuzhiyun ) 80*4882a593Smuzhiyun #include I(REQUEST_END) 81*4882a593Smuzhiyun 82*4882a593Smuzhiyun /* 83*4882a593Smuzhiyun * Not available for counter_info_version >= 0x8, use 84*4882a593Smuzhiyun * run_instruction_cycles_by_partition(0x100) instead. 85*4882a593Smuzhiyun */ 86*4882a593Smuzhiyun #define REQUEST_NAME run_instructions_run_cycles_by_partition 87*4882a593Smuzhiyun #define REQUEST_NUM 0x30 88*4882a593Smuzhiyun #define REQUEST_IDX_KIND "sibling_part_id=?" 89*4882a593Smuzhiyun #include I(REQUEST_BEGIN) 90*4882a593Smuzhiyun REQUEST(__field(0, 8, partition_id) 91*4882a593Smuzhiyun __count(0x8, 8, instructions_completed) 92*4882a593Smuzhiyun __count(0x10, 8, cycles) 93*4882a593Smuzhiyun ) 94*4882a593Smuzhiyun #include I(REQUEST_END) 95*4882a593Smuzhiyun 96*4882a593Smuzhiyun #define REQUEST_NAME system_performance_capabilities 97*4882a593Smuzhiyun #define REQUEST_NUM 0x40 98*4882a593Smuzhiyun #define REQUEST_IDX_KIND "starting_index=0xffffffff" 99*4882a593Smuzhiyun #include I(REQUEST_BEGIN) 100*4882a593Smuzhiyun REQUEST(__field(0, 1, perf_collect_privileged) 101*4882a593Smuzhiyun __field(0x1, 1, capability_mask) 102*4882a593Smuzhiyun __array(0x2, 0xE, reserved) 103*4882a593Smuzhiyun ) 104*4882a593Smuzhiyun #include I(REQUEST_END) 105*4882a593Smuzhiyun 106*4882a593Smuzhiyun #define REQUEST_NAME processor_bus_utilization_abc_links 107*4882a593Smuzhiyun #define REQUEST_NUM 0x50 108*4882a593Smuzhiyun #define REQUEST_IDX_KIND "hw_chip_id=?" 109*4882a593Smuzhiyun #include I(REQUEST_BEGIN) 110*4882a593Smuzhiyun REQUEST(__field(0, 4, hw_chip_id) 111*4882a593Smuzhiyun __array(0x4, 0xC, reserved1) 112*4882a593Smuzhiyun __count(0x10, 8, total_link_cycles) 113*4882a593Smuzhiyun __count(0x18, 8, idle_cycles_for_a_link) 114*4882a593Smuzhiyun __count(0x20, 8, idle_cycles_for_b_link) 115*4882a593Smuzhiyun __count(0x28, 8, idle_cycles_for_c_link) 116*4882a593Smuzhiyun __array(0x30, 0x20, reserved2) 117*4882a593Smuzhiyun ) 118*4882a593Smuzhiyun #include I(REQUEST_END) 119*4882a593Smuzhiyun 120*4882a593Smuzhiyun #define REQUEST_NAME processor_bus_utilization_wxyz_links 121*4882a593Smuzhiyun #define REQUEST_NUM 0x60 122*4882a593Smuzhiyun #define REQUEST_IDX_KIND "hw_chip_id=?" 123*4882a593Smuzhiyun #include I(REQUEST_BEGIN) 124*4882a593Smuzhiyun REQUEST(__field(0, 4, hw_chip_id) 125*4882a593Smuzhiyun __array(0x4, 0xC, reserved1) 126*4882a593Smuzhiyun __count(0x10, 8, total_link_cycles) 127*4882a593Smuzhiyun __count(0x18, 8, idle_cycles_for_w_link) 128*4882a593Smuzhiyun __count(0x20, 8, idle_cycles_for_x_link) 129*4882a593Smuzhiyun __count(0x28, 8, idle_cycles_for_y_link) 130*4882a593Smuzhiyun __count(0x30, 8, idle_cycles_for_z_link) 131*4882a593Smuzhiyun __array(0x38, 0x28, reserved2) 132*4882a593Smuzhiyun ) 133*4882a593Smuzhiyun #include I(REQUEST_END) 134*4882a593Smuzhiyun 135*4882a593Smuzhiyun #define REQUEST_NAME processor_bus_utilization_gx_links 136*4882a593Smuzhiyun #define REQUEST_NUM 0x70 137*4882a593Smuzhiyun #define REQUEST_IDX_KIND "hw_chip_id=?" 138*4882a593Smuzhiyun #include I(REQUEST_BEGIN) 139*4882a593Smuzhiyun REQUEST(__field(0, 4, hw_chip_id) 140*4882a593Smuzhiyun __array(0x4, 0xC, reserved1) 141*4882a593Smuzhiyun __count(0x10, 8, gx0_in_address_cycles) 142*4882a593Smuzhiyun __count(0x18, 8, gx0_in_data_cycles) 143*4882a593Smuzhiyun __count(0x20, 8, gx0_in_retries) 144*4882a593Smuzhiyun __count(0x28, 8, gx0_in_bus_cycles) 145*4882a593Smuzhiyun __count(0x30, 8, gx0_in_cycles_total) 146*4882a593Smuzhiyun __count(0x38, 8, gx0_out_address_cycles) 147*4882a593Smuzhiyun __count(0x40, 8, gx0_out_data_cycles) 148*4882a593Smuzhiyun __count(0x48, 8, gx0_out_retries) 149*4882a593Smuzhiyun __count(0x50, 8, gx0_out_bus_cycles) 150*4882a593Smuzhiyun __count(0x58, 8, gx0_out_cycles_total) 151*4882a593Smuzhiyun __count(0x60, 8, gx1_in_address_cycles) 152*4882a593Smuzhiyun __count(0x68, 8, gx1_in_data_cycles) 153*4882a593Smuzhiyun __count(0x70, 8, gx1_in_retries) 154*4882a593Smuzhiyun __count(0x78, 8, gx1_in_bus_cycles) 155*4882a593Smuzhiyun __count(0x80, 8, gx1_in_cycles_total) 156*4882a593Smuzhiyun __count(0x88, 8, gx1_out_address_cycles) 157*4882a593Smuzhiyun __count(0x90, 8, gx1_out_data_cycles) 158*4882a593Smuzhiyun __count(0x98, 8, gx1_out_retries) 159*4882a593Smuzhiyun __count(0xA0, 8, gx1_out_bus_cycles) 160*4882a593Smuzhiyun __count(0xA8, 8, gx1_out_cycles_total) 161*4882a593Smuzhiyun ) 162*4882a593Smuzhiyun #include I(REQUEST_END) 163*4882a593Smuzhiyun 164*4882a593Smuzhiyun #define REQUEST_NAME processor_bus_utilization_mc_links 165*4882a593Smuzhiyun #define REQUEST_NUM 0x80 166*4882a593Smuzhiyun #define REQUEST_IDX_KIND "hw_chip_id=?" 167*4882a593Smuzhiyun #include I(REQUEST_BEGIN) 168*4882a593Smuzhiyun REQUEST(__field(0, 4, hw_chip_id) 169*4882a593Smuzhiyun __array(0x4, 0xC, reserved1) 170*4882a593Smuzhiyun __count(0x10, 8, mc0_frames) 171*4882a593Smuzhiyun __count(0x18, 8, mc0_reads) 172*4882a593Smuzhiyun __count(0x20, 8, mc0_write) 173*4882a593Smuzhiyun __count(0x28, 8, mc0_total_cycles) 174*4882a593Smuzhiyun __count(0x30, 8, mc1_frames) 175*4882a593Smuzhiyun __count(0x38, 8, mc1_reads) 176*4882a593Smuzhiyun __count(0x40, 8, mc1_writes) 177*4882a593Smuzhiyun __count(0x48, 8, mc1_total_cycles) 178*4882a593Smuzhiyun ) 179*4882a593Smuzhiyun #include I(REQUEST_END) 180*4882a593Smuzhiyun 181*4882a593Smuzhiyun /* Processor_config (0x90) skipped, no counters */ 182*4882a593Smuzhiyun /* Current_processor_frequency (0x91) skipped, no counters */ 183*4882a593Smuzhiyun 184*4882a593Smuzhiyun #define REQUEST_NAME processor_core_utilization 185*4882a593Smuzhiyun #define REQUEST_NUM 0x94 186*4882a593Smuzhiyun #define REQUEST_IDX_KIND "phys_processor_idx=?" 187*4882a593Smuzhiyun #include I(REQUEST_BEGIN) 188*4882a593Smuzhiyun REQUEST(__field(0, 4, phys_processor_idx) 189*4882a593Smuzhiyun __field(0x4, 4, hw_processor_id) 190*4882a593Smuzhiyun __count(0x8, 8, cycles_across_any_thread) 191*4882a593Smuzhiyun __count(0x10, 8, timebase_at_collection) 192*4882a593Smuzhiyun __count(0x18, 8, purr_cycles) 193*4882a593Smuzhiyun __count(0x20, 8, sum_of_cycles_across_all_threads) 194*4882a593Smuzhiyun __count(0x28, 8, instructions_completed) 195*4882a593Smuzhiyun ) 196*4882a593Smuzhiyun #include I(REQUEST_END) 197*4882a593Smuzhiyun 198*4882a593Smuzhiyun /* Processor_core_power_mode (0x95) skipped, no counters */ 199*4882a593Smuzhiyun /* Affinity_domain_information_by_virtual_processor (0xA0) skipped, 200*4882a593Smuzhiyun * no counters */ 201*4882a593Smuzhiyun /* Affinity_domain_information_by_domain (0xB0) skipped, no counters */ 202*4882a593Smuzhiyun /* Affinity_domain_information_by_partition (0xB1) skipped, no counters */ 203*4882a593Smuzhiyun /* Physical_memory_info (0xC0) skipped, no counters */ 204*4882a593Smuzhiyun /* Processor_bus_topology (0xD0) skipped, no counters */ 205*4882a593Smuzhiyun 206*4882a593Smuzhiyun #define REQUEST_NAME partition_hypervisor_queuing_times 207*4882a593Smuzhiyun #define REQUEST_NUM 0xE0 208*4882a593Smuzhiyun #define REQUEST_IDX_KIND "partition_id=?" 209*4882a593Smuzhiyun #include I(REQUEST_BEGIN) 210*4882a593Smuzhiyun REQUEST(__field(0, 2, partition_id) 211*4882a593Smuzhiyun __array(0x2, 6, reserved1) 212*4882a593Smuzhiyun __count(0x8, 8, time_waiting_for_entitlement) 213*4882a593Smuzhiyun __count(0x10, 8, times_waited_for_entitlement) 214*4882a593Smuzhiyun __count(0x18, 8, time_waiting_for_phys_processor) 215*4882a593Smuzhiyun __count(0x20, 8, times_waited_for_phys_processor) 216*4882a593Smuzhiyun __count(0x28, 8, dispatches_on_home_core) 217*4882a593Smuzhiyun __count(0x30, 8, dispatches_on_home_primary_affinity_domain) 218*4882a593Smuzhiyun __count(0x38, 8, dispatches_on_home_secondary_affinity_domain) 219*4882a593Smuzhiyun __count(0x40, 8, dispatches_off_home_secondary_affinity_domain) 220*4882a593Smuzhiyun __count(0x48, 8, dispatches_on_dedicated_processor_donating_cycles) 221*4882a593Smuzhiyun ) 222*4882a593Smuzhiyun #include I(REQUEST_END) 223*4882a593Smuzhiyun 224*4882a593Smuzhiyun #define REQUEST_NAME system_hypervisor_times 225*4882a593Smuzhiyun #define REQUEST_NUM 0xF0 226*4882a593Smuzhiyun #define REQUEST_IDX_KIND "starting_index=0xffffffff" 227*4882a593Smuzhiyun #include I(REQUEST_BEGIN) 228*4882a593Smuzhiyun REQUEST(__count(0, 8, time_spent_to_dispatch_virtual_processors) 229*4882a593Smuzhiyun __count(0x8, 8, time_spent_processing_virtual_processor_timers) 230*4882a593Smuzhiyun __count(0x10, 8, time_spent_managing_partitions_over_entitlement) 231*4882a593Smuzhiyun __count(0x18, 8, time_spent_on_system_management) 232*4882a593Smuzhiyun ) 233*4882a593Smuzhiyun #include I(REQUEST_END) 234*4882a593Smuzhiyun 235*4882a593Smuzhiyun #define REQUEST_NAME system_tlbie_count_and_time 236*4882a593Smuzhiyun #define REQUEST_NUM 0xF4 237*4882a593Smuzhiyun #define REQUEST_IDX_KIND "starting_index=0xffffffff" 238*4882a593Smuzhiyun #include I(REQUEST_BEGIN) 239*4882a593Smuzhiyun REQUEST(__count(0, 8, tlbie_instructions_issued) 240*4882a593Smuzhiyun /* 241*4882a593Smuzhiyun * FIXME: The spec says the offset here is 0x10, which I suspect 242*4882a593Smuzhiyun * is wrong. 243*4882a593Smuzhiyun */ 244*4882a593Smuzhiyun __count(0x8, 8, time_spent_issuing_tlbies) 245*4882a593Smuzhiyun ) 246*4882a593Smuzhiyun #include I(REQUEST_END) 247*4882a593Smuzhiyun 248*4882a593Smuzhiyun #define REQUEST_NAME partition_instruction_count_and_time 249*4882a593Smuzhiyun #define REQUEST_NUM 0x100 250*4882a593Smuzhiyun #define REQUEST_IDX_KIND "partition_id=?" 251*4882a593Smuzhiyun #include I(REQUEST_BEGIN) 252*4882a593Smuzhiyun REQUEST(__field(0, 2, partition_id) 253*4882a593Smuzhiyun __array(0x2, 0x6, reserved1) 254*4882a593Smuzhiyun __count(0x8, 8, instructions_performed) 255*4882a593Smuzhiyun __count(0x10, 8, time_collected) 256*4882a593Smuzhiyun ) 257*4882a593Smuzhiyun #include I(REQUEST_END) 258*4882a593Smuzhiyun 259*4882a593Smuzhiyun /* set_mmcrh (0x80001000) skipped, no counters */ 260*4882a593Smuzhiyun /* retrieve_hpmcx (0x80002000) skipped, no counters */ 261*4882a593Smuzhiyun 262*4882a593Smuzhiyun #include "req-gen/_end.h" 263