[PATCH 4/6] arm: mach-k3: am62: Fixup TF-A/OP-TEE reserved-memory node in FDT

Neha Malcom Francis n-francis at ti.com
Fri Feb 16 06:26:55 CET 2024


Hi Andrew

On 14/02/24 22:00, Andrew Davis wrote:
> The address we load TF-A and OP-TEE to is configurable by Kconfig
> CONFIG_K3_{ATF,OPTEE}_LOAD_ADDR, but the DT nodes reserving this memory
> are often statically defined. As these binaries are dynamically loadable,
> and in the case of OP-TEE may not even be loaded at all, hard-coding these
> addresses is not a hardware description, but rather a configuration.
> 
> If the address that U-Boot loaded TF-A or OP-TEE does not match the
> address in hard-coded in DT, then fix that node address. This also handles
> the case when no reserved memory for these is provided by DT, which is
> more correct as explained above.
> 
> Add this fixup function, and enable it for AM62.
> 
> Signed-off-by: Andrew Davis <afd at ti.com>
> ---
>   arch/arm/mach-k3/am625_fdt.c  |  2 ++
>   arch/arm/mach-k3/common_fdt.c | 52 +++++++++++++++++++++++++++++++++++
>   arch/arm/mach-k3/common_fdt.h |  2 ++
>   3 files changed, 56 insertions(+)
> 
> diff --git a/arch/arm/mach-k3/am625_fdt.c b/arch/arm/mach-k3/am625_fdt.c
> index 970dd3447de..b26186456f3 100644
> --- a/arch/arm/mach-k3/am625_fdt.c
> +++ b/arch/arm/mach-k3/am625_fdt.c
> @@ -43,6 +43,8 @@ int ft_system_setup(void *blob, struct bd_info *bd)
>   	fdt_fixup_cores_nodes_am625(blob, k3_get_core_nr());
>   	fdt_fixup_gpu_nodes_am625(blob, k3_has_gpu());
>   	fdt_fixup_pru_node_am625(blob, k3_has_pru());
> +	fdt_fixup_reserved(blob, "tfa", CONFIG_K3_ATF_LOAD_ADDR, 0x80000);
> +	fdt_fixup_reserved(blob, "optee", CONFIG_K3_OPTEE_LOAD_ADDR, 0x1800000);
>   
>   	return 0;
>   }
> diff --git a/arch/arm/mach-k3/common_fdt.c b/arch/arm/mach-k3/common_fdt.c
> index 645c4de42f7..3bdedd7b509 100644
> --- a/arch/arm/mach-k3/common_fdt.c
> +++ b/arch/arm/mach-k3/common_fdt.c
> @@ -112,3 +112,55 @@ int fdt_del_node_path(void *blob, const char *path)
>   
>   	return ret;
>   }
> +
> +int fdt_fixup_reserved(void *blob, const char *name,
> +		       unsigned int new_address, unsigned int new_size)
> +{
> +	int nodeoffset, subnode;
> +	int ret;
> +
> +	/* Find reserved-memory */
> +	nodeoffset = fdt_subnode_offset(blob, 0, "reserved-memory");
> +	if (nodeoffset < 0) {
> +		debug("Could not find reserved-memory node\n");
> +		return 0;
> +	}
> +
> +	/* Find existing matching subnode and remove it */
> +	fdt_for_each_subnode(subnode, blob, nodeoffset) {
> +		const char *node_name;
> +		fdt_addr_t addr;
> +		fdt_size_t size;
> +
> +		/* Name matching */
> +		node_name = fdt_get_name(blob, subnode, NULL);
> +		if (!name)
> +			return -EINVAL;
> +		if (!strncmp(node_name, name, strlen(name))) {
> +			/* Read out old size first */
> +			addr = fdtdec_get_addr_size(blob, subnode, "reg", &size);
> +			if (addr == FDT_ADDR_T_NONE)
> +				return -EINVAL;
> +			new_size = size;
> +
> +			/* Delete node */
> +			ret = fdt_del_node(blob, subnode);
> +			if (ret < 0)
> +				return ret;
> +
> +			/* Only one matching node */
> +			break;
> +		}
> +	}
> +
> +	struct fdt_memory carveout = {
> +		.start = new_address,
> +		.end = new_address + new_size - 1,
> +	};
> +	ret = fdtdec_add_reserved_memory(blob, name, &carveout, NULL, 0, NULL,
> +					 FDTDEC_RESERVED_MEMORY_NO_MAP);
> +	if (ret < 0)
> +		return ret;
> +
> +	return 0;
> +}
> diff --git a/arch/arm/mach-k3/common_fdt.h b/arch/arm/mach-k3/common_fdt.h
> index 4d23ae638ca..52c07957483 100644
> --- a/arch/arm/mach-k3/common_fdt.h
> +++ b/arch/arm/mach-k3/common_fdt.h
> @@ -8,5 +8,7 @@
>   
>   int fdt_fixup_msmc_ram_k3(void *blob);
>   int fdt_del_node_path(void *blob, const char *path);
> +int fdt_fixup_reserved(void *blob, const char *name,
> +		       unsigned int new_address, unsigned int new_size);
>   
>   #endif /* _COMMON_FDT_H */

This looks pretty neat! Thanks!

Reviewed-by: Neha Malcom Francis <n-francis at ti.com>

-- 
Thanking You
Neha Malcom Francis


More information about the U-Boot mailing list