From: Ahmad Fatoum <a.fatoum@pengutronix.de>
To: barebox@lists.infradead.org
Cc: mfe@pengutronix.de, Ahmad Fatoum <a.fatoum@barebox.org>
Subject: [PATCH v2 1/2] environment: support DT-compatible-specific overlays
Date: Mon, 13 Apr 2026 15:43:52 +0200 [thread overview]
Message-ID: <20260413134422.3562639-1-a.fatoum@pengutronix.de> (raw)
From: Ahmad Fatoum <a.fatoum@barebox.org>
Board-specific environments are registered from board code via
defaultenv_append_directory(), but this isn't possible when using
CONFIG_DEFAULT_ENVIRONMENT_PATH with an external environment.
Add support for a match.of_compatible/ directory convention within
the default environment. Subdirectories named after DT root compatible
strings are overlaid onto /env from most generic to most specific
after the default environment is loaded. The match.of_compatible/
directory is removed afterwards to keep /env clean.
Example layout in CONFIG_DEFAULT_ENVIRONMENT_PATH:
barebox-defaultenv/
nv/boot.default
match.of_compatible/
fsl,imx8mm/
nv/boot.default
fsl,imx8mm-evk/
nv/boot.default
For compatible = "fsl,imx8mm-evk", "fsl,imx8mm":
1. fsl,imx8mm/ overlay applied first (most generic)
2. fsl,imx8mm-evk/ overlay applied second (most specific)
Signed-off-by: Ahmad Fatoum <a.fatoum@barebox.org>
---
v1 -> v2:
- Fix typo in commit message (Marco)
- Add documentation for the feature (Marco)
---
Documentation/user/defaultenv-2.rst | 29 ++++++++++++++++++
common/startup.c | 47 +++++++++++++++++++++++++++++
2 files changed, 76 insertions(+)
diff --git a/Documentation/user/defaultenv-2.rst b/Documentation/user/defaultenv-2.rst
index e5cb4a51bfad..2564eb959fcc 100644
--- a/Documentation/user/defaultenv-2.rst
+++ b/Documentation/user/defaultenv-2.rst
@@ -155,3 +155,32 @@ This contains the files to be sourced when barebox detects that the OS
had requested a specific :ref:`reboot_mode` (via e.g. ``reboot bootloader``
under Linux). After the ``/env/init`` scripts were executed, barebox will
``source /env/bmode/${global.system.reboot_mode.prev}`` if available.
+
+/env/mach.of_compatible/
+------------------------
+
+On devicetree enabled systems, this optional directory may contain
+environment overlays that should be applied onto ``/env``.
+
+Each subdirectory should be named after a device tree root compatible
+string and they will be applied from most generic to most specific match
+after the default environment is loaded.
+The ``match.of_compatible/`` directory is removed afterwards to keep
+``/env`` clean.
+
+For example, given ``CONFIG_DEFAULT_ENVIRONMENT_PATH`` pointing
+at an external ``barebox-defaultenv/`` directory::
+
+ barebox-defaultenv/
+ nv/boot.default -> kernel-common
+ match.of_compatible/
+ fsl,imx8mm/
+ nv/boot.default -> kernel-mx8mm
+ fsl,imx8mm-evk/
+ nv/boot.default -> kernel-mx8mm-evk
+
+The final ``/env/nv/boot.default`` would be:
+
+- For ``compatible = "fsl,imx8mm-evk", "fsl,imx8mm";``, ``kernel-mx8mm-evk``
+- For ``compatible = "fsl,imx8mm-evkb", "fsl,imx8mm";``, ``kernel-mx8mm``
+- For ``compatible = "fsl,imx8mp-evk", "fsl,imx8mp";``, ``kernel-common``
diff --git a/common/startup.c b/common/startup.c
index 2e2b5f820fe9..e630033e3505 100644
--- a/common/startup.c
+++ b/common/startup.c
@@ -46,6 +46,7 @@
#include <pbl/handoff-data.h>
#include <libfile.h>
#include <fuzz.h>
+#include <of.h>
extern initcall_t __barebox_initcalls_start[], __barebox_early_initcalls_end[],
__barebox_initcalls_end[];
@@ -95,6 +96,50 @@ void autoload_external_env(bool endis)
}
#endif
+static void env_merge_of_compat_overlays(const char *dir)
+{
+ struct device_node *root;
+ const char *compat;
+ struct stat s;
+ char *ofdir, *src;
+ int count;
+
+ root = of_get_root_node();
+ if (!root)
+ return;
+
+ ofdir = xasprintf("%s/match.of_compatible", dir);
+
+ if (stat(ofdir, &s) || !S_ISDIR(s.st_mode))
+ goto out;
+
+ count = of_property_count_strings(root, "compatible");
+
+ /*
+ * Apply overlays from most generic to most specific, so that
+ * more specific entries take precedence.
+ */
+ for (int i = count - 1; i >= 0; i--) {
+ if (of_property_read_string_index(root, "compatible",
+ i, &compat))
+ continue;
+
+ src = xasprintf("%s/%s", ofdir, compat);
+
+ if (stat(src, &s) == 0 && S_ISDIR(s.st_mode)) {
+ pr_debug("Applying '%s'-compatible environment overlay\n",
+ compat);
+ copy_recursive(src, dir, 0);
+ }
+
+ free(src);
+ }
+
+ unlink_recursive(ofdir, NULL);
+out:
+ free(ofdir);
+}
+
static int load_environment(void)
{
const char *default_environment_path;
@@ -115,6 +160,8 @@ static int load_environment(void)
pr_info("external environment support %s. Using default environment\n",
IS_ENABLED(CONFIG_ENV_HANDLING) ? "disallowed" : "disabled");
+ env_merge_of_compat_overlays("/env");
+
nvvar_load();
return 0;
--
2.47.3
next reply other threads:[~2026-04-13 13:45 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-04-13 13:43 Ahmad Fatoum [this message]
2026-04-13 13:43 ` [PATCH v2 2/2] sandbox: add a match.of_compatible directory to exercise the feature Ahmad Fatoum
2026-04-13 14:22 ` [PATCH v2 1/2] environment: support DT-compatible-specific overlays Marco Felsch
2026-04-13 15:10 ` Sascha Hauer
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260413134422.3562639-1-a.fatoum@pengutronix.de \
--to=a.fatoum@pengutronix.de \
--cc=a.fatoum@barebox.org \
--cc=barebox@lists.infradead.org \
--cc=mfe@pengutronix.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox