[RFC Patch 3/3] blspec: allow setting compatible depth
Sascha Hauer
sha at pengutronix.de
Tue Mar 8 00:11:59 PST 2022
On Fri, Mar 04, 2022 at 07:24:13AM +0100, Rouven Czerwinski wrote:
> In some cases its desirable to not only evaluate the first compatible of
> the barebox device tree against the bootspec device tree, but following
> compatibles as well. This is the case if fallback needs to be
> implemented for older device trees which use a different compatible.
> Allow setting the compatible depth by board code.
I had a chat with Rouven yesterday. We agreed to allow to specifiy
additional compatible strings rather than specifying a depth. He will
send a v2 soon.
Sascha
>
> Signed-off-by: Rouven Czerwinski <r.czerwinski at pengutronix.de>
> ---
> common/blspec.c | 99 +++++++++++++++++++++++++++++++-----------------
> include/blspec.h | 2 +-
> 2 files changed, 65 insertions(+), 36 deletions(-)
>
> diff --git a/common/blspec.c b/common/blspec.c
> index c1b1991338..4713a2157f 100644
> --- a/common/blspec.c
> +++ b/common/blspec.c
> @@ -22,6 +22,8 @@
> #include <linux/err.h>
> #include <mtd/ubi-user.h>
>
> +static unsigned int compatible_depth = 1;
> +
> /*
> * blspec_entry_var_set - set a variable to a value
> */
> @@ -32,6 +34,11 @@ int blspec_entry_var_set(struct blspec_entry *entry, const char *name,
> val ? strlen(val) + 1 : 0, 1);
> }
>
> +void blspec_set_compatible_depth(unsigned int depth)
> +{
> + compatible_depth = depth;
> +}
> +
> static int blspec_overlay_fixup(struct device_node *root, void *ctx)
> {
> struct blspec_entry *entry = ctx;
> @@ -542,6 +549,10 @@ int blspec_scan_directory(struct bootentries *bootentries, const char *root)
> struct list_head entry_list;
> struct blspec_list_entry *lentry;
> struct blspec_list_entry *temp;
> + struct device_node *barebox_root;
> + struct property *prop;
> + const char *compat;
> + int depth;
>
> INIT_LIST_HEAD(&entry_list);
>
> @@ -611,51 +622,69 @@ int blspec_scan_directory(struct bootentries *bootentries, const char *root)
> lentry->entry = entry;
> lentry->name = d->d_name;
>
> - list_add_sort(&entry_list, &lentry->list, compare);
> + list_add_sort(&lentry->list, &entry_list, compare);
> }
>
> - list_for_each_entry_safe(lentry, temp, &entry_list, list) {
> - char *devname = NULL, *hwdevname = NULL;
> + barebox_root = of_get_root_node();
>
> - entry = lentry->entry;
> + prop = of_find_property(barebox_root, "compatible", NULL);
>
> - if (!entry_is_of_compatible(entry, of_get_machine_compatible())) {
> - blspec_entry_free(&entry->entry);
> - list_del(&lentry->list);
> - free(lentry);
> - continue;
> - }
> + compat = of_prop_next_string(prop, NULL);
> + depth = compatible_depth;
> + do {
> + list_for_each_entry_safe(lentry, temp, &entry_list, list) {
> + char *devname = NULL, *hwdevname = NULL;
>
> - if (!entry_is_match_machine_id(entry)) {
> - blspec_entry_free(&entry->entry);
> - list_del(&lentry->list);
> - free(lentry);
> - continue;
> - }
> + entry = lentry->entry;
>
> - found++;
> + if (!entry_is_of_compatible(entry, compat)) {
> + if (depth == 1) {
> + blspec_entry_free(&entry->entry);
> + list_del(&lentry->list);
> + free(lentry);
> + }
> + continue;
> + }
>
> - if (entry->cdev && entry->cdev->dev) {
> - devname = xstrdup(dev_name(entry->cdev->dev));
> - if (entry->cdev->dev->parent)
> - hwdevname = xstrdup(dev_name(entry->cdev->dev->parent));
> - }
> + if (!entry_is_match_machine_id(entry)) {
> + if (depth == 1) {
> + blspec_entry_free(&entry->entry);
> + list_del(&lentry->list);
> + free(lentry);
> + }
> + continue;
> + }
>
> - entry->entry.title = xasprintf("%s (%s)", blspec_entry_var_get(entry, "title"),
> - entry->configpath);
> - entry->entry.description = basprintf("blspec entry, device: %s hwdevice: %s",
> - devname ? devname : "none",
> - hwdevname ? hwdevname : "none");
> - free(devname);
> - free(hwdevname);
> + found++;
>
> - entry->entry.me.type = MENU_ENTRY_NORMAL;
> - entry->entry.release = blspec_entry_free;
> + if (entry->cdev && entry->cdev->dev) {
> + devname = xstrdup(dev_name(entry->cdev->dev));
> + if (entry->cdev->dev->parent)
> + hwdevname = xstrdup(dev_name(entry->cdev->dev->parent));
> + }
>
> - bootentries_add_entry(bootentries, &entry->entry);
> - list_del(&lentry->list);
> - free(lentry);
> - }
> + entry->entry.title = xasprintf("%s (%s)", blspec_entry_var_get(entry, "title"),
> + entry->configpath);
> + entry->entry.description = basprintf("blspec entry, device: %s hwdevice: %s",
> + devname ? devname : "none",
> + hwdevname ? hwdevname : "none");
> + free(devname);
> + free(hwdevname);
> +
> + entry->entry.me.type = MENU_ENTRY_NORMAL;
> + entry->entry.release = blspec_entry_free;
> +
> + bootentries_add_entry(bootentries, &entry->entry);
> + list_del(&lentry->list);
> + free(lentry);
> + }
> +
> + compat = of_prop_next_string(prop, compat);
> + if (!compat)
> + break;
> +
> + depth--;
> + } while (depth > 0);
>
> ret = found;
>
> diff --git a/include/blspec.h b/include/blspec.h
> index 37076cd47c..f499ad8b2d 100644
> --- a/include/blspec.h
> +++ b/include/blspec.h
> @@ -23,5 +23,5 @@ int blspec_scan_devices(struct bootentries *bootentries);
> int blspec_scan_device(struct bootentries *bootentries, struct device_d *dev);
> int blspec_scan_devicename(struct bootentries *bootentries, const char *devname);
> int blspec_scan_directory(struct bootentries *bootentries, const char *root);
> -
> +void blspec_set_compatible_depth(unsigned int depth);
> #endif /* __LOADER_H__ */
> --
> 2.35.1
>
>
> _______________________________________________
> barebox mailing list
> barebox at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/barebox
>
--
Pengutronix e.K. | |
Steuerwalder Str. 21 | http://www.pengutronix.de/ |
31137 Hildesheim, Germany | Phone: +49-5121-206917-0 |
Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |
More information about the barebox
mailing list