All of lore.kernel.org
 help / color / mirror / Atom feed
From: Stephen Warren <swarren@wwwdotorg.org>
To: Mikko Perttunen <mperttunen@nvidia.com>,
	"rui.zhang@intel.com" <rui.zhang@intel.com>,
	"edubezval@gmail.com" <edubezval@gmail.com>,
	"thierry.reding@gmail.com" <thierry.reding@gmail.com>,
	Peter De Schrijver <pdeschrijver@nvidia.com>,
	Matthew Longnecker <MLongnecker@nvidia.com>
Cc: "linux-pm@vger.kernel.org" <linux-pm@vger.kernel.org>,
	"linux-tegra@vger.kernel.org" <linux-tegra@vger.kernel.org>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	"linux-arm-kernel@lists.infradead.org"
	<linux-arm-kernel@lists.infradead.org>
Subject: Re: [PATCH 1/6] thermal: of: Add support for hardware-tracked trip points
Date: Tue, 01 Jul 2014 12:15:56 -0600	[thread overview]
Message-ID: <53B2FADC.8060708@wwwdotorg.org> (raw)
In-Reply-To: <53B262EA.9030806@nvidia.com>

On 07/01/2014 01:27 AM, Mikko Perttunen wrote:
> Inline.
> 
> On 01/07/14 00:08, Stephen Warren wrote:
>> On 06/27/2014 02:11 AM, Mikko Perttunen wrote:
>>> This adds support for hardware-tracked trip points to the device tree
>>> thermal sensor framework.
>>>
>>> The framework supports an arbitrary number of trip points. Whenever
>>> the current temperature is updated, the trip points immediately
>>> below and above the current temperature are found. A sensor driver
>>> callback `set_trips' is then called with the temperatures.
>>> If there is no trip point above or below the current temperature,
>>> the passed trip temperature will be LONG_MAX or LONG_MIN respectively.
>>> In this callback, the driver should program the hardware such that
>>> it is notified when either of these trip points are triggered.
>>> When a trip point is triggered, the driver should call
>>> `thermal_zone_device_update' for the respective thermal zone. This
>>> will cause the trip points to be updated again.
>>>
>>> If the `set_trips' callback is not implemented (is NULL), the framework
>>> behaves as before.
>>
>> Is there no "core thermal" code? I would have expected this new feature
>> to be implemented in "core" code rather than of/dt "support" code.
>> Perhaps there would also be some additions to the of/dt code, but I'd
>> still expect the bulk of the feature to be complete independant of
>> of/dt. Systems still using board files or ACPI or ... would surely
>> benefit from this too?
> 
> The thermal core only supports a fixed number of trip points for each
> driver and the core informs the driver of any changes to those, so
> drivers using the core framework can already have hardware trip points,
> but just a fixed number of them.
> 
> The way of-thermal works, is it reads all the trip points from the
> device tree, registers a new thermal_zone_device with that number of
> trip points and then handles the trip points completely independently.
> Of course, if we're just polling, this is fine, since the thermal core
> also knows about those trip points and will trigger cooling when polling
> the each zone. However, the driver doesn't, so it cannot setup any
> interrupts to call thermal_zone_device_update.

Is there any possibility of cleaning that up? It's obviously horribly
inconsistent if core driver functionality works completely differently
simply because the list of trip-points comes from DT rather than a
static table in the driver. of_thermal should be limited to DT parsing
and related device instantiation/lookup, not introducing a completely
different functionality model.

>>> diff --git a/drivers/thermal/of-thermal.c b/drivers/thermal/of-thermal.c

>>> +    for (i = 0; i < data->ntrips; ++i) {
>>> +        struct __thermal_trip *trip = data->trips + i;
>>> +        long trip_low = trip->temperature - trip->hysteresis;
>>> +
>>> +        if (trip_low < temp && trip_low > low)
>>> +            low = trip_low;
>>> +
>>> +        if (trip->temperature > temp && trip->temperature < high)
>>> +            high = trip->temperature;
>>> +    }
>>
>> That seems to always apply hysteresis to the low end of a trip object.
>> Don't you need to apply the hysteresis to either the low or high end of
>> the range, depending on whether the temperature is currently below/above
>> the range, and hence which direction the edge will be crossed?
> 
> I believe applying only to the low end is correct. Say that we have a
> trip point at 40C and hysteresis of 2C. When we exceed 40C cooling will
> start immediately, but it will only be stopped when we cool down to 38C.
> At that point there is again a 2C gap between the current temperature
> and the trip point. It would seem that this is the interpretation used
> by our downstream kernel and also some people on the Internet (however
> trustworthy they may be..)
> 
> If you don't feel this is right, please elaborate.

Ah, the point I was missing is that each trip point is a single
temperature, not a temperature range. As such, the code in your patch is
correct.

WARNING: multiple messages have this Message-ID (diff)
From: swarren@wwwdotorg.org (Stephen Warren)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH 1/6] thermal: of: Add support for hardware-tracked trip points
Date: Tue, 01 Jul 2014 12:15:56 -0600	[thread overview]
Message-ID: <53B2FADC.8060708@wwwdotorg.org> (raw)
In-Reply-To: <53B262EA.9030806@nvidia.com>

On 07/01/2014 01:27 AM, Mikko Perttunen wrote:
> Inline.
> 
> On 01/07/14 00:08, Stephen Warren wrote:
>> On 06/27/2014 02:11 AM, Mikko Perttunen wrote:
>>> This adds support for hardware-tracked trip points to the device tree
>>> thermal sensor framework.
>>>
>>> The framework supports an arbitrary number of trip points. Whenever
>>> the current temperature is updated, the trip points immediately
>>> below and above the current temperature are found. A sensor driver
>>> callback `set_trips' is then called with the temperatures.
>>> If there is no trip point above or below the current temperature,
>>> the passed trip temperature will be LONG_MAX or LONG_MIN respectively.
>>> In this callback, the driver should program the hardware such that
>>> it is notified when either of these trip points are triggered.
>>> When a trip point is triggered, the driver should call
>>> `thermal_zone_device_update' for the respective thermal zone. This
>>> will cause the trip points to be updated again.
>>>
>>> If the `set_trips' callback is not implemented (is NULL), the framework
>>> behaves as before.
>>
>> Is there no "core thermal" code? I would have expected this new feature
>> to be implemented in "core" code rather than of/dt "support" code.
>> Perhaps there would also be some additions to the of/dt code, but I'd
>> still expect the bulk of the feature to be complete independant of
>> of/dt. Systems still using board files or ACPI or ... would surely
>> benefit from this too?
> 
> The thermal core only supports a fixed number of trip points for each
> driver and the core informs the driver of any changes to those, so
> drivers using the core framework can already have hardware trip points,
> but just a fixed number of them.
> 
> The way of-thermal works, is it reads all the trip points from the
> device tree, registers a new thermal_zone_device with that number of
> trip points and then handles the trip points completely independently.
> Of course, if we're just polling, this is fine, since the thermal core
> also knows about those trip points and will trigger cooling when polling
> the each zone. However, the driver doesn't, so it cannot setup any
> interrupts to call thermal_zone_device_update.

