/** @file Acpi Gnvs Init Library. Copyright (c) 2017, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ #include #include #include #include #include #include #include extern GLOBAL_REMOVE_IF_UNREFERENCED EFI_GLOBAL_NVS_AREA_PROTOCOL mGlobalNvsArea; 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) mGlobalNvsArea.Area; Size = (UINT16 *) (DsdtPointer + 11); *Size = sizeof (EFI_GLOBAL_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; } } }