From: Simon Glass <sjg@chromium.org>
To: Ayush Singh <ayush@beagleboard.org>
Cc: lorforlinux@beagleboard.org, jkridner@beagleboard.org,
robertcnelson@beagleboard.org, nenad.marinkovic@mikroe.com,
Andrew Davis <afd@ti.com>,
Geert Uytterhoeven <geert@linux-m68k.org>,
Robert Nelson <robertcnelson@gmail.com>,
devicetree-compiler@vger.kernel.org
Subject: Re: [PATCH 1/2] dtc: Add /append-property/
Date: Thu, 29 Aug 2024 08:04:58 -0600 [thread overview]
Message-ID: <CAFLszTiTcuLTeidpaXOpecf9nKtHuKf2qFc0thWXXoVHpyRsOQ@mail.gmail.com> (raw)
In-Reply-To: <20240827-append-v1-1-d7a126ef1be3@beagleboard.org>
Hi Ayush,
On Tue, 27 Aug 2024 at 11:55, Ayush Singh <ayush@beagleboard.org> wrote:
>
> Allow appending values to a property instead of overriding the previous
> values of property.
>
> Currently, we have /delete-node/ and /delete-property/, but lack
> /append-property/. Hence we end up having to repeat all existing values
> when appending to a property (e.g. see [1] appending to clocks from
> [2]).
>
> This functionality is also important for creating a device tree based
> implementation to support different types of addon-boards such as
> mikroBUS, Grove [3], etc.
>
> [3] https://lore.kernel.org/linux-arm-kernel/20240702164403.29067-1-afd@ti.com/
> [2] https://elixir.bootlin.com/linux/latest/source/arch/arm64/boot/dts/renesas/r8a77951-salvator-xs.dts#L39
> [1] https://elixir.bootlin.com/linux/latest/source/arch/arm64/boot/dts/renesas/r8a77951.dtsi#L3334
>
> Signed-off-by: Ayush Singh <ayush@beagleboard.org>
> ---
> dtc-lexer.l | 7 +++++++
> dtc-parser.y | 6 ++++++
> dtc.h | 3 +++
> livetree.c | 30 +++++++++++++++++++++++++-----
> 4 files changed, 41 insertions(+), 5 deletions(-)
Reviewed-by: Simon Glass <sjg@chromium.org>
nits below
>
> diff --git a/dtc-lexer.l b/dtc-lexer.l
> index de60a70..5da4ca5 100644
> --- a/dtc-lexer.l
> +++ b/dtc-lexer.l
> @@ -137,6 +137,13 @@ static void PRINTF(1, 2) lexical_error(const char *fmt, ...);
> return DT_DEL_NODE;
> }
>
> +<*>"/append-property/" {
> + DPRINT("Keyword: /append-property/\n");
> + DPRINT("<PROPNODENAME>\n");
> + BEGIN(PROPNODENAME);
> + return DT_APP_PROP;
> + }
> +
> <*>"/omit-if-no-ref/" {
> DPRINT("Keyword: /omit-if-no-ref/\n");
> DPRINT("<PROPNODENAME>\n");
> diff --git a/dtc-parser.y b/dtc-parser.y
> index 4d5eece..94ce405 100644
> --- a/dtc-parser.y
> +++ b/dtc-parser.y
> @@ -58,6 +58,7 @@ static bool is_ref_relative(const char *ref)
> %token DT_BITS
> %token DT_DEL_PROP
> %token DT_DEL_NODE
> +%token DT_APP_PROP
> %token DT_OMIT_NO_REF
> %token <propnodename> DT_PROPNODENAME
> %token <integer> DT_LITERAL
> @@ -296,6 +297,11 @@ propdef:
> $$ = build_property_delete($2);
> free($2);
> }
> + | DT_APP_PROP DT_PROPNODENAME '=' propdata ';'
> + {
> + $$ = build_property_append($2, $4, &@$);
> + free($2);
> + }
> | DT_LABEL propdef
> {
> add_label(&$2->labels, $1);
> diff --git a/dtc.h b/dtc.h
> index 4c4aaca..06771c5 100644
> --- a/dtc.h
> +++ b/dtc.h
> @@ -205,6 +205,7 @@ struct bus_type {
>
> struct property {
> bool deleted;
> + bool append;
Can you add a comment as to what this means?
> char *name;
> struct data val;
>
> @@ -263,6 +264,8 @@ void delete_labels(struct label **labels);
> struct property *build_property(const char *name, struct data val,
> struct srcpos *srcpos);
> struct property *build_property_delete(const char *name);
> +struct property *build_property_append(const char *name, struct data val,
> + struct srcpos *srcpos);
> struct property *chain_property(struct property *first, struct property *list);
> struct property *reverse_properties(struct property *first);
>
> diff --git a/livetree.c b/livetree.c
> index 49f7230..74eca1b 100644
> --- a/livetree.c
> +++ b/livetree.c
> @@ -62,6 +62,20 @@ struct property *build_property_delete(const char *name)
> return new;
> }
>
> +struct property *build_property_append(const char *name, struct data val,
> + struct srcpos *srcpos)
> +{
> + struct property *new = xmalloc(sizeof(*new));
> +
> + memset(new, 0, sizeof(*new));
> + new->name = xstrdup(name);
> + new->append = true;
> + new->val = val;
> + new->srcpos = srcpos_copy(srcpos);
> +
> + return new;
> +}
> +
> struct property *chain_property(struct property *first, struct property *list)
> {
> assert(first->next == NULL);
> @@ -151,8 +165,8 @@ struct node *merge_nodes(struct node *old_node, struct node *new_node)
> for_each_label_withdel(new_node->labels, l)
> add_label(&old_node->labels, l->label);
>
> - /* Move properties from the new node to the old node. If there
> - * is a collision, replace the old value with the new */
> + /* Move properties from the new node to the old node. If there
> + * is a collision, replace/append the old value with the new */
> while (new_node->proplist) {
> /* Pop the property off the list */
> new_prop = new_node->proplist;
> @@ -165,15 +179,21 @@ struct node *merge_nodes(struct node *old_node, struct node *new_node)
> continue;
> }
>
> - /* Look for a collision, set new value if there is */
> + /* Look for a collision, set new value/append if there is */
> for_each_property_withdel(old_node, old_prop) {
> if (streq(old_prop->name, new_prop->name)) {
> /* Add new labels to old property */
> for_each_label_withdel(new_prop->labels, l)
> add_label(&old_prop->labels, l->label);
>
> - old_prop->val = new_prop->val;
> - old_prop->deleted = 0;
> + if (new_prop->append) {
> + old_prop->val = data_merge(old_prop->val, new_prop->val);
> + } else {
> + old_prop->val = new_prop->val;
> + }
Braces are not needed here.
> +
> + old_prop->deleted = false;
> + old_prop->append = false;
> free(old_prop->srcpos);
> old_prop->srcpos = new_prop->srcpos;
> free(new_prop);
>
> --
> 2.46.0
>
>
Regards,
Simon
next prev parent reply other threads:[~2024-08-29 14:05 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-08-27 17:54 [PATCH 0/2] Add capability to append to property Ayush Singh
2024-08-27 17:54 ` [PATCH 1/2] dtc: Add /append-property/ Ayush Singh
2024-08-29 14:04 ` Simon Glass [this message]
2024-08-27 17:54 ` [PATCH 2/2] tests: Add test for append-property Ayush Singh
2024-08-29 14:04 ` Simon Glass
2024-08-29 14:17 ` Ayush Singh
2024-08-29 15:00 ` Simon Glass
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=CAFLszTiTcuLTeidpaXOpecf9nKtHuKf2qFc0thWXXoVHpyRsOQ@mail.gmail.com \
--to=sjg@chromium.org \
--cc=afd@ti.com \
--cc=ayush@beagleboard.org \
--cc=devicetree-compiler@vger.kernel.org \
--cc=geert@linux-m68k.org \
--cc=jkridner@beagleboard.org \
--cc=lorforlinux@beagleboard.org \
--cc=nenad.marinkovic@mikroe.com \
--cc=robertcnelson@beagleboard.org \
--cc=robertcnelson@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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).