[PATCH 1/4] PBL: fdt: implement fdt_device_get_match_data
Jules Maselbas
jmaselbas at kalray.eu
Sat Apr 3 13:00:37 BST 2021
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 at a3f.at>
> ---
> 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 at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/barebox
>
More information about the barebox
mailing list