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