[PATCH 10/11] fastboot: DM_REBOOT_MODE reset support
Sam Day via B4 Relay
devnull+me.samcday.com at kernel.org
Sat Jun 6 10:47:41 CEST 2026
From: Sam Day <me at samcday.com>
The weak symbol currently implements `fastboot reboot` support using the
BCB. Nowadays, there's robust reboot-mode driver support which is ideal
for this use-case.
Signed-off-by: Sam Day <me at samcday.com>
---
drivers/fastboot/Kconfig | 7 ++++++
drivers/fastboot/Makefile | 1 +
drivers/fastboot/fb_reboot_mode.c | 51 +++++++++++++++++++++++++++++++++++++++
3 files changed, 59 insertions(+)
diff --git a/drivers/fastboot/Kconfig b/drivers/fastboot/Kconfig
index 90212fcf9ef..a1586e79c7e 100644
--- a/drivers/fastboot/Kconfig
+++ b/drivers/fastboot/Kconfig
@@ -108,6 +108,13 @@ config FASTBOOT_UUU_SUPPORT
feature if you are using verified boot, as it will allow an attacker
to bypass any restrictions you have in place.
+config FASTBOOT_REBOOT_MODE
+ bool "Use reboot-mode for fastboot reboot commands"
+ depends on DM_REBOOT_MODE
+ help
+ Use a reboot-mode driver to implement fastboot reboot target flags
+ such as reboot-bootloader, reboot-fastboot and reboot-recovery.
+
choice
prompt "Flash provider for FASTBOOT"
depends on FASTBOOT_FLASH
diff --git a/drivers/fastboot/Makefile b/drivers/fastboot/Makefile
index a341af076d1..531e694f393 100644
--- a/drivers/fastboot/Makefile
+++ b/drivers/fastboot/Makefile
@@ -8,3 +8,4 @@ obj-$(CONFIG_FASTBOOT_FLASH_BLOCK) += fb_block.o
obj-$(CONFIG_FASTBOOT_FLASH_MMC) += fb_block.o fb_mmc.o
obj-$(CONFIG_FASTBOOT_FLASH_NAND) += fb_nand.o
obj-$(CONFIG_FASTBOOT_FLASH_SPI) += fb_spi_flash.o
+obj-$(CONFIG_FASTBOOT_REBOOT_MODE) += fb_reboot_mode.o
diff --git a/drivers/fastboot/fb_reboot_mode.c b/drivers/fastboot/fb_reboot_mode.c
new file mode 100644
index 00000000000..abf4066f1f5
--- /dev/null
+++ b/drivers/fastboot/fb_reboot_mode.c
@@ -0,0 +1,51 @@
+// SPDX-License-Identifier: GPL-2.0+
+
+#include <dm.h>
+#include <dm/uclass.h>
+#include <errno.h>
+#include <fastboot.h>
+#include <reboot-mode/reboot-mode.h>
+#include <linux/kernel.h>
+
+static int fastboot_set_reboot_mode(const char *mode)
+{
+ struct udevice *dev;
+ int ret = -ENOENT;
+
+ uclass_foreach_dev_probe(UCLASS_REBOOT_MODE, dev)
+ {
+ ret = dm_reboot_mode_activate(dev, mode);
+ if (!ret || (ret != -ENOENT && ret != -ENOSYS))
+ return ret;
+ }
+
+ return ret;
+}
+
+int fastboot_set_reboot_flag(enum fastboot_reboot_reason reason)
+{
+ static const char *const
+ reboot_modes[FASTBOOT_REBOOT_REASONS_COUNT][2] = {
+ [FASTBOOT_REBOOT_REASON_BOOTLOADER] = { "bootloader",
+ NULL },
+ [FASTBOOT_REBOOT_REASON_FASTBOOTD] = { "fastboot",
+ "bootloader" },
+ [FASTBOOT_REBOOT_REASON_RECOVERY] = { "recovery",
+ NULL },
+ };
+ int i, ret;
+
+ if (reason >= FASTBOOT_REBOOT_REASONS_COUNT)
+ return -EINVAL;
+
+ for (i = 0; i < ARRAY_SIZE(reboot_modes[reason]); i++) {
+ if (!reboot_modes[reason][i])
+ continue;
+
+ ret = fastboot_set_reboot_mode(reboot_modes[reason][i]);
+ if (!ret || (ret != -ENOENT && ret != -ENOSYS))
+ return ret;
+ }
+
+ return -ENOENT;
+}
--
2.54.0
More information about the U-Boot
mailing list