1 /* Copyright (c) 2022 Intel Corporation
2  * SPDX-License-Identifier: Apache-2.0
3  */
4 #include <zephyr/kernel.h>
5 
arch_timing_init(void)6 void arch_timing_init(void)
7 {
8 }
9 
arch_timing_start(void)10 void arch_timing_start(void)
11 {
12 }
13 
arch_timing_stop(void)14 void arch_timing_stop(void)
15 {
16 }
17 
arch_timing_freq_get(void)18 uint64_t arch_timing_freq_get(void)
19 {
20 	return CONFIG_XTENSA_CCOUNT_HZ;
21 }
22 
arch_timing_counter_get(void)23 timing_t arch_timing_counter_get(void)
24 {
25 	uint32_t ccount;
26 
27 	__asm__ volatile ("rsr %0, CCOUNT" : "=r"(ccount));
28 
29 	return ccount;
30 }
31 
arch_timing_cycles_get(volatile timing_t * const start,volatile timing_t * const end)32 uint64_t arch_timing_cycles_get(volatile timing_t *const start,
33 				volatile timing_t *const end)
34 {
35 	int64_t dt = (int64_t) (*end - *start);
36 
37 	if (dt < 0) {
38 		dt += 0x100000000ULL;
39 	}
40 
41 	return (uint64_t) dt;
42 }
43 
arch_timing_cycles_to_ns(uint64_t cycles)44 uint64_t arch_timing_cycles_to_ns(uint64_t cycles)
45 {
46 	return cycles * 1000000000ULL / CONFIG_XTENSA_CCOUNT_HZ;
47 }
48 
arch_timing_cycles_to_ns_avg(uint64_t cycles,uint32_t count)49 uint64_t arch_timing_cycles_to_ns_avg(uint64_t cycles, uint32_t count)
50 {
51 	/* Why is this an arch API?  This is just math! */
52 	return arch_timing_cycles_to_ns(cycles) / (uint64_t) count;
53 }
54 
arch_timing_freq_get_mhz(void)55 uint32_t arch_timing_freq_get_mhz(void)
56 {
57 	return arch_timing_freq_get() / 1000000ULL;
58 }
59