xref: /aosp_15_r20/external/arm-trusted-firmware/lib/fconf/fconf_tbbr_getter.c (revision 54fd6939e177f8ff529b10183254802c76df6d08)
1*54fd6939SJiyong Park /*
2*54fd6939SJiyong Park  * Copyright (c) 2019-2021, Arm Limited. All rights reserved.
3*54fd6939SJiyong Park  *
4*54fd6939SJiyong Park  * SPDX-License-Identifier: BSD-3-Clause
5*54fd6939SJiyong Park  */
6*54fd6939SJiyong Park #include <assert.h>
7*54fd6939SJiyong Park 
8*54fd6939SJiyong Park #include <common/bl_common.h>
9*54fd6939SJiyong Park #include <common/debug.h>
10*54fd6939SJiyong Park #include <common/fdt_wrappers.h>
11*54fd6939SJiyong Park #include <lib/fconf/fconf_tbbr_getter.h>
12*54fd6939SJiyong Park #include <libfdt.h>
13*54fd6939SJiyong Park 
14*54fd6939SJiyong Park struct tbbr_dyn_config_t tbbr_dyn_config;
15*54fd6939SJiyong Park 
fconf_populate_tbbr_dyn_config(uintptr_t config)16*54fd6939SJiyong Park int fconf_populate_tbbr_dyn_config(uintptr_t config)
17*54fd6939SJiyong Park {
18*54fd6939SJiyong Park 	int err;
19*54fd6939SJiyong Park 	int node;
20*54fd6939SJiyong Park 	uint64_t val64;
21*54fd6939SJiyong Park 	uint32_t val32;
22*54fd6939SJiyong Park 
23*54fd6939SJiyong Park 	/* As libfdt use void *, we can't avoid this cast */
24*54fd6939SJiyong Park 	const void *dtb = (void *)config;
25*54fd6939SJiyong Park 
26*54fd6939SJiyong Park 	/* Assert the node offset point to "arm,tb_fw" compatible property */
27*54fd6939SJiyong Park 	const char *compatible_str = "arm,tb_fw";
28*54fd6939SJiyong Park 	node = fdt_node_offset_by_compatible(dtb, -1, compatible_str);
29*54fd6939SJiyong Park 	if (node < 0) {
30*54fd6939SJiyong Park 		ERROR("FCONF: Can't find `%s` compatible in dtb\n",
31*54fd6939SJiyong Park 						compatible_str);
32*54fd6939SJiyong Park 		return node;
33*54fd6939SJiyong Park 	}
34*54fd6939SJiyong Park 
35*54fd6939SJiyong Park 	/* Locate the disable_auth cell and read the value */
36*54fd6939SJiyong Park 	err = fdt_read_uint32(dtb, node, "disable_auth",
37*54fd6939SJiyong Park 					&tbbr_dyn_config.disable_auth);
38*54fd6939SJiyong Park 	if (err < 0) {
39*54fd6939SJiyong Park 		WARN("FCONF: Read %s failed for `%s`\n",
40*54fd6939SJiyong Park 				"cell", "disable_auth");
41*54fd6939SJiyong Park 		return err;
42*54fd6939SJiyong Park 	}
43*54fd6939SJiyong Park 
44*54fd6939SJiyong Park 	/* Check if the value is boolean */
45*54fd6939SJiyong Park 	if ((tbbr_dyn_config.disable_auth != 0U) &&
46*54fd6939SJiyong Park 	    (tbbr_dyn_config.disable_auth != 1U)) {
47*54fd6939SJiyong Park 		WARN("Invalid value for `%s` cell %d\n",
48*54fd6939SJiyong Park 			"disable_auth", tbbr_dyn_config.disable_auth);
49*54fd6939SJiyong Park 		return -1;
50*54fd6939SJiyong Park 	}
51*54fd6939SJiyong Park 
52*54fd6939SJiyong Park #if defined(DYN_DISABLE_AUTH)
53*54fd6939SJiyong Park 	if (tbbr_dyn_config.disable_auth == 1)
54*54fd6939SJiyong Park 		dyn_disable_auth();
55*54fd6939SJiyong Park #endif
56*54fd6939SJiyong Park 
57*54fd6939SJiyong Park 	/* Retrieve the Mbed TLS heap details from the DTB */
58*54fd6939SJiyong Park 	err = fdt_read_uint64(dtb, node, "mbedtls_heap_addr", &val64);
59*54fd6939SJiyong Park 	if (err < 0) {
60*54fd6939SJiyong Park 		ERROR("FCONF: Read %s failed for `%s`\n",
61*54fd6939SJiyong Park 			"cell", "mbedtls_heap_addr");
62*54fd6939SJiyong Park 		return err;
63*54fd6939SJiyong Park 	}
64*54fd6939SJiyong Park 	tbbr_dyn_config.mbedtls_heap_addr = (void *)(uintptr_t)val64;
65*54fd6939SJiyong Park 
66*54fd6939SJiyong Park 	err = fdt_read_uint32(dtb, node, "mbedtls_heap_size", &val32);
67*54fd6939SJiyong Park 	if (err < 0) {
68*54fd6939SJiyong Park 		ERROR("FCONF: Read %s failed for `%s`\n",
69*54fd6939SJiyong Park 			"cell", "mbedtls_heap_size");
70*54fd6939SJiyong Park 		return err;
71*54fd6939SJiyong Park 	}
72*54fd6939SJiyong Park 	tbbr_dyn_config.mbedtls_heap_size = val32;
73*54fd6939SJiyong Park 
74*54fd6939SJiyong Park 	VERBOSE("%s%s%s %d\n", "FCONF: `tbbr.", "disable_auth",
75*54fd6939SJiyong Park 		"` cell found with value =", tbbr_dyn_config.disable_auth);
76*54fd6939SJiyong Park 	VERBOSE("%s%s%s %p\n", "FCONF: `tbbr.", "mbedtls_heap_addr",
77*54fd6939SJiyong Park 		"` cell found with value =", tbbr_dyn_config.mbedtls_heap_addr);
78*54fd6939SJiyong Park 	VERBOSE("%s%s%s %zu\n", "FCONF: `tbbr.", "mbedtls_heap_size",
79*54fd6939SJiyong Park 		"` cell found with value =", tbbr_dyn_config.mbedtls_heap_size);
80*54fd6939SJiyong Park 
81*54fd6939SJiyong Park 	return 0;
82*54fd6939SJiyong Park }
83*54fd6939SJiyong Park 
84*54fd6939SJiyong Park FCONF_REGISTER_POPULATOR(TB_FW, tbbr, fconf_populate_tbbr_dyn_config);
85