1*14d095c3SManish V Badarkhe /*
2*14d095c3SManish V Badarkhe * Copyright (c) 2020, Arm Limited. All rights reserved.
3*14d095c3SManish V Badarkhe *
4*14d095c3SManish V Badarkhe * SPDX-License-Identifier: BSD-3-Clause
5*14d095c3SManish V Badarkhe */
6*14d095c3SManish V Badarkhe
7*14d095c3SManish V Badarkhe #include <assert.h>
8*14d095c3SManish V Badarkhe
9*14d095c3SManish V Badarkhe #include <common/debug.h>
10*14d095c3SManish V Badarkhe #include <common/fdt_wrappers.h>
11*14d095c3SManish V Badarkhe
12*14d095c3SManish V Badarkhe #include <libfdt.h>
13*14d095c3SManish V Badarkhe
14*14d095c3SManish V Badarkhe #include <plat/arm/common/fconf_nv_cntr_getter.h>
15*14d095c3SManish V Badarkhe
16*14d095c3SManish V Badarkhe /*******************************************************************************
17*14d095c3SManish V Badarkhe * fconf_populate_cot_descs() - Populate available nv-counters and update global
18*14d095c3SManish V Badarkhe * structure.
19*14d095c3SManish V Badarkhe * @config[in]: Pointer to the device tree blob in memory
20*14d095c3SManish V Badarkhe *
21*14d095c3SManish V Badarkhe * Return 0 on success or an error value otherwise.
22*14d095c3SManish V Badarkhe ******************************************************************************/
fconf_populate_nv_cntrs(uintptr_t config)23*14d095c3SManish V Badarkhe static int fconf_populate_nv_cntrs(uintptr_t config)
24*14d095c3SManish V Badarkhe {
25*14d095c3SManish V Badarkhe int rc, node, child;
26*14d095c3SManish V Badarkhe uint32_t id;
27*14d095c3SManish V Badarkhe uintptr_t reg;
28*14d095c3SManish V Badarkhe
29*14d095c3SManish V Badarkhe /* As libfdt uses void *, we can't avoid this cast */
30*14d095c3SManish V Badarkhe const void *dtb = (void *)config;
31*14d095c3SManish V Badarkhe const char *compatible_str = "arm, non-volatile-counter";
32*14d095c3SManish V Badarkhe
33*14d095c3SManish V Badarkhe node = fdt_node_offset_by_compatible(dtb, -1, compatible_str);
34*14d095c3SManish V Badarkhe if (node < 0) {
35*14d095c3SManish V Badarkhe ERROR("FCONF: Can't find %s compatible in node\n",
36*14d095c3SManish V Badarkhe compatible_str);
37*14d095c3SManish V Badarkhe return node;
38*14d095c3SManish V Badarkhe }
39*14d095c3SManish V Badarkhe
40*14d095c3SManish V Badarkhe fdt_for_each_subnode(child, dtb, node) {
41*14d095c3SManish V Badarkhe
42*14d095c3SManish V Badarkhe rc = fdt_read_uint32(dtb, child, "id", &id);
43*14d095c3SManish V Badarkhe if (rc < 0) {
44*14d095c3SManish V Badarkhe ERROR("FCONF: Can't find %s property in node\n", "id");
45*14d095c3SManish V Badarkhe return rc;
46*14d095c3SManish V Badarkhe }
47*14d095c3SManish V Badarkhe
48*14d095c3SManish V Badarkhe assert(id < MAX_NV_CTR_IDS);
49*14d095c3SManish V Badarkhe
50*14d095c3SManish V Badarkhe rc = fdt_get_reg_props_by_index(dtb, child, 0, ®, NULL);
51*14d095c3SManish V Badarkhe if (rc < 0) {
52*14d095c3SManish V Badarkhe ERROR("FCONF: Can't find %s property in node\n", "reg");
53*14d095c3SManish V Badarkhe return rc;
54*14d095c3SManish V Badarkhe }
55*14d095c3SManish V Badarkhe
56*14d095c3SManish V Badarkhe nv_cntr_base_addr[id] = reg;
57*14d095c3SManish V Badarkhe }
58*14d095c3SManish V Badarkhe
59*14d095c3SManish V Badarkhe return 0;
60*14d095c3SManish V Badarkhe }
61*14d095c3SManish V Badarkhe
62*14d095c3SManish V Badarkhe FCONF_REGISTER_POPULATOR(TB_FW, nv_cntrs, fconf_populate_nv_cntrs);
63