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:
committed by
Mattijs Korpershoek
parent
b63e85705d
commit
769c6cbbb5
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user