/** @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
- 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
) {\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
//\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