diff options
Diffstat (limited to 'src/include')
| -rw-r--r-- | src/include/ipxe/efi/efi_timer.h | 36 | ||||
| -rw-r--r-- | src/include/ipxe/linux/linux_timer.h | 18 | ||||
| -rw-r--r-- | src/include/ipxe/timer.h | 102 | ||||
| -rw-r--r-- | src/include/unistd.h | 12 |
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 ); } |
