Repository navigation
t8112: PMU RTC wake alarm (M2), on top of #351 - #454
Draft
p4ulcristian wants to merge 6 commits into
Draft
p4ulcristian wants to merge 6 commits into
p4ulcristian wants to merge 6 commits into
Conversation
…rupts The controller's interrupt words hold the peripheral interrupts first and the controller's own events after them, "notify" (the RX FIFO is no longer empty) first. The driver puts notify at 256, after T6030's 256 peripheral interrupts. T6000's nub-spmi0 has 192: macOS's device tree numbers its events from 0xc0, and with a reply left in the FIFO the pending bit is 192 (ack word 6, bit 0). So once a T6000 device tree gives nub-spmi0 its interrupt, the driver unmasks bit 256 and waits for a notify that never comes: every SPMI read times out and the PMU becomes unreachable. Take the peripheral interrupt count from the match data, 192 for apple,t6000-spmi and 256 for the rest, and derive the notify position, the irq domain's bounds, the handler's scan and the mask/ack setup from it. Tested on J314s (M1 Pro): with nub-spmi0's interrupt described, SPMI transfers complete in 40-60 us and the PMU's RTC alarm wakes the system from s2idle. Assisted-by: Claude:claude-opus-5-5 Signed-off-by: Corey Henderson <nuwanda@gmail.com>
The Maverick PMUs (the M1 Pro's and the M2 Pro's) latch a fired alarm in an event byte as well as in the alarm control byte, and keep the alarm interrupt silent until the event byte is cleared by writing 1 to it. Allow a fifth cell, rtc_alarm_event, after the four alarm cells. Assisted-by: Claude:claude-opus-5-5 Signed-off-by: Corey Henderson <nuwanda@gmail.com>
…gister The Maverick PMUs (the M1 Pro's and the M2 Pro's) latch a fired alarm in two places: bit 1 of the alarm control byte and an interrupt status byte. Writing the control byte back with bit 1 set, which is how T6030's PMU acknowledges the event, leaves the bit set here. It clears when it is written as 0. The status byte clears when 1 is written to it, and until then the PMU keeps the alarm interrupt silent, so every later alarm would be lost. With the optional rtc_alarm_event cell, clear the status byte before arming and after firing. The control byte's bit 1 then clears where it is written as 0. Without the cell, nothing changes. Tested on J314s (M1 Pro): awake alarms fire on their second and leave both registers clear, and every timed s2idle sleep that nothing else woke ended on the alarm. Assisted-by: Claude:claude-opus-5-5 Signed-off-by: Corey Henderson <nuwanda@gmail.com>
The time is the SMC's CLKM plus a tick offset, but the PMU's alarm compares against the PMU's own counter, which CLKM lags by a few ms (5.5 to 6.3 ms on J314s, once 14 to 24 ms right after boot). When the tick offset's fraction is under that lag, the alarm fires while the time still reads the second before. The RTC core then finds its timer not yet expired and sets the same second again, the PMU fires again at once, and so on until the time catches up: five or six interrupts and a burst of SPMI traffic for one alarm. That is the state after the PMU loses power, which leaves the offset at 0. When the offset's fraction is under 1/32 s, arm the alarm one counter second later. It then fires within the set second, and read_alarm still reports the time that was set. For fractions between the lag and 1/32 s the alarm comes up to a second late, which the tick-offset path already allowed. The seconds-offset path is unchanged. Tested on J314s (M1 Pro) with the offset's fraction cleared: three awake alarms raised one interrupt each, where they raised 6, 5 and 5 before. Assisted-by: Claude:claude-opus-5-5 Signed-off-by: Corey Henderson <nuwanda@gmail.com>
The Maverick PMU on nub-spmi0 has an RTC alarm (macOS's device tree: info-rtc_alarm_ctrl 0x1401, info-rtc_alarm_offset 0x140c, info-rtc_alarm_event 0x14c0, info-rtc_irq_mask_offset 0x14c2). It raises peripheral interrupt 2 of nub-spmi0, whose own interrupt is AIC 636. Describe nub-spmi0 as an interrupt controller and the alarm's four cells, and give the SMC's rtc node the cells, the alarm interrupt and wakeup-source. This needs the SPMI controller to put T6000's notify event at 192 (previous patches); without it, describing the interrupt breaks every SPMI transfer. Tested on J314s (M1 Pro) with the same description applied to the live device tree: the alarm fires on its second, and it wakes the system from s2idle. Assisted-by: Claude:claude-opus-5-5 Signed-off-by: Corey Henderson <nuwanda@gmail.com>
The Stowe PMU on nub-spmi0 has an RTC alarm (macOS's device tree: info-rtc_alarm_ctrl 0xf800, info-rtc_alarm_offset 0xf808, info-rtc_alarm_event 0xf80c, info-rtc_irq_mask_offset 0xf80e). It raises peripheral interrupt 2 of nub-spmi0, whose own interrupt is AIC 384. Describe nub-spmi0 as an interrupt controller and the alarm's four cells, and give the SMC's rtc node the cells, the alarm interrupt and wakeup-source. T8112's controller has 256 peripheral interrupts (macOS lists its own events from 256 on), so the SPMI driver needs no change. Stowe latches a fired alarm in the event byte and in the control byte's event bit, and clears the enable bit. Writing 1 to the event byte clears both latches; writing the control byte back does not, with the event bit as 1 or as 0. So the rtc node needs the rtc_alarm_event cell, like the Maverick PMUs. Tested on J413 (MacBook Air 13" M2), 7.2.11.aurora16 with rtc-macsmc from this series and a device tree built from this patch: awake alarms raise one interrupt each on their second (3 of 3), and every timed s2idle sleep ended on the alarm (5 of 5 at 20 s; with the same description edited into the shipped device tree, 13 of 13 at 20-30 s and 1 of 1 at 3600 s). The J415, J473 and J493 device trees compile; they are not tested. Assisted-by: Claude:claude-fable-5-2 Signed-off-by: Paul Martin Cristian <p4ulcristian@gmail.com>
This was referenced Nov 11, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This makes the PMU's RTC wake alarm work on T8112 (M2):
rtcwake, and timed wakes from s2idle. It is one device-tree commit on top of #351 (T600x), and needs #351'srtc_alarm_eventcell and driver change. Only the last commit is new; the five before it are #351. Draft until #351 merges; I'll rebase then.Patch
arm64: dts: apple: t8112:describe the alarm:info-rtc_alarm_ctrl0xf800,info-rtc_alarm_offset0xf808,info-rtc_alarm_event0xf80c,info-rtc_irq_mask_offset0xf80e;wakeup-source.No driver change:
How the Stowe PMU behaves (read and written by hand through the nvmem device before any driver used the cells):
0x41. On the alarm's second it reads0x03(enable cleared, event set) and the event byte at 0xf80c reads 1. 5 of 5 alarms fired on the second they were set for.So Stowe needs the
rtc_alarm_eventcell like the Maverick PMUs. One difference from #351's comments: on Stowe the control byte's event bit is cleared by the event-byte write, not by writing that bit as 0. The driver's sequence handles both.Testing on J413 (MacBook Air 13" M2, 2022),
linux-aurora 7.2.11.aurora16-1,m1n1-aurora 1.6.1.aurora23-2, Omarchy on GRUB:updates/, in the initramfs), andt8112-j413.dtbbuilt from this patch applied to the aurora16 source (bed544b). Built the same way, the unpatched source gives a dtb byte-identical to the one the package ships./sys/class/rtc/rtc0/wakealarm, 3 interrupts, each on its second, event cleared and alarm disarmed after each.rtcwake -m freeze -s 20ended on the alarm (/sys/power/pm_wakeup_irqis the macsmc-rtc interrupt each time).charge_counterfell by 50892 mA·s, 84.5 mA average at 12.1 V; Wi-Fi associated, lid open, nothing attached; one sample). Corrected: an earlier version of this text said 0.40 W. That came fromenergy_nowover the 3600 s sleep;energy_nowis the gauge's remaining-capacity estimate, which is stale right at wake and fell a further 0.46 Wh within 25 s of waking.Not tested
scripts/dtc), nothing more. I have no such Mac.dt_binding_check/dtbs_check.🤖 Generated with Claude Code