The diff below disables the screen backlight on apple silicon macs when the
lid is closed.
Normally, we suspend or hibernate depending on the value of machdep.lid_action.
Since suspend doesn't work reliably yet I think this is a good intermediate
solution to save some power while the laptop is idling.
ok?
Index: arch/arm64/arm64/acpi_machdep.c
===================================================================
RCS file: /cvs/src/sys/arch/arm64/arm64/acpi_machdep.c,v
retrieving revision 1.20
diff -u -p -r1.20 acpi_machdep.c
--- arch/arm64/arm64/acpi_machdep.c 13 Sep 2022 17:14:54 -0000 1.20
+++ arch/arm64/arm64/acpi_machdep.c 24 Nov 2022 17:57:09 -0000
@@ -36,7 +36,6 @@
#include "apm.h"
-int lid_action;
int pwr_action = 1;
int acpi_fdt_match(struct device *, void *, void *);
Index: arch/arm64/arm64/machdep.c
===================================================================
RCS file: /cvs/src/sys/arch/arm64/arm64/machdep.c,v
retrieving revision 1.77
diff -u -p -r1.77 machdep.c
--- arch/arm64/arm64/machdep.c 24 Nov 2022 14:43:16 -0000 1.77
+++ arch/arm64/arm64/machdep.c 24 Nov 2022 17:57:09 -0000
@@ -71,6 +71,7 @@ void (*cpuresetfn)(void);
void (*powerdownfn)(void);
int cold = 1;
+int lid_action = 1;
struct vm_map *exec_map = NULL;
struct vm_map *phys_map = NULL;
@@ -322,6 +323,10 @@ extern uint64_t cpu_id_aa64pfr1;
* machine dependent system variables.
*/
+const struct sysctl_bounded_args cpuctl_vars[] = {
+ { CPU_LIDACTION, &lid_action, 0, 2 },
+};
+
int
cpu_sysctl(int *name, u_int namelen, void *oldp, size_t *oldlenp, void *newp,
size_t newlen, struct proc *p)
@@ -372,7 +377,8 @@ cpu_sysctl(int *name, u_int namelen, voi
case CPU_ID_AA64ZFR0:
return sysctl_rdquad(oldp, oldlenp, newp, 0);
default:
- return (EOPNOTSUPP);
+ return (sysctl_bounded_arr(cpuctl_vars, nitems(cpuctl_vars),
+ name, namelen, oldp, oldlenp, newp, newlen));
}
/* NOTREACHED */
}
Index: arch/arm64/dev/aplsmc.c
===================================================================
RCS file: /cvs/src/sys/arch/arm64/dev/aplsmc.c,v
retrieving revision 1.18
diff -u -p -r1.18 aplsmc.c
--- arch/arm64/dev/aplsmc.c 14 Nov 2022 11:11:17 -0000 1.18
+++ arch/arm64/dev/aplsmc.c 24 Nov 2022 17:57:09 -0000
@@ -37,6 +37,9 @@
#include "apm.h"
+extern int lid_action;
+extern void (*simplefb_burn_hook)(u_int);
+
extern void (*cpuresetfn)(void);
extern void (*powerdownfn)(void);
@@ -124,6 +127,8 @@ struct aplsmc_softc {
struct ksensor sc_sensors[APLSMC_MAX_SENSORS];
int sc_nsensors;
struct ksensordev sc_sensordev;
+
+ int sc_wakeup;
};
struct aplsmc_softc *aplsmc_sc;
@@ -326,6 +331,8 @@ aplsmc_attach(struct device *parent, str
sensordev_install(&sc->sc_sensordev);
sensor_task_register(sc, aplsmc_refresh_sensors, 5);
+ sc->sc_wakeup = 0;
+
#if NAPM > 0
apm_setinfohook(aplsmc_apminfo);
#endif
@@ -372,7 +379,14 @@ aplsmc_handle_notification(struct aplsmc
}
break;
case SMC_EV_TYPE_LID:
- /* XXX Handle lid events. */
+ switch (lid_action) {
+ case 1: /* Suspend */
+ case 2: /* Hibernate */
+ if (simplefb_burn_hook)
+ simplefb_burn_hook(sc->sc_wakeup);
+ sc->sc_wakeup = !sc->sc_wakeup;
+ break;
+ }
break;
default:
#ifdef APLSMC_DEBUG
Index: arch/arm64/include/cpu.h
===================================================================
RCS file: /cvs/src/sys/arch/arm64/include/cpu.h,v
retrieving revision 1.31
diff -u -p -r1.31 cpu.h
--- arch/arm64/include/cpu.h 24 Nov 2022 14:43:16 -0000 1.31
+++ arch/arm64/include/cpu.h 24 Nov 2022 17:57:09 -0000
@@ -36,7 +36,8 @@
#define CPU_ID_AA64PFR1 9
#define CPU_ID_AA64SMFR0 10
#define CPU_ID_AA64ZFR0 11
-#define CPU_MAXID 12 /* number of valid machdep ids
*/
+#define CPU_LIDACTION 12
+#define CPU_MAXID 13 /* number of valid machdep ids
*/
#define CTL_MACHDEP_NAMES { \
{ 0, 0 }, \