All of lore.kernel.org
 help / color / mirror / Atom feed
From: Daniel Lezcano <daniel.lezcano@linaro.org>
To: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
Cc: rafael@kernel.org, rui.zhang@intel.com, lukasz.luba@arm.com,
	linux-pm@vger.kernel.org, linux-kernel@vger.kernel.org,
	kernel@collabora.com
Subject: Re: [RFC PATCH 26/26] thermal: Introduce thermal zones names
Date: Tue, 16 Jan 2024 10:14:18 +0100	[thread overview]
Message-ID: <d824d351-b1b1-46e3-86ac-f4a6b42c89fc@linaro.org> (raw)
In-Reply-To: <20231221124825.149141-27-angelogioacchino.delregno@collabora.com>

On 21/12/2023 13:48, AngeloGioacchino Del Regno wrote:
> Currently thermal zones have a "type" but this is often used, and
> referenced, as a name instead in multiple kernel drivers that are
> either registering a zone or grabbing a thermal zone handle and
> unfortunately this is a kind of abuse/misuse of the thermal zone
> concept of "type".
> 
> In order to disambiguate name<->type and to actually provide an
> accepted way of giving a specific name to a thermal zone for both
> platform drivers and devicetree-defined zones, add a new "name"
> member in the main thermal_zone_device structure, and also to the
> thermal_zone_device_params structure which is used to register a
> thermal zone device.
> 
> This will enforce the following constraints:
>   - Multiple thermal zones may be of the same "type" (no change);
>   - A thermal zone may have a *unique* name: trying to register
>     a new zone with the same name as an already present one will
>     produce a failure;
> ---
>   drivers/thermal/thermal_core.c  | 34 ++++++++++++++++++++++++++++++---
>   drivers/thermal/thermal_of.c    |  1 +
>   drivers/thermal/thermal_sysfs.c |  9 +++++++++
>   drivers/thermal/thermal_trace.h | 17 +++++++++++------
>   include/linux/thermal.h         |  4 ++++
>   5 files changed, 56 insertions(+), 9 deletions(-)
> 
> diff --git a/drivers/thermal/thermal_core.c b/drivers/thermal/thermal_core.c
> index 9eb0200a85ff..adf2ac8113e1 100644
> --- a/drivers/thermal/thermal_core.c
> +++ b/drivers/thermal/thermal_core.c
> @@ -1238,8 +1238,8 @@ EXPORT_SYMBOL_GPL(thermal_zone_get_crit_temp);
>   struct thermal_zone_device *thermal_zone_device_register(struct thermal_zone_device_params *tzdp)
>   {
>   	struct thermal_zone_device *tz;
> -	int id;
> -	int result;
> +	int id, tz_name_len;
> +	int result = 0;
>   	struct thermal_governor *governor;
>   
>   	if (!tzdp->type || strlen(tzdp->type) == 0) {
> @@ -1248,11 +1248,36 @@ struct thermal_zone_device *thermal_zone_device_register(struct thermal_zone_dev
>   	}
>   
>   	if (strlen(tzdp->type) >= THERMAL_NAME_LENGTH) {
> -		pr_err("Thermal zone name (%s) too long, should be under %d chars\n",
> +		pr_err("Thermal zone type (%s) too long, should be under %d chars\n",
>   		       tzdp->type, THERMAL_NAME_LENGTH);
>   		return ERR_PTR(-EINVAL);

I would keep that as is and do second round of changes to clarify the 
usage of ->type

>   	}
>   
> +	tz_name_len = tzdp->name ? strlen(tzdp->name) : 0;

I suggest to change to a const char * and no longer limit to 
THERMAL_NAME_LENGTH.

> +	if (tz_name_len) {
> +		struct thermal_zone_device *pos;
> +
> +		if (tz_name_len >= THERMAL_NAME_LENGTH) {
> +			pr_err("Thermal zone name (%s) too long, should be under %d chars\n",
> +			       tzdp->name, THERMAL_NAME_LENGTH);
> +			return ERR_PTR(-EINVAL);
> +		}
> +
> +		mutex_lock(&thermal_list_lock);
> +		list_for_each_entry(pos, &thermal_tz_list, node)
> +			if (!strncasecmp(tzdp->name, pos->name, THERMAL_NAME_LENGTH)) {
> +				result = -EEXIST;
> +				break;
> +			}
> +		mutex_unlock(&thermal_list_lock);
> +
> +		if (result) {
> +			pr_err("Thermal zone name (%s) already exists and must be unique\n",
> +			       tzdp->name);
> +			return ERR_PTR(result);
> +		}

Perhaps a lookup function would be more adequate. What about reusing 
thermal_zone_get_by_name() and search with tz->name if it is !NULL, 
tz->type otherwise ?

> +	}
> +
>   	/*
>   	 * Max trip count can't exceed 31 as the "mask >> num_trips" condition.
>   	 * For example, shifting by 32 will result in compiler warning:
> @@ -1307,6 +1332,9 @@ struct thermal_zone_device *thermal_zone_device_register(struct thermal_zone_dev
>   	tz->id = id;
>   	strscpy(tz->type, tzdp->type, sizeof(tz->type));
>   
> +	if (tz_name_len)
> +		strscpy(tz->name, tzdp->name, sizeof(tzdp->name));
> +
>   	if (!tzdp->ops->critical)
>   		tzdp->ops->critical = thermal_zone_device_critical;
>   
> diff --git a/drivers/thermal/thermal_of.c b/drivers/thermal/thermal_of.c
> index 62a903ad649f..eaacc140abeb 100644
> --- a/drivers/thermal/thermal_of.c
> +++ b/drivers/thermal/thermal_of.c
> @@ -486,6 +486,7 @@ static struct thermal_zone_device *thermal_of_zone_register(struct device_node *
>   		ret = PTR_ERR(np);
>   		goto out_kfree_of_ops;
>   	}
> +	tzdp.name = np->name;
>   	tzdp.type = np->name;
>   
>   	tzdp.trips = thermal_of_trips_init(np, &tzdp.num_trips);
> diff --git a/drivers/thermal/thermal_sysfs.c b/drivers/thermal/thermal_sysfs.c
> index f52af8a3b4b5..f4002fa6caa2 100644
> --- a/drivers/thermal/thermal_sysfs.c
> +++ b/drivers/thermal/thermal_sysfs.c
> @@ -23,6 +23,14 @@
>   
>   /* sys I/F for thermal zone */
>   
> +static ssize_t
> +name_show(struct device *dev, struct device_attribute *attr, char *buf)
> +{
> +	struct thermal_zone_device *tz = to_thermal_zone(dev);
> +
> +	return sprintf(buf, "%s\n", tz->name);
> +}
> +
>   static ssize_t
>   type_show(struct device *dev, struct device_attribute *attr, char *buf)
>   {
> @@ -341,6 +349,7 @@ create_s32_tzp_attr(offset);
>    * All the attributes created for tzp (create_s32_tzp_attr) also are always
>    * present on the sysfs interface.
>    */
> +static DEVICE_ATTR_RO(name);
>   static DEVICE_ATTR_RO(type);
>   static DEVICE_ATTR_RO(temp);
>   static DEVICE_ATTR_RW(policy);
> diff --git a/drivers/thermal/thermal_trace.h b/drivers/thermal/thermal_trace.h
> index 459c8ce6cf3b..c9dbae1e3b9e 100644
> --- a/drivers/thermal/thermal_trace.h
> +++ b/drivers/thermal/thermal_trace.h
> @@ -28,6 +28,7 @@ TRACE_EVENT(thermal_temperature,
>   	TP_ARGS(tz),
>   
>   	TP_STRUCT__entry(
> +		__string(thermal_zone_name, tz->name)
>   		__string(thermal_zone, tz->type)
>   		__field(int, id)
>   		__field(int, temp_prev)
> @@ -35,15 +36,16 @@ TRACE_EVENT(thermal_temperature,
>   	),
>   
>   	TP_fast_assign(
> +		__assign_str(thermal_zone_name, tz->name);
>   		__assign_str(thermal_zone, tz->type);
>   		__entry->id = tz->id;
>   		__entry->temp_prev = tz->last_temperature;
>   		__entry->temp = tz->temperature;
>   	),
>   
> -	TP_printk("thermal_zone=%s id=%d temp_prev=%d temp=%d",
> -		__get_str(thermal_zone), __entry->id, __entry->temp_prev,
> -		__entry->temp)
> +	TP_printk("thermal_zone=%s name=%s id=%d temp_prev=%d temp=%d",
> +		  __get_str(thermal_zone), __get_str(thermal_zone_name),
> +		  __entry->id, __entry->temp_prev, __entry->temp)
>   );
>   
>   TRACE_EVENT(cdev_update,
> @@ -73,6 +75,7 @@ TRACE_EVENT(thermal_zone_trip,
>   	TP_ARGS(tz, trip, trip_type),
>   
>   	TP_STRUCT__entry(
> +		__string(thermal_zone_name, tz->name)
>   		__string(thermal_zone, tz->type)
>   		__field(int, id)
>   		__field(int, trip)
> @@ -80,15 +83,17 @@ TRACE_EVENT(thermal_zone_trip,
>   	),
>   
>   	TP_fast_assign(
> +		__assign_str(thermal_zone_name, tz->name);
>   		__assign_str(thermal_zone, tz->type);
>   		__entry->id = tz->id;
>   		__entry->trip = trip;
>   		__entry->trip_type = trip_type;
>   	),
>   
> -	TP_printk("thermal_zone=%s id=%d trip=%d trip_type=%s",
> -		__get_str(thermal_zone), __entry->id, __entry->trip,
> -		show_tzt_type(__entry->trip_type))
> +	TP_printk("thermal_zone=%s name=%s id=%d trip=%d trip_type=%s",
> +		  __get_str(thermal_zone), __get_str(thermal_zone_name),
> +		  __entry->id, __entry->trip,
> +		  show_tzt_type(__entry->trip_type))
>   );

For now, I think we can keep the traces as they are and keep passing the 
tz->type. Then we can replace tz->type by tz->name without changing the 
trace format.

>   #ifdef CONFIG_CPU_THERMAL
> diff --git a/include/linux/thermal.h b/include/linux/thermal.h
> index 84b62575d93a..a06521eda162 100644
> --- a/include/linux/thermal.h
> +++ b/include/linux/thermal.h
> @@ -115,6 +115,7 @@ struct thermal_cooling_device {
>   /**
>    * struct thermal_zone_device - structure for a thermal zone
>    * @id:		unique id number for each thermal zone
> + * @name:       name of the thermal zone device
>    * @type:	the thermal zone device type
>    * @device:	&struct device for this thermal zone
>    * @removal:	removal completion
> @@ -155,6 +156,7 @@ struct thermal_cooling_device {
>    */
>   struct thermal_zone_device {
>   	int id;
> +	char name[THERMAL_NAME_LENGTH];
>   	char type[THERMAL_NAME_LENGTH];
>   	struct device device;
>   	struct completion removal;
> @@ -260,6 +262,7 @@ struct thermal_zone_params {
>   
>   /**
>    * struct thermal_zone_device_params - parameters for a thermal zone device
> + * @name:		name of the thermal zone device
>    * @type:		the thermal zone device type
>    * @tzp:		thermal zone platform parameters
>    * @ops:		standard thermal zone device callbacks
> @@ -274,6 +277,7 @@ struct thermal_zone_params {
>    *			driven systems)
>    */
>   struct thermal_zone_device_params {
> +	const char *name;
>   	const char *type;
>   	struct thermal_zone_params tzp;
>   	struct thermal_zone_device_ops *ops;

-- 
<http://www.linaro.org/> Linaro.org │ Open source software for ARM SoCs

Follow Linaro:  <http://www.facebook.com/pages/Linaro> Facebook |
<http://twitter.com/#!/linaroorg> Twitter |
<http://www.linaro.org/linaro-blog/> Blog


  reply	other threads:[~2024-01-16  9:14 UTC|newest]

Thread overview: 42+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-12-21 12:47 [RFC PATCH 00/26] Add thermal zones names and new registration func AngeloGioacchino Del Regno
2023-12-21 12:48 ` [RFC PATCH 01/26] thermal: Introduce thermal_zone_device_register() and params structure AngeloGioacchino Del Regno
2024-01-15 12:39   ` Daniel Lezcano
2024-01-16  9:58     ` AngeloGioacchino Del Regno
2024-01-18  9:39       ` AngeloGioacchino Del Regno
2024-01-18  9:46         ` AngeloGioacchino Del Regno
2024-01-22 19:19         ` Daniel Lezcano
2024-01-23 10:58           ` AngeloGioacchino Del Regno
2024-01-22 19:19         ` Daniel Lezcano
2023-12-21 12:48 ` [RFC PATCH 02/26] thermal/of: Migrate to thermal_zone_device_register() AngeloGioacchino Del Regno
2024-01-15 17:17   ` Daniel Lezcano
2024-01-16  9:50     ` AngeloGioacchino Del Regno
2023-12-21 12:48 ` [RFC PATCH 03/26] platform/x86: acerhdf: " AngeloGioacchino Del Regno
2023-12-21 12:48 ` [RFC PATCH 04/26] ACPI: thermal: " AngeloGioacchino Del Regno
2023-12-21 12:48 ` [RFC PATCH 05/26] thermal/drivers/da9062: " AngeloGioacchino Del Regno
2023-12-21 12:48 ` [RFC PATCH 06/26] thermal/drivers/imx: " AngeloGioacchino Del Regno
2023-12-21 12:48 ` [RFC PATCH 07/26] thermal/drivers/rcar: " AngeloGioacchino Del Regno
2023-12-21 12:48 ` [RFC PATCH 08/26] thermal/drivers/st: " AngeloGioacchino Del Regno
2023-12-21 12:48 ` [RFC PATCH 09/26] thermal: intel: pch_thermal: " AngeloGioacchino Del Regno
2023-12-21 12:48 ` [RFC PATCH 10/26] thermal: intel: quark_dts: " AngeloGioacchino Del Regno
2023-12-21 12:48 ` [RFC PATCH 11/26] thermal: intel: soc_dts_iosf: " AngeloGioacchino Del Regno
2023-12-21 12:48 ` [RFC PATCH 12/26] thermal: intel: int340x: " AngeloGioacchino Del Regno
2023-12-21 12:48 ` [RFC PATCH 13/26] thermal: int340x: processor: " AngeloGioacchino Del Regno
2023-12-21 12:48 ` [RFC PATCH 14/26] thermal: intel: x86_pkg_temp: " AngeloGioacchino Del Regno
2023-12-21 12:48 ` [RFC PATCH 15/26] power: supply: core: " AngeloGioacchino Del Regno
2023-12-21 12:48 ` [RFC PATCH 16/26] thermal/drivers/armada: " AngeloGioacchino Del Regno
2023-12-21 12:48 ` [RFC PATCH 17/26] thermal/drivers/dove: " AngeloGioacchino Del Regno
2023-12-21 12:48 ` [RFC PATCH 18/26] thermal/drivers/kirkwood: " AngeloGioacchino Del Regno
2023-12-21 12:48 ` [RFC PATCH 19/26] thermal/drivers/spear: " AngeloGioacchino Del Regno
2023-12-21 12:48 ` [RFC PATCH 20/26] thermal/drivers/int340x: " AngeloGioacchino Del Regno
2023-12-21 12:48 ` [RFC PATCH 21/26] wifi: iwlwifi: mvm: " AngeloGioacchino Del Regno
2023-12-21 12:48 ` [RFC PATCH 22/26] cxgb4: " AngeloGioacchino Del Regno
2023-12-21 12:48 ` [RFC PATCH 23/26] mlxsw: core_thermal: " AngeloGioacchino Del Regno
2023-12-21 12:48 ` [RFC PATCH 24/26] fixup! power: supply: core: " AngeloGioacchino Del Regno
2023-12-21 12:48 ` [RFC PATCH 25/26] thermal: Remove tripless_zone_register and register_with_trips functions AngeloGioacchino Del Regno
2023-12-21 12:48 ` [RFC PATCH 26/26] thermal: Introduce thermal zones names AngeloGioacchino Del Regno
2024-01-16  9:14   ` Daniel Lezcano [this message]
2024-01-16  9:45     ` AngeloGioacchino Del Regno
2024-01-16 11:30       ` Daniel Lezcano
2024-01-16 11:37         ` AngeloGioacchino Del Regno
2023-12-21 13:38 ` [RFC PATCH 00/26] Add thermal zones names and new registration func Rafael J. Wysocki
2023-12-21 13:54   ` AngeloGioacchino Del Regno

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=d824d351-b1b1-46e3-86ac-f4a6b42c89fc@linaro.org \
    --to=daniel.lezcano@linaro.org \
    --cc=angelogioacchino.delregno@collabora.com \
    --cc=kernel@collabora.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-pm@vger.kernel.org \
    --cc=lukasz.luba@arm.com \
    --cc=rafael@kernel.org \
    --cc=rui.zhang@intel.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.