1 /*
2  * Copyright (c) 2018-2020, ARM Limited and Contributors. All rights reserved.
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  */
6 
7 #include <libfdt.h>
8 
9 #include <arch_helpers.h>
10 #include <common/debug.h>
11 #include <common/desc_image_load.h>
12 #include <plat/arm/common/plat_arm.h>
13 #include <plat/common/platform.h>
14 
15 #include <sgi_variant.h>
16 
17 /*******************************************************************************
18  * This function inserts Platform information via device tree nodes as,
19  * system-id {
20  *    platform-id = <0>;
21  *    config-id = <0>;
22  * }
23  ******************************************************************************/
plat_sgi_append_config_node(void)24 static int plat_sgi_append_config_node(void)
25 {
26 	bl_mem_params_node_t *mem_params;
27 	void *fdt;
28 	int nodeoffset, err;
29 	unsigned int platid = 0, platcfg = 0;
30 
31 	mem_params = get_bl_mem_params_node(NT_FW_CONFIG_ID);
32 	if (mem_params == NULL) {
33 		ERROR("NT_FW CONFIG base address is NULL");
34 		return -1;
35 	}
36 
37 	fdt = (void *)(mem_params->image_info.image_base);
38 
39 	/* Check the validity of the fdt */
40 	if (fdt_check_header(fdt) != 0) {
41 		ERROR("Invalid NT_FW_CONFIG DTB passed\n");
42 		return -1;
43 	}
44 
45 	nodeoffset = fdt_subnode_offset(fdt, 0, "system-id");
46 	if (nodeoffset < 0) {
47 		ERROR("Failed to get system-id node offset\n");
48 		return -1;
49 	}
50 
51 	platid = plat_arm_sgi_get_platform_id();
52 	err = fdt_setprop_u32(fdt, nodeoffset, "platform-id", platid);
53 	if (err < 0) {
54 		ERROR("Failed to set platform-id\n");
55 		return -1;
56 	}
57 
58 	platcfg = plat_arm_sgi_get_config_id();
59 	err = fdt_setprop_u32(fdt, nodeoffset, "config-id", platcfg);
60 	if (err < 0) {
61 		ERROR("Failed to set config-id\n");
62 		return -1;
63 	}
64 
65 	platcfg = plat_arm_sgi_get_multi_chip_mode();
66 	err = fdt_setprop_u32(fdt, nodeoffset, "multi-chip-mode", platcfg);
67 	if (err < 0) {
68 		ERROR("Failed to set multi-chip-mode\n");
69 		return -1;
70 	}
71 
72 	flush_dcache_range((uintptr_t)fdt, mem_params->image_info.image_size);
73 
74 	return 0;
75 }
76 
77 /*******************************************************************************
78  * This function returns the list of executable images.
79  ******************************************************************************/
plat_get_next_bl_params(void)80 bl_params_t *plat_get_next_bl_params(void)
81 {
82 	int ret;
83 
84 	ret = plat_sgi_append_config_node();
85 	if (ret != 0)
86 		panic();
87 
88 	return arm_get_next_bl_params();
89 }
90 
91