From patchwork Wed Aug 30 15:19:06 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Fabio Estevam X-Patchwork-Id: 719681 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 84AB5C83F28 for ; Wed, 30 Aug 2023 18:36:20 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S236843AbjH3SgQ (ORCPT ); Wed, 30 Aug 2023 14:36:16 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:37178 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S245487AbjH3PT0 (ORCPT ); Wed, 30 Aug 2023 11:19:26 -0400 Received: from mail-oo1-xc2e.google.com (mail-oo1-xc2e.google.com [IPv6:2607:f8b0:4864:20::c2e]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id A1DBDE8; Wed, 30 Aug 2023 08:19:23 -0700 (PDT) Received: by mail-oo1-xc2e.google.com with SMTP id 006d021491bc7-5733d11894dso1047750eaf.0; Wed, 30 Aug 2023 08:19:23 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20221208; t=1693408763; x=1694013563; 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=YRqfnUZnc3uxFvV3HrsnMgzxpGHGjPJ2UGCyRPe16Ro=; b=Q+z/A4ggrBCdqc7sDQ33EIrrxtqe3fLJBNhMb6VytJEGwyIF8Eo92IWlgryAl9mkki lceMD3cpZO8J7wjqe/S7L1bEn1AUNkFTrv2g/kBIptDAvXMXH2cMB2NYbvlXAuUXcIZq 6O2NGpSj8vlyRSkPNHQzSJfN5zjEeUTaHhgQKagIBv1u8bfUFw+DPgI6wnnl3Nzk4C+F Da9o60rIrsZHEeBRlz+eVPxERlq4IXv8nYa2BJoXvwi5TjqAkM5Eojncqfp8W9V/8E4s wrasiLy3SaOYCaeC4jgjhFssrT5LGaBnncGOGtxfCx5IXIu8FkTUYASzgmxeCk+COL/C FLEA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1693408763; x=1694013563; 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=YRqfnUZnc3uxFvV3HrsnMgzxpGHGjPJ2UGCyRPe16Ro=; b=hZw5mBBWOIP+yYbLRvzFF16SKqI9YOnGvGTkC0rs2+wWzfZMbNwNdsl70Hxktp8WGE fNqEHMr3lQl1HuQ5ZsdXBbzY5h7OyijLnzpsr2FMBWBe3LH1fZvr4NVZ+dGYa84ysNHG BJjEShv+EfVAO7m72K1s8EMJAnu652sVpCJcrw/Wlg+o9uUpZ2oM32egPd1qw2iGf2zY QOpiGlpf0xGrTdL2zFieAyL4IRuntH59VFHYMbvy7/pwFzCO7vAIAPWuNf0B7QpMWFri HDGK00HBMf4LACXmIktuY5G5aG+qhI2Cs9d6TAcSBQmXpqMAxRX8ZdHWqwq/mIScXZA+ Gg7Q== X-Gm-Message-State: AOJu0YzVK5DVPSv7w8r4kYl4uzFmsCdX8K3F7jxo24vcwBvYDnj+hMS0 5q0bTDg3Hf/H5pzIWIxY6H/Y8GgEeAc= X-Google-Smtp-Source: AGHT+IHktPBlSz49uYINVyiNNhDIO7TAVM7OzuEgcvHckysoiQK+MP045yQtnayLIlBeMhfFQ5Wieg== X-Received: by 2002:a05:6830:459d:b0:6bc:a824:2750 with SMTP id az29-20020a056830459d00b006bca8242750mr2427595otb.2.1693408762641; Wed, 30 Aug 2023 08:19:22 -0700 (PDT) Received: from fabio-Precision-3551.. ([2804:14c:485:4b61:5158:34be:358c:6304]) by smtp.gmail.com with ESMTPSA id d24-20020a056830139800b006b884bbb4f3sm5672559otq.26.2023.08.30.08.19.18 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 30 Aug 2023 08:19:21 -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 v6 1/3] dt-bindings: thermal-zones: Document critical-action Date: Wed, 30 Aug 2023 12:19:06 -0300 Message-Id: <20230830151908.2149847-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 v5: - 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 Wed Aug 30 15:19:07 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Fabio Estevam X-Patchwork-Id: 719679 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 B879EC83F20 for ; Wed, 30 Aug 2023 18:36:28 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S237648AbjH3SgZ (ORCPT ); Wed, 30 Aug 2023 14:36:25 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:37206 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S245489AbjH3PTb (ORCPT ); Wed, 30 Aug 2023 11:19:31 -0400 Received: from mail-ot1-x332.google.com (mail-ot1-x332.google.com [IPv6:2607:f8b0:4864:20::332]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 7FB761A2; Wed, 30 Aug 2023 08:19:27 -0700 (PDT) Received: by mail-ot1-x332.google.com with SMTP id 46e09a7af769-6bb1133b063so690304a34.1; Wed, 30 Aug 2023 08:19:27 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20221208; t=1693408766; x=1694013566; 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=EuULaM8fl5rgdaoQC5loZ8/I8f+dfEz9yTwKKo4bS2Q=; b=W6RSFnNcMIW4cQKY8X8V2WHPmEsU7Vb3n/7cehpL1M5rqu2snC5I+F3KMe8LrY14rk SudTHtLYmM/F4qoEEeygku3NARWiq5aSy9FN9QWuH7hUyIoX5ceqGXg9+KoQXGpz5G+0 f3CE2BrlgftXBtlZCsj2mg0YEcZhU3RsWBqaex1qVlx/W8nhTb28jJi+kO8KkCzTqeUU 2h0Yk51s3kUAmWqp0V9m6fIcNqDTq124jsGPXhyL5JefQTPtxbBABMVU8d8cV/C1ZTiG vPI0ilcsrlrkFrD1M+ZLCmiOV7AIRiSXMx+dPrwB1erHiDybpNd0HBJnU/nIuPIu+A9S xxiQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1693408766; x=1694013566; 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=EuULaM8fl5rgdaoQC5loZ8/I8f+dfEz9yTwKKo4bS2Q=; b=UepE6mPE/hMVHHV7gZYOSi6mooI7Rb/7bka+TFCF86HzBrBDQJLleez761cE5/o7XF ZoVOtaAehswLQ3E8joQwSpldxB4rkO+owkQtHFGg3OSzzWLQVYNvjoDR5NvOPaHoNNXq JYJO4TdMzLVHqgyOUf0gmGqL46ZDvavfLJYwKC4gHaXQY6cCr5EEJWuKOwZJtDlJoPk2 PKNVAydIHUp+U/hN/7yKnAAGEgbO79DPC+g7oWNfVtHZzB5NYpYUOJQwe1eoBFVVK/Cf 9ZYwLuX0KPncp7//IWWf7MAZLQ2dHQO03gc+LNDtDlipQV9YZ6FoQyTTxHjR6fDr5Vhs DA1A== X-Gm-Message-State: AOJu0YzbpMIjV6sglPvLBYK20pLyH+IduxEIO4GeMSA+MLl8gL2tUvmn r3vc+j2f5tDRtCONhXe8K2rWkwEVpkE= X-Google-Smtp-Source: AGHT+IGbNgDVOBZmN2rq+L5s//Uzmuy47sRexeR34lp+8YPHNP8poEkNYCrU0n5OhYqd79zlXYhuXg== X-Received: by 2002:a05:6830:6702:b0:6bc:a6d0:ab7 with SMTP id cr2-20020a056830670200b006bca6d00ab7mr3451514otb.3.1693408766600; Wed, 30 Aug 2023 08:19:26 -0700 (PDT) Received: from fabio-Precision-3551.. ([2804:14c:485:4b61:5158:34be:358c:6304]) by smtp.gmail.com with ESMTPSA id d24-20020a056830139800b006b884bbb4f3sm5672559otq.26.2023.08.30.08.19.23 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 30 Aug 2023 08:19:26 -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 v6 2/3] reboot: Introduce hw_protection_reboot() Date: Wed, 30 Aug 2023 12:19:07 -0300 Message-Id: <20230830151908.2149847-2-festevam@gmail.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230830151908.2149847-1-festevam@gmail.com> References: <20230830151908.2149847-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 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(-) 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 Wed Aug 30 15:19:08 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Fabio Estevam X-Patchwork-Id: 719685 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 22BB8C6FA8F for ; Wed, 30 Aug 2023 18:35:26 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S236645AbjH3SfZ (ORCPT ); Wed, 30 Aug 2023 14:35:25 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:59914 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S245490AbjH3PTd (ORCPT ); Wed, 30 Aug 2023 11:19:33 -0400 Received: from mail-ot1-x332.google.com (mail-ot1-x332.google.com [IPv6:2607:f8b0:4864:20::332]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 2B4F31A2; Wed, 30 Aug 2023 08:19:31 -0700 (PDT) Received: by mail-ot1-x332.google.com with SMTP id 46e09a7af769-6bf106fb6a0so984878a34.0; Wed, 30 Aug 2023 08:19:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20221208; t=1693408770; x=1694013570; 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=zSPPfeRANMxNDziv72JSmTSauePb3uiAcgEWeqKDRLI=; b=TQHrzt7dWsl5U91KODm3ThMyElEs/7BgGSL4kU96wiVMkj8gIu+u6at6t+d42WcPU9 9urfFEdlT9dSOgrhTuQ6I97cUKAsIGm097ty9jKfBMWoTUXQp/5YatVXdFS1sE6oKdbQ 3jdh0cPgS6KptKKZkIjpFxMG43QkS1UEEar36pGkAq3yZwEf4xjor8jMQFE6kHeGrOKu l95mHwAlkvrMmSaek4PoqvYsT3ySXHn8ReBm7IQdIWg2u5teRfv6ILOOWsvA4U0fTDqQ Fp2WfmlJfBr8k+rMzPDQ8LnMyH1WlGju6HJO+gP1tYMkYbbdj4+/zKWrSCNA6r19NmtL i8wg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1693408770; x=1694013570; 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=zSPPfeRANMxNDziv72JSmTSauePb3uiAcgEWeqKDRLI=; b=Rt3Hli3TEiFY+cv4NC+T5H275s4hG6xZbQuwFqX6uUVANXPvBPxq+lLFJ5G6MVL9YI Jp1Bfh1PTSUJbWI0WtxB12lm1p+flbckh8B7jRBEqb2x6sxvsAltGqOCI3JPRN9LaRLb c47dIAIrSp+c2ptM4ZBOJygd1tqSMKZaW6/h6FHRcJofAYcOnwUDoXPONK2bqnoXNqTD RPt2IJYmubIrfUYzceyvlvIFCL4A/9BnUqUQwX5JzbiVl4X8bKD4mGlKtZ7mwyqPV8E7 ZYJCdRpIKsafR5VULeVJL+ER/nDO+bN+9kM/1w4SMrwMU+DKaeBaNyQ7m/+rH+Siorvp pO4Q== X-Gm-Message-State: AOJu0YyiXeGc3EUOncC/8GLc2Nc7p6fMe+ImrNagAuetOMdaABSjfUPi OGBHwlfDim1L7A+D5L3lWQAni58T1Jk= X-Google-Smtp-Source: AGHT+IHlbwrt/wnoWeHfr/xmhmCu7oF7F7WEAyxfQTZAgDyYsorWIeGrnT6HVRR8EUozh9s2v9+pCw== X-Received: by 2002:a05:6830:6d16:b0:6bd:990:1a2 with SMTP id dz22-20020a0568306d1600b006bd099001a2mr3212380otb.0.1693408770469; Wed, 30 Aug 2023 08:19:30 -0700 (PDT) Received: from fabio-Precision-3551.. ([2804:14c:485:4b61:5158:34be:358c:6304]) by smtp.gmail.com with ESMTPSA id d24-20020a056830139800b006b884bbb4f3sm5672559otq.26.2023.08.30.08.19.26 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 30 Aug 2023 08:19:29 -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 v6 3/3] thermal: thermal_core: Allow rebooting after critical temp Date: Wed, 30 Aug 2023 12:19:08 -0300 Message-Id: <20230830151908.2149847-3-festevam@gmail.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230830151908.2149847-1-festevam@gmail.com> References: <20230830151908.2149847-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 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(-) 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..a644a896a617 100644 --- a/drivers/thermal/thermal_of.c +++ b/drivers/thermal/thermal_of.c @@ -218,6 +218,25 @@ 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 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", 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; }; /**