]> git.ipfire.org Git - thirdparty/u-boot.git/commitdiff
fastboot: integrate block flashing back-end
authorDmitrii Merkurev <dimorinny@google.com>
Fri, 21 Nov 2025 10:53:33 +0000 (11:53 +0100)
committerMattijs Korpershoek <mkorpershoek@kernel.org>
Mon, 24 Nov 2025 09:51:17 +0000 (10:51 +0100)
1. Get partition info/size
2. Erase partition
3. Flash partition
4. BCB

Make FASTBOOT_FLASH also depend on BLK, but make sure
it doesn't affect SUNXI and ROCKCHIP platforms since they
default to y already.

Make it only default on SUNXI when MMC or NAND is enabled,
so it doesn't break the CHIP & Nintendo boards, and for ROCKCHIP
when MMC is enabled.

Signed-off-by: Dmitrii Merkurev <dimorinny@google.com>
Reviewed-by: Mattijs Korpershoek <mkorpershoek@baylibre.com>
Tested-by: Mattijs Korpershoek <mkorpershoek@kernel.org>
Signed-off-by: Neil Armstrong <neil.armstrong@linaro.org>
Link: https://lore.kernel.org/r/20251121-topic-fastboot-blk-v7-3-9589d902fc91@linaro.org
Signed-off-by: Mattijs Korpershoek <mkorpershoek@kernel.org>
drivers/fastboot/Kconfig
drivers/fastboot/Makefile
drivers/fastboot/fb_command.c
drivers/fastboot/fb_common.c
drivers/fastboot/fb_getvar.c

index 843171902ae69deb12e9aa1349ee73f684d7b943..576c3ef8a45bedd1541a72e4882b45d8c5ef7bbb 100644 (file)
@@ -90,8 +90,9 @@ config FASTBOOT_USB_DEV
 
 config FASTBOOT_FLASH
        bool "Enable FASTBOOT FLASH command"
-       default y if ARCH_SUNXI || ARCH_ROCKCHIP
-       depends on MMC || (MTD_RAW_NAND && CMD_MTDPARTS) || DM_SPI_FLASH
+       default y if ARCH_SUNXI && ( MMC || MTD_RAW_NAND )
+       default y if ARCH_ROCKCHIP && MMC
+       depends on MMC || (MTD_RAW_NAND && CMD_MTDPARTS) || DM_SPI_FLASH || BLK
        select IMAGE_SPARSE
        help
          The fastboot protocol includes a "flash" command for writing
@@ -123,6 +124,10 @@ config FASTBOOT_FLASH_SPI
        bool "FASTBOOT on SPI flash"
        depends on DM_SPI_FLASH
 
+config FASTBOOT_FLASH_BLOCK
+       bool "FASTBOOT on block device"
+       depends on BLK
+
 endchoice
 
 config FASTBOOT_FLASH_MMC_DEV
@@ -197,6 +202,29 @@ config FASTBOOT_MMC_USER_NAME
          defined here.
          The default target name for erasing EMMC_USER is "mmc0".
 
+config FASTBOOT_FLASH_BLOCK_INTERFACE_NAME
+       string "Define FASTBOOT block interface name"
+       depends on FASTBOOT_FLASH_BLOCK
+       help
+         The fastboot "flash" and "erase" commands support operations
+         on any Block device, this should specify the block device name
+         like ide, scsi, usb, sata, nvme, virtio, blkmap, mtd...
+         The mmc block device type can be used but most of the features
+         available in the FASTBOOT_MMC will be missing.
+         Consider using FASTBOOT_MMC on a MMC block device until all
+         features are migrated.
+
+config FASTBOOT_FLASH_BLOCK_DEVICE_ID
+       int "Define FASTBOOT block device identifier"
+       depends on FASTBOOT_FLASH_BLOCK
+       default 0
+       help
+         The fastboot "flash" and "erase" commands support operations
+         on any Block device, this should specify the block device
+         identifier on the system, as a number.
+         Device identifiers are numbered starting from 0 and the most
+         common case is to use the first controller on the system.
+
 config FASTBOOT_GPT_NAME
        string "Target name for updating GPT"
        depends on FASTBOOT_FLASH_MMC && EFI_PARTITION
index e4c97d45997da06b6364dd9a0534307707756c06..a341af076d117c03e366d9f8410db1043d414746 100644 (file)
@@ -3,6 +3,7 @@
 obj-y += fb_common.o
 obj-y += fb_getvar.o
 obj-y += fb_command.o
+obj-$(CONFIG_FASTBOOT_FLASH_BLOCK) += fb_block.o
 # MMC reuses block implementation
 obj-$(CONFIG_FASTBOOT_FLASH_MMC) += fb_block.o fb_mmc.o
 obj-$(CONFIG_FASTBOOT_FLASH_NAND) += fb_nand.o
index 791088bc094dff788b62cbc277cf7055f0876c00..18d86988f4c962ed9aea122464f4b71671814772 100644 (file)
@@ -8,6 +8,7 @@
 #include <env.h>
 #include <fastboot.h>
 #include <fastboot-internal.h>
