On Fri, 15 Jun 2007, Franck Bui-Huu wrote: > > Well, many platforms have some sort of external timer interrupt sources > > (like an 8254 or an DS1287 or even a more sophisticated timer; sometimes > > integrated in the south bridge and collecting dust there), but people tend > > to follow the path of least resistance and use the CP0 timer, even though > > it is is a valuable resource that may be used for some other purposes. I > > Which other purposes ? CP0 hpt gives generally the highest precision for > a given platform, and it seems to be your case too. I don't see which other > better purpose it can deserve other than hrtimer, tick interrupt... One better purpose could be using it as a backend timer for setitimer(). Or just a general timer device ("/dev/counter") with some operations to make use of it. I think there were some ideas quoted on this list. For real time you do not need a precision of one or two CPU clocks -- it will be lost in the overhead of the gettimeofday() syscall, any cache activity will flush the precision down the drain, any branch unpredictability will ruin it, etc. An actual resolution of 1us will be excellent already. Try running `ntpd' on your platform of choice using a reasonable time reference source and see how it behaves. And last but not least for real time you do want to select the source that has the best frequency stability and not necessarily the highest frequency. For DEC the IOASIC timer has reportedly the best stability and was actually used by David L. Mills for his work on `ntpd'. Perhaps the temperature around the oscillator used for it changes the least. Similarly the Dallas Semiconductor real time clocks have very good frequency characteristics (quite unsurprisingly in my opinion). The issues around timekeeping have been beaten to death on many discussion forums -- I guess many of them may be quite easily reached with the right keywords and your favourite search engine. > > think the issue has been raised here many times already. The CP0 timer > > has its problems too as it is one-shot only and needs complicated recovery > > if an interrupt is missed -- see c0_timer_ack(). > > Well I would say that because it's one-shot, it's a good timer to choose. I fail to get your point, sorry -- could you please elaborate? > I don't see how you can have hrtimer support if you choose a periodic > timer... Well, periodic timers do seem to work somehow for everybody else with no hassle whatsoever, starting from the DEC code I referred to and including other platforms, like the i386, which uses the 8254 for the timer interrupt and as a HPT, by default, the very same counter or the TSC in the CPU if available or, I think, some chipset timer, because some brilliant soul decided to break the TSC at one point. Note that the 8254 can be reprogrammed into a one-shot mode, but somehow nobody does it. ;-) Similarly for the local APIC timer that is used for scheduling on i386 systems (if available). > And missed interrupts doens't seem a big deal, and the new kernel time > subsystem handle them for us already. Well, creating problems, because they can be solved seems not the way to go for me. Just my opinion, though. > > mips_timer_state appropriately, i.e. to flip at the HZ rate (it may be > > based on one of the south bridge choices mentioned above or some > > free-running counter for example), but people seem to prefer to write > > their own code for some reason. ;-) > > Do you have any examples in mind which rewrite their own calibration > code ? I'm too lazy to search into all board code. See arch/mips/mips-boards/generic/time.c for example. Or any platform that uses the CP0 timer interrupt and has a configurable CPU frequency -- you can find them easily by looking for ones that calculate mips_hpt_frequency rather than set it to a fixed value. > > And FYI for DEC CP0 is meant to be the last resort (current code does not > > Again IMHO it should be the first choice if possible. Please search the list archive for the discussion about why it is not the best idea. I think there were at least two discussions actually -- one around the time the current code was created. Maciej