1/* 2 * Copyright 2020, Data61, CSIRO (ABN 41 687 119 230) 3 * 4 * SPDX-License-Identifier: GPL-2.0-only 5 */ 6 7#pragma once 8 9#include <config.h> 10#include <stdint.h> 11 12#ifdef CONFIG_KERNEL_MCS 13#include <util.h> 14 15/* timer function definitions that work for all 32bit arm platforms that provide 16 * CLK_MAGIC and TIMER_CLOCK_MHZ -- these definitions might need to move 17 * if we come across an arm platform that does not suit this model */ 18 19/* get the max value ticksToUs can be passed without overflowing */ 20static inline CONST ticks_t getMaxTicksToUs(void) 21{ 22#if USE_KHZ 23 return UINT64_MAX / KHZ_IN_MHZ / CLK_MAGIC; 24#else 25 return UINT64_MAX / CLK_MAGIC; 26#endif 27} 28 29static inline CONST time_t ticksToUs(ticks_t ticks) 30{ 31 /* simulate 64bit division using multiplication by reciprocal */ 32#if USE_KHZ 33 return (ticks * KHZ_IN_MHZ) * CLK_MAGIC >> CLK_SHIFT; 34#else 35 return (ticks * CLK_MAGIC) >> CLK_SHIFT; 36#endif 37} 38#endif /* CONFIG_KERNEL_MCS */ 39 40