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; 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) { 30*c3825c9bSAlexei Fedorov ERROR("FCONF: Can't find `%s` compatible in dtb\n", 31*c3825c9bSAlexei Fedorov compatible_str); 32ce852841SLouis Mayencourt return node; 33ce852841SLouis Mayencourt } 34ce852841SLouis Mayencourt 35ce852841SLouis Mayencourt /* Locate the disable_auth cell and read the value */ 36*c3825c9bSAlexei Fedorov err = fdt_read_uint32(dtb, node, "disable_auth", 37*c3825c9bSAlexei Fedorov &tbbr_dyn_config.disable_auth); 38ce852841SLouis Mayencourt if (err < 0) { 39*c3825c9bSAlexei Fedorov WARN("FCONF: Read %s failed for `%s`\n", 40*c3825c9bSAlexei Fedorov "cell", "disable_auth"); 41ce852841SLouis Mayencourt return err; 42ce852841SLouis Mayencourt } 43ce852841SLouis Mayencourt 44ce852841SLouis Mayencourt /* Check if the value is boolean */ 45*c3825c9bSAlexei Fedorov if ((tbbr_dyn_config.disable_auth != 0U) && 46*c3825c9bSAlexei Fedorov (tbbr_dyn_config.disable_auth != 1U)) { 47*c3825c9bSAlexei Fedorov WARN("Invalid value for `%s` cell %d\n", 48*c3825c9bSAlexei 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) { 60*c3825c9bSAlexei Fedorov ERROR("FCONF: Read %s failed for `%s`\n", 61*c3825c9bSAlexei 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) { 68*c3825c9bSAlexei Fedorov ERROR("FCONF: Read %s failed for `%s`\n", 69*c3825c9bSAlexei Fedorov "cell", "mbedtls_heap_size"); 706c972317SLouis Mayencourt return err; 716c972317SLouis Mayencourt } 72ff4e6c35SAndre Przywara tbbr_dyn_config.mbedtls_heap_size = val32; 736c972317SLouis Mayencourt 74*c3825c9bSAlexei Fedorov #if MEASURED_BOOT 75*c3825c9bSAlexei Fedorov /* Retrieve BL2 hash data details from the DTB */ 76*c3825c9bSAlexei Fedorov err = fdtw_read_bytes(dtb, node, "bl2_hash_data", TCG_DIGEST_SIZE, 77*c3825c9bSAlexei Fedorov &tbbr_dyn_config.bl2_hash_data); 78*c3825c9bSAlexei Fedorov if (err < 0) { 79*c3825c9bSAlexei Fedorov ERROR("FCONF: Read %s failed for '%s'\n", 80*c3825c9bSAlexei Fedorov "bytes", "bl2_hash_data"); 81*c3825c9bSAlexei Fedorov return err; 82*c3825c9bSAlexei Fedorov } 83*c3825c9bSAlexei Fedorov #endif 84*c3825c9bSAlexei Fedorov VERBOSE("%s%s%s %d\n", "FCONF: `tbbr.", "disable_auth", 85*c3825c9bSAlexei Fedorov "` cell found with value =", tbbr_dyn_config.disable_auth); 86*c3825c9bSAlexei Fedorov VERBOSE("%s%s%s %p\n", "FCONF: `tbbr.", "mbedtls_heap_addr", 87*c3825c9bSAlexei Fedorov "` cell found with value =", tbbr_dyn_config.mbedtls_heap_addr); 88*c3825c9bSAlexei Fedorov VERBOSE("%s%s%s %zu\n", "FCONF: `tbbr.", "mbedtls_heap_size", 89*c3825c9bSAlexei Fedorov "` cell found with value =", tbbr_dyn_config.mbedtls_heap_size); 90*c3825c9bSAlexei Fedorov #if MEASURED_BOOT 91*c3825c9bSAlexei Fedorov VERBOSE("%s%s%s %p\n", "FCONF: `tbbr.", "bl2_hash_data", 92*c3825c9bSAlexei Fedorov "` array found at address =", tbbr_dyn_config.bl2_hash_data); 93*c3825c9bSAlexei Fedorov #endif 94ce852841SLouis Mayencourt return 0; 95ce852841SLouis Mayencourt } 96ce852841SLouis Mayencourt 9725d740c4SMadhukar Pappireddy FCONF_REGISTER_POPULATOR(TB_FW, tbbr, fconf_populate_tbbr_dyn_config); 98