diff options
author | Ian Moffett <ian@osmora.org> | 2025-09-21 01:02:53 -0400 |
---|---|---|
committer | Ian Moffett <ian@osmora.org> | 2025-09-21 01:02:53 -0400 |
commit | 0c75ed9fb14275603b478c5bbd96bcd4d3f982e6 (patch) | |
tree | 7873c662de94f8c3d34ff5168adc64fa98e2e9dd /src/sys/arch | |
parent | 4353697bba19742123233aa6ad1322215a5304ad (diff) |
kern: clkdev: Add callback to get elapsed time
Add new clock device callback to get the elapsed time from the timer
being initialized, in microseconds.
Signed-off-by: Ian Moffett <ian@osmora.org>
Diffstat (limited to 'src/sys/arch')
-rw-r--r-- | src/sys/arch/amd64/io/hpet.c | 23 |
1 files changed, 22 insertions, 1 deletions
diff --git a/src/sys/arch/amd64/io/hpet.c b/src/sys/arch/amd64/io/hpet.c index 36f19a8..d733d9b 100644 --- a/src/sys/arch/amd64/io/hpet.c +++ b/src/sys/arch/amd64/io/hpet.c @@ -42,6 +42,9 @@ #include <acpi/tables.h> #include <machine/hpet.h> +#define FSEC_PER_SECOND 1000000000000000ULL +#define USEC_PER_SECOND 1000000ULL + #define HPET_REG_CAPS 0x00 #define HPET_GENERAL_CONFIG 0x10 #define HPET_REG_MAIN_COUNTER 0xF0 @@ -119,6 +122,23 @@ hpet_msleep(size_t ms) } /* + * Get time since init in usec + */ +static size_t +hpet_time_usec(void) +{ + uint64_t period, freq, caps; + uint64_t counter; + + caps = hpet_read(HPET_REG_CAPS); + period = CAP_CLK_PERIOD(caps); + freq = FSEC_PER_SECOND / period; + + counter = hpet_read(HPET_REG_MAIN_COUNTER); + return (counter * USEC_PER_SECOND) / freq; +} + +/* * Initialize the HPET */ int @@ -162,8 +182,9 @@ hpet_init(void) /* Initialize as clock device */ clkdev.name = "IA-PC HPET"; - clkdev.attr = CLKDEV_MSLEEP; + clkdev.attr = CLKDEV_MSLEEP | CLKDEV_GET_USEC; clkdev.msleep = hpet_msleep; + clkdev.get_time_usec = hpet_time_usec; if (clkdev_register(&clkdev) < 0) { printf("hpet_init: could not register clock device\n"); return -1; |