]> git.proxmox.com Git - mirror_edk2.git/commitdiff
ACPI4.0/5.0 have clear description:
authorjyao1 <jyao1@6f19259b-4bc3-4df7-8a09-765794883524>
Fri, 30 Nov 2012 09:03:15 +0000 (09:03 +0000)
committerjyao1 <jyao1@6f19259b-4bc3-4df7-8a09-765794883524>
Fri, 30 Nov 2012 09:03:15 +0000 (09:03 +0000)
FIRMWARE_CTRL: If the X_FIRMWARE_CTRL field contains a non zero value then this field must be zero.
X_FIRMWARE_CTRL: This field is used when the physical address of the FACS is above 4GB. If the FIRMWARE_CTRL field contains a non zero value then this field must be zero.

Update code in AcpiSupport/AcpiTable when it produces this field to set one only.
Update code in AcpiS3Save when it consumes this field, check 0 value.

Signed-off-by: jiewen.yao@intel.com
Reviewed-by: star.zeng@intel.com
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@13980 6f19259b-4bc3-4df7-8a09-765794883524

IntelFrameworkModulePkg/Universal/Acpi/AcpiS3SaveDxe/AcpiS3Save.c
IntelFrameworkModulePkg/Universal/Acpi/AcpiSupportDxe/AcpiSupportAcpiSupportProtocol.c
MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableProtocol.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
index a54cffb169fb844e495b9627823ea3a982a4e65c..107db88ed3ebfec5426229304b20bb10a71fee56 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
   ACPI Support Protocol implementation\r
 \r
-Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2006 - 2012, 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
@@ -776,14 +776,24 @@ AddTableToList (
 \r
       //\r
       // Update pointers in FADT.  If tables don't exist this will put NULL pointers there.\r
+      // Note: If the FIRMWARE_CTRL is non-zero, then X_FIRMWARE_CTRL must be zero, and \r
+      // vice-versa.\r
       //\r
-      AcpiSupportInstance->Fadt3->FirmwareCtrl  = (UINT32) (UINTN) AcpiSupportInstance->Facs3;\r
-      Buffer64 = (UINT64) (UINTN) AcpiSupportInstance->Facs3;\r
-      CopyMem (\r
-        &AcpiSupportInstance->Fadt3->XFirmwareCtrl,\r
-        &Buffer64,\r
-        sizeof (UINT64)\r
-        );\r
+      if ((UINT64)(UINTN)AcpiSupportInstance->Facs3 < BASE_4GB) {\r
+        AcpiSupportInstance->Fadt3->FirmwareCtrl = (UINT32) (UINTN) AcpiSupportInstance->Facs3;\r
+        ZeroMem (\r
+          &AcpiSupportInstance->Fadt3->XFirmwareCtrl,\r
+          sizeof (UINT64)\r
+          );\r
+      } else {\r
+        AcpiSupportInstance->Fadt3->FirmwareCtrl = 0;\r
+        Buffer64 = (UINT64) (UINTN) AcpiSupportInstance->Facs3;\r
+        CopyMem (\r
+          &AcpiSupportInstance->Fadt3->XFirmwareCtrl,\r
+          &Buffer64,\r
+          sizeof (UINT64)\r
+          );\r
+      }\r
       AcpiSupportInstance->Fadt3->Dsdt  = (UINT32) (UINTN) AcpiSupportInstance->Dsdt3;\r
       Buffer64                          = (UINT64) (UINTN) AcpiSupportInstance->Dsdt3;\r
       CopyMem (\r
@@ -900,13 +910,20 @@ AddTableToList (
       // If FADT already exists, update table pointers.\r
       //\r
       if (AcpiSupportInstance->Fadt3 != NULL) {\r
-        AcpiSupportInstance->Fadt3->FirmwareCtrl  = (UINT32) (UINTN) AcpiSupportInstance->Facs3;\r
-        Buffer64 = (UINT64) (UINTN) AcpiSupportInstance->Facs3;\r
-        CopyMem (\r
-          &AcpiSupportInstance->Fadt3->XFirmwareCtrl,\r
-          &Buffer64,\r
-          sizeof (UINT64)\r
-          );\r
+        //\r
+        // Note: If the FIRMWARE_CTRL is non-zero, then X_FIRMWARE_CTRL must be zero, and \r
+        // vice-versa.\r
+        //\r
+        if ((UINT64)(UINTN)AcpiSupportInstance->Facs3 < BASE_4GB) {\r
+          AcpiSupportInstance->Fadt3->FirmwareCtrl  = (UINT32) (UINTN) AcpiSupportInstance->Facs3;\r
+        } else {\r
+          Buffer64 = (UINT64) (UINTN) AcpiSupportInstance->Facs3;\r
+          CopyMem (\r
+            &AcpiSupportInstance->Fadt3->XFirmwareCtrl,\r
+            &Buffer64,\r
+            sizeof (UINT64)\r
+            );\r
+        }\r
 \r
         //\r
         // Checksum FADT table\r
index 6505de8bede51ee3f1817a7c57414178196c13a1..dfd1669ab1070acb92294638484bddc0474f0f9c 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
   ACPI Table Protocol Implementation\r
 \r
-  Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.<BR>\r
+  Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.<BR>\r
   This program and the accompanying materials\r
   are licensed and made available under the terms and conditions of the BSD License\r
   which accompanies this distribution.  The full text of the license may be found at\r
@@ -717,14 +717,19 @@ AddTableToList (
 \r
       //\r
       // Update pointers in FADT.  If tables don't exist this will put NULL pointers there.\r
+      // Note: If the FIRMWARE_CTRL is non-zero, then X_FIRMWARE_CTRL must be zero, and \r
+      // vice-versa.\r
       //\r
-      AcpiTableInstance->Fadt3->FirmwareCtrl  = (UINT32) (UINTN) AcpiTableInstance->Facs3;\r
-      Buffer64 = (UINT64) (UINTN) AcpiTableInstance->Facs3;\r
-      CopyMem (\r
-        &AcpiTableInstance->Fadt3->XFirmwareCtrl,\r
-        &Buffer64,\r
-        sizeof (UINT64)\r
-        );\r
+      if ((UINT64)(UINTN)AcpiSupportInstance->Facs3 < BASE_4GB) {\r
+        AcpiTableInstance->Fadt3->FirmwareCtrl  = (UINT32) (UINTN) AcpiTableInstance->Facs3;\r
+      } else {\r
+        Buffer64 = (UINT64) (UINTN) AcpiTableInstance->Facs3;\r
+        CopyMem (\r
+          &AcpiTableInstance->Fadt3->XFirmwareCtrl,\r
+          &Buffer64,\r
+          sizeof (UINT64)\r
+          );\r
+      }\r
       AcpiTableInstance->Fadt3->Dsdt  = (UINT32) (UINTN) AcpiTableInstance->Dsdt3;\r
       Buffer64                          = (UINT64) (UINTN) AcpiTableInstance->Dsdt3;\r
       CopyMem (\r
@@ -840,13 +845,20 @@ AddTableToList (
       // If FADT already exists, update table pointers.\r
       //\r
       if (AcpiTableInstance->Fadt3 != NULL) {\r
-        AcpiTableInstance->Fadt3->FirmwareCtrl  = (UINT32) (UINTN) AcpiTableInstance->Facs3;\r
-        Buffer64 = (UINT64) (UINTN) AcpiTableInstance->Facs3;\r
-        CopyMem (\r
-          &AcpiTableInstance->Fadt3->XFirmwareCtrl,\r
-          &Buffer64,\r
-          sizeof (UINT64)\r
-          );\r
+        //\r
+        // Note: If the FIRMWARE_CTRL is non-zero, then X_FIRMWARE_CTRL must be zero, and \r
+        // vice-versa.\r
+        //\r
+        if ((UINT64)(UINTN)AcpiSupportInstance->Facs3 < BASE_4GB) {\r
+          AcpiTableInstance->Fadt3->FirmwareCtrl  = (UINT32) (UINTN) AcpiTableInstance->Facs3;\r
+        } else {\r
+          Buffer64 = (UINT64) (UINTN) AcpiTableInstance->Facs3;\r
+          CopyMem (\r
+            &AcpiTableInstance->Fadt3->XFirmwareCtrl,\r
+            &Buffer64,\r
+            sizeof (UINT64)\r
+            );\r
+        }\r
 \r
         //\r
         // Checksum FADT table\r