I just had a look at other ARM implementations of timer.c.

Some have a colourful mix of 32 and 64 bits values, resulting
in some 64 bit timer functions returning the upper 32 bits always
cleared.

Some implement udelay() in the "while (xxxtime() < endtime);" variant.

I will fix this for at91 and submit a patch.

I also see that:

void reset_timer(void)
{
        gd->timer_reset_value = get_ticks();
}

ulong get_timer(ulong base)
{
        return tick_to_time(get_ticks() - gd->timer_reset_value) - base;
}

If implemented with true 64 bits for get_ticks() that function is useable
for timeout programming:

        ulong timeval = get_timer (0);

        do {
                ...
        } while (get_timer (timeval) < TIMEOUT);

It appears that the "base" parameter and return value is in CONFIG_SYS_HZ
units, and not in native ticks. That causes 64 bit mul/div every
time get_timer() is called. Won't hurt in a timeout loop, though.

I guess the theoretically unnecessary function reset_timer() might have been
invented to mask the issue of 32 bit wraparounds when get_timer() is not truly
64 bits???

Reinhard
_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to