blob: aea3bf022600798c62705f9432fdb09fb339cf33 [file] [log] [blame]
Michal Simekd903ce42024-05-29 16:47:58 +02001// SPDX-License-Identifier: GPL-2.0
2/*
3 * Copyright (C) 2021 - 2022, Xilinx, Inc.
4 * Copyright (C) 2022 - 2024, Advanced Micro Devices, Inc.
5 *
6 * Michal Simek <michal.simek@amd.com>
7 */
8
9#include <cpu_func.h>
10#include <fdtdec.h>
11#include <init.h>
12#include <env_internal.h>
13#include <log.h>
14#include <malloc.h>
15#include <time.h>
16#include <asm/cache.h>
17#include <asm/global_data.h>
18#include <asm/io.h>
19#include <asm/arch/hardware.h>
20#include <asm/arch/sys_proto.h>
21#include <dm/device.h>
22#include <dm/uclass.h>
Prasad Kummari48630ae2025-03-27 16:21:59 +053023#include <versalpl.h>
Michal Simekd903ce42024-05-29 16:47:58 +020024#include "../../xilinx/common/board.h"
25
26#include <linux/bitfield.h>
27#include <debug_uart.h>
28#include <generated/dt.h>
29
30DECLARE_GLOBAL_DATA_PTR;
31
Prasad Kummari48630ae2025-03-27 16:21:59 +053032#if defined(CONFIG_FPGA_VERSALPL)
33static xilinx_desc versalpl = {
34 xilinx_versal2, csu_dma, 1, &versal_op, 0, &versal_op, NULL,
35 FPGA_LEGACY
36};
37#endif
38
Michal Simekd903ce42024-05-29 16:47:58 +020039int board_init(void)
40{
41 printf("EL Level:\tEL%d\n", current_el());
42
Prasad Kummari48630ae2025-03-27 16:21:59 +053043#if defined(CONFIG_FPGA_VERSALPL)
44 fpga_init();
45 fpga_add(fpga_xilinx, &versalpl);
46#endif
47
Michal Simekd903ce42024-05-29 16:47:58 +020048 return 0;
49}
50
51static u32 platform_id, platform_version;
52
53char *soc_name_decode(void)
54{
55 char *name, *platform_name;
56
57 switch (platform_id) {
58 case VERSAL2_SPP:
59 platform_name = "spp";
60 break;
61 case VERSAL2_EMU:
62 platform_name = "emu";
63 break;
64 case VERSAL2_SPP_MMD:
65 platform_name = "spp-mmd";
66 break;
67 case VERSAL2_EMU_MMD:
68 platform_name = "emu-mmd";
69 break;
70 case VERSAL2_QEMU:
71 platform_name = "qemu";
72 break;
73 default:
74 return NULL;
75 }
76
77 /*
78 * --rev. are 6 chars
79 * max platform name is qemu which is 4 chars
80 * platform version number are 1+1
81 * Plus 1 char for \n
82 */
83 name = calloc(1, strlen(CONFIG_SYS_BOARD) + 13);
84 if (!name)
85 return NULL;
86
87 sprintf(name, "%s-%s-rev%d.%d-el%d", CONFIG_SYS_BOARD,
88 platform_name, platform_version / 10,
89 platform_version % 10, current_el());
90
91 return name;
92}
93
94bool soc_detection(void)
95{
96 u32 version, ps_version;
97
98 version = readl(PMC_TAP_VERSION);
99 platform_id = FIELD_GET(PLATFORM_MASK, version);
100 ps_version = FIELD_GET(PS_VERSION_MASK, version);
101
102 debug("idcode %x, version %x, usercode %x\n",
103 readl(PMC_TAP_IDCODE), version,
104 readl(PMC_TAP_USERCODE));
105
106 debug("pmc_ver %lx, ps version %x, rtl version %lx\n",
107 FIELD_GET(PMC_VERSION_MASK, version),
108 ps_version,
109 FIELD_GET(RTL_VERSION_MASK, version));
110
111 platform_version = FIELD_GET(PLATFORM_VERSION_MASK, version);
112
113 debug("Platform id: %d version: %d.%d\n", platform_id,
114 platform_version / 10, platform_version % 10);
115
116 return true;
117}
118
119int board_early_init_r(void)
120{
121 u32 val;
122
123 if (current_el() != 3)
124 return 0;
125
126 debug("iou_switch ctrl div0 %x\n",
127 readl(&crlapb_base->iou_switch_ctrl));
128
129 writel(IOU_SWITCH_CTRL_CLKACT_BIT |
130 (CONFIG_IOU_SWITCH_DIVISOR0 << IOU_SWITCH_CTRL_DIVISOR0_SHIFT),
131 &crlapb_base->iou_switch_ctrl);
132
133 /* Global timer init - Program time stamp reference clk */
134 val = readl(&crlapb_base->timestamp_ref_ctrl);
135 val |= CRL_APB_TIMESTAMP_REF_CTRL_CLKACT_BIT;
136 writel(val, &crlapb_base->timestamp_ref_ctrl);
137
138 debug("ref ctrl 0x%x\n",
139 readl(&crlapb_base->timestamp_ref_ctrl));
140
141 /* Clear reset of timestamp reg */
142 writel(0, &crlapb_base->rst_timestamp);
143
144 /*
145 * Program freq register in System counter and
146 * enable system counter.
147 */
148 writel(CONFIG_COUNTER_FREQUENCY,
149 &iou_scntr_secure->base_frequency_id_register);
150
151 debug("counter val 0x%x\n",
152 readl(&iou_scntr_secure->base_frequency_id_register));
153
154 writel(IOU_SCNTRS_CONTROL_EN,
155 &iou_scntr_secure->counter_control_register);
156
157 debug("scntrs control 0x%x\n",
158 readl(&iou_scntr_secure->counter_control_register));
159 debug("timer 0x%llx\n", get_ticks());
160 debug("timer 0x%llx\n", get_ticks());
161
162 return 0;
163}
164
Michal Simek8bb91ee2025-02-18 13:40:48 +0100165static u8 versal2_get_bootmode(void)
Michal Simekd903ce42024-05-29 16:47:58 +0200166{
167 u8 bootmode;
168 u32 reg = 0;
169
170 reg = readl(&crp_base->boot_mode_usr);
171
172 if (reg >> BOOT_MODE_ALT_SHIFT)
173 reg >>= BOOT_MODE_ALT_SHIFT;
174
175 bootmode = reg & BOOT_MODES_MASK;
176
177 return bootmode;
178}
179
180static int boot_targets_setup(void)
181{
182 u8 bootmode;
183 struct udevice *dev;
184 int bootseq = -1;
185 int bootseq_len = 0;
186 int env_targets_len = 0;
187 const char *mode = NULL;
188 char *new_targets;
189 char *env_targets;
190
Michal Simek8bb91ee2025-02-18 13:40:48 +0100191 bootmode = versal2_get_bootmode();
Michal Simekd903ce42024-05-29 16:47:58 +0200192
193 puts("Bootmode: ");
194 switch (bootmode) {
195 case USB_MODE:
196 puts("USB_MODE\n");
197 mode = "usb_dfu0 usb_dfu1";
198 break;
199 case JTAG_MODE:
200 puts("JTAG_MODE\n");
201 mode = "jtag pxe dhcp";
202 break;
203 case QSPI_MODE_24BIT:
204 puts("QSPI_MODE_24\n");
205 if (uclass_get_device_by_name(UCLASS_SPI,
206 "spi@f1030000", &dev)) {
207 debug("QSPI driver for QSPI device is not present\n");
208 break;
209 }
210 mode = "xspi";
211 bootseq = dev_seq(dev);
212 break;
213 case QSPI_MODE_32BIT:
214 puts("QSPI_MODE_32\n");
215 if (uclass_get_device_by_name(UCLASS_SPI,
216 "spi@f1030000", &dev)) {
217 debug("QSPI driver for QSPI device is not present\n");
218 break;
219 }
220 mode = "xspi";
221 bootseq = dev_seq(dev);
222 break;
223 case OSPI_MODE:
224 puts("OSPI_MODE\n");
225 if (uclass_get_device_by_name(UCLASS_SPI,
226 "spi@f1010000", &dev)) {
227 debug("OSPI driver for OSPI device is not present\n");
228 break;
229 }
230 mode = "xspi";
231 bootseq = dev_seq(dev);
232 break;
233 case EMMC_MODE:
234 puts("EMMC_MODE\n");
235 mode = "mmc";
236 bootseq = dev_seq(dev);
237 break;
238 case SELECTMAP_MODE:
239 puts("SELECTMAP_MODE\n");
240 break;
241 case SD_MODE:
242 puts("SD_MODE\n");
243 if (uclass_get_device_by_name(UCLASS_MMC,
244 "mmc@f1040000", &dev)) {
245 debug("SD0 driver for SD0 device is not present\n");
246 break;
247 }
248 debug("mmc0 device found at %p, seq %d\n", dev, dev_seq(dev));
249
250 mode = "mmc";
251 bootseq = dev_seq(dev);
252 break;
253 case SD1_LSHFT_MODE:
254 puts("LVL_SHFT_");
255 fallthrough;
256 case SD_MODE1:
257 puts("SD_MODE1\n");
258 if (uclass_get_device_by_name(UCLASS_MMC,
259 "mmc@f1050000", &dev)) {
260 debug("SD1 driver for SD1 device is not present\n");
261 break;
262 }
263 debug("mmc1 device found at %p, seq %d\n", dev, dev_seq(dev));
264
265 mode = "mmc";
266 bootseq = dev_seq(dev);
267 break;
Venkatesh Yadav Abbarapu94fb42f2025-02-24 15:28:06 -1200268 case UFS_MODE:
269 puts("UFS_MODE\n");
270 if (uclass_get_device(UCLASS_UFS, 0, &dev)) {
271 debug("UFS driver for UFS device is not present\n");
272 break;
273 }
274 debug("ufs device found at %p\n", dev);
275
276 mode = "ufs";
277 break;
Michal Simekd903ce42024-05-29 16:47:58 +0200278 default:
279 printf("Invalid Boot Mode:0x%x\n", bootmode);
280 break;
281 }
282
283 if (mode) {
284 if (bootseq >= 0) {
285 bootseq_len = snprintf(NULL, 0, "%i", bootseq);
286 debug("Bootseq len: %x\n", bootseq_len);
287 }
288
289 /*
290 * One terminating char + one byte for space between mode
291 * and default boot_targets
292 */
293 env_targets = env_get("boot_targets");
294 if (env_targets)
295 env_targets_len = strlen(env_targets);
296
297 new_targets = calloc(1, strlen(mode) + env_targets_len + 2 +
298 bootseq_len);
299 if (!new_targets)
300 return -ENOMEM;
301
302 if (bootseq >= 0)
303 sprintf(new_targets, "%s%x %s", mode, bootseq,
304 env_targets ? env_targets : "");
305 else
306 sprintf(new_targets, "%s %s", mode,
307 env_targets ? env_targets : "");
308
309 env_set("boot_targets", new_targets);
310 }
311
312 return 0;
313}
314
315int board_late_init(void)
316{
317 int ret;
318
319 if (!(gd->flags & GD_FLG_ENV_DEFAULT)) {
320 debug("Saved variables - Skipping\n");
321 return 0;
322 }
323
324 if (!IS_ENABLED(CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG))
325 return 0;
326
327 if (IS_ENABLED(CONFIG_DISTRO_DEFAULTS)) {
328 ret = boot_targets_setup();
329 if (ret)
330 return ret;
331 }
332
333 return board_late_init_xilinx();
334}
335
336int dram_init_banksize(void)
337{
338 int ret;
339
340 ret = fdtdec_setup_memory_banksize();
341 if (ret)
342 return ret;
343
344 mem_map_fill();
345
346 return 0;
347}
348
349int dram_init(void)
350{
351 int ret;
352
353 if (IS_ENABLED(CONFIG_SYS_MEM_RSVD_FOR_MMU))
354 ret = fdtdec_setup_mem_size_base();
355 else
356 ret = fdtdec_setup_mem_size_base_lowest();
357
358 if (ret)
359 return -EINVAL;
360
361 return 0;
362}
363
364void reset_cpu(void)
365{
366}