| .. | .. |
|---|
| 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, |
|---|