]> git.proxmox.com Git - mirror_edk2.git/blobdiff - IntelFrameworkModulePkg/Universal/Acpi/AcpiS3SaveDxe/AcpiS3Save.c
ACPI4.0/5.0 have clear description:
[mirror_edk2.git] / IntelFrameworkModulePkg / Universal / Acpi / AcpiS3SaveDxe / AcpiS3Save.c
index bcd1882d7f3326b42d82d212cd43350f494da4a6..38226d0dc24f0dab91fb3d26fb7713e5ee8420bf 100644 (file)
@@ -100,6 +100,116 @@ 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
@@ -117,13 +227,12 @@ FindAcpiFacsTableByAcpiGuid (
 {\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
-  UINT32                                        Data32;\r
+\r
   Rsdp  = NULL;\r
-  Rsdt  = NULL;\r
-  Fadt  = NULL;\r
   //\r
   // found ACPI table RSD_PTR from system table\r
   //\r
@@ -141,27 +250,33 @@ FindAcpiFacsTableByAcpiGuid (
     return NULL;\r
   }\r
 \r
-  Rsdt = (EFI_ACPI_DESCRIPTION_HEADER *)(UINTN) Rsdp->RsdtAddress;\r
-  if (Rsdt == NULL || Rsdt->Signature != EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_TABLE_SIGNATURE) {\r
-    return NULL;\r
-  }\r
-\r
-  for (Index = sizeof (EFI_ACPI_DESCRIPTION_HEADER); Index < Rsdt->Length; Index = Index + sizeof (UINT32)) {\r
-\r
-    Data32  = *(UINT32 *) ((UINT8 *) Rsdt + Index);\r
-    Fadt    = (EFI_ACPI_2_0_FIXED_ACPI_DESCRIPTION_TABLE *) (UINT32 *) (UINTN) Data32;\r
-    if (Fadt->Header.Signature == EFI_ACPI_2_0_FIXED_ACPI_DESCRIPTION_TABLE_SIGNATURE) {\r
-      break;\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
-  if (Fadt == NULL || Fadt->Header.Signature != EFI_ACPI_2_0_FIXED_ACPI_DESCRIPTION_TABLE_SIGNATURE) {\r
-    return NULL;\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
-  Facs = (EFI_ACPI_2_0_FIRMWARE_ACPI_CONTROL_STRUCTURE *)(UINTN)Fadt->FirmwareCtrl;\r
-\r
-  return Facs;\r
+  return NULL;\r
 }\r
 \r
 /**\r