On Mon, Oct 27, 2014 at 9:09 PM, Gabriel L. Somlo <gso...@gmail.com> wrote: > Remove local power management register access macros in favor of > factored-out ones in OvmfPkg/Include/OvmfPlatforms.h > > Next, AcpiTimerLib is split out into three instances, for use during > various stages: > > - BaseRom: used during SEC, PEI_CORE, and PEIM; > - Dxe: used during DXE_DRIVER and DXE_RUNTIME_DRIVER; > - Base: used by default during all other stages. > > Most of the code remains in AcpiTimerLib.c, to be shared by all > instances. The two platform-dependent methods (constructor and > InternalAcpiGetTimerTick) are provided separately by source files > specific to each instance, namely [BaseRom|Base|Dxe]AcpiTimerLib.c. > > Since pre-DXE stages can't rely on storing data in global variables, > methods specific to the "BaseRom" instance will call platform > detection macros each time they're invoked. > > The "Base" instance calls platform detection macros only from its > constructor, and caches the address required by InternalAcpiTimerTick > in a global variable. > > The "Dxe" instance is very similar to "Base", except no platform > detection macros are called at all; instead, the platform type is > read via a dynamic PCD set from PlatformPei. > > Contributed-under: TianoCore Contribution Agreement 1.0 > Signed-off-by: Gabriel Somlo <so...@cmu.edu> > --- > OvmfPkg/Library/AcpiTimerLib/AcpiTimerLib.c | 130 > +-------------------- > OvmfPkg/Library/AcpiTimerLib/AcpiTimerLib.inf | 44 ------- > OvmfPkg/Library/AcpiTimerLib/BaseAcpiTimerLib.c | 97 +++++++++++++++ > OvmfPkg/Library/AcpiTimerLib/BaseAcpiTimerLib.inf | 37 ++++++ > OvmfPkg/Library/AcpiTimerLib/BaseRomAcpiTimerLib.c | 128 ++++++++++++++++++++ > .../Library/AcpiTimerLib/BaseRomAcpiTimerLib.inf | 39 +++++++ > OvmfPkg/Library/AcpiTimerLib/DxeAcpiTimerLib.c | 98 ++++++++++++++++ > OvmfPkg/Library/AcpiTimerLib/DxeAcpiTimerLib.inf | 40 +++++++ > OvmfPkg/OvmfPkgIa32.dsc | 20 ++-- > OvmfPkg/OvmfPkgIa32X64.dsc | 20 ++-- > OvmfPkg/OvmfPkgX64.dsc | 20 ++-- > 11 files changed, 469 insertions(+), 204 deletions(-) > delete mode 100644 OvmfPkg/Library/AcpiTimerLib/AcpiTimerLib.inf > create mode 100644 OvmfPkg/Library/AcpiTimerLib/BaseAcpiTimerLib.c > create mode 100644 OvmfPkg/Library/AcpiTimerLib/BaseAcpiTimerLib.inf > create mode 100644 OvmfPkg/Library/AcpiTimerLib/BaseRomAcpiTimerLib.c > create mode 100644 OvmfPkg/Library/AcpiTimerLib/BaseRomAcpiTimerLib.inf > create mode 100644 OvmfPkg/Library/AcpiTimerLib/DxeAcpiTimerLib.c > create mode 100644 OvmfPkg/Library/AcpiTimerLib/DxeAcpiTimerLib.inf > > diff --git a/OvmfPkg/Library/AcpiTimerLib/AcpiTimerLib.c > b/OvmfPkg/Library/AcpiTimerLib/AcpiTimerLib.c > index 7d324cb..1fb70d7 100644 > --- a/OvmfPkg/Library/AcpiTimerLib/AcpiTimerLib.c > +++ b/OvmfPkg/Library/AcpiTimerLib/AcpiTimerLib.c > @@ -14,112 +14,19 @@ > > **/ > > -#include <Base.h> > -#include <Library/TimerLib.h> > -#include <Library/BaseLib.h> > -#include <Library/IoLib.h> > -#include <Library/PciLib.h> > #include <Library/DebugLib.h> > -#include <Library/PcdLib.h> > -#include <IndustryStandard/Pci22.h> > +#include <Library/BaseLib.h> > #include <IndustryStandard/Acpi.h> > > // > -// PCI Location of PIIX4 Power Management PCI Configuration Registers > -// > -#define PIIX4_POWER_MANAGEMENT_BUS 0x00 > -#define PIIX4_POWER_MANAGEMENT_DEVICE 0x01 > -#define PIIX4_POWER_MANAGEMENT_FUNCTION 0x03 > - > -// > -// Macro to access PIIX4 Power Management PCI Configuration Registers > -// > -#define PIIX4_PCI_POWER_MANAGEMENT_REGISTER(Register) \ > - PCI_LIB_ADDRESS ( \ > - PIIX4_POWER_MANAGEMENT_BUS, \ > - PIIX4_POWER_MANAGEMENT_DEVICE, \ > - PIIX4_POWER_MANAGEMENT_FUNCTION, \ > - Register \ > - ) > - > -// > -// PCI Location of Q35 Power Management PCI Configuration Registers > -// > -#define Q35_POWER_MANAGEMENT_BUS 0x00 > -#define Q35_POWER_MANAGEMENT_DEVICE 0x1f > -#define Q35_POWER_MANAGEMENT_FUNCTION 0x00 > - > -// > -// Macro to access Q35 Power Management PCI Configuration Registers > -// > -#define Q35_PCI_POWER_MANAGEMENT_REGISTER(Register) \ > - PCI_LIB_ADDRESS ( \ > - Q35_POWER_MANAGEMENT_BUS, \ > - Q35_POWER_MANAGEMENT_DEVICE, \ > - Q35_POWER_MANAGEMENT_FUNCTION, \ > - Register \ > - ) > - > -// > -// PCI Location of Host Bridge PCI Configuration Registers > -// > -#define HOST_BRIDGE_BUS 0x00 > -#define HOST_BRIDGE_DEVICE 0x00 > -#define HOST_BRIDGE_FUNCTION 0x00 > - > -// > -// Macro to access Host Bridge Configuration Registers > -// > -#define HOST_BRIDGE_REGISTER(Register) \ > - PCI_LIB_ADDRESS ( \ > - HOST_BRIDGE_BUS, \ > - HOST_BRIDGE_DEVICE, \ > - HOST_BRIDGE_FUNCTION, \ > - Register \ > - ) > - > -// > -// Host Bridge Device ID (DID) Register > -// > -#define HOST_BRIDGE_DID HOST_BRIDGE_REGISTER (0x02) > - > -// > -// Host Bridge DID Register values > -// > -#define PCI_DEVICE_ID_INTEL_82441 0x1237 // DID value for PIIX4 > -#define PCI_DEVICE_ID_INTEL_Q35_MCH 0x29C0 // DID value for Q35 > - > -// > -// Access Power Management PCI Config Regs based on Host Bridge type > -// > -#define PCI_POWER_MANAGEMENT_REGISTER(Register) \ > - ((PciRead16 (HOST_BRIDGE_DID) == PCI_DEVICE_ID_INTEL_Q35_MCH) ? \ > - Q35_PCI_POWER_MANAGEMENT_REGISTER (Register) : \ > - PIIX4_PCI_POWER_MANAGEMENT_REGISTER (Register)) > - > -// > -// Power Management PCI Configuration Registers > -// > -#define PMBA PCI_POWER_MANAGEMENT_REGISTER (0x40) > -#define PMBA_RTE BIT0 > -#define PMREGMISC PCI_POWER_MANAGEMENT_REGISTER (0x80) > -#define PMIOSE BIT0 > - > -// > // The ACPI Time is a 24-bit counter > // > #define ACPI_TIMER_COUNT_SIZE BIT24 > > -// > -// Offset in the Power Management Base Address to the ACPI Timer > -// > -#define ACPI_TIMER_OFFSET 0x8 > - > /** > - The constructor function enables ACPI IO space. > + Constructor to initialize this instance of the ACPI Timer Library. > > - If ACPI I/O space not enabled, this function will enable it. > - It will always return RETURN_SUCCESS. > + A constructor is provided by each instance of the Timer Library. > > @retval EFI_SUCCESS The constructor always returns RETURN_SUCCESS. > > @@ -128,31 +35,12 @@ RETURN_STATUS > EFIAPI > AcpiTimerLibConstructor ( > VOID > - ) > -{ > - // > - // 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)(~0x0000FFC0), PcdGet16 > (PcdAcpiPmBaseAddress)); > - > - // > - // Enable PMBA I/O port decodes in PMREGMISC > - // > - PciOr8 (PMREGMISC, PMIOSE); > - } > - > - return RETURN_SUCCESS; > -} > + );
AcpiTimerLibConstructor prototype is not needed. > > /** > Internal function to read the current tick counter of ACPI. > > - Internal function to read the current tick counter of ACPI. > + A version of this function is provided by each instance of the Timer > Library. I don't think this new comment line is needed. I guess it is best to just to delete the duplicated line. Can you move the InternalAcpiGetTimerTick prototype into a .h file? > @return The tick counter read. > > @@ -160,13 +48,7 @@ AcpiTimerLibConstructor ( > UINT32 > InternalAcpiGetTimerTick ( > VOID > - ) > -{ > - // > - // Read PMBA to read and return the current ACPI timer value. > - // > - return IoRead32 ((PciRead32 (PMBA) & ~PMBA_RTE) + ACPI_TIMER_OFFSET); > -} > + ); > > /** > Stalls the CPU for at least the given number of ticks. > diff --git a/OvmfPkg/Library/AcpiTimerLib/AcpiTimerLib.inf > b/OvmfPkg/Library/AcpiTimerLib/AcpiTimerLib.inf > deleted file mode 100644 > index da88668..0000000 > --- a/OvmfPkg/Library/AcpiTimerLib/AcpiTimerLib.inf > +++ /dev/null > @@ -1,44 +0,0 @@ > -## @file > -# ACPI Timer Library Instance. > -# > -# Copyright (c) 2008 - 2010, Intel Corporation. All rights reserved.<BR> > -# This program and the accompanying materials > -# are licensed and made available under the terms and conditions of the BSD > License > -# which accompanies this distribution. The full text of the license may be > found at > -# http://opensource.org/licenses/bsd-license.php > -# > -# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, > -# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR > IMPLIED. > -# > -## > - > -[Defines] > - INF_VERSION = 0x00010005 > - BASE_NAME = AcpiTimerLib > - FILE_GUID = CDD9D74F-213E-4c28-98F7-8B4A167DB936 > - MODULE_TYPE = BASE > - VERSION_STRING = 1.0 > - LIBRARY_CLASS = TimerLib > - > - CONSTRUCTOR = AcpiTimerLibConstructor > - > -# > -# The following information is for reference only and not required by the > build tools. > -# > -# VALID_ARCHITECTURES = IA32 X64 IPF EBC > -# > - > -[Sources] > - AcpiTimerLib.c > - > -[Packages] > - MdePkg/MdePkg.dec > - OvmfPkg/OvmfPkg.dec > - > -[Pcd] > - gUefiOvmfPkgTokenSpaceGuid.PcdAcpiPmBaseAddress > - > -[LibraryClasses] > - BaseLib > - PciLib > - IoLib > diff --git a/OvmfPkg/Library/AcpiTimerLib/BaseAcpiTimerLib.c > b/OvmfPkg/Library/AcpiTimerLib/BaseAcpiTimerLib.c > new file mode 100644 > index 0000000..abf33ab > --- /dev/null > +++ b/OvmfPkg/Library/AcpiTimerLib/BaseAcpiTimerLib.c > @@ -0,0 +1,97 @@ > +/** @file > + Provide constructor and GetTick for Base instance of ACPI Timer Library > + > + Copyright (C) 2014, Gabriel L. Somlo <so...@cmu.edu> > + > + This program and the accompanying materials are licensed and made > + available under the terms and conditions of the BSD License which > + accompanies this distribution. The full text of the license may > + be found at http://opensource.org/licenses/bsd-license.php > + > + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, > + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR > IMPLIED. > +**/ > + > +#include <Library/DebugLib.h> > +#include <Library/IoLib.h> > +#include <Library/PciLib.h> > +#include <OvmfPlatforms.h> > + > +// > +// Power Management PCI Configuration Register fields > +// > +#define PMBA_RTE BIT0 > + > +// > +// Offset in the Power Management Base Address to the ACPI Timer > +// > +#define ACPI_TIMER_OFFSET 0x8 > + > +// > +// Cached ACPI Timer IO Address > +// > +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. > + > + @retval EFI_SUCCESS The constructor always returns RETURN_SUCCESS. > + > +**/ > +RETURN_STATUS > +EFIAPI > +AcpiTimerLibConstructor ( > + VOID > + ) > +{ > + UINT16 HostBridgeDevId; > + UINTN PMBA; Pmba > + // > + // Query Host Bridge DID to determine platform type > + // > + HostBridgeDevId = OVMF_GET_HOSTBRIDGE_DID; > + switch (HostBridgeDevId) { > + case INTEL_82441_DEVICE_ID: > + PMBA = POWER_MGMT_REGISTER_PIIX4 (0x40); > + break; > + case INTEL_Q35_MCH_DEVICE_ID: > + PMBA = POWER_MGMT_REGISTER_Q35 (0x40); > + break; > + default: > + DEBUG ((EFI_D_ERROR, "%a: Unknown Host Bridge Device ID: 0x%04x\n", > + __FUNCTION__, HostBridgeDevId)); > + ASSERT (FALSE); > + } > + > + mAcpiTimerIoAddr = (PciRead32 (PMBA) & ~PMBA_RTE) + ACPI_TIMER_OFFSET; > + > + return RETURN_SUCCESS; > +} > + > +/** > + Internal function to read the current tick counter of ACPI. > + > + Read the current ACPI tick counter using the counter address cached > + by this instance's constructor. > + > + @return The tick counter read. > + > +**/ > +UINT32 > +InternalAcpiGetTimerTick ( > + VOID > + ) > +{ > + // > + // Return the current ACPI timer value. > + // > + return IoRead32 (mAcpiTimerIoAddr); > +} > diff --git a/OvmfPkg/Library/AcpiTimerLib/BaseAcpiTimerLib.inf > b/OvmfPkg/Library/AcpiTimerLib/BaseAcpiTimerLib.inf > new file mode 100644 > index 0000000..35c6edc > --- /dev/null > +++ b/OvmfPkg/Library/AcpiTimerLib/BaseAcpiTimerLib.inf > @@ -0,0 +1,37 @@ > +## @file > +# Base ACPI Timer Library Instance. > +# > +# Copyright (C) 2014, Gabriel L. Somlo <so...@cmu.edu> > +# Copyright (c) 2008 - 2010, Intel Corporation. All rights reserved. > +# > +# This program and the accompanying materials are licensed and made > +# available under the terms and conditions of the BSD License which > +# accompanies this distribution. The full text of the license may > +# be found at http://opensource.org/licenses/bsd-license.php > +# > +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, > +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR > IMPLIED. > +# > +## > + > +[Defines] > + INF_VERSION = 0x00010005 > + BASE_NAME = BaseAcpiTimerLib > + 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 > + CONSTRUCTOR = AcpiTimerLibConstructor > + > +[Sources] > + AcpiTimerLib.c > + BaseAcpiTimerLib.c > + > +[Packages] > + MdePkg/MdePkg.dec > + OvmfPkg/OvmfPkg.dec > + > +[LibraryClasses] > + BaseLib > + PciLib > + IoLib > diff --git a/OvmfPkg/Library/AcpiTimerLib/BaseRomAcpiTimerLib.c > b/OvmfPkg/Library/AcpiTimerLib/BaseRomAcpiTimerLib.c > new file mode 100644 > index 0000000..5a0f01e > --- /dev/null > +++ b/OvmfPkg/Library/AcpiTimerLib/BaseRomAcpiTimerLib.c > @@ -0,0 +1,128 @@ > +/** @file > + Provide constructor and GetTick for BaseRom instance of ACPI Timer Library > + > + Copyright (c) 2008 - 2012, Intel Corporation. All rights reserved. > + Copyright (c) 2011, Andrei Warkentin <andr...@motorola.com> > + > + This program and the accompanying materials are licensed and made > + available under the terms and conditions of the BSD License which > + accompanies this distribution. The full text of the license may > + be found at http://opensource.org/licenses/bsd-license.php > + > + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, > + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR > IMPLIED. > +**/ > + > +#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 > +// > +#define ACPI_TIMER_OFFSET 0x8 > + > +/** > + 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 > + ) > +{ > + UINT16 HostBridgeDevId; > + UINTN PMBA; > + UINTN PMREGMISC; CamelCase > + // > + // Query Host Bridge DID to determine platform type > + // > + HostBridgeDevId = OVMF_GET_HOSTBRIDGE_DID; > + switch (HostBridgeDevId) { > + case INTEL_82441_DEVICE_ID: > + 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); > + PMREGMISC = POWER_MGMT_REGISTER_Q35 (0x80); > + break; > + default: > + DEBUG ((EFI_D_ERROR, "%a: Unknown Host Bridge Device ID: 0x%04x\n", > + __FUNCTION__, HostBridgeDevId)); > + ASSERT (FALSE); > + } > + > + // > + // 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; > +} > + > +/** > + Internal function to read the current tick counter of ACPI. > + > + Dynamically compute the address of the ACPI tick counter based on the > + properties of the underlying platform, to avoid relying on global > variables. > + > + @return The tick counter read. > + > +**/ > +UINT32 > +InternalAcpiGetTimerTick ( > + VOID > + ) > +{ > + UINT16 HostBridgeDevId; > + UINTN PMBA; Pmba > + // > + // Query Host Bridge DID to determine platform type > + // > + HostBridgeDevId = OVMF_GET_HOSTBRIDGE_DID; > + switch (HostBridgeDevId) { > + case INTEL_82441_DEVICE_ID: > + PMBA = POWER_MGMT_REGISTER_PIIX4 (0x40); > + break; > + case INTEL_Q35_MCH_DEVICE_ID: > + PMBA = POWER_MGMT_REGISTER_Q35 (0x40); > + break; > + default: > + DEBUG ((EFI_D_ERROR, "%a: Unknown Host Bridge Device ID: 0x%04x\n", > + __FUNCTION__, HostBridgeDevId)); > + ASSERT (FALSE); > + } > + > + // > + // Read PMBA to read and return the current ACPI timer value. > + // > + return IoRead32 ((PciRead32 (PMBA) & ~PMBA_RTE) + ACPI_TIMER_OFFSET); > +} > diff --git a/OvmfPkg/Library/AcpiTimerLib/BaseRomAcpiTimerLib.inf > b/OvmfPkg/Library/AcpiTimerLib/BaseRomAcpiTimerLib.inf > new file mode 100644 > index 0000000..2a3016f > --- /dev/null > +++ b/OvmfPkg/Library/AcpiTimerLib/BaseRomAcpiTimerLib.inf > @@ -0,0 +1,39 @@ > +## @file > +# BaseRom ACPI Timer Library Instance. > +# > +# Copyright (c) 2008 - 2010, Intel Corporation. All rights reserved. > +# > +# This program and the accompanying materials are licensed and made > +# available under the terms and conditions of the BSD License which > +# accompanies this distribution. The full text of the license may > +# be found at http://opensource.org/licenses/bsd-license.php > +# > +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, > +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR > IMPLIED. > +# > +## > + > +[Defines] > + INF_VERSION = 0x00010005 > + BASE_NAME = BaseRomAcpiTimerLib > + FILE_GUID = CDD9D74F-213E-4c28-98F7-8B4A167DB936 > + MODULE_TYPE = BASE > + VERSION_STRING = 1.0 > + LIBRARY_CLASS = TimerLib|SEC PEI_CORE PEIM > + CONSTRUCTOR = AcpiTimerLibConstructor > + > +[Sources] > + AcpiTimerLib.c > + BaseRomAcpiTimerLib.c > + > +[Packages] > + MdePkg/MdePkg.dec > + OvmfPkg/OvmfPkg.dec > + > +[Pcd] > + gUefiOvmfPkgTokenSpaceGuid.PcdAcpiPmBaseAddress > + > +[LibraryClasses] > + BaseLib > + PciLib > + IoLib > diff --git a/OvmfPkg/Library/AcpiTimerLib/DxeAcpiTimerLib.c > b/OvmfPkg/Library/AcpiTimerLib/DxeAcpiTimerLib.c > new file mode 100644 > index 0000000..c81a91d > --- /dev/null > +++ b/OvmfPkg/Library/AcpiTimerLib/DxeAcpiTimerLib.c > @@ -0,0 +1,98 @@ > +/** @file > + Provide constructor and GetTick for Dxe instance of ACPI Timer Library > + > + Copyright (C) 2014, Gabriel L. Somlo <so...@cmu.edu> > + > + This program and the accompanying materials are licensed and made > + available under the terms and conditions of the BSD License which > + accompanies this distribution. The full text of the license may > + be found at http://opensource.org/licenses/bsd-license.php > + > + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, > + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR > IMPLIED. > +**/ > + > +#include <Library/DebugLib.h> > +#include <Library/IoLib.h> > +#include <Library/PcdLib.h> > +#include <Library/PciLib.h> > +#include <OvmfPlatforms.h> > + > +// > +// Power Management PCI Configuration Register fields > +// > +#define PMBA_RTE BIT0 > + > +// > +// Offset in the Power Management Base Address to the ACPI Timer > +// > +#define ACPI_TIMER_OFFSET 0x8 > + > +// > +// Cached ACPI Timer IO Address > +// > +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. > + > + @retval EFI_SUCCESS The constructor always returns RETURN_SUCCESS. > + > +**/ > +RETURN_STATUS > +EFIAPI > +AcpiTimerLibConstructor ( > + VOID > + ) > +{ > + UINT16 HostBridgeDevId; > + UINTN PMBA; Pmba With these changes: Reviewed-by: Jordan Justen <jordan.l.jus...@intel.com> > + // > + // Query Host Bridge DID to determine platform type > + // > + HostBridgeDevId = PcdGet16 (PcdOvmfHostBridgePciDevId); > + switch (HostBridgeDevId) { > + case INTEL_82441_DEVICE_ID: > + PMBA = POWER_MGMT_REGISTER_PIIX4 (0x40); > + break; > + case INTEL_Q35_MCH_DEVICE_ID: > + PMBA = POWER_MGMT_REGISTER_Q35 (0x40); > + break; > + default: > + DEBUG ((EFI_D_ERROR, "%a: Unknown Host Bridge Device ID: 0x%04x\n", > + __FUNCTION__, HostBridgeDevId)); > + ASSERT (FALSE); > + } > + > + mAcpiTimerIoAddr = (PciRead32 (PMBA) & ~PMBA_RTE) + ACPI_TIMER_OFFSET; > + > + return RETURN_SUCCESS; > +} > + > +/** > + Internal function to read the current tick counter of ACPI. > + > + Read the current ACPI tick counter using the counter address cached > + by this instance's constructor. > + > + @return The tick counter read. > + > +**/ > +UINT32 > +InternalAcpiGetTimerTick ( > + VOID > + ) > +{ > + // > + // Return the current ACPI timer value. > + // > + return IoRead32 (mAcpiTimerIoAddr); > +} > diff --git a/OvmfPkg/Library/AcpiTimerLib/DxeAcpiTimerLib.inf > b/OvmfPkg/Library/AcpiTimerLib/DxeAcpiTimerLib.inf > new file mode 100644 > index 0000000..b7e8bfc > --- /dev/null > +++ b/OvmfPkg/Library/AcpiTimerLib/DxeAcpiTimerLib.inf > @@ -0,0 +1,40 @@ > +## @file > +# DXE ACPI Timer Library Instance. > +# > +# Copyright (C) 2014, Gabriel L. Somlo <so...@cmu.edu> > +# Copyright (c) 2008 - 2010, Intel Corporation. All rights reserved. > +# > +# This program and the accompanying materials are licensed and made > +# available under the terms and conditions of the BSD License which > +# accompanies this distribution. The full text of the license may > +# be found at http://opensource.org/licenses/bsd-license.php > +# > +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, > +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR > IMPLIED. > +# > +## > + > +[Defines] > + INF_VERSION = 0x00010005 > + BASE_NAME = DxeAcpiTimerLib > + FILE_GUID = 52DECA02-2EE8-4EAA-8EAD-1AB83F8A5955 > + MODULE_TYPE = BASE > + VERSION_STRING = 1.0 > + LIBRARY_CLASS = TimerLib|DXE_DRIVER DXE_RUNTIME_DRIVER > + CONSTRUCTOR = AcpiTimerLibConstructor > + > +[Sources] > + AcpiTimerLib.c > + DxeAcpiTimerLib.c > + > +[Packages] > + MdePkg/MdePkg.dec > + OvmfPkg/OvmfPkg.dec > + > +[Pcd] > + gUefiOvmfPkgTokenSpaceGuid.PcdOvmfHostBridgePciDevId > + > +[LibraryClasses] > + BaseLib > + PciLib > + IoLib > diff --git a/OvmfPkg/OvmfPkgIa32.dsc b/OvmfPkg/OvmfPkgIa32.dsc > index 8317814..fac9328 100644 > --- a/OvmfPkg/OvmfPkgIa32.dsc > +++ b/OvmfPkg/OvmfPkgIa32.dsc > @@ -57,7 +57,7 @@ > > ################################################################################ > [LibraryClasses] > PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf > - TimerLib|OvmfPkg/Library/AcpiTimerLib/AcpiTimerLib.inf > + TimerLib|OvmfPkg/Library/AcpiTimerLib/BaseAcpiTimerLib.inf > PrintLib|MdePkg/Library/BasePrintLib/BasePrintLib.inf > BaseMemoryLib|MdePkg/Library/BaseMemoryLibRepStr/BaseMemoryLibRepStr.inf > BaseLib|MdePkg/Library/BaseLib/BaseLib.inf > @@ -131,6 +131,7 @@ > !endif > > [LibraryClasses.common.SEC] > + TimerLib|OvmfPkg/Library/AcpiTimerLib/BaseRomAcpiTimerLib.inf > QemuFwCfgLib|OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgSecLib.inf > !ifdef $(DEBUG_ON_SERIAL_PORT) > DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf > @@ -149,6 +150,7 @@ > > 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 > @@ -165,6 +167,7 @@ > 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 > @@ -203,6 +206,7 @@ > > CpuExceptionHandlerLib|UefiCpuPkg/Library/CpuExceptionHandlerLib/DxeCpuExceptionHandlerLib.inf > > [LibraryClasses.common.DXE_RUNTIME_DRIVER] > + TimerLib|OvmfPkg/Library/AcpiTimerLib/DxeAcpiTimerLib.inf > HobLib|MdePkg/Library/DxeHobLib/DxeHobLib.inf > DxeCoreEntryPoint|MdePkg/Library/DxeCoreEntryPoint/DxeCoreEntryPoint.inf > > MemoryAllocationLib|MdePkg/Library/UefiMemoryAllocationLib/UefiMemoryAllocationLib.inf > @@ -232,6 +236,7 @@ > UefiScsiLib|MdePkg/Library/UefiScsiLib/UefiScsiLib.inf > > [LibraryClasses.common.DXE_DRIVER] > + TimerLib|OvmfPkg/Library/AcpiTimerLib/DxeAcpiTimerLib.inf > HobLib|MdePkg/Library/DxeHobLib/DxeHobLib.inf > PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf > > MemoryAllocationLib|MdePkg/Library/UefiMemoryAllocationLib/UefiMemoryAllocationLib.inf > @@ -406,19 +411,10 @@ > PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf > } > PcAtChipsetPkg/KbcResetDxe/Reset.inf > - MdeModulePkg/Universal/Metronome/Metronome.inf { > - <LibraryClasses> > - TimerLib|OvmfPkg/Library/AcpiTimerLib/AcpiTimerLib.inf > - } > - > - PcAtChipsetPkg/PcatRealTimeClockRuntimeDxe/PcatRealTimeClockRuntimeDxe.inf > { > - <LibraryClasses> > - TimerLib|OvmfPkg/Library/AcpiTimerLib/AcpiTimerLib.inf > - } > - > + MdeModulePkg/Universal/Metronome/Metronome.inf > + PcAtChipsetPkg/PcatRealTimeClockRuntimeDxe/PcatRealTimeClockRuntimeDxe.inf > IntelFrameworkModulePkg/Universal/BdsDxe/BdsDxe.inf { > <LibraryClasses> > - TimerLib|OvmfPkg/Library/AcpiTimerLib/AcpiTimerLib.inf > !ifdef $(CSM_ENABLE) > NULL|OvmfPkg/Csm/CsmSupportLib/CsmSupportLib.inf > !endif > diff --git a/OvmfPkg/OvmfPkgIa32X64.dsc b/OvmfPkg/OvmfPkgIa32X64.dsc > index 1af12c7..a443161 100644 > --- a/OvmfPkg/OvmfPkgIa32X64.dsc > +++ b/OvmfPkg/OvmfPkgIa32X64.dsc > @@ -62,7 +62,7 @@ > > ################################################################################ > [LibraryClasses] > PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf > - TimerLib|OvmfPkg/Library/AcpiTimerLib/AcpiTimerLib.inf > + TimerLib|OvmfPkg/Library/AcpiTimerLib/BaseAcpiTimerLib.inf > PrintLib|MdePkg/Library/BasePrintLib/BasePrintLib.inf > BaseMemoryLib|MdePkg/Library/BaseMemoryLibRepStr/BaseMemoryLibRepStr.inf > BaseLib|MdePkg/Library/BaseLib/BaseLib.inf > @@ -136,6 +136,7 @@ > !endif > > [LibraryClasses.common.SEC] > + TimerLib|OvmfPkg/Library/AcpiTimerLib/BaseRomAcpiTimerLib.inf > QemuFwCfgLib|OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgSecLib.inf > !ifdef $(DEBUG_ON_SERIAL_PORT) > DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf > @@ -154,6 +155,7 @@ > > 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 > @@ -170,6 +172,7 @@ > 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 > @@ -208,6 +211,7 @@ > > CpuExceptionHandlerLib|UefiCpuPkg/Library/CpuExceptionHandlerLib/DxeCpuExceptionHandlerLib.inf > > [LibraryClasses.common.DXE_RUNTIME_DRIVER] > + TimerLib|OvmfPkg/Library/AcpiTimerLib/DxeAcpiTimerLib.inf > HobLib|MdePkg/Library/DxeHobLib/DxeHobLib.inf > DxeCoreEntryPoint|MdePkg/Library/DxeCoreEntryPoint/DxeCoreEntryPoint.inf > > MemoryAllocationLib|MdePkg/Library/UefiMemoryAllocationLib/UefiMemoryAllocationLib.inf > @@ -237,6 +241,7 @@ > UefiScsiLib|MdePkg/Library/UefiScsiLib/UefiScsiLib.inf > > [LibraryClasses.common.DXE_DRIVER] > + TimerLib|OvmfPkg/Library/AcpiTimerLib/DxeAcpiTimerLib.inf > HobLib|MdePkg/Library/DxeHobLib/DxeHobLib.inf > PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf > > MemoryAllocationLib|MdePkg/Library/UefiMemoryAllocationLib/UefiMemoryAllocationLib.inf > @@ -413,19 +418,10 @@ > PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf > } > PcAtChipsetPkg/KbcResetDxe/Reset.inf > - MdeModulePkg/Universal/Metronome/Metronome.inf { > - <LibraryClasses> > - TimerLib|OvmfPkg/Library/AcpiTimerLib/AcpiTimerLib.inf > - } > - > - PcAtChipsetPkg/PcatRealTimeClockRuntimeDxe/PcatRealTimeClockRuntimeDxe.inf > { > - <LibraryClasses> > - TimerLib|OvmfPkg/Library/AcpiTimerLib/AcpiTimerLib.inf > - } > - > + MdeModulePkg/Universal/Metronome/Metronome.inf > + PcAtChipsetPkg/PcatRealTimeClockRuntimeDxe/PcatRealTimeClockRuntimeDxe.inf > IntelFrameworkModulePkg/Universal/BdsDxe/BdsDxe.inf { > <LibraryClasses> > - TimerLib|OvmfPkg/Library/AcpiTimerLib/AcpiTimerLib.inf > !ifdef $(CSM_ENABLE) > NULL|OvmfPkg/Csm/CsmSupportLib/CsmSupportLib.inf > !endif > diff --git a/OvmfPkg/OvmfPkgX64.dsc b/OvmfPkg/OvmfPkgX64.dsc > index ea08567..8943f2e 100644 > --- a/OvmfPkg/OvmfPkgX64.dsc > +++ b/OvmfPkg/OvmfPkgX64.dsc > @@ -62,7 +62,7 @@ > > ################################################################################ > [LibraryClasses] > PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf > - TimerLib|OvmfPkg/Library/AcpiTimerLib/AcpiTimerLib.inf > + TimerLib|OvmfPkg/Library/AcpiTimerLib/BaseAcpiTimerLib.inf > PrintLib|MdePkg/Library/BasePrintLib/BasePrintLib.inf > BaseMemoryLib|MdePkg/Library/BaseMemoryLibRepStr/BaseMemoryLibRepStr.inf > BaseLib|MdePkg/Library/BaseLib/BaseLib.inf > @@ -136,6 +136,7 @@ > !endif > > [LibraryClasses.common.SEC] > + TimerLib|OvmfPkg/Library/AcpiTimerLib/BaseRomAcpiTimerLib.inf > QemuFwCfgLib|OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgSecLib.inf > !ifdef $(DEBUG_ON_SERIAL_PORT) > DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf > @@ -154,6 +155,7 @@ > > 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 > @@ -170,6 +172,7 @@ > 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 > @@ -208,6 +211,7 @@ > > CpuExceptionHandlerLib|UefiCpuPkg/Library/CpuExceptionHandlerLib/DxeCpuExceptionHandlerLib.inf > > [LibraryClasses.common.DXE_RUNTIME_DRIVER] > + TimerLib|OvmfPkg/Library/AcpiTimerLib/DxeAcpiTimerLib.inf > HobLib|MdePkg/Library/DxeHobLib/DxeHobLib.inf > DxeCoreEntryPoint|MdePkg/Library/DxeCoreEntryPoint/DxeCoreEntryPoint.inf > > MemoryAllocationLib|MdePkg/Library/UefiMemoryAllocationLib/UefiMemoryAllocationLib.inf > @@ -237,6 +241,7 @@ > UefiScsiLib|MdePkg/Library/UefiScsiLib/UefiScsiLib.inf > > [LibraryClasses.common.DXE_DRIVER] > + TimerLib|OvmfPkg/Library/AcpiTimerLib/DxeAcpiTimerLib.inf > HobLib|MdePkg/Library/DxeHobLib/DxeHobLib.inf > PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf > > MemoryAllocationLib|MdePkg/Library/UefiMemoryAllocationLib/UefiMemoryAllocationLib.inf > @@ -411,19 +416,10 @@ > PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf > } > PcAtChipsetPkg/KbcResetDxe/Reset.inf > - MdeModulePkg/Universal/Metronome/Metronome.inf { > - <LibraryClasses> > - TimerLib|OvmfPkg/Library/AcpiTimerLib/AcpiTimerLib.inf > - } > - > - PcAtChipsetPkg/PcatRealTimeClockRuntimeDxe/PcatRealTimeClockRuntimeDxe.inf > { > - <LibraryClasses> > - TimerLib|OvmfPkg/Library/AcpiTimerLib/AcpiTimerLib.inf > - } > - > + MdeModulePkg/Universal/Metronome/Metronome.inf > + PcAtChipsetPkg/PcatRealTimeClockRuntimeDxe/PcatRealTimeClockRuntimeDxe.inf > IntelFrameworkModulePkg/Universal/BdsDxe/BdsDxe.inf { > <LibraryClasses> > - TimerLib|OvmfPkg/Library/AcpiTimerLib/AcpiTimerLib.inf > !ifdef $(CSM_ENABLE) > NULL|OvmfPkg/Csm/CsmSupportLib/CsmSupportLib.inf > !endif > -- > 1.9.3 > ------------------------------------------------------------------------------ _______________________________________________ edk2-devel mailing list edk2-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/edk2-devel