diff mbox series

[v3,1/2] u-boot: make initial environment binary image

Message ID 20251121084918.875151-1-pierre-loup.gosse@smile.fr
State New
Headers show
Series [v3,1/2] u-boot: make initial environment binary image | expand

Commit Message

Pierre-loup GOSSE Nov. 21, 2025, 8:49 a.m. UTC
From: Pierre-Loup GOSSE <pierre-loup.gosse@smile.fr>

Build the U-Boot initial environment binary image if
UBOOT_INITIAL_ENV_BINARY is set to "1". The environment partition size
(in bytes, hexadecimal or decimal) must be defined using
UBOOT_INITIAL_ENV_BINARY_SIZE.

If U-Boot environment redundancy is enabled,
UBOOT_INITIAL_ENV_BINARY_REDUND must be set to "1".

The resulting binary can be flashed using WIC at the environment offset,
overriding any existing environment if present, for example:

  part --source rawcopy --sourceparams="file=u-boot-initial-env-sd.bin" --ondisk sda --no-table --offset 4096

Signed-off-by: Pierre-Loup GOSSE <pierre-loup.gosse@smile.fr>
---
Note: Once merged, a patch with the new variables will be submitted to the
      documentation mailing list.

changes in v2:
- fix uboot_deploy_config (builddir was missing)

no changes in v3
---
 meta/classes-recipe/uboot-config.bbclass | 11 +++++++++
 meta/recipes-bsp/u-boot/u-boot.inc       | 30 ++++++++++++++++++++++++
 2 files changed, 41 insertions(+)

Comments

Adrian Freihofer Dec. 1, 2025, 5:59 p.m. UTC | #1
Hi

Just a few thoughts on the matter. There are several ways to transfer
the default environment to a target device:

* Compile the environment in u-boot and run env default -a on the
target device, as documented at
https://docs.u-boot.org/en/latest/usage/environment.html#text-based-environment
.
* Install the file in /etc/u-boot-initial-env, which is used by
libubootenv as the initial environment on the target device.
* Install it as suggested in this patch, e.g., via wic or another flash
approach during device manufacturing.

It is important to enforce some consistency between all these different
approaches. Ideally, all approaches should use the same environment
source, which should be the file referenced by CONFIG_ENV_SOURCE_FILE.
If this is not the case, when the user executes, for example, env
default -a, they will get a different environment than the one
initialized by wic for fw_setenv.

Will this be mentioned in the documentation, or will it not be taken
into account in these patches?

Thank you for the patches.
Regards,
Adrian


> 
> -=-=-=-=-=-=-=-=-=-=-=-
> Links: You receive all messages sent to this group.
> View/Reply Online (#226653):
> https://lists.openembedded.org/g/openembedded-core/message/226653
> Mute This Topic: https://lists.openembedded.org/mt/116405112/4454582
> Group Owner: openembedded-core+owner@lists.openembedded.org
> Unsubscribe:
> https://lists.openembedded.org/g/openembedded-core/unsub [
> adrian.freihofer@gmail.com]
> -=-=-=-=-=-=-=-=-=-=-=-
Pierre-loup GOSSE Dec. 11, 2025, 3:36 p.m. UTC | #2
Hi,

Thanks for your remark.

I did not plan to mention this in the documentation patch, as I think it is
outside the scope of these patches, which only create the binary format of
the existing u-boot-initial-env file.

Besides, from my comprehension, all these approaches use the same
environment source from the default_environment structure declared in the
env_default.h file, which enforces consistency.

However, this is not prevent users from installing a different default
environment from the one compiled in U-Boot. If wanted, I can explicitly
mention this matter in my documentation patch.

Regards,
Pierre-Loup



On Mon, Dec 1, 2025 at 6:59 PM <adrian.freihofer@gmail.com> wrote:

