@@ -119,6 +119,10 @@ config FASTBOOT_FLASH_NAND
bool "FASTBOOT on NAND"
depends on MTD_RAW_NAND && CMD_MTDPARTS
+config FASTBOOT_FLASH_BLOCK
+ bool "FASTBOOT on block device"
+ depends on BLK
+
endchoice
config FASTBOOT_FLASH_MMC_DEV
@@ -193,6 +197,26 @@ 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 virtio, scsi, etc...
+ 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
+ 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.
+
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 <part.h>
@@ -337,6 +338,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);
@@ -357,6 +362,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 <fs.h>
#include <part.h>
@@ -114,7 +115,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)