diff options
Diffstat (limited to 'src/core')
-rw-r--r-- | src/core/parseopt.c | 2 | ||||
-rw-r--r-- | src/core/timer.c | 62 |
2 files changed, 62 insertions, 2 deletions
diff --git a/src/core/parseopt.c b/src/core/parseopt.c index 66f60158..3ddf94f3 100644 --- a/src/core/parseopt.c +++ b/src/core/parseopt.c @@ -117,7 +117,7 @@ int parse_timeout ( char *text, unsigned long *value ) { return rc; /* Convert to a number of timer ticks */ - *value = ( ( value_ms * TICKS_PER_SEC ) / 1000 ); + *value = ( value_ms * TICKS_PER_MS ); return 0; } diff --git a/src/core/timer.c b/src/core/timer.c index ca945cfb..ed724605 100644 --- a/src/core/timer.c +++ b/src/core/timer.c @@ -23,11 +23,39 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ); -#include <unistd.h> +#include <string.h> +#include <assert.h> #include <ipxe/process.h> #include <ipxe/console.h> #include <ipxe/keys.h> #include <ipxe/nap.h> +#include <ipxe/init.h> +#include <ipxe/timer.h> + +/** Current timer */ +static struct timer *timer; + +/** + * Get current system time in ticks + * + * @ret ticks Current time, in ticks + */ +unsigned long currticks ( void ) { + + assert ( timer != NULL ); + return timer->currticks(); +} + +/** + * Delay for a fixed number of microseconds + * + * @v usecs Number of microseconds for which to delay + */ +void udelay ( unsigned long usecs ) { + + assert ( timer != NULL ); + timer->udelay ( usecs ); +} /** * Delay for a fixed number of milliseconds @@ -61,3 +89,35 @@ unsigned int sleep ( unsigned int secs ) { return 0; } + +/** + * Find a working timer + * + */ +static void timer_probe ( void ) { + int rc; + + /* Use first working timer */ + for_each_table_entry ( timer, TIMERS ) { + if ( ( timer->probe == NULL ) || + ( ( rc = timer->probe() ) == 0 ) ) { + DBGC ( &timer, "TIMER using %s\n", timer->name ); + return; + } + DBGC ( &timer, "TIMER could not initialise %s: %s\n", + timer->name, strerror ( rc ) ); + } + + /* This is a fatal error */ + DBGC ( &timer, "TIMER found no working timers!\n" ); + while ( 1 ) {} +} + +/** Timer initialisation function */ +struct init_fn timer_init_fn __init_fn ( INIT_EARLY ) = { + .initialise = timer_probe, +}; + +/* Drag in timer configuration */ +REQUIRING_SYMBOL ( timer_init_fn ); +REQUIRE_OBJECT ( config_timer ); |