Skip to content

arm64: dts: apple: add the T6050 (M5 Ultra) SoC and J775D Mac Studio device trees - #935

Merged
RyanTheTide merged 15 commits into
integration/aurorafrom
j716c/t6050-dt
Nov 8, 2026
Merged

RyanTheTide merged 15 commits into
integration/aurorafrom
j716c/t6050-dt

Conversation

@erikwb

@erikwb erikwb commented Nov 4, 2026 •

Copy link
Copy Markdown
Contributor

There's no device tree for T6050 (M5 Max and M5 Ultra) when Linux runs directly on the hardware. This adds the T6050 SoC files and the J775D Mac Studio board, as the boot loader hands the machine over, plus the compatible-only binding updates the tree needs.

Every M5 size is the same apple,t6050, so the SoC is described once and sized per part:

  • t6050-base.dtsi: what every size shares (the CPU and per-die address macros, clocks, die 0's bus);
  • t6050-die0.dtsi: the blocks only die 0 has;
  • t6050-dieX.dtsi: the per-die blocks, included once per die;
  • t6050-ultra.dtsi: the two-die M5 Ultra, which J775D includes. The J716c PR adds t6050-max.dtsi for the one-die M5 Max; a binned or smaller part can include that the way t6034.dtsi includes t6031.dtsi.

The binding updates:

  • apple,t6050-asc-mailbox, AIC3 (apple,t6050-aic3, T8122 fallback, four cells), watchdog, DART (apple,t6050-dart, T8110 fallback) and QSPI (T8140 fallback, so its nvram-only write policy applies);
  • the J775D board compatible;
  • the PMU's power-on policy cell, which the SMC series' ac_power_mode uses.

The drivers that bind to the new nodes are in separate PRs (NVMe, PCIe, N1, combo PHY, dptx, SMC, cpufreq); this tree compiles without them.

Commits by Jeff Queisser. On J716c (MacBook Pro 16-inch, M5 Max) this runs as part of the full T6050 stack (j716c/t6050-platform): the machine boots to userspace from NVMe with all 18 CPUs, N1 Wi-Fi up and CPU frequency scaling active. The J716c board tree is a separate PR.

Created with Claude Opus 5.5 in Claude Code.

funkzy and others added 9 commits November 4, 2026 22:13
Add the T6050 SoC in its two-die M5 Ultra form, and the Mac Studio board
that uses it: the device tree for Linux running on the hardware, as the
boot loader hands it over (the loader fills the tunables and calibration
the nodes name).

Every T6050 is made of the same die, so the SoC description is split as
for the M3 Max and Ultra (t6031-base, -die0, -dieX):

- t6050-base.dtsi: the nodes common to every size, die 0's bus and the
  CPU node template;
- t6050-die0.dtsi: the blocks used on die 0 only, among them the
  interrupt controller that serves both dies;
- t6050-dieX.dtsi: the per-die template, included once for each die,
  with each die's blocks at the die stride and its interrupts on its
  own die of the AIC;
- t6050-ultra.dtsi: the two dies, their CPUs (five cores in each
  cluster) and the blocks so far described for the two-die part only:
  the video decoders, the memory cache controllers, the display
  subsystem, die 1's ATC0 and its DisplayPort PHY;
- t6050-j775d.dts: the board, its USB-C ports and their PD controllers,
  the HDMI port, PCIe, audio, the boot NOR and the fans.

Signed-off-by: Jeff Queisser <funkzy@users.noreply.github.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
[erik: dropped references to private files from a comment]
Signed-off-by: Erik Bourget <erik@ebourget.net>
Build t6050-j775d.dtb, the Mac Studio with the M5 Ultra (J775D, T6050),
with the other Apple device trees.

Signed-off-by: Jeff Queisser <funkzy@users.noreply.github.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Erik Bourget <erik@ebourget.net>
T6050's coprocessors (ANS among them) use the ASC v4 mailbox.

Signed-off-by: Jeff Queisser <funkzy@users.noreply.github.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Erik Bourget <erik@ebourget.net>
Add the J775D board and its T6050 (M5 Ultra) SoC.

Signed-off-by: Jeff Queisser <funkzy@users.noreply.github.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Erik Bourget <erik@ebourget.net>
T6050's AIC3 is the T8122 one with two dies, so it takes the T8122 fallback
and, like T6031's, four interrupt cells (the second is the die).

Signed-off-by: Jeff Queisser <funkzy@users.noreply.github.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Erik Bourget <erik@ebourget.net>
T6050's watchdog is compatible with T8103's.

Signed-off-by: Jeff Queisser <funkzy@users.noreply.github.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Erik Bourget <erik@ebourget.net>
Add apple,t6050-dart, the DART of the T6050 (M5 Ultra) PCIe ports and
display co-processors, with the t8110 fallback like the other recent
SoCs.

Signed-off-by: Jeff Queisser <funkzy@users.noreply.github.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Erik Bourget <erik@ebourget.net>
T6050's boot NOR sits behind a QSPIMC controller with the same P and C
apertures (C at P + 0x800) as T8140's. Describe it as
"apple,t6050-qspi", "apple,t8140-qspi" so the driver's T8140 policy (data
reads anywhere, programs and erases only inside the nvram partition)
applies without a driver change.

