diff --git a/sys/dev/acpica/acpi.c b/sys/dev/acpica/acpi.c --- a/sys/dev/acpica/acpi.c +++ b/sys/dev/acpica/acpi.c @@ -3439,8 +3439,9 @@ ACPI_SS_NONE = 0, ACPI_SS_GPE_SET = 1 << 0, ACPI_SS_DEV_SUSPEND = 1 << 1, - ACPI_SS_SLP_PREP = 1 << 2, - ACPI_SS_SLEPT = 1 << 3, + ACPI_SS_SPMC_ENTER = 1 << 2, + ACPI_SS_SLP_PREP = 1 << 3, + ACPI_SS_SLEPT = 1 << 4, }; static void @@ -3638,6 +3639,14 @@ } slp_state |= ACPI_SS_DEV_SUSPEND; + if (sc->acpi_spmc_device != NULL) { + MPASS(sc->acpi_spmc_enter != NULL); + if (sc->acpi_spmc_enter(sc->acpi_spmc_device) != 0) + device_printf(sc->acpi_dev, "failed to run SPMC entry\n"); + else + slp_state |= ACPI_SS_SPMC_ENTER; + } + if (stype != POWER_STYPE_SUSPEND_TO_IDLE) { status = AcpiEnterSleepStatePrep(acpi_sstate); if (ACPI_FAILURE(status)) { @@ -3687,6 +3696,13 @@ sc->acpi_stype = POWER_STYPE_AWAKE; slp_state &= ~ACPI_SS_GPE_SET; } + if ((slp_state & ACPI_SS_SPMC_ENTER) != 0) { + MPASS(sc->acpi_spmc_device != NULL); + MPASS(sc->acpi_spmc_exit != NULL); + if (sc->acpi_spmc_exit(sc->acpi_spmc_device) != 0) + device_printf(sc->acpi_dev, "failed to run SPMC exit\n"); + slp_state &= ~ACPI_SS_SPMC_ENTER; + } if ((slp_state & ACPI_SS_DEV_SUSPEND) != 0) { DEVICE_RESUME(root_bus); slp_state &= ~ACPI_SS_DEV_SUSPEND;