[PATCH v2 0/2] fdtdec: support multiple phandles in memory carveout

Content-Type: text/plain; charset="us-ascii"
fdtdec_set_carveout() is limited to only one phandle. Fix this limitation by adding support for multiple phandles and also add an unit test for the function.
Changes in v2: - added a unit test for the function (Simon) - added a cover letter
Laurentiu Tudor (2): fdtdec: support multiple phandles in memory carveout test: fdtdec: test fdtdec_set_carveout()
lib/fdtdec.c | 36 +++++++++++++++++++++-------- test/dm/Makefile | 1 + test/dm/fdtdec.c | 60 ++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 87 insertions(+), 10 deletions(-) create mode 100644 test/dm/fdtdec.c

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@nxp.com --- lib/fdtdec.c | 36 ++++++++++++++++++++++++++---------- 1 file changed, 26 insertions(+), 10 deletions(-)
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; }

On Fri, 3 Apr 2020 at 04:43, Laurentiu Tudor laurentiu.tudor@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@nxp.com
lib/fdtdec.c | 36 ++++++++++++++++++++++++++---------- 1 file changed, 26 insertions(+), 10 deletions(-)
Reviewed-by: Simon Glass sjg@chromium.org

On Fri, 3 Apr 2020 at 04:43, Laurentiu Tudor laurentiu.tudor@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@nxp.com
lib/fdtdec.c | 36 ++++++++++++++++++++++++++---------- 1 file changed, 26 insertions(+), 10 deletions(-)
Reviewed-by: Simon Glass sjg@chromium.org
Applied to u-boot-dm/next, thanks!

Add a new test for fdtdec_set_carveout().
Signed-off-by: Laurentiu Tudor laurentiu.tudor@nxp.com --- test/dm/Makefile | 1 + test/dm/fdtdec.c | 60 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 61 insertions(+) create mode 100644 test/dm/fdtdec.c
diff --git a/test/dm/Makefile b/test/dm/Makefile index dd1ceff86c..53caa29fbb 100644 --- a/test/dm/Makefile +++ b/test/dm/Makefile @@ -31,6 +31,7 @@ obj-$(CONFIG_LED) += led.o obj-$(CONFIG_DM_MAILBOX) += mailbox.o obj-$(CONFIG_DM_MMC) += mmc.o obj-y += ofnode.o +obj-y += fdtdec.o obj-$(CONFIG_OSD) += osd.o obj-$(CONFIG_DM_VIDEO) += panel.o obj-$(CONFIG_DM_PCI) += pci.o diff --git a/test/dm/fdtdec.c b/test/dm/fdtdec.c new file mode 100644 index 0000000000..6636af48d7 --- /dev/null +++ b/test/dm/fdtdec.c @@ -0,0 +1,60 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * Copyright 2020 NXP + */ + +#include <common.h> +#include <dm.h> +#include <dm/of_extra.h> +#include <dm/test.h> +#include <test/ut.h> + +static int dm_test_fdtdec_set_carveout(struct unit_test_state *uts) +{ + struct fdt_memory resv; + void *blob; + const fdt32_t *prop; + int blob_sz, len, offset; + + blob_sz = fdt_totalsize(gd->fdt_blob) + 4096; + blob = malloc(blob_sz); + ut_assertnonnull(blob); + + /* Make a writtable copy of the fdt blob */ + ut_assertok(fdt_open_into(gd->fdt_blob, blob, blob_sz)); + + resv.start = 0x1000; + resv.end = 0x2000; + ut_assertok(fdtdec_set_carveout(blob, "/a-test", + "memory-region", 2, "test_resv1", + &resv)); + + resv.start = 0x10000; + resv.end = 0x20000; + ut_assertok(fdtdec_set_carveout(blob, "/a-test", + "memory-region", 1, "test_resv2", + &resv)); + + resv.start = 0x100000; + resv.end = 0x200000; + ut_assertok(fdtdec_set_carveout(blob, "/a-test", + "memory-region", 0, "test_resv3", + &resv)); + + offset = fdt_path_offset(blob, "/a-test"); + ut_assert(offset > 0); + prop = fdt_getprop(blob, offset, "memory-region", &len); + ut_assertnonnull(prop); + + ut_asserteq(len, 12); + ut_assert(fdt_node_offset_by_phandle(blob, fdt32_to_cpu(prop[0])) > 0); + ut_assert(fdt_node_offset_by_phandle(blob, fdt32_to_cpu(prop[1])) > 0); + ut_assert(fdt_node_offset_by_phandle(blob, fdt32_to_cpu(prop[2])) > 0); + + free(blob); + + return 0; +} +DM_TEST(dm_test_fdtdec_set_carveout, + DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT | DM_TESTF_FLAT_TREE); +

On Fri, 3 Apr 2020 at 04:43, Laurentiu Tudor laurentiu.tudor@nxp.com wrote:
Add a new test for fdtdec_set_carveout().
Signed-off-by: Laurentiu Tudor laurentiu.tudor@nxp.com
test/dm/Makefile | 1 + test/dm/fdtdec.c | 60 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 61 insertions(+) create mode 100644 test/dm/fdtdec.c
Reviewed-by: Simon Glass sjg@chromium.org

On Fri, 3 Apr 2020 at 04:43, Laurentiu Tudor laurentiu.tudor@nxp.com wrote:
Add a new test for fdtdec_set_carveout().
Signed-off-by: Laurentiu Tudor laurentiu.tudor@nxp.com
test/dm/Makefile | 1 + test/dm/fdtdec.c | 60 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 61 insertions(+) create mode 100644 test/dm/fdtdec.c
Reviewed-by: Simon Glass sjg@chromium.org
Applied to u-boot-dm/next, thanks!
participants (3)
-
Laurentiu Tudor
-
Simon Glass
-
sjg@google.com