[PATCH v2 0/4] fastboot: mmc: Add CONFIG_FASTBOOT_MMC_USER_SUPPORT

Hi,
It is a rebased V2 version of the serie [1].
This serie adds a lot of new #if and doesn't respect the last U-Boot coding rules with 14 warnings detected by checkpatch:
warning: Use 'if (IS_ENABLED(CONFIG...))' instead of '#if or #ifdef' where possible
But I chose to copy the existing code of the fastboot files fb_command.c to a have an easier review.
So I prefer sent a patch (if it is required) to remove all the #ifdef in this file when the serie will be accepted.
I check compilation of the added features on stm32mp1 platform with the serie [2].
The compilation for modified boards (with already activated config CONFIG_FASTBOOT_MMC_BOOT1_SUPPORT) is verified with buildman:
tools/buildman/buildman mt8512_bm1_emmc mt8518_ap1_emmc pumpkin Building current source for 3 boards (3 threads, 4 jobs per thread) aarch64: w+ pumpkin +===================== WARNING ====================== +This board does not use CONFIG_DM_ETH (Driver Model +for Ethernet drivers). Please update the board to use +CONFIG_DM_ETH before the v2020.07 release. Failure to +update by the deadline may result in board removal. +See doc/driver-model/migration.rst for more info. +==================================================== aarch64: w+ mt8518_ap1_emmc +===================== WARNING ====================== +This board does not use CONFIG_DM_ETH (Driver Model +for Ethernet drivers). Please update the board to use +CONFIG_DM_ETH before the v2020.07 release. Failure to +update by the deadline may result in board removal. +See doc/driver-model/migration.rst for more info. +==================================================== aarch64: w+ mt8512_bm1_emmc +===================== WARNING ====================== +This board does not use CONFIG_DM_ETH (Driver Model +for Ethernet drivers). Please update the board to use +CONFIG_DM_ETH before the v2020.07 release. Failure to +update by the deadline may result in board removal. +See doc/driver-model/migration.rst for more info. +==================================================== 0 3 0 /3 0:00:07 : mt8512_bm1_emmc Completed: 3 total built, duration 0:00:23, rate 0.13
[1] "fastboot: mmc: Add CONFIG_FASTBOOT_MMC_USER_SUPPORT" http://patchwork.ozlabs.org/project/uboot/list/?series=200509&state=*
[2] "configs: stm32mp1: enable fastboot support of eMMC boot partition" http://patchwork.ozlabs.org/project/uboot/list/?series=200510
Regards
Patrick
Changes in v2: - rebase on master branch - new impact on pumpkin_defconfig and mt8512_bm1_emmc_defconfig - new impact on pumpkin_defconfig and mt8512_bm1_emmc_defconfig
Patrick Delaunay (4): fastboot: mmc: Add CONFIG_FASTBOOT_MMC_USER_SUPPORT fastboot: mmc: extend flash/erase for both emmc hwpart 1 and 2 fastboot: add command to select the default emmc hwpart for boot fastboot: add command to select the eMMC boot configuration
configs/mt8512_bm1_emmc_defconfig | 3 +- configs/mt8518_ap1_emmc_defconfig | 3 +- configs/pumpkin_defconfig | 3 +- doc/android/fastboot.rst | 3 ++ drivers/fastboot/Kconfig | 62 ++++++++++++++++++++------ drivers/fastboot/fb_command.c | 72 +++++++++++++++++++++++++++++++ drivers/fastboot/fb_mmc.c | 52 ++++++++++++++-------- include/fastboot.h | 6 +++ 8 files changed, 171 insertions(+), 33 deletions(-)

