X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=blobdiff_plain;f=PcAtChipsetPkg%2FLibrary%2FAcpiTimerLib%2FDxeAcpiTimerLib.c;h=67e18a13607fbf82f55741d612e0eb844bab276d;hp=7f7b0f8f62947712e3a3a3d66df51ddeece1c14a;hb=fd501a798402fdc8ce3fe4e7de3927658889b555;hpb=62b8b5be713dd1f801cd44e4eb28f68585a9bd85 diff --git a/PcAtChipsetPkg/Library/AcpiTimerLib/DxeAcpiTimerLib.c b/PcAtChipsetPkg/Library/AcpiTimerLib/DxeAcpiTimerLib.c index 7f7b0f8f62..67e18a1360 100644 --- a/PcAtChipsetPkg/Library/AcpiTimerLib/DxeAcpiTimerLib.c +++ b/PcAtChipsetPkg/Library/AcpiTimerLib/DxeAcpiTimerLib.c @@ -12,21 +12,39 @@ **/ -#include +#include #include #include +#include + +extern GUID mFrequencyHobGuid; + +/** + The constructor function enables ACPI IO space. + + If ACPI I/O space not enabled, this function will enable it. + It will always return RETURN_SUCCESS. + + @retval EFI_SUCCESS The constructor always returns RETURN_SUCCESS. + +**/ +RETURN_STATUS +EFIAPI +AcpiTimerLibConstructor ( + VOID + ); /** Calculate TSC frequency. The TSC counting frequency is determined by comparing how far it counts - during a 100us period as determined by the ACPI timer. The ACPI timer is - used because it counts at a known frequency. - The TSC is sampled, followed by waiting for ACPI_TIMER_FREQUENCY / 10000 - clocks of the ACPI timer, or 100us. The TSC is then sampled again. The - difference multiplied by 10000 is the TSC frequency. There will be a small - error because of the overhead of reading the ACPI timer. An attempt is - made to determine and compensate for this error. + during a 101.4 us period as determined by the ACPI timer. + The ACPI timer is used because it counts at a known frequency. + The TSC is sampled, followed by waiting 363 counts of the ACPI timer, + or 101.4 us. The TSC is then sampled again. The difference multiplied by + 9861 is the TSC frequency. There will be a small error because of the + overhead of reading the ACPI timer. An attempt is made to determine and + compensate for this error. @return The number of TSC counts per second. @@ -54,8 +72,41 @@ InternalGetPerformanceCounterFrequency ( VOID ) { - if (mPerformanceCounterFrequency == 0) { + return mPerformanceCounterFrequency; +} + +/** + The constructor function enables ACPI IO space, and caches PerformanceCounterFrequency. + + @param ImageHandle The firmware allocated handle for the EFI image. + @param SystemTable A pointer to the EFI System Table. + + @retval EFI_SUCCESS The constructor always returns RETURN_SUCCESS. + +**/ +EFI_STATUS +EFIAPI +DxeAcpiTimerLibConstructor ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + EFI_HOB_GUID_TYPE *GuidHob; + + // + // Enable ACPI IO space. + // + AcpiTimerLibConstructor (); + + // + // Initialize PerformanceCounterFrequency + // + GuidHob = GetFirstGuidHob (&mFrequencyHobGuid); + if (GuidHob != NULL) { + mPerformanceCounterFrequency = *(UINT64*)GET_GUID_HOB_DATA (GuidHob); + } else { mPerformanceCounterFrequency = InternalCalculateTscFrequency (); } - return mPerformanceCounterFrequency; + + return EFI_SUCCESS; }