On Tue, Jul 05, 2016 at 10:26:39AM +0200, Maxime Ripard wrote:
> Add a function to retrieve the highest phandle in a given device tree.
> 
> Signed-off-by: Maxime Ripard <[email protected]>
> Reviewed-by: Stefan Agner <[email protected]>
> Acked-by: Simon Glass <[email protected]>
> ---
>  include/libfdt.h    | 13 +++++++++++++
>  lib/libfdt/fdt_ro.c | 26 ++++++++++++++++++++++++++
>  2 files changed, 39 insertions(+)
> 
> diff --git a/include/libfdt.h b/include/libfdt.h
> index fbbe58ceb3f1..4643be5adf39 100644
> --- a/include/libfdt.h
> +++ b/include/libfdt.h
> @@ -283,6 +283,19 @@ int fdt_move(const void *fdt, void *buf, int bufsize);
>   */
>  const char *fdt_string(const void *fdt, int stroffset);
>  
> +/**
> + * fdt_get_max_phandle - retrieves the highest phandle in a tree
> + * @fdt: pointer to the device tree blob
> + *
> + * fdt_get_max_phandle retrieves the highest phandle in the given
> + * device tree
> + *
> + * returns:
> + *      the highest phandle on success
> + *      0, if an error occurred

This will also return 0 if there are no phandles in the entire tree,
which isn't exactly an error.

> + */
> +uint32_t fdt_get_max_phandle(const void *fdt);
> +
>  /**
>   * fdt_num_mem_rsv - retrieve the number of memory reserve map entries
>   * @fdt: pointer to the device tree blob
> diff --git a/lib/libfdt/fdt_ro.c b/lib/libfdt/fdt_ro.c
> index 12214c2dc2b5..503150ef1dc5 100644
> --- a/lib/libfdt/fdt_ro.c
> +++ b/lib/libfdt/fdt_ro.c
> @@ -47,6 +47,32 @@ static int _fdt_string_eq(const void *fdt, int stroffset,
>       return (strnlen(p, len + 1) == len) && (memcmp(p, s, len) == 0);
>  }
>  
> +uint32_t fdt_get_max_phandle(const void *fdt)
> +{
> +     uint32_t max_phandle = 0;
> +     int offset;
> +
> +     for (offset = fdt_next_node(fdt, -1, NULL);;
> +          offset = fdt_next_node(fdt, offset, NULL)) {
> +             uint32_t phandle;
> +
> +             if (offset == -FDT_ERR_NOTFOUND)
> +                     return max_phandle;
> +
> +             if (offset < 0)
> +                     return 0;
> +
> +             phandle = fdt_get_phandle(fdt, offset);
> +             if (phandle == (uint32_t)-1)
> +                     return 0;

It might be worth pointing out that *any* -1 phandle in the tree
counts as an error.  Since -1 phandles are sometimes used as a
placeholder, ignoring them might be a better option.

> +             if (phandle > max_phandle)
> +                     max_phandle = phandle;
> +     }
> +
> +     return 0;
> +}
> +
>  int fdt_get_mem_rsv(const void *fdt, int n, uint64_t *address, uint64_t 
> *size)
>  {
>       FDT_CHECK_HEADER(fdt);

-- 
David Gibson                    | I'll have my music baroque, and my code
david AT gibson.dropbear.id.au  | minimalist, thank you.  NOT _the_ _other_
                                | _way_ _around_!
http://www.ozlabs.org/~dgibson

Attachment: signature.asc
Description: PGP signature

_______________________________________________
U-Boot mailing list
[email protected]
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to