1ce852841SLouis Mayencourt /* 2*eab78e9bSManish V Badarkhe * Copyright (c) 2019-2021, 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; 20ff4e6c35SAndre Przywara uint64_t val64; 21ff4e6c35SAndre Przywara uint32_t val32; 22ce852841SLouis Mayencourt 23ce852841SLouis Mayencourt /* As libfdt use void *, we can't avoid this cast */ 24ce852841SLouis Mayencourt const void *dtb = (void *)config; 25ce852841SLouis Mayencourt 26ce852841SLouis Mayencourt /* Assert the node offset point to "arm,tb_fw" compatible property */ 27ce852841SLouis Mayencourt const char *compatible_str = "arm,tb_fw"; 28ce852841SLouis Mayencourt node = fdt_node_offset_by_compatible(dtb, -1, compatible_str); 29ce852841SLouis Mayencourt if (node < 0) { 30c3825c9bSAlexei Fedorov ERROR("FCONF: Can't find `%s` compatible in dtb\n", 31c3825c9bSAlexei Fedorov compatible_str); 32ce852841SLouis Mayencourt return node; 33ce852841SLouis Mayencourt } 34ce852841SLouis Mayencourt 35ce852841SLouis Mayencourt /* Locate the disable_auth cell and read the value */ 36c3825c9bSAlexei Fedorov err = fdt_read_uint32(dtb, node, "disable_auth", 37c3825c9bSAlexei Fedorov &tbbr_dyn_config.disable_auth); 38ce852841SLouis Mayencourt if (err < 0) { 39c3825c9bSAlexei Fedorov WARN("FCONF: Read %s failed for `%s`\n", 40c3825c9bSAlexei Fedorov "cell", "disable_auth"); 41ce852841SLouis Mayencourt return err; 42ce852841SLouis Mayencourt } 43ce852841SLouis Mayencourt 44ce852841SLouis Mayencourt /* Check if the value is boolean */ 45c3825c9bSAlexei Fedorov if ((tbbr_dyn_config.disable_auth != 0U) && 46c3825c9bSAlexei Fedorov (tbbr_dyn_config.disable_auth != 1U)) { 47c3825c9bSAlexei Fedorov WARN("Invalid value for `%s` cell %d\n", 48c3825c9bSAlexei Fedorov "disable_auth", tbbr_dyn_config.disable_auth); 49ce852841SLouis Mayencourt return -1; 50ce852841SLouis Mayencourt } 51ce852841SLouis Mayencourt 52ce852841SLouis Mayencourt #if defined(DYN_DISABLE_AUTH) 53ce852841SLouis Mayencourt if (tbbr_dyn_config.disable_auth == 1) 54ce852841SLouis Mayencourt dyn_disable_auth(); 55ce852841SLouis Mayencourt #endif 56ce852841SLouis Mayencourt 576c972317SLouis Mayencourt /* Retrieve the Mbed TLS heap details from the DTB */ 58ff4e6c35SAndre Przywara err = fdt_read_uint64(dtb, node, "mbedtls_heap_addr", &val64); 596c972317SLouis Mayencourt if (err < 0) { 60c3825c9bSAlexei Fedorov ERROR("FCONF: Read %s failed for `%s`\n", 61c3825c9bSAlexei Fedorov "cell", "mbedtls_heap_addr"); 626c972317SLouis Mayencourt return err; 636c972317SLouis Mayencourt } 64ff4e6c35SAndre Przywara tbbr_dyn_config.mbedtls_heap_addr = (void *)(uintptr_t)val64; 656c972317SLouis Mayencourt 66ff4e6c35SAndre Przywara err = fdt_read_uint32(dtb, node, "mbedtls_heap_size", &val32); 676c972317SLouis Mayencourt if (err < 0) { 68c3825c9bSAlexei Fedorov ERROR("FCONF: Read %s failed for `%s`\n", 69c3825c9bSAlexei Fedorov "cell", "mbedtls_heap_size"); 706c972317SLouis Mayencourt return err; 716c972317SLouis Mayencourt } 72ff4e6c35SAndre Przywara tbbr_dyn_config.mbedtls_heap_size = val32; 736c972317SLouis Mayencourt 74c3825c9bSAlexei Fedorov VERBOSE("%s%s%s %d\n", "FCONF: `tbbr.", "disable_auth", 75c3825c9bSAlexei Fedorov "` cell found with value =", tbbr_dyn_config.disable_auth); 76c3825c9bSAlexei Fedorov VERBOSE("%s%s%s %p\n", "FCONF: `tbbr.", "mbedtls_heap_addr", 77c3825c9bSAlexei Fedorov "` cell found with value =", tbbr_dyn_config.mbedtls_heap_addr); 78c3825c9bSAlexei Fedorov VERBOSE("%s%s%s %zu\n", "FCONF: `tbbr.", "mbedtls_heap_size", 79c3825c9bSAlexei Fedorov "` cell found with value =", tbbr_dyn_config.mbedtls_heap_size); 80*eab78e9bSManish V Badarkhe 81ce852841SLouis Mayencourt return 0; 82ce852841SLouis Mayencourt } 83ce852841SLouis Mayencourt 8425d740c4SMadhukar Pappireddy FCONF_REGISTER_POPULATOR(TB_FW, tbbr, fconf_populate_tbbr_dyn_config); 85