Split userdata and boot partition support for eMMC update and correct the description (update is supported).
The new configuration CONFIG_FASTBOOT_MMC_USER_SUPPORT allows to activate support of userdata partition update, based on target name=CONFIG_FASTBOOT_MMC_USER_NAME
This patch also removes the unnecessary dependency with ARCH_MEDIATEK and EFI_PARTITION.
Signed-off-by: Patrick Delaunay patrick.delaunay@foss.st.com ---
Changes in v2: - rebase on master branch - new impact on pumpkin_defconfig and mt8512_bm1_emmc_defconfig
configs/mt8512_bm1_emmc_defconfig | 1 + configs/mt8518_ap1_emmc_defconfig | 1 + configs/pumpkin_defconfig | 1 + drivers/fastboot/Kconfig | 22 +++++++++++++++++----- drivers/fastboot/fb_mmc.c | 9 ++++++--- 5 files changed, 26 insertions(+), 8 deletions(-)
diff --git a/configs/mt8512_bm1_emmc_defconfig b/configs/mt8512_bm1_emmc_defconfig index c6b3ee484b..1bda45c5d2 100644 --- a/configs/mt8512_bm1_emmc_defconfig +++ b/configs/mt8512_bm1_emmc_defconfig @@ -29,6 +29,7 @@ CONFIG_FASTBOOT_BUF_SIZE=0x1e00000 CONFIG_FASTBOOT_FLASH=y CONFIG_FASTBOOT_FLASH_MMC_DEV=0 CONFIG_FASTBOOT_MMC_BOOT1_SUPPORT=y +CONFIG_FASTBOOT_MMC_USER_SUPPORT=y CONFIG_DM_MMC=y CONFIG_MMC_HS200_SUPPORT=y CONFIG_MMC_MTK=y diff --git a/configs/mt8518_ap1_emmc_defconfig b/configs/mt8518_ap1_emmc_defconfig index b95d2c683a..d5fb0ccd48 100644 --- a/configs/mt8518_ap1_emmc_defconfig +++ b/configs/mt8518_ap1_emmc_defconfig @@ -25,6 +25,7 @@ CONFIG_FASTBOOT_BUF_SIZE=0x1E00000 CONFIG_FASTBOOT_FLASH=y CONFIG_FASTBOOT_FLASH_MMC_DEV=0 CONFIG_FASTBOOT_MMC_BOOT1_SUPPORT=y +CONFIG_FASTBOOT_MMC_USER_SUPPORT=y CONFIG_DM_MMC=y CONFIG_MMC_HS200_SUPPORT=y CONFIG_MMC_MTK=y diff --git a/configs/pumpkin_defconfig b/configs/pumpkin_defconfig index cd77889eea..a9655f5abb 100644 --- a/configs/pumpkin_defconfig +++ b/configs/pumpkin_defconfig @@ -53,6 +53,7 @@ CONFIG_FASTBOOT_BUF_SIZE=0x4000000 CONFIG_FASTBOOT_FLASH=y CONFIG_FASTBOOT_FLASH_MMC_DEV=0 CONFIG_FASTBOOT_MMC_BOOT1_SUPPORT=y +CONFIG_FASTBOOT_MMC_USER_SUPPORT=y # CONFIG_INPUT is not set CONFIG_DM_MMC=y # CONFIG_MMC_QUIRKS is not set diff --git a/drivers/fastboot/Kconfig b/drivers/fastboot/Kconfig index 4352ba67a7..cb8425685f 100644 --- a/drivers/fastboot/Kconfig +++ b/drivers/fastboot/Kconfig @@ -124,14 +124,26 @@ config FASTBOOT_MMC_BOOT1_NAME defined here. The default target name for updating EMMC_BOOT1 is "mmc0boot0".
+config FASTBOOT_MMC_USER_SUPPORT + bool "Enable eMMC userdata partition flash/erase" + depends on FASTBOOT_FLASH_MMC + help + Define this to enable the support "flash" and "erase" command on + eMMC userdata. The "flash" command only update the MBR and GPT + header when CONFIG_EFI_PARTITION is supported. + The "erase" command erase all the userdata. + This occurs when the specified "partition name" on the + fastboot command line matches the value CONFIG_FASTBOOT_MMC_USER_NAME. + config FASTBOOT_MMC_USER_NAME - string "Target name for erasing EMMC_USER" - depends on FASTBOOT_FLASH_MMC && EFI_PARTITION && ARCH_MEDIATEK + string "Target name for updating EMMC_USER" + depends on FASTBOOT_MMC_USER_SUPPORT default "mmc0" help - The fastboot "erase" command supports erasing EMMC_USER. This occurs - when the specified "EMMC_USER name" on the "fastboot erase" commands - match the value defined here. + The fastboot "flash" and "erase" command supports EMMC_USER. + This occurs when the specified "EMMC_USER name" on the + "fastboot flash" and the "fastboot erase" commands match the value + defined here. The default target name for erasing EMMC_USER is "mmc0".
config FASTBOOT_GPT_NAME diff --git a/drivers/fastboot/fb_mmc.c b/drivers/fastboot/fb_mmc.c index 4e26cef941..b5d4c90bfc 100644 --- a/drivers/fastboot/fb_mmc.c +++ b/drivers/fastboot/fb_mmc.c @@ -174,7 +174,8 @@ static void write_raw_image(struct blk_desc *dev_desc, fastboot_okay(NULL, response); }
-#ifdef CONFIG_FASTBOOT_MMC_BOOT1_SUPPORT +#if defined(CONFIG_FASTBOOT_MMC_BOOT1_SUPPORT) || \ + defined(CONFIG_FASTBOOT_MMC_USER_SUPPORT) static int fb_mmc_erase_mmc_hwpart(struct blk_desc *dev_desc) { lbaint_t blks; @@ -193,7 +194,9 @@ static int fb_mmc_erase_mmc_hwpart(struct blk_desc *dev_desc)
return 0; } +#endif
+#ifdef CONFIG_FASTBOOT_MMC_BOOT1_SUPPORT static void fb_mmc_boot1_ops(struct blk_desc *dev_desc, void *buffer, u32 buff_sz, char *response) { @@ -473,7 +476,7 @@ void fastboot_mmc_flash_write(const char *cmd, void *download_buffer, #endif
#if CONFIG_IS_ENABLED(EFI_PARTITION) -#ifndef CONFIG_FASTBOOT_MMC_USER_NAME +#ifndef CONFIG_FASTBOOT_MMC_USER_SUPPORT if (strcmp(cmd, CONFIG_FASTBOOT_GPT_NAME) == 0) { #else if (strcmp(cmd, CONFIG_FASTBOOT_GPT_NAME) == 0 || @@ -603,7 +606,7 @@ void fastboot_mmc_erase(const char *cmd, char *response) } #endif
-#ifdef CONFIG_FASTBOOT_MMC_USER_NAME +#ifdef CONFIG_FASTBOOT_MMC_USER_SUPPORT if (strcmp(cmd, CONFIG_FASTBOOT_MMC_USER_NAME) == 0) { /* erase EMMC userdata */ if (fb_mmc_erase_mmc_hwpart(dev_desc))

