Hi Rui/Amit, > -----Original Message----- > From: Zhang, Rui > Sent: Thursday, July 26, 2012 10:38 AM > To: Amit Kachhap > Cc: linux-acpi@xxxxxxxxxxxxxxx; linux-pm@xxxxxxxxxxxxxxx; Rafael J. Wysocki; > Matthew Garrett; Len Brown; R, Durgadoss; Eduardo Valentin; Wei Ni > Subject: Re: [PATCH 09/16] Thermal: Introduce thermal_zone_trip_update() > > On 二, 2012-07-24 at 13:36 +0530, Amit Kachhap wrote: > > On 24 July 2012 12:41, Zhang Rui <rui.zhang@xxxxxxxxx> wrote: > > > On 二, 2012-07-24 at 12:27 +0530, Amit Kachhap wrote: > > >> > > >> > > >> On 19 July 2012 12:01, Zhang Rui <rui.zhang@xxxxxxxxx> wrote: > > >> This function is used to update the cooling state of > > >> all the cooling devices that are binded to an active trip > > >> point. > > >> > > >> This will be used for passive cooling as well, in the future > > >> patches. > > >> as both active and passive cooling can share the same > > >> algorithm, > > >> which is > > >> > > >> 1. if the temperature is higher than a trip point, > > >> a. if the trend is THERMAL_TREND_RAISING, use higher > > >> cooling > > >> state for this trip point > > >> b. if the trend is THERMAL_TREND_DROPPING, use lower > > >> cooling > > >> state for this trip point > > >> > > >> 2. if the temperature is lower than a trip point, use lower > > >> cooling state for this trip point. > > >> > > >> Hi Rui, > > >> > > >> Your patches looks useful. > > >> For my platform I need to have get_trend called even in the case when > > >> current temp is less than the trip point and then use > > >> THERMAL_TREND_DROPPING to actually lower the cooling state. > > >> > > > hmm, why? > > > in the current cooling algorithm, when the temperature is lower than the > > > trip point, the cooling state is decreased by 1 every time, > > > unconditionally, isn't this what you want? > > > > Basically the requirement is that I do not want to remove the cooling > > device when the temp just reaches below the trip point because this > > causes many throttling in this trip point so say I will remove cooling > > device when the temp is < (trip - 5) which can be done inside the new > > platform get_trend call. > > > As Durga is working on the thermal governor patches, I think that one > can handle this, right? I am fine with this..Since we anyway want all throttling logic to be moved to the governor, I think it makes sense to put this there. So, I will pick it up, when I submit the governor patches. Amit, Please feel free to point out if I don’t pick this one in my patches. Thanks, Durga > > Currently, as I do not want to change the behavior of the current > drivers, ACPI passive cooling, etc, I did not use trend when the > temperature is lower than the trip point. > But anyway, if really needed, I can generate an incremental patch. > what do you think? > > thanks, > rui > > > Thanks, > > Amit D > > > > > > thanks, > > > rui > > > > > >> Thanks, > > >> Amit > > >> > > >> > > >> Signed-off-by: Zhang Rui <rui.zhang@xxxxxxxxx> > > >> --- > > >> drivers/acpi/thermal.c | 7 +++- > > >> drivers/thermal/thermal_sys.c | 91 > > >> +++++++++++++++++++++++++++++------------ > > >> 2 files changed, 71 insertions(+), 27 deletions(-) > > >> > > >> diff --git a/drivers/acpi/thermal.c b/drivers/acpi/thermal.c > > >> index 73e335f..14c4879 100644 > > >> --- a/drivers/acpi/thermal.c > > >> +++ b/drivers/acpi/thermal.c > > >> @@ -715,7 +715,12 @@ static int thermal_get_trend(struct > > >> thermal_zone_device *thermal, > > >> if (thermal_get_trip_type(thermal, trip, &type)) > > >> return -EINVAL; > > >> > > >> - /* Only PASSIVE trip points need TREND */ > > >> + if (type == THERMAL_TRIP_ACTIVE) { > > >> + /* aggressive active cooling */ > > >> + *trend = THERMAL_TREND_RAISING; > > >> + return 0; > > >> + } > > >> + > > >> if (type != THERMAL_TRIP_PASSIVE) > > >> return -EINVAL; > > >> > > >> diff --git a/drivers/thermal/thermal_sys.c > > >> b/drivers/thermal/thermal_sys.c > > >> index 59af3b8..011faba 100644 > > >> --- a/drivers/thermal/thermal_sys.c > > >> +++ b/drivers/thermal/thermal_sys.c > > >> @@ -1076,6 +1076,70 @@ void > > >> thermal_cooling_device_unregister(struct > > >> } > > >> EXPORT_SYMBOL(thermal_cooling_device_unregister); > > >> > > >> +/* > > >> + * Cooling algorithm for active trip points > > >> + * > > >> + * 1. if the temperature is higher than a trip point, > > >> + * a. if the trend is THERMAL_TREND_RAISING, use higher > > >> cooling > > >> + * state for this trip point > > >> + * b. if the trend is THERMAL_TREND_DROPPING, use lower > > >> cooling > > >> + * state for this trip point > > >> + * > > >> + * 2. if the temperature is lower than a trip point, use > > >> lower > > >> + * cooling state for this trip point > > >> + * > > >> + * Note that this behaves the same as the previous passive > > >> cooling > > >> + * algorithm. > > >> + */ > > >> + > > >> +static void thermal_zone_trip_update(struct > > >> thermal_zone_device *tz, > > >> + int trip, long temp) > > >> +{ > > >> + struct thermal_cooling_device_instance *instance; > > >> + struct thermal_cooling_device *cdev = NULL; > > >> + unsigned long cur_state, max_state; > > >> + long trip_temp; > > >> + enum thermal_trend trend; > > >> + > > >> + tz->ops->get_trip_temp(tz, trip, &trip_temp); > > >> + > > >> + if (temp >= trip_temp) { > > >> + thermal_get_trend(tz, trip, &trend); > > >> + > > >> + list_for_each_entry(instance, > > >> &tz->cooling_devices, node) { > > >> + if (instance->trip != trip) > > >> + continue; > > >> + > > >> + cdev = instance->cdev; > > >> + > > >> + cdev->ops->get_cur_state(cdev, > > >> &cur_state); > > >> + cdev->ops->get_max_state(cdev, > > >> &max_state); > > >> + > > >> + if (trend == THERMAL_TREND_RAISING) { > > >> + cur_state = cur_state < > > >> instance->upper ? > > >> + (cur_state + 1) : > > >> instance->upper; > > >> + } else if (trend == > > >> THERMAL_TREND_DROPPING) { > > >> + cur_state = cur_state > > > >> instance->lower ? > > >> + (cur_state - 1) : > > >> instance->lower; > > >> + } > > >> + cdev->ops->set_cur_state(cdev, > > >> cur_state); > > >> + } > > >> + } else { /* below trip */ > > >> + list_for_each_entry(instance, > > >> &tz->cooling_devices, node) { > > >> + if (instance->trip != trip) > > >> + continue; > > >> + > > >> + cdev = instance->cdev; > > >> + cdev->ops->get_cur_state(cdev, > > >> &cur_state); > > >> + > > >> + cur_state = cur_state > > > >> instance->lower ? > > >> + (cur_state - 1) : > > >> instance->lower; > > >> + cdev->ops->set_cur_state(cdev, > > >> cur_state); > > >> + } > > >> + } > > >> + > > >> + return; > > >> +} > > >> /** > > >> * thermal_zone_device_update - force an update of a thermal > > >> zone's state > > >> * @ttz: the thermal zone to update > > >> @@ -1086,9 +1150,6 @@ void thermal_zone_device_update(struct > > >> thermal_zone_device *tz) > > >> int count, ret = 0; > > >> long temp, trip_temp; > > >> enum thermal_trip_type trip_type; > > >> - struct thermal_cooling_device_instance *instance; > > >> - struct thermal_cooling_device *cdev; > > >> - unsigned long cur_state, max_state; > > >> > > >> mutex_lock(&tz->lock); > > >> > > >> @@ -1124,29 +1185,7 @@ void thermal_zone_device_update(struct > > >> thermal_zone_device *tz) > > >> tz->ops->notify(tz, > > >> count, trip_type); > > >> break; > > >> case THERMAL_TRIP_ACTIVE: > > >> - list_for_each_entry(instance, > > >> &tz->cooling_devices, > > >> - node) { > > >> - if (instance->trip != count) > > >> - continue; > > >> - > > >> - cdev = instance->cdev; > > >> - > > >> - cdev->ops->get_cur_state(cdev, > > >> &cur_state); > > >> - cdev->ops->get_max_state(cdev, > > >> &max_state); > > >> - > > >> - if (temp >= trip_temp) > > >> - cur_state = > > >> - cur_state < > > >> instance->upper ? > > >> - (cur_state + > > >> 1) : > > >> - > > >> instance->upper; > > >> - else > > >> - cur_state = > > >> - cur_state > > > >> instance->lower ? > > >> - (cur_state - > > >> 1) : > > >> - > > >> instance->lower; > > >> - > > >> - cdev->ops->set_cur_state(cdev, > > >> cur_state); > > >> - } > > >> + thermal_zone_trip_update(tz, count, > > >> temp); > > >> break; > > >> case THERMAL_TRIP_PASSIVE: > > >> if (temp >= trip_temp || tz->passive) > > >> -- > > >> 1.7.9.5 > > >> > > >> > > > > > > > ��.n��������+%������w��{.n�����{�����ܨ}���Ơz�j:+v�����w����ޙ��&�)ߡ�a����z�ޗ���ݢj��w�f