]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/Acpi/S3SaveStateDxe/AcpiS3ContextSave.c
MdeModulePkg: Replace BSD License with BSD+Patent License
[mirror_edk2.git] / MdeModulePkg / Universal / Acpi / S3SaveStateDxe / AcpiS3ContextSave.c
index a973d2db059a73a68399de2a8e9f0e0844fbb08d..e7cd2a12a0b4ac428e72809ffcdd5ce21e421a63 100644 (file)
@@ -1,16 +1,9 @@
 /** @file\r
   This is the implementation to save ACPI S3 Context.\r
 \r
-Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>\r
 \r
-This program and the accompanying materials\r
-are licensed and made available under the terms and conditions\r
-of the BSD License which accompanies this distribution.  The\r
-full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php\r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
 **/\r
 \r
@@ -22,8 +15,8 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 #include <Library/LockBoxLib.h>\r
 #include <Library/PcdLib.h>\r
 #include <Library/DebugLib.h>\r
+#include <Library/UefiLib.h>\r
 #include <Guid/AcpiS3Context.h>\r
-#include <Guid/Acpi.h>\r
 #include <IndustryStandard/Acpi.h>\r
 #include <Protocol/LockBox.h>\r
 \r
@@ -43,7 +36,7 @@ EFI_GUID              mAcpiS3IdtrProfileGuid = {
 \r
   @param  MemoryType   Memory type of memory to allocate.\r
   @param  Size         Size of memory to allocate.\r
-  \r
+\r
   @return Allocated address for output.\r
 \r
 **/\r
@@ -75,208 +68,6 @@ AllocateMemoryBelow4G (
   return Buffer;\r
 }\r
 \r
-/**\r
-\r
-  This function scan ACPI table in RSDT.\r
-\r
-  @param Rsdt      ACPI RSDT\r
-  @param Signature ACPI table signature\r
-\r
-  @return ACPI table\r
-\r
-**/\r
-VOID *\r
-ScanTableInRSDT (\r
-  IN EFI_ACPI_DESCRIPTION_HEADER    *Rsdt,\r
-  IN UINT32                         Signature\r
-  )\r
-{\r
-  UINTN                              Index;\r
-  UINT32                             EntryCount;\r
-  UINT32                             *EntryPtr;\r
-  EFI_ACPI_DESCRIPTION_HEADER        *Table;\r
-\r
-  if (Rsdt == NULL) {\r
-    return NULL;\r
-  }\r
-\r
-  EntryCount = (Rsdt->Length - sizeof (EFI_ACPI_DESCRIPTION_HEADER)) / sizeof(UINT32);\r
-  \r
-  EntryPtr = (UINT32 *)(Rsdt + 1);\r
-  for (Index = 0; Index < EntryCount; Index ++, EntryPtr ++) {\r
-    Table = (EFI_ACPI_DESCRIPTION_HEADER *)((UINTN)(*EntryPtr));\r
-    if (Table->Signature == Signature) {\r
-      return Table;\r
-    }\r
-  }\r
-  \r
-  return NULL;\r
-}\r
-\r
-/**\r
-\r
-  This function scan ACPI table in XSDT.\r
-\r
-  @param Xsdt      ACPI XSDT\r
-  @param Signature ACPI table signature\r
-\r
-  @return ACPI table\r
-\r
-**/\r
-VOID *\r
-ScanTableInXSDT (\r
-  IN EFI_ACPI_DESCRIPTION_HEADER    *Xsdt,\r
-  IN UINT32                         Signature\r
-  )\r
-{\r
-  UINTN                          Index;\r
-  UINT32                         EntryCount;\r
-  UINT64                         EntryPtr;\r
-  UINTN                          BasePtr;\r
-  EFI_ACPI_DESCRIPTION_HEADER    *Table;\r
-\r
-  if (Xsdt == NULL) {\r
-    return NULL;\r
-  }\r
-\r
-  EntryCount = (Xsdt->Length - sizeof (EFI_ACPI_DESCRIPTION_HEADER)) / sizeof(UINT64);\r
-  \r
-  BasePtr = (UINTN)(Xsdt + 1);\r
-  for (Index = 0; Index < EntryCount; Index ++) {\r
-    CopyMem (&EntryPtr, (VOID *)(BasePtr + Index * sizeof(UINT64)), sizeof(UINT64));\r
-    Table = (EFI_ACPI_DESCRIPTION_HEADER *)((UINTN)(EntryPtr));\r
-    if (Table->Signature == Signature) {\r
-      return Table;\r
-    }\r
-  }\r
-  \r
-  return NULL;\r
-}\r
-\r
-/**\r
-  To find Facs in FADT.\r
-\r
-  @param Fadt   FADT table pointer\r
-  \r
-  @return  Facs table pointer.\r
-**/\r
-EFI_ACPI_2_0_FIRMWARE_ACPI_CONTROL_STRUCTURE  *\r
-FindAcpiFacsFromFadt (\r
-  IN EFI_ACPI_2_0_FIXED_ACPI_DESCRIPTION_TABLE     *Fadt\r
-  )\r
-{\r
-  EFI_ACPI_2_0_FIRMWARE_ACPI_CONTROL_STRUCTURE  *Facs;\r
-  UINT64                                        Data64;\r
-\r
-  if (Fadt == NULL) {\r
-    return NULL;\r
-  }\r
-\r
-  if (Fadt->Header.Revision < EFI_ACPI_2_0_FIXED_ACPI_DESCRIPTION_TABLE_REVISION) {\r
-    Facs = (EFI_ACPI_2_0_FIRMWARE_ACPI_CONTROL_STRUCTURE *)(UINTN)Fadt->FirmwareCtrl;\r
-  } else {\r
-    if (Fadt->FirmwareCtrl != 0) {\r
-      Facs = (EFI_ACPI_2_0_FIRMWARE_ACPI_CONTROL_STRUCTURE *)(UINTN)Fadt->FirmwareCtrl;\r
-    } else {\r
-      CopyMem (&Data64, &Fadt->XFirmwareCtrl, sizeof(UINT64));\r
-      Facs = (EFI_ACPI_2_0_FIRMWARE_ACPI_CONTROL_STRUCTURE *)(UINTN)Data64;\r
-    }\r
-  }\r
-  return Facs;\r
-}\r
-\r
-/**\r
-  To find Facs in Acpi tables.\r
\r
-  To find Firmware ACPI control strutcure in Acpi Tables since the S3 waking vector is stored \r
-  in the table.\r
-\r
-  @param AcpiTableGuid   The guid used to find ACPI table in UEFI ConfigurationTable.\r
-  \r
-  @return  Facs table pointer.\r
-**/\r
-EFI_ACPI_2_0_FIRMWARE_ACPI_CONTROL_STRUCTURE  *\r
-FindAcpiFacsTableByAcpiGuid (\r
-  IN EFI_GUID  *AcpiTableGuid\r
-  )\r
-{\r
-  EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER  *Rsdp;\r
-  EFI_ACPI_DESCRIPTION_HEADER                   *Rsdt;\r
-  EFI_ACPI_DESCRIPTION_HEADER                   *Xsdt;\r
-  EFI_ACPI_2_0_FIXED_ACPI_DESCRIPTION_TABLE     *Fadt;\r
-  EFI_ACPI_2_0_FIRMWARE_ACPI_CONTROL_STRUCTURE  *Facs;\r
-  UINTN                                         Index;\r
-\r
-  Rsdp  = NULL;\r
-  //\r
-  // found ACPI table RSD_PTR from system table\r
-  //\r
-  for (Index = 0; Index < gST->NumberOfTableEntries; Index++) {\r
-    if (CompareGuid (&(gST->ConfigurationTable[Index].VendorGuid), AcpiTableGuid)) {\r
-      //\r
-      // A match was found.\r
-      //\r
-      Rsdp = gST->ConfigurationTable[Index].VendorTable;\r
-      break;\r
-    }\r
-  }\r
-\r
-  if (Rsdp == NULL) {\r
-    return NULL;\r
-  }\r
-\r
-  //\r
-  // Search XSDT\r
-  //\r
-  if (Rsdp->Revision >= EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER_REVISION) {\r
-    Xsdt = (EFI_ACPI_DESCRIPTION_HEADER *)(UINTN) Rsdp->XsdtAddress;\r
-    Fadt = ScanTableInXSDT (Xsdt, EFI_ACPI_2_0_FIXED_ACPI_DESCRIPTION_TABLE_SIGNATURE);\r
-    if (Fadt != NULL) {\r
-      Facs = FindAcpiFacsFromFadt (Fadt);\r
-      if (Facs != NULL) {\r
-        return Facs;\r
-      }\r
-    }\r
-  }\r
-\r
-  //\r
-  // Search RSDT\r
-  //\r
-  Rsdt = (EFI_ACPI_DESCRIPTION_HEADER *)(UINTN) Rsdp->RsdtAddress;\r
-  Fadt = ScanTableInRSDT (Rsdt, EFI_ACPI_2_0_FIXED_ACPI_DESCRIPTION_TABLE_SIGNATURE);\r
-  if (Fadt != NULL) {\r
-    Facs = FindAcpiFacsFromFadt (Fadt);\r
-    if (Facs != NULL) {\r
-      return Facs;\r
-    }\r
-  }\r
-\r
-  return NULL;\r
-}\r
-\r
-/**\r
-  To find Facs in Acpi tables.\r
\r
-  To find Firmware ACPI control strutcure in Acpi Tables since the S3 waking vector is stored \r
-  in the table.\r
-  \r
-  @return  Facs table pointer.\r
-**/\r
-EFI_ACPI_2_0_FIRMWARE_ACPI_CONTROL_STRUCTURE  *\r
-FindAcpiFacsTable (\r
-  VOID\r
-  )\r
-{\r
-  EFI_ACPI_2_0_FIRMWARE_ACPI_CONTROL_STRUCTURE *Facs;\r
-\r
-  Facs = FindAcpiFacsTableByAcpiGuid (&gEfiAcpi20TableGuid);\r
-  if (Facs != NULL) {\r
-    return Facs;\r
-  }\r
-\r
-  return FindAcpiFacsTableByAcpiGuid (&gEfiAcpi10TableGuid);\r
-}\r
-\r
 /**\r
   The function will check if long mode waking vector is supported.\r
 \r
@@ -315,20 +106,20 @@ IsLongModeWakingVectorSupport (
 \r
   @param[in] LongModeWakingVectorSupport    Support long mode waking vector or not.\r
 \r
-  If BootScriptExector driver will run in 64-bit mode, this function will establish the 1:1 \r
+  If BootScriptExector driver will run in 64-bit mode, this function will establish the 1:1\r
   virtual to physical mapping page table when long mode waking vector is supported, otherwise\r
   create 4G page table when long mode waking vector is not supported and let PF handler to\r
   handle > 4G request.\r
-  If BootScriptExector driver will not run in 64-bit mode, this function will do nothing. \r
-  \r
-  @return Page table base address. \r
+  If BootScriptExector driver will not run in 64-bit mode, this function will do nothing.\r
+\r
+  @return Page table base address.\r
 \r
 **/\r
 EFI_PHYSICAL_ADDRESS\r
 S3AllocatePageTablesBuffer (\r
   IN BOOLEAN    LongModeWakingVectorSupport\r
   )\r
-{  \r
+{\r
   if (FeaturePcdGet (PcdDxeIplSwitchToLongMode)) {\r
     UINTN                                         ExtraPageTablePages;\r
     UINT32                                        RegEax;\r
@@ -401,13 +192,13 @@ S3AllocatePageTablesBuffer (
     // We need calculate whole page size then allocate once, because S3 restore page table does not know each page in Nvs.\r
     //\r
     if (!Page1GSupport) {\r
-      TotalPageTableSize = (UINTN)(1 + NumberOfPml4EntriesNeeded + NumberOfPml4EntriesNeeded * NumberOfPdpEntriesNeeded);\r
+      TotalPageTableSize = 1 + NumberOfPml4EntriesNeeded + NumberOfPml4EntriesNeeded * NumberOfPdpEntriesNeeded;\r
     } else {\r
-      TotalPageTableSize = (UINTN)(1 + NumberOfPml4EntriesNeeded);\r
+      TotalPageTableSize = 1 + NumberOfPml4EntriesNeeded;\r
     }\r
 \r
     TotalPageTableSize += ExtraPageTablePages;\r
-    DEBUG ((EFI_D_ERROR, "AcpiS3ContextSave TotalPageTableSize - 0x%x pages\n", TotalPageTableSize));\r
+    DEBUG ((DEBUG_INFO, "AcpiS3ContextSave TotalPageTableSize - 0x%x pages\n", TotalPageTableSize));\r
 \r
     //\r
     // By architecture only one PageMapLevel4 exists - so lets allocate storage for it.\r
@@ -419,7 +210,7 @@ S3AllocatePageTablesBuffer (
     //\r
     // If DXE is running 32-bit mode, no need to establish page table.\r
     //\r
-    return  (EFI_PHYSICAL_ADDRESS) 0;  \r
+    return  (EFI_PHYSICAL_ADDRESS) 0;\r
   }\r
 }\r
 \r
@@ -460,7 +251,9 @@ AcpiS3ContextSaveOnEndOfDxe (
   //\r
   // Get ACPI Table because we will save its position to variable\r
   //\r
-  Facs = (EFI_ACPI_4_0_FIRMWARE_ACPI_CONTROL_STRUCTURE *) FindAcpiFacsTable ();\r
+  Facs = (EFI_ACPI_4_0_FIRMWARE_ACPI_CONTROL_STRUCTURE *) EfiLocateFirstAcpiTable (\r
+                                                            EFI_ACPI_4_0_FIRMWARE_ACPI_CONTROL_STRUCTURE_SIGNATURE\r
+                                                            );\r
   AcpiS3Context->AcpiFacsTable = (EFI_PHYSICAL_ADDRESS) (UINTN) Facs;\r
   ASSERT (AcpiS3Context->AcpiFacsTable != 0);\r
 \r