summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--arch/arm64/kernel/perf_event.c6
-rw-r--r--drivers/soc/qcom/perf_event_kryo.c23
-rw-r--r--include/linux/perf/arm_pmu.h6
3 files changed, 27 insertions, 8 deletions
diff --git a/arch/arm64/kernel/perf_event.c b/arch/arm64/kernel/perf_event.c
index 2f0fb64dab45..a03c001a19e7 100644
--- a/arch/arm64/kernel/perf_event.c
+++ b/arch/arm64/kernel/perf_event.c
@@ -85,7 +85,7 @@ enum armv8_a57_perf_types {
};
/* PMUv3 HW events mapping. */
-static const unsigned armv8_pmuv3_perf_map[PERF_COUNT_HW_MAX] = {
+const unsigned armv8_pmuv3_perf_map[PERF_COUNT_HW_MAX] = {
PERF_MAP_ALL_UNSUPPORTED,
[PERF_COUNT_HW_CPU_CYCLES] = ARMV8_PMUV3_PERFCTR_CLOCK_CYCLES,
[PERF_COUNT_HW_INSTRUCTIONS] = ARMV8_PMUV3_PERFCTR_INSTR_EXECUTED,
@@ -116,7 +116,7 @@ static const unsigned armv8_a57_perf_map[PERF_COUNT_HW_MAX] = {
[PERF_COUNT_HW_BUS_CYCLES] = ARMV8_PMUV3_PERFCTR_BUS_CYCLES,
};
-static const unsigned armv8_pmuv3_perf_cache_map[PERF_COUNT_HW_CACHE_MAX]
+const unsigned armv8_pmuv3_perf_cache_map[PERF_COUNT_HW_CACHE_MAX]
[PERF_COUNT_HW_CACHE_OP_MAX]
[PERF_COUNT_HW_CACHE_RESULT_MAX] = {
PERF_CACHE_MAP_ALL_UNSUPPORTED,
@@ -631,7 +631,7 @@ static int armv8pmu_probe_num_events(struct arm_pmu *arm_pmu)
&arm_pmu->num_events, 1);
}
-static void armv8_pmu_init(struct arm_pmu *cpu_pmu)
+void armv8_pmu_init(struct arm_pmu *cpu_pmu)
{
cpu_pmu->handle_irq = armv8pmu_handle_irq,
cpu_pmu->enable = armv8pmu_enable_event,
diff --git a/drivers/soc/qcom/perf_event_kryo.c b/drivers/soc/qcom/perf_event_kryo.c
index 4d02fc58ebee..a9a7f3f682be 100644
--- a/drivers/soc/qcom/perf_event_kryo.c
+++ b/drivers/soc/qcom/perf_event_kryo.c
@@ -205,12 +205,14 @@ static void kryo_clear_resr(struct kryo_evt *evtinfo)
kryo_write_pmresr(evtinfo->reg, evtinfo->l_h, val);
}
-static void kryo_pmu_disable_event(struct hw_perf_event *hwc, int idx)
+static void kryo_pmu_disable_event(struct perf_event *event)
{
unsigned long flags;
u32 val = 0;
unsigned long ev_num;
struct kryo_evt evtinfo;
+ struct hw_perf_event *hwc = &event->hw;
+ int idx = hwc->idx;
struct pmu_hw_events *events = this_cpu_ptr(cpu_pmu->hw_events);
/* Disable counter and interrupt */
@@ -240,12 +242,14 @@ kryo_dis_out:
raw_spin_unlock_irqrestore(&events->pmu_lock, flags);
}
-static void kryo_pmu_enable_event(struct hw_perf_event *hwc, int idx)
+static void kryo_pmu_enable_event(struct perf_event *event)
{
unsigned long flags;
u32 val = 0;
unsigned long ev_num;
struct kryo_evt evtinfo;
+ struct hw_perf_event *hwc = &event->hw;
+ int idx = hwc->idx;
unsigned long long prev_count = local64_read(&hwc->prev_count);
struct pmu_hw_events *events = this_cpu_ptr(cpu_pmu->hw_events);
@@ -280,7 +284,7 @@ static void kryo_pmu_enable_event(struct hw_perf_event *hwc, int idx)
armv8pmu_enable_intens(idx);
/* Restore prev val */
- cpu_pmu->write_counter(idx, prev_count & COUNT_MASK);
+ cpu_pmu->write_counter(event, prev_count & COUNT_MASK);
/* Enable counter */
armv8pmu_enable_counter(idx);
@@ -307,6 +311,13 @@ static inline void kryo_init_usermode(void)
}
#endif
+static int kryo_map_event(struct perf_event *event)
+{
+ return armpmu_map_event(event, &armv8_pmuv3_perf_map,
+ &armv8_pmuv3_perf_cache_map,
+ KRYO_EVT_MASK);
+}
+
static void kryo_pmu_reset(void *info)
{
u32 idx, nb_cnt = cpu_pmu->num_events;
@@ -357,16 +368,18 @@ static const struct attribute_group *kryo_pmu_attr_grps[] = {
NULL,
};
-int kryo_pmu_init(struct arm_pmu *armv8_pmu)
+int kryo_pmu_init(struct arm_pmu *kryo_pmu)
{
pr_info("CPU pmu for kryo-pmuv3 detected\n");
- cpu_pmu = armv8_pmu;
+ armv8_pmu_init(kryo_pmu);
+ cpu_pmu = kryo_pmu;
cpu_pmu->enable = kryo_pmu_enable_event;
cpu_pmu->disable = kryo_pmu_disable_event;
cpu_pmu->reset = kryo_pmu_reset;
cpu_pmu->pmu.attr_groups = kryo_pmu_attr_grps;
+ cpu_pmu->map_event = kryo_map_event;
cpu_pmu->name = "qcom,kryo-pmuv3";
kryo_clear_resrs();
diff --git a/include/linux/perf/arm_pmu.h b/include/linux/perf/arm_pmu.h
index dd3ea60948a8..f7bbce527649 100644
--- a/include/linux/perf/arm_pmu.h
+++ b/include/linux/perf/arm_pmu.h
@@ -111,6 +111,11 @@ struct arm_pmu {
#define to_arm_pmu(p) (container_of(p, struct arm_pmu, pmu))
+extern const unsigned armv8_pmuv3_perf_map[PERF_COUNT_HW_MAX];
+extern const unsigned armv8_pmuv3_perf_cache_map[PERF_COUNT_HW_CACHE_MAX]
+ [PERF_COUNT_HW_CACHE_OP_MAX]
+ [PERF_COUNT_HW_CACHE_RESULT_MAX];
+
int armpmu_register(struct arm_pmu *armpmu, int type);
u64 armpmu_event_update(struct perf_event *event);
@@ -149,6 +154,7 @@ int arm_pmu_device_probe(struct platform_device *pdev,
const struct of_device_id *of_table,
const struct pmu_probe_info *probe_table);
+void armv8_pmu_init(struct arm_pmu *cpu_pmu);
int armv8pmu_enable_intens(int idx);
int armv8pmu_disable_intens(int idx);
int armv8pmu_enable_counter(int idx);