On Fri, Jul 6, 2012 at 3:00 AM, Peter Maydell <peter.mayd...@linaro.org> wrote: > Add support for reading device tree properties (both generic > and single-cell ones) to QEMU's convenience wrapper layer. > > Signed-off-by: Peter Maydell <peter.mayd...@linaro.org> > --- > device_tree.c | 30 ++++++++++++++++++++++++++++++ > device_tree.h | 4 ++++ > 2 files changed, 34 insertions(+), 0 deletions(-) > > diff --git a/device_tree.c b/device_tree.c > index b366fdd..d7a9b6b 100644 > --- a/device_tree.c > +++ b/device_tree.c > @@ -178,6 +178,36 @@ int qemu_devtree_setprop_string(void *fdt, const char > *node_path, > return r; > } > > +const void *qemu_devtree_getprop(void *fdt, const char *node_path, > + const char *property, int *lenp) > +{ > + int len; > + const void *r; > + if (!lenp) { > + lenp = &len; > + } > + r = fdt_getprop(fdt, findnode_nofail(fdt, node_path), property, lenp); > + if (!r) { > + fprintf(stderr, "%s: Couldn't get %s/%s: %s\n", __func__, > + node_path, property, fdt_strerror(*lenp)); > + exit(1); > + } > + return r; > +} > + > +uint32_t qemu_devtree_getprop_cell(void *fdt, const char *node_path, > + const char *property)
Hi Peter, Can we generalise and get functionality for reading cells with offsets as well? Your function assumes (and asserts) that the property is a single cell, but can we add a index parameter for reading a non-0th property out of a multi-cell prop? Needed for reading things like ranges, regs and interrupt properties. Regards, Peter > +{ > + int len; > + const uint32_t *p = qemu_devtree_getprop(fdt, node_path, property, &len); > + if (len != 4) { > + fprintf(stderr, "%s: %s/%s not 4 bytes long (not a cell?)\n", > + __func__, node_path, property); > + exit(1); > + } > + return be32_to_cpu(*p); > +} > + > uint32_t qemu_devtree_get_phandle(void *fdt, const char *path) > { > uint32_t r; > diff --git a/device_tree.h b/device_tree.h > index 2244270..f7a3e6c 100644 > --- a/device_tree.h > +++ b/device_tree.h > @@ -28,6 +28,10 @@ int qemu_devtree_setprop_string(void *fdt, const char > *node_path, > int qemu_devtree_setprop_phandle(void *fdt, const char *node_path, > const char *property, > const char *target_node_path); > +const void *qemu_devtree_getprop(void *fdt, const char *node_path, > + const char *property, int *lenp); > +uint32_t qemu_devtree_getprop_cell(void *fdt, const char *node_path, > + const char *property); > uint32_t qemu_devtree_get_phandle(void *fdt, const char *path); > uint32_t qemu_devtree_alloc_phandle(void *fdt); > int qemu_devtree_nop_node(void *fdt, const char *node_path); > -- > 1.7.1 >