* [PATCH v7 2/3] reboot: Introduce hw_protection_reboot()
2023-08-31 13:02 [PATCH v7 1/3] dt-bindings: thermal-zones: Document critical-action Fabio Estevam
@ 2023-08-31 13:02 ` Fabio Estevam
2023-08-31 13:02 ` [PATCH v7 3/3] thermal: thermal_core: Allow rebooting after critical temp Fabio Estevam
2023-09-07 16:23 ` [PATCH v7 1/3] dt-bindings: thermal-zones: Document critical-action Rafael J. Wysocki
2 siblings, 0 replies; 7+ messages in thread
From: Fabio Estevam @ 2023-08-31 13:02 UTC (permalink / raw)
To: rafael
Cc: daniel.lezcano, amitk, rui.zhang, linux-pm,
krzysztof.kozlowski+dt, robh+dt, conor+dt, devicetree,
Fabio Estevam
From: Fabio Estevam <festevam@denx.de>
Introduce hw_protection_reboot() to trigger an emergency reboot.
It is a counterpart of hw_protection_shutdown() 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 v6:
- None.
include/linux/reboot.h | 11 ++++++++++-
kernel/reboot.c | 33 ++++++++++++++++++++-------------
2 files changed, 30 insertions(+), 14 deletions(-)
diff --git a/include/linux/reboot.h b/include/linux/reboot.h
index 2b6bb593be5b..b6d59c7a3377 100644
--- a/include/linux/reboot.h
+++ b/include/linux/reboot.h
@@ -174,7 +174,16 @@ 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_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);
+}
/*
* Emergency restart, callable from an interrupt handler.
diff --git a/kernel/reboot.c b/kernel/reboot.c
index 3bba88c7ffc6..76fa6e9e4f1d 100644
--- a/kernel/reboot.c
+++ b/kernel/reboot.c
@@ -953,21 +953,25 @@ 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.
+ * 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.
* 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);
@@ -982,9 +986,12 @@ 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);
+ else
+ orderly_reboot();
}
-EXPORT_SYMBOL_GPL(hw_protection_shutdown);
+EXPORT_SYMBOL_GPL(__hw_protection_shutdown);
static int __init reboot_setup(char *str)
{
--
2.34.1
^ permalink raw reply related [flat|nested] 7+ messages in thread* [PATCH v7 3/3] thermal: thermal_core: Allow rebooting after critical temp
2023-08-31 13:02 [PATCH v7 1/3] dt-bindings: thermal-zones: Document critical-action Fabio Estevam
2023-08-31 13:02 ` [PATCH v7 2/3] reboot: Introduce hw_protection_reboot() Fabio Estevam
@ 2023-08-31 13:02 ` Fabio Estevam
2023-09-07 16:23 ` [PATCH v7 1/3] dt-bindings: thermal-zones: Document critical-action Rafael J. Wysocki
2 siblings, 0 replies; 7+ messages in thread
From: Fabio Estevam @ 2023-08-31 13:02 UTC (permalink / raw)
To: rafael
Cc: daniel.lezcano, amitk, rui.zhang, linux-pm,
krzysztof.kozlowski+dt, robh+dt, conor+dt, 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.
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 v6:
- Removed unused variable.
drivers/thermal/thermal_core.c | 6 +++++-
drivers/thermal/thermal_of.c | 16 ++++++++++++++++
include/linux/thermal.h | 6 ++++++
3 files changed, 27 insertions(+), 1 deletion(-)
diff --git a/drivers/thermal/thermal_core.c b/drivers/thermal/thermal_core.c
index a59700593d32..062114608667 100644
--- a/drivers/thermal/thermal_core.c
+++ b/drivers/thermal/thermal_core.c
@@ -320,11 +320,15 @@ void thermal_zone_device_critical(struct thermal_zone_device *tz)
* Its a must for forced_emergency_poweroff_work to be scheduled.
*/
int poweroff_delay_ms = CONFIG_THERMAL_EMERGENCY_POWEROFF_DELAY_MS;
+ static const char *msg = "Temperature too high";
dev_emerg(&tz->device, "%s: critical temperature reached, "
"shutting down\n", tz->type);
- hw_protection_shutdown("Temperature too high", poweroff_delay_ms);
+ if (tz->action == THERMAL_CRITICAL_ACTION_REBOOT)
+ hw_protection_reboot(msg, poweroff_delay_ms);
+ else
+ hw_protection_shutdown(msg, poweroff_delay_ms);
}
EXPORT_SYMBOL(thermal_zone_device_critical);
diff --git a/drivers/thermal/thermal_of.c b/drivers/thermal/thermal_of.c
index 4ca905723429..960bcc2a21bc 100644
--- a/drivers/thermal/thermal_of.c
+++ b/drivers/thermal/thermal_of.c
@@ -218,6 +218,20 @@ static struct device_node *of_thermal_zone_find(struct device_node *sensor, int
return tz;
}
+static void thermal_of_get_critical_action(struct device_node *np,
+ enum thermal_action *action)
+{
+ const char *action_string;
+ int ret;
+
+ ret = of_property_read_string(np, "critical-action", &action_string);
+ if (ret < 0)
+ *action = THERMAL_CRITICAL_ACTION_SHUTDOWN;
+
+ if (!strcasecmp(action_string, "reboot"))
+ *action = THERMAL_CRITICAL_ACTION_REBOOT;
+}
+
static int thermal_of_monitor_init(struct device_node *np, int *delay, int *pdelay)
{
int ret;
@@ -516,6 +530,8 @@ static struct thermal_zone_device *thermal_of_zone_register(struct device_node *
goto out_kfree_trips;
}
+ thermal_of_get_critical_action(np, &tz->action);
+
ret = thermal_zone_device_enable(tz);
if (ret) {
pr_err("Failed to enabled thermal zone '%s', id=%d: %d\n",
diff --git a/include/linux/thermal.h b/include/linux/thermal.h
index b449a46766f5..b68e5734823d 100644
--- a/include/linux/thermal.h
+++ b/include/linux/thermal.h
@@ -34,6 +34,11 @@ struct thermal_cooling_device;
struct thermal_instance;
struct thermal_attr;
+enum thermal_action {
+ THERMAL_CRITICAL_ACTION_SHUTDOWN = 0, /* shutdown when crit temperature is reached */
+ THERMAL_CRITICAL_ACTION_REBOOT, /* reboot when crit temperature is reached */
+};
+
enum thermal_trend {
THERMAL_TREND_STABLE, /* temperature is stable */
THERMAL_TREND_RAISING, /* temperature is raising */
@@ -187,6 +192,7 @@ struct thermal_zone_device {
struct list_head node;
struct delayed_work poll_queue;
enum thermal_notify_event notify_event;
+ enum thermal_action action;
};
/**
--
2.34.1
^ permalink raw reply related [flat|nested] 7+ messages in thread* Re: [PATCH v7 1/3] dt-bindings: thermal-zones: Document critical-action
2023-08-31 13:02 [PATCH v7 1/3] dt-bindings: thermal-zones: Document critical-action Fabio Estevam
2023-08-31 13:02 ` [PATCH v7 2/3] reboot: Introduce hw_protection_reboot() Fabio Estevam
2023-08-31 13:02 ` [PATCH v7 3/3] thermal: thermal_core: Allow rebooting after critical temp Fabio Estevam
@ 2023-09-07 16:23 ` Rafael J. Wysocki
2023-09-08 17:37 ` Fabio Estevam
2 siblings, 1 reply; 7+ messages in thread
From: Rafael J. Wysocki @ 2023-09-07 16:23 UTC (permalink / raw)
To: Fabio Estevam
Cc: rafael, daniel.lezcano, amitk, rui.zhang, linux-pm,
krzysztof.kozlowski+dt, robh+dt, conor+dt, devicetree,
Fabio Estevam, Krzysztof Kozlowski
On Thu, Aug 31, 2023 at 3:02 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.
>
> The possible values are "shutdown" and "reboot".
>
> The motivation for introducing the critical-action property is that
> different systems may need different thermal actions when the critical
> temperature is reached.
>
> For example, a desktop PC may want the OS to trigger a shutdown
> when the critical temperature is reached.
>
> However, 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.
So one more question here: Why is this a property of a thermal zone
and not the property of the whole system?
Presumably, on a system where the platform integrator prefers to
reboot on critical temperature, it would be necessary to add this
property to every thermal zone.
Also, what if this property has different values for different thermal zones?
> The bootloader may also benefit from this new property as it can check
> the SoC temperature and in case the temperature is above the critical
> point, it can trigger a shutdown or reboot accordingly.
>
> Signed-off-by: Fabio Estevam <festevam@denx.de>
> Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
> ---
> Changes since v6:
> - None.
>
> .../devicetree/bindings/thermal/thermal-zones.yaml | 9 +++++++++
> 1 file changed, 9 insertions(+)
>
> diff --git a/Documentation/devicetree/bindings/thermal/thermal-zones.yaml b/Documentation/devicetree/bindings/thermal/thermal-zones.yaml
> index 4f3acdc4dec0..c2e4d28f885b 100644
> --- a/Documentation/devicetree/bindings/thermal/thermal-zones.yaml
> +++ b/Documentation/devicetree/bindings/thermal/thermal-zones.yaml
> @@ -75,6 +75,15 @@ patternProperties:
> framework and assumes that the thermal sensors in this zone
> support interrupts.
>
> + critical-action:
> + $ref: /schemas/types.yaml#/definitions/string
> + description:
> + The action the OS should perform after the critical temperature is reached.
> +
> + enum:
> + - shutdown
> + - reboot
> +
> thermal-sensors:
> $ref: /schemas/types.yaml#/definitions/phandle-array
> maxItems: 1
> --
> 2.34.1
>
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v7 1/3] dt-bindings: thermal-zones: Document critical-action
2023-09-07 16:23 ` [PATCH v7 1/3] dt-bindings: thermal-zones: Document critical-action Rafael J. Wysocki
@ 2023-09-08 17:37 ` Fabio Estevam
2023-09-08 18:01 ` Rafael J. Wysocki
0 siblings, 1 reply; 7+ messages in thread
From: Fabio Estevam @ 2023-09-08 17:37 UTC (permalink / raw)
To: Rafael J. Wysocki
Cc: Fabio Estevam, daniel.lezcano, amitk, rui.zhang, linux-pm,
krzysztof.kozlowski+dt, robh+dt, conor+dt, devicetree,
Krzysztof Kozlowski
Hi Rafael,
On 07/09/2023 13:23, Rafael J. Wysocki wrote:
> So one more question here: Why is this a property of a thermal zone
> and not the property of the whole system?
>
> Presumably, on a system where the platform integrator prefers to
> reboot on critical temperature, it would be necessary to add this
> property to every thermal zone.
>
> Also, what if this property has different values for different thermal
> zones?
I got your point and I can make the 'critical-action' property to be
valid
for the whole thermal system.
Originally, I have been doing like this:
thermal-zones {
cpu-thermal {
critical-action = "reboot";
polling-delay-passive = <250>;
polling-delay = <2000>;
thermal-sensors = <&tmu>;
trips {
cpu_alert0: trip0 {
temperature = <85000>;
hysteresis = <2000>;
type = "passive";
};
I can change it to be:
thermal-zones {
critical-action = "reboot";
cpu-thermal {
polling-delay-passive = <250>;
polling-delay = <2000>;
thermal-sensors = <&tmu>;
trips {
cpu_alert0: trip0 {
temperature = <85000>;
hysteresis = <2000>;
type = "passive";
};
Thanks,
Fabio Estevam
^ permalink raw reply [flat|nested] 7+ messages in thread* Re: [PATCH v7 1/3] dt-bindings: thermal-zones: Document critical-action
2023-09-08 17:37 ` Fabio Estevam
@ 2023-09-08 18:01 ` Rafael J. Wysocki
2023-09-12 15:14 ` Fabio Estevam
0 siblings, 1 reply; 7+ messages in thread
From: Rafael J. Wysocki @ 2023-09-08 18:01 UTC (permalink / raw)
To: Fabio Estevam
Cc: Rafael J. Wysocki, Fabio Estevam, daniel.lezcano, amitk,
rui.zhang, linux-pm, krzysztof.kozlowski+dt, robh+dt, conor+dt,
devicetree, Krzysztof Kozlowski
On Fri, Sep 8, 2023 at 7:37 PM Fabio Estevam <festevam@denx.de> wrote:
>
> Hi Rafael,
>
> On 07/09/2023 13:23, Rafael J. Wysocki wrote:
>
> > So one more question here: Why is this a property of a thermal zone
> > and not the property of the whole system?
> >
> > Presumably, on a system where the platform integrator prefers to
> > reboot on critical temperature, it would be necessary to add this
> > property to every thermal zone.
> >
> > Also, what if this property has different values for different thermal
> > zones?
>
> I got your point and I can make the 'critical-action' property to be
> valid
> for the whole thermal system.
>
> Originally, I have been doing like this:
>
> thermal-zones {
> cpu-thermal {
> critical-action = "reboot";
> polling-delay-passive = <250>;
> polling-delay = <2000>;
> thermal-sensors = <&tmu>;
>
> trips {
> cpu_alert0: trip0 {
> temperature = <85000>;
> hysteresis = <2000>;
> type = "passive";
> };
>
> I can change it to be:
>
>
> thermal-zones {
> critical-action = "reboot";
>
> cpu-thermal {
> polling-delay-passive = <250>;
> polling-delay = <2000>;
> thermal-sensors = <&tmu>;
>
> trips {
> cpu_alert0: trip0 {
> temperature = <85000>;
> hysteresis = <2000>;
> type = "passive";
> };
>
I think that this would match the use case better.
I still would love to hear about it from the people who take care of
the DT-based thermal control (mostly Daniel and Amit, who BTW is
listed as the maintainer of the file being updated by this patch),
though.
^ permalink raw reply [flat|nested] 7+ messages in thread* Re: [PATCH v7 1/3] dt-bindings: thermal-zones: Document critical-action
2023-09-08 18:01 ` Rafael J. Wysocki
@ 2023-09-12 15:14 ` Fabio Estevam
0 siblings, 0 replies; 7+ messages in thread
From: Fabio Estevam @ 2023-09-12 15:14 UTC (permalink / raw)
To: Rafael J. Wysocki, amitk, daniel.lezcano
Cc: Fabio Estevam, rui.zhang, linux-pm, krzysztof.kozlowski+dt,
robh+dt, conor+dt, devicetree, Krzysztof Kozlowski
Hi Amit and Daniel,
On Fri, Sep 8, 2023 at 3:02 PM Rafael J. Wysocki <rafael@kernel.org> wrote:
>
> On Fri, Sep 8, 2023 at 7:37 PM Fabio Estevam <festevam@denx.de> wrote:
> >
> > Hi Rafael,
> >
> > On 07/09/2023 13:23, Rafael J. Wysocki wrote:
> >
> > > So one more question here: Why is this a property of a thermal zone
> > > and not the property of the whole system?
> > >
> > > Presumably, on a system where the platform integrator prefers to
> > > reboot on critical temperature, it would be necessary to add this
> > > property to every thermal zone.
> > >
> > > Also, what if this property has different values for different thermal
> > > zones?
> >
> > I got your point and I can make the 'critical-action' property to be
> > valid
> > for the whole thermal system.
> >
> > Originally, I have been doing like this:
> >
> > thermal-zones {
> > cpu-thermal {
> > critical-action = "reboot";
> > polling-delay-passive = <250>;
> > polling-delay = <2000>;
> > thermal-sensors = <&tmu>;
> >
> > trips {
> > cpu_alert0: trip0 {
> > temperature = <85000>;
> > hysteresis = <2000>;
> > type = "passive";
> > };
> >
> > I can change it to be:
> >
> >
> > thermal-zones {
> > critical-action = "reboot";
> >
> > cpu-thermal {
> > polling-delay-passive = <250>;
> > polling-delay = <2000>;
> > thermal-sensors = <&tmu>;
> >
> > trips {
> > cpu_alert0: trip0 {
> > temperature = <85000>;
> > hysteresis = <2000>;
> > type = "passive";
> > };
> >
>
> I think that this would match the use case better.
>
> I still would love to hear about it from the people who take care of
> the DT-based thermal control (mostly Daniel and Amit, who BTW is
> listed as the maintainer of the file being updated by this patch),
> though.
Please let us know what you think.
I can send v8 which places the 'critical-action' property to be valid
for the whole thermal system, as suggested by Rafael.
Thanks
^ permalink raw reply [flat|nested] 7+ messages in thread