Signed-off-by: Jeff Queisser <funkzy@users.noreply.github.com>
Signed-off-by: Erik Bourget <erik@ebourget.net>
The PMU's info-pm_setting byte (0x2001, as on T6030) holds the power-on
policy: bit 0 keeps the machine off when power returns after a loss, bit 5
keeps it off when power is connected. Hand it to the SMC reboot node as the
pm_setting cell so macsmc-reboot's ac_power_mode can read and set it.
Written 0x03 ("always") from Linux on the Studio, a wall-power cycle after
a Linux shutdown powered it on by itself.

Signed-off-by: Jeff Queisser <funkzy@users.noreply.github.com>
Signed-off-by: Erik Bourget <erik@ebourget.net>
Bring the T6050 base up to the current integration tree. Two conflicts:
the Makefile (t6050-j775d.dtb goes after the T6041 boards) and the QSPI
binding, where T6050 joins T8152 in the "apple,t8140-qspi" fallback list.

Assisted-by: LLM
Signed-off-by: Ryan Murray <81541646+RyanTheTide@users.noreply.github.com>
T8142, T8152 and T6050 boot their Always-On Processor over the RTKit
mailbox (T8142 also over a setup port) and hand its audio service the
jack, speaker and amplifier sense channels, plus the HPAI microphones
where the board has them. The T8142 J813 tree and the T6050 J775D tree
already use these compatibles, which no binding described.

Assisted-by: LLM
Signed-off-by: Ryan Murray <81541646+RyanTheTide@users.noreply.github.com>
…control

Describe three interfaces the T6050 trees use: the DisplayPort and
Type-C combo PHY, the SMC pcIO power outputs as GPIOs, and the N1's PCI
function 0, which carries the firmware name and platform ID the Wi-Fi
and Bluetooth drivers boot it with.

Assisted-by: LLM
Signed-off-by: Ryan Murray <81541646+RyanTheTide@users.noreply.github.com>
The J775D tree uses T6050 compatibles that the shared Apple bindings
did not list yet. Add them, with the fallbacks the tree uses:

- the PMGR, its power states, SPMI, I2C, pinctrl (with the T8103 and,
  for the AOP block, the T8132 fallback), ADMAC, AVD, dwc3, SART, NVMe,
  MCC, PMC and CLPC, the CIO reset, SMC, display crossbar, DCP, USB4
  router and NHI, PCIe and the DisplayPort PHY;
- T6050's own properties: the cluster controllers' firmware-managed
  thermal flag, the dwc3 CIO tunable, the second power domain of the
  crossbar, the PMU power-on policy cell of the SMC reboot node, the
  DisplayPort PHY's PLL settings, PCIe ports the boot loader trained;
- the J775D sound card.

T6050's ANS keeps its power with the firmware and is never reset
through PMGR, so its NVMe node needs neither power domains nor a reset.
A two-die T6050 lists both dies' memory controller planes, 64 in all.

Assisted-by: LLM
Signed-off-by: Ryan Murray <81541646+RyanTheTide@users.noreply.github.com>
The boot loader always passes the command line, so the DT's own
"maxcpus=1 rdinit=/init" never applies on a normal boot and would only
hide 29 of the 30 cores when it did. No driver reads ti,bclk-ratio and
no binding has it, so drop it from the speaker amplifier too.

Assisted-by: LLM
Signed-off-by: Ryan Murray <81541646+RyanTheTide@users.noreply.github.com>
@RyanTheTide

RyanTheTide commented Nov 8, 2026 •

Copy link
Copy Markdown
Contributor

Review from the Aurora side. Ryan asked for the T6050 device trees in integration, so this PR is in scope now and I've pushed our own fixups on top of the branch. Your commits are untouched, it's all new commits plus one merge.

