diff options
author | Michael Brown | 2008-10-12 20:56:52 +0200 |
---|---|---|
committer | Michael Brown | 2008-10-12 21:22:02 +0200 |
commit | 16f1e35775c972ba8e02bc2d97d7a2eb333eae1b (patch) | |
tree | f653099d4b230c9807986aa2b4cd89dce2cffe9b /src/core/timer.c | |
parent | [process] Add DBG2() messages to help track down frozen processes (diff) | |
download | ipxe-16f1e35775c972ba8e02bc2d97d7a2eb333eae1b.tar.gz ipxe-16f1e35775c972ba8e02bc2d97d7a2eb333eae1b.tar.xz ipxe-16f1e35775c972ba8e02bc2d97d7a2eb333eae1b.zip |
[timer] Formalise the timer API
We now have two implementations for the timer API: one using the
time-of-day counter at 40:70 and one using RDTSC. Both make use of
timer2_udelay().
Diffstat (limited to 'src/core/timer.c')
-rw-r--r-- | src/core/timer.c | 91 |
1 files changed, 9 insertions, 82 deletions
diff --git a/src/core/timer.c b/src/core/timer.c index 4e047ea7..d71e3da1 100644 --- a/src/core/timer.c +++ b/src/core/timer.c @@ -1,7 +1,5 @@ /* - * core/timer.c - * - * Copyright (C) 2007 Alexey Zaytsev <alexey.zaytsev@gmail.com> + * Copyright (C) 2008 Michael Brown <mbrown@fensystems.co.uk>. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as @@ -18,96 +16,25 @@ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -#include <stddef.h> -#include <assert.h> -#include <gpxe/timer.h> - -static struct timer ts_table[0] - __table_start ( struct timer, timers ); -static struct timer ts_table_end[0] - __table_end ( struct timer, timers ); - -/* - * This function may be used in custom timer driver. - * - * This udelay implementation works well if you've got a - * fast currticks(). - */ -void generic_currticks_udelay ( unsigned int usecs ) { - tick_t start; - tick_t elapsed; - - start = currticks(); - do { - /* xxx: Relax the cpu some way. */ - elapsed = ( currticks() - start ); - } while ( elapsed < usecs ); -} - -/** - * Identify timer source - * - * @ret timer Timer source - */ -static struct timer * timer ( void ) { - static struct timer *ts = NULL; - - /* If we have a timer, use it */ - if ( ts ) - return ts; - - /* Scan for a usable timer */ - for ( ts = ts_table ; ts < ts_table_end ; ts++ ) { - if ( ts->init() == 0 ) - return ts; - } - - /* No timer found; we cannot continue */ - assert ( 0 ); - while ( 1 ) {}; -} - -/** - * Read current time - * - * @ret ticks Current time, in ticks - */ -tick_t currticks ( void ) { - tick_t ct; - - ct = timer()->currticks(); - DBG ( "currticks: %ld.%06ld seconds\n", - ct / USECS_IN_SEC, ct % USECS_IN_SEC ); - - return ct; -} - -/** - * Delay - * - * @v usecs Time to delay, in microseconds - */ -void udelay ( unsigned int usecs ) { - timer()->udelay ( usecs ); -} +#include <unistd.h> /** - * Delay + * Delay for a fixed number of milliseconds * - * @v msecs Time to delay, in milliseconds + * @v msecs Number of milliseconds for which to delay */ -void mdelay ( unsigned int msecs ) { +void mdelay ( unsigned long msecs ) { while ( msecs-- ) - udelay ( USECS_IN_MSEC ); + udelay ( 1000 ); } /** - * Delay + * Delay for a fixed number of seconds * - * @v secs Time to delay, in seconds + * @v secs Number of seconds for which to delay */ unsigned int sleep ( unsigned int secs ) { while ( secs-- ) - mdelay ( MSECS_IN_SEC ); + mdelay ( 1000 ); return 0; } |