Skip to content
Snippets Groups Projects
Commit f20c4619 authored by Simon Glass's avatar Simon Glass Committed by Gerald Van Baren
Browse files

fdt: Add fdtdec_decode_region() to decode memory region


A memory region has a start and a size and is often specified in
a node by a 'reg' property. Add a function to decode this information
from the fdt.

Signed-off-by: default avatarSimon Glass <sjg@chromium.org>
parent 332ab0d5
No related branches found
No related tags found
No related merge requests found
......@@ -40,10 +40,12 @@
typedef u64 fdt_addr_t;
#define FDT_ADDR_T_NONE (-1ULL)
#define fdt_addr_to_cpu(reg) be64_to_cpu(reg)
#define fdt_size_to_cpu(reg) be64_to_cpu(reg)
#else
typedef u32 fdt_addr_t;
#define FDT_ADDR_T_NONE (-1U)
#define fdt_addr_to_cpu(reg) be32_to_cpu(reg)
#define fdt_size_to_cpu(reg) be32_to_cpu(reg)
#endif
/* Information obtained about memory from the FDT */
......@@ -408,4 +410,21 @@ int fdtdec_get_byte_array(const void *blob, int node, const char *prop_name,
*/
const u8 *fdtdec_locate_byte_array(const void *blob, int node,
const char *prop_name, int count);
/**
* Look up a property in a node which contains a memory region address and
* size. Then return a pointer to this address.
*
* The property must hold one address with a length. This is only tested on
* 32-bit machines.
*
* @param blob FDT blob
* @param node node to examine
* @param prop_name name of property to find
* @param ptrp returns pointer to region, or NULL if no address
* @param size returns size of region
* @return 0 if ok, -1 on error (propery not found)
*/
int fdtdec_decode_region(const void *blob, int node,
const char *prop_name, void **ptrp, size_t *size);
#endif
......@@ -542,3 +542,20 @@ char *fdtdec_get_config_string(const void *blob, const char *prop_name)
return (char *)nodep;
}
int fdtdec_decode_region(const void *blob, int node,
const char *prop_name, void **ptrp, size_t *size)
{
const fdt_addr_t *cell;
int len;
debug("%s: %s\n", __func__, prop_name);
cell = fdt_getprop(blob, node, prop_name, &len);
if (!cell || (len != sizeof(fdt_addr_t) * 2))
return -1;
*ptrp = (void *)fdt_addr_to_cpu(*cell);
*size = fdt_size_to_cpu(cell[1]);
debug("%s: size=%zx\n", __func__, *size);
return 0;
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment