Re: [RFC PATCH v2 09/14] m68k: hp300: Remove hp300_gettimeoffset()

From: Finn Thain
Date: Wed Nov 21 2018 - 06:14:13 EST


On Wed, 21 Nov 2018, Geert Uytterhoeven wrote:

> > This suggests that either 0 or N (the latched value) would result from
> > a read from the counter immediately following an interrupt. Who can
> > say which? Just have to try it. The answer should allow us to avoid
> > the risk of a clocksource that jumps forwards and backwards.
>
> The code in amiga_gettimeoffset() does:
>
> ticks = hi << 8 | lo;
>
> if (ticks > jiffy_ticks / 2)
> /* check for pending interrupt */
> if (cia_set_irq(&ciab_base, 0) & CIA_ICR_TA)
> offset = 10000;
>

That _suggests_ that there's no interrupt when ticks == 0.

But look what happens next:

> ticks = jiffy_ticks - ticks;
>
> ticks = (10000 * ticks) / jiffy_ticks;
>
> return (ticks + offset) * 1000;

If (hi << 8 | lo) == 0, and you set offset = 10000, then the return value
would be maximal.

Let's immediately call this function again. This time (hi << 8 | lo) == N.
Let's add the offset again. I'm afraid the clock just jumped backwards.

So the logic you quoted has a rationale which is unrelated to the
question.

--