Browse Source

libfdt: Add max phandle retrieval function

Add a function to retrieve the highest phandle in a given device tree.

Acked-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Stefan Agner <stefan@agner.ch>
Reviewed-by: David Gibson <david@gibson.dropbear.id.au>
Signed-off-by: Maxime Ripard <maxime.ripard@free-electrons.com>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
main
Maxime Ripard 8 years ago committed by David Gibson
parent
commit
84e0e1346c
  1. 26
      libfdt/fdt_ro.c
  2. 15
      libfdt/libfdt.h
  3. 6
      tests/get_phandle.c

26
libfdt/fdt_ro.c

@ -88,6 +88,32 @@ static int _fdt_string_eq(const void *fdt, int stroffset, @@ -88,6 +88,32 @@ 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;
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 (uint32_t)-1;

phandle = fdt_get_phandle(fdt, offset);
if (phandle == (uint32_t)-1)
continue;

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);

15
libfdt/libfdt.h

@ -286,6 +286,21 @@ int fdt_move(const void *fdt, void *buf, int bufsize); @@ -286,6 +286,21 @@ 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. This will ignore badly formatted phandles, or phandles
* with a value of 0 or -1.
*
* returns:
* the highest phandle on success
* 0, if no phandle was found in the device tree
* -1, if an error occurred
*/
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

6
tests/get_phandle.c

@ -44,6 +44,7 @@ static void check_phandle(void *fdt, const char *path, uint32_t checkhandle) @@ -44,6 +44,7 @@ static void check_phandle(void *fdt, const char *path, uint32_t checkhandle)

int main(int argc, char *argv[])
{
uint32_t max;
void *fdt;

test_init(argc, argv);
@ -53,5 +54,10 @@ int main(int argc, char *argv[]) @@ -53,5 +54,10 @@ int main(int argc, char *argv[])
check_phandle(fdt, "/subnode@2", PHANDLE_1);
check_phandle(fdt, "/subnode@2/subsubnode@0", PHANDLE_2);

max = fdt_get_max_phandle(fdt);
if (max != PHANDLE_2)
FAIL("fdt_get_max_phandle returned 0x%x instead of 0x%x\n",
max, PHANDLE_2);

PASS();
}

Loading…
Cancel
Save