diff mbox series

[v1,1/7] thermal/core: Encapsulate more handle_thermal_trip

Message ID 20240729150259.1089814-2-daniel.lezcano@linaro.org
State New
Headers show
Series Add thermal thresholds support | expand

Commit Message

Daniel Lezcano July 29, 2024, 3:02 p.m. UTC
In order to set the scene for the thresholds support which have to
manipulate the low and high temperature boundaries for the interrupt
support, we must pass the low and high value the incoming thresholds
routine.

Instead of looping in the trip descriptors in
thermal_zone_device_update(), we move the loop in the
handle_thermal_trip() function and use it to set the low and high
values.

As these variables can be set directly in the handle_thermal_trip(),
we can get rid of a descriptors loop found in the thermal_set_trips()
function as low and high are set in handle_thermal_trip().

Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
---
 drivers/thermal/thermal_core.c | 104 +++++++++++++++++++--------------
 drivers/thermal/thermal_core.h |   2 +-
 drivers/thermal/thermal_trip.c |  12 +---
 3 files changed, 62 insertions(+), 56 deletions(-)
diff mbox series

Patch

diff --git a/drivers/thermal/thermal_core.c b/drivers/thermal/thermal_core.c
index 95c399f94744..5cfa2a706e96 100644
--- a/drivers/thermal/thermal_core.c
+++ b/drivers/thermal/thermal_core.c
@@ -425,59 +425,74 @@  static void handle_critical_trips(struct thermal_zone_device *tz,
 }
 
 static void handle_thermal_trip(struct thermal_zone_device *tz,
-				struct thermal_trip_desc *td,
 				struct list_head *way_up_list,
-				struct list_head *way_down_list)
+				struct list_head *way_down_list,
+				int *low, int *high)
 {
-	const struct thermal_trip *trip = &td->trip;
+	struct thermal_trip_desc *td;
 	int old_threshold;
 
-	if (trip->temperature == THERMAL_TEMP_INVALID)
-		return;
+	for_each_trip_desc(tz, td) {
 
-	/*
-	 * If the trip temperature or hysteresis has been updated recently,
-	 * the threshold needs to be computed again using the new values.
-	 * However, its initial value still reflects the old ones and that
-	 * is what needs to be compared with the previous zone temperature
-	 * to decide which action to take.
-	 */
-	old_threshold = td->threshold;
-	td->threshold = trip->temperature;
+		const struct thermal_trip *trip = &td->trip;
+
+		if (trip->temperature == THERMAL_TEMP_INVALID)
+			continue;
+
+		if (tz->last_temperature < old_threshold ||
+		    tz->last_temperature == THERMAL_TEMP_INIT)
+			continue;
 
-	if (tz->last_temperature >= old_threshold &&
-	    tz->last_temperature != THERMAL_TEMP_INIT) {
 		/*
-		 * Mitigation is under way, so it needs to stop if the zone
-		 * temperature falls below the low temperature of the trip.
-		 * In that case, the trip temperature becomes the new threshold.
+		 * If the trip temperature or hysteresis has been updated recently,
+		 * the threshold needs to be computed again using the new values.
+		 * However, its initial value still reflects the old ones and that
+		 * is what needs to be compared with the previous zone temperature
+		 * to decide which action to take.
 		 */
-		if (tz->temperature < trip->temperature - trip->hysteresis) {
-			list_add(&td->notify_list_node, way_down_list);
-			td->notify_temp = trip->temperature - trip->hysteresis;
+		old_threshold = td->threshold;
+		td->threshold = trip->temperature;
 
-			if (trip->type == THERMAL_TRIP_PASSIVE) {
-				tz->passive--;
-				WARN_ON(tz->passive < 0);
+		if (tz->last_temperature >= old_threshold &&
+		    tz->last_temperature != THERMAL_TEMP_INVALID) {
+			/*
+			 * Mitigation is under way, so it needs to stop if the zone
+			 * temperature falls below the low temperature of the trip.
+			 * In that case, the trip temperature becomes the new threshold.
+			 */
+			if (tz->temperature < trip->temperature - trip->hysteresis) {
+				list_add(&td->notify_list_node, way_down_list);
+				td->notify_temp = trip->temperature - trip->hysteresis;
+
+				if (trip->type == THERMAL_TRIP_PASSIVE) {
+					tz->passive--;
+					WARN_ON(tz->passive < 0);
+				}
+			} else {
+				td->threshold -= trip->hysteresis;
 			}
-		} else {
+		} else if (tz->temperature >= trip->temperature) {
+			/*
+			 * There is no mitigation under way, so it needs to be started
+			 * if the zone temperature exceeds the trip one.  The new
+			 * threshold is then set to the low temperature of the trip.
+			 */
+			list_add_tail(&td->notify_list_node, way_up_list);
+			td->notify_temp = trip->temperature;
 			td->threshold -= trip->hysteresis;
+
+			if (trip->type == THERMAL_TRIP_PASSIVE)
+				tz->passive++;
+			else if (trip->type == THERMAL_TRIP_CRITICAL ||
+				 trip->type == THERMAL_TRIP_HOT)
+				handle_critical_trips(tz, trip);
 		}
-	} else if (tz->temperature >= trip->temperature) {
-		/*
-		 * There is no mitigation under way, so it needs to be started
-		 * if the zone temperature exceeds the trip one.  The new
-		 * threshold is then set to the low temperature of the trip.
-		 */
-		list_add_tail(&td->notify_list_node, way_up_list);
-		td->notify_temp = trip->temperature;
-		td->threshold -= trip->hysteresis;
-
-		if (trip->type == THERMAL_TRIP_PASSIVE)
-			tz->passive++;
-		else if (trip->type == THERMAL_TRIP_CRITICAL ||
-			 trip->type == THERMAL_TRIP_HOT)
-			handle_critical_trips(tz, trip);
+
+		if (td->threshold < tz->temperature && td->threshold > *low)
+			*low = td->threshold;
+
+		if (td->threshold > tz->temperature && td->threshold < *high)
+			*high = td->threshold;
 	}
 }
 
@@ -545,6 +560,8 @@  void __thermal_zone_device_update(struct thermal_zone_device *tz,
 {
 	struct thermal_governor *governor = thermal_get_tz_governor(tz);
 	struct thermal_trip_desc *td;
+	int low = -INT_MAX, high = INT_MAX;
+
 	LIST_HEAD(way_down_list);
 	LIST_HEAD(way_up_list);
 	int temp, ret;
@@ -580,10 +597,9 @@  void __thermal_zone_device_update(struct thermal_zone_device *tz,
 
 	tz->notify_event = event;
 
-	for_each_trip_desc(tz, td)
-		handle_thermal_trip(tz, td, &way_up_list, &way_down_list);
+	handle_thermal_trip(tz, &way_up_list, &way_down_list, &low, &high);
 
-	thermal_zone_set_trips(tz);
+	thermal_zone_set_trips(tz, low, high);
 
 	list_sort(NULL, &way_up_list, thermal_trip_notify_cmp);
 	list_for_each_entry(td, &way_up_list, notify_list_node)
diff --git a/drivers/thermal/thermal_core.h b/drivers/thermal/thermal_core.h
index 4cf2b7230d04..67a09f90eb95 100644
--- a/drivers/thermal/thermal_core.h
+++ b/drivers/thermal/thermal_core.h
@@ -259,7 +259,7 @@  void thermal_governor_update_tz(struct thermal_zone_device *tz,
 
 const char *thermal_trip_type_name(enum thermal_trip_type trip_type);
 
-void thermal_zone_set_trips(struct thermal_zone_device *tz);
+void thermal_zone_set_trips(struct thermal_zone_device *tz, int low, int high);
 int thermal_zone_trip_id(const struct thermal_zone_device *tz,
 			 const struct thermal_trip *trip);
 void thermal_zone_trip_updated(struct thermal_zone_device *tz,
diff --git a/drivers/thermal/thermal_trip.c b/drivers/thermal/thermal_trip.c
index c0b679b846b3..af0f9f5ae0de 100644
--- a/drivers/thermal/thermal_trip.c
+++ b/drivers/thermal/thermal_trip.c
@@ -76,10 +76,8 @@  EXPORT_SYMBOL_GPL(thermal_zone_get_num_trips);
  *
  * It does not return a value
  */
-void thermal_zone_set_trips(struct thermal_zone_device *tz)
+void thermal_zone_set_trips(struct thermal_zone_device *tz, int low, int high)
 {
-	const struct thermal_trip_desc *td;
-	int low = -INT_MAX, high = INT_MAX;
 	int ret;
 
 	lockdep_assert_held(&tz->lock);
@@ -87,14 +85,6 @@  void thermal_zone_set_trips(struct thermal_zone_device *tz)
 	if (!tz->ops.set_trips)
 		return;
 
-	for_each_trip_desc(tz, td) {
-		if (td->threshold < tz->temperature && td->threshold > low)
-			low = td->threshold;
-
-		if (td->threshold > tz->temperature && td->threshold < high)
-			high = td->threshold;
-	}
-
 	/* No need to change trip points */
 	if (tz->prev_low_trip == low && tz->prev_high_trip == high)
 		return;