Hi Ahmad, On Sat, Apr 03, 2021 at 09:02:34AM +0200, Ahmad Fatoum wrote: > Currently, the generic DT image can't properly have a PBL console, > because it's only known at runtime what system we are running on. > > As we already parse the FDT in the PBL to get the memory regions, we > could extract the board compatible as well and determine which UART to > use. Add a helper to achieve this. > > Signed-off-by: Ahmad Fatoum <ahmad@xxxxxx> > --- > include/pbl.h | 9 +++++++++ > pbl/fdt.c | 36 ++++++++++++++++++++++++++++++++++++ > 2 files changed, 45 insertions(+) > > diff --git a/include/pbl.h b/include/pbl.h > index 194d5e750839..f58daec7351a 100644 > --- a/include/pbl.h > +++ b/include/pbl.h > @@ -34,4 +34,13 @@ ssize_t pbl_fat_load(struct pbl_bio *, const char *filename, void *dest, size_t > > void fdt_find_mem(const void *fdt, unsigned long *membase, unsigned long *memsize); > > +struct fdt_device_id { > + const char *compatible; > + const void *data; > +}; > + > +const void * > +fdt_device_get_match_data(const void *fdt, const char *nodepath, > + const struct fdt_device_id ids[]); > + > #endif /* __PBL_H__ */ > diff --git a/pbl/fdt.c b/pbl/fdt.c > index b4a40a514b8b..03260cb61971 100644 > --- a/pbl/fdt.c > +++ b/pbl/fdt.c > @@ -68,3 +68,39 @@ err: > pr_err("No memory, cannot continue\n"); > while (1); > } > + > +const void *fdt_device_get_match_data(const void *fdt, const char *nodepath, > + const struct fdt_device_id ids[]) > +{ > + int node, length; > + const char *list, *end; > + const struct fdt_device_id *id; > + > + node = fdt_path_offset(fdt, nodepath); > + if (node < 0) > + return NULL; > + > + list = fdt_getprop(fdt, node, "compatible", &length); > + if (!list) > + return NULL; > + > + end = list + length; > + > + while (list < end) { > + length = strnlen(list, end - list) + 1; > + > + /* Abort if the last string isn't properly NUL-terminated. */ > + if (list + length > end) > + return NULL; > + > + for (id = ids; id->compatible; id++) { > + if (strlen(id->compatible) == length && > + !memcmp(list, id->compatible, length)) > + return id->data; Why not using strcmp, or even strcasecmp as done by of_compat_cmp ? If both string doesn't have the same length, strcmp will report a diff. > + } > + > + list += length; > + } > + > + return NULL; > +} > -- > 2.30.0 > > > _______________________________________________ > barebox mailing list > barebox@xxxxxxxxxxxxxxxxxxx > http://lists.infradead.org/mailman/listinfo/barebox > _______________________________________________ barebox mailing list barebox@xxxxxxxxxxxxxxxxxxx http://lists.infradead.org/mailman/listinfo/barebox