diff options
Diffstat (limited to 'package/boot/uboot-envtools/patches')
4 files changed, 235 insertions, 0 deletions
diff --git a/package/boot/uboot-envtools/patches/002-Revert-tools-env-use-run-to-store-lockfile.patch b/package/boot/uboot-envtools/patches/002-Revert-tools-env-use-run-to-store-lockfile.patch new file mode 100644 index 00000000000..e843e4252bb --- /dev/null +++ b/package/boot/uboot-envtools/patches/002-Revert-tools-env-use-run-to-store-lockfile.patch @@ -0,0 +1,41 @@ +Revert "tools: env: use /run to store lockfile" + +In OpenWRT we still use /var/lock as default location for lock files and +/run might not even exist. Revert the upstream change and restore the +previous default path. + +This reverts upstream commit + https://source.denx.de/u-boot/u-boot/-/commit/aeb40f1166e072856f865d26d42a4bea1ec3a514 +--- + tools/env/fw_env_main.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +--- a/tools/env/fw_env_main.c ++++ b/tools/env/fw_env_main.c +@@ -73,7 +73,7 @@ void usage_printenv(void) + " -c, --config configuration file, default:" CONFIG_FILE "\n" + #endif + " -n, --noheader do not repeat variable name in output\n" +- " -l, --lock lock node, default:/run\n" ++ " -l, --lock lock node, default:/var/lock\n" + "\n"); + } + +@@ -88,7 +88,7 @@ void usage_env_set(void) + #ifdef CONFIG_FILE + " -c, --config configuration file, default:" CONFIG_FILE "\n" + #endif +- " -l, --lock lock node, default:/run\n" ++ " -l, --lock lock node, default:/var/lock\n" + " -s, --script batch mode to minimize writes\n" + "\n" + "Examples:\n" +@@ -206,7 +206,7 @@ int parse_setenv_args(int argc, char *ar + + int main(int argc, char *argv[]) + { +- char *lockname = "/run/" CMD_PRINTENV ".lock"; ++ char *lockname = "/var/lock/" CMD_PRINTENV ".lock"; + int lockfd = -1; + int retval = EXIT_SUCCESS; + char *_cmdname; diff --git a/package/boot/uboot-envtools/patches/010-fw_env-fix-reading-NVMEM-device-s-compatible-value.patch b/package/boot/uboot-envtools/patches/010-fw_env-fix-reading-NVMEM-device-s-compatible-value.patch new file mode 100644 index 00000000000..5af8a1aa0e6 --- /dev/null +++ b/package/boot/uboot-envtools/patches/010-fw_env-fix-reading-NVMEM-device-s-compatible-value.patch @@ -0,0 +1,70 @@ +From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl> +Date: Tue, 12 Dec 2023 18:23:45 +0100 +Subject: [PATCH] fw_env: fix reading NVMEM device's "compatible" value +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Call to fread() was changed to check for return value. The problem is it +can't be checked for returning 1 (as it is) to determine success. + +We call fread() with buffer size as "size" argument. Reading any +"compatible" value shorter than buffer size will result in returning 0 +even on success. + +Modify code to use fstat() to determine expected read length. + +This fixes regression that broke using fw_env with NVMEM devices. + +Fixes: c059a22b7776 ("tools: env: fw_env: Fix unused-result warning") +Cc: Jaehoon Chung <jh80.chung@samsung.com> +Signed-off-by: Rafał Miłecki <rafal@milecki.pl> +--- + tools/env/fw_env.c | 18 ++++++++++++++---- + 1 file changed, 14 insertions(+), 4 deletions(-) + +--- a/tools/env/fw_env.c ++++ b/tools/env/fw_env.c +@@ -1732,6 +1732,7 @@ static int find_nvmem_device(void) + } + + while (!nvmem && (dent = readdir(dir))) { ++ struct stat s; + FILE *fp; + size_t size; + +@@ -1749,14 +1750,22 @@ static int find_nvmem_device(void) + continue; + } + +- size = fread(buf, sizeof(buf), 1, fp); ++ if (fstat(fileno(fp), &s)) { ++ fprintf(stderr, "Failed to fstat %s\n", comp); ++ goto next; ++ } ++ ++ if (s.st_size >= sizeof(buf)) { ++ goto next; ++ } ++ ++ size = fread(buf, s.st_size, 1, fp); + if (size != 1) { + fprintf(stderr, + "read failed about %s\n", comp); +- fclose(fp); +- return -EIO; ++ goto next; + } +- ++ buf[s.st_size] = '\0'; + + if (!strcmp(buf, "u-boot,env")) { + bytes = asprintf(&nvmem, "%s/%s/nvmem", path, dent->d_name); +@@ -1765,6 +1774,7 @@ static int find_nvmem_device(void) + } + } + ++next: + fclose(fp); + } + diff --git a/package/boot/uboot-envtools/patches/011-fw_env-keep-calling-read-until-whole-flash-block-is-.patch b/package/boot/uboot-envtools/patches/011-fw_env-keep-calling-read-until-whole-flash-block-is-.patch new file mode 100644 index 00000000000..af1c32fe91c --- /dev/null +++ b/package/boot/uboot-envtools/patches/011-fw_env-keep-calling-read-until-whole-flash-block-is-.patch @@ -0,0 +1,75 @@ +From 9e3003f79d168eac7ee65cd457e3904e2fb4eea8 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl> +Date: Wed, 13 Dec 2023 13:13:54 +0100 +Subject: [PATCH] fw_env: keep calling read() until whole flash block is read +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +It's totally valid for read() to provide less bytes than requested +maximum. It may happen if there is no more data available yet or source +pushes data in small chunks. + +This actually happens when trying to read env data from NVMEM device. +Kernel may provide NVMEM content in page size parts (like 4096 B). + +This fixes warnings like: +Warning on /sys/bus/nvmem/devices/u-boot-env0/nvmem: Attempted to read 16384 bytes but got 4096 +Warning on /sys/bus/nvmem/devices/u-boot-env0/nvmem: Attempted to read 12288 bytes but got 4096 +Warning on /sys/bus/nvmem/devices/u-boot-env0/nvmem: Attempted to read 8192 bytes but got 4096 + +Since the main loop in flash_read_buf() is used to read blocks this +patch adds a new nested one. + +Signed-off-by: Rafał Miłecki <rafal@milecki.pl> +--- + tools/env/fw_env.c | 34 +++++++++++++++------------------- + 1 file changed, 15 insertions(+), 19 deletions(-) + +--- a/tools/env/fw_env.c ++++ b/tools/env/fw_env.c +@@ -948,29 +948,25 @@ static int flash_read_buf(int dev, int f + */ + lseek(fd, blockstart + block_seek, SEEK_SET); + +- rc = read(fd, buf + processed, readlen); +- if (rc == -1) { +- fprintf(stderr, "Read error on %s: %s\n", +- DEVNAME(dev), strerror(errno)); +- return -1; +- } ++ while (readlen) { ++ rc = read(fd, buf + processed, readlen); ++ if (rc == -1) { ++ fprintf(stderr, "Read error on %s: %s\n", ++ DEVNAME(dev), strerror(errno)); ++ return -1; ++ } + #ifdef DEBUG +- fprintf(stderr, "Read 0x%x bytes at 0x%llx on %s\n", +- rc, (unsigned long long)blockstart + block_seek, +- DEVNAME(dev)); ++ fprintf(stderr, "Read 0x%x bytes at 0x%llx on %s\n", ++ rc, (unsigned long long)blockstart + block_seek, ++ DEVNAME(dev)); + #endif +- processed += rc; +- if (rc != readlen) { +- fprintf(stderr, +- "Warning on %s: Attempted to read %zd bytes but got %d\n", +- DEVNAME(dev), readlen, rc); ++ processed += rc; + readlen -= rc; +- block_seek += rc; +- } else { +- blockstart += blocklen; +- readlen = min(blocklen, count - processed); +- block_seek = 0; + } ++ ++ blockstart += blocklen; ++ readlen = min(blocklen, count - processed); ++ block_seek = 0; + } + + return processed; diff --git a/package/boot/uboot-envtools/patches/012-fw_env-autodetect-NAND-erase-size-and-env-sectors.patch b/package/boot/uboot-envtools/patches/012-fw_env-autodetect-NAND-erase-size-and-env-sectors.patch new file mode 100644 index 00000000000..78f555fb1f3 --- /dev/null +++ b/package/boot/uboot-envtools/patches/012-fw_env-autodetect-NAND-erase-size-and-env-sectors.patch @@ -0,0 +1,49 @@ +From d73a6641868029b5cae53ed00c5766921c9d8b1f Mon Sep 17 00:00:00 2001 +From: Anthony Loiseau <anthony.loiseau@allcircuits.com> +Date: Thu, 21 Dec 2023 23:44:38 +0100 +Subject: [PATCH] fw_env: autodetect NAND erase size and env sectors + +As already done for NOR chips, if device ESIZE and ENVSECTORS static +configurations are both zero, then autodetect them at runtime. + +Cc: Joe Hershberger <joe.hershberger@ni.com> +cc: Stefan Agner <stefan@agner.ch> +cc: Rasmus Villemoes <rasmus.villemoes@prevas.dk> +Signed-off-by: Anthony Loiseau <anthony.loiseau@allcircuits.com> +--- + tools/env/README | 3 +++ + tools/env/fw_env.c | 11 +++++++++-- + 2 files changed, 12 insertions(+), 2 deletions(-) + +--- a/tools/env/README ++++ b/tools/env/README +@@ -58,6 +58,9 @@ DEVICEx_ENVSECTORS defines the number of + this environment instance. On NAND this is used to limit the range + within which bad blocks are skipped, on NOR it is not used. + ++If DEVICEx_ESIZE and DEVICEx_ENVSECTORS are both zero, then a runtime ++detection is attempted for NOR and NAND mtd types. ++ + To prevent losing changes to the environment and to prevent confusing the MTD + drivers, a lock file at /run/fw_printenv.lock is used to serialize access + to the environment. +--- a/tools/env/fw_env.c ++++ b/tools/env/fw_env.c +@@ -1655,8 +1655,15 @@ static int check_device_config(int dev) + } + DEVTYPE(dev) = mtdinfo.type; + if (DEVESIZE(dev) == 0 && ENVSECTORS(dev) == 0 && +- mtdinfo.type == MTD_NORFLASH) +- DEVESIZE(dev) = mtdinfo.erasesize; ++ mtdinfo.erasesize > 0) { ++ if (mtdinfo.type == MTD_NORFLASH) ++ DEVESIZE(dev) = mtdinfo.erasesize; ++ else if (mtdinfo.type == MTD_NANDFLASH) { ++ DEVESIZE(dev) = mtdinfo.erasesize; ++ ENVSECTORS(dev) = ++ mtdinfo.size / mtdinfo.erasesize; ++ } ++ } + if (DEVESIZE(dev) == 0) + /* Assume the erase size is the same as the env-size */ + DEVESIZE(dev) = ENVSIZE(dev); |
