dt-bindings: thermal-zones: Document critical-action
Subsystems (2)
PATCH v6 1/3 dt-bindings: thermal-zones: Document critical-action
From: Fabio Estevam <[email protected]>
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.
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.
---
Changes since v5:
- None.
.../devicetree/bindings/thermal/thermal-zones.yaml | 9 +++++++++ 1 file changed, 9 insertions(+)
Documentation/devicetree/bindings/thermal/thermal-zones.yaml +9 -0
@@ -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
Signature · 1 line
2.34.1
PATCH v6 2/3 reboot: Introduce hw_protection_reboot()
From: Fabio Estevam <[email protected]>
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.
---
Changes since v5:
- Avoid duplication by making __hw_protection_shutdown() to have a new parameter to decide between shutdown versus reboot. (Rafael)
include/linux/reboot.h | 11 ++++++++++- kernel/reboot.c | 33 ++++++++++++++++++++------------- 2 files changed, 30 insertions(+), 14 deletions(-)
include/linux/reboot.h +10 -1
@@ -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.
kernel/reboot.c +20 -13
@@ -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) {
Signature · 1 line
2.34.1
PATCH v6 3/3 thermal: thermal_core: Allow rebooting after critical temp
In reply to Fabio EstevamFrom: Fabio Estevam <[email protected]>
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";
};
};---
Changes since v5:
- Simplify thermal_of_get_critical_action(). (Rafael)
drivers/thermal/thermal_core.c | 6 +++++- drivers/thermal/thermal_of.c | 21 +++++++++++++++++++++ include/linux/thermal.h | 6 ++++++ 3 files changed, 32 insertions(+), 1 deletion(-)
drivers/thermal/thermal_core.c +5 -1
@@ -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);
drivers/thermal/thermal_of.c +21 -0
@@ -218,6 +218,25 @@ static struct device_node *of_thermal_zone_find(struct device_node *sensor, intreturn tz; } +static const char *const critical_actions[] = { + [THERMAL_CRITICAL_ACTION_SHUTDOWN ] ="shutdown" , + [THERMAL_CRITICAL_ACTION_REBOOT ] ="reboot" , +}; + +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 +535,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",
include/linux/thermal.h +6 -0
@@ -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; };/**
Signature · 1 line
2.34.1
Re: [PATCH v6 3/3] thermal: thermal_core: Allow rebooting after critical temp
drivers/thermal/thermal_of.c static struct device_node *of_thermal_zone_find(struct device_node *sensor, int · line 224
Quoted 4 lines · Fabio Estevam
drivers/thermal/thermal_of.c +4
-0+static const char *const critical_actions[] = { + [THERMAL_CRITICAL_ACTION_SHUTDOWN ] ="shutdown" , + [THERMAL_CRITICAL_ACTION_REBOOT ] ="reboot" , +};
Sorry, this should be removed.
I will wait for some more feedback before sending a v7.
kernel test robot
build botRe: [PATCH v6 3/3] thermal: thermal_core: Allow rebooting after critical temp
In reply to Fabio Estevamkernel test robot noticed the following build warnings:
Hi Fabio,
kernel test robot noticed the following build warnings:
[auto build test WARNING on rafael-pm/thermal]
[also build test WARNING on linus/master v6.5 next-20230830] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Fabio-Estevam/reboot-Introduce-hw_protection_reboot/20230831-034226 base: https://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm.git thermal patch link: https://lore.kernel.org/r/20230830151908.2149847-3-festevam%40gmail.com patch subject: [PATCH v6 3/3] thermal: thermal_core: Allow rebooting after critical temp config: m68k-allyesconfig (https://download.01.org/0day-ci/archive/20230831/[email protected]/config) compiler: m68k-linux-gcc (GCC) 13.2.0 reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20230831/[email protected]/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <[email protected]>
| Closes: https://lore.kernel.org/oe-kbuild-all/[email protected]/
All warnings (new ones prefixed by >>):
>> drivers/thermal/thermal_of.c:221:27: warning: 'critical_actions' defined but not used [-Wunused-const-variable=]
221 | static const char * const critical_actions[] = {
| ^~~~~~~~~~~~~~~~vim +/critical_actions +221 drivers/thermal/thermal_of.c
220
> 221 static const char * const critical_actions[] = { 222 [THERMAL_CRITICAL_ACTION_SHUTDOWN] = "shutdown",
223 [THERMAL_CRITICAL_ACTION_REBOOT] = "reboot",
224 };
225
Signature · 2 lines
0-DAY CI Kernel Test Service https://github.com/intel/lkp-tests/wiki
kernel test robot
build botRe: [PATCH v6 3/3] thermal: thermal_core: Allow rebooting after critical temp
In reply to Fabio Estevamkernel test robot noticed the following build warnings:
Hi Fabio,
kernel test robot noticed the following build warnings:
[auto build test WARNING on rafael-pm/thermal]
[also build test WARNING on linus/master v6.5 next-20230831] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Fabio-Estevam/reboot-Introduce-hw_protection_reboot/20230831-034226 base: https://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm.git thermal patch link: https://lore.kernel.org/r/20230830151908.2149847-3-festevam%40gmail.com patch subject: [PATCH v6 3/3] thermal: thermal_core: Allow rebooting after critical temp config: s390-randconfig-r025-20230831 (https://download.01.org/0day-ci/archive/20230831/[email protected]/config) compiler: clang version 15.0.7 (https://github.com/llvm/llvm-project.git 8dfdcc7b7bf66834a761bd8de445840ef68e4d1a) reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20230831/[email protected]/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <[email protected]>
| Closes: https://lore.kernel.org/oe-kbuild-all/[email protected]/
All warnings (new ones prefixed by >>):
>> drivers/thermal/thermal_of.c:221:27: warning: unused variable 'critical_actions' [-Wunused-const-variable]
static const char * const critical_actions[] = {
^1 warning generated.
vim +/critical_actions +221 drivers/thermal/thermal_of.c
220
> 221 static const char * const critical_actions[] = { 222 [THERMAL_CRITICAL_ACTION_SHUTDOWN] = "shutdown",
223 [THERMAL_CRITICAL_ACTION_REBOOT] = "reboot",
224 };
225
Signature · 2 lines
0-DAY CI Kernel Test Service https://github.com/intel/lkp-tests/wiki