[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