summaryrefslogtreecommitdiffstats
path: root/src/include
diff options
context:
space:
mode:
Diffstat (limited to 'src/include')
-rw-r--r--src/include/ipxe/efi/efi_timer.h36
-rw-r--r--src/include/ipxe/linux/linux_timer.h18
-rw-r--r--src/include/ipxe/timer.h102
-rw-r--r--src/include/unistd.h12
4 files changed, 53 insertions, 115 deletions
diff --git a/src/include/ipxe/efi/efi_timer.h b/src/include/ipxe/efi/efi_timer.h
deleted file mode 100644
index c49875988..000000000
--- a/src/include/ipxe/efi/efi_timer.h
+++ /dev/null
@@ -1,36 +0,0 @@
-#ifndef _IPXE_EFI_TIMER_H
-#define _IPXE_EFI_TIMER_H
-
-/** @file
- *
- * iPXE timer API for EFI
- *
- */
-
-FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
-
-#ifdef TIMER_EFI
-#define TIMER_PREFIX_efi
-#else
-#define TIMER_PREFIX_efi __efi_
-#endif
-
-/**
- * Number of ticks per second
- *
- * This is a policy decision.
- */
-#define EFI_TICKS_PER_SEC 20
-
-/**
- * Get number of ticks per second
- *
- * @ret ticks_per_sec Number of ticks per second
- */
-static inline __attribute__ (( always_inline )) unsigned long
-TIMER_INLINE ( efi, ticks_per_sec ) ( void ) {
-
- return EFI_TICKS_PER_SEC;
-}
-
-#endif /* _IPXE_EFI_TIMER_H */
diff --git a/src/include/ipxe/linux/linux_timer.h b/src/include/ipxe/linux/linux_timer.h
deleted file mode 100644
index 7f46e36b2..000000000
--- a/src/include/ipxe/linux/linux_timer.h
+++ /dev/null
@@ -1,18 +0,0 @@
-#ifndef _IPXE_LINUX_TIMER_H
-#define _IPXE_LINUX_TIMER_H
-
-/** @file
- *
- * iPXE timer API for Linux
- *
- */
-
-FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
-
-#ifdef TIMER_LINUX
-#define TIMER_PREFIX_linux
-#else
-#define TIMER_PREFIX_linux __linux_
-#endif
-
-#endif /* _IPXE_LINUX_TIMER_H */
diff --git a/src/include/ipxe/timer.h b/src/include/ipxe/timer.h
index 82fbb6764..e6b95172e 100644
--- a/src/include/ipxe/timer.h
+++ b/src/include/ipxe/timer.h
@@ -3,75 +3,77 @@
/** @file
*
- * iPXE timer API
+ * iPXE timers
*
- * The timer API provides udelay() for fixed delays, and currticks()
- * for a monotonically increasing tick counter.
*/
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
-#include <ipxe/api.h>
-#include <config/timer.h>
+#include <ipxe/tables.h>
-/**
- * Calculate static inline timer API function name
- *
- * @v _prefix Subsystem prefix
- * @v _api_func API function
- * @ret _subsys_func Subsystem API function
- */
-#define TIMER_INLINE( _subsys, _api_func ) \
- SINGLE_API_INLINE ( TIMER_PREFIX_ ## _subsys, _api_func )
+/** Number of ticks per second */
+#define TICKS_PER_SEC 1024
-/**
- * Provide a timer API implementation
+/** Number of ticks per millisecond
*
- * @v _prefix Subsystem prefix
- * @v _api_func API function
- * @v _func Implementing function
+ * This is (obviously) not 100% consistent with the definition of
+ * TICKS_PER_SEC, but it allows for multiplications and divisions to
+ * be elided. In any case, timer ticks are not expected to be a
+ * precision timing source; for example, the standard BIOS timer is
+ * based on an 18.2Hz clock.
*/
-#define PROVIDE_TIMER( _subsys, _api_func, _func ) \
- PROVIDE_SINGLE_API ( TIMER_PREFIX_ ## _subsys, _api_func, _func )
+#define TICKS_PER_MS 1
-/**
- * Provide a static inline timer API implementation
- *
- * @v _prefix Subsystem prefix
- * @v _api_func API function
- */
-#define PROVIDE_TIMER_INLINE( _subsys, _api_func ) \
- PROVIDE_SINGLE_API_INLINE ( TIMER_PREFIX_ ## _subsys, _api_func )
+/** A timer */
+struct timer {
+ /** Name */
+ const char *name;
+ /**
+ * Probe timer
+ *
+ * @ret rc Return status code
+ */
+ int ( * probe ) ( void );
+ /**
+ * Get current system time in ticks
+ *
+ * @ret ticks Current time, in ticks
+ */
+ unsigned long ( * currticks ) ( void );
+ /**
+ * Delay for a fixed number of microseconds
+ *
+ * @v usecs Number of microseconds for which to delay
+ */
+ void ( * udelay ) ( unsigned long usecs );
+};
-/* Include all architecture-independent I/O API headers */
-#include <ipxe/efi/efi_timer.h>
-#include <ipxe/linux/linux_timer.h>
+/** Timer table */
+#define TIMERS __table ( struct timer, "timers" )
-/* Include all architecture-dependent I/O API headers */
-#include <bits/timer.h>
+/** Declare a timer */
+#define __timer( order ) __table_entry ( TIMERS, order )
-/**
- * Delay for a fixed number of microseconds
+/** @defgroup timer_order Timer detection order
*
- * @v usecs Number of microseconds for which to delay
+ * @{
*/
-void udelay ( unsigned long usecs );
-/**
- * Get current system time in ticks
- *
- * @ret ticks Current time, in ticks
- */
-unsigned long currticks ( void );
+#define TIMER_PREFERRED 01 /**< Preferred timer */
+#define TIMER_NORMAL 02 /**< Normal timer */
-/**
- * Get number of ticks per second
+/** @} */
+
+/*
+ * sleep() prototype is defined by POSIX.1. usleep() prototype is
+ * defined by 4.3BSD. udelay() and mdelay() prototypes are chosen to
+ * be reasonably sensible.
*
- * @ret ticks_per_sec Number of ticks per second
*/
-unsigned long ticks_per_sec ( void );
-/** Number of ticks per second */
-#define TICKS_PER_SEC ( ticks_per_sec() )
+extern void udelay ( unsigned long usecs );
+extern void mdelay ( unsigned long msecs );
+extern unsigned long currticks ( void );
+extern unsigned int sleep ( unsigned int seconds );
#endif /* _IPXE_TIMER_H */
diff --git a/src/include/unistd.h b/src/include/unistd.h
index d09e1ae30..6c31c0601 100644
--- a/src/include/unistd.h
+++ b/src/include/unistd.h
@@ -23,19 +23,9 @@ extern int execv ( const char *command, char * const argv[] );
rc; \
} )
-/* Pick up udelay() */
+/* Pick up udelay() and sleep() */
#include <ipxe/timer.h>
-/*
- * sleep() prototype is defined by POSIX.1. usleep() prototype is
- * defined by 4.3BSD. udelay() and mdelay() prototypes are chosen to
- * be reasonably sensible.
- *
- */
-
-extern unsigned int sleep ( unsigned int seconds );
-extern void mdelay ( unsigned long msecs );
-
static inline __always_inline void usleep ( unsigned long usecs ) {
udelay ( usecs );
}