blob: 0a9bba9dfe1261bd9be47b1c6c5c624518bd04cb [file] [log] [blame]
Chandni Cherukuri771d6442018-05-10 12:03:50 +05301/*
Tamas Ban43e0d922023-05-08 13:41:29 +02002 * Copyright (c) 2018-2024, Arm Limited and Contributors. All rights reserved.
Chandni Cherukuri771d6442018-05-10 12:03:50 +05303 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
Chandni Cherukuri771d6442018-05-10 12:03:50 +05307#include <libfdt.h>
Antonio Nino Diaze0f90632018-12-14 00:18:21 +00008
9#include <arch_helpers.h>
10#include <common/debug.h>
11#include <common/desc_image_load.h>
Nishant Sharma289f7822021-11-30 09:31:48 +000012#include <drivers/arm/css/sds.h>
Antonio Nino Diazbd7b7402019-01-25 14:30:04 +000013#include <plat/arm/common/plat_arm.h>
Antonio Nino Diaze0f90632018-12-14 00:18:21 +000014#include <plat/common/platform.h>
15
Nishant Sharma289f7822021-11-30 09:31:48 +000016#include <platform_def.h>
17#include <sgi_base_platform_def.h>
Chandni Cherukuri3aa09f72018-11-28 11:31:51 +053018#include <sgi_variant.h>
Chandni Cherukuri771d6442018-05-10 12:03:50 +053019
Nishant Sharma289f7822021-11-30 09:31:48 +000020/*
21 * Information about the isolated CPUs obtained from SDS.
22 */
23struct isolated_cpu_mpid_list {
24 uint64_t num_entries; /* Number of entries in the list */
25 uint64_t mpid_list[PLATFORM_CORE_COUNT]; /* List of isolated CPU MPIDs */
26};
27
28/* Function to read isolated CPU MPID list from SDS. */
29void plat_arm_sgi_get_isolated_cpu_list(struct isolated_cpu_mpid_list *list)
30{
31 int ret;
32
Tamas Ban43e0d922023-05-08 13:41:29 +020033 ret = sds_init(SDS_SCP_AP_REGION_ID);
Nishant Sharma289f7822021-11-30 09:31:48 +000034 if (ret != SDS_OK) {
35 ERROR("SDS initialization failed, error: %d\n", ret);
36 panic();
37 }
38
Tamas Ban43e0d922023-05-08 13:41:29 +020039 ret = sds_struct_read(SDS_SCP_AP_REGION_ID,
40 SDS_ISOLATED_CPU_LIST_ID, 0, &list->num_entries,
Nishant Sharma289f7822021-11-30 09:31:48 +000041 sizeof(list->num_entries), SDS_ACCESS_MODE_CACHED);
42 if (ret != SDS_OK) {
43 INFO("SDS CPU num elements read failed, error: %d\n", ret);
44 list->num_entries = 0;
45 return;
46 }
47
48 if (list->num_entries > PLATFORM_CORE_COUNT) {
49 ERROR("Isolated CPU list count %ld greater than max"
50 " number supported %d\n",
51 list->num_entries, PLATFORM_CORE_COUNT);
52 panic();
53 } else if (list->num_entries == 0) {
54 INFO("SDS isolated CPU list is empty\n");
55 return;
56 }
57
Tamas Ban43e0d922023-05-08 13:41:29 +020058 ret = sds_struct_read(SDS_SCP_AP_REGION_ID,
59 SDS_ISOLATED_CPU_LIST_ID,
Nishant Sharma289f7822021-11-30 09:31:48 +000060 sizeof(list->num_entries),
61 &list->mpid_list,
62 sizeof(list->mpid_list[0]) * list->num_entries,
63 SDS_ACCESS_MODE_CACHED);
64 if (ret != SDS_OK) {
65 ERROR("SDS CPU list read failed. error: %d\n", ret);
66 panic();
67 }
68}
69
Chandni Cherukuri771d6442018-05-10 12:03:50 +053070/*******************************************************************************
71 * This function inserts Platform information via device tree nodes as,
72 * system-id {
73 * platform-id = <0>;
Chandni Cherukuri33fcfee2018-08-17 11:23:46 +053074 * config-id = <0>;
Nishant Sharma289f7822021-11-30 09:31:48 +000075 * isolated-cpu-list = <0>
Chandni Cherukuri771d6442018-05-10 12:03:50 +053076 * }
77 ******************************************************************************/
78static int plat_sgi_append_config_node(void)
79{
80 bl_mem_params_node_t *mem_params;
81 void *fdt;
82 int nodeoffset, err;
Chandni Cherukuri33fcfee2018-08-17 11:23:46 +053083 unsigned int platid = 0, platcfg = 0;
Nishant Sharma289f7822021-11-30 09:31:48 +000084 struct isolated_cpu_mpid_list cpu_mpid_list = {0};
Chandni Cherukuri771d6442018-05-10 12:03:50 +053085
Chandni Cherukuri29ea98d2018-11-28 11:26:19 +053086 mem_params = get_bl_mem_params_node(NT_FW_CONFIG_ID);
Chandni Cherukuri771d6442018-05-10 12:03:50 +053087 if (mem_params == NULL) {
Chandni Cherukuri29ea98d2018-11-28 11:26:19 +053088 ERROR("NT_FW CONFIG base address is NULL");
Chandni Cherukuri771d6442018-05-10 12:03:50 +053089 return -1;
90 }
91
92 fdt = (void *)(mem_params->image_info.image_base);
93
94 /* Check the validity of the fdt */
95 if (fdt_check_header(fdt) != 0) {
Chandni Cherukuri29ea98d2018-11-28 11:26:19 +053096 ERROR("Invalid NT_FW_CONFIG DTB passed\n");
Chandni Cherukuri771d6442018-05-10 12:03:50 +053097 return -1;
98 }
99
Chandni Cherukuri33fcfee2018-08-17 11:23:46 +0530100 nodeoffset = fdt_subnode_offset(fdt, 0, "system-id");
101 if (nodeoffset < 0) {
102 ERROR("Failed to get system-id node offset\n");
Chandni Cherukuri771d6442018-05-10 12:03:50 +0530103 return -1;
104 }
105
Chandni Cherukuri3aa09f72018-11-28 11:31:51 +0530106 platid = plat_arm_sgi_get_platform_id();
Chandni Cherukuri33fcfee2018-08-17 11:23:46 +0530107 err = fdt_setprop_u32(fdt, nodeoffset, "platform-id", platid);
108 if (err < 0) {
109 ERROR("Failed to set platform-id\n");
Chandni Cherukuri771d6442018-05-10 12:03:50 +0530110 return -1;
111 }
112
Chandni Cherukuri3aa09f72018-11-28 11:31:51 +0530113 platcfg = plat_arm_sgi_get_config_id();
Chandni Cherukuri33fcfee2018-08-17 11:23:46 +0530114 err = fdt_setprop_u32(fdt, nodeoffset, "config-id", platcfg);
Chandni Cherukuri771d6442018-05-10 12:03:50 +0530115 if (err < 0) {
Chandni Cherukuri33fcfee2018-08-17 11:23:46 +0530116 ERROR("Failed to set config-id\n");
Chandni Cherukuri771d6442018-05-10 12:03:50 +0530117 return -1;
118 }
Chandni Cherukuri33fcfee2018-08-17 11:23:46 +0530119
Vijayenthiran Subramaniam03f58bf2019-10-30 12:52:25 +0530120 platcfg = plat_arm_sgi_get_multi_chip_mode();
121 err = fdt_setprop_u32(fdt, nodeoffset, "multi-chip-mode", platcfg);
122 if (err < 0) {
123 ERROR("Failed to set multi-chip-mode\n");
124 return -1;
125 }
126
Nishant Sharma289f7822021-11-30 09:31:48 +0000127 plat_arm_sgi_get_isolated_cpu_list(&cpu_mpid_list);
128 if (cpu_mpid_list.num_entries > 0) {
129 err = fdt_setprop(fdt, nodeoffset, "isolated-cpu-list",
130 &cpu_mpid_list,
131 (sizeof(cpu_mpid_list.num_entries) *
132 (cpu_mpid_list.num_entries + 1)));
133 if (err < 0) {
134 ERROR("Failed to set isolated-cpu-list, error: %d\n",
135 err);
136 }
137 }
138
Chandni Cherukuri33fcfee2018-08-17 11:23:46 +0530139 flush_dcache_range((uintptr_t)fdt, mem_params->image_info.image_size);
140
Chandni Cherukuri771d6442018-05-10 12:03:50 +0530141 return 0;
142}
143
144/*******************************************************************************
145 * This function returns the list of executable images.
146 ******************************************************************************/
147bl_params_t *plat_get_next_bl_params(void)
148{
149 int ret;
Chandni Cherukuri771d6442018-05-10 12:03:50 +0530150
151 ret = plat_sgi_append_config_node();
152 if (ret != 0)
153 panic();
154
Sathees Balya90950092018-11-15 14:22:30 +0000155 return arm_get_next_bl_params();
Chandni Cherukuri771d6442018-05-10 12:03:50 +0530156}