diff options
author | Alexey Zaytsev <alexey.zaytsev@gmail.com> | 2007-12-01 07:07:01 +0300 |
---|---|---|
committer | Alexey Zaytsev <alexey.zaytsev@gmail.com> | 2008-03-02 03:15:07 +0300 |
commit | 4006d229e50204c93c1aa04c58385ce2e66d597e (patch) | |
tree | 1c07ed3523e40304e0c4b81aaa33c6316d1bd11a /src/core/timer.c | |
parent | 844828cb157491121d6110d903cc84a9e4a75d02 (diff) | |
download | ipxe-4006d229e50204c93c1aa04c58385ce2e66d597e.tar.gz |
Introduce the new timer subsystem.
Timer subsystem initialization code in core/timer.c
Split the BIOS and RTDSC timer drivers from i386_timer.c
Split arch/i386/firmware/pcbios/bios.c into the RTSDC
timer driver and arch/i386/core/nap.c
Split the headers properly:
include/unistd.h - delay functions to be used by the
gPXE core and drivers.
include/gpxe/timer.h - the fimer subsystem interface
to be used by the timer drivers
and currticks() to be used by
the code gPXE subsystems.
include/latch.h - removed
include/timer.h - scheduled for removal. Some driver
are using currticks, which is
only for core subsystems.
Signed-off-by: Alexey Zaytsev <alexey.zaytsev@gmail.com>
Diffstat (limited to 'src/core/timer.c')
-rw-r--r-- | src/core/timer.c | 107 |
1 files changed, 92 insertions, 15 deletions
diff --git a/src/core/timer.c b/src/core/timer.c index c56e5310..da53e053 100644 --- a/src/core/timer.c +++ b/src/core/timer.c @@ -1,27 +1,104 @@ -/* A couple of routines to implement a low-overhead timer for drivers */ - - /* +/* + * core/timer.c + * + * Copyright (C) 2007 Alexey Zaytsev <alexey.zaytsev@gmail.com> + * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2, or (at - * your option) any later version. + * published by the Free Software Foundation; either version 2 of the + * License, or any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -#include "timer.h" +#include <stddef.h> +#include <assert.h> +#include <gpxe/init.h> +#include <gpxe/timer.h> +#include <stdio.h> -/* Machine Independant timer helper functions */ +static struct timer ts_table[0] + __table_start ( struct timer, timers ); +static struct timer ts_table_end[0] + __table_end ( struct timer, timers ); -void mdelay(unsigned int msecs) + +static struct timer *used_ts = NULL; + +/* + * 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) { - unsigned int i; - for(i = 0; i < msecs; i++) { - udelay(1000); - } + tick_t t; + + t = currticks(); + while (t + usecs > currticks()) + ; /* xxx: Relax the cpu some way. */ } -void waiton_timer2(unsigned int ticks) + +static void timer_init(void) { - load_timer2(ticks); - while(timer2_running()) { + struct timer *ts; + + for (ts = ts_table; ts < ts_table_end; ts++) { + if (ts->init && !ts->init()) { + used_ts = ts; + break; + } + } + + if (!used_ts) { + printf("No timer available. This should never happen. Expect gPXE to die soon.\n"); + /* Panic */ } + } + +struct init_fn ts_init_fn __init_fn ( INIT_NORMAL ) = { + .initialise = timer_init, +}; + +/* Functions for public use. */ + +tick_t currticks(void) +{ + tick_t ct; + assert(used_ts); + + ct = used_ts->currticks(); + DBG("currticks: %ld seconds and %06ld microseconds\n", ct/USECS_IN_SEC, ct%USECS_IN_SEC); + + return ct; +} + +void udelay(unsigned int usecs) +{ + used_ts->udelay(usecs); +} + +void mdelay(unsigned int msecs) +{ + while(msecs--) + used_ts->udelay(USECS_IN_MSEC); +} + +unsigned int sleep(unsigned int secs) +{ + while (secs--) + mdelay(MSECS_IN_SEC); + + return 0; +} + |