Skip to content

arm64: dts: apple: t6050-j714s: Run the PMP and report the GPU to it - #1376

Merged
DjDeveloperr merged 3 commits into
integration/aurorafrom
djdev/t6050-j714s-pmp
Nov 9, 2026
Merged

DjDeveloperr merged 3 commits into
integration/aurorafrom
djdev/t6050-j714s-pmp

Conversation

@DjDeveloperr

@DjDeveloperr DjDeveloperr commented Nov 9, 2026 •

Copy link
Copy Markdown
Contributor

Runs the PMP on the M5 Pro (J714s) and tells it when the GPU is on, so the PMP votes DRAM (DCS) and fabric performance for GPU load as it does under macOS. Follows #1324 and #1326, which added the PMC, CLPC, PMP and PMP-report support for T6050 with everything disabled on the boards.

One commit, arm64: dts: apple: t6050-j714s: Run the PMP and report the GPU to it:

  • t6050-peripherals.dtsi: the GPU's request in the PMP report (AGX, soc-device 16, so report@f), on the GPU's own power state (ps_gfx), as T6041 does. The PMP is told the GPU is on only while it is powered. A request with the GPU off crashes the T6041 PMP.

  • t6050-j714s.dts: enables these together:

    • the PMP with its boot arguments (ADT /chosen board-id 8, dram-vendor-id 255, /arm-io/pmgr pmc 1, pmc-pmgr 0x3f), its mailbox, DART and power states;
    • the PMP report;
    • the PMC's agent 0 (apple,static-voters = <0 1 3>, apple,pmp so the PMC waits for the PMP);
    • sgx taking the report entry as its power domain.

    Because they are enabled together, the GPU can't wait on a disabled report. The CLPC keeps its vote; the PMC takes the higher of the two.

  • t6050-j714s-pmp-tunables.dtsi (new): the 148 iop-pmp0-nub firmware properties from the J714sAP 27.0 ADT, raw bytes, as t8142-j813-pmp-tunables.dtsi does for J813.

Two follow-ups for the first dt-checks run, which found three new warnings on t6050-j714s.dtb:

  • dt-bindings: soc: apple: pmp: Type the firmware's segment names as a string. The ADT value is a NUL-terminated string. A DTB has no types, so dt-validate decodes it as a string and the uint8-array apple,tunable- pattern rejected it, already on t8142-j813 in the base run. The property now has its own string type and is kept out of the bytes pattern. The DTB bytes don't change.
  • arm64: dts: apple: t6050: Name the PMP DART's regions: "dart", "dapf", from the ADT dart-pmp0 instance list (DART, then DAPF; the node also carries dapf-instance-0). No driver looks them up by name.

Results on J714sAP

Default SSD boot with this DT (2026-11-09; the 7.3.0-m5-merge kernel with only the DTB from this commit; installed over SSH, then rolled back to the default 7.3.0-m5-argb):

  • Boot and desktop: the set comes up over SSH and Hyprland runs. No oops/BUG/WARN/SError; error lines and deferred devices are the same as on the default set.
  • PMP and GPU: apple_pmp: io.cpp:61: PMP started; the GPU binds through pmp-gfx (genpd gfx -> pmp-gfx, both on). apple-pmp-report 284240000.pmp-report: PMP running (status 0x1), requests 0x100004f000: MACC0/1, PACC, DISPINT, ANS and now AGX. SOC-DEV-PS-ACK reads back the same 0x4f000 / 0x10.
  • DCS / fabric votes under gpubench (CLPC on; µs per submission, median):
gpubench default set: PMP agent with this DT: PMP agent (honoured) CLPC µs default / this DT
compute.heavy alu d8 iBoot's 5/1, not honoured 5 / 2 6 / 3 267.5 / 267.5
render.heavy fill 1080p d8 iBoot's 5/1, not honoured 5 / 3 6 / 3 126.1 / 125.8
compute.heavy bw d8 iBoot's 5/1, not honoured 5 / 2 6 / 3 489.2 / 488.0
copy.bw buf2buf d4 iBoot's 5/1, not honoured 5 / 2 6 / 3 489.2 / 488.3
compute.light d4 iBoot's 5/1, not honoured 5 / 1-3 6 / 3 40.2 / 34.7
submit.empty d1 iBoot's 5/1, not honoured 0 / 0 6 / 3 1.156 / 1.158
idle after the GPU work iBoot's 5/1, not honoured 0 / 0 0 / 0

