* [PATCH v1 0/7] thermal: intel: intel_soc_dts_iosf: Cleanups, fixes and usage of generic trips
@ 2023-08-10 19:08 Rafael J. Wysocki
2023-08-10 19:09 ` [PATCH v1 1/7] thermal: intel: intel_soc_dts_iosf: Always assume notification support Rafael J. Wysocki
` (8 more replies)
0 siblings, 9 replies; 10+ messages in thread
From: Rafael J. Wysocki @ 2023-08-10 19:08 UTC (permalink / raw)
To: Linux PM; +Cc: LKML, Srinivas Pandruvada, Zhang Rui, Daniel Lezcano
Hi Folks,
This series is on top of the cleanups one posted yesterday:
https://lore.kernel.org/linux-pm/12271935.O9o76ZdvQC@kreacher/
It continues cleaning up the driver, fixes some potential issues
related to the ordering of actions in it and finally makes it use
thermal_zone_device_register_with_trips() for the registration of
thermal zones.
Please refer to the individual patch changelogs for details.
Thanks!
^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH v1 1/7] thermal: intel: intel_soc_dts_iosf: Always assume notification support
2023-08-10 19:08 [PATCH v1 0/7] thermal: intel: intel_soc_dts_iosf: Cleanups, fixes and usage of generic trips Rafael J. Wysocki
@ 2023-08-10 19:09 ` Rafael J. Wysocki
2023-08-10 19:11 ` [PATCH v1 2/7] thermal: intel: intel_soc_dts_iosf: Untangle update_trip_temp() Rafael J. Wysocki
` (7 subsequent siblings)
8 siblings, 0 replies; 10+ messages in thread
From: Rafael J. Wysocki @ 2023-08-10 19:09 UTC (permalink / raw)
To: Linux PM; +Cc: LKML, Srinivas Pandruvada, Zhang Rui, Daniel Lezcano
From: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
None of the existing callers of intel_soc_dts_iosf_init() passes
INTEL_SOC_DTS_INTERRUPT_NONE as the first argument to it, so the
notification local variable in it is always true and the
notification_support argument of add_dts_thermal_zone() is always
true either.
For this reason, drop the notification local variable from
intel_soc_dts_iosf_init() and the notification_support argument from
add_dts_thermal_zone() and rearrange the latter to always set
writable_trip_cnt and trip_mask.
No intentional functional impact.
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
---
drivers/thermal/intel/intel_soc_dts_iosf.c | 21 ++++++++-------------
1 file changed, 8 insertions(+), 13 deletions(-)
Index: linux-pm/drivers/thermal/intel/intel_soc_dts_iosf.c
===================================================================
--- linux-pm.orig/drivers/thermal/intel/intel_soc_dts_iosf.c
+++ linux-pm/drivers/thermal/intel/intel_soc_dts_iosf.c
@@ -247,12 +247,12 @@ static void remove_dts_thermal_zone(stru
}
static int add_dts_thermal_zone(int id, struct intel_soc_dts_sensor_entry *dts,
- bool notification_support, int read_only_trip_cnt)
+ int read_only_trip_cnt)
{
char name[10];
unsigned long trip;
- int trip_mask = 0;
- int writable_trip_cnt = 0;
+ int writable_trip_cnt;
+ int trip_mask;
unsigned long ptps;
u32 store_ptps;
unsigned long i;
@@ -265,10 +265,9 @@ static int add_dts_thermal_zone(int id,
goto err_ret;
dts->id = id;
- if (notification_support) {
- writable_trip_cnt = SOC_MAX_DTS_TRIPS - read_only_trip_cnt;
- trip_mask = GENMASK(writable_trip_cnt - 1, 0);
- }
+
+ writable_trip_cnt = SOC_MAX_DTS_TRIPS - read_only_trip_cnt;
+ trip_mask = GENMASK(writable_trip_cnt - 1, 0);
/* Check if the writable trip we provide is not used by BIOS */
ret = iosf_mbi_read(BT_MBI_UNIT_PMC, MBI_REG_READ,
@@ -364,7 +363,6 @@ struct intel_soc_dts_sensors *intel_soc_
enum intel_soc_dts_interrupt_type intr_type, int read_only_trip_count)
{
struct intel_soc_dts_sensors *sensors;
- bool notification;
int tj_max;
int ret;
int i;
@@ -387,14 +385,11 @@ struct intel_soc_dts_sensors *intel_soc_
mutex_init(&sensors->dts_update_lock);
sensors->intr_type = intr_type;
sensors->tj_max = tj_max * 1000;
- if (intr_type == INTEL_SOC_DTS_INTERRUPT_NONE)
- notification = false;
- else
- notification = true;
+
for (i = 0; i < SOC_MAX_DTS_SENSORS; ++i) {
sensors->soc_dts[i].sensors = sensors;
ret = add_dts_thermal_zone(i, &sensors->soc_dts[i],
- notification, read_only_trip_count);
+ read_only_trip_count);
if (ret)
goto err_free;
}
^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH v1 2/7] thermal: intel: intel_soc_dts_iosf: Untangle update_trip_temp()
2023-08-10 19:08 [PATCH v1 0/7] thermal: intel: intel_soc_dts_iosf: Cleanups, fixes and usage of generic trips Rafael J. Wysocki
2023-08-10 19:09 ` [PATCH v1 1/7] thermal: intel: intel_soc_dts_iosf: Always assume notification support Rafael J. Wysocki
@ 2023-08-10 19:11 ` Rafael J. Wysocki
2023-08-10 19:12 ` [PATCH v1 3/7] thermal: intel: intel_soc_dts_iosf: Pass sensors to update_trip_temp() Rafael J. Wysocki
` (6 subsequent siblings)
8 siblings, 0 replies; 10+ messages in thread
From: Rafael J. Wysocki @ 2023-08-10 19:11 UTC (permalink / raw)
To: Linux PM; +Cc: LKML, Srinivas Pandruvada, Zhang Rui, Daniel Lezcano
From: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Function update_trip_temp() is currently used for the initialization
of trip points as well as for changing trip point temperatures in
sys_set_trip_temp().
This is quite confusing and passing the value of dts->trip_types[trip]
to it so that it can store that value in the same memory location is
not particularly useful, because it only is necessary to set the
trip point type once, at the initialization time.
For this reason, drop the last argument from update_trip_temp() and
introduce configure_trip() calling the former internally for the
initial configuration of trip points.
Modify the majority of update_trip_temp() callers to use
configure_trip() instead of it.
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
---
drivers/thermal/intel/intel_soc_dts_iosf.c | 37 ++++++++++++++++++-----------
1 file changed, 24 insertions(+), 13 deletions(-)
Index: linux-pm/drivers/thermal/intel/intel_soc_dts_iosf.c
===================================================================
--- linux-pm.orig/drivers/thermal/intel/intel_soc_dts_iosf.c
+++ linux-pm/drivers/thermal/intel/intel_soc_dts_iosf.c
@@ -67,8 +67,7 @@ static int sys_get_trip_temp(struct ther
}
static int update_trip_temp(struct intel_soc_dts_sensor_entry *dts,
- int thres_index, int temp,
- enum thermal_trip_type trip_type)
+ int thres_index, int temp)
{
int status;
u32 temp_out;
@@ -142,8 +141,6 @@ static int update_trip_temp(struct intel
if (status)
goto err_restore_te_out;
- dts->trip_types[thres_index] = trip_type;
-
return 0;
err_restore_te_out:
iosf_mbi_write(BT_MBI_UNIT_PMC, MBI_REG_WRITE,
@@ -159,6 +156,21 @@ err_restore_ptps:
return status;
}
+static int configure_trip(struct intel_soc_dts_sensor_entry *dts,
+ int thres_index, enum thermal_trip_type trip_type,
+ int temp)
+{
+ int ret;
+
+ ret = update_trip_temp(dts, thres_index, temp);
+ if (ret)
+ return ret;
+
+ dts->trip_types[thres_index] = trip_type;
+
+ return 0;
+}
+
static int sys_set_trip_temp(struct thermal_zone_device *tzd, int trip,
int temp)
{
@@ -170,8 +182,7 @@ static int sys_set_trip_temp(struct ther
return -EINVAL;
mutex_lock(&sensors->dts_update_lock);
- status = update_trip_temp(dts, trip, temp,
- dts->trip_types[trip]);
+ status = update_trip_temp(dts, trip, temp);
mutex_unlock(&sensors->dts_update_lock);
return status;
@@ -317,7 +328,7 @@ int intel_soc_dts_iosf_add_read_only_cri
j = find_first_zero_bit(&mask, SOC_MAX_DTS_TRIPS);
if (j < SOC_MAX_DTS_TRIPS)
- return update_trip_temp(entry, j, temp, THERMAL_TRIP_CRITICAL);
+ return configure_trip(entry, j, THERMAL_TRIP_CRITICAL, temp);
}
return -EINVAL;
@@ -395,13 +406,13 @@ struct intel_soc_dts_sensors *intel_soc_
}
for (i = 0; i < SOC_MAX_DTS_SENSORS; ++i) {
- ret = update_trip_temp(&sensors->soc_dts[i], 0, 0,
- THERMAL_TRIP_PASSIVE);
+ ret = configure_trip(&sensors->soc_dts[i], 0,
+ THERMAL_TRIP_PASSIVE, 0);
if (ret)
goto err_remove_zone;
- ret = update_trip_temp(&sensors->soc_dts[i], 1, 0,
- THERMAL_TRIP_PASSIVE);
+ ret = configure_trip(&sensors->soc_dts[i], 1,
+ THERMAL_TRIP_PASSIVE, 0);
if (ret)
goto err_remove_zone;
}
@@ -422,8 +433,8 @@ void intel_soc_dts_iosf_exit(struct inte
int i;
for (i = 0; i < SOC_MAX_DTS_SENSORS; ++i) {
- update_trip_temp(&sensors->soc_dts[i], 0, 0, 0);
- update_trip_temp(&sensors->soc_dts[i], 1, 0, 0);
+ configure_trip(&sensors->soc_dts[i], 0, 0, 0);
+ configure_trip(&sensors->soc_dts[i], 1, 0, 0);
remove_dts_thermal_zone(&sensors->soc_dts[i]);
}
kfree(sensors);
^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH v1 3/7] thermal: intel: intel_soc_dts_iosf: Pass sensors to update_trip_temp()
2023-08-10 19:08 [PATCH v1 0/7] thermal: intel: intel_soc_dts_iosf: Cleanups, fixes and usage of generic trips Rafael J. Wysocki
2023-08-10 19:09 ` [PATCH v1 1/7] thermal: intel: intel_soc_dts_iosf: Always assume notification support Rafael J. Wysocki
2023-08-10 19:11 ` [PATCH v1 2/7] thermal: intel: intel_soc_dts_iosf: Untangle update_trip_temp() Rafael J. Wysocki
@ 2023-08-10 19:12 ` Rafael J. Wysocki
2023-08-10 19:13 ` [PATCH v1 4/7] thermal: intel: intel_soc_dts_iosf: Change initialization ordering Rafael J. Wysocki
` (5 subsequent siblings)
8 siblings, 0 replies; 10+ messages in thread
From: Rafael J. Wysocki @ 2023-08-10 19:12 UTC (permalink / raw)
To: Linux PM; +Cc: LKML, Srinivas Pandruvada, Zhang Rui, Daniel Lezcano
From: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
After previous changes, update_trip_temp() only uses its dts argument to
get to the sensors field in the struct intel_soc_dts_sensor_entry object
pointed to by that argument, so pass the value of that field directly to
it instead.
No intentional functional impact.
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
---
drivers/thermal/intel/intel_soc_dts_iosf.c | 7 +++----
1 file changed, 3 insertions(+), 4 deletions(-)
Index: linux-pm/drivers/thermal/intel/intel_soc_dts_iosf.c
===================================================================
--- linux-pm.orig/drivers/thermal/intel/intel_soc_dts_iosf.c
+++ linux-pm/drivers/thermal/intel/intel_soc_dts_iosf.c
@@ -66,7 +66,7 @@ static int sys_get_trip_temp(struct ther
return 0;
}
-static int update_trip_temp(struct intel_soc_dts_sensor_entry *dts,
+static int update_trip_temp(struct intel_soc_dts_sensors *sensors,
int thres_index, int temp)
{
int status;
@@ -78,7 +78,6 @@ static int update_trip_temp(struct intel
u32 store_te_out;
u32 te_out;
u32 int_enable_bit = SOC_DTS_TE_APICA_ENABLE;
- struct intel_soc_dts_sensors *sensors = dts->sensors;
if (sensors->intr_type == INTEL_SOC_DTS_INTERRUPT_MSI)
int_enable_bit |= SOC_DTS_TE_MSI_ENABLE;
@@ -162,7 +161,7 @@ static int configure_trip(struct intel_s
{
int ret;
- ret = update_trip_temp(dts, thres_index, temp);
+ ret = update_trip_temp(dts->sensors, thres_index, temp);
if (ret)
return ret;
@@ -182,7 +181,7 @@ static int sys_set_trip_temp(struct ther
return -EINVAL;
mutex_lock(&sensors->dts_update_lock);
- status = update_trip_temp(dts, trip, temp);
+ status = update_trip_temp(sensors, trip, temp);
mutex_unlock(&sensors->dts_update_lock);
return status;
^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH v1 4/7] thermal: intel: intel_soc_dts_iosf: Change initialization ordering
2023-08-10 19:08 [PATCH v1 0/7] thermal: intel: intel_soc_dts_iosf: Cleanups, fixes and usage of generic trips Rafael J. Wysocki
` (2 preceding siblings ...)
2023-08-10 19:12 ` [PATCH v1 3/7] thermal: intel: intel_soc_dts_iosf: Pass sensors to update_trip_temp() Rafael J. Wysocki
@ 2023-08-10 19:13 ` Rafael J. Wysocki
2023-08-10 19:14 ` [PATCH v1 5/7] thermal: intel: intel_soc_dts_iosf: Add helper for resetting trip points Rafael J. Wysocki
` (4 subsequent siblings)
8 siblings, 0 replies; 10+ messages in thread
From: Rafael J. Wysocki @ 2023-08-10 19:13 UTC (permalink / raw)
To: Linux PM; +Cc: LKML, Srinivas Pandruvada, Zhang Rui, Daniel Lezcano
From: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
The initial configuration of trip points in intel_soc_dts_iosf_init()
takes place after registering the sensor thermal zones which is
potentially problematic, because it may race with the setting of trip
point temperatures via sysfs, as there is no synchronization between it
and sys_set_trip_temp().
To address this, change the initialization ordering so that the trip
points are configured prior to the registration of thermal zones.
Accordingly, change the cleanup ordering in intel_soc_dts_iosf_exit()
to remove the thermal zones before resetting the trip points.
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
---
drivers/thermal/intel/intel_soc_dts_iosf.c | 25 ++++++++++++++++---------
1 file changed, 16 insertions(+), 9 deletions(-)
Index: linux-pm/drivers/thermal/intel/intel_soc_dts_iosf.c
===================================================================
--- linux-pm.orig/drivers/thermal/intel/intel_soc_dts_iosf.c
+++ linux-pm/drivers/thermal/intel/intel_soc_dts_iosf.c
@@ -398,30 +398,37 @@ struct intel_soc_dts_sensors *intel_soc_
for (i = 0; i < SOC_MAX_DTS_SENSORS; ++i) {
sensors->soc_dts[i].sensors = sensors;
- ret = add_dts_thermal_zone(i, &sensors->soc_dts[i],
- read_only_trip_count);
- if (ret)
- goto err_free;
- }
- for (i = 0; i < SOC_MAX_DTS_SENSORS; ++i) {
ret = configure_trip(&sensors->soc_dts[i], 0,
THERMAL_TRIP_PASSIVE, 0);
if (ret)
- goto err_remove_zone;
+ goto err_reset_trips;
ret = configure_trip(&sensors->soc_dts[i], 1,
THERMAL_TRIP_PASSIVE, 0);
if (ret)
+ goto err_reset_trips;
+ }
+
+ for (i = 0; i < SOC_MAX_DTS_SENSORS; ++i) {
+ ret = add_dts_thermal_zone(i, &sensors->soc_dts[i],
+ read_only_trip_count);
+ if (ret)
goto err_remove_zone;
}
return sensors;
+
err_remove_zone:
for (i = 0; i < SOC_MAX_DTS_SENSORS; ++i)
remove_dts_thermal_zone(&sensors->soc_dts[i]);
-err_free:
+err_reset_trips:
+ for (i = 0; i < SOC_MAX_DTS_SENSORS; i++) {
+ configure_trip(&sensors->soc_dts[i], 0, 0, 0);
+ configure_trip(&sensors->soc_dts[i], 1, 0, 0);
+ }
+
kfree(sensors);
return ERR_PTR(ret);
}
@@ -432,9 +439,9 @@ void intel_soc_dts_iosf_exit(struct inte
int i;
for (i = 0; i < SOC_MAX_DTS_SENSORS; ++i) {
+ remove_dts_thermal_zone(&sensors->soc_dts[i]);
configure_trip(&sensors->soc_dts[i], 0, 0, 0);
configure_trip(&sensors->soc_dts[i], 1, 0, 0);
- remove_dts_thermal_zone(&sensors->soc_dts[i]);
}
kfree(sensors);
}
^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH v1 5/7] thermal: intel: intel_soc_dts_iosf: Add helper for resetting trip points
2023-08-10 19:08 [PATCH v1 0/7] thermal: intel: intel_soc_dts_iosf: Cleanups, fixes and usage of generic trips Rafael J. Wysocki
` (3 preceding siblings ...)
2023-08-10 19:13 ` [PATCH v1 4/7] thermal: intel: intel_soc_dts_iosf: Change initialization ordering Rafael J. Wysocki
@ 2023-08-10 19:14 ` Rafael J. Wysocki
2023-08-10 19:16 ` [PATCH v1 6/7] thermal: intel: intel_soc_dts_iosf: Rework critical trip setup Rafael J. Wysocki
` (3 subsequent siblings)
8 siblings, 0 replies; 10+ messages in thread
From: Rafael J. Wysocki @ 2023-08-10 19:14 UTC (permalink / raw)
To: Linux PM; +Cc: LKML, Srinivas Pandruvada, Zhang Rui, Daniel Lezcano
From: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Because trip points are reset for each sensor in two places in the
same way, add a helper function for that to reduce code duplication
a bit.
No intentional functional impact.
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
---
drivers/thermal/intel/intel_soc_dts_iosf.c | 15 +++++++++------
1 file changed, 9 insertions(+), 6 deletions(-)
Index: linux-pm/drivers/thermal/intel/intel_soc_dts_iosf.c
===================================================================
--- linux-pm.orig/drivers/thermal/intel/intel_soc_dts_iosf.c
+++ linux-pm/drivers/thermal/intel/intel_soc_dts_iosf.c
@@ -369,6 +369,12 @@ void intel_soc_dts_iosf_interrupt_handle
}
EXPORT_SYMBOL_GPL(intel_soc_dts_iosf_interrupt_handler);
+static void dts_trips_reset(struct intel_soc_dts_sensors *sensors, int dts_index)
+{
+ configure_trip(&sensors->soc_dts[dts_index], 0, 0, 0);
+ configure_trip(&sensors->soc_dts[dts_index], 1, 0, 0);
+}
+
struct intel_soc_dts_sensors *intel_soc_dts_iosf_init(
enum intel_soc_dts_interrupt_type intr_type, int read_only_trip_count)
{
@@ -424,10 +430,8 @@ err_remove_zone:
remove_dts_thermal_zone(&sensors->soc_dts[i]);
err_reset_trips:
- for (i = 0; i < SOC_MAX_DTS_SENSORS; i++) {
- configure_trip(&sensors->soc_dts[i], 0, 0, 0);
- configure_trip(&sensors->soc_dts[i], 1, 0, 0);
- }
+ for (i = 0; i < SOC_MAX_DTS_SENSORS; i++)
+ dts_trips_reset(sensors, i);
kfree(sensors);
return ERR_PTR(ret);
@@ -440,8 +444,7 @@ void intel_soc_dts_iosf_exit(struct inte
for (i = 0; i < SOC_MAX_DTS_SENSORS; ++i) {
remove_dts_thermal_zone(&sensors->soc_dts[i]);
- configure_trip(&sensors->soc_dts[i], 0, 0, 0);
- configure_trip(&sensors->soc_dts[i], 1, 0, 0);
+ dts_trips_reset(sensors, i);
}
kfree(sensors);
}
^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH v1 6/7] thermal: intel: intel_soc_dts_iosf: Rework critical trip setup
2023-08-10 19:08 [PATCH v1 0/7] thermal: intel: intel_soc_dts_iosf: Cleanups, fixes and usage of generic trips Rafael J. Wysocki
` (4 preceding siblings ...)
2023-08-10 19:14 ` [PATCH v1 5/7] thermal: intel: intel_soc_dts_iosf: Add helper for resetting trip points Rafael J. Wysocki
@ 2023-08-10 19:16 ` Rafael J. Wysocki
2023-08-10 19:17 ` [PATCH v1 7/7] thermal: intel: intel_soc_dts_iosf: Use struct thermal_trip Rafael J. Wysocki
` (2 subsequent siblings)
8 siblings, 0 replies; 10+ messages in thread
From: Rafael J. Wysocki @ 2023-08-10 19:16 UTC (permalink / raw)
To: Linux PM; +Cc: LKML, Srinivas Pandruvada, Zhang Rui, Daniel Lezcano
From: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Critical trip points appear in the DTS thermal zones only after those
thermal zones have been registered via intel_soc_dts_iosf_init().
Moreover, they are "created" by changing the type of an existing trip
point from THERMAL_TRIP_PASSIVE to THERMAL_TRIP_CRITICAL via
intel_soc_dts_iosf_add_read_only_critical_trip(), the caller of which
has to be careful enough to pass at least 1 as the number of read-only
trip points to intel_soc_dts_iosf_init() beforehand.
This is questionable, because user space may have started to use the
trips at the time when intel_soc_dts_iosf_add_read_only_critical_trip()
runs and there is no synchronization between it and sys_set_trip_temp().
To address it, use the observation that nonzero number of read-only
trip points is only passed to intel_soc_dts_iosf_init() when critical
trip points are going to be used, so in fact that function may get all
of the information regarding the critical trip points upfront and it
can configure them before registering the corresponding thermal zones.
Accordingly, replace the read_only_trip_count argument of
intel_soc_dts_iosf_init() with a pair of new arguments related to
critical trip points: a bool one indicating whether or not critical
trip points are to be used at all and an int one representing the
critical trip point temperature offset relative to Tj_max. Use these
arguments to configure the critical trip points before the registration
of the thermal zones and to compute the number of writeable trip points
in add_dts_thermal_zone().
Modify both callers of intel_soc_dts_iosf_init() to take these changes
into account and drop the intel_soc_dts_iosf_add_read_only_critical_trip()
call, that is not necessary any more, from intel_soc_thermal_init(),
which also allows it to return success right after requesting the IRQ.
Finally, drop intel_soc_dts_iosf_add_read_only_critical_trip()
altogether, because it does not have any more users.
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
---
drivers/thermal/intel/int340x_thermal/processor_thermal_device_pci_legacy.c | 2
drivers/thermal/intel/intel_soc_dts_iosf.c | 51 +++-------
drivers/thermal/intel/intel_soc_dts_iosf.h | 8 -
drivers/thermal/intel/intel_soc_dts_thermal.c | 17 ---
4 files changed, 27 insertions(+), 51 deletions(-)
Index: linux-pm/drivers/thermal/intel/intel_soc_dts_iosf.c
===================================================================
--- linux-pm.orig/drivers/thermal/intel/intel_soc_dts_iosf.c
+++ linux-pm/drivers/thermal/intel/intel_soc_dts_iosf.c
@@ -257,11 +257,11 @@ static void remove_dts_thermal_zone(stru
}
static int add_dts_thermal_zone(int id, struct intel_soc_dts_sensor_entry *dts,
- int read_only_trip_cnt)
+ bool critical_trip)
{
+ int writable_trip_cnt = SOC_MAX_DTS_TRIPS;
char name[10];
unsigned long trip;
- int writable_trip_cnt;
int trip_mask;
unsigned long ptps;
u32 store_ptps;
@@ -276,7 +276,9 @@ static int add_dts_thermal_zone(int id,
dts->id = id;
- writable_trip_cnt = SOC_MAX_DTS_TRIPS - read_only_trip_cnt;
+ if (critical_trip)
+ writable_trip_cnt--;
+
trip_mask = GENMASK(writable_trip_cnt - 1, 0);
/* Check if the writable trip we provide is not used by BIOS */
@@ -315,25 +317,6 @@ err_ret:
return ret;
}
-int intel_soc_dts_iosf_add_read_only_critical_trip(
- struct intel_soc_dts_sensors *sensors, int critical_offset)
-{
- int i, j;
-
- for (i = 0; i < SOC_MAX_DTS_SENSORS; ++i) {
- struct intel_soc_dts_sensor_entry *entry = &sensors->soc_dts[i];
- int temp = sensors->tj_max - critical_offset;
- unsigned long mask = entry->trip_mask;
-
- j = find_first_zero_bit(&mask, SOC_MAX_DTS_TRIPS);
- if (j < SOC_MAX_DTS_TRIPS)
- return configure_trip(entry, j, THERMAL_TRIP_CRITICAL, temp);
- }
-
- return -EINVAL;
-}
-EXPORT_SYMBOL_GPL(intel_soc_dts_iosf_add_read_only_critical_trip);
-
void intel_soc_dts_iosf_interrupt_handler(struct intel_soc_dts_sensors *sensors)
{
u32 sticky_out;
@@ -375,8 +358,9 @@ static void dts_trips_reset(struct intel
configure_trip(&sensors->soc_dts[dts_index], 1, 0, 0);
}
-struct intel_soc_dts_sensors *intel_soc_dts_iosf_init(
- enum intel_soc_dts_interrupt_type intr_type, int read_only_trip_count)
+struct intel_soc_dts_sensors *
+intel_soc_dts_iosf_init(enum intel_soc_dts_interrupt_type intr_type,
+ bool critical_trip, int crit_offset)
{
struct intel_soc_dts_sensors *sensors;
int tj_max;
@@ -386,9 +370,6 @@ struct intel_soc_dts_sensors *intel_soc_
if (!iosf_mbi_available())
return ERR_PTR(-ENODEV);
- if (read_only_trip_count > SOC_MAX_DTS_TRIPS)
- return ERR_PTR(-EINVAL);
-
tj_max = intel_tcc_get_tjmax(-1);
if (tj_max < 0)
return ERR_PTR(tj_max);
@@ -403,6 +384,9 @@ struct intel_soc_dts_sensors *intel_soc_
sensors->tj_max = tj_max * 1000;
for (i = 0; i < SOC_MAX_DTS_SENSORS; ++i) {
+ enum thermal_trip_type trip_type;
+ int temp;
+
sensors->soc_dts[i].sensors = sensors;
ret = configure_trip(&sensors->soc_dts[i], 0,
@@ -410,15 +394,20 @@ struct intel_soc_dts_sensors *intel_soc_
if (ret)
goto err_reset_trips;
- ret = configure_trip(&sensors->soc_dts[i], 1,
- THERMAL_TRIP_PASSIVE, 0);
+ if (critical_trip) {
+ trip_type = THERMAL_TRIP_CRITICAL;
+ temp = sensors->tj_max - crit_offset;
+ } else {
+ trip_type = THERMAL_TRIP_PASSIVE;
+ temp = 0;
+ }
+ ret = configure_trip(&sensors->soc_dts[i], 1, trip_type, temp);
if (ret)
goto err_reset_trips;
}
for (i = 0; i < SOC_MAX_DTS_SENSORS; ++i) {
- ret = add_dts_thermal_zone(i, &sensors->soc_dts[i],
- read_only_trip_count);
+ ret = add_dts_thermal_zone(i, &sensors->soc_dts[i], critical_trip);
if (ret)
goto err_remove_zone;
}
Index: linux-pm/drivers/thermal/intel/intel_soc_dts_iosf.h
===================================================================
--- linux-pm.orig/drivers/thermal/intel/intel_soc_dts_iosf.h
+++ linux-pm/drivers/thermal/intel/intel_soc_dts_iosf.h
@@ -42,11 +42,11 @@ struct intel_soc_dts_sensors {
struct intel_soc_dts_sensor_entry soc_dts[SOC_MAX_DTS_SENSORS];
};
-struct intel_soc_dts_sensors *intel_soc_dts_iosf_init(
- enum intel_soc_dts_interrupt_type intr_type, int read_only_trip_count);
+
+struct intel_soc_dts_sensors *
+intel_soc_dts_iosf_init(enum intel_soc_dts_interrupt_type intr_type,
+ bool critical_trip, int crit_offset);
void intel_soc_dts_iosf_exit(struct intel_soc_dts_sensors *sensors);
void intel_soc_dts_iosf_interrupt_handler(
struct intel_soc_dts_sensors *sensors);
-int intel_soc_dts_iosf_add_read_only_critical_trip(
- struct intel_soc_dts_sensors *sensors, int critical_offset);
#endif
Index: linux-pm/drivers/thermal/intel/int340x_thermal/processor_thermal_device_pci_legacy.c
===================================================================
--- linux-pm.orig/drivers/thermal/intel/int340x_thermal/processor_thermal_device_pci_legacy.c
+++ linux-pm/drivers/thermal/intel/int340x_thermal/processor_thermal_device_pci_legacy.c
@@ -59,7 +59,7 @@ static int proc_thermal_pci_probe(struct
* ACPI/MSR. So we don't want to fail for auxiliary DTSs.
*/
proc_priv->soc_dts = intel_soc_dts_iosf_init(
- INTEL_SOC_DTS_INTERRUPT_MSI, 0);
+ INTEL_SOC_DTS_INTERRUPT_MSI, false, 0);
if (!IS_ERR(proc_priv->soc_dts) && pdev->irq) {
ret = pci_enable_msi(pdev);
Index: linux-pm/drivers/thermal/intel/intel_soc_dts_thermal.c
===================================================================
--- linux-pm.orig/drivers/thermal/intel/intel_soc_dts_thermal.c
+++ linux-pm/drivers/thermal/intel/intel_soc_dts_thermal.c
@@ -51,7 +51,8 @@ static int __init intel_soc_thermal_init
return -ENODEV;
/* Create a zone with 2 trips with marked as read only */
- soc_dts = intel_soc_dts_iosf_init(INTEL_SOC_DTS_INTERRUPT_APIC, 1);
+ soc_dts = intel_soc_dts_iosf_init(INTEL_SOC_DTS_INTERRUPT_APIC, true,
+ crit_offset);
if (IS_ERR(soc_dts)) {
err = PTR_ERR(soc_dts);
return err;
@@ -88,21 +89,7 @@ static int __init intel_soc_thermal_init
}
}
- err = intel_soc_dts_iosf_add_read_only_critical_trip(soc_dts,
- crit_offset);
- if (err)
- goto error_trips;
-
return 0;
-
-error_trips:
- if (soc_dts_thres_irq) {
- free_irq(soc_dts_thres_irq, soc_dts);
- acpi_unregister_gsi(soc_dts_thres_gsi);
- }
- intel_soc_dts_iosf_exit(soc_dts);
-
- return err;
}
static void __exit intel_soc_thermal_exit(void)
^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH v1 7/7] thermal: intel: intel_soc_dts_iosf: Use struct thermal_trip
2023-08-10 19:08 [PATCH v1 0/7] thermal: intel: intel_soc_dts_iosf: Cleanups, fixes and usage of generic trips Rafael J. Wysocki
` (5 preceding siblings ...)
2023-08-10 19:16 ` [PATCH v1 6/7] thermal: intel: intel_soc_dts_iosf: Rework critical trip setup Rafael J. Wysocki
@ 2023-08-10 19:17 ` Rafael J. Wysocki
2023-08-11 0:00 ` [PATCH v1 0/7] thermal: intel: intel_soc_dts_iosf: Cleanups, fixes and usage of generic trips srinivas pandruvada
2023-08-11 7:59 ` Zhang, Rui
8 siblings, 0 replies; 10+ messages in thread
From: Rafael J. Wysocki @ 2023-08-10 19:17 UTC (permalink / raw)
To: Linux PM; +Cc: LKML, Srinivas Pandruvada, Zhang Rui, Daniel Lezcano
From: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Because the number of trip points in each thermal zone and their
types are known to intel_soc_dts_iosf_init() prior to the registration
of the thermal zones, make it create an array of struct thermal_trip
entries in each struct intel_soc_dts_sensor_entry object and make
add_dts_thermal_zone() use thermal_zone_device_register_with_trips()
for thermal zone registration and pass that array as its second
argument.
Drop the sys_get_trip_temp() and sys_get_trip_type() callback
functions along with the respective callback pointers in
tzone_ops, because they are not necessary any more.
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
---
drivers/thermal/intel/intel_soc_dts_iosf.c | 51 +++--------------------------
drivers/thermal/intel/intel_soc_dts_iosf.h | 2 -
2 files changed, 8 insertions(+), 45 deletions(-)
Index: linux-pm/drivers/thermal/intel/intel_soc_dts_iosf.h
===================================================================
--- linux-pm.orig/drivers/thermal/intel/intel_soc_dts_iosf.h
+++ linux-pm/drivers/thermal/intel/intel_soc_dts_iosf.h
@@ -29,7 +29,7 @@ struct intel_soc_dts_sensor_entry {
int id;
u32 store_status;
u32 trip_mask;
- enum thermal_trip_type trip_types[SOC_MAX_DTS_TRIPS];
+ struct thermal_trip trips[SOC_MAX_DTS_TRIPS];
struct thermal_zone_device *tzone;
struct intel_soc_dts_sensors *sensors;
};
Index: linux-pm/drivers/thermal/intel/intel_soc_dts_iosf.c
===================================================================
--- linux-pm.orig/drivers/thermal/intel/intel_soc_dts_iosf.c
+++ linux-pm/drivers/thermal/intel/intel_soc_dts_iosf.c
@@ -40,32 +40,6 @@
/* Mask for two trips in status bits */
#define SOC_DTS_TRIP_MASK 0x03
-static int sys_get_trip_temp(struct thermal_zone_device *tzd, int trip,
- int *temp)
-{
- int status;
- u32 out;
- struct intel_soc_dts_sensor_entry *dts;
- struct intel_soc_dts_sensors *sensors;
-
- dts = thermal_zone_device_priv(tzd);
- sensors = dts->sensors;
- mutex_lock(&sensors->dts_update_lock);
- status = iosf_mbi_read(BT_MBI_UNIT_PMC, MBI_REG_READ,
- SOC_DTS_OFFSET_PTPS, &out);
- mutex_unlock(&sensors->dts_update_lock);
- if (status)
- return status;
-
- out = (out >> (trip * 8)) & SOC_DTS_TJMAX_ENCODING;
- if (!out)
- *temp = 0;
- else
- *temp = sensors->tj_max - out * 1000;
-
- return 0;
-}
-
static int update_trip_temp(struct intel_soc_dts_sensors *sensors,
int thres_index, int temp)
{
@@ -165,7 +139,8 @@ static int configure_trip(struct intel_s
if (ret)
return ret;
- dts->trip_types[thres_index] = trip_type;
+ dts->trips[thres_index].temperature = temp;
+ dts->trips[thres_index].type = trip_type;
return 0;
}
@@ -187,16 +162,6 @@ static int sys_set_trip_temp(struct ther
return status;
}
-static int sys_get_trip_type(struct thermal_zone_device *tzd,
- int trip, enum thermal_trip_type *type)
-{
- struct intel_soc_dts_sensor_entry *dts = thermal_zone_device_priv(tzd);
-
- *type = dts->trip_types[trip];
-
- return 0;
-}
-
static int sys_get_curr_temp(struct thermal_zone_device *tzd,
int *temp)
{
@@ -221,8 +186,6 @@ static int sys_get_curr_temp(struct ther
static struct thermal_zone_device_ops tzone_ops = {
.get_temp = sys_get_curr_temp,
- .get_trip_temp = sys_get_trip_temp,
- .get_trip_type = sys_get_trip_type,
.set_trip_temp = sys_set_trip_temp,
};
@@ -293,11 +256,11 @@ static int add_dts_thermal_zone(int id,
}
dts->trip_mask = trip_mask;
snprintf(name, sizeof(name), "soc_dts%d", id);
- dts->tzone = thermal_zone_device_register(name,
- SOC_MAX_DTS_TRIPS,
- trip_mask,
- dts, &tzone_ops,
- NULL, 0, 0);
+ dts->tzone = thermal_zone_device_register_with_trips(name, dts->trips,
+ SOC_MAX_DTS_TRIPS,
+ trip_mask,
+ dts, &tzone_ops,
+ NULL, 0, 0);
if (IS_ERR(dts->tzone)) {
ret = PTR_ERR(dts->tzone);
goto err_ret;
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH v1 0/7] thermal: intel: intel_soc_dts_iosf: Cleanups, fixes and usage of generic trips
2023-08-10 19:08 [PATCH v1 0/7] thermal: intel: intel_soc_dts_iosf: Cleanups, fixes and usage of generic trips Rafael J. Wysocki
` (6 preceding siblings ...)
2023-08-10 19:17 ` [PATCH v1 7/7] thermal: intel: intel_soc_dts_iosf: Use struct thermal_trip Rafael J. Wysocki
@ 2023-08-11 0:00 ` srinivas pandruvada
2023-08-11 7:59 ` Zhang, Rui
8 siblings, 0 replies; 10+ messages in thread
From: srinivas pandruvada @ 2023-08-11 0:00 UTC (permalink / raw)
To: Rafael J. Wysocki, Linux PM; +Cc: LKML, Zhang Rui, Daniel Lezcano
On Thu, 2023-08-10 at 21:08 +0200, Rafael J. Wysocki wrote:
> Hi Folks,
>
> This series is on top of the cleanups one posted yesterday:
>
> https://lore.kernel.org/linux-pm/12271935.O9o76ZdvQC@kreacher/
>
> It continues cleaning up the driver, fixes some potential issues
> related to the ordering of actions in it and finally makes it use
> thermal_zone_device_register_with_trips() for the registration of
> thermal zones.
>
> Please refer to the individual patch changelogs for details.
>
Reviewed-by: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
> Thanks!
>
>
>
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH v1 0/7] thermal: intel: intel_soc_dts_iosf: Cleanups, fixes and usage of generic trips
2023-08-10 19:08 [PATCH v1 0/7] thermal: intel: intel_soc_dts_iosf: Cleanups, fixes and usage of generic trips Rafael J. Wysocki
` (7 preceding siblings ...)
2023-08-11 0:00 ` [PATCH v1 0/7] thermal: intel: intel_soc_dts_iosf: Cleanups, fixes and usage of generic trips srinivas pandruvada
@ 2023-08-11 7:59 ` Zhang, Rui
8 siblings, 0 replies; 10+ messages in thread
From: Zhang, Rui @ 2023-08-11 7:59 UTC (permalink / raw)
To: linux-pm@vger.kernel.org, rjw@rjwysocki.net
Cc: srinivas.pandruvada@linux.intel.com, linux-kernel@vger.kernel.org,
daniel.lezcano@linaro.org
Hi, Rafael,
the patches look good to me.
Just found one more thing to fix when checking the code.
Will post a patch on top soon.
thanks,
rui
On Thu, 2023-08-10 at 21:08 +0200, Rafael J. Wysocki wrote:
> Hi Folks,
>
> This series is on top of the cleanups one posted yesterday:
>
> https://lore.kernel.org/linux-pm/12271935.O9o76ZdvQC@kreacher/
>
> It continues cleaning up the driver, fixes some potential issues
> related to the ordering of actions in it and finally makes it use
> thermal_zone_device_register_with_trips() for the registration of
> thermal zones.
>
> Please refer to the individual patch changelogs for details.
>
> Thanks!
>
>
>
^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2023-08-11 7:59 UTC | newest]
Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-08-10 19:08 [PATCH v1 0/7] thermal: intel: intel_soc_dts_iosf: Cleanups, fixes and usage of generic trips Rafael J. Wysocki
2023-08-10 19:09 ` [PATCH v1 1/7] thermal: intel: intel_soc_dts_iosf: Always assume notification support Rafael J. Wysocki
2023-08-10 19:11 ` [PATCH v1 2/7] thermal: intel: intel_soc_dts_iosf: Untangle update_trip_temp() Rafael J. Wysocki
2023-08-10 19:12 ` [PATCH v1 3/7] thermal: intel: intel_soc_dts_iosf: Pass sensors to update_trip_temp() Rafael J. Wysocki
2023-08-10 19:13 ` [PATCH v1 4/7] thermal: intel: intel_soc_dts_iosf: Change initialization ordering Rafael J. Wysocki
2023-08-10 19:14 ` [PATCH v1 5/7] thermal: intel: intel_soc_dts_iosf: Add helper for resetting trip points Rafael J. Wysocki
2023-08-10 19:16 ` [PATCH v1 6/7] thermal: intel: intel_soc_dts_iosf: Rework critical trip setup Rafael J. Wysocki
2023-08-10 19:17 ` [PATCH v1 7/7] thermal: intel: intel_soc_dts_iosf: Use struct thermal_trip Rafael J. Wysocki
2023-08-11 0:00 ` [PATCH v1 0/7] thermal: intel: intel_soc_dts_iosf: Cleanups, fixes and usage of generic trips srinivas pandruvada
2023-08-11 7:59 ` Zhang, Rui
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox