summaryrefslogtreecommitdiff
path: root/drivers/soc
diff options
context:
space:
mode:
authorSatya Durga Srinivasu Prabhala <satyap@codeaurora.org>2016-03-04 12:04:54 -0800
committerDavid Keitel <dkeitel@codeaurora.org>2016-03-23 20:58:08 -0700
commit0c718959c8264db200f6e8bbdd417c4cc6cadf38 (patch)
treeeedcfbb94c0ef5249d5fc9f94b4f52eca6319e8e /drivers/soc
parentf587e38fb3b6786caaa70b98bde8197ad23a0191 (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/soc')
-rw-r--r--drivers/soc/qcom/perf_event_kryo.c23
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();