The arch_timing_* are not defined if timing functions are not enabled, which results in compiler warnings about implicit function declarations. So guard the header with its own kconfig so the header can be unconditionally included by other enough though timing functions are not enabled. Note this is done inside the doxygen @defgroup or else doc build would fail as timing_api group cannot be found. Signed-off-by: Daniel Leung <daniel.leung@intel.com>
179 lines
4.6 KiB
C
179 lines
4.6 KiB
C
/*
|
|
* Copyright (c) 2020 Intel Corporation.
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
#ifndef ZEPHYR_INCLUDE_TIMING_TIMING_H_
|
|
#define ZEPHYR_INCLUDE_TIMING_TIMING_H_
|
|
|
|
#include <sys/arch_interface.h>
|
|
#include <timing/types.h>
|
|
|
|
void soc_timing_init(void);
|
|
void soc_timing_start(void);
|
|
void soc_timing_stop(void);
|
|
timing_t soc_timing_counter_get(void);
|
|
uint64_t soc_timing_cycles_get(volatile timing_t *const start,
|
|
volatile timing_t *const end);
|
|
uint64_t soc_timing_freq_get(void);
|
|
uint64_t soc_timing_cycles_to_ns(uint64_t cycles);
|
|
uint64_t soc_timing_cycles_to_ns_avg(uint64_t cycles, uint32_t count);
|
|
uint32_t soc_timing_freq_get_mhz(void);
|
|
|
|
void board_timing_init(void);
|
|
void board_timing_start(void);
|
|
void board_timing_stop(void);
|
|
timing_t board_timing_counter_get(void);
|
|
uint64_t board_timing_cycles_get(volatile timing_t *const start,
|
|
volatile timing_t *const end);
|
|
uint64_t board_timing_freq_get(void);
|
|
uint64_t board_timing_cycles_to_ns(uint64_t cycles);
|
|
uint64_t board_timing_cycles_to_ns_avg(uint64_t cycles, uint32_t count);
|
|
uint32_t board_timing_freq_get_mhz(void);
|
|
|
|
|
|
/**
|
|
* @brief Timing Measurement APIs
|
|
* @defgroup timing_api Timing APIs
|
|
* @{
|
|
*/
|
|
|
|
#ifdef CONFIG_TIMING_FUNCTIONS
|
|
|
|
/**
|
|
* @brief Initialize the timing subsystem.
|
|
*
|
|
* Perform the necessary steps to initialize the timing subsystem.
|
|
*/
|
|
void timing_init(void);
|
|
|
|
/**
|
|
* @brief Signal the start of the timing information gathering.
|
|
*
|
|
* Signal to the timing subsystem that timing information
|
|
* will be gathered from this point forward.
|
|
*/
|
|
void timing_start(void);
|
|
|
|
/**
|
|
* @brief Signal the end of the timing information gathering.
|
|
*
|
|
* Signal to the timing subsystem that timing information
|
|
* is no longer being gathered from this point forward.
|
|
*/
|
|
void timing_stop(void);
|
|
|
|
/**
|
|
* @brief Return timing counter.
|
|
*
|
|
* @return Timing counter.
|
|
*/
|
|
static inline timing_t timing_counter_get(void)
|
|
{
|
|
#if defined(CONFIG_BOARD_HAS_TIMING_FUNCTIONS)
|
|
return board_timing_counter_get();
|
|
#elif defined(CONFIG_SOC_HAS_TIMING_FUNCTIONS)
|
|
return soc_timing_counter_get();
|
|
#else
|
|
return arch_timing_counter_get();
|
|
#endif
|
|
}
|
|
|
|
/**
|
|
* @brief Get number of cycles between @p start and @p end.
|
|
*
|
|
* For some architectures or SoCs, the raw numbers from counter
|
|
* need to be scaled to obtain actual number of cycles.
|
|
*
|
|
* @param start Pointer to counter at start of a measured execution.
|
|
* @param end Pointer to counter at stop of a measured execution.
|
|
* @return Number of cycles between start and end.
|
|
*/
|
|
static inline uint64_t timing_cycles_get(volatile timing_t *const start,
|
|
volatile timing_t *const end)
|
|
{
|
|
#if defined(CONFIG_BOARD_HAS_TIMING_FUNCTIONS)
|
|
return board_timing_cycles_get(start, end);
|
|
#elif defined(CONFIG_SOC_HAS_TIMING_FUNCTIONS)
|
|
return soc_timing_cycles_get(start, end);
|
|
#else
|
|
return arch_timing_cycles_get(start, end);
|
|
#endif
|
|
}
|
|
|
|
/**
|
|
* @brief Get frequency of counter used (in Hz).
|
|
*
|
|
* @return Frequency of counter used for timing in Hz.
|
|
*/
|
|
static inline uint64_t timing_freq_get(void)
|
|
{
|
|
#if defined(CONFIG_BOARD_HAS_TIMING_FUNCTIONS)
|
|
return board_timing_freq_get();
|
|
#elif defined(CONFIG_SOC_HAS_TIMING_FUNCTIONS)
|
|
return soc_timing_freq_get();
|
|
#else
|
|
return arch_timing_freq_get();
|
|
#endif
|
|
}
|
|
|
|
/**
|
|
* @brief Convert number of @p cycles into nanoseconds.
|
|
*
|
|
* @param cycles Number of cycles
|
|
* @return Converted time value
|
|
*/
|
|
static inline uint64_t timing_cycles_to_ns(uint64_t cycles)
|
|
{
|
|
#if defined(CONFIG_BOARD_HAS_TIMING_FUNCTIONS)
|
|
return board_timing_cycles_to_ns(cycles);
|
|
#elif defined(CONFIG_SOC_HAS_TIMING_FUNCTIONS)
|
|
return soc_timing_cycles_to_ns(cycles);
|
|
#else
|
|
return arch_timing_cycles_to_ns(cycles);
|
|
#endif
|
|
}
|
|
|
|
/**
|
|
* @brief Convert number of @p cycles into nanoseconds with averaging.
|
|
*
|
|
* @param cycles Number of cycles
|
|
* @param count Times of accumulated cycles to average over
|
|
* @return Converted time value
|
|
*/
|
|
static inline uint64_t timing_cycles_to_ns_avg(uint64_t cycles, uint32_t count)
|
|
{
|
|
#if defined(CONFIG_BOARD_HAS_TIMING_FUNCTIONS)
|
|
return board_timing_cycles_to_ns_avg(cycles, count);
|
|
#elif defined(CONFIG_SOC_HAS_TIMING_FUNCTIONS)
|
|
return soc_timing_cycles_to_ns_avg(cycles, count);
|
|
#else
|
|
return arch_timing_cycles_to_ns_avg(cycles, count);
|
|
#endif
|
|
}
|
|
|
|
/**
|
|
* @brief Get frequency of counter used (in MHz).
|
|
*
|
|
* @return Frequency of counter used for timing in MHz.
|
|
*/
|
|
static inline uint32_t timing_freq_get_mhz(void)
|
|
{
|
|
#if defined(CONFIG_BOARD_HAS_TIMING_FUNCTIONS)
|
|
return board_timing_freq_get_mhz();
|
|
#elif defined(CONFIG_SOC_HAS_TIMING_FUNCTIONS)
|
|
return soc_timing_freq_get_mhz();
|
|
#else
|
|
return arch_timing_freq_get_mhz();
|
|
#endif
|
|
}
|
|
|
|
#endif /* CONFIG_TIMING_FUNCTIONS */
|
|
|
|
/**
|
|
* @}
|
|
*/
|
|
|
|
#endif /* ZEPHYR_INCLUDE_TIMING_TIMING_H_ */
|