summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Documentation/user/booting-linux.rst6
-rw-r--r--common/blspec.c31
2 files changed, 36 insertions, 1 deletions
diff --git a/Documentation/user/booting-linux.rst b/Documentation/user/booting-linux.rst
index b5e4320ef6..408f87d8e8 100644
--- a/Documentation/user/booting-linux.rst
+++ b/Documentation/user/booting-linux.rst
@@ -212,6 +212,12 @@ The entry can be listed with the -l option:
When on barebox the SD card shows up as ``mmc1`` then this entry can be booted with
``boot mmc1`` or with setting ``global.boot.default`` to ``mmc1``.
+``machine-id`` is an optional key. If ``global.boot.machine_id`` variable is set to
+non-empty value, then barebox accepts only Bootloader Spec entries with ``machine-id``
+key. In case if value of global variable and Bootloader Spec key match each other,
+barebox will choose the boot entry for booting. All other Bootloader Spec entries will
+be ignored.
+
A bootloader spec entry can also reside on an NFS server in which case a RFC2224
compatible NFS URI string must be passed to the boot command:
diff --git a/common/blspec.c b/common/blspec.c
index 6171461a72..2c682e1990 100644
--- a/common/blspec.c
+++ b/common/blspec.c
@@ -420,6 +420,30 @@ out:
}
/*
+ * entry_is_match_machine_id - check if a bootspec entry is match with
+ * the machine id given by global variable.
+ *
+ * returns true if the entry is match, false otherwise
+ */
+
+static bool entry_is_match_machine_id(struct blspec_entry *entry)
+{
+ int ret = true;
+ const char *env_machineid = getenv_nonempty("global.boot.machine_id");
+
+ if (env_machineid) {
+ const char *machineid = blspec_entry_var_get(entry, "machine-id");
+ if (!machineid || strcmp(machineid, env_machineid)) {
+ pr_debug("ignoring entry with missmatched machine-id " \
+ "\"%s\" != \"%s\"\n", env_machineid, machineid);
+ ret = false;
+ }
+ }
+
+ return ret;
+}
+
+/*
* blspec_scan_directory - scan over a directory
*
* Given a root path collects all bootentries entries found under /bootentries/entries/.
@@ -504,6 +528,11 @@ int blspec_scan_directory(struct bootentries *bootentries, const char *root)
continue;
}
+ if (!entry_is_match_machine_id(entry)) {
+ blspec_entry_free(&entry->entry);
+ continue;
+ }
+
found++;
if (entry->cdev && entry->cdev->dev) {
@@ -756,4 +785,4 @@ static int blspec_init(void)
{
return bootentry_register_provider(blspec_bootentry_provider);
}
-device_initcall(blspec_init); \ No newline at end of file
+device_initcall(blspec_init);