]> 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 6312e2ba363a19088cb395770273cd150d8e4cc4..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,23 +778,32 @@ 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
@@ -843,7 +842,8 @@ AddTableToList (
         sizeof (UINT64)\r
         );\r
       AcpiSupportInstance->Xsdt->OemRevision = AcpiSupportInstance->Fadt3->Header.OemRevision;\r
-    }    \r
+    }\r
+\r
     //\r
     // Checksum the table\r
     //\r
@@ -867,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
@@ -912,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
@@ -944,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
@@ -1336,40 +1343,42 @@ DeleteTable (
   // Init locals\r
   //\r
   RemoveFromRsdt        = TRUE;\r
-  CurrentTableSignature = ((EFI_ACPI_COMMON_HEADER *) Table->Table)->Signature;\r
-\r
-  //\r
-  // Basic tasks to accomplish delete are:\r
-  //   Determine removal requirements (in RSDT/XSDT or not)\r
-  //   Remove entry from RSDT/XSDT\r
-  //   Remove any table references to the table\r
-  //   If no one is using the table\r
-  //      Free the table (removing pointers from private data and tables)\r
-  //      Remove from list\r
-  //      Free list structure\r
-  //\r
-  //\r
-  // Determine if this table is in the RSDT or XSDT\r
-  //\r
-  if ((CurrentTableSignature == EFI_ACPI_1_0_FIRMWARE_ACPI_CONTROL_STRUCTURE_SIGNATURE) ||\r
-      (CurrentTableSignature == EFI_ACPI_2_0_DIFFERENTIATED_SYSTEM_DESCRIPTION_TABLE_SIGNATURE) ||\r
-      (CurrentTableSignature == EFI_ACPI_3_0_DIFFERENTIATED_SYSTEM_DESCRIPTION_TABLE_SIGNATURE)\r
-      ) {\r
-    RemoveFromRsdt = FALSE;\r
-  }\r
-  //\r
-  // We don't remove the FADT in the standard way because some\r
-  // OS expect the FADT to be early in the table list.\r
-  // So we always put it as the first element in the list.\r
-  //\r
-  if (CurrentTableSignature == EFI_ACPI_1_0_FIXED_ACPI_DESCRIPTION_TABLE_SIGNATURE) {\r
-    RemoveFromRsdt = FALSE;\r
-  }\r
 \r
-  //\r
-  // Remove the table from RSDT and XSDT\r
-  //\r
   if (Table->Table != NULL) {\r
+    CurrentTableSignature = ((EFI_ACPI_COMMON_HEADER *) Table->Table)->Signature;\r
+\r
+    //\r
+    // Basic tasks to accomplish delete are:\r
+    //   Determine removal requirements (in RSDT/XSDT or not)\r
+    //   Remove entry from RSDT/XSDT\r
+    //   Remove any table references to the table\r
+    //   If no one is using the table\r
+    //      Free the table (removing pointers from private data and tables)\r
+    //      Remove from list\r
+    //      Free list structure\r
+    //\r
+    //\r
+    // Determine if this table is in the RSDT or XSDT\r
+    //\r
+    if ((CurrentTableSignature == EFI_ACPI_1_0_FIRMWARE_ACPI_CONTROL_STRUCTURE_SIGNATURE) ||\r
+        (CurrentTableSignature == EFI_ACPI_2_0_DIFFERENTIATED_SYSTEM_DESCRIPTION_TABLE_SIGNATURE) ||\r
+        (CurrentTableSignature == EFI_ACPI_3_0_DIFFERENTIATED_SYSTEM_DESCRIPTION_TABLE_SIGNATURE)\r
+        ) {\r
+      RemoveFromRsdt = FALSE;\r
+    }\r
+    //\r
+    // We don't remove the FADT in the standard way because some\r
+    // OS expect the FADT to be early in the table list.\r
+    // So we always put it as the first element in the list.\r
+    //\r
+    if (CurrentTableSignature == EFI_ACPI_1_0_FIXED_ACPI_DESCRIPTION_TABLE_SIGNATURE) {\r
+      RemoveFromRsdt = FALSE;\r
+    }\r
+\r
+    //\r
+    // Remove the table from RSDT and XSDT\r
+    //\r
+\r
     //\r
     // This is a basic table, remove it from any lists and the Rsdt and/or Xsdt\r
     //\r
@@ -1832,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
@@ -1856,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
@@ -1871,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
@@ -1889,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