Is there any possibility of cleaning that up? It's obviously horribly
inconsistent if core driver functionality works completely differently
simply because the list of trip-points comes from DT rather than a
static table in the driver. of_thermal should be limited to DT parsing
and related device instantiation/lookup, not introducing a completely
different functionality model.

>>> diff --git a/drivers/thermal/of-thermal.c b/drivers/thermal/of-thermal.c

>>> +    for (i = 0; i < data->ntrips; ++i) {
>>> +        struct __thermal_trip *trip = data->trips + i;
>>> +        long trip_low = trip->temperature - trip->hysteresis;
>>> +
>>> +        if (trip_low < temp && trip_low > low)
>>> +            low = trip_low;
>>> +
>>> +        if (trip->temperature > temp && trip->temperature < high)
>>> +            high = trip->temperature;
>>> +    }
>>
>> That seems to always apply hysteresis to the low end of a trip object.
>> Don't you need to apply the hysteresis to either the low or high end of
>> the range, depending on whether the temperature is currently below/above
>> the range, and hence which direction the edge will be crossed?
> 
> I believe applying only to the low end is correct. Say that we have a
> trip point at 40C and hysteresis of 2C. When we exceed 40C cooling will
> start immediately, but it will only be stopped when we cool down to 38C.
> At that point there is again a 2C gap between the current temperature
> and the trip point. It would seem that this is the interpretation used
> by our downstream kernel and also some people on the Internet (however
> trustworthy they may be..)
> 
> If you don't feel this is right, please elaborate.

Ah, the point I was missing is that each trip point is a single
temperature, not a temperature range. As such, the code in your patch is
correct.

  reply	other threads:[~2014-07-01 18:16 UTC|newest]

