From c9c42ad21fe4fe7bdd39e8557ac15aad92b5d968 Mon Sep 17 00:00:00 2001 From: Shenlin Liang Date: Fri, 2 Dec 2022 12:53:48 +0800 Subject: [PATCH 01/24] common:autoboot:modify function parameters the blob parameter of the function process_fdt_options has not been invoked in the function body and should be changed to void type Signed-off-by: Shenlin Liang Reviewed-by: Simon Glass --- common/autoboot.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/common/autoboot.c b/common/autoboot.c index ea44fdf6ad..848c33b2f2 100644 --- a/common/autoboot.c +++ b/common/autoboot.c @@ -422,7 +422,7 @@ static int abortboot(int bootdelay) return abort; } -static void process_fdt_options(const void *blob) +static void process_fdt_options(void) { #ifdef CONFIG_TEXT_BASE ulong addr; @@ -474,7 +474,7 @@ const char *bootdelay_process(void) s = env_get("bootcmd"); if (IS_ENABLED(CONFIG_OF_CONTROL)) - process_fdt_options(gd->fdt_blob); + process_fdt_options(); stored_bootdelay = bootdelay; return s; From 546795b5796670fda7985a50f17e281417ee0e4c Mon Sep 17 00:00:00 2001 From: Sean Anderson Date: Fri, 2 Dec 2022 10:35:19 -0500 Subject: [PATCH 02/24] rtc: abx8xx: Add support for reading RAM This adds support for reading the battery-backed memory present on these RTCs. This modifies the read/write methods to access the RAM instead of raw register offsets. No one was using these in-tree, so we should be fine changing them. We use the "standard" address space window to access the RAM. The extension RAM address register has some reserved bits, but we write the whole thing for simplicity (as these bits default to 0). Signed-off-by: Sean Anderson --- drivers/rtc/abx80x.c | 68 +++++++++++++++++++++++++++++++++----------- 1 file changed, 51 insertions(+), 17 deletions(-) diff --git a/drivers/rtc/abx80x.c b/drivers/rtc/abx80x.c index 528b06cbd6..823aff03f5 100644 --- a/drivers/rtc/abx80x.c +++ b/drivers/rtc/abx80x.c @@ -17,6 +17,7 @@ #include #include #include +#include #define ABX8XX_REG_HTH 0x00 #define ABX8XX_REG_SC 0x01 @@ -88,6 +89,16 @@ #define ABX8XX_TRICKLE_STANDARD_DIODE 0x8 #define ABX8XX_TRICKLE_SCHOTTKY_DIODE 0x4 +#define ABX8XX_REG_EXTRAM 0x3f +#define ABX8XX_EXTRAM_XADS GENMASK(1, 0) + +#define ABX8XX_SRAM_BASE 0x40 +#define ABX8XX_SRAM_WIN_SIZE 0x40U +#define ABX8XX_RAM_SIZE 256 + +#define RAM_ADDR_LOWER GENMASK(5, 0) +#define RAM_ADDR_UPPER GENMASK(7, 6) + static u8 trickle_resistors[] = {0, 3, 6, 11}; enum abx80x_chip {AB0801, AB0803, AB0804, AB0805, @@ -112,29 +123,52 @@ static struct abx80x_cap abx80x_caps[] = { [ABX80X] = {.pn = 0} }; -static int abx80x_rtc_read8(struct udevice *dev, unsigned int reg) +static int abx80x_rtc_xfer(struct udevice *dev, unsigned int offset, + u8 *val, unsigned int bytes, bool write) { - int ret = 0; - u8 buf; + int ret; - if (reg > 0xff) + if (offset + bytes > ABX8XX_RAM_SIZE) return -EINVAL; - ret = dm_i2c_read(dev, reg, &buf, sizeof(buf)); - if (ret < 0) - return ret; + while (bytes) { + u8 extram, reg, len, lower, upper; - return buf; + lower = FIELD_GET(RAM_ADDR_LOWER, offset); + upper = FIELD_GET(RAM_ADDR_UPPER, offset); + extram = FIELD_PREP(ABX8XX_EXTRAM_XADS, upper); + reg = ABX8XX_SRAM_BASE + lower; + len = min(lower + bytes, ABX8XX_SRAM_WIN_SIZE) - lower; + + ret = dm_i2c_reg_write(dev, ABX8XX_REG_EXTRAM, extram); + if (ret) + return ret; + + if (write) + ret = dm_i2c_write(dev, reg, val, len); + else + ret = dm_i2c_read(dev, reg, val, len); + if (ret) + return ret; + + offset += len; + val += len; + bytes -= len; + } + + return 0; } -static int abx80x_rtc_write8(struct udevice *dev, unsigned int reg, int val) +static int abx80x_rtc_read(struct udevice *dev, unsigned int offset, u8 *val, + unsigned int bytes) { - u8 buf = (u8)val; + return abx80x_rtc_xfer(dev, offset, val, bytes, false); +} - if (reg > 0xff) - return -EINVAL; - - return dm_i2c_write(dev, reg, &buf, sizeof(buf)); +static int abx80x_rtc_write(struct udevice *dev, unsigned int offset, + const u8 *val, unsigned int bytes) +{ + return abx80x_rtc_xfer(dev, offset, (u8 *)val, bytes, true); } static int abx80x_is_rc_mode(struct udevice *dev) @@ -334,9 +368,9 @@ static int abx80x_rtc_reset(struct udevice *dev) static const struct rtc_ops abx80x_rtc_ops = { .get = abx80x_rtc_read_time, .set = abx80x_rtc_set_time, - .reset = abx80x_rtc_reset, - .read8 = abx80x_rtc_read8, - .write8 = abx80x_rtc_write8 + .reset = abx80x_rtc_reset, + .read = abx80x_rtc_read, + .write = abx80x_rtc_write, }; static int abx80x_dt_trickle_cfg(struct udevice *dev) From 46b2e5e92cacd9b912c43f5fa42213946ab46a63 Mon Sep 17 00:00:00 2001 From: Sean Anderson Date: Fri, 2 Dec 2022 11:03:53 -0500 Subject: [PATCH 03/24] reboot-mode: Add NVMEM reboot mode This adds an NVMEM reboot mode driver, similar to Linux's implementation. This allows using the same device tree binding for Linux and U-Boot in most cases. Signed-off-by: Sean Anderson Reviewed-by: Simon Glass --- MAINTAINERS | 1 + drivers/reboot-mode/Kconfig | 7 +++ drivers/reboot-mode/Makefile | 1 + drivers/reboot-mode/reboot-mode-nvmem.c | 57 +++++++++++++++++++++++++ 4 files changed, 66 insertions(+) create mode 100644 drivers/reboot-mode/reboot-mode-nvmem.c diff --git a/MAINTAINERS b/MAINTAINERS index 237f3940b4..b2de50ccfc 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -1198,6 +1198,7 @@ M: Sean Anderson S: Maintained F: doc/api/nvmem.rst F: drivers/misc/nvmem.c +F: drivers/reboot-mode/reboot-mode-nvmem.c F: include/nvmem.h NXP C45 TJA11XX PHY DRIVER diff --git a/drivers/reboot-mode/Kconfig b/drivers/reboot-mode/Kconfig index 63ea18cdf0..d57baacc93 100644 --- a/drivers/reboot-mode/Kconfig +++ b/drivers/reboot-mode/Kconfig @@ -30,4 +30,11 @@ config DM_REBOOT_MODE_RTC a device in a specific mode by using a register(s) that can be controlled outside U-Boot (e.g. Kernel). +config REBOOT_MODE_NVMEM + bool "Use NVMEM reboot mode" + depends on DM_REBOOT_MODE && NVMEM + help + Use any kind of non-volatile memory (EEPROM, RTC, etc) to control the + reboot mode. + endmenu diff --git a/drivers/reboot-mode/Makefile b/drivers/reboot-mode/Makefile index 2c13780ced..48c8ab7fe7 100644 --- a/drivers/reboot-mode/Makefile +++ b/drivers/reboot-mode/Makefile @@ -7,3 +7,4 @@ obj-$(CONFIG_DM_REBOOT_MODE) += reboot-mode-uclass.o obj-$(CONFIG_DM_REBOOT_MODE_GPIO) += reboot-mode-gpio.o obj-$(CONFIG_DM_REBOOT_MODE_RTC) += reboot-mode-rtc.o +obj-$(CONFIG_REBOOT_MODE_NVMEM) += reboot-mode-nvmem.o diff --git a/drivers/reboot-mode/reboot-mode-nvmem.c b/drivers/reboot-mode/reboot-mode-nvmem.c new file mode 100644 index 0000000000..da41ca41d9 --- /dev/null +++ b/drivers/reboot-mode/reboot-mode-nvmem.c @@ -0,0 +1,57 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * Copyright (C) 2022 Sean Anderson + */ + +#include +#include +#include +#include + +/** + * struct nvmem_reboot_mode_priv - Private data for the nvmem reboot mode device + * @cell: The nvmem cell to store the mode in + */ +struct nvmem_reboot_mode_priv { + struct nvmem_cell cell; +}; + +static int reboot_mode_get(struct udevice *dev, u32 *mode) +{ + struct nvmem_reboot_mode_priv *priv = dev_get_priv(dev); + + return nvmem_cell_read(&priv->cell, mode, sizeof(*mode)); +} + +static int reboot_mode_set(struct udevice *dev, u32 mode) +{ + struct nvmem_reboot_mode_priv *priv = dev_get_priv(dev); + + return nvmem_cell_write(&priv->cell, &mode, sizeof(mode)); +} + +static const struct reboot_mode_ops nvmem_reboot_mode_ops = { + .get = reboot_mode_get, + .set = reboot_mode_set, +}; + +static int reboot_mode_probe(struct udevice *dev) +{ + struct nvmem_reboot_mode_priv *priv = dev_get_priv(dev); + + return nvmem_cell_get_by_name(dev, "reboot-mode", &priv->cell); +} + +static const struct udevice_id nvmem_reboot_mode_ids[] = { + { .compatible = "nvmem-reboot-mode" }, + { } +}; + +U_BOOT_DRIVER(nvmem_reboot_mode) = { + .name = "nvmem-reboot-mode", + .id = UCLASS_REBOOT_MODE, + .of_match = nvmem_reboot_mode_ids, + .probe = reboot_mode_probe, + .priv_auto = sizeof(struct nvmem_reboot_mode_priv), + .ops = &nvmem_reboot_mode_ops, +}; From dd02c667906d89ff46b79898de12ae8db9aceb6f Mon Sep 17 00:00:00 2001 From: Haijun Qin Date: Tue, 6 Dec 2022 15:41:37 +0800 Subject: [PATCH 04/24] lib: rsa: cosmetic: fix building warning add initialization of variable 'node',this can aviod the building warning: 'node' may be used uninitialized [-Wmaybe-uninitialized] Signed-off-by: Haijun Qin Reviewed-by: Simon Glass --- lib/rsa/rsa-sign.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/rsa/rsa-sign.c b/lib/rsa/rsa-sign.c index b2a21199e4..d20bdb58a5 100644 --- a/lib/rsa/rsa-sign.c +++ b/lib/rsa/rsa-sign.c @@ -608,7 +608,7 @@ int rsa_add_verify_data(struct image_sign_info *info, void *keydest) BIGNUM *modulus, *r_squared; uint64_t exponent; uint32_t n0_inv; - int parent, node; + int parent, node = -FDT_ERR_NOTFOUND; char name[100]; int ret; int bits; From 6762c8dd890f1e0b70822bd9b59a9003476dad2e Mon Sep 17 00:00:00 2001 From: Patrick Delaunay Date: Thu, 8 Dec 2022 09:10:13 +0100 Subject: [PATCH 05/24] cmd: mtdparts: add SYS_MTDPARTS_RUNTIME dependency on CONFIG_MTDIDS/MTDPARTS_DEFAULT The two configuration CONFIG_MTDIDS_DEFAULT and CONFIG_MTDPARTS_DEFAULT are not needed with mtd configuration CONFIG_SYS_MTDPARTS_RUNTIME which allows the MTDIDS and MTDPARTS to be configured at runtime. This patch has no defconfig impacts because CONFIG_SYS_MTDPARTS_RUNTIME is only used by two platforms (stm32mp and igep00x0) which don't define CONFIG_MTDIDS_DEFAULT or CONFIG_MTDPARTS_DEFAULT. This patch solves an UBI environment load issue for NAND boot for stm32mp15 platform. In mtd_uboot.c, when GD_FLG_ENV_READY is not set, env_get_f() return a EMPTY string, define in default_environment[] because CONFIG_MTDIDS_DEFAULT="" and CONFIG_MTDPARTS_DEFAULT="", but a NULL pointer is expected to allow call of board_mtdparts_default. Without mtdparts, the env partition [CONFIG_ENV_UBI_PART="UBI"] is not found in env/ubi.c [CONFIG_ENV_IS_IN_UBI]. It is not a problem when env becomes ready, as these empty variables are removed form U-Boot environment in env_import() / himport_r(). Fixes: a331017c237c ("Complete migration of MTDPARTS_DEFAULT / MTDIDS_DEFAULT, include in environment") Signed-off-by: Patrick Delaunay Reviewed-by: Patrice Chotard --- cmd/Kconfig | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cmd/Kconfig b/cmd/Kconfig index 199a55383e..b2aefae9cb 100644 --- a/cmd/Kconfig +++ b/cmd/Kconfig @@ -2539,6 +2539,7 @@ config CMD_MTDPARTS_SHOW_NET_SIZES config MTDIDS_DEFAULT string "Default MTD IDs" depends on MTD || SPI_FLASH + depends on !SYS_MTDPARTS_RUNTIME help Defines a default MTD IDs list for use with MTD partitions in the Linux MTD command line partitions format. @@ -2546,6 +2547,7 @@ config MTDIDS_DEFAULT config MTDPARTS_DEFAULT string "Default MTD partition scheme" depends on MTD || SPI_FLASH + depends on !SYS_MTDPARTS_RUNTIME help Defines a default MTD partitioning scheme in the Linux MTD command line partitions format From 5b333b932495ff4348978f93ef273c73de99b7d2 Mon Sep 17 00:00:00 2001 From: Shenlin Liang Date: Fri, 9 Dec 2022 17:17:43 +0800 Subject: [PATCH 06/24] cmd: change the return value when argc error When the number of parameters is wrong, the return value should be processed in the same way as other cmds, return CMD_RET_USAGE so that it can print the information. Signed-off-by: Shenlin Liang Reviewed-by: Simon Glass --- cmd/mvebu/comphy_rx_training.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/mvebu/comphy_rx_training.c b/cmd/mvebu/comphy_rx_training.c index 25a9e153de..4ee8f54ea9 100644 --- a/cmd/mvebu/comphy_rx_training.c +++ b/cmd/mvebu/comphy_rx_training.c @@ -22,7 +22,7 @@ int mvebu_comphy_rx_training_cmd(struct cmd_tbl *cmdtp, int flag, int argc, if (argc != 3) { printf("missing arguments\n"); - return -1; + return CMD_RET_USAGE; } cp_index = hextoul(argv[1], NULL); From e64289e1ec7c66a2d858aff65c0af501557d538b Mon Sep 17 00:00:00 2001 From: Max Krummenacher Date: Fri, 9 Dec 2022 13:09:56 +0100 Subject: [PATCH 07/24] test: env: add test for u-boot-initial-env creation Checks that `make u-boot-initial-env` creates the text file u-boot-initial-env and checks that it at least contains `board=`. Signed-off-by: Max Krummenacher Reviewed-by: Simon Glass --- test/py/tests/test_env.py | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/test/py/tests/test_env.py b/test/py/tests/test_env.py index 6d08565f0b..00bcccd65f 100644 --- a/test/py/tests/test_env.py +++ b/test/py/tests/test_env.py @@ -8,6 +8,7 @@ Test operation of shell commands relating to environment variables. import os import os.path +import re from subprocess import call, CalledProcessError import tempfile @@ -173,6 +174,29 @@ def validate_set(state_test_env, var, value): response = state_test_env.u_boot_console.run_command('printenv %s' % var) assert response == ('%s=%s' % (var, value)) +@pytest.mark.boardspec('sandbox') +def test_env_initial_env_file(u_boot_console): + """Test that the u-boot-initial-env make target works""" + cons = u_boot_console + builddir = 'O=' + cons.config.build_dir + envfile = cons.config.build_dir + '/u-boot-initial-env' + + # remove if already exists from an older run + try: + os.remove(envfile) + except: + pass + + u_boot_utils.run_and_log(cons, ['make', builddir, 'u-boot-initial-env']) + + assert os.path.exists(envfile) + + # assume that every environment has a board variable, e.g. board=sandbox + with open(envfile, 'r') as file: + env = file.read() + regex = re.compile('board=.+\\n') + assert re.search(regex, env) + def test_env_echo_exists(state_test_env): """Test echoing a variable that exists.""" From 91fc785834194c7cf2f686a8861a67154e56e817 Mon Sep 17 00:00:00 2001 From: Patrick Delaunay Date: Wed, 14 Dec 2022 16:51:31 +0100 Subject: [PATCH 08/24] env: ubi: add support of command env erase Add support of opts erase for ubi env backend, this opts is used by command 'env erase'. This command only zero-fill the env UBI volume CONFIG_ENV_UBI_VOLUME and CONFIG_ENV_UBI_VOLUME_REDUND, so the saved environment becomes invalid. This patch introduces a local define ENV_UBI_VOLUME_REDUND only to avoid #if in the code, as CONFIG_ENV_UBI_VOLUME_REDUND is only defined when CONFIG_SYS_REDUNDAND_ENVIRONMENT is defined. Signed-off-by: Patrick Delaunay Reviewed-by: Patrice Chotard Reviewed-by: Heiko Schocher --- env/ubi.c | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/env/ubi.c b/env/ubi.c index eb21c4f38b..445d34fedb 100644 --- a/env/ubi.c +++ b/env/ubi.c @@ -28,6 +28,12 @@ DECLARE_GLOBAL_DATA_PTR; +#if CONFIG_SYS_REDUNDAND_ENVIRONMENT +#define ENV_UBI_VOLUME_REDUND CONFIG_ENV_UBI_VOLUME_REDUND +#else +#define ENV_UBI_VOLUME_REDUND "invalid" +#endif + #ifdef CONFIG_CMD_SAVEENV #ifdef CONFIG_SYS_REDUNDAND_ENVIRONMENT static int env_ubi_save(void) @@ -177,9 +183,43 @@ static int env_ubi_load(void) } #endif /* CONFIG_SYS_REDUNDAND_ENVIRONMENT */ +static int env_ubi_erase(void) +{ + ALLOC_CACHE_ALIGN_BUFFER(char, env_buf, CONFIG_ENV_SIZE); + int ret = 0; + + if (ubi_part(CONFIG_ENV_UBI_PART, UBI_VID_OFFSET)) { + printf("\n** Cannot find mtd partition \"%s\"\n", + CONFIG_ENV_UBI_PART); + return 1; + } + + memset(env_buf, 0x0, CONFIG_ENV_SIZE); + + if (ubi_volume_write(CONFIG_ENV_UBI_VOLUME, + (void *)env_buf, CONFIG_ENV_SIZE)) { + printf("\n** Unable to erase env to %s:%s **\n", + CONFIG_ENV_UBI_PART, + CONFIG_ENV_UBI_VOLUME); + ret = 1; + } + if (IS_ENABLED(CONFIG_SYS_REDUNDAND_ENVIRONMENT)) { + if (ubi_volume_write(ENV_UBI_VOLUME_REDUND, + (void *)env_buf, CONFIG_ENV_SIZE)) { + printf("\n** Unable to erase env to %s:%s **\n", + CONFIG_ENV_UBI_PART, + ENV_UBI_VOLUME_REDUND); + ret = 1; + } + } + + return ret; +} + U_BOOT_ENV_LOCATION(ubi) = { .location = ENVL_UBI, ENV_NAME("UBI") .load = env_ubi_load, .save = env_save_ptr(env_ubi_save), + .erase = ENV_ERASE_PTR(env_ubi_erase), }; From 1c44d1087925263a428bee68d30ac9dec6f224e5 Mon Sep 17 00:00:00 2001 From: Patrick Delaunay Date: Wed, 14 Dec 2022 16:51:32 +0100 Subject: [PATCH 09/24] env: add failing trace in env_erase Add trace in env save to indicate any errors to end user and avoid silent output when the command 'env erase' is not executed as it is done in env_save with commit 8968288cb477 ("env: add failing trace in env_save") Signed-off-by: Patrick Delaunay Signed-off-by: Patrick Delaunay Reviewed-by: Patrice Chotard Reviewed-by: Heiko Schocher --- env/env.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/env/env.c b/env/env.c index 69848fb060..06078c7f37 100644 --- a/env/env.c +++ b/env/env.c @@ -311,11 +311,15 @@ int env_erase(void) if (drv) { int ret; - if (!drv->erase) + if (!drv->erase) { + printf("not possible\n"); return -ENODEV; + } - if (!env_has_inited(drv->location)) + if (!env_has_inited(drv->location)) { + printf("not initialized\n"); return -ENODEV; + } printf("Erasing Environment on %s... ", drv->name); ret = drv->erase(); From 59dacc319030748817b28cce9c773e15f2b73dc8 Mon Sep 17 00:00:00 2001 From: Patrick Delaunay Date: Thu, 15 Dec 2022 09:54:52 +0100 Subject: [PATCH 10/24] optee: bind the TA drivers on OP-TEE node In U-Boot driver model the devices can be referenced by phandle in the U-Boot configuration nodes. Without a valid node provided during the bind, the driver associated to OP-TEE TA can't be referenced. For example to force the sequence number with alias (.flags = DM_UC_FLAG_SEQ_ALIAS) aliases { rng0 = &optee; }; or other configuration: board-sysinfo { compatible = "vendor,sysinfo-board"; ramdom = <&optee>; } With this patch all drivers bound from OP-TEE service discovery are now associated are associated to OP-TEE node, allowing to identify by phandle the driver provided by the TA for one UCLASS without modifying device tree. Signed-off-by: Patrick Delaunay Reviewed-by: Patrice Chotard --- drivers/tee/optee/core.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/drivers/tee/optee/core.c b/drivers/tee/optee/core.c index b21031d7d8..a813a84a4f 100644 --- a/drivers/tee/optee/core.c +++ b/drivers/tee/optee/core.c @@ -92,7 +92,8 @@ static int bind_service_list(struct udevice *dev, struct tee_shm *service_list, if (!service) continue; - ret = device_bind_driver(dev, service->driver_name, service->driver_name, NULL); + ret = device_bind_driver_to_node(dev, service->driver_name, service->driver_name, + dev_ofnode(dev), NULL); if (ret) { dev_warn(dev, "%s was not bound: %d, ignored\n", service->driver_name, ret); continue; @@ -846,7 +847,8 @@ static int optee_probe(struct udevice *dev) * Discovery of TAs on the TEE bus is not supported in U-Boot: * only bind the drivers associated to the supported OP-TEE TA */ - ret = device_bind_driver(dev, "optee-rng", "optee-rng", NULL); + ret = device_bind_driver_to_node(dev, "optee-rng", "optee-rng", + dev_ofnode(dev), NULL); if (ret) dev_warn(dev, "ftpm_tee failed to bind: %d\n", ret); } From d03799004640abfeb656e9db48d6f9b9e24383fb Mon Sep 17 00:00:00 2001 From: Patrick Delaunay Date: Thu, 15 Dec 2022 10:15:50 +0100 Subject: [PATCH 11/24] fastboot: remove #ifdef CONFIG when it is possible Much of the fastboot code predates the introduction of Kconfig and has quite a few #ifdefs in it which is unnecessary now that we can use IS_ENABLED() et al. Signed-off-by: Patrick Delaunay Reviewed-by: Mattijs Korpershoek Reviewed-by: Sean Anderson Tested-by: Mattijs Korpershoek # on vim3l --- cmd/fastboot.c | 35 +++++------ drivers/fastboot/fb_command.c | 106 ++++++++++++-------------------- drivers/fastboot/fb_common.c | 11 ++-- drivers/fastboot/fb_getvar.c | 49 +++++---------- drivers/usb/gadget/f_fastboot.c | 7 +-- include/fastboot.h | 13 ---- net/fastboot.c | 8 +-- 7 files changed, 83 insertions(+), 146 deletions(-) diff --git a/cmd/fastboot.c b/cmd/fastboot.c index b498e4b22b..b94dbd5488 100644 --- a/cmd/fastboot.c +++ b/cmd/fastboot.c @@ -19,8 +19,14 @@ static int do_fastboot_udp(int argc, char *const argv[], uintptr_t buf_addr, size_t buf_size) { -#if CONFIG_IS_ENABLED(UDP_FUNCTION_FASTBOOT) - int err = net_loop(FASTBOOT); + int err; + + if (!CONFIG_IS_ENABLED(UDP_FUNCTION_FASTBOOT)) { + pr_err("Fastboot UDP not enabled\n"); + return CMD_RET_FAILURE; + } + + err = net_loop(FASTBOOT); if (err < 0) { printf("fastboot udp error: %d\n", err); @@ -28,21 +34,21 @@ static int do_fastboot_udp(int argc, char *const argv[], } return CMD_RET_SUCCESS; -#else - pr_err("Fastboot UDP not enabled\n"); - return CMD_RET_FAILURE; -#endif } static int do_fastboot_usb(int argc, char *const argv[], uintptr_t buf_addr, size_t buf_size) { -#if CONFIG_IS_ENABLED(USB_FUNCTION_FASTBOOT) int controller_index; char *usb_controller; char *endp; int ret; + if (!CONFIG_IS_ENABLED(USB_FUNCTION_FASTBOOT)) { + pr_err("Fastboot USB not enabled\n"); + return CMD_RET_FAILURE; + } + if (argc < 2) return CMD_RET_USAGE; @@ -88,10 +94,6 @@ exit: g_dnl_clear_detach(); return ret; -#else - pr_err("Fastboot USB not enabled\n"); - return CMD_RET_FAILURE; -#endif } static int do_fastboot(struct cmd_tbl *cmdtp, int flag, int argc, @@ -148,17 +150,12 @@ NXTARG: return do_fastboot_usb(argc, argv, buf_addr, buf_size); } -#ifdef CONFIG_SYS_LONGHELP -static char fastboot_help_text[] = +U_BOOT_CMD( + fastboot, CONFIG_SYS_MAXARGS, 1, do_fastboot, + "run as a fastboot usb or udp device", "[-l addr] [-s size] usb | udp\n" "\taddr - address of buffer used during data transfers (" __stringify(CONFIG_FASTBOOT_BUF_ADDR) ")\n" "\tsize - size of buffer used during data transfers (" __stringify(CONFIG_FASTBOOT_BUF_SIZE) ")" - ; -#endif - -U_BOOT_CMD( - fastboot, CONFIG_SYS_MAXARGS, 1, do_fastboot, - "run as a fastboot usb or udp device", fastboot_help_text ); diff --git a/drivers/fastboot/fb_command.c b/drivers/fastboot/fb_command.c index bdfdf262c8..f0fd605854 100644 --- a/drivers/fastboot/fb_command.c +++ b/drivers/fastboot/fb_command.c @@ -31,27 +31,16 @@ static u32 fastboot_bytes_expected; static void okay(char *, char *); static void getvar(char *, char *); static void download(char *, char *); -#if CONFIG_IS_ENABLED(FASTBOOT_FLASH) static void flash(char *, char *); static void erase(char *, char *); -#endif static void reboot_bootloader(char *, char *); static void reboot_fastbootd(char *, char *); 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 - -#if CONFIG_IS_ENABLED(FASTBOOT_UUU_SUPPORT) static void run_ucmd(char *, char *); static void run_acmd(char *, char *); -#endif static const struct { const char *command; @@ -65,16 +54,14 @@ static const struct { .command = "download", .dispatch = download }, -#if CONFIG_IS_ENABLED(FASTBOOT_FLASH) [FASTBOOT_COMMAND_FLASH] = { .command = "flash", - .dispatch = flash + .dispatch = CONFIG_IS_ENABLED(FASTBOOT_FLASH, (flash), (NULL)) }, [FASTBOOT_COMMAND_ERASE] = { .command = "erase", - .dispatch = erase + .dispatch = CONFIG_IS_ENABLED(FASTBOOT_FLASH, (erase), (NULL)) }, -#endif [FASTBOOT_COMMAND_BOOT] = { .command = "boot", .dispatch = okay @@ -103,34 +90,26 @@ static const struct { .command = "set_active", .dispatch = okay }, -#if CONFIG_IS_ENABLED(FASTBOOT_CMD_OEM_FORMAT) [FASTBOOT_COMMAND_OEM_FORMAT] = { .command = "oem format", - .dispatch = oem_format, + .dispatch = CONFIG_IS_ENABLED(FASTBOOT_CMD_OEM_FORMAT, (oem_format), (NULL)) }, -#endif -#if CONFIG_IS_ENABLED(FASTBOOT_CMD_OEM_PARTCONF) [FASTBOOT_COMMAND_OEM_PARTCONF] = { .command = "oem partconf", - .dispatch = oem_partconf, + .dispatch = CONFIG_IS_ENABLED(FASTBOOT_CMD_OEM_PARTCONF, (oem_partconf), (NULL)) }, -#endif -#if CONFIG_IS_ENABLED(FASTBOOT_CMD_OEM_BOOTBUS) [FASTBOOT_COMMAND_OEM_BOOTBUS] = { .command = "oem bootbus", - .dispatch = oem_bootbus, + .dispatch = CONFIG_IS_ENABLED(FASTBOOT_CMD_OEM_BOOTBUS, (oem_bootbus), (NULL)) }, -#endif -#if CONFIG_IS_ENABLED(FASTBOOT_UUU_SUPPORT) [FASTBOOT_COMMAND_UCMD] = { .command = "UCmd", - .dispatch = run_ucmd, + .dispatch = CONFIG_IS_ENABLED(FASTBOOT_UUU_SUPPORT, (run_ucmd), (NULL)) }, [FASTBOOT_COMMAND_ACMD] = { .command = "ACmd", - .dispatch = run_acmd, + .dispatch = CONFIG_IS_ENABLED(FASTBOOT_UUU_SUPPORT, (run_acmd), (NULL)) }, -#endif }; /** @@ -156,7 +135,9 @@ int fastboot_handle_command(char *cmd_string, char *response) response); return i; } else { - break; + pr_err("command %s not supported.\n", cmd_string); + fastboot_fail("Unsupported command", response); + return -1; } } } @@ -299,7 +280,6 @@ void fastboot_data_complete(char *response) fastboot_bytes_received = 0; } -#if CONFIG_IS_ENABLED(FASTBOOT_FLASH) /** * flash() - write the downloaded image to the indicated partition. * @@ -309,16 +289,15 @@ void fastboot_data_complete(char *response) * Writes the previously downloaded image to the partition indicated by * cmd_parameter. Writes to response. */ -static void flash(char *cmd_parameter, char *response) +static void __maybe_unused flash(char *cmd_parameter, char *response) { -#if CONFIG_IS_ENABLED(FASTBOOT_FLASH_MMC) - fastboot_mmc_flash_write(cmd_parameter, fastboot_buf_addr, image_size, - response); -#endif -#if CONFIG_IS_ENABLED(FASTBOOT_FLASH_NAND) - fastboot_nand_flash_write(cmd_parameter, fastboot_buf_addr, image_size, - response); -#endif + if (CONFIG_IS_ENABLED(FASTBOOT_FLASH_MMC)) + fastboot_mmc_flash_write(cmd_parameter, fastboot_buf_addr, + image_size, response); + + if (CONFIG_IS_ENABLED(FASTBOOT_FLASH_NAND)) + fastboot_nand_flash_write(cmd_parameter, fastboot_buf_addr, + image_size, response); } /** @@ -330,25 +309,22 @@ static void flash(char *cmd_parameter, char *response) * Erases the partition indicated by cmd_parameter (clear to 0x00s). Writes * to response. */ -static void erase(char *cmd_parameter, char *response) +static void __maybe_unused erase(char *cmd_parameter, char *response) { -#if CONFIG_IS_ENABLED(FASTBOOT_FLASH_MMC) - fastboot_mmc_erase(cmd_parameter, response); -#endif -#if CONFIG_IS_ENABLED(FASTBOOT_FLASH_NAND) - fastboot_nand_erase(cmd_parameter, response); -#endif -} -#endif + if (CONFIG_IS_ENABLED(FASTBOOT_FLASH_MMC)) + fastboot_mmc_erase(cmd_parameter, response); + + if (CONFIG_IS_ENABLED(FASTBOOT_FLASH_NAND)) + fastboot_nand_erase(cmd_parameter, response); +} -#if CONFIG_IS_ENABLED(FASTBOOT_UUU_SUPPORT) /** * run_ucmd() - Execute the UCmd command * * @cmd_parameter: Pointer to command parameter * @response: Pointer to fastboot response buffer */ -static void run_ucmd(char *cmd_parameter, char *response) +static void __maybe_unused run_ucmd(char *cmd_parameter, char *response) { if (!cmd_parameter) { pr_err("missing slot suffix\n"); @@ -375,7 +351,7 @@ void fastboot_acmd_complete(void) * @cmd_parameter: Pointer to command parameter * @response: Pointer to fastboot response buffer */ -static void run_acmd(char *cmd_parameter, char *response) +static void __maybe_unused run_acmd(char *cmd_parameter, char *response) { if (!cmd_parameter) { pr_err("missing slot suffix\n"); @@ -392,7 +368,6 @@ static void run_acmd(char *cmd_parameter, char *response) strcpy(g_a_cmd_buff, cmd_parameter); fastboot_okay(NULL, response); } -#endif /** * reboot_bootloader() - Sets reboot bootloader flag. @@ -436,40 +411,40 @@ static void reboot_recovery(char *cmd_parameter, char *response) fastboot_okay(NULL, response); } -#if CONFIG_IS_ENABLED(FASTBOOT_CMD_OEM_FORMAT) /** * oem_format() - Execute the OEM format command * * @cmd_parameter: Pointer to command parameter * @response: Pointer to fastboot response buffer */ -static void oem_format(char *cmd_parameter, char *response) +static void __maybe_unused oem_format(char *cmd_parameter, char *response) { char cmdbuf[32]; + const int mmc_dev = config_opt_enabled(CONFIG_FASTBOOT_FLASH_MMC, + CONFIG_FASTBOOT_FLASH_MMC_DEV, -1); if (!env_get("partitions")) { fastboot_fail("partitions not set", response); } else { - sprintf(cmdbuf, "gpt write mmc %x $partitions", - CONFIG_FASTBOOT_FLASH_MMC_DEV); + sprintf(cmdbuf, "gpt write mmc %x $partitions", mmc_dev); if (run_command(cmdbuf, 0)) fastboot_fail("", response); else fastboot_okay(NULL, 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) +static void __maybe_unused oem_partconf(char *cmd_parameter, char *response) { char cmdbuf[32]; + const int mmc_dev = config_opt_enabled(CONFIG_FASTBOOT_FLASH_MMC, + CONFIG_FASTBOOT_FLASH_MMC_DEV, -1); if (!cmd_parameter) { fastboot_fail("Expected command parameter", response); @@ -477,26 +452,25 @@ static void oem_partconf(char *cmd_parameter, char *response) } /* execute 'mmc partconfg' command with cmd_parameter arguments*/ - snprintf(cmdbuf, sizeof(cmdbuf), "mmc partconf %x %s 0", - CONFIG_FASTBOOT_FLASH_MMC_DEV, cmd_parameter); + snprintf(cmdbuf, sizeof(cmdbuf), "mmc partconf %x %s 0", 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) +static void __maybe_unused oem_bootbus(char *cmd_parameter, char *response) { char cmdbuf[32]; + const int mmc_dev = config_opt_enabled(CONFIG_FASTBOOT_FLASH_MMC, + CONFIG_FASTBOOT_FLASH_MMC_DEV, -1); if (!cmd_parameter) { fastboot_fail("Expected command parameter", response); @@ -504,12 +478,10 @@ static void oem_bootbus(char *cmd_parameter, char *response) } /* execute 'mmc bootbus' command with cmd_parameter arguments*/ - snprintf(cmdbuf, sizeof(cmdbuf), "mmc bootbus %x %s", - CONFIG_FASTBOOT_FLASH_MMC_DEV, cmd_parameter); + snprintf(cmdbuf, sizeof(cmdbuf), "mmc bootbus %x %s", 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 ef399d0c4a..7563650d07 100644 --- a/drivers/fastboot/fb_common.c +++ b/drivers/fastboot/fb_common.c @@ -91,20 +91,21 @@ void fastboot_okay(const char *reason, char *response) */ int __weak fastboot_set_reboot_flag(enum fastboot_reboot_reason reason) { -#ifdef CONFIG_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" }; + const int mmc_dev = config_opt_enabled(CONFIG_FASTBOOT_FLASH_MMC, + CONFIG_FASTBOOT_FLASH_MMC_DEV, -1); + + if (!CONFIG_IS_ENABLED(FASTBOOT_FLASH_MMC)) + return -EINVAL; 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 + return bcb_write_reboot_reason(mmc_dev, "misc", boot_cmds[reason]); } /** diff --git a/drivers/fastboot/fb_getvar.c b/drivers/fastboot/fb_getvar.c index 018989dd16..2fbd285db3 100644 --- a/drivers/fastboot/fb_getvar.c +++ b/drivers/fastboot/fb_getvar.c @@ -21,15 +21,9 @@ static void getvar_version_baseband(char *var_parameter, char *response); static void getvar_product(char *var_parameter, char *response); static void getvar_platform(char *var_parameter, char *response); static void getvar_current_slot(char *var_parameter, char *response); -#if CONFIG_IS_ENABLED(FASTBOOT_FLASH) static void getvar_has_slot(char *var_parameter, char *response); -#endif -#if CONFIG_IS_ENABLED(FASTBOOT_FLASH_MMC) static void getvar_partition_type(char *part_name, char *response); -#endif -#if CONFIG_IS_ENABLED(FASTBOOT_FLASH) static void getvar_partition_size(char *part_name, char *response); -#endif static void getvar_is_userspace(char *var_parameter, char *response); static const struct { @@ -84,7 +78,6 @@ static const struct { } }; -#if CONFIG_IS_ENABLED(FASTBOOT_FLASH) /** * Get partition number and size for any storage type. * @@ -102,28 +95,26 @@ static int getvar_get_part_info(const char *part_name, char *response, size_t *size) { int r; -# if CONFIG_IS_ENABLED(FASTBOOT_FLASH_MMC) struct blk_desc *dev_desc; - struct disk_partition part_info; - - r = fastboot_mmc_get_part_info(part_name, &dev_desc, &part_info, - response); - if (r >= 0 && size) - *size = part_info.size * part_info.blksz; -# elif CONFIG_IS_ENABLED(FASTBOOT_FLASH_NAND) + struct disk_partition disk_part; struct part_info *part_info; - r = fastboot_nand_get_part_info(part_name, &part_info, response); - if (r >= 0 && size) - *size = part_info->size; -# else - fastboot_fail("this storage is not supported in bootloader", response); - r = -ENODEV; -# endif + if (CONFIG_IS_ENABLED(FASTBOOT_FLASH_MMC)) { + r = fastboot_mmc_get_part_info(part_name, &dev_desc, &disk_part, + response); + if (r >= 0 && size) + *size = disk_part.size * disk_part.blksz; + } else if (CONFIG_IS_ENABLED(FASTBOOT_FLASH_NAND)) { + r = fastboot_nand_get_part_info(part_name, &part_info, response); + if (r >= 0 && size) + *size = part_info->size; + } else { + fastboot_fail("this storage is not supported in bootloader", response); + r = -ENODEV; + } return r; } -#endif static void getvar_version(char *var_parameter, char *response) { @@ -181,8 +172,7 @@ static void getvar_current_slot(char *var_parameter, char *response) fastboot_okay("a", response); } -#if CONFIG_IS_ENABLED(FASTBOOT_FLASH) -static void getvar_has_slot(char *part_name, char *response) +static void __maybe_unused getvar_has_slot(char *part_name, char *response) { char part_name_wslot[PART_NAME_LEN]; size_t len; @@ -213,10 +203,8 @@ static void getvar_has_slot(char *part_name, char *response) fail: fastboot_fail("invalid partition name", response); } -#endif -#if CONFIG_IS_ENABLED(FASTBOOT_FLASH_MMC) -static void getvar_partition_type(char *part_name, char *response) +static void __maybe_unused getvar_partition_type(char *part_name, char *response) { int r; struct blk_desc *dev_desc; @@ -232,10 +220,8 @@ static void getvar_partition_type(char *part_name, char *response) fastboot_okay(fs_get_type_name(), response); } } -#endif -#if CONFIG_IS_ENABLED(FASTBOOT_FLASH) -static void getvar_partition_size(char *part_name, char *response) +static void __maybe_unused getvar_partition_size(char *part_name, char *response) { int r; size_t size; @@ -244,7 +230,6 @@ static void getvar_partition_size(char *part_name, char *response) if (r >= 0) fastboot_response("OKAY", response, "0x%016zx", size); } -#endif static void getvar_is_userspace(char *var_parameter, char *response) { diff --git a/drivers/usb/gadget/f_fastboot.c b/drivers/usb/gadget/f_fastboot.c index 07b1681c8a..c6e7f42407 100644 --- a/drivers/usb/gadget/f_fastboot.c +++ b/drivers/usb/gadget/f_fastboot.c @@ -495,7 +495,6 @@ static void do_bootm_on_complete(struct usb_ep *ep, struct usb_request *req) do_exit_on_complete(ep, req); } -#if CONFIG_IS_ENABLED(FASTBOOT_UUU_SUPPORT) static void do_acmd_complete(struct usb_ep *ep, struct usb_request *req) { /* When usb dequeue complete will be called @@ -505,7 +504,6 @@ static void do_acmd_complete(struct usb_ep *ep, struct usb_request *req) if (req->status == 0) fastboot_acmd_complete(); } -#endif static void rx_handler_command(struct usb_ep *ep, struct usb_request *req) { @@ -546,11 +544,10 @@ static void rx_handler_command(struct usb_ep *ep, struct usb_request *req) fastboot_func->in_req->complete = compl_do_reset; g_dnl_trigger_detach(); break; -#if CONFIG_IS_ENABLED(FASTBOOT_UUU_SUPPORT) case FASTBOOT_COMMAND_ACMD: - fastboot_func->in_req->complete = do_acmd_complete; + if (CONFIG_IS_ENABLED(FASTBOOT_UUU_SUPPORT)) + fastboot_func->in_req->complete = do_acmd_complete; break; -#endif } } diff --git a/include/fastboot.h b/include/fastboot.h index 57daaf1298..d062a3469e 100644 --- a/include/fastboot.h +++ b/include/fastboot.h @@ -24,10 +24,8 @@ enum { FASTBOOT_COMMAND_GETVAR = 0, FASTBOOT_COMMAND_DOWNLOAD, -#if CONFIG_IS_ENABLED(FASTBOOT_FLASH) FASTBOOT_COMMAND_FLASH, FASTBOOT_COMMAND_ERASE, -#endif FASTBOOT_COMMAND_BOOT, FASTBOOT_COMMAND_CONTINUE, FASTBOOT_COMMAND_REBOOT, @@ -35,20 +33,11 @@ enum { FASTBOOT_COMMAND_REBOOT_FASTBOOTD, FASTBOOT_COMMAND_REBOOT_RECOVERY, FASTBOOT_COMMAND_SET_ACTIVE, -#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 -#if CONFIG_IS_ENABLED(FASTBOOT_UUU_SUPPORT) FASTBOOT_COMMAND_ACMD, FASTBOOT_COMMAND_UCMD, -#endif - FASTBOOT_COMMAND_COUNT }; @@ -173,7 +162,5 @@ void fastboot_data_download(const void *fastboot_data, */ void fastboot_data_complete(char *response); -#if CONFIG_IS_ENABLED(FASTBOOT_UUU_SUPPORT) void fastboot_acmd_complete(void); -#endif #endif /* _FASTBOOT_H_ */ diff --git a/net/fastboot.c b/net/fastboot.c index 139233b86c..96bdf5486f 100644 --- a/net/fastboot.c +++ b/net/fastboot.c @@ -42,7 +42,6 @@ static int fastboot_our_port; static void boot_downloaded_image(void); -#if CONFIG_IS_ENABLED(FASTBOOT_FLASH) /** * fastboot_udp_send_info() - Send an INFO packet during long commands. * @@ -104,7 +103,6 @@ static void fastboot_timed_send_info(const char *msg) fastboot_udp_send_info(msg); } } -#endif /** * fastboot_send() - Sends a packet in response to received fastboot packet @@ -309,9 +307,9 @@ void fastboot_start_server(void) fastboot_our_port = CONFIG_UDP_FUNCTION_FASTBOOT_PORT; -#if CONFIG_IS_ENABLED(FASTBOOT_FLASH) - fastboot_set_progress_callback(fastboot_timed_send_info); -#endif + if (CONFIG_IS_ENABLED(FASTBOOT_FLASH)) + fastboot_set_progress_callback(fastboot_timed_send_info); + net_set_udp_handler(fastboot_handler); /* zero out server ether in case the server ip has changed */ From f3d914cfdd5ac611d99f04096497f4cd13dd6aaa Mon Sep 17 00:00:00 2001 From: Sean Anderson Date: Fri, 16 Dec 2022 13:20:16 -0500 Subject: [PATCH 12/24] fastboot: Add OEM run command This adds the UUU UCmd functionality as an OEM command. While the fastboot tool allows sending arbitrary commands as long as they are prefixed with "oem". This allows running generic U-Boot commands over fastboot without UUU, which is especially useful when not using USB. This is really the route we should have gone in the first place when adding these commands. While we're here, clean up the UUU Kconfig a bit. Signed-off-by: Sean Anderson Reviewed-by: Heiko Schocher --- doc/android/fastboot.rst | 18 ++++++++++++++++++ drivers/fastboot/Kconfig | 19 ++++++++++++++----- drivers/fastboot/fb_command.c | 4 ++++ include/fastboot.h | 1 + 4 files changed, 37 insertions(+), 5 deletions(-) diff --git a/doc/android/fastboot.rst b/doc/android/fastboot.rst index 7611f07038..1ad8a897c8 100644 --- a/doc/android/fastboot.rst +++ b/doc/android/fastboot.rst @@ -28,6 +28,7 @@ The following OEM commands are supported (if enabled): - ``oem partconf`` - this executes ``mmc partconf %x 0`` to configure eMMC with = boot_ack boot_partition - ``oem bootbus`` - this executes ``mmc bootbus %x %s`` to configure eMMC +- ``oem run`` - this executes an arbitrary U-Boot command Support for both eMMC and NAND devices is included. @@ -227,6 +228,23 @@ and on the U-Boot side you should see:: Starting kernel ... +Running Shell Commands +^^^^^^^^^^^^^^^^^^^^^^ + +Normally, arbitrary U-Boot command execution is not enabled. This is so +fastboot can be used to update systems using verified boot. However, such +functionality can be useful for production or when verified boot is not in use. +Enable ``CONFIG_FASTBOOT_OEM_RUN`` to use this functionality. This will enable +``oem run`` command, which can be used with the fastboot client. For example, +to print "Hello at 115200 baud" (or whatever ``CONFIG_BAUDRATE`` is), run:: + + $ fastboot oem run:'echo Hello at $baudrate baud' + +You can run any command you would normally run on the U-Boot command line, +including multiple commands (using e.g. ``;`` or ``&&``) and control structures +(``if``, ``while``, etc.). The exit code of ``fastboot`` will reflect the exit +code of the command you ran. + References ---------- diff --git a/drivers/fastboot/Kconfig b/drivers/fastboot/Kconfig index b97c67bf60..eefa34779c 100644 --- a/drivers/fastboot/Kconfig +++ b/drivers/fastboot/Kconfig @@ -80,12 +80,13 @@ config FASTBOOT_FLASH this to enable the "fastboot flash" command. config FASTBOOT_UUU_SUPPORT - bool "Enable FASTBOOT i.MX UUU special command" + bool "Enable UUU support" help - The fastboot protocol includes "UCmd" and "ACmd" command. - Be aware that you provide full access to any U-Boot command, - including working with memory and may open a huge backdoor, - when enabling this option. + This extends the fastboot protocol with the "UCmd" and "ACmd" + commands, which are used by NXP's "universal update utility" (UUU). + These commands allow running any shell command. Do not enable this + feature if you are using verified boot, as it will allow an attacker + to bypass any restrictions you have in place. choice prompt "Flash provider for FASTBOOT" @@ -218,6 +219,14 @@ config FASTBOOT_CMD_OEM_BOOTBUS Add support for the "oem bootbus" command from a client. This set the mmc boot configuration for the selecting eMMC device. +config FASTBOOT_OEM_RUN + bool "Enable the 'oem run' command" + help + This extends the fastboot protocol with an "oem run" command. This + command allows running arbitrary U-Boot shell commands. Do not enable + this feature if you are using verified boot, as it will allow an + attacker to bypass any restrictions you have in place. + endif # FASTBOOT endmenu diff --git a/drivers/fastboot/fb_command.c b/drivers/fastboot/fb_command.c index f0fd605854..67a9479828 100644 --- a/drivers/fastboot/fb_command.c +++ b/drivers/fastboot/fb_command.c @@ -102,6 +102,10 @@ static const struct { .command = "oem bootbus", .dispatch = CONFIG_IS_ENABLED(FASTBOOT_CMD_OEM_BOOTBUS, (oem_bootbus), (NULL)) }, + [FASTBOOT_COMMAND_OEM_RUN] = { + .command = "oem run", + .dispatch = CONFIG_IS_ENABLED(FASTBOOT_OEM_RUN, (run_ucmd), (NULL)) + }, [FASTBOOT_COMMAND_UCMD] = { .command = "UCmd", .dispatch = CONFIG_IS_ENABLED(FASTBOOT_UUU_SUPPORT, (run_ucmd), (NULL)) diff --git a/include/fastboot.h b/include/fastboot.h index d062a3469e..07f4c8fa71 100644 --- a/include/fastboot.h +++ b/include/fastboot.h @@ -36,6 +36,7 @@ enum { FASTBOOT_COMMAND_OEM_FORMAT, FASTBOOT_COMMAND_OEM_PARTCONF, FASTBOOT_COMMAND_OEM_BOOTBUS, + FASTBOOT_COMMAND_OEM_RUN, FASTBOOT_COMMAND_ACMD, FASTBOOT_COMMAND_UCMD, FASTBOOT_COMMAND_COUNT From 721307eba0e7d94241698936c58352ee3c6da748 Mon Sep 17 00:00:00 2001 From: Marek Vasut Date: Tue, 20 Dec 2022 07:25:59 +0100 Subject: [PATCH 13/24] cmd: exit: Fix return value propagation out of environment scripts Make sure the 'exit' command as well as 'exit $val' command exits from environment scripts immediately and propagates return value out of those scripts fully. That means the following behavior is expected: " => setenv foo 'echo bar ; exit 1' ; run foo ; echo $? bar 1 => setenv foo 'echo bar ; exit 0' ; run foo ; echo $? bar 0 => setenv foo 'echo bar ; exit -2' ; run foo ; echo $? bar 0 " As well as the followin behavior: " => setenv foo 'echo bar ; exit 3 ; echo fail'; run foo; echo $? bar 3 => setenv foo 'echo bar ; exit 1 ; echo fail'; run foo; echo $? bar 1 => setenv foo 'echo bar ; exit 0 ; echo fail'; run foo; echo $? bar 0 => setenv foo 'echo bar ; exit -1 ; echo fail'; run foo; echo $? bar 0 => setenv foo 'echo bar ; exit -2 ; echo fail'; run foo; echo $? bar 0 => setenv foo 'echo bar ; exit ; echo fail'; run foo; echo $? bar 0 " Fixes: 8c4e3b79bd0 ("cmd: exit: Fix return value") Reviewed-by: Hector Palacios Signed-off-by: Marek Vasut --- cmd/exit.c | 9 ++++++--- common/cli.c | 7 ++++--- common/cli_hush.c | 21 +++++++++++++++------ doc/usage/cmd/exit.rst | 4 +++- 4 files changed, 28 insertions(+), 13 deletions(-) diff --git a/cmd/exit.c b/cmd/exit.c index 2c7132693a..7bf241ec73 100644 --- a/cmd/exit.c +++ b/cmd/exit.c @@ -10,10 +10,13 @@ static int do_exit(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) { - if (argc > 1) - return dectoul(argv[1], NULL); + int r; - return 0; + r = 0; + if (argc > 1) + r = simple_strtoul(argv[1], NULL, 10); + + return -r - 2; } U_BOOT_CMD( diff --git a/common/cli.c b/common/cli.c index a47d6a3f2b..ba45dad2db 100644 --- a/common/cli.c +++ b/common/cli.c @@ -146,7 +146,7 @@ int run_commandf(const char *fmt, ...) #if defined(CONFIG_CMD_RUN) int do_run(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) { - int i; + int i, ret; if (argc < 2) return CMD_RET_USAGE; @@ -160,8 +160,9 @@ int do_run(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) return 1; } - if (run_command(arg, flag | CMD_FLAG_ENV) != 0) - return 1; + ret = run_command(arg, flag | CMD_FLAG_ENV); + if (ret) + return ret; } return 0; } diff --git a/common/cli_hush.c b/common/cli_hush.c index a80b84756b..1ad7a509df 100644 --- a/common/cli_hush.c +++ b/common/cli_hush.c @@ -1901,7 +1901,7 @@ static int run_list_real(struct pipe *pi) last_return_code = -rcode - 2; return -2; /* exit */ } - last_return_code=(rcode == 0) ? 0 : 1; + last_return_code = rcode; #endif #ifndef __U_BOOT__ pi->num_progs = save_num_progs; /* restore number of programs */ @@ -3211,7 +3211,15 @@ static int parse_stream_outer(struct in_str *inp, int flag) printf("exit not allowed from main input shell.\n"); continue; } - break; + /* + * DANGER + * Return code -2 is special in this context, + * it indicates exit from inner pipe instead + * of return code itself, the return code is + * stored in 'last_return_code' variable! + * DANGER + */ + return -2; } if (code == -1) flag_repeat = 0; @@ -3248,9 +3256,9 @@ int parse_string_outer(const char *s, int flag) #endif /* __U_BOOT__ */ { struct in_str input; + int rcode; #ifdef __U_BOOT__ char *p = NULL; - int rcode; if (!s) return 1; if (!*s) @@ -3262,11 +3270,12 @@ int parse_string_outer(const char *s, int flag) setup_string_in_str(&input, p); rcode = parse_stream_outer(&input, flag); free(p); - return rcode; + return rcode == -2 ? last_return_code : rcode; } else { #endif setup_string_in_str(&input, s); - return parse_stream_outer(&input, flag); + rcode = parse_stream_outer(&input, flag); + return rcode == -2 ? last_return_code : rcode; #ifdef __U_BOOT__ } #endif @@ -3286,7 +3295,7 @@ int parse_file_outer(void) setup_file_in_str(&input); #endif rcode = parse_stream_outer(&input, FLAG_PARSE_SEMICOLON); - return rcode; + return rcode == -2 ? last_return_code : rcode; } #ifdef __U_BOOT__ diff --git a/doc/usage/cmd/exit.rst b/doc/usage/cmd/exit.rst index 769223c477..3edb12809c 100644 --- a/doc/usage/cmd/exit.rst +++ b/doc/usage/cmd/exit.rst @@ -37,4 +37,6 @@ executed. Return value ------------ -$? is always set to 0 (true). +$? is default set to 0 (true). In case zero or positive integer parameter +is passed to the command, the return value is the parameter value. In case +negative integer parameter is passed to the command, the return value is 0. From f08dcd9fd063af293a4551c1b195efec2ad5f7df Mon Sep 17 00:00:00 2001 From: Marek Vasut Date: Tue, 20 Dec 2022 07:26:00 +0100 Subject: [PATCH 14/24] test: cmd: exit: Add unit test for exit and partly run commands Add a test which validates that exit from environment script works as expected, including return value propagation and clipping to positive integers. Reviewed-by: Simon Glass Signed-off-by: Marek Vasut --- include/test/suites.h | 1 + test/cmd/Makefile | 2 +- test/cmd/exit.c | 135 ++++++++++++++++++++++++++++++++++++++++++ test/cmd_ut.c | 1 + 4 files changed, 138 insertions(+), 1 deletion(-) create mode 100644 test/cmd/exit.c diff --git a/include/test/suites.h b/include/test/suites.h index a01000e127..9ce49cbb03 100644 --- a/include/test/suites.h +++ b/include/test/suites.h @@ -38,6 +38,7 @@ int do_ut_compression(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]); int do_ut_dm(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]); int do_ut_env(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]); +int do_ut_exit(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]); int do_ut_fdt(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]); int do_ut_font(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]); int do_ut_lib(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]); diff --git a/test/cmd/Makefile b/test/cmd/Makefile index bc961df3dc..09e410ec30 100644 --- a/test/cmd/Makefile +++ b/test/cmd/Makefile @@ -8,7 +8,7 @@ endif ifdef CONFIG_CONSOLE_RECORD obj-$(CONFIG_CMD_PAUSE) += test_pause.o endif -obj-y += mem.o +obj-y += exit.o mem.o obj-$(CONFIG_CMD_ADDRMAP) += addrmap.o obj-$(CONFIG_CMD_FDT) += fdt.o obj-$(CONFIG_CONSOLE_TRUETYPE) += font.o diff --git a/test/cmd/exit.c b/test/cmd/exit.c new file mode 100644 index 0000000000..ca34abef89 --- /dev/null +++ b/test/cmd/exit.c @@ -0,0 +1,135 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * Tests for exit command + * + * Copyright 2022 Marek Vasut + */ + +#include +#include +#include +#include +#include +#include + +DECLARE_GLOBAL_DATA_PTR; + +/* Declare a new exit test */ +#define EXIT_TEST(_name, _flags) UNIT_TEST(_name, _flags, exit_test) + +/* Test 'exit addr' getting/setting address */ +static int cmd_exit_test(struct unit_test_state *uts) +{ + int i; + + /* + * Test 'exit' with parameter -3, -2, -1, 0, 1, 2, 3 . Use all those + * parameters to cover also the special return value -2 that is used + * in HUSH to detect exit command. + * + * Always test whether 'exit' command: + * - exits out of the 'run' command + * - return value is propagated out of the 'run' command + * - return value can be tested on outside of 'run' command + * - return value can be printed outside of 'run' command + */ + for (i = -3; i <= 3; i++) { + ut_assertok(console_record_reset_enable()); + ut_assertok(run_commandf("setenv foo 'echo bar ; exit %d ; echo baz' ; run foo ; echo $?", i)); + ut_assert_nextline("bar"); + ut_assert_nextline("%d", i > 0 ? i : 0); + ut_assertok(ut_check_console_end(uts)); + + ut_assertok(console_record_reset_enable()); + ut_assertok(run_commandf("setenv foo 'echo bar ; exit %d ; echo baz' ; run foo && echo quux ; echo $?", i)); + ut_assert_nextline("bar"); + if (i <= 0) + ut_assert_nextline("quux"); + ut_assert_nextline("%d", i > 0 ? i : 0); + ut_assertok(ut_check_console_end(uts)); + + ut_assertok(console_record_reset_enable()); + ut_assertok(run_commandf("setenv foo 'echo bar ; exit %d ; echo baz' ; run foo || echo quux ; echo $?", i)); + ut_assert_nextline("bar"); + if (i > 0) + ut_assert_nextline("quux"); + /* Either 'exit' returns 0, or 'echo quux' returns 0 */ + ut_assert_nextline("0"); + ut_assertok(ut_check_console_end(uts)); + } + + /* Validate that 'exit' behaves the same way as 'exit 0' */ + ut_assertok(console_record_reset_enable()); + ut_assertok(run_commandf("setenv foo 'echo bar ; exit ; echo baz' ; run foo ; echo $?", i)); + ut_assert_nextline("bar"); + ut_assert_nextline("0"); + ut_assertok(ut_check_console_end(uts)); + + ut_assertok(console_record_reset_enable()); + ut_assertok(run_commandf("setenv foo 'echo bar ; exit ; echo baz' ; run foo && echo quux ; echo $?", i)); + ut_assert_nextline("bar"); + ut_assert_nextline("quux"); + ut_assert_nextline("0"); + ut_assertok(ut_check_console_end(uts)); + + ut_assertok(console_record_reset_enable()); + ut_assertok(run_commandf("setenv foo 'echo bar ; exit ; echo baz' ; run foo || echo quux ; echo $?", i)); + ut_assert_nextline("bar"); + /* Either 'exit' returns 0, or 'echo quux' returns 0 */ + ut_assert_nextline("0"); + ut_assertok(ut_check_console_end(uts)); + + /* Validate that return value still propagates from 'run' command */ + ut_assertok(console_record_reset_enable()); + ut_assertok(run_commandf("setenv foo 'echo bar ; true' ; run foo ; echo $?", i)); + ut_assert_nextline("bar"); + ut_assert_nextline("0"); + ut_assertok(ut_check_console_end(uts)); + + ut_assertok(console_record_reset_enable()); + ut_assertok(run_commandf("setenv foo 'echo bar ; true' ; run foo && echo quux ; echo $?", i)); + ut_assert_nextline("bar"); + ut_assert_nextline("quux"); + ut_assert_nextline("0"); + ut_assertok(ut_check_console_end(uts)); + + ut_assertok(console_record_reset_enable()); + ut_assertok(run_commandf("setenv foo 'echo bar ; true' ; run foo || echo quux ; echo $?", i)); + ut_assert_nextline("bar"); + /* The 'true' returns 0 */ + ut_assert_nextline("0"); + ut_assertok(ut_check_console_end(uts)); + + ut_assertok(console_record_reset_enable()); + ut_assertok(run_commandf("setenv foo 'echo bar ; false' ; run foo ; echo $?", i)); + ut_assert_nextline("bar"); + ut_assert_nextline("1"); + ut_assertok(ut_check_console_end(uts)); + + ut_assertok(console_record_reset_enable()); + ut_assertok(run_commandf("setenv foo 'echo bar ; false' ; run foo && echo quux ; echo $?", i)); + ut_assert_nextline("bar"); + ut_assert_nextline("1"); + ut_assertok(ut_check_console_end(uts)); + + ut_assertok(console_record_reset_enable()); + ut_assertok(run_commandf("setenv foo 'echo bar ; false' ; run foo || echo quux ; echo $?", i)); + ut_assert_nextline("bar"); + ut_assert_nextline("quux"); + /* The 'echo quux' returns 0 */ + ut_assert_nextline("0"); + ut_assertok(ut_check_console_end(uts)); + + return 0; +} + +EXIT_TEST(cmd_exit_test, UT_TESTF_CONSOLE_REC); + +int do_ut_exit(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) +{ + struct unit_test *tests = UNIT_TEST_SUITE_START(exit_test); + const int n_ents = UNIT_TEST_SUITE_COUNT(exit_test); + + return cmd_ut_category("cmd_exit", "exit_test_", tests, n_ents, + argc, argv); +} diff --git a/test/cmd_ut.c b/test/cmd_ut.c index 2736582f11..067bd0828a 100644 --- a/test/cmd_ut.c +++ b/test/cmd_ut.c @@ -65,6 +65,7 @@ static struct cmd_tbl cmd_ut_sub[] = { #if defined(CONFIG_UT_ENV) U_BOOT_CMD_MKENT(env, CONFIG_SYS_MAXARGS, 1, do_ut_env, "", ""), #endif + U_BOOT_CMD_MKENT(exit, CONFIG_SYS_MAXARGS, 1, do_ut_exit, "", ""), #ifdef CONFIG_CMD_FDT U_BOOT_CMD_MKENT(fdt, CONFIG_SYS_MAXARGS, 1, do_ut_fdt, "", ""), #endif From bf48dde80a6c302b3279fe8ed1e5eb9e8fef4abd Mon Sep 17 00:00:00 2001 From: David Oberhollenzer Date: Sun, 25 Dec 2022 11:05:24 +0100 Subject: [PATCH 15/24] fs/squashfs: Only use export table if available For a squashfs filesystem, the fragment table is followed by the following tables: NFS export table, ID table, xattr table. The export and xattr tables are both completely optional, but the ID table is mandatory. The Linux implementation refuses to mount the image if the ID table is missing. Tables that are no present have their location in the super block set to 0xFFFFFFFFFFFFFFFF. The u-boot implementation previously assumed that it can always rely on the export table location as an upper bound for the fragment table, trying (and failing) to read past filesystem bounds if it is not present. This patch changes the driver to use the ID table instead and only use the export table location if it lies between the two. Signed-off-by: David Oberhollenzer Reviewed-by: Miquel Raynal --- fs/squashfs/sqfs.c | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/fs/squashfs/sqfs.c b/fs/squashfs/sqfs.c index 4226621923..1430e671a5 100644 --- a/fs/squashfs/sqfs.c +++ b/fs/squashfs/sqfs.c @@ -100,7 +100,7 @@ static int sqfs_calc_n_blks(__le64 start, __le64 end, u64 *offset) static int sqfs_frag_lookup(u32 inode_fragment_index, struct squashfs_fragment_block_entry *e) { - u64 start, n_blks, src_len, table_offset, start_block; + u64 start, end, exp_tbl, n_blks, src_len, table_offset, start_block; unsigned char *metadata_buffer, *metadata, *table; struct squashfs_fragment_block_entry *entries; struct squashfs_super_block *sblk = ctxt.sblk; @@ -115,11 +115,17 @@ static int sqfs_frag_lookup(u32 inode_fragment_index, if (inode_fragment_index >= get_unaligned_le32(&sblk->fragments)) return -EINVAL; - start = get_unaligned_le64(&sblk->fragment_table_start) / - ctxt.cur_dev->blksz; + start = get_unaligned_le64(&sblk->fragment_table_start); + end = get_unaligned_le64(&sblk->id_table_start); + exp_tbl = get_unaligned_le64(&sblk->export_table_start); + + if (exp_tbl > start && exp_tbl < end) + end = exp_tbl; + n_blks = sqfs_calc_n_blks(sblk->fragment_table_start, - sblk->export_table_start, - &table_offset); + cpu_to_le64(end), &table_offset); + + start /= ctxt.cur_dev->blksz; /* Allocate a proper sized buffer to store the fragment index table */ table = malloc_cache_aligned(n_blks * ctxt.cur_dev->blksz); From 43b059884ae1c52a197529b3ac81046d582fb60f Mon Sep 17 00:00:00 2001 From: Brandon Maier Date: Wed, 28 Dec 2022 16:53:51 -0600 Subject: [PATCH 16/24] test: compression: check with trailing garbage in input The Linux kernel appends 4 bytes to the end of compressed kernel Images containing the uncompressed image size. They are used to make self-decompressing Images easier. However for archs that don't support self-decompression, like ARM64, U-Boot must be able to decompress the image with the garbage data. The existing decompressors already support this. This unit test was added while working on zstd support as upstream zstd will error if there is garbage data in the input buffer, and special care was needed to support this. Signed-off-by: Brandon Maier Reviewed-by: Simon Glass --- test/compression.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/test/compression.c b/test/compression.c index 82e29c9b86..6c2a43fbed 100644 --- a/test/compression.c +++ b/test/compression.c @@ -350,6 +350,15 @@ static int run_test_internal(struct unit_test_state *uts, char *name, buf->orig_size) == 0); errcheck(((char *)buf->uncompressed_buf)[buf->orig_size] == 'A'); + /* Uncompresses with trailing garbage in input buffer. */ + memset(buf->uncompressed_buf, 'A', TEST_BUFFER_SIZE); + errcheck(uncompress(uts, buf->compressed_buf, buf->compressed_size + 4, + buf->uncompressed_buf, buf->uncompressed_size, + &buf->uncompressed_size) == 0); + errcheck(buf->uncompressed_size == buf->orig_size); + errcheck(memcmp(buf->orig_buf, buf->uncompressed_buf, + buf->orig_size) == 0); + /* Make sure compression does not over-run. */ memset(buf->compare_buf, 'A', TEST_BUFFER_SIZE); ret = compress(uts, buf->orig_buf, buf->orig_size, From bde4c49c17ec46063ca19d3e6ae921430f7c5cc0 Mon Sep 17 00:00:00 2001 From: Brandon Maier Date: Wed, 28 Dec 2022 16:53:52 -0600 Subject: [PATCH 17/24] test: compression: use ut_assert for errors Use the ut_assert macros for more useful error messages. Signed-off-by: Brandon Maier Reviewed-by: Simon Glass --- test/compression.c | 56 +++++++++++++++++++++------------------------- 1 file changed, 25 insertions(+), 31 deletions(-) diff --git a/test/compression.c b/test/compression.c index 6c2a43fbed..ba98d21802 100644 --- a/test/compression.c +++ b/test/compression.c @@ -321,51 +321,48 @@ static int run_test_internal(struct unit_test_state *uts, char *name, /* Compress works as expected. */ printf("\torig_size:%lu\n", buf->orig_size); memset(buf->compressed_buf, 'A', TEST_BUFFER_SIZE); - errcheck(compress(uts, buf->orig_buf, buf->orig_size, + ut_assertok(compress(uts, buf->orig_buf, buf->orig_size, buf->compressed_buf, buf->compressed_size, - &buf->compressed_size) == 0); + &buf->compressed_size)); printf("\tcompressed_size:%lu\n", buf->compressed_size); - errcheck(buf->compressed_size > 0); - errcheck(buf->compressed_size < buf->orig_size); - errcheck(((char *)buf->compressed_buf)[buf->compressed_size - 1] != - 'A'); - errcheck(((char *)buf->compressed_buf)[buf->compressed_size] == 'A'); + ut_assert(buf->compressed_size > 0); + ut_assert(buf->compressed_size < buf->orig_size); + ut_assert(((char *)buf->compressed_buf)[buf->compressed_size - 1] + != 'A'); + ut_asserteq(((char *)buf->compressed_buf)[buf->compressed_size], 'A'); /* Uncompresses with space remaining. */ - errcheck(uncompress(uts, buf->compressed_buf, buf->compressed_size, + ut_assertok(uncompress(uts, buf->compressed_buf, buf->compressed_size, buf->uncompressed_buf, buf->uncompressed_size, - &buf->uncompressed_size) == 0); + &buf->uncompressed_size)); printf("\tuncompressed_size:%lu\n", buf->uncompressed_size); - errcheck(buf->uncompressed_size == buf->orig_size); - errcheck(memcmp(buf->orig_buf, buf->uncompressed_buf, - buf->orig_size) == 0); + ut_asserteq(buf->uncompressed_size, buf->orig_size); + ut_asserteq_mem(buf->orig_buf, buf->uncompressed_buf, buf->orig_size); /* Uncompresses with exactly the right size output buffer. */ memset(buf->uncompressed_buf, 'A', TEST_BUFFER_SIZE); - errcheck(uncompress(uts, buf->compressed_buf, buf->compressed_size, + ut_assertok(uncompress(uts, buf->compressed_buf, buf->compressed_size, buf->uncompressed_buf, buf->orig_size, - &buf->uncompressed_size) == 0); - errcheck(buf->uncompressed_size == buf->orig_size); - errcheck(memcmp(buf->orig_buf, buf->uncompressed_buf, - buf->orig_size) == 0); - errcheck(((char *)buf->uncompressed_buf)[buf->orig_size] == 'A'); + &buf->uncompressed_size)); + ut_asserteq(buf->uncompressed_size, buf->orig_size); + ut_asserteq_mem(buf->orig_buf, buf->uncompressed_buf, buf->orig_size); + ut_asserteq(((char *)buf->uncompressed_buf)[buf->orig_size], 'A'); /* Uncompresses with trailing garbage in input buffer. */ memset(buf->uncompressed_buf, 'A', TEST_BUFFER_SIZE); - errcheck(uncompress(uts, buf->compressed_buf, buf->compressed_size + 4, + ut_assertok(uncompress(uts, buf->compressed_buf, buf->compressed_size + 4, buf->uncompressed_buf, buf->uncompressed_size, - &buf->uncompressed_size) == 0); - errcheck(buf->uncompressed_size == buf->orig_size); - errcheck(memcmp(buf->orig_buf, buf->uncompressed_buf, - buf->orig_size) == 0); + &buf->uncompressed_size)); + ut_asserteq(buf->uncompressed_size, buf->orig_size); + ut_asserteq_mem(buf->orig_buf, buf->uncompressed_buf, buf->orig_size); /* Make sure compression does not over-run. */ memset(buf->compare_buf, 'A', TEST_BUFFER_SIZE); ret = compress(uts, buf->orig_buf, buf->orig_size, buf->compare_buf, buf->compressed_size - 1, NULL); - errcheck(((char *)buf->compare_buf)[buf->compressed_size] == 'A'); - errcheck(ret != 0); + ut_asserteq(((char *)buf->compare_buf)[buf->compressed_size], 'A'); + ut_assert(ret != 0); printf("\tcompress does not overrun\n"); /* Make sure decompression does not over-run. */ @@ -373,15 +370,12 @@ static int run_test_internal(struct unit_test_state *uts, char *name, ret = uncompress(uts, buf->compressed_buf, buf->compressed_size, buf->compare_buf, buf->uncompressed_size - 1, NULL); - errcheck(((char *)buf->compare_buf)[buf->uncompressed_size - 1] == 'A'); - errcheck(ret != 0); + ut_asserteq(((char *)buf->compare_buf)[buf->uncompressed_size - 1], 'A'); + ut_assert(ret != 0); printf("\tuncompress does not overrun\n"); /* Got here, everything is fine. */ - ret = 0; - -out: - return ret; + return 0; } static int run_test(struct unit_test_state *uts, char *name, From 3133651aa4c2b2ea6818b7fab5ad22ea33121896 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pali=20Roh=C3=A1r?= Date: Thu, 29 Dec 2022 18:15:35 +0100 Subject: [PATCH 18/24] ata: Fix dependency for CONFIG_SATA_SIL MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit sata_sil.c is PCI driver and without CONFIG_PCI is building of U-Boot failing: LD u-boot ld.bfd: drivers/ata/sata_sil.o: in function `sil_exec_cmd': drivers/ata/sata_sil.c:148: undefined reference to `dm_pci_phys_to_bus' ld.bfd: drivers/ata/sata_sil.o: in function `sil_pci_probe': drivers/ata/sata_sil.c:687: undefined reference to `dm_pci_get_bdf' ld.bfd: drivers/ata/sata_sil.c:691: undefined reference to `dm_pci_read_config16' ld.bfd: drivers/ata/sata_sil.c:701: undefined reference to `dm_pci_map_bar' ld.bfd: drivers/ata/sata_sil.c:704: undefined reference to `dm_pci_map_bar' ld.bfd: drivers/ata/sata_sil.c:713: undefined reference to `dm_pci_write_config16' ld.bfd: drivers/ata/sata_sil.c:717: undefined reference to `dm_pci_read_config16' ld.bfd: drivers/ata/sata_sil.o: in function `sil_cmd_identify_device': drivers/ata/sata_sil.c:256: undefined reference to `dm_pci_phys_to_bus' ld.bfd: drivers/ata/sata_sil.o: in function `sil_sata_rw_cmd': drivers/ata/sata_sil.c:330: undefined reference to `dm_pci_phys_to_bus' ld.bfd: drivers/ata/sata_sil.o: in function `sil_sata_rw_cmd_ext': drivers/ata/sata_sil.c:377: undefined reference to `dm_pci_phys_to_bus' make: *** [Makefile:1778: u-boot] Error 1 Signed-off-by: Pali Rohár Reviewed-by: Simon Glass Reviewed-by: Stefan Roese --- drivers/ata/Kconfig | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/ata/Kconfig b/drivers/ata/Kconfig index a063b221cd..3fe53d6d4f 100644 --- a/drivers/ata/Kconfig +++ b/drivers/ata/Kconfig @@ -135,6 +135,7 @@ config SATA_MV config SATA_SIL bool "Enable Silicon Image SIL3131 / SIL3132 / SIL3124 SATA driver support" + depends on PCI select AHCI select LIBATA help From 11d567012558fab7da9d1189948cb6005c081ccd Mon Sep 17 00:00:00 2001 From: Qu Wenruo Date: Fri, 30 Dec 2022 09:07:05 +0800 Subject: [PATCH 19/24] fs/btrfs: handle data extents, which crosss stripe boundaries, correctly [BUG] Since btrfs supports single device RAID0 at mkfs time after btrfs-progs v5.14, if we create a single device raid0 btrfs, and created a file crossing stripe boundary: # mkfs.btrfs -m dup -d raid0 test.img # mount test.img mnt # xfs_io -f -c "pwrite 0 128K" mnt/file # umount mnt Since btrfs is using 64K as stripe length, above 128K data write is definitely going to cross at least one stripe boundary. Then u-boot would fail to read above 128K file: => host bind 0 /home/adam/test.img => ls host 0 < > 131072 Fri Dec 30 00:18:25 2022 file => load host 0 0 file BTRFS: An error occurred while reading file file Failed to load 'file' [CAUSE] Unlike tree blocks read, data extent reads doesn't consider cases in which one data extent can cross stripe boundary. In read_data_extent(), we just call btrfs_map_block() once and read the first mapped range. And if the first mapped range is smaller than the desired range, it would return error. But since even single device btrfs can utilize RAID0 profiles, the first mapped range can only be at most 64K for RAID0 profiles, and cause false error. [FIX] Just like read_whole_eb(), we should call btrfs_map_block() in a loop until we read all data. Since we're here, also add extra error messages for the following cases: - btrfs_map_block() failure We already have the error message for it. - Missing device This should not happen, as we only support single device for now. - __btrfs_devread() failure With this bug fixed, btrfs driver of u-boot can properly read the above 128K file, and have the correct content: => host bind 0 /home/adam/test.img => ls host 0 < > 131072 Fri Dec 30 00:18:25 2022 file => load host 0 0 file 131072 bytes read in 0 ms => md5sum 0 0x20000 md5 for 00000000 ... 0001ffff ==> d48858312a922db7eb86377f638dbc9f ^^^ Above md5sum also matches. Reported-by: Sam Winchenbach Signed-off-by: Qu Wenruo --- fs/btrfs/disk-io.c | 49 +++++++++++++++++++++++++--------------------- 1 file changed, 27 insertions(+), 22 deletions(-) diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index 3f0d9f1c11..7eaa7e9496 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c @@ -541,34 +541,39 @@ struct extent_buffer* read_tree_block(struct btrfs_fs_info *fs_info, u64 bytenr, int read_extent_data(struct btrfs_fs_info *fs_info, char *data, u64 logical, u64 *len, int mirror) { - u64 offset = 0; + u64 orig_len = *len; + u64 cur = logical; struct btrfs_multi_bio *multi = NULL; struct btrfs_device *device; int ret = 0; - u64 max_len = *len; - ret = btrfs_map_block(fs_info, READ, logical, len, &multi, mirror, - NULL); - if (ret) { - fprintf(stderr, "Couldn't map the block %llu\n", - logical + offset); - goto err; - } - device = multi->stripes[0].dev; + while (cur < logical + orig_len) { + u64 cur_len = logical + orig_len - cur; - if (*len > max_len) - *len = max_len; - if (!device->desc || !device->part) { - ret = -EIO; - goto err; - } - - ret = __btrfs_devread(device->desc, device->part, data, *len, - multi->stripes[0].physical); - if (ret != *len) - ret = -EIO; - else + ret = btrfs_map_block(fs_info, READ, cur, &cur_len, &multi, + mirror, NULL); + if (ret) { + error("Couldn't map the block %llu", cur); + goto err; + } + device = multi->stripes[0].dev; + if (!device->desc || !device->part) { + error("devid %llu is missing", device->devid); + ret = -EIO; + goto err; + } + ret = __btrfs_devread(device->desc, device->part, + data + (cur - logical), cur_len, + multi->stripes[0].physical); + if (ret != cur_len) { + error("read failed on devid %llu physical %llu", + device->devid, multi->stripes[0].physical); + ret = -EIO; + goto err; + } + cur += cur_len; ret = 0; + } err: kfree(multi); return ret; From 5f7a507eb352de7b58124907a715d8bad3627051 Mon Sep 17 00:00:00 2001 From: Heinrich Schuchardt Date: Fri, 30 Dec 2022 05:41:01 +0100 Subject: [PATCH 20/24] Dockerfile: add package texinfo In preparation of adding the infodocs target to our CI install the prerequisite texinfo software package. Signed-off-by: Heinrich Schuchardt --- tools/docker/Dockerfile | 1 + 1 file changed, 1 insertion(+) diff --git a/tools/docker/Dockerfile b/tools/docker/Dockerfile index 2408788b2f..c92eeb51fd 100644 --- a/tools/docker/Dockerfile +++ b/tools/docker/Dockerfile @@ -109,6 +109,7 @@ RUN apt-get update && apt-get install -y \ srecord \ sudo \ swig \ + texinfo \ util-linux \ uuid-dev \ virtualenv \ From c394e8d0ee6f2ec9e74be0caee73e89100f3dcba Mon Sep 17 00:00:00 2001 From: Heinrich Schuchardt Date: Fri, 30 Dec 2022 19:41:28 +0100 Subject: [PATCH 21/24] Kconfig: clean up skipping low-level initialization Put all entries for skipping low-level initialization into a sub-menu. Use different titles for main U-Boot, SPL, TPL. Signed-off-by: Heinrich Schuchardt Reviewed-by: Simon Glass Reviewed-by: Tom Rini --- arch/Kconfig | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/arch/Kconfig b/arch/Kconfig index 5f2b72f535..8fb87b7d85 100644 --- a/arch/Kconfig +++ b/arch/Kconfig @@ -384,9 +384,11 @@ config MONITOR_IS_IN_RAM bool "U-Boot is loaded in to RAM by a pre-loader" depends on M68K || NIOS2 -config SKIP_LOWLEVEL_INIT - bool "Skip the calls to certain low level initialization functions" +menu "Skipping low level initialization functions" depends on ARM || MIPS || RISCV + +config SKIP_LOWLEVEL_INIT + bool "Skip calls to certain low level initialization functions" help If enabled, then certain low level initializations (like setting up the memory controller) are omitted and/or U-Boot does not relocate @@ -396,8 +398,8 @@ config SKIP_LOWLEVEL_INIT debugger which performs these initializations itself. config SPL_SKIP_LOWLEVEL_INIT - bool "Skip the calls to certain low level initialization functions" - depends on SPL && (ARM || MIPS || RISCV) + bool "Skip calls to certain low level initialization functions in SPL" + depends on SPL help If enabled, then certain low level initializations (like setting up the memory controller) are omitted and/or U-Boot does not relocate @@ -407,7 +409,7 @@ config SPL_SKIP_LOWLEVEL_INIT debugger which performs these initializations itself. config TPL_SKIP_LOWLEVEL_INIT - bool "Skip the calls to certain low level initialization functions" + bool "Skip calls to certain low level initialization functions in TPL" depends on SPL && ARM help If enabled, then certain low level initializations (like setting up @@ -418,7 +420,7 @@ config TPL_SKIP_LOWLEVEL_INIT debugger which performs these initializations itself. config SKIP_LOWLEVEL_INIT_ONLY - bool "Skip the call to lowlevel_init during early boot ONLY" + bool "Skip call to lowlevel_init during early boot ONLY" depends on ARM help This allows just the call to lowlevel_init() to be skipped. The @@ -426,7 +428,7 @@ config SKIP_LOWLEVEL_INIT_ONLY performed. config SPL_SKIP_LOWLEVEL_INIT_ONLY - bool "Skip the call to lowlevel_init during early boot ONLY" + bool "Skip call to lowlevel_init during early SPL boot ONLY" depends on SPL && ARM help This allows just the call to lowlevel_init() to be skipped. The @@ -434,13 +436,15 @@ config SPL_SKIP_LOWLEVEL_INIT_ONLY performed. config TPL_SKIP_LOWLEVEL_INIT_ONLY - bool "Skip the call to lowlevel_init during early boot ONLY" + bool "Skip call to lowlevel_init during early TPL boot ONLY" depends on TPL && ARM help This allows just the call to lowlevel_init() to be skipped. The normal CP15 init (such as enabling the instruction cache) is still performed. +endmenu + config SYS_HAS_NONCACHED_MEMORY bool "Enable reserving a non-cached memory area for drivers" depends on (ARM || MIPS) && (RTL8169 || MEDIATEK_ETH) From 89d47b33b54715a220cdf64b3faf3a56dc6c7af7 Mon Sep 17 00:00:00 2001 From: Heinrich Schuchardt Date: Sat, 31 Dec 2022 00:08:47 +0100 Subject: [PATCH 22/24] Kconfig: move NXP specific stuff into a sub-menu Having NXP specific items in the main menu is confusing. Especially the comment line *** Other functionality shared between NXP SoCs *** is simply misleading. Move all NXP stuff into a separate sub-menu. Signed-off-by: Heinrich Schuchardt --- arch/Kconfig.nxp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/arch/Kconfig.nxp b/arch/Kconfig.nxp index ad61dabb31..f492b04e95 100644 --- a/arch/Kconfig.nxp +++ b/arch/Kconfig.nxp @@ -1,3 +1,5 @@ +menu "Functionality shared between NXP SoCs" + config FSL_TRUST_ARCH_v1 bool @@ -142,8 +144,6 @@ config KEY_REVOCATION endmenu -comment "Other functionality shared between NXP SoCs" - config DEEP_SLEEP bool "Enable SoC deep sleep feature" depends on ARCH_T1024 || ARCH_T1040 || ARCH_T1042 || ARCH_LS1021A @@ -271,3 +271,5 @@ config HAS_FSL_DR_USB config SYS_DPAA_FMAN bool + +endmenu From fe482b886d7ffd65cb06ec4b4b017440460e42c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ville=20Skytt=C3=A4?= Date: Sun, 1 Jan 2023 18:41:42 +0200 Subject: [PATCH 23/24] Use `grep -E` or plain `grep` instead of `egrep` `egrep` has been deprecated in GNU grep since 2007, and since 3.8 it emits obsolescence warnings: https://git.savannah.gnu.org/cgit/grep.git/commit/?id=a9515624709865d480e3142fd959bccd1c9372d1 Acked-by: Dhruva Gole --- arch/arm/mach-socfpga/qts-filter-a10.sh | 16 ++++++++-------- arch/arm/mach-socfpga/qts-filter.sh | 2 +- doc/board/intel/edison.rst | 2 +- scripts/coccicheck | 2 +- test/fs/fs-test.sh | 10 +++++----- 5 files changed, 16 insertions(+), 16 deletions(-) diff --git a/arch/arm/mach-socfpga/qts-filter-a10.sh b/arch/arm/mach-socfpga/qts-filter-a10.sh index 57d77e8e12..ab16522add 100755 --- a/arch/arm/mach-socfpga/qts-filter-a10.sh +++ b/arch/arm/mach-socfpga/qts-filter-a10.sh @@ -10,7 +10,7 @@ fix_newlines_in_macros() { #filter out only what we need from a10 hps.xml grep_a10_hps_config() { - egrep "clk_hz|i_clk_mgr|i_io48_pin_mux|AXI_SLAVE|AXI_MASTER" + grep -E "clk_hz|i_clk_mgr|i_io48_pin_mux|AXI_SLAVE|AXI_MASTER" } # @@ -35,35 +35,35 @@ EOF echo "/* Clocks */" fix_newlines_in_macros \ - ${hps_xml} | egrep "clk_hz" | + ${hps_xml} | grep "clk_hz" | awk -F"'" '{ gsub("\\.","_",$2) ; \ print "#define" " " toupper($2) " " $4}' | sed 's/\.[0-9]//' | sed 's/I_CLK_MGR_//' | sort fix_newlines_in_macros \ - ${hps_xml} | egrep "i_clk_mgr_mainpll" | + ${hps_xml} | grep "i_clk_mgr_mainpll" | awk -F"'" '{ gsub("\\.","_",$2) ; \ print "#define" " " toupper($2) " " $4}' | sed 's/\.[0-9]//' | sed 's/I_CLK_MGR_//' | sort fix_newlines_in_macros \ - ${hps_xml} | egrep "i_clk_mgr_perpll" | + ${hps_xml} | grep "i_clk_mgr_perpll" | awk -F"'" '{ gsub("\\.","_",$2) ; \ print "#define" " " toupper($2) " " $4}' | sed 's/\.[0-9]//' | sed 's/I_CLK_MGR_//' | sort fix_newlines_in_macros \ - ${hps_xml} | egrep "i_clk_mgr_clkmgr" | + ${hps_xml} | grep "i_clk_mgr_clkmgr" | awk -F"'" '{ gsub("\\.","_",$2) ; \ print "#define" " " toupper($2) " " $4}' | sed 's/\.[0-9]//' | sed 's/I_CLK_MGR_//' | sort fix_newlines_in_macros \ - ${hps_xml} | egrep "i_clk_mgr_alteragrp" | + ${hps_xml} | grep "i_clk_mgr_alteragrp" | awk -F"'" '{ gsub("\\.","_",$2) ; \ print "#define" " " toupper($2) " " $4}' | sed 's/\.[0-9]//' | @@ -77,7 +77,7 @@ EOF echo echo "/* Pin Mux Configuration */" fix_newlines_in_macros \ - ${hps_xml} | egrep "i_io48_pin_mux" | + ${hps_xml} | grep "i_io48_pin_mux" | awk -F"'" '{ gsub("\\.","_",$2) ; \ print "#define" " " toupper($2) " " $4}' | sed 's/I_IO48_PIN_MUX_//' | @@ -90,7 +90,7 @@ EOF echo echo "/* Bridge Configuration */" fix_newlines_in_macros \ - ${hps_xml} | egrep "AXI_SLAVE|AXI_MASTER" | + ${hps_xml} | grep -E "AXI_SLAVE|AXI_MASTER" | awk -F"'" '{ gsub("\\.","_",$2) ; \ print "#define" " " toupper($2) " " $4}' | sed 's/true/1/' | diff --git a/arch/arm/mach-socfpga/qts-filter.sh b/arch/arm/mach-socfpga/qts-filter.sh index 6416252d4e..1610c89a48 100755 --- a/arch/arm/mach-socfpga/qts-filter.sh +++ b/arch/arm/mach-socfpga/qts-filter.sh @@ -128,7 +128,7 @@ EOF # Filter out only the macros which are actually used by the code # grep_sdram_config() { - egrep "#define (CFG_HPS_SDR_CTRLCFG_CTRLCFG_MEMTYPE|CFG_HPS_SDR_CTRLCFG_CTRLCFG_MEMBL|CFG_HPS_SDR_CTRLCFG_CTRLCFG_ADDRORDER|CFG_HPS_SDR_CTRLCFG_CTRLCFG_ECCEN|CFG_HPS_SDR_CTRLCFG_CTRLCFG_ECCCORREN|CFG_HPS_SDR_CTRLCFG_CTRLCFG_REORDEREN|CFG_HPS_SDR_CTRLCFG_CTRLCFG_STARVELIMIT|CFG_HPS_SDR_CTRLCFG_CTRLCFG_DQSTRKEN|CFG_HPS_SDR_CTRLCFG_CTRLCFG_NODMPINS|CFG_HPS_SDR_CTRLCFG_DRAMTIMING1_TCWL|CFG_HPS_SDR_CTRLCFG_DRAMTIMING1_AL|CFG_HPS_SDR_CTRLCFG_DRAMTIMING1_TCL|CFG_HPS_SDR_CTRLCFG_DRAMTIMING1_TRRD|CFG_HPS_SDR_CTRLCFG_DRAMTIMING1_TFAW|CFG_HPS_SDR_CTRLCFG_DRAMTIMING1_TRFC|CFG_HPS_SDR_CTRLCFG_DRAMTIMING2_IF_TREFI|CFG_HPS_SDR_CTRLCFG_DRAMTIMING2_IF_TRCD|CFG_HPS_SDR_CTRLCFG_DRAMTIMING2_IF_TRP|CFG_HPS_SDR_CTRLCFG_DRAMTIMING2_IF_TWR|CFG_HPS_SDR_CTRLCFG_DRAMTIMING2_IF_TWTR|CFG_HPS_SDR_CTRLCFG_DRAMTIMING3_TRTP|CFG_HPS_SDR_CTRLCFG_DRAMTIMING3_TRAS|CFG_HPS_SDR_CTRLCFG_DRAMTIMING3_TRC|CFG_HPS_SDR_CTRLCFG_DRAMTIMING3_TMRD|CFG_HPS_SDR_CTRLCFG_DRAMTIMING3_TCCD|CFG_HPS_SDR_CTRLCFG_DRAMTIMING4_SELFRFSHEXIT|CFG_HPS_SDR_CTRLCFG_DRAMTIMING4_PWRDOWNEXIT|CFG_HPS_SDR_CTRLCFG_LOWPWRTIMING_AUTOPDCYCLES|CFG_HPS_SDR_CTRLCFG_LOWPWRTIMING_CLKDISABLECYCLES|CFG_HPS_SDR_CTRLCFG_DRAMODT_READ|CFG_HPS_SDR_CTRLCFG_DRAMODT_WRITE|CFG_HPS_SDR_CTRLCFG_DRAMADDRW_COLBITS|CFG_HPS_SDR_CTRLCFG_DRAMADDRW_ROWBITS|CFG_HPS_SDR_CTRLCFG_DRAMADDRW_BANKBITS|CFG_HPS_SDR_CTRLCFG_DRAMADDRW_CSBITS|CFG_HPS_SDR_CTRLCFG_DRAMIFWIDTH_IFWIDTH|CFG_HPS_SDR_CTRLCFG_DRAMDEVWIDTH_DEVWIDTH|CFG_HPS_SDR_CTRLCFG_DRAMINTR_INTREN|CFG_HPS_SDR_CTRLCFG_LOWPWREQ_SELFRFSHMASK|CFG_HPS_SDR_CTRLCFG_STATICCFG_MEMBL|CFG_HPS_SDR_CTRLCFG_STATICCFG_USEECCASDATA|CFG_HPS_SDR_CTRLCFG_CTRLWIDTH_CTRLWIDTH|CFG_HPS_SDR_CTRLCFG_CPORTWIDTH_CPORTWIDTH|CFG_HPS_SDR_CTRLCFG_CPORTWMAP_CPORTWMAP|CFG_HPS_SDR_CTRLCFG_CPORTRMAP_CPORTRMAP|CFG_HPS_SDR_CTRLCFG_RFIFOCMAP_RFIFOCMAP|CFG_HPS_SDR_CTRLCFG_WFIFOCMAP_WFIFOCMAP|CFG_HPS_SDR_CTRLCFG_CPORTRDWR_CPORTRDWR|CFG_HPS_SDR_CTRLCFG_PORTCFG_AUTOPCHEN|CFG_HPS_SDR_CTRLCFG_FPGAPORTRST|CFG_HPS_SDR_CTRLCFG_FIFOCFG_SYNCMODE|CFG_HPS_SDR_CTRLCFG_FIFOCFG_INCSYNC|CFG_HPS_SDR_CTRLCFG_MPPRIORITY_USERPRIORITY|CFG_HPS_SDR_CTRLCFG_MPWIEIGHT_0_STATICWEIGHT_31_0|CFG_HPS_SDR_CTRLCFG_MPWIEIGHT_1_STATICWEIGHT_49_32|CFG_HPS_SDR_CTRLCFG_MPWIEIGHT_1_SUMOFWEIGHT_13_0|CFG_HPS_SDR_CTRLCFG_MPWIEIGHT_2_SUMOFWEIGHT_45_14|CFG_HPS_SDR_CTRLCFG_MPWIEIGHT_3_SUMOFWEIGHT_63_46|CFG_HPS_SDR_CTRLCFG_PHYCTRL_PHYCTRL_0|CFG_HPS_SDR_CTRLCFG_MPPACING_0_THRESHOLD1_31_0|CFG_HPS_SDR_CTRLCFG_MPPACING_1_THRESHOLD1_59_32|CFG_HPS_SDR_CTRLCFG_MPPACING_1_THRESHOLD2_3_0|CFG_HPS_SDR_CTRLCFG_MPPACING_2_THRESHOLD2_35_4|CFG_HPS_SDR_CTRLCFG_MPPACING_3_THRESHOLD2_59_36|CFG_HPS_SDR_CTRLCFG_MPTHRESHOLDRST_0_THRESHOLDRSTCYCLES_31_0|CFG_HPS_SDR_CTRLCFG_MPTHRESHOLDRST_1_THRESHOLDRSTCYCLES_63_32|CFG_HPS_SDR_CTRLCFG_MPTHRESHOLDRST_2_THRESHOLDRSTCYCLES_79_64|RW_MGR_ACTIVATE_0_AND_1|RW_MGR_ACTIVATE_0_AND_1_WAIT1|RW_MGR_ACTIVATE_0_AND_1_WAIT2|RW_MGR_ACTIVATE_1|RW_MGR_CLEAR_DQS_ENABLE|RW_MGR_EMR_OCD_ENABLE|RW_MGR_EMR|RW_MGR_EMR2|RW_MGR_EMR3|RW_MGR_GUARANTEED_READ|RW_MGR_GUARANTEED_READ_CONT|RW_MGR_GUARANTEED_WRITE|RW_MGR_GUARANTEED_WRITE_WAIT0|RW_MGR_GUARANTEED_WRITE_WAIT1|RW_MGR_GUARANTEED_WRITE_WAIT2|RW_MGR_GUARANTEED_WRITE_WAIT3|RW_MGR_IDLE|RW_MGR_IDLE_LOOP1|RW_MGR_IDLE_LOOP2|RW_MGR_INIT_RESET_0_CKE_0|RW_MGR_INIT_RESET_1_CKE_0|RW_MGR_INIT_CKE_0|RW_MGR_LFSR_WR_RD_BANK_0|RW_MGR_LFSR_WR_RD_BANK_0_DATA|RW_MGR_LFSR_WR_RD_BANK_0_DQS|RW_MGR_LFSR_WR_RD_BANK_0_NOP|RW_MGR_LFSR_WR_RD_BANK_0_WAIT|RW_MGR_LFSR_WR_RD_BANK_0_WL_1|RW_MGR_LFSR_WR_RD_DM_BANK_0|RW_MGR_LFSR_WR_RD_DM_BANK_0_DATA|RW_MGR_LFSR_WR_RD_DM_BANK_0_DQS|RW_MGR_LFSR_WR_RD_DM_BANK_0_NOP|RW_MGR_LFSR_WR_RD_DM_BANK_0_WAIT|RW_MGR_LFSR_WR_RD_DM_BANK_0_WL_1|RW_MGR_MR_CALIB|RW_MGR_MR_USER|RW_MGR_MR_DLL_RESET|RW_MGR_MRS0_DLL_RESET|RW_MGR_MRS0_DLL_RESET_MIRR|RW_MGR_MRS0_USER|RW_MGR_MRS0_USER_MIRR|RW_MGR_MRS1|RW_MGR_MRS1_MIRR|RW_MGR_MRS2|RW_MGR_MRS2_MIRR|RW_MGR_MRS3|RW_MGR_MRS3_MIRR|RW_MGR_NOP|RW_MGR_PRECHARGE_ALL|RW_MGR_READ_B2B|RW_MGR_READ_B2B_WAIT1|RW_MGR_READ_B2B_WAIT2|RW_MGR_REFRESH|RW_MGR_REFRESH_ALL|RW_MGR_RETURN|RW_MGR_SGLE_READ|RW_MGR_ZQCL|RW_MGR_TRUE_MEM_DATA_MASK_WIDTH|RW_MGR_MEM_ADDRESS_MIRRORING|RW_MGR_MEM_DATA_MASK_WIDTH|RW_MGR_MEM_DATA_WIDTH|RW_MGR_MEM_DQ_PER_READ_DQS|RW_MGR_MEM_DQ_PER_WRITE_DQS|RW_MGR_MEM_IF_READ_DQS_WIDTH|RW_MGR_MEM_IF_WRITE_DQS_WIDTH|RW_MGR_MEM_NUMBER_OF_CS_PER_DIMM|RW_MGR_MEM_NUMBER_OF_RANKS|RW_MGR_MEM_VIRTUAL_GROUPS_PER_READ_DQS|RW_MGR_MEM_VIRTUAL_GROUPS_PER_WRITE_DQS|IO_DELAY_PER_DCHAIN_TAP|IO_DELAY_PER_DQS_EN_DCHAIN_TAP|IO_DELAY_PER_OPA_TAP|IO_DLL_CHAIN_LENGTH|IO_DQDQS_OUT_PHASE_MAX|IO_DQS_EN_DELAY_MAX|IO_DQS_EN_DELAY_OFFSET|IO_DQS_EN_PHASE_MAX|IO_DQS_IN_DELAY_MAX|IO_DQS_IN_RESERVE|IO_DQS_OUT_RESERVE|IO_IO_IN_DELAY_MAX|IO_IO_OUT1_DELAY_MAX|IO_IO_OUT2_DELAY_MAX|IO_SHIFT_DQS_EN_WHEN_SHIFT_DQS|AFI_RATE_RATIO|AFI_CLK_FREQ|CALIB_LFIFO_OFFSET|CALIB_VFIFO_OFFSET|ENABLE_SUPER_QUICK_CALIBRATION|MAX_LATENCY_COUNT_WIDTH|READ_VALID_FIFO_SIZE|REG_FILE_INIT_SEQ_SIGNATURE|TINIT_CNTR0_VAL|TINIT_CNTR1_VAL|TINIT_CNTR2_VAL|TRESET_CNTR0_VAL|TRESET_CNTR1_VAL|TRESET_CNTR2_VAL|CFG_HPS_SDR_CTRLCFG_EXTRATIME1_CFG_EXTRA_CTL_CLK_RD_TO_WR|CFG_HPS_SDR_CTRLCFG_EXTRATIME1_CFG_EXTRA_CTL_CLK_RD_TO_WR_BC|CFG_HPS_SDR_CTRLCFG_EXTRATIME1_CFG_EXTRA_CTL_CLK_RD_TO_WR_DIFF_CHIP)[[:space:]]" + grep -E "#define (CFG_HPS_SDR_CTRLCFG_CTRLCFG_MEMTYPE|CFG_HPS_SDR_CTRLCFG_CTRLCFG_MEMBL|CFG_HPS_SDR_CTRLCFG_CTRLCFG_ADDRORDER|CFG_HPS_SDR_CTRLCFG_CTRLCFG_ECCEN|CFG_HPS_SDR_CTRLCFG_CTRLCFG_ECCCORREN|CFG_HPS_SDR_CTRLCFG_CTRLCFG_REORDEREN|CFG_HPS_SDR_CTRLCFG_CTRLCFG_STARVELIMIT|CFG_HPS_SDR_CTRLCFG_CTRLCFG_DQSTRKEN|CFG_HPS_SDR_CTRLCFG_CTRLCFG_NODMPINS|CFG_HPS_SDR_CTRLCFG_DRAMTIMING1_TCWL|CFG_HPS_SDR_CTRLCFG_DRAMTIMING1_AL|CFG_HPS_SDR_CTRLCFG_DRAMTIMING1_TCL|CFG_HPS_SDR_CTRLCFG_DRAMTIMING1_TRRD|CFG_HPS_SDR_CTRLCFG_DRAMTIMING1_TFAW|CFG_HPS_SDR_CTRLCFG_DRAMTIMING1_TRFC|CFG_HPS_SDR_CTRLCFG_DRAMTIMING2_IF_TREFI|CFG_HPS_SDR_CTRLCFG_DRAMTIMING2_IF_TRCD|CFG_HPS_SDR_CTRLCFG_DRAMTIMING2_IF_TRP|CFG_HPS_SDR_CTRLCFG_DRAMTIMING2_IF_TWR|CFG_HPS_SDR_CTRLCFG_DRAMTIMING2_IF_TWTR|CFG_HPS_SDR_CTRLCFG_DRAMTIMING3_TRTP|CFG_HPS_SDR_CTRLCFG_DRAMTIMING3_TRAS|CFG_HPS_SDR_CTRLCFG_DRAMTIMING3_TRC|CFG_HPS_SDR_CTRLCFG_DRAMTIMING3_TMRD|CFG_HPS_SDR_CTRLCFG_DRAMTIMING3_TCCD|CFG_HPS_SDR_CTRLCFG_DRAMTIMING4_SELFRFSHEXIT|CFG_HPS_SDR_CTRLCFG_DRAMTIMING4_PWRDOWNEXIT|CFG_HPS_SDR_CTRLCFG_LOWPWRTIMING_AUTOPDCYCLES|CFG_HPS_SDR_CTRLCFG_LOWPWRTIMING_CLKDISABLECYCLES|CFG_HPS_SDR_CTRLCFG_DRAMODT_READ|CFG_HPS_SDR_CTRLCFG_DRAMODT_WRITE|CFG_HPS_SDR_CTRLCFG_DRAMADDRW_COLBITS|CFG_HPS_SDR_CTRLCFG_DRAMADDRW_ROWBITS|CFG_HPS_SDR_CTRLCFG_DRAMADDRW_BANKBITS|CFG_HPS_SDR_CTRLCFG_DRAMADDRW_CSBITS|CFG_HPS_SDR_CTRLCFG_DRAMIFWIDTH_IFWIDTH|CFG_HPS_SDR_CTRLCFG_DRAMDEVWIDTH_DEVWIDTH|CFG_HPS_SDR_CTRLCFG_DRAMINTR_INTREN|CFG_HPS_SDR_CTRLCFG_LOWPWREQ_SELFRFSHMASK|CFG_HPS_SDR_CTRLCFG_STATICCFG_MEMBL|CFG_HPS_SDR_CTRLCFG_STATICCFG_USEECCASDATA|CFG_HPS_SDR_CTRLCFG_CTRLWIDTH_CTRLWIDTH|CFG_HPS_SDR_CTRLCFG_CPORTWIDTH_CPORTWIDTH|CFG_HPS_SDR_CTRLCFG_CPORTWMAP_CPORTWMAP|CFG_HPS_SDR_CTRLCFG_CPORTRMAP_CPORTRMAP|CFG_HPS_SDR_CTRLCFG_RFIFOCMAP_RFIFOCMAP|CFG_HPS_SDR_CTRLCFG_WFIFOCMAP_WFIFOCMAP|CFG_HPS_SDR_CTRLCFG_CPORTRDWR_CPORTRDWR|CFG_HPS_SDR_CTRLCFG_PORTCFG_AUTOPCHEN|CFG_HPS_SDR_CTRLCFG_FPGAPORTRST|CFG_HPS_SDR_CTRLCFG_FIFOCFG_SYNCMODE|CFG_HPS_SDR_CTRLCFG_FIFOCFG_INCSYNC|CFG_HPS_SDR_CTRLCFG_MPPRIORITY_USERPRIORITY|CFG_HPS_SDR_CTRLCFG_MPWIEIGHT_0_STATICWEIGHT_31_0|CFG_HPS_SDR_CTRLCFG_MPWIEIGHT_1_STATICWEIGHT_49_32|CFG_HPS_SDR_CTRLCFG_MPWIEIGHT_1_SUMOFWEIGHT_13_0|CFG_HPS_SDR_CTRLCFG_MPWIEIGHT_2_SUMOFWEIGHT_45_14|CFG_HPS_SDR_CTRLCFG_MPWIEIGHT_3_SUMOFWEIGHT_63_46|CFG_HPS_SDR_CTRLCFG_PHYCTRL_PHYCTRL_0|CFG_HPS_SDR_CTRLCFG_MPPACING_0_THRESHOLD1_31_0|CFG_HPS_SDR_CTRLCFG_MPPACING_1_THRESHOLD1_59_32|CFG_HPS_SDR_CTRLCFG_MPPACING_1_THRESHOLD2_3_0|CFG_HPS_SDR_CTRLCFG_MPPACING_2_THRESHOLD2_35_4|CFG_HPS_SDR_CTRLCFG_MPPACING_3_THRESHOLD2_59_36|CFG_HPS_SDR_CTRLCFG_MPTHRESHOLDRST_0_THRESHOLDRSTCYCLES_31_0|CFG_HPS_SDR_CTRLCFG_MPTHRESHOLDRST_1_THRESHOLDRSTCYCLES_63_32|CFG_HPS_SDR_CTRLCFG_MPTHRESHOLDRST_2_THRESHOLDRSTCYCLES_79_64|RW_MGR_ACTIVATE_0_AND_1|RW_MGR_ACTIVATE_0_AND_1_WAIT1|RW_MGR_ACTIVATE_0_AND_1_WAIT2|RW_MGR_ACTIVATE_1|RW_MGR_CLEAR_DQS_ENABLE|RW_MGR_EMR_OCD_ENABLE|RW_MGR_EMR|RW_MGR_EMR2|RW_MGR_EMR3|RW_MGR_GUARANTEED_READ|RW_MGR_GUARANTEED_READ_CONT|RW_MGR_GUARANTEED_WRITE|RW_MGR_GUARANTEED_WRITE_WAIT0|RW_MGR_GUARANTEED_WRITE_WAIT1|RW_MGR_GUARANTEED_WRITE_WAIT2|RW_MGR_GUARANTEED_WRITE_WAIT3|RW_MGR_IDLE|RW_MGR_IDLE_LOOP1|RW_MGR_IDLE_LOOP2|RW_MGR_INIT_RESET_0_CKE_0|RW_MGR_INIT_RESET_1_CKE_0|RW_MGR_INIT_CKE_0|RW_MGR_LFSR_WR_RD_BANK_0|RW_MGR_LFSR_WR_RD_BANK_0_DATA|RW_MGR_LFSR_WR_RD_BANK_0_DQS|RW_MGR_LFSR_WR_RD_BANK_0_NOP|RW_MGR_LFSR_WR_RD_BANK_0_WAIT|RW_MGR_LFSR_WR_RD_BANK_0_WL_1|RW_MGR_LFSR_WR_RD_DM_BANK_0|RW_MGR_LFSR_WR_RD_DM_BANK_0_DATA|RW_MGR_LFSR_WR_RD_DM_BANK_0_DQS|RW_MGR_LFSR_WR_RD_DM_BANK_0_NOP|RW_MGR_LFSR_WR_RD_DM_BANK_0_WAIT|RW_MGR_LFSR_WR_RD_DM_BANK_0_WL_1|RW_MGR_MR_CALIB|RW_MGR_MR_USER|RW_MGR_MR_DLL_RESET|RW_MGR_MRS0_DLL_RESET|RW_MGR_MRS0_DLL_RESET_MIRR|RW_MGR_MRS0_USER|RW_MGR_MRS0_USER_MIRR|RW_MGR_MRS1|RW_MGR_MRS1_MIRR|RW_MGR_MRS2|RW_MGR_MRS2_MIRR|RW_MGR_MRS3|RW_MGR_MRS3_MIRR|RW_MGR_NOP|RW_MGR_PRECHARGE_ALL|RW_MGR_READ_B2B|RW_MGR_READ_B2B_WAIT1|RW_MGR_READ_B2B_WAIT2|RW_MGR_REFRESH|RW_MGR_REFRESH_ALL|RW_MGR_RETURN|RW_MGR_SGLE_READ|RW_MGR_ZQCL|RW_MGR_TRUE_MEM_DATA_MASK_WIDTH|RW_MGR_MEM_ADDRESS_MIRRORING|RW_MGR_MEM_DATA_MASK_WIDTH|RW_MGR_MEM_DATA_WIDTH|RW_MGR_MEM_DQ_PER_READ_DQS|RW_MGR_MEM_DQ_PER_WRITE_DQS|RW_MGR_MEM_IF_READ_DQS_WIDTH|RW_MGR_MEM_IF_WRITE_DQS_WIDTH|RW_MGR_MEM_NUMBER_OF_CS_PER_DIMM|RW_MGR_MEM_NUMBER_OF_RANKS|RW_MGR_MEM_VIRTUAL_GROUPS_PER_READ_DQS|RW_MGR_MEM_VIRTUAL_GROUPS_PER_WRITE_DQS|IO_DELAY_PER_DCHAIN_TAP|IO_DELAY_PER_DQS_EN_DCHAIN_TAP|IO_DELAY_PER_OPA_TAP|IO_DLL_CHAIN_LENGTH|IO_DQDQS_OUT_PHASE_MAX|IO_DQS_EN_DELAY_MAX|IO_DQS_EN_DELAY_OFFSET|IO_DQS_EN_PHASE_MAX|IO_DQS_IN_DELAY_MAX|IO_DQS_IN_RESERVE|IO_DQS_OUT_RESERVE|IO_IO_IN_DELAY_MAX|IO_IO_OUT1_DELAY_MAX|IO_IO_OUT2_DELAY_MAX|IO_SHIFT_DQS_EN_WHEN_SHIFT_DQS|AFI_RATE_RATIO|AFI_CLK_FREQ|CALIB_LFIFO_OFFSET|CALIB_VFIFO_OFFSET|ENABLE_SUPER_QUICK_CALIBRATION|MAX_LATENCY_COUNT_WIDTH|READ_VALID_FIFO_SIZE|REG_FILE_INIT_SEQ_SIGNATURE|TINIT_CNTR0_VAL|TINIT_CNTR1_VAL|TINIT_CNTR2_VAL|TRESET_CNTR0_VAL|TRESET_CNTR1_VAL|TRESET_CNTR2_VAL|CFG_HPS_SDR_CTRLCFG_EXTRATIME1_CFG_EXTRA_CTL_CLK_RD_TO_WR|CFG_HPS_SDR_CTRLCFG_EXTRATIME1_CFG_EXTRA_CTL_CLK_RD_TO_WR_BC|CFG_HPS_SDR_CTRLCFG_EXTRATIME1_CFG_EXTRA_CTL_CLK_RD_TO_WR_DIFF_CHIP)[[:space:]]" } # diff --git a/doc/board/intel/edison.rst b/doc/board/intel/edison.rst index 5a65673d1e..782d75a674 100644 --- a/doc/board/intel/edison.rst +++ b/doc/board/intel/edison.rst @@ -90,7 +90,7 @@ If you want to check if the board is ready, type: .. code-block:: none - lsusb | egrep "8087|8086" + lsusb | grep -E "8087|8086" Bus 001 Device 004: ID 8086:e005 Intel Corp. If you see a device with the same ID as above, the board is waiting for your diff --git a/scripts/coccicheck b/scripts/coccicheck index dccaea38e3..00b22e662d 100755 --- a/scripts/coccicheck +++ b/scripts/coccicheck @@ -54,7 +54,7 @@ FLAGS="--very-quiet" # inspected there. # # --profile will not output if --very-quiet is used, so avoid it. -echo $SPFLAGS | egrep -e "--profile|--show-trying" 2>&1 > /dev/null +echo $SPFLAGS | grep -Ee "--profile|--show-trying" 2>&1 > /dev/null if [ $? -eq 0 ]; then FLAGS="--quiet" fi diff --git a/test/fs/fs-test.sh b/test/fs/fs-test.sh index b87748106c..dec2634de3 100755 --- a/test/fs/fs-test.sh +++ b/test/fs/fs-test.sh @@ -462,22 +462,22 @@ function check_results() { FAIL=0 # Check if the ls is showing correct results for 2.5 gb file - grep -A7 "Test Case 1 " "$1" | egrep -iq "2621440000 *$4" + grep -A7 "Test Case 1 " "$1" | grep -Eiq "2621440000 *$4" pass_fail "TC1: ls of $4" # Check if the ls is showing correct results for 1 mb file - grep -A7 "Test Case 1 " "$1" | egrep -iq "1048576 *$3" + grep -A7 "Test Case 1 " "$1" | grep -Eiq "1048576 *$3" pass_fail "TC1: ls of $3" # Check size command on 1MB.file - egrep -A3 "Test Case 2a " "$1" | grep -q "filesize=100000" + grep -A3 "Test Case 2a " "$1" | grep -q "filesize=100000" pass_fail "TC2: size of $3" # Check size command on 1MB.file via a path using '..' - egrep -A3 "Test Case 2b " "$1" | grep -q "filesize=100000" + grep -A3 "Test Case 2b " "$1" | grep -q "filesize=100000" pass_fail "TC2: size of $3 via a path using '..'" # Check size command on 2.5GB.file - egrep -A3 "Test Case 3 " "$1" | grep -q "filesize=9c400000" + grep -A3 "Test Case 3 " "$1" | grep -q "filesize=9c400000" pass_fail "TC3: size of $4" # Check read full mb of 1MB.file From 85fd48984e670d45eddd86710aa47c38baa738ca Mon Sep 17 00:00:00 2001 From: Tom Rini Date: Wed, 11 Jan 2023 12:24:57 -0500 Subject: [PATCH 24/24] CI/Docker: Update to jammy-20221130 tag Update to the latest "jammy" tag. This requires us to list libc6-i386 as a required package to install (for nokia_rx51 tests) that was previously implicit. Signed-off-by: Tom Rini --- .azure-pipelines.yml | 2 +- .gitlab-ci.yml | 2 +- tools/docker/Dockerfile | 3 ++- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/.azure-pipelines.yml b/.azure-pipelines.yml index 02cd8e4169..5fe3b8751d 100644 --- a/.azure-pipelines.yml +++ b/.azure-pipelines.yml @@ -2,7 +2,7 @@ variables: windows_vm: windows-2019 ubuntu_vm: ubuntu-22.04 macos_vm: macOS-12 - ci_runner_image: trini/u-boot-gitlab-ci-runner:jammy-20221101-22Nov2022 + ci_runner_image: trini/u-boot-gitlab-ci-runner:jammy-20221130-11Jan2023 # Add '-u 0' options for Azure pipelines, otherwise we get "permission # denied" error when it tries to "useradd -m -u 1001 vsts_azpcontainer", # since our $(ci_runner_image) user is not root. diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index afd83948c1..8d981a388a 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -2,7 +2,7 @@ # Grab our configured image. The source for this is found # in the u-boot tree at tools/docker/Dockerfile -image: trini/u-boot-gitlab-ci-runner:jammy-20221101-22Nov2022 +image: trini/u-boot-gitlab-ci-runner:jammy-20221130-11Jan2023 # We run some tests in different order, to catch some failures quicker. stages: diff --git a/tools/docker/Dockerfile b/tools/docker/Dockerfile index c92eeb51fd..202a8145af 100644 --- a/tools/docker/Dockerfile +++ b/tools/docker/Dockerfile @@ -2,7 +2,7 @@ # This Dockerfile is used to build an image containing basic stuff to be used # to build U-Boot and run our test suites. -FROM ubuntu:jammy-20221101 +FROM ubuntu:jammy-20221130 MAINTAINER Tom Rini LABEL Description=" This image is for building U-Boot inside a container" @@ -64,6 +64,7 @@ RUN apt-get update && apt-get install -y \ iasl \ imagemagick \ iputils-ping \ + libc6-i386 \ libconfuse-dev \ libgit2-dev \ libjson-glib-dev \