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.
* 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,
};
#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 );
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;
}
-
*/
#define INIT_EARLY 01 /**< Early initialisation */
-#define INIT_NORMAL 02 /**< Normal initialisation */
+#define INIT_CONSOLE 02 /**< Console initialisation */
+#define INIT_NORMAL 03 /**< Normal initialisation */
/** @} */
/** @} */
-/* 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 );
#include <stddef.h>
-typedef uint32_t tick_t;
+typedef unsigned long tick_t;
#define MSECS_IN_SEC (1000)
#define USECS_IN_SEC (1000*1000)
#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 */