diff options
author | Satya Durga Srinivasu Prabhala <satyap@codeaurora.org> | 2016-03-04 12:04:54 -0800 |
---|---|---|
committer | David Keitel <dkeitel@codeaurora.org> | 2016-03-23 20:58:08 -0700 |
commit | 0c718959c8264db200f6e8bbdd417c4cc6cadf38 (patch) | |
tree | eedcfbb94c0ef5249d5fc9f94b4f52eca6319e8e /drivers | |
parent | f587e38fb3b6786caaa70b98bde8197ad23a0191 (diff) |
qcom: fix kryo CPU PMU functional issues on kernel 4.4
While porting kryo CPU PMU driver to kernel 4.4, some functionality
got dropped unintentionally. This commit adds the dropped functionality
back. Also, update driver to be compliant to kernel 4.4.
Signed-off-by: Satya Durga Srinivasu Prabhala <satyap@codeaurora.org>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/soc/qcom/perf_event_kryo.c | 23 |
1 files changed, 18 insertions, 5 deletions
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(); |