Skip to content

j314s (MacBook Pro M1 Pro): s2idle draws ~1.9–2.0 W; measurements and what's ruled out #290

Open

Description

@CoreyH

Mac and installed build

  • Mac: MacBook Pro (14-inch, M1 Pro, 2021), apple,j314s / apple,t6000, 8 cores.
  • Installed: Omarchy 4.5.0rc2 (Arch), linux-aurora 7.2.11.aurora9-1, m1n1-aurora 1.6.1.aurora3-1, uboot-asahi 2026.07.asahi2-1, GRUB 2.16.
  • Also measured: the CI package of Make M3 Pro sleep use 1.4 W instead of 2.6 W, and add the RTC wake alarm #274 (7.2.11.aurora10-1.382, installed beside the regular kernel). No local kernel patches.

Both firmware versions and provisioning

asahi,os-fw-version: 13.5, asahi,system-fw-version: 26.6.2

Reproduction, expected result, and actual result

Close the lid on battery with nothing attached. s2idle draws about 1.9–2.0 W, so a full charge lasts about a day and a half asleep. I've been measuring it since early October with a systemd-sleep hook that logs battery state and kernel power-state snapshots around each sleep, and I want to hand over what's already ruled out.

Measurements

Short lid-closed runs (11–14 min), averaged from charge_counter:

kernel change avg
aurora9 none (control) 1987 mW
aurora9 PMP request 0xd (pmp-dispext0) withdrawn in noirq 2012 mW
aurora9 0xc + 0xd withdrawn 1945 mW
aurora10 + #274 none 1945 mW

Overnight (17–24 h, from energy_now):

kernel change avg
7.1.12 (iconidentify 11.16) none 2172–2198 mW (3 nights)
7.2.10 none 1838 mW
7.2.10 AOP unbound 1825 mW
7.2.10 Wi-Fi/BT soft-blocked 1797 mW
aurora8 radios + dwc3/PCIe wakeup off 1759 mW
aurora9 radios off 1844 mW

Method notes:

  • On this machine charge_counter counts mA·s, not µAh. Over 61 s awake it gave 12.3 W against energy_now's 12.1 W.
  • energy_now rose 0.7–0.85 Wh during every short sleep, with no charger attached (the gauge re-estimating after a rest). So short runs need charge_counter, and night-to-night differences under ~50 mW are within gauge noise.
  • Short runs include a few seconds awake at each end, roughly +100 mW at 12 min, so they sit above the overnight figures.

Where the power isn't

  • CPUs: all 8 cores enter CPU PD in s2idle; s2idle/usage counts none in WFI. Each core logs about 3.6 entries per second of sleep, the rate of the AOP mailbox interrupt (293408000.mbox, IRQ 40), which fires about 3.6 times a second all night.
  • AOP: unbinding 293c00000.aop stops that interrupt but didn't change sleep power. It also can't be rebound on t6000 without a reboot (RTKit discovery fails with -62).
  • Radios: soft-blocking Wi-Fi and Bluetooth saves about 41 mW.
  • USB-C: atc0–3_usb stay on in sleep only because the dwc3-apple controllers are wakeup-enabled (GENPD_FLAG_ACTIVE_WAKEUP). With their wakeup disabled for the sleep they switch off. The saving is somewhere between 40 and 85 mW, unresolved because the kernel changed between nights.
  • Display PMP requests: pmp-disp0 and pmp-dispext0 are asserted all night, but withdrawing them changes nothing (the table above; details in Make M3 Pro sleep use 1.4 W instead of 2.6 W, and add the RTC wake alarm #274).
  • The PMP is on for this board (pmgr-misc: PMP resume fix, idle fabric governor and PMP for j314s #91: "PMP manages fabric and DCS p-states"), so apple_pmgr_misc.idle_fabric_pstate doesn't apply.

What stays powered

From pmgr-pwrstate dynamic debug across s2idle:

  • Display coprocessors: disp0_cpu0, disp0_fe, dispext0_cpu0 and dispext0_fe never switch off. pmp_report_disp0 and pmp_report_dispext0 are apple,always-on in t600x-die0.dtsi, and they pin their PMGR parents. (dispext1_* does switch off.)
  • Wi-Fi PCIe link: apcie_gp and pcie0_ref never switch off either. They're parents of the apple,always-on apcie_gp_sys, which holds 590000000.pcie. Removing the Wi-Fi/BT PCI functions for the sleep doesn't free them.
  • 73 domains are apple,always-on: DCS and AMCC, the AFNC fabric, AIC, nub/aon/SPMI, pms, pmp, sep, soc_dpe, the ATC common, pcie and usb_aon blocks, and debug.
  • Everything else powers down: gfx, ans2, audio, i2c, spi, uart, sio, mca, ane, isp, avd, atc*_cio*, dispext1, and the SD reader's link (pcie1_ref).

So what's left looks like the display coprocessors kept up because their firmware can't be restarted, plus the always-on SoC blocks. Is there known work on either on T600x: a DCP low-power state for s2idle, or the SoC sleep sequence (memory and fabric) beyond #170's CPU context-loss diagnostic? Or something cheaper to try first?

I can test on J314s. I can install a PR's CI package beside the regular kernel (no boot-chain changes, one-shot boot) and return charge_counter sleep numbers plus a PMGR-domain and interrupt breakdown the same day.

Relevant error lines

None; nothing fails. Every resume logs brcmf_p2p_set_firmware: failed to update device address ret -52 and spi-hid-apple-of spi2.0: status message mismatch on both aurora9 and aurora10.

Related issues, pull requests, or code examples

What was not tested

  • No external display or dock.
  • No RTC-timed runs (no wake alarm on T600x), so every short run is a manual lid close.
  • Overnight figures are energy_now only; no full night with charge_counter yet.
  • No other T600x board.

Activity

  1. CoreyH commented on Oct 30, 2026

    @CoreyH
    Author

    macOS sleep on this J314s, for comparison. macOS 26.6.2, clamshell sleep on battery: 185 min asleep (11:43:46 → 14:51:57), with 27 dark wakes totalling about 2.8 min. 13 came from the PMU RTC alarm (NUB.SPMISw3IRQ nub-spmi0.0x02) and 14 from wifibt via SMC. The gauge's raw capacity fell 22–33 mAh over the sleep, a range because the first reading was taken on AC seconds before unplugging. That's about 7–10 mA, roughly 0.1 W, about a twentieth of Linux's s2idle on the same machine, and the same order as the 0.24 W macOS figure for an M2 Pro in JJRPF/Aurora-DeepIdle. I'll repeat it overnight with a cleaner starting reading.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions