Messages in this thread |  | | From | David Mosberger <> | Date | Mon, 19 May 2003 10:34:43 -0700 | Subject | Re: time interpolation hooks |
| |
>>>>> On 16 May 2003 19:38:01 -0700, "David S. Miller" <davem@redhat.com> said:
DaveM> I think Andrew is really suggesting to declare these two DaveM> things in an arch header, so if one needs it to be a function DaveM> pointer one can make it so.
I don't think this should be (purely) an arch thing. It's just as much a driver issue. For example, HPET will pretty much work the same on x86 and ia64, so being able to have a shared "driver" would be useful. I agree though that it would be nice if arches that don't care for time-interpolation at all could turn it off completely. In the proposal below, an architecture could achieve that by turning off CONFIG_TIME_INTERPOLATION.
>>>>> On Sat, 17 May 2003 09:09:51 +0000, Arjan van de Ven <arjanv@redhat.com> said:
Arjan> I rather would have a "timer source" object that provides Arjan> those 2 functions as methods, so that one can write "timer" Arjan> drivers as more or less stand alone units that register Arjan> themselves with the generic timekeeping unit (probably with Arjan> an accuracy score so that the generic code can pick one in Arjan> the event of multiple timer sources).
Sounds reasonable.
To make this really possible, I think it makes the most sense to have the last_nsec_offset variable implemented by the generic kernel. I'm thinking something along the lines of the below?
Comments?
--david
struct time_interpolator { void (*update_wall_time) (long delta_nsec); void (*reset_wall_time) (long delta_nsec); unsigned long frequency; /* frequency in counts/second */ unsigned long drift; /* drift in parts-per-million (?) */ };
extern void register_time_interpolator (struct time_interpolator *ti); extern void unregister_time_interpolator (struct time_interpolator *ti);
#ifdef CONFIG_TIME_INTERPOLATION
extern volatile unsigned long last_nsec_offset; extern struct time_interpolator *time_interpolator;
static inline void update_wall_time (long delta_nsec) { struct time_interpolator *ti = time_interpolator;
/* This needs to be done atomically, either via cmpxchg() or protected by a spinlock: */ last_nsec_offset -= min(last_nsec_offset, delta_nsec);
if (ti) (*ti->update_wall_time)(delta_nsec); }
static inline void reset_wall_time (long delta_nsec); { struct time_interpolator *ti = time_interpolator;
last_nsec_offset = 0; if (ti) (*ti->reset_wall_time)(); }
#else
static inline void update_wall_time (long delta_nsec) { }
static inline void reset_wall_time (long delta_nsec) { }
#endif - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
|  |