From: Daniel Lezcano <daniel.lezcano@linaro.org>
To: daniel.lezcano@linaro.org, rafael@kernel.org
Cc: quic_manafm@quicinc.com, rui.zhang@intel.com, amitk@kernel.org,
lukasz.luba@arm.com, linux-pm@vger.kernel.org,
linux-kernel@vger.kernel.org
Subject: [PATCH v3 3/4] thermal/core: Build ascending ordered indexes for the trip points
Date: Fri, 15 Jul 2022 23:09:10 +0200 [thread overview]
Message-ID: <20220715210911.714479-3-daniel.lezcano@linaro.org> (raw)
In-Reply-To: <20220715210911.714479-1-daniel.lezcano@linaro.org>
By convention the trips points are declared in the ascending
temperature order. However, no specification for the device tree, ACPI
or documentation tells the trip points must be ordered this way.
In the other hand, we need those to be ordered to browse them at the
thermal events. But if we assume they are ordered and change the code
based on this assumption, any platform with shuffled trip points
description will be broken (if they exist).
Instead of taking the risk of breaking the existing platforms, use an
array of temperature ordered trip identifiers and make it available
for the code needing to browse the trip points in an ordered way.
Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
---
drivers/thermal/thermal_core.c | 62 +++++++++++++++++++++++++++-------
include/linux/thermal.h | 2 ++
2 files changed, 52 insertions(+), 12 deletions(-)
diff --git a/drivers/thermal/thermal_core.c b/drivers/thermal/thermal_core.c
index f66036b3daae..f02f38b66445 100644
--- a/drivers/thermal/thermal_core.c
+++ b/drivers/thermal/thermal_core.c
@@ -355,7 +355,8 @@ static void handle_critical_trips(struct thermal_zone_device *tz,
}
static void handle_thermal_trip_crossed(struct thermal_zone_device *tz, int trip,
- int trip_temp, int trip_hyst, enum thermal_trip_type trip_type)
+ int trip_temp, int trip_hyst,
+ enum thermal_trip_type trip_type)
{
if (tz->last_temperature == THERMAL_TEMP_INVALID)
return;
@@ -1165,6 +1166,46 @@ static void bind_tz(struct thermal_zone_device *tz)
mutex_unlock(&thermal_list_lock);
}
+static void sort_trips_indexes(struct thermal_zone_device *tz)
+{
+ int i, j;
+
+ for (i = 0; i < tz->trips; i++)
+ tz->trips_indexes[i] = i;
+
+ for (i = 0; i < tz->trips; i++) {
+ for (j = i + 1; j < tz->trips; j++) {
+ int t1, t2;
+
+ tz->ops->get_trip_temp(tz, tz->trips_indexes[i], &t1);
+ tz->ops->get_trip_temp(tz, tz->trips_indexes[j], &t2);
+
+ if (t1 > t2)
+ swap(tz->trips_indexes[i], tz->trips_indexes[j]);
+ }
+ }
+}
+
+static int thermal_zone_device_trip_init(struct thermal_zone_device *tz)
+{
+ enum thermal_trip_type trip_type;
+ int trip_temp, i;
+
+ tz->trips_indexes = kzalloc(tz->trips * sizeof(int), GFP_KERNEL);
+ if (!tz->trips_indexes)
+ return -ENOMEM;
+
+ for (i = 0; i < tz->trips; i++) {
+ if (tz->ops->get_trip_type(tz, i, &trip_type) ||
+ tz->ops->get_trip_temp(tz, i, &trip_temp) || !trip_temp)
+ set_bit(i, &tz->trips_disabled);
+ }
+
+ sort_trips_indexes(tz);
+
+ return 0;
+}
+
/**
* thermal_zone_device_register() - register a new thermal zone device
* @type: the thermal zone device type
@@ -1196,11 +1237,8 @@ thermal_zone_device_register(const char *type, int trips, int mask,
int polling_delay)
{
struct thermal_zone_device *tz;
- enum thermal_trip_type trip_type;
- int trip_temp;
int id;
int result;
- int count;
struct thermal_governor *governor;
if (!type || strlen(type) == 0) {
@@ -1272,12 +1310,9 @@ thermal_zone_device_register(const char *type, int trips, int mask,
if (result)
goto release_device;
- for (count = 0; count < trips; count++) {
- if (tz->ops->get_trip_type(tz, count, &trip_type) ||
- tz->ops->get_trip_temp(tz, count, &trip_temp) ||
- !trip_temp)
- set_bit(count, &tz->trips_disabled);
- }
+ result = thermal_zone_device_trip_init(tz);
+ if (result)
+ goto unregister;
/* Update 'this' zone's governor information */
mutex_lock(&thermal_governor_lock);
@@ -1290,7 +1325,7 @@ thermal_zone_device_register(const char *type, int trips, int mask,
result = thermal_set_governor(tz, governor);
if (result) {
mutex_unlock(&thermal_governor_lock);
- goto unregister;
+ goto kfree_indexes;
}
mutex_unlock(&thermal_governor_lock);
@@ -1298,7 +1333,7 @@ thermal_zone_device_register(const char *type, int trips, int mask,
if (!tz->tzp || !tz->tzp->no_hwmon) {
result = thermal_add_hwmon_sysfs(tz);
if (result)
- goto unregister;
+ goto kfree_indexes;
}
mutex_lock(&thermal_list_lock);
@@ -1319,6 +1354,8 @@ thermal_zone_device_register(const char *type, int trips, int mask,
return tz;
+kfree_indexes:
+ kfree(tz->trips_indexes);
unregister:
device_del(&tz->device);
release_device:
@@ -1387,6 +1424,7 @@ void thermal_zone_device_unregister(struct thermal_zone_device *tz)
thermal_remove_hwmon_sysfs(tz);
ida_simple_remove(&thermal_tz_ida, tz->id);
ida_destroy(&tz->ida);
+ kfree(tz->trips_indexes);
mutex_destroy(&tz->lock);
device_unregister(&tz->device);
diff --git a/include/linux/thermal.h b/include/linux/thermal.h
index 231bac2768fb..4c3b72536772 100644
--- a/include/linux/thermal.h
+++ b/include/linux/thermal.h
@@ -112,6 +112,7 @@ struct thermal_cooling_device {
* @mode: current mode of this thermal zone
* @devdata: private pointer for device private data
* @trips: number of trip points the thermal zone supports
+ * @trips_indexes: an array of sorted trip points indexes
* @trips_disabled; bitmap for disabled trips
* @passive_delay_jiffies: number of jiffies to wait between polls when
* performing passive cooling.
@@ -152,6 +153,7 @@ struct thermal_zone_device {
enum thermal_device_mode mode;
void *devdata;
int trips;
+ int *trips_indexes;
unsigned long trips_disabled; /* bitmap for disabled trips */
unsigned long passive_delay_jiffies;
unsigned long polling_delay_jiffies;
--
2.25.1
next prev parent reply other threads:[~2022-07-15 21:09 UTC|newest]
Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-07-15 21:09 [PATCH v3 1/4] thermal/core: Encapsulate the trip point crossed function Daniel Lezcano
2022-07-15 21:09 ` [PATCH v3 2/4] thermal/core: Avoid calling ->get_trip_temp() unnecessarily Daniel Lezcano
2022-07-18 4:59 ` Zhang Rui
2022-07-18 14:04 ` Daniel Lezcano
2022-07-19 1:01 ` Zhang Rui
2022-07-15 21:09 ` Daniel Lezcano [this message]
2022-07-18 5:28 ` [PATCH v3 3/4] thermal/core: Build ascending ordered indexes for the trip points Zhang Rui
2022-07-18 13:21 ` Daniel Lezcano
2022-07-19 1:14 ` Zhang Rui
2022-07-19 1:35 ` Zhang Rui
2022-07-19 7:22 ` Daniel Lezcano
2022-07-19 14:17 ` Zhang Rui
2022-07-21 9:34 ` Daniel Lezcano
2022-07-22 7:15 ` Zhang, Rui
2022-07-22 16:49 ` Rafael J. Wysocki
2022-07-18 14:32 ` Daniel Lezcano
2022-07-19 1:07 ` Zhang Rui
2022-07-15 21:09 ` [PATCH v3 4/4] thermal/core: Fix thermal trip cross point Daniel Lezcano
2022-07-18 5:30 ` Zhang Rui
2023-10-26 18:37 ` Rafael J. Wysocki
2022-07-18 4:58 ` [PATCH v3 1/4] thermal/core: Encapsulate the trip point crossed function 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=20220715210911.714479-3-daniel.lezcano@linaro.org \
--to=daniel.lezcano@linaro.org \
--cc=amitk@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pm@vger.kernel.org \
--cc=lukasz.luba@arm.com \
--cc=quic_manafm@quicinc.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox