|
| 1 | +/* |
| 2 | + * Copyright (c) 2020 Intel Corporation. |
| 3 | + * |
| 4 | + * SPDX-License-Identifier: Apache-2.0 |
| 5 | + */ |
| 6 | + |
| 7 | +#include <arch/x86/arch.h> |
| 8 | +#include <kernel.h> |
| 9 | +#include <sys_clock.h> |
| 10 | +#include <timing/timing.h> |
| 11 | + |
| 12 | +static uint64_t tsc_freq; |
| 13 | + |
| 14 | +void timing_x86_init(void) |
| 15 | +{ |
| 16 | + uint32_t cyc_start = k_cycle_get_32(); |
| 17 | + uint64_t tsc_start = z_tsc_read(); |
| 18 | + |
| 19 | + k_busy_wait(10 * USEC_PER_MSEC); |
| 20 | + |
| 21 | + uint32_t cyc_end = k_cycle_get_32(); |
| 22 | + uint64_t tsc_end = z_tsc_read(); |
| 23 | + |
| 24 | + uint64_t cyc_freq = sys_clock_hw_cycles_per_sec(); |
| 25 | + |
| 26 | + /* |
| 27 | + * cycles are in 32-bit, and delta must be |
| 28 | + * calculated in 32-bit percision. Or it would |
| 29 | + * wrapping around in 64-bit. |
| 30 | + */ |
| 31 | + uint64_t dcyc = (uint32_t)cyc_end - (uint32_t)cyc_start; |
| 32 | + |
| 33 | + uint64_t dtsc = tsc_end - tsc_start; |
| 34 | + |
| 35 | + tsc_freq = (cyc_freq * dtsc) / dcyc; |
| 36 | +} |
| 37 | + |
| 38 | +uint64_t timing_x86_freq_get(void) |
| 39 | +{ |
| 40 | + return tsc_freq; |
| 41 | +} |
| 42 | + |
| 43 | +void timing_init(void) |
| 44 | +{ |
| 45 | + timing_x86_init(); |
| 46 | +} |
| 47 | +void timing_start(void) |
| 48 | +{ |
| 49 | +} |
| 50 | + |
| 51 | +void timing_stop(void) |
| 52 | +{ |
| 53 | +} |
| 54 | + |
| 55 | +timing_t timing_counter_get(void) |
| 56 | +{ |
| 57 | + return k_cycle_get_32(); |
| 58 | +} |
| 59 | + |
| 60 | +uint64_t timing_cycles_get(volatile timing_t *const start, |
| 61 | + volatile timing_t *const end) |
| 62 | +{ |
| 63 | + return (*end - *start); |
| 64 | +} |
| 65 | + |
| 66 | + |
| 67 | +uint64_t timing_freq_get(void) |
| 68 | +{ |
| 69 | + return timing_x86_freq_get(); |
| 70 | +} |
| 71 | + |
| 72 | +uint64_t timing_cycles_to_ns(uint64_t cycles) |
| 73 | +{ |
| 74 | + return k_cyc_to_ns_floor64(cycles); |
| 75 | +} |
| 76 | + |
| 77 | +uint64_t timing_cycles_to_ns_avg(uint64_t cycles, uint32_t count) |
| 78 | +{ |
| 79 | + return timing_cycles_to_ns(cycles) / count; |
| 80 | +} |
| 81 | + |
| 82 | +uint32_t timing_freq_get_mhz(void) |
| 83 | +{ |
| 84 | + return (uint32_t)(timing_freq_get() / 1000000); |
| 85 | +} |
0 commit comments