On 2014-11-08 14:02:00, Gabriel L. Somlo wrote: > Since in OVMF both PEI_CORE and PEIM run from RAM, and thus may > utilize global variables, use the "Base" AcpiTimerLib instance > (instead of BaseRom) to take advantage of the improved efficiency > of storing the timer register IO address in a global variable. > > This leaves only SEC using the BaseRomAcpiTimerLib instance. > > Contributed-under: TianoCore Contribution Agreement 1.0 > Signed-off-by: Gabriel Somlo <so...@cmu.edu> > --- > OvmfPkg/Library/AcpiTimerLib/BaseAcpiTimerLib.c | 35 > +++++++++++++++------- > OvmfPkg/Library/AcpiTimerLib/BaseAcpiTimerLib.inf | 5 +++- > .../Library/AcpiTimerLib/BaseRomAcpiTimerLib.inf | 2 +- > OvmfPkg/OvmfPkgIa32.dsc | 2 -- > OvmfPkg/OvmfPkgIa32X64.dsc | 2 -- > OvmfPkg/OvmfPkgX64.dsc | 2 -- > 6 files changed, 30 insertions(+), 18 deletions(-) > > diff --git a/OvmfPkg/Library/AcpiTimerLib/BaseAcpiTimerLib.c > b/OvmfPkg/Library/AcpiTimerLib/BaseAcpiTimerLib.c > index 8612ace..2faf3be 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", > @@ -73,6 +72,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);
Wouldn't the 'Rom' version program this during SEC? I don't think we should access the PCD in BaseAcpiTimerLib. -Jordan > + } > + > return RETURN_SUCCESS; > } > > diff --git a/OvmfPkg/Library/AcpiTimerLib/BaseAcpiTimerLib.inf > b/OvmfPkg/Library/AcpiTimerLib/BaseAcpiTimerLib.inf > index 35c6edc..43ffc8a 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 2a3016f..d5e50ae 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 5baec1c..cd7e252 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 c7a18d0..16f988b 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 7cafcac..b70985b 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 > -- > 1.9.3 > > > ------------------------------------------------------------------------------ > _______________________________________________ > edk2-devel mailing list > edk2-devel@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/edk2-devel ------------------------------------------------------------------------------ _______________________________________________ edk2-devel mailing list edk2-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/edk2-devel