All of lore.kernel.org
 help / color / mirror / Atom feed
From: Zhang Rui <rui.zhang@intel.com>
To: "Rafael J. Wysocki" <rjw@sisk.pl>
Cc: Amit Kachhap <amit.kachhap@linaro.org>,
	linux-acpi@vger.kernel.org, linux-pm@vger.kernel.org,
	Matthew Garrett <mjg@redhat.com>, Len Brown <lenb@kernel.org>,
	R Durgadoss <durgadoss.r@intel.com>, Wei Ni <wni@nvidia.com>
Subject: Re: [PATCH 07/16] Thermal: Introduce .get_trend() callback.
Date: Tue, 24 Jul 2012 09:42:15 +0800	[thread overview]
Message-ID: <1343094135.1682.348.camel@rui.sh.intel.com> (raw)
In-Reply-To: <201207192313.58318.rjw@sisk.pl>

On 四, 2012-07-19 at 23:13 +0200, Rafael J. Wysocki wrote:
> On Thursday, July 19, 2012, Zhang Rui wrote:
> > tc1 and tc2 are used by OSPM to anticipate the temperature trends.
> > But they are ACPI platform specific concepts.
> > 
> > Introduce .get_trend() as a more general solution.
> > 
> > Signed-off-by: Zhang Rui <rui.zhang@intel.com>
> > ---
> >  drivers/acpi/thermal.c        |   30 ++++++++++++++++++++++++++++++
> >  drivers/thermal/thermal_sys.c |   19 +++++++++++++++++--
> >  include/linux/thermal.h       |    9 +++++++++
> >  3 files changed, 56 insertions(+), 2 deletions(-)
> > 
> > diff --git a/drivers/acpi/thermal.c b/drivers/acpi/thermal.c
> > index a7c97f5..b345646 100644
> > --- a/drivers/acpi/thermal.c
> > +++ b/drivers/acpi/thermal.c
> > @@ -704,6 +704,35 @@ static int thermal_get_crit_temp(struct thermal_zone_device *thermal,
> >  		return -EINVAL;
> >  }
> >  
> > +static int thermal_get_trend(struct thermal_zone_device *thermal,
> > +				int trip, enum thermal_trend *trend)
> > +{
> > +	struct acpi_thermal *tz = thermal->devdata;
> > +	enum thermal_trip_type type;
> > +	unsigned long trip_temp;
> > +	int i;
> > +
> > +	if (thermal_get_trip_type(thermal, trip, &type))
> > +		return -EINVAL;
> > +
> > +	/* Only PASSIVE trip points need TREND */
> > +	if (type != THERMAL_TRIP_PASSIVE)
> > +		return -EINVAL;
> > +
> > +	/*
> > +	 * tz->temperature has already been updated by generic thermal layer,
> > +	 * before this callback being invoked
> > +	 */
> > +	i = (tz->trips.passive.tc1 * (tz->temperature - tz->last_temperature))
> > +		+ (tz->trips.passive.tc2
> > +		* (tz->temperature - tz->trips.passive.temperature));
> > +
> > +	*trend = i > 0 ? THERMAL_TREND_RAISING :
> > +		(i < 0 ? THERMAL_TREND_DROPPING : THERMAL_TREND_STABLE);
> 
> I'd use if (...) / else if (...) / else here.  It would be _way_ more readable.
> 
agreed.

> > +	return 0;
> > +}
> > +
> > +
> >  static int thermal_notify(struct thermal_zone_device *thermal, int trip,
> >  			   enum thermal_trip_type trip_type)
> >  {
> > @@ -832,6 +861,7 @@ static const struct thermal_zone_device_ops acpi_thermal_zone_ops = {
> >  	.get_trip_type = thermal_get_trip_type,
> >  	.get_trip_temp = thermal_get_trip_temp,
> >  	.get_crit_temp = thermal_get_crit_temp,
> > +	.get_trend = thermal_get_trend,
> >  	.notify = thermal_notify,
> >  };
> >  
> > diff --git a/drivers/thermal/thermal_sys.c b/drivers/thermal/thermal_sys.c
> > index db35300..29b6dba 100644
> > --- a/drivers/thermal/thermal_sys.c
> > +++ b/drivers/thermal/thermal_sys.c
> > @@ -698,6 +698,18 @@ thermal_remove_hwmon_sysfs(struct thermal_zone_device *tz)
> >  }
> >  #endif
> >  
> > +static void thermal_get_trend(struct thermal_zone_device *tz,
> > +		int trip, enum thermal_trend *trend)
> 
> The fact that this function has the same name as the ACPI one above is kind of
> disturbing.  Any chance to call it differently?
> 
> > +{
> > +	if (tz->ops->get_trend)
> > +		if (!tz->ops->get_trend(tz, trip, trend))
> > +			return;
> 
> What about:
> 
> +	if (tz->ops->get_trend && !tz->ops->get_trend(tz, trip, trend))
> +		return;
> 
> And since the error code returned by .get_trend() apparently doesn't matter,
> shouldn't it return a bool?
> 
agreed.
> > +
> > +	*trend = tz->temperature >= tz->last_temperature ?
> > +		 THERMAL_TREND_RAISING : THERMAL_TREND_DROPPING;
> > +	return;
> > +}
> > +
> >  static void thermal_zone_device_set_polling(struct thermal_zone_device *tz,
> >  					    int delay)
> >  {
> > @@ -732,6 +744,8 @@ static void thermal_zone_device_passive(struct thermal_zone_device *tz,
> >  	if (temp >= trip_temp) {
> >  		tz->passive = true;
> >  
> > +		thermal_get_trend(tz, trip, (enum thermal_trend *)&trend);
> 
> What's wrong with the data type of 'trend' here?
> 
this is no functional changes in this patch.
the trend value returned by thermal_get_trend first is overridden by
tc1/tc2 formula below, so trend is still an integer at this time.

But you remind me that I should redefine trend as enum thermal_trend in
the next patch.

> > +
> >  		trend = (tz->tc1 * (temp - tz->last_temperature)) +
> >  			(tz->tc2 * (temp - trip_temp));
> >  

> > @@ -1090,6 +1104,9 @@ void thermal_zone_device_update(struct thermal_zone_device *tz)
> >  		goto leave;
> >  	}
> >  
Say, when the temperature is changed from 60C to 65C,

without this patch, tz->last_temperature is 60C because it is updated in
the previous thermal_zone_device_update() call.
with this patch, tz->temperature is 60C because it is the previous
"current" temperature.

> > +	tz->last_temperature = tz->temperature;
> > +	tz->temperature = temp;
> > +
we update here them to reflect the truth.

> >  	for (count = 0; count < tz->trips; count++) {
> >  		tz->ops->get_trip_type(tz, count, &trip_type);
> >  		tz->ops->get_trip_temp(tz, count, &trip_temp);
> > @@ -1149,8 +1166,6 @@ void thermal_zone_device_update(struct thermal_zone_device *tz)
> >  		thermal_zone_device_passive(tz, temp, tz->forced_passive,
> >  					    THERMAL_TRIPS_NONE);
> >  
> > -	tz->last_temperature = temp;
> > -
without this patch, tz->last_temperature is updated to 65C
with this patch, tz->last_temperature is still 60C and tz->temperature
is 65C.
that's why we need to update them in the beginning of
thermal_zone_device_update().
> 
> I'm not sure if this is correct.  It seems to change the behavior of
> thermal_zone_device_passive() in a subtle way, but I'm not sure that really
> matters.  Does it?
> 
so I think this will not change the behavior of
thermal_zone_device_passive.

thanks,
rui

--
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

  reply	other threads:[~2012-07-24  1:40 UTC|newest]

Thread overview: 56+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-07-19  6:31 [PATCH 00/16] Thermal: generic thermal layer enhancement Zhang Rui
2012-07-19  6:31 ` [PATCH 01/16] Thermal: Make Thermal trip points writeable Zhang Rui
2012-07-19 10:35   ` R, Durgadoss
2012-07-19 19:38   ` Rafael J. Wysocki
2012-07-23  8:11     ` Zhang Rui
2012-07-19 20:27   ` Rafael J. Wysocki
2012-07-23  8:22     ` Zhang Rui
2012-07-23 10:25       ` Rafael J. Wysocki
2012-07-19  6:31 ` [PATCH 02/16] Thermal: Add Hysteresis attributes Zhang Rui
2012-07-19 10:40   ` R, Durgadoss
2012-07-19 20:00     ` Rafael J. Wysocki
2012-07-19  6:31 ` [PATCH 03/16] Thermal: Documentation update Zhang Rui
2012-07-19 10:51   ` R, Durgadoss
2012-07-23  8:36     ` Zhang Rui
2012-07-19  6:31 ` [PATCH 04/16] Thermal: Introduce multiple cooling states support Zhang Rui
2012-07-19  6:31 ` [PATCH 05/16] Thermal: Introduce cooling states range support Zhang Rui
2012-07-19  6:31 ` [PATCH 06/16] Thermal: set upper and lower limits Zhang Rui
2012-07-19 20:55   ` Rafael J. Wysocki
2012-07-23  8:45     ` Zhang Rui
2012-07-23 19:15       ` Rafael J. Wysocki
2012-07-19  6:31 ` [PATCH 07/16] Thermal: Introduce .get_trend() callback Zhang Rui
2012-07-19 21:13   ` Rafael J. Wysocki
2012-07-24  1:42     ` Zhang Rui [this message]
2012-07-24  9:22       ` Rafael J. Wysocki
2012-07-19 22:09   ` Jacob Pan
2012-07-20  9:53     ` Rafael J. Wysocki
2012-07-20 16:12       ` Jacob Pan
2012-07-19  6:31 ` [PATCH 08/16] Thermal: Remove tc1/tc2 in generic thermal layer Zhang Rui
2012-07-19  6:31 ` [PATCH 09/16] Thermal: Introduce thermal_zone_trip_update() Zhang Rui
2012-07-19 21:19   ` Rafael J. Wysocki
2012-07-24  1:47     ` Zhang Rui
2012-07-24  9:27       ` Rafael J. Wysocki
2012-07-25  1:38         ` Zhang Rui
2012-07-25 11:07           ` Rafael J. Wysocki
2012-07-26  0:49             ` Zhang Rui
     [not found]   ` <CAK44p21hNYGH4YkH5E+XK-pM2upingQbvm77WkJbttCRp6ZamQ@mail.gmail.com>
2012-07-24  7:11     ` Zhang Rui
2012-07-24  8:06       ` Amit Kachhap
2012-07-26  5:08         ` Zhang Rui
2012-07-26  6:01           ` R, Durgadoss
2012-07-24  7:57   ` Amit Kachhap
2012-07-19  6:31 ` [PATCH 10/16] Thermal: rename structure thermal_cooling_device_instance to thermal_instance Zhang Rui
2012-07-19  6:31 ` [PATCH 11/16] Thermal: Rename thermal_zone_device.cooling_devices to thermal_zone_device.instances Zhang Rui
2012-07-19 21:22   ` Rafael J. Wysocki
2012-07-24  1:48     ` Zhang Rui
2012-07-19  6:31 ` [PATCH 12/16] Thermal: Rename thermal_instance.node to thermal_instance.tz_node Zhang Rui
2012-07-19  6:31 ` [PATCH 13/16] Thermal: List thermal_instance in thermal_cooling_device Zhang Rui
2012-07-19 21:25   ` Rafael J. Wysocki
2012-07-24  1:48     ` Zhang Rui
2012-07-19  6:31 ` [PATCH 14/16] Thermal: Introduce simple arbitrator for setting device cooling state Zhang Rui
2012-07-19 21:39   ` Rafael J. Wysocki
2012-07-24  1:49     ` Zhang Rui
2012-07-19  6:31 ` [PATCH 15/16] Thermal: Unify the code for both active and passive cooling Zhang Rui
2012-07-19  6:31 ` [PATCH 16/16] Thermal: use plist instead of list Zhang Rui
2012-07-19 21:45   ` Rafael J. Wysocki
2012-07-24  2:13     ` Zhang Rui
2012-07-19  6:37 ` [PATCH 00/16] Thermal: generic thermal layer enhancement Zhang Rui

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1343094135.1682.348.camel@rui.sh.intel.com \
    --to=rui.zhang@intel.com \
    --cc=amit.kachhap@linaro.org \
    --cc=durgadoss.r@intel.com \
    --cc=lenb@kernel.org \
    --cc=linux-acpi@vger.kernel.org \
    --cc=linux-pm@vger.kernel.org \
    --cc=mjg@redhat.com \
    --cc=rjw@sisk.pl \
    --cc=wni@nvidia.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.