Update the code and the configs for eMMC boot and userdata partitions acces - FASTBOOT_MMC_BOOT_SUPPORT: boot partition 1 and 2 (erase/write) - FASTBOOT_MMC_BOOT1_NAME: boot partition 1, default name="mmc0boot0" - FASTBOOT_MMC_BOOT2_NAME: boot partition 2, default name="mmc0boot1"
This patch also removes the unnecessary dependency with ARCH_MEDIATEK and EFI_PARTITION.
Signed-off-by: Patrick Delaunay patrick.delaunay@foss.st.com ---
Changes in v2: - new impact on pumpkin_defconfig and mt8512_bm1_emmc_defconfig
configs/mt8512_bm1_emmc_defconfig | 2 +- configs/mt8518_ap1_emmc_defconfig | 2 +- configs/pumpkin_defconfig | 2 +- drivers/fastboot/Kconfig | 26 ++++++++++++----- drivers/fastboot/fb_mmc.c | 47 ++++++++++++++++++++----------- 5 files changed, 52 insertions(+), 27 deletions(-)
diff --git a/configs/mt8512_bm1_emmc_defconfig b/configs/mt8512_bm1_emmc_defconfig index 1bda45c5d2..d8e0e86c10 100644 --- a/configs/mt8512_bm1_emmc_defconfig +++ b/configs/mt8512_bm1_emmc_defconfig @@ -28,7 +28,7 @@ CONFIG_FASTBOOT_BUF_ADDR=0x56000000 CONFIG_FASTBOOT_BUF_SIZE=0x1e00000 CONFIG_FASTBOOT_FLASH=y CONFIG_FASTBOOT_FLASH_MMC_DEV=0 -CONFIG_FASTBOOT_MMC_BOOT1_SUPPORT=y +CONFIG_FASTBOOT_MMC_BOOT_SUPPORT=y CONFIG_FASTBOOT_MMC_USER_SUPPORT=y CONFIG_DM_MMC=y CONFIG_MMC_HS200_SUPPORT=y diff --git a/configs/mt8518_ap1_emmc_defconfig b/configs/mt8518_ap1_emmc_defconfig index d5fb0ccd48..2c760c1591 100644 --- a/configs/mt8518_ap1_emmc_defconfig +++ b/configs/mt8518_ap1_emmc_defconfig @@ -24,7 +24,7 @@ CONFIG_FASTBOOT_BUF_ADDR=0x56000000 CONFIG_FASTBOOT_BUF_SIZE=0x1E00000 CONFIG_FASTBOOT_FLASH=y CONFIG_FASTBOOT_FLASH_MMC_DEV=0 -CONFIG_FASTBOOT_MMC_BOOT1_SUPPORT=y +CONFIG_FASTBOOT_MMC_BOOT_SUPPORT=y CONFIG_FASTBOOT_MMC_USER_SUPPORT=y CONFIG_DM_MMC=y CONFIG_MMC_HS200_SUPPORT=y diff --git a/configs/pumpkin_defconfig b/configs/pumpkin_defconfig index a9655f5abb..5270ec28cb 100644 --- a/configs/pumpkin_defconfig +++ b/configs/pumpkin_defconfig @@ -52,7 +52,7 @@ CONFIG_FASTBOOT_BUF_ADDR=0x4d000000 CONFIG_FASTBOOT_BUF_SIZE=0x4000000 CONFIG_FASTBOOT_FLASH=y CONFIG_FASTBOOT_FLASH_MMC_DEV=0 -CONFIG_FASTBOOT_MMC_BOOT1_SUPPORT=y +CONFIG_FASTBOOT_MMC_BOOT_SUPPORT=y CONFIG_FASTBOOT_MMC_USER_SUPPORT=y # CONFIG_INPUT is not set CONFIG_DM_MMC=y diff --git a/drivers/fastboot/Kconfig b/drivers/fastboot/Kconfig index cb8425685f..ef57290876 100644 --- a/drivers/fastboot/Kconfig +++ b/drivers/fastboot/Kconfig @@ -104,18 +104,19 @@ config FASTBOOT_FLASH_NAND_TRIMFFS When flashing NAND enable the DROP_FFS flag to drop trailing all-0xff pages.
-config FASTBOOT_MMC_BOOT1_SUPPORT - bool "Enable EMMC_BOOT1 flash/erase" - depends on FASTBOOT_FLASH_MMC && EFI_PARTITION && ARCH_MEDIATEK +config FASTBOOT_MMC_BOOT_SUPPORT + bool "Enable EMMC_BOOT flash/erase" + depends on FASTBOOT_FLASH_MMC help The fastboot "flash" and "erase" commands normally does operations - on EMMC userdata. Define this to enable the special commands to - flash/erase EMMC_BOOT1. - The default target name for updating EMMC_BOOT1 is "mmc0boot0". + on eMMC userdata. Define this to enable the special commands to + flash/erase eMMC boot partition. + The default target name for updating eMMC boot partition 1/2 is + CONFIG_FASTBOOT_MMC_BOOT1_NAME/CONFIG_FASTBOOT_MMC_BOOT2_NAME.
config FASTBOOT_MMC_BOOT1_NAME string "Target name for updating EMMC_BOOT1" - depends on FASTBOOT_MMC_BOOT1_SUPPORT + depends on FASTBOOT_MMC_BOOT_SUPPORT default "mmc0boot0" help The fastboot "flash" and "erase" commands support operations on @@ -124,6 +125,17 @@ config FASTBOOT_MMC_BOOT1_NAME defined here. The default target name for updating EMMC_BOOT1 is "mmc0boot0".
+config FASTBOOT_MMC_BOOT2_NAME + string "Target name for updating EMMC_BOOT2" + depends on FASTBOOT_MMC_BOOT_SUPPORT + default "mmc0boot1" + help + The fastboot "flash" and "erase" commands support operations on + EMMC_BOOT2. This occurs when the specified "EMMC_BOOT2 name" on + the "fastboot flash" and "fastboot erase" commands match the value + defined here. + The default target name for updating EMMC_BOOT2 is "mmc0boot1". + config FASTBOOT_MMC_USER_SUPPORT bool "Enable eMMC userdata partition flash/erase" depends on FASTBOOT_FLASH_MMC diff --git a/drivers/fastboot/fb_mmc.c b/drivers/fastboot/fb_mmc.c index b5d4c90bfc..611074a3e4 100644 --- a/drivers/fastboot/fb_mmc.c +++ b/drivers/fastboot/fb_mmc.c @@ -174,7 +174,7 @@ static void write_raw_image(struct blk_desc *dev_desc, fastboot_okay(NULL, response); }
-#if defined(CONFIG_FASTBOOT_MMC_BOOT1_SUPPORT) || \ +#if defined(CONFIG_FASTBOOT_MMC_BOOT_SUPPORT) || \ defined(CONFIG_FASTBOOT_MMC_USER_SUPPORT) static int fb_mmc_erase_mmc_hwpart(struct blk_desc *dev_desc) { @@ -196,16 +196,16 @@ static int fb_mmc_erase_mmc_hwpart(struct blk_desc *dev_desc) } #endif
-#ifdef CONFIG_FASTBOOT_MMC_BOOT1_SUPPORT -static void fb_mmc_boot1_ops(struct blk_desc *dev_desc, void *buffer, - u32 buff_sz, char *response) +#ifdef CONFIG_FASTBOOT_MMC_BOOT_SUPPORT +static void fb_mmc_boot_ops(struct blk_desc *dev_desc, void *buffer, + int hwpart, u32 buff_sz, char *response) { lbaint_t blkcnt; lbaint_t blks; unsigned long blksz;
- // To operate on EMMC_BOOT1 (mmc0boot0), we first change the hwpart - if (blk_dselect_hwpart(dev_desc, 1)) { + // To operate on EMMC_BOOT1/2 (mmc0boot0/1) we first change the hwpart + if (blk_dselect_hwpart(dev_desc, hwpart)) { pr_err("Failed to select hwpart\n"); fastboot_fail("Failed to select hwpart", response); return; @@ -224,21 +224,24 @@ static void fb_mmc_boot1_ops(struct blk_desc *dev_desc, void *buffer, return; }
- debug("Start Flashing Image to EMMC_BOOT1...\n"); + debug("Start Flashing Image to EMMC_BOOT%d...\n", hwpart);
blks = fb_mmc_blk_write(dev_desc, 0, blkcnt, buffer);
if (blks != blkcnt) { - pr_err("Failed to write EMMC_BOOT1\n"); - fastboot_fail("Failed to write EMMC_BOOT1", response); + pr_err("Failed to write EMMC_BOOT%d\n", hwpart); + fastboot_fail("Failed to write EMMC_BOOT part", + response); return; }
- printf("........ wrote %lu bytes to EMMC_BOOT1\n", - blkcnt * blksz); + printf("........ wrote %lu bytes to EMMC_BOOT%d\n", + blkcnt * blksz, hwpart); } else { /* erase */ if (fb_mmc_erase_mmc_hwpart(dev_desc)) { - fastboot_fail("Failed to erase EMMC_BOOT1", response); + pr_err("Failed to erase EMMC_BOOT%d\n", hwpart); + fastboot_fail("Failed to erase EMMC_BOOT part", + response); return; } } @@ -467,10 +470,15 @@ void fastboot_mmc_flash_write(const char *cmd, void *download_buffer, return; }
-#ifdef CONFIG_FASTBOOT_MMC_BOOT1_SUPPORT +#ifdef CONFIG_FASTBOOT_MMC_BOOT_SUPPORT if (strcmp(cmd, CONFIG_FASTBOOT_MMC_BOOT1_NAME) == 0) { - fb_mmc_boot1_ops(dev_desc, download_buffer, - download_bytes, response); + fb_mmc_boot_ops(dev_desc, download_buffer, 1, + download_bytes, response); + return; + } + if (strcmp(cmd, CONFIG_FASTBOOT_MMC_BOOT2_NAME) == 0) { + fb_mmc_boot_ops(dev_desc, download_buffer, 2, + download_bytes, response); return; } #endif @@ -598,10 +606,15 @@ void fastboot_mmc_erase(const char *cmd, char *response) return; }
-#ifdef CONFIG_FASTBOOT_MMC_BOOT1_SUPPORT +#ifdef CONFIG_FASTBOOT_MMC_BOOT_SUPPORT if (strcmp(cmd, CONFIG_FASTBOOT_MMC_BOOT1_NAME) == 0) { /* erase EMMC boot1 */ - fb_mmc_boot1_ops(dev_desc, NULL, 0, response); + fb_mmc_boot_ops(dev_desc, NULL, 1, 0, response); + return; + } + if (strcmp(cmd, CONFIG_FASTBOOT_MMC_BOOT2_NAME) == 0) { + /* erase EMMC boot2 */ + fb_mmc_boot_ops(dev_desc, NULL, 2, 0, response); return; } #endif

