diff options
-rw-r--r-- | drivers/perf/fsl_imx8_ddr_perf.c | 24 |
1 files changed, 15 insertions, 9 deletions
diff --git a/drivers/perf/fsl_imx8_ddr_perf.c b/drivers/perf/fsl_imx8_ddr_perf.c index 4daa782c48df..b1b2a55de77f 100644 --- a/drivers/perf/fsl_imx8_ddr_perf.c +++ b/drivers/perf/fsl_imx8_ddr_perf.c @@ -102,7 +102,6 @@ struct ddr_pmu { const struct fsl_ddr_devtype_data *devtype_data; int irq; int id; - int active_counter; }; static ssize_t ddr_perf_identifier_show(struct device *dev, @@ -497,10 +496,6 @@ static void ddr_perf_event_start(struct perf_event *event, int flags) ddr_perf_counter_enable(pmu, event->attr.config, counter, true); - if (!pmu->active_counter++) - ddr_perf_counter_enable(pmu, EVENT_CYCLES_ID, - EVENT_CYCLES_COUNTER, true); - hwc->state = 0; } @@ -555,10 +550,6 @@ static void ddr_perf_event_stop(struct perf_event *event, int flags) ddr_perf_counter_enable(pmu, event->attr.config, counter, false); ddr_perf_event_update(event); - if (!--pmu->active_counter) - ddr_perf_counter_enable(pmu, EVENT_CYCLES_ID, - EVENT_CYCLES_COUNTER, false); - hwc->state |= PERF_HES_STOPPED; } @@ -577,10 +568,25 @@ static void ddr_perf_event_del(struct perf_event *event, int flags) static void ddr_perf_pmu_enable(struct pmu *pmu) { + struct ddr_pmu *ddr_pmu = to_ddr_pmu(pmu); + + /* enable cycle counter if cycle is not active event list */ + if (ddr_pmu->events[EVENT_CYCLES_COUNTER] == NULL) + ddr_perf_counter_enable(ddr_pmu, + EVENT_CYCLES_ID, + EVENT_CYCLES_COUNTER, + true); } static void ddr_perf_pmu_disable(struct pmu *pmu) { + struct ddr_pmu *ddr_pmu = to_ddr_pmu(pmu); + + if (ddr_pmu->events[EVENT_CYCLES_COUNTER] == NULL) + ddr_perf_counter_enable(ddr_pmu, + EVENT_CYCLES_ID, + EVENT_CYCLES_COUNTER, + false); } static int ddr_perf_init(struct ddr_pmu *pmu, void __iomem *base, |