On Thu, Jan 28, 2016 at 09:39:27AM -0700, Simon Glass wrote: > The existing function to add a new property to a tree being built requires > that the entire contents of the new property be passed in. For some > applications it is more convenient to be able to add the property contents > later, perhaps by reading from a file. This avoids double-buffering of the > contents. > > Add a new function to support this and adust the existing fdt_property() to > use it. > > Signed-off-by: Simon Glass <sjg@xxxxxxxxxxxx> So, obviously such a patch should really go towards upstream libfdt. I'm happy enough with the concept, but I don't like the name. I'd prefer fdt_property_reserve() - the idea being that it reserves space for the property but doesn't fill it in. > --- > > include/libfdt.h | 16 ++++++++++++++++ > lib/libfdt/fdt_sw.c | 16 ++++++++++++++-- > 2 files changed, 30 insertions(+), 2 deletions(-) > > diff --git a/include/libfdt.h b/include/libfdt.h > index e48c21a..c3f37ee 100644 > --- a/include/libfdt.h > +++ b/include/libfdt.h > @@ -1181,6 +1181,22 @@ static inline int fdt_property_cell(void *fdt, const char *name, uint32_t val) > { > return fdt_property_u32(fdt, name, val); > } > + > +/** > + * fdt_property_val - add a new property and return a pointer to its value > + * > + * @fdt: pointer to the device tree blob > + * @name: name of property to add > + * @len: length of property value in bytes > + * @valp: returns a pointer to where where the value should be placed > + * > + * returns: > + * 0, on success > + * -FDT_ERR_BADMAGIC, > + * -FDT_ERR_NOSPACE, standard meanings > + */ > +int fdt_property_val(void *fdt, const char *name, int len, void **valp); > + > #define fdt_property_string(fdt, name, str) \ > fdt_property(fdt, name, str, strlen(str)+1) > int fdt_end_node(void *fdt); > diff --git a/lib/libfdt/fdt_sw.c b/lib/libfdt/fdt_sw.c > index 320a914..9c1df3d 100644 > --- a/lib/libfdt/fdt_sw.c > +++ b/lib/libfdt/fdt_sw.c > @@ -175,7 +175,7 @@ static int _fdt_find_add_string(void *fdt, const char *s) > return offset; > } > > -int fdt_property(void *fdt, const char *name, const void *val, int len) > +int fdt_property_val(void *fdt, const char *name, int len, void **valp) > { > struct fdt_property *prop; > int nameoff; > @@ -193,7 +193,19 @@ int fdt_property(void *fdt, const char *name, const void *val, int len) > prop->tag = cpu_to_fdt32(FDT_PROP); > prop->nameoff = cpu_to_fdt32(nameoff); > prop->len = cpu_to_fdt32(len); > - memcpy(prop->data, val, len); > + *valp = prop->data; > + return 0; > +} > + > +int fdt_property(void *fdt, const char *name, const void *val, int len) > +{ > + void *ptr; > + int ret; > + > + ret = fdt_property_val(fdt, name, len, &ptr); > + if (ret) > + return ret; > + memcpy(ptr, val, len); > return 0; > } > -- 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