Add fastboot command oem partconf which executes the command ``mmc partconf <id> <arg> 0`` on the current <id> mmc device to configure the eMMC boot partition with <arg>: boot_ack boot_partition, so the command is:
$> fastboot oem partconf:<boot_ack> <boot_partition>
The partition_access argument is forced to 0 (userdata)
Signed-off-by: Patrick Delaunay patrick.delaunay@foss.st.com ---
(no changes since v1)
doc/android/fastboot.rst | 2 ++ drivers/fastboot/Kconfig | 7 +++++++ drivers/fastboot/fb_command.c | 36 +++++++++++++++++++++++++++++++++++ include/fastboot.h | 3 +++ 4 files changed, 48 insertions(+)
diff --git a/doc/android/fastboot.rst b/doc/android/fastboot.rst index 2877c3cbaa..d8cb64261c 100644 --- a/doc/android/fastboot.rst +++ b/doc/android/fastboot.rst @@ -23,6 +23,8 @@ The current implementation supports the following standard commands: The following OEM commands are supported (if enabled):
- ``oem format`` - this executes ``gpt write mmc %x $partitions`` +- ``oem partconf`` - this executes ``mmc partconf %x <arg> 0`` to configure eMMC + with <arg> = boot_ack boot_partition
Support for both eMMC and NAND devices is included.
diff --git a/drivers/fastboot/Kconfig b/drivers/fastboot/Kconfig index ef57290876..9bd5597253 100644 --- a/drivers/fastboot/Kconfig +++ b/drivers/fastboot/Kconfig @@ -189,6 +189,13 @@ 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_CMD_OEM_PARTCONF + bool "Enable the 'oem partconf' command" + depends on FASTBOOT_FLASH_MMC && SUPPORT_EMMC_BOOT + help + Add support for the "oem partconf" command from a client. This set + the mmc boot-partition for the selecting eMMC device. + 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 && \ diff --git a/drivers/fastboot/fb_command.c b/drivers/fastboot/fb_command.c index d3c578672d..ae4a7dc7fb 100644 --- a/drivers/fastboot/fb_command.c +++ b/drivers/fastboot/fb_command.c @@ -42,6 +42,9 @@ static void reboot_recovery(char *, char *); #if CONFIG_IS_ENABLED(FASTBOOT_CMD_OEM_FORMAT) static void oem_format(char *, char *); #endif +#if CONFIG_IS_ENABLED(FASTBOOT_CMD_OEM_PARTCONF) +static void oem_partconf(char *, char *); +#endif
static const struct { const char *command; @@ -99,6 +102,12 @@ static const struct { .dispatch = oem_format, }, #endif +#if CONFIG_IS_ENABLED(FASTBOOT_CMD_OEM_PARTCONF) + [FASTBOOT_COMMAND_OEM_PARTCONF] = { + .command = "oem partconf", + .dispatch = oem_partconf, + }, +#endif };
/** @@ -374,3 +383,30 @@ static void oem_format(char *cmd_parameter, char *response) } } #endif + +#if CONFIG_IS_ENABLED(FASTBOOT_CMD_OEM_PARTCONF) +/** + * oem_partconf() - Execute the OEM partconf command + * + * @cmd_parameter: Pointer to command parameter + * @response: Pointer to fastboot response buffer + */ +static void oem_partconf(char *cmd_parameter, char *response) +{ + char cmdbuf[32]; + + if (!cmd_parameter) { + fastboot_fail("Expected command parameter", response); + return; + } + + /* execute 'mmc partconfg' command with cmd_parameter arguments*/ + snprintf(cmdbuf, sizeof(cmdbuf), "mmc partconf %x %s 0", + CONFIG_FASTBOOT_FLASH_MMC_DEV, cmd_parameter); + printf("Execute: %s\n", cmdbuf); + if (run_command(cmdbuf, 0)) + fastboot_fail("Cannot set oem partconf", response); + else + fastboot_okay(NULL, response); +} +#endif diff --git a/include/fastboot.h b/include/fastboot.h index 8e9ee80907..86559d1595 100644 --- a/include/fastboot.h +++ b/include/fastboot.h @@ -38,6 +38,9 @@ enum { #if CONFIG_IS_ENABLED(FASTBOOT_CMD_OEM_FORMAT) FASTBOOT_COMMAND_OEM_FORMAT, #endif +#if CONFIG_IS_ENABLED(FASTBOOT_CMD_OEM_PARTCONF) + FASTBOOT_COMMAND_OEM_PARTCONF, +#endif
FASTBOOT_COMMAND_COUNT };

