Skip to content

clocksource: sunxi: Timer fixes and cleanup

Siarhei Siamashka linux-arm-kernel lkml 1 version In review

Get series with b4
b4 am 20130628124843.242df804@i7

Versions newest first

  1. v1 Latest0 of 8 patches 2 repliesIn review

Patches in v1 No applies recorded yet

None of the 8 patches the cover letter announces are in this archive.

Reviews trailers per patch

No Reviewed-by, Acked-by or Tested-by trailers for v1 yet.

Read the v1 thread

Cover letter [linux-sunxi] [PATCH 0/8] clocksource: sunxi: Timer fixes and cleanup
Quoted 14 lines · On Fri, 28 Jun 2013 09:43:37 +0800 ?? <[email protected]> wrote:
Quoted 12 lines

The A10 manual from http://free-electrons.com/~maxime/pub/datasheet/
does not seem to contain any details about what bad things may happen if we try to read CNT64_LO_REG while latching is still in progress and CNT64_RL_EN bit in CNT64_CTRL_REG has not changed to zero yet. I can imagine the following possible scenarios:
1. We read either the old stale CNT64_LO_REG value or the new correct value.
2. We read either the old stale CNT64_LO_REG value or the new correct value, or some random garbage.
3. The processor may deadlock, eat your dog, or do some other nasty thing.

Quoted 1 line

In the case of 1, we probably can get away without using any spinlocks?

Quoted 10 lines

About the 64bits counter, the latch bit is needed because of the asynchronous circuit. The internal circuit of 64bits counter is working under 24Mhz clock, and CNT_LO/HI is read with APB clock. So the clock synchronize is needed. The function of the latch is synchronous the 64bits counter from 24Mhz clock domain to APB clock domain. So, if the latch is not completely, value of the CNT_LO/HI maybe a random value, because some bits are latched, but others are not. So, the CNT_LO/HI should be read after latch is completely. The latch just takes 3 cycles of 24Mhz clock, the time is nearly 0.125 micro-second.

Thanks for the clarification! It is very much appreciated.

So basically we get scenario 2, which still allows some optimizations compared to scenario 3. On single-core systems (Allwinner A10), it probably makes sense to avoid spinlocks overhead and just place the critical code between LDREX and STREX instructions (or whatever higher level wrappers are available for them). In the case of contention and reading non-latched garbage value from CNT64_LO_REG (or from CNT64_LO_REG/CNT64_HI_REG pair if we go 64-bit), this critical block of code can be just retried again until it eventually succeeds.

Signature · 2 lines
Best regards,
Siarhei Siamashka