diff options
author | Tom Rini <trini@konsulko.com> | 2021-02-08 18:54:01 +0300 |
---|---|---|
committer | Tom Rini <trini@konsulko.com> | 2021-02-08 18:54:01 +0300 |
commit | 461b754a8b6e76382acb8985d7a64b82ba65b88d (patch) | |
tree | 6e30ab953d3044c395e5478f1cbba11782fdddcf | |
parent | 3936fd998668846f77468d8f6a662e906920969c (diff) | |
parent | adb5daf0905a190375e46d59f1244b13c3cdc640 (diff) | |
download | u-boot-461b754a8b6e76382acb8985d7a64b82ba65b88d.tar.xz |
Merge branch 'master' of git://git.denx.de/u-boot-usb
-rw-r--r-- | configs/mt8512_bm1_emmc_defconfig | 3 | ||||
-rw-r--r-- | configs/mt8518_ap1_emmc_defconfig | 3 | ||||
-rw-r--r-- | configs/pumpkin_defconfig | 3 | ||||
-rw-r--r-- | doc/android/fastboot.rst | 3 | ||||
-rw-r--r-- | drivers/dfu/dfu_sf.c | 2 | ||||
-rw-r--r-- | drivers/fastboot/Kconfig | 72 | ||||
-rw-r--r-- | drivers/fastboot/Makefile | 1 | ||||
-rw-r--r-- | drivers/fastboot/fb_bcb_impl.c | 43 | ||||
-rw-r--r-- | drivers/fastboot/fb_command.c | 72 | ||||
-rw-r--r-- | drivers/fastboot/fb_common.c | 16 | ||||
-rw-r--r-- | drivers/fastboot/fb_mmc.c | 54 | ||||
-rw-r--r-- | include/fastboot.h | 15 |
12 files changed, 188 insertions, 99 deletions
diff --git a/configs/mt8512_bm1_emmc_defconfig b/configs/mt8512_bm1_emmc_defconfig index c6b3ee484b..d8e0e86c10 100644 --- a/configs/mt8512_bm1_emmc_defconfig +++ b/configs/mt8512_bm1_emmc_defconfig @@ -28,7 +28,8 @@ 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 CONFIG_MMC_MTK=y diff --git a/configs/mt8518_ap1_emmc_defconfig b/configs/mt8518_ap1_emmc_defconfig index b95d2c683a..2c760c1591 100644 --- a/configs/mt8518_ap1_emmc_defconfig +++ b/configs/mt8518_ap1_emmc_defconfig @@ -24,7 +24,8 @@ 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 CONFIG_MMC_MTK=y diff --git a/configs/pumpkin_defconfig b/configs/pumpkin_defconfig index cd77889eea..5270ec28cb 100644 --- a/configs/pumpkin_defconfig +++ b/configs/pumpkin_defconfig @@ -52,7 +52,8 @@ 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 # CONFIG_MMC_QUIRKS is not set diff --git a/doc/android/fastboot.rst b/doc/android/fastboot.rst index 2877c3cbaa..16b11399b3 100644 --- a/doc/android/fastboot.rst +++ b/doc/android/fastboot.rst @@ -23,6 +23,9 @@ 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 +- ``oem bootbus`` - this executes ``mmc bootbus %x %s`` to configure eMMC Support for both eMMC and NAND devices is included. diff --git a/drivers/dfu/dfu_sf.c b/drivers/dfu/dfu_sf.c index 318e43c179..76b629a334 100644 --- a/drivers/dfu/dfu_sf.c +++ b/drivers/dfu/dfu_sf.c @@ -131,7 +131,7 @@ static struct spi_flash *parse_dev(char *devstr) dev = spi_flash_probe(bus, cs, speed, mode); if (!dev) { - printf("Failed to create SPI flash at %d:%d:%d:%d\n", + printf("Failed to create SPI flash at %u:%u:%u:%u\n", bus, cs, speed, mode); return NULL; } diff --git a/drivers/fastboot/Kconfig b/drivers/fastboot/Kconfig index 4352ba67a7..a17e488714 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,14 +125,37 @@ 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 + 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 @@ -165,17 +189,19 @@ 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_USE_BCB_SET_REBOOT_FLAG - bool "Use BCB by fastboot to set boot reason" - depends on CMD_BCB && !ARCH_MESON && !ARCH_ROCKCHIP && !TARGET_KC1 && \ - !TARGET_SNIPER && !TARGET_AM57XX_EVM && !TARGET_DRA7XX_EVM - default y - help - Fastboot could implement setting of reboot reason in a generic fashion - via BCB commands. BCB commands are able to write reboot reason into - command field of boot control block. In general case it is sufficient - implementation if your platform supports BCB commands and doesn't - require any specific reboot reason handling. +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_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. endif # FASTBOOT diff --git a/drivers/fastboot/Makefile b/drivers/fastboot/Makefile index 2b2c390fe4..048af5aa82 100644 --- a/drivers/fastboot/Makefile +++ b/drivers/fastboot/Makefile @@ -5,4 +5,3 @@ obj-y += fb_getvar.o obj-y += fb_command.o obj-$(CONFIG_FASTBOOT_FLASH_MMC) += fb_mmc.o obj-$(CONFIG_FASTBOOT_FLASH_NAND) += fb_nand.o -obj-$(CONFIG_FASTBOOT_USE_BCB_SET_REBOOT_FLAG) += fb_bcb_impl.o diff --git a/drivers/fastboot/fb_bcb_impl.c b/drivers/fastboot/fb_bcb_impl.c deleted file mode 100644 index 89ec3601b6..0000000000 --- a/drivers/fastboot/fb_bcb_impl.c +++ /dev/null @@ -1,43 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0+ -/* - * Copyright 2020 GlobalLogic. - * Roman Kovalivskyi <roman.kovalivskyi@globallogic.com> - */ - -#include <common.h> -#include <fastboot.h> - -/** - * fastboot_set_reboot_flag() - Set flag to indicate reboot-bootloader - * - * Set flag which indicates that we should reboot into the bootloader - * following the reboot that fastboot executes after this function. - * - * This function should be overridden in your board file with one - * which sets whatever flag your board specific Android bootloader flow - * requires in order to re-enter the bootloader. - */ -int fastboot_set_reboot_flag(enum fastboot_reboot_reason reason) -{ - char cmd[64]; - - if (reason >= FASTBOOT_REBOOT_REASONS_COUNT) - return -EINVAL; - - snprintf(cmd, sizeof(cmd), "bcb load %d misc", - CONFIG_FASTBOOT_FLASH_MMC_DEV); - - if (run_command(cmd, 0)) - return -ENODEV; - - snprintf(cmd, sizeof(cmd), "bcb set command %s", - fastboot_boot_cmds[reason]); - - if (run_command(cmd, 0)) - return -ENOEXEC; - - if (run_command("bcb store", 0)) - return -EIO; - - return 0; -} diff --git a/drivers/fastboot/fb_command.c b/drivers/fastboot/fb_command.c index d3c578672d..41fc8d7904 100644 --- a/drivers/fastboot/fb_command.c +++ b/drivers/fastboot/fb_command.c @@ -42,6 +42,12 @@ 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 +#if CONFIG_IS_ENABLED(FASTBOOT_CMD_OEM_BOOTBUS) +static void oem_bootbus(char *, char *); +#endif static const struct { const char *command; @@ -99,6 +105,18 @@ 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 +#if CONFIG_IS_ENABLED(FASTBOOT_CMD_OEM_BOOTBUS) + [FASTBOOT_COMMAND_OEM_BOOTBUS] = { + .command = "oem bootbus", + .dispatch = oem_bootbus, + }, +#endif }; /** @@ -374,3 +392,57 @@ 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 + +#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/drivers/fastboot/fb_common.c b/drivers/fastboot/fb_common.c index 736ce1cd02..cbcc3683c4 100644 --- a/drivers/fastboot/fb_common.c +++ b/drivers/fastboot/fb_common.c @@ -10,6 +10,7 @@ * Rob Herring <robh@kernel.org> */ +#include <bcb.h> #include <common.h> #include <command.h> #include <env.h> @@ -90,7 +91,20 @@ void fastboot_okay(const char *reason, char *response) */ int __weak fastboot_set_reboot_flag(enum fastboot_reboot_reason reason) { - return -ENOSYS; +#if CONFIG_IS_ENABLED(FASTBOOT_FLASH_MMC_DEV) + static const char * const boot_cmds[] = { + [FASTBOOT_REBOOT_REASON_BOOTLOADER] = "bootonce-bootloader", + [FASTBOOT_REBOOT_REASON_FASTBOOTD] = "boot-fastboot", + [FASTBOOT_REBOOT_REASON_RECOVERY] = "boot-recovery" + }; + + if (reason >= FASTBOOT_REBOOT_REASONS_COUNT) + return -EINVAL; + + return bcb_write_reboot_reason(CONFIG_FASTBOOT_FLASH_MMC_DEV, "misc", boot_cmds[reason]); +#else + return -EINVAL; +#endif } /** diff --git a/drivers/fastboot/fb_mmc.c b/drivers/fastboot/fb_mmc.c index 4e26cef941..50532acb84 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_BOOT_SUPPORT) || \ + defined(CONFIG_FASTBOOT_MMC_USER_SUPPORT) static int fb_mmc_erase_mmc_hwpart(struct blk_desc *dev_desc) { lbaint_t blks; @@ -193,16 +194,18 @@ static int fb_mmc_erase_mmc_hwpart(struct blk_desc *dev_desc) return 0; } +#endif -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; @@ -221,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; } } @@ -464,16 +470,21 @@ 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 #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 || @@ -493,6 +504,7 @@ void fastboot_mmc_flash_write(const char *cmd, void *download_buffer, response); return; } + part_init(dev_desc); printf("........ success\n"); fastboot_okay(NULL, response); return; @@ -514,6 +526,7 @@ void fastboot_mmc_flash_write(const char *cmd, void *download_buffer, response); return; } + part_init(dev_desc); printf("........ success\n"); fastboot_okay(NULL, response); return; @@ -595,15 +608,20 @@ 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 -#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)) diff --git a/include/fastboot.h b/include/fastboot.h index 8e9ee80907..797d7dfd52 100644 --- a/include/fastboot.h +++ b/include/fastboot.h @@ -38,6 +38,12 @@ 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 +#if CONFIG_IS_ENABLED(FASTBOOT_CMD_OEM_BOOTBUS) + FASTBOOT_COMMAND_OEM_BOOTBUS, +#endif FASTBOOT_COMMAND_COUNT }; @@ -53,15 +59,6 @@ enum fastboot_reboot_reason { }; /** - * BCB boot commands - */ -static const char * const fastboot_boot_cmds[] = { - [FASTBOOT_REBOOT_REASON_BOOTLOADER] = "bootonce-bootloader", - [FASTBOOT_REBOOT_REASON_FASTBOOTD] = "boot-fastboot", - [FASTBOOT_REBOOT_REASON_RECOVERY] = "boot-recovery" -}; - -/** * fastboot_response() - Writes a response of the form "$tag$reason". * * @tag: The first part of the response |