1ce852841SLouis Mayencourt /* 2ce852841SLouis Mayencourt * Copyright (c) 2019-2020, ARM Limited. All rights reserved. 3ce852841SLouis Mayencourt * 4ce852841SLouis Mayencourt * SPDX-License-Identifier: BSD-3-Clause 5ce852841SLouis Mayencourt */ 6ce852841SLouis Mayencourt #include <assert.h> 7ce852841SLouis Mayencourt 8ce852841SLouis Mayencourt #include <common/bl_common.h> 9ce852841SLouis Mayencourt #include <common/debug.h> 10ce852841SLouis Mayencourt #include <common/fdt_wrappers.h> 11ce852841SLouis Mayencourt #include <lib/fconf/fconf_tbbr_getter.h> 12ce852841SLouis Mayencourt #include <libfdt.h> 13ce852841SLouis Mayencourt 14ce852841SLouis Mayencourt struct tbbr_dyn_config_t tbbr_dyn_config; 15ce852841SLouis Mayencourt 16ce852841SLouis Mayencourt int fconf_populate_tbbr_dyn_config(uintptr_t config) 17ce852841SLouis Mayencourt { 18ce852841SLouis Mayencourt int err; 19ce852841SLouis Mayencourt int node; 20ce852841SLouis Mayencourt 21ce852841SLouis Mayencourt /* As libfdt use void *, we can't avoid this cast */ 22ce852841SLouis Mayencourt const void *dtb = (void *)config; 23ce852841SLouis Mayencourt 24ce852841SLouis Mayencourt /* Assert the node offset point to "arm,tb_fw" compatible property */ 25ce852841SLouis Mayencourt const char *compatible_str = "arm,tb_fw"; 26ce852841SLouis Mayencourt node = fdt_node_offset_by_compatible(dtb, -1, compatible_str); 27ce852841SLouis Mayencourt if (node < 0) { 28ce852841SLouis Mayencourt ERROR("FCONF: Can't find %s compatible in dtb\n", compatible_str); 29ce852841SLouis Mayencourt return node; 30ce852841SLouis Mayencourt } 31ce852841SLouis Mayencourt 32ce852841SLouis Mayencourt /* Locate the disable_auth cell and read the value */ 33ce852841SLouis Mayencourt err = fdtw_read_cells(dtb, node, "disable_auth", 1, &tbbr_dyn_config.disable_auth); 34ce852841SLouis Mayencourt if (err < 0) { 35ce852841SLouis Mayencourt WARN("FCONF: Read cell failed for `disable_auth`\n"); 36ce852841SLouis Mayencourt return err; 37ce852841SLouis Mayencourt } 38ce852841SLouis Mayencourt 39ce852841SLouis Mayencourt /* Check if the value is boolean */ 40ce852841SLouis Mayencourt if ((tbbr_dyn_config.disable_auth != 0U) && (tbbr_dyn_config.disable_auth != 1U)) { 41ce852841SLouis Mayencourt WARN("Invalid value for `disable_auth` cell %d\n", tbbr_dyn_config.disable_auth); 42ce852841SLouis Mayencourt return -1; 43ce852841SLouis Mayencourt } 44ce852841SLouis Mayencourt 45ce852841SLouis Mayencourt #if defined(DYN_DISABLE_AUTH) 46ce852841SLouis Mayencourt if (tbbr_dyn_config.disable_auth == 1) 47ce852841SLouis Mayencourt dyn_disable_auth(); 48ce852841SLouis Mayencourt #endif 49ce852841SLouis Mayencourt 506c972317SLouis Mayencourt /* Retrieve the Mbed TLS heap details from the DTB */ 516c972317SLouis Mayencourt err = fdtw_read_cells(dtb, node, 526c972317SLouis Mayencourt "mbedtls_heap_addr", 2, &tbbr_dyn_config.mbedtls_heap_addr); 536c972317SLouis Mayencourt if (err < 0) { 546c972317SLouis Mayencourt ERROR("FCONF: Read cell failed for mbedtls_heap\n"); 556c972317SLouis Mayencourt return err; 566c972317SLouis Mayencourt } 576c972317SLouis Mayencourt 586c972317SLouis Mayencourt err = fdtw_read_cells(dtb, node, 596c972317SLouis Mayencourt "mbedtls_heap_size", 1, &tbbr_dyn_config.mbedtls_heap_size); 606c972317SLouis Mayencourt if (err < 0) { 616c972317SLouis Mayencourt ERROR("FCONF: Read cell failed for mbedtls_heap\n"); 626c972317SLouis Mayencourt return err; 636c972317SLouis Mayencourt } 646c972317SLouis Mayencourt 65ce852841SLouis Mayencourt VERBOSE("FCONF:tbbr.disable_auth cell found with value = %d\n", 66ce852841SLouis Mayencourt tbbr_dyn_config.disable_auth); 676c972317SLouis Mayencourt VERBOSE("FCONF:tbbr.mbedtls_heap_addr cell found with value = %p\n", 686c972317SLouis Mayencourt tbbr_dyn_config.mbedtls_heap_addr); 696c972317SLouis Mayencourt VERBOSE("FCONF:tbbr.mbedtls_heap_size cell found with value = %zu\n", 706c972317SLouis Mayencourt tbbr_dyn_config.mbedtls_heap_size); 71ce852841SLouis Mayencourt 72ce852841SLouis Mayencourt return 0; 73ce852841SLouis Mayencourt } 74ce852841SLouis Mayencourt 75*25d740c4SMadhukar Pappireddy FCONF_REGISTER_POPULATOR(TB_FW, tbbr, fconf_populate_tbbr_dyn_config); 76