xref: /rk3399_ARM-atf/plat/arm/common/fconf/fconf_nv_cntr_getter.c (revision c19a4e6b4baf99445511af4016ab8d6f295dda10)
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, &reg, 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