From ed72121b9fa9e6e840b9f1e74d497a0f19788706 Mon Sep 17 00:00:00 2001 From: Jos Dehaes Date: Tue, 10 Nov 2026 11:07:08 +0100 Subject: [PATCH] arm64: dts: apple: t6041-j614c-j616c: add the GPU temperatures and zones The M4 Max boards publish no GPU temperature, and no thermal zone watches the GPU. Now that the GPU runs on 25G83, add both, as the M4 Pro has them (t6040-gpu-thermal.dtsi). The J614c SMC key table (macOS 26.6.2) has 33 GPU sensors, Tg*. Under a WebGL load that kept the GPU fully busy, every one of them rose 15-17 C together, from 43-49 C idle to 58-65 C. Sixteen read about 5.5 C above the other seventeen, both idle and loaded. Publish all 33 through the SMC hwmon, with the M4 Pro's no-data threshold for the placeholders the SMC reports while the GPU is powered off. Add four GPU zones, on four of the hotter sixteen spread over the key range (Tg05, Tg1V, Tg2Q, Tg3q), with the M4 Pro's GPU trips: the power allocator switches on at 90 C, sheds CPU power from 101 C, where the GPU firmware starts limiting itself, and the zone shuts down at 118 C after three samples. Which GPU cluster each sensor sits on is not known; under load the sixteen read within 1 C of each other. The T6041 CPU OPP tables carry no opp-microwatt yet, so no energy model registers and the power allocator has no CPU power actors: until they do, these zones report the GPU temperature and enforce the critical trip, but their passive trips shed nothing. The same holds for the existing cpu-die-thermal zone. Like it, the GPU zones leave sustainable-power to the allocator's estimate. Signed-off-by: Jos Dehaes Co-Authored-By: Claude Opus 5.5 --- .../boot/dts/apple/t6041-j614c-j616c.dtsi | 454 ++++++++++++++++++ 1 file changed, 454 insertions(+) diff --git a/arch/arm64/boot/dts/apple/t6041-j614c-j616c.dtsi b/arch/arm64/boot/dts/apple/t6041-j614c-j616c.dtsi index 98337a09a596f..67dc437f38d07 100644 --- a/arch/arm64/boot/dts/apple/t6041-j614c-j616c.dtsi +++ b/arch/arm64/boot/dts/apple/t6041-j614c-j616c.dtsi @@ -127,6 +127,255 @@ }; }; }; + + /* + * GPU zones, with the M4 Pro's trips: the GPU firmware limits + * itself from 101 C, where these shed CPU power (allocator on at + * 90 C), and they shut down at 118 C after three samples. The + * CPU OPPs have no opp-microwatt yet, so until they do the + * passive trips have no power actors and shed nothing. Each zone + * reads one of the GPU's hotter sensors; which cluster each sits + * on is not known, and under load they read within 1 C. + */ + gpu0-thermal { + polling-delay-passive = <1000>; + polling-delay = <1000>; + critical-samples = <3>; + thermal-sensors = <&smc_hwmon 23>; /* Tg05 */ + + trips { + gpu0_switch_on: trip-switch-on { + temperature = <90000>; + hysteresis = <2000>; + type = "passive"; + }; + + gpu0_passive: trip-passive { + temperature = <101000>; + hysteresis = <5000>; + type = "passive"; + }; + + trip-critical { + temperature = <118000>; + hysteresis = <0>; + type = "critical"; + }; + }; + + cooling-maps { + map-e { + trip = <&gpu0_passive>; + cooling-device = + <&cpu_e0 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>, + <&cpu_e1 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>, + <&cpu_e2 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>, + <&cpu_e3 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>; + }; + + map-p0 { + trip = <&gpu0_passive>; + cooling-device = + <&cpu_p00 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>, + <&cpu_p01 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>, + <&cpu_p02 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>, + <&cpu_p03 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>, + <&cpu_p04 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>, + <&cpu_p05 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>; + }; + + map-p1 { + trip = <&gpu0_passive>; + cooling-device = + <&cpu_p10 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>, + <&cpu_p11 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>, + <&cpu_p12 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>, + <&cpu_p13 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>, + <&cpu_p14 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>, + <&cpu_p15 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>; + }; + }; + }; + + gpu1-thermal { + polling-delay-passive = <1000>; + polling-delay = <1000>; + critical-samples = <3>; + thermal-sensors = <&smc_hwmon 39>; /* Tg1V */ + + trips { + gpu1_switch_on: trip-switch-on { + temperature = <90000>; + hysteresis = <2000>; + type = "passive"; + }; + + gpu1_passive: trip-passive { + temperature = <101000>; + hysteresis = <5000>; + type = "passive"; + }; + + trip-critical { + temperature = <118000>; + hysteresis = <0>; + type = "critical"; + }; + }; + + cooling-maps { + map-e { + trip = <&gpu1_passive>; + cooling-device = + <&cpu_e0 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>, + <&cpu_e1 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>, + <&cpu_e2 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>, + <&cpu_e3 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>; + }; + + map-p0 { + trip = <&gpu1_passive>; + cooling-device = + <&cpu_p00 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>, + <&cpu_p01 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>, + <&cpu_p02 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>, + <&cpu_p03 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>, + <&cpu_p04 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>, + <&cpu_p05 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>; + }; + + map-p1 { + trip = <&gpu1_passive>; + cooling-device = + <&cpu_p10 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>, + <&cpu_p11 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>, + <&cpu_p12 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>, + <&cpu_p13 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>, + <&cpu_p14 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>, + <&cpu_p15 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>; + }; + }; + }; + + gpu2-thermal { + polling-delay-passive = <1000>; + polling-delay = <1000>; + critical-samples = <3>; + thermal-sensors = <&smc_hwmon 46>; /* Tg2Q */ + + trips { + gpu2_switch_on: trip-switch-on { + temperature = <90000>; + hysteresis = <2000>; + type = "passive"; + }; + + gpu2_passive: trip-passive { + temperature = <101000>; + hysteresis = <5000>; + type = "passive"; + }; + + trip-critical { + temperature = <118000>; + hysteresis = <0>; + type = "critical"; + }; + }; + + cooling-maps { + map-e { + trip = <&gpu2_passive>; + cooling-device = + <&cpu_e0 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>, + <&cpu_e1 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>, + <&cpu_e2 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>, + <&cpu_e3 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>; + }; + + map-p0 { + trip = <&gpu2_passive>; + cooling-device = + <&cpu_p00 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>, + <&cpu_p01 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>, + <&cpu_p02 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>, + <&cpu_p03 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>, + <&cpu_p04 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>, + <&cpu_p05 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>; + }; + + map-p1 { + trip = <&gpu2_passive>; + cooling-device = + <&cpu_p10 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>, + <&cpu_p11 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>, + <&cpu_p12 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>, + <&cpu_p13 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>, + <&cpu_p14 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>, + <&cpu_p15 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>; + }; + }; + }; + + gpu3-thermal { + polling-delay-passive = <1000>; + polling-delay = <1000>; + critical-samples = <3>; + thermal-sensors = <&smc_hwmon 54>; /* Tg3q */ + + trips { + gpu3_switch_on: trip-switch-on { + temperature = <90000>; + hysteresis = <2000>; + type = "passive"; + }; + + gpu3_passive: trip-passive { + temperature = <101000>; + hysteresis = <5000>; + type = "passive"; + }; + + trip-critical { + temperature = <118000>; + hysteresis = <0>; + type = "critical"; + }; + }; + + cooling-maps { + map-e { + trip = <&gpu3_passive>; + cooling-device = + <&cpu_e0 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>, + <&cpu_e1 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>, + <&cpu_e2 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>, + <&cpu_e3 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>; + }; + + map-p0 { + trip = <&gpu3_passive>; + cooling-device = + <&cpu_p00 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>, + <&cpu_p01 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>, + <&cpu_p02 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>, + <&cpu_p03 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>, + <&cpu_p04 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>, + <&cpu_p05 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>; + }; + + map-p1 { + trip = <&gpu3_passive>; + cooling-device = + <&cpu_p10 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>, + <&cpu_p11 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>, + <&cpu_p12 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>, + <&cpu_p13 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>, + <&cpu_p14 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>, + <&cpu_p15 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>; + }; + }; + }; }; }; @@ -279,6 +528,211 @@ label = "WiFi/BT Module Temp"; }; + /* + * The 33 GPU sensors of the J614c SMC key table (macOS 26.6.2). All + * rose 15-17 C together under a GPU load. Sixteen read about 5.5 C + * above the other seventeen, idle and loaded; the GPU zones use those. + * While the GPU is powered off the SMC publishes placeholders below + * 10 C, as on the M4 Pro. + */ + temperature-Tg04 { + apple,key-id = "Tg04"; + label = "GPU Tg04"; + apple,no-data-below-millicelsius = <10000>; + }; + + temperature-Tg05 { + apple,key-id = "Tg05"; + label = "GPU Tg05"; + apple,no-data-below-millicelsius = <10000>; + }; + + temperature-Tg0K { + apple,key-id = "Tg0K"; + label = "GPU Tg0K"; + apple,no-data-below-millicelsius = <10000>; + }; + + temperature-Tg0L { + apple,key-id = "Tg0L"; + label = "GPU Tg0L"; + apple,no-data-below-millicelsius = <10000>; + }; + + temperature-Tg0R { + apple,key-id = "Tg0R"; + label = "GPU Tg0R"; + apple,no-data-below-millicelsius = <10000>; + }; + + temperature-Tg0S { + apple,key-id = "Tg0S"; + label = "GPU Tg0S"; + apple,no-data-below-millicelsius = <10000>; + }; + + temperature-Tg0X { + apple,key-id = "Tg0X"; + label = "GPU Tg0X"; + apple,no-data-below-millicelsius = <10000>; + }; + + temperature-Tg0Y { + apple,key-id = "Tg0Y"; + label = "GPU Tg0Y"; + apple,no-data-below-millicelsius = <10000>; + }; + + temperature-Tg0d { + apple,key-id = "Tg0d"; + label = "GPU Tg0d"; + apple,no-data-below-millicelsius = <10000>; + }; + + temperature-Tg0e { + apple,key-id = "Tg0e"; + label = "GPU Tg0e"; + apple,no-data-below-millicelsius = <10000>; + }; + + temperature-Tg0j { + apple,key-id = "Tg0j"; + label = "GPU Tg0j"; + apple,no-data-below-millicelsius = <10000>; + }; + + temperature-Tg0k { + apple,key-id = "Tg0k"; + label = "GPU Tg0k"; + apple,no-data-below-millicelsius = <10000>; + }; + + temperature-Tg0y { + apple,key-id = "Tg0y"; + label = "GPU Tg0y"; + apple,no-data-below-millicelsius = <10000>; + }; + + temperature-Tg0z { + apple,key-id = "Tg0z"; + label = "GPU Tg0z"; + apple,no-data-below-millicelsius = <10000>; + }; + + temperature-Tg1E { + apple,key-id = "Tg1E"; + label = "GPU Tg1E"; + apple,no-data-below-millicelsius = <10000>; + }; + + temperature-Tg1F { + apple,key-id = "Tg1F"; + label = "GPU Tg1F"; + apple,no-data-below-millicelsius = <10000>; + }; + + temperature-Tg1U { + apple,key-id = "Tg1U"; + label = "GPU Tg1U"; + apple,no-data-below-millicelsius = <10000>; + }; + + temperature-Tg1V { + apple,key-id = "Tg1V"; + label = "GPU Tg1V"; + apple,no-data-below-millicelsius = <10000>; + }; + + temperature-Tg1c { + apple,key-id = "Tg1c"; + label = "GPU Tg1c"; + apple,no-data-below-millicelsius = <10000>; + }; + + temperature-Tg1d { + apple,key-id = "Tg1d"; + label = "GPU Tg1d"; + apple,no-data-below-millicelsius = <10000>; + }; + + temperature-Tg1k { + apple,key-id = "Tg1k"; + label = "GPU Tg1k"; + apple,no-data-below-millicelsius = <10000>; + }; + + temperature-Tg1l { + apple,key-id = "Tg1l"; + label = "GPU Tg1l"; + apple,no-data-below-millicelsius = <10000>; + }; + + temperature-Tg22 { + apple,key-id = "Tg22"; + label = "GPU Tg22"; + apple,no-data-below-millicelsius = <10000>; + }; + + temperature-Tg2I { + apple,key-id = "Tg2I"; + label = "GPU Tg2I"; + apple,no-data-below-millicelsius = <10000>; + }; + + temperature-Tg2Q { + apple,key-id = "Tg2Q"; + label = "GPU Tg2Q"; + apple,no-data-below-millicelsius = <10000>; + }; + + temperature-Tg2Y { + apple,key-id = "Tg2Y"; + label = "GPU Tg2Y"; + apple,no-data-below-millicelsius = <10000>; + }; + + temperature-Tg2g { + apple,key-id = "Tg2g"; + label = "GPU Tg2g"; + apple,no-data-below-millicelsius = <10000>; + }; + + temperature-Tg2o { + apple,key-id = "Tg2o"; + label = "GPU Tg2o"; + apple,no-data-below-millicelsius = <10000>; + }; + + temperature-Tg34 { + apple,key-id = "Tg34"; + label = "GPU Tg34"; + apple,no-data-below-millicelsius = <10000>; + }; + + temperature-Tg3K { + apple,key-id = "Tg3K"; + label = "GPU Tg3K"; + apple,no-data-below-millicelsius = <10000>; + }; + + temperature-Tg3a { + apple,key-id = "Tg3a"; + label = "GPU Tg3a"; + apple,no-data-below-millicelsius = <10000>; + }; + + temperature-Tg3i { + apple,key-id = "Tg3i"; + label = "GPU Tg3i"; + apple,no-data-below-millicelsius = <10000>; + }; + + temperature-Tg3q { + apple,key-id = "Tg3q"; + label = "GPU Tg3q"; + apple,no-data-below-millicelsius = <10000>; + }; + power-PSTR { apple,key-id = "PSTR"; label = "Total System Power";