Thread overview: 72+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-06-27  8:11 [PATCH 0/6] of-thermal hardware trip points + Tegra124 SOCTHERM driver Mikko Perttunen
2014-06-27  8:11 ` Mikko Perttunen
2014-06-27  8:11 ` Mikko Perttunen
2014-06-27  8:11 ` [PATCH 1/6] thermal: of: Add support for hardware-tracked trip points Mikko Perttunen
2014-06-27  8:11   ` Mikko Perttunen
2014-06-27  8:11   ` Mikko Perttunen
2014-06-30 21:08   ` Stephen Warren
2014-06-30 21:08     ` Stephen Warren
2014-07-01  7:27     ` Mikko Perttunen
2014-07-01  7:27       ` Mikko Perttunen
2014-07-01 18:15       ` Stephen Warren [this message]
2014-07-01 18:15         ` Stephen Warren
2014-07-03 14:15         ` Mikko Perttunen
2014-07-03 14:15           ` Mikko Perttunen
2014-07-21 23:53         ` Matthew Longnecker
2014-07-30 14:16   ` Eduardo Valentin
2014-07-30 14:16     ` Eduardo Valentin
2014-08-01 11:42     ` Mikko Perttunen
2014-08-01 11:42       ` Mikko Perttunen
2014-08-01 11:42       ` Mikko Perttunen
     [not found]       ` <53DB7D0D.1070508-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2014-08-01 13:15         ` edubezval-Re5JQEeQqe8AvxtiuMwx3w
2014-08-01 13:15           ` edubezval
2014-08-01 13:15           ` edubezval at gmail.com
2014-06-27  8:11 ` [PATCH 2/6] of: Add bindings for nvidia,tegra124-soctherm Mikko Perttunen
2014-06-27  8:11   ` Mikko Perttunen
2014-06-27  8:11   ` Mikko Perttunen
     [not found]   ` <1403856699-2140-3-git-send-email-mperttunen-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2014-06-30 20:40     ` Stephen Warren
2014-06-30 20:40       ` Stephen Warren
2014-06-30 20:40       ` Stephen Warren
2014-06-27  8:11 ` [PATCH 3/6] ARM: tegra: Add thermal trip points for Jetson TK1 Mikko Perttunen
2014-06-27  8:11   ` Mikko Perttunen
2014-06-27  8:11   ` Mikko Perttunen
2014-06-30 20:45   ` Stephen Warren
2014-06-30 20:45     ` Stephen Warren
2014-06-27  8:11 ` [PATCH 4/6] ARM: tegra: Add soctherm and thermal zones to Tegra124 device tree Mikko Perttunen
2014-06-27  8:11   ` Mikko Perttunen
2014-06-27  8:11   ` Mikko Perttunen
     [not found]   ` <1403856699-2140-5-git-send-email-mperttunen-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2014-06-30 20:48     ` Stephen Warren
2014-06-30 20:48       ` Stephen Warren
2014-06-30 20:48       ` Stephen Warren
2014-07-01  7:49       ` Mikko Perttunen
2014-07-01  7:49         ` Mikko Perttunen
2014-07-21 23:12   ` Matthew Longnecker
2014-07-21 23:13   ` Matthew Longnecker
2014-07-21 23:13     ` Matthew Longnecker
2014-07-21 23:13     ` Matthew Longnecker
     [not found] ` <1403856699-2140-1-git-send-email-mperttunen-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2014-06-27  8:11   ` [PATCH 5/6] clk: tegra: Add soctherm and tsensor clocks to Tegra124 init table Mikko Perttunen
2014-06-27  8:11     ` Mikko Perttunen
2014-06-27  8:11     ` Mikko Perttunen
2014-06-27 12:18     ` Peter De Schrijver
2014-06-27 12:18       ` Peter De Schrijver
2014-06-27  8:11 ` [PATCH 6/6] thermal: Add Tegra SOCTHERM thermal management driver Mikko Perttunen
2014-06-27  8:11   ` Mikko Perttunen
2014-06-27  8:11   ` Mikko Perttunen
2014-06-30 21:23   ` Stephen Warren
2014-06-30 21:23     ` Stephen Warren
2014-07-01  8:06     ` Mikko Perttunen
2014-07-01  8:06       ` Mikko Perttunen
     [not found]       ` <53B26BF2.7090009-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2014-07-01 18:26         ` Stephen Warren
2014-07-01 18:26           ` Stephen Warren
2014-07-01 18:26           ` Stephen Warren
2014-07-03 13:51           ` Mikko Perttunen
2014-07-03 13:51             ` Mikko Perttunen
     [not found]   ` <1403856699-2140-7-git-send-email-mperttunen-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2014-07-01 23:47     ` Tuomas Tynkkynen
2014-07-01 23:47       ` Tuomas Tynkkynen
2014-07-01 23:47       ` Tuomas Tynkkynen
2014-07-04  8:43   ` Wei Ni
2014-07-04  8:43     ` Wei Ni
2014-07-04 11:52     ` Mikko Perttunen
2014-07-04 11:52       ` Mikko Perttunen
2014-07-21  7:42 ` [PATCH 0/6] of-thermal hardware trip points + Tegra124 SOCTHERM driver Zhang Rui
2014-07-21  7:42   ` 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=53B2FADC.8060708@wwwdotorg.org \
    --to=swarren@wwwdotorg.org \
    --cc=MLongnecker@nvidia.com \
    --cc=edubezval@gmail.com \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-pm@vger.kernel.org \
    --cc=linux-tegra@vger.kernel.org \
    --cc=mperttunen@nvidia.com \
    --cc=pdeschrijver@nvidia.com \
    --cc=rui.zhang@intel.com \
    --cc=thierry.reding@gmail.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.