xref: /rk3399_ARM-atf/plat/arm/common/arm_dyn_cfg_helpers.c (revision 1cf3e2f0a8eb0d6324ce3db68dd5c78bdb690a8a)
1cab0b5b0SSoby Mathew /*
2*1cf3e2f0SManish V Badarkhe  * Copyright (c) 2018-2023, Arm Limited and Contributors. All rights reserved.
3cab0b5b0SSoby Mathew  *
4cab0b5b0SSoby Mathew  * SPDX-License-Identifier: BSD-3-Clause
5cab0b5b0SSoby Mathew  */
6cab0b5b0SSoby Mathew 
7cab0b5b0SSoby Mathew #include <assert.h>
809d40e0eSAntonio Nino Diaz 
9885e2683SClaus Pedersen #include <common/debug.h>
107b4e1fbbSAlexei Fedorov #if MEASURED_BOOT
117b4e1fbbSAlexei Fedorov #include <common/desc_image_load.h>
127b4e1fbbSAlexei Fedorov #endif
137b4e1fbbSAlexei Fedorov #include <common/fdt_wrappers.h>
147b4e1fbbSAlexei Fedorov 
150500f447SManish V Badarkhe #include <lib/fconf/fconf.h>
160500f447SManish V Badarkhe #include <lib/fconf/fconf_dyn_cfg_getter.h>
17cab0b5b0SSoby Mathew #include <libfdt.h>
1809d40e0eSAntonio Nino Diaz 
19bd9344f6SAntonio Nino Diaz #include <plat/arm/common/arm_dyn_cfg_helpers.h>
20bd9344f6SAntonio Nino Diaz #include <plat/arm/common/plat_arm.h>
21cab0b5b0SSoby Mathew 
22ba597da7SJohn Tsichritzis #define DTB_PROP_MBEDTLS_HEAP_ADDR "mbedtls_heap_addr"
23ba597da7SJohn Tsichritzis #define DTB_PROP_MBEDTLS_HEAP_SIZE "mbedtls_heap_size"
241d71ba14SSoby Mathew 
250ab49645SAlexei Fedorov #if MEASURED_BOOT
267b4e1fbbSAlexei Fedorov #ifdef SPD_opteed
277b4e1fbbSAlexei Fedorov /*
287b4e1fbbSAlexei Fedorov  * Currently OP-TEE does not support reading DTBs from Secure memory
297b4e1fbbSAlexei Fedorov  * and this property should be removed when this feature is supported.
307b4e1fbbSAlexei Fedorov  */
317b4e1fbbSAlexei Fedorov #define DTB_PROP_HW_SM_LOG_ADDR		"tpm_event_log_sm_addr"
32eab78e9bSManish V Badarkhe #endif /* SPD_opteed */
337b4e1fbbSAlexei Fedorov #define DTB_PROP_HW_LOG_ADDR		"tpm_event_log_addr"
347b4e1fbbSAlexei Fedorov #define DTB_PROP_HW_LOG_SIZE    	"tpm_event_log_size"
35*1cf3e2f0SManish V Badarkhe #define DTB_PROP_HW_LOG_MAX_SIZE	"tpm_event_log_max_size"
360ab49645SAlexei Fedorov #endif /* MEASURED_BOOT */
370ab49645SAlexei Fedorov 
38*1cf3e2f0SManish V Badarkhe static size_t event_log_max_size __unused;
39*1cf3e2f0SManish V Badarkhe 
40cab0b5b0SSoby Mathew /*******************************************************************************
41cab0b5b0SSoby Mathew  * Validate the tb_fw_config is a valid DTB file and returns the node offset
42cab0b5b0SSoby Mathew  * to "arm,tb_fw" property.
43cab0b5b0SSoby Mathew  * Arguments:
44cab0b5b0SSoby Mathew  *	void *dtb - pointer to the TB_FW_CONFIG in memory
45cab0b5b0SSoby Mathew  *	int *node - Returns the node offset to "arm,tb_fw" property if found.
46cab0b5b0SSoby Mathew  *
47cab0b5b0SSoby Mathew  * Returns 0 on success and -1 on error.
48cab0b5b0SSoby Mathew  ******************************************************************************/
49cab0b5b0SSoby Mathew int arm_dyn_tb_fw_cfg_init(void *dtb, int *node)
50cab0b5b0SSoby Mathew {
51da5f2745SSoby Mathew 	assert(dtb != NULL);
52da5f2745SSoby Mathew 	assert(node != NULL);
53cab0b5b0SSoby Mathew 
54cab0b5b0SSoby Mathew 	/* Check if the pointer to DT is correct */
55cab0b5b0SSoby Mathew 	if (fdt_check_header(dtb) != 0) {
567b4e1fbbSAlexei Fedorov 		WARN("Invalid DTB file passed as%s\n", " TB_FW_CONFIG");
57cab0b5b0SSoby Mathew 		return -1;
58cab0b5b0SSoby Mathew 	}
59cab0b5b0SSoby Mathew 
60cab0b5b0SSoby Mathew 	/* Assert the node offset point to "arm,tb_fw" compatible property */
61cab0b5b0SSoby Mathew 	*node = fdt_node_offset_by_compatible(dtb, -1, "arm,tb_fw");
62cab0b5b0SSoby Mathew 	if (*node < 0) {
637b4e1fbbSAlexei Fedorov 		WARN("The compatible property '%s' not%s", "arm,tb_fw",
647b4e1fbbSAlexei Fedorov 			" found in the config\n");
65cab0b5b0SSoby Mathew 		return -1;
66cab0b5b0SSoby Mathew 	}
67cab0b5b0SSoby Mathew 
687b4e1fbbSAlexei Fedorov 	VERBOSE("Dyn cfg: '%s'%s", "arm,tb_fw", " found in the config\n");
69cab0b5b0SSoby Mathew 	return 0;
70cab0b5b0SSoby Mathew }
71ba597da7SJohn Tsichritzis 
72ba597da7SJohn Tsichritzis /*
73ba597da7SJohn Tsichritzis  * This function writes the Mbed TLS heap address and size in the DTB. When it
74ba597da7SJohn Tsichritzis  * is called, it is guaranteed that a DTB is available. However it is not
75ba597da7SJohn Tsichritzis  * guaranteed that the shared Mbed TLS heap implementation is used. Thus we
76ba597da7SJohn Tsichritzis  * return error code from here and it's the responsibility of the caller to
77ba597da7SJohn Tsichritzis  * determine the action upon error.
78ba597da7SJohn Tsichritzis  *
79ba597da7SJohn Tsichritzis  * This function is supposed to be called only by BL1.
80ba597da7SJohn Tsichritzis  *
81ba597da7SJohn Tsichritzis  * Returns:
82ba597da7SJohn Tsichritzis  *	0 = success
830ab49645SAlexei Fedorov  *     -1 = error
84ba597da7SJohn Tsichritzis  */
85ba597da7SJohn Tsichritzis int arm_set_dtb_mbedtls_heap_info(void *dtb, void *heap_addr, size_t heap_size)
86ba597da7SJohn Tsichritzis {
870ab49645SAlexei Fedorov 	int dtb_root;
88eab78e9bSManish V Badarkhe 
89ba597da7SJohn Tsichritzis 	/*
90ba597da7SJohn Tsichritzis 	 * Verify that the DTB is valid, before attempting to write to it,
91ba597da7SJohn Tsichritzis 	 * and get the DTB root node.
92ba597da7SJohn Tsichritzis 	 */
930ab49645SAlexei Fedorov 	int err = arm_dyn_tb_fw_cfg_init(dtb, &dtb_root);
94ba597da7SJohn Tsichritzis 	if (err < 0) {
957b4e1fbbSAlexei Fedorov 		ERROR("Invalid%s loaded. Unable to get root node\n",
967b4e1fbbSAlexei Fedorov 			" TB_FW_CONFIG");
97ba597da7SJohn Tsichritzis 		return -1;
98ba597da7SJohn Tsichritzis 	}
99ba597da7SJohn Tsichritzis 
100ba597da7SJohn Tsichritzis 	/*
101ba597da7SJohn Tsichritzis 	 * Write the heap address and size in the DTB.
102ba597da7SJohn Tsichritzis 	 *
103ba597da7SJohn Tsichritzis 	 * NOTE: The variables heap_addr and heap_size are corrupted
104ba597da7SJohn Tsichritzis 	 * by the "fdtw_write_inplace_cells" function. After the
105ba597da7SJohn Tsichritzis 	 * function calls they must NOT be reused.
106ba597da7SJohn Tsichritzis 	 */
107ba597da7SJohn Tsichritzis 	err = fdtw_write_inplace_cells(dtb, dtb_root,
108ba597da7SJohn Tsichritzis 		DTB_PROP_MBEDTLS_HEAP_ADDR, 2, &heap_addr);
109ba597da7SJohn Tsichritzis 	if (err < 0) {
1107b4e1fbbSAlexei Fedorov 		ERROR("%sDTB property '%s'\n",
1117b4e1fbbSAlexei Fedorov 			"Unable to write ", DTB_PROP_MBEDTLS_HEAP_ADDR);
112ba597da7SJohn Tsichritzis 		return -1;
113ba597da7SJohn Tsichritzis 	}
114ba597da7SJohn Tsichritzis 
115ba597da7SJohn Tsichritzis 	err = fdtw_write_inplace_cells(dtb, dtb_root,
116ba597da7SJohn Tsichritzis 		DTB_PROP_MBEDTLS_HEAP_SIZE, 1, &heap_size);
117ba597da7SJohn Tsichritzis 	if (err < 0) {
1187b4e1fbbSAlexei Fedorov 		ERROR("%sDTB property '%s'\n",
1197b4e1fbbSAlexei Fedorov 			"Unable to write ", DTB_PROP_MBEDTLS_HEAP_SIZE);
120ba597da7SJohn Tsichritzis 		return -1;
121ba597da7SJohn Tsichritzis 	}
122ba597da7SJohn Tsichritzis 
123ba597da7SJohn Tsichritzis 	return 0;
124ba597da7SJohn Tsichritzis }
1250ab49645SAlexei Fedorov 
1260ab49645SAlexei Fedorov #if MEASURED_BOOT
1270ab49645SAlexei Fedorov /*
1287b4e1fbbSAlexei Fedorov  * Write the Event Log address and its size in the DTB.
1297b4e1fbbSAlexei Fedorov  *
1307b4e1fbbSAlexei Fedorov  * Returns:
1317b4e1fbbSAlexei Fedorov  *	0 = success
1327b4e1fbbSAlexei Fedorov  *    < 0 = error
1337b4e1fbbSAlexei Fedorov  */
1347b4e1fbbSAlexei Fedorov static int arm_set_event_log_info(uintptr_t config_base,
1357b4e1fbbSAlexei Fedorov #ifdef SPD_opteed
1367b4e1fbbSAlexei Fedorov 				  uintptr_t sm_log_addr,
1377b4e1fbbSAlexei Fedorov #endif
1387b4e1fbbSAlexei Fedorov 				  uintptr_t log_addr, size_t log_size)
1397b4e1fbbSAlexei Fedorov {
1407b4e1fbbSAlexei Fedorov 	/* As libfdt uses void *, we can't avoid this cast */
1417b4e1fbbSAlexei Fedorov 	void *dtb = (void *)config_base;
1427b4e1fbbSAlexei Fedorov 	const char *compatible = "arm,tpm_event_log";
1437b4e1fbbSAlexei Fedorov 	int err, node;
1447b4e1fbbSAlexei Fedorov 
1457b4e1fbbSAlexei Fedorov 	/*
1467b4e1fbbSAlexei Fedorov 	 * Verify that the DTB is valid, before attempting to write to it,
1477b4e1fbbSAlexei Fedorov 	 * and get the DTB root node.
1487b4e1fbbSAlexei Fedorov 	 */
1497b4e1fbbSAlexei Fedorov 
1507b4e1fbbSAlexei Fedorov 	/* Check if the pointer to DT is correct */
1517b4e1fbbSAlexei Fedorov 	err = fdt_check_header(dtb);
1527b4e1fbbSAlexei Fedorov 	if (err < 0) {
1537b4e1fbbSAlexei Fedorov 		WARN("Invalid DTB file passed\n");
1547b4e1fbbSAlexei Fedorov 		return err;
1557b4e1fbbSAlexei Fedorov 	}
1567b4e1fbbSAlexei Fedorov 
1577b4e1fbbSAlexei Fedorov 	/* Assert the node offset point to compatible property */
1587b4e1fbbSAlexei Fedorov 	node = fdt_node_offset_by_compatible(dtb, -1, compatible);
1597b4e1fbbSAlexei Fedorov 	if (node < 0) {
1607b4e1fbbSAlexei Fedorov 		WARN("The compatible property '%s' not%s", compatible,
1617b4e1fbbSAlexei Fedorov 			" found in the config\n");
1627b4e1fbbSAlexei Fedorov 		return node;
1637b4e1fbbSAlexei Fedorov 	}
1647b4e1fbbSAlexei Fedorov 
1657b4e1fbbSAlexei Fedorov 	VERBOSE("Dyn cfg: '%s'%s", compatible, " found in the config\n");
1667b4e1fbbSAlexei Fedorov 
1677b4e1fbbSAlexei Fedorov #ifdef SPD_opteed
1687b4e1fbbSAlexei Fedorov 	if (sm_log_addr != 0UL) {
1697b4e1fbbSAlexei Fedorov 		err = fdtw_write_inplace_cells(dtb, node,
1707b4e1fbbSAlexei Fedorov 			DTB_PROP_HW_SM_LOG_ADDR, 2, &sm_log_addr);
1717b4e1fbbSAlexei Fedorov 		if (err < 0) {
1727b4e1fbbSAlexei Fedorov 			ERROR("%sDTB property '%s'\n",
1737b4e1fbbSAlexei Fedorov 				"Unable to write ", DTB_PROP_HW_SM_LOG_ADDR);
1747b4e1fbbSAlexei Fedorov 			return err;
1757b4e1fbbSAlexei Fedorov 		}
1767b4e1fbbSAlexei Fedorov 	}
1777b4e1fbbSAlexei Fedorov #endif
1787b4e1fbbSAlexei Fedorov 	err = fdtw_write_inplace_cells(dtb, node,
1797b4e1fbbSAlexei Fedorov 		DTB_PROP_HW_LOG_ADDR, 2, &log_addr);
1807b4e1fbbSAlexei Fedorov 	if (err < 0) {
1817b4e1fbbSAlexei Fedorov 		ERROR("%sDTB property '%s'\n",
1827b4e1fbbSAlexei Fedorov 			"Unable to write ", DTB_PROP_HW_LOG_ADDR);
1837b4e1fbbSAlexei Fedorov 		return err;
1847b4e1fbbSAlexei Fedorov 	}
1857b4e1fbbSAlexei Fedorov 
186*1cf3e2f0SManish V Badarkhe 	assert(event_log_max_size != 0U);
187*1cf3e2f0SManish V Badarkhe 	err = fdtw_write_inplace_cells(dtb, node,
188*1cf3e2f0SManish V Badarkhe 				       DTB_PROP_HW_LOG_MAX_SIZE, 1,
189*1cf3e2f0SManish V Badarkhe 				       &event_log_max_size);
190*1cf3e2f0SManish V Badarkhe 	if (err < 0) {
191*1cf3e2f0SManish V Badarkhe 		ERROR("%sDTB property '%s'\n",
192*1cf3e2f0SManish V Badarkhe 		      "Unable to write ", DTB_PROP_HW_LOG_MAX_SIZE);
193*1cf3e2f0SManish V Badarkhe 		return err;
194*1cf3e2f0SManish V Badarkhe 	}
195*1cf3e2f0SManish V Badarkhe 
1967b4e1fbbSAlexei Fedorov 	err = fdtw_write_inplace_cells(dtb, node,
1977b4e1fbbSAlexei Fedorov 		DTB_PROP_HW_LOG_SIZE, 1, &log_size);
1987b4e1fbbSAlexei Fedorov 	if (err < 0) {
1997b4e1fbbSAlexei Fedorov 		ERROR("%sDTB property '%s'\n",
2007b4e1fbbSAlexei Fedorov 			"Unable to write ", DTB_PROP_HW_LOG_SIZE);
2017b4e1fbbSAlexei Fedorov 	} else {
2027b4e1fbbSAlexei Fedorov 		/*
2037b4e1fbbSAlexei Fedorov 		 * Ensure that the info written to the DTB is visible
2047b4e1fbbSAlexei Fedorov 		 * to other images.
2057b4e1fbbSAlexei Fedorov 		 */
2067b4e1fbbSAlexei Fedorov 		flush_dcache_range(config_base, fdt_totalsize(dtb));
2077b4e1fbbSAlexei Fedorov 	}
2087b4e1fbbSAlexei Fedorov 
2097b4e1fbbSAlexei Fedorov 	return err;
2107b4e1fbbSAlexei Fedorov }
2117b4e1fbbSAlexei Fedorov 
2127b4e1fbbSAlexei Fedorov /*
2137b4e1fbbSAlexei Fedorov  * This function writes the Event Log address and its size
2147b4e1fbbSAlexei Fedorov  * in the TOS_FW_CONFIG DTB.
2157b4e1fbbSAlexei Fedorov  *
2167b4e1fbbSAlexei Fedorov  * This function is supposed to be called only by BL2.
2177b4e1fbbSAlexei Fedorov  *
2187b4e1fbbSAlexei Fedorov  * Returns:
2197b4e1fbbSAlexei Fedorov  *	0 = success
2207b4e1fbbSAlexei Fedorov  *    < 0 = error
2217b4e1fbbSAlexei Fedorov  */
222efa65218SManish V Badarkhe int arm_set_tos_fw_info(uintptr_t log_addr, size_t log_size)
2237b4e1fbbSAlexei Fedorov {
224efa65218SManish V Badarkhe 	uintptr_t config_base;
225efa65218SManish V Badarkhe 	const bl_mem_params_node_t *cfg_mem_params;
2267b4e1fbbSAlexei Fedorov 	int err;
2277b4e1fbbSAlexei Fedorov 
2287b4e1fbbSAlexei Fedorov 	assert(log_addr != 0UL);
2297b4e1fbbSAlexei Fedorov 
230efa65218SManish V Badarkhe 	/* Get the config load address and size of TOS_FW_CONFIG */
231efa65218SManish V Badarkhe 	cfg_mem_params = get_bl_mem_params_node(TOS_FW_CONFIG_ID);
232efa65218SManish V Badarkhe 	assert(cfg_mem_params != NULL);
233efa65218SManish V Badarkhe 
234efa65218SManish V Badarkhe 	config_base = cfg_mem_params->image_info.image_base;
235efa65218SManish V Badarkhe 
2367b4e1fbbSAlexei Fedorov 	/* Write the Event Log address and its size in the DTB */
2377b4e1fbbSAlexei Fedorov 	err = arm_set_event_log_info(config_base,
2387b4e1fbbSAlexei Fedorov #ifdef SPD_opteed
2397b4e1fbbSAlexei Fedorov 					0UL,
2407b4e1fbbSAlexei Fedorov #endif
2417b4e1fbbSAlexei Fedorov 					log_addr, log_size);
2427b4e1fbbSAlexei Fedorov 	if (err < 0) {
2437b4e1fbbSAlexei Fedorov 		ERROR("%sEvent Log data to TOS_FW_CONFIG\n",
2447b4e1fbbSAlexei Fedorov 					"Unable to write ");
2457b4e1fbbSAlexei Fedorov 	}
2467b4e1fbbSAlexei Fedorov 
2477b4e1fbbSAlexei Fedorov 	return err;
2487b4e1fbbSAlexei Fedorov }
2497b4e1fbbSAlexei Fedorov 
2507b4e1fbbSAlexei Fedorov /*
2517b4e1fbbSAlexei Fedorov  * This function writes the Event Log address and its size
2527b4e1fbbSAlexei Fedorov  * in the NT_FW_CONFIG DTB.
2537b4e1fbbSAlexei Fedorov  *
2547b4e1fbbSAlexei Fedorov  * This function is supposed to be called only by BL2.
2557b4e1fbbSAlexei Fedorov  *
2567b4e1fbbSAlexei Fedorov  * Returns:
2577b4e1fbbSAlexei Fedorov  *	0 = success
2587b4e1fbbSAlexei Fedorov  *    < 0 = error
2597b4e1fbbSAlexei Fedorov  */
260efa65218SManish V Badarkhe int arm_set_nt_fw_info(
2617b4e1fbbSAlexei Fedorov #ifdef SPD_opteed
2627b4e1fbbSAlexei Fedorov 			uintptr_t log_addr,
2637b4e1fbbSAlexei Fedorov #endif
2647b4e1fbbSAlexei Fedorov 			size_t log_size, uintptr_t *ns_log_addr)
2657b4e1fbbSAlexei Fedorov {
266efa65218SManish V Badarkhe 	uintptr_t config_base;
2677b4e1fbbSAlexei Fedorov 	uintptr_t ns_addr;
2687b4e1fbbSAlexei Fedorov 	const bl_mem_params_node_t *cfg_mem_params;
2697b4e1fbbSAlexei Fedorov 	int err;
2707b4e1fbbSAlexei Fedorov 
2717b4e1fbbSAlexei Fedorov 	assert(ns_log_addr != NULL);
2727b4e1fbbSAlexei Fedorov 
2737b4e1fbbSAlexei Fedorov 	/* Get the config load address and size from NT_FW_CONFIG */
2747b4e1fbbSAlexei Fedorov 	cfg_mem_params = get_bl_mem_params_node(NT_FW_CONFIG_ID);
2757b4e1fbbSAlexei Fedorov 	assert(cfg_mem_params != NULL);
2767b4e1fbbSAlexei Fedorov 
277efa65218SManish V Badarkhe 	config_base = cfg_mem_params->image_info.image_base;
278efa65218SManish V Badarkhe 
2797b4e1fbbSAlexei Fedorov 	/* Calculate Event Log address in Non-secure memory */
2807b4e1fbbSAlexei Fedorov 	ns_addr = cfg_mem_params->image_info.image_base +
2817b4e1fbbSAlexei Fedorov 			cfg_mem_params->image_info.image_max_size;
2827b4e1fbbSAlexei Fedorov 
2837b4e1fbbSAlexei Fedorov 	/* Check for memory space */
2847b4e1fbbSAlexei Fedorov 	if ((uint64_t)(ns_addr + log_size) > ARM_NS_DRAM1_END) {
2857b4e1fbbSAlexei Fedorov 		return -1;
2867b4e1fbbSAlexei Fedorov 	}
2877b4e1fbbSAlexei Fedorov 
2887b4e1fbbSAlexei Fedorov 	/* Write the Event Log address and its size in the DTB */
2897b4e1fbbSAlexei Fedorov 	err = arm_set_event_log_info(config_base,
2907b4e1fbbSAlexei Fedorov #ifdef SPD_opteed
2917b4e1fbbSAlexei Fedorov 					log_addr,
2927b4e1fbbSAlexei Fedorov #endif
2937b4e1fbbSAlexei Fedorov 					ns_addr, log_size);
2947b4e1fbbSAlexei Fedorov 
2957b4e1fbbSAlexei Fedorov 	/* Return Event Log address in Non-secure memory */
2967b4e1fbbSAlexei Fedorov 	*ns_log_addr = (err < 0) ? 0UL : ns_addr;
2977b4e1fbbSAlexei Fedorov 	return err;
2987b4e1fbbSAlexei Fedorov }
2990500f447SManish V Badarkhe 
3000500f447SManish V Badarkhe /*
3010500f447SManish V Badarkhe  * This function writes the Event Log address and its size
3020500f447SManish V Badarkhe  * in the TB_FW_CONFIG DTB.
3030500f447SManish V Badarkhe  *
3040500f447SManish V Badarkhe  * This function is supposed to be called only by BL1.
3050500f447SManish V Badarkhe  *
3060500f447SManish V Badarkhe  * Returns:
3070500f447SManish V Badarkhe  *     0 = success
3080500f447SManish V Badarkhe  *   < 0 = error
3090500f447SManish V Badarkhe  */
310*1cf3e2f0SManish V Badarkhe int arm_set_tb_fw_info(uintptr_t log_addr, size_t log_size, size_t log_max_size)
3110500f447SManish V Badarkhe {
3120500f447SManish V Badarkhe 	/*
3130500f447SManish V Badarkhe 	 * Read tb_fw_config device tree for Event Log properties
3140500f447SManish V Badarkhe 	 * and write the Event Log address and its size in the DTB
3150500f447SManish V Badarkhe 	 */
3160500f447SManish V Badarkhe 	const struct dyn_cfg_dtb_info_t *tb_fw_config_info;
3170500f447SManish V Badarkhe 	uintptr_t tb_fw_cfg_dtb;
3180500f447SManish V Badarkhe 	int err;
3190500f447SManish V Badarkhe 
3200500f447SManish V Badarkhe 	tb_fw_config_info = FCONF_GET_PROPERTY(dyn_cfg, dtb, TB_FW_CONFIG_ID);
3210500f447SManish V Badarkhe 	assert(tb_fw_config_info != NULL);
3220500f447SManish V Badarkhe 
3230500f447SManish V Badarkhe 	tb_fw_cfg_dtb = tb_fw_config_info->config_addr;
3240500f447SManish V Badarkhe 
325*1cf3e2f0SManish V Badarkhe 	event_log_max_size = log_max_size;
326*1cf3e2f0SManish V Badarkhe 
3270500f447SManish V Badarkhe 	err = arm_set_event_log_info(tb_fw_cfg_dtb,
3280500f447SManish V Badarkhe #ifdef SPD_opteed
3290500f447SManish V Badarkhe 				     0UL,
3300500f447SManish V Badarkhe #endif
3310500f447SManish V Badarkhe 				     log_addr, log_size);
3320500f447SManish V Badarkhe 	return err;
3330500f447SManish V Badarkhe }
3340500f447SManish V Badarkhe 
3350500f447SManish V Badarkhe /*
3360500f447SManish V Badarkhe  * This function reads the Event Log address and its size
3370500f447SManish V Badarkhe  * properties present in TB_FW_CONFIG DTB.
3380500f447SManish V Badarkhe  *
3390500f447SManish V Badarkhe  * This function is supposed to be called only by BL2.
3400500f447SManish V Badarkhe  *
3410500f447SManish V Badarkhe  * Returns:
3420500f447SManish V Badarkhe  *     0 = success
3430500f447SManish V Badarkhe  *   < 0 = error
3440500f447SManish V Badarkhe  * Alongside returns Event Log address and its size.
3450500f447SManish V Badarkhe  */
3460500f447SManish V Badarkhe 
347*1cf3e2f0SManish V Badarkhe int arm_get_tb_fw_info(uint64_t *log_addr, size_t *log_size,
348*1cf3e2f0SManish V Badarkhe 		       size_t *log_max_size)
3490500f447SManish V Badarkhe {
3500500f447SManish V Badarkhe 	/* As libfdt uses void *, we can't avoid this cast */
3510500f447SManish V Badarkhe 	const struct dyn_cfg_dtb_info_t *tb_fw_config_info;
3520500f447SManish V Badarkhe 	int node, rc;
3530500f447SManish V Badarkhe 
3540500f447SManish V Badarkhe 	tb_fw_config_info = FCONF_GET_PROPERTY(dyn_cfg, dtb, TB_FW_CONFIG_ID);
3550500f447SManish V Badarkhe 	assert(tb_fw_config_info != NULL);
3560500f447SManish V Badarkhe 
3570500f447SManish V Badarkhe 	void *dtb = (void *)tb_fw_config_info->config_addr;
3580500f447SManish V Badarkhe 	const char *compatible = "arm,tpm_event_log";
3590500f447SManish V Badarkhe 
3600500f447SManish V Badarkhe 	/* Assert the node offset point to compatible property */
3610500f447SManish V Badarkhe 	node = fdt_node_offset_by_compatible(dtb, -1, compatible);
3620500f447SManish V Badarkhe 	if (node < 0) {
3630500f447SManish V Badarkhe 		WARN("The compatible property '%s'%s", compatible,
3640500f447SManish V Badarkhe 		     " not specified in TB_FW config.\n");
3650500f447SManish V Badarkhe 		return node;
3660500f447SManish V Badarkhe 	}
3670500f447SManish V Badarkhe 
3680500f447SManish V Badarkhe 	VERBOSE("Dyn cfg: '%s'%s", compatible, " found in the config\n");
3690500f447SManish V Badarkhe 
3700500f447SManish V Badarkhe 	rc = fdt_read_uint64(dtb, node, DTB_PROP_HW_LOG_ADDR, log_addr);
3710500f447SManish V Badarkhe 	if (rc != 0) {
3720500f447SManish V Badarkhe 		ERROR("%s%s", DTB_PROP_HW_LOG_ADDR,
3730500f447SManish V Badarkhe 		      " not specified in TB_FW config.\n");
3740500f447SManish V Badarkhe 		return rc;
3750500f447SManish V Badarkhe 	}
3760500f447SManish V Badarkhe 
3770500f447SManish V Badarkhe 	rc = fdt_read_uint32(dtb, node, DTB_PROP_HW_LOG_SIZE, (uint32_t *)log_size);
3780500f447SManish V Badarkhe 	if (rc != 0) {
3790500f447SManish V Badarkhe 		ERROR("%s%s", DTB_PROP_HW_LOG_SIZE,
3800500f447SManish V Badarkhe 		      " not specified in TB_FW config.\n");
381*1cf3e2f0SManish V Badarkhe 		return rc;
382*1cf3e2f0SManish V Badarkhe 	}
383*1cf3e2f0SManish V Badarkhe 
384*1cf3e2f0SManish V Badarkhe 	rc = fdt_read_uint32(dtb, node, DTB_PROP_HW_LOG_MAX_SIZE,
385*1cf3e2f0SManish V Badarkhe 			     (uint32_t *)log_max_size);
386*1cf3e2f0SManish V Badarkhe 	if (rc != 0) {
387*1cf3e2f0SManish V Badarkhe 		ERROR("%s%s", DTB_PROP_HW_LOG_MAX_SIZE,
388*1cf3e2f0SManish V Badarkhe 		      " not specified in TB_FW config.\n");
389*1cf3e2f0SManish V Badarkhe 		return rc;
390*1cf3e2f0SManish V Badarkhe 	} else {
391*1cf3e2f0SManish V Badarkhe 		event_log_max_size = *log_max_size;
3920500f447SManish V Badarkhe 	}
3930500f447SManish V Badarkhe 
3940500f447SManish V Badarkhe 	return rc;
3950500f447SManish V Badarkhe }
3960ab49645SAlexei Fedorov #endif /* MEASURED_BOOT */
397