Merge branch 'master' of git://git.denx.de/u-boot-usb

This commit is contained in:
Tom Rini 2021-02-08 10:54:01 -05:00
commit 461b754a8b
12 changed files with 187 additions and 98 deletions

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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.

View File

@ -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;
}

View File

@ -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
config FASTBOOT_CMD_OEM_PARTCONF
bool "Enable the 'oem partconf' command"
depends on FASTBOOT_FLASH_MMC && SUPPORT_EMMC_BOOT
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.
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

View File

@ -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

View File

@ -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;
}

View File

@ -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

View File

@ -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
}
/**

View File

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

View File

@ -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
};
@ -52,15 +58,6 @@ enum fastboot_reboot_reason {
FASTBOOT_REBOOT_REASONS_COUNT
};
/**
* 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".
*