Skip to content

t6041-j575c: run the PMP and the J614c CPU thermal zones (all-core CPU 2.1x) - #1599

Merged
RyanTheTide merged 1 commit into
aurora-silicon:integration/aurorafrom
7robertodantas:j575c-pmp-thermal
Nov 13, 2026
Merged

RyanTheTide merged 1 commit into
aurora-silicon:integration/aurorafrom
7robertodantas:j575c-pmp-thermal

Conversation

@7robertodantas

@7robertodantas 7robertodantas commented Nov 11, 2026 •

Copy link
Copy Markdown
Contributor

Written with an AI assistant (Claude) on @7robertodantas's behalf; every hardware step was run and checked on the owner's J575c.

t6041-j575c: run the PMP and the J614c CPU thermal zones

On the J575c (Mac Studio, M4 Max), all-core CPU load ran at about half speed. Two guesses in the board DT, which was written before there was a J575c ADT, caused it:

  1. The CPU thermal zone throttled at any temperature. cpu-die-thermal was the J616c's early guess: one power_allocator zone with a passive trip at 113 C, no switch-on trip and no sustainable-power. With no switch-on trip, the allocator runs all the time. With no budget, it estimates one from the lowest operating points. Under an all-core load at a 56 C die, it held P0/E/P1 at 2352/1020/1260 MHz, and the whole Mac stayed near 40 W.
  2. The PMP was off. The J575c left pmp_dart, pmp_report, pmp_mbox and pmc disabled and had no pmp alias, so it also dropped the cpufreq apple,fast-die-effort links. The J614c and J616c have run the PMP for a while. Enabling it alone made things worse: with the old zone kept, all three cooling devices sat at their maximum (19/19, 6/6, 19/19) at a 48 C die, with every cluster at its lowest state.

This change takes what the M4 Max MacBook Pros run (t6041-j614c-j616c.dtsi). They have the same T6041 SoC, and their DT uses the same SMC keys in the same order (TCMz, TCMb, Tpx0-5, Tpx8-D, Tex0-3 at hwmon indices 0-17; checked against this Mac's labels):

  • PMP: the pmp alias (aura's dt_set_pmp() then copies this Mac's PMP values from the ADT and enables the node), pmp_dart, pmp_report, pmp_mbox, pmc with apple,pmp, the GPU on pmp_gfx, and apple,fast-die-effort kept.
  • CPU zones: their 17 zones, copied unchanged: the die zone on TCMz plus one per core-complex sensor. They switch on at 112 C, control at 116 C, are hot at 120 C and critical at 125 C, and they sit behind the PMP's 110 C fast-die loop. Their GPU zones are not copied: they read SMC sensors the J575c DT does not describe yet.

Checks against this Mac's ADT (macOS 27.0.1): /arm-io/pmgr has pmp = 2, clpc = 3 and ppt-thrtl, llc-thrtl, amx-thrtl = 1. /arm-io/pmp (ASC at 0x500e00000, IRQs 414-417) and /arm-io/dart-pmp (0x500300000) match t604x.dtsi.

Tested on a J575c (linux-aurora 7.3.0, from a one-shot aura trial Stage 2 whose DTB is the live J575c tree plus only this change). The load is stress-ng --cpu 16 --cpu-method matrixprod for 5 minutes, logged every 2 s from the SMC hwmon and cpufreq.

Before PMP only This PR
All-core clocks P0/E/P1, MHz (avg) 2352/1020/1260 1279/1030/1279 4104/2592/4104
All-core throughput, bogo ops/s 758 542 1592 (2.1x)
Whole-Mac power, all-core 40 W 34 W 86 W
CPU die (TCMz), all-core, max 71 C 70 C 90 C
One P core, bogo ops/s 145 not run 150
CPU + GPU together: power / die max 40 W / 78 C not run 94 W / 94 C, CPU at full clocks
glmark2 offscreen 1080p, avg of 18 scenes: GPU alone / with CPU load 2025 / 1288 FPS not run 2218 / 1630 FPS
Check Result
PMP pass: "PMP started", apple-pmp-report: "PMP running (status 0x1)", 90 ADT values copied; apple-clpc binds
GPU on pmp_gfx pass: glmark2 --validate passes every scene that has a reference image; vkcube runs; no GPU faults
Thermal zones pass: 17 zones; no cooling device active at a 90-94 C die
HDMI, USB-C display, USB, Ethernet, speaker and jack cards unchanged, all working
dt-validate against this tree's bindings no warnings, the same as before the change
Boot with the change permanent pass: PMP running, 17 zones, no failed units
s2idle (rtcwake -d rtc1 -m freeze -s 30) with the PMP running pass: same boot, suspend_stats success; both displays, Ethernet and the audio cards back; then all-core at 4104/2592/4104 MHz again (91 W)
Fans under a 10 min CPU + GPU load (~88 W) pass: the SMC drives them on its own. The die levels off at 94-95 C. The SMC fan target starts rising at about 90 C and goes from 1000 (minimum) to 1327 RPM, still rising when the load ends, and both fans track it within about 15 RPM. Full CPU clocks the whole time, no cooling device active

Fan ramp: 10 min of stress-ng --cpu 16 plus offscreen glmark2, sampled every 2 s from the SMC hwmon (temp1 TCMz, fanN_input, fanN_target, power1). The CPU stayed at 4104/2592/4104 MHz in all 298 load samples.

Time CPU die (TCMz) Fan 1: target / actual RPM Fan 2: target / actual RPM Whole-Mac power
idle 49 C 1000 / 989 1000 / 992 25 W
load +1.5 min 86 C 1000 / 992 1000 / 992 87 W
load +3.5 min 91 C 1006 / 996 1006 / 995 88 W
load +4.5 min 91 C 1028 / 1012 1028 / 1015 87 W
load +5.5 min 94 C 1063 / 1050 1063 / 1049 90 W
load +6.5 min 94 C 1106 / 1093 1106 / 1092 88 W
load +7.5 min 94 C 1154 / 1138 1154 / 1143 88 W
load +8.5 min 94 C 1210 / 1195 1210 / 1193 87 W
load +9.5 min 94 C 1267 / 1251 1267 / 1255 87 W
0.5 min after load 58 C 1319 / 1304 1319 / 1303 26 W
2.5 min after load 52 C 1299 / 1309 1299 / 1313 25 W

The die peaked at 95 C, and the fan target peaked at 1327 RPM just after the load ended (fan range 1000-3625 RPM).

Not tested:

  • Fan ramp to high speed. The SMC was not pushed past about 1300 RPM (see the fan row above), and Linux cannot set a fan speed here (no F0Md/F1Md mode key).
  • Sustained load near 112-116 C, so the J614c sustainable-power values (48 W die, 24 W per P cluster, 2 W per E zone) are untested on the Studio. The Studio has more cooling than the MacBook Pros, so these may be conservative for it.
  • Many suspend cycles: one s2idle cycle was run.
  • Heavy GPU loads. glmark2 offscreen at 1080p only adds about 4 W over idle.

Notes:

  • aura prints cpufreq: Chip 0x6041 is unsupported on this Mac. That message is not involved here: the T6040 path in aura only steps the boot P-state and programs no throttle registers.
  • The ADT's /arm-io/pmp has a second block at 0x500850000 (0x4000) that the pmp node's first reg (0x500700000, 0xe0000) does not cover. The J614c and J616c share this node and run, so it is left unchanged.

🤖 Generated with Claude Code

@RyanTheTide RyanTheTide left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Checked against t6041-j614c-j616c.dtsi: the PMP nodes, the pmp alias and the 17 CPU zones match, and the SMC sensor indices line up with the J575c labels. The before/after numbers and the s2idle and fan runs cover it. Approved.

@RyanTheTide

Copy link
Copy Markdown
Contributor

@7robertodantas this conflicts with integration/aurora now that #1575 and #1573 are in (same parts of t6041-j575c.dts). Please rebase or merge integration/aurora into the branch and we'll merge it.

… zones

The J575c's CPU thermal zone was a guess (the J616c's early limits): one
power-allocator zone with no switch-on trip and no sustainable-power. The
allocator then throttled at any temperature. Under an all-core load at a
56 C die, it held the clusters at 2352 MHz (P0), 1020 MHz (E) and
1260 MHz (P1), about 40 W for the whole Mac, half the throughput.

