[PATCH 1/3] optee: Add an helper to add the optee firmware node in the FDT

Alban Bedel alban.bedel at aerq.com
Mon May 16 10:21:37 CEST 2022


Some platforms can detect if an optee firmware is running and then
manually add the firmware node to the FDT. Provide a common helper to
avoid code duplication in the board code.

Signed-off-by: Alban Bedel <alban.bedel at aerq.com>
---
 include/tee/optee.h | 11 +++++++++
 lib/optee/optee.c   | 60 +++++++++++++++++++++++++++++++++------------
 2 files changed, 55 insertions(+), 16 deletions(-)

diff --git a/include/tee/optee.h b/include/tee/optee.h
index 5412bc7386ec..d9a316150522 100644
--- a/include/tee/optee.h
+++ b/include/tee/optee.h
@@ -58,11 +58,22 @@ static inline int optee_verify_bootm_image(unsigned long image_addr,
 
 #if defined(CONFIG_OPTEE_LIB) && defined(CONFIG_OF_LIBFDT)
 int optee_copy_fdt_nodes(void *new_blob);
+
+int optee_add_firmware_node(void *fdt_blob,
+			    const char *compatible,
+			    const char *method);
 #else
 static inline int optee_copy_fdt_nodes(void *new_blob)
 {
 	return 0;
 }
+
+static inline int optee_add_firmware_node(void *fdt_blob,
+					  const char *compatible,
+					  const char *method)
+{
+	return 0;
+}
 #endif
 
 #endif /* _OPTEE_H */
diff --git a/lib/optee/optee.c b/lib/optee/optee.c
index b03622404469..8d4e110dfd04 100644
--- a/lib/optee/optee.c
+++ b/lib/optee/optee.c
@@ -65,10 +65,10 @@ error:
 #endif
 
 #if defined(CONFIG_OF_LIBFDT)
-static int optee_copy_firmware_node(ofnode node, void *fdt_blob)
+static int optee_set_firmware_node(void *fdt_blob, const char *compatible,
+				   const char *method)
 {
-	int offs, ret, len;
-	const void *prop;
+	int offs, ret;
 
 	offs = fdt_path_offset(fdt_blob, "/firmware");
 	if (offs < 0) {
@@ -85,29 +85,32 @@ static int optee_copy_firmware_node(ofnode node, void *fdt_blob)
 	if (offs < 0)
 		return offs;
 
+	ret = fdt_setprop_string(fdt_blob, offs, "compatible", compatible);
+	if (ret < 0)
+		return ret;
+
+	return fdt_setprop_string(fdt_blob, offs, "method", method);
+}
+
+static int optee_copy_firmware_node(ofnode node, void *fdt_blob)
+{
+	const char *compatible, *method;
+
 	/* copy the compatible property */
-	prop = ofnode_get_property(node, "compatible", &len);
-	if (!prop) {
+	compatible = ofnode_read_string(node, "compatible");
+	if (!compatible) {
 		debug("missing OP-TEE compatible property");
 		return -EINVAL;
 	}
 
-	ret = fdt_setprop(fdt_blob, offs, "compatible", prop, len);
-	if (ret < 0)
-		return ret;
-
 	/* copy the method property */
-	prop = ofnode_get_property(node, "method", &len);
-	if (!prop) {
+	method = ofnode_read_string(node, "method");
+	if (!method) {
 		debug("missing OP-TEE method property");
 		return -EINVAL;
 	}
 
-	ret = fdt_setprop(fdt_blob, offs, "method", prop, len);
-	if (ret < 0)
-		return ret;
-
-	return 0;
+	return optee_set_firmware_node(fdt_blob, compatible, method);
 }
 
 int optee_copy_fdt_nodes(void *new_blob)
@@ -190,4 +193,29 @@ int optee_copy_fdt_nodes(void *new_blob)
 
 	return 0;
 }
+
+int optee_add_firmware_node(void *fdt_blob, const char *compatible,
+			    const char *method)
+{
+	int ret;
+
+	/*
+	 * Do not proceed if the target dt already has an OP-TEE node.
+	 * In this case assume that the system knows better somehow,
+	 * so do not interfere.
+	 */
+	if (fdt_check_header(fdt_blob))
+		return -EINVAL;
+
+	if (fdt_path_offset(fdt_blob, "/firmware/optee") >= 0) {
+		debug("OP-TEE Device Tree node already exists in target");
+		return 0;
+	}
+
+	ret = fdt_increase_size(fdt_blob, 512);
+	if (ret)
+		return ret;
+
+	return optee_set_firmware_node(fdt_blob, compatible, method);
+}
 #endif
-- 
2.34.1
-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/x-pkcs7-signature
Size: 3627 bytes
Desc: not available
URL: <https://lists.denx.de/pipermail/u-boot/attachments/20220516/c8c29bf2/attachment.bin>


More information about the U-Boot mailing list