[openwrt/openwrt] mvebu: improve thermal management of IEI Puzzle devices
LEDE Commits
lede-commits at lists.infradead.org
Sat Jun 1 08:40:31 PDT 2024
dangole pushed a commit to openwrt/openwrt.git, branch main:
https://git.openwrt.org/ac783b419b279cf2b026baa4bb3626bc00f0c8a9
commit ac783b419b279cf2b026baa4bb3626bc00f0c8a9
Author: Daniel Golle <daniel at makrotopia.org>
AuthorDate: Thu May 2 13:21:09 2024 +0100
mvebu: improve thermal management of IEI Puzzle devices
- Make step_wise thermal governor respect hysteresis
This is done by importing a downstream patch, backporting the same feature
now present in Linux v6.10+ would be too messy.
- Introduce thermal zone for the WT61P803 uC (chassis and board sensors)
- Introduce thermal zones for AQR NBase-T PHYs
- No longer modify existing SoC thermal zones (which are now only in charge
for emergency shutdown, and can be interrupt driven instead of polled)
Signed-off-by: Daniel Golle <daniel at makrotopia.org>
Signed-off-by: Christian Marangi <ansuelsmth at gmail.com>
---
.../arm64/boot/dts/marvell/cn9131-puzzle-m901.dts | 106 ++++++++++++++--
.../arm64/boot/dts/marvell/cn9132-puzzle-m902.dts | 134 +++++++++++++++++----
.../arm64/boot/dts/marvell/puzzle-thermal.dtsi | 128 ++++++++++----------
...rmal-step_wise-add-support-for-hysteresis.patch | 65 ++++++++++
...rivers-hwmon-wt61p803-puzzle-thermal-zone.patch | 10 ++
5 files changed, 337 insertions(+), 106 deletions(-)
diff --git a/target/linux/mvebu/files-6.6/arch/arm64/boot/dts/marvell/cn9131-puzzle-m901.dts b/target/linux/mvebu/files-6.6/arch/arm64/boot/dts/marvell/cn9131-puzzle-m901.dts
index d214853f1b..b3e3d0a1e0 100644
--- a/target/linux/mvebu/files-6.6/arch/arm64/boot/dts/marvell/cn9131-puzzle-m901.dts
+++ b/target/linux/mvebu/files-6.6/arch/arm64/boot/dts/marvell/cn9131-puzzle-m901.dts
@@ -54,6 +54,91 @@
gpios = <&cp0_gpio2 4 GPIO_ACTIVE_LOW>;
};
};
+
+ thermal-zones {
+ chassis-thermal {
+ polling-delay = <5000>;
+ thermal-sensors = <&puzzle_hwmon 0>, <&puzzle_hwmon 1>;
+
+ trips {
+ chassis_very_hot: trip-point3 {
+ temperature = <55000>;
+ hysteresis = <5000>;
+ type = "active";
+ };
+
+ chassis_hot: trip-point2 {
+ temperature = <50000>;
+ hysteresis = <5000>;
+ type = "active";
+ };
+
+ chassis_warm: trip-point1 {
+ temperature = <45000>;
+ hysteresis = <5000>;
+ type = "active";
+ };
+
+ chassis_cold: trip-point0 {
+ temperature = <40000>;
+ hysteresis = <5000>;
+ type = "active";
+ };
+ };
+
+ cooling-maps {
+ map3 {
+ trip = <&chassis_very_hot>;
+ cooling-device = <&chassis_fan_group0 6 6>;
+ };
+
+ map2 {
+ trip = <&chassis_hot>;
+ cooling-device = <&chassis_fan_group0 3 3>;
+ };
+
+ map1 {
+ trip = <&chassis_warm>;
+ cooling-device = <&chassis_fan_group0 1 1>;
+ };
+
+ map0 {
+ trip = <&chassis_cold>;
+ cooling-device = <&chassis_fan_group0 0 0>;
+ };
+ };
+ };
+
+ cp0-phy0-thermal {
+ thermal-sensors = <&cp0_nbaset_phy0>;
+ PUZZLE_FAN_THERMAL(cp0_phy0, &chassis_fan_group0);
+ };
+
+ cp0-phy1-thermal {
+ thermal-sensors = <&cp0_nbaset_phy1>;
+ PUZZLE_FAN_THERMAL(cp0_phy1, &chassis_fan_group0);
+ };
+
+ cp0-phy2-thermal {
+ thermal-sensors = <&cp0_nbaset_phy2>;
+ PUZZLE_FAN_THERMAL(cp0_phy2, &chassis_fan_group0);
+ };
+
+ cp1-phy0-thermal {
+ thermal-sensors = <&cp1_nbaset_phy0>;
+ PUZZLE_FAN_THERMAL(cp1_phy0, &chassis_fan_group0);
+ };
+
+ cp1-phy1-thermal {
+ thermal-sensors = <&cp1_nbaset_phy1>;
+ PUZZLE_FAN_THERMAL(cp1_phy1, &chassis_fan_group0);
+ };
+
+ cp1-phy2-thermal {
+ thermal-sensors = <&cp1_nbaset_phy2>;
+ PUZZLE_FAN_THERMAL(cp1_phy2, &chassis_fan_group0);
+ };
+ };
};
&uart0 {
@@ -104,10 +189,11 @@
};
};
- hwmon {
+ puzzle_hwmon: hwmon {
compatible = "iei,wt61p803-puzzle-hwmon";
#address-cells = <1>;
#size-cells = <0>;
+ #thermal-sensor-cells = <1>;
chassis_fan_group0: fan-group at 0 {
#cooling-cells = <2>;
@@ -118,14 +204,6 @@
};
};
-&ap_thermal_ic {
- PUZZLE_FAN_THERMAL(ic, &chassis_fan_group0);
-};
-
-&cp0_thermal_ic {
- PUZZLE_FAN_THERMAL(cp0, &chassis_fan_group0);
-};
-
/* on-board eMMC - U9 */
&ap_sdhci0 {
pinctrl-names = "default";
@@ -144,14 +222,17 @@
cp0_nbaset_phy0: ethernet-phy at 0 {
compatible = "ethernet-phy-ieee802.3-c45";
reg = <2>;
+ #thermal-sensor-cells = <0>;
};
cp0_nbaset_phy1: ethernet-phy at 1 {
compatible = "ethernet-phy-ieee802.3-c45";
reg = <0>;
+ #thermal-sensor-cells = <0>;
};
cp0_nbaset_phy2: ethernet-phy at 2 {
compatible = "ethernet-phy-ieee802.3-c45";
reg = <8>;
+ #thermal-sensor-cells = <0>;
};
};
@@ -313,14 +394,17 @@
cp1_nbaset_phy0: ethernet-phy at 3 {
compatible = "ethernet-phy-ieee802.3-c45";
reg = <2>;
+ #thermal-sensor-cells = <0>;
};
cp1_nbaset_phy1: ethernet-phy at 4 {
compatible = "ethernet-phy-ieee802.3-c45";
reg = <0>;
+ #thermal-sensor-cells = <0>;
};
cp1_nbaset_phy2: ethernet-phy at 5 {
compatible = "ethernet-phy-ieee802.3-c45";
reg = <8>;
+ #thermal-sensor-cells = <0>;
};
};
@@ -399,10 +483,6 @@
};
};
-&cp1_thermal_ic {
- PUZZLE_FAN_THERMAL(cp1, &chassis_fan_group0);
-};
-
&cp1_usb3_1 {
status = "okay";
phys = <&cp1_comphy3 1>;
diff --git a/target/linux/mvebu/files-6.6/arch/arm64/boot/dts/marvell/cn9132-puzzle-m902.dts b/target/linux/mvebu/files-6.6/arch/arm64/boot/dts/marvell/cn9132-puzzle-m902.dts
index 8c775e4a4f..f1cae8e5e4 100644
--- a/target/linux/mvebu/files-6.6/arch/arm64/boot/dts/marvell/cn9132-puzzle-m902.dts
+++ b/target/linux/mvebu/files-6.6/arch/arm64/boot/dts/marvell/cn9132-puzzle-m902.dts
@@ -99,6 +99,96 @@
tx-fault-gpio = <&cp2_module_expander1 8 GPIO_ACTIVE_HIGH>;
status = "disabled";
};
+
+ thermal-zones {
+ chassis-thermal {
+ polling-delay = <5000>;
+ thermal-sensors = <&puzzle_hwmon 0>, <&puzzle_hwmon 1>;
+
+ trips {
+ chassis_very_hot: trip-point2 {
+ temperature = <55000>;
+ hysteresis = <5000>;
+ type = "active";
+ };
+
+ chassis_hot: trip-point1 {
+ temperature = <50000>;
+ hysteresis = <5000>;
+ type = "active";
+ };
+
+ chassis_warm: trip-point0 {
+ temperature = <45000>;
+ hysteresis = <5000>;
+ type = "active";
+ };
+ };
+
+ cooling-maps {
+ map2 {
+ trip = <&chassis_very_hot>;
+ cooling-device = <&chassis_fan_group0 6 6>;
+ };
+
+ map1 {
+ trip = <&chassis_hot>;
+ cooling-device = <&chassis_fan_group0 3 3>;
+ };
+
+ map0 {
+ trip = <&chassis_warm>;
+ cooling-device = <&chassis_fan_group0 1 1>;
+ };
+ };
+ };
+
+ cp0-phy0-thermal {
+ thermal-sensors = <&cp0_nbaset_phy0>;
+ PUZZLE_FAN_THERMAL(cp0_phy0, &chassis_fan_group0);
+ };
+
+ cp0-phy1-thermal {
+ thermal-sensors = <&cp0_nbaset_phy1>;
+ PUZZLE_FAN_THERMAL(cp0_phy1, &chassis_fan_group0);
+ };
+
+ cp0-phy2-thermal {
+ thermal-sensors = <&cp0_nbaset_phy2>;
+ PUZZLE_FAN_THERMAL(cp0_phy2, &chassis_fan_group0);
+ };
+
+ cp1-phy0-thermal {
+ thermal-sensors = <&cp1_nbaset_phy0>;
+ PUZZLE_FAN_THERMAL(cp1_phy0, &chassis_fan_group0);
+ };
+
+ cp1-phy1-thermal {
+ thermal-sensors = <&cp1_nbaset_phy1>;
+ PUZZLE_FAN_THERMAL(cp1_phy1, &chassis_fan_group0);
+ };
+
+ cp1-phy2-thermal {
+ thermal-sensors = <&cp1_nbaset_phy2>;
+ PUZZLE_FAN_THERMAL(cp1_phy2, &chassis_fan_group0);
+ };
+
+ cp2-phy0-thermal {
+ thermal-sensors = <&cp2_nbaset_phy0>;
+ PUZZLE_FAN_THERMAL(cp2_phy0, &chassis_fan_group0);
+ };
+
+ cp2-phy1-thermal {
+ thermal-sensors = <&cp2_nbaset_phy1>;
+ PUZZLE_FAN_THERMAL(cp2_phy1, &chassis_fan_group0);
+ };
+
+ cp2-phy2-thermal {
+ thermal-sensors = <&cp2_nbaset_phy2>;
+ PUZZLE_FAN_THERMAL(cp2_phy2, &chassis_fan_group0);
+ };
+ };
+
};
&uart0 {
@@ -149,7 +239,7 @@
};
};
- hwmon {
+ puzzle_hwmon: hwmon {
compatible = "iei,wt61p803-puzzle-hwmon";
#address-cells = <1>;
#size-cells = <0>;
@@ -163,15 +253,6 @@
};
};
-&ap_thermal_ic {
- PUZZLE_FAN_THERMAL(ic, &chassis_fan_group0);
-};
-
-&cp0_thermal_ic {
- PUZZLE_FAN_THERMAL(cp0, &chassis_fan_group0);
-};
-
-
/* on-board eMMC - U9 */
&ap_sdhci0 {
pinctrl-names = "default";
@@ -187,17 +268,20 @@
&cp0_xmdio {
status = "okay";
- cp0_nbaset_phy0: ethernet-phy at 0 {
+ cp0_nbaset_phy0: ethernet-phy at 2 {
compatible = "ethernet-phy-ieee802.3-c45";
reg = <2>;
+ #thermal-sensor-cells = <0>;
};
- cp0_nbaset_phy1: ethernet-phy at 1 {
+ cp0_nbaset_phy1: ethernet-phy at 0 {
compatible = "ethernet-phy-ieee802.3-c45";
reg = <0>;
+ #thermal-sensor-cells = <0>;
};
- cp0_nbaset_phy2: ethernet-phy at 2 {
+ cp0_nbaset_phy2: ethernet-phy at 8 {
compatible = "ethernet-phy-ieee802.3-c45";
reg = <8>;
+ #thermal-sensor-cells = <0>;
};
};
@@ -374,17 +458,20 @@
&cp1_xmdio {
status = "okay";
- cp1_nbaset_phy0: ethernet-phy at 3 {
+ cp1_nbaset_phy0: ethernet-phy at 2 {
compatible = "ethernet-phy-ieee802.3-c45";
reg = <2>;
+ #thermal-sensor-cells = <0>;
};
- cp1_nbaset_phy1: ethernet-phy at 4 {
+ cp1_nbaset_phy1: ethernet-phy at 0 {
compatible = "ethernet-phy-ieee802.3-c45";
reg = <0>;
+ #thermal-sensor-cells = <0>;
};
- cp1_nbaset_phy2: ethernet-phy at 5 {
+ cp1_nbaset_phy2: ethernet-phy at 8 {
compatible = "ethernet-phy-ieee802.3-c45";
reg = <8>;
+ #thermal-sensor-cells = <0>;
};
};
@@ -451,10 +538,6 @@
};
};
-&cp1_thermal_ic {
- PUZZLE_FAN_THERMAL(cp1, &chassis_fan_group0);
-};
-
/*
* Instantiate the second connected CP115
*/
@@ -487,17 +570,20 @@
&cp2_xmdio {
status = "okay";
- cp2_nbaset_phy0: ethernet-phy at 6 {
+ cp2_nbaset_phy0: ethernet-phy at 2 {
compatible = "ethernet-phy-ieee802.3-c45";
reg = <2>;
+ #thermal-sensor-cells = <0>;
};
- cp2_nbaset_phy1: ethernet-phy at 7 {
+ cp2_nbaset_phy1: ethernet-phy at 0 {
compatible = "ethernet-phy-ieee802.3-c45";
reg = <0>;
+ #thermal-sensor-cells = <0>;
};
cp2_nbaset_phy2: ethernet-phy at 8 {
compatible = "ethernet-phy-ieee802.3-c45";
reg = <8>;
+ #thermal-sensor-cells = <0>;
};
};
@@ -574,7 +660,3 @@
};
};
};
-
-&cp2_thermal_ic {
- PUZZLE_FAN_THERMAL(cp2, &chassis_fan_group0);
-};
diff --git a/target/linux/mvebu/files-6.6/arch/arm64/boot/dts/marvell/puzzle-thermal.dtsi b/target/linux/mvebu/files-6.6/arch/arm64/boot/dts/marvell/puzzle-thermal.dtsi
index ea79ab224e..d347a429ae 100644
--- a/target/linux/mvebu/files-6.6/arch/arm64/boot/dts/marvell/puzzle-thermal.dtsi
+++ b/target/linux/mvebu/files-6.6/arch/arm64/boot/dts/marvell/puzzle-thermal.dtsi
@@ -1,68 +1,62 @@
-#define PUZZLE_FAN_THERMAL(_cname, _fan) \
- polling-delay-passive = <500>; \
- polling-delay = <1000>; \
- \
- trips { \
- cpu-hot { \
- temperature = <75000>; \
- hysteresis = <5000>; \
- type = "hot"; \
- }; \
- _cname##_active_full: cpu-active-full { \
- temperature = <70000>; \
- hysteresis = <5000>; \
- type = "active"; \
- }; \
- _cname##_active_high: cpu-active-high { \
- temperature = <65000>; \
- hysteresis = <5000>; \
- type = "active"; \
- }; \
- _cname##_active_med: cpu-active-med { \
- temperature = <62500>; \
- hysteresis = <3000>; \
- type = "active"; \
- }; \
- _cname##_active_low: cpu-active-low { \
- temperature = <60000>; \
- hysteresis = <3000>; \
- type = "active"; \
- }; \
- _cname##_active_min: cpu-active-min { \
- temperature = <55000>; \
- hysteresis = <5000>; \
- type = "active"; \
- }; \
- _cname##_active_idle: cpu-active-idle { \
- temperature = <50000>; \
- hysteresis = <5000>; \
- type = "active"; \
- }; \
- }; \
- cooling-maps { \
- cpu-active-full { \
- trip = <&_cname##_active_full>; \
- cooling-device = <_fan THERMAL_NO_LIMIT \
- THERMAL_NO_LIMIT>; \
- }; \
- cpu-active-high { \
- trip = <&_cname##_active_high>; \
- cooling-device = <_fan 4 5>; \
- }; \
- cpu-active-med { \
- trip = <&_cname##_active_med>; \
- cooling-device = <_fan 3 4>; \
- }; \
- cpu-active-low { \
- trip = <&_cname##_active_low>; \
- cooling-device = <_fan 2 3>; \
- }; \
- cpu-active-min { \
- trip = <&_cname##_active_min>; \
- cooling-device = <_fan 1 2>; \
- }; \
- cpu-active-idle { \
- trip = <&_cname##_active_idle>; \
- cooling-device = <_fan 0 0>; \
- }; \
+#define PUZZLE_FAN_THERMAL(_cname, _fan) \
+ polling-delay-passive = <500>; \
+ polling-delay = <1000>; \
+ \
+ trips { \
+ _cname##_active_full: trip-point5 { \
+ temperature = <70000>; \
+ hysteresis = <3000>; \
+ type = "active"; \
+ }; \
+ _cname##_active_very_high: trip-point4 { \
+ temperature = <67500>; \
+ hysteresis = <3000>; \
+ type = "active"; \
+ }; \
+ _cname##_active_high: trip-point3 { \
+ temperature = <65000>; \
+ hysteresis = <5000>; \
+ type = "active"; \
+ }; \
+ _cname##_active_med: trip-point2 { \
+ temperature = <62500>; \
+ hysteresis = <3000>; \
+ type = "active"; \
+ }; \
+ _cname##_active_low: trip-point1 { \
+ temperature = <60000>; \
+ hysteresis = <3000>; \
+ type = "active"; \
+ }; \
+ _cname##_active_min: trip-point0 { \
+ temperature = <55000>; \
+ hysteresis = <5000>; \
+ type = "active"; \
+ }; \
+ }; \
+ cooling-maps { \
+ map5 { \
+ trip = <&_cname##_active_full>; \
+ cooling-device = <_fan 6 6>; \
+ }; \
+ map4 { \
+ trip = <&_cname##_active_very_high>; \
+ cooling-device = <_fan 5 5>; \
+ }; \
+ map3 { \
+ trip = <&_cname##_active_high>; \
+ cooling-device = <_fan 4 4>; \
+ }; \
+ map2 { \
+ trip = <&_cname##_active_med>; \
+ cooling-device = <_fan 3 3>; \
+ }; \
+ map1 { \
+ trip = <&_cname##_active_low>; \
+ cooling-device = <_fan 2 2>; \
+ }; \
+ map0 { \
+ trip = <&_cname##_active_min>; \
+ cooling-device = <_fan 1 1>; \
+ }; \
}
diff --git a/target/linux/mvebu/patches-6.6/350-drivers-thermal-step_wise-add-support-for-hysteresis.patch b/target/linux/mvebu/patches-6.6/350-drivers-thermal-step_wise-add-support-for-hysteresis.patch
new file mode 100644
index 0000000000..e7332b6df0
--- /dev/null
+++ b/target/linux/mvebu/patches-6.6/350-drivers-thermal-step_wise-add-support-for-hysteresis.patch
@@ -0,0 +1,65 @@
+From 9685ce100f0d302501117113ef0a526ad1acca1d Mon Sep 17 00:00:00 2001
+From: Ram Chandrasekar <rkumbako at codeaurora.org>
+Date: Mon, 7 May 2018 11:54:08 -0600
+Subject: [PATCH] drivers: thermal: step_wise: add support for hysteresis
+
+Step wise governor increases the mitigation level when the temperature
+goes above a threshold and will decrease the mitigation when the
+temperature falls below the threshold. If it were a case, where the
+temperature hovers around a threshold, the mitigation will be applied
+and removed at every iteration. This reaction to the temperature is
+inefficient for performance.
+
+The use of hysteresis temperature could avoid this ping-pong of
+mitigation by relaxing the mitigation to happen only when the
+temperature goes below this lower hysteresis value.
+
+Signed-off-by: Ram Chandrasekar <rkumbako at codeaurora.org>
+Signed-off-by: Lina Iyer <ilina at codeaurora.org>
+[forward-ported for Linux 6.6, as stop-gap downstream solution]
+Signed-off-by: Daniel Golle <daniel at makrotopia.org>
+---
+ drivers/thermal/gov_step_wise.c | 23 ++++++++++++++++-------
+ 1 file changed, 16 insertions(+), 7 deletions(-)
+
+--- a/drivers/thermal/gov_step_wise.c
++++ b/drivers/thermal/gov_step_wise.c
+@@ -86,22 +86,31 @@ static void thermal_zone_trip_update(str
+ struct thermal_instance *instance;
+ bool throttle = false;
+ int old_target;
++ int hyst_temp;
+
+ trend = get_tz_trend(tz, trip_id);
+
+- if (tz->temperature >= trip->temperature) {
+- throttle = true;
+- trace_thermal_zone_trip(tz, trip_id, trip->type);
+- }
+-
+- dev_dbg(&tz->device, "Trip%d[type=%d,temp=%d]:trend=%d,throttle=%d\n",
+- trip_id, trip->type, trip->temperature, trend, throttle);
++ hyst_temp = trip->temperature - trip->hysteresis;
++ dev_dbg(&tz->device, "Trip%d[type=%d,temp=%d,hyst=%d]:trend=%d,throttle=%d\n",
++ trip_id, trip->type, trip->temperature, hyst_temp, trend, throttle);
+
+ list_for_each_entry(instance, &tz->thermal_instances, tz_node) {
+ if (instance->trip != trip)
+ continue;
+
+ old_target = instance->target;
++ throttle = false;
++ /*
++ * Lower the mitigation only if the temperature
++ * goes below the hysteresis temperature.
++ */
++ if (tz->temperature >= trip->temperature ||
++ (tz->temperature >= hyst_temp &&
++ old_target != THERMAL_NO_TARGET)) {
++ throttle = true;
++ trace_thermal_zone_trip(tz, trip_id, trip->type);
++ }
++
+ instance->target = get_target_state(instance, trend, throttle);
+ dev_dbg(&instance->cdev->device, "old_target=%d, target=%d\n",
+ old_target, (int)instance->target);
diff --git a/target/linux/mvebu/patches-6.6/912-drivers-hwmon-wt61p803-puzzle-thermal-zone.patch b/target/linux/mvebu/patches-6.6/912-drivers-hwmon-wt61p803-puzzle-thermal-zone.patch
new file mode 100644
index 0000000000..4633c03855
--- /dev/null
+++ b/target/linux/mvebu/patches-6.6/912-drivers-hwmon-wt61p803-puzzle-thermal-zone.patch
@@ -0,0 +1,10 @@
+--- a/drivers/hwmon/iei-wt61p803-puzzle-hwmon.c
++++ b/drivers/hwmon/iei-wt61p803-puzzle-hwmon.c
+@@ -251,6 +251,7 @@ static const struct hwmon_ops iei_wt61p8
+ };
+
+ static const struct hwmon_channel_info *iei_wt61p803_puzzle_info[] = {
++ HWMON_CHANNEL_INFO(chip, HWMON_C_REGISTER_TZ),
+ HWMON_CHANNEL_INFO(pwm,
+ HWMON_PWM_INPUT,
+ HWMON_PWM_INPUT),
More information about the lede-commits
mailing list