Thread (41 messages) 41 messages, 4 authors, 2012-08-09

Re: [PATCH RESEND 15/16] Thermal: Unify the code for both active and passive cooling

From: Zhang Rui <rui.zhang@intel.com>
Date: 2012-08-09 08:31:46

On 四, 2012-08-09 at 11:26 +0300, Valentin, Eduardo wrote:
Hello,



On Wed, Jul 25, 2012 at 5:11 AM, Zhang Rui [off-list ref] wrote:
quoted
Remove thermal_zone_device_passive(). And use
thermal_zone_trip_update() and thermal_zone_do_update()
for both active and passive cooling.
I believe you need to refresh this patch on top of your new changes on
this series. It is not applying cleanly due to changes done in
previous patches.
hmm,

probably you are testing patches from different version.
does the problem still exist in Patch set V4?

thanks,
rui
quoted
Signed-off-by: Zhang Rui <rui.zhang@intel.com>
---
 drivers/thermal/thermal_sys.c |   97 ++++++++++-------------------------------
 include/linux/thermal.h       |    2 +-
 2 files changed, 24 insertions(+), 75 deletions(-)
diff --git a/drivers/thermal/thermal_sys.c b/drivers/thermal/thermal_sys.c
index ee10df5..23a5c86 100644
--- a/drivers/thermal/thermal_sys.c
+++ b/drivers/thermal/thermal_sys.c
@@ -730,73 +730,6 @@ static void thermal_zone_device_set_polling(struct thermal_zone_device *tz,
                                      msecs_to_jiffies(delay));
 }

-static void thermal_zone_device_passive(struct thermal_zone_device *tz,
-                                       int temp, int trip_temp, int trip)
-{
-       enum thermal_trend trend;
-       struct thermal_instance *instance;
-       struct thermal_cooling_device *cdev;
-       long state, max_state;
-
-       /*
-        * Above Trip?
-        * -----------
-        * Calculate the thermal trend (using the passive cooling equation)
-        * and modify the performance limit for all passive cooling devices
-        * accordingly.  Note that we assume symmetry.
-        */
-       if (temp >= trip_temp) {
-               tz->passive = true;
-
-               thermal_get_trend(tz, trip, &trend);
-
-               /* Heating up? */
-               if (trend == THERMAL_TREND_RAISING) {
-                       list_for_each_entry(instance, &tz->thermal_instances,
-                                           tz_node) {
-                               if (instance->trip != trip)
-                                       continue;
-                               cdev = instance->cdev;
-                               cdev->ops->get_cur_state(cdev, &state);
-                               cdev->ops->get_max_state(cdev, &max_state);
-                               if (state++ < max_state)
-                                       cdev->ops->set_cur_state(cdev, state);
-                       }
-               } else if (trend == THERMAL_TREND_DROPPING) { /* Cooling off? */
-                       list_for_each_entry(instance, &tz->thermal_instances,
-                                           tz_node) {
-                               if (instance->trip != trip)
-                                       continue;
-                               cdev = instance->cdev;
-                               cdev->ops->get_cur_state(cdev, &state);
-                               cdev->ops->get_max_state(cdev, &max_state);
-                               if (state > 0)
-                                       cdev->ops->set_cur_state(cdev, --state);
-                       }
-               }
-               return;
-       }
-
-       /*
-        * Below Trip?
-        * -----------
-        * Implement passive cooling hysteresis to slowly increase performance
-        * and avoid thrashing around the passive trip point.  Note that we
-        * assume symmetry.
-        */
-       list_for_each_entry(instance, &tz->thermal_instances, tz_node) {
-               if (instance->trip != trip)
-                       continue;
-               cdev = instance->cdev;
-               cdev->ops->get_cur_state(cdev, &state);
-               cdev->ops->get_max_state(cdev, &max_state);
-               if (state > 0)
-                       cdev->ops->set_cur_state(cdev, --state);
-               if (state == 0)
-                       tz->passive = false;
-       }
-}
-
 static void thermal_zone_device_check(struct work_struct *work)
 {
        struct thermal_zone_device *tz = container_of(work, struct
@@ -1118,7 +1051,7 @@ static void thermal_zone_do_update(struct thermal_zone_device *tz)
 }

 /*
- * Cooling algorithm for active trip points
+ * Cooling algorithm for both active and passive cooling
  *
  * 1. if the temperature is higher than a trip point,
  *    a. if the trend is THERMAL_TREND_RAISING, use higher cooling
@@ -1140,9 +1073,16 @@ static void thermal_zone_trip_update(struct thermal_zone_device *tz,
        struct thermal_cooling_device *cdev = NULL;
        unsigned long cur_state, max_state;
        long trip_temp;
+       enum thermal_trip_type trip_type;
        enum thermal_trend trend;

-       tz->ops->get_trip_temp(tz, trip, &trip_temp);
+       if (trip == THERMAL_TRIPS_NONE) {
+               trip_temp = tz->forced_passive;
+               trip_type = THERMAL_TRIPS_NONE;
+       } else {
+               tz->ops->get_trip_temp(tz, trip, &trip_temp);
+               tz->ops->get_trip_type(tz, trip, &trip_type);
+       }

        if (temp >= trip_temp) {
                thermal_get_trend(tz, trip, &trend);
@@ -1163,6 +1103,12 @@ static void thermal_zone_trip_update(struct thermal_zone_device *tz,
                                cur_state = cur_state > instance->lower ?
                                    (cur_state - 1) : instance->lower;
                        }
+
+                       /* activate a passive thermal instance */
+                       if (trip_type == THERMAL_TRIP_PASSIVE &&
+                           instance->target == THERMAL_NO_TARGET)
+                               tz->passive++;
+
                        instance->target = cur_state;
                        cdev->updated = false; /* cooling device needs update */
                }
