diff --git a/OvmfPkg/Library/AcpiTimerLib/BaseAcpiTimerLib.c b/OvmfPkg/Library/AcpiTimerLib/BaseAcpiTimerLib.c index 05b0257451..28280539b6 100644 --- a/OvmfPkg/Library/AcpiTimerLib/BaseAcpiTimerLib.c +++ b/OvmfPkg/Library/AcpiTimerLib/BaseAcpiTimerLib.c @@ -15,12 +15,14 @@ #include #include #include +#include #include // // Power Management PCI Configuration Register fields // #define PMBA_RTE BIT0 +#define PMIOSE BIT0 // // Offset in the Power Management Base Address to the ACPI Timer @@ -33,14 +35,8 @@ STATIC UINT32 mAcpiTimerIoAddr; /** - The constructor function caches the ACPI tick counter address - - At the time this constructor runs (DXE_CORE or later), ACPI IO space - has already been enabled by either PlatformPei or by the "Base" - instance of this library. - In order to avoid querying the underlying platform type during each - tick counter read operation, we cache the counter address during - initialization of this instance of the Timer Library. + The constructor function caches the ACPI tick counter address, and, + if necessary, enables ACPI IO space. @retval EFI_SUCCESS The constructor always returns RETURN_SUCCESS. @@ -53,6 +49,7 @@ AcpiTimerLibConstructor ( { UINT16 HostBridgeDevId; UINTN Pmba; + UINTN PmRegMisc; // // Query Host Bridge DID to determine platform type @@ -60,10 +57,12 @@ AcpiTimerLibConstructor ( HostBridgeDevId = PciRead16 (OVMF_HOSTBRIDGE_DID); switch (HostBridgeDevId) { case INTEL_82441_DEVICE_ID: - Pmba = POWER_MGMT_REGISTER_PIIX4 (0x40); + Pmba = POWER_MGMT_REGISTER_PIIX4 (0x40); + PmRegMisc = POWER_MGMT_REGISTER_PIIX4 (0x80); break; case INTEL_Q35_MCH_DEVICE_ID: - Pmba = POWER_MGMT_REGISTER_Q35 (0x40); + Pmba = POWER_MGMT_REGISTER_Q35 (0x40); + PmRegMisc = POWER_MGMT_REGISTER_Q35 (0x80); break; default: DEBUG ((EFI_D_ERROR, "%a: Unknown Host Bridge Device ID: 0x%04x\n", @@ -74,6 +73,22 @@ AcpiTimerLibConstructor ( mAcpiTimerIoAddr = (PciRead32 (Pmba) & ~PMBA_RTE) + ACPI_TIMER_OFFSET; + // + // Check to see if the Power Management Base Address is already enabled + // + if ((PciRead8 (PmRegMisc) & PMIOSE) == 0) { + // + // If the Power Management Base Address is not programmed, + // then program the Power Management Base Address from a PCD. + // + PciAndThenOr32 (Pmba, (UINT32) ~0xFFC0, PcdGet16 (PcdAcpiPmBaseAddress)); + + // + // Enable PMBA I/O port decodes in PMREGMISC + // + PciOr8 (PmRegMisc, PMIOSE); + } + return RETURN_SUCCESS; } diff --git a/OvmfPkg/Library/AcpiTimerLib/BaseAcpiTimerLib.inf b/OvmfPkg/Library/AcpiTimerLib/BaseAcpiTimerLib.inf index 35c6edc9a1..43ffc8a6a6 100644 --- a/OvmfPkg/Library/AcpiTimerLib/BaseAcpiTimerLib.inf +++ b/OvmfPkg/Library/AcpiTimerLib/BaseAcpiTimerLib.inf @@ -20,7 +20,7 @@ FILE_GUID = FB648CF5-91BE-4737-9023-FD807AC6D96D MODULE_TYPE = BASE VERSION_STRING = 1.0 - LIBRARY_CLASS = TimerLib|DXE_CORE DXE_SMM_DRIVER UEFI_DRIVER UEFI_APPLICATION SMM_CORE + LIBRARY_CLASS = TimerLib|PEI_CORE PEIM DXE_CORE DXE_SMM_DRIVER UEFI_DRIVER UEFI_APPLICATION SMM_CORE CONSTRUCTOR = AcpiTimerLibConstructor [Sources] @@ -31,6 +31,9 @@ MdePkg/MdePkg.dec OvmfPkg/OvmfPkg.dec +[Pcd] + gUefiOvmfPkgTokenSpaceGuid.PcdAcpiPmBaseAddress + [LibraryClasses] BaseLib PciLib diff --git a/OvmfPkg/Library/AcpiTimerLib/BaseRomAcpiTimerLib.inf b/OvmfPkg/Library/AcpiTimerLib/BaseRomAcpiTimerLib.inf index 2a3016ff07..d5e50aef61 100644 --- a/OvmfPkg/Library/AcpiTimerLib/BaseRomAcpiTimerLib.inf +++ b/OvmfPkg/Library/AcpiTimerLib/BaseRomAcpiTimerLib.inf @@ -19,7 +19,7 @@ FILE_GUID = CDD9D74F-213E-4c28-98F7-8B4A167DB936 MODULE_TYPE = BASE VERSION_STRING = 1.0 - LIBRARY_CLASS = TimerLib|SEC PEI_CORE PEIM + LIBRARY_CLASS = TimerLib|SEC CONSTRUCTOR = AcpiTimerLibConstructor [Sources] diff --git a/OvmfPkg/OvmfPkgIa32.dsc b/OvmfPkg/OvmfPkgIa32.dsc index 5baec1cfc8..cd7e252b26 100644 --- a/OvmfPkg/OvmfPkgIa32.dsc +++ b/OvmfPkg/OvmfPkgIa32.dsc @@ -150,7 +150,6 @@ CpuExceptionHandlerLib|UefiCpuPkg/Library/CpuExceptionHandlerLib/SecPeiCpuExceptionHandlerLib.inf [LibraryClasses.common.PEI_CORE] - TimerLib|OvmfPkg/Library/AcpiTimerLib/BaseRomAcpiTimerLib.inf HobLib|MdePkg/Library/PeiHobLib/PeiHobLib.inf PeiServicesTablePointerLib|MdePkg/Library/PeiServicesTablePointerLibIdt/PeiServicesTablePointerLibIdt.inf PeiServicesLib|MdePkg/Library/PeiServicesLib/PeiServicesLib.inf @@ -167,7 +166,6 @@ PeCoffLib|MdePkg/Library/BasePeCoffLib/BasePeCoffLib.inf [LibraryClasses.common.PEIM] - TimerLib|OvmfPkg/Library/AcpiTimerLib/BaseRomAcpiTimerLib.inf HobLib|MdePkg/Library/PeiHobLib/PeiHobLib.inf PeiServicesTablePointerLib|MdePkg/Library/PeiServicesTablePointerLibIdt/PeiServicesTablePointerLibIdt.inf PeiServicesLib|MdePkg/Library/PeiServicesLib/PeiServicesLib.inf diff --git a/OvmfPkg/OvmfPkgIa32X64.dsc b/OvmfPkg/OvmfPkgIa32X64.dsc index c7a18d0907..16f988b1ea 100644 --- a/OvmfPkg/OvmfPkgIa32X64.dsc +++ b/OvmfPkg/OvmfPkgIa32X64.dsc @@ -155,7 +155,6 @@ CpuExceptionHandlerLib|UefiCpuPkg/Library/CpuExceptionHandlerLib/SecPeiCpuExceptionHandlerLib.inf [LibraryClasses.common.PEI_CORE] - TimerLib|OvmfPkg/Library/AcpiTimerLib/BaseRomAcpiTimerLib.inf HobLib|MdePkg/Library/PeiHobLib/PeiHobLib.inf PeiServicesTablePointerLib|MdePkg/Library/PeiServicesTablePointerLibIdt/PeiServicesTablePointerLibIdt.inf PeiServicesLib|MdePkg/Library/PeiServicesLib/PeiServicesLib.inf @@ -172,7 +171,6 @@ PeCoffLib|MdePkg/Library/BasePeCoffLib/BasePeCoffLib.inf [LibraryClasses.common.PEIM] - TimerLib|OvmfPkg/Library/AcpiTimerLib/BaseRomAcpiTimerLib.inf HobLib|MdePkg/Library/PeiHobLib/PeiHobLib.inf PeiServicesTablePointerLib|MdePkg/Library/PeiServicesTablePointerLibIdt/PeiServicesTablePointerLibIdt.inf PeiServicesLib|MdePkg/Library/PeiServicesLib/PeiServicesLib.inf diff --git a/OvmfPkg/OvmfPkgX64.dsc b/OvmfPkg/OvmfPkgX64.dsc index 7cafcaccef..b70985ba22 100644 --- a/OvmfPkg/OvmfPkgX64.dsc +++ b/OvmfPkg/OvmfPkgX64.dsc @@ -155,7 +155,6 @@ CpuExceptionHandlerLib|UefiCpuPkg/Library/CpuExceptionHandlerLib/SecPeiCpuExceptionHandlerLib.inf [LibraryClasses.common.PEI_CORE] - TimerLib|OvmfPkg/Library/AcpiTimerLib/BaseRomAcpiTimerLib.inf HobLib|MdePkg/Library/PeiHobLib/PeiHobLib.inf PeiServicesTablePointerLib|MdePkg/Library/PeiServicesTablePointerLibIdt/PeiServicesTablePointerLibIdt.inf PeiServicesLib|MdePkg/Library/PeiServicesLib/PeiServicesLib.inf @@ -172,7 +171,6 @@ PeCoffLib|MdePkg/Library/BasePeCoffLib/BasePeCoffLib.inf [LibraryClasses.common.PEIM] - TimerLib|OvmfPkg/Library/AcpiTimerLib/BaseRomAcpiTimerLib.inf HobLib|MdePkg/Library/PeiHobLib/PeiHobLib.inf PeiServicesTablePointerLib|MdePkg/Library/PeiServicesTablePointerLibIdt/PeiServicesTablePointerLibIdt.inf PeiServicesLib|MdePkg/Library/PeiServicesLib/PeiServicesLib.inf