On Fri, May 27, 2016 at 10:28:48AM +0200, Maxime Ripard wrote: > Add a function to retrieve the highest phandle in a given device tree. > > Signed-off-by: Maxime Ripard <maxime.ripard@xxxxxxxxxxxxxxxxxx> Needs a testcase, plus a couple of smallish problems: > --- > libfdt/fdt_ro.c | 15 +++++++++++++++ > libfdt/libfdt.h | 13 +++++++++++++ > 2 files changed, 28 insertions(+) > > diff --git a/libfdt/fdt_ro.c b/libfdt/fdt_ro.c > index 50cce864283c..d5a14178190f 100644 > --- a/libfdt/fdt_ro.c > +++ b/libfdt/fdt_ro.c > @@ -88,6 +88,21 @@ static int _fdt_string_eq(const void *fdt, int stroffset, > return (strlen(p) == len) && (memcmp(p, s, len) == 0); > } > > +uint32_t fdt_get_max_phandle(const void *fdt) > +{ > + uint32_t max_phandle = 0, phandle; > + int offset; > + > + for (offset = fdt_next_node(fdt, -1, NULL); offset >= 0; > + offset = fdt_next_node(fdt, offset, NULL)) { > + phandle = fdt_get_phandle(fdt, offset); I think you need to check for the case of an invalid -1 valued phandle - otherwise if there are any of those, it will come up as the max (unsigned comparison). > + if (phandle > max_phandle) > + max_phandle = phandle; > + } You need to check for offset != -FDT_ERR_NOTFOUND, which would indicate some other error from fdt_next_node. > + > + return max_phandle; > +} > + > int fdt_get_mem_rsv(const void *fdt, int n, uint64_t *address, uint64_t *size) > { > FDT_CHECK_HEADER(fdt); > diff --git a/libfdt/libfdt.h b/libfdt/libfdt.h > index 6589e08db7ab..7156b264b1e9 100644 > --- a/libfdt/libfdt.h > +++ b/libfdt/libfdt.h > @@ -284,6 +284,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 phandlle in the given > + * device tree > + * > + * returns: > + * the highest phandle on success > + * 0, if an error occured > + */ > +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 > * -- 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