"H_GetPerformanceCounterInfo" (refered to as hv_gpci or just gpci from here on) is an interface to retrieve specific performance counters and other data from the hypervisor. All outputs have a fixed format (and are represented as structs in this patch).
Signed-off-by: Cody P Schafer <c...@linux.vnet.ibm.com> --- arch/powerpc/include/asm/hv_gpci.h | 490 +++++++++++++++++++++++++++++++++++++ 1 file changed, 490 insertions(+) create mode 100644 arch/powerpc/include/asm/hv_gpci.h diff --git a/arch/powerpc/include/asm/hv_gpci.h b/arch/powerpc/include/asm/hv_gpci.h new file mode 100644 index 0000000..237de26 --- /dev/null +++ b/arch/powerpc/include/asm/hv_gpci.h @@ -0,0 +1,490 @@ +#ifndef LINUX_POWERPC_UAPI_HV_GPCI_H_ +#define LINUX_POWERPC_UAPI_HV_GPCI_H_ + +#include <linux/types.h> + +/* From the document "H_GetPerformanceCounterInfo Interface" v1.06, paritialy + * updated with v1.07 */ + +/* H_GET_PERF_COUNTER_INFO argument */ +struct hv_get_perf_counter_info_params { + __be32 counter_request; /* I */ + __be32 starting_index; /* IO */ + __be16 secondary_index; /* IO */ + __be16 returned_values; /* O */ + __be32 detail_rc; /* O, "only for 32bit clients" */ + + /* + * O, size each of counter_value element in bytes, only set for version + * >= 0x3 + */ + __be16 cv_element_size; + + /* I, funny if version < 0x3 */ + __u8 counter_info_version_in; + + /* O, funny if version < 0x3 */ + __u8 counter_info_version_out; + __u8 reserved[0xC]; + __u8 counter_value[]; +} __packed; + +/* 8 => power8 (1.07) + * 6 => TLBIE (1.07) + * 5 => (1.05) + * 4 => ? + * 3 => ? + * 2 => v7r7m0.phyp (?) + * 1 => v7r6m0.phyp (?) + * 0 => v7r{2,3,4}m0.phyp (?) + */ +#define COUNTER_INFO_VERSION_CURRENT 0x8 + +/* these determine the counter_value[] layout and the meaning of starting_index + * and secondary_index */ +enum counter_info_requests { + + /* GENERAL */ + + /* @starting_index: "starting" physical processor index or -1 for + * current phyical processor. Data is only collected + * for the processors' "primary" thread. + * @secondary_index: unused + */ + CIR_dispatch_timebase_by_processor = 0x10, + + /* @starting_index: starting partition id or -1 for the current logical + * partition (virtual machine). + * @secondary_index: unused + */ + CIR_entitled_capped_uncapped_donated_idle_timebase_by_partition = 0x20, + + /* @starting_index: starting partition id or -1 for the current logical + * partition (virtual machine). + * @secondary_index: unused + */ + CIR_run_instructions_run_cycles_by_partition = 0x30, + + /* @starting_index: must be -1 (to refer to the current partition) + * @secondary_index: unused + */ + CIR_system_performance_capabilities = 0x40, + + + /* Data from this should only be considered valid if + * counter_info_version >= 0x3 + * @starting_index: starting hardware chip id or -1 for the current hw + * chip id + * @secondary_index: unused + */ + CIR_processor_bus_utilization_abc_links = 0x50, + + /* Data from this should only be considered valid if + * counter_info_version >= 0x3 + * @starting_index: starting hardware chip id or -1 for the current hw + * chip id + * @secondary_index: unused + */ + CIR_processor_bus_utilization_wxyz_links = 0x60, + + + /* EXPANDED */ + + /* Avaliable if counter_info_version >= 0x3 + * @starting_index: starting hardware chip id or -1 for the current hw + * chip id + * @secondary_index: unused + */ + CIR_processor_bus_utilization_gx_links = 0x70, + + /* Avaliable if counter_info_version >= 0x3 + * @starting_index: starting hardware chip id or -1 for the current hw + * chip id + * @secondary_index: unused + */ + CIR_processor_bus_utilization_mc_links = 0x80, + + /* Avaliable if counter_info_version >= 0x3 + * @starting_index: starting physical processor or -1 for the current + * physical processor + * @secondary_index: unused + */ + CIR_processor_config = 0x90, + + /* Avaliable if counter_info_version >= 0x3 + * @starting_index: starting physical processor or -1 for the current + * physical processor + * @secondary_index: unused + */ + CIR_current_processor_frequency = 0x91, + + CIR_processor_core_utilization = 0x94, + + CIR_processor_core_power_mode = 0x95, + + CIR_affinity_domain_information_by_virutal_processor = 0xA0, + + CIR_affinity_domain_info_by_domain = 0xB0, + + CIR_affinity_domain_info_by_partition = 0xB1, + + /* @starting_index: unused + * @secondary_index: unused + */ + CIR_physical_memory_info = 0xC0, + + CIR_processor_bus_topology = 0xD0, + + CIR_partition_hypervisor_queuing_times = 0xE0, + + CIR_system_hypervisor_times = 0xF0, + + /* LAB */ + + CIR_set_mmcrh = 0x80001000, + CIR_get_hpmcx = 0x80002000, +}; + +/* counter value layout */ +struct cv_dispatch_timebase_by_processor { + __be64 processor_time_in_timebase_cycles; + __be32 hw_processor_id; + __be16 owning_part_id; /* 0xffff if shared or unowned */ + __u8 processor_state; + __u8 version; /* unused unless counter_info_version == 0 */ + __be32 hw_chip_id; /* -1 for "Not Installed" processors */ + __be32 phys_module_id; /* -1 for "Not Installed" processors */ + __be32 primary_affinity_domain_idx; + __be32 secondary_affinity_domain_idx; + __be32 processor_version; + __be16 logical_processor_idx; + __u8 reserved[0x2]; + + /* counter_info_version >= 0x3 || version >= 0x1 */ + __be32 processor_id_register; + __be32 physical_processor_idx; /* counter_info_version >= 0x3 */ +} __packed; + +struct cv_timebase_by_partition { + __be64 partition_id; + __be64 entitled_cycles; + __be64 consumed_capped_cycles; + __be64 consumed_uncapped_cycles; + __be64 cycles_donated; + __be64 purr_idle_cycles; +} __packed; + +struct cv_cycles_per_partition { + __be64 partition_id; + __be64 instructions_completed; /* 0 if collection is unsupported */ + __be64 cycles; /* 0 if collection is unsupported */ +} __packed; + +struct cv_system_performance_capabilities { + /* If != 0, allowed to collect data from other partitions */ + __u8 perf_collect_privlidged; + + /* These are only valid if counter_info_version >= 0x3 */ +#define CV_CM_GA 0x1 +#define CV_CM_EXPANDED 0x2 +#define CV_CM_LAB 0x3 + /* remainig bits are reserved */ + __u8 capability_mask; + __u8 reserved[0xE]; +} __packed; + +struct cv_processor_bus_utilization_abc { + __be32 hw_chip_id; + __u8 reserved1[0xC]; + __be64 total_link_cycles; + __be64 idle_cycles_a; + __be64 idle_cycles_b; + __be64 idle_cycles_c; + __u8 reserved2[0x20]; +} __packed; + +struct cv_processor_bus_utilization_wxyz { + __be32 hw_chip_id; + __u8 reserved1[0xC]; + __be64 total_link_cycles; + + /* Inactive links (all cycles idle) give -1 */ + __be64 idle_cycles_w; + __be64 idle_cycles_x; + __be64 idle_cycles_y; + __be64 idle_cycles_z; + __u8 reserved2[0x28]; +} __packed; + +/* EXPANDED */ + +struct cv_gx_cycles { + __be64 address_cycles; + __be64 data_cycles; + __be64 retries; + __be64 bus_cycles; + __be64 total_cycles; +} __packed; + +struct cv_gx_cycles_io { + struct cv_gx_cycles in, out; +} __packed; + +struct cv_processor_bus_utilization_gx { + __be32 hw_chip_id; + __u8 reserved1[0xC]; + struct cv_gx_cycles_io gx[2]; +} __packed; + +struct cv_mc_counts { + __be64 frames; + __be64 reads; + __be64 writes; + __be64 total_cycles; +} __packed; + +/* inactive links return 0 for all utilization data */ +struct cv_processor_bus_utilization_mc { + __be32 hw_chip_id; + __u8 reserved1[0xC]; + struct cv_mc_counts mc[2]; +} __packed; + +struct cv_processor_config { + __be32 physical_processor_idx; + __be32 hw_node_id; + __be32 hw_card_id; + __be32 phys_module_id; + __be32 hw_chip_id; + __be32 hw_processor_id; + __be32 processor_id_register; + +#define CV_PS_NOT_INSTALLED 0x1 +#define CV_PS_GAURDED_OFF 0x2 +#define CV_PS_UNLICENCED 0x3 +#define CV_PS_SHARED 0x4 +#define CV_PS_BORROWED 0x5 +#define CV_PS_DEDICATED 0x6 + __u8 processor_state; + + __u8 reserved1[0x1]; + __be16 owning_part_id; + __be32 processor_version; + __u8 reserved2[0x4]; +} __packed; + +struct cv_processor_frequency { + __be32 physical_processor_idx; + __be32 hw_processor_id; + __u8 reserved1[0x8]; + __be32 nominal_freq_mhz; + __be32 current_freq_mhz; +} __packed; + +struct cv_processor_core_utilization { + __be32 physical_processor_idx; + __be32 hw_processor_id; + __be64 cycles; + __be64 timebase_at_collection; + __be64 purr_cycles; + __be64 sum_of_cycles_across_threads; + __be64 instructions_completed; +} __packed; + +struct cv_processor_core_power_mode { + __be16 partition_id; + __u8 reserved1[0x6]; + +#define CV_PM_NONE 0x0 +#define CV_PM_NOMINAL 0x1 +#define CV_PM_DYNAMIC_MAX_PERF 0x2 +#define CV_PM_DYNAMIC_POWER_SAVE 0x3 +#define CV_PM_UNKNOWN 0xF + __be16 power_mode; + + __u8 reserved2[0x6]; +} __packed; + +struct cv_affinity_domain_information_by_virutal_processor { + __be16 partition_id; + __be16 virtual_processor_idx; + __u8 reserved1[0xC]; + __be16 physical_processor_idx; + __be16 primary_affinity_domain_idx; + __be16 secondary_affinity_domain_idx; + __u8 reserved2[0x2]; + __u8 reserved3[0x8]; +} __packed; + +struct cv_affinity_domain_info_by_domain { + __be16 primary_affinity_domain_idx; + __be16 secondary_affinity_domain_idx; + __be32 total_processor_units; + __be32 free_dedicated_processor_units; + __be32 free_shared_processor_units; + __be32 total_memory_lmbs; + __be32 free_memory_lmbs; + __be32 num_partitions_in_domain; + __u8 reserved1[0x14]; +} __packed; + +struct cv_affinity_domain_info_by_partition { + __be16 partition_id; + __u8 reserved1[0x6]; + __be16 assignment_order; + +#define CV_PPS_UNKNOWN 0x00 +#define CV_PPS_CONTAIN_IN_PRIMARY_DOMAIN 0x01 +#define CV_PPS_CONTAIN_IN_SECONDARY_DOMAIN 0x02 +#define CV_PPS_SPREAD_ACROSS_SECONDAY_DOMAINS 0x03 +#define CV_PPS_WHEREEVER 0x04 +#define CV_PPS_SCRAMBLE 0x05 + __u8 partition_placement_spread; + + __u8 parition_affinity_score; + __be16 num_affinity_domain_elements; + __be16 affinity_domain_element_size; + __u8 domain_elements[]; +} __packed; + +struct cv_affinity_domain_elem { + __be16 primary_affinity_domain_idx; + __be16 secondary_affinity_domain_idx; + __be32 dedicated_processor_units_allocated; + __be32 dedicated_memory_allocated_reserved_1; + __be32 dedicated_memory_allocated_reserved_2; + __be32 dedicated_memory_allocated_16Gb_pages; + __u8 reserved[0x8]; +} __packed; + +/* Also avaliable via `of_get_flat_dt_prop(node, "ibm,lmb-size", &l)` */ +struct cv_physical_memory_info { + __be64 lmb_size_in_bytes; + __u8 reserved1[0x18]; +} __packed; + +struct cv_processor_bus_topology { + __be32 hw_chip_id; + __be32 hw_node_id; + __be32 fabric_chip_id; + __u8 reserved1[0x4]; + +#define CV_IM_A_LINK_ACTIVE (1 << 0) +#define CV_IM_B_LINK_ACTIVE (1 << 1) +#define CV_IM_C_LINK_ACTIVE (1 << 2) +/* Bits 3-5 are reserved */ +#define CV_IM_ABC_LINK_WIDTH_MASK ((1 << 6) | (1 << 7)) +#define CV_IM_ABC_LINK_WIDTH_SHIFT 6 +#define CV_IM_ABC_LINK_WIDTH_8B 0x0 +#define CV_IM_ABC_LINK_WIDTH_4B 0x1 + +#define CV_IM_W_LINK_ACTIVE (1 << 8) +#define CV_IM_X_LINK_ACTIVE (1 << 9) +#define CV_IM_Y_LINK_ACTIVE (1 << 10) +#define CV_IM_Z_LINK_ACTIVE (1 << 11) +/* Bits 12-13 are reserved */ + +#define CV_IM_WXYZ_LINK_WIDTH_MASK ((1 << 14) | (1 << 15)) +#define CV_IM_WXYZ_LINK_WIDTH_SHIFT 14 +#define CV_IM_WXYZ_LINK_WIDTH_8B 0x0 +#define CV_IM_WXYZ_LINK_WIDTH_4B 0x1 + +#define CV_IM_GX0_CONFIGURED (1 << 16) +#define CV_IM_GX1_CONFIGURED (1 << 17) +/* Bits 18-23 are reserved */ +#define CV_IM_MC0_CONFIGURED (1 << 24) +#define CV_IM_MC1_CONFIGURED (1 << 25) +/* Bits 26-31 are reserved */ + + __be32 info_mask; + + __u8 hw_node_id_connected_to_a_link; + __u8 hw_node_id_connected_to_b_link; + + __u8 reserved2[0x2]; + + __u8 fabric_chip_id_connected_to_w_link; + __u8 fabric_chip_id_connected_to_x_link; + __u8 fabric_chip_id_connected_to_y_link; + __u8 fabric_chip_id_connected_to_z_link; + + __u8 reserved3[0x4]; +} __packed; + +struct cv_partition_hypervisor_queuing_times { + __be16 partition_id; + __u8 reserved1[0x6]; + __be64 time_waiting_for_entitlement; /* in timebase cycles */ + __be64 times_waited_for_entitlement; + __be64 time_waiting_for_physical_processor; /* in timebase cycles */ + __be64 times_waited_for_physical_processor; + __be64 dispatches_on_home_processor_core; + __be64 dispatches_on_home_primary_affinity_domain; + __be64 dispatches_on_home_secondary_affinity_domain; + __be64 dispatches_off_home_secondary_affinity_domain; + __be64 dispatches_on_dedicated_processor_donating_cycles; +} __packed; + +struct cv_system_hypervisor_times { + __be64 phyp_time_spent_to_dispatch_virtual_processors; + __be64 phyp_time_spent_processing_virtual_processor_timers; + __be64 phyp_time_spent_managing_partitions_over_entitlement; + __be64 time_spent_on_system_managment; +} __packed; + +/* LAB */ + +struct cv_set_mmcrh { + /* Only HPMC bits (40:46, 48:54) used, all others ignored + * -1 = default (0x00000000_003C1200) + */ + __be64 mmcrh_value_to_set; +}; + +struct cv_get_hpmcx { + __be32 hw_processor_id; + __u8 reserved1[0x4]; + __be64 mmcrh_current; + __be64 time_since_mmcrh_was_set; + __be64 hpmc1_since_current_mmcrh; + __be64 hpmc2_since_current_mmcrh; + __be64 hpmc3_since_current_mmcrh; + __be64 hpmc3_current; + __be64 hpmc4_since_current_mmcrh; + __be64 hpmc4_current; +}; + +union h_gpci_cvs { + /* GA */ + struct cv_dispatch_timebase_by_processor dispatch_timebase_by_processor; + struct cv_timebase_by_partition timebase_by_partition; + struct cv_cycles_per_partition cycles_per_partition; + struct cv_system_performance_capabilities system_performance_capabilities; + struct cv_processor_bus_utilization_abc processor_bus_utilization_abc; + struct cv_processor_bus_utilization_wxyz processor_bus_utilization_wxyz; + + /* EXPANDED */ + struct cv_gx_cycles gx_cycles; + struct cv_gx_cycles_io gx_cycles_io; + struct cv_processor_bus_utilization_gx processor_bus_utilization_gx; + struct cv_mc_counts mc_counts; + struct cv_processor_bus_utilization_mc processor_bus_utilization_mc; + struct cv_processor_config processor_config; + struct cv_processor_frequency processor_frequency; + struct cv_processor_core_utilization processor_core_utilization; + struct cv_processor_core_power_mode processor_core_power_mode; + struct cv_affinity_domain_information_by_virutal_processor affinity_domain_information_by_virutal_processor; + struct cv_affinity_domain_info_by_domain affinity_domain_info_by_domain; + struct cv_affinity_domain_info_by_partition affinity_domain_info_by_partition; + struct cv_affinity_domain_elem affinity_domain_elem; + struct cv_physical_memory_info physical_memory_info; + struct cv_processor_bus_topology processor_bus_topology; + struct cv_partition_hypervisor_queuing_times partition_hypervisor_queuing_times; + struct cv_system_hypervisor_times system_hypervisor_times; + + /* LAB */ + struct cv_set_mmcrh set_mmcrh; + struct cv_get_hpmcx get_hpmcx; +}; + +#endif -- 1.8.5.2 _______________________________________________ Linuxppc-dev mailing list Linuxppc-dev@lists.ozlabs.org https://lists.ozlabs.org/listinfo/linuxppc-dev