The PMP was also left off, so the cpufreq fast-die-effort links were
dropped. With the PMP on and the old zone kept, the allocator pinned
every cluster at its lowest state (all cooling devices at their maximum
at a 48 C die).

Take what the M4 Max MacBook Pros run (t6041-j614c-j616c.dtsi): the
same T6041, the same SMC sensor keys in the same order and the same ADT
die limits.
- Run the PMP: the pmp alias (the loader copies this Mac's PMP values
  from the ADT and enables it), its DART, report, mailbox and the PMC,
  and the GPU on the PMP's GPU domain. Keep fast-die-effort.
- Use their 17 CPU zones (die, and one per core-complex sensor), which
  switch on at 112 C and control at 116 C behind the PMP's 110 C loop.

Tested on a J575c (Mac Studio, M4 Max), from a trial Stage 2: the PMP
starts and reports running, with 90 ADT values copied. Under a 5 min
all-core stress-ng load the clusters hold 4104/2592/4104 MHz at 86 W
and a 90 C die. Throughput rises from 758 to 1592 bogo ops/s (2.1x).
With the GPU loaded as well: 94 W, a 94 C die and full CPU clocks.
glmark2 --validate passes and vkcube runs on the PMP GPU domain.
HDMI, USB-C display, USB, Ethernet and audio are unchanged.

Signed-off-by: Roberto Dantas <7robertodantas@gmail.com>
Assisted-by: LLM (Claude Code)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@7robertodantas

Copy link
Copy Markdown
Contributor Author

@RyanTheTide Rebased onto integration/aurora (bf00add). The conflicts were the DockChannel node and &cpuidle; both kept. The fast-die-effort deletions are dropped as before, since this PR turns the PMP on. Thanks!

@RyanTheTide RyanTheTide left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Rebase checked: the PMP and thermal-zone changes are the same as the reviewed version, and the DockChannel and cpuidle nodes from the base are kept. dt-checks and host-tests pass.

@RyanTheTide
RyanTheTide merged commit f105d94 into aurora-silicon:integration/aurora Nov 13, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants