xref: /rk3399_ARM-atf/plat/xilinx/zynqmp/aarch64/zynqmp_common.c (revision 2863b0c46633d28a920ef14c68ee4a6e4842ab0b)
1c8284409SSoren Brinkmann /*
2619bc13eSMichal Simek  * Copyright (c) 2013-2022, Arm Limited and Contributors. All rights reserved.
3fdda980aSPrasad Kummari  * Copyright (c) 2022-2024, Advanced Micro Devices, Inc. All rights reserved.
4c8284409SSoren Brinkmann  *
582cb2c1aSdp-arm  * SPDX-License-Identifier: BSD-3-Clause
6c8284409SSoren Brinkmann  */
7c8284409SSoren Brinkmann 
891bf4c5cSSiva Durga Prasad Paladugu #include <stdbool.h>
991bf4c5cSSiva Durga Prasad Paladugu #include <string.h>
1009d40e0eSAntonio Nino Diaz 
1109d40e0eSAntonio Nino Diaz #include <common/debug.h>
1209d40e0eSAntonio Nino Diaz #include <drivers/generic_delay_timer.h>
1309d40e0eSAntonio Nino Diaz #include <lib/mmio.h>
148f9ba3f3SMichal Simek #include <lib/smccc.h>
15fdda980aSPrasad Kummari #include <lib/xlat_tables/xlat_tables_v2.h>
1601a326abSPrasad Kummari #include <plat/common/platform.h>
176c08d1dfSMaheedhar Bollapalli #include <plat_arm.h>
1801a326abSPrasad Kummari #include <services/arm_arch_svc.h>
1901a326abSPrasad Kummari 
20705bed5dSJolly Shah #include <plat_ipi.h>
2131c3842eSJolly Shah #include <plat_private.h>
228f9ba3f3SMichal Simek #include <plat_startup.h>
2309d40e0eSAntonio Nino Diaz 
24a92681d9SJay Buddhabhatti #include "zynqmp_pm_api_sys.h"
25c8284409SSoren Brinkmann 
26c8284409SSoren Brinkmann /*
27c8284409SSoren Brinkmann  * Table of regions to map using the MMU.
28c8284409SSoren Brinkmann  * This doesn't include TZRAM as the 'mem_layout' argument passed to
29c8284409SSoren Brinkmann  * configure_mmu_elx() will give the available subset of that,
30c8284409SSoren Brinkmann  */
3151564354SPrasad Kummari const mmap_region_t plat_zynqmp_mmap[] = {
32fdda980aSPrasad Kummari 	MAP_REGION_FLAT(DEVICE0_BASE, DEVICE0_SIZE, MT_DEVICE | MT_RW | MT_SECURE),
33fdda980aSPrasad Kummari 	MAP_REGION_FLAT(DEVICE1_BASE, DEVICE1_SIZE, MT_DEVICE | MT_RW | MT_SECURE),
34fdda980aSPrasad Kummari 	MAP_REGION_FLAT(CRF_APB_BASE, CRF_APB_SIZE, MT_DEVICE | MT_RW | MT_SECURE),
35c8284409SSoren Brinkmann 	{0}
36c8284409SSoren Brinkmann };
37c8284409SSoren Brinkmann 
3851564354SPrasad Kummari const mmap_region_t *plat_get_mmap(void)
3951564354SPrasad Kummari {
4051564354SPrasad Kummari 	return plat_zynqmp_mmap;
4151564354SPrasad Kummari }
4251564354SPrasad Kummari 
43ffa91031SVenkatesh Yadav Abbarapu static uint32_t zynqmp_get_silicon_ver(void)
44c8284409SSoren Brinkmann {
45*2863b0c4SMaheedhar Bollapalli 	static uint32_t ver;
46c8284409SSoren Brinkmann 
47*2863b0c4SMaheedhar Bollapalli 	if (ver == 0U) {
48466675c2SSoren Brinkmann 		ver = mmio_read_32(ZYNQMP_CSU_BASEADDR +
49466675c2SSoren Brinkmann 				   ZYNQMP_CSU_VERSION_OFFSET);
50c8284409SSoren Brinkmann 		ver &= ZYNQMP_SILICON_VER_MASK;
51c8284409SSoren Brinkmann 		ver >>= ZYNQMP_SILICON_VER_SHIFT;
52466675c2SSoren Brinkmann 	}
53c8284409SSoren Brinkmann 
54c8284409SSoren Brinkmann 	return ver;
55c8284409SSoren Brinkmann }
56c8284409SSoren Brinkmann 
5704a48335SMichal Simek uint32_t get_uart_clk(void)
58c8284409SSoren Brinkmann {
59c8284409SSoren Brinkmann 	unsigned int ver = zynqmp_get_silicon_ver();
60c8284409SSoren Brinkmann 
61eb0d2b17SVenkatesh Yadav Abbarapu 	if (ver == ZYNQMP_CSU_VERSION_QEMU) {
62c8284409SSoren Brinkmann 		return 133000000;
63eb0d2b17SVenkatesh Yadav Abbarapu 	} else {
64c8284409SSoren Brinkmann 		return 100000000;
65c8284409SSoren Brinkmann 	}
66eb0d2b17SVenkatesh Yadav Abbarapu }
67c8284409SSoren Brinkmann 
68c8284409SSoren Brinkmann #if LOG_LEVEL >= LOG_LEVEL_NOTICE
69c8284409SSoren Brinkmann static const struct {
707e3e7999SMichal Simek 	uint8_t id;
7191bf4c5cSSiva Durga Prasad Paladugu 	bool evexists;
727e3e7999SMichal Simek 	uint16_t ver;
737e3e7999SMichal Simek 	char *name;
747e3e7999SMichal Simek } __packed zynqmp_devices[] = {
75c8284409SSoren Brinkmann 	{
76c8284409SSoren Brinkmann 		.id = 0x10,
777a30e08bSVenkatesh Yadav Abbarapu 		.name = "XCZU3EG",
78c8284409SSoren Brinkmann 	},
79c8284409SSoren Brinkmann 	{
80915d4872SSiva Durga Prasad Paladugu 		.id = 0x10,
81915d4872SSiva Durga Prasad Paladugu 		.ver = 0x2c,
827a30e08bSVenkatesh Yadav Abbarapu 		.name = "XCZU3CG",
83915d4872SSiva Durga Prasad Paladugu 	},
84915d4872SSiva Durga Prasad Paladugu 	{
85c8284409SSoren Brinkmann 		.id = 0x11,
867a30e08bSVenkatesh Yadav Abbarapu 		.name = "XCZU2EG",
87c8284409SSoren Brinkmann 	},
88c8284409SSoren Brinkmann 	{
89915d4872SSiva Durga Prasad Paladugu 		.id = 0x11,
90915d4872SSiva Durga Prasad Paladugu 		.ver = 0x2c,
917a30e08bSVenkatesh Yadav Abbarapu 		.name = "XCZU2CG",
92915d4872SSiva Durga Prasad Paladugu 	},
93915d4872SSiva Durga Prasad Paladugu 	{
94c8284409SSoren Brinkmann 		.id = 0x20,
957a30e08bSVenkatesh Yadav Abbarapu 		.name = "XCZU5EV",
9691bf4c5cSSiva Durga Prasad Paladugu 		.evexists = true,
97c8284409SSoren Brinkmann 	},
98c8284409SSoren Brinkmann 	{
99915d4872SSiva Durga Prasad Paladugu 		.id = 0x20,
100915d4872SSiva Durga Prasad Paladugu 		.ver = 0x100,
1017a30e08bSVenkatesh Yadav Abbarapu 		.name = "XCZU5EG",
10291bf4c5cSSiva Durga Prasad Paladugu 		.evexists = true,
103915d4872SSiva Durga Prasad Paladugu 	},
104915d4872SSiva Durga Prasad Paladugu 	{
105915d4872SSiva Durga Prasad Paladugu 		.id = 0x20,
106915d4872SSiva Durga Prasad Paladugu 		.ver = 0x12c,
1077a30e08bSVenkatesh Yadav Abbarapu 		.name = "XCZU5CG",
108915d4872SSiva Durga Prasad Paladugu 	},
109915d4872SSiva Durga Prasad Paladugu 	{
110c8284409SSoren Brinkmann 		.id = 0x21,
1117a30e08bSVenkatesh Yadav Abbarapu 		.name = "XCZU4EV",
11291bf4c5cSSiva Durga Prasad Paladugu 		.evexists = true,
113c8284409SSoren Brinkmann 	},
114c8284409SSoren Brinkmann 	{
115915d4872SSiva Durga Prasad Paladugu 		.id = 0x21,
116915d4872SSiva Durga Prasad Paladugu 		.ver = 0x100,
1177a30e08bSVenkatesh Yadav Abbarapu 		.name = "XCZU4EG",
11891bf4c5cSSiva Durga Prasad Paladugu 		.evexists = true,
119915d4872SSiva Durga Prasad Paladugu 	},
120915d4872SSiva Durga Prasad Paladugu 	{
121915d4872SSiva Durga Prasad Paladugu 		.id = 0x21,
122915d4872SSiva Durga Prasad Paladugu 		.ver = 0x12c,
1237a30e08bSVenkatesh Yadav Abbarapu 		.name = "XCZU4CG",
124915d4872SSiva Durga Prasad Paladugu 	},
125915d4872SSiva Durga Prasad Paladugu 	{
126c8284409SSoren Brinkmann 		.id = 0x30,
1277a30e08bSVenkatesh Yadav Abbarapu 		.name = "XCZU7EV",
12891bf4c5cSSiva Durga Prasad Paladugu 		.evexists = true,
129c8284409SSoren Brinkmann 	},
130c8284409SSoren Brinkmann 	{
131915d4872SSiva Durga Prasad Paladugu 		.id = 0x30,
132915d4872SSiva Durga Prasad Paladugu 		.ver = 0x100,
1337a30e08bSVenkatesh Yadav Abbarapu 		.name = "XCZU7EG",
13491bf4c5cSSiva Durga Prasad Paladugu 		.evexists = true,
135915d4872SSiva Durga Prasad Paladugu 	},
136915d4872SSiva Durga Prasad Paladugu 	{
137915d4872SSiva Durga Prasad Paladugu 		.id = 0x30,
138915d4872SSiva Durga Prasad Paladugu 		.ver = 0x12c,
1397a30e08bSVenkatesh Yadav Abbarapu 		.name = "XCZU7CG",
140915d4872SSiva Durga Prasad Paladugu 	},
141915d4872SSiva Durga Prasad Paladugu 	{
142c8284409SSoren Brinkmann 		.id = 0x38,
1437a30e08bSVenkatesh Yadav Abbarapu 		.name = "XCZU9EG",
144c8284409SSoren Brinkmann 	},
145c8284409SSoren Brinkmann 	{
146915d4872SSiva Durga Prasad Paladugu 		.id = 0x38,
147915d4872SSiva Durga Prasad Paladugu 		.ver = 0x2c,
1487a30e08bSVenkatesh Yadav Abbarapu 		.name = "XCZU9CG",
149915d4872SSiva Durga Prasad Paladugu 	},
150915d4872SSiva Durga Prasad Paladugu 	{
151c8284409SSoren Brinkmann 		.id = 0x39,
1527a30e08bSVenkatesh Yadav Abbarapu 		.name = "XCZU6EG",
153c8284409SSoren Brinkmann 	},
154c8284409SSoren Brinkmann 	{
155915d4872SSiva Durga Prasad Paladugu 		.id = 0x39,
156915d4872SSiva Durga Prasad Paladugu 		.ver = 0x2c,
1577a30e08bSVenkatesh Yadav Abbarapu 		.name = "XCZU6CG",
158915d4872SSiva Durga Prasad Paladugu 	},
159915d4872SSiva Durga Prasad Paladugu 	{
160c8284409SSoren Brinkmann 		.id = 0x40,
1617a30e08bSVenkatesh Yadav Abbarapu 		.name = "XCZU11EG",
162c8284409SSoren Brinkmann 	},
163c8284409SSoren Brinkmann 	{
164c8284409SSoren Brinkmann 		.id = 0x50,
1657a30e08bSVenkatesh Yadav Abbarapu 		.name = "XCZU15EG",
166c8284409SSoren Brinkmann 	},
167c8284409SSoren Brinkmann 	{
168c8284409SSoren Brinkmann 		.id = 0x58,
1697a30e08bSVenkatesh Yadav Abbarapu 		.name = "XCZU19EG",
170c8284409SSoren Brinkmann 	},
171c8284409SSoren Brinkmann 	{
172c8284409SSoren Brinkmann 		.id = 0x59,
1737a30e08bSVenkatesh Yadav Abbarapu 		.name = "XCZU17EG",
174c8284409SSoren Brinkmann 	},
175d9710aebSSiva Durga Prasad Paladugu 	{
176d9710aebSSiva Durga Prasad Paladugu 		.id = 0x60,
1777a30e08bSVenkatesh Yadav Abbarapu 		.name = "XCZU28DR",
178d9710aebSSiva Durga Prasad Paladugu 	},
179d9710aebSSiva Durga Prasad Paladugu 	{
180d9710aebSSiva Durga Prasad Paladugu 		.id = 0x61,
1817a30e08bSVenkatesh Yadav Abbarapu 		.name = "XCZU21DR",
182d9710aebSSiva Durga Prasad Paladugu 	},
183d9710aebSSiva Durga Prasad Paladugu 	{
184d9710aebSSiva Durga Prasad Paladugu 		.id = 0x62,
1857a30e08bSVenkatesh Yadav Abbarapu 		.name = "XCZU29DR",
186d9710aebSSiva Durga Prasad Paladugu 	},
187d9710aebSSiva Durga Prasad Paladugu 	{
188d9710aebSSiva Durga Prasad Paladugu 		.id = 0x63,
1897a30e08bSVenkatesh Yadav Abbarapu 		.name = "XCZU23DR",
190d9710aebSSiva Durga Prasad Paladugu 	},
191d9710aebSSiva Durga Prasad Paladugu 	{
192d9710aebSSiva Durga Prasad Paladugu 		.id = 0x64,
1937a30e08bSVenkatesh Yadav Abbarapu 		.name = "XCZU27DR",
194d9710aebSSiva Durga Prasad Paladugu 	},
195d9710aebSSiva Durga Prasad Paladugu 	{
196d9710aebSSiva Durga Prasad Paladugu 		.id = 0x65,
1977a30e08bSVenkatesh Yadav Abbarapu 		.name = "XCZU25DR",
198d9710aebSSiva Durga Prasad Paladugu 	},
199345a85aeSSiva Durga Prasad Paladugu 	{
200345a85aeSSiva Durga Prasad Paladugu 		.id = 0x66,
2017a30e08bSVenkatesh Yadav Abbarapu 		.name = "XCZU39DR",
202345a85aeSSiva Durga Prasad Paladugu 	},
203c613a660SVenkatesh Yadav Abbarapu 	{
2041b7e5ca9SVenkatesh Yadav Abbarapu 		.id = 0x7d,
2057a30e08bSVenkatesh Yadav Abbarapu 		.name = "XCZU43DR",
2061b7e5ca9SVenkatesh Yadav Abbarapu 	},
2071b7e5ca9SVenkatesh Yadav Abbarapu 	{
2081b7e5ca9SVenkatesh Yadav Abbarapu 		.id = 0x78,
2097a30e08bSVenkatesh Yadav Abbarapu 		.name = "XCZU46DR",
2101b7e5ca9SVenkatesh Yadav Abbarapu 	},
2111b7e5ca9SVenkatesh Yadav Abbarapu 	{
2121b7e5ca9SVenkatesh Yadav Abbarapu 		.id = 0x7f,
2137a30e08bSVenkatesh Yadav Abbarapu 		.name = "XCZU47DR",
2141b7e5ca9SVenkatesh Yadav Abbarapu 	},
2151b7e5ca9SVenkatesh Yadav Abbarapu 	{
216c613a660SVenkatesh Yadav Abbarapu 		.id = 0x7b,
2177a30e08bSVenkatesh Yadav Abbarapu 		.name = "XCZU48DR",
218c613a660SVenkatesh Yadav Abbarapu 	},
219c613a660SVenkatesh Yadav Abbarapu 	{
220c613a660SVenkatesh Yadav Abbarapu 		.id = 0x7e,
2217a30e08bSVenkatesh Yadav Abbarapu 		.name = "XCZU49DR",
222c613a660SVenkatesh Yadav Abbarapu 	},
223c8284409SSoren Brinkmann };
224c8284409SSoren Brinkmann 
22591bf4c5cSSiva Durga Prasad Paladugu #define ZYNQMP_PL_STATUS_BIT	9
22691bf4c5cSSiva Durga Prasad Paladugu #define ZYNQMP_PL_STATUS_MASK	BIT(ZYNQMP_PL_STATUS_BIT)
22791bf4c5cSSiva Durga Prasad Paladugu #define ZYNQMP_CSU_VERSION_MASK	~(ZYNQMP_PL_STATUS_MASK)
228915d4872SSiva Durga Prasad Paladugu 
229f1565907SMichal Simek #define SILICON_ID_XCK24	0x4712093U
230bfd7c881SVenkatesh Yadav Abbarapu #define SILICON_ID_XCK26	0x4724093U
2317a30e08bSVenkatesh Yadav Abbarapu 
232c8284409SSoren Brinkmann static char *zynqmp_get_silicon_idcode_name(void)
233c8284409SSoren Brinkmann {
23491bf4c5cSSiva Durga Prasad Paladugu 	uint32_t id, ver, chipid[2];
23591bf4c5cSSiva Durga Prasad Paladugu 	size_t i, j, len;
23691bf4c5cSSiva Durga Prasad Paladugu 	const char *name = "EG/EV";
237c8284409SSoren Brinkmann 
238eb0d2b17SVenkatesh Yadav Abbarapu 	if (pm_get_chipid(chipid) != PM_RET_SUCCESS) {
2397a30e08bSVenkatesh Yadav Abbarapu 		return "XCZUUNKN";
240eb0d2b17SVenkatesh Yadav Abbarapu 	}
24191bf4c5cSSiva Durga Prasad Paladugu 
24291bf4c5cSSiva Durga Prasad Paladugu 	id = chipid[0] & (ZYNQMP_CSU_IDCODE_DEVICE_CODE_MASK |
24391bf4c5cSSiva Durga Prasad Paladugu 			  ZYNQMP_CSU_IDCODE_SVD_MASK);
24491bf4c5cSSiva Durga Prasad Paladugu 	id >>= ZYNQMP_CSU_IDCODE_SVD_SHIFT;
24591bf4c5cSSiva Durga Prasad Paladugu 	ver = chipid[1] >> ZYNQMP_EFUSE_IPDISABLE_SHIFT;
246915d4872SSiva Durga Prasad Paladugu 
247915d4872SSiva Durga Prasad Paladugu 	for (i = 0; i < ARRAY_SIZE(zynqmp_devices); i++) {
2485b542313SMaheedhar Bollapalli 		if ((zynqmp_devices[i].id == id) &&
2495b542313SMaheedhar Bollapalli 		    (zynqmp_devices[i].ver == (ver & ZYNQMP_CSU_VERSION_MASK))) {
25091bf4c5cSSiva Durga Prasad Paladugu 			break;
251c8284409SSoren Brinkmann 		}
252eb0d2b17SVenkatesh Yadav Abbarapu 	}
25391bf4c5cSSiva Durga Prasad Paladugu 
2547a30e08bSVenkatesh Yadav Abbarapu 	if (i >= ARRAY_SIZE(zynqmp_devices)) {
25586869f99SVenkatesh Yadav Abbarapu 		switch (chipid[0]) {
25686869f99SVenkatesh Yadav Abbarapu 		case SILICON_ID_XCK24:
25786869f99SVenkatesh Yadav Abbarapu 			return "XCK24";
25886869f99SVenkatesh Yadav Abbarapu 		case SILICON_ID_XCK26:
2597a30e08bSVenkatesh Yadav Abbarapu 			return "XCK26";
26086869f99SVenkatesh Yadav Abbarapu 		default:
2617a30e08bSVenkatesh Yadav Abbarapu 			return "XCZUUNKN";
2627a30e08bSVenkatesh Yadav Abbarapu 		}
2637a30e08bSVenkatesh Yadav Abbarapu 	}
26491bf4c5cSSiva Durga Prasad Paladugu 
265eb0d2b17SVenkatesh Yadav Abbarapu 	if (!zynqmp_devices[i].evexists) {
26691bf4c5cSSiva Durga Prasad Paladugu 		return zynqmp_devices[i].name;
267eb0d2b17SVenkatesh Yadav Abbarapu 	}
26891bf4c5cSSiva Durga Prasad Paladugu 
269dd1fe717SVenkatesh Yadav Abbarapu 	if ((ver & ZYNQMP_PL_STATUS_MASK) != 0U) {
27091bf4c5cSSiva Durga Prasad Paladugu 		return zynqmp_devices[i].name;
271eb0d2b17SVenkatesh Yadav Abbarapu 	}
27291bf4c5cSSiva Durga Prasad Paladugu 
273895e8029SMaheedhar Bollapalli 	len = strlen(zynqmp_devices[i].name) - 2U;
27491bf4c5cSSiva Durga Prasad Paladugu 	for (j = 0; j < strlen(name); j++) {
27591bf4c5cSSiva Durga Prasad Paladugu 		zynqmp_devices[i].name[len] = name[j];
27691bf4c5cSSiva Durga Prasad Paladugu 		len++;
27791bf4c5cSSiva Durga Prasad Paladugu 	}
27891bf4c5cSSiva Durga Prasad Paladugu 	zynqmp_devices[i].name[len] = '\0';
27991bf4c5cSSiva Durga Prasad Paladugu 
28091bf4c5cSSiva Durga Prasad Paladugu 	return zynqmp_devices[i].name;
281c8284409SSoren Brinkmann }
282c8284409SSoren Brinkmann 
283c8284409SSoren Brinkmann static unsigned int zynqmp_get_rtl_ver(void)
284c8284409SSoren Brinkmann {
285c8284409SSoren Brinkmann 	uint32_t ver;
286c8284409SSoren Brinkmann 
287c8284409SSoren Brinkmann 	ver = mmio_read_32(ZYNQMP_CSU_BASEADDR + ZYNQMP_CSU_VERSION_OFFSET);
288c8284409SSoren Brinkmann 	ver &= ZYNQMP_RTL_VER_MASK;
289c8284409SSoren Brinkmann 	ver >>= ZYNQMP_RTL_VER_SHIFT;
290c8284409SSoren Brinkmann 
291c8284409SSoren Brinkmann 	return ver;
292c8284409SSoren Brinkmann }
293c8284409SSoren Brinkmann 
294c8284409SSoren Brinkmann static char *zynqmp_print_silicon_idcode(void)
295c8284409SSoren Brinkmann {
296c8284409SSoren Brinkmann 	uint32_t id, maskid, tmp;
297c8284409SSoren Brinkmann 
298c8284409SSoren Brinkmann 	id = mmio_read_32(ZYNQMP_CSU_BASEADDR + ZYNQMP_CSU_IDCODE_OFFSET);
299c8284409SSoren Brinkmann 
300c8284409SSoren Brinkmann 	tmp = id;
301c8284409SSoren Brinkmann 	tmp &= ZYNQMP_CSU_IDCODE_XILINX_ID_MASK |
302648fe99eSSoren Brinkmann 	       ZYNQMP_CSU_IDCODE_FAMILY_MASK;
3035b542313SMaheedhar Bollapalli 	maskid = (ZYNQMP_CSU_IDCODE_XILINX_ID << ZYNQMP_CSU_IDCODE_XILINX_ID_SHIFT) |
3045b542313SMaheedhar Bollapalli 		 (ZYNQMP_CSU_IDCODE_FAMILY << ZYNQMP_CSU_IDCODE_FAMILY_SHIFT);
305c8284409SSoren Brinkmann 	if (tmp != maskid) {
306d6760c4dSAkshay Belsare 		ERROR("Incorrect IDCODE 0x%x, maskid 0x%x\n", id, maskid);
307c8284409SSoren Brinkmann 		return "UNKN";
308c8284409SSoren Brinkmann 	}
309d6760c4dSAkshay Belsare 	VERBOSE("IDCODE 0x%x\n", id);
310c8284409SSoren Brinkmann 	return zynqmp_get_silicon_idcode_name();
311c8284409SSoren Brinkmann }
312c8284409SSoren Brinkmann 
3138f9ba3f3SMichal Simek int32_t plat_is_smccc_feature_available(u_register_t fid)
3148f9ba3f3SMichal Simek {
3158f9ba3f3SMichal Simek 	switch (fid) {
3168f9ba3f3SMichal Simek 	case SMCCC_ARCH_SOC_ID:
3178f9ba3f3SMichal Simek 		return SMC_ARCH_CALL_SUCCESS;
3188f9ba3f3SMichal Simek 	default:
3198f9ba3f3SMichal Simek 		return SMC_ARCH_CALL_NOT_SUPPORTED;
3208f9ba3f3SMichal Simek 	}
3218f9ba3f3SMichal Simek 
3228f9ba3f3SMichal Simek 	return SMC_ARCH_CALL_NOT_SUPPORTED;
3238f9ba3f3SMichal Simek }
3248f9ba3f3SMichal Simek 
3258f9ba3f3SMichal Simek int32_t plat_get_soc_version(void)
3268f9ba3f3SMichal Simek {
3278f9ba3f3SMichal Simek 	uint32_t chip_id = zynqmp_get_silicon_ver();
3288f9ba3f3SMichal Simek 	uint32_t manfid = SOC_ID_SET_JEP_106(JEDEC_XILINX_BKID, JEDEC_XILINX_MFID);
329*2863b0c4SMaheedhar Bollapalli 	uint32_t result = (manfid | (chip_id & 0xFFFFU));
3308f9ba3f3SMichal Simek 
331*2863b0c4SMaheedhar Bollapalli 	return (int32_t)result;
3328f9ba3f3SMichal Simek }
3338f9ba3f3SMichal Simek 
3348f9ba3f3SMichal Simek int32_t plat_get_soc_revision(void)
3358f9ba3f3SMichal Simek {
3368f9ba3f3SMichal Simek 	return mmio_read_32(ZYNQMP_CSU_BASEADDR + ZYNQMP_CSU_IDCODE_OFFSET);
3378f9ba3f3SMichal Simek }
3388f9ba3f3SMichal Simek 
339ffa91031SVenkatesh Yadav Abbarapu static uint32_t zynqmp_get_ps_ver(void)
340c8284409SSoren Brinkmann {
341c8284409SSoren Brinkmann 	uint32_t ver = mmio_read_32(ZYNQMP_CSU_BASEADDR + ZYNQMP_CSU_VERSION_OFFSET);
342c8284409SSoren Brinkmann 
343c8284409SSoren Brinkmann 	ver &= ZYNQMP_PS_VER_MASK;
344c8284409SSoren Brinkmann 	ver >>= ZYNQMP_PS_VER_SHIFT;
345c8284409SSoren Brinkmann 
346bfd7c881SVenkatesh Yadav Abbarapu 	return ver + 1U;
347c8284409SSoren Brinkmann }
348c8284409SSoren Brinkmann 
349c8284409SSoren Brinkmann static void zynqmp_print_platform_name(void)
350c8284409SSoren Brinkmann {
351ffa91031SVenkatesh Yadav Abbarapu 	uint32_t ver = zynqmp_get_silicon_ver();
352ffa91031SVenkatesh Yadav Abbarapu 	uint32_t rtl = zynqmp_get_rtl_ver();
353bb145c9dSMaheedhar Bollapalli 	const char *label = "Unknown";
354c8284409SSoren Brinkmann 
355c8284409SSoren Brinkmann 	switch (ver) {
356c8284409SSoren Brinkmann 	case ZYNQMP_CSU_VERSION_QEMU:
357c8284409SSoren Brinkmann 		label = "QEMU";
358c8284409SSoren Brinkmann 		break;
359c8284409SSoren Brinkmann 	case ZYNQMP_CSU_VERSION_SILICON:
360c8284409SSoren Brinkmann 		label = "silicon";
361c8284409SSoren Brinkmann 		break;
362649c48f5SJonathan Wright 	default:
363649c48f5SJonathan Wright 		/* Do nothing in default case */
364649c48f5SJonathan Wright 		break;
365c8284409SSoren Brinkmann 	}
366c8284409SSoren Brinkmann 
3671277af9bSVenkatesh Yadav Abbarapu 	VERBOSE("TF-A running on %s/%s at 0x%x\n",
368db97f939SVenkatesh Yadav Abbarapu 		zynqmp_print_silicon_idcode(), label, BL31_BASE);
369db97f939SVenkatesh Yadav Abbarapu 	VERBOSE("TF-A running on v%d/RTL%d.%d\n",
370*2863b0c4SMaheedhar Bollapalli 	       zynqmp_get_ps_ver(), (rtl & 0xf0U) >> 4U, rtl & 0xfU);
371c8284409SSoren Brinkmann }
372c8284409SSoren Brinkmann #else
373c8284409SSoren Brinkmann static inline void zynqmp_print_platform_name(void) { }
374c8284409SSoren Brinkmann #endif
375c8284409SSoren Brinkmann 
376ffa91031SVenkatesh Yadav Abbarapu uint32_t zynqmp_get_bootmode(void)
3772cb5bac9SSoren Brinkmann {
37829bd0e66SSiva Durga Prasad Paladugu 	uint32_t r;
379895e8029SMaheedhar Bollapalli 	enum pm_ret_status ret;
38029bd0e66SSiva Durga Prasad Paladugu 
381a6d28520SSiva Durga Prasad Paladugu 	ret = pm_mmio_read(CRL_APB_BOOT_MODE_USER, &r);
382a6d28520SSiva Durga Prasad Paladugu 
383eb0d2b17SVenkatesh Yadav Abbarapu 	if (ret != PM_RET_SUCCESS) {
38429bd0e66SSiva Durga Prasad Paladugu 		r = mmio_read_32(CRL_APB_BOOT_MODE_USER);
385eb0d2b17SVenkatesh Yadav Abbarapu 	}
3862cb5bac9SSoren Brinkmann 
3872cb5bac9SSoren Brinkmann 	return r & CRL_APB_BOOT_MODE_MASK;
3882cb5bac9SSoren Brinkmann }
3892cb5bac9SSoren Brinkmann 
390c8284409SSoren Brinkmann void zynqmp_config_setup(void)
391c8284409SSoren Brinkmann {
3929f0ddae3SRajan Vaja 	uint64_t counter_freq;
3939f0ddae3SRajan Vaja 
394705bed5dSJolly Shah 	/* Configure IPI data for ZynqMP */
395705bed5dSJolly Shah 	zynqmp_ipi_config_table_init();
396705bed5dSJolly Shah 
397c8284409SSoren Brinkmann 	zynqmp_print_platform_name();
3989f0ddae3SRajan Vaja 
3999f0ddae3SRajan Vaja 	/* Configure counter frequency */
4009f0ddae3SRajan Vaja 	counter_freq = read_cntfrq_el0();
4019f0ddae3SRajan Vaja 	if (counter_freq == ZYNQMP_DEFAULT_COUNTER_FREQ) {
4029f0ddae3SRajan Vaja 		write_cntfrq_el0(plat_get_syscnt_freq2());
4039f0ddae3SRajan Vaja 	}
4049f0ddae3SRajan Vaja 
405e1cb4da4SSoren Brinkmann 	generic_delay_timer_init();
406c8284409SSoren Brinkmann }
407c8284409SSoren Brinkmann 
408ffa91031SVenkatesh Yadav Abbarapu uint32_t plat_get_syscnt_freq2(void)
409c8284409SSoren Brinkmann {
410ffa91031SVenkatesh Yadav Abbarapu 	uint32_t ver = zynqmp_get_silicon_ver();
411c8284409SSoren Brinkmann 
412eb0d2b17SVenkatesh Yadav Abbarapu 	if (ver == ZYNQMP_CSU_VERSION_QEMU) {
41365501a7cSEdgar E. Iglesias 		return 65000000;
414eb0d2b17SVenkatesh Yadav Abbarapu 	} else {
415895e8029SMaheedhar Bollapalli 		return mmio_read_32((uint64_t)IOU_SCNTRS_BASEFREQ);
416c8284409SSoren Brinkmann 	}
417eb0d2b17SVenkatesh Yadav Abbarapu }
418