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>
This commit is contained in:
Alexey Zaytsev
2007-12-01 07:07:01 +03:00
parent 844828cb15
commit 4006d229e5
13 changed files with 384 additions and 296 deletions

View File

@@ -74,6 +74,17 @@ REQUIRE_OBJECT ( pc_kbd );
REQUIRE_OBJECT ( syslog );
#endif
/*
* Timers
*/
#ifdef TIMER_BIOS
REQUIRE_OBJECT ( timer_bios );
#endif
#ifdef TIMER_RTDSC
REQUIRE_OBJECT ( timer_rtdsc );
#endif
/*
* Drag in all requested protocols
*

View File

@@ -7,18 +7,6 @@ MISC Support Routines
#include <latch.h>
#include <gpxe/in.h>
/**************************************************************************
SLEEP
**************************************************************************/
unsigned int sleep(unsigned int secs)
{
unsigned long tmo;
for (tmo = currticks()+secs*TICKS_PER_SEC; currticks() < tmo; ) {
}
return 0;
}
/**************************************************************************
INET_ATON - Convert an ascii x.x.x.x to binary form
**************************************************************************/

View File

@@ -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 );
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)
{
tick_t t;
t = currticks();
while (t + usecs > currticks())
; /* xxx: Relax the cpu some way. */
}
static void timer_init(void)
{
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)
{
unsigned int i;
for(i = 0; i < msecs; i++) {
udelay(1000);
}
while(msecs--)
used_ts->udelay(USECS_IN_MSEC);
}
void waiton_timer2(unsigned int ticks)
unsigned int sleep(unsigned int secs)
{
load_timer2(ticks);
while(timer2_running()) {
}
while (secs--)
mdelay(MSECS_IN_SEC);
return 0;
}