* [PATCH 0/4] libfdt: Add namelen variants for setprop
@ 2024-12-03 18:29 Ayush Singh
2024-12-03 18:29 ` [PATCH 1/4] libfdt: add fdt_get_property_namelen_w() Ayush Singh
` (4 more replies)
0 siblings, 5 replies; 12+ messages in thread
From: Ayush Singh @ 2024-12-03 18:29 UTC (permalink / raw)
To: d-gole, lorforlinux, jkridner, robertcnelson, nenad.marinkovic,
Andrew Davis, Geert Uytterhoeven, Robert Nelson, David Gibson
Cc: devicetree-compiler, Ayush Singh
Helper functions to setproperty with length of property name similar to
getprop_namelen variants.
This patch series was originally part of overlay-path patch series [0].
[0]: https://lore.kernel.org/devicetree-compiler/6b2dba90-3c52-4933-88f3-b47f96dc7710@beagleboard.org/T/#t
Signed-off-by: Ayush Singh <ayush@beagleboard.org>
---
Ayush Singh (4):
libfdt: add fdt_get_property_namelen_w()
libfdt_internal: fdt_find_string_len_()
libfdt: Add fdt_setprop_namelen()
libfdt: Add fdt_setprop_namelen_string()
libfdt/fdt.c | 8 ++--
libfdt/fdt_rw.c | 41 +++++++++-------
libfdt/libfdt.h | 120 +++++++++++++++++++++++++++++++++++++++++++++--
libfdt/libfdt_internal.h | 11 ++++-
libfdt/version.lds | 2 +
5 files changed, 156 insertions(+), 26 deletions(-)
---
base-commit: 6f183c7d9246bde8f05d2edbc31fdd497c4a8702
change-id: 20241203-setprop-namelen-a94f7f057acf
Best regards,
--
Ayush Singh <ayush@beagleboard.org>
^ permalink raw reply [flat|nested] 12+ messages in thread* [PATCH 1/4] libfdt: add fdt_get_property_namelen_w() 2024-12-03 18:29 [PATCH 0/4] libfdt: Add namelen variants for setprop Ayush Singh @ 2024-12-03 18:29 ` Ayush Singh 2024-12-04 0:21 ` David Gibson 2024-12-03 18:30 ` [PATCH 2/4] libfdt_internal: fdt_find_string_len_() Ayush Singh ` (3 subsequent siblings) 4 siblings, 1 reply; 12+ messages in thread From: Ayush Singh @ 2024-12-03 18:29 UTC (permalink / raw) To: d-gole, lorforlinux, jkridner, robertcnelson, nenad.marinkovic, Andrew Davis, Geert Uytterhoeven, Robert Nelson, David Gibson Cc: devicetree-compiler, Ayush Singh Similar to the non-namelen variant, it is implemented in terms of fdt_get_property_namelen() Signed-off-by: Ayush Singh <ayush@beagleboard.org> --- libfdt/libfdt.h | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/libfdt/libfdt.h b/libfdt/libfdt.h index 2e182ea3314d44f30e5362ad1ca62431c0bf663b..7d0c252a34970f4ca841935f8088410a3970127a 100644 --- a/libfdt/libfdt.h +++ b/libfdt/libfdt.h @@ -712,6 +712,13 @@ const struct fdt_property *fdt_get_property_namelen(const void *fdt, int nodeoffset, const char *name, int namelen, int *lenp); +static inline struct fdt_property * +fdt_get_property_namelen_w(void *fdt, int nodeoffset, const char *name, + int namelen, int *lenp) +{ + return (struct fdt_property *)(uintptr_t)fdt_get_property_namelen( + fdt, nodeoffset, name, namelen, lenp); +} #endif /** -- 2.47.1 ^ permalink raw reply related [flat|nested] 12+ messages in thread
* Re: [PATCH 1/4] libfdt: add fdt_get_property_namelen_w() 2024-12-03 18:29 ` [PATCH 1/4] libfdt: add fdt_get_property_namelen_w() Ayush Singh @ 2024-12-04 0:21 ` David Gibson 0 siblings, 0 replies; 12+ messages in thread From: David Gibson @ 2024-12-04 0:21 UTC (permalink / raw) To: Ayush Singh Cc: d-gole, lorforlinux, jkridner, robertcnelson, nenad.marinkovic, Andrew Davis, Geert Uytterhoeven, Robert Nelson, devicetree-compiler [-- Attachment #1: Type: text/plain, Size: 1257 bytes --] On Tue, Dec 03, 2024 at 11:59:59PM +0530, Ayush Singh wrote: > Similar to the non-namelen variant, it is implemented in terms of > fdt_get_property_namelen() > > Signed-off-by: Ayush Singh <ayush@beagleboard.org> Reviewed-by: David Gibson <david@gibson.dropbear.id.au> > --- > libfdt/libfdt.h | 7 +++++++ > 1 file changed, 7 insertions(+) > > diff --git a/libfdt/libfdt.h b/libfdt/libfdt.h > index 2e182ea3314d44f30e5362ad1ca62431c0bf663b..7d0c252a34970f4ca841935f8088410a3970127a 100644 > --- a/libfdt/libfdt.h > +++ b/libfdt/libfdt.h > @@ -712,6 +712,13 @@ const struct fdt_property *fdt_get_property_namelen(const void *fdt, > int nodeoffset, > const char *name, > int namelen, int *lenp); > +static inline struct fdt_property * > +fdt_get_property_namelen_w(void *fdt, int nodeoffset, const char *name, > + int namelen, int *lenp) > +{ > + return (struct fdt_property *)(uintptr_t)fdt_get_property_namelen( > + fdt, nodeoffset, name, namelen, lenp); > +} > #endif > > /** > -- David Gibson (he or they) | 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 #2: signature.asc --] [-- Type: application/pgp-signature, Size: 833 bytes --] ^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH 2/4] libfdt_internal: fdt_find_string_len_() 2024-12-03 18:29 [PATCH 0/4] libfdt: Add namelen variants for setprop Ayush Singh 2024-12-03 18:29 ` [PATCH 1/4] libfdt: add fdt_get_property_namelen_w() Ayush Singh @ 2024-12-03 18:30 ` Ayush Singh 2024-12-04 0:22 ` David Gibson 2024-12-03 18:30 ` [PATCH 3/4] libfdt: Add fdt_setprop_namelen() Ayush Singh ` (2 subsequent siblings) 4 siblings, 1 reply; 12+ messages in thread From: Ayush Singh @ 2024-12-03 18:30 UTC (permalink / raw) To: d-gole, lorforlinux, jkridner, robertcnelson, nenad.marinkovic, Andrew Davis, Geert Uytterhoeven, Robert Nelson, David Gibson Cc: devicetree-compiler, Ayush Singh Allow specifying string length to `fdt_find_string_`. fdt_find_string_() now internally uses this function. Signed-off-by: Ayush Singh <ayush@beagleboard.org> --- libfdt/fdt.c | 8 ++++---- libfdt/libfdt_internal.h | 11 ++++++++++- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/libfdt/fdt.c b/libfdt/fdt.c index 20c6415b9ced113d9fcce25b69007a6b0f9e68e7..95f644c31f9431eb597b6f683741ff9be375cebf 100644 --- a/libfdt/fdt.c +++ b/libfdt/fdt.c @@ -312,14 +312,14 @@ int fdt_next_subnode(const void *fdt, int offset) return offset; } -const char *fdt_find_string_(const char *strtab, int tabsize, const char *s) +const char *fdt_find_string_len_(const char *strtab, int tabsize, const char *s, + int slen) { - int len = strlen(s) + 1; - const char *last = strtab + tabsize - len; + const char *last = strtab + tabsize - (slen + 1); const char *p; for (p = strtab; p <= last; p++) - if (memcmp(p, s, len) == 0) + if (memcmp(p, s, slen) == 0 && p[slen] == '\0') return p; return NULL; } diff --git a/libfdt/libfdt_internal.h b/libfdt/libfdt_internal.h index 16bda1906a7b335519b9f748d1be6110de551e79..1fd35f364e9af15df19ae5b8b7231584804e96a4 100644 --- a/libfdt/libfdt_internal.h +++ b/libfdt/libfdt_internal.h @@ -6,6 +6,7 @@ * Copyright (C) 2006 David Gibson, IBM Corporation. */ #include <fdt.h> +#include <string.h> #define FDT_ALIGN(x, a) (((x) + (a) - 1) & ~((a) - 1)) #define FDT_TAGALIGN(x) (FDT_ALIGN((x), FDT_TAGSIZE)) @@ -20,7 +21,15 @@ int32_t fdt_ro_probe_(const void *fdt); int fdt_check_node_offset_(const void *fdt, int offset); int fdt_check_prop_offset_(const void *fdt, int offset); -const char *fdt_find_string_(const char *strtab, int tabsize, const char *s); + +const char *fdt_find_string_len_(const char *strtab, int tabsize, const char *s, + int s_len); +static inline const char *fdt_find_string_(const char *strtab, int tabsize, + const char *s) +{ + return fdt_find_string_len_(strtab, tabsize, s, strlen(s)); +} + int fdt_node_end_offset_(void *fdt, int nodeoffset); static inline const void *fdt_offset_ptr_(const void *fdt, int offset) -- 2.47.1 ^ permalink raw reply related [flat|nested] 12+ messages in thread
* Re: [PATCH 2/4] libfdt_internal: fdt_find_string_len_() 2024-12-03 18:30 ` [PATCH 2/4] libfdt_internal: fdt_find_string_len_() Ayush Singh @ 2024-12-04 0:22 ` David Gibson 0 siblings, 0 replies; 12+ messages in thread From: David Gibson @ 2024-12-04 0:22 UTC (permalink / raw) To: Ayush Singh Cc: d-gole, lorforlinux, jkridner, robertcnelson, nenad.marinkovic, Andrew Davis, Geert Uytterhoeven, Robert Nelson, devicetree-compiler [-- Attachment #1: Type: text/plain, Size: 2656 bytes --] On Wed, Dec 04, 2024 at 12:00:00AM +0530, Ayush Singh wrote: > Allow specifying string length to `fdt_find_string_`. > fdt_find_string_() now internally uses this function. > > Signed-off-by: Ayush Singh <ayush@beagleboard.org> Reviewed-by: David Gibson <david@gibson.dropbear.id.au> > --- > libfdt/fdt.c | 8 ++++---- > libfdt/libfdt_internal.h | 11 ++++++++++- > 2 files changed, 14 insertions(+), 5 deletions(-) > > diff --git a/libfdt/fdt.c b/libfdt/fdt.c > index 20c6415b9ced113d9fcce25b69007a6b0f9e68e7..95f644c31f9431eb597b6f683741ff9be375cebf 100644 > --- a/libfdt/fdt.c > +++ b/libfdt/fdt.c > @@ -312,14 +312,14 @@ int fdt_next_subnode(const void *fdt, int offset) > return offset; > } > > -const char *fdt_find_string_(const char *strtab, int tabsize, const char *s) > +const char *fdt_find_string_len_(const char *strtab, int tabsize, const char *s, > + int slen) > { > - int len = strlen(s) + 1; > - const char *last = strtab + tabsize - len; > + const char *last = strtab + tabsize - (slen + 1); > const char *p; > > for (p = strtab; p <= last; p++) > - if (memcmp(p, s, len) == 0) > + if (memcmp(p, s, slen) == 0 && p[slen] == '\0') > return p; > return NULL; > } > diff --git a/libfdt/libfdt_internal.h b/libfdt/libfdt_internal.h > index 16bda1906a7b335519b9f748d1be6110de551e79..1fd35f364e9af15df19ae5b8b7231584804e96a4 100644 > --- a/libfdt/libfdt_internal.h > +++ b/libfdt/libfdt_internal.h > @@ -6,6 +6,7 @@ > * Copyright (C) 2006 David Gibson, IBM Corporation. > */ > #include <fdt.h> > +#include <string.h> > > #define FDT_ALIGN(x, a) (((x) + (a) - 1) & ~((a) - 1)) > #define FDT_TAGALIGN(x) (FDT_ALIGN((x), FDT_TAGSIZE)) > @@ -20,7 +21,15 @@ int32_t fdt_ro_probe_(const void *fdt); > > int fdt_check_node_offset_(const void *fdt, int offset); > int fdt_check_prop_offset_(const void *fdt, int offset); > -const char *fdt_find_string_(const char *strtab, int tabsize, const char *s); > + > +const char *fdt_find_string_len_(const char *strtab, int tabsize, const char *s, > + int s_len); > +static inline const char *fdt_find_string_(const char *strtab, int tabsize, > + const char *s) > +{ > + return fdt_find_string_len_(strtab, tabsize, s, strlen(s)); > +} > + > int fdt_node_end_offset_(void *fdt, int nodeoffset); > > static inline const void *fdt_offset_ptr_(const void *fdt, int offset) > -- David Gibson (he or they) | 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 #2: signature.asc --] [-- Type: application/pgp-signature, Size: 833 bytes --] ^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH 3/4] libfdt: Add fdt_setprop_namelen() 2024-12-03 18:29 [PATCH 0/4] libfdt: Add namelen variants for setprop Ayush Singh 2024-12-03 18:29 ` [PATCH 1/4] libfdt: add fdt_get_property_namelen_w() Ayush Singh 2024-12-03 18:30 ` [PATCH 2/4] libfdt_internal: fdt_find_string_len_() Ayush Singh @ 2024-12-03 18:30 ` Ayush Singh 2024-12-04 0:29 ` David Gibson 2024-12-03 18:30 ` [PATCH 4/4] libfdt: Add fdt_setprop_namelen_string() Ayush Singh 2024-12-04 0:34 ` [PATCH 0/4] libfdt: Add namelen variants for setprop David Gibson 4 siblings, 1 reply; 12+ messages in thread From: Ayush Singh @ 2024-12-03 18:30 UTC (permalink / raw) To: d-gole, lorforlinux, jkridner, robertcnelson, nenad.marinkovic, Andrew Davis, Geert Uytterhoeven, Robert Nelson, David Gibson Cc: devicetree-compiler, Ayush Singh Allow specifying name length in setprop similar to `fdt_get_property_namelen` functions. Signed-off-by: Ayush Singh <ayush@beagleboard.org> --- libfdt/fdt_rw.c | 41 +++++++++++++++------------ libfdt/libfdt.h | 81 +++++++++++++++++++++++++++++++++++++++++++++++++++--- libfdt/version.lds | 2 ++ 3 files changed, 103 insertions(+), 21 deletions(-) diff --git a/libfdt/fdt_rw.c b/libfdt/fdt_rw.c index 3621d3651d3f4bd82b7af66c60d023e3139add03..33c60063cd721a147a3c6c0e70450c98d8dbd772 100644 --- a/libfdt/fdt_rw.c +++ b/libfdt/fdt_rw.c @@ -124,31 +124,33 @@ static int fdt_splice_string_(void *fdt, int newlen) * allocated. Ignored if can_assume(NO_ROLLBACK) * @return offset of string in the string table (whether found or added) */ -static int fdt_find_add_string_(void *fdt, const char *s, int *allocated) +static int fdt_find_add_string_(void *fdt, const char *s, int slen, + int *allocated) { char *strtab = (char *)fdt + fdt_off_dt_strings(fdt); const char *p; char *new; - int len = strlen(s) + 1; int err; if (!can_assume(NO_ROLLBACK)) *allocated = 0; - p = fdt_find_string_(strtab, fdt_size_dt_strings(fdt), s); + p = fdt_find_string_len_(strtab, fdt_size_dt_strings(fdt), s, slen); if (p) /* found it */ return (p - strtab); new = strtab + fdt_size_dt_strings(fdt); - err = fdt_splice_string_(fdt, len); + err = fdt_splice_string_(fdt, slen + 1); if (err) return err; if (!can_assume(NO_ROLLBACK)) *allocated = 1; - memcpy(new, s, len); + memcpy(new, s, slen); + new[slen] = '\0'; + return (new - strtab); } @@ -182,12 +184,14 @@ int fdt_del_mem_rsv(void *fdt, int n) } static int fdt_resize_property_(void *fdt, int nodeoffset, const char *name, - int len, struct fdt_property **prop) + int namelen, int len, + struct fdt_property **prop) { int oldlen; int err; - *prop = fdt_get_property_w(fdt, nodeoffset, name, &oldlen); + *prop = fdt_get_property_namelen_w(fdt, nodeoffset, name, namelen, + &oldlen); if (!*prop) return oldlen; @@ -200,7 +204,7 @@ static int fdt_resize_property_(void *fdt, int nodeoffset, const char *name, } static int fdt_add_property_(void *fdt, int nodeoffset, const char *name, - int len, struct fdt_property **prop) + int namelen, int len, struct fdt_property **prop) { int proplen; int nextoffset; @@ -211,7 +215,7 @@ static int fdt_add_property_(void *fdt, int nodeoffset, const char *name, if ((nextoffset = fdt_check_node_offset_(fdt, nodeoffset)) < 0) return nextoffset; - namestroff = fdt_find_add_string_(fdt, name, &allocated); + namestroff = fdt_find_add_string_(fdt, name, namelen, &allocated); if (namestroff < 0) return namestroff; @@ -255,17 +259,18 @@ int fdt_set_name(void *fdt, int nodeoffset, const char *name) return 0; } -int fdt_setprop_placeholder(void *fdt, int nodeoffset, const char *name, - int len, void **prop_data) +int fdt_setprop_namelen_placeholder(void *fdt, int nodeoffset, const char *name, + int namelen, int len, void **prop_data) { struct fdt_property *prop; int err; FDT_RW_PROBE(fdt); - err = fdt_resize_property_(fdt, nodeoffset, name, len, &prop); + err = fdt_resize_property_(fdt, nodeoffset, name, namelen, len, &prop); if (err == -FDT_ERR_NOTFOUND) - err = fdt_add_property_(fdt, nodeoffset, name, len, &prop); + err = fdt_add_property_(fdt, nodeoffset, name, namelen, len, + &prop); if (err) return err; @@ -273,13 +278,14 @@ int fdt_setprop_placeholder(void *fdt, int nodeoffset, const char *name, return 0; } -int fdt_setprop(void *fdt, int nodeoffset, const char *name, - const void *val, int len) +int fdt_setprop_namelen(void *fdt, int nodeoffset, const char *name, + int namelen, const void *val, int len) { void *prop_data; int err; - err = fdt_setprop_placeholder(fdt, nodeoffset, name, len, &prop_data); + err = fdt_setprop_namelen_placeholder(fdt, nodeoffset, name, namelen, + len, &prop_data); if (err) return err; @@ -307,7 +313,8 @@ int fdt_appendprop(void *fdt, int nodeoffset, const char *name, prop->len = cpu_to_fdt32(newlen); memcpy(prop->data + oldlen, val, len); } else { - err = fdt_add_property_(fdt, nodeoffset, name, len, &prop); + err = fdt_add_property_(fdt, nodeoffset, name, strlen(name), + len, &prop); if (err) return err; memcpy(prop->data, val, len); diff --git a/libfdt/libfdt.h b/libfdt/libfdt.h index 7d0c252a34970f4ca841935f8088410a3970127a..c9c81f039365b6d244932786a84a05f065e67c33 100644 --- a/libfdt/libfdt.h +++ b/libfdt/libfdt.h @@ -1666,6 +1666,38 @@ int fdt_del_mem_rsv(void *fdt, int n); */ int fdt_set_name(void *fdt, int nodeoffset, const char *name); +/** + * fdt_setprop_namelen - create or change a property + * @fdt: pointer to the device tree blob + * @nodeoffset: offset of the node whose property to change + * @name: name of the property to change + * @namelen: length of the name + * @val: pointer to data to set the property value to + * @len: length of the property value + * + * fdt_setprop_namelen() sets the value of the named property in the given + * node to the given value and length, creating the property if it + * does not already exist. + * + * This function may insert or delete data from the blob, and will + * therefore change the offsets of some existing nodes. + * + * returns: + * 0, on success + * -FDT_ERR_NOSPACE, there is insufficient free space in the blob to + * contain the new property value + * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag + * -FDT_ERR_BADLAYOUT, + * -FDT_ERR_BADMAGIC, + * -FDT_ERR_BADVERSION, + * -FDT_ERR_BADSTATE, + * -FDT_ERR_BADSTRUCTURE, + * -FDT_ERR_BADLAYOUT, + * -FDT_ERR_TRUNCATED, standard meanings + */ +int fdt_setprop_namelen(void *fdt, int nodeoffset, const char *name, + int namelen, const void *val, int len); + /** * fdt_setprop - create or change a property * @fdt: pointer to the device tree blob @@ -1694,8 +1726,44 @@ int fdt_set_name(void *fdt, int nodeoffset, const char *name); * -FDT_ERR_BADLAYOUT, * -FDT_ERR_TRUNCATED, standard meanings */ -int fdt_setprop(void *fdt, int nodeoffset, const char *name, - const void *val, int len); +static inline int fdt_setprop(void *fdt, int nodeoffset, const char *name, + const void *val, int len) +{ + return fdt_setprop_namelen(fdt, nodeoffset, name, strlen(name), val, + len); +} + +/** + * fdt_setprop_namelen_placeholder - allocate space for a property + * @fdt: pointer to the device tree blob + * @nodeoffset: offset of the node whose property to change + * @name: name of the property to change + * @namelen: length of the name + * @len: length of the property value + * @prop_data: return pointer to property data + * + * fdt_setprop_namelen_placeholder() allocates the named property in the given node. + * If the property exists it is resized. In either case a pointer to the + * property data is returned. + * + * This function may insert or delete data from the blob, and will + * therefore change the offsets of some existing nodes. + * + * returns: + * 0, on success + * -FDT_ERR_NOSPACE, there is insufficient free space in the blob to + * contain the new property value + * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag + * -FDT_ERR_BADLAYOUT, + * -FDT_ERR_BADMAGIC, + * -FDT_ERR_BADVERSION, + * -FDT_ERR_BADSTATE, + * -FDT_ERR_BADSTRUCTURE, + * -FDT_ERR_BADLAYOUT, + * -FDT_ERR_TRUNCATED, standard meanings + */ +int fdt_setprop_namelen_placeholder(void *fdt, int nodeoffset, const char *name, + int namelen, int len, void **prop_data); /** * fdt_setprop_placeholder - allocate space for a property @@ -1725,8 +1793,13 @@ int fdt_setprop(void *fdt, int nodeoffset, const char *name, * -FDT_ERR_BADLAYOUT, * -FDT_ERR_TRUNCATED, standard meanings */ -int fdt_setprop_placeholder(void *fdt, int nodeoffset, const char *name, - int len, void **prop_data); +static inline int fdt_setprop_placeholder(void *fdt, int nodeoffset, + const char *name, int len, + void **prop_data) +{ + return fdt_setprop_namelen_placeholder(fdt, nodeoffset, name, + strlen(name), len, prop_data); +} /** * fdt_setprop_u32 - set a property to a 32-bit integer diff --git a/libfdt/version.lds b/libfdt/version.lds index 989cd89f1051ce59255a3b3e60493be4e5e985cc..76ba8f6758cef16efbad2813464e824de594b646 100644 --- a/libfdt/version.lds +++ b/libfdt/version.lds @@ -43,6 +43,7 @@ LIBFDT_1.2 { fdt_add_mem_rsv; fdt_del_mem_rsv; fdt_set_name; + fdt_setprop_namelen; fdt_setprop; fdt_delprop; fdt_add_subnode_namelen; @@ -71,6 +72,7 @@ LIBFDT_1.2 { fdt_find_max_phandle; fdt_generate_phandle; fdt_check_full; + fdt_setprop_namelen_placeholder; fdt_setprop_placeholder; fdt_property_placeholder; fdt_header_size_; -- 2.47.1 ^ permalink raw reply related [flat|nested] 12+ messages in thread
* Re: [PATCH 3/4] libfdt: Add fdt_setprop_namelen() 2024-12-03 18:30 ` [PATCH 3/4] libfdt: Add fdt_setprop_namelen() Ayush Singh @ 2024-12-04 0:29 ` David Gibson 2024-12-04 7:39 ` Ayush Singh 0 siblings, 1 reply; 12+ messages in thread From: David Gibson @ 2024-12-04 0:29 UTC (permalink / raw) To: Ayush Singh Cc: d-gole, lorforlinux, jkridner, robertcnelson, nenad.marinkovic, Andrew Davis, Geert Uytterhoeven, Robert Nelson, devicetree-compiler [-- Attachment #1: Type: text/plain, Size: 10260 bytes --] On Wed, Dec 04, 2024 at 12:00:01AM +0530, Ayush Singh wrote: > Allow specifying name length in setprop similar to > `fdt_get_property_namelen` functions. > > Signed-off-by: Ayush Singh <ayush@beagleboard.org> Two really minor revisions suggested below, otherwise this looks good. > --- > libfdt/fdt_rw.c | 41 +++++++++++++++------------ > libfdt/libfdt.h | 81 +++++++++++++++++++++++++++++++++++++++++++++++++++--- > libfdt/version.lds | 2 ++ > 3 files changed, 103 insertions(+), 21 deletions(-) > > diff --git a/libfdt/fdt_rw.c b/libfdt/fdt_rw.c > index 3621d3651d3f4bd82b7af66c60d023e3139add03..33c60063cd721a147a3c6c0e70450c98d8dbd772 100644 > --- a/libfdt/fdt_rw.c > +++ b/libfdt/fdt_rw.c > @@ -124,31 +124,33 @@ static int fdt_splice_string_(void *fdt, int newlen) > * allocated. Ignored if can_assume(NO_ROLLBACK) > * @return offset of string in the string table (whether found or added) > */ > -static int fdt_find_add_string_(void *fdt, const char *s, int *allocated) > +static int fdt_find_add_string_(void *fdt, const char *s, int slen, > + int *allocated) > { > char *strtab = (char *)fdt + fdt_off_dt_strings(fdt); > const char *p; > char *new; > - int len = strlen(s) + 1; > int err; > > if (!can_assume(NO_ROLLBACK)) > *allocated = 0; > > - p = fdt_find_string_(strtab, fdt_size_dt_strings(fdt), s); > + p = fdt_find_string_len_(strtab, fdt_size_dt_strings(fdt), s, slen); > if (p) > /* found it */ > return (p - strtab); > > new = strtab + fdt_size_dt_strings(fdt); > - err = fdt_splice_string_(fdt, len); > + err = fdt_splice_string_(fdt, slen + 1); > if (err) > return err; > > if (!can_assume(NO_ROLLBACK)) > *allocated = 1; > > - memcpy(new, s, len); > + memcpy(new, s, slen); > + new[slen] = '\0'; > + > return (new - strtab); > } > > @@ -182,12 +184,14 @@ int fdt_del_mem_rsv(void *fdt, int n) > } > > static int fdt_resize_property_(void *fdt, int nodeoffset, const char *name, > - int len, struct fdt_property **prop) > + int namelen, int len, > + struct fdt_property **prop) Nit: I'd prefer to see name and namelen grouped together on a line, then len and prop can go on the next. > { > int oldlen; > int err; > > - *prop = fdt_get_property_w(fdt, nodeoffset, name, &oldlen); > + *prop = fdt_get_property_namelen_w(fdt, nodeoffset, name, namelen, > + &oldlen); > if (!*prop) > return oldlen; > > @@ -200,7 +204,7 @@ static int fdt_resize_property_(void *fdt, int nodeoffset, const char *name, > } > > static int fdt_add_property_(void *fdt, int nodeoffset, const char *name, > - int len, struct fdt_property **prop) > + int namelen, int len, struct fdt_property **prop) > { > int proplen; > int nextoffset; > @@ -211,7 +215,7 @@ static int fdt_add_property_(void *fdt, int nodeoffset, const char *name, > if ((nextoffset = fdt_check_node_offset_(fdt, nodeoffset)) < 0) > return nextoffset; > > - namestroff = fdt_find_add_string_(fdt, name, &allocated); > + namestroff = fdt_find_add_string_(fdt, name, namelen, &allocated); > if (namestroff < 0) > return namestroff; > > @@ -255,17 +259,18 @@ int fdt_set_name(void *fdt, int nodeoffset, const char *name) > return 0; > } > > -int fdt_setprop_placeholder(void *fdt, int nodeoffset, const char *name, > - int len, void **prop_data) > +int fdt_setprop_namelen_placeholder(void *fdt, int nodeoffset, const char *name, > + int namelen, int len, void **prop_data) Sorry, I gave you bad advice in my earlier message. I'd prefer this to be "fdt_setprop_placeholder_namelen()" (compare "fdt_add_subnode_namelen()"). > { > struct fdt_property *prop; > int err; > > FDT_RW_PROBE(fdt); > > - err = fdt_resize_property_(fdt, nodeoffset, name, len, &prop); > + err = fdt_resize_property_(fdt, nodeoffset, name, namelen, len, &prop); > if (err == -FDT_ERR_NOTFOUND) > - err = fdt_add_property_(fdt, nodeoffset, name, len, &prop); > + err = fdt_add_property_(fdt, nodeoffset, name, namelen, len, > + &prop); > if (err) > return err; > > @@ -273,13 +278,14 @@ int fdt_setprop_placeholder(void *fdt, int nodeoffset, const char *name, > return 0; > } > > -int fdt_setprop(void *fdt, int nodeoffset, const char *name, > - const void *val, int len) > +int fdt_setprop_namelen(void *fdt, int nodeoffset, const char *name, > + int namelen, const void *val, int len) > { > void *prop_data; > int err; > > - err = fdt_setprop_placeholder(fdt, nodeoffset, name, len, &prop_data); > + err = fdt_setprop_namelen_placeholder(fdt, nodeoffset, name, namelen, > + len, &prop_data); > if (err) > return err; > > @@ -307,7 +313,8 @@ int fdt_appendprop(void *fdt, int nodeoffset, const char *name, > prop->len = cpu_to_fdt32(newlen); > memcpy(prop->data + oldlen, val, len); > } else { > - err = fdt_add_property_(fdt, nodeoffset, name, len, &prop); > + err = fdt_add_property_(fdt, nodeoffset, name, strlen(name), > + len, &prop); > if (err) > return err; > memcpy(prop->data, val, len); > diff --git a/libfdt/libfdt.h b/libfdt/libfdt.h > index 7d0c252a34970f4ca841935f8088410a3970127a..c9c81f039365b6d244932786a84a05f065e67c33 100644 > --- a/libfdt/libfdt.h > +++ b/libfdt/libfdt.h > @@ -1666,6 +1666,38 @@ int fdt_del_mem_rsv(void *fdt, int n); > */ > int fdt_set_name(void *fdt, int nodeoffset, const char *name); > > +/** > + * fdt_setprop_namelen - create or change a property > + * @fdt: pointer to the device tree blob > + * @nodeoffset: offset of the node whose property to change > + * @name: name of the property to change > + * @namelen: length of the name > + * @val: pointer to data to set the property value to > + * @len: length of the property value > + * > + * fdt_setprop_namelen() sets the value of the named property in the given > + * node to the given value and length, creating the property if it > + * does not already exist. > + * > + * This function may insert or delete data from the blob, and will > + * therefore change the offsets of some existing nodes. > + * > + * returns: > + * 0, on success > + * -FDT_ERR_NOSPACE, there is insufficient free space in the blob to > + * contain the new property value > + * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag > + * -FDT_ERR_BADLAYOUT, > + * -FDT_ERR_BADMAGIC, > + * -FDT_ERR_BADVERSION, > + * -FDT_ERR_BADSTATE, > + * -FDT_ERR_BADSTRUCTURE, > + * -FDT_ERR_BADLAYOUT, > + * -FDT_ERR_TRUNCATED, standard meanings > + */ > +int fdt_setprop_namelen(void *fdt, int nodeoffset, const char *name, > + int namelen, const void *val, int len); > + > /** > * fdt_setprop - create or change a property > * @fdt: pointer to the device tree blob > @@ -1694,8 +1726,44 @@ int fdt_set_name(void *fdt, int nodeoffset, const char *name); > * -FDT_ERR_BADLAYOUT, > * -FDT_ERR_TRUNCATED, standard meanings > */ > -int fdt_setprop(void *fdt, int nodeoffset, const char *name, > - const void *val, int len); > +static inline int fdt_setprop(void *fdt, int nodeoffset, const char *name, > + const void *val, int len) > +{ > + return fdt_setprop_namelen(fdt, nodeoffset, name, strlen(name), val, > + len); > +} > + > +/** > + * fdt_setprop_namelen_placeholder - allocate space for a property > + * @fdt: pointer to the device tree blob > + * @nodeoffset: offset of the node whose property to change > + * @name: name of the property to change > + * @namelen: length of the name > + * @len: length of the property value > + * @prop_data: return pointer to property data > + * > + * fdt_setprop_namelen_placeholder() allocates the named property in the given node. > + * If the property exists it is resized. In either case a pointer to the > + * property data is returned. > + * > + * This function may insert or delete data from the blob, and will > + * therefore change the offsets of some existing nodes. > + * > + * returns: > + * 0, on success > + * -FDT_ERR_NOSPACE, there is insufficient free space in the blob to > + * contain the new property value > + * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag > + * -FDT_ERR_BADLAYOUT, > + * -FDT_ERR_BADMAGIC, > + * -FDT_ERR_BADVERSION, > + * -FDT_ERR_BADSTATE, > + * -FDT_ERR_BADSTRUCTURE, > + * -FDT_ERR_BADLAYOUT, > + * -FDT_ERR_TRUNCATED, standard meanings > + */ > +int fdt_setprop_namelen_placeholder(void *fdt, int nodeoffset, const char *name, > + int namelen, int len, void **prop_data); > > /** > * fdt_setprop_placeholder - allocate space for a property > @@ -1725,8 +1793,13 @@ int fdt_setprop(void *fdt, int nodeoffset, const char *name, > * -FDT_ERR_BADLAYOUT, > * -FDT_ERR_TRUNCATED, standard meanings > */ > -int fdt_setprop_placeholder(void *fdt, int nodeoffset, const char *name, > - int len, void **prop_data); > +static inline int fdt_setprop_placeholder(void *fdt, int nodeoffset, > + const char *name, int len, > + void **prop_data) > +{ > + return fdt_setprop_namelen_placeholder(fdt, nodeoffset, name, > + strlen(name), len, prop_data); > +} > > /** > * fdt_setprop_u32 - set a property to a 32-bit integer > diff --git a/libfdt/version.lds b/libfdt/version.lds > index 989cd89f1051ce59255a3b3e60493be4e5e985cc..76ba8f6758cef16efbad2813464e824de594b646 100644 > --- a/libfdt/version.lds > +++ b/libfdt/version.lds > @@ -43,6 +43,7 @@ LIBFDT_1.2 { > fdt_add_mem_rsv; > fdt_del_mem_rsv; > fdt_set_name; > + fdt_setprop_namelen; > fdt_setprop; > fdt_delprop; > fdt_add_subnode_namelen; > @@ -71,6 +72,7 @@ LIBFDT_1.2 { > fdt_find_max_phandle; > fdt_generate_phandle; > fdt_check_full; > + fdt_setprop_namelen_placeholder; > fdt_setprop_placeholder; > fdt_property_placeholder; > fdt_header_size_; > -- David Gibson (he or they) | 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 #2: signature.asc --] [-- Type: application/pgp-signature, Size: 833 bytes --] ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH 3/4] libfdt: Add fdt_setprop_namelen() 2024-12-04 0:29 ` David Gibson @ 2024-12-04 7:39 ` Ayush Singh 2024-12-04 23:45 ` David Gibson 0 siblings, 1 reply; 12+ messages in thread From: Ayush Singh @ 2024-12-04 7:39 UTC (permalink / raw) To: David Gibson Cc: d-gole, lorforlinux, jkridner, robertcnelson, nenad.marinkovic, Andrew Davis, Geert Uytterhoeven, Robert Nelson, devicetree-compiler On 04/12/24 05:59, David Gibson wrote: > On Wed, Dec 04, 2024 at 12:00:01AM +0530, Ayush Singh wrote: >> Allow specifying name length in setprop similar to >> `fdt_get_property_namelen` functions. >> >> Signed-off-by: Ayush Singh <ayush@beagleboard.org> > > Two really minor revisions suggested below, otherwise this looks good. > >> --- >> libfdt/fdt_rw.c | 41 +++++++++++++++------------ >> libfdt/libfdt.h | 81 +++++++++++++++++++++++++++++++++++++++++++++++++++--- >> libfdt/version.lds | 2 ++ >> 3 files changed, 103 insertions(+), 21 deletions(-) >> >> diff --git a/libfdt/fdt_rw.c b/libfdt/fdt_rw.c >> index 3621d3651d3f4bd82b7af66c60d023e3139add03..33c60063cd721a147a3c6c0e70450c98d8dbd772 100644 >> --- a/libfdt/fdt_rw.c >> +++ b/libfdt/fdt_rw.c >> @@ -124,31 +124,33 @@ static int fdt_splice_string_(void *fdt, int newlen) >> * allocated. Ignored if can_assume(NO_ROLLBACK) >> * @return offset of string in the string table (whether found or added) >> */ >> -static int fdt_find_add_string_(void *fdt, const char *s, int *allocated) >> +static int fdt_find_add_string_(void *fdt, const char *s, int slen, >> + int *allocated) >> { >> char *strtab = (char *)fdt + fdt_off_dt_strings(fdt); >> const char *p; >> char *new; >> - int len = strlen(s) + 1; >> int err; >> >> if (!can_assume(NO_ROLLBACK)) >> *allocated = 0; >> >> - p = fdt_find_string_(strtab, fdt_size_dt_strings(fdt), s); >> + p = fdt_find_string_len_(strtab, fdt_size_dt_strings(fdt), s, slen); >> if (p) >> /* found it */ >> return (p - strtab); >> >> new = strtab + fdt_size_dt_strings(fdt); >> - err = fdt_splice_string_(fdt, len); >> + err = fdt_splice_string_(fdt, slen + 1); >> if (err) >> return err; >> >> if (!can_assume(NO_ROLLBACK)) >> *allocated = 1; >> >> - memcpy(new, s, len); >> + memcpy(new, s, slen); >> + new[slen] = '\0'; >> + >> return (new - strtab); >> } >> >> @@ -182,12 +184,14 @@ int fdt_del_mem_rsv(void *fdt, int n) >> } >> >> static int fdt_resize_property_(void *fdt, int nodeoffset, const char *name, >> - int len, struct fdt_property **prop) >> + int namelen, int len, >> + struct fdt_property **prop) > > Nit: I'd prefer to see name and namelen grouped together on a line, > then len and prop can go on the next. That exceeds 80 column limit. I am fine with 100 column limit to be honest, but well, I would like that limit to apply everywhere (in any new changes), instead of just here. > >> { >> int oldlen; >> int err; >> >> - *prop = fdt_get_property_w(fdt, nodeoffset, name, &oldlen); >> + *prop = fdt_get_property_namelen_w(fdt, nodeoffset, name, namelen, >> + &oldlen); >> if (!*prop) >> return oldlen; >> >> @@ -200,7 +204,7 @@ static int fdt_resize_property_(void *fdt, int nodeoffset, const char *name, >> } >> >> static int fdt_add_property_(void *fdt, int nodeoffset, const char *name, >> - int len, struct fdt_property **prop) >> + int namelen, int len, struct fdt_property **prop) >> { >> int proplen; >> int nextoffset; >> @@ -211,7 +215,7 @@ static int fdt_add_property_(void *fdt, int nodeoffset, const char *name, >> if ((nextoffset = fdt_check_node_offset_(fdt, nodeoffset)) < 0) >> return nextoffset; >> >> - namestroff = fdt_find_add_string_(fdt, name, &allocated); >> + namestroff = fdt_find_add_string_(fdt, name, namelen, &allocated); >> if (namestroff < 0) >> return namestroff; >> >> @@ -255,17 +259,18 @@ int fdt_set_name(void *fdt, int nodeoffset, const char *name) >> return 0; >> } >> >> -int fdt_setprop_placeholder(void *fdt, int nodeoffset, const char *name, >> - int len, void **prop_data) >> +int fdt_setprop_namelen_placeholder(void *fdt, int nodeoffset, const char *name, >> + int namelen, int len, void **prop_data) > > Sorry, I gave you bad advice in my earlier message. I'd prefer this > to be "fdt_setprop_placeholder_namelen()" (compare > "fdt_add_subnode_namelen()"). > >> { >> struct fdt_property *prop; >> int err; >> >> FDT_RW_PROBE(fdt); >> >> - err = fdt_resize_property_(fdt, nodeoffset, name, len, &prop); >> + err = fdt_resize_property_(fdt, nodeoffset, name, namelen, len, &prop); >> if (err == -FDT_ERR_NOTFOUND) >> - err = fdt_add_property_(fdt, nodeoffset, name, len, &prop); >> + err = fdt_add_property_(fdt, nodeoffset, name, namelen, len, >> + &prop); >> if (err) >> return err; >> >> @@ -273,13 +278,14 @@ int fdt_setprop_placeholder(void *fdt, int nodeoffset, const char *name, >> return 0; >> } >> >> -int fdt_setprop(void *fdt, int nodeoffset, const char *name, >> - const void *val, int len) >> +int fdt_setprop_namelen(void *fdt, int nodeoffset, const char *name, >> + int namelen, const void *val, int len) >> { >> void *prop_data; >> int err; >> >> - err = fdt_setprop_placeholder(fdt, nodeoffset, name, len, &prop_data); >> + err = fdt_setprop_namelen_placeholder(fdt, nodeoffset, name, namelen, >> + len, &prop_data); >> if (err) >> return err; >> >> @@ -307,7 +313,8 @@ int fdt_appendprop(void *fdt, int nodeoffset, const char *name, >> prop->len = cpu_to_fdt32(newlen); >> memcpy(prop->data + oldlen, val, len); >> } else { >> - err = fdt_add_property_(fdt, nodeoffset, name, len, &prop); >> + err = fdt_add_property_(fdt, nodeoffset, name, strlen(name), >> + len, &prop); >> if (err) >> return err; >> memcpy(prop->data, val, len); >> diff --git a/libfdt/libfdt.h b/libfdt/libfdt.h >> index 7d0c252a34970f4ca841935f8088410a3970127a..c9c81f039365b6d244932786a84a05f065e67c33 100644 >> --- a/libfdt/libfdt.h >> +++ b/libfdt/libfdt.h >> @@ -1666,6 +1666,38 @@ int fdt_del_mem_rsv(void *fdt, int n); >> */ >> int fdt_set_name(void *fdt, int nodeoffset, const char *name); >> >> +/** >> + * fdt_setprop_namelen - create or change a property >> + * @fdt: pointer to the device tree blob >> + * @nodeoffset: offset of the node whose property to change >> + * @name: name of the property to change >> + * @namelen: length of the name >> + * @val: pointer to data to set the property value to >> + * @len: length of the property value >> + * >> + * fdt_setprop_namelen() sets the value of the named property in the given >> + * node to the given value and length, creating the property if it >> + * does not already exist. >> + * >> + * This function may insert or delete data from the blob, and will >> + * therefore change the offsets of some existing nodes. >> + * >> + * returns: >> + * 0, on success >> + * -FDT_ERR_NOSPACE, there is insufficient free space in the blob to >> + * contain the new property value >> + * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag >> + * -FDT_ERR_BADLAYOUT, >> + * -FDT_ERR_BADMAGIC, >> + * -FDT_ERR_BADVERSION, >> + * -FDT_ERR_BADSTATE, >> + * -FDT_ERR_BADSTRUCTURE, >> + * -FDT_ERR_BADLAYOUT, >> + * -FDT_ERR_TRUNCATED, standard meanings >> + */ >> +int fdt_setprop_namelen(void *fdt, int nodeoffset, const char *name, >> + int namelen, const void *val, int len); >> + >> /** >> * fdt_setprop - create or change a property >> * @fdt: pointer to the device tree blob >> @@ -1694,8 +1726,44 @@ int fdt_set_name(void *fdt, int nodeoffset, const char *name); >> * -FDT_ERR_BADLAYOUT, >> * -FDT_ERR_TRUNCATED, standard meanings >> */ >> -int fdt_setprop(void *fdt, int nodeoffset, const char *name, >> - const void *val, int len); >> +static inline int fdt_setprop(void *fdt, int nodeoffset, const char *name, >> + const void *val, int len) >> +{ >> + return fdt_setprop_namelen(fdt, nodeoffset, name, strlen(name), val, >> + len); >> +} >> + >> +/** >> + * fdt_setprop_namelen_placeholder - allocate space for a property >> + * @fdt: pointer to the device tree blob >> + * @nodeoffset: offset of the node whose property to change >> + * @name: name of the property to change >> + * @namelen: length of the name >> + * @len: length of the property value >> + * @prop_data: return pointer to property data >> + * >> + * fdt_setprop_namelen_placeholder() allocates the named property in the given node. >> + * If the property exists it is resized. In either case a pointer to the >> + * property data is returned. >> + * >> + * This function may insert or delete data from the blob, and will >> + * therefore change the offsets of some existing nodes. >> + * >> + * returns: >> + * 0, on success >> + * -FDT_ERR_NOSPACE, there is insufficient free space in the blob to >> + * contain the new property value >> + * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag >> + * -FDT_ERR_BADLAYOUT, >> + * -FDT_ERR_BADMAGIC, >> + * -FDT_ERR_BADVERSION, >> + * -FDT_ERR_BADSTATE, >> + * -FDT_ERR_BADSTRUCTURE, >> + * -FDT_ERR_BADLAYOUT, >> + * -FDT_ERR_TRUNCATED, standard meanings >> + */ >> +int fdt_setprop_namelen_placeholder(void *fdt, int nodeoffset, const char *name, >> + int namelen, int len, void **prop_data); >> >> /** >> * fdt_setprop_placeholder - allocate space for a property >> @@ -1725,8 +1793,13 @@ int fdt_setprop(void *fdt, int nodeoffset, const char *name, >> * -FDT_ERR_BADLAYOUT, >> * -FDT_ERR_TRUNCATED, standard meanings >> */ >> -int fdt_setprop_placeholder(void *fdt, int nodeoffset, const char *name, >> - int len, void **prop_data); >> +static inline int fdt_setprop_placeholder(void *fdt, int nodeoffset, >> + const char *name, int len, >> + void **prop_data) >> +{ >> + return fdt_setprop_namelen_placeholder(fdt, nodeoffset, name, >> + strlen(name), len, prop_data); >> +} >> >> /** >> * fdt_setprop_u32 - set a property to a 32-bit integer >> diff --git a/libfdt/version.lds b/libfdt/version.lds >> index 989cd89f1051ce59255a3b3e60493be4e5e985cc..76ba8f6758cef16efbad2813464e824de594b646 100644 >> --- a/libfdt/version.lds >> +++ b/libfdt/version.lds >> @@ -43,6 +43,7 @@ LIBFDT_1.2 { >> fdt_add_mem_rsv; >> fdt_del_mem_rsv; >> fdt_set_name; >> + fdt_setprop_namelen; >> fdt_setprop; >> fdt_delprop; >> fdt_add_subnode_namelen; >> @@ -71,6 +72,7 @@ LIBFDT_1.2 { >> fdt_find_max_phandle; >> fdt_generate_phandle; >> fdt_check_full; >> + fdt_setprop_namelen_placeholder; >> fdt_setprop_placeholder; >> fdt_property_placeholder; >> fdt_header_size_; >> > Ayush Singh ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH 3/4] libfdt: Add fdt_setprop_namelen() 2024-12-04 7:39 ` Ayush Singh @ 2024-12-04 23:45 ` David Gibson 0 siblings, 0 replies; 12+ messages in thread From: David Gibson @ 2024-12-04 23:45 UTC (permalink / raw) To: Ayush Singh Cc: d-gole, lorforlinux, jkridner, robertcnelson, nenad.marinkovic, Andrew Davis, Geert Uytterhoeven, Robert Nelson, devicetree-compiler [-- Attachment #1: Type: text/plain, Size: 11836 bytes --] On Wed, Dec 04, 2024 at 01:09:13PM +0530, Ayush Singh wrote: > > > On 04/12/24 05:59, David Gibson wrote: > > On Wed, Dec 04, 2024 at 12:00:01AM +0530, Ayush Singh wrote: > > > Allow specifying name length in setprop similar to > > > `fdt_get_property_namelen` functions. > > > > > > Signed-off-by: Ayush Singh <ayush@beagleboard.org> > > > > Two really minor revisions suggested below, otherwise this looks good. > > > > > --- > > > libfdt/fdt_rw.c | 41 +++++++++++++++------------ > > > libfdt/libfdt.h | 81 +++++++++++++++++++++++++++++++++++++++++++++++++++--- > > > libfdt/version.lds | 2 ++ > > > 3 files changed, 103 insertions(+), 21 deletions(-) > > > > > > diff --git a/libfdt/fdt_rw.c b/libfdt/fdt_rw.c > > > index 3621d3651d3f4bd82b7af66c60d023e3139add03..33c60063cd721a147a3c6c0e70450c98d8dbd772 100644 > > > --- a/libfdt/fdt_rw.c > > > +++ b/libfdt/fdt_rw.c > > > @@ -124,31 +124,33 @@ static int fdt_splice_string_(void *fdt, int newlen) > > > * allocated. Ignored if can_assume(NO_ROLLBACK) > > > * @return offset of string in the string table (whether found or added) > > > */ > > > -static int fdt_find_add_string_(void *fdt, const char *s, int *allocated) > > > +static int fdt_find_add_string_(void *fdt, const char *s, int slen, > > > + int *allocated) > > > { > > > char *strtab = (char *)fdt + fdt_off_dt_strings(fdt); > > > const char *p; > > > char *new; > > > - int len = strlen(s) + 1; > > > int err; > > > if (!can_assume(NO_ROLLBACK)) > > > *allocated = 0; > > > - p = fdt_find_string_(strtab, fdt_size_dt_strings(fdt), s); > > > + p = fdt_find_string_len_(strtab, fdt_size_dt_strings(fdt), s, slen); > > > if (p) > > > /* found it */ > > > return (p - strtab); > > > new = strtab + fdt_size_dt_strings(fdt); > > > - err = fdt_splice_string_(fdt, len); > > > + err = fdt_splice_string_(fdt, slen + 1); > > > if (err) > > > return err; > > > if (!can_assume(NO_ROLLBACK)) > > > *allocated = 1; > > > - memcpy(new, s, len); > > > + memcpy(new, s, slen); > > > + new[slen] = '\0'; > > > + > > > return (new - strtab); > > > } > > > @@ -182,12 +184,14 @@ int fdt_del_mem_rsv(void *fdt, int n) > > > } > > > static int fdt_resize_property_(void *fdt, int nodeoffset, const char *name, > > > - int len, struct fdt_property **prop) > > > + int namelen, int len, > > > + struct fdt_property **prop) > > > > Nit: I'd prefer to see name and namelen grouped together on a line, > > then len and prop can go on the next. > > That exceeds 80 column limit. I am fine with 100 column limit to be honest, > but well, I would like that limit to apply everywhere (in any new changes), > instead of just here. Sorry, I was unclear. I meant: static int fdt_resize_property_(void *fdt, int nodeoffset, const char *name, int namelen, int len, struct fdt_property **prop) > > > > > > { > > > int oldlen; > > > int err; > > > - *prop = fdt_get_property_w(fdt, nodeoffset, name, &oldlen); > > > + *prop = fdt_get_property_namelen_w(fdt, nodeoffset, name, namelen, > > > + &oldlen); > > > if (!*prop) > > > return oldlen; > > > @@ -200,7 +204,7 @@ static int fdt_resize_property_(void *fdt, int nodeoffset, const char *name, > > > } > > > static int fdt_add_property_(void *fdt, int nodeoffset, const char *name, > > > - int len, struct fdt_property **prop) > > > + int namelen, int len, struct fdt_property **prop) > > > { > > > int proplen; > > > int nextoffset; > > > @@ -211,7 +215,7 @@ static int fdt_add_property_(void *fdt, int nodeoffset, const char *name, > > > if ((nextoffset = fdt_check_node_offset_(fdt, nodeoffset)) < 0) > > > return nextoffset; > > > - namestroff = fdt_find_add_string_(fdt, name, &allocated); > > > + namestroff = fdt_find_add_string_(fdt, name, namelen, &allocated); > > > if (namestroff < 0) > > > return namestroff; > > > @@ -255,17 +259,18 @@ int fdt_set_name(void *fdt, int nodeoffset, const char *name) > > > return 0; > > > } > > > -int fdt_setprop_placeholder(void *fdt, int nodeoffset, const char *name, > > > - int len, void **prop_data) > > > +int fdt_setprop_namelen_placeholder(void *fdt, int nodeoffset, const char *name, > > > + int namelen, int len, void **prop_data) > > > > Sorry, I gave you bad advice in my earlier message. I'd prefer this > > to be "fdt_setprop_placeholder_namelen()" (compare > > "fdt_add_subnode_namelen()"). > > > > > { > > > struct fdt_property *prop; > > > int err; > > > FDT_RW_PROBE(fdt); > > > - err = fdt_resize_property_(fdt, nodeoffset, name, len, &prop); > > > + err = fdt_resize_property_(fdt, nodeoffset, name, namelen, len, &prop); > > > if (err == -FDT_ERR_NOTFOUND) > > > - err = fdt_add_property_(fdt, nodeoffset, name, len, &prop); > > > + err = fdt_add_property_(fdt, nodeoffset, name, namelen, len, > > > + &prop); > > > if (err) > > > return err; > > > @@ -273,13 +278,14 @@ int fdt_setprop_placeholder(void *fdt, int nodeoffset, const char *name, > > > return 0; > > > } > > > -int fdt_setprop(void *fdt, int nodeoffset, const char *name, > > > - const void *val, int len) > > > +int fdt_setprop_namelen(void *fdt, int nodeoffset, const char *name, > > > + int namelen, const void *val, int len) > > > { > > > void *prop_data; > > > int err; > > > - err = fdt_setprop_placeholder(fdt, nodeoffset, name, len, &prop_data); > > > + err = fdt_setprop_namelen_placeholder(fdt, nodeoffset, name, namelen, > > > + len, &prop_data); > > > if (err) > > > return err; > > > @@ -307,7 +313,8 @@ int fdt_appendprop(void *fdt, int nodeoffset, const char *name, > > > prop->len = cpu_to_fdt32(newlen); > > > memcpy(prop->data + oldlen, val, len); > > > } else { > > > - err = fdt_add_property_(fdt, nodeoffset, name, len, &prop); > > > + err = fdt_add_property_(fdt, nodeoffset, name, strlen(name), > > > + len, &prop); > > > if (err) > > > return err; > > > memcpy(prop->data, val, len); > > > diff --git a/libfdt/libfdt.h b/libfdt/libfdt.h > > > index 7d0c252a34970f4ca841935f8088410a3970127a..c9c81f039365b6d244932786a84a05f065e67c33 100644 > > > --- a/libfdt/libfdt.h > > > +++ b/libfdt/libfdt.h > > > @@ -1666,6 +1666,38 @@ int fdt_del_mem_rsv(void *fdt, int n); > > > */ > > > int fdt_set_name(void *fdt, int nodeoffset, const char *name); > > > +/** > > > + * fdt_setprop_namelen - create or change a property > > > + * @fdt: pointer to the device tree blob > > > + * @nodeoffset: offset of the node whose property to change > > > + * @name: name of the property to change > > > + * @namelen: length of the name > > > + * @val: pointer to data to set the property value to > > > + * @len: length of the property value > > > + * > > > + * fdt_setprop_namelen() sets the value of the named property in the given > > > + * node to the given value and length, creating the property if it > > > + * does not already exist. > > > + * > > > + * This function may insert or delete data from the blob, and will > > > + * therefore change the offsets of some existing nodes. > > > + * > > > + * returns: > > > + * 0, on success > > > + * -FDT_ERR_NOSPACE, there is insufficient free space in the blob to > > > + * contain the new property value > > > + * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag > > > + * -FDT_ERR_BADLAYOUT, > > > + * -FDT_ERR_BADMAGIC, > > > + * -FDT_ERR_BADVERSION, > > > + * -FDT_ERR_BADSTATE, > > > + * -FDT_ERR_BADSTRUCTURE, > > > + * -FDT_ERR_BADLAYOUT, > > > + * -FDT_ERR_TRUNCATED, standard meanings > > > + */ > > > +int fdt_setprop_namelen(void *fdt, int nodeoffset, const char *name, > > > + int namelen, const void *val, int len); > > > + > > > /** > > > * fdt_setprop - create or change a property > > > * @fdt: pointer to the device tree blob > > > @@ -1694,8 +1726,44 @@ int fdt_set_name(void *fdt, int nodeoffset, const char *name); > > > * -FDT_ERR_BADLAYOUT, > > > * -FDT_ERR_TRUNCATED, standard meanings > > > */ > > > -int fdt_setprop(void *fdt, int nodeoffset, const char *name, > > > - const void *val, int len); > > > +static inline int fdt_setprop(void *fdt, int nodeoffset, const char *name, > > > + const void *val, int len) > > > +{ > > > + return fdt_setprop_namelen(fdt, nodeoffset, name, strlen(name), val, > > > + len); > > > +} > > > + > > > +/** > > > + * fdt_setprop_namelen_placeholder - allocate space for a property > > > + * @fdt: pointer to the device tree blob > > > + * @nodeoffset: offset of the node whose property to change > > > + * @name: name of the property to change > > > + * @namelen: length of the name > > > + * @len: length of the property value > > > + * @prop_data: return pointer to property data > > > + * > > > + * fdt_setprop_namelen_placeholder() allocates the named property in the given node. > > > + * If the property exists it is resized. In either case a pointer to the > > > + * property data is returned. > > > + * > > > + * This function may insert or delete data from the blob, and will > > > + * therefore change the offsets of some existing nodes. > > > + * > > > + * returns: > > > + * 0, on success > > > + * -FDT_ERR_NOSPACE, there is insufficient free space in the blob to > > > + * contain the new property value > > > + * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag > > > + * -FDT_ERR_BADLAYOUT, > > > + * -FDT_ERR_BADMAGIC, > > > + * -FDT_ERR_BADVERSION, > > > + * -FDT_ERR_BADSTATE, > > > + * -FDT_ERR_BADSTRUCTURE, > > > + * -FDT_ERR_BADLAYOUT, > > > + * -FDT_ERR_TRUNCATED, standard meanings > > > + */ > > > +int fdt_setprop_namelen_placeholder(void *fdt, int nodeoffset, const char *name, > > > + int namelen, int len, void **prop_data); > > > /** > > > * fdt_setprop_placeholder - allocate space for a property > > > @@ -1725,8 +1793,13 @@ int fdt_setprop(void *fdt, int nodeoffset, const char *name, > > > * -FDT_ERR_BADLAYOUT, > > > * -FDT_ERR_TRUNCATED, standard meanings > > > */ > > > -int fdt_setprop_placeholder(void *fdt, int nodeoffset, const char *name, > > > - int len, void **prop_data); > > > +static inline int fdt_setprop_placeholder(void *fdt, int nodeoffset, > > > + const char *name, int len, > > > + void **prop_data) > > > +{ > > > + return fdt_setprop_namelen_placeholder(fdt, nodeoffset, name, > > > + strlen(name), len, prop_data); > > > +} > > > /** > > > * fdt_setprop_u32 - set a property to a 32-bit integer > > > diff --git a/libfdt/version.lds b/libfdt/version.lds > > > index 989cd89f1051ce59255a3b3e60493be4e5e985cc..76ba8f6758cef16efbad2813464e824de594b646 100644 > > > --- a/libfdt/version.lds > > > +++ b/libfdt/version.lds > > > @@ -43,6 +43,7 @@ LIBFDT_1.2 { > > > fdt_add_mem_rsv; > > > fdt_del_mem_rsv; > > > fdt_set_name; > > > + fdt_setprop_namelen; > > > fdt_setprop; > > > fdt_delprop; > > > fdt_add_subnode_namelen; > > > @@ -71,6 +72,7 @@ LIBFDT_1.2 { > > > fdt_find_max_phandle; > > > fdt_generate_phandle; > > > fdt_check_full; > > > + fdt_setprop_namelen_placeholder; > > > fdt_setprop_placeholder; > > > fdt_property_placeholder; > > > fdt_header_size_; > > > > > > > Ayush Singh > > -- David Gibson (he or they) | 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 #2: signature.asc --] [-- Type: application/pgp-signature, Size: 833 bytes --] ^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH 4/4] libfdt: Add fdt_setprop_namelen_string() 2024-12-03 18:29 [PATCH 0/4] libfdt: Add namelen variants for setprop Ayush Singh ` (2 preceding siblings ...) 2024-12-03 18:30 ` [PATCH 3/4] libfdt: Add fdt_setprop_namelen() Ayush Singh @ 2024-12-03 18:30 ` Ayush Singh 2024-12-04 0:32 ` David Gibson 2024-12-04 0:34 ` [PATCH 0/4] libfdt: Add namelen variants for setprop David Gibson 4 siblings, 1 reply; 12+ messages in thread From: Ayush Singh @ 2024-12-03 18:30 UTC (permalink / raw) To: d-gole, lorforlinux, jkridner, robertcnelson, nenad.marinkovic, Andrew Davis, Geert Uytterhoeven, Robert Nelson, David Gibson Cc: devicetree-compiler, Ayush Singh Macro using fdt_setprop_namelen() internally similar to `fdt_setprop_string()`. Signed-off-by: Ayush Singh <ayush@beagleboard.org> --- libfdt/libfdt.h | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/libfdt/libfdt.h b/libfdt/libfdt.h index c9c81f039365b6d244932786a84a05f065e67c33..5c79c7150d196062246319735b36a6111978ad56 100644 --- a/libfdt/libfdt.h +++ b/libfdt/libfdt.h @@ -1919,6 +1919,38 @@ static inline int fdt_setprop_cell(void *fdt, int nodeoffset, const char *name, #define fdt_setprop_string(fdt, nodeoffset, name, str) \ fdt_setprop((fdt), (nodeoffset), (name), (str), strlen(str)+1) +/** + * fdt_setprop_namelen_string - set a property to a string value + * @fdt: pointer to the device tree blob + * @nodeoffset: offset of the node whose property to change + * @name: name of the property to change + * @namelen: number of characters of name to consider + * @str: string value for the property + * + * fdt_setprop_namelen_string() sets the value of the named property in the + * given node to the given string value (using the length of the + * string to determine the new length of the property), or creates a + * new property with that value if it does not already exist. + * + * This function may insert or delete data from the blob, and will + * therefore change the offsets of some existing nodes. + * + * returns: + * 0, on success + * -FDT_ERR_NOSPACE, there is insufficient free space in the blob to + * contain the new property value + * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag + * -FDT_ERR_BADLAYOUT, + * -FDT_ERR_BADMAGIC, + * -FDT_ERR_BADVERSION, + * -FDT_ERR_BADSTATE, + * -FDT_ERR_BADSTRUCTURE, + * -FDT_ERR_BADLAYOUT, + * -FDT_ERR_TRUNCATED, standard meanings + */ +#define fdt_setprop_namelen_string(fdt, nodeoffset, name, namelen, str) \ + fdt_setprop_namelen((fdt), (nodeoffset), (name), (namelen), (str), \ + strlen(str) + 1) /** * fdt_setprop_empty - set a property to an empty value -- 2.47.1 ^ permalink raw reply related [flat|nested] 12+ messages in thread
* Re: [PATCH 4/4] libfdt: Add fdt_setprop_namelen_string() 2024-12-03 18:30 ` [PATCH 4/4] libfdt: Add fdt_setprop_namelen_string() Ayush Singh @ 2024-12-04 0:32 ` David Gibson 0 siblings, 0 replies; 12+ messages in thread From: David Gibson @ 2024-12-04 0:32 UTC (permalink / raw) To: Ayush Singh Cc: d-gole, lorforlinux, jkridner, robertcnelson, nenad.marinkovic, Andrew Davis, Geert Uytterhoeven, Robert Nelson, devicetree-compiler [-- Attachment #1: Type: text/plain, Size: 2482 bytes --] On Wed, Dec 04, 2024 at 12:00:02AM +0530, Ayush Singh wrote: > Macro using fdt_setprop_namelen() internally similar to > `fdt_setprop_string()`. > > Signed-off-by: Ayush Singh <ayush@beagleboard.org> Reviewed-by: David Gibson <david@gibson.dropbear.id.au> > --- > libfdt/libfdt.h | 32 ++++++++++++++++++++++++++++++++ > 1 file changed, 32 insertions(+) > > diff --git a/libfdt/libfdt.h b/libfdt/libfdt.h > index c9c81f039365b6d244932786a84a05f065e67c33..5c79c7150d196062246319735b36a6111978ad56 100644 > --- a/libfdt/libfdt.h > +++ b/libfdt/libfdt.h > @@ -1919,6 +1919,38 @@ static inline int fdt_setprop_cell(void *fdt, int nodeoffset, const char *name, > #define fdt_setprop_string(fdt, nodeoffset, name, str) \ > fdt_setprop((fdt), (nodeoffset), (name), (str), strlen(str)+1) > > +/** > + * fdt_setprop_namelen_string - set a property to a string value > + * @fdt: pointer to the device tree blob > + * @nodeoffset: offset of the node whose property to change > + * @name: name of the property to change > + * @namelen: number of characters of name to consider > + * @str: string value for the property > + * > + * fdt_setprop_namelen_string() sets the value of the named property in the > + * given node to the given string value (using the length of the > + * string to determine the new length of the property), or creates a > + * new property with that value if it does not already exist. > + * > + * This function may insert or delete data from the blob, and will > + * therefore change the offsets of some existing nodes. > + * > + * returns: > + * 0, on success > + * -FDT_ERR_NOSPACE, there is insufficient free space in the blob to > + * contain the new property value > + * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag > + * -FDT_ERR_BADLAYOUT, > + * -FDT_ERR_BADMAGIC, > + * -FDT_ERR_BADVERSION, > + * -FDT_ERR_BADSTATE, > + * -FDT_ERR_BADSTRUCTURE, > + * -FDT_ERR_BADLAYOUT, > + * -FDT_ERR_TRUNCATED, standard meanings > + */ > +#define fdt_setprop_namelen_string(fdt, nodeoffset, name, namelen, str) \ > + fdt_setprop_namelen((fdt), (nodeoffset), (name), (namelen), (str), \ > + strlen(str) + 1) > > /** > * fdt_setprop_empty - set a property to an empty value > -- David Gibson (he or they) | 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 #2: signature.asc --] [-- Type: application/pgp-signature, Size: 833 bytes --] ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH 0/4] libfdt: Add namelen variants for setprop 2024-12-03 18:29 [PATCH 0/4] libfdt: Add namelen variants for setprop Ayush Singh ` (3 preceding siblings ...) 2024-12-03 18:30 ` [PATCH 4/4] libfdt: Add fdt_setprop_namelen_string() Ayush Singh @ 2024-12-04 0:34 ` David Gibson 4 siblings, 0 replies; 12+ messages in thread From: David Gibson @ 2024-12-04 0:34 UTC (permalink / raw) To: Ayush Singh Cc: d-gole, lorforlinux, jkridner, robertcnelson, nenad.marinkovic, Andrew Davis, Geert Uytterhoeven, Robert Nelson, devicetree-compiler [-- Attachment #1: Type: text/plain, Size: 1433 bytes --] On Tue, Dec 03, 2024 at 11:59:58PM +0530, Ayush Singh wrote: > Helper functions to setproperty with length of property name similar to > getprop_namelen variants. > > This patch series was originally part of overlay-path patch series [0]. > > [0]: https://lore.kernel.org/devicetree-compiler/6b2dba90-3c52-4933-88f3-b47f96dc7710@beagleboard.org/T/#t > > Signed-off-by: Ayush Singh <ayush@beagleboard.org> Thanks for responding to the earlier review so quickly. There are a couple of tiny things to fix in 3/4, otherwise this looks good to go. > > --- > Ayush Singh (4): > libfdt: add fdt_get_property_namelen_w() > libfdt_internal: fdt_find_string_len_() > libfdt: Add fdt_setprop_namelen() > libfdt: Add fdt_setprop_namelen_string() > > libfdt/fdt.c | 8 ++-- > libfdt/fdt_rw.c | 41 +++++++++------- > libfdt/libfdt.h | 120 +++++++++++++++++++++++++++++++++++++++++++++-- > libfdt/libfdt_internal.h | 11 ++++- > libfdt/version.lds | 2 + > 5 files changed, 156 insertions(+), 26 deletions(-) > --- > base-commit: 6f183c7d9246bde8f05d2edbc31fdd497c4a8702 > change-id: 20241203-setprop-namelen-a94f7f057acf > > Best regards, -- David Gibson (he or they) | 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 #2: signature.asc --] [-- Type: application/pgp-signature, Size: 833 bytes --] ^ permalink raw reply [flat|nested] 12+ messages in thread
end of thread, other threads:[~2024-12-04 23:45 UTC | newest] Thread overview: 12+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2024-12-03 18:29 [PATCH 0/4] libfdt: Add namelen variants for setprop Ayush Singh 2024-12-03 18:29 ` [PATCH 1/4] libfdt: add fdt_get_property_namelen_w() Ayush Singh 2024-12-04 0:21 ` David Gibson 2024-12-03 18:30 ` [PATCH 2/4] libfdt_internal: fdt_find_string_len_() Ayush Singh 2024-12-04 0:22 ` David Gibson 2024-12-03 18:30 ` [PATCH 3/4] libfdt: Add fdt_setprop_namelen() Ayush Singh 2024-12-04 0:29 ` David Gibson 2024-12-04 7:39 ` Ayush Singh 2024-12-04 23:45 ` David Gibson 2024-12-03 18:30 ` [PATCH 4/4] libfdt: Add fdt_setprop_namelen_string() Ayush Singh 2024-12-04 0:32 ` David Gibson 2024-12-04 0:34 ` [PATCH 0/4] libfdt: Add namelen variants for setprop David Gibson
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).