Timings and SMC power are unchanged, as expected: with both voting the PMC takes the CLPC's higher DCS 6.

PMP alone (RAM-boot kit, same DT content; the CLPC's PMC enable bits cleared for one test): the PMC honours the PMP's DCS 5 / fabric 3. Bandwidth-bound compute runs at 541.3 µs and 27.4 W, against 486.1 µs and 29.8 W with the CLPC's DCS 6. A 12-thread CPU memcpy gets no PMP vote: the PMP follows the GPU, not CPU memory traffic. Without the GPU's request the PMP acknowledges the other requests and drops iBoot's static vote to 0, but never votes for GPU load.

Testing

  • All 11 T6050 board DTBs build with dtc; J714s has no new warnings (only the existing simple_bus_reg on pmp@284e00000).
  • Locally at the head, with dtschema 2026.9 (niced, -j6):
    • make CHECK_DTBS=y apple/t6050-j714s.dtb apple/t8142-j813.dtb: no schema warnings on J714s; J813 drops its two segment-names lines and keeps only its existing ones.
    • make dt_binding_check DT_SCHEMA_FILES=soc/apple/apple,pmp.yaml: clean.
  • The bindings cover every other property used: the report entry's power-domains, the PMP's board properties, and the PMC's apple,pmp.
  • On the M5, booted from the internal SSD: the merge-retest kernel 7.3.0-m5-merge (which carries soc: apple: pmp: start the T6050 PMP on bare metal #1326's report driver), with only the DTB built from this commit, installed over SSH and then rolled back to the default set.

apple,dram-vendor-id is this unit's ADT value, like J813's; a loader that copies /chosen overrides it.

🤖 Generated with Claude Code

Enable the PMP on J714s with its boot arguments and firmware properties
(J714sAP ADT), its report, and the PMC's agent 0, which the PMC now
honours once the PMP runs. Add the GPU's request (AGX, soc-device 16) to
the T6050 report on the GPU's power state, and let the GPU take it as
its domain, as T6041 does; the GPU and the report are enabled together
so the GPU never waits on a disabled report.

With the report the PMP drops iBoot's static vote (DCS 5, fabric 1) to
0 and acknowledges every request. Told the GPU is on, it votes DCS 5 and
the fabric 1-3 while the GPU works and 0 when it idles; the PMC takes
the higher of its vote and the CLPC's.

Signed-off-by: Diljit Singh <hey@djdev.me>
…string

The ADT's iop-pmp nub carries segment-names as a NUL-terminated string
("__TEXT;__DATA" on J813, "__TEXT;__DATA;__ETEXT" on J714s). A DTB has
no types, so dt-validate decodes those bytes as a string and the
uint8-array pattern rejects them on every board that carries the value
(t8142-j813 today). Give the property its own string type and keep it
out of the opaque-bytes pattern; the bytes in the DTB do not change.

Signed-off-by: Diljit Singh <hey@djdev.me>
The binding requires reg-names when a DART has a second region. The ADT
dart-pmp0 instance list names them DART and DAPF (it also carries
dapf-instance-0), so call them "dart" and "dapf". No driver looks them
up by name.

Signed-off-by: Diljit Singh <hey@djdev.me>
@DjDeveloperr
DjDeveloperr merged commit d7303c3 into integration/aurora Nov 9, 2026
2 checks passed
@DjDeveloperr

Copy link
Copy Markdown
Contributor Author

Merging: validated on the M5 Pro (J714sAP) with CI green (dt-checks, host-tests).

Hardware evidence (2026-11-09):

  • Default SSD boot with this DT (14:05-14:09, the 7.3.0-m5-merge kernel with only this commit's DTB, installed over SSH, then rolled back to 7.3.0-m5-argb):

    • The set boots to Hyprland. No oops/BUG/WARN/SError, and no new error lines or deferred devices.
    • The PMP starts. The GPU binds through pmp-gfx under gfx. PMP running (status 0x1), requests 0x100004f000 (now including AGX); SOC-DEV-PS-ACK reads back 0x4f000.
    • Under gpubench the PMP's vote follows the GPU and the PMC honours it: DCS 5 / fabric 2-3 on heavy work, 1-3 on light submissions, 0 on empty submissions and at idle. On the default set it sits at iBoot's unhonoured 5/1.
    • GPU timings and SMC power are unchanged (bandwidth 489.2 -> 488.0 µs, empty submissions 1.156 -> 1.158 µs), since the CLPC's DCS 6 stays the higher vote.
  • PMP alone (RAM-boot kit, CLPC's PMC enables cleared for one test): the PMC honours the PMP's DCS 5 / fabric 3. Bandwidth-bound work runs at 541 µs and 27.4 W, against 486 µs and 29.8 W at the CLPC's DCS 6.

  • All 11 T6050 board DTBs build, and J714s has no new dtc warnings.

  • The first dt-checks run found three schema warnings from the newly enabled nodes, fixed on the branch:

    • the PMP DART's reg-names ("dart", "dapf", from the ADT instance list);
    • apple,tunable-segment-names, which the binding now types as a string, since the ADT value is a NUL-terminated string. This also clears J813's two existing warnings.

    Local CHECK_DTBS on J714s/J813 and dt_binding_check on apple,pmp.yaml are clean.

    The hardware run used 397dfec's DTB. The follow-ups add only reg-names, which no driver reads, and a binding change, so the evidence holds for the head.

The M5's default set stays 7.3.0-m5-argb; prev is the tested PMP-DT set.

🤖 Generated with Claude Code

joshuaswarren added a commit that referenced this pull request Nov 9, 2026
…C port (#1391)

* arm64: dts: apple: t6050-j714c: Run the PMP and report the GPU to it

Enable the PMP on the M5 Max 14-inch the way the J714s does since #1376:
the PMP with its boot arguments, mailbox, DART and power states, the PMP
report, the PMC's agent 0 and the GPU's request in the report. They stay
enabled together, so the GPU never waits on a disabled report. The CLPC
keeps its vote; the PMC takes the higher of the two.

The values come from ADTs of the same silicon, not from a J714c unit:
- apple,board-id is 10, the J714c's board ID (0x0a; the N1 platform ID
  above has it too).
- apple,dram-vendor-id is 255 and pmc/pmc-pmgr are 1/63, as a J716c reports
  them. They are only fallbacks: the boot loader copies /chosen and the
  PMGR's values over them.
- t6050-max-pmp-tunables.dtsi is the 173 iop-pmp0-nub properties of a
  J716cAP 27.0 ADT, raw bytes, in the format of the J714s file. The
  J714cAP and J716cAP firmware ADTs have identical PMP nodes (props and
  all 29 variant sub-nodes), and the h17c-family variant tables of that
  firmware ADT reproduce 166 of the 173 values; the other seven (the
  AGX DVFS voltages, the segment ranges and names, pre-loaded and three
  variant picks) are runtime values iBoot fills in.

Not run on a J714c.

* arm64: dts: apple: t6050-j716c: Move the right USB-C port into t6050-max-atc2.dtsi

The J714cAP and J716cAP firmware ADTs carry identical nodes for the right
USB-C port: the HPM on nub-spmi-a1, ATC2's PHY, USB controller and DARTs,
the USB4/Thunderbolt router and the PCIe tunnel. Move the J716c's
description of them into t6050-max-atc2.dtsi so the J714c can include it
instead of a second copy.

The host DROM (apple,thunderbolt-drom) stays in the board file: this J716c
unit's DROM carries a router UUID from an earlier boot.

No change to the J716c: its DTB is byte-identical before and after, and
so are the other ten T6050 board DTBs.

* arm64: dts: apple: t6050-j714c: Enable the right USB-C port

Include t6050-max-atc2.dtsi on the J714c: the right USB-C port's PD
controller (nub-spmi-a1, hpm2), ATC2's PHY, USB controller and DARTs, the
USB4/Thunderbolt router and the PCIe tunnel. The J714cAP firmware ADT
describes them with the same values as the J716cAP one. The ADT also has
the PD controllers hpm0 and hpm1 on nub-spmi-a0 and an hpm5; this commit
does not describe them or the ports behind them (ATC0, ATC1, ATC3).

The nodes the J714c board did not reach are now in t6050-max.dtsi's
J714c-and-J716c blocks (ATC2, ACIO2, APCIEC2 and nub-spmi-a1), and
t6050-peripherals.dtsi stops adding its own staged nub-spmi-a1 and
apciec2_dart for the J714c.

apple,thunderbolt-drom is the template value of the J714cAP ADT, not
a unit's UUID; the boot loader replaces it. Not run on a J714c.

Checked offline: all 11 T6050 board DTBs build with dtc, and the ten
other than the J714c are byte-identical to the base tree. dt-validate of
the J714c DTB has one warning, the PCIe "port0" in the apciec2 node, which
the J716c DTB has already; the J714c had none before.
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.

1 participant