Hi, On 21.09.23 14:37, Ahmad Fatoum wrote: > On 20.09.23 14:37, Rouven Czerwinski wrote: >> The blspec.compatible.extra variable will be used to specify extra > > As this is only relevant when booting. Maybe prefix with boot.? > Not sure if that wouldn't be too long.. We may also want to use this for other stuff than blspec in future, e.g. FIT or matching overlays by compatible, so I think we should do away with both blspec and boot and call it maybe global.of.compatible.extra? If you agree, please define the variable in common/misc.c or some other common location. > >> compatibles that are also used to match during bootloader specification >> entry parsing. This means that even if your internal barebox device tree >> machine compatible is "vendor,bareboxcompatible", but your bootloader >> specification device tree contains "vendor,linuxcompatible", it is >> possible to boot this entry by setting blspec.compatible.extra to >> "vendor,linuxcompatible". >> >> More than one compatible is possible as well, the compatibles will need >> to be space separated (since "," is already used for the vendor hardware >> distinction). >> >> Signed-off-by: Rouven Czerwinski <r.czerwinski@xxxxxxxxxxxxxx> >> --- >> common/blspec.c | 56 +++++++++++++++++++++++++++++++++++++++++++++++++ >> 1 file changed, 56 insertions(+) >> >> diff --git a/common/blspec.c b/common/blspec.c >> index f8d47f20d2..e361a02333 100644 >> --- a/common/blspec.c >> +++ b/common/blspec.c >> @@ -19,10 +19,20 @@ >> #include <net.h> >> #include <fs.h> >> #include <of.h> >> +#include <magicvar.h> >> +#include <linux/list.h> >> #include <linux/stat.h> >> #include <linux/err.h> >> #include <mtd/ubi-user.h> >> >> +struct list_head *blspec_extra_list; >> +char *blspec_extra_string; >> + >> +struct blspec_extra_entry { >> + char *compatible; >> + struct list_head list; >> +}; >> + >> /* >> * blspec_entry_var_set - set a variable to a value >> */ >> @@ -830,8 +840,54 @@ static int blspec_bootentry_provider(struct bootentries *bootentries, >> return found; >> } >> >> +static int blspec_extra_set(struct param_d *p, void *priv) >> +{ >> + struct blspec_extra_entry *entry, *tmp; >> + char *str = blspec_extra_string; >> + char *temp = str; >> + unsigned int len; >> + >> + if (blspec_extra_list) { >> + list_for_each_entry_safe(entry, tmp, blspec_extra_list, list) { >> + list_del(&entry->list); >> + free(entry->compatible); >> + free(entry); >> + } >> + blspec_extra_list = NULL; >> + } >> + >> + while(str++) { >> + if (*str == ' ' || *str == 0) { > > Please use strsep (or strsep_unescaped) as elsewhere in blspec.c. > >> + len = temp - str; >> + if(len > 126) { >> + len = 127; >> + } >> + entry = calloc(1, sizeof(struct blspec_extra_entry)); > > xzalloc if you don't check for !NULL. > >> + entry->compatible = xzalloc(len + 1); >> + memcpy(entry->compatible, temp, len); > > But here you could just use xstrdup? > >> + >> + if (blspec_extra_list == NULL) { >> + INIT_LIST_HEAD(&entry->list); >> + blspec_extra_list = &entry->list; > > This is unusal. Why not have blspec_extra_list be a list_head instead of a pointer? > >> + } else { >> + list_add_tail(&entry->list, blspec_extra_list); >> + } >> + >> + temp = str + 1; >> + } >> + if (*str == 0) >> + break; >> + } >> + >> + return 0; >> +} >> + >> static int blspec_init(void) >> { >> + dev_add_param_string(&global_device, "blspec.compatible.extra", >> + blspec_extra_set, NULL, &blspec_extra_string, blspec_extra_list); >> return bootentry_register_provider(blspec_bootentry_provider); >> } >> device_initcall(blspec_init); >> + >> +BAREBOX_MAGICVAR(global.blspec.compatible.extra, "Extra compatible to also match during bootloader entry matching"); > -- 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 |