From: "Rafael J. Wysocki" <rjw@rjwysocki.net>
To: Linux PM <linux-pm@vger.kernel.org>
Cc: Lukasz Luba <lukasz.luba@arm.com>,
LKML <linux-kernel@vger.kernel.org>,
Daniel Lezcano <daniel.lezcano@linaro.org>,
Stanislaw Gruszka <stanislaw.gruszka@linux.intel.com>,
Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>,
Zhang Rui <rui.zhang@intel.com>,
netdev@vger.kernel.org, Ido Schimmel <idosch@nvidia.com>,
Petr Machata <petrm@nvidia.com>,
Miri Korenblit <miriam.rachel.korenblit@intel.com>,
linux-wireless@vger.kernel.org, Shawn Guo <shawnguo@kernel.org>,
Sascha Hauer <s.hauer@pengutronix.de>,
Pengutronix Kernel Team <kernel@pengutronix.de>,
Manaf Meethalavalappu Pallikunhi <quic_manafm@quicinc.com>
Subject: [PATCH v2 2/9] thermal: core: Add flags to struct thermal_trip
Date: Mon, 12 Feb 2024 19:31:28 +0100 [thread overview]
Message-ID: <2173914.irdbgypaU6@kreacher> (raw)
In-Reply-To: <6017196.lOV4Wx5bFT@kreacher>
From: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
In order to allow thermal zone creators to specify the writability of
trip point temperature and hysteresis on a per-trip basis, add a flags
field to struct thermal_trip and define flags to represent the desired
trip properties.
Also make thermal_zone_device_register_with_trips() set the
THERMAL_TRIP_FLAG_RW_TEMP flag for all trips covered by the writable
trips mask passed to it and modify the thermal sysfs code to look at
the trip flags instead of using the writable trips mask directly or
checking the presence of the .set_trip_hyst() zone callback.
Additionally, make trip_point_temp_store() and trip_point_hyst_store()
fail with an error code if the trip passed to one of them has
THERMAL_TRIP_FLAG_RW_TEMP or THERMAL_TRIP_FLAG_RW_HYST,
respectively, clear in its flags.
No intentional functional impact.
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
---
v1 -> v2:
* Rename trip flags (Stanislaw).
---
drivers/thermal/thermal_core.c | 12 +++++++++++-
drivers/thermal/thermal_core.h | 2 +-
drivers/thermal/thermal_sysfs.c | 28 +++++++++++++++++++---------
include/linux/thermal.h | 7 +++++++
4 files changed, 38 insertions(+), 11 deletions(-)
Index: linux-pm/include/linux/thermal.h
===================================================================
--- linux-pm.orig/include/linux/thermal.h
+++ linux-pm/include/linux/thermal.h
@@ -64,15 +64,23 @@ enum thermal_notify_event {
* @threshold: trip crossing notification threshold miliCelsius
* @type: trip point type
* @priv: pointer to driver data associated with this trip
+ * @flags: flags representing binary properties of the trip
*/
struct thermal_trip {
int temperature;
int hysteresis;
int threshold;
enum thermal_trip_type type;
+ u8 flags;
void *priv;
};
+#define THERMAL_TRIP_FLAG_RW_TEMP BIT(0)
+#define THERMAL_TRIP_FLAG_RW_HYST BIT(1)
+
+#define THERMAL_TRIP_FLAG_MASK_RW (THERMAL_TRIP_FLAG_RW_TEMP | \
+ THERMAL_TRIP_FLAG_RW_HYST)
+
struct thermal_zone_device_ops {
int (*bind) (struct thermal_zone_device *,
struct thermal_cooling_device *);
Index: linux-pm/drivers/thermal/thermal_core.c
===================================================================
--- linux-pm.orig/drivers/thermal/thermal_core.c
+++ linux-pm/drivers/thermal/thermal_core.c
@@ -1356,13 +1356,23 @@ thermal_zone_device_register_with_trips(
tz->devdata = devdata;
tz->trips = trips;
tz->num_trips = num_trips;
+ if (num_trips > 0) {
+ struct thermal_trip *trip;
+
+ for_each_trip(tz, trip) {
+ if (mask & 1)
+ trip->flags |= THERMAL_TRIP_FLAG_RW_TEMP;
+
+ mask >>= 1;
+ }
+ }
thermal_set_delay_jiffies(&tz->passive_delay_jiffies, passive_delay);
thermal_set_delay_jiffies(&tz->polling_delay_jiffies, polling_delay);
/* sys I/F */
/* Add nodes that are always present via .groups */
- result = thermal_zone_create_device_groups(tz, mask);
+ result = thermal_zone_create_device_groups(tz);
if (result)
goto remove_id;
Index: linux-pm/drivers/thermal/thermal_core.h
===================================================================
--- linux-pm.orig/drivers/thermal/thermal_core.h
+++ linux-pm/drivers/thermal/thermal_core.h
@@ -131,7 +131,7 @@ void thermal_zone_trip_updated(struct th
int __thermal_zone_get_temp(struct thermal_zone_device *tz, int *temp);
/* sysfs I/F */
-int thermal_zone_create_device_groups(struct thermal_zone_device *, int);
+int thermal_zone_create_device_groups(struct thermal_zone_device *tz);
void thermal_zone_destroy_device_groups(struct thermal_zone_device *);
void thermal_cooling_device_setup_sysfs(struct thermal_cooling_device *);
void thermal_cooling_device_destroy_sysfs(struct thermal_cooling_device *cdev);
Index: linux-pm/drivers/thermal/thermal_sysfs.c
===================================================================
--- linux-pm.orig/drivers/thermal/thermal_sysfs.c
+++ linux-pm/drivers/thermal/thermal_sysfs.c
@@ -122,6 +122,11 @@ trip_point_temp_store(struct device *dev
trip = &tz->trips[trip_id];
+ if (!(trip->flags & THERMAL_TRIP_FLAG_RW_TEMP)) {
+ ret = -EPERM;
+ goto unlock;
+ }
+
if (temp != trip->temperature) {
if (tz->ops->set_trip_temp) {
ret = tz->ops->set_trip_temp(tz, trip_id, temp);
@@ -173,6 +178,11 @@ trip_point_hyst_store(struct device *dev
trip = &tz->trips[trip_id];
+ if (!(trip->flags & THERMAL_TRIP_FLAG_RW_HYST)) {
+ ret = -EPERM;
+ goto unlock;
+ }
+
if (hyst != trip->hysteresis) {
if (tz->ops->set_trip_hyst) {
ret = tz->ops->set_trip_hyst(tz, trip_id, hyst);
@@ -392,17 +402,16 @@ static const struct attribute_group *the
/**
* create_trip_attrs() - create attributes for trip points
* @tz: the thermal zone device
- * @mask: Writeable trip point bitmap.
*
* helper function to instantiate sysfs entries for every trip
* point and its properties of a struct thermal_zone_device.
*
* Return: 0 on success, the proper error value otherwise.
*/
-static int create_trip_attrs(struct thermal_zone_device *tz, int mask)
+static int create_trip_attrs(struct thermal_zone_device *tz)
{
+ const struct thermal_trip *trip;
struct attribute **attrs;
- int indx;
/* This function works only for zones with at least one trip */
if (tz->num_trips <= 0)
@@ -437,7 +446,9 @@ static int create_trip_attrs(struct ther
return -ENOMEM;
}
- for (indx = 0; indx < tz->num_trips; indx++) {
+ for_each_trip(tz, trip) {
+ int indx = thermal_zone_trip_id(tz, trip);
+
/* create trip type attribute */
snprintf(tz->trip_type_attrs[indx].name, THERMAL_NAME_LENGTH,
"trip_point_%d_type", indx);
@@ -458,7 +469,7 @@ static int create_trip_attrs(struct ther
tz->trip_temp_attrs[indx].name;
tz->trip_temp_attrs[indx].attr.attr.mode = S_IRUGO;
tz->trip_temp_attrs[indx].attr.show = trip_point_temp_show;
- if (mask & (1 << indx)) {
+ if (trip->flags & THERMAL_TRIP_FLAG_RW_TEMP) {
tz->trip_temp_attrs[indx].attr.attr.mode |= S_IWUSR;
tz->trip_temp_attrs[indx].attr.store =
trip_point_temp_store;
@@ -473,7 +484,7 @@ static int create_trip_attrs(struct ther
tz->trip_hyst_attrs[indx].name;
tz->trip_hyst_attrs[indx].attr.attr.mode = S_IRUGO;
tz->trip_hyst_attrs[indx].attr.show = trip_point_hyst_show;
- if (tz->ops->set_trip_hyst) {
+ if (trip->flags & THERMAL_TRIP_FLAG_RW_HYST) {
tz->trip_hyst_attrs[indx].attr.attr.mode |= S_IWUSR;
tz->trip_hyst_attrs[indx].attr.store =
trip_point_hyst_store;
@@ -505,8 +516,7 @@ static void destroy_trip_attrs(struct th
kfree(tz->trips_attribute_group.attrs);
}
-int thermal_zone_create_device_groups(struct thermal_zone_device *tz,
- int mask)
+int thermal_zone_create_device_groups(struct thermal_zone_device *tz)
{
const struct attribute_group **groups;
int i, size, result;
@@ -522,7 +532,7 @@ int thermal_zone_create_device_groups(st
groups[i] = thermal_zone_attribute_groups[i];
if (tz->num_trips) {
- result = create_trip_attrs(tz, mask);
+ result = create_trip_attrs(tz);
if (result) {
kfree(groups);
next prev parent reply other threads:[~2024-02-12 18:42 UTC|newest]
Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-02-12 18:25 [PATCH v2 0/9] thermal: Writable trip points handling rework Rafael J. Wysocki
2024-02-12 18:26 ` [PATCH v2 1/9] thermal: Get rid of CONFIG_THERMAL_WRITABLE_TRIPS Rafael J. Wysocki
2024-02-22 13:50 ` Daniel Lezcano
2024-02-12 18:31 ` Rafael J. Wysocki [this message]
2024-02-22 14:36 ` [PATCH v2 2/9] thermal: core: Add flags to struct thermal_trip Daniel Lezcano
2024-02-22 15:36 ` Daniel Lezcano
2024-02-22 15:51 ` Rafael J. Wysocki
2024-02-22 16:13 ` Rafael J. Wysocki
2024-02-22 19:48 ` [PATCH v2.1 " Rafael J. Wysocki
2024-02-27 11:21 ` Rafael J. Wysocki
2024-02-12 18:32 ` [PATCH v2 3/9] thermal: core: Drop the .set_trip_hyst() thermal zone operation Rafael J. Wysocki
2024-02-22 14:48 ` Daniel Lezcano
2024-02-12 18:34 ` [PATCH v2 4/9] thermal: intel: Set THERMAL_TRIP_FLAG_RW_TEMP directly Rafael J. Wysocki
2024-02-22 15:11 ` Daniel Lezcano
2024-02-12 18:35 ` [PATCH v2 5/9] mlxsw: core_thermal: " Rafael J. Wysocki
2024-02-22 15:13 ` Daniel Lezcano
2024-02-12 18:38 ` [PATCH v2 6/9] wifi: iwlwifi: mvm: " Rafael J. Wysocki
2024-02-15 18:04 ` Rafael J. Wysocki
2024-02-22 15:14 ` Daniel Lezcano
2024-02-12 18:39 ` [PATCH v2 7/9] thermal: imx: " Rafael J. Wysocki
2024-02-22 15:32 ` Daniel Lezcano
2024-02-12 18:40 ` [PATCH v2 8/9] thermal: of: " Rafael J. Wysocki
2024-02-22 13:48 ` Daniel Lezcano
2024-02-22 13:59 ` Rafael J. Wysocki
2024-02-22 15:33 ` Daniel Lezcano
2024-02-12 18:42 ` [PATCH v2 9/9] thermal: core: Eliminate writable trip points masks Rafael J. Wysocki
2024-02-22 15:37 ` Daniel Lezcano
2024-02-15 17:56 ` [PATCH v2 0/9] thermal: Writable trip points handling rework Rafael J. Wysocki
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=2173914.irdbgypaU6@kreacher \
--to=rjw@rjwysocki.net \
--cc=daniel.lezcano@linaro.org \
--cc=idosch@nvidia.com \
--cc=kernel@pengutronix.de \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pm@vger.kernel.org \
--cc=linux-wireless@vger.kernel.org \
--cc=lukasz.luba@arm.com \
--cc=miriam.rachel.korenblit@intel.com \
--cc=netdev@vger.kernel.org \
--cc=petrm@nvidia.com \
--cc=quic_manafm@quicinc.com \
--cc=rui.zhang@intel.com \
--cc=s.hauer@pengutronix.de \
--cc=shawnguo@kernel.org \
--cc=srinivas.pandruvada@linux.intel.com \
--cc=stanislaw.gruszka@linux.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.