aboutsummaryrefslogtreecommitdiffstats
path: root/package/boot/uboot-envtools/patches
diff options
context:
space:
mode:
Diffstat (limited to 'package/boot/uboot-envtools/patches')
-rw-r--r--package/boot/uboot-envtools/patches/002-Revert-tools-env-use-run-to-store-lockfile.patch41
-rw-r--r--package/boot/uboot-envtools/patches/010-fw_env-fix-reading-NVMEM-device-s-compatible-value.patch70
-rw-r--r--package/boot/uboot-envtools/patches/011-fw_env-keep-calling-read-until-whole-flash-block-is-.patch75
-rw-r--r--package/boot/uboot-envtools/patches/012-fw_env-autodetect-NAND-erase-size-and-env-sectors.patch49
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);