From 0e1b9d6137c1014734c94d08e6b1d0721376252d Mon Sep 17 00:00:00 2001 From: Jos Dehaes Date: Tue, 10 Nov 2026 12:51:41 +0100 Subject: [PATCH 1/3] arm64: dts: apple: t6041-j614c-j616c: run the PMP The M4 Max boards leave the PMP, its DART, report region and mailbox, and the PMC disabled, and have no pmp alias, so the loader does not pass the PMP's values ("FDT: pmp not found in devtree") and nothing starts it. The M4 Pro boards run it. Do as they do: the pmp alias, so that the loader copies this Mac's PMP values from the ADT and enables the PMP; the DART, report region and mailbox; the PMC with apple,pmp; and the GPU on the PMP's GPU domain, since a running PMP otherwise treats the GPU as off and holds it at its lowest state. On a J614c the loader passes 90 PMP tunables, the PMP firmware starts ("PMP started", report "PMP running (status 0x1)"), the PMC and its CLPC bind, and the GPU runs compute and render work on pmp_gfx. Signed-off-by: Jos Dehaes Co-Authored-By: Claude Opus 5.5 --- .../boot/dts/apple/t6041-j614c-j616c.dtsi | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/arch/arm64/boot/dts/apple/t6041-j614c-j616c.dtsi b/arch/arm64/boot/dts/apple/t6041-j614c-j616c.dtsi index 11b1d9d895fb2..33153123e1e29 100644 --- a/arch/arm64/boot/dts/apple/t6041-j614c-j616c.dtsi +++ b/arch/arm64/boot/dts/apple/t6041-j614c-j616c.dtsi @@ -2329,3 +2329,36 @@ #include "t6041-j616c-hdmi.dtsi" #include "t6041-j616c-usbc.dtsi" + +/* + * The PMP, as the M4 Pro boards run it (t604x-j614-j616.dtsi). The pmp + * alias lets the loader copy this Mac's PMP values from the ADT and enable + * the PMP. The GPU sits on the PMP's GPU domain: a running PMP otherwise + * treats the GPU as off and holds it at its lowest state. + */ +/ { + aliases { + pmp = &pmp; + }; +}; + +&pmp_dart { + status = "okay"; +}; + +&pmp_report { + status = "okay"; +}; + +&pmp_mbox { + status = "okay"; +}; + +&pmc { + apple,pmp = <&pmp>; + status = "okay"; +}; + +&gpu { + power-domains = <&pmp_gfx>; +}; From e174b1d659ae4fd4995e06649b150f22e5c1b838 Mon Sep 17 00:00:00 2001 From: Jos Dehaes Date: Tue, 10 Nov 2026 12:52:37 +0100 Subject: [PATCH 2/3] arm64: dts: apple: t6041-j614c-j616c: let the PMP's fast die loop lead With the PMP running, the cpufreq clusters can take the fast die-temperature limit as the M4 Pro boards do: restore apple,fast-die-effort, which these boards deleted while the PMP did not run (without a running PMP the limit holds each cluster at a third of its power). The ADT (fast-die-ctrl-loop, temp-sensor) is the M4 Pro's: the PMP holds its hot-spot sensors at 110 C, and the sochot maximum is 125 C. On a J614c, four minutes of all-core NEON FMA load with every CPU zone disabled, so the PMP as the only throttle: TCMz settled at 112 C (113 C at most), the cluster limits moved within each second while every cooling state stayed at 0, P0 and P1 ran at 3.5-3.8 GHz, E at 2.59 GHz, and the fans ramped to about 4950/5350 rpm, as on macOS. The SMC sensors the zones read run a few degrees above the PMP's, so the zones move out of its way: switch-on at 112 C and control at 116 C, leaving hot at 120 C and critical at 125 C. Switched on from 75 C they took over from the PMP, trimming far below their control point: with control at 115 C the power allocator held the E cluster at 1.02 GHz. With 112/116 on the J614c, the same load: TCMz at 109-114 C, P0 and P1 at 3.5-3.8 GHz, E at 2.5-2.6 GHz, the zones trimming only briefly above 112 C, and the fans from cold to about 4950/5350 rpm. Signed-off-by: Jos Dehaes Co-Authored-By: Claude Opus 5.5 --- .../boot/dts/apple/t6041-j614c-j616c.dtsi | 115 ++++++++---------- 1 file changed, 52 insertions(+), 63 deletions(-) diff --git a/arch/arm64/boot/dts/apple/t6041-j614c-j616c.dtsi b/arch/arm64/boot/dts/apple/t6041-j614c-j616c.dtsi index 33153123e1e29..6f40bfaf008bb 100644 --- a/arch/arm64/boot/dts/apple/t6041-j614c-j616c.dtsi +++ b/arch/arm64/boot/dts/apple/t6041-j614c-j616c.dtsi @@ -76,25 +76,26 @@ thermal-zones { /* - * The PMP's fast die loop is off on these boards (no - * apple,fast-die-effort), so these zones are the CPU's only - * throttle. The ADT (temp-sensor, fast-die-ctrl-loop) gives the - * J614c and J616c the M4 Pro's die limits: a 110 C target and a - * 125 C maximum, the sochot level. + * The PMP's fast die-temperature loop (apple,fast-die-effort) + * holds its hot-spot sensors at the ADT fast-die-ctrl-loop target + * of 110 C, as on macOS, and these zones are the backstop behind + * it. The ADT (temp-sensor) gives the J614c and J616c the M4 + * Pro's die limits: 110 C target, 125 C maximum (sochot). * - * - A zone per SMC core-die sensor runs the power allocator from - * 75 C, controls at the 110 C target and throttles only the - * cluster its sensor sits on: Tpx0-5 follow a load on P0, - * Tpx8-D one on P1, Tex0-3 the E cluster. The die zone on TCMz, - * their maximum, controls all three clusters from 115 C as a - * backstop; controlling at 110 C itself, it divided its budget - * by requested power and held P0 at 2.4-2.9 GHz while P1 ran at - * 4.1 GHz. The 1 s samples jump by about 10 C, so the zones are - * integral-led. + * - The SMC sensors read a few degrees above the PMP's: with the + * PMP alone, an all-core load holds TCMz at 112 C. The zones + * switch on at 112 C and control at 116 C, so the PMP keeps the + * fast control. Switched on from 75 C, the power allocator + * trimmed far below its control point and took over: it held + * the E cluster at 1.02 GHz, which the PMP leaves at 2.59 GHz. + * - A zone per SMC core-die sensor throttles only the cluster its + * sensor sits on: Tpx0-5 follow a load on P0, Tpx8-D one on P1, + * Tex0-3 the E cluster. The die zone on TCMz, their maximum, + * throttles all three. The 1 s samples jump by about 10 C, so + * the zones are integral-led. * - The SMC fans follow a power-weighted hot spot (dDT*), not - * TCMz: they only ramp once the CPU runs near 110 C at high - * power, as on macOS. A lower control point holds the power - * below where the fans engage, and the CPU then settles lower. + * TCMz, and ramp once the CPU runs near 110 C at high power, as + * on macOS. * - sustainable-power is what macOS sustained on a J614c under an * all-core FMA load: 48-51 W, TCMz 105-110 C. The P clusters * share one rail meter (PHPC), which reads 25 W with either @@ -113,13 +114,13 @@ trips { cpu_die_switch_on: cpu-die-switch-on { - temperature = <75000>; + temperature = <112000>; hysteresis = <2000>; type = "passive"; }; cpu_die_passive: cpu-die-passive { - temperature = <115000>; + temperature = <116000>; hysteresis = <5000>; type = "passive"; }; @@ -181,13 +182,13 @@ trips { cpu_e0_switch_on: trip-switch-on { - temperature = <75000>; + temperature = <112000>; hysteresis = <2000>; type = "passive"; }; cpu_e0_passive: trip-passive { - temperature = <110000>; + temperature = <116000>; hysteresis = <5000>; type = "passive"; }; @@ -227,13 +228,13 @@ trips { cpu_e1_switch_on: trip-switch-on { - temperature = <75000>; + temperature = <112000>; hysteresis = <2000>; type = "passive"; }; cpu_e1_passive: trip-passive { - temperature = <110000>; + temperature = <116000>; hysteresis = <5000>; type = "passive"; }; @@ -273,13 +274,13 @@ trips { cpu_e2_switch_on: trip-switch-on { - temperature = <75000>; + temperature = <112000>; hysteresis = <2000>; type = "passive"; }; cpu_e2_passive: trip-passive { - temperature = <110000>; + temperature = <116000>; hysteresis = <5000>; type = "passive"; }; @@ -319,13 +320,13 @@ trips { cpu_e3_switch_on: trip-switch-on { - temperature = <75000>; + temperature = <112000>; hysteresis = <2000>; type = "passive"; }; cpu_e3_passive: trip-passive { - temperature = <110000>; + temperature = <116000>; hysteresis = <5000>; type = "passive"; }; @@ -365,13 +366,13 @@ trips { cpu_p00_switch_on: trip-switch-on { - temperature = <75000>; + temperature = <112000>; hysteresis = <2000>; type = "passive"; }; cpu_p00_passive: trip-passive { - temperature = <110000>; + temperature = <116000>; hysteresis = <5000>; type = "passive"; }; @@ -413,13 +414,13 @@ trips { cpu_p01_switch_on: trip-switch-on { - temperature = <75000>; + temperature = <112000>; hysteresis = <2000>; type = "passive"; }; cpu_p01_passive: trip-passive { - temperature = <110000>; + temperature = <116000>; hysteresis = <5000>; type = "passive"; }; @@ -461,13 +462,13 @@ trips { cpu_p02_switch_on: trip-switch-on { - temperature = <75000>; + temperature = <112000>; hysteresis = <2000>; type = "passive"; }; cpu_p02_passive: trip-passive { - temperature = <110000>; + temperature = <116000>; hysteresis = <5000>; type = "passive"; }; @@ -509,13 +510,13 @@ trips { cpu_p03_switch_on: trip-switch-on { - temperature = <75000>; + temperature = <112000>; hysteresis = <2000>; type = "passive"; }; cpu_p03_passive: trip-passive { - temperature = <110000>; + temperature = <116000>; hysteresis = <5000>; type = "passive"; }; @@ -557,13 +558,13 @@ trips { cpu_p04_switch_on: trip-switch-on { - temperature = <75000>; + temperature = <112000>; hysteresis = <2000>; type = "passive"; }; cpu_p04_passive: trip-passive { - temperature = <110000>; + temperature = <116000>; hysteresis = <5000>; type = "passive"; }; @@ -605,13 +606,13 @@ trips { cpu_p05_switch_on: trip-switch-on { - temperature = <75000>; + temperature = <112000>; hysteresis = <2000>; type = "passive"; }; cpu_p05_passive: trip-passive { - temperature = <110000>; + temperature = <116000>; hysteresis = <5000>; type = "passive"; }; @@ -653,13 +654,13 @@ trips { cpu_p10_switch_on: trip-switch-on { - temperature = <75000>; + temperature = <112000>; hysteresis = <2000>; type = "passive"; }; cpu_p10_passive: trip-passive { - temperature = <110000>; + temperature = <116000>; hysteresis = <5000>; type = "passive"; }; @@ -701,13 +702,13 @@ trips { cpu_p11_switch_on: trip-switch-on { - temperature = <75000>; + temperature = <112000>; hysteresis = <2000>; type = "passive"; }; cpu_p11_passive: trip-passive { - temperature = <110000>; + temperature = <116000>; hysteresis = <5000>; type = "passive"; }; @@ -749,13 +750,13 @@ trips { cpu_p12_switch_on: trip-switch-on { - temperature = <75000>; + temperature = <112000>; hysteresis = <2000>; type = "passive"; }; cpu_p12_passive: trip-passive { - temperature = <110000>; + temperature = <116000>; hysteresis = <5000>; type = "passive"; }; @@ -797,13 +798,13 @@ trips { cpu_p13_switch_on: trip-switch-on { - temperature = <75000>; + temperature = <112000>; hysteresis = <2000>; type = "passive"; }; cpu_p13_passive: trip-passive { - temperature = <110000>; + temperature = <116000>; hysteresis = <5000>; type = "passive"; }; @@ -845,13 +846,13 @@ trips { cpu_p14_switch_on: trip-switch-on { - temperature = <75000>; + temperature = <112000>; hysteresis = <2000>; type = "passive"; }; cpu_p14_passive: trip-passive { - temperature = <110000>; + temperature = <116000>; hysteresis = <5000>; type = "passive"; }; @@ -893,13 +894,13 @@ trips { cpu_p15_switch_on: trip-switch-on { - temperature = <75000>; + temperature = <112000>; hysteresis = <2000>; type = "passive"; }; cpu_p15_passive: trip-passive { - temperature = <110000>; + temperature = <116000>; hysteresis = <5000>; type = "passive"; }; @@ -1184,18 +1185,6 @@ status = "okay"; }; -&cpufreq_e { - /delete-property/ apple,fast-die-effort; -}; - -&cpufreq_p0 { - /delete-property/ apple,fast-die-effort; -}; - -&cpufreq_p1 { - /delete-property/ apple,fast-die-effort; -}; - &wdt { timeout-sec = <140>; }; From 007dfab22f01aa4f46ffbac3a0e31e3480eda021 Mon Sep 17 00:00:00 2001 From: Jos Dehaes Date: Tue, 10 Nov 2026 13:30:30 +0100 Subject: [PATCH 3/3] arm64: dts: apple: t6041-j614c-j616c: share the J616c's front camera with the J614c The J614c has no ISP: its board file leaves the ISP disabled, without the alias aura looks for or the firmware placeholders it fills. The J614c's ADT (26.6.2, read from the running machine) describes the same isp0 as the J616c's: sensor-type 5 (the IMX958), cam-connections- scheme 0x10, and a firmware of 0xca8000 bytes of __TEXT and 0x1344000 of __DATA that run at 0x100_0000_0000, which iBoot moves each boot and aura copies into the placeholders. So move the J616c's ISP description into the dtsi the two boards share, unchanged. The J616c's device tree stays as it was: its dtb sorted with dtc -s is identical before and after. Signed-off-by: Jos Dehaes Co-Authored-By: Claude Opus 5.5 --- .../boot/dts/apple/t6041-j614c-j616c.dtsi | 75 +++++++++++++++++++ arch/arm64/boot/dts/apple/t6041-j616c.dts | 67 ----------------- 2 files changed, 75 insertions(+), 67 deletions(-) diff --git a/arch/arm64/boot/dts/apple/t6041-j614c-j616c.dtsi b/arch/arm64/boot/dts/apple/t6041-j614c-j616c.dtsi index 11b1d9d895fb2..d0735d1bb1472 100644 --- a/arch/arm64/boot/dts/apple/t6041-j614c-j616c.dtsi +++ b/arch/arm64/boot/dts/apple/t6041-j614c-j616c.dtsi @@ -2329,3 +2329,78 @@ #include "t6041-j616c-hdmi.dtsi" #include "t6041-j616c-usbc.dtsi" + +/* + * The front camera. The J614c and J616c ADTs (26.6.2) describe the same isp0: + * sensor-type 5 (an IMX958), cam-connections-scheme 0x10, and a firmware of + * 0xca8000 bytes of TEXT and 0x1344000 of DATA, which iBoot moves each boot. + */ +/ { + /* aura opens a co-processor's DAPF only if it finds its alias. */ + aliases { + isp = &isp; + }; + + reserved-memory { + /* + * iBoot moves the ISP firmware each boot: the loader fills + * these placeholders from the ADT. It runs at 0x100_0000_0000 + * onwards, in its 32 MiB main memory. + */ + isp_fw_text: isp-firmware-text@10000c44000 { + reg = <0x100 0x00c44000 0x0 0xca8000>; + iommu-addresses = <&isp 0x100 0x0 0x0 0xca8000>; + no-map; + }; + + isp_fw_data: isp-firmware-data@10001e7c000 { + reg = <0x100 0x01e7c000 0x0 0x1344000>; + iommu-addresses = <&isp 0x100 0xca8000 0x0 0x1344000>; + no-map; + }; + + /* the firmware's main memory, the driver allocates above it */ + isp_heap: isp-heap { + iommu-addresses = <&isp 0x100 0x0 0x0 0x2000000>; + }; + }; +}; + +&isp { + memory-region = <&isp_fw_text>, <&isp_fw_data>, <&isp_heap>; + memory-region-names = "text", "data", "heap"; + apple,platform-id = <5>; + /* ADT isp0 cam-connections-scheme */ + apple,cam-connections-scheme = <0x10>; + status = "okay"; + + /* The front camera, an IMX958: firmware configuration 5. */ + sensor-presets { + /* 1920x1080 */ + preset0 { + apple,config-index = <5>; + apple,input-size = <1920 2160>; + apple,output-size = <1920 1080>; + apple,crop = <0 0 1920 1080>; + }; + /* 1280x720 */ + preset1 { + apple,config-index = <5>; + apple,input-size = <1920 2160>; + apple,output-size = <1280 720>; + apple,crop = <0 0 1920 1080>; + }; + }; +}; + +&isp_dart0 { + status = "okay"; +}; + +&isp_dart1 { + status = "okay"; +}; + +&isp_dart2 { + status = "okay"; +}; diff --git a/arch/arm64/boot/dts/apple/t6041-j616c.dts b/arch/arm64/boot/dts/apple/t6041-j616c.dts index f6a2ad6e49e21..acea3aab4fc23 100644 --- a/arch/arm64/boot/dts/apple/t6041-j616c.dts +++ b/arch/arm64/boot/dts/apple/t6041-j616c.dts @@ -16,35 +16,6 @@ / { compatible = "apple,j616c", "apple,t6041", "apple,arm-platform"; model = "Apple MacBook Pro (16-inch, M4 Max)"; - - /* aura opens a co-processor's DAPF only if it finds its alias. */ - aliases { - isp = &isp; - }; - - reserved-memory { - /* - * iBoot moves the ISP firmware each boot: the loader fills - * these placeholders from the ADT. It runs at 0x100_0000_0000 - * onwards, in its 32 MiB main memory. - */ - isp_fw_text: isp-firmware-text@10000c44000 { - reg = <0x100 0x00c44000 0x0 0xca8000>; - iommu-addresses = <&isp 0x100 0x0 0x0 0xca8000>; - no-map; - }; - - isp_fw_data: isp-firmware-data@10001e7c000 { - reg = <0x100 0x01e7c000 0x0 0x1344000>; - iommu-addresses = <&isp 0x100 0xca8000 0x0 0x1344000>; - no-map; - }; - - /* the firmware's main memory, the driver allocates above it */ - isp_heap: isp-heap { - iommu-addresses = <&isp 0x100 0x0 0x0 0x2000000>; - }; - }; }; &mtp_hid { @@ -86,41 +57,3 @@ firmware-name = "apple/mesacal-j616c.bin", "apple/msrk-j616c.bin"; }; -&isp { - memory-region = <&isp_fw_text>, <&isp_fw_data>, <&isp_heap>; - memory-region-names = "text", "data", "heap"; - apple,platform-id = <5>; - /* ADT isp0 cam-connections-scheme */ - apple,cam-connections-scheme = <0x10>; - status = "okay"; - - /* The front camera, an IMX958: firmware configuration 5. */ - sensor-presets { - /* 1920x1080 */ - preset0 { - apple,config-index = <5>; - apple,input-size = <1920 2160>; - apple,output-size = <1920 1080>; - apple,crop = <0 0 1920 1080>; - }; - /* 1280x720 */ - preset1 { - apple,config-index = <5>; - apple,input-size = <1920 2160>; - apple,output-size = <1280 720>; - apple,crop = <0 0 1920 1080>; - }; - }; -}; - -&isp_dart0 { - status = "okay"; -}; - -&isp_dart1 { - status = "okay"; -}; - -&isp_dart2 { - status = "okay"; -};