]> git.proxmox.com Git - mirror_edk2.git/blob - UefiCpuPkg/Library/CpuTimerLib/DxeCpuTimerLib.c
UefiCpuPkg: Adding a new TSC library by using CPUID(0x15) TSC leaf
[mirror_edk2.git] / UefiCpuPkg / Library / CpuTimerLib / DxeCpuTimerLib.c
1 /** @file
2 CPUID Leaf 0x15 for Core Crystal Clock frequency instance of Timer Library.
3
4 Copyright (c) 2019 Intel Corporation. All rights reserved.<BR>
5 SPDX-License-Identifier: BSD-2-Clause-Patent
6
7 **/
8
9 #include <PiDxe.h>
10 #include <Library/TimerLib.h>
11 #include <Library/BaseLib.h>
12 #include <Library/HobLib.h>
13
14 extern GUID mCpuCrystalFrequencyHobGuid;
15
16 /**
17 CPUID Leaf 0x15 for Core Crystal Clock Frequency.
18
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.
22
23 **/
24 UINT64
25 CpuidCoreClockCalculateTscFrequency (
26 VOID
27 );
28
29 //
30 // Cached CPU Crystal counter frequency
31 //
32 UINT64 mCpuCrystalCounterFrequency = 0;
33
34
35 /**
36 Internal function to retrieves the 64-bit frequency in Hz.
37
38 Internal function to retrieves the 64-bit frequency in Hz.
39
40 @return The frequency in Hz.
41
42 **/
43 UINT64
44 InternalGetPerformanceCounterFrequency (
45 VOID
46 )
47 {
48 return mCpuCrystalCounterFrequency;
49 }
50
51 /**
52 The constructor function is to initialize CpuCrystalCounterFrequency.
53
54 @param ImageHandle The firmware allocated handle for the EFI image.
55 @param SystemTable A pointer to the EFI System Table.
56
57 @retval EFI_SUCCESS The constructor always returns RETURN_SUCCESS.
58
59 **/
60 EFI_STATUS
61 EFIAPI
62 DxeCpuTimerLibConstructor (
63 IN EFI_HANDLE ImageHandle,
64 IN EFI_SYSTEM_TABLE *SystemTable
65 )
66 {
67 EFI_HOB_GUID_TYPE *GuidHob;
68
69 //
70 // Initialize CpuCrystalCounterFrequency
71 //
72 GuidHob = GetFirstGuidHob (&mCpuCrystalFrequencyHobGuid);
73 if (GuidHob != NULL) {
74 mCpuCrystalCounterFrequency = *(UINT64*)GET_GUID_HOB_DATA (GuidHob);
75 } else {
76 mCpuCrystalCounterFrequency = CpuidCoreClockCalculateTscFrequency ();
77 }
78
79 if (mCpuCrystalCounterFrequency == 0) {
80 return EFI_UNSUPPORTED;
81 }
82
83 return EFI_SUCCESS;
84 }
85