Skip to content

arm-cci500: Workaround pmu_event_set_period

Suzuki K. Poulose linux-arm-kernel lkml 3 versions – In review

Get series with b4
b4 am [email protected]

Versions newest first · linked by author and title

  1. v3 Latest5 patches 9 repliesIn review
  2. v24 patches 11 repliesSuperseded
  3. v11 patch 0 repliesSuperseded

Changes in v3 from the cover letter

- Rebased to 4.4-rc1 + Mark's patch to simply PMU syfs attributes [1]
- Address comments on v2.
- Split the introduction of write_counter hook to a separate patch

Patches in v3 No applies recorded yet

#Subject and filesSizeRepliesApplied
1/5arm-cci: Refactor CCI PMU enable/disable methodsdrivers/bus/arm-cci.c+22 -101 reply
2/5arm-cci: Get the status of a counterdrivers/bus/arm-cci.c+12 -01 reply
3/5arm-cci: Add routines to enable/disable all countersdrivers/bus/arm-cci.c+38 -03 replies
4/5arm-cci: Add hooks for pmu_write_counterdrivers/bus/arm-cci.c+12 -20 replies
5/5arm-cci: CCI-500: Work around PMU counter writesdrivers/bus/arm-cci.c+47 -04 replies

Reviews trailers per patch

2 of 5 patches have a Reviewed-by or Acked-by.

PatchMark Rutland
1/5A-b
2/5A-b
3/5
4/5
5/5

Trailers given in replies are filled; those carried in the patches from earlier versions are outlined with dashes.

Read the v3 thread

Cover letter [PATCHv3 0/5] arm-cci500: Workaround pmu_event_set_period

The CCI PMU driver sets the event counter to the half of the maximum value(2^31) it can count before we start the counters via pmu_event_set_period(). This is done to give us the best chance to handle the overflow interrupt, taking care of extreme interrupt latencies.

However, CCI-500 comes with advanced power saving schemes, which disables the clock to the event counters unless the counters are enabled to count (PMCR.CEN). This prevents the driver from writing the period to the counters before starting them. Also, there is no way we can reset the individual event counter to 0 (PMCR.RST resets all the counters, losing their current readings). However the value of the counter is preserved and could be read back, when the counters are not enabled.

So we cannot reliably use the counters and compute the number of events generated during the sampling period since we don't have the value of the counter at start.

Here are the possible solutions:

1) Disable clock gating on CCI-500 by setting Control_Override_Reg[bit3].
- The Control_Override_Reg is secure (and hence not programmable from Linux), and also has an impact on power consumption.

2) Change the order of operations
i.e,
a) Program and enable individual counters
b) Enable counting on all the counters by setting PMCR.CEN
c) Write the period to the individual counters
d) Disable the counters
- This could cause in unnecessary noise in the other counters and is costly (we should repeat this for all enabled counters).

3) Don't set the counter value, instead use the current count as the starting count and compute the delta at the end of sampling.

4) Modified version of 2, which disables all the other counters, except the target counter, with the target counter programmed with an invalid event code(which guarantees that the counter won't change during the operation).

This patch implements option 4 for CCI-500. CCI-400 behavior remains unchanged.

Changes since V2:
- Rebased to 4.4-rc1 + Mark's patch to simply PMU syfs attributes [1]
- Address comments on v2.
- Split the introduction of write_counter hook to a separate patch

Changes since V1:
- Choose 4 instead of 3 above, suggested by Mark Rutland

[1] http://lists.infradead.org/pipermail/linux-arm-kernel/2015-September/373129.html

Suzuki K. Poulose (5):
arm-cci: Refactor CCI PMU enable/disable methods
arm-cci: Get the status of a counter
arm-cci: Add routines to enable/disable all counters
arm-cci: Add hooks for pmu_write_counter
arm-cci: CCI-500: Work around PMU counter writes

 drivers/bus/arm-cci.c |  143 ++++++++++++++++++++++++++++++++++++++++++++-----
 1 file changed, 131 insertions(+), 12 deletions(-)
Signature · 1 line
1.7.9.5