diff --git a/sys/dev/acpica/acpi_cpu.c b/sys/dev/acpica/acpi_cpu.c --- a/sys/dev/acpica/acpi_cpu.c +++ b/sys/dev/acpica/acpi_cpu.c @@ -396,6 +396,17 @@ */ if (!acpi_disabled("mwait") && cpu_mwait_usable()) sc->cpu_features |= ACPI_CAP_SMP_C1_NATIVE | ACPI_CAP_SMP_C3_NATIVE; + + /* + * Work around a lingering SMM bug which leads to freezes when handling + * CPPC notifications. Tell the SMM we will handle any CPPC notifications. + */ + int cppcval = 0; + if ((cpu_power_eax & CPUTPM1_HWP_NOTIFICATION) && + (resource_int_value("acpi", 0, "nocppcworkaround", &cppcval) != 0 + || cppcval == 0)) { + sc->cpu_features |= ACPI_CAP_INTR_CPPC; + } #endif if (devclass_get_drivers(device_get_devclass(dev), &drivers,