* [PATCH 1/2] environment: support DT-compatible-specific overlays
@ 2026-04-13 10:20 Ahmad Fatoum
2026-04-13 10:20 ` [PATCH 2/2] sandbox: add a match.of_compatible directory to exercise the feature Ahmad Fatoum
2026-04-13 12:59 ` [PATCH 1/2] environment: support DT-compatible-specific overlays Marco Felsch
0 siblings, 2 replies; 3+ messages in thread
From: Ahmad Fatoum @ 2026-04-13 10:20 UTC (permalink / raw)
To: barebox; +Cc: Ahmad Fatoum
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,imx8mq-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>
---
common/startup.c | 47 +++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 47 insertions(+)
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
^ permalink raw reply [flat|nested] 3+ messages in thread
* [PATCH 2/2] sandbox: add a match.of_compatible directory to exercise the feature
2026-04-13 10:20 [PATCH 1/2] environment: support DT-compatible-specific overlays Ahmad Fatoum
@ 2026-04-13 10:20 ` Ahmad Fatoum
2026-04-13 12:59 ` [PATCH 1/2] environment: support DT-compatible-specific overlays Marco Felsch
1 sibling, 0 replies; 3+ messages in thread
From: Ahmad Fatoum @ 2026-04-13 10:20 UTC (permalink / raw)
To: barebox; +Cc: Ahmad Fatoum
The match.of_compatible feature is mostly meant to be used with
environments originating outside barebox.
Nevertheless, switch over sandbox to use it so it gets some coverage.
Signed-off-by: Ahmad Fatoum <a.fatoum@barebox.org>
---
arch/sandbox/board/defaultenv-sandbox/data/last-match | 1 +
.../match.of_compatible/barebox,not-sandbox/data/last-match | 1 +
.../match.of_compatible/barebox,not-sandbox/nv/autoboot | 1 +
.../match.of_compatible/barebox,sandbox/data/last-match | 1 +
.../match.of_compatible/barebox,sandbox/nv/autoboot | 1 +
arch/sandbox/board/defaultenv-sandbox/nv/autoboot | 2 +-
6 files changed, 6 insertions(+), 1 deletion(-)
create mode 100644 arch/sandbox/board/defaultenv-sandbox/data/last-match
create mode 100644 arch/sandbox/board/defaultenv-sandbox/match.of_compatible/barebox,not-sandbox/data/last-match
create mode 100644 arch/sandbox/board/defaultenv-sandbox/match.of_compatible/barebox,not-sandbox/nv/autoboot
create mode 100644 arch/sandbox/board/defaultenv-sandbox/match.of_compatible/barebox,sandbox/data/last-match
create mode 100644 arch/sandbox/board/defaultenv-sandbox/match.of_compatible/barebox,sandbox/nv/autoboot
diff --git a/arch/sandbox/board/defaultenv-sandbox/data/last-match b/arch/sandbox/board/defaultenv-sandbox/data/last-match
new file mode 100644
index 000000000000..df967b96a579
--- /dev/null
+++ b/arch/sandbox/board/defaultenv-sandbox/data/last-match
@@ -0,0 +1 @@
+base
diff --git a/arch/sandbox/board/defaultenv-sandbox/match.of_compatible/barebox,not-sandbox/data/last-match b/arch/sandbox/board/defaultenv-sandbox/match.of_compatible/barebox,not-sandbox/data/last-match
new file mode 100644
index 000000000000..b175a503912d
--- /dev/null
+++ b/arch/sandbox/board/defaultenv-sandbox/match.of_compatible/barebox,not-sandbox/data/last-match
@@ -0,0 +1 @@
+barebox,not-sandbox
diff --git a/arch/sandbox/board/defaultenv-sandbox/match.of_compatible/barebox,not-sandbox/nv/autoboot b/arch/sandbox/board/defaultenv-sandbox/match.of_compatible/barebox,not-sandbox/nv/autoboot
new file mode 100644
index 000000000000..36ef4c374d25
--- /dev/null
+++ b/arch/sandbox/board/defaultenv-sandbox/match.of_compatible/barebox,not-sandbox/nv/autoboot
@@ -0,0 +1 @@
+boot
diff --git a/arch/sandbox/board/defaultenv-sandbox/match.of_compatible/barebox,sandbox/data/last-match b/arch/sandbox/board/defaultenv-sandbox/match.of_compatible/barebox,sandbox/data/last-match
new file mode 100644
index 000000000000..80fdf1459eee
--- /dev/null
+++ b/arch/sandbox/board/defaultenv-sandbox/match.of_compatible/barebox,sandbox/data/last-match
@@ -0,0 +1 @@
+barebox,sandbox
diff --git a/arch/sandbox/board/defaultenv-sandbox/match.of_compatible/barebox,sandbox/nv/autoboot b/arch/sandbox/board/defaultenv-sandbox/match.of_compatible/barebox,sandbox/nv/autoboot
new file mode 100644
index 000000000000..f7d13fd04662
--- /dev/null
+++ b/arch/sandbox/board/defaultenv-sandbox/match.of_compatible/barebox,sandbox/nv/autoboot
@@ -0,0 +1 @@
+abort
diff --git a/arch/sandbox/board/defaultenv-sandbox/nv/autoboot b/arch/sandbox/board/defaultenv-sandbox/nv/autoboot
index f7d13fd04662..36ef4c374d25 100644
--- a/arch/sandbox/board/defaultenv-sandbox/nv/autoboot
+++ b/arch/sandbox/board/defaultenv-sandbox/nv/autoboot
@@ -1 +1 @@
-abort
+boot
--
2.47.3
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH 1/2] environment: support DT-compatible-specific overlays
2026-04-13 10:20 [PATCH 1/2] environment: support DT-compatible-specific overlays Ahmad Fatoum
2026-04-13 10:20 ` [PATCH 2/2] sandbox: add a match.of_compatible directory to exercise the feature Ahmad Fatoum
@ 2026-04-13 12:59 ` Marco Felsch
1 sibling, 0 replies; 3+ messages in thread
From: Marco Felsch @ 2026-04-13 12:59 UTC (permalink / raw)
To: Ahmad Fatoum; +Cc: barebox
Hi Ahmad,
On 26-04-13, Ahmad Fatoum wrote:
> 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.
That's a nice feature!
> Example layout in CONFIG_DEFAULT_ENVIRONMENT_PATH:
>
> barebox-defaultenv/
> nv/boot.default
> match.of_compatible/
> fsl,imx8mm/
> nv/boot.default
> fsl,imx8mq-evk/
^
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>
> ---
> common/startup.c | 47 +++++++++++++++++++++++++++++++++++++++++++++++
Can we have a Documentation update for this mechanism please incl. the
search order? :)
Regards,
Marco
> 1 file changed, 47 insertions(+)
>
> 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
>
>
>
--
#gernperDu
#CallMeByMyFirstName
Pengutronix e.K. | |
Steuerwalder Str. 21 | https://www.pengutronix.de/ |
31137 Hildesheim, Germany | Phone: +49-5121-206917-0 |
Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-9 |
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2026-04-13 13:00 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-04-13 10:20 [PATCH 1/2] environment: support DT-compatible-specific overlays Ahmad Fatoum
2026-04-13 10:20 ` [PATCH 2/2] sandbox: add a match.of_compatible directory to exercise the feature Ahmad Fatoum
2026-04-13 12:59 ` [PATCH 1/2] environment: support DT-compatible-specific overlays Marco Felsch
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox