Skip to contentSkip to conversation

arm64: dts: qcom: x1e78100-thinkpad-t14s: Add thermal zones for PMICs

PATCH Superseded Daniel Lezcano 3 participants 4 messages Oct 1 – Oct 14

Subsystems (3)

v2 of 5 Superseded Latest is v5 →

lore
Share & tools
lore
#0 lore raw

PATCH v2 1/1 arm64: dts: qcom: x1e78100-thinkpad-t14s: Add thermal zones for PMICs

Add thermal zones for the ThinkPad T14s and describe the board temperature sensors exposed through the PMK8550 VADC.

Add a passive thermal zone for the keyboard area, which is the main thermal constraint under sustained load. The EC reports a thermal alert at 57.85°C, so use this value as the passive trip point and allow the thermal framework to throttle all CPUs and the GPU when the threshold is reached. Use a 1000 m°C hysteresis and a 500 ms passive polling interval.

An earlier approach used staged CPU cluster throttling in an attempt to start thermal mitigation before reaching the target temperature. Testing did not show a significant improvement compared to throttling all CPUs at the EC thermal alert threshold. It also introduced a latency imbalance between the different CPU clusters, which could negatively affect workloads depending on where tasks are scheduled.

A more optimal solution would require a significantly more complex, system-wide approach, accounting for the workload distribution and the available power and thermal headroom across the CPU clusters and other devices. Such an approach would also require kernel mechanisms which are not currently available. Keep the thermal policy simple here and use a single passive trip, which at least ensures that the system is actively mitigated before reaching temperatures that could ultimately lead to a thermal shutdown.

The mitigation temperature is derived from the platform behaviour when using the balanced power profile available under Windows. A separate change will adjust this trip point dynamically according to events reported by the embedded controller. Name the trip "keyboard-ec-alert" so that the EC driver can identify the corresponding trip point in the device tree.

Also add a 73°C critical trip to shut the system down if the keyboard temperature reaches an unsafe level.

Add a thermal zone for the back cover with a 73°C critical shutdown trip.

Describe the SoC, SMB, SDX, east and west board temperature sensors as monitoring-only thermal zones.

Thermal camera measurements were also used to compare the reported temperatures with the physical temperature of the chassis. The measured values appear to primarily represent temperatures inside the enclosure rather than the user-contact surface temperature. No unsafe external surface temperature was observed during these tests, although this should not be considered a substitute for formal platform thermal qualification.

Finally, enable ADC thermal monitoring on the corresponding PMK8550 VADC channels used by these thermal zones.

---
 .../qcom/x1e78100-lenovo-thinkpad-t14s.dtsi   | 105 ++++++++++++++++++
 1 file changed, 105 insertions(+)
arch/arm64/boot/dts/qcom/x1e78100-lenovo-thinkpad-t14s.dtsi +105 -0
index 75ad74bcb042..5d3a0a5ead68 100644
@@ -20,6 +20,81 @@ / {
 	compatible = "lenovo,thinkpad-t14s", "qcom,x1e78100", "qcom,x1e80100";
 	chassis-type = "laptop";
 
+	thermal-zones {
+		soc-thermal {
+			thermal-sensors = <&pmk8550_vadc ADC5_GEN3_AMUX1_GPIO_100K_PU(1)>;
+		};
+
+		keyboard-thermal {
+			critical-action = "shutdown";
+			polling-delay-passive = <500>;
+
+			thermal-sensors = <&pmk8550_vadc ADC5_GEN3_AMUX2_GPIO_100K_PU(1)>;
+
+			trips {
+				keyboard_ec_alert: keyboard-ec-alert {
+					temperature = <57850>;
+					hysteresis = <1000>;
+					type = "passive";
+				};
+
+				keyboard-critical {
+					temperature = <73000>;
+					hysteresis = <1000>;
+					type = "critical";
+				};
+			};
+
+			cooling-maps {
+				map0 {
+					trip = <&keyboard_ec_alert>;
+					cooling-device = <&cpu0 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
+							 <&cpu1 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
+							 <&cpu2 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
+							 <&cpu3 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
+							 <&cpu4 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
+							 <&cpu5 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
+							 <&cpu6 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
+							 <&cpu7 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
+							 <&cpu8 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
+							 <&cpu9 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
+							 <&cpu10 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
+							 <&cpu11 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
+							 <&gpu THERMAL_NO_LIMIT THERMAL_NO_LIMIT>;
+				};
+			};
+		};
+
+		backcover-thermal {
+			critical-action = "shutdown";
+			thermal-sensors = <&pmk8550_vadc ADC5_GEN3_AMUX1_THM_100K_PU(1)>;
+
+			trips {
+				backcover-critical {
+					temperature = <73000>;
+					hysteresis = <1000>;
+					type = "critical";
+				};
+			};
+		};
+
+		smb-thermal {
+			thermal-sensors = <&pmk8550_vadc ADC5_GEN3_AMUX2_THM_100K_PU(1)>;
+		};
+
+		sdx-thermal {
+			thermal-sensors = <&pmk8550_vadc ADC5_GEN3_AMUX3_THM_100K_PU(1)>;
+		};
+
+		east-thermal {
+			thermal-sensors = <&pmk8550_vadc ADC5_GEN3_AMUX4_THM_100K_PU(1)>;
+		};
+
+		west-thermal {
+			thermal-sensors = <&pmk8550_vadc ADC5_GEN3_AMUX5_THM_100K_PU(1)>;
+		};
+	};
+
 	wcd938x: audio-codec {
 		compatible = "qcom,wcd9385-codec";
 
@@ -1612,6 +1687,36 @@ wwan_sw_en: wwan-sw-en-state {
 	};
 };
 
+&pmk8550_vadc {
+	channel@144 {
+		qcom,adc-tm;
+	};
+
+	channel@145 {
+		qcom,adc-tm;
+	};
+
+	channel@146 {
+		qcom,adc-tm;
+	};
+
+	channel@147 {
+		qcom,adc-tm;
+	};
+
+	channel@148 {
+		qcom,adc-tm;
+	};
+
+	channel@14a {
+		qcom,adc-tm;
+	};
+
+	channel@14b {
+		qcom,adc-tm;
+	};
+};
+
 &usb_1_ss0_hsphy {
 	vdd-supply = <&vreg_l3j_0p8>;
 	vdda12-supply = <&vreg_l2j_1p2>;
Signature · 1 line
2.53.0
#1 lore raw

Hi,

Quoted 48 lines · Daniel Lezcano

Add thermal zones for the ThinkPad T14s and describe the board temperature sensors exposed through the PMK8550 VADC.

Add a passive thermal zone for the keyboard area, which is the main thermal constraint under sustained load. The EC reports a thermal alert at 57.85°C, so use this value as the passive trip point and allow the thermal framework to throttle all CPUs and the GPU when the threshold is reached. Use a 1000 m°C hysteresis and a 500 ms passive polling interval.

An earlier approach used staged CPU cluster throttling in an attempt to start thermal mitigation before reaching the target temperature. Testing did not show a significant improvement compared to throttling all CPUs at the EC thermal alert threshold. It also introduced a latency imbalance between the different CPU clusters, which could negatively affect workloads depending on where tasks are scheduled.

A more optimal solution would require a significantly more complex, system-wide approach, accounting for the workload distribution and the available power and thermal headroom across the CPU clusters and other devices. Such an approach would also require kernel mechanisms which are not currently available. Keep the thermal policy simple here and use a single passive trip, which at least ensures that the system is actively mitigated before reaching temperatures that could ultimately lead to a thermal shutdown.

The mitigation temperature is derived from the platform behaviour when using the balanced power profile available under Windows. A separate change will adjust this trip point dynamically according to events reported by the embedded controller. Name the trip "keyboard-ec-alert" so that the EC driver can identify the corresponding trip point in the device tree.

Also add a 73°C critical trip to shut the system down if the keyboard temperature reaches an unsafe level.

Add a thermal zone for the back cover with a 73°C critical shutdown trip.

Describe the SoC, SMB, SDX, east and west board temperature sensors as monitoring-only thermal zones.

Thermal camera measurements were also used to compare the reported temperatures with the physical temperature of the chassis. The measured values appear to primarily represent temperatures inside the enclosure rather than the user-contact surface temperature. No unsafe external surface temperature was observed during these tests, although this should not be considered a substitute for formal platform thermal qualification.

Quoted 4 lines

Finally, enable ADC thermal monitoring on the corresponding PMK8550 VADC channels used by these thermal zones.

Thank you for your work in this.

arch/arm64/boot/dts/qcom/x1e78100-lenovo-thinkpad-t14s.dtsi / { · line 23

Quoted 13 lines
---
 .../qcom/x1e78100-lenovo-thinkpad-t14s.dtsi   | 105 ++++++++++++++++++
 1 file changed, 105 insertions(+)
arch/arm64/boot/dts/qcom/x1e78100-lenovo-thinkpad-t14s.dtsi +1 -0
index 75ad74bcb042..5d3a0a5ead68 100644
@@ -20,6 +20,81 @@ / {
 	compatible = "lenovo,thinkpad-t14s", "qcom,x1e78100", "qcom,x1e80100";
 	chassis-type = "laptop";
 
+	thermal-zones {

I believe all nodes should be shorted by label, then name which is why the first node before this was "wcd938x: audio-codec" since "audio-codec" starts with an a.

So this should be at the end of the global nodes.

Quoted 78 lines
arch/arm64/boot/dts/qcom/x1e78100-lenovo-thinkpad-t14s.dtsi +74 -0
+		soc-thermal {
+			thermal-sensors = <&pmk8550_vadc ADC5_GEN3_AMUX1_GPIO_100K_PU(1)>;
+		};
+
+		keyboard-thermal {
+			critical-action = "shutdown";
+			polling-delay-passive = <500>;
+
+			thermal-sensors = <&pmk8550_vadc ADC5_GEN3_AMUX2_GPIO_100K_PU(1)>;
+
+			trips {
+				keyboard_ec_alert: keyboard-ec-alert {
+					temperature = <57850>;
+					hysteresis = <1000>;
+					type = "passive";
+				};
+
+				keyboard-critical {
+					temperature = <73000>;
+					hysteresis = <1000>;
+					type = "critical";
+				};
+			};
+
+			cooling-maps {
+				map0 {
+					trip = <&keyboard_ec_alert>;
+					cooling-device = <&cpu0 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
+							 <&cpu1 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
+							 <&cpu2 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
+							 <&cpu3 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
+							 <&cpu4 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
+							 <&cpu5 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
+							 <&cpu6 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
+							 <&cpu7 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
+							 <&cpu8 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
+							 <&cpu9 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
+							 <&cpu10 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
+							 <&cpu11 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
+							 <&gpu THERMAL_NO_LIMIT THERMAL_NO_LIMIT>;
+				};
+			};
+		};
+
+		backcover-thermal {
+			critical-action = "shutdown";
+			thermal-sensors = <&pmk8550_vadc ADC5_GEN3_AMUX1_THM_100K_PU(1)>;
+
+			trips {
+				backcover-critical {
+					temperature = <73000>;
+					hysteresis = <1000>;
+					type = "critical";
+				};
+			};
+		};
+
+		smb-thermal {
+			thermal-sensors = <&pmk8550_vadc ADC5_GEN3_AMUX2_THM_100K_PU(1)>;
+		};
+
+		sdx-thermal {
+			thermal-sensors = <&pmk8550_vadc ADC5_GEN3_AMUX3_THM_100K_PU(1)>;
+		};
+
+		east-thermal {
+			thermal-sensors = <&pmk8550_vadc ADC5_GEN3_AMUX4_THM_100K_PU(1)>;
+		};
+
+		west-thermal {
+			thermal-sensors = <&pmk8550_vadc ADC5_GEN3_AMUX5_THM_100K_PU(1)>;
+		};
+	};
+
 	wcd938x: audio-codec {
 		compatible = "qcom,wcd9385-codec";
 

arch/arm64/boot/dts/qcom/x1e78100-lenovo-thinkpad-t14s.dtsi wwan_sw_en: wwan-sw-en-state { · line 1690

Quoted 4 lines
arch/arm64/boot/dts/qcom/x1e78100-lenovo-thinkpad-t14s.dtsi +1 -0
@@ -1612,6 +1687,36 @@ wwan_sw_en: wwan-sw-en-state {
 	};
 };
 
+&pmk8550_vadc {

Idem, referenced existing nodes should also be sorted alphabetically, so this should be the first node after the existing &pmc8380_5_gpios reference.

Regards,

Hans

Quoted 32 lines
arch/arm64/boot/dts/qcom/x1e78100-lenovo-thinkpad-t14s.dtsi +29 -0
+	channel@144 {
+		qcom,adc-tm;
+	};
+
+	channel@145 {
+		qcom,adc-tm;
+	};
+
+	channel@146 {
+		qcom,adc-tm;
+	};
+
+	channel@147 {
+		qcom,adc-tm;
+	};
+
+	channel@148 {
+		qcom,adc-tm;
+	};
+
+	channel@14a {
+		qcom,adc-tm;
+	};
+
+	channel@14b {
+		qcom,adc-tm;
+	};
+};
+
 &usb_1_ss0_hsphy {
 	vdd-supply = <&vreg_l3j_0p8>;
 	vdda12-supply = <&vreg_l2j_1p2>;
#2 lore raw
Quoted 1 line · Hans de Goede

Hi,

[...]

Quoted 7 lines

arch/arm64/boot/dts/qcom/x1e78100-lenovo-thinkpad-t14s.dtsi / { · line 23

Quoted 1 line
arch/arm64/boot/dts/qcom/x1e78100-lenovo-thinkpad-t14s.dtsi +1 -0
+	thermal-zones {

I believe all nodes should be shorted by label, then name which is why the first node before this was "wcd938x: audio-codec" since "audio-codec" starts with an a.

So this should be at the end of the global nodes.

By the node name

FWIW:

label: node-name@unit-address {
property = value
};

Konrad

#3 lore raw

Hi,

Quoted 13 lines · Konrad Dybcio
Quoted 1 line · Hans de Goede

Hi,

[...]

Quoted 7 lines

arch/arm64/boot/dts/qcom/x1e78100-lenovo-thinkpad-t14s.dtsi / { · line 23

Quoted 1 line
arch/arm64/boot/dts/qcom/x1e78100-lenovo-thinkpad-t14s.dtsi +1 -0
+	thermal-zones {

I believe all nodes should be shorted by label, then name which is why the first node before this was "wcd938x: audio-codec" since "audio-codec" starts with an a.

So this should be at the end of the global nodes.

Quoted 7 lines

By the node name

FWIW:

label: node-name@unit-address {
property = value
};

Ah right I swapped the label and node-name, thank you for clarifying.

Regards,

Hans