All of lore.kernel.org
 help / color / mirror / Atom feed
From: Thierry Reding <thierry.reding@gmail.com>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH v3 06/13] fdtdec: Implement carveout support functions
Date: Thu, 21 Mar 2019 19:10:03 +0100	[thread overview]
Message-ID: <20190321181010.27005-7-thierry.reding@gmail.com> (raw)
In-Reply-To: <20190321181010.27005-1-thierry.reding@gmail.com>

From: Thierry Reding <treding@nvidia.com>

The fdtdec_get_carveout() and fdtdec_set_carveout() function can be used
to read a carveout from a given node or add a carveout to a given node
using the standard device tree bindings (involving reserved-memory nodes
and the memory-region property).

Reviewed-by: Simon Glass <sjg@chromium.org>
Signed-off-by: Thierry Reding <treding@nvidia.com>
---
Changes in v3:
- add examples to code comments

Changes in v2:
- use debug() instead of printf() to save code size
- fix carveout size computations, was off by one
- use fdtdec_get_addr_size_auto_noparent()

 include/fdtdec.h | 81 ++++++++++++++++++++++++++++++++++++++++++++
 lib/fdtdec.c     | 87 ++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 168 insertions(+)

diff --git a/include/fdtdec.h b/include/fdtdec.h
index b54ed38fb362..13b743f59ab1 100644
--- a/include/fdtdec.h
+++ b/include/fdtdec.h
@@ -1030,6 +1030,8 @@ int fdtdec_set_phandle(void *blob, int node, uint32_t phandle);
  * The phandle returned from the function call can be used to reference this
  * reserved memory region from other nodes.
  *
+ * See fdtdec_set_carveout() for a more elaborate example.
+ *
  * @param blob		FDT blob
  * @param basename	base name of the node to create
  * @param carveout	information about the carveout region
@@ -1040,6 +1042,85 @@ int fdtdec_add_reserved_memory(void *blob, const char *basename,
 			       const struct fdt_memory *carveout,
 			       uint32_t *phandlep);
 
+/**
+ * fdtdec_get_carveout() - reads a carveout from an FDT
+ *
+ * Reads information about a carveout region from an FDT. The carveout is a
+ * referenced by its phandle that is read from a given property in a given
+ * node.
+ *
+ * @param blob		FDT blob
+ * @param node		name of a node
+ * @param name		name of the property in the given node that contains
+ *			the phandle for the carveout
+ * @param index		index of the phandle for which to read the carveout
+ * @param carveout	return location for the carveout information
+ * @return 0 on success or a negative error code on failure
+ */
+int fdtdec_get_carveout(const void *blob, const char *node, const char *name,
+			unsigned int index, struct fdt_memory *carveout);
+
+/**
+ * fdtdec_set_carveout() - sets a carveout region for a given node
+ *
+ * Sets a carveout region for a given node. If a reserved-memory node already
+ * exists for the carveout, the phandle for that node will be reused. If no
+ * such node exists, a new one will be created and a phandle to it stored in
+ * a specified property of the given node.
+ *
+ * As an example, consider the following code snippet:
+ *
+ *     const char *node = "/host1x at 50000000/dc at 54240000";
+ *     struct fdt_memory fb = {
+ *         .start = 0x92cb3000,
+ *         .end = 0x934b2fff,
+ *     };
+ *
+ *     fdtdec_set_carveout(fdt, node, "memory-region", 0, "framebuffer", &fb);
+ *
+ * dc at 54200000 is a display controller and was set up by the bootloader to
+ * scan out the framebuffer specified by "fb". This would cause the following
+ * reserved memory region to be added:
+ *
+ *     reserved-memory {
+ *         #address-cells = <0x00000002>;
+ *         #size-cells = <0x00000002>;
+ *         ranges;
+ *
+ *         framebuffer at 92cb3000 {
+ *             reg = <0x00000000 0x92cb3000 0x00000000 0x00800000>;
+ *             phandle = <0x0000004d>;
+ *         };
+ *     };
+ *
+ * A "memory-region" property will also be added to the node referenced by the
+ * offset parameter.
+ *
+ *     host1x at 50000000 {
+ *         ...
+ *
+ *         dc at 54240000 {
+ *             ...
+ *             memory-region = <0x0000004d>;
+ *             ...
+ *         };
+ *
+ *         ...
+ *     };
+ *
+ * @param blob		FDT blob
+ * @param node		name of the node to add the carveout to
+ * @param prop_name	name of the property in which to store the phandle of
+ *			the carveout
+ * @param index		index of the phandle to store
+ * @param name		base name of the reserved-memory node to create
+ * @param carveout	information about the carveout to add
+ * @return 0 on success or a negative error code on failure
+ */
+int fdtdec_set_carveout(void *blob, const char *node, const char *prop_name,
+			unsigned int index, const char *name,
+			const struct fdt_memory *carveout);
+
 /**
  * Set up the device tree ready for use
  */
