* [PATCH v10 2/4] thermal_core: Prepare for introduction of thermal reboot
2023-10-06 18:04 [PATCH v10 1/4] dt-bindings: thermal-zones: Document critical-action Fabio Estevam
@ 2023-10-06 18:04 ` Fabio Estevam
2023-10-06 18:04 ` [PATCH v10 3/4] reboot: Introduce thermal_zone_device_critical_reboot() Fabio Estevam
` (2 subsequent siblings)
3 siblings, 0 replies; 8+ messages in thread
From: Fabio Estevam @ 2023-10-06 18:04 UTC (permalink / raw)
To: daniel.lezcano
Cc: rafael, krzysztof.kozlowski+dt, robh+dt, conor+dt, linux-pm,
devicetree, Fabio Estevam
From: Fabio Estevam <festevam@denx.de>
Add some helper functions to make it easier introducing the support
for thermal reboot.
No functional change.
Signed-off-by: Fabio Estevam <festevam@denx.de>
---
Changes since v9:
- Newly introduced.
drivers/thermal/thermal_core.c | 14 ++++++++++----
include/linux/reboot.h | 7 ++++++-
kernel/reboot.c | 8 ++++----
3 files changed, 20 insertions(+), 9 deletions(-)
diff --git a/drivers/thermal/thermal_core.c b/drivers/thermal/thermal_core.c
index 45d0aa0b69b7..3184e9f2eadd 100644
--- a/drivers/thermal/thermal_core.c
+++ b/drivers/thermal/thermal_core.c
@@ -313,18 +313,24 @@ static void handle_non_critical_trips(struct thermal_zone_device *tz, int trip)
def_governor->throttle(tz, trip);
}
-void thermal_zone_device_critical(struct thermal_zone_device *tz)
+static void thermal_zone_device_halt(struct thermal_zone_device *tz, bool shutdown)
{
/*
* poweroff_delay_ms must be a carefully profiled positive value.
* Its a must for forced_emergency_poweroff_work to be scheduled.
*/
int poweroff_delay_ms = CONFIG_THERMAL_EMERGENCY_POWEROFF_DELAY_MS;
+ const char *msg = "Temperature too high";
+
+ dev_emerg(&tz->device, "%s: critical temperature reached\n", tz->type);
- dev_emerg(&tz->device, "%s: critical temperature reached, "
- "shutting down\n", tz->type);
+ if (shutdown)
+ hw_protection_shutdown(msg, poweroff_delay_ms);
+}
- hw_protection_shutdown("Temperature too high", poweroff_delay_ms);
+void thermal_zone_device_critical(struct thermal_zone_device *tz)
+{
+ thermal_zone_device_halt(tz, true);
}
EXPORT_SYMBOL(thermal_zone_device_critical);
diff --git a/include/linux/reboot.h b/include/linux/reboot.h
index c4cc3b89ced1..4586c663884e 100644
--- a/include/linux/reboot.h
+++ b/include/linux/reboot.h
@@ -177,7 +177,12 @@ void ctrl_alt_del(void);
extern void orderly_poweroff(bool force);
extern void orderly_reboot(void);
-void hw_protection_shutdown(const char *reason, int ms_until_forced);
+void __hw_protection_shutdown(const char *reason, int ms_until_forced, bool shutdown);
+
+static inline void hw_protection_shutdown(const char *reason, int ms_until_forced)
+{
+ __hw_protection_shutdown(reason, ms_until_forced, true);
+}
/*
* Emergency restart, callable from an interrupt handler.
diff --git a/kernel/reboot.c b/kernel/reboot.c
index 395a0ea3c7a8..b236c4c06bb3 100644
--- a/kernel/reboot.c
+++ b/kernel/reboot.c
@@ -957,7 +957,7 @@ static void hw_failure_emergency_poweroff(int poweroff_delay_ms)
}
/**
- * hw_protection_shutdown - Trigger an emergency system poweroff
+ * __hw_protection_shutdown - Trigger an emergency system poweroff
*
* @reason: Reason of emergency shutdown to be printed.
* @ms_until_forced: Time to wait for orderly shutdown before tiggering a
@@ -971,7 +971,7 @@ static void hw_failure_emergency_poweroff(int poweroff_delay_ms)
* if the previous request has given a large timeout for forced shutdown.
* Can be called from any context.
*/
-void hw_protection_shutdown(const char *reason, int ms_until_forced)
+void __hw_protection_shutdown(const char *reason, int ms_until_forced, bool shutdown)
{
static atomic_t allow_proceed = ATOMIC_INIT(1);
@@ -986,9 +986,9 @@ void hw_protection_shutdown(const char *reason, int ms_until_forced)
* orderly_poweroff failure
*/
hw_failure_emergency_poweroff(ms_until_forced);
- orderly_poweroff(true);
+ if (shutdown)
+ orderly_poweroff(true);
}
-EXPORT_SYMBOL_GPL(hw_protection_shutdown);
static int __init reboot_setup(char *str)
{
--
2.34.1
^ permalink raw reply related [flat|nested] 8+ messages in thread* [PATCH v10 3/4] reboot: Introduce thermal_zone_device_critical_reboot()
2023-10-06 18:04 [PATCH v10 1/4] dt-bindings: thermal-zones: Document critical-action Fabio Estevam
2023-10-06 18:04 ` [PATCH v10 2/4] thermal_core: Prepare for introduction of thermal reboot Fabio Estevam
@ 2023-10-06 18:04 ` Fabio Estevam
2023-10-06 18:04 ` [PATCH v10 4/4] thermal: thermal_of: Allow rebooting after critical temp Fabio Estevam
2023-10-13 10:39 ` [PATCH v10 1/4] dt-bindings: thermal-zones: Document critical-action Fabio Estevam
3 siblings, 0 replies; 8+ messages in thread
From: Fabio Estevam @ 2023-10-06 18:04 UTC (permalink / raw)
To: daniel.lezcano
Cc: rafael, krzysztof.kozlowski+dt, robh+dt, conor+dt, linux-pm,
devicetree, Fabio Estevam
From: Fabio Estevam <festevam@denx.de>
Introduce thermal_zone_device_critical_reboot() to trigger an
emergency reboot.
It is a counterpart of thermal_zone_device_critical() with the
difference that it will force a reboot instead of shutdown.
The motivation for doing this is to allow the thermal subystem
to trigger a reboot when the temperature reaches the critical
temperature.
Signed-off-by: Fabio Estevam <festevam@denx.de>
---
Changes since v9:
- Make it smaller after introducing the previous patch. (Daniel)
drivers/thermal/thermal_core.c | 7 +++++++
include/linux/reboot.h | 5 +++++
include/linux/thermal.h | 1 +
kernel/reboot.c | 27 ++++++++++++++++-----------
4 files changed, 29 insertions(+), 11 deletions(-)
diff --git a/drivers/thermal/thermal_core.c b/drivers/thermal/thermal_core.c
index 3184e9f2eadd..b92795529a53 100644
--- a/drivers/thermal/thermal_core.c
+++ b/drivers/thermal/thermal_core.c
@@ -326,6 +326,8 @@ static void thermal_zone_device_halt(struct thermal_zone_device *tz, bool shutdo
if (shutdown)
hw_protection_shutdown(msg, poweroff_delay_ms);
+ else
+ hw_protection_reboot(msg, poweroff_delay_ms);
}
void thermal_zone_device_critical(struct thermal_zone_device *tz)
@@ -334,6 +336,11 @@ void thermal_zone_device_critical(struct thermal_zone_device *tz)
}
EXPORT_SYMBOL(thermal_zone_device_critical);
+void thermal_zone_device_critical_reboot(struct thermal_zone_device *tz)
+{
+ thermal_zone_device_halt(tz, false);
+}
+
static void handle_critical_trips(struct thermal_zone_device *tz,
int trip, int trip_temp, enum thermal_trip_type trip_type)
{
diff --git a/include/linux/reboot.h b/include/linux/reboot.h
index 4586c663884e..abcdde4df697 100644
--- a/include/linux/reboot.h
+++ b/include/linux/reboot.h
@@ -179,6 +179,11 @@ extern void orderly_poweroff(bool force);
extern void orderly_reboot(void);
void __hw_protection_shutdown(const char *reason, int ms_until_forced, bool shutdown);
+static inline void hw_protection_reboot(const char *reason, int ms_until_forced)
+{
+ __hw_protection_shutdown(reason, ms_until_forced, false);
+}
+
static inline void hw_protection_shutdown(const char *reason, int ms_until_forced)
{
__hw_protection_shutdown(reason, ms_until_forced, true);
diff --git a/include/linux/thermal.h b/include/linux/thermal.h
index 6710a4ace992..a026ce390a87 100644
--- a/include/linux/thermal.h
+++ b/include/linux/thermal.h
@@ -361,6 +361,7 @@ int thermal_zone_get_offset(struct thermal_zone_device *tz);
int thermal_zone_device_enable(struct thermal_zone_device *tz);
int thermal_zone_device_disable(struct thermal_zone_device *tz);
void thermal_zone_device_critical(struct thermal_zone_device *tz);
+void thermal_zone_device_critical_reboot(struct thermal_zone_device *tz);
#else
static inline struct thermal_zone_device *thermal_zone_device_register_with_trips(
const char *type,
diff --git a/kernel/reboot.c b/kernel/reboot.c
index b236c4c06bb3..7bc01b38629a 100644
--- a/kernel/reboot.c
+++ b/kernel/reboot.c
@@ -957,19 +957,22 @@ static void hw_failure_emergency_poweroff(int poweroff_delay_ms)
}
/**
- * __hw_protection_shutdown - Trigger an emergency system poweroff
+ * __hw_protection_shutdown - Trigger an emergency system shutdown or reboot
*
- * @reason: Reason of emergency shutdown to be printed.
- * @ms_until_forced: Time to wait for orderly shutdown before tiggering a
- * forced shudown. Negative value disables the forced
- * shutdown.
+ * @reason: Reason of emergency shutdown or reboot to be printed.
+ * @ms_until_forced: Time to wait for orderly shutdown or reboot before
+ * triggering it. Negative value disables the forced
+ * shutdown or reboot.
+ * @shutdown: If true, indicates that a shutdown will happen
+ * after the critical tempeature is reached.
+ * If false, indicates that a reboot will happen
+ * after the critical tempeature is reached.
*
- * Initiate an emergency system shutdown in order to protect hardware from
- * further damage. Usage examples include a thermal protection or a voltage or
- * current regulator failures.
- * NOTE: The request is ignored if protection shutdown is already pending even
- * if the previous request has given a large timeout for forced shutdown.
- * Can be called from any context.
+ * Initiate an emergency system shutdown or reboot in order to protect
+ * hardware from further damage. Usage examples include a thermal protection.
+ * NOTE: The request is ignored if protection shutdown or reboot is already
+ * pending even if the previous request has given a large timeout for forced
+ * shutdown/reboot.
*/
void __hw_protection_shutdown(const char *reason, int ms_until_forced, bool shutdown)
{
@@ -988,6 +991,8 @@ void __hw_protection_shutdown(const char *reason, int ms_until_forced, bool shut
hw_failure_emergency_poweroff(ms_until_forced);
if (shutdown)
orderly_poweroff(true);
+ else
+ orderly_reboot();
}
static int __init reboot_setup(char *str)
--
2.34.1
^ permalink raw reply related [flat|nested] 8+ messages in thread* [PATCH v10 4/4] thermal: thermal_of: Allow rebooting after critical temp
2023-10-06 18:04 [PATCH v10 1/4] dt-bindings: thermal-zones: Document critical-action Fabio Estevam
2023-10-06 18:04 ` [PATCH v10 2/4] thermal_core: Prepare for introduction of thermal reboot Fabio Estevam
2023-10-06 18:04 ` [PATCH v10 3/4] reboot: Introduce thermal_zone_device_critical_reboot() Fabio Estevam
@ 2023-10-06 18:04 ` Fabio Estevam
2023-10-13 10:39 ` [PATCH v10 1/4] dt-bindings: thermal-zones: Document critical-action Fabio Estevam
3 siblings, 0 replies; 8+ messages in thread
From: Fabio Estevam @ 2023-10-06 18:04 UTC (permalink / raw)
To: daniel.lezcano
Cc: rafael, krzysztof.kozlowski+dt, robh+dt, conor+dt, linux-pm,
devicetree, Fabio Estevam
From: Fabio Estevam <festevam@denx.de>
Currently, the default mechanism is to trigger a shutdown after the
critical temperature is reached.
In some embedded cases, such behavior does not suit well, as the board may
be unattended in the field and rebooting may be a better approach.
The bootloader may also check the temperature and only allow the boot to
proceed when the temperature is below a certain threshold.
Introduce support for allowing a reboot to be triggered after the
critical temperature is reached.
If the "critical-action" devicetree property is not found, fall back to
the shutdown action to preserve the existing default behavior.
If a custom ops->critical exists, then it takes preference over
critical-actions.
Tested on a i.MX8MM board with the following devicetree changes:
thermal-zones {
cpu-thermal {
critical-action = "reboot";
};
};
Signed-off-by: Fabio Estevam <festevam@denx.de>
---
Changes since v9:
- Fixed a typo in the Subject.
drivers/thermal/thermal_of.c | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/drivers/thermal/thermal_of.c b/drivers/thermal/thermal_of.c
index 1e0655b63259..4d6c22e0ed85 100644
--- a/drivers/thermal/thermal_of.c
+++ b/drivers/thermal/thermal_of.c
@@ -475,6 +475,7 @@ static struct thermal_zone_device *thermal_of_zone_register(struct device_node *
struct thermal_zone_params tzp = {};
struct thermal_zone_device_ops *of_ops;
struct device_node *np;
+ const char *action;
int delay, pdelay;
int ntrips, mask;
int ret;
@@ -511,6 +512,11 @@ static struct thermal_zone_device *thermal_of_zone_register(struct device_node *
mask = GENMASK_ULL((ntrips) - 1, 0);
+ ret = of_property_read_string(np, "critical-action", &action);
+ if (!ret)
+ if (!of_ops->critical && !strcasecmp(action, "reboot"))
+ of_ops->critical = thermal_zone_device_critical_reboot;
+
tz = thermal_zone_device_register_with_trips(np->name, trips, ntrips,
mask, data, of_ops, &tzp,
pdelay, delay);
--
2.34.1
^ permalink raw reply related [flat|nested] 8+ messages in thread* Re: [PATCH v10 1/4] dt-bindings: thermal-zones: Document critical-action
2023-10-06 18:04 [PATCH v10 1/4] dt-bindings: thermal-zones: Document critical-action Fabio Estevam
` (2 preceding siblings ...)
2023-10-06 18:04 ` [PATCH v10 4/4] thermal: thermal_of: Allow rebooting after critical temp Fabio Estevam
@ 2023-10-13 10:39 ` Fabio Estevam
2023-10-15 21:54 ` Daniel Lezcano
3 siblings, 1 reply; 8+ messages in thread
From: Fabio Estevam @ 2023-10-13 10:39 UTC (permalink / raw)
To: daniel.lezcano
Cc: rafael, krzysztof.kozlowski+dt, robh+dt, conor+dt, linux-pm,
devicetree, Fabio Estevam, Krzysztof Kozlowski
Hi Daniel,
On Fri, Oct 6, 2023 at 3:05 PM Fabio Estevam <festevam@gmail.com> wrote:
>
> From: Fabio Estevam <festevam@denx.de>
>
> Document the critical-action property to describe the thermal action
> the OS should perform after the critical temperature is reached.
Are you happy with the v10 series?
Thanks
^ permalink raw reply [flat|nested] 8+ messages in thread* Re: [PATCH v10 1/4] dt-bindings: thermal-zones: Document critical-action
2023-10-13 10:39 ` [PATCH v10 1/4] dt-bindings: thermal-zones: Document critical-action Fabio Estevam
@ 2023-10-15 21:54 ` Daniel Lezcano
2023-10-17 12:37 ` Fabio Estevam
0 siblings, 1 reply; 8+ messages in thread
From: Daniel Lezcano @ 2023-10-15 21:54 UTC (permalink / raw)
To: Fabio Estevam
Cc: rafael, krzysztof.kozlowski+dt, robh+dt, conor+dt, linux-pm,
devicetree, Fabio Estevam, Krzysztof Kozlowski
On 13/10/2023 12:39, Fabio Estevam wrote:
> Hi Daniel,
>
> On Fri, Oct 6, 2023 at 3:05 PM Fabio Estevam <festevam@gmail.com> wrote:
>>
>> From: Fabio Estevam <festevam@denx.de>
>>
>> Document the critical-action property to describe the thermal action
>> the OS should perform after the critical temperature is reached.
>
> Are you happy with the v10 series?
Yes, I think they are fine except one thing.
The include/linux/reboot.h is changed along with thermal*.c file. IMO it
is preferable to have separate patch, I mean all reboot.h changes folded
in a single patch before the thermal_*.c changes. It is actually
orphaned and we should ask Matti Vaittinen <mazziesaccount@gmail.com>
its acked-by as he is the author of the code you are changing.
Otherwise, he will have to ack the patches which contain also thermal
code which is not its area.
--
<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
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH v10 1/4] dt-bindings: thermal-zones: Document critical-action
2023-10-15 21:54 ` Daniel Lezcano
@ 2023-10-17 12:37 ` Fabio Estevam
2023-11-13 16:03 ` Fabio Estevam
0 siblings, 1 reply; 8+ messages in thread
From: Fabio Estevam @ 2023-10-17 12:37 UTC (permalink / raw)
To: Daniel Lezcano
Cc: rafael, krzysztof.kozlowski+dt, robh+dt, conor+dt, linux-pm,
devicetree, Fabio Estevam, Krzysztof Kozlowski
Hi Daniel,
On Sun, Oct 15, 2023 at 6:54 PM Daniel Lezcano
<daniel.lezcano@linaro.org> wrote:
> > Are you happy with the v10 series?
>
> Yes, I think they are fine except one thing.
>
> The include/linux/reboot.h is changed along with thermal*.c file. IMO it
> is preferable to have separate patch, I mean all reboot.h changes folded
> in a single patch before the thermal_*.c changes. It is actually
I tried to follow your suggestion of putting all reboot.h changes
folded in a single patch before the thermal_*.c changes,
but I don't think I can do this split and maintain a logic patch
separation and bisectability.
> orphaned and we should ask Matti Vaittinen <mazziesaccount@gmail.com>
> its acked-by as he is the author of the code you are changing.
> Otherwise, he will have to ack the patches which contain also thermal
> code which is not its area.
The reason I haven't added Matti on Cc on the series is that
get_maintainer did not list him. Added him on Cc now.
Maybe Matti could help acking patches 2/4 and 3/4?
Full series:
https://lore.kernel.org/linux-pm/20231006180453.2903342-1-festevam@gmail.com/
https://lore.kernel.org/linux-pm/20231006180453.2903342-2-festevam@gmail.com/
https://lore.kernel.org/linux-pm/20231006180453.2903342-3-festevam@gmail.com/
https://lore.kernel.org/linux-pm/20231006180453.2903342-4-festevam@gmail.com/
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH v10 1/4] dt-bindings: thermal-zones: Document critical-action
2023-10-17 12:37 ` Fabio Estevam
@ 2023-11-13 16:03 ` Fabio Estevam
0 siblings, 0 replies; 8+ messages in thread
From: Fabio Estevam @ 2023-11-13 16:03 UTC (permalink / raw)
To: Daniel Lezcano
Cc: rafael, krzysztof.kozlowski+dt, robh+dt, conor+dt, linux-pm,
devicetree, Fabio Estevam, Krzysztof Kozlowski
Hi Daniel,
Now that 6.7-rc1 is out, could you please consider taking this series?
Thanks
On Tue, Oct 17, 2023 at 9:37 AM Fabio Estevam <festevam@gmail.com> wrote:
>
> Hi Daniel,
>
> On Sun, Oct 15, 2023 at 6:54 PM Daniel Lezcano
> <daniel.lezcano@linaro.org> wrote:
>
> > > Are you happy with the v10 series?
> >
> > Yes, I think they are fine except one thing.
> >
> > The include/linux/reboot.h is changed along with thermal*.c file. IMO it
> > is preferable to have separate patch, I mean all reboot.h changes folded
> > in a single patch before the thermal_*.c changes. It is actually
>
> I tried to follow your suggestion of putting all reboot.h changes
> folded in a single patch before the thermal_*.c changes,
> but I don't think I can do this split and maintain a logic patch
> separation and bisectability.
>
> > orphaned and we should ask Matti Vaittinen <mazziesaccount@gmail.com>
> > its acked-by as he is the author of the code you are changing.
> > Otherwise, he will have to ack the patches which contain also thermal
> > code which is not its area.
>
> The reason I haven't added Matti on Cc on the series is that
> get_maintainer did not list him. Added him on Cc now.
>
> Maybe Matti could help acking patches 2/4 and 3/4?
>
> Full series:
>
> https://lore.kernel.org/linux-pm/20231006180453.2903342-1-festevam@gmail.com/
>
> https://lore.kernel.org/linux-pm/20231006180453.2903342-2-festevam@gmail.com/
>
> https://lore.kernel.org/linux-pm/20231006180453.2903342-3-festevam@gmail.com/
>
> https://lore.kernel.org/linux-pm/20231006180453.2903342-4-festevam@gmail.com/
^ permalink raw reply [flat|nested] 8+ messages in thread