xref: /rk3399_ARM-atf/lib/fconf/fconf.c (revision ab1981db9ea793accf1279446b9f7666a3be04ca)
1*ab1981dbSLouis Mayencourt /*
2*ab1981dbSLouis Mayencourt  * Copyright (c) 2019-2020, ARM Limited. All rights reserved.
3*ab1981dbSLouis Mayencourt  *
4*ab1981dbSLouis Mayencourt  * SPDX-License-Identifier: BSD-3-Clause
5*ab1981dbSLouis Mayencourt  */
6*ab1981dbSLouis Mayencourt 
7*ab1981dbSLouis Mayencourt #include <assert.h>
8*ab1981dbSLouis Mayencourt 
9*ab1981dbSLouis Mayencourt #include <common/debug.h>
10*ab1981dbSLouis Mayencourt #include <lib/fconf/fconf.h>
11*ab1981dbSLouis Mayencourt #include <libfdt.h>
12*ab1981dbSLouis Mayencourt #include <platform_def.h>
13*ab1981dbSLouis Mayencourt 
14*ab1981dbSLouis Mayencourt void fconf_populate(uintptr_t config)
15*ab1981dbSLouis Mayencourt {
16*ab1981dbSLouis Mayencourt 	assert(config != 0UL);
17*ab1981dbSLouis Mayencourt 
18*ab1981dbSLouis Mayencourt 	/* Check if the pointer to DTB is correct */
19*ab1981dbSLouis Mayencourt 	if (fdt_check_header((void *)config) != 0) {
20*ab1981dbSLouis Mayencourt 		ERROR("FCONF: Invalid DTB file passed for FW_CONFIG\n");
21*ab1981dbSLouis Mayencourt 		panic();
22*ab1981dbSLouis Mayencourt 	}
23*ab1981dbSLouis Mayencourt 
24*ab1981dbSLouis Mayencourt 	INFO("FCONF: Reading firmware configuration file from: 0x%lx\n", config);
25*ab1981dbSLouis Mayencourt 
26*ab1981dbSLouis Mayencourt 	/* Go through all registered populate functions */
27*ab1981dbSLouis Mayencourt 	IMPORT_SYM(struct fconf_populator *, __FCONF_POPULATOR_START__, start);
28*ab1981dbSLouis Mayencourt 	IMPORT_SYM(struct fconf_populator *, __FCONF_POPULATOR_END__, end);
29*ab1981dbSLouis Mayencourt 	const struct fconf_populator *populator;
30*ab1981dbSLouis Mayencourt 
31*ab1981dbSLouis Mayencourt 	for (populator = start; populator != end; populator++) {
32*ab1981dbSLouis Mayencourt 		assert((populator->info != NULL) && (populator->populate != NULL));
33*ab1981dbSLouis Mayencourt 
34*ab1981dbSLouis Mayencourt 		INFO("FCONF: Reading firmware configuration information for: %s\n", populator->info);
35*ab1981dbSLouis Mayencourt 		if (populator->populate(config) != 0) {
36*ab1981dbSLouis Mayencourt 			/* TODO: handle property miss */
37*ab1981dbSLouis Mayencourt 			panic();
38*ab1981dbSLouis Mayencourt 		}
39*ab1981dbSLouis Mayencourt 	}
40*ab1981dbSLouis Mayencourt }
41