diff --git a/lib/fdtdec.c b/lib/fdtdec.c
index be54ad5bd092..bd05ab90fce1 100644
--- a/lib/fdtdec.c
+++ b/lib/fdtdec.c
@@ -1381,6 +1381,93 @@ int fdtdec_add_reserved_memory(void *blob, const char *basename,
 	return 0;
 }
 
+int fdtdec_get_carveout(const void *blob, const char *node, const char *name,
+			unsigned int index, struct fdt_memory *carveout)
+{
+	const fdt32_t *prop;
+	uint32_t phandle;
+	int offset, len;
+	fdt_size_t size;
+
+	offset = fdt_path_offset(blob, node);
+	if (offset < 0)
+		return offset;
+
+	prop = fdt_getprop(blob, offset, name, &len);
+	if (!prop) {
+		debug("failed to get %s for %s\n", name, node);
+		return -FDT_ERR_NOTFOUND;
+	}
+
+	if ((len % sizeof(phandle)) != 0) {
+		debug("invalid phandle property\n");
+		return -FDT_ERR_BADPHANDLE;
+	}
+
+	if (len < (sizeof(phandle) * (index + 1))) {
+		debug("invalid phandle index\n");
+		return -FDT_ERR_BADPHANDLE;
+	}
+
+	phandle = fdt32_to_cpu(prop[index]);
+
+	offset = fdt_node_offset_by_phandle(blob, phandle);
+	if (offset < 0) {
+		debug("failed to find node for phandle %u\n", phandle);
+		return offset;
+	}
+
+	carveout->start = fdtdec_get_addr_size_auto_noparent(blob, offset,
+							     "reg", 0, &size,
+							     true);
+	if (carveout->start == FDT_ADDR_T_NONE) {
+		debug("failed to read address/size from \"reg\" property\n");
+		return -FDT_ERR_NOTFOUND;
+	}
+
+	carveout->end = carveout->start + size - 1;
+
+	return 0;
+}
+
+int fdtdec_set_carveout(void *blob, const char *node, const char *prop_name,
+			unsigned int index, const char *name,
+			const struct fdt_memory *carveout)
+{
+	uint32_t phandle;
+	int err, offset;
+	fdt32_t value;
+
+	/* XXX implement support for multiple phandles */
+	if (index > 0) {
+		debug("invalid index %u\n", index);
+		return -FDT_ERR_BADOFFSET;
+	}
+
+	err = fdtdec_add_reserved_memory(blob, name, carveout, &phandle);
+	if (err < 0) {
+		debug("failed to add reserved memory: %d\n", err);
+		return err;
+	}
+
+	offset = fdt_path_offset(blob, node);
+	if (offset < 0) {
+		debug("failed to find offset for node %s: %d\n", node, offset);
+		return offset;
+	}
+
+	value = cpu_to_fdt32(phandle);
+
+	err = fdt_setprop(blob, offset, prop_name, &value, sizeof(value));
+	if (err < 0) {
+		debug("failed to set %s property for node %s: %d\n", prop_name,
+		      node, err);
+		return err;
+	}
+
+	return 0;
+}
+
 int fdtdec_setup(void)
 {
 #if CONFIG_IS_ENABLED(OF_CONTROL)
-- 
2.21.0

  parent reply	other threads:[~2019-03-21 18:10 UTC|newest]

Thread overview: 45+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-03-21 18:09 [U-Boot] [PATCH v3 00/13] ARM: tegra: Add support for framebuffer carveouts Thierry Reding
2019-03-21 18:09 ` [U-Boot] [PATCH v3 01/13] libfdt: Add phandle generation helper Thierry Reding
2019-03-22  7:52   ` Simon Glass
2019-03-25  7:27     ` Thierry Reding
2019-03-30 21:18       ` Simon Glass
2019-04-12 21:50       ` sjg at google.com
2019-03-21 18:09 ` [U-Boot] [PATCH v3 02/13] fdtdec: Add cpu_to_fdt_{addr, size}() macros Thierry Reding
2019-04-12 21:48   ` Simon Glass
2019-03-21 18:10 ` [U-Boot] [PATCH v3 03/13] fdtdec: Add fdt_{addr, size}_unpack() helpers Thierry Reding
2019-03-22  7:53   ` Simon Glass
2019-03-22  8:31     ` Thierry Reding
2019-04-12 21:45       ` Simon Glass
2019-04-15  8:18         ` Thierry Reding
2019-03-21 18:10 ` [U-Boot] [PATCH v3 04/13] fdtdec: Implement fdtdec_set_phandle() Thierry Reding
2019-03-22  7:53   ` Simon Glass
2019-03-22  8:34     ` Thierry Reding
2019-03-23  0:52       ` Simon Glass
2019-04-12 21:50       ` sjg at google.com
2019-03-21 18:10 ` [U-Boot] [PATCH v3 05/13] fdtdec: Implement fdtdec_add_reserved_memory() Thierry Reding
2019-03-21 18:10 ` Thierry Reding [this message]
2019-03-21 18:10 ` [U-Boot] [PATCH v3 07/13] fdtdec: Add Kconfig symbol for tests Thierry Reding
2019-03-22  7:53   ` Simon Glass
2019-04-12 21:50   ` sjg at google.com
2019-03-21 18:10 ` [U-Boot] [PATCH v3 08/13] fdtdec: test: Fix build warning Thierry Reding
2019-03-22  7:53   ` Simon Glass
2019-04-12 21:49   ` sjg at google.com
2019-03-21 18:10 ` [U-Boot] [PATCH v3 09/13] fdtdec: test: Use compound statement macros Thierry Reding
2019-03-22  7:53   ` Simon Glass
2019-04-12 21:49   ` sjg at google.com
2019-03-21 18:10 ` [U-Boot] [PATCH v3 10/13] fdtdec: test: Add carveout tests Thierry Reding
2019-03-22  7:53   ` Simon Glass
2019-03-22  8:45     ` Thierry Reding
2019-04-12 21:49     ` sjg at google.com
2019-03-21 18:10 ` [U-Boot] [PATCH v3 11/13] sandbox: Enable fdtdec tests Thierry Reding
2019-03-22  7:53   ` Simon Glass
2019-04-12 21:49   ` sjg at google.com
2019-03-21 18:10 ` [U-Boot] [PATCH v3 12/13] p2371-2180: Add support for framebuffer carveouts Thierry Reding
2019-03-22  7:53   ` Simon Glass
2019-04-12  2:12     ` Simon Glass
2019-04-15  8:20       ` Thierry Reding
2019-03-21 18:10 ` [U-Boot] [PATCH v3 13/13] p2771-0000: " Thierry Reding
2019-03-22  7:53   ` Simon Glass
2019-04-12  2:12     ` Simon Glass
2019-04-12 21:50 ` [U-Boot] [PATCH v3 06/13] fdtdec: Implement carveout support functions sjg at google.com
2019-04-12 21:50 ` [U-Boot] [PATCH v3 05/13] fdtdec: Implement fdtdec_add_reserved_memory() sjg at google.com

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=20190321181010.27005-7-thierry.reding@gmail.com \
    --to=thierry.reding@gmail.com \
    --cc=u-boot@lists.denx.de \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.