diff --git a/.github/scripts/adt-dt-check-t6032-mutation.sh b/.github/scripts/adt-dt-check-t6032-mutation.sh new file mode 100755 index 00000000000000..b0af5fe342b671 --- /dev/null +++ b/.github/scripts/adt-dt-check-t6032-mutation.sh @@ -0,0 +1,18 @@ +#!/bin/bash +# SPDX-License-Identifier: GPL-2.0-only OR MIT +# Mutation test for adt-dt-check-t6032.py section 6: switch one ANE engine and one external display +# controller on in a copy of the DTB; the checker must exit 1 and name both nodes. +set -u +dtb=$1 +tmp=$(mktemp -d) +trap 'rm -rf "$tmp"' EXIT +cp "$dtb" "$tmp/mut.dtb" +fdtput -t s "$tmp/mut.dtb" /soc@200000000/ane@3c9400000 status okay || exit 2 +fdtput -t s "$tmp/mut.dtb" /soc@200000000/dcp@306c00000 status okay || exit 2 +out=$(python3 "$(dirname "$0")/adt-dt-check-t6032.py" --fetch-ipsw "$tmp/mut.dtb") +rc=$? +echo "$out" | grep -E "FAIL" | head +[ "$rc" -eq 1 ] || { echo "mutation not detected (exit $rc)"; exit 1; } +echo "$out" | grep -E "FAIL.*ane@3c9400000" >/dev/null || { echo "ane@3c9400000 not flagged"; exit 1; } +echo "$out" | grep -E "FAIL.*dcp@306c00000" >/dev/null || { echo "dcp@306c00000 not flagged"; exit 1; } +echo "mutation detected" diff --git a/.github/scripts/adt-dt-check-t6032.py b/.github/scripts/adt-dt-check-t6032.py new file mode 100755 index 00000000000000..c432a4e2419fef --- /dev/null +++ b/.github/scripts/adt-dt-check-t6032.py @@ -0,0 +1,643 @@ +#!/usr/bin/env python3 +# SPDX-License-Identifier: GPL-2.0-only OR MIT +"""ADT-vs-DT checker for the Apple T6032 (M3 Ultra) j575d device tree. + +Compares the built t6032-j575d DTB(s) against the j575dap ADT of the pinned +macOS 27.0.1 (26A434) firmware so the fixes that were made against that ADT +cannot silently regress: + + - every ADT node the board needs (six USB-C controllers, their DARTs and + phys, the GPU and its ASC mailbox, the eight external display pipes with + their DARTs and mailboxes, both ANE engines with their DARTs, and the + console devices AOP/ANS/SMC/SART/UART) must be covered by a DT node whose + register windows overlap it, after die-1 bus translation; + - nodes inherited from the laptop descriptions that the ADT does not have + (the MTP stack, the AOP audio DMA, i2c3, the SPI-NOR, and the phantom + 0x2f_ die-1 mirrors) must not exist; + - every DT SoC node with registers must overlap an ADT node, except the + die-1 cpufreq and pmgr mirrors (hardware mirrors at the die stride that + the ADT expresses inside the pmgr register-window list, not as nodes); + - the power states the new nodes reference must exist in the DT at the + bank + offset listed in REQUIRED_PS (those offsets were read from the ADT + pmgr by hand; the script does not read them from the ADT), in both dies; + - the GPU, ANE and display nodes must stay disabled: a DT node is such a + gated node when its first register window starts where a window of a gated + ADT node starts (a DART: any window), so the test needs no DT labels, and + fewer matching DT nodes than gated ADT nodes is a failure. + +Expected, not a checker failure: dtc warns simple_bus_reg for the die-1 ANE +node ane@23c9400000 (its reg is 0x3c9400000, the die-local address). + +Usage: + adt-dt-check-t6032.py ADT DTB [DTB...] + adt-dt-check-t6032.py --fetch-ipsw DTB [DTB...] + Fetch the pinned DeviceTree.j575dap.im4p by HTTP range requests from + the pinned 27.0.1 IPSW (no full download), verify both pinned SHA256 + hashes, LZFSE-decompress it to a temp file and check against it. + +Needs dtc on PATH for DTB decompilation; --fetch-ipsw additionally needs +pyliblzfse. Prints one line per check; the exit status is 1 if any check +fails. Nothing is written (except the temp ADT with --fetch-ipsw). +""" + +import hashlib +import re +import struct +import subprocess +import sys +import tempfile +import urllib.request +import zlib + +# macOS 27.0.1 (26A434) for Mac15,14; metadata from api.ipsw.me 2026-09-28. +IPSW_URL = ("https://updates.cdn-apple.com/2026FallFCS/59241290-5d51-4ca8-9df4-31624b9a4eac/" + "UniversalMac_27.0.1_26A434_Restore.ipsw") +IPSW_SHA256 = "2f016638293c3e641b8b25391a76fbc16563b3711915a5551cf8aa0f5598a5c1" +IM4P_SHA256 = "6c3ca4ac7272ecf9c05f6b2b413ef923ff2d3ff252469493fc700260b6938c60" +ADT_SHA256 = "4a818ecc7f3d71195c1def12c6eed0c90b287f82cad2a6a4ffd6f0849fe13c12" +IM4P_MEMBER = "Firmware/all_flash/DeviceTree.j575dap.im4p" + +# m1n1 src/pmgr.h: PMGR_DIE_OFFSET. +PMGR_DIE_OFFSET = 0x2000000000 + +failures = [] + + +def check(ok, line): + print(("ok " if ok else "FAIL ") + line) + if not ok: + failures.append(line) + + +# ---------------------------------------------------------------- ADT side + +def adt_parse(b, off=0): + nprops, nchild = struct.unpack_from("", val or ""): + for x in grp.split(): + out.append(int(x, 16) if x.lower().startswith("0x") else int(x)) + return out + + +def adt_irqs(node): + """(all_irqs, valid_irqs) of an ADT node, as (die, irq) pairs. The ADT + encodes die 1 by adding 0x1000 to the AIC number. 'interrupts-valid' is + a bitmask over the 'interrupts' entries; entries whose bit is clear are + marked invalid by the firmware (sgx entry 5, IRQ 1249). Without the + property every entry counts as valid.""" + pr = node["props"] + raw = pr.get("interrupts") + if raw is None: + return [], [] + all_irqs = [(1 if n >= 0x1000 else 0, n - 0x1000 if n >= 0x1000 else n) + for n in (int.from_bytes(raw[i:i + 4], "little") + for i in range(0, len(raw), 4))] + mask = pr.get("interrupts-valid") + if mask is None: + return all_irqs, list(all_irqs) + m = int.from_bytes(mask, "little") + valid = [irq for i, irq in enumerate(all_irqs) if m & (1 << i)] + return all_irqs, valid + + +def adt_irq_tables(root, names): + io = adt_find(root, "arm-io") + out = {} + for n in io["kids"]: + if adt_name(n) in names: + out[adt_name(n)] = adt_irqs(n) + return out + + +def dt_irqs(node): + """(die, irq) pairs of a DT node: 4-cell `interrupts` specs + () and 5-cell `interrupts-extended` specs + (<&aic AIC_IRQ die irq type>). Every interrupt-parent here is the AIC, + so the fixed grouping is safe for this board; nodes whose + interrupts-extended has irregular (<0> filler) specs are skipped, as + the spec length is then not derivable (e.g. the ADMAC channel list).""" + out = [] + c = dt_cells(node.props.get("interrupts", "")) + if len(c) % 4 == 0: + out += [(c[i + 1], c[i + 2]) for i in range(0, len(c), 4)] + c = dt_cells(node.props.get("interrupts-extended", "")) + if c and len(c) % 5 == 0: + out += [(c[i + 2], c[i + 3]) for i in range(0, len(c), 5)] + return out + + +def dt_strings(val): + return re.findall(r'"([^"]*)"', val or "") + + +def dt_soc_nodes(root): + """Yield (path, node, windows) for every DIRECT child of either SoC bus + that has a reg property, windows translated to physical addresses. + Deeper buses (pmgr states, DCP children, CIO children) use other + address-cell widths and are deliberately not covered here; the ADT-vs-DT + register comparison is on SoC-level devices.""" + for soc in root.kids: + if not soc.name.startswith("soc@"): + continue + rc = dt_cells(soc.props.get("ranges", "")) + rng = [((rc[i] << 32) | rc[i + 1], + (rc[i + 2] << 32) | rc[i + 3], + (rc[i + 4] << 32) | rc[i + 5]) for i in range(0, len(rc) - 5, 6)] + + def tr(a): + for child, parent, size in rng: + if child <= a < child + size: + return parent + (a - child) + return a + + for k in soc.kids: + if "reg" not in k.props: + continue + c = dt_cells(k.props["reg"]) + wins = [] + if len(c) % 4 == 0 and c: + for i in range(0, len(c), 4): + wins.append((tr((c[i] << 32) | c[i + 1]), + (c[i + 2] << 32) | c[i + 3])) + yield "/" + soc.name + "/" + k.name, k, wins + + +def overlap(w1, w2): + return w1[0] < w2[0] + w2[1] and w2[0] < w1[0] + w1[1] + + +# ------------------------------------------------------------------- fetch + +def http_range(url, start, end): + req = urllib.request.Request(url, headers={"Range": f"bytes={start}-{end}"}) + with urllib.request.urlopen(req, timeout=120) as r: + return r.read() + + +def fetch_adt(): + """Pull DeviceTree.j575dap.im4p out of the pinned IPSW with two range + requests (central directory, then the member) and LZFSE-decompress it. + Both pinned SHA256 hashes must match.""" + import lzfse # pyliblzfse + req = urllib.request.Request(IPSW_URL, headers={"Range": "bytes=0-0"}) + with urllib.request.urlopen(req, timeout=120) as r: + cr = r.headers.get("Content-Range", "") + total = int(cr.rsplit("/", 1)[-1]) + cd = http_range(IPSW_URL, max(0, total - (1 << 20)), total - 1) + eocd = cd.rfind(b"PK\x05\x06") + if eocd < 0: + sys.exit("no zip End Of Central Directory in the IPSW tail") + count, cdoff = struct.unpack_from("= len(gw), f"{hit} DT nodes match the {len(gw)} gated ADT nodes" + if hit >= len(gw) else + f"only {hit} DT nodes match the {len(gw)} gated ADT nodes: a gated node is missing or moved") + + if failures: + print(f"{len(failures)} check(s) failed") + return 1 + print("all checks passed") + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/.github/workflows/t6032-adt-dt-check.yml b/.github/workflows/t6032-adt-dt-check.yml new file mode 100644 index 00000000000000..e3847f6eb2dcc3 --- /dev/null +++ b/.github/workflows/t6032-adt-dt-check.yml @@ -0,0 +1,70 @@ +# ADT-vs-DT check for the Apple T6032 (M3 Ultra) j575d device tree. +# +# Builds the t6032-j575d DTB and verifies it against the j575dap ADT of the +# pinned macOS 27.0.1 (26A434) firmware, which the checker fetches by HTTP +# range request (two small ranges, never the ~25 GB image) and verifies +# against pinned SHA256 hashes. The fixes from the 27.0.1 ADT pass (USB-C +# drd3, dropped laptop-only nodes, GPU/DCP/ANE nodes) fail the build when +# they regress. See .github/scripts/adt-dt-check-t6032.py for the checks. + +name: t6032-adt-dt-check + +on: + pull_request: + paths: + - "arch/arm64/boot/dts/apple/t6032*" + - "arch/arm64/boot/dts/apple/t6031*" + - "arch/arm64/boot/dts/apple/t603x*" + - ".github/scripts/adt-dt-check-t6032.py" + - ".github/scripts/adt-dt-check-t6032-mutation.sh" + - ".github/workflows/t6032-adt-dt-check.yml" + push: + paths: + - "arch/arm64/boot/dts/apple/t6032*" + - "arch/arm64/boot/dts/apple/t6031*" + - "arch/arm64/boot/dts/apple/t603x*" + - ".github/scripts/adt-dt-check-t6032.py" + - ".github/scripts/adt-dt-check-t6032-mutation.sh" + - ".github/workflows/t6032-adt-dt-check.yml" + workflow_dispatch: + +permissions: {} + +# A new push to a pull request replaces its run; every other run is kept. +concurrency: + group: t6032-adt-dt-check-${{ github.event_name }}-${{ github.event.pull_request.number || github.sha }} + cancel-in-progress: ${{ github.event_name == 'pull_request' }} + +jobs: + adt-dt-check: + name: adt-dt-check + runs-on: ubuntu-24.04 + timeout-minutes: 45 + permissions: + contents: read # check out the repository + steps: + - name: Check out the tree + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + with: + persist-credentials: false + + - name: Install toolchain + run: | + sudo apt-get update + sudo apt-get install -y gcc-aarch64-linux-gnu flex bison device-tree-compiler + pip install pyliblzfse + + - name: Build t6032-j575d.dtb + run: | + make O=build ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- defconfig + make O=build ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- olddefconfig + make O=build ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- apple/t6032-j575d.dtb + + - name: Check the DTB against the 27.0.1 j575dap ADT + run: | + python3 .github/scripts/adt-dt-check-t6032.py --fetch-ipsw \ + build/arch/arm64/boot/dts/apple/t6032-j575d.dtb + + - name: A gated node switched on must fail the check + run: bash .github/scripts/adt-dt-check-t6032-mutation.sh \ + build/arch/arm64/boot/dts/apple/t6032-j575d.dtb diff --git a/arch/arm64/boot/dts/apple/t6032-j575d.dts b/arch/arm64/boot/dts/apple/t6032-j575d.dts index 1bf14006807e8f..5784364d00c405 100644 --- a/arch/arm64/boot/dts/apple/t6032-j575d.dts +++ b/arch/arm64/boot/dts/apple/t6032-j575d.dts @@ -16,6 +16,7 @@ model = "Apple Mac Studio (M3 Ultra, 2025)"; aliases { + ethernet0 = ðernet0; serial0 = &serial0; }; @@ -106,6 +107,71 @@ }; }; -#include "spi1-nvram.dtsi" +/* + * PCIe devices, from the 27.0.1 ADT of a retail unit: port00 WLAN and + * Bluetooth, port01 SD card reader, port02 10 Gbit Ethernet, port03 USB + * xHCI (ASM3142). The pwren numbers are the SMC gPxx key of the ADT + * function-reg_on, function-sd_pwr_en and function-power_enable + * properties read as hex; the ADT has no power function for port02. The ADT + * gives the PCI id only for the SD reader, so the WLAN and Bluetooth child + * nodes are not written here. + */ +&port00 { + /* WLAN */ + bus-range = <1 1>; + pwren-gpios = <&smc_gpio 19 GPIO_ACTIVE_HIGH>; +}; + +&port01 { + /* SD card reader */ + bus-range = <2 2>; + pwren-gpios = <&smc_gpio 25 GPIO_ACTIVE_HIGH>; + status = "okay"; + /* + * The ADT gives both polarity properties as 1. The inverted flags below + * are copied from the M2 Ultra Studio; their mapping to 1 is unverified. + */ + sdhci0: mmc@0,0 { + compatible = "pci17a0,9755"; + reg = <0x20000 0x0 0x0 0x0 0x0>; + cd-inverted; + wp-inverted; + }; +}; + +&port02 { + /* 10 Gbit Ethernet */ + bus-range = <3 3>; + status = "okay"; + ethernet0: ethernet@0,0 { + reg = <0x30000 0x0 0x0 0x0 0x0>; + /* To be filled by the loader */ + local-mac-address = [00 10 18 00 00 00]; + }; +}; + +&port03 { + /* USB xHCI */ + bus-range = <4 4>; + pwren-gpios = <&smc_gpio 22 GPIO_ACTIVE_HIGH>; + status = "okay"; +}; + +&pcie0_dart_1 { + status = "okay"; +}; + +&pcie0_dart_2 { + status = "okay"; +}; + +&pcie0_dart_3 { + status = "okay"; +}; + #include "hwmon-common.dtsi" #include "hwmon-fan-dual.dtsi" + +/* No spi1-nvram.dtsi: the 27.0.1 j575dap ADT has no SPI-NOR at + * 0x391104000 (the laptop keyboard/NVRAM bus), and t6032.dtsi deletes the + * inherited node. The boot chain keeps its environment on the ESP. */ diff --git a/arch/arm64/boot/dts/apple/t6032.dtsi b/arch/arm64/boot/dts/apple/t6032.dtsi index 1b15114f13892b..0ba8dc54d85fd6 100644 --- a/arch/arm64/boot/dts/apple/t6032.dtsi +++ b/arch/arm64/boot/dts/apple/t6032.dtsi @@ -338,10 +338,42 @@ /delete-node/ &ps_pmp_die1; +/* + * Die 1 keeps only what the 27.0.1 j575dap ADT puts there. The pmgr + * aperture and the cpufreq register files are hardware mirrors at the die + * stride and stay. The dieX template's third dwc3/atcphy set lands at the + * mirror of die 0's port 2 (0x2f_0228_0000) - no such port exists: T6032's + * fourth controller is usb-drd3 at 0x13_0228_0000 (defined below), and its + * die-1 USB4 controller is not the die-0 mirror, so the inherited usb4_0 + * instance goes too. + */ +/delete-node/ &dwc3_2_die1; +/delete-node/ &dwc3_2_dart_0_die1; +/delete-node/ &dwc3_2_dart_1_die1; +/delete-node/ &atcphy2_die1; +/delete-node/ &usb4_2_acio_die1; +/delete-node/ &usb4_2_mbox_die1; + #undef DIE #undef DIE_NO #undef SOC_NODE +/* + * Devices inherited from the T6031 laptop description with no counterpart + * in the 27.0.1 j575dap ADT: the MTP keyboard controller stack, the AOP + * audio DMA channel (its only consumer, aop_audio, goes with it), the + * fourth AP i2c bus and the SPI-NOR. All harmless only while disabled; + * absent here. + */ +/delete-node/ &mtp; +/delete-node/ &mtp_mbox; +/delete-node/ &mtp_dart; +/delete-node/ &mtp_dockchannel; +/delete-node/ &aop_admac; +/delete-node/ &aop_audio; +/delete-node/ &i2c3; +/delete-node/ &spi1; + /* delete non-present DISP power-states */ /delete-node/ &ps_disp_cpu; /delete-node/ &ps_disp_cpu_die1; @@ -435,3 +467,833 @@ &ps_afr_d2d_1_die1 { status = "okay"; }; + +/* + * USB-C controller 3 (drd3). Ports 4 and 5 are die-stride mirrors of die 0's + * ports 0 and 1 and come from the dieX include above; drd3 is not a mirror: + * the 27.0.1 ADT puts it at 0x13_0228_0000, inside die 0's identity window, + * and powers it from the die-0 ATC3_USB state. Addresses, interrupts (dwc3 + * 1446, darts 1450) and windows are those of the ADT. + */ +&die0 { + dwc3_3_dart_0: iommu@1302f00000 { + compatible = "apple,t6031-dart", "apple,t8110-dart"; + reg = <0x13 0x02f00000 0x0 0x4000>; + interrupt-parent = <&aic>; + interrupts = ; + power-domains = <&ps_atc3_usb>; + #iommu-cells = <1>; + }; + + dwc3_3_dart_1: iommu@1302f80000 { + compatible = "apple,t6031-dart", "apple,t8110-dart"; + reg = <0x13 0x02f80000 0x0 0x4000>; + interrupt-parent = <&aic>; + interrupts = ; + power-domains = <&ps_atc3_usb>; + #iommu-cells = <1>; + }; + + atcphy3: phy@1303000000 { + compatible = "apple,t6031-atcphy", "apple,t8122-atcphy"; + reg = <0x13 0x03000000 0x0 0x4c000>, + <0x13 0x03050000 0x0 0x8000>, + <0x13 0x00000000 0x0 0x8000>, + <0x13 0x02a90000 0x0 0x4000>, + <0x13 0x02a84000 0x0 0x4000>; + reg-names = "core", "lpdptx", "axi2af", "usb2phy", + "pipehandler"; + + #phy-cells = <1>; + #reset-cells = <0>; + + orientation-switch; + mode-switch; + power-domains = <&ps_atc3_usb>; + }; + + dwc3_3: usb@1302280000 { + compatible = "apple,t6031-dwc3", "apple,t8103-dwc3"; + reg = <0x13 0x02280000 0x0 0xcd00>, <0x13 0x0228cd00 0x0 0x3200>; + reg-names = "dwc3-core", "dwc3-apple"; + interrupt-parent = <&aic>; + interrupts = ; + dr_mode = "otg"; + usb-role-switch; + role-switch-default-mode = "host"; + iommus = <&dwc3_3_dart_0 0>, + <&dwc3_3_dart_1 1>; + power-domains = <&ps_atc3_usb>; + resets = <&atcphy3>; + phys = <&atcphy3 PHY_TYPE_USB2>, <&atcphy3 PHY_TYPE_USB3>; + phy-names = "usb2-phy", "usb3-phy"; + }; +}; + +/* + * GPU (gpu,t6032 in the ADT: G15D, two dies, one sgx and one gfx-asc for + * both) and its ASC mailbox. Register windows, gates (pmgr_gfx GPX/AFR/GFX) + * and the seven ADT interrupts match the T6031 description. The G15 driver + * has no T6032 row and m1n1 has no G15D handoff for the 27 firmware, so the + * GPU and its mailbox stay disabled and every firmware-dependent value stays + * zero until the boot loader fills it. + */ +/ { + gpu_opp: opp-table-gpu { + compatible = "operating-points-v2"; + + /* Placeholder only; filled by the boot loader from the ADT. */ + opp00 { + opp-hz = /bits/ 64 <0>; + opp-microvolt = <0 0 0 0>; + opp-microwatt = <0>; + }; + }; + + gpu_cs_opp: opp-table-gpu-cs { + compatible = "operating-points-v2"; + + opp00 { + opp-hz = /bits/ 64 <0>; + opp-microvolt = <0>; + }; + }; + + gpu_afr_opp: opp-table-gpu-afr { + compatible = "operating-points-v2"; + + opp00 { + opp-hz = /bits/ 64 <0>; + opp-microvolt = <0>; + }; + }; + + reserved-memory { + /* Filled and enabled by the boot loader from the ADT sgx + * gpu-region-*, gfx-shared-region-*, gfx-handoff-* and + * gfx-shared-l2-region-* properties. */ + uat_ttbs: uat-ttbs@10 { + reg = <0 0x10 0 0>; + status = "disabled"; + }; + + uat_pagetables: uat-pagetables@20 { + reg = <0 0x20 0 0>; + status = "disabled"; + }; + + uat_handoff: uat-handoff@30 { + reg = <0 0x30 0 0>; + status = "disabled"; + }; + + uat_pagetables_l2: uat-pagetables-l2@40 { + reg = <0 0x40 0 0>; + status = "disabled"; + }; + }; + + aliases { + gpu = &gpu; + }; +}; + +&die0 { + gpu: gpu@40a400000 { + compatible = "apple,agx-t6032"; + reg = <0x4 0x0a400000 0x0 0x6c000>, + <0x4 0x08000000 0x0 0x3fdc000>; + reg-names = "asc", "sgx"; + interrupt-parent = <&aic>; + /* ADT order; entry 5 (IRQ 1249) is marked invalid there. */ + interrupts = , + , + , + , + , + , + ; + power-domains = <&ps_gfx>; + post-init-providers = <&ps_gfx>; + mboxes = <&agx_mbox>; + memory-region = <&uat_ttbs>, <&uat_pagetables>, + <&uat_handoff>, <&uat_pagetables_l2>; + memory-region-names = "ttbs", "pagetables", "handoff", + "pagetables-l2"; + + apple,firmware-abi = <0 0 0>; + apple,firmware-version = <0 0 0>; + apple,firmware-compat = <0 0 0>; + + operating-points-v2 = <&gpu_opp>; + apple,cs-opp = <&gpu_cs_opp>; + apple,afr-opp = <&gpu_afr_opp>; + + status = "disabled"; + }; + + agx_mbox: mbox@40a408000 { + compatible = "apple,t6032-agx-asc-mailbox"; + reg = <0x4 0x0a408000 0x0 0x4000>; + interrupt-parent = <&aic>; + /* ADT gfx-asc order 1244,1243,1246,1245 -> mailbox order. */ + interrupts = , + , + , + ; + interrupt-names = "send-empty", "send-not-empty", + "recv-empty", "recv-not-empty"; + #mbox-cells = <0>; + status = "disabled"; + }; +}; + +/* + * The eight external display pipes (dcpext0-7, iop,ascwrap-v6 in the ADT; + * each dispextN shares its register windows with dcpextN, so no separate + * display node is needed). Window split and mailbox interrupt ordering + * follow the T6031 internal-display description; the compatibles are + * chip-specific so kernels without T6032 display support leave the DCPs + * unbound. Every node stays disabled: the DCP driver has no 27.x firmware + * family and m1n1 gates the display handoff on the OS firmware. + * Pipes 4-7 are die 1, except the disp-5 AOP gate window, which is die-0 + * resident (0x2_903d0000) and left out of their register maps. The ADT + * carries pipe 4's dart interrupt (5143) on dart-dispext5 and + * dart-dcpext7; those values are kept as read. + */ + +&die0 { + dispext0_dart: iommu@305304000 { + compatible = "apple,t6032-dart", "apple,t8110-dart"; + reg = <0x3 0x5304000 0x0 0x4000>; + interrupt-parent = <&aic>; + interrupts = ; + #iommu-cells = <1>; + apple,dma-range = <0x100 0x0 0x10 0x0>; + power-domains = <&ps_dispext0_cpu>; + status = "disabled"; + }; + + dcpext0_dart: iommu@30530c000 { + compatible = "apple,t6032-dart", "apple,t8110-dart"; + reg = <0x3 0x530c000 0x0 0x4000>; + interrupt-parent = <&aic>; + interrupts = ; + #iommu-cells = <1>; + apple,dma-range = <0x100 0x0 0x10 0x0>; + power-domains = <&ps_dispext0_cpu>; + status = "disabled"; + }; + + dcpext0_mbox: mbox@306c08000 { + compatible = "apple,t6032-asc-mailbox", "apple,asc-mailbox-v4"; + reg = <0x3 0x6c08000 0x0 0x4000>; + interrupt-parent = <&aic>; + /* ADT list (n+1,n,n+3,n+2) reordered to mailbox order. */ + interrupts = , + , + , + ; + interrupt-names = "send-empty", "send-not-empty", + "recv-empty", "recv-not-empty"; + power-domains = <&ps_dispext0_cpu>; + #mbox-cells = <0>; + status = "disabled"; + }; + + dcpext0: dcp@306c00000 { + compatible = "apple,t6032-dcpext"; + mboxes = <&dcpext0_mbox>; + mbox-names = "mbox"; + iommus = <&dcpext0_dart 5>; + reg-names = "coproc", "disp-0", "disp-2", "disp-3", "disp-4", "disp-5", + "iop-vbar"; + reg = <0x3 0x6c00000 0x0 0x4000>, + <0x3 0x4000000 0x0 0x4000000>, + <0x2 0x903d0000 0x0 0x4000>, + <0x3 0x5320000 0x0 0x4000>, + <0x3 0x5344000 0x0 0x4000>, + <0x3 0x6800000 0x0 0x800000>, + <0x3 0x6850000 0x0 0x4000>; + power-domains = <&ps_dispext0_cpu>; + #address-cells = <2>; + #size-cells = <2>; + ranges; + status = "disabled"; + + dcpext0_piodma: piodma { + iommus = <&dispext0_dart 4>; + }; + }; +}; + +&die0 { + dispext1_dart: iommu@449304000 { + compatible = "apple,t6032-dart", "apple,t8110-dart"; + reg = <0x4 0x49304000 0x0 0x4000>; + interrupt-parent = <&aic>; + interrupts = ; + #iommu-cells = <1>; + apple,dma-range = <0x100 0x0 0x10 0x0>; + power-domains = <&ps_dispext1_cpu>; + status = "disabled"; + }; + + dcpext1_dart: iommu@44930c000 { + compatible = "apple,t6032-dart", "apple,t8110-dart"; + reg = <0x4 0x4930c000 0x0 0x4000>; + interrupt-parent = <&aic>; + interrupts = ; + #iommu-cells = <1>; + apple,dma-range = <0x100 0x0 0x10 0x0>; + power-domains = <&ps_dispext1_cpu>; + status = "disabled"; + }; + + dcpext1_mbox: mbox@44ac08000 { + compatible = "apple,t6032-asc-mailbox", "apple,asc-mailbox-v4"; + reg = <0x4 0x4ac08000 0x0 0x4000>; + interrupt-parent = <&aic>; + /* ADT list (n+1,n,n+3,n+2) reordered to mailbox order. */ + interrupts = , + , + , + ; + interrupt-names = "send-empty", "send-not-empty", + "recv-empty", "recv-not-empty"; + power-domains = <&ps_dispext1_cpu>; + #mbox-cells = <0>; + status = "disabled"; + }; + + dcpext1: dcp@44ac00000 { + compatible = "apple,t6032-dcpext"; + mboxes = <&dcpext1_mbox>; + mbox-names = "mbox"; + iommus = <&dcpext1_dart 5>; + reg-names = "coproc", "disp-0", "disp-2", "disp-3", "disp-4", "disp-5", + "iop-vbar"; + reg = <0x4 0x4ac00000 0x0 0x4000>, + <0x4 0x48000000 0x0 0x4000000>, + <0x2 0x903d0000 0x0 0x4000>, + <0x4 0x49320000 0x0 0x4000>, + <0x4 0x49344000 0x0 0x4000>, + <0x4 0x4a800000 0x0 0x800000>, + <0x4 0x4a850000 0x0 0x4000>; + power-domains = <&ps_dispext1_cpu>; + #address-cells = <2>; + #size-cells = <2>; + ranges; + status = "disabled"; + + dcpext1_piodma: piodma { + iommus = <&dispext1_dart 4>; + }; + }; +}; + +&die0 { + dispext2_dart: iommu@44d304000 { + compatible = "apple,t6032-dart", "apple,t8110-dart"; + reg = <0x4 0x4d304000 0x0 0x4000>; + interrupt-parent = <&aic>; + interrupts = ; + #iommu-cells = <1>; + apple,dma-range = <0x100 0x0 0x10 0x0>; + power-domains = <&ps_dispext2_cpu>; + status = "disabled"; + }; + + dcpext2_dart: iommu@44d30c000 { + compatible = "apple,t6032-dart", "apple,t8110-dart"; + reg = <0x4 0x4d30c000 0x0 0x4000>; + interrupt-parent = <&aic>; + interrupts = ; + #iommu-cells = <1>; + apple,dma-range = <0x100 0x0 0x10 0x0>; + power-domains = <&ps_dispext2_cpu>; + status = "disabled"; + }; + + dcpext2_mbox: mbox@44ec08000 { + compatible = "apple,t6032-asc-mailbox", "apple,asc-mailbox-v4"; + reg = <0x4 0x4ec08000 0x0 0x4000>; + interrupt-parent = <&aic>; + /* ADT list (n+1,n,n+3,n+2) reordered to mailbox order. */ + interrupts = , + , + , + ; + interrupt-names = "send-empty", "send-not-empty", + "recv-empty", "recv-not-empty"; + power-domains = <&ps_dispext2_cpu>; + #mbox-cells = <0>; + status = "disabled"; + }; + + dcpext2: dcp@44ec00000 { + compatible = "apple,t6032-dcpext"; + mboxes = <&dcpext2_mbox>; + mbox-names = "mbox"; + iommus = <&dcpext2_dart 5>; + reg-names = "coproc", "disp-0", "disp-2", "disp-3", "disp-4", "disp-5", + "iop-vbar"; + reg = <0x4 0x4ec00000 0x0 0x4000>, + <0x4 0x4c000000 0x0 0x4000000>, + <0x2 0x903d0000 0x0 0x4000>, + <0x4 0x4d320000 0x0 0x4000>, + <0x4 0x4d344000 0x0 0x4000>, + <0x4 0x4e800000 0x0 0x800000>, + <0x4 0x4e850000 0x0 0x4000>; + power-domains = <&ps_dispext2_cpu>; + #address-cells = <2>; + #size-cells = <2>; + ranges; + status = "disabled"; + + dcpext2_piodma: piodma { + iommus = <&dispext2_dart 4>; + }; + }; +}; + +&die0 { + dispext3_dart: iommu@2c9304000 { + compatible = "apple,t6032-dart", "apple,t8110-dart"; + reg = <0x2 0xc9304000 0x0 0x4000>; + interrupt-parent = <&aic>; + interrupts = ; + #iommu-cells = <1>; + apple,dma-range = <0x100 0x0 0x10 0x0>; + power-domains = <&ps_dispext3_cpu>; + status = "disabled"; + }; + + dcpext3_dart: iommu@2c930c000 { + compatible = "apple,t6032-dart", "apple,t8110-dart"; + reg = <0x2 0xc930c000 0x0 0x4000>; + interrupt-parent = <&aic>; + interrupts = ; + #iommu-cells = <1>; + apple,dma-range = <0x100 0x0 0x10 0x0>; + power-domains = <&ps_dispext3_cpu>; + status = "disabled"; + }; + + dcpext3_mbox: mbox@2cac08000 { + compatible = "apple,t6032-asc-mailbox", "apple,asc-mailbox-v4"; + reg = <0x2 0xcac08000 0x0 0x4000>; + interrupt-parent = <&aic>; + /* ADT list (n+1,n,n+3,n+2) reordered to mailbox order. */ + interrupts = , + , + , + ; + interrupt-names = "send-empty", "send-not-empty", + "recv-empty", "recv-not-empty"; + power-domains = <&ps_dispext3_cpu>; + #mbox-cells = <0>; + status = "disabled"; + }; + + dcpext3: dcp@2cac00000 { + compatible = "apple,t6032-dcpext"; + mboxes = <&dcpext3_mbox>; + mbox-names = "mbox"; + iommus = <&dcpext3_dart 5>; + reg-names = "coproc", "disp-0", "disp-2", "disp-3", "disp-4", "disp-5", + "iop-vbar"; + reg = <0x2 0xcac00000 0x0 0x4000>, + <0x2 0xc8000000 0x0 0x4000000>, + <0x2 0x903d0000 0x0 0x4000>, + <0x2 0xc9320000 0x0 0x4000>, + <0x2 0xc9344000 0x0 0x4000>, + <0x2 0xca800000 0x0 0x800000>, + <0x2 0xca850000 0x0 0x4000>; + power-domains = <&ps_dispext3_cpu>; + #address-cells = <2>; + #size-cells = <2>; + ranges; + status = "disabled"; + + dcpext3_piodma: piodma { + iommus = <&dispext3_dart 4>; + }; + }; +}; + +&die1 { + dispext4_dart: iommu@305304000 { + compatible = "apple,t6032-dart", "apple,t8110-dart"; + reg = <0x3 0x5304000 0x0 0x4000>; + interrupt-parent = <&aic>; + interrupts = ; + #iommu-cells = <1>; + apple,dma-range = <0x100 0x0 0x10 0x0>; + power-domains = <&ps_dispext0_cpu_die1>; + status = "disabled"; + }; + + dcpext4_dart: iommu@30530c000 { + compatible = "apple,t6032-dart", "apple,t8110-dart"; + reg = <0x3 0x530c000 0x0 0x4000>; + interrupt-parent = <&aic>; + interrupts = ; + #iommu-cells = <1>; + apple,dma-range = <0x100 0x0 0x10 0x0>; + power-domains = <&ps_dispext0_cpu_die1>; + status = "disabled"; + }; + + dcpext4_mbox: mbox@306c08000 { + compatible = "apple,t6032-asc-mailbox", "apple,asc-mailbox-v4"; + reg = <0x3 0x6c08000 0x0 0x4000>; + interrupt-parent = <&aic>; + /* ADT list (n+1,n,n+3,n+2) reordered to mailbox order. */ + interrupts = , + , + , + ; + interrupt-names = "send-empty", "send-not-empty", + "recv-empty", "recv-not-empty"; + power-domains = <&ps_dispext0_cpu_die1>; + #mbox-cells = <0>; + status = "disabled"; + }; + + dcpext4: dcp@306c00000 { + compatible = "apple,t6032-dcpext"; + mboxes = <&dcpext4_mbox>; + mbox-names = "mbox"; + iommus = <&dcpext4_dart 5>; + reg-names = "coproc", "disp-0", "disp-2", "disp-3", "disp-4", + "iop-vbar"; + reg = <0x3 0x6c00000 0x0 0x4000>, + <0x3 0x4000000 0x0 0x4000000>, + <0x3 0x5320000 0x0 0x4000>, + <0x3 0x5344000 0x0 0x4000>, + <0x3 0x6800000 0x0 0x800000>, + <0x3 0x6850000 0x0 0x4000>; + power-domains = <&ps_dispext0_cpu_die1>; + #address-cells = <2>; + #size-cells = <2>; + ranges; + status = "disabled"; + + dcpext4_piodma: piodma { + iommus = <&dispext4_dart 4>; + }; + }; +}; + +&die1 { + dispext5_dart: iommu@449304000 { + compatible = "apple,t6032-dart", "apple,t8110-dart"; + reg = <0x4 0x49304000 0x0 0x4000>; + interrupt-parent = <&aic>; + interrupts = ; + #iommu-cells = <1>; + apple,dma-range = <0x100 0x0 0x10 0x0>; + power-domains = <&ps_dispext1_cpu_die1>; + status = "disabled"; + }; + + dcpext5_dart: iommu@44930c000 { + compatible = "apple,t6032-dart", "apple,t8110-dart"; + reg = <0x4 0x4930c000 0x0 0x4000>; + interrupt-parent = <&aic>; + interrupts = ; + #iommu-cells = <1>; + apple,dma-range = <0x100 0x0 0x10 0x0>; + power-domains = <&ps_dispext1_cpu_die1>; + status = "disabled"; + }; + + dcpext5_mbox: mbox@44ac08000 { + compatible = "apple,t6032-asc-mailbox", "apple,asc-mailbox-v4"; + reg = <0x4 0x4ac08000 0x0 0x4000>; + interrupt-parent = <&aic>; + /* ADT list (n+1,n,n+3,n+2) reordered to mailbox order. */ + interrupts = , + , + , + ; + interrupt-names = "send-empty", "send-not-empty", + "recv-empty", "recv-not-empty"; + power-domains = <&ps_dispext1_cpu_die1>; + #mbox-cells = <0>; + status = "disabled"; + }; + + dcpext5: dcp@44ac00000 { + compatible = "apple,t6032-dcpext"; + mboxes = <&dcpext5_mbox>; + mbox-names = "mbox"; + iommus = <&dcpext5_dart 5>; + reg-names = "coproc", "disp-0", "disp-2", "disp-3", "disp-4", + "iop-vbar"; + reg = <0x4 0x4ac00000 0x0 0x4000>, + <0x4 0x48000000 0x0 0x4000000>, + <0x4 0x49320000 0x0 0x4000>, + <0x4 0x49344000 0x0 0x4000>, + <0x4 0x4a800000 0x0 0x800000>, + <0x4 0x4a850000 0x0 0x4000>; + power-domains = <&ps_dispext1_cpu_die1>; + #address-cells = <2>; + #size-cells = <2>; + ranges; + status = "disabled"; + + dcpext5_piodma: piodma { + iommus = <&dispext5_dart 4>; + }; + }; +}; + +&die1 { + dispext6_dart: iommu@44d304000 { + compatible = "apple,t6032-dart", "apple,t8110-dart"; + reg = <0x4 0x4d304000 0x0 0x4000>; + interrupt-parent = <&aic>; + interrupts = ; + #iommu-cells = <1>; + apple,dma-range = <0x100 0x0 0x10 0x0>; + power-domains = <&ps_dispext2_cpu_die1>; + status = "disabled"; + }; + + dcpext6_dart: iommu@44d30c000 { + compatible = "apple,t6032-dart", "apple,t8110-dart"; + reg = <0x4 0x4d30c000 0x0 0x4000>; + interrupt-parent = <&aic>; + interrupts = ; + #iommu-cells = <1>; + apple,dma-range = <0x100 0x0 0x10 0x0>; + power-domains = <&ps_dispext2_cpu_die1>; + status = "disabled"; + }; + + dcpext6_mbox: mbox@44ec08000 { + compatible = "apple,t6032-asc-mailbox", "apple,asc-mailbox-v4"; + reg = <0x4 0x4ec08000 0x0 0x4000>; + interrupt-parent = <&aic>; + /* ADT list (n+1,n,n+3,n+2) reordered to mailbox order. */ + interrupts = , + , + , + ; + interrupt-names = "send-empty", "send-not-empty", + "recv-empty", "recv-not-empty"; + power-domains = <&ps_dispext2_cpu_die1>; + #mbox-cells = <0>; + status = "disabled"; + }; + + dcpext6: dcp@44ec00000 { + compatible = "apple,t6032-dcpext"; + mboxes = <&dcpext6_mbox>; + mbox-names = "mbox"; + iommus = <&dcpext6_dart 5>; + reg-names = "coproc", "disp-0", "disp-2", "disp-3", "disp-4", + "iop-vbar"; + reg = <0x4 0x4ec00000 0x0 0x4000>, + <0x4 0x4c000000 0x0 0x4000000>, + <0x4 0x4d320000 0x0 0x4000>, + <0x4 0x4d344000 0x0 0x4000>, + <0x4 0x4e800000 0x0 0x800000>, + <0x4 0x4e850000 0x0 0x4000>; + power-domains = <&ps_dispext2_cpu_die1>; + #address-cells = <2>; + #size-cells = <2>; + ranges; + status = "disabled"; + + dcpext6_piodma: piodma { + iommus = <&dispext6_dart 4>; + }; + }; +}; + +&die1 { + dispext7_dart: iommu@2c9304000 { + compatible = "apple,t6032-dart", "apple,t8110-dart"; + reg = <0x2 0xc9304000 0x0 0x4000>; + interrupt-parent = <&aic>; + interrupts = ; + #iommu-cells = <1>; + apple,dma-range = <0x100 0x0 0x10 0x0>; + power-domains = <&ps_dispext3_cpu_die1>; + status = "disabled"; + }; + + dcpext7_dart: iommu@2c930c000 { + compatible = "apple,t6032-dart", "apple,t8110-dart"; + reg = <0x2 0xc930c000 0x0 0x4000>; + interrupt-parent = <&aic>; + interrupts = ; + #iommu-cells = <1>; + apple,dma-range = <0x100 0x0 0x10 0x0>; + power-domains = <&ps_dispext3_cpu_die1>; + status = "disabled"; + }; + + dcpext7_mbox: mbox@2cac08000 { + compatible = "apple,t6032-asc-mailbox", "apple,asc-mailbox-v4"; + reg = <0x2 0xcac08000 0x0 0x4000>; + interrupt-parent = <&aic>; + /* ADT list (n+1,n,n+3,n+2) reordered to mailbox order. */ + interrupts = , + , + , + ; + interrupt-names = "send-empty", "send-not-empty", + "recv-empty", "recv-not-empty"; + power-domains = <&ps_dispext3_cpu_die1>; + #mbox-cells = <0>; + status = "disabled"; + }; + + dcpext7: dcp@2cac00000 { + compatible = "apple,t6032-dcpext"; + mboxes = <&dcpext7_mbox>; + mbox-names = "mbox"; + iommus = <&dcpext7_dart 5>; + reg-names = "coproc", "disp-0", "disp-2", "disp-3", "disp-4", + "iop-vbar"; + reg = <0x2 0xcac00000 0x0 0x4000>, + <0x2 0xc8000000 0x0 0x4000000>, + <0x2 0xc9320000 0x0 0x4000>, + <0x2 0xc9344000 0x0 0x4000>, + <0x2 0xca800000 0x0 0x800000>, + <0x2 0xca850000 0x0 0x4000>; + power-domains = <&ps_dispext3_cpu_die1>; + #address-cells = <2>; + #size-cells = <2>; + ranges; + status = "disabled"; + + dcpext7_piodma: piodma { + iommus = <&dispext7_dart 4>; + }; + }; +}; + +/* + * The Apple Neural Engine: ane0 on die 0, ane1 on die 1 (the 26.0+ ADT + * layout: ASC wrapper 0x3_c940_0000, engine 0x3_c800_0000, a second engine + * window 0x4_0400_0000). Register windows are the 27.0.1 ADT's, in ADT + * order. No Linux driver covers M3, so the engines and their DARTs stay + * disabled. + */ +&die0 { + ane0_dart0: iommu@3c9800000 { + compatible = "apple,t6031-dart", "apple,t8110-dart"; + reg = <0x3 0xc9800000 0x0 0x4000>; + interrupt-parent = <&aic>; + interrupts = ; + power-domains = <&ps_ane_sys>; + #iommu-cells = <1>; + status = "disabled"; + }; + + ane0_dart1: iommu@3c9810000 { + compatible = "apple,t6031-dart", "apple,t8110-dart"; + reg = <0x3 0xc9810000 0x0 0x4000>; + interrupt-parent = <&aic>; + interrupts = ; + power-domains = <&ps_ane_sys>; + #iommu-cells = <1>; + status = "disabled"; + }; + + ane0_dart2: iommu@3c9820000 { + compatible = "apple,t6031-dart", "apple,t8110-dart"; + reg = <0x3 0xc9820000 0x0 0x4000>; + interrupt-parent = <&aic>; + interrupts = ; + power-domains = <&ps_ane_sys>; + #iommu-cells = <1>; + status = "disabled"; + }; + + ane0: ane@3c9400000 { + compatible = "apple,t6032-ane"; + /* ADT windows in ADT order: ASC wrapper, ASC block, engine, + * pmgr bank, pmgr set bank, IO-clear, second engine, DART + * tunables. */ + reg = <0x3 0xc9400000 0x0 0x6c000>, + <0x3 0xc9050000 0x0 0x4000>, + <0x3 0xc8000000 0x0 0x2000000>, + <0x2 0x92280000 0x0 0x10000>, + <0x2 0x92290000 0x0 0x4000>, + <0x2 0x903c0000 0x0 0x30000>, + <0x4 0x04000000 0x0 0x2000000>, + <0x2 0xa02dc000 0x0 0x4000>; + interrupt-parent = <&aic>; + interrupts = , + , + , + , + ; + power-domains = <&ps_ane_sys>, <&ps_ane_mpm>, + <&ps_ane_cpu>, <&ps_ane_td>, <&ps_ane_base>; + iommus = <&ane0_dart0 0>, <&ane0_dart1 0>, <&ane0_dart2 0>; + status = "disabled"; + }; +}; + +&die1 { + ane1_dart0: iommu@3c9800000 { + compatible = "apple,t6031-dart", "apple,t8110-dart"; + reg = <0x3 0xc9800000 0x0 0x4000>; + interrupt-parent = <&aic>; + interrupts = ; + power-domains = <&ps_ane_sys_die1>; + #iommu-cells = <1>; + status = "disabled"; + }; + + ane1_dart1: iommu@3c9810000 { + compatible = "apple,t6031-dart", "apple,t8110-dart"; + reg = <0x3 0xc9810000 0x0 0x4000>; + interrupt-parent = <&aic>; + interrupts = ; + power-domains = <&ps_ane_sys_die1>; + #iommu-cells = <1>; + status = "disabled"; + }; + + ane1_dart2: iommu@3c9820000 { + compatible = "apple,t6031-dart", "apple,t8110-dart"; + reg = <0x3 0xc9820000 0x0 0x4000>; + interrupt-parent = <&aic>; + interrupts = ; + power-domains = <&ps_ane_sys_die1>; + #iommu-cells = <1>; + status = "disabled"; + }; + + /* The io-clear window 0x2_903c0000 is die-0 resident and shared with + * ane0; all other windows are die-1. */ + ane1: ane@23c9400000 { + compatible = "apple,t6032-ane"; + reg = <0x3 0xc9400000 0x0 0x6c000>, + <0x3 0xc9050000 0x0 0x4000>, + <0x3 0xc8000000 0x0 0x2000000>, + <0x2 0x92280000 0x0 0x10000>, + <0x2 0x92290000 0x0 0x4000>, + <0x4 0x04000000 0x0 0x2000000>, + <0x2 0xa02dc000 0x0 0x4000>; + interrupt-parent = <&aic>; + interrupts = , + , + , + , + ; + power-domains = <&ps_ane_sys_die1>, <&ps_ane_mpm_die1>, + <&ps_ane_cpu_die1>, <&ps_ane_td_die1>, + <&ps_ane_base_die1>; + iommus = <&ane1_dart0 0>, <&ane1_dart1 0>, <&ane1_dart2 0>; + status = "disabled"; + }; +}; diff --git a/arch/arm64/configs/t6032-console.config b/arch/arm64/configs/t6032-console.config new file mode 100644 index 00000000000000..aa84abafec6642 --- /dev/null +++ b/arch/arm64/configs/t6032-console.config @@ -0,0 +1,25 @@ +# Console and network additions for the T6032 Mac Studio board. +# Merge over defconfig and asahi.config, then run olddefconfig and check +# that the symbols below survive. +# +# The PCIe ports take PERST from the AP pin controller and power from the +# SMC GPIO, and the NVMe controller needs the SART, so these are built in: +# a boot without an initramfs must reach the 10 Gbit port and the disk. +CONFIG_PINCTRL_APPLE_GPIO=y +CONFIG_MFD_MACSMC=y +CONFIG_GPIO_MACSMC=y +CONFIG_APPLE_SART=y +CONFIG_BLK_DEV_NVME=y +CONFIG_NVME_APPLE=y +# +# The 10 Gbit port is a PCIe Ethernet device behind port02. The ADT names it +# lan-10gb and its i2c companion aqc-a, so it is taken to be an aQuantia +# AQtion part. The ADT gives no PCI ID. +CONFIG_NET_VENDOR_AQUANTIA=y +CONFIG_AQTION=y +# +# USB-A xHCI behind port03 (ASM3142) and USB Ethernet or ACM gadget hosts. +CONFIG_USB_XHCI_PCI=y +CONFIG_USB_XHCI_PCI_ASMEDIA=y +CONFIG_USB_NET_CDCETHER=m +CONFIG_USB_NET_CDC_NCM=m