Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 39633b40 authored by Kajol Jain's avatar Kajol Jain Committed by Greg Kroah-Hartman
Browse files

powerpc/hv-gpci: Fix hv_gpci event list



[ Upstream commit 03f7c1d2a49acd30e38789cd809d3300721e9b0e ]

Based on getPerfCountInfo v1.018 documentation, some of the
hv_gpci events were deprecated for platform firmware that
supports counter_info_version 0x8 or above.

Fix the hv_gpci event list by adding a new attribute group
called "hv_gpci_event_attrs_v6" and a "ENABLE_EVENTS_COUNTERINFO_V6"
macro to enable these events for platform firmware
that supports counter_info_version 0x6 or below. And assigning
the hv_gpci event list based on output counter info version
of underlying plaform.

Fixes: 97bf2640 ("powerpc/perf/hv-gpci: add the remaining gpci requests")
Signed-off-by: default avatarKajol Jain <kjain@linux.ibm.com>
Reviewed-by: default avatarMadhavan Srinivasan <maddy@linux.ibm.com>
Reviewed-by: default avatarAthira Rajeev <atrajeev@linux.vnet.ibm.com>
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/20221130174513.87501-1-kjain@linux.ibm.com


Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
parent aed86289
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -79,6 +79,7 @@ REQUEST(__field(0, 8, partition_id)
)
#include I(REQUEST_END)

#ifdef ENABLE_EVENTS_COUNTERINFO_V6
/*
 * Not available for counter_info_version >= 0x8, use
 * run_instruction_cycles_by_partition(0x100) instead.
@@ -92,6 +93,7 @@ REQUEST(__field(0, 8, partition_id)
	__count(0x10,	8,	cycles)
)
#include I(REQUEST_END)
#endif

#define REQUEST_NAME system_performance_capabilities
#define REQUEST_NUM 0x40
@@ -103,6 +105,7 @@ REQUEST(__field(0, 1, perf_collect_privileged)
)
#include I(REQUEST_END)

#ifdef ENABLE_EVENTS_COUNTERINFO_V6
#define REQUEST_NAME processor_bus_utilization_abc_links
#define REQUEST_NUM 0x50
#define REQUEST_IDX_KIND "hw_chip_id=?"
@@ -194,6 +197,7 @@ REQUEST(__field(0, 4, phys_processor_idx)
	__count(0x28,	8,	instructions_completed)
)
#include I(REQUEST_END)
#endif

/* Processor_core_power_mode (0x95) skipped, no counters */
/* Affinity_domain_information_by_virtual_processor (0xA0) skipped,
+32 −1
Original line number Diff line number Diff line
@@ -70,7 +70,7 @@ static struct attribute_group format_group = {

static struct attribute_group event_group = {
	.name  = "events",
	.attrs = hv_gpci_event_attrs,
	/* .attrs is set in init */
};

#define HV_CAPS_ATTR(_name, _format)				\
@@ -280,6 +280,7 @@ static int hv_gpci_init(void)
	int r;
	unsigned long hret;
	struct hv_perf_caps caps;
	struct hv_gpci_request_buffer *arg;

	hv_gpci_assert_offsets_correct();

@@ -298,6 +299,36 @@ static int hv_gpci_init(void)
	/* sampling not supported */
	h_gpci_pmu.capabilities |= PERF_PMU_CAP_NO_INTERRUPT;

	arg = (void *)get_cpu_var(hv_gpci_reqb);
	memset(arg, 0, HGPCI_REQ_BUFFER_SIZE);

	/*
	 * hcall H_GET_PERF_COUNTER_INFO populates the output
	 * counter_info_version value based on the system hypervisor.
	 * Pass the counter request 0x10 corresponds to request type
	 * 'Dispatch_timebase_by_processor', to get the supported
	 * counter_info_version.
	 */
	arg->params.counter_request = cpu_to_be32(0x10);

	r = plpar_hcall_norets(H_GET_PERF_COUNTER_INFO,
			virt_to_phys(arg), HGPCI_REQ_BUFFER_SIZE);
	if (r) {
		pr_devel("hcall failed, can't get supported counter_info_version: 0x%x\n", r);
		arg->params.counter_info_version_out = 0x8;
	}

	/*
	 * Use counter_info_version_out value to assign
	 * required hv-gpci event list.
	 */
	if (arg->params.counter_info_version_out >= 0x8)
		event_group.attrs = hv_gpci_event_attrs;
	else
		event_group.attrs = hv_gpci_event_attrs_v6;

	put_cpu_var(hv_gpci_reqb);

	r = perf_pmu_register(&h_gpci_pmu, h_gpci_pmu.name, -1);
	if (r)
		return r;
+1 −0
Original line number Diff line number Diff line
@@ -53,6 +53,7 @@ enum {
#define REQUEST_FILE "../hv-gpci-requests.h"
#define NAME_LOWER hv_gpci
#define NAME_UPPER HV_GPCI
#define ENABLE_EVENTS_COUNTERINFO_V6
#include "req-gen/perf.h"
#undef REQUEST_FILE
#undef NAME_LOWER
+20 −0
Original line number Diff line number Diff line
@@ -139,6 +139,26 @@ PMU_EVENT_ATTR_STRING( \
#define REQUEST_(r_name, r_value, r_idx_1, r_fields)			\
	r_fields

/* Generate event list for platforms with counter_info_version 0x6 or below */
static __maybe_unused struct attribute *hv_gpci_event_attrs_v6[] = {
#include REQUEST_FILE
	NULL
};

/*
 * Based on getPerfCountInfo v1.018 documentation, some of the hv-gpci
 * events were deprecated for platform firmware that supports
 * counter_info_version 0x8 or above.
 * Those deprecated events are still part of platform firmware that
 * support counter_info_version 0x6 and below. As per the getPerfCountInfo
 * v1.018 documentation there is no counter_info_version 0x7.
 * Undefining macro ENABLE_EVENTS_COUNTERINFO_V6, to disable the addition of
 * deprecated events in "hv_gpci_event_attrs" attribute group, for platforms
 * that supports counter_info_version 0x8 or above.
 */
#undef ENABLE_EVENTS_COUNTERINFO_V6

/* Generate event list for platforms with counter_info_version 0x8 or above*/
static __maybe_unused struct attribute *hv_gpci_event_attrs[] = {
#include REQUEST_FILE
	NULL