nvmem: layouts: u-boot-env: add optional "env-size" property

Some devices reserve a larger NVMEM region for the U-Boot environment
than the actual environment data length used by U-Boot itself. The CRC32
in the U-Boot header is calculated over the smaller data length, causing
CRC validation to fail when Linux reads the full partition.

Allow an optional device tree property "env-size" to specify the
environment data size to use for CRC computation.

v2: add missing $ref line to DT binding

Signed-off-by: Jascha Sundaresan <flizarthanon@gmail.com>
Reviewed-by: Rob Herring (Arm) <robh@kernel.org>
Signed-off-by: Srinivas Kandagatla <srini@kernel.org>
Link: https://patch.msgid.link/20251114110636.143268-5-srini@kernel.org
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
Jascha Sundaresan
2025-11-14 11:06:32 +00:00
committed by Greg Kroah-Hartman
parent 2f9fae5098
commit 5b2f8c133d
2 changed files with 10 additions and 1 deletions

View File

@@ -46,6 +46,12 @@ properties:
type: object
description: Command to use for automatic booting
env-size:
description:
Size in bytes of the environment data used by U-Boot for CRC
calculation. If omitted, the full NVMEM region size is used.
$ref: /schemas/types.yaml#/definitions/uint32
ethaddr:
type: object
description: Ethernet interfaces base MAC address.
@@ -104,6 +110,7 @@ examples:
partition-u-boot-env {
compatible = "brcm,env";
env-size = <0x20000>;
ethaddr {
};

View File

@@ -99,10 +99,12 @@ int u_boot_env_parse(struct device *dev, struct nvmem_device *nvmem,
uint32_t crc32;
uint32_t calc;
uint8_t *buf;
u32 env_size;
int bytes;
int err;
dev_size = nvmem_dev_size(nvmem);
dev_size = device_property_read_u32(dev, "env-size", &env_size) ?
nvmem_dev_size(nvmem) : (size_t)env_size;
buf = kzalloc(dev_size, GFP_KERNEL);
if (!buf) {