[U-Boot] [PATCH v2] mmc: omap: timeout counter fix
Nishanth Menon
nm at ti.com
Tue Oct 26 03:18:57 CEST 2010
Reinhard Meyer had written, on 10/25/2010 08:14 PM, the following:
> Dear Nishanth Menon,
>> Having a loop with a counter is no timing guarentee for timing
>> accuracy or compiler optimizations. For e.g. the same loop counter
>> which runs when the MPU is running at 600MHz will timeout in around
>> half the time when running at 1GHz. or the example where GCC 4.5
>> compiles with different optimization compared to GCC 4.4.
>> use a udelay(10) to ensure we have a predictable delay.
>> use an emperical number - 100000 uSec ~= 1sec for a worst case timeout.
>> This should never happen, and is adequate imaginary condition for us
>> to fail with timeout.
>
> In such cases I prefer to use:
>
> uint64_t etime;
> ...
> etime = get_ticks() + get_tbclk(); /* 1 second */
> do {
> whatever;
> udelay (xx);
> } while (condition && get_ticks() <= etime);
>
> That is far more accurate than calling udelay() 100000 times.
> (depending on implementation and granularity udelay of a few usecs
> might be rounded significantly)
> You can still call udelay inside the loop if you don't want
> to poll the condition too tightly...
hmmm.. almost like the jiffies in kernel ;).. timing wise, I see that
the only benefit is that the approach gives a little more accuracy to
the timeout delay - the other benefit is option to loop continuously
instead of delaying with udelays - overall, at least the segments I saw
had no reason to hit the registers so hard (alright we dont have much
else to do.. but still).. I am very open to options from
Sukumar(original author) as well..
--
Regards,
Nishanth Menon
More information about the U-Boot
mailing list