
On Sat, Mar 31, 2018 at 06:31:03AM -0600, Andy Shevchenko wrote:
tl = readl(regs + HPET_MAIN_COUNT_L);
th = readl(regs + HPET_MAIN_COUNT_H);
Ditto.
If readq() is defined as two read operations in 32-bit code, main counter rollover (low part overflow, high part increment) can happen between them.
And how this contradicts ther current code?
It just does not make the code simpler, rollover check is still required if U-Boot is compiled as 32-bit code.
Can we do something like the following?
#ifdef CONFIG_X86_64
static u64 read_main_counter(void *regs) { return readq(regs + HPET_MAIN_COUNT); }
#else
/* * Read the main counter as two 32-bit registers, * repeat if rollover happens. */ static u64 read_main_counter(void *regs) { u64 now_tick; u32 tl, th, th0;
th = readl(regs + HPET_MAIN_COUNT_H); do { th0 = th; tl = readl(regs + HPET_MAIN_COUNT_L); th = readl(regs + HPET_MAIN_COUNT_H); now_tick = th; now_tick <<= 32; now_tick |= tl; } while (th != th0);
return now_tick; }
#endif