From patchwork Thu Aug 31 13:02:40 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Fabio Estevam X-Patchwork-Id: 719316 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 204B6C83F01 for ; Thu, 31 Aug 2023 13:02:58 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1346308AbjHaNC6 (ORCPT ); Thu, 31 Aug 2023 09:02:58 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:50068 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229716AbjHaNC5 (ORCPT ); Thu, 31 Aug 2023 09:02:57 -0400 Received: from mail-oa1-x31.google.com (mail-oa1-x31.google.com [IPv6:2001:4860:4864:20::31]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 5B857E54; Thu, 31 Aug 2023 06:02:52 -0700 (PDT) Received: by mail-oa1-x31.google.com with SMTP id 586e51a60fabf-1cc69d1f9b1so149498fac.1; Thu, 31 Aug 2023 06:02:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20221208; t=1693486971; x=1694091771; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=omTIcvMAzt4T+uKQ/8Elpf5Oymi8x72R/c1fzEu2FxU=; b=sKJtxX0KZ8WU7YKFqTH53PdA8ZyU/uuMuIyrOWGhoFR+EFHDAU2K+sqKsW9fEY0slX cPHfgX/+HbitChEdeix4iAjZitU2vBWhYrcETNcdqo/UqWwa6eRItpEjELLo3yZqKuBB cW2fF6b1FOJ9NhATmil1mZERsl2wBGd0cZkStQ3U1WKk/4EsAFfxbTGXU0ZvjEWtrvRs LHkopSCoJjs3sBvZA5/EWYXMQXYtNFAPCVeowGKLlLCM8bT7Z49tx/KbOA5258teO9PC 2A5XmB5QUhi+AUoDJF4o+W49NxIIT7vhQ7EEeRIwSWrBWPBtE8plmxcoIk5Hal0Lh44N 9P4A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1693486971; x=1694091771; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=omTIcvMAzt4T+uKQ/8Elpf5Oymi8x72R/c1fzEu2FxU=; b=NgRu8xPS82H+IQIJBDumDz3SJowwkHTsyboBQ79FnLqFbIB0ILyEqr/8c6csNKRI3k +9ueuAoS0Eh3JhSHBv3Iv6qz8h8S/iN11a3Am9Bud5AE6FdwrZ0tBF+ncChbhMXABfNS 0FJQO/++y4exaQ+Ese9lxbWyWHgYttzNybEe7RMknFAKoi4C6N6S0queXiTq4gC5PCUs Ih1DCnyhwTkVlbP8/amY0/2VzHqsS2Vj5iftF3H9kYTlXaTQq1QNRvvBwbCWRGzWKigU I3lmNPD2jorCsCUw7C9Rlz3nQOW4byYdOhAiAqWzNE7nrwcIOjbUszVByuwzrkX0136V 1+TQ== X-Gm-Message-State: AOJu0Yy4xK1sX5k/F/3SQ6LJs1us88QcchFYfQUkdwvIy6LWTXhH72jq RVpvrp0b7o9UEKir2fZIMGI= X-Google-Smtp-Source: AGHT+IEF5yOFMNIe9c1prdEEOUCGWI9g+SkAzt464rq1BAKEX+giD1VS3xPJoM/RXcdBn7rqcVF4mg== X-Received: by 2002:a05:6870:2381:b0:1c8:d305:5fac with SMTP id e1-20020a056870238100b001c8d3055facmr5563638oap.4.1693486971545; Thu, 31 Aug 2023 06:02:51 -0700 (PDT) Received: from fabio-Precision-3551.. ([2804:14c:485:4b61:583a:68ca:f232:6448]) by smtp.gmail.com with ESMTPSA id zh26-20020a0568716b9a00b001bfd65998aesm802155oab.58.2023.08.31.06.02.47 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 31 Aug 2023 06:02:50 -0700 (PDT) From: Fabio Estevam To: rafael@kernel.org Cc: daniel.lezcano@linaro.org, amitk@kernel.org, rui.zhang@intel.com, linux-pm@vger.kernel.org, krzysztof.kozlowski+dt@linaro.org, robh+dt@kernel.org, conor+dt@kernel.org, devicetree@vger.kernel.org, Fabio Estevam , Krzysztof Kozlowski Subject: [PATCH v7 1/3] dt-bindings: thermal-zones: Document critical-action Date: Thu, 31 Aug 2023 10:02:40 -0300 Message-Id: <20230831130242.2290502-1-festevam@gmail.com> X-Mailer: git-send-email 2.34.1 MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-pm@vger.kernel.org From: Fabio Estevam 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. Signed-off-by: Fabio Estevam Reviewed-by: Krzysztof Kozlowski --- 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 From patchwork Thu Aug 31 13:02:41 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Fabio Estevam X-Patchwork-Id: 719673 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 2E331C83F36 for ; Thu, 31 Aug 2023 13:02:59 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1346316AbjHaNDA (ORCPT ); Thu, 31 Aug 2023 09:03:00 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:50100 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1346320AbjHaNC7 (ORCPT ); Thu, 31 Aug 2023 09:02:59 -0400 Received: from mail-oa1-x2f.google.com (mail-oa1-x2f.google.com [IPv6:2001:4860:4864:20::2f]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 82AF4E49; Thu, 31 Aug 2023 06:02:55 -0700 (PDT) Received: by mail-oa1-x2f.google.com with SMTP id 586e51a60fabf-1c4f8aa690cso54687fac.1; Thu, 31 Aug 2023 06:02:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20221208; t=1693486975; x=1694091775; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=vjiM0hE7UYPJ02iVkLiAIo7jZMCiroGK59XnT6VStsQ=; b=NrmkslorUoaVwWnICNt84/VtI7QaqysoUvGJ1ePmqFb2/l+Svvm/BRgJhztG1T4dMQ BjPpYvmUREpNnWXP5nTWv/8juO3DOWKmm9Xr4MlwqKD+EibxoMmbUb3NkCkVmR61NVzP 5v/WvejdDG3uIIQTgVbp8DVY7gpVbJ3HFNLxmf8aAFOHZl8SWtpE8YLxbHORvtxtpILl SXCEa+zdCpKF/Gushw9WDYD/iY3EDnL/k0yGE4cXZtXv1iiwYPkb0XGyOkTbunR0M7mK /SdTHVOR7IL2O6AwcOcOhsQho+R/W+weZvF2WRqNBsjroYVtb3MW7KQ9wO5y81GkkUwl 7k0A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1693486975; x=1694091775; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=vjiM0hE7UYPJ02iVkLiAIo7jZMCiroGK59XnT6VStsQ=; b=OYetrwmzCdJ4hp6EcVGZymJLRkFGtTS2+fykvJJRHv87HyWbKtTKCcsPUi3bb2VUfb j3sdTWISHZBKBDX3J9GbZiI3NFNAS9wr3PmnO/niWRDGJLynjaQauAqMyoAiQaPA1DeI w6YKWsf7cHE5Kn6AqgyOBM4LVb4yTB8wY6GFQ6wpD9XUbuDuR2P/g7rK36qtINQgDJdF UoNbPGmdsOGZJdhC+HHXN/GzAL3abqaHJsGjWEDLwkSHoXMYemrZQtk+iioDotm2I2T9 V4tzCpqJ8fRRQ0Niv0nkT7DXNkMxi+k5sy3arie8x+byxih2ySPsqG3oRMaknypj7gTp mCqQ== X-Gm-Message-State: AOJu0Yxxe8KEXYB6M1jwr0ce+rKfgMt/B+2hQ4xhcqlUiSkeZBiEuum8 s5BsKtFHiYiqUx2xL/CGuzo= X-Google-Smtp-Source: AGHT+IFlWVfvv/z3eWKApgEDr2JvB1XUHQU+jO67pf71eZpYAVdHbiB+yDnwOBIwvQXjS4QIb9eZow== X-Received: by 2002:a05:6870:2198:b0:192:6fce:d3be with SMTP id l24-20020a056870219800b001926fced3bemr6383289oae.1.1693486974690; Thu, 31 Aug 2023 06:02:54 -0700 (PDT) Received: from fabio-Precision-3551.. ([2804:14c:485:4b61:583a:68ca:f232:6448]) by smtp.gmail.com with ESMTPSA id zh26-20020a0568716b9a00b001bfd65998aesm802155oab.58.2023.08.31.06.02.51 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 31 Aug 2023 06:02:54 -0700 (PDT) From: Fabio Estevam To: rafael@kernel.org Cc: daniel.lezcano@linaro.org, amitk@kernel.org, rui.zhang@intel.com, linux-pm@vger.kernel.org, krzysztof.kozlowski+dt@linaro.org, robh+dt@kernel.org, conor+dt@kernel.org, devicetree@vger.kernel.org, Fabio Estevam Subject: [PATCH v7 2/3] reboot: Introduce hw_protection_reboot() Date: Thu, 31 Aug 2023 10:02:41 -0300 Message-Id: <20230831130242.2290502-2-festevam@gmail.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230831130242.2290502-1-festevam@gmail.com> References: <20230831130242.2290502-1-festevam@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-pm@vger.kernel.org From: Fabio Estevam 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 --- 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) { From patchwork Thu Aug 31 13:02:42 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Fabio Estevam X-Patchwork-Id: 719315 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 80D2FC83F35 for ; Thu, 31 Aug 2023 13:03:01 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235268AbjHaNDC (ORCPT ); Thu, 31 Aug 2023 09:03:02 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:55284 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1346312AbjHaNDB (ORCPT ); Thu, 31 Aug 2023 09:03:01 -0400 Received: from mail-oa1-x2f.google.com (mail-oa1-x2f.google.com [IPv6:2001:4860:4864:20::2f]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id CC1DAE42; Thu, 31 Aug 2023 06:02:58 -0700 (PDT) Received: by mail-oa1-x2f.google.com with SMTP id 586e51a60fabf-1c8cb3c9534so64615fac.1; Thu, 31 Aug 2023 06:02:58 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20221208; t=1693486978; x=1694091778; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=HVVIEObE/vLlSMr5jQ6Wbaih9jLFe07U23pYaKd+KLE=; b=kzUKmnY1znrc59nXPIT0QDgEouBKpvg0KQ5+pSmjPRQHvgg+rdRDAoKE6pi4ACC4K/ Vaz7OA/ojSP9M5CNlpOaHs4DO2iC2ONwPmpge6KT/jTDfMY7MYrgoRQvaEUeLEL4cvW7 dVhCJX+agQeI7r/exjA9EjXu8hE+/A4vrm10HcW6iT8/0p+5TGzR7KxGSKfPMrIW8hG8 fK/JTngcewdxZuGHYgdQyiE1pT6C3BGAdstQm4uCiuiuIg9RHjpvgfGkLNfOtK0K9vkz gqJcbFIRVleXjMC2eolFRIyegmVOGCssOCC5i00ja2iH1VvsaW2uVplX1ps86HF5cbft +syg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1693486978; x=1694091778; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=HVVIEObE/vLlSMr5jQ6Wbaih9jLFe07U23pYaKd+KLE=; b=V9fsSqBA4z6qUYAC07IeApfVEv1Ed38bxdg9uzbyCcXooDvGilc114vwxrwh0NwMoC 6IpUGIQIS6Q5WBi1TM4rh31tYCMCGyZU697lHs8fXlNqRl2MHNYSD+7r+EIFcMlylDC7 vwG+heoGCbP3k1DVoCV+ADj6br15H9otSY0UgSMGlqebEJMXarswhDhl3WzdSM8TScDE X9rZVJn5q4QLIdWbB74qtZa+ScVlTXlqZEmfK1a4IQSau8ZVGY5WdIdei5dA1SEKpAdK yH3r8TbA3LMKHqBJ6d6Wj/931gR2/7zEN/scLdNmRUINBk71YkQZKe28cQDbx91nvvOV 9dZA== X-Gm-Message-State: AOJu0Yym9x5ELbF8dw9RuF2xJef3I03aHMeBs9+CYWTUoJHgLX/uT9zv musoDUiK1mHxy2rvwLyryMw= X-Google-Smtp-Source: AGHT+IHcFcU3HsaoqiFsprrJBO+xB45DxlK7vJKYdIivNWFebWGI/YMFaNDIa8gt9UhkyRY5jN1GlQ== X-Received: by 2002:a05:6870:738e:b0:1a7:f79c:2fbc with SMTP id z14-20020a056870738e00b001a7f79c2fbcmr6072072oam.0.1693486977799; Thu, 31 Aug 2023 06:02:57 -0700 (PDT) Received: from fabio-Precision-3551.. ([2804:14c:485:4b61:583a:68ca:f232:6448]) by smtp.gmail.com with ESMTPSA id zh26-20020a0568716b9a00b001bfd65998aesm802155oab.58.2023.08.31.06.02.54 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 31 Aug 2023 06:02:57 -0700 (PDT) From: Fabio Estevam To: rafael@kernel.org Cc: daniel.lezcano@linaro.org, amitk@kernel.org, rui.zhang@intel.com, linux-pm@vger.kernel.org, krzysztof.kozlowski+dt@linaro.org, robh+dt@kernel.org, conor+dt@kernel.org, devicetree@vger.kernel.org, Fabio Estevam Subject: [PATCH v7 3/3] thermal: thermal_core: Allow rebooting after critical temp Date: Thu, 31 Aug 2023 10:02:42 -0300 Message-Id: <20230831130242.2290502-3-festevam@gmail.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230831130242.2290502-1-festevam@gmail.com> References: <20230831130242.2290502-1-festevam@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-pm@vger.kernel.org From: Fabio Estevam 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 --- 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; }; /**