18#define TICKS_PER_MICRO_SEC (PcdGet32 (PcdArmArchTimerFreqInHz)/1000000U)
22#define MULT_U64_X_N MultU64x32
24#define MULT_U64_X_N MultU64x64
36 if (ArmIsArchTimerImplemented ()) {
41 if (
PcdGet32 (PcdArmArchTimerFreqInHz) != 0) {
47 ASSERT (TICKS_PER_MICRO_SEC);
57 ArmGenericTimerSetTimerFreq (
PcdGet32 (PcdArmArchTimerFreqInHz));
68 ASSERT (ArmGenericTimerGetTimerFreq () != 0);
70 DEBUG ((DEBUG_ERROR,
"ARM Architectural Timer is not available in the CPU, hence this library cannot be used.\n"));
92 TimerFreq =
PcdGet32 (PcdArmArchTimerFreqInHz);
94 TimerFreq = ArmGenericTimerGetTimerFreq ();
115 UINT64 SystemCounterVal;
129 SystemCounterVal = ArmGenericTimerGetSystemCount ();
131 TimerTicks64 += SystemCounterVal;
134 while (SystemCounterVal < TimerTicks64) {
135 SystemCounterVal = ArmGenericTimerGetSystemCount ();
163 MicroSeconds = NanoSeconds / 1000;
164 MicroSeconds += ((NanoSeconds % 1000) == 0) ? 0 : 1;
189 return ArmGenericTimerGetSystemCount ();
218 OUT UINT64 *StartValue OPTIONAL,
219 OUT UINT64 *EndValue OPTIONAL
222 if (StartValue !=
NULL) {
224 *StartValue = (UINT64)0ULL;
227 if (EndValue !=
NULL) {
229 *EndValue = 0xFFFFFFFFFFFFFFFFUL;
232 return (UINT64)ArmGenericTimerGetTimerFreq ();
262 NanoSeconds = MULT_U64_X_N (
UINT64 EFIAPI GetPerformanceCounterProperties(OUT UINT64 *StartValue OPTIONAL, OUT UINT64 *EndValue OPTIONAL)
UINT64 EFIAPI GetTimeInNanoSecond(IN UINT64 Ticks)
STATIC UINTN EFIAPI GetPlatformTimerFreq()
UINT64 EFIAPI GetPerformanceCounter(VOID)
UINTN EFIAPI MicroSecondDelay(IN UINTN MicroSeconds)
UINTN EFIAPI NanoSecondDelay(IN UINTN NanoSeconds)
BOOLEAN EFIAPI ArmHasSecurityExtensions(VOID)
UINT64 EFIAPI DivU64x32(IN UINT64 Dividend, IN UINT32 Divisor)
UINT64 EFIAPI DivU64x32Remainder(IN UINT64 Dividend, IN UINT32 Divisor, OUT UINT32 *Remainder OPTIONAL)
#define DEBUG(Expression)
#define PcdGet32(TokenName)