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 }, \