fastboot: integrate block flashing back-end

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>
This commit is contained in:
Dmitrii Merkurev
2025-11-21 11:53:33 +01:00
committed by Mattijs Korpershoek
parent b63e85705d
commit 769c6cbbb5
5 changed files with 64 additions and 7 deletions

View 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

View 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

View 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);

View 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);
}

View 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)