diff options
author | Sascha Hauer <s.hauer@pengutronix.de> | 2014-07-07 18:02:53 +0200 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2014-07-16 10:46:18 +0200 |
commit | 1dff7e414d78d5fd8ff62a57b67617aa1f73e532 (patch) | |
tree | 48c3360c0536ce6096a50b774ed8c7d121b46dc2 /arch/efi/efi/clocksource.c | |
parent | 3475ba2a1da1358697297a3cf9337eed10b69695 (diff) | |
download | barebox-1dff7e414d78d5fd8ff62a57b67617aa1f73e532.tar.gz barebox-1dff7e414d78d5fd8ff62a57b67617aa1f73e532.tar.xz |
Add initial EFI architecture support
This adds support for running barebox in an EFI environment
on X86 PC hardware.
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'arch/efi/efi/clocksource.c')
-rw-r--r-- | arch/efi/efi/clocksource.c | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/arch/efi/efi/clocksource.c b/arch/efi/efi/clocksource.c new file mode 100644 index 0000000000..2f33b43cce --- /dev/null +++ b/arch/efi/efi/clocksource.c @@ -0,0 +1,60 @@ +#include <common.h> +#include <efi.h> +#include <mach/efi.h> +#include <clock.h> + +#ifdef __x86_64__ +uint64_t ticks_read(void) +{ + uint64_t a, d; + + __asm__ volatile ("rdtsc" : "=a" (a), "=d" (d)); + + return (d << 32) | a; +} +#else +uint64_t ticks_read(void) +{ + uint64_t val; + + __asm__ volatile ("rdtsc" : "=A" (val)); + + return val; +} +#endif + +static uint64_t freq; + +/* count TSC ticks during a millisecond delay */ +static uint64_t ticks_freq(void) +{ + uint64_t ticks_start, ticks_end; + + ticks_start = ticks_read(); + BS->stall(1000); + ticks_end = ticks_read(); + + return (ticks_end - ticks_start) * 1000; +} + +static uint64_t efi_clocksource_read(void) +{ + return 1000 * 1000 * ticks_read() / freq; +} + +static struct clocksource cs = { + .read = efi_clocksource_read, + .mask = CLOCKSOURCE_MASK(64), + .shift = 0, +}; + +int efi_clocksource_init(void) +{ + cs.mult = clocksource_hz2mult(1000 * 1000, cs.shift); + + freq = ticks_freq(); + + init_clock(&cs); + + return 0; +} |