diff options
author | Raul E Rangel <rrangel@chromium.org> | 2018-08-20 12:47:19 -0600 |
---|---|---|
committer | Martin Roth <martinroth@google.com> | 2018-09-12 14:15:18 +0000 |
commit | d63627fb846b6621be87348b1653a5f37070e12f (patch) | |
tree | 2547e1bf937bc9bbf128d5b2f1836e407c0e928b /payloads | |
parent | 24ae85c3ffb48c72f67a514dcb843c1de54e5416 (diff) | |
download | coreboot-d63627fb846b6621be87348b1653a5f37070e12f.tar.gz coreboot-d63627fb846b6621be87348b1653a5f37070e12f.tar.bz2 coreboot-d63627fb846b6621be87348b1653a5f37070e12f.zip |
libpayload/libc/time: Add an arch_ndelay()
Replace _delay with an arch_ndelay(). This way each arch can setup their
own delay mechanism.
BUG=b:109749762
TEST=Verified delay's still work on grunt.
Change-Id: I552eb30984f9c21e92dffc9d7b36873e9e2e4ac5
Signed-off-by: Raul E Rangel <rrangel@chromium.org>
Reviewed-on: https://review.coreboot.org/28243
Reviewed-by: Martin Roth <martinroth@google.com>
Reviewed-by: Richard Spiegel <richard.spiegel@silverbackltd.com>
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Diffstat (limited to 'payloads')
-rw-r--r-- | payloads/libpayload/include/libpayload.h | 45 | ||||
-rw-r--r-- | payloads/libpayload/include/stddef.h | 3 | ||||
-rw-r--r-- | payloads/libpayload/libc/time.c | 44 |
3 files changed, 47 insertions, 45 deletions
diff --git a/payloads/libpayload/include/libpayload.h b/payloads/libpayload/include/libpayload.h index 359bd0e4ce59..c2510b73735e 100644 --- a/payloads/libpayload/include/libpayload.h +++ b/payloads/libpayload/include/libpayload.h @@ -464,11 +464,48 @@ unsigned int get_cpu_speed(void); uint64_t timer_hz(void); uint64_t timer_raw_value(void); uint64_t timer_us(uint64_t base); +void arch_ndelay(uint64_t n); /* Generic. */ -void ndelay(unsigned int n); -void udelay(unsigned int n); -void mdelay(unsigned int n); -void delay(unsigned int n); + +/** + * Delay for a specified number of nanoseconds. + * + * @param ns Number of nanoseconds to delay for. + */ +static inline void ndelay(unsigned int ns) +{ + arch_ndelay((uint64_t)ns); +} + +/** + * Delay for a specified number of microseconds. + * + * @param us Number of microseconds to delay for. + */ +static inline void udelay(unsigned int us) +{ + arch_ndelay((uint64_t)us * NSECS_PER_USEC); +} + +/** + * Delay for a specified number of milliseconds. + * + * @param ms Number of milliseconds to delay for. + */ +static inline void mdelay(unsigned int ms) +{ + arch_ndelay((uint64_t)ms * NSECS_PER_MSEC); +} + +/** + * Delay for a specified number of seconds. + * + * @param s Number of seconds to delay for. + */ +static inline void delay(unsigned int s) +{ + arch_ndelay((uint64_t)s * NSECS_PER_SEC); +} /** * @defgroup readline Readline functions diff --git a/payloads/libpayload/include/stddef.h b/payloads/libpayload/include/stddef.h index 4e41eedfe84c..725ff0bcb5d9 100644 --- a/payloads/libpayload/include/stddef.h +++ b/payloads/libpayload/include/stddef.h @@ -29,6 +29,9 @@ typedef __SIZE_TYPE__ ssize_t; #define MHz (1000*KHz) #define GHz (1000*MHz) +#define NSECS_PER_SEC 1000000000 #define USECS_PER_SEC 1000000 #define MSECS_PER_SEC 1000 +#define NSECS_PER_MSEC (NSECS_PER_SEC / MSECS_PER_SEC) +#define NSECS_PER_USEC (NSECS_PER_SEC / USECS_PER_SEC) #define USECS_PER_MSEC (USECS_PER_SEC / MSECS_PER_SEC) diff --git a/payloads/libpayload/libc/time.c b/payloads/libpayload/libc/time.c index 46306bb1bac7..f8913466dc31 100644 --- a/payloads/libpayload/libc/time.c +++ b/payloads/libpayload/libc/time.c @@ -158,52 +158,14 @@ int gettimeofday(struct timeval *tv, void *tz) return 0; } -static inline void _delay(uint64_t delta) +__attribute__((weak)) +void arch_ndelay(uint64_t ns) { + uint64_t delta = ns * timer_hz() / NSECS_PER_SEC; uint64_t start = timer_raw_value(); while (timer_raw_value() - start < delta) ; } -/** - * Delay for a specified number of nanoseconds. - * - * @param n Number of nanoseconds to delay for. - */ -void ndelay(unsigned int n) -{ - _delay((uint64_t)n * timer_hz() / 1000000000); -} - -/** - * Delay for a specified number of microseconds. - * - * @param n Number of microseconds to delay for. - */ -void udelay(unsigned int n) -{ - _delay((uint64_t)n * timer_hz() / 1000000); -} - -/** - * Delay for a specified number of milliseconds. - * - * @param m Number of milliseconds to delay for. - */ -void mdelay(unsigned int m) -{ - _delay((uint64_t)m * timer_hz() / 1000); -} - -/** - * Delay for a specified number of seconds. - * - * @param s Number of seconds to delay for. - */ -void delay(unsigned int s) -{ - _delay((uint64_t)s * timer_hz()); -} - u64 timer_us(u64 base) { static u64 hz; |