summaryrefslogtreecommitdiff
path: root/OvmfPkg/Library
diff options
context:
space:
mode:
Diffstat (limited to 'OvmfPkg/Library')
-rw-r--r--OvmfPkg/Library/AcpiTimerLib/BaseAcpiTimerLib.c35
-rw-r--r--OvmfPkg/Library/AcpiTimerLib/BaseAcpiTimerLib.inf5
-rw-r--r--OvmfPkg/Library/AcpiTimerLib/BaseRomAcpiTimerLib.inf2
3 files changed, 30 insertions, 12 deletions
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 <Library/DebugLib.h>
#include <Library/IoLib.h>
#include <Library/PciLib.h>
+#include <Library/PcdLib.h>
#include <OvmfPlatforms.h>
//
// 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]