/** @file Tiger Lake U RVP SMM Silicon ACPI Enable library Copyright (c) 2021, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include /** Clear Port 80h Disables the SW SMI Timer. ACPI events are disabled and ACPI event status is cleared. Disable port 60/64 SMI trap if they are enabled Disable PM sources except power button Clear status bits Guarantee day-of-month alarm is invalid (ACPI 1.0 section 4.7.2.4) Enable SCI **/ EFI_STATUS EFIAPI SiliconEnableAcpi ( IN BOOLEAN EnableSci ) { UINT32 SmiEn; UINT32 SmiSts; UINT32 ULKMC; UINTN LpcBaseAddress; UINT16 AcpiBaseAddr; UINT32 Pm1Cnt; LpcBaseAddress = LpcPciCfgBase (); // // Get the ACPI Base Address // AcpiBaseAddr = PmcGetAcpiBase(); // // Clear Port 80h // IoWrite8 (0x80, 0); // // Disable SW SMI Timer and clean the status // SmiEn = IoRead32 (AcpiBaseAddr + R_ACPI_IO_SMI_EN); SmiEn &= ~(B_ACPI_IO_SMI_EN_LEGACY_USB2 | B_ACPI_IO_SMI_EN_SWSMI_TMR | B_ACPI_IO_SMI_EN_LEGACY_USB); IoWrite32 (AcpiBaseAddr + R_ACPI_IO_SMI_EN, SmiEn); SmiSts = IoRead32 (AcpiBaseAddr + R_ACPI_IO_SMI_STS); SmiSts |= B_ACPI_IO_SMI_EN_LEGACY_USB2 | B_ACPI_IO_SMI_EN_SWSMI_TMR | B_ACPI_IO_SMI_EN_LEGACY_USB; IoWrite32 (AcpiBaseAddr + R_ACPI_IO_SMI_STS, SmiSts); // // Disable port 60/64 SMI trap if they are enabled // ULKMC = MmioRead32 (LpcBaseAddress + R_LPC_CFG_ULKMC) & ~(B_LPC_CFG_ULKMC_60REN | B_LPC_CFG_ULKMC_60WEN | B_LPC_CFG_ULKMC_64REN | B_LPC_CFG_ULKMC_64WEN | B_LPC_CFG_ULKMC_A20PASSEN); MmioWrite32 (LpcBaseAddress + R_LPC_CFG_ULKMC, ULKMC); // // Disable PM sources except power button // IoWrite16 (AcpiBaseAddr + R_ACPI_IO_PM1_EN, B_ACPI_IO_PM1_EN_PWRBTN); // // Clear PM status except Power Button status for RapidStart Resume // IoWrite16 (AcpiBaseAddr + R_ACPI_IO_PM1_STS, 0xFEFF); // // Guarantee day-of-month alarm is invalid (ACPI 1.0 section 4.7.2.4) // IoWrite8 (R_RTC_IO_INDEX_ALT, R_RTC_IO_REGD); IoWrite8 (R_RTC_IO_TARGET_ALT, 0x0); // // Enable SCI // if (EnableSci) { Pm1Cnt = IoRead32 (AcpiBaseAddr + R_ACPI_IO_PM1_CNT); Pm1Cnt |= B_ACPI_IO_PM1_CNT_SCI_EN; IoWrite32 (AcpiBaseAddr + R_ACPI_IO_PM1_CNT, Pm1Cnt); } return EFI_SUCCESS; } EFI_STATUS EFIAPI SiliconDisableAcpi ( IN BOOLEAN DisableSci ) { UINT16 AcpiBaseAddr; UINT32 Pm1Cnt; // // Get the ACPI Base Address // AcpiBaseAddr = PmcGetAcpiBase(); // // Disable SCI // if (DisableSci) { Pm1Cnt = IoRead32 (AcpiBaseAddr + R_ACPI_IO_PM1_CNT); Pm1Cnt &= ~B_ACPI_IO_PM1_CNT_SCI_EN; IoWrite32 (AcpiBaseAddr + R_ACPI_IO_PM1_CNT, Pm1Cnt); } return EFI_SUCCESS; }