From patchwork Tue Sep 2 15:21:49 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Glass X-Patchwork-Id: 188 Return-Path: X-Original-To: u-boot-concept@u-boot.org Delivered-To: u-boot-concept@u-boot.org DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=u-boot.org; s=default; t=1756826573; bh=KsKaWlZQXSkckBV+0fDOw0akvZPozu393QF7hkiUUH0=; h=From:To:Date:In-Reply-To:References:CC:Subject:List-Id: List-Archive:List-Help:List-Owner:List-Post:List-Subscribe: List-Unsubscribe:From; b=cuKssJHSM0MuqHaeskK8nOFFsLdtAISa8Mt9ff8U5LULM6Qac0X5cSRha1lr8MQQn ePlEJADlSF8qsl5Lz68WdDf/b8sFu5iZ9u4wtGIld+lC07t36HYF76FUiBCjsC7veQ dQ5YKSEdqDbcFJco3Ovu2WizWggmPEz2717LH9jmxI07J7uyGCoxnssvaxPgkRMmXE pVJg8FvBhm3o3s0lnMmes2mFQ1+xq5ExV2n6yFUwr7fsRjq2OgJRCOaynyl+Z8aItk OFBdhoyBJVWrd0edTZyb6M32hNr0C5GujZL3AnkJYDUsFpsxOmoevsZz/br6Fnt111 uHLTUI/AWhu2g== Received: from localhost (localhost [127.0.0.1]) by mail.u-boot.org (Postfix) with ESMTP id 5370D678D3 for ; Tue, 2 Sep 2025 09:22:53 -0600 (MDT) X-Virus-Scanned: Debian amavis at Received: from mail.u-boot.org ([127.0.0.1]) by localhost (mail.u-boot.org [127.0.0.1]) (amavis, port 10024) with ESMTP id cVq_df6Uikpa for ; Tue, 2 Sep 2025 09:22:53 -0600 (MDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=u-boot.org; s=default; t=1756826571; bh=KsKaWlZQXSkckBV+0fDOw0akvZPozu393QF7hkiUUH0=; h=From:To:Date:In-Reply-To:References:CC:Subject:List-Id: List-Archive:List-Help:List-Owner:List-Post:List-Subscribe: List-Unsubscribe:From; b=Nic7wAGccqJ9gMWkGunH2t1Mv/9vlZ0OAV43QgeJwHHDVsgr73B6NOmLWO1bBpjsT 3AF0+rzT7yyruk7vkdyBnu0pPG7RzRBSCBflvnpN6zWPw5vjzmn5jUt32MxUmWmt8h wi8CupWn2sN+fQY6843H5Nn4x6474fy9CheKnj/vWBWdGJftC+7iYfY4fmwpRFy1T2 k78oTCBgmt16OpJ49LYc1VDhT4XcVP63W7fbpxi2g77Jy9UlNiTzG2iSIkKAmbL4DD SSj6dvroOq28OfnFoVi3nmV14LYQvaPfE5eWrHX8H/iJp6hNuYCJnmbN+GzIpKU9s0 t2enNBENcRGFA== Received: from mail.u-boot.org (localhost [127.0.0.1]) by mail.u-boot.org (Postfix) with ESMTP id CB07D5FE1B for ; Tue, 2 Sep 2025 09:22:51 -0600 (MDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=u-boot.org; s=default; t=1756826569; bh=vVQgZ6VHgK3Tf1GdYONQQjcHqHQVuznd6QprQb+sMPY=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=bUoITg/q89Mw5Rlxvwyz5Z9s7YyEAu26lB/CcEQwiVrDpCA26S40JKK0NK64Bq/SM r3zaxoivwuW4upukZYNZv8/JCbSMH//UUdO8Fgy3E/gmspCPd74KcFNklYKQ3qMqBf ez0zJxQoX34ySMXpqFBsFLo3zjAP+ysZEugJtKG2MES2NySuUV+7srKI+uxbabJJI2 Sa3UntXTdtHe+jRWGTfA8ug3zJYLCJcybyxI73zRprC1V2CS5rKmAxd8qG4A/1ApaM y4GQh7WcIgn29/UCsbLTH1AVjo/ePYC0f7uXX9N3+hc1E6RiQcztl2Wo27hmcW14pX mf19vxoDDEvnA== Received: from localhost (localhost [127.0.0.1]) by mail.u-boot.org (Postfix) with ESMTP id 5CE1C6787E; Tue, 2 Sep 2025 09:22:49 -0600 (MDT) X-Virus-Scanned: Debian amavis at Received: from mail.u-boot.org ([127.0.0.1]) by localhost (mail.u-boot.org [127.0.0.1]) (amavis, port 10026) with ESMTP id FDiSm3zPsuet; Tue, 2 Sep 2025 09:22:49 -0600 (MDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=u-boot.org; s=default; t=1756826568; bh=nggz17OXjlstDTbE8GyXbcG+biFmZaCfGAeQMyxxLsU=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=B+jo3eZCeEm4FhIsC00RZKMrIZ4ipaO4s8KGYsILNwtyKNP5mB1bcZQQaav8ggRlO sa4/PJHNd7zX3blS3AQp9ByNH2XR7cZEhMk6MZ6Ev/LH9A0no22QFZy1BWHvDcthcb HYXSJ4eJATcEdPHFW7620deYJGUWG6uETP8x91mIbi/Q5aXEoAE2yNSEsVcKozKpAg GpO+QlU9c2u31dB4K8LQ0ksGIdnIbgp8+5qGFkQRKK6B+ZWnhaDO3tRDFE5XKmiL4D IVaRrK3EvzV4XQl4qrHPvSo+3vsj4hb5Vd35bBRq6vfzfWHAwrygWBl/bns+lbP9n2 CBmLrh1zDCEEQ== Received: from u-boot.org (unknown [73.34.74.121]) by mail.u-boot.org (Postfix) with ESMTPSA id D5BFF677F7; Tue, 2 Sep 2025 09:22:47 -0600 (MDT) From: Simon Glass To: U-Boot Concept Date: Tue, 2 Sep 2025 09:21:49 -0600 Message-ID: <20250902152158.2285264-18-sjg@u-boot.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250902152158.2285264-1-sjg@u-boot.org> References: <20250902152158.2285264-1-sjg@u-boot.org> MIME-Version: 1.0 Message-ID-Hash: R7GRR5634X7R7SOGCW4NG2ESRWJU6SSI X-Message-ID-Hash: R7GRR5634X7R7SOGCW4NG2ESRWJU6SSI X-MailFrom: sjg@u-boot.org X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; emergency; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header CC: Heinrich Schuchardt , Simon Glass , Claude X-Mailman-Version: 3.3.10 Precedence: list Subject: [Concept] [PATCH 17/18] sysreset: Add SYSRESET_TO_FIRMWARE_UI with reset -u support List-Id: Discussion and patches related to U-Boot Concept Archived-At: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: From: Simon Glass Add new SYSRESET_TO_FIRMWARE_UI reset type to allow resetting directly to firmware UI. This is implemented via the reset command's new -u flag. For the EFI app, this sets the EFI_OS_INDICATIONS_BOOT_TO_FW_UI bit in the OsIndications variable before performing a warm reset, causing the firmware to boot to its setup interface. Co-developed-by: Claude Signed-off-by: Simon Glass --- cmd/boot.c | 1 + doc/usage/cmd/reset.rst | 9 ++++++++- drivers/sysreset/sysreset-uclass.c | 3 +++ drivers/sysreset/sysreset_sandbox.c | 1 + include/sysreset.h | 2 ++ lib/efi_client/efi_app.c | 27 +++++++++++++++++++++++++++ test/dm/sysreset.c | 2 ++ 7 files changed, 44 insertions(+), 1 deletion(-) diff --git a/cmd/boot.c b/cmd/boot.c index 832ad08c319..01b4bd76826 100644 --- a/cmd/boot.c +++ b/cmd/boot.c @@ -61,6 +61,7 @@ U_BOOT_CMD( "Perform RESET of the CPU", "- cold boot without level specifier\n" "reset -h - hotreset if implemented\n" + "reset -u - reset to firmware UI if implemented\n" "reset -w - warm reset if implemented" ); diff --git a/doc/usage/cmd/reset.rst b/doc/usage/cmd/reset.rst index 3a43db204e5..190f3281d78 100644 --- a/doc/usage/cmd/reset.rst +++ b/doc/usage/cmd/reset.rst @@ -11,7 +11,7 @@ Synopsis :: - reset [-w] + reset [-w] [-u] Description ----------- @@ -26,6 +26,13 @@ DDR and peripherals, on some boards also resets external PMIC. Do a hot reset, if supported, which returns back to the program which started U-Boot. +-u + Reset to firmware UI (EFI app only). Sets the + EFI_OS_INDICATIONS_BOOT_TO_FW_UI bit in the OsIndications variable and + performs a warm reset, causing the firmware to boot directly to its + setup/configuration interface. + + Return value ------------ diff --git a/drivers/sysreset/sysreset-uclass.c b/drivers/sysreset/sysreset-uclass.c index db81c9b5779..5c9b7c6a4f2 100644 --- a/drivers/sysreset/sysreset-uclass.c +++ b/drivers/sysreset/sysreset-uclass.c @@ -132,6 +132,9 @@ int do_reset(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) case 'h': reset_type = SYSRESET_HOT; break; + case 'u': + reset_type = SYSRESET_TO_FIRMWARE_UI; + break; case 'w': reset_type = SYSRESET_WARM; break; diff --git a/drivers/sysreset/sysreset_sandbox.c b/drivers/sysreset/sysreset_sandbox.c index 522050eb4bf..d126fad0372 100644 --- a/drivers/sysreset/sysreset_sandbox.c +++ b/drivers/sysreset/sysreset_sandbox.c @@ -66,6 +66,7 @@ static int sandbox_sysreset_request(struct udevice *dev, enum sysreset_t type) sandbox_exit(); case SYSRESET_POWER: case SYSRESET_HOT: + case SYSRESET_TO_FIRMWARE_UI: if (!state->sysreset_allowed[type]) return -EACCES; sandbox_exit(); diff --git a/include/sysreset.h b/include/sysreset.h index f231d4e8bc4..16a16952026 100644 --- a/include/sysreset.h +++ b/include/sysreset.h @@ -23,6 +23,8 @@ enum sysreset_t { SYSRESET_POWER_OFF, /** @SYSRESET_HOT: exit out of U-Boot (e.g. from EFI app) */ SYSRESET_HOT, + /** @SYSRESET_TO_FIRMWARE_UI: reset to firmware UI */ + SYSRESET_TO_FIRMWARE_UI, /** @SYSRESET_COUNT: number of available reset types */ SYSRESET_COUNT, diff --git a/lib/efi_client/efi_app.c b/lib/efi_client/efi_app.c index 88e04f1084b..1afccc8c8c7 100644 --- a/lib/efi_client/efi_app.c +++ b/lib/efi_client/efi_app.c @@ -16,6 +16,7 @@ #include #include #include +#include #include #include #include @@ -253,6 +254,32 @@ static int efi_sysreset_request(struct udevice *dev, enum sysreset_t type) struct efi_priv *priv = efi_get_priv(); switch (type) { + case SYSRESET_TO_FIRMWARE_UI: { + efi_status_t ret; + u64 osind; + + /* Read current OsIndications value */ + osind = 0; + ret = efi_get_variable_int(u"OsIndications", + &efi_global_variable_guid, + NULL, NULL, &osind, NULL); + if (ret && ret != EFI_NOT_FOUND) + log_warning("Failed to read OsIndications: %lx\n", ret); + + /* Set the boot-to-firmware-UI bit */ + osind |= EFI_OS_INDICATIONS_BOOT_TO_FW_UI; + ret = efi_set_variable_int(u"OsIndications", + &efi_global_variable_guid, + EFI_VARIABLE_NON_VOLATILE | + EFI_VARIABLE_BOOTSERVICE_ACCESS | + EFI_VARIABLE_RUNTIME_ACCESS, + sizeof(osind), &osind, false); + if (ret) { + log_err("Failed to set OsIndications: %lx\n", ret); + return -EIO; + } + fallthrough; + } case SYSRESET_WARM: priv->run->reset_system(EFI_RESET_WARM, EFI_SUCCESS, 0, NULL); break; diff --git a/test/dm/sysreset.c b/test/dm/sysreset.c index a30d035b9a6..0afd19ff52f 100644 --- a/test/dm/sysreset.c +++ b/test/dm/sysreset.c @@ -77,11 +77,13 @@ static int dm_test_sysreset_walk(struct unit_test_state *uts) state->sysreset_allowed[SYSRESET_POWER] = false; state->sysreset_allowed[SYSRESET_POWER_OFF] = false; state->sysreset_allowed[SYSRESET_HOT] = false; + state->sysreset_allowed[SYSRESET_TO_FIRMWARE_UI] = false; ut_asserteq(-EACCES, sysreset_walk(SYSRESET_WARM)); ut_asserteq(-EACCES, sysreset_walk(SYSRESET_COLD)); ut_asserteq(-EACCES, sysreset_walk(SYSRESET_POWER)); ut_asserteq(-EACCES, sysreset_walk(SYSRESET_POWER_OFF)); ut_asserteq(-EACCES, sysreset_walk(SYSRESET_HOT)); + ut_asserteq(-EACCES, sysreset_walk(SYSRESET_TO_FIRMWARE_UI)); /* * Enable cold system reset - this should make cold system reset work,