@@ -1714,6 +1714,7 @@ static int find_nvmem_device(void)
char comp[256];
char buf[32];
int bytes;
+ ulong layout_size = 0;
DIR *dir;
dir = opendir(path);
@@ -1775,10 +1776,14 @@ next:
fclose(fp);
}
+ /* Remember the nvmem device path for parsing other properties. */
+ bytes = snprintf(comp, sizeof(comp), "%s/%s", path, dent->d_name);
closedir(dir);
if (nvmem) {
struct stat s;
+ FILE *fp;
+ size_t size;
stat(nvmem, &s);
@@ -1786,6 +1791,20 @@ next:
DEVOFFSET(0) = 0;
ENVSIZE(0) = s.st_size;
+ if (bytes > 0 && bytes != sizeof(comp)) {
+ strcat(comp, "/of_node/nvmem-layout/env-size");
+ fp = fopen(comp, "rb");
+ if (fp) {
+ fstat(fileno(fp), &s);
+ size = fread(&layout_size, s.st_size, 1, fp);
+ if (size == 1)
+ ENVSIZE(0) = layout_size;
+ fclose(fp);
+ }
+
+ comp[bytes] = '\0';
+ }
+
return 0;
}
Since Linux commit 5b2f8c133d98 ("nvmem: layouts: u-boot-env: add optional "env-size" property"), there is support for providing the size of the u-boot environment used by the bootloader to the layout NVMEM driver in order to calculate the CRC if the range is less than the partition size in a similar fashion that it would be provided in a fw_env.config file. The value is stored in binary in the same endianness as the system, so no endianness translation is necessary, simply copy to a new variable. Reuse the buffer that holds the path for opening the compatible sysfs file for parsing this env-size property, and possibly more in the future, as soon as the correct device is identified with the compatible property. Signed-off-by: Michael C. Pratt <mcpratt@pm.me> --- tools/env/fw_env.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+)