mirror of
https://github.com/xcat2/xNBA.git
synced 2024-11-22 17:41:55 +00:00
[Timers] Miscellaneous timer system fixes
Add missing comments to timer code. Lock system if no suitable timer source is found. Fix initialisation order so that timers are initialised before code that needs to use them.
This commit is contained in:
parent
03398e3389
commit
2652abdc5f
@ -263,6 +263,6 @@ struct startup_fn serial_startup_fn __startup_fn ( STARTUP_NORMAL ) = {
|
||||
* early debug messages. It is safe to call serial_init() multiple
|
||||
* times.
|
||||
*/
|
||||
struct init_fn serial_init_fn __init_fn ( INIT_EARLY ) = {
|
||||
struct init_fn serial_init_fn __init_fn ( INIT_CONSOLE ) = {
|
||||
.initialise = serial_init,
|
||||
};
|
||||
|
@ -22,7 +22,6 @@
|
||||
#include <assert.h>
|
||||
#include <gpxe/init.h>
|
||||
#include <gpxe/timer.h>
|
||||
#include <stdio.h>
|
||||
|
||||
static struct timer ts_table[0]
|
||||
__table_start ( struct timer, timers );
|
||||
@ -53,48 +52,64 @@ static void timer_init(void)
|
||||
struct timer *ts;
|
||||
|
||||
for (ts = ts_table; ts < ts_table_end; ts++) {
|
||||
if (ts->init && ts->init() >= 0) {
|
||||
if ( ts->init() == 0 ) {
|
||||
used_ts = ts;
|
||||
break;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
assert(used_ts);
|
||||
/* No timer found; we cannot continue */
|
||||
assert ( 0 );
|
||||
while ( 1 ) {};
|
||||
}
|
||||
|
||||
struct init_fn ts_init_fn __init_fn ( INIT_NORMAL ) = {
|
||||
.initialise = timer_init,
|
||||
};
|
||||
|
||||
/* Functions for public use. */
|
||||
|
||||
tick_t currticks(void)
|
||||
{
|
||||
/**
|
||||
* Read current time
|
||||
*
|
||||
* @ret ticks Current time, in ticks
|
||||
*/
|
||||
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);
|
||||
DBG ( "currticks: %ld.%06ld seconds\n",
|
||||
ct / USECS_IN_SEC, ct % USECS_IN_SEC );
|
||||
|
||||
return ct;
|
||||
}
|
||||
|
||||
void udelay(unsigned int usecs)
|
||||
{
|
||||
used_ts->udelay(usecs);
|
||||
/**
|
||||
* Delay
|
||||
*
|
||||
* @v usecs Time to delay, in microseconds
|
||||
*/
|
||||
void udelay ( unsigned int usecs ) {
|
||||
assert(used_ts);
|
||||
used_ts->udelay ( usecs );
|
||||
}
|
||||
|
||||
void mdelay(unsigned int msecs)
|
||||
{
|
||||
while(msecs--)
|
||||
used_ts->udelay(USECS_IN_MSEC);
|
||||
/**
|
||||
* Delay
|
||||
*
|
||||
* @v msecs Time to delay, in milliseconds
|
||||
*/
|
||||
void mdelay ( unsigned int msecs ) {
|
||||
while ( msecs-- )
|
||||
udelay ( USECS_IN_MSEC );
|
||||
}
|
||||
|
||||
unsigned int sleep(unsigned int secs)
|
||||
{
|
||||
while (secs--)
|
||||
mdelay(MSECS_IN_SEC);
|
||||
|
||||
/**
|
||||
* Delay
|
||||
*
|
||||
* @v secs Time to delay, in seconds
|
||||
*/
|
||||
unsigned int sleep ( unsigned int secs ) {
|
||||
while ( secs-- )
|
||||
mdelay ( MSECS_IN_SEC );
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -22,7 +22,8 @@ struct init_fn {
|
||||
*/
|
||||
|
||||
#define INIT_EARLY 01 /**< Early initialisation */
|
||||
#define INIT_NORMAL 02 /**< Normal initialisation */
|
||||
#define INIT_CONSOLE 02 /**< Console initialisation */
|
||||
#define INIT_NORMAL 03 /**< Normal initialisation */
|
||||
|
||||
/** @} */
|
||||
|
||||
@ -54,14 +55,6 @@ struct startup_fn {
|
||||
|
||||
/** @} */
|
||||
|
||||
/* Use double digits to avoid problems with "10" < "9" on alphabetic sort */
|
||||
#define INIT_CONSOLE 02
|
||||
#define INIT_GDBSYM 03
|
||||
#define INIT_CPU 04
|
||||
#define INIT_TIMERS 05
|
||||
#define INIT_LOADBUF 08
|
||||
#define INIT_PCMCIA 09
|
||||
|
||||
extern void initialise ( void );
|
||||
extern void startup ( void );
|
||||
extern void shutdown ( void );
|
||||
|
@ -3,7 +3,7 @@
|
||||
|
||||
#include <stddef.h>
|
||||
|
||||
typedef uint32_t tick_t;
|
||||
typedef unsigned long tick_t;
|
||||
|
||||
#define MSECS_IN_SEC (1000)
|
||||
#define USECS_IN_SEC (1000*1000)
|
||||
@ -11,22 +11,30 @@ typedef uint32_t tick_t;
|
||||
|
||||
#define TICKS_PER_SEC USECS_IN_SEC
|
||||
|
||||
tick_t currticks(void);
|
||||
extern tick_t currticks ( void );
|
||||
|
||||
void generic_currticks_udelay(unsigned int usecs);
|
||||
extern void generic_currticks_udelay ( unsigned int usecs );
|
||||
|
||||
/** A timer */
|
||||
struct timer {
|
||||
/* Returns zero on successful initialisation. */
|
||||
int (*init) (void);
|
||||
|
||||
/* Return the current time, int mictoseconds since the beginning. */
|
||||
tick_t (*currticks) (void);
|
||||
|
||||
/* Sleep for a few useconds. */
|
||||
void (*udelay) (unsigned int useconds);
|
||||
/** Initialise timer
|
||||
*
|
||||
* @ret rc Return status code
|
||||
*/
|
||||
int ( * init ) ( void );
|
||||
/** Read current time
|
||||
*
|
||||
* @ret ticks Current time, in ticks
|
||||
*/
|
||||
tick_t ( * currticks ) ( void );
|
||||
/** Delay
|
||||
*
|
||||
* @v usecs Time to delay, in microseconds
|
||||
*/
|
||||
void ( * udelay ) ( unsigned int usecs );
|
||||
};
|
||||
|
||||
#define __timer(order) __table (struct timer, timers, order)
|
||||
#define __timer( order ) __table ( struct timer, timers, order )
|
||||
|
||||
#endif /* GPXE_TIMER_H */
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user