[U-Boot] arm926ejs, timer:

Albert ARIBAUD albert.aribaud at free.fr
Mon Dec 13 08:43:06 CET 2010


Le 13/12/2010 01:27, Reinhard Meyer a écrit :
> Dear Wolfgang Denk,
>> Dear Reinhard Meyer,
>>
>> In message<4D01EA19.8070200 at emk-elektronik.de>   you wrote:
>>> Sorry for the noise, but...
>>>
>>>>>> just looked in the timer implementation for arm926ejs based boards, and
>>>>>> found that there is just the at91, davinci, nomadik timer implementation
>>>>>> fixed in actual u-boot. I want to cleanup this timers too, but
>>>>>> there are kirkwood, mb86r0x, orion5x, spear, versatile archs which use
>>>>>> a lastdec var, which is not in global_data.h defined. So the question
>>>>>> is should we add a lastdec to global_data.h or is it Ok, if I use
>>>>>> lastinc for cleaning up?
>>>>> I would suggest to take tbu, tbl, lastinc out of the AT91FAMILY #ifdef
>>>>> to the generic part.
>>>>
>>>> maybe "unify" last{inc,dec} into last_hw ? Because they are supposedly the
>>>> last (hardware) decrementer/incrementer values from the previous call.
>>>>
>>> define 4 u32's in the generic part:
>>>
>>> u32	timer_use1;
>>> u32	timer_use2;
>>> u32	timer_use3;
>>> u32	timer_use4;
>>
>> NAK.  Please let's agree on common names.  Eventually we will even
>> come up with a common implementation later (with just arch-specific
>> "accessor" routines).
>
> Replace "arch" by "SoC" here! ARM itself does not have a timer (in contrast to
> powerpc where tbu,tbl is part of the architecture) !
>
> Then its a bad idea to take tbu,tbl out of the #ifdef AT91FAMILY part
> when all other ARM timer implementations do not use tbu.
>
> Its simple to NAK attempts to come up with "common" names that are NOT
> misnomers on some implementations... tbu, tbl are certainly misnomers on all
> non AT91 timer implementations...

I think Wolfgang NAK'ed the idea of *complete* misnomers; 
timer_use{1,2,3,4} are good for cross-board unicity but bad for 
readability and maintenability -- you'd need to re-#define their names 
for each arch, or SoC, or even maybe for some boards.

What we need, IIUC, is a (group of) field(s) that will provide a 
monotonous value of the time elapsed  computed from the HW timer devoted 
to this use and name that accordingly.

My understanding is that there will be a need for at least one field for 
storing the last hardware time as directly read from the timer, because 
we'll need it to detect overruns if the timer alone does not provide the 
range that we require, and one other field for the 'more significant 
part' which is basically carried over through HW value overrun detection.

One could argue that only one field could be necessary, the lower bits 
of which would be the HW timer reads and the higher bits being fed from 
the overrun, but managing bitfieds would complicate the issue, plus 
maybe not all timers are free-running full-range powers of two?

Also, as for the size, there does not seem to be a consensus, but maybe 
we can choose 64 bits (and create such a type if necessary) for each and 
then SoCs or arches will cast that as necessary of 64-bit arithmetic is 
a problem. Or we can do a union, with 64 and 32 bit variants.

So, what about:

u64	timer_hw_reading;
u64	timer_sw_carry_over;

> Reinhard

Amicalement,
-- 
Albert.


More information about the U-Boot mailing list