/** @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
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
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
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
//\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
//\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
\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
) {\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
\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
sizeof (UINT64)\r
);\r
AcpiSupportInstance->Xsdt->OemRevision = AcpiSupportInstance->Fadt3->Header.OemRevision;\r
- } \r
+ }\r
+\r
//\r
// Checksum the table\r
//\r
) {\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
// 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
) {\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
// 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
//\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
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
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
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