From: Patrick Delaunay Date: Mon, 8 Feb 2021 12:54:31 +0000 (+0100) Subject: lib: optee: migration optee_copy_fdt_nodes for OF_LIVE support X-Git-Url: http://git.dujemihanovic.xyz/?a=commitdiff_plain;h=a2535243e0114a48a4225a38819aa7d9fdc3d02c;p=u-boot.git lib: optee: migration optee_copy_fdt_nodes for OF_LIVE support The optee_copy_fdt_nodes is only used to copy op-tee nodes of U-Boot device tree (from gd->fdt_blob when OF_LIVE is not activated) to external device tree but it is not compatible with OF_LIVE. This patch migrates all used function fdt_ functions to read node on old_blob to ofnode functions, compatible with OF_LIVE and remove this parameter "old_blob". The generated "device tree" is checked on stm32mp platform with OF_LIVE activated. Signed-off-by: Patrick Delaunay --- diff --git a/common/image-fdt.c b/common/image-fdt.c index a287b66392..d50e1ba3fe 100644 --- a/common/image-fdt.c +++ b/common/image-fdt.c @@ -562,7 +562,7 @@ int image_setup_libfdt(bootm_headers_t *images, void *blob, goto err; } - fdt_ret = optee_copy_fdt_nodes(gd->fdt_blob, blob); + fdt_ret = optee_copy_fdt_nodes(blob); if (fdt_ret) { printf("ERROR: transfer of optee nodes to new fdt failed: %s\n", fdt_strerror(fdt_ret)); diff --git a/include/tee/optee.h b/include/tee/optee.h index affa937da0..ebdfe5e98d 100644 --- a/include/tee/optee.h +++ b/include/tee/optee.h @@ -71,9 +71,9 @@ static inline int optee_verify_bootm_image(unsigned long image_addr, #endif #if defined(CONFIG_OPTEE) && defined(CONFIG_OF_LIBFDT) -int optee_copy_fdt_nodes(const void *old_blob, void *new_blob); +int optee_copy_fdt_nodes(void *new_blob); #else -static inline int optee_copy_fdt_nodes(const void *old_blob, void *new_blob) +static inline int optee_copy_fdt_nodes(void *new_blob) { return 0; } diff --git a/lib/optee/optee.c b/lib/optee/optee.c index 4dcf6f9309..672690dc53 100644 --- a/lib/optee/optee.c +++ b/lib/optee/optee.c @@ -9,6 +9,8 @@ #include #include #include +#include +#include #include #include @@ -70,17 +72,11 @@ error: } #if defined(CONFIG_OF_LIBFDT) -static int optee_copy_firmware_node(const void *old_blob, void *fdt_blob) +static int optee_copy_firmware_node(ofnode node, void *fdt_blob) { - int old_offs, offs, ret, len; + int offs, ret, len; const void *prop; - old_offs = fdt_path_offset(old_blob, "/firmware/optee"); - if (old_offs < 0) { - debug("Original OP-TEE Device Tree node not found"); - return old_offs; - } - offs = fdt_path_offset(fdt_blob, "/firmware"); if (offs < 0) { offs = fdt_path_offset(fdt_blob, "/"); @@ -97,7 +93,7 @@ static int optee_copy_firmware_node(const void *old_blob, void *fdt_blob) return offs; /* copy the compatible property */ - prop = fdt_getprop(old_blob, old_offs, "compatible", &len); + prop = ofnode_get_property(node, "compatible", &len); if (!prop) { debug("missing OP-TEE compatible property"); return -EINVAL; @@ -108,7 +104,7 @@ static int optee_copy_firmware_node(const void *old_blob, void *fdt_blob) return ret; /* copy the method property */ - prop = fdt_getprop(old_blob, old_offs, "method", &len); + prop = ofnode_get_property(node, "method", &len); if (!prop) { debug("missing OP-TEE method property"); return -EINVAL; @@ -121,19 +117,18 @@ static int optee_copy_firmware_node(const void *old_blob, void *fdt_blob) return 0; } -int optee_copy_fdt_nodes(const void *old_blob, void *new_blob) +int optee_copy_fdt_nodes(void *new_blob) { - int nodeoffset, subnode, ret; - struct fdt_resource res; - - if (fdt_check_header(old_blob)) - return -EINVAL; + ofnode node, subnode; + int ret; + struct resource res; if (fdt_check_header(new_blob)) return -EINVAL; /* only proceed if there is an /firmware/optee node */ - if (fdt_path_offset(old_blob, "/firmware/optee") < 0) { + node = ofnode_path("/firmware/optee"); + if (!ofnode_valid(node)) { debug("No OP-TEE firmware node in old fdt, nothing to do"); return 0; } @@ -148,20 +143,17 @@ int optee_copy_fdt_nodes(const void *old_blob, void *new_blob) return 0; } - ret = optee_copy_firmware_node(old_blob, new_blob); + ret = optee_copy_firmware_node(node, new_blob); if (ret < 0) { printf("Failed to add OP-TEE firmware node\n"); return ret; } /* optee inserts its memory regions as reserved-memory nodes */ - nodeoffset = fdt_subnode_offset(old_blob, 0, "reserved-memory"); - if (nodeoffset >= 0) { - for (subnode = fdt_first_subnode(old_blob, nodeoffset); - subnode >= 0; - subnode = fdt_next_subnode(old_blob, subnode)) { - const char *name = fdt_get_name(old_blob, - subnode, NULL); + node = ofnode_path("/reserved-memory"); + if (ofnode_valid(node)) { + ofnode_for_each_subnode(subnode, node) { + const char *name = ofnode_get_name(subnode); if (!name) return -EINVAL; @@ -170,8 +162,7 @@ int optee_copy_fdt_nodes(const void *old_blob, void *new_blob) continue; /* check if this subnode has a reg property */ - ret = fdt_get_resource(old_blob, subnode, "reg", 0, - &res); + ret = ofnode_read_resource(subnode, 0, &res); if (!ret) { struct fdt_memory carveout = { .start = res.start,