Add command oem bootbus which executes the command ``mmc bootbus <id> <arg>`` on the current fastboot mmc device (<i> = CONFIG_FASTBOOT_FLASH_MMC_DEV) to set the eMMC boot configuration on first update, with <arg> = boot_bus_width reset_boot_bus_width boot_mode
$> fastboot oem bootbus:<boot_bus_width> <reset_boot_bus_width> <boot_mode>
Signed-off-by: Patrick Delaunay patrick.delaunay@foss.st.com ---
(no changes since v1)
doc/android/fastboot.rst | 1 + drivers/fastboot/Kconfig | 7 +++++++ drivers/fastboot/fb_command.c | 36 +++++++++++++++++++++++++++++++++++ include/fastboot.h | 3 +++ 4 files changed, 47 insertions(+)
diff --git a/doc/android/fastboot.rst b/doc/android/fastboot.rst index d8cb64261c..16b11399b3 100644 --- a/doc/android/fastboot.rst +++ b/doc/android/fastboot.rst @@ -25,6 +25,7 @@ The following OEM commands are supported (if enabled): - ``oem format`` - this executes ``gpt write mmc %x $partitions`` - ``oem partconf`` - this executes ``mmc partconf %x <arg> 0`` to configure eMMC with <arg> = boot_ack boot_partition +- ``oem bootbus`` - this executes ``mmc bootbus %x %s`` to configure eMMC
Support for both eMMC and NAND devices is included.
diff --git a/drivers/fastboot/Kconfig b/drivers/fastboot/Kconfig index 9bd5597253..5f2e109759 100644 --- a/drivers/fastboot/Kconfig +++ b/drivers/fastboot/Kconfig @@ -196,6 +196,13 @@ config FASTBOOT_CMD_OEM_PARTCONF Add support for the "oem partconf" command from a client. This set the mmc boot-partition for the selecting eMMC device.
+config FASTBOOT_CMD_OEM_BOOTBUS + bool "Enable the 'oem bootbus' command" + depends on FASTBOOT_FLASH_MMC && SUPPORT_EMMC_BOOT + help + Add support for the "oem bootbus" command from a client. This set + the mmc boot configuration for the selecting eMMC device. + 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 && \ diff --git a/drivers/fastboot/fb_command.c b/drivers/fastboot/fb_command.c index ae4a7dc7fb..41fc8d7904 100644 --- a/drivers/fastboot/fb_command.c +++ b/drivers/fastboot/fb_command.c @@ -45,6 +45,9 @@ static void oem_format(char *, char *); #if CONFIG_IS_ENABLED(FASTBOOT_CMD_OEM_PARTCONF) static void oem_partconf(char *, char *); #endif +#if CONFIG_IS_ENABLED(FASTBOOT_CMD_OEM_BOOTBUS) +static void oem_bootbus(char *, char *); +#endif
static const struct { const char *command; @@ -108,6 +111,12 @@ static const struct { .dispatch = oem_partconf, }, #endif +#if CONFIG_IS_ENABLED(FASTBOOT_CMD_OEM_BOOTBUS) + [FASTBOOT_COMMAND_OEM_BOOTBUS] = { + .command = "oem bootbus", + .dispatch = oem_bootbus, + }, +#endif };
/** @@ -410,3 +419,30 @@ static void oem_partconf(char *cmd_parameter, char *response) fastboot_okay(NULL, response); } #endif + +#if CONFIG_IS_ENABLED(FASTBOOT_CMD_OEM_BOOTBUS) +/** + * oem_bootbus() - Execute the OEM bootbus command + * + * @cmd_parameter: Pointer to command parameter + * @response: Pointer to fastboot response buffer + */ +static void oem_bootbus(char *cmd_parameter, char *response) +{ + char cmdbuf[32]; + + if (!cmd_parameter) { + fastboot_fail("Expected command parameter", response); + return; + } + + /* execute 'mmc bootbus' command with cmd_parameter arguments*/ + snprintf(cmdbuf, sizeof(cmdbuf), "mmc bootbus %x %s", + CONFIG_FASTBOOT_FLASH_MMC_DEV, cmd_parameter); + printf("Execute: %s\n", cmdbuf); + if (run_command(cmdbuf, 0)) + fastboot_fail("Cannot set oem bootbus", response); + else + fastboot_okay(NULL, response); +} +#endif diff --git a/include/fastboot.h b/include/fastboot.h index 86559d1595..3df7e6b81f 100644 --- a/include/fastboot.h +++ b/include/fastboot.h @@ -41,6 +41,9 @@ enum { #if CONFIG_IS_ENABLED(FASTBOOT_CMD_OEM_PARTCONF) FASTBOOT_COMMAND_OEM_PARTCONF, #endif +#if CONFIG_IS_ENABLED(FASTBOOT_CMD_OEM_BOOTBUS) + FASTBOOT_COMMAND_OEM_BOOTBUS, +#endif
FASTBOOT_COMMAND_COUNT };

