[PATCH 6/7] of: overlay: Add support for the export symbols node

From: Herve Codina
Date: Mon Dec 09 2024 - 10:21:28 EST


The resolver already supports the use of the export symbol node.

Add support of the export symbol node feature in of_overlay_fdt_apply()
simply getting the export node from its name and passing it to the
resolver.

Signed-off-by: Herve Codina <herve.codina@xxxxxxxxxxx>
---
drivers/of/overlay.c | 23 ++++++++++++++++++++---
1 file changed, 20 insertions(+), 3 deletions(-)

diff --git a/drivers/of/overlay.c b/drivers/of/overlay.c
index 9bceeed45c9f..b69245a50746 100644
--- a/drivers/of/overlay.c
+++ b/drivers/of/overlay.c
@@ -887,6 +887,10 @@ static void free_overlay_changeset(struct overlay_changeset *ovcs)
* of_overlay_apply() - Create and apply an overlay changeset
* @ovcs: overlay changeset
* @base: point to the target node to apply overlay
+ * @export_symbols_name:
+ * Name of the export symbol subnode of the @base node to
+ * provide extra symbols. Those extra symbols are used in
+ * the overlay symbols resolution.
*
* Creates and applies an overlay changeset.
*
@@ -911,11 +915,24 @@ static void free_overlay_changeset(struct overlay_changeset *ovcs)
*/

static int of_overlay_apply(struct overlay_changeset *ovcs,
- const struct device_node *base)
+ const struct device_node *base,
+ const char *export_symbols_name)
{
+ struct device_node *export_symbols = NULL;
int ret = 0, ret_revert, ret_tmp;

- ret = of_resolve_phandles(ovcs->overlay_root, NULL);
+ if (base && export_symbols_name) {
+ export_symbols = of_get_child_by_name(base, export_symbols_name);
+ if (!export_symbols) {
+ pr_err("overlay get export symbols '%s' from %pOF failed\n",
+ export_symbols_name, base);
+ ret = -EINVAL;
+ goto out;
+ }
+ }
+
+ ret = of_resolve_phandles(ovcs->overlay_root, export_symbols);
+ of_node_put(export_symbols);
if (ret)
goto out;

@@ -1055,7 +1072,7 @@ int of_overlay_fdt_apply(const void *overlay_fdt, u32 overlay_fdt_size,
}
ovcs->overlay_mem = overlay_mem;

- ret = of_overlay_apply(ovcs, base);
+ ret = of_overlay_apply(ovcs, base, export_symbols_name);
/*
* If of_overlay_apply() error, calling free_overlay_changeset() may
* result in a memory leak if the apply partly succeeded, so do NOT
--
2.47.0