mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-09-22 04:31:58 +08:00
perf: arm_cspmu: Support implementation specific filters
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@os.amperecomputing.com> Reviewed-by: Besar Wicaksono <bwicaksono@nvidia.com> Reviewed-by: Suzuki K Poulose <suzuki.poulose@arm.com> Link: https://lore.kernel.org/r/20230913233941.9814-3-ilkka@os.amperecomputing.com Signed-off-by: Will Deacon <will@kernel.org>
This commit is contained in:
parent
8c282414ca
commit
0a7603ab24
@ -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);
|
||||
@ -454,6 +457,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;
|
||||
}
|
||||
@ -815,9 +819,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);
|
||||
|
||||
@ -849,7 +853,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;
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user