2018-11-29 10:10:54

by Wei Ni

[permalink] [raw]
Subject: [PATCH v4 0/3] Fixes for Tegra soctherm

This series fixed some issues for Tegra soctherm

Main changes from v3:
1. updated codes for parsing sensor id, per Thierry's comments

Main changes from v2:
1. add codes to parse sensor id to avoid registration
failure.

Main changes from v1:
1. Acked by Thierry Reding <[email protected]> for the patch
"thermal: tegra: fix memory allocation".
2. Print out the sensor name when register failed.
2. Remove patch "thermal: tegra: fix coverity defect"

Wei Ni (3):
thermal: tegra: remove unnecessary warnings
thermal: tegra: fix memory allocation
thermal: tegra: parse sensor id before sensor register

drivers/thermal/tegra/soctherm.c | 54 +++++++++++++++++++++++++++++++++++-----
1 file changed, 48 insertions(+), 6 deletions(-)

--
2.7.4



2018-11-29 10:10:56

by Wei Ni

[permalink] [raw]
Subject: [PATCH v4 1/3] thermal: tegra: remove unnecessary warnings

Convert warnings to info as not all platforms may
have all the thresholds and sensors enabled.

Signed-off-by: Wei Ni <[email protected]>
---
drivers/thermal/tegra/soctherm.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/drivers/thermal/tegra/soctherm.c b/drivers/thermal/tegra/soctherm.c
index ed28110a3535..55cc1f2f6a45 100644
--- a/drivers/thermal/tegra/soctherm.c
+++ b/drivers/thermal/tegra/soctherm.c
@@ -550,7 +550,7 @@ static int tegra_soctherm_set_hwtrips(struct device *dev,

ret = tz->ops->get_crit_temp(tz, &temperature);
if (ret) {
- dev_warn(dev, "thermtrip: %s: missing critical temperature\n",
+ dev_info(dev, "thermtrip: %s: missing critical temperature\n",
sg->name);
goto set_throttle;
}
@@ -569,7 +569,7 @@ static int tegra_soctherm_set_hwtrips(struct device *dev,
set_throttle:
ret = get_hot_temp(tz, &trip, &temperature);
if (ret) {
- dev_warn(dev, "throttrip: %s: missing hot temperature\n",
+ dev_info(dev, "throttrip: %s: missing hot temperature\n",
sg->name);
return 0;
}
@@ -600,7 +600,7 @@ static int tegra_soctherm_set_hwtrips(struct device *dev,
}

if (i == THROTTLE_SIZE)
- dev_warn(dev, "throttrip: %s: missing throttle cdev\n",
+ dev_info(dev, "throttrip: %s: missing throttle cdev\n",
sg->name);

return 0;
--
2.7.4


2018-11-29 10:11:00

by Wei Ni

[permalink] [raw]
Subject: [PATCH v4 2/3] thermal: tegra: fix memory allocation

Fix memory allocation to store the pointers to
thermal_zone_device.

Signed-off-by: Wei Ni <[email protected]>
Acked-by: Thierry Reding <[email protected]>
---
drivers/thermal/tegra/soctherm.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/thermal/tegra/soctherm.c b/drivers/thermal/tegra/soctherm.c
index 55cc1f2f6a45..375cadbc24cd 100644
--- a/drivers/thermal/tegra/soctherm.c
+++ b/drivers/thermal/tegra/soctherm.c
@@ -1339,7 +1339,7 @@ static int tegra_soctherm_probe(struct platform_device *pdev)
}

tegra->thermctl_tzs = devm_kcalloc(&pdev->dev,
- soc->num_ttgs, sizeof(*z),
+ soc->num_ttgs, sizeof(z),
GFP_KERNEL);
if (!tegra->thermctl_tzs)
return -ENOMEM;
--
2.7.4


2018-11-29 10:12:21

by Wei Ni

[permalink] [raw]
Subject: [PATCH v4 3/3] thermal: tegra: parse sensor id before sensor register

Since different platforms may not support all 4
sensors, so the sensor registration may be failed.
Add codes to parse dt to find sensor id which
need to be registered. So that the registration
can be successful on all platform.

Signed-off-by: Wei Ni <[email protected]>
---
drivers/thermal/tegra/soctherm.c | 46 ++++++++++++++++++++++++++++++++++++++--
1 file changed, 44 insertions(+), 2 deletions(-)

diff --git a/drivers/thermal/tegra/soctherm.c b/drivers/thermal/tegra/soctherm.c
index 375cadbc24cd..bdc660f2794a 100644
--- a/drivers/thermal/tegra/soctherm.c
+++ b/drivers/thermal/tegra/soctherm.c
@@ -1224,6 +1224,42 @@ static void soctherm_init(struct platform_device *pdev)
tegra_soctherm_throttle(&pdev->dev);
}

+static bool tegra_soctherm_find_sensor_id(unsigned int sensor_id)
+{
+ bool ret = false;
+ struct of_phandle_args sensor_specs;
+ struct device_node *np, *sensor_np;
+
+ np = of_find_node_by_name(NULL, "thermal-zones");
+ if (!np)
+ return ret;
+
+ sensor_np = of_get_next_child(np, NULL);
+ for_each_available_child_of_node(np, sensor_np) {
+ if (of_parse_phandle_with_args(sensor_np, "thermal-sensors",
+ "#thermal-sensor-cells",
+ 0, &sensor_specs))
+ continue;
+
+ if (sensor_specs.args_count != 1) {
+ WARN(sensor_specs.args_count != 1,
+ "%s: wrong cells in sensor specifier %d\n",
+ sensor_specs.np->name, sensor_specs.args_count);
+ continue;
+ }
+
+ if (sensor_specs.args[0] == sensor_id) {
+ ret = true;
+ break;
+ }
+ }
+
+ of_node_put(np);
+ of_node_put(sensor_np);
+
+ return ret;
+}
+
static const struct of_device_id tegra_soctherm_of_match[] = {
#ifdef CONFIG_ARCH_TEGRA_124_SOC
{
@@ -1365,13 +1401,16 @@ static int tegra_soctherm_probe(struct platform_device *pdev)
zone->sg = soc->ttgs[i];
zone->ts = tegra;

+ if (!tegra_soctherm_find_sensor_id(soc->ttgs[i]->id))
+ continue;
+
z = devm_thermal_zone_of_sensor_register(&pdev->dev,
soc->ttgs[i]->id, zone,
&tegra_of_thermal_ops);
if (IS_ERR(z)) {
err = PTR_ERR(z);
- dev_err(&pdev->dev, "failed to register sensor: %d\n",
- err);
+ dev_err(&pdev->dev, "failed to register sensor %s: %d\n",
+ soc->ttgs[i]->name, err);
goto disable_clocks;
}

@@ -1434,6 +1473,9 @@ static int __maybe_unused soctherm_resume(struct device *dev)
struct thermal_zone_device *tz;

tz = tegra->thermctl_tzs[soc->ttgs[i]->id];
+ if (!tz)
+ continue;
+
err = tegra_soctherm_set_hwtrips(dev, soc->ttgs[i], tz);
if (err) {
dev_err(&pdev->dev,
--
2.7.4


2018-11-29 16:41:37

by Eduardo Valentin

[permalink] [raw]
Subject: Re: [PATCH v4 1/3] thermal: tegra: remove unnecessary warnings

Hey,

On Thu, Nov 29, 2018 at 06:09:41PM +0800, Wei Ni wrote:
> Convert warnings to info as not all platforms may
> have all the thresholds and sensors enabled.
>
> Signed-off-by: Wei Ni <[email protected]>
> ---
> drivers/thermal/tegra/soctherm.c | 6 +++---
> 1 file changed, 3 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/thermal/tegra/soctherm.c b/drivers/thermal/tegra/soctherm.c
> index ed28110a3535..55cc1f2f6a45 100644
> --- a/drivers/thermal/tegra/soctherm.c
> +++ b/drivers/thermal/tegra/soctherm.c
> @@ -550,7 +550,7 @@ static int tegra_soctherm_set_hwtrips(struct device *dev,
>
> ret = tz->ops->get_crit_temp(tz, &temperature);
> if (ret) {
> - dev_warn(dev, "thermtrip: %s: missing critical temperature\n",
> + dev_info(dev, "thermtrip: %s: missing critical temperature\n",

I am mostly ok with your change in direction. But are you sure this is a
good thing? What about in the case that you have a platform that have
the crit temp and you really failed to .get_crit_temp()?

> sg->name);
> goto set_throttle;
> }
> @@ -569,7 +569,7 @@ static int tegra_soctherm_set_hwtrips(struct device *dev,
> set_throttle:
> ret = get_hot_temp(tz, &trip, &temperature);
> if (ret) {
> - dev_warn(dev, "throttrip: %s: missing hot temperature\n",
> + dev_info(dev, "throttrip: %s: missing hot temperature\n",
> sg->name);
> return 0;
> }
> @@ -600,7 +600,7 @@ static int tegra_soctherm_set_hwtrips(struct device *dev,
> }
>
> if (i == THROTTLE_SIZE)
> - dev_warn(dev, "throttrip: %s: missing throttle cdev\n",
> + dev_info(dev, "throttrip: %s: missing throttle cdev\n",
> sg->name);
>
> return 0;
> --
> 2.7.4
>

2018-11-29 16:48:51

by Eduardo Valentin

[permalink] [raw]
Subject: Re: [PATCH v4 3/3] thermal: tegra: parse sensor id before sensor register

On Thu, Nov 29, 2018 at 06:09:43PM +0800, Wei Ni wrote:
> Since different platforms may not support all 4
> sensors, so the sensor registration may be failed.
> Add codes to parse dt to find sensor id which
> need to be registered. So that the registration
> can be successful on all platform.
>
> Signed-off-by: Wei Ni <[email protected]>
> ---
> drivers/thermal/tegra/soctherm.c | 46 ++++++++++++++++++++++++++++++++++++++--
> 1 file changed, 44 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/thermal/tegra/soctherm.c b/drivers/thermal/tegra/soctherm.c
> index 375cadbc24cd..bdc660f2794a 100644
> --- a/drivers/thermal/tegra/soctherm.c
> +++ b/drivers/thermal/tegra/soctherm.c
> @@ -1224,6 +1224,42 @@ static void soctherm_init(struct platform_device *pdev)
> tegra_soctherm_throttle(&pdev->dev);
> }
>
> +static bool tegra_soctherm_find_sensor_id(unsigned int sensor_id)
> +{
> + bool ret = false;
> + struct of_phandle_args sensor_specs;
> + struct device_node *np, *sensor_np;
> +
> + np = of_find_node_by_name(NULL, "thermal-zones");
> + if (!np)
> + return ret;
> +
> + sensor_np = of_get_next_child(np, NULL);
> + for_each_available_child_of_node(np, sensor_np) {
> + if (of_parse_phandle_with_args(sensor_np, "thermal-sensors",
> + "#thermal-sensor-cells",
> + 0, &sensor_specs))
> + continue;
> +
> + if (sensor_specs.args_count != 1) {
> + WARN(sensor_specs.args_count != 1,
> + "%s: wrong cells in sensor specifier %d\n",
> + sensor_specs.np->name, sensor_specs.args_count);
> + continue;
> + }
> +
> + if (sensor_specs.args[0] == sensor_id) {
> + ret = true;
> + break;
> + }
> + }
> +
> + of_node_put(np);
> + of_node_put(sensor_np);
> +
> + return ret;
> +}
> +
> static const struct of_device_id tegra_soctherm_of_match[] = {
> #ifdef CONFIG_ARCH_TEGRA_124_SOC
> {
> @@ -1365,13 +1401,16 @@ static int tegra_soctherm_probe(struct platform_device *pdev)
> zone->sg = soc->ttgs[i];
> zone->ts = tegra;
>
> + if (!tegra_soctherm_find_sensor_id(soc->ttgs[i]->id))
> + continue;
> +


Instead of matching driver id with DT id presence, wouldnt make sense to
simply have DT with the sensors that makes sense for that platform?

I am failing to understand why you need to go over and find ids.

> z = devm_thermal_zone_of_sensor_register(&pdev->dev,
> soc->ttgs[i]->id, zone,
> &tegra_of_thermal_ops);
> if (IS_ERR(z)) {
> err = PTR_ERR(z);
> - dev_err(&pdev->dev, "failed to register sensor: %d\n",
> - err);
> + dev_err(&pdev->dev, "failed to register sensor %s: %d\n",
> + soc->ttgs[i]->name, err);
> goto disable_clocks;
> }
>
> @@ -1434,6 +1473,9 @@ static int __maybe_unused soctherm_resume(struct device *dev)
> struct thermal_zone_device *tz;
>
> tz = tegra->thermctl_tzs[soc->ttgs[i]->id];
> + if (!tz)
> + continue;
> +
> err = tegra_soctherm_set_hwtrips(dev, soc->ttgs[i], tz);
> if (err) {
> dev_err(&pdev->dev,
> --
> 2.7.4
>

2018-11-30 02:53:45

by Wei Ni

[permalink] [raw]
Subject: Re: [PATCH v4 1/3] thermal: tegra: remove unnecessary warnings



On 30/11/2018 12:39 AM, Eduardo Valentin wrote:
> Hey,
>
> On Thu, Nov 29, 2018 at 06:09:41PM +0800, Wei Ni wrote:
>> Convert warnings to info as not all platforms may
>> have all the thresholds and sensors enabled.
>>
>> Signed-off-by: Wei Ni <[email protected]>
>> ---
>> drivers/thermal/tegra/soctherm.c | 6 +++---
>> 1 file changed, 3 insertions(+), 3 deletions(-)
>>
>> diff --git a/drivers/thermal/tegra/soctherm.c b/drivers/thermal/tegra/soctherm.c
>> index ed28110a3535..55cc1f2f6a45 100644
>> --- a/drivers/thermal/tegra/soctherm.c
>> +++ b/drivers/thermal/tegra/soctherm.c
>> @@ -550,7 +550,7 @@ static int tegra_soctherm_set_hwtrips(struct device *dev,
>>
>> ret = tz->ops->get_crit_temp(tz, &temperature);
>> if (ret) {
>> - dev_warn(dev, "thermtrip: %s: missing critical temperature\n",
>> + dev_info(dev, "thermtrip: %s: missing critical temperature\n",
>
> I am mostly ok with your change in direction. But are you sure this is a
> good thing? What about in the case that you have a platform that have
> the crit temp and you really failed to .get_crit_temp()?

If we set the crit temp in DT, but failed to .get_crit_temp(), it mean
the thermal framework have some problems. Since the critical trip is
very important, may be we should still keep "dev_warn" in here?

>
>> sg->name);
>> goto set_throttle;
>> }
>> @@ -569,7 +569,7 @@ static int tegra_soctherm_set_hwtrips(struct device *dev,
>> set_throttle:
>> ret = get_hot_temp(tz, &trip, &temperature);
>> if (ret) {
>> - dev_warn(dev, "throttrip: %s: missing hot temperature\n",
>> + dev_info(dev, "throttrip: %s: missing hot temperature\n",
>> sg->name);
>> return 0;
>> }
>> @@ -600,7 +600,7 @@ static int tegra_soctherm_set_hwtrips(struct device *dev,
>> }
>>
>> if (i == THROTTLE_SIZE)
>> - dev_warn(dev, "throttrip: %s: missing throttle cdev\n",
>> + dev_info(dev, "throttrip: %s: missing throttle cdev\n",
>> sg->name);
>>
>> return 0;
>> --
>> 2.7.4
>>

2018-11-30 03:01:19

by Wei Ni

[permalink] [raw]
Subject: Re: [PATCH v4 3/3] thermal: tegra: parse sensor id before sensor register



On 30/11/2018 12:46 AM, Eduardo Valentin wrote:
> On Thu, Nov 29, 2018 at 06:09:43PM +0800, Wei Ni wrote:
>> Since different platforms may not support all 4
>> sensors, so the sensor registration may be failed.
>> Add codes to parse dt to find sensor id which
>> need to be registered. So that the registration
>> can be successful on all platform.
>>
>> Signed-off-by: Wei Ni <[email protected]>
>> ---
>> drivers/thermal/tegra/soctherm.c | 46 ++++++++++++++++++++++++++++++++++++++--
>> 1 file changed, 44 insertions(+), 2 deletions(-)
>>
>> diff --git a/drivers/thermal/tegra/soctherm.c b/drivers/thermal/tegra/soctherm.c
>> index 375cadbc24cd..bdc660f2794a 100644
>> --- a/drivers/thermal/tegra/soctherm.c
>> +++ b/drivers/thermal/tegra/soctherm.c
>> @@ -1224,6 +1224,42 @@ static void soctherm_init(struct platform_device *pdev)
>> tegra_soctherm_throttle(&pdev->dev);
>> }
>>
>> +static bool tegra_soctherm_find_sensor_id(unsigned int sensor_id)
>> +{
>> + bool ret = false;
>> + struct of_phandle_args sensor_specs;
>> + struct device_node *np, *sensor_np;
>> +
>> + np = of_find_node_by_name(NULL, "thermal-zones");
>> + if (!np)
>> + return ret;
>> +
>> + sensor_np = of_get_next_child(np, NULL);
>> + for_each_available_child_of_node(np, sensor_np) {
>> + if (of_parse_phandle_with_args(sensor_np, "thermal-sensors",
>> + "#thermal-sensor-cells",
>> + 0, &sensor_specs))
>> + continue;
>> +
>> + if (sensor_specs.args_count != 1) {
>> + WARN(sensor_specs.args_count != 1,
>> + "%s: wrong cells in sensor specifier %d\n",
>> + sensor_specs.np->name, sensor_specs.args_count);
>> + continue;
>> + }
>> +
>> + if (sensor_specs.args[0] == sensor_id) {
>> + ret = true;
>> + break;
>> + }
>> + }
>> +
>> + of_node_put(np);
>> + of_node_put(sensor_np);
>> +
>> + return ret;
>> +}
>> +
>> static const struct of_device_id tegra_soctherm_of_match[] = {
>> #ifdef CONFIG_ARCH_TEGRA_124_SOC
>> {
>> @@ -1365,13 +1401,16 @@ static int tegra_soctherm_probe(struct platform_device *pdev)
>> zone->sg = soc->ttgs[i];
>> zone->ts = tegra;
>>
>> + if (!tegra_soctherm_find_sensor_id(soc->ttgs[i]->id))
>> + continue;
>> +
>
>
> Instead of matching driver id with DT id presence, wouldnt make sense to
> simply have DT with the sensors that makes sense for that platform?
>
> I am failing to understand why you need to go over and find ids.

As discussed with Daniel several days ago, this driver will always try
to register 4 thermal zones, including cpu, gpu, mem and pll, but some
platform doesn't need to support all of them, so the thermal zone
registration will be failed. In previous patches, we just ignore the
failure and continue to register next sensors, but Daniel think it's not
good. And per his suggestion, we refer to the qoriq thermal driver to
parse dt to get sensor_id, so that we can make the registration to be
successful.

Wei.

>
>> z = devm_thermal_zone_of_sensor_register(&pdev->dev,
>> soc->ttgs[i]->id, zone,
>> &tegra_of_thermal_ops);
>> if (IS_ERR(z)) {
>> err = PTR_ERR(z);
>> - dev_err(&pdev->dev, "failed to register sensor: %d\n",
>> - err);
>> + dev_err(&pdev->dev, "failed to register sensor %s: %d\n",
>> + soc->ttgs[i]->name, err);
>> goto disable_clocks;
>> }
>>
>> @@ -1434,6 +1473,9 @@ static int __maybe_unused soctherm_resume(struct device *dev)
>> struct thermal_zone_device *tz;
>>
>> tz = tegra->thermctl_tzs[soc->ttgs[i]->id];
>> + if (!tz)
>> + continue;
>> +
>> err = tegra_soctherm_set_hwtrips(dev, soc->ttgs[i], tz);
>> if (err) {
>> dev_err(&pdev->dev,
>> --
>> 2.7.4
>>