.../devicetree/bindings/nvmem/layouts/u-boot,env.yaml | 7 +++++++ drivers/nvmem/layouts/u-boot-env.c | 4 +++- 2 files changed, 10 insertions(+), 1 deletion(-)
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>
---
Changes in v2:
- Added missing "$ref" line to schema for env-size
- Confirmed dt_binding_check passes
.../devicetree/bindings/nvmem/layouts/u-boot,env.yaml | 7 +++++++
drivers/nvmem/layouts/u-boot-env.c | 4 +++-
2 files changed, 10 insertions(+), 1 deletion(-)
diff --git a/Documentation/devicetree/bindings/nvmem/layouts/u-boot,env.yaml b/Documentation/devicetree/bindings/nvmem/layouts/u-boot,env.yaml
index 56a8f55d4a09..e9e75c38bd11 100644
--- a/Documentation/devicetree/bindings/nvmem/layouts/u-boot,env.yaml
+++ b/Documentation/devicetree/bindings/nvmem/layouts/u-boot,env.yaml
@@ -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 {
};
diff --git a/drivers/nvmem/layouts/u-boot-env.c b/drivers/nvmem/layouts/u-boot-env.c
index a27eeb08146f..ab32bf1291af 100644
--- a/drivers/nvmem/layouts/u-boot-env.c
+++ b/drivers/nvmem/layouts/u-boot-env.c
@@ -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) {
--
2.39.5
On Thu, 23 Oct 2025 03:07:41 +0400, Jascha Sundaresan wrote:
> 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.
>
> [...]
Applied, thanks!
[1/1] nvmem: layouts: u-boot-env: add optional "env-size" property
commit: 06e92afca89075628b12c9b4085b4cc7320081ac
Best regards,
--
Srinivas Kandagatla <srini@kernel.org>
Hi Srinivas, Friendly ping on this patch. Rob Herring reviewed it on Oct 26. Are you planning to pick it up for the nvmem tree, or would you like me to resend? Thanks, Jascha
On Thu, 23 Oct 2025 03:07:41 +0400, Jascha Sundaresan wrote: > 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> > --- > Changes in v2: > - Added missing "$ref" line to schema for env-size > - Confirmed dt_binding_check passes > > .../devicetree/bindings/nvmem/layouts/u-boot,env.yaml | 7 +++++++ > drivers/nvmem/layouts/u-boot-env.c | 4 +++- > 2 files changed, 10 insertions(+), 1 deletion(-) > Reviewed-by: Rob Herring (Arm) <robh@kernel.org>
© 2016 - 2026 Red Hat, Inc.