xref: /arm-trusted-firmware/include/lib/fconf/fconf.h (revision 91f16700b400a8c0651d24a598fc48ee2997a0d7)
1*91f16700Schasinglulu /*
2*91f16700Schasinglulu  * Copyright (c) 2019-2022, Arm Limited. All rights reserved.
3*91f16700Schasinglulu  *
4*91f16700Schasinglulu  * SPDX-License-Identifier: BSD-3-Clause
5*91f16700Schasinglulu  */
6*91f16700Schasinglulu 
7*91f16700Schasinglulu #ifndef FCONF_H
8*91f16700Schasinglulu #define FCONF_H
9*91f16700Schasinglulu 
10*91f16700Schasinglulu #include <stddef.h>
11*91f16700Schasinglulu #include <stdint.h>
12*91f16700Schasinglulu 
13*91f16700Schasinglulu /* Public API */
14*91f16700Schasinglulu #define FCONF_GET_PROPERTY(a, b, c)	a##__##b##_getter(c)
15*91f16700Schasinglulu 
16*91f16700Schasinglulu /*
17*91f16700Schasinglulu  * This macro takes three arguments:
18*91f16700Schasinglulu  *   config:	Configuration identifier
19*91f16700Schasinglulu  *   name:	property namespace
20*91f16700Schasinglulu  *   callback:	populate() function
21*91f16700Schasinglulu  */
22*91f16700Schasinglulu #define FCONF_REGISTER_POPULATOR(config, name, callback)			\
23*91f16700Schasinglulu 	__attribute__((used, section(".fconf_populator")))			\
24*91f16700Schasinglulu 	static const struct fconf_populator (name##__populator) = {		\
25*91f16700Schasinglulu 		.config_type = (#config),					\
26*91f16700Schasinglulu 		.info = (#name),						\
27*91f16700Schasinglulu 		.populate = (callback)						\
28*91f16700Schasinglulu 	};
29*91f16700Schasinglulu 
30*91f16700Schasinglulu /*
31*91f16700Schasinglulu  * Populator callback
32*91f16700Schasinglulu  *
33*91f16700Schasinglulu  * This structure are used by the fconf_populate function and should only be
34*91f16700Schasinglulu  * defined by the FCONF_REGISTER_POPULATOR macro.
35*91f16700Schasinglulu  */
36*91f16700Schasinglulu struct fconf_populator {
37*91f16700Schasinglulu 	/* Description of the data loaded by the callback */
38*91f16700Schasinglulu 	const char *config_type;
39*91f16700Schasinglulu 	const char *info;
40*91f16700Schasinglulu 
41*91f16700Schasinglulu 	/* Callback used by fconf_populate function with a provided config dtb.
42*91f16700Schasinglulu 	 * Return 0 on success, err_code < 0 otherwise.
43*91f16700Schasinglulu 	 */
44*91f16700Schasinglulu 	int (*populate)(uintptr_t config);
45*91f16700Schasinglulu };
46*91f16700Schasinglulu 
47*91f16700Schasinglulu /* This function supports to load tb_fw_config and fw_config dtb */
48*91f16700Schasinglulu int fconf_load_config(unsigned int image_id);
49*91f16700Schasinglulu 
50*91f16700Schasinglulu /* Top level populate function
51*91f16700Schasinglulu  *
52*91f16700Schasinglulu  * This function takes a configuration dtb and calls all the registered
53*91f16700Schasinglulu  * populator callback with it.
54*91f16700Schasinglulu  *
55*91f16700Schasinglulu  *  Panic on error.
56*91f16700Schasinglulu  */
57*91f16700Schasinglulu void fconf_populate(const char *config_type, uintptr_t config);
58*91f16700Schasinglulu 
59*91f16700Schasinglulu /* FCONF specific getter */
60*91f16700Schasinglulu #define fconf__dtb_getter(prop)	fconf_dtb_info.prop
61*91f16700Schasinglulu 
62*91f16700Schasinglulu /* Structure used to locally keep a reference to the config dtb. */
63*91f16700Schasinglulu struct fconf_dtb_info_t {
64*91f16700Schasinglulu 	uintptr_t base_addr;
65*91f16700Schasinglulu 	size_t size;
66*91f16700Schasinglulu };
67*91f16700Schasinglulu 
68*91f16700Schasinglulu extern struct fconf_dtb_info_t fconf_dtb_info;
69*91f16700Schasinglulu 
70*91f16700Schasinglulu #endif /* FCONF_H */
71