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 21 /* As libfdt use void *, we can't avoid this cast */ 22 const void *dtb = (void *)config; 23 24 /* Assert the node offset point to "arm,tb_fw" compatible property */ 25 const char *compatible_str = "arm,tb_fw"; 26 node = fdt_node_offset_by_compatible(dtb, -1, compatible_str); 27 if (node < 0) { 28 ERROR("FCONF: Can't find %s compatible in dtb\n", compatible_str); 29 return node; 30 } 31 32 /* Locate the disable_auth cell and read the value */ 33 err = fdtw_read_cells(dtb, node, "disable_auth", 1, &tbbr_dyn_config.disable_auth); 34 if (err < 0) { 35 WARN("FCONF: Read cell failed for `disable_auth`\n"); 36 return err; 37 } 38 39 /* Check if the value is boolean */ 40 if ((tbbr_dyn_config.disable_auth != 0U) && (tbbr_dyn_config.disable_auth != 1U)) { 41 WARN("Invalid value for `disable_auth` cell %d\n", tbbr_dyn_config.disable_auth); 42 return -1; 43 } 44 45 #if defined(DYN_DISABLE_AUTH) 46 if (tbbr_dyn_config.disable_auth == 1) 47 dyn_disable_auth(); 48 #endif 49 50 VERBOSE("FCONF:tbbr.disable_auth cell found with value = %d\n", 51 tbbr_dyn_config.disable_auth); 52 53 return 0; 54 } 55 56 FCONF_REGISTER_POPULATOR(tbbr, fconf_populate_tbbr_dyn_config); 57