> Hi
>
> Just a few thoughts on the matter. There are several ways to transfer
> the default environment to a target device:
>
> * Compile the environment in u-boot and run env default -a on the
> target device, as documented at
>
> https://docs.u-boot.org/en/latest/usage/environment.html#text-based-environment
> .
> * Install the file in /etc/u-boot-initial-env, which is used by
> libubootenv as the initial environment on the target device.
> * Install it as suggested in this patch, e.g., via wic or another flash
> approach during device manufacturing.
>
> It is important to enforce some consistency between all these different
> approaches. Ideally, all approaches should use the same environment
> source, which should be the file referenced by CONFIG_ENV_SOURCE_FILE.
> If this is not the case, when the user executes, for example, env
> default -a, they will get a different environment than the one
> initialized by wic for fw_setenv.
>
> Will this be mentioned in the documentation, or will it not be taken
> into account in these patches?
>
> Thank you for the patches.
> Regards,
> Adrian
>
>
> >
> > -=-=-=-=-=-=-=-=-=-=-=-
> > Links: You receive all messages sent to this group.
> > View/Reply Online (#226653):
> > https://lists.openembedded.org/g/openembedded-core/message/226653
> > Mute This Topic: https://lists.openembedded.org/mt/116405112/4454582
> > Group Owner: openembedded-core+owner@lists.openembedded.org
> > Unsubscribe:
> > https://lists.openembedded.org/g/openembedded-core/unsub [
> > adrian.freihofer@gmail.com]
> > -=-=-=-=-=-=-=-=-=-=-=-
>
Adrian Freihofer Dec. 11, 2025, 11:04 p.m. UTC | #3
Hi Pierre-Loup

Thank you for the explanation. I took a closer look at the tests and
now think I understand how it works and why it is consistent by
default.

Regards,
Adrian


On Thu, 2025-12-11 at 16:36 +0100, Pierre-loup GOSSE wrote:
> Hi,
> 
> Thanks for your remark.
> 
> I did not plan to mention this in the documentation patch, as I think
> it is outside the scope of these patches, which only create the
> binary format of the existing u-boot-initial-env file.
> 
> Besides, from my comprehension, all these approaches use the same
> environment source from the default_environment structure declared in
> the env_default.h file, which enforces consistency.
> 
> However, this is not prevent users from installing a different
> default environment from the one compiled in U-Boot. If wanted, I can
> explicitly mention this matter in my documentation patch.
> 
> Regards,
> Pierre-Loup
> 
> 
> 
> On Mon, Dec 1, 2025 at 6:59 PM <adrian.freihofer@gmail.com> wrote:
> > Hi
> > 
> > Just a few thoughts on the matter. There are several ways to
> > transfer
> > the default environment to a target device:
> > 
> > * Compile the environment in u-boot and run env default -a on the
> > target device, as documented at
> > https://docs.u-boot.org/en/latest/usage/environment.html#text-based-environment
> > .
> > * Install the file in /etc/u-boot-initial-env, which is used by
> > libubootenv as the initial environment on the target device.
> > * Install it as suggested in this patch, e.g., via wic or another
> > flash
> > approach during device manufacturing.
> > 
> > It is important to enforce some consistency between all these
> > different
> > approaches. Ideally, all approaches should use the same environment
> > source, which should be the file referenced by
> > CONFIG_ENV_SOURCE_FILE.
> > If this is not the case, when the user executes, for example, env
> > default -a, they will get a different environment than the one
> > initialized by wic for fw_setenv.
> > 
> > Will this be mentioned in the documentation, or will it not be
> > taken
> > into account in these patches?
> > 
> > Thank you for the patches.
> > Regards,
> > Adrian
> > 
> > 
> > > 
> > > -=-=-=-=-=-=-=-=-=-=-=-
> > > Links: You receive all messages sent to this group.
> > > View/Reply Online (#226653):
> > > https://lists.openembedded.org/g/openembedded-core/message/226653
> > > Mute This Topic:
> > https://lists.openembedded.org/mt/116405112/4454582
> > > Group Owner: openembedded-core+owner@lists.openembedded.org
> > > Unsubscribe:
> > > https://lists.openembedded.org/g/openembedded-core/unsub [
> > > adrian.freihofer@gmail.com]
> > > -=-=-=-=-=-=-=-=-=-=-=-
Martin Schwan Dec. 12, 2025, 9:39 a.m. UTC | #4
Thanks Pierre-loup for the patch. This is going to be very useful.

