[astro] 4.20210608.1.1146 u-boot source GitOrigin-RevId: fed2e391d49894b97fe01a7107a80dbac3e8f848 Change-Id: I6d9d14bcebfc857bdd324474b6374f0755def58a Reviewed-on: https://turquoise-internal-review.googlesource.com/c/third_party/u-boot/+/442125 Reviewed-by: Yecheng Zhao <zyecheng@google.com>
diff --git a/arch/arm/cpu/armv8/cpu_id.c b/arch/arm/cpu/armv8/cpu_id.c index 034aa32..968cdf2 100644 --- a/arch/arm/cpu/armv8/cpu_id.c +++ b/arch/arm/cpu/armv8/cpu_id.c
@@ -36,6 +36,7 @@ cpu_id_t cpu_id; unsigned int cpu_id_reg = readl(P_AO_SEC_SD_CFG8); + memset(&cpu_id, 0, sizeof(cpu_id_t)); cpu_id.family_id = (cpu_id_reg >> 24) & (0XFF); cpu_id.package_id = (cpu_id_reg >> 16) & (0XF0); cpu_id.chip_rev = (cpu_id_reg >> 8) & (0XFF);
diff --git a/arch/arm/cpu/armv8/g12a/bl31_apis.c b/arch/arm/cpu/armv8/g12a/bl31_apis.c index af35a66..10aa0d2 100644 --- a/arch/arm/cpu/armv8/g12a/bl31_apis.c +++ b/arch/arm/cpu/armv8/g12a/bl31_apis.c
@@ -98,8 +98,8 @@ int32_t meson_trustzone_efuse_get_max(struct efuse_hal_api_arg *arg) { - int32_t ret; - unsigned cmd; + int32_t ret = 0; + unsigned cmd = 0; if (arg->cmd == EFUSE_HAL_API_USER_MAX) cmd = EFUSE_USER_MAX;
diff --git a/arch/arm/cpu/armv8/g12a/firmware/scp_task/scp_remote.c b/arch/arm/cpu/armv8/g12a/firmware/scp_task/scp_remote.c index 37b89a0..398538a 100644 --- a/arch/arm/cpu/armv8/g12a/firmware/scp_task/scp_remote.c +++ b/arch/arm/cpu/armv8/g12a/firmware/scp_task/scp_remote.c
@@ -284,10 +284,6 @@ static int init_remote(void) { return 0; - uart_put_hex(readl(AO_IR_DEC_STATUS), 32); - uart_put_hex(readl(AO_IR_DEC_FRAME), 32); - init_custom_trigger(); - //return 0; } /*can be called in pwr_ctrl.c*/
diff --git a/arch/arm/include/asm/bitops.h b/arch/arm/include/asm/bitops.h index 9b78043..b83d72f 100644 --- a/arch/arm/include/asm/bitops.h +++ b/arch/arm/include/asm/bitops.h
@@ -158,7 +158,7 @@ tmp = *p; found_first: - tmp |= ~0UL >> size; + tmp |= ~0UL << size; found_middle: return result + ffz(tmp); }
diff --git a/board/amlogic/configs/g12a_estelle_bx.h b/board/amlogic/configs/g12a_estelle_bx.h index 62fb29b..53f2312 100755 --- a/board/amlogic/configs/g12a_estelle_bx.h +++ b/board/amlogic/configs/g12a_estelle_bx.h
@@ -262,7 +262,10 @@ "echo detect VOL_UP pressed;" \ "if gpio input GPIOZ_2; then " \ "echo MUTE not engaged, starting fastboot;" \ - "fastboot;" \ + /* If we don't detect a host USB + connection, exit fastboot mode and + boot normally.*/ \ + "fastboot_if_host_connected;" \ "else " \ "echo MUTE engaged, skipping fastboot;" \ "fi;" \
diff --git a/board/amlogic/g12a_estelle_bx/zircon.c b/board/amlogic/g12a_estelle_bx/zircon.c index 654aa43..573c748 100644 --- a/board/amlogic/g12a_estelle_bx/zircon.c +++ b/board/amlogic/g12a_estelle_bx/zircon.c
@@ -411,6 +411,17 @@ return 0; } +static int add_serial_number(zbi_header_t *zbi, size_t capacity) +{ + const char *s = getenv("serial"); + if (!s || (*s == '\0')) { + printf("Failed to retrieve serial number\n"); + return -1; + } + return append_zbi_item_or_log(zbi, capacity, ZBI_TYPE_SERIAL_NUMBER, 0, + s, strlen(s)); +} + static int add_board_info(zbi_header_t *zbi, size_t capacity) { zbi_board_info_t board_info = {}; @@ -890,6 +901,9 @@ RETURN_IF_NONZERO(append_zbi_item_or_log( zbi, capacity, ZBI_TYPE_CMDLINE, 0, uboot_ver, len + 1)); + // Non-fatal if for some reason this fails, just continue. + add_serial_number(zbi, capacity); + RETURN_IF_NONZERO(add_board_info(zbi, capacity)); // add platform ID
diff --git a/board/amlogic/g12a_estelle_bx/zircon_partition.c b/board/amlogic/g12a_estelle_bx/zircon_partition.c index 0d43c54..4cdb1ac 100644 --- a/board/amlogic/g12a_estelle_bx/zircon_partition.c +++ b/board/amlogic/g12a_estelle_bx/zircon_partition.c
@@ -1372,8 +1372,8 @@ opts.offset = ptn->first_block * block_size; opts.quiet = 1; - printf("Erasing blocks 0x%llx to 0x%llx\n", opts.offset, - opts.length); + printf("Erasing blocks [0x%llx, 0x%llx)\n", opts.offset, + opts.offset + opts.length); ret = nand_erase_opts(data_nand_info, &opts); if (ret)
diff --git a/common/aboot.c b/common/aboot.c index 8b8f237..4cc7a42 100644 --- a/common/aboot.c +++ b/common/aboot.c
@@ -196,6 +196,7 @@ __func__); fastboot_fail( "Request would exceed partition size!"); + free(fill_buf); return -1; }
diff --git a/common/aml_dt.c b/common/aml_dt.c index 45d4948..0807c11 100644 --- a/common/aml_dt.c +++ b/common/aml_dt.c
@@ -104,8 +104,10 @@ printf(" Multi dtb detected\n"); /* check and set aml_dt */ int i = 0; - char *aml_dt_buf; + char *aml_dt_buf = NULL; aml_dt_buf = (char *)malloc(sizeof(char)*64); + if (!aml_dt_buf) + return -1; memset(aml_dt_buf, 0, sizeof(aml_dt_buf)); /* update 2016.07.27, checkhw and setenv everytime,
diff --git a/common/cmd_efuse.c b/common/cmd_efuse.c index 75c51b4..816adae 100644 --- a/common/cmd_efuse.c +++ b/common/cmd_efuse.c
@@ -224,11 +224,6 @@ return ret; } - else - { - printf("arg error\n"); - return CMD_RET_USAGE; - } return 0; }
diff --git a/common/cmd_fastboot.c b/common/cmd_fastboot.c index 192baaf..67d5aa9 100644 --- a/common/cmd_fastboot.c +++ b/common/cmd_fastboot.c
@@ -9,9 +9,16 @@ */ #include <common.h> #include <command.h> +#include <fb_fastboot.h> #include <g_dnl.h> -static int do_fastboot(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[]) +// Fastboot main loop. +// +// |host_connect_timeout_ms|: timeout in milliseconds. If no host USB connection +// has been made in this time, exit fastboot mode. Set to 0 to disable timeout. +// +// Returns CMD_RET_SUCCESS on exit whether timeout occurred or not. +static int fastboot_loop(int host_connect_timeout_ms) { int ret; @@ -20,12 +27,21 @@ if (ret) return ret; + uint64_t start_ticks = get_ticks(); + uint64_t wait_ticks = host_connect_timeout_ms * (get_tbclk() / 1000); + while (1) { if (g_dnl_detach()) break; if (ctrlc()) break; usb_gadget_handle_interrupts(); + + if (host_connect_timeout_ms && !fastboot_host_connected && + (get_ticks() - start_ticks) > wait_ticks) { + printf("Host USB connection not detected, exiting fastboot\n"); + break; + } } g_dnl_unregister(); @@ -33,19 +49,43 @@ return CMD_RET_SUCCESS; } +static int do_fastboot(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[]) +{ + return fastboot_loop(0); +} + +static int do_fastboot_if_host_connected(cmd_tbl_t *cmdtp, int flag, int argc, + char *const argv[]) +{ + // Experimentally, 500ms seems too short and will sometimes exit before the + // USB connection initializes, but 1s seems to work consistently on Linux. We + // set it to 2s here just to be extra safe so it works for all hosts - the delay + // only takes effect if fastboot was requested but no USB cable is connected, + // so it's OK to overshoot here. + return fastboot_loop(2000); +} + +U_BOOT_CMD(fastboot, 1, 0, do_fastboot, "use USB Fastboot protocol", + "\n" + " - run as a fastboot usb device"); + +// We give this a separate command rather than making timeout a parameter +// because we should decide a common timeout value here rather than passing +// it in, and to make the call site less ambiguous since newer versions of +// u-boot pass in the USB interface number as a param to `fastboot`. U_BOOT_CMD( - fastboot, 1, 0, do_fastboot, - "use USB Fastboot protocol", + fastboot_if_host_connected, 1, 0, do_fastboot_if_host_connected, + "use USB Fastboot protocol if a USB host is connected", "\n" - " - run as a fastboot usb device" -); + " - run as a fastboot usb device but exit if a host isn't detected"); __attribute__((weak)) bool force_fastboot_mode(void); /* * Checks whether forced switching into fastboot mode is requested * Returns 0 if requested, 1 - otherwise. */ -static int do_force_fastboot_mode(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[]) +static int do_force_fastboot_mode(cmd_tbl_t *cmdtp, int flag, int argc, + char *const argv[]) { if (force_fastboot_mode) { if (force_fastboot_mode()) { @@ -60,7 +100,5 @@ return 1; } -U_BOOT_CMD( - force_fastboot_mode, 1, 0, do_force_fastboot_mode, - "check if USB Fastboot mode should be forced", "" -); +U_BOOT_CMD(force_fastboot_mode, 1, 0, do_force_fastboot_mode, + "check if USB Fastboot mode should be forced", "");
diff --git a/common/cmd_gpt.c b/common/cmd_gpt.c index 407cc5a..2e30eb9 100644 --- a/common/cmd_gpt.c +++ b/common/cmd_gpt.c
@@ -579,6 +579,10 @@ char *str_disk_guid; u8 part_count = 0; disk_partition_t *partitions = NULL; + + if (!str_part) + return -1; + /* fill partitions */ ret = set_gpt_info(blk_dev_desc, str_part, &str_disk_guid, &partitions, &part_count); @@ -609,6 +613,8 @@ u8 part_count = 0; int ret = 0; + if (!str_part) + return -1; /* fill partitions */ ret = set_gpt_info(blk_dev_desc, str_part, &str_disk_guid, &partitions, &part_count);
diff --git a/common/cmd_mtdparts.c b/common/cmd_mtdparts.c index 1248615..8224218 100644 --- a/common/cmd_mtdparts.c +++ b/common/cmd_mtdparts.c
@@ -262,7 +262,7 @@ char buf[16]; debug("--- current_save ---\n"); - + memset(buf, 0, 16); if (current_mtd_dev) { sprintf(buf, "%s%d,%d", MTD_DEV_TYPE(current_mtd_dev->id->type), current_mtd_dev->id->num, current_mtd_partnum);
diff --git a/common/mmc_ts.c b/common/mmc_ts.c index 6e4c1f8..1bfae02 100644 --- a/common/mmc_ts.c +++ b/common/mmc_ts.c
@@ -477,6 +477,7 @@ part_info = find_mmc_partition_by_name(CONFIG_FLASH_TS_PARTITION); if (part_info == NULL) { printf("get partition info failed !!\n"); + kfree(ts); return -1; }
diff --git a/drivers/usb/gadget/f_fastboot.c b/drivers/usb/gadget/f_fastboot.c index 738a910..41bd254 100644 --- a/drivers/usb/gadget/f_fastboot.c +++ b/drivers/usb/gadget/f_fastboot.c
@@ -88,6 +88,8 @@ #define antirollback_get_mvn_bl32() ((readl(ANTIROLLBACK_MVN_REG1) >> 8) & 0xff) #define antirollback_get_mvn_bl33() (readl(ANTIROLLBACK_MVN_REG1) & 0xff) +bool fastboot_host_connected = false; + static const char *s_slot_suffix_list[] = { "a", "b", NULL }; static const char *vx_min_version_slot_list[] = { "0", "1", "2", "3", "4", @@ -317,6 +319,8 @@ int ret; struct f_fastboot *f_fb = func_to_fastboot(f); + fastboot_host_connected = true; + debug("%s: func: %s intf: %d alt: %d\n", __func__, f->name, interface, alt); @@ -558,10 +562,8 @@ const char *s = NULL; #ifdef DEVICE_PRODUCT s = DEVICE_PRODUCT; - FB_MSG("DEVICE_PRODUCT: %s\n", s); #else s = getenv("device_product"); - FB_MSG("device_product: %s\n", s); #endif return s;
diff --git a/include/fb_fastboot.h b/include/fb_fastboot.h index 2b06a71..8407376 100644 --- a/include/fb_fastboot.h +++ b/include/fb_fastboot.h
@@ -8,4 +8,9 @@ void fastboot_fail(const char *s); void fastboot_okay(const char *s); +// Will be set to true once fastboot detects a host USB connection. +// Does not currently detect disconnections, so will stay true even if the +// USB cable is unplugged afterwards. +extern bool fastboot_host_connected; + #endif/*_FASTBOOT_H_*/