diff --git a/sys/amd64/acpica/acpi_wakeup.c b/sys/amd64/acpica/acpi_wakeup.c --- a/sys/amd64/acpica/acpi_wakeup.c +++ b/sys/amd64/acpica/acpi_wakeup.c @@ -227,8 +227,12 @@ WAKECODE_FIXUP(wakeup_gdt, uint16_t, pcb->pcb_gdt.rd_limit); WAKECODE_FIXUP(wakeup_gdt + 2, uint64_t, pcb->pcb_gdt.rd_base); - /* Call ACPICA to enter the desired sleep state */ - if (state == ACPI_STATE_S4 && acpi_should_do_s4bios(sc)) + /* + * Call ACPICA to enter the desired sleep state. Currently, + * reaching this code with 'state' being ACPI_STATE_S4 implies + * a S4BIOS request. + */ + if (state == ACPI_STATE_S4) status = AcpiEnterSleepStateS4bios(); else status = AcpiEnterSleepState(state); 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 @@ -189,7 +189,6 @@ enum power_stype stype); static void acpi_system_eventhandler_wakeup(void *arg, enum power_stype stype); -static int acpi_s4bios_sysctl(SYSCTL_HANDLER_ARGS); static enum power_stype acpi_sstate_to_stype(int sstate); static int acpi_sname_to_sstate(const char *sname); static const char *acpi_sstate_to_sname(int sstate); @@ -626,8 +625,8 @@ * Mark whether S4BIOS is available according to the FACS, and if it is, * enable it by default. */ - if (AcpiGbl_FACS != NULL && AcpiGbl_FACS->Flags & ACPI_FACS_S4_BIOS_PRESENT) - sc->acpi_s4bios = sc->acpi_s4bios_supported = true; + sc->acpi_s4bios_supported = AcpiGbl_FACS != NULL && + (AcpiGbl_FACS->Flags & ACPI_FACS_S4_BIOS_PRESENT) != 0; /* * Probe all supported ACPI sleep states. Awake (S0) is always supported, @@ -646,6 +645,12 @@ sc->acpi_supported_stypes[acpi_sstate_to_stype(state)] = true; } } + /* + * Prevent users from requesting firmware-supported image saving if firmware + * does not indicate it as supported. + */ + if (!sc->acpi_s4bios_supported) + sc->acpi_supported_stypes[POWER_STYPE_FW_HIBERNATE] = false; /* * Dispatch the default sleep type to devices. The lid switch is set @@ -758,10 +763,6 @@ SYSCTL_ADD_INT(&sc->acpi_sysctl_ctx, SYSCTL_CHILDREN(sc->acpi_sysctl_tree), OID_AUTO, "sleep_delay", CTLFLAG_RW, &sc->acpi_sleep_delay, 0, "sleep delay in seconds"); - SYSCTL_ADD_PROC(&sc->acpi_sysctl_ctx, SYSCTL_CHILDREN(sc->acpi_sysctl_tree), - OID_AUTO, "s4bios", CTLTYPE_U8 | CTLFLAG_RW | CTLFLAG_MPSAFE, - sc, 0, acpi_s4bios_sysctl, "CU", - "On hibernate, have the firmware save/restore the machine state (S4BIOS)."); SYSCTL_ADD_BOOL(&sc->acpi_sysctl_ctx, SYSCTL_CHILDREN(sc->acpi_sysctl_tree), OID_AUTO, "s4bios_supported", CTLFLAG_RD, &sc->acpi_s4bios_supported, 0, "Whether firmware supports saving/restoring the machine state (S4BIOS)."); @@ -4488,25 +4489,6 @@ return (error); } -static int -acpi_s4bios_sysctl(SYSCTL_HANDLER_ARGS) -{ - struct acpi_softc *const sc = arg1; - bool val; - int error; - - val = sc->acpi_s4bios; - error = sysctl_handle_bool(oidp, &val, 0, req); - if (error != 0 || req->newptr == NULL) - return (error); - - if (val && !sc->acpi_s4bios_supported) - return (EOPNOTSUPP); - sc->acpi_s4bios = val; - - return (0); -} - static int acpi_sname_to_sstate(const char *sname) { diff --git a/sys/dev/acpica/acpivar.h b/sys/dev/acpica/acpivar.h --- a/sys/dev/acpica/acpivar.h +++ b/sys/dev/acpica/acpivar.h @@ -68,7 +68,6 @@ enum power_stype acpi_lid_switch_stype; int acpi_standby_sx; - bool acpi_s4bios; bool acpi_s4bios_supported; int acpi_sleep_delay; @@ -517,13 +516,6 @@ return (strs[state]); } -static __inline bool -acpi_should_do_s4bios(struct acpi_softc *sc) -{ - MPASS(!sc->acpi_s4bios || sc->acpi_s4bios_supported); - return (sc->acpi_s4bios); -} - char *acpi_name(ACPI_HANDLE handle); int acpi_avoid(ACPI_HANDLE handle); int acpi_disabled(char *subsys); diff --git a/sys/i386/acpica/acpi_wakeup.c b/sys/i386/acpica/acpi_wakeup.c --- a/sys/i386/acpica/acpi_wakeup.c +++ b/sys/i386/acpica/acpi_wakeup.c @@ -239,8 +239,12 @@ */ pmap_remap_lowptdi(true); - /* Call ACPICA to enter the desired sleep state */ - if (state == ACPI_STATE_S4 && acpi_should_do_s4bios(sc)) + /* + * Call ACPICA to enter the desired sleep state. Currently, + * reaching this code with 'state' being ACPI_STATE_S4 implies + * a S4BIOS request. + */ + if (state == ACPI_STATE_S4) status = AcpiEnterSleepStateS4bios(); else status = AcpiEnterSleepState(state);