Re: [PATCH v6 2/4] perf: arm_cspmu: Support implementation specific filters

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 15/08/2023 07:35, Ilkka Koskinen wrote:
ARM Coresight PMU architecture specification [1] defines PMEVTYPER and
PMEVFILT* registers as optional in Chapter 2.1. Moreover, implementers may
choose to use PMIMPDEF* registers (offset: 0xD80-> 0xDFF) to filter the
events. Add support for those by adding implementation specific filter
callback function.

[1] https://developer.arm.com/documentation/ihi0091/latest

Signed-off-by: Ilkka Koskinen <ilkka@xxxxxxxxxxxxxxxxxxxxxx>
Reviewed-by: Besar Wicaksono <bwicaksono@xxxxxxxxxx>

Reviewed-by: Suzuki K Poulose <suzuki.poulose@xxxxxxx>

---
  drivers/perf/arm_cspmu/arm_cspmu.c | 12 ++++++++----
  drivers/perf/arm_cspmu/arm_cspmu.h |  3 +++
  2 files changed, 11 insertions(+), 4 deletions(-)

diff --git a/drivers/perf/arm_cspmu/arm_cspmu.c b/drivers/perf/arm_cspmu/arm_cspmu.c
index 6387cbad7a7d..94f6856ec786 100644
--- a/drivers/perf/arm_cspmu/arm_cspmu.c
+++ b/drivers/perf/arm_cspmu/arm_cspmu.c
@@ -116,6 +116,9 @@ static unsigned long arm_cspmu_cpuhp_state;
static DEFINE_MUTEX(arm_cspmu_lock); +static void arm_cspmu_set_ev_filter(struct arm_cspmu *cspmu,
+				    struct hw_perf_event *hwc, u32 filter);
+
  static struct acpi_apmt_node *arm_cspmu_apmt_node(struct device *dev)
  {
  	return *(struct acpi_apmt_node **)dev_get_platdata(dev);
@@ -450,6 +453,7 @@ static int arm_cspmu_init_impl_ops(struct arm_cspmu *cspmu)
  	CHECK_DEFAULT_IMPL_OPS(impl_ops, event_type);
  	CHECK_DEFAULT_IMPL_OPS(impl_ops, event_filter);
  	CHECK_DEFAULT_IMPL_OPS(impl_ops, event_attr_is_visible);
+	CHECK_DEFAULT_IMPL_OPS(impl_ops, set_ev_filter);
return 0;
  }
@@ -811,9 +815,9 @@ static inline void arm_cspmu_set_event(struct arm_cspmu *cspmu,
  	writel(hwc->config, cspmu->base0 + offset);
  }
-static inline void arm_cspmu_set_ev_filter(struct arm_cspmu *cspmu,
-					   struct hw_perf_event *hwc,
-					   u32 filter)
+static void arm_cspmu_set_ev_filter(struct arm_cspmu *cspmu,
+					struct hw_perf_event *hwc,
+					u32 filter)
  {
  	u32 offset = PMEVFILTR + (4 * hwc->idx);
@@ -845,7 +849,7 @@ static void arm_cspmu_start(struct perf_event *event, int pmu_flags)
  		arm_cspmu_set_cc_filter(cspmu, filter);
  	} else {
  		arm_cspmu_set_event(cspmu, hwc);
-		arm_cspmu_set_ev_filter(cspmu, hwc, filter);
+		cspmu->impl.ops.set_ev_filter(cspmu, hwc, filter);
  	}
hwc->state = 0;
diff --git a/drivers/perf/arm_cspmu/arm_cspmu.h b/drivers/perf/arm_cspmu/arm_cspmu.h
index e5c6dff2ce7f..274ca3d10578 100644
--- a/drivers/perf/arm_cspmu/arm_cspmu.h
+++ b/drivers/perf/arm_cspmu/arm_cspmu.h
@@ -104,6 +104,9 @@ struct arm_cspmu_impl_ops {
  	u32 (*event_type)(const struct perf_event *event);
  	/* Decode filter value from configs */
  	u32 (*event_filter)(const struct perf_event *event);
+	/* Set event filter */
+	void (*set_ev_filter)(struct arm_cspmu *cspmu,
+			      struct hw_perf_event *hwc, u32 filter);
  	/* Hide/show unsupported events */
  	umode_t (*event_attr_is_visible)(struct kobject *kobj,
  					 struct attribute *attr, int unused);




[Index of Archives]     [Kernel Newbies]     [Security]     [Netfilter]     [Bugtraq]     [Linux FS]     [Yosemite Forum]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Samba]     [Video 4 Linux]     [Device Mapper]     [Linux Resources]

  Powered by Linux