/** @file Acpi Gnvs Init Library. Copyright (c) 2017, Intel Corporation. All rights reserved.
This program and the accompanying materials are licensed and made available under the terms and conditions of the BSD License that accompanies this distribution. The full text of the license may be found at http://opensource.org/licenses/bsd-license.php. THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. **/ #include #include #include #include #include #include #include extern GLOBAL_REMOVE_IF_UNREFERENCED PLATFORM_NVS_AREA_PROTOCOL mPlatformNvsAreaProtocol; VOID UpdateDsdt ( IN VOID *Table ) { UINT8 *CurrPtr; UINT8 *TmpDsdtPointer; UINT8 *DsdtPointer; UINT32 *Signature; UINT8 *Operation; UINT32 *Address; UINT8 *Value; UINT16 *Size; BOOLEAN EnterDock = FALSE; UINT8 MaximumDsdtPointLength; MaximumDsdtPointLength = 20; // // Fix up the AML code in the DSDT affected by end user options. // Fix up the following ASL Code: // (1) ACPI Global NVS Memory Base and Size. // (2) ACPI Graphics NVS Memory Base and Size. // (3) SMBus I/O Base. // (4) Thermal Management Methods. // // // Loop through the ASL looking for values that we must fix up. // CurrPtr = (UINT8 *) Table; for (DsdtPointer = CurrPtr; DsdtPointer <= (CurrPtr + ((EFI_ACPI_COMMON_HEADER *) CurrPtr)->Length); DsdtPointer++ ) { Signature = (UINT32 *) DsdtPointer; switch (*Signature) { // // GNVS operation region // case (SIGNATURE_32 ('G', 'N', 'V', 'S')): // // Conditional match. For Region Objects, the Operator will always be the // byte immediately before the specific name. Therefore, subtract 1 to check // the Operator. // Operation = DsdtPointer - 1; if (*Operation == AML_EXT_REGION_OP) { Address = (UINT32 *) (DsdtPointer + 6); *Address = (UINT32) (UINTN) mPlatformNvsAreaProtocol.Area; Size = (UINT16 *) (DsdtPointer + 11); *Size = sizeof (PLATFORM_NVS_AREA); } break; // // _AC0 method // case (SIGNATURE_32 ('_', 'A', 'C', '0')): // // Conditional match. _AC0 is >63 and <4095 bytes, so the package length is 2 bytes. // Therefore, subtract 3 to check the Operator. // Operation = DsdtPointer - 3; if (*Operation == AML_METHOD_OP) { // // Check if we want _AC0 enabled // if (PcdGet8 (PcdDisableActiveTripPoints) == 0) { Signature = (UINT32 *) DsdtPointer; *Signature = SIGNATURE_32 ('X', 'A', 'C', '0'); } } break; // // _AL0 method // case (SIGNATURE_32 ('_', 'A', 'L', '0')): // // Conditional match. For Name Objects, the Operator will always be the byte // immediately before the specific name. Therefore, subtract 1 to check the // Operator. // Operation = DsdtPointer - 1; if (*Operation == AML_NAME_OP) { // // Check if we want _AL0 enabled // if (PcdGet8 (PcdDisableActiveTripPoints) == 0) { Signature = (UINT32 *) DsdtPointer; *Signature = SIGNATURE_32 ('X', 'A', 'L', '0'); } } break; // // _AC1 method // case (SIGNATURE_32 ('_', 'A', 'C', '1')): // // Conditional match. _AC1 is < 63 bytes, so the package length is 1 byte. // Therefore, subtract 2 to check the Operator. // Operation = DsdtPointer - 2; if (*Operation == AML_METHOD_OP) { // // Check if we want _AC1 enabled // if (PcdGet8 (PcdDisableActiveTripPoints) == 0) { Signature = (UINT32 *) DsdtPointer; *Signature = SIGNATURE_32 ('X', 'A', 'C', '1'); } } break; // // _AL1 method // case (SIGNATURE_32 ('_', 'A', 'L', '1')): // // Conditional match. For Name Objects, the Operator will always be the byte // immediately before the specific name. Therefore, subtract 1 to check the // Operator. // Operation = DsdtPointer - 1; if (*Operation == AML_NAME_OP) { // // Check if we want _AL1 enabled // if (PcdGet8 (PcdDisableActiveTripPoints) == 0) { Signature = (UINT32 *) DsdtPointer; *Signature = SIGNATURE_32 ('X', 'A', 'L', '1'); } } break; // // _AC2 method // case (SIGNATURE_32 ('_', 'A', 'C', '2')): // // Conditional match. _AC2 is < 63 bytes, so the package length is 1 byte. // Therefore, subtract 2 to check the Operator. // Operation = DsdtPointer - 2; if (*Operation == AML_METHOD_OP) { // // Check if we want _AC2 enabled // if (PcdGet8 (PcdDisableActiveTripPoints) == 0) { Signature = (UINT32 *) DsdtPointer; *Signature = SIGNATURE_32 ('X', 'A', 'C', '2'); } } break; // // _AL2 method // case (SIGNATURE_32 ('_', 'A', 'L', '2')): // // Conditional match. For Name Objects, the Operator will always be the byte // immediately before the specific name. Therefore, subtract 1 to check the // Operator. // Operation = DsdtPointer - 1; if (*Operation == AML_NAME_OP) { // // Check if we want _AL2 enabled // if (PcdGet8 (PcdDisableActiveTripPoints) == 0) { Signature = (UINT32 *) DsdtPointer; *Signature = SIGNATURE_32 ('X', 'A', 'L', '2'); } } break; // // _AC3 method // case (SIGNATURE_32 ('_', 'A', 'C', '3')): // // Conditional match. _AC3 is < 63 bytes, so the package length is 1 byte. // Therefore, subtract 2 to check the Operator. // Operation = DsdtPointer - 2; if (*Operation == AML_METHOD_OP) { // // Check if we want _AC3 enabled // if (PcdGet8 (PcdDisableActiveTripPoints) == 0) { Signature = (UINT32 *) DsdtPointer; *Signature = SIGNATURE_32 ('X', 'A', 'C', '3'); } } break; // // _AL3 method // case (SIGNATURE_32 ('_', 'A', 'L', '3')): // // Conditional match. For Name Objects, the Operator will always be the byte // immediately before the specific name. Therefore, subtract 1 to check the // Operator. // Operation = DsdtPointer - 1; if (*Operation == AML_NAME_OP) { // // Check if we want _AL3 enabled // if (PcdGet8 (PcdDisableActiveTripPoints) == 0) { Signature = (UINT32 *) DsdtPointer; *Signature = SIGNATURE_32 ('X', 'A', 'L', '3'); } } break; // // _AC4 method // case (SIGNATURE_32 ('_', 'A', 'C', '4')): // // Conditional match. _AC4 is < 63 bytes, so the package length is 1 byte. // Therefore, subtract 2 to check the Operator. // Operation = DsdtPointer - 2; if (*Operation == AML_METHOD_OP) { // // Check if we want _AC4 enabled // if (PcdGet8 (PcdDisableActiveTripPoints) == 0) { Signature = (UINT32 *) DsdtPointer; *Signature = SIGNATURE_32 ('X', 'A', 'C', '4'); } } break; // // _AL4 method // case (SIGNATURE_32 ('_', 'A', 'L', '4')): // // Conditional match. For Name Objects, the Operator will always be the byte // immediately before the specific name. Therefore, subtract 1 to check the // Operator. // Operation = DsdtPointer - 1; if (*Operation == AML_NAME_OP) { // // Check if we want _AL4 enabled // if (PcdGet8 (PcdDisableActiveTripPoints) == 0) { Signature = (UINT32 *) DsdtPointer; *Signature = SIGNATURE_32 ('X', 'A', 'L', '4'); } } break; // // _AC5 method // case (SIGNATURE_32 ('_', 'A', 'C', '5')): // // Conditional match. _AC5 is < 63 bytes, so the package length is 1 byte. // Therefore, subtract 2 to check the Operator. // Operation = DsdtPointer - 2; if (*Operation == AML_METHOD_OP) { // // Check if we want _AC5 enabled // if (PcdGet8 (PcdDisableActiveTripPoints) == 0) { Signature = (UINT32 *) DsdtPointer; *Signature = SIGNATURE_32 ('X', 'A', 'C', '5'); } } break; // // _AL5 method // case (SIGNATURE_32 ('_', 'A', 'L', '5')): // // Conditional match. For Name Objects, the Operator will always be the byte // immediately before the specific name. Therefore, subtract 1 to check the // Operator. // Operation = DsdtPointer - 1; if (*Operation == AML_NAME_OP) { // // Check if we want _AL5 enabled // if (PcdGet8 (PcdDisableActiveTripPoints) == 0) { Signature = (UINT32 *) DsdtPointer; *Signature = SIGNATURE_32 ('X', 'A', 'L', '5'); } } break; // // _AC6 method // case (SIGNATURE_32 ('_', 'A', 'C', '6')): // // Conditional match. _AC6 is < 63 bytes, so the package length is 1 byte. // Therefore, subtract 2 to check the Operator. // Operation = DsdtPointer - 2; if (*Operation == AML_METHOD_OP) { // // Check if we want _AC6 enabled // if (PcdGet8 (PcdDisableActiveTripPoints) == 0) { Signature = (UINT32 *) DsdtPointer; *Signature = SIGNATURE_32 ('X', 'A', 'C', '6'); } } break; // // _AL6 method // case (SIGNATURE_32 ('_', 'A', 'L', '6')): // // Conditional match. For Name Objects, the Operator will always be the byte // immediately before the specific name. Therefore, subtract 1 to check the // Operator. // Operation = DsdtPointer - 1; if (*Operation == AML_NAME_OP) { // // Check if we want _AL6 enabled // if (PcdGet8 (PcdDisableActiveTripPoints) == 0) { Signature = (UINT32 *) DsdtPointer; *Signature = SIGNATURE_32 ('X', 'A', 'L', '6'); } } break; // // _AC7 method // case (SIGNATURE_32 ('_', 'A', 'C', '7')): // // Conditional match. _AC7 is < 63 bytes, so the package length is 1 byte. // Therefore, subtract 2 to check the Operator. // Operation = DsdtPointer - 2; if (*Operation == AML_METHOD_OP) { // // Check if we want _AC7 enabled // if (PcdGet8 (PcdDisableActiveTripPoints) == 0) { Signature = (UINT32 *) DsdtPointer; *Signature = SIGNATURE_32 ('X', 'A', 'C', '7'); } } break; // // _AL7 method // case (SIGNATURE_32 ('_', 'A', 'L', '7')): // // Conditional match. For Name Objects, the Operator will always be the byte // immediately before the specific name. Therefore, subtract 1 to check the // Operator. // Operation = DsdtPointer - 1; if (*Operation == AML_NAME_OP) { // // Check if we want _AL7 enabled // if (PcdGet8 (PcdDisableActiveTripPoints) == 0) { Signature = (UINT32 *) DsdtPointer; *Signature = SIGNATURE_32 ('X', 'A', 'L', '7'); } } break; // // _AC8 method // case (SIGNATURE_32 ('_', 'A', 'C', '8')): // // Conditional match. _AC8 is < 63 bytes, so the package length is 1 byte. // Therefore, subtract 2 to check the Operator. // Operation = DsdtPointer - 2; if (*Operation == AML_METHOD_OP) { // // Check if we want _AC8 enabled // if (PcdGet8 (PcdDisableActiveTripPoints) == 0) { Signature = (UINT32 *) DsdtPointer; *Signature = SIGNATURE_32 ('X', 'A', 'C', '8'); } } break; // // _AL8 method // case (SIGNATURE_32 ('_', 'A', 'L', '8')): // // Conditional match. For Name Objects, the Operator will always be the byte // immediately before the specific name. Therefore, subtract 1 to check the // Operator. // Operation = DsdtPointer - 1; if (*Operation == AML_NAME_OP) { // // Check if we want _AL8 enabled // if (PcdGet8 (PcdDisableActiveTripPoints) == 0) { Signature = (UINT32 *) DsdtPointer; *Signature = SIGNATURE_32 ('X', 'A', 'L', '8'); } } break; // // _AC9 method // case (SIGNATURE_32 ('_', 'A', 'C', '9')): // // Conditional match. _AC9 is < 63 bytes, so the package length is 1 byte. // Therefore, subtract 2 to check the Operator. // Operation = DsdtPointer - 2; if (*Operation == AML_METHOD_OP) { // // Check if we want _AC9 enabled // if (PcdGet8 (PcdDisableActiveTripPoints) == 0) { Signature = (UINT32 *) DsdtPointer; *Signature = SIGNATURE_32 ('X', 'A', 'C', '9'); } } break; // // _AL9 method // case (SIGNATURE_32 ('_', 'A', 'L', '9')): // // Conditional match. For Name Objects, the Operator will always be the byte // immediately before the specific name. Therefore, subtract 1 to check the // Operator. // Operation = DsdtPointer - 1; if (*Operation == AML_NAME_OP) { // // Check if we want _AL9 enabled // if (PcdGet8 (PcdDisableActiveTripPoints) == 0) { Signature = (UINT32 *) DsdtPointer; *Signature = SIGNATURE_32 ('X', 'A', 'L', '9'); } } break; // // _PSL method // case (SIGNATURE_32 ('_', 'P', 'S', 'L')): // // Conditional match. _PSL is < 256 bytes, so the package length is 1 byte. // Therefore, subtract 2 to check the Operator. // Operation = DsdtPointer - 3; if (*Operation == AML_METHOD_OP) { // // Check if we want _PSL enabled // if (PcdGet8 (PcdDisablePassiveTripPoints) == 0) { Signature = (UINT32 *) DsdtPointer; *Signature = SIGNATURE_32 ('X', 'P', 'S', 'L'); } } break; // // _PSV method // case (SIGNATURE_32 ('_', 'P', 'S', 'V')): // // Conditional match. _PSV is < 256 bytes, so the package length is 1 byte. // Therefore, subtract 2 to check the Operator. // Operation = DsdtPointer - 3; if (*Operation == AML_METHOD_OP) { // // Check if we want _PSV enabled // if (PcdGet8 (PcdDisablePassiveTripPoints) == 0) { Signature = (UINT32 *) DsdtPointer; *Signature = SIGNATURE_32 ('X', 'P', 'S', 'V'); } } break; // // _CRT method // case (SIGNATURE_32 ('_', 'C', 'R', 'T')): // // Conditional match. _CRT is < 256 bytes, so the package length is 1 byte. // Subtract 3 to check the Operator for CRB, subract 2 for Harris Beach. // Operation = DsdtPointer - 3; if (*Operation == AML_METHOD_OP) { // // Check if we want _CRT enabled // if (PcdGet8 (PcdDisableCriticalTripPoints) == 0) { Signature = (UINT32 *) DsdtPointer; *Signature = SIGNATURE_32 ('X', 'C', 'R', 'T'); } } break; // // _TC1 method // case (SIGNATURE_32 ('_', 'T', 'C', '1')): // // Conditional match. _TC1 is < 256 bytes, so the package length is 1 byte. // Therefore, subtract 2 to check the Operator. // Operation = DsdtPointer - 2; if (*Operation == AML_METHOD_OP) { // // Check if we want _TC1 enabled // if (PcdGet8 (PcdDisablePassiveTripPoints) == 0) { Signature = (UINT32 *) DsdtPointer; *Signature = SIGNATURE_32 ('X', 'T', 'C', '1'); } } break; // // _TC2 method // case (SIGNATURE_32 ('_', 'T', 'C', '2')): // // Conditional match. _TC2 is < 256 bytes, so the package length is 1 byte. // Therefore, subtract 2 to check the Operator. // Operation = DsdtPointer - 2; if (*Operation == AML_METHOD_OP) { // // Check if we want _TC2 enabled // if (PcdGet8 (PcdDisablePassiveTripPoints) == 0) { Signature = (UINT32 *) DsdtPointer; *Signature = SIGNATURE_32 ('X', 'T', 'C', '2'); } } break; // // _TSP method // case (SIGNATURE_32 ('_', 'T', 'S', 'P')): // // Conditional match. _TSP is < 256 bytes, so the package length is 1 byte. // Therefore, subtract 2 to check the Operator. // Operation = DsdtPointer - 2; if (*Operation == AML_METHOD_OP) { // // Check if we want _TSP enabled // if (PcdGet8 (PcdDisablePassiveTripPoints) == 0) { Signature = (UINT32 *) DsdtPointer; *Signature = SIGNATURE_32 ('X', 'T', 'S', 'P'); } } break; // // Update SS3 Name with Setup value // case (SIGNATURE_32 ('S', 'S', '3', '_')): Operation = DsdtPointer - 1; if (*Operation == AML_NAME_OP) { Value = (UINT8 *) DsdtPointer + 4; *Value = PcdGet8 (PcdAcpiSleepState); } break; // // Update SS4 Name with Setup value // case (SIGNATURE_32 ('S', 'S', '4', '_')): Operation = DsdtPointer - 1; if (*Operation == AML_NAME_OP) { Value = (UINT8 *) DsdtPointer + 4; *Value = PcdGet8 (PcdAcpiHibernate); } break; // // _EJ0 method // case (SIGNATURE_32 ('_', 'E', 'J', '0')): if (PcdGet8 (PcdLowPowerS0Idle)) { // // Remove _EJ0 for SOC // if (*(DsdtPointer-3) == AML_METHOD_OP) { Signature = (UINT32 *) DsdtPointer; *Signature = SIGNATURE_32 ('X', 'E', 'J', '0'); EnterDock = TRUE; } } break; // // _STA method for Device (\_SB.PCI0.DOCK) // case (SIGNATURE_32 ('_', 'S', 'T', 'A')): if (PcdGet8 (PcdLowPowerS0Idle)) { // // Remove _STA in (\_SB.PCI0.DOCK) for SOC // if ((*(DsdtPointer-3) == AML_METHOD_OP) && (EnterDock)) { Signature = (UINT32 *) DsdtPointer; *Signature = SIGNATURE_32 ('X', 'S', 'T', 'A'); EnterDock = FALSE; } } break; // // _UPC method for Device (\_SB.PCI0.XHC.RHUB) // case (SIGNATURE_32('H', 'S', '1', '3')): for (TmpDsdtPointer = DsdtPointer; TmpDsdtPointer <= DsdtPointer + MaximumDsdtPointLength; TmpDsdtPointer++){ Signature = (UINT32 *) TmpDsdtPointer; switch (*Signature) { case(SIGNATURE_32('U', 'P', 'C', 'P')): Value = (UINT8 *)((UINT32 *)TmpDsdtPointer + 2); break; default: // // Do nothing. // break; } } break; // // _DCK method // case (SIGNATURE_32 ('_', 'D', 'C', 'K')): if (PcdGet8 (PcdLowPowerS0Idle)) { // // Remove _DCK for SOC // if (*(DsdtPointer-3) == AML_METHOD_OP) { Signature = (UINT32 *) DsdtPointer; *Signature = SIGNATURE_32 ('X', 'D', 'C', 'K'); } } break; // // mask _DEP from CPU's scope if CS disabled. // case (SIGNATURE_32 ('P', 'R', '0', '0')): case (SIGNATURE_32 ('P', 'R', '0', '1')): case (SIGNATURE_32 ('P', 'R', '0', '2')): case (SIGNATURE_32 ('P', 'R', '0', '3')): case (SIGNATURE_32 ('P', 'R', '0', '4')): case (SIGNATURE_32 ('P', 'R', '0', '5')): case (SIGNATURE_32 ('P', 'R', '0', '6')): case (SIGNATURE_32 ('P', 'R', '0', '7')): case (SIGNATURE_32 ('P', 'R', '0', '8')): case (SIGNATURE_32 ('P', 'R', '0', '9')): case (SIGNATURE_32 ('P', 'R', '1', '0')): case (SIGNATURE_32 ('P', 'R', '1', '1')): case (SIGNATURE_32 ('P', 'R', '1', '2')): case (SIGNATURE_32 ('P', 'R', '1', '3')): case (SIGNATURE_32 ('P', 'R', '1', '4')): case (SIGNATURE_32 ('P', 'R', '1', '5')): if (PcdGet8 (PcdLowPowerS0Idle) == 0) { for (TmpDsdtPointer = DsdtPointer; TmpDsdtPointer <= DsdtPointer + MaximumDsdtPointLength; TmpDsdtPointer++){ Signature = (UINT32 *) TmpDsdtPointer; switch (*Signature) { case(SIGNATURE_32('_', 'D', 'E', 'P')): *(UINT8 *) TmpDsdtPointer = 'X'; break; default: // // Do nothing. // break; } } } break; // // _EDL name // case (SIGNATURE_32 ('_', 'E', 'D', 'L')): if (PcdGet8 (PcdLowPowerS0Idle)) { // // Remove _EDL for SOC // if (*(DsdtPointer-1) == AML_NAME_OP) { Signature = (UINT32 *) DsdtPointer; *Signature = SIGNATURE_32 ('X', 'E', 'D', 'L'); } } break; default: // // Do nothing. // break; } } }