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