diff --git a/Documentation/devicetree/bindings/gpu/apple,agx.yaml b/Documentation/devicetree/bindings/gpu/apple,agx.yaml index 80ec251dd42ed..a0713c75129fa 100644 --- a/Documentation/devicetree/bindings/gpu/apple,agx.yaml +++ b/Documentation/devicetree/bindings/gpu/apple,agx.yaml @@ -23,6 +23,7 @@ properties: - apple,agx-t6050 - apple,agx-t8132 - apple,agx-t8140 + - apple,agx-t8142 - items: - const: apple,agx-g17c - const: apple,agx-g17s @@ -83,16 +84,11 @@ properties: - description: Shared global variables, preserved firmware data or text segment of the loaded GPU firmware + - description: Additional firmware crash-log data on T8142 memory-region-names: minItems: 3 - items: - - const: ttbs - - const: pagetables - - const: handoff - - enum: [hw-cal-a, shared-l2, fw-data] - - enum: [hw-cal-b, fw-text, l2-pagetables] - - enum: [globals, fw-data, fw-text] + maxItems: 7 apple,clpc: $ref: /schemas/types.yaml#/definitions/phandle @@ -535,6 +531,7 @@ allOf: - apple,agx-t6050 - apple,agx-t8132 - apple,agx-t8140 + - apple,agx-t8142 then: properties: reg: @@ -560,6 +557,64 @@ allOf: required: - apple,firmware-abi + - if: + properties: + compatible: + contains: + const: apple,agx-t8142 + then: + properties: + reg: + items: + - description: GFX coprocessor control registers + - description: GPU block MMIO registers + reg-names: + items: + - const: asc + - const: sgx + mboxes: + items: + - description: GFX coprocessor mailbox + - description: GFX1 coprocessor mailbox + memory-region: + items: + - description: GPU MMU TTBs + - description: GPU MMU page tables + - description: Shared GPU MMU handoff structure + - description: Shared L2 page tables + - description: GFX firmware data + - description: GFX1 firmware data + - description: Combined firmware data and shared read-only crash logs + memory-region-names: + items: + - const: ttbs + - const: pagetables + - const: handoff + - const: shared-l2 + - const: gfx-data + - const: gfx1-data + - const: fw-data + required: + - reg-names + - mboxes + - memory-region + - memory-region-names + - power-domains + - operating-points-v2 + else: + properties: + memory-region: + maxItems: 6 + memory-region-names: + minItems: 3 + items: + - const: ttbs + - const: pagetables + - const: handoff + - enum: [hw-cal-a, shared-l2, fw-data] + - enum: [hw-cal-b, fw-text, l2-pagetables] + - enum: [globals, fw-data, fw-text] + additionalProperties: false examples: diff --git a/Documentation/devicetree/bindings/i2c/apple,i2c.yaml b/Documentation/devicetree/bindings/i2c/apple,i2c.yaml index f2e16482d9218..6c649719118af 100644 --- a/Documentation/devicetree/bindings/i2c/apple,i2c.yaml +++ b/Documentation/devicetree/bindings/i2c/apple,i2c.yaml @@ -31,6 +31,7 @@ properties: - apple,t8122-i2c - apple,t8132-i2c - apple,t8140-i2c + - apple,t8142-i2c - const: apple,t8103-i2c - items: - enum: diff --git a/Documentation/devicetree/bindings/iio/light/apple,aop-als.yaml b/Documentation/devicetree/bindings/iio/light/apple,aop-als.yaml index f714c1c7e1327..95d68076b116e 100644 --- a/Documentation/devicetree/bindings/iio/light/apple,aop-als.yaml +++ b/Documentation/devicetree/bindings/iio/light/apple,aop-als.yaml @@ -22,6 +22,7 @@ select: - apple,t6020-aop-als - apple,t6050-aop-als - apple,t8112-aop-als + - apple,t8142-aop-als required: - compatible @@ -32,6 +33,7 @@ properties: - apple,t6020-aop-als - apple,t6050-aop-als - apple,t8112-aop-als + - apple,t8142-aop-als - const: apple,aop-als required: diff --git a/Documentation/devicetree/bindings/net/wireless/apple,centauri.yaml b/Documentation/devicetree/bindings/net/wireless/apple,centauri.yaml index f73dd9afceca1..8d226eec13091 100644 --- a/Documentation/devicetree/bindings/net/wireless/apple,centauri.yaml +++ b/Documentation/devicetree/bindings/net/wireless/apple,centauri.yaml @@ -17,11 +17,22 @@ description: | bootstrap. This binding does not authorize adopting an existing live firmware session or releasing another owner's retained DART streams. + The T8142 native transport uses the same PCI function IDs but is a + different firmware profile. Its SoC-specific compatible identifies this + binding profile; the generic PCI compatible is retained as the fallback. + Runtime driver selection continues to use the PCI ID and host SoC, and the + native driver selects personalized firmware and transport data from its + root-board match table rather than the T6050 wire-protocol properties. + properties: compatible: - enum: - - pci106b,1900 - - pci106b,1901 + oneOf: + - enum: + - pci106b,1900 + - pci106b,1901 + - items: + - const: apple,t8142-centauri-control + - const: pci106b,1900 reg: maxItems: 1 @@ -40,11 +51,25 @@ properties: const: 27 description: Shared firmware wire protocol profile +allOf: + - if: + properties: + compatible: + contains: + const: apple,t8142-centauri-control + then: + properties: + firmware-name: false + apple,centauri-platform-id: false + apple,centauri-protocol: false + else: + required: + - firmware-name + - apple,centauri-platform-id + - apple,centauri-protocol + required: - compatible - reg - - firmware-name - - apple,centauri-platform-id - - apple,centauri-protocol additionalProperties: false diff --git a/Documentation/devicetree/bindings/pinctrl/apple,pinctrl.yaml b/Documentation/devicetree/bindings/pinctrl/apple,pinctrl.yaml index e2bec4d954de9..bfa8894eac727 100644 --- a/Documentation/devicetree/bindings/pinctrl/apple,pinctrl.yaml +++ b/Documentation/devicetree/bindings/pinctrl/apple,pinctrl.yaml @@ -29,6 +29,10 @@ properties: - apple,t8140-pinctrl - apple,t8152-pinctrl - const: apple,t8103-pinctrl + - items: + - const: apple,t8142-pinctrl + - const: apple,t8140-pinctrl + - const: apple,t8103-pinctrl - items: - const: apple,t6050-pinctrl - const: apple,t8132-pinctrl diff --git a/Documentation/devicetree/bindings/soc/apple/apple,t8152-aop.yaml b/Documentation/devicetree/bindings/soc/apple/apple,t8152-aop.yaml index 32b0a2e631bc9..2b1148961368c 100644 --- a/Documentation/devicetree/bindings/soc/apple/apple,t8152-aop.yaml +++ b/Documentation/devicetree/bindings/soc/apple/apple,t8152-aop.yaml @@ -75,6 +75,29 @@ properties: description: The lid angle sensor service. unevaluatedProperties: false +allOf: + - if: + properties: + compatible: + contains: + const: apple,t8142-aop + then: + properties: + als: + properties: + compatible: + items: + - const: apple,t8142-aop-als + - const: apple,aop-als + else: + properties: + als: + properties: + compatible: + not: + contains: + const: apple,t8142-aop-als + required: - compatible - reg diff --git a/Documentation/devicetree/bindings/spi/apple,spi.yaml b/Documentation/devicetree/bindings/spi/apple,spi.yaml index 62d5afda0d310..70954d834fa8c 100644 --- a/Documentation/devicetree/bindings/spi/apple,spi.yaml +++ b/Documentation/devicetree/bindings/spi/apple,spi.yaml @@ -27,6 +27,7 @@ properties: - apple,t8122-spi - apple,t8132-spi - apple,t8140-spi + - apple,t8142-spi - const: apple,t8103-spi - items: - enum: diff --git a/arch/arm64/boot/dts/apple/t8142-j813-audio.dtsi b/arch/arm64/boot/dts/apple/t8142-j813-audio.dtsi index 892155da27ee0..c345bc3ff50ac 100644 --- a/arch/arm64/boot/dts/apple/t8142-j813-audio.dtsi +++ b/arch/arm64/boot/dts/apple/t8142-j813-audio.dtsi @@ -210,13 +210,6 @@ * (setup port) and 11 (admac-leap-s) on the raw boot. As on T8140, the * firmware's own mappings own the first slot, host buffers go above it. */ - aop_dart: iommu@390fc0000 { - compatible = "apple,t8142-dart", "apple,t8110-dart"; - reg = <0x3 0x90fc0000 0x0 0xc000>; - #iommu-cells = <1>; - interrupt-parent = <&aic>; - interrupts = ; - }; admac_base_ns: dma-controller@393800000 { compatible = "apple,t8140-admac"; @@ -415,3 +408,7 @@ }; }; }; + +&aop_dart { + status = "okay"; +}; diff --git a/arch/arm64/boot/dts/apple/t8142-j813-avd.dtsi b/arch/arm64/boot/dts/apple/t8142-j813-avd.dtsi index 5672ebb885a51..3dd7ff576fea4 100644 --- a/arch/arm64/boot/dts/apple/t8142-j813-avd.dtsi +++ b/arch/arm64/boot/dts/apple/t8142-j813-avd.dtsi @@ -33,13 +33,9 @@ reg-names = "code", "sram", "mbox", "ctrl"; iommus = <&avd_dart 0>, <&avd_dart 1>, <&avd_dart 2>; }; +}; - avd_dart: iommu@501020000 { - compatible = "apple,t8142-dart", "apple,t8110-dart"; - reg = <0x5 0x01020000 0x0 0x20000>; - #iommu-cells = <1>; - interrupt-parent = <&aic>; - interrupts = ; - power-domains = <&ps_avd_sys>; - }; +&avd_dart { + power-domains = <&ps_avd_sys>; + status = "okay"; }; diff --git a/arch/arm64/boot/dts/apple/t8142-j813-display.dtsi b/arch/arm64/boot/dts/apple/t8142-j813-display.dtsi index 812b558be0ee6..650517b561734 100644 --- a/arch/arm64/boot/dts/apple/t8142-j813-display.dtsi +++ b/arch/arm64/boot/dts/apple/t8142-j813-display.dtsi @@ -44,23 +44,6 @@ #mbox-cells = <0>; }; - disp0_dart: iommu@286300000 { - compatible = "apple,t8142-dart", "apple,t8110-dart"; - reg = <2 0x86300000 0 0xc000>; - interrupts = ; - #iommu-cells = <1>; - apple,dma-range = <0x100 0x0 0x10 0x0>; - status = "disabled"; - }; - - dcp_dart: iommu@286340000 { - compatible = "apple,t8142-dart", "apple,t8110-dart"; - reg = <2 0x86340000 0 0x20000>; - interrupts = ; - #iommu-cells = <1>; - apple,dma-range = <0x100 0x0 0x10 0x0>; - }; - dcp: dcp@286e00000 { compatible = "apple,t8142-dcp", "apple,dcp"; mboxes = <&dcp_mbox>; @@ -114,6 +97,16 @@ }; }; +&disp0_dart { + reg = <2 0x86300000 0 0xc000>; + apple,dma-range = <0x100 0x0 0x10 0x0>; +}; + +&dcp_dart { + apple,dma-range = <0x100 0x0 0x10 0x0>; + status = "okay"; +}; + / { /* * The DCP firmware's clocks 585 and 431 (/arm-io/disp0 clock-ids). The diff --git a/arch/arm64/boot/dts/apple/t8142-j813-n1.dtsi b/arch/arm64/boot/dts/apple/t8142-j813-n1.dtsi index 052491f27233b..e99e7876e7c66 100644 --- a/arch/arm64/boot/dts/apple/t8142-j813-n1.dtsi +++ b/arch/arm64/boot/dts/apple/t8142-j813-n1.dtsi @@ -36,12 +36,8 @@ msi-controller; msi-ranges = <&aic AIC_IRQ 1741 IRQ_TYPE_EDGE_RISING 32>; }; +}; - pcie0_dart: iommu@488000000 { - compatible = "apple,t8142-dart", "apple,t8110-dart"; - reg = <4 0x88000000 0 0x20000>; - interrupt-parent = <&aic>; - interrupts = ; - #iommu-cells = <1>; - }; +&pcie0_dart { + status = "okay"; }; diff --git a/arch/arm64/boot/dts/apple/t8142-j813-peripherals.dtsi b/arch/arm64/boot/dts/apple/t8142-j813-peripherals.dtsi index e5220708202e8..d4293c35b601b 100644 --- a/arch/arm64/boot/dts/apple/t8142-j813-peripherals.dtsi +++ b/arch/arm64/boot/dts/apple/t8142-j813-peripherals.dtsi @@ -28,81 +28,70 @@ }; }; -&{/soc} { - pmgr: power-management@380700000 { - compatible = "apple,t8142-pmgr", "apple,t8103-pmgr", "syscon", "simple-mfd"; - /* As on T8140: up to the ISP17a slots at +0x4000..+0x4060. */ - reg = <3 0x80700000 0 0x14000>; - #address-cells = <1>; - #size-cells = <1>; - - ps_fpwm0: power-controller@330 { - compatible = "apple,t8142-pmgr-pwrstate", "apple,t8103-pmgr-pwrstate"; - reg = <0x330 4>; - #power-domain-cells = <0>; - #reset-cells = <0>; - label = "fpwm0"; - }; +&pmgr { + /* As on T8140: up to the ISP17a slots at +0x4000..+0x4060. */ + reg = <3 0x80700000 0 0x14000>; + status = "okay"; + + ps_fpwm0: power-controller@330 { + compatible = "apple,t8142-pmgr-pwrstate", "apple,t8103-pmgr-pwrstate"; + reg = <0x330 4>; + #power-domain-cells = <0>; + #reset-cells = <0>; + label = "fpwm0"; + }; - /* ADT pmgr devices: SPI_P id 94 (+0x390), QSPI id 120 (+0x460). */ - ps_spi_p: power-controller@390 { - compatible = "apple,t8142-pmgr-pwrstate", "apple,t8103-pmgr-pwrstate"; - reg = <0x390 4>; - #power-domain-cells = <0>; - #reset-cells = <0>; - label = "spi_p"; - }; + /* ADT pmgr devices: SPI_P id 94 (+0x390), QSPI id 120 (+0x460). */ + ps_spi_p: power-controller@390 { + compatible = "apple,t8142-pmgr-pwrstate", "apple,t8103-pmgr-pwrstate"; + reg = <0x390 4>; + #power-domain-cells = <0>; + #reset-cells = <0>; + label = "spi_p"; + }; - /* ADT pmgr devices: PMP id 159 (+0x598), PMS_SRAM id 160 (+0x5a0). */ - ps_pmp: power-controller@598 { - compatible = "apple,t8142-pmgr-pwrstate", "apple,t8103-pmgr-pwrstate"; - reg = <0x598 4>; - #power-domain-cells = <0>; - #reset-cells = <0>; - label = "pmp"; - /* The PMP's SRAM, which the driver reads first. */ - power-domains = <&ps_pms_sram>; - /* - * As on T8140/T8132: the PMP firmware keeps running. If genpd - * gates this domain at s2idle, the PMP crashes on its own MMIO. - */ - apple,always-on; - }; + /* ADT pmgr devices: PMP id 159 (+0x598), PMS_SRAM id 160 (+0x5a0). */ + ps_pmp: power-controller@598 { + compatible = "apple,t8142-pmgr-pwrstate", "apple,t8103-pmgr-pwrstate"; + reg = <0x598 4>; + #power-domain-cells = <0>; + #reset-cells = <0>; + label = "pmp"; + /* The PMP's SRAM, which the driver reads first. */ + power-domains = <&ps_pms_sram>; + /* + * As on T8140/T8132: the PMP firmware keeps running. If genpd + * gates this domain at s2idle, the PMP crashes on its own MMIO. + */ + apple,always-on; + }; - ps_pms_sram: power-controller@5a0 { - compatible = "apple,t8142-pmgr-pwrstate", "apple,t8103-pmgr-pwrstate"; - reg = <0x5a0 4>; - #power-domain-cells = <0>; - #reset-cells = <0>; - label = "pms_sram"; - /* T8140 holds it through its always-on PMP report node. */ - apple,always-on; - }; + ps_pms_sram: power-controller@5a0 { + compatible = "apple,t8142-pmgr-pwrstate", "apple,t8103-pmgr-pwrstate"; + reg = <0x5a0 4>; + #power-domain-cells = <0>; + #reset-cells = <0>; + label = "pms_sram"; + /* T8140 holds it through its always-on PMP report node. */ + apple,always-on; + }; - ps_qspi: power-controller@460 { - compatible = "apple,t8142-pmgr-pwrstate", "apple,t8103-pmgr-pwrstate"; - reg = <0x460 4>; - #power-domain-cells = <0>; - #reset-cells = <0>; - label = "qspi"; - power-domains = <&ps_spi_p>; - }; + ps_qspi: power-controller@460 { + compatible = "apple,t8142-pmgr-pwrstate", "apple,t8103-pmgr-pwrstate"; + reg = <0x460 4>; + #power-domain-cells = <0>; + #reset-cells = <0>; + label = "qspi"; + power-domains = <&ps_spi_p>; }; +}; +&{/soc} { /* * PMP, laid out as on T8140 (ADT /arm-io/pmp, dart-pmp): it runs the * DRAM controller (DCS) and fabric DVFS. Without it the memory stays at * the bootloader's state (memcpy ~20 GB/s against ~120 GB/s on macOS). */ - pmp_dart: iommu@380300000 { - compatible = "apple,t8142-dart", "apple,t8110-dart"; - reg = <0x3 0x80300000 0x0 0xc000>; - interrupt-parent = <&aic>; - interrupts = ; - #iommu-cells = <1>; - apple,dma-range = /bits/ 64 <0x10000000000 0xbff00000>; - power-domains = <&ps_pmp>; - }; pmp: pmp@380500000 { compatible = "apple,t8142-pmp-v2", "apple,t8140-pmp-v2"; @@ -173,14 +162,19 @@ clocks = <&clkref>; #pwm-cells = <2>; }; - - mtp_dart: iommu@394800000 { - compatible = "apple,t8142-dart", "apple,t8110-dart"; - reg = <3 0x94800000 0 0xc000>; - interrupts = ; - #iommu-cells = <1>; - /* Keep host allocations clear of firmware's low IOVA mappings. */ - apple,dma-range = <0 0x02000000 0 0x10000000>; - }; }; #include "t8142-j813-pmp-tunables.dtsi" + +&pmp_dart { + apple,dma-range = /bits/ 64 <0x10000000000 0xbff00000>; + power-domains = <&ps_pmp>; + status = "okay"; +}; + +&mtp_dart { + reg = <3 0x94800000 0 0xc000>; + /delete-property/ reg-names; + /* Keep host allocations clear of firmware's low IOVA mappings. */ + apple,dma-range = <0 0x02000000 0 0x10000000>; + status = "okay"; +}; diff --git a/arch/arm64/boot/dts/apple/t8142-j813-usb.dtsi b/arch/arm64/boot/dts/apple/t8142-j813-usb.dtsi index e27e40c04e268..2eb0b1f16af47 100644 --- a/arch/arm64/boot/dts/apple/t8142-j813-usb.dtsi +++ b/arch/arm64/boot/dts/apple/t8142-j813-usb.dtsi @@ -132,6 +132,7 @@ power-domains = <&ps_atc0_usb>; #iommu-cells = <1>; apple,dma-range = <0x100 0x4000 0 0xffff0000>; + status = "okay"; }; dwc3_0_dart_1: iommu@402f80000 { @@ -278,6 +279,7 @@ power-domains = <&ps_atc1_usb>; #iommu-cells = <1>; apple,dma-range = <0x100 0x4000 0 0xffff0000>; + status = "okay"; }; dwc3_1_dart_1: iommu@40af80000 { diff --git a/arch/arm64/boot/dts/apple/t8142-j813.dts b/arch/arm64/boot/dts/apple/t8142-j813.dts index 21b1688e83f8a..ada1ee9edd187 100644 --- a/arch/arm64/boot/dts/apple/t8142-j813.dts +++ b/arch/arm64/boot/dts/apple/t8142-j813.dts @@ -8,18 +8,13 @@ */ /dts-v1/; -#include -#include +#include "t8142.dtsi" / { compatible = "apple,j813", "apple,t8142", "apple,arm-platform"; model = "Apple MacBook Air (13-inch, M5, 2026)"; chassis-type = "laptop"; - #address-cells = <2>; - #size-cells = <2>; - interrupt-parent = <&aic>; - aliases { serial0 = &dockchannel; serial1 = &serial0; @@ -39,173 +34,85 @@ }; }; - reserved-memory { - #address-cells = <2>; - #size-cells = <2>; - ranges; - /* Filled by the loader. */ - }; - memory@10000000000 { - device_type = "memory"; reg = <0x100 0 0x4 0>; /* Filled by the loader. */ }; +}; - cpus { - #address-cells = <2>; - #size-cells = <0>; - - cpu0: cpu@0 { - compatible = "apple,t8142-e"; - device_type = "cpu"; - reg = <0 0x0>; - operating-points-v2 = <&ecluster_opp>; - performance-domains = <&cpufreq_e>; - enable-method = "spin-table"; - cpu-release-addr = <0 0>; /* Filled by the loader. */ - }; - - cpu1: cpu@1 { - compatible = "apple,t8142-e"; - device_type = "cpu"; - reg = <0 0x1>; - operating-points-v2 = <&ecluster_opp>; - performance-domains = <&cpufreq_e>; - enable-method = "spin-table"; - cpu-release-addr = <0 0>; /* Filled by the loader. */ - }; +&cpu0 { + operating-points-v2 = <&ecluster_opp>; + performance-domains = <&cpufreq_e>; + status = "okay"; +}; - cpu2: cpu@2 { - compatible = "apple,t8142-e"; - device_type = "cpu"; - reg = <0 0x2>; - operating-points-v2 = <&ecluster_opp>; - performance-domains = <&cpufreq_e>; - enable-method = "spin-table"; - cpu-release-addr = <0 0>; /* Filled by the loader. */ - }; +&cpu1 { + operating-points-v2 = <&ecluster_opp>; + performance-domains = <&cpufreq_e>; + status = "okay"; +}; - cpu3: cpu@3 { - compatible = "apple,t8142-e"; - device_type = "cpu"; - reg = <0 0x3>; - operating-points-v2 = <&ecluster_opp>; - performance-domains = <&cpufreq_e>; - enable-method = "spin-table"; - cpu-release-addr = <0 0>; /* Filled by the loader. */ - }; +&cpu2 { + operating-points-v2 = <&ecluster_opp>; + performance-domains = <&cpufreq_e>; + status = "okay"; +}; - cpu4: cpu@4 { - compatible = "apple,t8142-e"; - device_type = "cpu"; - reg = <0 0x4>; - operating-points-v2 = <&ecluster_opp>; - performance-domains = <&cpufreq_e>; - enable-method = "spin-table"; - cpu-release-addr = <0 0>; /* Filled by the loader. */ - }; +&cpu3 { + operating-points-v2 = <&ecluster_opp>; + performance-domains = <&cpufreq_e>; + status = "okay"; +}; - cpu5: cpu@5 { - compatible = "apple,t8142-e"; - device_type = "cpu"; - reg = <0 0x5>; - operating-points-v2 = <&ecluster_opp>; - performance-domains = <&cpufreq_e>; - enable-method = "spin-table"; - cpu-release-addr = <0 0>; /* Filled by the loader. */ - }; +&cpu4 { + operating-points-v2 = <&ecluster_opp>; + performance-domains = <&cpufreq_e>; + status = "okay"; +}; - cpu6: cpu@10100 { - compatible = "apple,t8142-p"; - device_type = "cpu"; - reg = <0 0x10100>; - operating-points-v2 = <&pcluster_opp>; - performance-domains = <&cpufreq_p>; - enable-method = "spin-table"; - cpu-release-addr = <0 0>; /* Filled by the loader. */ - }; +&cpu5 { + operating-points-v2 = <&ecluster_opp>; + performance-domains = <&cpufreq_e>; + status = "okay"; +}; - cpu7: cpu@10101 { - compatible = "apple,t8142-p"; - device_type = "cpu"; - reg = <0 0x10101>; - operating-points-v2 = <&pcluster_opp>; - performance-domains = <&cpufreq_p>; - enable-method = "spin-table"; - cpu-release-addr = <0 0>; /* Filled by the loader. */ - }; +&cpu6 { + operating-points-v2 = <&pcluster_opp>; + performance-domains = <&cpufreq_p>; + status = "okay"; +}; - cpu8: cpu@10102 { - compatible = "apple,t8142-p"; - device_type = "cpu"; - reg = <0 0x10102>; - operating-points-v2 = <&pcluster_opp>; - performance-domains = <&cpufreq_p>; - enable-method = "spin-table"; - cpu-release-addr = <0 0>; /* Filled by the loader. */ - }; +&cpu7 { + operating-points-v2 = <&pcluster_opp>; + performance-domains = <&cpufreq_p>; + status = "okay"; +}; - cpu9: cpu@10103 { - compatible = "apple,t8142-p"; - device_type = "cpu"; - reg = <0 0x10103>; - operating-points-v2 = <&pcluster_opp>; - performance-domains = <&cpufreq_p>; - enable-method = "spin-table"; - cpu-release-addr = <0 0>; /* Filled by the loader. */ - }; - }; +&cpu8 { + operating-points-v2 = <&pcluster_opp>; + performance-domains = <&cpufreq_p>; + status = "okay"; +}; - timer { - compatible = "arm,armv8-timer"; - interrupts = , - , - , - ; - interrupt-names = "phys", "virt", "hyp-phys", "hyp-virt"; - }; +&cpu9 { + operating-points-v2 = <&pcluster_opp>; + performance-domains = <&cpufreq_p>; + status = "okay"; +}; - clkref: clock-ref { - compatible = "fixed-clock"; - #clock-cells = <0>; - clock-frequency = <24000000>; - }; +&{/timer} { + status = "okay"; +}; - soc { - compatible = "simple-bus"; - #address-cells = <2>; - #size-cells = <2>; - ranges; - nonposted-mmio; - - aic: interrupt-controller@381000000 { - compatible = "apple,t8142-aic3", "apple,t8122-aic3"; - interrupt-controller; - #interrupt-cells = <3>; - reg = <3 0x81000000 0 0x1cc000>, - <3 0x81040000 0 0x4000>; - reg-names = "core", "event"; - }; +&aic { + status = "okay"; +}; - serial0: serial@3a5200000 { - compatible = "apple,s5l-uart"; - reg = <3 0xa5200000 0 0x4000>; - reg-io-width = <4>; - interrupts = ; - clocks = <&clkref>, <&clkref>; - clock-names = "uart", "clk_uart_baud0"; - status = "disabled"; - }; +&cpu_pmu { + status = "okay"; +}; - dockchannel: serial@38812c000 { - compatible = "apple,dockchannel-uart"; - reg = <3 0x8812c000 0 0x4000>, - <3 0x88128000 0 0x4000>, - <3 0x8810c000 0 0x1000>; - reg-names = "data", "config", "irq"; - interrupts = ; - }; - }; +&dockchannel { + status = "okay"; }; #include "t8142-j813-display.dtsi" @@ -218,7 +125,66 @@ #include "t8142-j813-n1.dtsi" #include "t8142-j813-audio.dtsi" -#include "t8142-peripherals.dtsi" +/* + * Ambient light sensor, the AOP's "als" service: an ST VD6286, as on J815 + * (same ADT node, /arm-io/aop/iop-aop-nub/als). aop_als sends it the + * per-device calibration (apple/aop-als-cal.bin). No firmware-name: that + * names the CT817 setup-port message, which this sensor does not take. + */ +&aop { + aop_als: als { + compatible = "apple,t8142-aop-als", "apple,aop-als"; + }; +}; + +/* + * N1 functions behind apcie port 0 (0000:00:00.0 -> 01:00.{0,1,2}), so the + * loader has somewhere to put the factory addresses: it copies ADT /chosen + * mac-address-wifi0 and mac-address-bluetooth0 into the wifi0/bluetooth0 + * alias targets. Same nodes as t8142-j815.dts (same N1, same PCI IDs). + */ +/ { + aliases { + wifi0 = &n1_alpha; + bluetooth0 = &n1_beta; + /* + * The loader finds the SEP through this alias: it reserves SEPFW + * and copies the boot's local-policy and iBoot manifests onto + * the node. + */ + sep = &sep; + }; +}; + +&pcie0 { + n1_port: pci@0,0 { + device_type = "pci"; + reg = <0x0 0x0 0x0 0x0 0x0>; + bus-range = <1 1>; + #address-cells = <3>; + #size-cells = <2>; + ranges; + + n1_control: control@0,0 { + compatible = "apple,t8142-centauri-control", "pci106b,1900"; + reg = <0x10000 0x0 0x0 0x0 0x0>; + }; + + n1_alpha: wifi@0,1 { + compatible = "pci106b,1902"; + reg = <0x10100 0x0 0x0 0x0 0x0>; + /* Filled by the loader */ + local-mac-address = [00 00 00 00 00 00]; + }; + + n1_beta: bluetooth@0,2 { + compatible = "pci106b,1903"; + reg = <0x10200 0x0 0x0 0x0 0x0>; + /* Filled by the loader */ + local-bd-address = [00 00 00 00 00 00]; + }; + }; +}; &mtp_hid { multi-touch { @@ -227,3 +193,143 @@ }; /* Unexposed chassis port instances remain described and disabled. */ + +/* + * Secure Enclave and the Touch ID sensor. All values are from the J813 ADT + * (macOS 27.0) and are the same as J815's: + * - sep: iop-sep,ascwrap-v6 at 0x30a600000 (0x88000), sepfw-booted, so + * apple_sep warm-attaches; ASC mailbox at +0x8000, AIC 445-448. + * - dart-sep: t8110 at 0x308b80000, irq 455; vm-base-0 0x10000004000, + * vm-size-0 0xffff0000. + * - spi2 at 0x3a5108000, irq 1241; PMGR device SPI2 at +0x440, parent SPI_P. + * - mesa: "biosensor,mesa", sensor-id 0x3356, 8 MHz, CS0; power + * function-mesa_pwr = NUB GPIO pin 36; data-ready interrupt on AP GPIO + * pin 200. + * The SEP and its DART stay disabled here: apple_sep enables them at module + * init (drivers/soc/apple/dt.rs). + */ +&pmgr { + ps_spi2: power-controller@440 { + compatible = "apple,t8142-pmgr-pwrstate", "apple,t8103-pmgr-pwrstate"; + reg = <0x440 4>; + #power-domain-cells = <0>; + #reset-cells = <0>; + power-domains = <&ps_spi_p>; + label = "spi2"; + }; +}; + +&{/soc} { + sep: sep@30a600000 { + compatible = "apple,sep"; + reg = <0x3 0x0a600000 0x0 0x88000>; + mboxes = <&sep_mbox>; + mbox-names = "mbox"; + iommus = <&sep_dart 0>; + status = "disabled"; + }; + + sep_mbox: mbox@30a608000 { + compatible = "apple,t8142-asc-mailbox", "apple,asc-mailbox-v4"; + reg = <0x3 0x0a608000 0x0 0x4000>; + interrupt-parent = <&aic>; + interrupts = , + , + , + ; + interrupt-names = "send-empty", "send-not-empty", + "recv-empty", "recv-not-empty"; + #mbox-cells = <0>; + status = "okay"; + }; + + spi2: spi@3a5108000 { + compatible = "apple,t8142-spi", "apple,t8103-spi"; + reg = <0x3 0xa5108000 0x0 0x4000>; + interrupt-parent = <&aic>; + interrupts = ; + clocks = <&clkref>; + power-domains = <&ps_spi2>; + #address-cells = <1>; + #size-cells = <0>; + status = "okay"; + + mesa: fingerprint@0 { + compatible = "apple,mesa-fingerprint"; + reg = <0>; + spi-max-frequency = <8000000>; + spi-cpol; + spi-cs-setup-delay-ns = <20>; + spi-cs-hold-delay-ns = <20>; + enable-gpios = <&pinctrl_nub 36 GPIO_ACTIVE_HIGH>; + interrupt-parent = <&pinctrl_ap>; + interrupts = <200 IRQ_TYPE_EDGE_RISING>; + /* Per-device files, built from the Mac's own factory records. */ + firmware-name = "apple/mesacal-j813.bin", "apple/msrk-j813.bin"; + status = "okay"; + }; + }; +}; + +&sep_dart { + apple,dma-range = /bits/ 64 <0x10000004000 0xffff0000>; + apple,dma-offset = /bits/ 64 <0x0>; +}; + +/* Expose the sensor's two pins next to the ones sound uses. */ +&pinctrl_ap { + gpio-reserved-ranges = <0 100>, <101 49>, <152 48>, <201 23>; +}; + +&pinctrl_nub { + gpio-reserved-ranges = <0 18>, <19 17>, <37 3>; +}; + +/* + * aura (mcc_init_m5) turns the system level cache on; the driver confirms it + * and flushes on shutdown. + */ +&mcc { + status = "okay"; +}; + +/* + * Video encoder: ADT ave ("ave2", pre-loaded) behind dart-ave, the same + * addresses, interrupts and power states as on the J815. aura hands over the + * preloaded firmware or disables the node. + */ +&ps_venc_sys { + status = "okay"; +}; + +&ps_venc_dma { + status = "okay"; +}; + +&ps_venc_pipe4 { + status = "okay"; +}; + +&ps_venc_pipe5 { + status = "okay"; +}; + +&ps_venc_me0 { + status = "okay"; +}; + +&ps_venc_me1 { + status = "okay"; +}; + +&ave_dart0 { + status = "okay"; +}; + +&ave_dart1 { + status = "okay"; +}; + +&ave { + status = "okay"; +}; diff --git a/arch/arm64/boot/dts/apple/t8142-j815.dts b/arch/arm64/boot/dts/apple/t8142-j815.dts index 64edb6c4521f8..3141a4a6027f4 100644 --- a/arch/arm64/boot/dts/apple/t8142-j815.dts +++ b/arch/arm64/boot/dts/apple/t8142-j815.dts @@ -2,12 +2,20 @@ /* * Apple MacBook Air (15-inch, M5), J815. * - * Boots on the T8142 inventory with the resources its ADT (25G83) shares - * with J813: CPUs, timer, AIC, DockChannel UART, PMGR, CPU performance - * states, PMC, SMC, the MTP keyboard and trackpad, ANS NVMe, watchdog and - * PMU. The loader supplies usable memory, CPU release addresses and - * framebuffer geometry. Audio, display, USB, camera, GPU and radios are not - * described yet: their J815 wiring has not been checked. + * J815 is the 15-inch sibling of J813 on the same T8142 die. It uses the + * J813 board fragments and overrides what the J815 ADT shows to be + * different: + * + * - /chosen board-id 0x26 (J813: 0x24) + * - 15.3" 2880x1864 panel (2880x1800 below the notch), 326 x 211 mm + * - six SN012776 speaker amplifiers on i2c3 (0x38-0x3d: two tweeters and + * four force-cancelling woofers); J813 has four + * - ISP sensor-type 0x72 (J813: 0x71) + * - MTP hid-merge-personality C1FD3,3 (J813: C1FD1,4) + * + * The rest of the J813/J815 ADT difference is firmware selection (AOP + * j815aop, acoustic-id 0x2b), ADMAC speaker channel counts and higher + * CLPC package power limits. */ /dts-v1/; @@ -114,17 +122,15 @@ status = "okay"; }; -&pmgr { - status = "okay"; -}; - -&mtp_dart { - /* Keep host allocations clear of firmware's low IOVA mappings. */ - apple,dma-range = <0 0x02000000 0 0x10000000>; - status = "okay"; -}; - +#include "t8142-j813-display.dtsi" +#include "t8142-j813-gpu.dtsi" +#include "t8142-j813-peripherals.dtsi" #include "t8142-j813-j815.dtsi" +#include "t8142-j813-usb.dtsi" +#include "t8142-j813-avd.dtsi" +#include "t8142-j813-isp.dtsi" +#include "t8142-j813-n1.dtsi" +#include "t8142-j813-audio.dtsi" &mtp_hid { multi-touch { @@ -133,7 +139,241 @@ }; }; -/* Unexposed chassis port instances remain described and disabled. */ +&pmp { + /* ADT /chosen board-id (J815) */ + apple,board-id = <38>; +}; + +&panel { + compatible = "apple,panel-j815", "apple,panel"; + width-mm = <326>; + height-mm = <211>; + adj-height-mm = <204>; +}; + +&isp { + /* J815 ADT /arm-io/isp sensor-type */ + apple,platform-id = <0x72>; +}; + +/* + * Ambient light sensor, the AOP's "als" service: an ST VD6286, as on the + * M4 Pro, not T8140's CT817. aop_als sends it the per-device calibration + * (apple/aop-als-cal.bin) as its calibration property. There is no + * firmware-name: that names the CT817 setup-port message, which this sensor + * does not take. + */ +&aop { + aop_als: als { + compatible = "apple,t8142-aop-als", "apple,aop-als"; + }; +}; + +/* + * N1 functions behind apcie port 0 (0000:00:00.0 -> 01:00.{0,1,2}), so the + * loader has somewhere to put the factory addresses: it copies ADT /chosen + * mac-address-wifi0 and mac-address-bluetooth0 into the wifi0/bluetooth0 + * alias targets, as on T6050 (t6050-j716s.dts). + */ +/ { + aliases { + wifi0 = &n1_alpha; + bluetooth0 = &n1_beta; + /* + * The loader finds the SEP through this alias: it reserves SEPFW + * and copies the boot's local-policy and iBoot manifests onto + * the node. + */ + sep = &sep; + }; +}; + +&pcie0 { + n1_port: pci@0,0 { + device_type = "pci"; + reg = <0x0 0x0 0x0 0x0 0x0>; + bus-range = <1 1>; + #address-cells = <3>; + #size-cells = <2>; + ranges; + + n1_control: control@0,0 { + compatible = "apple,t8142-centauri-control", "pci106b,1900"; + reg = <0x10000 0x0 0x0 0x0 0x0>; + }; + + n1_alpha: wifi@0,1 { + compatible = "pci106b,1902"; + reg = <0x10100 0x0 0x0 0x0 0x0>; + /* Filled by the loader */ + local-mac-address = [00 00 00 00 00 00]; + }; + + n1_beta: bluetooth@0,2 { + compatible = "pci106b,1903"; + reg = <0x10200 0x0 0x0 0x0 0x0>; + /* Filled by the loader */ + local-bd-address = [00 00 00 00 00 00]; + }; + }; +}; + +/* + * SMC sensors beyond the discovered temperatures. Only non-temperature nodes + * may be added here: a temperature-* node would stop + * apple,discover-temperatures. Keys the SMC lacks are skipped at probe. The + * die key list is J704's (same T8142): the listed keys form the SoC die + * thermal zone. + */ +&smc { + hwmon { + apple,soc-die-keys = "Te04", "Te08", "Te0C", "Te0R", + "Tp00", "Tp04", "Tp0C", "Tp0G", "Tp0O", + "Tp0R", "Tp0X", "Tp0a", "Tp0p", "Tp0u", + "Tp0y", "Tp12", "Tp16", "Tp1E", + "Tg0U", "Tg0X", "Tg0d", "Tg0g", "Tg0j", + "Tg1Y", "Tg1c", "Tg1g"; + apple,thermal-pressure-key = "mTPL"; + + power-PSTR { + apple,key-id = "PSTR"; + label = "Total System Power"; + }; + + power-PDTR { + apple,key-id = "PDTR"; + label = "AC Input Power"; + }; + + power-PMVR { + apple,key-id = "PMVR"; + label = "3.8 V Rail Power"; + }; + + voltage-VD0R { + apple,key-id = "VD0R"; + label = "AC Input Voltage"; + }; + + voltage-SBAV { + apple,key-id = "SBAV"; + label = "Battery Voltage"; + }; + + current-ID0R { + apple,key-id = "ID0R"; + label = "AC Input Current"; + }; + }; +}; + +/* + * Secure Enclave and the Touch ID sensor. All values are from the J815 ADT + * (macOS 27.0): + * - sep: iop-sep,ascwrap-v6 at 0x30a600000 (0x88000), pre-booted by iBoot + * (sepfw-booted), so apple_sep warm-attaches; its mailbox is the ASC + * mailbox at +0x8000, AIC 445-448 (ADT order 446,445,448,447 as on the + * AOP: send-empty..recv-not-empty ascending). + * - dart-sep: t8110 at 0x308b80000, irq 455; input aperture vm-base-0 + * 0x10000004000 + vm-size-0 0xffff0000 (the BIT(40) alias, as T8132). + * - spi2 at 0x3a5108000, irq 0x4d9; PMGR device SPI2 at +0x440, parent + * SPI_P (id 94). + * - mesa: "biosensor,mesa", sensor-id V3, 8 MHz, CS0; power + * function-mesa_pwr = NUB GPIO pin 36; data-ready interrupt on AP + * GPIO pin 200. + * The SEP and its DART stay disabled here: apple_sep enables them at module + * init (drivers/soc/apple/dt.rs). + */ +&pmgr { + ps_spi2: power-controller@440 { + compatible = "apple,t8142-pmgr-pwrstate", "apple,t8103-pmgr-pwrstate"; + reg = <0x440 4>; + #power-domain-cells = <0>; + #reset-cells = <0>; + power-domains = <&ps_spi_p>; + label = "spi2"; + }; +}; + +&{/soc} { + sep: sep@30a600000 { + compatible = "apple,sep"; + reg = <0x3 0x0a600000 0x0 0x88000>; + mboxes = <&sep_mbox>; + mbox-names = "mbox"; + iommus = <&sep_dart 0>; + status = "disabled"; + }; + + sep_mbox: mbox@30a608000 { + compatible = "apple,t8142-asc-mailbox", "apple,asc-mailbox-v4"; + reg = <0x3 0x0a608000 0x0 0x4000>; + interrupt-parent = <&aic>; + interrupts = , + , + , + ; + interrupt-names = "send-empty", "send-not-empty", + "recv-empty", "recv-not-empty"; + #mbox-cells = <0>; + status = "okay"; + }; + + spi2: spi@3a5108000 { + compatible = "apple,t8142-spi", "apple,t8103-spi"; + reg = <0x3 0xa5108000 0x0 0x4000>; + interrupt-parent = <&aic>; + interrupts = ; + clocks = <&clkref>; + power-domains = <&ps_spi2>; + #address-cells = <1>; + #size-cells = <0>; + status = "okay"; + + mesa: fingerprint@0 { + compatible = "apple,mesa-fingerprint"; + reg = <0>; + spi-max-frequency = <8000000>; + spi-cpol; + spi-cs-setup-delay-ns = <20>; + spi-cs-hold-delay-ns = <20>; + enable-gpios = <&pinctrl_nub 36 GPIO_ACTIVE_HIGH>; + interrupt-parent = <&pinctrl_ap>; + interrupts = <200 IRQ_TYPE_EDGE_RISING>; + /* Per-device files, built from the Mac's own factory records. */ + firmware-name = "apple/mesacal-j815.bin", "apple/msrk-j815.bin"; + status = "okay"; + }; + }; +}; + +&sep_dart { + apple,dma-range = /bits/ 64 <0x10000004000 0xffff0000>; + apple,dma-offset = /bits/ 64 <0x0>; +}; + +/* Expose the sensor's two pins next to the ones sound uses. */ +&pinctrl_ap { + gpio-reserved-ranges = <0 100>, <101 49>, <152 48>, <201 23>; +}; + +&pinctrl_nub { + gpio-reserved-ranges = <0 18>, <19 17>, <37 3>; +}; + +/* + * J815 has six speaker amplifiers, not J813's four. Keep J813's sound card + * and the AOP audio service off until the J815 speaker layout is described. + */ +&aop_audio { + status = "disabled"; +}; + +/ { + sound { + status = "disabled"; + }; +}; /* aura (mcc_init_m5) turns the system level cache on; the driver confirms it and flushes on shutdown. */ &mcc { diff --git a/drivers/soc/apple/profile.rs b/drivers/soc/apple/profile.rs index c87d46f44eb9f..75b0af57826c2 100644 --- a/drivers/soc/apple/profile.rs +++ b/drivers/soc/apple/profile.rs @@ -500,17 +500,17 @@ pub(crate) const T8132: PlatformProfile = PlatformProfile { ..T8122 }; -/// MacBook Air 15" M5 (J815). The J815 ADT (macOS 27.0 stub firmware) puts +/// MacBook Air M5 (J813 and J815). Their ADTs (macOS 27.0 stub firmware) put /// the Mesa sensor (`V3`, the J700/J713/J714s generation) on spi2 at /// `0x3a5108000`, 8 MHz, chip select 0, with power on the NUB GPIO controller /// (pin 36) and data-ready on AP GPIO 200. The SEP is a pre-booted /// `iop-sep,ascwrap-v6` (`sepfw-booted`) behind a t8110 DART whose input /// aperture is the BIT(40) alias (`vm-base-0` 0x10000004000, `vm-size-0` /// 0xffff0000): the same SoC side as T8132 and T6050 (J714s, the M5 Pro). -/// So this is T8132's profile with the sensor bus moved. On J815 the SEP -/// attaches with it; the sensor session itself is not tested yet. +/// So this is T8132's profile with the sensor bus moved. J813 was tested +/// with explicit xart_guard=1; the inherited guard policy is unchanged. pub(crate) const T8142: PlatformProfile = PlatformProfile { - name: "T8142/J815", + name: "T8142/J813, J815", sensor: SensorProfile { controller_base: 0x3_a510_8000, ..T8132.sensor @@ -710,8 +710,9 @@ fn select( if has(b"apple,t8132") && (has(b"apple,j713") || has(b"apple,j715")) { return Ok(&T8132); } - // Only the J815, whose ADT was read; the J813's sensor bus is unchecked. - if has(b"apple,t8142") && has(b"apple,j815") { + // The J815 and the J813, whose ADTs were read (macOS 27.0 stub firmware): + // the J813's SEP, its DART, spi2 and the Mesa node carry the J815's values. + if has(b"apple,t8142") && (has(b"apple,j815") || has(b"apple,j813")) { return Ok(&T8142); } Err(ENODEV) @@ -722,6 +723,30 @@ fn select( mod tests { use super::*; + #[test] + fn t8142_sensor_boards_require_the_matching_soc() { + assert_eq!(T8142.xart_guard, 1); + let cases: [(&[u8], &[u8], bool); 8] = [ + (b"apple,t8142", b"apple,j813", true), + (b"apple,t8142", b"apple,j815", true), + (b"apple,t8142", b"apple,j814", false), + (b"apple,t8142", b"apple,j704", false), + (b"apple,t8142", b"", false), + (b"", b"apple,j813", false), + (b"apple,t8132", b"apple,j813", false), + (b"apple,t6050", b"apple,j815", false), + ]; + for (soc, board, admitted) in cases { + let has = |c: &[u8]| c == soc || c == board; + let selected = select(&has, &|| &T6020); + if admitted { + assert!(matches!(selected, Ok(profile) if profile.name == T8142.name)); + } else { + assert!(selected.is_err()); + } + } + } + #[test] fn old_firmware_uses_the_legacy_key_store() { assert!(t6020_uses_sepos13(Some(b"iBoot-13822.79.1\0"))); @@ -807,7 +832,7 @@ mod tests { /// profile naming one of the known Mesa revisions. #[test] fn every_touch_id_mac_gets_a_sensor_the_shared_path_decodes() { - let macs: [&[&[u8]]; 15] = [ + let macs: [&[&[u8]]; 17] = [ &[b"apple,j313", b"apple,t8103"], &[b"apple,j316s", b"apple,t6000"], &[b"apple,j316c", b"apple,t6001"], @@ -823,6 +848,8 @@ mod tests { &[b"apple,j713", b"apple,t8132"], &[b"apple,j700", b"apple,t8140"], &[b"apple,j714s", b"apple,t6050"], + &[b"apple,j813", b"apple,t8142"], + &[b"apple,j815", b"apple,t8142"], ]; for compatibles in macs { let has = |c: &[u8]| compatibles.iter().any(|x| *x == c); @@ -884,6 +911,7 @@ mod dart_window_tests { &T6041, &T6050, &T8132, + &T8142, ] { assert_eq!(offset(profile.dart_window), 1 << 40); assert_eq!(range(profile.dart_window), (0, 1 << 32));