]> git.proxmox.com Git - mirror_edk2.git/blobdiff - IntelFrameworkModulePkg/Universal/Acpi/AcpiSupportDxe/AcpiSupportAcpiSupportProtocol.c
MdeModulePkg/IntelFrameworkModulePkg ACPI: Follow the new UEFI 2.4a spec to return...
[mirror_edk2.git] / IntelFrameworkModulePkg / Universal / Acpi / AcpiSupportDxe / AcpiSupportAcpiSupportProtocol.c
index 1a28f0293347c45d57d3020f8e81452095285a80..6443c3acd0e9de7feec8c324f11faa7b38f8bed4 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 - 2014, 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
@@ -375,6 +375,9 @@ PublishTables (
                                  and the size field embedded in the ACPI table pointed to by AcpiTableBuffer\r
                                  are not in sync.\r
   @return EFI_OUT_OF_RESOURCES   Insufficient resources exist to complete the request.\r
+  @retval EFI_ACCESS_DENIED      The table signature matches a table already\r
+                                 present in the system and platform policy\r
+                                 does not allow duplicate tables of this type.\r
 \r
 **/\r
 EFI_STATUS\r
@@ -390,8 +393,6 @@ InstallAcpiTable (
   EFI_ACPI_SUPPORT_PROTOCOL *AcpiSupport;\r
   EFI_STATUS                Status;\r
   VOID                      *AcpiTableBufferConst;\r
-  UINT32                    Length;\r
-  UINT8                     Checksum;\r
 \r
   //\r
   // Check for invalid input parameters\r
@@ -401,16 +402,6 @@ InstallAcpiTable (
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
-  Length = ((EFI_ACPI_COMMON_HEADER *) AcpiTableBuffer)->Length;\r
-  Checksum = CalculateCheckSum8 ((UINT8 *)AcpiTableBuffer, Length);\r
-  if (Checksum != 0) {\r
-    AcpiPlatformChecksum (\r
-      (VOID *)AcpiTableBuffer,\r
-      (UINTN)Length,\r
-      OFFSET_OF (EFI_ACPI_DESCRIPTION_HEADER, Checksum)\r
-      );\r
-  }\r
-\r
   //\r
   // Get the instance of the ACPI support protocol\r
   //\r
@@ -422,13 +413,13 @@ InstallAcpiTable (
   //\r
   AcpiTableBufferConst = AllocateCopyPool (AcpiTableBufferSize, AcpiTableBuffer);\r
   *TableKey = 0;\r
-  Status = AcpiSupport->SetAcpiTable (\r
-                          AcpiSupport,\r
-                          AcpiTableBufferConst,\r
-                          FALSE,\r
-                          EFI_ACPI_TABLE_VERSION_1_0B | EFI_ACPI_TABLE_VERSION_2_0 | EFI_ACPI_TABLE_VERSION_3_0,\r
-                          TableKey\r
-                          );\r
+  Status = AddTableToList (\r
+             AcpiSupportInstance,\r
+             AcpiTableBufferConst,\r
+             TRUE,\r
+             EFI_ACPI_TABLE_VERSION_1_0B | EFI_ACPI_TABLE_VERSION_2_0 | EFI_ACPI_TABLE_VERSION_3_0,\r
+             TableKey\r
+             );\r
   if (!EFI_ERROR (Status)) {\r
     Status = AcpiSupport->PublishTables (\r
                             AcpiSupport,\r
@@ -469,13 +460,11 @@ UninstallAcpiTable (
   //\r
   // Uninstall the ACPI table by using ACPI support protocol\r
   //\r
-  Status = AcpiSupport->SetAcpiTable (\r
-                          AcpiSupport,\r
-                          NULL,\r
-                          FALSE,\r
-                          EFI_ACPI_TABLE_VERSION_1_0B | EFI_ACPI_TABLE_VERSION_2_0 | EFI_ACPI_TABLE_VERSION_3_0,\r
-                          &TableKey\r
-                          );\r
+  Status = RemoveTableFromList (\r
+             AcpiSupportInstance,\r
+             EFI_ACPI_TABLE_VERSION_1_0B | EFI_ACPI_TABLE_VERSION_2_0 | EFI_ACPI_TABLE_VERSION_3_0,\r
+             TableKey\r
+             );\r
   if (!EFI_ERROR (Status)) {\r
     Status = AcpiSupport->PublishTables (\r
                             AcpiSupport,\r
@@ -600,8 +589,9 @@ ReallocateAcpiTableBuffer (
 \r
   @return EFI_SUCCESS               The function completed successfully.\r
   @return EFI_OUT_OF_RESOURCES      Could not allocate a required resource.\r
-  @return EFI_ABORTED               The table is a duplicate of a table that is required\r
-                                    to be unique.\r
+  @retval EFI_ACCESS_DENIED         The table signature matches a table already\r
+                                    present in the system and platform policy\r
+                                    does not allow duplicate tables of this type.\r
 **/\r
 EFI_STATUS\r
 AddTableToList (\r
@@ -736,7 +726,7 @@ AddTableToList (
         ) {\r
       gBS->FreePages (CurrentTableList->PageAddress, CurrentTableList->NumberOfPages);\r
       gBS->FreePool (CurrentTableList);\r
-      return EFI_ABORTED;\r
+      return EFI_ACCESS_DENIED;\r
     }\r
     //\r
     // Add the table to the appropriate table version\r
@@ -788,63 +778,72 @@ 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
-      if (AcpiSupportInstance->Fadt3 != NULL) {\r
-        AcpiSupportInstance->Fadt3->FirmwareCtrl  = (UINT32) (UINTN) AcpiSupportInstance->Facs3;\r
-        Buffer64 = (UINT64) (UINTN) AcpiSupportInstance->Facs3;\r
-        CopyMem (\r
+      if ((UINT64)(UINTN)AcpiSupportInstance->Facs3 < BASE_4GB) {\r
+        AcpiSupportInstance->Fadt3->FirmwareCtrl = (UINT32) (UINTN) AcpiSupportInstance->Facs3;\r
+        ZeroMem (\r
           &AcpiSupportInstance->Fadt3->XFirmwareCtrl,\r
-          &Buffer64,\r
           sizeof (UINT64)\r
           );\r
-        AcpiSupportInstance->Fadt3->Dsdt  = (UINT32) (UINTN) AcpiSupportInstance->Dsdt3;\r
-        Buffer64                          = (UINT64) (UINTN) AcpiSupportInstance->Dsdt3;\r
+      } else {\r
+        AcpiSupportInstance->Fadt3->FirmwareCtrl = 0;\r
+        Buffer64 = (UINT64) (UINTN) AcpiSupportInstance->Facs3;\r
         CopyMem (\r
-          &AcpiSupportInstance->Fadt3->XDsdt,\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
+        &AcpiSupportInstance->Fadt3->XDsdt,\r
+        &Buffer64,\r
+        sizeof (UINT64)\r
+        );\r
 \r
-        //\r
-        // RSDP OEM information is updated to match the FADT OEM information\r
-        //\r
-        CopyMem (\r
-          &AcpiSupportInstance->Rsdp3->OemId,\r
-          &AcpiSupportInstance->Fadt3->Header.OemId,\r
-          6\r
-          );\r
+      //\r
+      // RSDP OEM information is updated to match the FADT OEM information\r
+      //\r
+      CopyMem (\r
+        &AcpiSupportInstance->Rsdp3->OemId,\r
+        &AcpiSupportInstance->Fadt3->Header.OemId,\r
+        6\r
+        );\r
 \r
-        //\r
-        // RSDT OEM information is updated to match FADT OEM information.\r
-        //\r
-        CopyMem (\r
-          &AcpiSupportInstance->Rsdt3->OemId,\r
-          &AcpiSupportInstance->Fadt3->Header.OemId,\r
-          6\r
-          );\r
-        CopyMem (\r
-          &AcpiSupportInstance->Rsdt3->OemTableId,\r
-          &AcpiSupportInstance->Fadt3->Header.OemTableId,\r
-          sizeof (UINT64)\r
-          );\r
-        AcpiSupportInstance->Rsdt3->OemRevision = AcpiSupportInstance->Fadt3->Header.OemRevision;\r
+      //\r
+      // RSDT OEM information is updated to match FADT OEM information.\r
+      //\r
+      CopyMem (\r
+        &AcpiSupportInstance->Rsdt3->OemId,\r
+        &AcpiSupportInstance->Fadt3->Header.OemId,\r
+        6\r
+        );\r
+      CopyMem (\r
+        &AcpiSupportInstance->Rsdt3->OemTableId,\r
+        &AcpiSupportInstance->Fadt3->Header.OemTableId,\r
+        sizeof (UINT64)\r
+        );\r
+      AcpiSupportInstance->Rsdt3->OemRevision = AcpiSupportInstance->Fadt3->Header.OemRevision;\r
+\r
+      //\r
+      // XSDT OEM information is updated to match FADT OEM information.\r
+      //\r
+      CopyMem (\r
+        &AcpiSupportInstance->Xsdt->OemId,\r
+        &AcpiSupportInstance->Fadt3->Header.OemId,\r
+        6\r
+        );\r
+      CopyMem (\r
+        &AcpiSupportInstance->Xsdt->OemTableId,\r
+        &AcpiSupportInstance->Fadt3->Header.OemTableId,\r
+        sizeof (UINT64)\r
+        );\r
+      AcpiSupportInstance->Xsdt->OemRevision = AcpiSupportInstance->Fadt3->Header.OemRevision;\r
+    }\r
 \r
-        //\r
-        // XSDT OEM information is updated to match FADT OEM information.\r
-        //\r
-        CopyMem (\r
-          &AcpiSupportInstance->Xsdt->OemId,\r
-          &AcpiSupportInstance->Fadt3->Header.OemId,\r
-          6\r
-          );\r
-        CopyMem (\r
-          &AcpiSupportInstance->Xsdt->OemTableId,\r
-          &AcpiSupportInstance->Fadt3->Header.OemTableId,\r
-          sizeof (UINT64)\r
-          );\r
-        AcpiSupportInstance->Xsdt->OemRevision = AcpiSupportInstance->Fadt3->Header.OemRevision;\r
-      }\r
-    }    \r
     //\r
     // Checksum the table\r
     //\r
@@ -868,7 +867,7 @@ AddTableToList (
         ) {\r
       gBS->FreePages (CurrentTableList->PageAddress, CurrentTableList->NumberOfPages);\r
       gBS->FreePool (CurrentTableList);\r
-      return EFI_ABORTED;\r
+      return EFI_ACCESS_DENIED;\r
     }\r
     //\r
     // FACS is referenced by FADT and is not part of RSDT\r
@@ -913,13 +912,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
@@ -945,7 +951,7 @@ AddTableToList (
         ) {\r
       gBS->FreePages (CurrentTableList->PageAddress, CurrentTableList->NumberOfPages);\r
       gBS->FreePool (CurrentTableList);\r
-      return EFI_ABORTED;\r
+      return EFI_ACCESS_DENIED;\r
     }\r
     //\r
     // DSDT is referenced by FADT and is not part of RSDT\r
@@ -1835,13 +1841,13 @@ AcpiSupportAcpiSupportConstructor (
   //\r
   CurrentData = EFI_ACPI_1_0_ROOT_SYSTEM_DESCRIPTION_POINTER_SIGNATURE;\r
   CopyMem (&AcpiSupportInstance->Rsdp1->Signature, &CurrentData, sizeof (UINT64));\r
-  CopyMem (AcpiSupportInstance->Rsdp1->OemId, EFI_ACPI_OEM_ID, 6);\r
+  CopyMem (AcpiSupportInstance->Rsdp1->OemId, PcdGetPtr (PcdAcpiDefaultOemId), sizeof (AcpiSupportInstance->Rsdp1->OemId));\r
   AcpiSupportInstance->Rsdp1->Reserved    = EFI_ACPI_RESERVED_BYTE;\r
   AcpiSupportInstance->Rsdp1->RsdtAddress = (UINT32) (UINTN) AcpiSupportInstance->Rsdt1;\r
 \r
   CurrentData = EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_POINTER_SIGNATURE;\r
   CopyMem (&AcpiSupportInstance->Rsdp3->Signature, &CurrentData, sizeof (UINT64));\r
-  CopyMem (AcpiSupportInstance->Rsdp3->OemId, EFI_ACPI_OEM_ID, 6);\r
+  CopyMem (AcpiSupportInstance->Rsdp3->OemId, PcdGetPtr (PcdAcpiDefaultOemId), sizeof (AcpiSupportInstance->Rsdp3->OemId));\r
   AcpiSupportInstance->Rsdp3->Revision    = EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_POINTER_REVISION;\r
   AcpiSupportInstance->Rsdp3->RsdtAddress = (UINT32) (UINTN) AcpiSupportInstance->Rsdt3;\r
   AcpiSupportInstance->Rsdp3->Length      = sizeof (EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_POINTER);\r
@@ -1859,12 +1865,12 @@ AcpiSupportAcpiSupportConstructor (
   AcpiSupportInstance->Rsdt1->Signature = EFI_ACPI_1_0_ROOT_SYSTEM_DESCRIPTION_TABLE_SIGNATURE;\r
   AcpiSupportInstance->Rsdt1->Length    = sizeof (EFI_ACPI_DESCRIPTION_HEADER);\r
   AcpiSupportInstance->Rsdt1->Revision  = EFI_ACPI_1_0_ROOT_SYSTEM_DESCRIPTION_TABLE_REVISION;\r
-  CopyMem (AcpiSupportInstance->Rsdt1->OemId, EFI_ACPI_OEM_ID, 6);\r
-  CurrentData = EFI_ACPI_OEM_TABLE_ID;\r
+  CopyMem (AcpiSupportInstance->Rsdt1->OemId, PcdGetPtr (PcdAcpiDefaultOemId), sizeof (AcpiSupportInstance->Rsdt1->OemId));\r
+  CurrentData = PcdGet64 (PcdAcpiDefaultOemTableId);\r
   CopyMem (&AcpiSupportInstance->Rsdt1->OemTableId, &CurrentData, sizeof (UINT64));\r
-  AcpiSupportInstance->Rsdt1->OemRevision     = EFI_ACPI_OEM_REVISION;\r
-  AcpiSupportInstance->Rsdt1->CreatorId       = EFI_ACPI_CREATOR_ID;\r
-  AcpiSupportInstance->Rsdt1->CreatorRevision = EFI_ACPI_CREATOR_REVISION;\r
+  AcpiSupportInstance->Rsdt1->OemRevision     = PcdGet32 (PcdAcpiDefaultOemRevision);\r
+  AcpiSupportInstance->Rsdt1->CreatorId       = PcdGet32 (PcdAcpiDefaultCreatorId);\r
+  AcpiSupportInstance->Rsdt1->CreatorRevision = PcdGet32 (PcdAcpiDefaultCreatorRevision);\r
   //\r
   // We always reserve first one for FADT\r
   //\r
@@ -1874,12 +1880,12 @@ AcpiSupportAcpiSupportConstructor (
   AcpiSupportInstance->Rsdt3->Signature       = EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_TABLE_SIGNATURE;\r
   AcpiSupportInstance->Rsdt3->Length          = sizeof (EFI_ACPI_DESCRIPTION_HEADER);\r
   AcpiSupportInstance->Rsdt3->Revision        = EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_TABLE_REVISION;\r
-  CopyMem (AcpiSupportInstance->Rsdt3->OemId, EFI_ACPI_OEM_ID, 6);\r
-  CurrentData = EFI_ACPI_OEM_TABLE_ID;\r
+  CopyMem (AcpiSupportInstance->Rsdt3->OemId, PcdGetPtr (PcdAcpiDefaultOemId), sizeof (AcpiSupportInstance->Rsdt3->OemId));\r
+  CurrentData = PcdGet64 (PcdAcpiDefaultOemTableId);\r
   CopyMem (&AcpiSupportInstance->Rsdt3->OemTableId, &CurrentData, sizeof (UINT64));\r
-  AcpiSupportInstance->Rsdt3->OemRevision     = EFI_ACPI_OEM_REVISION;\r
-  AcpiSupportInstance->Rsdt3->CreatorId       = EFI_ACPI_CREATOR_ID;\r
-  AcpiSupportInstance->Rsdt3->CreatorRevision = EFI_ACPI_CREATOR_REVISION;\r
+  AcpiSupportInstance->Rsdt3->OemRevision     = PcdGet32 (PcdAcpiDefaultOemRevision);\r
+  AcpiSupportInstance->Rsdt3->CreatorId       = PcdGet32 (PcdAcpiDefaultCreatorId);\r
+  AcpiSupportInstance->Rsdt3->CreatorRevision = PcdGet32 (PcdAcpiDefaultCreatorRevision);\r
   //\r
   // We always reserve first one for FADT\r
   //\r
@@ -1892,12 +1898,12 @@ AcpiSupportAcpiSupportConstructor (
   AcpiSupportInstance->Xsdt->Signature  = EFI_ACPI_3_0_EXTENDED_SYSTEM_DESCRIPTION_TABLE_SIGNATURE;\r
   AcpiSupportInstance->Xsdt->Length     = sizeof (EFI_ACPI_DESCRIPTION_HEADER);\r
   AcpiSupportInstance->Xsdt->Revision   = EFI_ACPI_3_0_EXTENDED_SYSTEM_DESCRIPTION_TABLE_REVISION;\r
-  CopyMem (AcpiSupportInstance->Xsdt->OemId, EFI_ACPI_OEM_ID, 6);\r
-  CurrentData = EFI_ACPI_OEM_TABLE_ID;\r
+  CopyMem (AcpiSupportInstance->Xsdt->OemId, PcdGetPtr (PcdAcpiDefaultOemId), sizeof (AcpiSupportInstance->Xsdt->OemId));\r
+  CurrentData = PcdGet64 (PcdAcpiDefaultOemTableId);\r
   CopyMem (&AcpiSupportInstance->Xsdt->OemTableId, &CurrentData, sizeof (UINT64));\r
-  AcpiSupportInstance->Xsdt->OemRevision      = EFI_ACPI_OEM_REVISION;\r
-  AcpiSupportInstance->Xsdt->CreatorId        = EFI_ACPI_CREATOR_ID;\r
-  AcpiSupportInstance->Xsdt->CreatorRevision  = EFI_ACPI_CREATOR_REVISION;\r
+  AcpiSupportInstance->Xsdt->OemRevision      = PcdGet32 (PcdAcpiDefaultOemRevision);\r
+  AcpiSupportInstance->Xsdt->CreatorId        = PcdGet32 (PcdAcpiDefaultCreatorId);\r
+  AcpiSupportInstance->Xsdt->CreatorRevision  = PcdGet32 (PcdAcpiDefaultCreatorRevision);\r
   //\r
   // We always reserve first one for FADT\r
   //\r