From patchwork Tue Aug 29 12:09:22 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Fabio Estevam X-Patchwork-Id: 13368922 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 24A88C83F16 for ; Tue, 29 Aug 2023 12:10:41 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233774AbjH2MKI (ORCPT ); Tue, 29 Aug 2023 08:10:08 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:47490 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233671AbjH2MJl (ORCPT ); Tue, 29 Aug 2023 08:09:41 -0400 Received: from mail-oa1-x2a.google.com (mail-oa1-x2a.google.com [IPv6:2001:4860:4864:20::2a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id DECC11AB; Tue, 29 Aug 2023 05:09:37 -0700 (PDT) Received: by mail-oa1-x2a.google.com with SMTP id 586e51a60fabf-1bb3df62b34so667986fac.0; Tue, 29 Aug 2023 05:09:37 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20221208; t=1693310977; x=1693915777; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=kr5OflaxijlUu3QWgWc7gDYfy7Y4CSexnvGXkJjSwAM=; b=Zm4Z9FqLuM4CWgWGXt+m3PEM0MY6wvQDqxP2lvKwLzbN0Wj6rr/cuHyMvDJNUbXrdL AxmhYkiW5qWy8gbiHFCZFKl1nEGJVj7mHv7iWQqxPxlGNUwgqZ4GeDpoofTw7LiRCFU5 MuA+R4cORFgGRoRKYcA3ryxAHdfht4Vf1wT/XllWl6CHG3bDzLidv0AoNEN4hj4UWrLl fDp1vBW+konQSgy8F418o/0XriTMVO2YRh0ByzZyeOLCO6KhzG/tNvQp4xuBrn8gcIgZ TLiZ8tMpa/Ki2E9jrdHiYmBzmnzkw+JEoHAQwabGge43ORqgbbjIMec3K+eI2xldY+Mk IYMQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1693310977; x=1693915777; 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=kr5OflaxijlUu3QWgWc7gDYfy7Y4CSexnvGXkJjSwAM=; b=U/bPPXN0SubJapg9isOcO5d4fqnhFi2SpI3YM3r/DBr2w7B5LXplHtnEPHJblwwy5c eoNm1nsUszmxbZ7xgpJl56NPgsNl9R2JgDF0gEeiMFYxj6oN/qK3N3bptKFIb1jOTXGi wegrdbMI3yKoJ8wKr/v1UQ/+YvBxbCBgGI5nVEXkQjO7/VMpyST2eDvTzlNuN6JLVQ7w GXw1gX9iqmI/bphnI+cS7fO4QPoxnqdTrIb8l946ouxX4iya6/MzBX3tV0gYt58c3POK OZ6gYSmb5q/9ypj8Jz2YUQx47UAfP3ziTbZ8MRn20A/Fgw5+GgM2WxX9kGHwriejmmHk ZUWQ== X-Gm-Message-State: AOJu0YxEc7FynjOXiUOS4+/bE33twXCVRCBO1vtxcbcrpcTNFiIKMg8O M4f57VXWZjix882mguyEQgjVLjsh4aA= X-Google-Smtp-Source: AGHT+IGACckcLM25XRNoHKJifC7kN6/HoqpQh0ywe/xf0cp4oBMnbfPwa/Gm2ySVxd1CIWp97W80eQ== X-Received: by 2002:a05:6870:ecab:b0:1c8:bbd0:2fd5 with SMTP id eo43-20020a056870ecab00b001c8bbd02fd5mr35797067oab.4.1693310976789; Tue, 29 Aug 2023 05:09:36 -0700 (PDT) Received: from fabio-Precision-3551.. ([2804:14c:485:4b61:d5ec:d929:1621:6cc6]) by smtp.gmail.com with ESMTPSA id zc17-20020a056871271100b001d0ad5205fesm2000651oab.7.2023.08.29.05.09.33 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 29 Aug 2023 05:09:35 -0700 (PDT) From: Fabio Estevam To: daniel.lezcano@linaro.org Cc: rafael@kernel.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 v4 1/3] dt-bindings: thermal-zones: Document critical-action Date: Tue, 29 Aug 2023 09:09:22 -0300 Message-Id: <20230829120924.1711175-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 v3: - Explain why this property is needed. (Krzysztof) - Added Krzysztof's Reviewed-by tag. .../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 Tue Aug 29 12:09:23 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Fabio Estevam X-Patchwork-Id: 13368923 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 49F2FC83F1F for ; Tue, 29 Aug 2023 12:10:42 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233865AbjH2MKJ (ORCPT ); Tue, 29 Aug 2023 08:10:09 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:45714 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233736AbjH2MJn (ORCPT ); Tue, 29 Aug 2023 08:09:43 -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 05F241AB; Tue, 29 Aug 2023 05:09:41 -0700 (PDT) Received: by mail-oa1-x2f.google.com with SMTP id 586e51a60fabf-1a2dd615ddcso912697fac.0; Tue, 29 Aug 2023 05:09:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20221208; t=1693310980; x=1693915780; 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=TzUUjWIr8T0FZIbu34J9BGxTroSGsDdkY4ko+SJQrnc=; b=A1pUETre5tdg0G0mCkuEDmy4RXfXoVCiPK8BP9Zk2ScIjVEg0wHFccq4IvvHXZzjcH TMeSXa7o1SoGYvzjS3aBjI902WCfI/PTtZ2cNHUR1o8vfXTzqKslGQaUEg/hO1cc0v3i ja0z+ev7TWav+syWR7HIYDzoQ5lF4S8xovd/jySoy4md02TwRQS8ZVgra+VCzsa5wQu0 fs5y/UVwz7TitMT0sZPC8PckpHwsB3a0A5nuHwjDaAJKZsc2Wbg56CAdBTjbMvQVfw91 KOjYlFI7t3ZjvccDeFLUnpIopjbB6He9vFcYHyMHz6f3vPcpYAjiB6K8P/hG3bJC/TaC RM+A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1693310980; x=1693915780; 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=TzUUjWIr8T0FZIbu34J9BGxTroSGsDdkY4ko+SJQrnc=; b=doC3kmpahhQGJSy62GRNRHvHD+j2rkf72aY5JsGAnG4minVN8S6oG/flYvkInMkhCg efnfOvqDvz07wrlng23i9jyG6pcwwV5f8Rch0jT8xxt5XSi6UbpCFNT5bi3qGyvKliWa Z8wFtlJjsRmLF4n1yx0u3dn5Jfoes57tOZU307hfscvAkYyrESehO0z4atAHYiOAkI4o qfma/HAOykQAvGt1nDt5VNza/ykZv6gSDnl46FJuAZhi9FJ2DYk94/ieg8kvfy2bD7Fk bL7PHDAQM8G1npuWXHTpCcubj7k4UYZAhyrcK/3FQJBNiXx2J/HispzuhFv/gNP+w21W XBgA== X-Gm-Message-State: AOJu0YxlYNVmKCdf1jARyZ5YE12vpX+wUvjtgzOkUcwlVOLANc9Cbk67 yN5amLhiQpJ3/LVbKAyXK0c= X-Google-Smtp-Source: AGHT+IHt8NP1HZ0CNe6b49MjjmGovhfJS84ptGTRXqIGozLkPeFRI3XCCI1LO8hhfE7boSGFIWgpHA== X-Received: by 2002:a05:6870:d10f:b0:1be:ec3c:1ef with SMTP id e15-20020a056870d10f00b001beec3c01efmr31988232oac.0.1693310980312; Tue, 29 Aug 2023 05:09:40 -0700 (PDT) Received: from fabio-Precision-3551.. ([2804:14c:485:4b61:d5ec:d929:1621:6cc6]) by smtp.gmail.com with ESMTPSA id zc17-20020a056871271100b001d0ad5205fesm2000651oab.7.2023.08.29.05.09.37 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 29 Aug 2023 05:09:39 -0700 (PDT) From: Fabio Estevam To: daniel.lezcano@linaro.org Cc: rafael@kernel.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 v4 2/3] reboot: Introduce hw_protection_reboot() Date: Tue, 29 Aug 2023 09:09:23 -0300 Message-Id: <20230829120924.1711175-2-festevam@gmail.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230829120924.1711175-1-festevam@gmail.com> References: <20230829120924.1711175-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 v3: - None include/linux/reboot.h | 1 + kernel/reboot.c | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/include/linux/reboot.h b/include/linux/reboot.h index 2b6bb593be5b..4a319bc24f6a 100644 --- a/include/linux/reboot.h +++ b/include/linux/reboot.h @@ -174,6 +174,7 @@ void ctrl_alt_del(void); extern void orderly_poweroff(bool force); extern void orderly_reboot(void); +void hw_protection_reboot(const char *reason, int ms_until_forced); void hw_protection_shutdown(const char *reason, int ms_until_forced); /* diff --git a/kernel/reboot.c b/kernel/reboot.c index 3bba88c7ffc6..05333ae8bc6b 100644 --- a/kernel/reboot.c +++ b/kernel/reboot.c @@ -952,6 +952,40 @@ static void hw_failure_emergency_poweroff(int poweroff_delay_ms) msecs_to_jiffies(poweroff_delay_ms)); } +/** + * hw_protection_reboot - Trigger an emergency system reboot + * + * @reason: Reason of emergency reboot to be printed. + * @ms_until_forced: Time to wait for orderly reboot before tiggering a + * forced reboot. Negative value disables the forced + * reboot. + * + * Initiate an emergency system reboot in order to protect hardware from + * further damage. Usage examples include a thermal protection. + * + * NOTE: The request is ignored if protection reboot is already pending even + * if the previous request has given a large timeout for forced reboot. + * Can be called from any context. + */ +void hw_protection_reboot(const char *reason, int ms_until_forced) +{ + static atomic_t allow_proceed = ATOMIC_INIT(1); + + pr_emerg("HARDWARE PROTECTION reboot (%s)\n", reason); + + /* Reboot should be initiated only once. */ + if (!atomic_dec_and_test(&allow_proceed)) + return; + + /* + * Queue a backup emergency reboot in the event of + * orderly_reboot failure + */ + hw_failure_emergency_poweroff(ms_until_forced); + orderly_reboot(); +} +EXPORT_SYMBOL_GPL(hw_protection_reboot); + /** * hw_protection_shutdown - Trigger an emergency system poweroff * From patchwork Tue Aug 29 12:09:24 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Fabio Estevam X-Patchwork-Id: 13368924 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 EB29CC83F1E for ; Tue, 29 Aug 2023 12:10:41 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233959AbjH2MKJ (ORCPT ); Tue, 29 Aug 2023 08:10:09 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:45754 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233775AbjH2MJr (ORCPT ); Tue, 29 Aug 2023 08:09:47 -0400 Received: from mail-oa1-x33.google.com (mail-oa1-x33.google.com [IPv6:2001:4860:4864:20::33]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 7D19198; Tue, 29 Aug 2023 05:09:44 -0700 (PDT) Received: by mail-oa1-x33.google.com with SMTP id 586e51a60fabf-1c8cb3c9534so385534fac.1; Tue, 29 Aug 2023 05:09:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20221208; t=1693310984; x=1693915784; 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=WS785+RicHHjcIblAdA2mqb2YRvkxHKjPNYEbsxQkJk=; b=Q7pavGrIA/L5x4cpCq3yS+dlGPbRRNraIs/0QxGUiica8K3JBdAE/hWszPS88nekj3 W9d5uy3f+2srUq6Vr+wPVm0YoeTveLjuHteLRwNxGQdqiiM/avhkNbv5ptI9RIGJcxur mYB1fTgbJ7oquTyVWITPacUAstH/n7cVUvmWZNF+TR0Wgsb/PJQpWmea29S9t0/JlrOZ oKMRGShI/3XFnNGHmJA2wxEriTPYYosGnmhIy9oHskymHY1Kh8Kc1NVsR5RuhpxyspVz Qad7kyv+PwmFIl/Gz+e2iUG8kH6XweTCvJSu1rKHOtbRu+I5Uf46QF13HP4dBfhcOe3b guJw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1693310984; x=1693915784; 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=WS785+RicHHjcIblAdA2mqb2YRvkxHKjPNYEbsxQkJk=; b=KR0QgdXaMEVoEVmupCN7WmykvhQojT189zZ/Sw1PeREq6BCDavuTjK+jf4ERiJ7dBI DOPvtLScP6oSby6qSD3t6Ti5Z8FAh/4iqEyaZ0yG0cYEXM+mXYhcRJObBhKtfCP6Z8y5 loAz0c3tE0mDXUDpB+XoA0DzICJR08aHlCcCeERNvaCjuYBYNV3j+qITTSXuSNbiIdeU OP61E8CxS6I+uD1yhwPoAZGuDdinUERfd/MVdy8CQ5XxCiB3tPgWykD1FS/i1hZMageM s0HTy4So5kyG8p4Ko06ZIMCvxa7MSIwjXVtJc9v/7wHI+SSYBtVycINZH+lmJ5dHbp9e D0lw== X-Gm-Message-State: AOJu0Ywg9H96QZg3wQOe05jGLgn2vUUSNTs7Cb3TGv8KGS5mP3Y2tSUU f6T2fdRu9kMWGKxqj8jhoBY= X-Google-Smtp-Source: AGHT+IGOEFoE5aadl4+2v4pvT5gb+yWh+WYIof932iNfRs675GbN1GgnHf0me/9rfgr8INK7rHyDPw== X-Received: by 2002:a05:6870:7014:b0:1c8:bfd1:ecba with SMTP id u20-20020a056870701400b001c8bfd1ecbamr30515255oae.3.1693310983734; Tue, 29 Aug 2023 05:09:43 -0700 (PDT) Received: from fabio-Precision-3551.. ([2804:14c:485:4b61:d5ec:d929:1621:6cc6]) by smtp.gmail.com with ESMTPSA id zc17-20020a056871271100b001d0ad5205fesm2000651oab.7.2023.08.29.05.09.40 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 29 Aug 2023 05:09:43 -0700 (PDT) From: Fabio Estevam To: daniel.lezcano@linaro.org Cc: rafael@kernel.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 v4 3/3] thermal: thermal_core: Allow rebooting after critical temp Date: Tue, 29 Aug 2023 09:09:24 -0300 Message-Id: <20230829120924.1711175-3-festevam@gmail.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230829120924.1711175-1-festevam@gmail.com> References: <20230829120924.1711175-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 v3: - None. drivers/thermal/thermal_core.c | 8 +++++++- drivers/thermal/thermal_of.c | 27 +++++++++++++++++++++++++++ include/linux/thermal.h | 6 ++++++ 3 files changed, 40 insertions(+), 1 deletion(-) diff --git a/drivers/thermal/thermal_core.c b/drivers/thermal/thermal_core.c index a59700593d32..f69e1667acb1 100644 --- a/drivers/thermal/thermal_core.c +++ b/drivers/thermal/thermal_core.c @@ -320,11 +320,17 @@ 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; + void (*hw_protection_action)(const char *reason, int ms_until_forced); dev_emerg(&tz->device, "%s: critical temperature reached, " "shutting down\n", tz->type); - hw_protection_shutdown("Temperature too high", poweroff_delay_ms); + hw_protection_action = hw_protection_shutdown; + + if (tz->action == THERMAL_CRITICAL_ACTION_REBOOT) + hw_protection_action = hw_protection_reboot; + + hw_protection_action("Temperature too high", 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..8bc28cba7406 100644 --- a/drivers/thermal/thermal_of.c +++ b/drivers/thermal/thermal_of.c @@ -218,6 +218,31 @@ static struct device_node *of_thermal_zone_find(struct device_node *sensor, int return 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 i, ret; + + ret = of_property_read_string(np, "critical-action", &action_string); + if (ret < 0) + goto out_default_action; + + for (i = 0; i < ARRAY_SIZE(critical_actions); i++) + if (!strcasecmp(action_string, critical_actions[i])) { + *action = i; + return; + } + +out_default_action: + *action = THERMAL_CRITICAL_ACTION_SHUTDOWN; +} + static int thermal_of_monitor_init(struct device_node *np, int *delay, int *pdelay) { int ret; @@ -516,6 +541,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..08854f640db9 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, /* 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; }; /**