What I checked

  • Every die 0 register window and interrupt in the J775D tree against the J775D ADT and the live J873s ADT. They match, apart from the usual unions (QSPI P+C, the ATC PHY core window, the SMC SRAM from iop-smc-nub). The CPU nodes are in the ADT's order.
  • make W=1 on the merged tree: no dtc warnings.
  • CHECK_DTBS=y on every Apple DTB against current integration: the branch added 200 schema warnings, all from T6050 compatibles and properties that no binding listed yet. With the fixups it adds none.
  • dt_binding_check on every binding the fixups touch.

What I pushed

  • A merge of current integration (the Makefile and the QSPI binding conflicted).
  • dt-bindings: the T6050 compatibles in the shared Apple bindings, with the fallbacks the tree uses, plus the T6050 properties (firmware-managed thermal on the cluster controllers, the dwc3 CIO tunable, the crossbar's second power domain, the pm_setting cell, the DisplayPort PHY PLL settings, ports the boot loader trained). ANS on T6050 has no power domain or reset in the binding now, as the tree says.
  • dt-bindings: new bindings for the combo PHY, the SMC pcIO outputs, the N1 control function and the T8152-generation AOP and its audio service.
  • J775D: dropped the default bootargs (the loader always passes one, and maxcpus=1 would only hide cores when it didn't) and the ti,bclk-ratio nothing reads.

Not blocking, for later

  • A few literal ADT values sit in the DTS (the dwc3 tunables, the DisplayPort PHY PLL settings). Long term we'd rather have the loader fill those from the ADT at boot like the ATC PHY tunables, so a new board needs no hand copy.
  • The AOP comment mentions chosen.aurora,t6050-aop=1. Fine as a loader handoff marker, just flagging it since we're cutting down on chosen flags.

Build-tested, unbooted. We have no T6050 here. @erikwb could you boot the head of this branch on your J716c once #945 is on top, and @funkzy on the J775D? A boot to a shell with the same dmesg as before would be great. I'll merge once CI is green and won't wait on it, and anything a boot turns up goes in a follow-up.

Merge plan: this one first, then #945 and #1167, then our layer that describes the rest of the T6050 boards (all of it disabled).

The other Apple PHY and controller bindings type their apple,tunable-*
properties as uint32 matrices of (offset, mask, value) rows. The combo
PHY binding typed the same property names as flat uint32 arrays, and
dt-validate cannot decode a property name that two bindings give
different types: it stops with "KeyError: 'uint32-array'". Use the
matrix type here too.

Assisted-by: LLM
Signed-off-by: Ryan Murray <81541646+RyanTheTide@users.noreply.github.com>
@RyanTheTide
RyanTheTide merged commit af6d986 into integration/aurora Nov 8, 2026
2 checks passed
RyanTheTide added a commit that referenced this pull request Nov 8, 2026
Integration now has the T6050 base and J775D from
#935 with its review fixups.
The Makefile conflicted: the two boards go after the T6041 ones.

Assisted-by: LLM
Signed-off-by: Ryan Murray <81541646+RyanTheTide@users.noreply.github.com>
RyanTheTide added a commit to rolotrealanis98/linux that referenced this pull request Nov 8, 2026
Integration now has the T6050 base, J775D, J716c and J714c from
aurora-silicon#935 and
aurora-silicon#945 with their review
fixups. This branch carries earlier copies of those commits, so the
shared files conflicted:

- t6050-max.dtsi keeps this branch's CPU order and takes the MTP
  helper compatible from integration;
- t6050-die0.dtsi keeps the SMC's second GPIO bank;
- the J775D, J716c and J714c files, the QSPI and SPMI bindings take the
  reviewed versions from integration;
- arm/apple.yaml lists the J716s in its own M5 Pro entry, the Makefile
  builds it next to the other T6050 boards.

Assisted-by: LLM
Signed-off-by: Ryan Murray <81541646+RyanTheTide@users.noreply.github.com>
RyanTheTide added a commit that referenced this pull request Nov 8, 2026
Integration now has the T6050 base and the J775D, J716c, J714c and J716s
trees from #935,
#945 and
#1167. arm/apple.yaml
conflicted: the K boards go into the M5 Pro and M5 Max entries next to
the J714/J716 boards. The pwm and pmgr-pwrstate bindings already list
T6050.

Assisted-by: LLM
Signed-off-by: Ryan Murray <81541646+RyanTheTide@users.noreply.github.com>
@RyanTheTide
RyanTheTide deleted the j716c/t6050-dt branch November 8, 2026 08:02
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.

3 participants