+#include <fb_block.h>
 #include <fb_mmc.h>
 #include <fb_nand.h>
 #include <fb_spi_flash.h>
@@ -338,6 +339,10 @@ void fastboot_data_complete(char *response)
  */
 static void __maybe_unused flash(char *cmd_parameter, char *response)
 {
+       if (IS_ENABLED(CONFIG_FASTBOOT_FLASH_BLOCK))
+               fastboot_block_flash_write(cmd_parameter, fastboot_buf_addr,
+                                          image_size, response);
+
        if (IS_ENABLED(CONFIG_FASTBOOT_FLASH_MMC))
                fastboot_mmc_flash_write(cmd_parameter, fastboot_buf_addr,
                                         image_size, response);
@@ -362,6 +367,9 @@ static void __maybe_unused flash(char *cmd_parameter, char *response)
  */
 static void __maybe_unused erase(char *cmd_parameter, char *response)
 {
+       if (IS_ENABLED(CONFIG_FASTBOOT_FLASH_BLOCK))
+               fastboot_block_erase(cmd_parameter, response);
+
        if (IS_ENABLED(CONFIG_FASTBOOT_FLASH_MMC))
                fastboot_mmc_erase(cmd_parameter, response);
 
index 68f92c4b887c8442cc212b8613fb70c7251cdcdf..dac5528f80908bf5b1224284c9ecd492394e4f0e 100644 (file)
@@ -97,16 +97,24 @@ int __weak fastboot_set_reboot_flag(enum fastboot_reboot_reason reason)
                [FASTBOOT_REBOOT_REASON_FASTBOOTD] = "boot-fastboot",
                [FASTBOOT_REBOOT_REASON_RECOVERY] = "boot-recovery"
        };
-       const int mmc_dev = config_opt_enabled(CONFIG_FASTBOOT_FLASH_MMC,
-                                              CONFIG_FASTBOOT_FLASH_MMC_DEV, -1);
 
-       if (!IS_ENABLED(CONFIG_FASTBOOT_FLASH_MMC))
+       int device = config_opt_enabled(CONFIG_FASTBOOT_FLASH_BLOCK,
+                                       CONFIG_FASTBOOT_FLASH_BLOCK_DEVICE_ID, -1);
+       if (device == -1) {
+               device = config_opt_enabled(CONFIG_FASTBOOT_FLASH_MMC,
+                                           CONFIG_FASTBOOT_FLASH_MMC_DEV, -1);
+       }
+       const char *bcb_iface = config_opt_enabled(CONFIG_FASTBOOT_FLASH_BLOCK,
+                                                  CONFIG_FASTBOOT_FLASH_BLOCK_INTERFACE_NAME,
+                                                  "mmc");
+
+       if (device == -1)
                return -EINVAL;
 
        if (reason >= FASTBOOT_REBOOT_REASONS_COUNT)
                return -EINVAL;
 
-       ret = bcb_find_partition_and_load("mmc", mmc_dev, "misc");
+       ret = bcb_find_partition_and_load(bcb_iface, device, "misc");
        if (ret)
                goto out;
 
@@ -226,8 +234,14 @@ void fastboot_set_progress_callback(void (*progress)(const char *msg))
  */
 void fastboot_init(void *buf_addr, u32 buf_size)
 {
+#if IS_ENABLED(CONFIG_FASTBOOT_FLASH_BLOCK)
+       if (!strcmp(CONFIG_FASTBOOT_FLASH_BLOCK_INTERFACE_NAME, "mmc"))
+               printf("Warning: the fastboot block backend features are limited, consider using the MMC backend\n");
+#endif
+
        fastboot_buf_addr = buf_addr ? buf_addr :
                                       (void *)CONFIG_FASTBOOT_BUF_ADDR;
        fastboot_buf_size = buf_size ? buf_size : CONFIG_FASTBOOT_BUF_SIZE;
        fastboot_set_progress_callback(NULL);
+
 }
index 6775ea397ab6bf011b8f6ce9b98e7079d8820dff..e8aa0e09aa6399591a7549f818edaf36b4a6bdd9 100644 (file)
@@ -7,6 +7,7 @@
 #include <fastboot.h>
 #include <fastboot-internal.h>
 #include <fb_mmc.h>
+#include <fb_block.h>
 #include <fb_nand.h>
 #include <fb_spi_flash.h>
 #include <fs.h>
@@ -115,7 +116,12 @@ static int getvar_get_part_info(const char *part_name, char *response,
        struct disk_partition disk_part;
        struct part_info *part_info;
 
-       if (IS_ENABLED(CONFIG_FASTBOOT_FLASH_MMC)) {
+       if (IS_ENABLED(CONFIG_FASTBOOT_FLASH_BLOCK)) {
+               r = fastboot_block_get_part_info(part_name, &dev_desc, &disk_part,
+                                                response);
+               if (r >= 0 && size)
+                       *size = disk_part.size * disk_part.blksz;
+       } else if (IS_ENABLED(CONFIG_FASTBOOT_FLASH_MMC)) {
                r = fastboot_mmc_get_part_info(part_name, &dev_desc, &disk_part,
                                               response);
                if (r >= 0 && size)