Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F144006078
D54627.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
4 KB
Referenced Files
None
Subscribers
None
D54627.diff
View Options
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
@@ -218,7 +218,8 @@
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 && sc->acpi_s4bios)
+ if (state == ACPI_STATE_S4 &&
+ acpi_should_do_s4bios(sc))
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
@@ -193,6 +193,7 @@
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);
@@ -614,9 +615,12 @@
if (AcpiGbl_FADT.Flags & ACPI_FADT_RESET_REGISTER)
sc->acpi_handle_reboot = 1;
- /* Only enable S4BIOS by default if the FACS says it is available. */
+ /*
+ * 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 = true;
+ sc->acpi_s4bios = sc->acpi_s4bios_supported = true;
/*
* Probe all supported ACPI sleep states. Awake (S0) is always supported,
@@ -744,9 +748,13 @@
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_BOOL(&sc->acpi_sysctl_ctx, SYSCTL_CHILDREN(sc->acpi_sysctl_tree),
- OID_AUTO, "s4bios", CTLFLAG_RW, &sc->acpi_s4bios, 0,
+ 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).");
SYSCTL_ADD_INT(&sc->acpi_sysctl_ctx, SYSCTL_CHILDREN(sc->acpi_sysctl_tree),
OID_AUTO, "verbose", CTLFLAG_RW, &sc->acpi_verbose, 0, "verbose mode");
SYSCTL_ADD_INT(&sc->acpi_sysctl_ctx, SYSCTL_CHILDREN(sc->acpi_sysctl_tree),
@@ -4421,6 +4429,25 @@
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
@@ -65,6 +65,7 @@
int acpi_standby_sx;
bool acpi_s4bios;
+ bool acpi_s4bios_supported;
int acpi_sleep_delay;
int acpi_do_disable;
@@ -528,6 +529,13 @@
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
@@ -240,7 +240,8 @@
pmap_remap_lowptdi(true);
/* Call ACPICA to enter the desired sleep state */
- if (state == ACPI_STATE_S4 && sc->acpi_s4bios)
+ if (state == ACPI_STATE_S4 &&
+ acpi_should_do_s4bios(sc))
status = AcpiEnterSleepStateS4bios();
else
status = AcpiEnterSleepState(state);
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Wed, Feb 4, 6:36 AM (3 h, 50 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
28432438
Default Alt Text
D54627.diff (4 KB)
Attached To
Mode
D54627: acpi: New R/O 'hw.acpi.s4bios_supported' sysctl, gate S4BIOS with it
Attached
Detach File
Event Timeline
Log In to Comment