\r
#define TICKS_PER_MICRO_SEC (PcdGet32 (PcdArmArchTimerFreqInHz)/1000000U)\r
\r
+// Select appropriate multiply function for platform architecture.\r
+#ifdef MDE_CPU_ARM\r
+#define MultU64xN MultU64x32\r
+#else\r
+#define MultU64xN MultU64x64\r
+#endif\r
+\r
+\r
RETURN_STATUS\r
EFIAPI\r
TimerConstructor (\r
return RETURN_SUCCESS;\r
}\r
\r
+/**\r
+ A local utility function that returns the PCD value, if specified.\r
+ Otherwise it defaults to ArmGenericTimerGetTimerFreq.\r
+\r
+ @return The timer frequency.\r
+\r
+**/\r
+STATIC\r
+UINTN\r
+EFIAPI\r
+GetPlatformTimerFreq (\r
+ )\r
+{\r
+ UINTN TimerFreq;\r
+\r
+ TimerFreq = PcdGet32 (PcdArmArchTimerFreqInHz);\r
+ if (TimerFreq == 0) {\r
+ TimerFreq = ArmGenericTimerGetTimerFreq ();\r
+ }\r
+ return TimerFreq;\r
+}\r
+\r
\r
/**\r
Stalls the CPU for the number of microseconds specified by MicroSeconds.\r
{\r
UINT64 TimerTicks64;\r
UINT64 SystemCounterVal;\r
- UINT64 (EFIAPI\r
- *MultU64xN) (\r
- IN UINT64 Multiplicand,\r
- IN UINTN Multiplier\r
- );\r
- UINTN TimerFreq;\r
-\r
-#ifdef MDE_CPU_ARM\r
- MultU64xN = MultU64x32;\r
-#else\r
- MultU64xN = MultU64x64;\r
-#endif\r
-\r
- TimerFreq = PcdGet32 (PcdArmArchTimerFreqInHz);\r
- if (TimerFreq == 0) {\r
- TimerFreq = ArmGenericTimerGetTimerFreq ();\r
- }\r
\r
// Calculate counter ticks that can represent requested delay:\r
// = MicroSeconds x TICKS_PER_MICRO_SEC\r
TimerTicks64 = DivU64x32 (\r
MultU64xN (\r
MicroSeconds,\r
- TimerFreq\r
+ GetPlatformTimerFreq ()\r
),\r
1000000U\r
);\r