From: Daniel Golle Date: Thu, 2 May 2024 12:21:09 +0000 (+0100) Subject: mvebu: improve thermal management of IEI Puzzle devices X-Git-Url: http://git.lede-project.org./?a=commitdiff_plain;h=ac783b419b279cf2b026baa4bb3626bc00f0c8a9;p=openwrt%2Fopenwrt.git 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 Signed-off-by: Christian Marangi --- 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@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@0 { compatible = "ethernet-phy-ieee802.3-c45"; reg = <2>; + #thermal-sensor-cells = <0>; }; cp0_nbaset_phy1: ethernet-phy@1 { compatible = "ethernet-phy-ieee802.3-c45"; reg = <0>; + #thermal-sensor-cells = <0>; }; cp0_nbaset_phy2: ethernet-phy@2 { compatible = "ethernet-phy-ieee802.3-c45"; reg = <8>; + #thermal-sensor-cells = <0>; }; }; @@ -313,14 +394,17 @@ cp1_nbaset_phy0: ethernet-phy@3 { compatible = "ethernet-phy-ieee802.3-c45"; reg = <2>; + #thermal-sensor-cells = <0>; }; cp1_nbaset_phy1: ethernet-phy@4 { compatible = "ethernet-phy-ieee802.3-c45"; reg = <0>; + #thermal-sensor-cells = <0>; }; cp1_nbaset_phy2: ethernet-phy@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@0 { + cp0_nbaset_phy0: ethernet-phy@2 { compatible = "ethernet-phy-ieee802.3-c45"; reg = <2>; + #thermal-sensor-cells = <0>; }; - cp0_nbaset_phy1: ethernet-phy@1 { + cp0_nbaset_phy1: ethernet-phy@0 { compatible = "ethernet-phy-ieee802.3-c45"; reg = <0>; + #thermal-sensor-cells = <0>; }; - cp0_nbaset_phy2: ethernet-phy@2 { + cp0_nbaset_phy2: ethernet-phy@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@3 { + cp1_nbaset_phy0: ethernet-phy@2 { compatible = "ethernet-phy-ieee802.3-c45"; reg = <2>; + #thermal-sensor-cells = <0>; }; - cp1_nbaset_phy1: ethernet-phy@4 { + cp1_nbaset_phy1: ethernet-phy@0 { compatible = "ethernet-phy-ieee802.3-c45"; reg = <0>; + #thermal-sensor-cells = <0>; }; - cp1_nbaset_phy2: ethernet-phy@5 { + cp1_nbaset_phy2: ethernet-phy@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@6 { + cp2_nbaset_phy0: ethernet-phy@2 { compatible = "ethernet-phy-ieee802.3-c45"; reg = <2>; + #thermal-sensor-cells = <0>; }; - cp2_nbaset_phy1: ethernet-phy@7 { + cp2_nbaset_phy1: ethernet-phy@0 { compatible = "ethernet-phy-ieee802.3-c45"; reg = <0>; + #thermal-sensor-cells = <0>; }; cp2_nbaset_phy2: ethernet-phy@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 +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 +Signed-off-by: Lina Iyer +[forward-ported for Linux 6.6, as stop-gap downstream solution] +Signed-off-by: Daniel Golle +--- + 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),