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