|
12 | 12 |
|
13 | 13 | #include <linux/of.h>
|
14 | 14 | #include <linux/perf/arm_pmu.h>
|
| 15 | +#include <linux/perf/arm_pmuv3.h> |
15 | 16 | #include <linux/platform_device.h>
|
16 | 17 |
|
17 | 18 | #include <asm/apple_m1_pmu.h>
|
@@ -174,6 +175,17 @@ static const unsigned m1_pmu_perf_map[PERF_COUNT_HW_MAX] = {
|
174 | 175 | [PERF_COUNT_HW_BRANCH_MISSES] = M1_PMU_PERFCTR_BRANCH_MISPRED_NONSPEC,
|
175 | 176 | };
|
176 | 177 |
|
| 178 | +#define M1_PMUV3_EVENT_MAP(pmuv3_event, m1_event) \ |
| 179 | + [ARMV8_PMUV3_PERFCTR_##pmuv3_event] = M1_PMU_PERFCTR_##m1_event |
| 180 | + |
| 181 | +static const u16 m1_pmu_pmceid_map[ARMV8_PMUV3_MAX_COMMON_EVENTS] = { |
| 182 | + [0 ... ARMV8_PMUV3_MAX_COMMON_EVENTS - 1] = HW_OP_UNSUPPORTED, |
| 183 | + M1_PMUV3_EVENT_MAP(INST_RETIRED, INST_ALL), |
| 184 | + M1_PMUV3_EVENT_MAP(CPU_CYCLES, CORE_ACTIVE_CYCLE), |
| 185 | + M1_PMUV3_EVENT_MAP(BR_RETIRED, INST_BRANCH), |
| 186 | + M1_PMUV3_EVENT_MAP(BR_MIS_PRED_RETIRED, BRANCH_MISPRED_NONSPEC), |
| 187 | +}; |
| 188 | + |
177 | 189 | /* sysfs definitions */
|
178 | 190 | static ssize_t m1_pmu_events_sysfs_show(struct device *dev,
|
179 | 191 | struct device_attribute *attr,
|
@@ -558,6 +570,26 @@ static int m2_pmu_map_event(struct perf_event *event)
|
558 | 570 | return armpmu_map_event(event, &m1_pmu_perf_map, NULL, M1_PMU_CFG_EVENT);
|
559 | 571 | }
|
560 | 572 |
|
| 573 | +static int m1_pmu_map_pmuv3_event(unsigned int eventsel) |
| 574 | +{ |
| 575 | + u16 m1_event = HW_OP_UNSUPPORTED; |
| 576 | + |
| 577 | + if (eventsel < ARMV8_PMUV3_MAX_COMMON_EVENTS) |
| 578 | + m1_event = m1_pmu_pmceid_map[eventsel]; |
| 579 | + |
| 580 | + return m1_event == HW_OP_UNSUPPORTED ? -EOPNOTSUPP : m1_event; |
| 581 | +} |
| 582 | + |
| 583 | +static void m1_pmu_init_pmceid(struct arm_pmu *pmu) |
| 584 | +{ |
| 585 | + unsigned int event; |
| 586 | + |
| 587 | + for (event = 0; event < ARMV8_PMUV3_MAX_COMMON_EVENTS; event++) { |
| 588 | + if (m1_pmu_map_pmuv3_event(event) >= 0) |
| 589 | + set_bit(event, pmu->pmceid_bitmap); |
| 590 | + } |
| 591 | +} |
| 592 | + |
561 | 593 | static void m1_pmu_reset(void *info)
|
562 | 594 | {
|
563 | 595 | int i;
|
@@ -618,6 +650,9 @@ static int m1_pmu_init(struct arm_pmu *cpu_pmu, u32 flags)
|
618 | 650 | cpu_pmu->reset = m1_pmu_reset;
|
619 | 651 | cpu_pmu->set_event_filter = m1_pmu_set_event_filter;
|
620 | 652 |
|
| 653 | + cpu_pmu->map_pmuv3_event = m1_pmu_map_pmuv3_event; |
| 654 | + m1_pmu_init_pmceid(cpu_pmu); |
| 655 | + |
621 | 656 | bitmap_set(cpu_pmu->cntr_mask, 0, M1_PMU_NR_COUNTERS);
|
622 | 657 | cpu_pmu->attr_groups[ARMPMU_ATTR_GROUP_EVENTS] = &m1_pmu_events_attr_group;
|
623 | 658 | cpu_pmu->attr_groups[ARMPMU_ATTR_GROUP_FORMATS] = &m1_pmu_format_attr_group;
|
|
0 commit comments