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 @@ -3309,8 +3309,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 @@ -3506,6 +3507,14 @@ slp_state |= ACPI_SS_DEV_SUSPEND; AcpiOsSleep(1000); + 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 != STYPE_SUSPEND_TO_IDLE) { status = AcpiEnterSleepStatePrep(stype); if (ACPI_FAILURE(status)) { @@ -3558,6 +3567,13 @@ sc->acpi_stype = STYPE_AWAKE; slp_state &= ~ACPI_SS_GPE_SET; } + if (slp_state & ACPI_SS_SPMC_ENTER) { + 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) { DEVICE_RESUME(root_bus); slp_state &= ~ACPI_SS_DEV_SUSPEND;