Hi Patrick,
I believe that the first two patches in this series can be replicated with [1]. For example, if you currently use FASTBOOT_MMC_BOOT_SUPPORT with FASTBOOT_MMC_BOOT1_NAME set to "mmc0boot1", leading to commands like
$ fastboot erase mmc0boot1
You could instead do
$ fastboot erase 0.1:0
And the first behavior could be emulated by setting the environmental variable "fastboot_partition_alias_mmc0boot1" to "0.1:0".
I would like to work towards deprecating Kconfigs for achieving this particular use case. This is because everything is set at compile-time, but we have existing tools which make this easy to do at run-time. Favoring run-time configuration makes it easier to use one U-Boot for different boards, and also makes it easier for users to modify U-Boot.
For the latter two patches, I think there are two existing solutions. First, there is the patch to add "ucmd" support to fastboot. This allows running arbitrary commands on the U-Boot side. However, this may be unsuitable for systems which need to maintain a chain of trust (since allowing arbitrary commands would allow arbitrary software to run).
With this in mind, FIT images allow for script sections. For example, one could create an image tree source file like
/dts-v1/;
/ { description = "Configuration script"; #address-cells = <1>;
images { default = "script-1"; script-1 { data = /incbin/("mmc.scr"); type = "script"; compression = "none"; signature { algo = "sha1,rsa2048"; key-name-hint = "dev"; }; }; }; };
(or something similar; I haven't tested this). This would create a fit with containing "mmc.scr". On the U-Boot side, running
fastboot 0 source
Would source any script contained within the FIT image (if it was downloaded e.g. with "fastboot boot mmc.itb". I think this process would work well for "run once" scripts like setting the mmc boot partitions.
Please let me know if any of the above suggestions would achieve the functionality you need.
--Sean
[1] https://patchwork.ozlabs.org/project/uboot/list/?series=223198 [2] https://patchwork.ozlabs.org/project/uboot/patch/20210111101919.228555-1-hs@...
On 1/27/21 8:46 AM, Patrick Delaunay wrote:
Hi,
It is a rebased V2 version of the serie [1].
This serie adds a lot of new #if and doesn't respect the last U-Boot coding rules with 14 warnings detected by checkpatch:
warning: Use 'if (IS_ENABLED(CONFIG...))' instead of '#if or #ifdef' where possible
But I chose to copy the existing code of the fastboot files fb_command.c to a have an easier review.
So I prefer sent a patch (if it is required) to remove all the #ifdef in this file when the serie will be accepted.
I check compilation of the added features on stm32mp1 platform with the serie [2].
The compilation for modified boards (with already activated config CONFIG_FASTBOOT_MMC_BOOT1_SUPPORT) is verified with buildman:
tools/buildman/buildman mt8512_bm1_emmc mt8518_ap1_emmc pumpkin Building current source for 3 boards (3 threads, 4 jobs per thread) aarch64: w+ pumpkin +===================== WARNING ====================== +This board does not use CONFIG_DM_ETH (Driver Model +for Ethernet drivers). Please update the board to use +CONFIG_DM_ETH before the v2020.07 release. Failure to +update by the deadline may result in board removal. +See doc/driver-model/migration.rst for more info. +==================================================== aarch64: w+ mt8518_ap1_emmc +===================== WARNING ====================== +This board does not use CONFIG_DM_ETH (Driver Model +for Ethernet drivers). Please update the board to use +CONFIG_DM_ETH before the v2020.07 release. Failure to +update by the deadline may result in board removal. +See doc/driver-model/migration.rst for more info. +==================================================== aarch64: w+ mt8512_bm1_emmc +===================== WARNING ====================== +This board does not use CONFIG_DM_ETH (Driver Model +for Ethernet drivers). Please update the board to use +CONFIG_DM_ETH before the v2020.07 release. Failure to +update by the deadline may result in board removal. +See doc/driver-model/migration.rst for more info. +==================================================== 0 3 0 /3 0:00:07 : mt8512_bm1_emmc Completed: 3 total built, duration 0:00:23, rate 0.13
[1] "fastboot: mmc: Add CONFIG_FASTBOOT_MMC_USER_SUPPORT" http://patchwork.ozlabs.org/project/uboot/list/?series=200509&state=*
[2] "configs: stm32mp1: enable fastboot support of eMMC boot partition" http://patchwork.ozlabs.org/project/uboot/list/?series=200510
Regards
Patrick
Changes in v2:
- rebase on master branch
- new impact on pumpkin_defconfig and mt8512_bm1_emmc_defconfig
- new impact on pumpkin_defconfig and mt8512_bm1_emmc_defconfig
Patrick Delaunay (4): fastboot: mmc: Add CONFIG_FASTBOOT_MMC_USER_SUPPORT fastboot: mmc: extend flash/erase for both emmc hwpart 1 and 2 fastboot: add command to select the default emmc hwpart for boot fastboot: add command to select the eMMC boot configuration
configs/mt8512_bm1_emmc_defconfig | 3 +- configs/mt8518_ap1_emmc_defconfig | 3 +- configs/pumpkin_defconfig | 3 +- doc/android/fastboot.rst | 3 ++ drivers/fastboot/Kconfig | 62 ++++++++++++++++++++------ drivers/fastboot/fb_command.c | 72 +++++++++++++++++++++++++++++++ drivers/fastboot/fb_mmc.c | 52 ++++++++++++++-------- include/fastboot.h | 6 +++ 8 files changed, 171 insertions(+), 33 deletions(-)

Looks like I didn't CC people properly...
On 1/27/21 11:36 AM, Sean Anderson wrote:
Hi Patrick,
I believe that the first two patches in this series can be replicated with [1]. For example, if you currently use FASTBOOT_MMC_BOOT_SUPPORT with FASTBOOT_MMC_BOOT1_NAME set to "mmc0boot1", leading to commands like
$ fastboot erase mmc0boot1
You could instead do
$ fastboot erase 0.1:0
And the first behavior could be emulated by setting the environmental variable "fastboot_partition_alias_mmc0boot1" to "0.1:0".
I would like to work towards deprecating Kconfigs for achieving this particular use case. This is because everything is set at compile-time, but we have existing tools which make this easy to do at run-time. Favoring run-time configuration makes it easier to use one U-Boot for different boards, and also makes it easier for users to modify U-Boot.
For the latter two patches, I think there are two existing solutions. First, there is the patch to add "ucmd" support to fastboot. This allows running arbitrary commands on the U-Boot side. However, this may be unsuitable for systems which need to maintain a chain of trust (since allowing arbitrary commands would allow arbitrary software to run).
With this in mind, FIT images allow for script sections. For example, one could create an image tree source file like
/dts-v1/;
/ { description = "Configuration script"; #address-cells = <1>;
images { default = "script-1"; script-1 { data = /incbin/("mmc.scr"); type = "script"; compression = "none"; signature { algo = "sha1,rsa2048"; key-name-hint = "dev"; }; }; }; };
(or something similar; I haven't tested this). This would create a fit with containing "mmc.scr". On the U-Boot side, running
fastboot 0 source
Would source any script contained within the FIT image (if it was downloaded e.g. with "fastboot boot mmc.itb". I think this process would work well for "run once" scripts like setting the mmc boot partitions.
Please let me know if any of the above suggestions would achieve the functionality you need.
--Sean
[1] https://patchwork.ozlabs.org/project/uboot/list/?series=223198 [2] https://patchwork.ozlabs.org/project/uboot/patch/20210111101919.228555-1-hs@...
On 1/27/21 8:46 AM, Patrick Delaunay wrote:
Hi,
It is a rebased V2 version of the serie [1].
This serie adds a lot of new #if and doesn't respect the last U-Boot coding rules with 14 warnings detected by checkpatch:
warning: Use 'if (IS_ENABLED(CONFIG...))' instead of '#if or #ifdef' where possible
But I chose to copy the existing code of the fastboot files fb_command.c to a have an easier review.
So I prefer sent a patch (if it is required) to remove all the #ifdef in this file when the serie will be accepted.
I check compilation of the added features on stm32mp1 platform with the serie [2].
The compilation for modified boards (with already activated config CONFIG_FASTBOOT_MMC_BOOT1_SUPPORT) is verified with buildman:
tools/buildman/buildman mt8512_bm1_emmc mt8518_ap1_emmc pumpkin Building current source for 3 boards (3 threads, 4 jobs per thread) aarch64: w+ pumpkin +===================== WARNING ====================== +This board does not use CONFIG_DM_ETH (Driver Model +for Ethernet drivers). Please update the board to use +CONFIG_DM_ETH before the v2020.07 release. Failure to +update by the deadline may result in board removal. +See doc/driver-model/migration.rst for more info. +==================================================== aarch64: w+ mt8518_ap1_emmc +===================== WARNING ====================== +This board does not use CONFIG_DM_ETH (Driver Model +for Ethernet drivers). Please update the board to use +CONFIG_DM_ETH before the v2020.07 release. Failure to +update by the deadline may result in board removal. +See doc/driver-model/migration.rst for more info. +==================================================== aarch64: w+ mt8512_bm1_emmc +===================== WARNING ====================== +This board does not use CONFIG_DM_ETH (Driver Model +for Ethernet drivers). Please update the board to use +CONFIG_DM_ETH before the v2020.07 release. Failure to +update by the deadline may result in board removal. +See doc/driver-model/migration.rst for more info. +==================================================== 0 3 0 /3 0:00:07 : mt8512_bm1_emmc Completed: 3 total built, duration 0:00:23, rate 0.13
[1] "fastboot: mmc: Add CONFIG_FASTBOOT_MMC_USER_SUPPORT" http://patchwork.ozlabs.org/project/uboot/list/?series=200509&state=*
[2] "configs: stm32mp1: enable fastboot support of eMMC boot partition" http://patchwork.ozlabs.org/project/uboot/list/?series=200510
Regards
Patrick
Changes in v2:
- rebase on master branch
- new impact on pumpkin_defconfig and mt8512_bm1_emmc_defconfig
- new impact on pumpkin_defconfig and mt8512_bm1_emmc_defconfig
Patrick Delaunay (4): fastboot: mmc: Add CONFIG_FASTBOOT_MMC_USER_SUPPORT fastboot: mmc: extend flash/erase for both emmc hwpart 1 and 2 fastboot: add command to select the default emmc hwpart for boot fastboot: add command to select the eMMC boot configuration
configs/mt8512_bm1_emmc_defconfig | 3 +- configs/mt8518_ap1_emmc_defconfig | 3 +- configs/pumpkin_defconfig | 3 +- doc/android/fastboot.rst | 3 ++ drivers/fastboot/Kconfig | 62 ++++++++++++++++++++------ drivers/fastboot/fb_command.c | 72 +++++++++++++++++++++++++++++++ drivers/fastboot/fb_mmc.c | 52 ++++++++++++++-------- include/fastboot.h | 6 +++ 8 files changed, 171 insertions(+), 33 deletions(-)
participants (2)
-
Patrick Delaunay
-
Sean Anderson