fastboot: Add default fastboot_set_reboot_flag implementation
authorRoman Kovalivskyi <roman.kovalivskyi@globallogic.com>
Tue, 28 Jul 2020 20:35:34 +0000 (23:35 +0300)
committerMarek Vasut <marex@denx.de>
Tue, 1 Sep 2020 12:47:43 +0000 (14:47 +0200)
Default implementation of fastboot_set_reboot_flag function that depends
on "bcb" commands could be used in general case if there are no need to
make any platform-specific implementation, otherwise it could be
disabled via Kconfig option FASTBOOT_USE_BCB_SET_REBOOT_FLAG.

Please note that FASTBOOT_USE_BCB_SET_REBOOT_FLAG is mutually exclusive
with some platforms which already have their own implementation of this
function.

Signed-off-by: Roman Kovalivskyi <roman.kovalivskyi@globallogic.com>
drivers/fastboot/Kconfig
drivers/fastboot/Makefile
drivers/fastboot/fb_bcb_impl.c [new file with mode: 0644]
include/fastboot.h

index d4436df..4352ba6 100644 (file)
@@ -165,6 +165,18 @@ config FASTBOOT_CMD_OEM_FORMAT
          relies on the env variable partitions to contain the list of
          partitions as required by the gpt command.
 
+config FASTBOOT_USE_BCB_SET_REBOOT_FLAG
+       bool "Use BCB by fastboot to set boot reason"
+       depends on CMD_BCB && !ARCH_MESON && !ARCH_ROCKCHIP && !TARGET_KC1 && \
+         !TARGET_SNIPER && !TARGET_AM57XX_EVM && !TARGET_DRA7XX_EVM
+       default y
+       help
+         Fastboot could implement setting of reboot reason in a generic fashion
+         via BCB commands. BCB commands are able to write reboot reason into
+         command field of boot control block. In general case it is sufficient
+         implementation if your platform supports BCB commands and doesn't
+         require any specific reboot reason handling.
+
 endif # FASTBOOT
 
 endmenu
index 048af5a..2b2c390 100644 (file)
@@ -5,3 +5,4 @@ obj-y += fb_getvar.o
 obj-y += fb_command.o
 obj-$(CONFIG_FASTBOOT_FLASH_MMC) += fb_mmc.o
 obj-$(CONFIG_FASTBOOT_FLASH_NAND) += fb_nand.o
+obj-$(CONFIG_FASTBOOT_USE_BCB_SET_REBOOT_FLAG) += fb_bcb_impl.o
diff --git a/drivers/fastboot/fb_bcb_impl.c b/drivers/fastboot/fb_bcb_impl.c
new file mode 100644 (file)
index 0000000..89ec360
--- /dev/null
@@ -0,0 +1,43 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright 2020 GlobalLogic.
+ * Roman Kovalivskyi <roman.kovalivskyi@globallogic.com>
+ */
+
+#include <common.h>
+#include <fastboot.h>
+
+/**
+ * fastboot_set_reboot_flag() - Set flag to indicate reboot-bootloader
+ *
+ * Set flag which indicates that we should reboot into the bootloader
+ * following the reboot that fastboot executes after this function.
+ *
+ * This function should be overridden in your board file with one
+ * which sets whatever flag your board specific Android bootloader flow
+ * requires in order to re-enter the bootloader.
+ */
+int fastboot_set_reboot_flag(enum fastboot_reboot_reason reason)
+{
+       char cmd[64];
+
+       if (reason >= FASTBOOT_REBOOT_REASONS_COUNT)
+               return -EINVAL;
+
+       snprintf(cmd, sizeof(cmd), "bcb load %d misc",
+                CONFIG_FASTBOOT_FLASH_MMC_DEV);
+
+       if (run_command(cmd, 0))
+               return -ENODEV;
+
+       snprintf(cmd, sizeof(cmd), "bcb set command %s",
+                fastboot_boot_cmds[reason]);
+
+       if (run_command(cmd, 0))
+               return -ENOEXEC;
+
+       if (run_command("bcb store", 0))
+               return -EIO;
+
+       return 0;
+}
index b86b508..8e9ee80 100644 (file)
@@ -53,6 +53,15 @@ enum fastboot_reboot_reason {
 };
 
 /**
+ * BCB boot commands
+ */
+static const char * const fastboot_boot_cmds[] = {
+       [FASTBOOT_REBOOT_REASON_BOOTLOADER] = "bootonce-bootloader",
+       [FASTBOOT_REBOOT_REASON_FASTBOOTD] = "boot-fastboot",
+       [FASTBOOT_REBOOT_REASON_RECOVERY] = "boot-recovery"
+};
+
+/**
  * fastboot_response() - Writes a response of the form "$tag$reason".
  *
  * @tag: The first part of the response