summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/soc/intel/common/block/smm/Kconfig8
-rw-r--r--src/soc/intel/common/block/smm/smihandler.c4
-rw-r--r--src/soc/intel/common/block/smm/smm.c9
3 files changed, 21 insertions, 0 deletions
diff --git a/src/soc/intel/common/block/smm/Kconfig b/src/soc/intel/common/block/smm/Kconfig
index 909382e0ee..cc6bc44f58 100644
--- a/src/soc/intel/common/block/smm/Kconfig
+++ b/src/soc/intel/common/block/smm/Kconfig
@@ -8,6 +8,14 @@ config SOC_INTEL_COMMON_BLOCK_SMM_IO_TRAP
help
Intel Processor trap flag if it is supported
+config SOC_INTEL_COMMON_BLOCK_SMM_ESPI_ACPI_DIS
+ bool
+ default n
+ help
+ Disable eSPI SMI when ACPI mode is enabled. This will
+ prevent the embedded controller from asserting SMI when
+ booted into an ACPI aware OS.
+
config SOC_INTEL_COMMON_BLOCK_SMM_S5_DELAY_MS
int
default 100 if CHROMEOS
diff --git a/src/soc/intel/common/block/smm/smihandler.c b/src/soc/intel/common/block/smm/smihandler.c
index 9e8d346d24..0832bb5558 100644
--- a/src/soc/intel/common/block/smm/smihandler.c
+++ b/src/soc/intel/common/block/smm/smihandler.c
@@ -362,10 +362,14 @@ void smihandler_southbridge_apmc(
break;
case APM_CNT_ACPI_DISABLE:
pmc_disable_pm1_control(SCI_EN);
+ if (IS_ENABLED(CONFIG_SOC_INTEL_COMMON_BLOCK_SMM_ESPI_ACPI_DIS))
+ pmc_enable_smi(ESPI_SMI_EN);
printk(BIOS_DEBUG, "SMI#: ACPI disabled.\n");
break;
case APM_CNT_ACPI_ENABLE:
pmc_enable_pm1_control(SCI_EN);
+ if (IS_ENABLED(CONFIG_SOC_INTEL_COMMON_BLOCK_SMM_ESPI_ACPI_DIS))
+ pmc_disable_smi(ESPI_SMI_EN);
printk(BIOS_DEBUG, "SMI#: ACPI enabled.\n");
break;
case APM_CNT_GNVS_UPDATE:
diff --git a/src/soc/intel/common/block/smm/smm.c b/src/soc/intel/common/block/smm/smm.c
index 6059995493..d929975186 100644
--- a/src/soc/intel/common/block/smm/smm.c
+++ b/src/soc/intel/common/block/smm/smm.c
@@ -15,6 +15,7 @@
* GNU General Public License for more details.
*/
+#include <bootstate.h>
#include <console/console.h>
#include <cpu/x86/smm.h>
#include <intelblocks/pmclib.h>
@@ -93,3 +94,11 @@ void smm_region_info(void **start, size_t *size)
*start = (void *)sa_get_tseg_base();
*size = sa_get_tseg_size();
}
+
+#if IS_ENABLED(CONFIG_SOC_INTEL_COMMON_BLOCK_SMM_ESPI_ACPI_DIS)
+static void smm_disable_espi(void *dest)
+{
+ pmc_disable_smi(ESPI_SMI_EN);
+}
+BOOT_STATE_INIT_ENTRY(BS_OS_RESUME, BS_ON_ENTRY, smm_disable_espi, NULL);
+#endif