Reviewed-by: Martin Schwan <m.schwan@phytec.de>

Regards,
Martin

On Fri, 2025-11-21 at 09:49 +0100, Pierre-loup GOSSE via
lists.openembedded.org wrote:
> From: Pierre-Loup GOSSE <pierre-loup.gosse@smile.fr>
> 
> Build the U-Boot initial environment binary image if
> UBOOT_INITIAL_ENV_BINARY is set to "1". The environment partition
> size
> (in bytes, hexadecimal or decimal) must be defined using
> UBOOT_INITIAL_ENV_BINARY_SIZE.
> 
> If U-Boot environment redundancy is enabled,
> UBOOT_INITIAL_ENV_BINARY_REDUND must be set to "1".
> 
> The resulting binary can be flashed using WIC at the environment
> offset,
> overriding any existing environment if present, for example:
> 
>   part --source rawcopy --sourceparams="file=u-boot-initial-env-
> sd.bin" --ondisk sda --no-table --offset 4096
> 
> Signed-off-by: Pierre-Loup GOSSE <pierre-loup.gosse@smile.fr>
> ---
> Note: Once merged, a patch with the new variables will be submitted
> to the
>       documentation mailing list.
> 
> changes in v2:
> - fix uboot_deploy_config (builddir was missing)
> 
> no changes in v3
> ---
>  meta/classes-recipe/uboot-config.bbclass | 11 +++++++++
>  meta/recipes-bsp/u-boot/u-boot.inc       | 30
> ++++++++++++++++++++++++
>  2 files changed, 41 insertions(+)
> 
> diff --git a/meta/classes-recipe/uboot-config.bbclass b/meta/classes-
> recipe/uboot-config.bbclass
> index fd6c045142..81057b5cad 100644
> --- a/meta/classes-recipe/uboot-config.bbclass
> +++ b/meta/classes-recipe/uboot-config.bbclass
> @@ -71,6 +71,14 @@ UBOOT_ENV_BINARY ?=
> "${UBOOT_ENV}.${UBOOT_ENV_SUFFIX}"
>  UBOOT_ENV_IMAGE ?= "${UBOOT_ENV}-${MACHINE}-
> ${UBOOT_VERSION}.${UBOOT_ENV_SUFFIX}"
>  UBOOT_ENV_SYMLINK ?= "${UBOOT_ENV}-${MACHINE}.${UBOOT_ENV_SUFFIX}"
>  
> +# Enable the build of the U-Boot initial env binary image. The
> binary size is
> +# required (i.e. the U-Boot partition environment size). Since the
> environment
> +# layout with multiple copies is different, set
> UBOOT_INITIAL_ENV_BINARY_REDUND
> +# to "1" if the U-Boot environment redundancy is enabled.
> +UBOOT_INITIAL_ENV_BINARY ?= "0"
> +UBOOT_INITIAL_ENV_BINARY_SIZE ?= ""
> +UBOOT_INITIAL_ENV_BINARY_REDUND ?= "0"
> +
>  # U-Boot EXTLINUX variables. U-Boot searches for
> /boot/extlinux/extlinux.conf
>  # to find EXTLINUX conf file.
>  UBOOT_EXTLINUX_INSTALL_DIR ?= "/boot/extlinux"
> @@ -100,6 +108,9 @@ UBOOT_DTB_BINARY ??= ""
>  UBOOT_FIT_CHECK_SIGN ?= "uboot-fit_check_sign"
>  
>  python () {
> +    if bb.utils.to_boolean(d.getVar('UBOOT_INITIAL_ENV_BINARY')) and
> d.getVar('UBOOT_INITIAL_ENV_BINARY_SIZE') == "":
> +        bb.fatal("UBOOT_INITIAL_ENV_BINARY requires setting the U-
> Boot partition environment size with the
> UBOOT_INITIAL_ENV_BINARY_SIZE variable")
> +
>      ubootmachine = d.getVar("UBOOT_MACHINE")
>      ubootconfigflags = d.getVarFlags('UBOOT_CONFIG')
>      ubootbinary = d.getVar('UBOOT_BINARY')
> diff --git a/meta/recipes-bsp/u-boot/u-boot.inc b/meta/recipes-bsp/u-
> boot/u-boot.inc
> index 16c9836508..ffa9ef2d59 100644
> --- a/meta/recipes-bsp/u-boot/u-boot.inc
> +++ b/meta/recipes-bsp/u-boot/u-boot.inc
> @@ -4,6 +4,7 @@ PROVIDES = "virtual/bootloader"
>  PACKAGE_ARCH = "${MACHINE_ARCH}"
>  
>  DEPENDS += "${@bb.utils.contains('UBOOT_ENV_SUFFIX', 'scr', 'u-boot-
> mkimage-native', '', d)}"
> +DEPENDS += "${@ 'u-boot-mkenvimage-native' if
> bb.utils.to_boolean(d.getVar('UBOOT_INITIAL_ENV_BINARY')) else ''}"
>  
>  inherit uboot-config uboot-extlinux-config uboot-sign deploy
> python3native kernel-arch
>  
> @@ -104,6 +105,10 @@ uboot_compile_config () {
>      if [ -n "${UBOOT_INITIAL_ENV}" ]; then
>          oe_runmake -C ${S} O=${B}/${builddir} u-boot-initial-env
>          cp ${B}/${builddir}/u-boot-initial-env ${B}/${builddir}/u-
> boot-initial-env-${type}
> +        if [ "${UBOOT_INITIAL_ENV_BINARY}" = "1" ] ; then
> +            uboot_compile_initial_env_binary
> +            cp ${B}/${builddir}/u-boot-initial-env.bin
> ${B}/${builddir}/u-boot-initial-env-${type}.bin
> +        fi
>      fi
>  }
>  
> @@ -123,7 +128,18 @@ uboot_compile () {
>      # Generate the uboot-initial-env
>      if [ -n "${UBOOT_INITIAL_ENV}" ]; then
>          oe_runmake -C ${S} O=${B} u-boot-initial-env
> +        if [ "${UBOOT_INITIAL_ENV_BINARY}" = "1" ] ; then
> +            uboot_compile_initial_env_binary
> +        fi
> +    fi
> +}
> +
> +uboot_compile_initial_env_binary() {
> +    redund=""
> +    if [ "${UBOOT_INITIAL_ENV_BINARY_REDUND}" = "1" ] ; then
> +        redund="-r"
>      fi
> +    uboot-mkenvimage -s ${UBOOT_INITIAL_ENV_BINARY_SIZE} ${redund} -
> o ${B}/${builddir}/u-boot-initial-env.bin ${B}/${builddir}/u-boot-
> initial-env
>  }
>  
>  do_install () {
> @@ -388,9 +404,16 @@ uboot_deploy_config () {
>      # Deploy the uboot-initial-env
>      if [ -n "${UBOOT_INITIAL_ENV}" ]; then
>          install -D -m 644 ${B}/${builddir}/u-boot-initial-env-
> ${type} ${DEPLOYDIR}/${UBOOT_INITIAL_ENV}-${MACHINE}-${type}-
> ${UBOOT_VERSION}
> +        if [ "${UBOOT_INITIAL_ENV_BINARY}" = "1" ]; then
> +            install -D -m 644 ${B}/${builddir}/u-boot-initial-env-
> ${type}.bin ${DEPLOYDIR}/${UBOOT_INITIAL_ENV}-${MACHINE}-${type}-
> ${UBOOT_VERSION}.bin
> +        fi
>          cd ${DEPLOYDIR}
>          ln -sf ${UBOOT_INITIAL_ENV}-${MACHINE}-${type}-
> ${UBOOT_VERSION} ${UBOOT_INITIAL_ENV}-${MACHINE}-${type}
>          ln -sf ${UBOOT_INITIAL_ENV}-${MACHINE}-${type}-
> ${UBOOT_VERSION} ${UBOOT_INITIAL_ENV}-${type}
> +        if [ "${UBOOT_INITIAL_ENV_BINARY}" = "1" ]; then
> +            ln -sf ${UBOOT_INITIAL_ENV}-${MACHINE}-${type}-
> ${UBOOT_VERSION}.bin ${UBOOT_INITIAL_ENV}-${MACHINE}-${type}.bin
> +            ln -sf ${UBOOT_INITIAL_ENV}-${MACHINE}-${type}-
> ${UBOOT_VERSION}.bin ${UBOOT_INITIAL_ENV}-${type}.bin
> +        fi
>      fi
>  }
>  
> @@ -405,9 +428,16 @@ uboot_deploy () {
>      # Deploy the uboot-initial-env
>      if [ -n "${UBOOT_INITIAL_ENV}" ]; then
>          install -D -m 644 ${B}/u-boot-initial-env
> ${DEPLOYDIR}/${UBOOT_INITIAL_ENV}-${MACHINE}-${UBOOT_VERSION}
> +        if [ "${UBOOT_INITIAL_ENV_BINARY}" = "1" ]; then
> +            install -D -m 644 ${B}/u-boot-initial-env.bin
> ${DEPLOYDIR}/${UBOOT_INITIAL_ENV}-${MACHINE}-${UBOOT_VERSION}.bin
> +        fi
>          cd ${DEPLOYDIR}
>          ln -sf ${UBOOT_INITIAL_ENV}-${MACHINE}-${UBOOT_VERSION}
> ${UBOOT_INITIAL_ENV}-${MACHINE}
>          ln -sf ${UBOOT_INITIAL_ENV}-${MACHINE}-${UBOOT_VERSION}
> ${UBOOT_INITIAL_ENV}
> +        if [ "${UBOOT_INITIAL_ENV_BINARY}" = "1" ]; then
> +            ln -sf ${UBOOT_INITIAL_ENV}-${MACHINE}-
> ${UBOOT_VERSION}.bin ${UBOOT_INITIAL_ENV}-${MACHINE}.bin
> +            ln -sf ${UBOOT_INITIAL_ENV}-${MACHINE}-
> ${UBOOT_VERSION}.bin ${UBOOT_INITIAL_ENV}.bin
> +        fi
>      fi
>  }
>  
> 
> -=-=-=-=-=-=-=-=-=-=-=-
> Links: You receive all messages sent to this group.
> View/Reply Online (#226653):
> https://lists.openembedded.org/g/openembedded-core/message/226653
> Mute This Topic: https://lists.openembedded.org/mt/116405112/9947111
> Group Owner: openembedded-core+owner@lists.openembedded.org
> Unsubscribe:
> https://lists.openembedded.org/g/openembedded-core/unsub [
> m.schwan@phytec.de]
> -=-=-=-=-=-=-=-=-=-=-=-
Mathieu Dubois-Briand Dec. 16, 2025, 3:20 p.m. UTC | #5
On Fri Nov 21, 2025 at 9:49 AM CET, Pierre-loup GOSSE via lists.openembedded.org wrote:
> From: Pierre-Loup GOSSE <pierre-loup.gosse@smile.fr>
>
> Build the U-Boot initial environment binary image if
> UBOOT_INITIAL_ENV_BINARY is set to "1". The environment partition size
> (in bytes, hexadecimal or decimal) must be defined using
> UBOOT_INITIAL_ENV_BINARY_SIZE.
>
> If U-Boot environment redundancy is enabled,
> UBOOT_INITIAL_ENV_BINARY_REDUND must be set to "1".
>
> The resulting binary can be flashed using WIC at the environment offset,
> overriding any existing environment if present, for example:
>
>   part --source rawcopy --sourceparams="file=u-boot-initial-env-sd.bin" --ondisk sda --no-table --offset 4096
>
> Signed-off-by: Pierre-Loup GOSSE <pierre-loup.gosse@smile.fr>
> ---
> Note: Once merged, a patch with the new variables will be submitted to the
>       documentation mailing list.
>
> changes in v2:
> - fix uboot_deploy_config (builddir was missing)
>
> no changes in v3
> ---

Hi Pierre-loup,

After the last comments I took your series for testing, but got the
following error during selftest:

2025-12-16 11:06:28,209 - oe-selftest - INFO - uboot.UBootTest.test_uboot_initial_env_binary (subunit.RemotedTestCase)
2025-12-16 11:06:28,210 - oe-selftest - INFO -  ... FAIL
...
2025-12-16 11:06:05,623 - oe-selftest - INFO - testtools.testresult.real._StringException: Traceback (most recent call last):
  File "/srv/pokybuild/yocto-worker/oe-selftest-debian/build/layers/openembedded-core/meta/lib/oeqa/selftest/cases/uboot.py", line 152, in test_uboot_config_initial_env_binary
    self.assertExists(uboot_initial_env_binary_path)
  File "/srv/pokybuild/yocto-worker/oe-selftest-debian/build/layers/openembedded-core/meta/lib/oeqa/selftest/case.py", line 251, in assertExists
    raise self.failureException(msg)
AssertionError: '/srv/pokybuild/yocto-worker/oe-selftest-debian/build/build-st-1145752/tmp/work/qemux86_64-poky-linux/u-boot/2025.10/deploy-u-boot/u-boot-initial-env-test.bin' does not exist

https://autobuilder.yoctoproject.org/valkyrie/#/builders/35/builds/2838
https://autobuilder.yoctoproject.org/valkyrie/#/builders/48/builds/2732

Can you have a look at this issue?

Thanks,
Mathieu
Mathieu Dubois-Briand Dec. 16, 2025, 3:28 p.m. UTC | #6
On Tue Dec 16, 2025 at 4:20 PM CET, Mathieu Dubois-Briand wrote:
> On Fri Nov 21, 2025 at 9:49 AM CET, Pierre-loup GOSSE via lists.openembedded.org wrote:
>> From: Pierre-Loup GOSSE <pierre-loup.gosse@smile.fr>
>>
>> Build the U-Boot initial environment binary image if
>> UBOOT_INITIAL_ENV_BINARY is set to "1". The environment partition size
>> (in bytes, hexadecimal or decimal) must be defined using
>> UBOOT_INITIAL_ENV_BINARY_SIZE.
>>
>> If U-Boot environment redundancy is enabled,
>> UBOOT_INITIAL_ENV_BINARY_REDUND must be set to "1".
>>
>> The resulting binary can be flashed using WIC at the environment offset,
>> overriding any existing environment if present, for example:
>>
>>   part --source rawcopy --sourceparams="file=u-boot-initial-env-sd.bin" --ondisk sda --no-table --offset 4096
>>
>> Signed-off-by: Pierre-Loup GOSSE <pierre-loup.gosse@smile.fr>
>> ---
>> Note: Once merged, a patch with the new variables will be submitted to the
>>       documentation mailing list.
>>
>> changes in v2:
>> - fix uboot_deploy_config (builddir was missing)
>>
>> no changes in v3
>> ---
>
> Hi Pierre-loup,
>
> After the last comments I took your series for testing, but got the
> following error during selftest:
>
> 2025-12-16 11:06:28,209 - oe-selftest - INFO - uboot.UBootTest.test_uboot_initial_env_binary (subunit.RemotedTestCase)
> 2025-12-16 11:06:28,210 - oe-selftest - INFO -  ... FAIL
> ...
> 2025-12-16 11:06:05,623 - oe-selftest - INFO - testtools.testresult.real._StringException: Traceback (most recent call last):
>   File "/srv/pokybuild/yocto-worker/oe-selftest-debian/build/layers/openembedded-core/meta/lib/oeqa/selftest/cases/uboot.py", line 152, in test_uboot_config_initial_env_binary
>     self.assertExists(uboot_initial_env_binary_path)
>   File "/srv/pokybuild/yocto-worker/oe-selftest-debian/build/layers/openembedded-core/meta/lib/oeqa/selftest/case.py", line 251, in assertExists
>     raise self.failureException(msg)
> AssertionError: '/srv/pokybuild/yocto-worker/oe-selftest-debian/build/build-st-1145752/tmp/work/qemux86_64-poky-linux/u-boot/2025.10/deploy-u-boot/u-boot-initial-env-test.bin' does not exist
>
> https://autobuilder.yoctoproject.org/valkyrie/#/builders/35/builds/2838
> https://autobuilder.yoctoproject.org/valkyrie/#/builders/48/builds/2732
>
> Can you have a look at this issue?
>
> Thanks,
> Mathieu

OK, it looks like the issue is somewhere between my keyboard and my
chair. Forget this issue for now...
diff mbox series

Patch

diff --git a/meta/classes-recipe/uboot-config.bbclass b/meta/classes-recipe/uboot-config.bbclass
index fd6c045142..81057b5cad 100644
--- a/meta/classes-recipe/uboot-config.bbclass
+++ b/meta/classes-recipe/uboot-config.bbclass
@@ -71,6 +71,14 @@  UBOOT_ENV_BINARY ?= "${UBOOT_ENV}.${UBOOT_ENV_SUFFIX}"
 UBOOT_ENV_IMAGE ?= "${UBOOT_ENV}-${MACHINE}-${UBOOT_VERSION}.${UBOOT_ENV_SUFFIX}"
 UBOOT_ENV_SYMLINK ?= "${UBOOT_ENV}-${MACHINE}.${UBOOT_ENV_SUFFIX}"
 
+# Enable the build of the U-Boot initial env binary image. The binary size is
+# required (i.e. the U-Boot partition environment size). Since the environment
+# layout with multiple copies is different, set UBOOT_INITIAL_ENV_BINARY_REDUND
+# to "1" if the U-Boot environment redundancy is enabled.
+UBOOT_INITIAL_ENV_BINARY ?= "0"
+UBOOT_INITIAL_ENV_BINARY_SIZE ?= ""
+UBOOT_INITIAL_ENV_BINARY_REDUND ?= "0"
+
 # U-Boot EXTLINUX variables. U-Boot searches for /boot/extlinux/extlinux.conf
 # to find EXTLINUX conf file.
 UBOOT_EXTLINUX_INSTALL_DIR ?= "/boot/extlinux"
@@ -100,6 +108,9 @@  UBOOT_DTB_BINARY ??= ""
 UBOOT_FIT_CHECK_SIGN ?= "uboot-fit_check_sign"
 
 python () {
+    if bb.utils.to_boolean(d.getVar('UBOOT_INITIAL_ENV_BINARY')) and d.getVar('UBOOT_INITIAL_ENV_BINARY_SIZE') == "":
+        bb.fatal("UBOOT_INITIAL_ENV_BINARY requires setting the U-Boot partition environment size with the UBOOT_INITIAL_ENV_BINARY_SIZE variable")
+
     ubootmachine = d.getVar("UBOOT_MACHINE")
     ubootconfigflags = d.getVarFlags('UBOOT_CONFIG')
     ubootbinary = d.getVar('UBOOT_BINARY')
diff --git a/meta/recipes-bsp/u-boot/u-boot.inc b/meta/recipes-bsp/u-boot/u-boot.inc
index 16c9836508..ffa9ef2d59 100644
--- a/meta/recipes-bsp/u-boot/u-boot.inc
+++ b/meta/recipes-bsp/u-boot/u-boot.inc
@@ -4,6 +4,7 @@  PROVIDES = "virtual/bootloader"
 PACKAGE_ARCH = "${MACHINE_ARCH}"
 
 DEPENDS += "${@bb.utils.contains('UBOOT_ENV_SUFFIX', 'scr', 'u-boot-mkimage-native', '', d)}"
+DEPENDS += "${@ 'u-boot-mkenvimage-native' if bb.utils.to_boolean(d.getVar('UBOOT_INITIAL_ENV_BINARY')) else ''}"
 
 inherit uboot-config uboot-extlinux-config uboot-sign deploy python3native kernel-arch
 
@@ -104,6 +105,10 @@  uboot_compile_config () {
     if [ -n "${UBOOT_INITIAL_ENV}" ]; then
         oe_runmake -C ${S} O=${B}/${builddir} u-boot-initial-env
         cp ${B}/${builddir}/u-boot-initial-env ${B}/${builddir}/u-boot-initial-env-${type}
+        if [ "${UBOOT_INITIAL_ENV_BINARY}" = "1" ] ; then
+            uboot_compile_initial_env_binary
+            cp ${B}/${builddir}/u-boot-initial-env.bin ${B}/${builddir}/u-boot-initial-env-${type}.bin
+        fi
     fi
 }
 
@@ -123,7 +128,18 @@  uboot_compile () {
     # Generate the uboot-initial-env
     if [ -n "${UBOOT_INITIAL_ENV}" ]; then
         oe_runmake -C ${S} O=${B} u-boot-initial-env
+        if [ "${UBOOT_INITIAL_ENV_BINARY}" = "1" ] ; then
+            uboot_compile_initial_env_binary
+        fi
+    fi
+}
+
+uboot_compile_initial_env_binary() {
+    redund=""
+    if [ "${UBOOT_INITIAL_ENV_BINARY_REDUND}" = "1" ] ; then
+        redund="-r"
     fi
+    uboot-mkenvimage -s ${UBOOT_INITIAL_ENV_BINARY_SIZE} ${redund} -o ${B}/${builddir}/u-boot-initial-env.bin ${B}/${builddir}/u-boot-initial-env
 }
 
 do_install () {
@@ -388,9 +404,16 @@  uboot_deploy_config () {
     # Deploy the uboot-initial-env
     if [ -n "${UBOOT_INITIAL_ENV}" ]; then
         install -D -m 644 ${B}/${builddir}/u-boot-initial-env-${type} ${DEPLOYDIR}/${UBOOT_INITIAL_ENV}-${MACHINE}-${type}-${UBOOT_VERSION}
+        if [ "${UBOOT_INITIAL_ENV_BINARY}" = "1" ]; then
+            install -D -m 644 ${B}/${builddir}/u-boot-initial-env-${type}.bin ${DEPLOYDIR}/${UBOOT_INITIAL_ENV}-${MACHINE}-${type}-${UBOOT_VERSION}.bin
+        fi
         cd ${DEPLOYDIR}
         ln -sf ${UBOOT_INITIAL_ENV}-${MACHINE}-${type}-${UBOOT_VERSION} ${UBOOT_INITIAL_ENV}-${MACHINE}-${type}
         ln -sf ${UBOOT_INITIAL_ENV}-${MACHINE}-${type}-${UBOOT_VERSION} ${UBOOT_INITIAL_ENV}-${type}
+        if [ "${UBOOT_INITIAL_ENV_BINARY}" = "1" ]; then
+            ln -sf ${UBOOT_INITIAL_ENV}-${MACHINE}-${type}-${UBOOT_VERSION}.bin ${UBOOT_INITIAL_ENV}-${MACHINE}-${type}.bin
+            ln -sf ${UBOOT_INITIAL_ENV}-${MACHINE}-${type}-${UBOOT_VERSION}.bin ${UBOOT_INITIAL_ENV}-${type}.bin
+        fi
     fi
 }
 
@@ -405,9 +428,16 @@  uboot_deploy () {
     # Deploy the uboot-initial-env
     if [ -n "${UBOOT_INITIAL_ENV}" ]; then
         install -D -m 644 ${B}/u-boot-initial-env ${DEPLOYDIR}/${UBOOT_INITIAL_ENV}-${MACHINE}-${UBOOT_VERSION}
+        if [ "${UBOOT_INITIAL_ENV_BINARY}" = "1" ]; then
+            install -D -m 644 ${B}/u-boot-initial-env.bin ${DEPLOYDIR}/${UBOOT_INITIAL_ENV}-${MACHINE}-${UBOOT_VERSION}.bin
+        fi
         cd ${DEPLOYDIR}
         ln -sf ${UBOOT_INITIAL_ENV}-${MACHINE}-${UBOOT_VERSION} ${UBOOT_INITIAL_ENV}-${MACHINE}
         ln -sf ${UBOOT_INITIAL_ENV}-${MACHINE}-${UBOOT_VERSION} ${UBOOT_INITIAL_ENV}
+        if [ "${UBOOT_INITIAL_ENV_BINARY}" = "1" ]; then
+            ln -sf ${UBOOT_INITIAL_ENV}-${MACHINE}-${UBOOT_VERSION}.bin ${UBOOT_INITIAL_ENV}-${MACHINE}.bin
+            ln -sf ${UBOOT_INITIAL_ENV}-${MACHINE}-${UBOOT_VERSION}.bin ${UBOOT_INITIAL_ENV}.bin
+        fi
     fi
 }