]> git.proxmox.com Git - mirror_edk2.git/commitdiff
OvmfPkg: AcpiTimerLib: Use global variable during PEI_CORE and PEIM
authorGabriel Somlo <somlo@cmu.edu>
Fri, 14 Nov 2014 00:38:35 +0000 (00:38 +0000)
committerjljusten <jljusten@Edk2>
Fri, 14 Nov 2014 00:38:35 +0000 (00:38 +0000)
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 <somlo@cmu.edu>
Reviewed-by: Jordan Justen <jordan.l.justen@intel.com>
git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@16377 6f19259b-4bc3-4df7-8a09-765794883524

OvmfPkg/Library/AcpiTimerLib/BaseAcpiTimerLib.c
OvmfPkg/Library/AcpiTimerLib/BaseAcpiTimerLib.inf
OvmfPkg/Library/AcpiTimerLib/BaseRomAcpiTimerLib.inf
OvmfPkg/OvmfPkgIa32.dsc
OvmfPkg/OvmfPkgIa32X64.dsc
OvmfPkg/OvmfPkgX64.dsc

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