2 CPUID Leaf 0x15 for Core Crystal Clock frequency instance of Timer Library.
4 Copyright (c) 2019 Intel Corporation. All rights reserved.<BR>
5 SPDX-License-Identifier: BSD-2-Clause-Patent
10 #include <Library/TimerLib.h>
11 #include <Library/BaseLib.h>
12 #include <Library/HobLib.h>
14 extern GUID mCpuCrystalFrequencyHobGuid
;
17 CPUID Leaf 0x15 for Core Crystal Clock Frequency.
19 The TSC counting frequency is determined by using CPUID leaf 0x15. Frequency in MHz = Core XTAL frequency * EBX/EAX.
20 In newer flavors of the CPU, core xtal frequency is returned in ECX or 0 if not supported.
21 @return The number of TSC counts per second.
25 CpuidCoreClockCalculateTscFrequency (
30 // Cached CPU Crystal counter frequency
32 UINT64 mCpuCrystalCounterFrequency
= 0;
36 Internal function to retrieves the 64-bit frequency in Hz.
38 Internal function to retrieves the 64-bit frequency in Hz.
40 @return The frequency in Hz.
44 InternalGetPerformanceCounterFrequency (
48 return mCpuCrystalCounterFrequency
;
52 The constructor function is to initialize CpuCrystalCounterFrequency.
54 @param ImageHandle The firmware allocated handle for the EFI image.
55 @param SystemTable A pointer to the EFI System Table.
57 @retval EFI_SUCCESS The constructor always returns RETURN_SUCCESS.
62 DxeCpuTimerLibConstructor (
63 IN EFI_HANDLE ImageHandle
,
64 IN EFI_SYSTEM_TABLE
*SystemTable
67 EFI_HOB_GUID_TYPE
*GuidHob
;
70 // Initialize CpuCrystalCounterFrequency
72 GuidHob
= GetFirstGuidHob (&mCpuCrystalFrequencyHobGuid
);
73 if (GuidHob
!= NULL
) {
74 mCpuCrystalCounterFrequency
= *(UINT64
*)GET_GUID_HOB_DATA (GuidHob
);
76 mCpuCrystalCounterFrequency
= CpuidCoreClockCalculateTscFrequency ();
79 if (mCpuCrystalCounterFrequency
== 0) {
80 return EFI_UNSUPPORTED
;