.. | .. |
---|
82 | 82 | const struct fsl_ddr_devtype_data *devtype_data; |
---|
83 | 83 | int irq; |
---|
84 | 84 | int id; |
---|
| 85 | + int active_counter; |
---|
85 | 86 | }; |
---|
86 | 87 | |
---|
87 | 88 | enum ddr_perf_filter_capabilities { |
---|
.. | .. |
---|
414 | 415 | |
---|
415 | 416 | ddr_perf_counter_enable(pmu, event->attr.config, counter, true); |
---|
416 | 417 | |
---|
| 418 | + if (!pmu->active_counter++) |
---|
| 419 | + ddr_perf_counter_enable(pmu, EVENT_CYCLES_ID, |
---|
| 420 | + EVENT_CYCLES_COUNTER, true); |
---|
| 421 | + |
---|
417 | 422 | hwc->state = 0; |
---|
418 | 423 | } |
---|
419 | 424 | |
---|
.. | .. |
---|
468 | 473 | ddr_perf_counter_enable(pmu, event->attr.config, counter, false); |
---|
469 | 474 | ddr_perf_event_update(event); |
---|
470 | 475 | |
---|
| 476 | + if (!--pmu->active_counter) |
---|
| 477 | + ddr_perf_counter_enable(pmu, EVENT_CYCLES_ID, |
---|
| 478 | + EVENT_CYCLES_COUNTER, false); |
---|
| 479 | + |
---|
471 | 480 | hwc->state |= PERF_HES_STOPPED; |
---|
472 | 481 | } |
---|
473 | 482 | |
---|
.. | .. |
---|
486 | 495 | |
---|
487 | 496 | static void ddr_perf_pmu_enable(struct pmu *pmu) |
---|
488 | 497 | { |
---|
489 | | - struct ddr_pmu *ddr_pmu = to_ddr_pmu(pmu); |
---|
490 | | - |
---|
491 | | - /* enable cycle counter if cycle is not active event list */ |
---|
492 | | - if (ddr_pmu->events[EVENT_CYCLES_COUNTER] == NULL) |
---|
493 | | - ddr_perf_counter_enable(ddr_pmu, |
---|
494 | | - EVENT_CYCLES_ID, |
---|
495 | | - EVENT_CYCLES_COUNTER, |
---|
496 | | - true); |
---|
497 | 498 | } |
---|
498 | 499 | |
---|
499 | 500 | static void ddr_perf_pmu_disable(struct pmu *pmu) |
---|
500 | 501 | { |
---|
501 | | - struct ddr_pmu *ddr_pmu = to_ddr_pmu(pmu); |
---|
502 | | - |
---|
503 | | - if (ddr_pmu->events[EVENT_CYCLES_COUNTER] == NULL) |
---|
504 | | - ddr_perf_counter_enable(ddr_pmu, |
---|
505 | | - EVENT_CYCLES_ID, |
---|
506 | | - EVENT_CYCLES_COUNTER, |
---|
507 | | - false); |
---|
508 | 502 | } |
---|
509 | 503 | |
---|
510 | 504 | static int ddr_perf_init(struct ddr_pmu *pmu, void __iomem *base, |
---|