/* * Copyright (c) 2021 Arm Limited. All rights reserved. * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef HAL_TIMER_H #define HAL_TIMER_H #include "hal_config.h" #if ((PLATFORM_HAL) == PLATFORM_CORTEX_M_BAREMETAL) #include "baremetal_timer.h" #elif ((PLATFORM_HAL) == PLATFORM_UNKNOWN_LINUX_OS) #include "native_timer.h" #else #error "Platform does not support a timer API" #endif /* PLATFORM_HAL */ /** Struct for describing the capabilities available for * the timer provided by HAL */ typedef struct _platform_timer_capability { uint32_t npu_cycles: 1; uint32_t cpu_cycles: 1; uint32_t duration_ms: 1; uint32_t duration_us: 1; } timer_capability; /* Structure to hold a platform specific timer implementation */ typedef struct _platform_timer { int inited; /**< initialised or not */ timer_capability cap; /**< capability of this timer */ /* reset the timer */ void (* reset)(void); /* Gets the current time counter. */ time_counter (* get_time_counter)(void); /* Gets the duration in milliseconds. */ time_t (* get_duration_ms)(time_counter *start, time_counter *end); /* Gets duration in microseconds. */ time_t (* get_duration_us)(time_counter *start, time_counter *end); /* Gets difference in CPU cycle counts. */ uint32_t (* get_cpu_cycle_diff)(time_counter *start, time_counter *end); /* Gets the difference in terms of total NPU cycle counts. */ uint64_t (* get_npu_total_cycle_diff)(time_counter *start, time_counter *end); /* Gets the difference in terms of active NPU cycle counts. */ uint64_t (* get_npu_active_cycle_diff)(time_counter *start, time_counter *end); /* Wraps get_time_counter function with additional profiling * initialisation, if required. */ time_counter (* start_profiling)(void); /* Wraps get_time_counter function along with additional instructions when * profiling ends, if required. */ time_counter (* stop_profiling)(void); } platform_timer; /** * @brief Initialise the timer available for the platform. **/ void init_timer(platform_timer *timer); #endif /* HAL_TIMER_H */