diff mbox series

[v2,1/2] fdtdec: support multiple phandles in memory carveout

Message ID 20200403104304.32616-2-laurentiu.tudor@nxp.com
State Superseded
Headers show
Series fdtdec: support multiple phandles in memory carveout | expand

Commit Message

Laurentiu Tudor April 3, 2020, 10:43 a.m. UTC
fdtdec_set_carveout() is limited to only one phandle. Fix this
limitation by adding support for multiple phandles.

Signed-off-by: Laurentiu Tudor <laurentiu.tudor at nxp.com>
---
 lib/fdtdec.c | 36 ++++++++++++++++++++++++++----------
 1 file changed, 26 insertions(+), 10 deletions(-)

Comments

Simon Glass April 8, 2020, 2:57 a.m. UTC | #1
On Fri, 3 Apr 2020 at 04:43, Laurentiu Tudor <laurentiu.tudor at nxp.com> wrote:
>
> fdtdec_set_carveout() is limited to only one phandle. Fix this
> limitation by adding support for multiple phandles.
>
> Signed-off-by: Laurentiu Tudor <laurentiu.tudor at nxp.com>
> ---
>  lib/fdtdec.c | 36 ++++++++++++++++++++++++++----------
>  1 file changed, 26 insertions(+), 10 deletions(-)

Reviewed-by: Simon Glass <sjg at chromium.org>
Simon Glass April 10, 2020, 7:31 p.m. UTC | #2
On Fri, 3 Apr 2020 at 04:43, Laurentiu Tudor <laurentiu.tudor at nxp.com> wrote:
>
> fdtdec_set_carveout() is limited to only one phandle. Fix this
> limitation by adding support for multiple phandles.
>
> Signed-off-by: Laurentiu Tudor <laurentiu.tudor at nxp.com>
> ---
>  lib/fdtdec.c | 36 ++++++++++++++++++++++++++----------
>  1 file changed, 26 insertions(+), 10 deletions(-)

Reviewed-by: Simon Glass <sjg at chromium.org>

Applied to u-boot-dm/next, thanks!
diff mbox series

Patch

diff --git a/lib/fdtdec.c b/lib/fdtdec.c
index eb11fc898e..9ecfa2a2d7 100644
--- a/lib/fdtdec.c
+++ b/lib/fdtdec.c
@@ -1433,14 +1433,9 @@  int fdtdec_set_carveout(void *blob, const char *node, const char *prop_name,
 			const struct fdt_memory *carveout)
 {
 	uint32_t phandle;
-	int err, offset;
+	int err, offset, len;
 	fdt32_t value;
-
-	/* XXX implement support for multiple phandles */
-	if (index > 0) {
-		debug("invalid index %u\n", index);
-		return -FDT_ERR_BADOFFSET;
-	}
+	void *prop;
 
 	err = fdtdec_add_reserved_memory(blob, name, carveout, &phandle);
 	if (err < 0) {
@@ -1456,10 +1451,31 @@  int fdtdec_set_carveout(void *blob, const char *node, const char *prop_name,
 
 	value = cpu_to_fdt32(phandle);
 
-	err = fdt_setprop(blob, offset, prop_name, &value, sizeof(value));
+	if (!fdt_getprop(blob, offset, prop_name, &len)) {
+		if (len == -FDT_ERR_NOTFOUND)
+			len = 0;
+		else
+			return len;
+	}
+
+	if ((index + 1) * sizeof(value) > len) {
+		err = fdt_setprop_placeholder(blob, offset, prop_name,
+					      (index + 1) * sizeof(value),
+					      &prop);
+		if (err < 0) {
+			debug("failed to resize reserved memory property: %s\n",
+			      fdt_strerror(err));
+			return err;
+		}
+	}
+
+	err = fdt_setprop_inplace_namelen_partial(blob, offset, prop_name,
+						  strlen(prop_name),
+						  index * sizeof(value),
+						  &value, sizeof(value));
 	if (err < 0) {
-		debug("failed to set %s property for node %s: %d\n", prop_name,
-		      node, err);
+		debug("failed to update %s property for node %s: %s\n",
+		      prop_name, node, fdt_strerror(err));
 		return err;
 	}