[openwrt/openwrt] uboot-envtools: backport some usefull patches from v2024.04-rc1

LEDE Commits lede-commits at lists.infradead.org
Sun Feb 11 01:49:23 PST 2024


nick pushed a commit to openwrt/openwrt.git, branch main:
https://git.openwrt.org/3b74ae780cd3bb2a6f83251a2aa0ca1575c4b3d3

commit 3b74ae780cd3bb2a6f83251a2aa0ca1575c4b3d3
Author: Shiji Yang <yangshiji66 at qq.com>
AuthorDate: Sat Feb 10 13:47:40 2024 +0000

    uboot-envtools: backport some usefull patches from v2024.04-rc1
    
    Highlights:
    - Silence small page read warning.
    - Autodetect NAND erase size and env sectors.
    
    Signed-off-by: Shiji Yang <yangshiji66 at qq.com>
---
 package/boot/uboot-envtools/Makefile               |  2 +-
 ...-calling-read-until-whole-flash-block-is-.patch | 75 ++++++++++++++++++++++
 ...utodetect-NAND-erase-size-and-env-sectors.patch | 49 ++++++++++++++
 3 files changed, 125 insertions(+), 1 deletion(-)

diff --git a/package/boot/uboot-envtools/Makefile b/package/boot/uboot-envtools/Makefile
index 4ea93f9c79..00aa424162 100644
--- a/package/boot/uboot-envtools/Makefile
+++ b/package/boot/uboot-envtools/Makefile
@@ -10,7 +10,7 @@ include $(TOPDIR)/rules.mk
 PKG_NAME:=uboot-envtools
 PKG_DISTNAME:=u-boot
 PKG_VERSION:=2024.01
-PKG_RELEASE:=1
+PKG_RELEASE:=2
 
 PKG_SOURCE:=$(PKG_DISTNAME)-$(PKG_VERSION).tar.bz2
 PKG_SOURCE_URL:= \
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 0000000000..af1c32fe91
--- /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 at 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 at 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 0000000000..78f555fb1f
--- /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 at 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 at ni.com>
+cc: Stefan Agner <stefan at agner.ch>
+cc: Rasmus Villemoes <rasmus.villemoes at prevas.dk>
+Signed-off-by: Anthony Loiseau <anthony.loiseau at 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);




More information about the lede-commits mailing list