Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1343773 > unrolled thread
| Started by | Leo Yan <leo.yan@linaro.org> |
|---|---|
| First post | 2016-02-26 04:50 +0100 |
| Last post | 2016-02-26 04:50 +0100 |
| Articles | 7 — 3 participants |
Back to article view | Back to linux.kernel
[PATCH v2 0/5] thermal: hisilicon: enable power allocator for Hi6220 Leo Yan <leo.yan@linaro.org> - 2016-02-26 04:50 +0100
[PATCH v2 3/5] thermal: hisilicon: fix IRQ imbalance enabling Leo Yan <leo.yan@linaro.org> - 2016-02-26 04:50 +0100
[PATCH v2 1/5] thermal: change "hysteresis" as optional property Leo Yan <leo.yan@linaro.org> - 2016-02-26 04:50 +0100
Re: [PATCH v2 1/5] thermal: change "hysteresis" as optional property Javi Merino <javi.merino@arm.com> - 2016-03-03 11:50 +0100
Re: [PATCH v2 1/5] thermal: change "hysteresis" as optional property Eduardo Valentin <edubezval@gmail.com> - 2016-03-03 17:30 +0100
Re: [PATCH v2 1/5] thermal: change "hysteresis" as optional property Leo Yan <leo.yan@linaro.org> - 2016-03-04 04:10 +0100
[PATCH v2 5/5] arm64: dts: register Hi6220's thermal zone for power allocator Leo Yan <leo.yan@linaro.org> - 2016-02-26 04:50 +0100
| From | Leo Yan <leo.yan@linaro.org> |
|---|---|
| Date | 2016-02-26 04:50 +0100 |
| Subject | [PATCH v2 0/5] thermal: hisilicon: enable power allocator for Hi6220 |
| Message-ID | <r6hzH-5IV-3@gated-at.bofh.it> |
Hi6220 has octa-core so it has quite high power consumption when run benchmark and introduces high temperature for SoC. So need enable thermal governor to control temperature and also cannot hurt much for performance after impose cooling operations on CPU. This patch series is to enable power allocator for Hi6220. Patch 1 is to change "hysteresis" as optional property for trip points, so when enable power allocator governor we can ignore this property. During profiling also found two issues for thermal sensor's driver. The power allocator just uses only one sensor, so patch 2 is to fix sensor driver to let it can initialize driver successfully with only enabling one sensor; patch 3 is to dismiss warning of IRQ imbalance enabling. After profiling on Hikey, the power model has been simplized with only dynamic coefficient, and now it's convienence to pass it from CPU node. So patch 4 and 5 bind sensor and pass power model parameters. This patch series have been tested on 96boards Hikey. Changes from v1: * According to Javi's review, removed unecessary properties for DT * Add patch 1 for change "hysteresis" as optional property * Add patch 3 to fix IRQ imbalance enabling issue Leo Yan (5): thermal: change "hysteresis" as optional property thermal: hisilicon: support to use any sensor thermal: hisilicon: fix IRQ imbalance enabling arm64: dts: register Hi6220's thermal sensor arm64: dts: register Hi6220's thermal zone for power allocator .../devicetree/bindings/thermal/thermal.txt | 9 ++--- arch/arm64/boot/dts/hisilicon/hi6220.dtsi | 42 ++++++++++++++++++++++ drivers/thermal/hisi_thermal.c | 40 ++++++++++++--------- drivers/thermal/of-thermal.c | 9 +++-- 4 files changed, 75 insertions(+), 25 deletions(-) -- 1.9.1
[toc] | [next] | [standalone]
| From | Leo Yan <leo.yan@linaro.org> |
|---|---|
| Date | 2016-02-26 04:50 +0100 |
| Subject | [PATCH v2 3/5] thermal: hisilicon: fix IRQ imbalance enabling |
| Message-ID | <r6hzH-5IV-9@gated-at.bofh.it> |
| In reply to | #1343773 |
When register sensors into thermal zone during initialization phase, it
reports error for IRQ imbalance enabling:
[ 2.040713] WARNING: at kernel/irq/manage.c:513
[ 2.040719] Modules linked in:
[ 2.040721]
[ 2.040729] CPU: 1 PID: 804 Comm: irq/33-hisi_the Not tainted 4.5.0-rc4+ #505
[ 2.040732] Hardware name: HiKey Development Board (DT)
[ 2.040736] task: ffffffc03ae82580 ti: ffffffc0379c8000 task.ti: ffffffc0379c8000
[ 2.040745] PC is at __enable_irq+0x74/0x84
[ 2.040749] LR is at __enable_irq+0x74/0x84
This warning is for IRQ imbalance enabling, which is caused by
enable_irq() twice. During sensor's initialization it tries to enable
IRQ, the driver will call thermal_zone_of_sensor_register() to bind
sensors and read sensor's temperature. But at this moment the flag
"data->irq_enabled" has been not initialized as correct state, so it
finally introduces the function enabled_irq() to be called twice. In
essentially this is caused by the flag "data->irq_enabled" is
inconsistent with real hardware IRQ enabling state.
So this patch is to fix this issue, firstly init "irq_enabled" flag
before binding sensors to thermal zone. Also change to use the function
irq_get_irqchip_state() to read back real interrupt line state.
Signed-off-by: Leo Yan <leo.yan@linaro.org>
---
drivers/thermal/hisi_thermal.c | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/drivers/thermal/hisi_thermal.c b/drivers/thermal/hisi_thermal.c
index 7a3e5d8..982ffd1 100644
--- a/drivers/thermal/hisi_thermal.c
+++ b/drivers/thermal/hisi_thermal.c
@@ -343,6 +343,10 @@ static int hisi_thermal_probe(struct platform_device *pdev)
return ret;
}
+ hisi_thermal_enable_bind_irq_sensor(data);
+ irq_get_irqchip_state(data->irq, IRQCHIP_STATE_MASKED,
+ &data->irq_enabled);
+
for (i = 0; i < HISI_MAX_SENSORS; ++i) {
ret = hisi_thermal_register_sensor(pdev, data,
&data->sensors[i], i);
@@ -353,9 +357,6 @@ static int hisi_thermal_probe(struct platform_device *pdev)
hisi_thermal_toggle_sensor(&data->sensors[i], true);
}
- hisi_thermal_enable_bind_irq_sensor(data);
- data->irq_enabled = true;
-
return 0;
}
--
1.9.1
[toc] | [prev] | [next] | [standalone]
| From | Leo Yan <leo.yan@linaro.org> |
|---|---|
| Date | 2016-02-26 04:50 +0100 |
| Subject | [PATCH v2 1/5] thermal: change "hysteresis" as optional property |
| Message-ID | <r6hzI-5IV-13@gated-at.bofh.it> |
| In reply to | #1343773 |
The property "hysteresis" is mandatory for trip points, so if without
it the thermal zone cannot register successfully. But "hysteresis" is
ignored in the thermal subsystem and only inquired by several thermal
sensor drivers.
So change "hysteresis" as optional properties.
Signed-off-by: Leo Yan <leo.yan@linaro.org>
---
Documentation/devicetree/bindings/thermal/thermal.txt | 9 +++++----
drivers/thermal/of-thermal.c | 9 ++++-----
2 files changed, 9 insertions(+), 9 deletions(-)
diff --git a/Documentation/devicetree/bindings/thermal/thermal.txt b/Documentation/devicetree/bindings/thermal/thermal.txt
index 41b817f..7d79e77 100644
--- a/Documentation/devicetree/bindings/thermal/thermal.txt
+++ b/Documentation/devicetree/bindings/thermal/thermal.txt
@@ -89,10 +89,6 @@ Required properties:
Type: signed in millicelsius.
Size: one cell
-- hysteresis: A low hysteresis value on temperature property (above).
- Type: unsigned This is a relative value, in millicelsius.
- Size: one cell
-
- type: a string containing the trip type. Expected values are:
"active": A trip point to enable active cooling
"passive": A trip point to enable passive cooling
@@ -100,6 +96,11 @@ Required properties:
"critical": Hardware not reliable.
Type: string
+Optional properties:
+- hysteresis: A low hysteresis value on temperature property (above).
+ Type: unsigned This is a relative value, in millicelsius.
+ Size: one cell
+
* Cooling device maps
The cooling device maps node is a node to describe how cooling devices
diff --git a/drivers/thermal/of-thermal.c b/drivers/thermal/of-thermal.c
index 9043f8f..ab05500 100644
--- a/drivers/thermal/of-thermal.c
+++ b/drivers/thermal/of-thermal.c
@@ -689,11 +689,10 @@ static int thermal_of_populate_trip(struct device_node *np,
trip->temperature = prop;
ret = of_property_read_u32(np, "hysteresis", &prop);
- if (ret < 0) {
- pr_err("missing hysteresis property\n");
- return ret;
- }
- trip->hysteresis = prop;
+ if (ret < 0)
+ pr_warning("missing hysteresis property\n");
+ else
+ trip->hysteresis = prop;
ret = thermal_of_get_trip_type(np, &trip->type);
if (ret < 0) {
--
1.9.1
[toc] | [prev] | [next] | [standalone]
| From | Javi Merino <javi.merino@arm.com> |
|---|---|
| Date | 2016-03-03 11:50 +0100 |
| Subject | Re: [PATCH v2 1/5] thermal: change "hysteresis" as optional property |
| Message-ID | <r8yZs-5Lo-9@gated-at.bofh.it> |
| In reply to | #1343775 |
On Fri, Feb 26, 2016 at 11:43:43AM +0800, Leo Yan wrote:
> The property "hysteresis" is mandatory for trip points, so if without
> it the thermal zone cannot register successfully. But "hysteresis" is
> ignored in the thermal subsystem and only inquired by several thermal
> sensor drivers.
>
> So change "hysteresis" as optional properties.
I had forgotten that hysteresis is enforced in DT. Thanks for fixing
this!
> Signed-off-by: Leo Yan <leo.yan@linaro.org>
> ---
> Documentation/devicetree/bindings/thermal/thermal.txt | 9 +++++----
> drivers/thermal/of-thermal.c | 9 ++++-----
> 2 files changed, 9 insertions(+), 9 deletions(-)
>
> diff --git a/Documentation/devicetree/bindings/thermal/thermal.txt b/Documentation/devicetree/bindings/thermal/thermal.txt
> index 41b817f..7d79e77 100644
> --- a/Documentation/devicetree/bindings/thermal/thermal.txt
> +++ b/Documentation/devicetree/bindings/thermal/thermal.txt
> @@ -89,10 +89,6 @@ Required properties:
> Type: signed in millicelsius.
> Size: one cell
>
> -- hysteresis: A low hysteresis value on temperature property (above).
> - Type: unsigned This is a relative value, in millicelsius.
> - Size: one cell
> -
> - type: a string containing the trip type. Expected values are:
> "active": A trip point to enable active cooling
> "passive": A trip point to enable passive cooling
> @@ -100,6 +96,11 @@ Required properties:
> "critical": Hardware not reliable.
> Type: string
>
> +Optional properties:
> +- hysteresis: A low hysteresis value on temperature property (above).
> + Type: unsigned This is a relative value, in millicelsius.
> + Size: one cell
> +
> * Cooling device maps
>
> The cooling device maps node is a node to describe how cooling devices
> diff --git a/drivers/thermal/of-thermal.c b/drivers/thermal/of-thermal.c
> index 9043f8f..ab05500 100644
> --- a/drivers/thermal/of-thermal.c
> +++ b/drivers/thermal/of-thermal.c
> @@ -689,11 +689,10 @@ static int thermal_of_populate_trip(struct device_node *np,
> trip->temperature = prop;
>
> ret = of_property_read_u32(np, "hysteresis", &prop);
> - if (ret < 0) {
> - pr_err("missing hysteresis property\n");
> - return ret;
> - }
> - trip->hysteresis = prop;
> + if (ret < 0)
> + pr_warning("missing hysteresis property\n");
I'd remove the warning. It is an optional parameter, so there is no
need to warn about something going wrong. As you say in the commit
log, it is ignored in the thermal subsystem and only used by some
sensors so no need to warn about it missing.
Other than that, I'm happy to see this merged.
Acked-by: Javi Merino <javi.merino@arm.com>
> + else
> + trip->hysteresis = prop;
>
> ret = thermal_of_get_trip_type(np, &trip->type);
> if (ret < 0) {
> --
> 1.9.1
>
[toc] | [prev] | [next] | [standalone]
| From | Eduardo Valentin <edubezval@gmail.com> |
|---|---|
| Date | 2016-03-03 17:30 +0100 |
| Subject | Re: [PATCH v2 1/5] thermal: change "hysteresis" as optional property |
| Message-ID | <r8Eiw-1kl-33@gated-at.bofh.it> |
| In reply to | #1343775 |
Hi Leo, On Fri, Feb 26, 2016 at 11:43:43AM +0800, Leo Yan wrote: > The property "hysteresis" is mandatory for trip points, so if without > it the thermal zone cannot register successfully. But "hysteresis" is > ignored in the thermal subsystem and only inquired by several thermal > sensor drivers. I am not sure this a good direction to go. Remember that Linux implementation not necessarily has to be the implication of the DT binding. Hysteresis is a property that plays a significant role on thermal control systems, which in many cases avoid overshooting cooling actions. Having the DT writer to explicitly set it to 0 means that zone does not suffer of overshooting and does not need hysteresis. If the Linux thermal subsystem has a problem with handling hysteresis, I would rather fix Linux code than relaxing the DT binding. Or if you still believe hysteresis is really optional, I would prefer to see a better justification than "Linux ignores it". BR, Eduardo
[toc] | [prev] | [next] | [standalone]
| From | Leo Yan <leo.yan@linaro.org> |
|---|---|
| Date | 2016-03-04 04:10 +0100 |
| Subject | Re: [PATCH v2 1/5] thermal: change "hysteresis" as optional property |
| Message-ID | <r8OhQ-ix-3@gated-at.bofh.it> |
| In reply to | #1349341 |
Hi Eduardo, On Thu, Mar 03, 2016 at 08:29:44AM -0800, Eduardo Valentin wrote: > Hi Leo, > > On Fri, Feb 26, 2016 at 11:43:43AM +0800, Leo Yan wrote: > > The property "hysteresis" is mandatory for trip points, so if without > > it the thermal zone cannot register successfully. But "hysteresis" is > > ignored in the thermal subsystem and only inquired by several thermal > > sensor drivers. > > I am not sure this a good direction to go. Remember that Linux > implementation not necessarily has to be the implication of the DT > binding. Hysteresis is a property that plays a significant role on > thermal control systems, which in many cases avoid overshooting cooling > actions. Having the DT writer to explicitly set it to 0 means that zone > does not suffer of overshooting and does not need hysteresis. After review current code, the "hysteresis" is used to calculate temperature falling threshold with a more conservative value; so that finally avoid overshooting issue. Please confirm if is my understanding correct or not? > If the Linux thermal subsystem has a problem with handling hysteresis, I > would rather fix Linux code than relaxing the DT binding. Or if you > still believe hysteresis is really optional, I would prefer to see a > better justification than "Linux ignores it". If we think about power allocator governor, PID's two parameters are also used to dismiss overshooting issue: one is k_po (proportional term), another is k_i (integral term). So that means after we apply power allocator governor, we don't need parameter "hysteresis" due PID algorithm can automatically dismiss potential errors. Does this make sense? Thanks, Leo Yan
[toc] | [prev] | [next] | [standalone]
| From | Leo Yan <leo.yan@linaro.org> |
|---|---|
| Date | 2016-02-26 04:50 +0100 |
| Subject | [PATCH v2 5/5] arm64: dts: register Hi6220's thermal zone for power allocator |
| Message-ID | <r6hzI-5IV-15@gated-at.bofh.it> |
| In reply to | #1343773 |
With profiling Hi6220's power modeling so get dynamic coefficient and
sustainable power. So pass these parameters from DT.
Now enable power allocator with only one actor for CPU part, so directly
use cluster0's thermal sensor for monitoring temperature.
Reviewed-by: Javi Merino <javi.merino@arm.com>
Signed-off-by: Leo Yan <leo.yan@linaro.org>
---
arch/arm64/boot/dts/hisilicon/hi6220.dtsi | 33 +++++++++++++++++++++++++++++++
1 file changed, 33 insertions(+)
diff --git a/arch/arm64/boot/dts/hisilicon/hi6220.dtsi b/arch/arm64/boot/dts/hisilicon/hi6220.dtsi
index 50ba1b0..d8b963c 100644
--- a/arch/arm64/boot/dts/hisilicon/hi6220.dtsi
+++ b/arch/arm64/boot/dts/hisilicon/hi6220.dtsi
@@ -6,6 +6,7 @@
#include <dt-bindings/interrupt-controller/arm-gic.h>
#include <dt-bindings/clock/hi6220-clock.h>
+#include <dt-bindings/thermal/thermal.h>
/ {
compatible = "hisilicon,hi6220";
@@ -87,6 +88,7 @@
cooling-max-level = <0>;
#cooling-cells = <2>; /* min followed by max */
cpu-idle-states = <&CPU_SLEEP &CLUSTER_SLEEP>;
+ dynamic-power-coefficient = <311>;
};
cpu1: cpu@1 {
@@ -322,5 +324,36 @@
clock-names = "thermal_clk";
#thermal-sensor-cells = <1>;
};
+
+ thermal-zones {
+
+ cls0: cls0 {
+ polling-delay = <1000>;
+ polling-delay-passive = <100>;
+ sustainable-power = <3326>;
+
+ /* sensor ID */
+ thermal-sensors = <&tsensor 2>;
+
+ trips {
+ threshold: trip-point@0 {
+ temperature = <65000>;
+ type = "passive";
+ };
+
+ target: trip-point@1 {
+ temperature = <75000>;
+ type = "passive";
+ };
+ };
+
+ cooling-maps {
+ map0 {
+ trip = <&target>;
+ cooling-device = <&cpu0 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>;
+ };
+ };
+ };
+ };
};
};
--
1.9.1
[toc] | [prev] | [standalone]
Back to top | Article view | linux.kernel
csiph-web