@@ -1179,6 +1125,11 @@ static void thermal_zone_trip_update(struct thermal_zone_device *tz,

                        cur_state = cur_state > instance->lower ?
                                    (cur_state - 1) : THERMAL_NO_TARGET;
+
+                       /* deactivate a passive thermal instance */
+                       if (trip_type == THERMAL_TRIP_PASSIVE &&
+                           cur_state == THERMAL_NO_TARGET)
+                               tz->passive--;
                        instance->target = cur_state;
                        cdev->updated = false; /* cooling device needs update */
                }
@@ -1235,16 +1186,14 @@ void thermal_zone_device_update(struct thermal_zone_device *tz)
                        break;
                case THERMAL_TRIP_PASSIVE:
                        if (temp >= trip_temp || tz->passive)
-                               thermal_zone_device_passive(tz, temp,
-                                                           trip_temp, count);
+                               thermal_zone_trip_update(tz, count, temp);
                        break;
                }
        }

-       thermal_zone_do_update(tz);
        if (tz->forced_passive)
-               thermal_zone_device_passive(tz, temp, tz->forced_passive,
-                                           THERMAL_TRIPS_NONE);
+               thermal_zone_trip_update(tz, THERMAL_TRIPS_NONE, temp);
+       thermal_zone_do_update(tz);

 leave:
        if (tz->passive)
diff --git a/include/linux/thermal.h b/include/linux/thermal.h
index 3e66214..06fd04d 100644
--- a/include/linux/thermal.h
+++ b/include/linux/thermal.h
@@ -121,7 +121,7 @@ struct thermal_zone_device {
        int polling_delay;
        int temperature;
        int last_temperature;
-       bool passive;
+       int passive;
        unsigned int forced_passive;
        const struct thermal_zone_device_ops *ops;
        struct list_head thermal_instances;
--
1.7.9.5

--
To unsubscribe from this list: send the line "unsubscribe linux-acpi" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help