xref: /rk3399_ARM-atf/plat/xilinx/zynqmp/aarch64/zynqmp_common.c (revision 01a326abeb1726b7756ef21a3c7188ca79a30e2e)
1c8284409SSoren Brinkmann /*
2619bc13eSMichal Simek  * Copyright (c) 2013-2022, Arm Limited and Contributors. All rights reserved.
3a92681d9SJay Buddhabhatti  * Copyright (c) 2022-2023, 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>
1509d40e0eSAntonio Nino Diaz #include <lib/xlat_tables/xlat_tables.h>
16*01a326abSPrasad Kummari #include <plat/common/platform.h>
17*01a326abSPrasad Kummari #include <services/arm_arch_svc.h>
18*01a326abSPrasad Kummari 
19705bed5dSJolly Shah #include <plat_ipi.h>
2031c3842eSJolly Shah #include <plat_private.h>
218f9ba3f3SMichal Simek #include <plat_startup.h>
2209d40e0eSAntonio Nino Diaz 
23a92681d9SJay Buddhabhatti #include "zynqmp_pm_api_sys.h"
24c8284409SSoren Brinkmann 
25c8284409SSoren Brinkmann /*
26c8284409SSoren Brinkmann  * Table of regions to map using the MMU.
27c8284409SSoren Brinkmann  * This doesn't include TZRAM as the 'mem_layout' argument passed to
28c8284409SSoren Brinkmann  * configure_mmu_elx() will give the available subset of that,
29c8284409SSoren Brinkmann  */
30c8284409SSoren Brinkmann const mmap_region_t plat_arm_mmap[] = {
31c8284409SSoren Brinkmann 	{ DEVICE0_BASE, DEVICE0_BASE, DEVICE0_SIZE, MT_DEVICE | MT_RW | MT_SECURE },
32c8284409SSoren Brinkmann 	{ DEVICE1_BASE, DEVICE1_BASE, DEVICE1_SIZE, MT_DEVICE | MT_RW | MT_SECURE },
33c8284409SSoren Brinkmann 	{ CRF_APB_BASE, CRF_APB_BASE, CRF_APB_SIZE, MT_DEVICE | MT_RW | MT_SECURE },
34c8284409SSoren Brinkmann 	{0}
35c8284409SSoren Brinkmann };
36c8284409SSoren Brinkmann 
37ffa91031SVenkatesh Yadav Abbarapu static uint32_t zynqmp_get_silicon_ver(void)
38c8284409SSoren Brinkmann {
39466675c2SSoren Brinkmann 	static unsigned int ver;
40c8284409SSoren Brinkmann 
41466675c2SSoren Brinkmann 	if (!ver) {
42466675c2SSoren Brinkmann 		ver = mmio_read_32(ZYNQMP_CSU_BASEADDR +
43466675c2SSoren Brinkmann 				   ZYNQMP_CSU_VERSION_OFFSET);
44c8284409SSoren Brinkmann 		ver &= ZYNQMP_SILICON_VER_MASK;
45c8284409SSoren Brinkmann 		ver >>= ZYNQMP_SILICON_VER_SHIFT;
46466675c2SSoren Brinkmann 	}
47c8284409SSoren Brinkmann 
48c8284409SSoren Brinkmann 	return ver;
49c8284409SSoren Brinkmann }
50c8284409SSoren Brinkmann 
51ffa91031SVenkatesh Yadav Abbarapu uint32_t zynqmp_get_uart_clk(void)
52c8284409SSoren Brinkmann {
53c8284409SSoren Brinkmann 	unsigned int ver = zynqmp_get_silicon_ver();
54c8284409SSoren Brinkmann 
55eb0d2b17SVenkatesh Yadav Abbarapu 	if (ver == ZYNQMP_CSU_VERSION_QEMU) {
56c8284409SSoren Brinkmann 		return 133000000;
57eb0d2b17SVenkatesh Yadav Abbarapu 	} else {
58c8284409SSoren Brinkmann 		return 100000000;
59c8284409SSoren Brinkmann 	}
60eb0d2b17SVenkatesh Yadav Abbarapu }
61c8284409SSoren Brinkmann 
62c8284409SSoren Brinkmann #if LOG_LEVEL >= LOG_LEVEL_NOTICE
63c8284409SSoren Brinkmann static const struct {
647e3e7999SMichal Simek 	uint8_t id;
6591bf4c5cSSiva Durga Prasad Paladugu 	bool evexists;
667e3e7999SMichal Simek 	uint16_t ver;
677e3e7999SMichal Simek 	char *name;
687e3e7999SMichal Simek } __packed zynqmp_devices[] = {
69c8284409SSoren Brinkmann 	{
70c8284409SSoren Brinkmann 		.id = 0x10,
717a30e08bSVenkatesh Yadav Abbarapu 		.name = "XCZU3EG",
72c8284409SSoren Brinkmann 	},
73c8284409SSoren Brinkmann 	{
74915d4872SSiva Durga Prasad Paladugu 		.id = 0x10,
75915d4872SSiva Durga Prasad Paladugu 		.ver = 0x2c,
767a30e08bSVenkatesh Yadav Abbarapu 		.name = "XCZU3CG",
77915d4872SSiva Durga Prasad Paladugu 	},
78915d4872SSiva Durga Prasad Paladugu 	{
79c8284409SSoren Brinkmann 		.id = 0x11,
807a30e08bSVenkatesh Yadav Abbarapu 		.name = "XCZU2EG",
81c8284409SSoren Brinkmann 	},
82c8284409SSoren Brinkmann 	{
83915d4872SSiva Durga Prasad Paladugu 		.id = 0x11,
84915d4872SSiva Durga Prasad Paladugu 		.ver = 0x2c,
857a30e08bSVenkatesh Yadav Abbarapu 		.name = "XCZU2CG",
86915d4872SSiva Durga Prasad Paladugu 	},
87915d4872SSiva Durga Prasad Paladugu 	{
88c8284409SSoren Brinkmann 		.id = 0x20,
897a30e08bSVenkatesh Yadav Abbarapu 		.name = "XCZU5EV",
9091bf4c5cSSiva Durga Prasad Paladugu 		.evexists = true,
91c8284409SSoren Brinkmann 	},
92c8284409SSoren Brinkmann 	{
93915d4872SSiva Durga Prasad Paladugu 		.id = 0x20,
94915d4872SSiva Durga Prasad Paladugu 		.ver = 0x100,
957a30e08bSVenkatesh Yadav Abbarapu 		.name = "XCZU5EG",
9691bf4c5cSSiva Durga Prasad Paladugu 		.evexists = true,
97915d4872SSiva Durga Prasad Paladugu 	},
98915d4872SSiva Durga Prasad Paladugu 	{
99915d4872SSiva Durga Prasad Paladugu 		.id = 0x20,
100915d4872SSiva Durga Prasad Paladugu 		.ver = 0x12c,
1017a30e08bSVenkatesh Yadav Abbarapu 		.name = "XCZU5CG",
102915d4872SSiva Durga Prasad Paladugu 	},
103915d4872SSiva Durga Prasad Paladugu 	{
104c8284409SSoren Brinkmann 		.id = 0x21,
1057a30e08bSVenkatesh Yadav Abbarapu 		.name = "XCZU4EV",
10691bf4c5cSSiva Durga Prasad Paladugu 		.evexists = true,
107c8284409SSoren Brinkmann 	},
108c8284409SSoren Brinkmann 	{
109915d4872SSiva Durga Prasad Paladugu 		.id = 0x21,
110915d4872SSiva Durga Prasad Paladugu 		.ver = 0x100,
1117a30e08bSVenkatesh Yadav Abbarapu 		.name = "XCZU4EG",
11291bf4c5cSSiva Durga Prasad Paladugu 		.evexists = true,
113915d4872SSiva Durga Prasad Paladugu 	},
114915d4872SSiva Durga Prasad Paladugu 	{
115915d4872SSiva Durga Prasad Paladugu 		.id = 0x21,
116915d4872SSiva Durga Prasad Paladugu 		.ver = 0x12c,
1177a30e08bSVenkatesh Yadav Abbarapu 		.name = "XCZU4CG",
118915d4872SSiva Durga Prasad Paladugu 	},
119915d4872SSiva Durga Prasad Paladugu 	{
120c8284409SSoren Brinkmann 		.id = 0x30,
1217a30e08bSVenkatesh Yadav Abbarapu 		.name = "XCZU7EV",
12291bf4c5cSSiva Durga Prasad Paladugu 		.evexists = true,
123c8284409SSoren Brinkmann 	},
124c8284409SSoren Brinkmann 	{
125915d4872SSiva Durga Prasad Paladugu 		.id = 0x30,
126915d4872SSiva Durga Prasad Paladugu 		.ver = 0x100,
1277a30e08bSVenkatesh Yadav Abbarapu 		.name = "XCZU7EG",
12891bf4c5cSSiva Durga Prasad Paladugu 		.evexists = true,
129915d4872SSiva Durga Prasad Paladugu 	},
130915d4872SSiva Durga Prasad Paladugu 	{
131915d4872SSiva Durga Prasad Paladugu 		.id = 0x30,
132915d4872SSiva Durga Prasad Paladugu 		.ver = 0x12c,
1337a30e08bSVenkatesh Yadav Abbarapu 		.name = "XCZU7CG",
134915d4872SSiva Durga Prasad Paladugu 	},
135915d4872SSiva Durga Prasad Paladugu 	{
136c8284409SSoren Brinkmann 		.id = 0x38,
1377a30e08bSVenkatesh Yadav Abbarapu 		.name = "XCZU9EG",
138c8284409SSoren Brinkmann 	},
139c8284409SSoren Brinkmann 	{
140915d4872SSiva Durga Prasad Paladugu 		.id = 0x38,
141915d4872SSiva Durga Prasad Paladugu 		.ver = 0x2c,
1427a30e08bSVenkatesh Yadav Abbarapu 		.name = "XCZU9CG",
143915d4872SSiva Durga Prasad Paladugu 	},
144915d4872SSiva Durga Prasad Paladugu 	{
145c8284409SSoren Brinkmann 		.id = 0x39,
1467a30e08bSVenkatesh Yadav Abbarapu 		.name = "XCZU6EG",
147c8284409SSoren Brinkmann 	},
148c8284409SSoren Brinkmann 	{
149915d4872SSiva Durga Prasad Paladugu 		.id = 0x39,
150915d4872SSiva Durga Prasad Paladugu 		.ver = 0x2c,
1517a30e08bSVenkatesh Yadav Abbarapu 		.name = "XCZU6CG",
152915d4872SSiva Durga Prasad Paladugu 	},
153915d4872SSiva Durga Prasad Paladugu 	{
154c8284409SSoren Brinkmann 		.id = 0x40,
1557a30e08bSVenkatesh Yadav Abbarapu 		.name = "XCZU11EG",
156c8284409SSoren Brinkmann 	},
157c8284409SSoren Brinkmann 	{
158c8284409SSoren Brinkmann 		.id = 0x50,
1597a30e08bSVenkatesh Yadav Abbarapu 		.name = "XCZU15EG",
160c8284409SSoren Brinkmann 	},
161c8284409SSoren Brinkmann 	{
162c8284409SSoren Brinkmann 		.id = 0x58,
1637a30e08bSVenkatesh Yadav Abbarapu 		.name = "XCZU19EG",
164c8284409SSoren Brinkmann 	},
165c8284409SSoren Brinkmann 	{
166c8284409SSoren Brinkmann 		.id = 0x59,
1677a30e08bSVenkatesh Yadav Abbarapu 		.name = "XCZU17EG",
168c8284409SSoren Brinkmann 	},
169d9710aebSSiva Durga Prasad Paladugu 	{
170d9710aebSSiva Durga Prasad Paladugu 		.id = 0x60,
1717a30e08bSVenkatesh Yadav Abbarapu 		.name = "XCZU28DR",
172d9710aebSSiva Durga Prasad Paladugu 	},
173d9710aebSSiva Durga Prasad Paladugu 	{
174d9710aebSSiva Durga Prasad Paladugu 		.id = 0x61,
1757a30e08bSVenkatesh Yadav Abbarapu 		.name = "XCZU21DR",
176d9710aebSSiva Durga Prasad Paladugu 	},
177d9710aebSSiva Durga Prasad Paladugu 	{
178d9710aebSSiva Durga Prasad Paladugu 		.id = 0x62,
1797a30e08bSVenkatesh Yadav Abbarapu 		.name = "XCZU29DR",
180d9710aebSSiva Durga Prasad Paladugu 	},
181d9710aebSSiva Durga Prasad Paladugu 	{
182d9710aebSSiva Durga Prasad Paladugu 		.id = 0x63,
1837a30e08bSVenkatesh Yadav Abbarapu 		.name = "XCZU23DR",
184d9710aebSSiva Durga Prasad Paladugu 	},
185d9710aebSSiva Durga Prasad Paladugu 	{
186d9710aebSSiva Durga Prasad Paladugu 		.id = 0x64,
1877a30e08bSVenkatesh Yadav Abbarapu 		.name = "XCZU27DR",
188d9710aebSSiva Durga Prasad Paladugu 	},
189d9710aebSSiva Durga Prasad Paladugu 	{
190d9710aebSSiva Durga Prasad Paladugu 		.id = 0x65,
1917a30e08bSVenkatesh Yadav Abbarapu 		.name = "XCZU25DR",
192d9710aebSSiva Durga Prasad Paladugu 	},
193345a85aeSSiva Durga Prasad Paladugu 	{
194345a85aeSSiva Durga Prasad Paladugu 		.id = 0x66,
1957a30e08bSVenkatesh Yadav Abbarapu 		.name = "XCZU39DR",
196345a85aeSSiva Durga Prasad Paladugu 	},
197c613a660SVenkatesh Yadav Abbarapu 	{
1981b7e5ca9SVenkatesh Yadav Abbarapu 		.id = 0x7d,
1997a30e08bSVenkatesh Yadav Abbarapu 		.name = "XCZU43DR",
2001b7e5ca9SVenkatesh Yadav Abbarapu 	},
2011b7e5ca9SVenkatesh Yadav Abbarapu 	{
2021b7e5ca9SVenkatesh Yadav Abbarapu 		.id = 0x78,
2037a30e08bSVenkatesh Yadav Abbarapu 		.name = "XCZU46DR",
2041b7e5ca9SVenkatesh Yadav Abbarapu 	},
2051b7e5ca9SVenkatesh Yadav Abbarapu 	{
2061b7e5ca9SVenkatesh Yadav Abbarapu 		.id = 0x7f,
2077a30e08bSVenkatesh Yadav Abbarapu 		.name = "XCZU47DR",
2081b7e5ca9SVenkatesh Yadav Abbarapu 	},
2091b7e5ca9SVenkatesh Yadav Abbarapu 	{
210c613a660SVenkatesh Yadav Abbarapu 		.id = 0x7b,
2117a30e08bSVenkatesh Yadav Abbarapu 		.name = "XCZU48DR",
212c613a660SVenkatesh Yadav Abbarapu 	},
213c613a660SVenkatesh Yadav Abbarapu 	{
214c613a660SVenkatesh Yadav Abbarapu 		.id = 0x7e,
2157a30e08bSVenkatesh Yadav Abbarapu 		.name = "XCZU49DR",
216c613a660SVenkatesh Yadav Abbarapu 	},
217c8284409SSoren Brinkmann };
218c8284409SSoren Brinkmann 
21991bf4c5cSSiva Durga Prasad Paladugu #define ZYNQMP_PL_STATUS_BIT	9
22091bf4c5cSSiva Durga Prasad Paladugu #define ZYNQMP_PL_STATUS_MASK	BIT(ZYNQMP_PL_STATUS_BIT)
22191bf4c5cSSiva Durga Prasad Paladugu #define ZYNQMP_CSU_VERSION_MASK	~(ZYNQMP_PL_STATUS_MASK)
222915d4872SSiva Durga Prasad Paladugu 
223f1565907SMichal Simek #define SILICON_ID_XCK24	0x4712093U
224bfd7c881SVenkatesh Yadav Abbarapu #define SILICON_ID_XCK26	0x4724093U
2257a30e08bSVenkatesh Yadav Abbarapu 
226c8284409SSoren Brinkmann static char *zynqmp_get_silicon_idcode_name(void)
227c8284409SSoren Brinkmann {
22891bf4c5cSSiva Durga Prasad Paladugu 	uint32_t id, ver, chipid[2];
22991bf4c5cSSiva Durga Prasad Paladugu 	size_t i, j, len;
23091bf4c5cSSiva Durga Prasad Paladugu 	const char *name = "EG/EV";
231c8284409SSoren Brinkmann 
2320435ba64SSiva Durga Prasad Paladugu #ifdef IMAGE_BL32
2330435ba64SSiva Durga Prasad Paladugu 	/*
2340435ba64SSiva Durga Prasad Paladugu 	 * For BL32, get the chip id info directly by reading corresponding
2350435ba64SSiva Durga Prasad Paladugu 	 * registers instead of making pm call. This has limitation
2360435ba64SSiva Durga Prasad Paladugu 	 * that these registers should be configured to have access
2370435ba64SSiva Durga Prasad Paladugu 	 * from APU which is default case.
2380435ba64SSiva Durga Prasad Paladugu 	 */
2390435ba64SSiva Durga Prasad Paladugu 	chipid[0] = mmio_read_32(ZYNQMP_CSU_BASEADDR + ZYNQMP_CSU_IDCODE_OFFSET);
2400435ba64SSiva Durga Prasad Paladugu 	chipid[1] = mmio_read_32(EFUSE_BASEADDR + EFUSE_IPDISABLE_OFFSET);
2410435ba64SSiva Durga Prasad Paladugu #else
242eb0d2b17SVenkatesh Yadav Abbarapu 	if (pm_get_chipid(chipid) != PM_RET_SUCCESS) {
2437a30e08bSVenkatesh Yadav Abbarapu 		return "XCZUUNKN";
244eb0d2b17SVenkatesh Yadav Abbarapu 	}
2450435ba64SSiva Durga Prasad Paladugu #endif
24691bf4c5cSSiva Durga Prasad Paladugu 
24791bf4c5cSSiva Durga Prasad Paladugu 	id = chipid[0] & (ZYNQMP_CSU_IDCODE_DEVICE_CODE_MASK |
24891bf4c5cSSiva Durga Prasad Paladugu 			  ZYNQMP_CSU_IDCODE_SVD_MASK);
24991bf4c5cSSiva Durga Prasad Paladugu 	id >>= ZYNQMP_CSU_IDCODE_SVD_SHIFT;
25091bf4c5cSSiva Durga Prasad Paladugu 	ver = chipid[1] >> ZYNQMP_EFUSE_IPDISABLE_SHIFT;
251915d4872SSiva Durga Prasad Paladugu 
252915d4872SSiva Durga Prasad Paladugu 	for (i = 0; i < ARRAY_SIZE(zynqmp_devices); i++) {
25391bf4c5cSSiva Durga Prasad Paladugu 		if (zynqmp_devices[i].id == id &&
254eb0d2b17SVenkatesh Yadav Abbarapu 		    zynqmp_devices[i].ver == (ver & ZYNQMP_CSU_VERSION_MASK)) {
25591bf4c5cSSiva Durga Prasad Paladugu 			break;
256c8284409SSoren Brinkmann 		}
257eb0d2b17SVenkatesh Yadav Abbarapu 	}
25891bf4c5cSSiva Durga Prasad Paladugu 
2597a30e08bSVenkatesh Yadav Abbarapu 	if (i >= ARRAY_SIZE(zynqmp_devices)) {
26086869f99SVenkatesh Yadav Abbarapu 		switch (chipid[0]) {
26186869f99SVenkatesh Yadav Abbarapu 		case SILICON_ID_XCK24:
26286869f99SVenkatesh Yadav Abbarapu 			return "XCK24";
26386869f99SVenkatesh Yadav Abbarapu 		case SILICON_ID_XCK26:
2647a30e08bSVenkatesh Yadav Abbarapu 			return "XCK26";
26586869f99SVenkatesh Yadav Abbarapu 		default:
2667a30e08bSVenkatesh Yadav Abbarapu 			return "XCZUUNKN";
2677a30e08bSVenkatesh Yadav Abbarapu 		}
2687a30e08bSVenkatesh Yadav Abbarapu 	}
26991bf4c5cSSiva Durga Prasad Paladugu 
270eb0d2b17SVenkatesh Yadav Abbarapu 	if (!zynqmp_devices[i].evexists) {
27191bf4c5cSSiva Durga Prasad Paladugu 		return zynqmp_devices[i].name;
272eb0d2b17SVenkatesh Yadav Abbarapu 	}
27391bf4c5cSSiva Durga Prasad Paladugu 
274dd1fe717SVenkatesh Yadav Abbarapu 	if ((ver & ZYNQMP_PL_STATUS_MASK) != 0U) {
27591bf4c5cSSiva Durga Prasad Paladugu 		return zynqmp_devices[i].name;
276eb0d2b17SVenkatesh Yadav Abbarapu 	}
27791bf4c5cSSiva Durga Prasad Paladugu 
27891bf4c5cSSiva Durga Prasad Paladugu 	len = strlen(zynqmp_devices[i].name) - 2;
27991bf4c5cSSiva Durga Prasad Paladugu 	for (j = 0; j < strlen(name); j++) {
28091bf4c5cSSiva Durga Prasad Paladugu 		zynqmp_devices[i].name[len] = name[j];
28191bf4c5cSSiva Durga Prasad Paladugu 		len++;
28291bf4c5cSSiva Durga Prasad Paladugu 	}
28391bf4c5cSSiva Durga Prasad Paladugu 	zynqmp_devices[i].name[len] = '\0';
28491bf4c5cSSiva Durga Prasad Paladugu 
28591bf4c5cSSiva Durga Prasad Paladugu 	return zynqmp_devices[i].name;
286c8284409SSoren Brinkmann }
287c8284409SSoren Brinkmann 
288c8284409SSoren Brinkmann static unsigned int zynqmp_get_rtl_ver(void)
289c8284409SSoren Brinkmann {
290c8284409SSoren Brinkmann 	uint32_t ver;
291c8284409SSoren Brinkmann 
292c8284409SSoren Brinkmann 	ver = mmio_read_32(ZYNQMP_CSU_BASEADDR + ZYNQMP_CSU_VERSION_OFFSET);
293c8284409SSoren Brinkmann 	ver &= ZYNQMP_RTL_VER_MASK;
294c8284409SSoren Brinkmann 	ver >>= ZYNQMP_RTL_VER_SHIFT;
295c8284409SSoren Brinkmann 
296c8284409SSoren Brinkmann 	return ver;
297c8284409SSoren Brinkmann }
298c8284409SSoren Brinkmann 
299c8284409SSoren Brinkmann static char *zynqmp_print_silicon_idcode(void)
300c8284409SSoren Brinkmann {
301c8284409SSoren Brinkmann 	uint32_t id, maskid, tmp;
302c8284409SSoren Brinkmann 
303c8284409SSoren Brinkmann 	id = mmio_read_32(ZYNQMP_CSU_BASEADDR + ZYNQMP_CSU_IDCODE_OFFSET);
304c8284409SSoren Brinkmann 
305c8284409SSoren Brinkmann 	tmp = id;
306c8284409SSoren Brinkmann 	tmp &= ZYNQMP_CSU_IDCODE_XILINX_ID_MASK |
307648fe99eSSoren Brinkmann 	       ZYNQMP_CSU_IDCODE_FAMILY_MASK;
308c8284409SSoren Brinkmann 	maskid = ZYNQMP_CSU_IDCODE_XILINX_ID << ZYNQMP_CSU_IDCODE_XILINX_ID_SHIFT |
309648fe99eSSoren Brinkmann 		 ZYNQMP_CSU_IDCODE_FAMILY << ZYNQMP_CSU_IDCODE_FAMILY_SHIFT;
310c8284409SSoren Brinkmann 	if (tmp != maskid) {
311d6760c4dSAkshay Belsare 		ERROR("Incorrect IDCODE 0x%x, maskid 0x%x\n", id, maskid);
312c8284409SSoren Brinkmann 		return "UNKN";
313c8284409SSoren Brinkmann 	}
314d6760c4dSAkshay Belsare 	VERBOSE("IDCODE 0x%x\n", id);
315c8284409SSoren Brinkmann 	return zynqmp_get_silicon_idcode_name();
316c8284409SSoren Brinkmann }
317c8284409SSoren Brinkmann 
3188f9ba3f3SMichal Simek int32_t plat_is_smccc_feature_available(u_register_t fid)
3198f9ba3f3SMichal Simek {
3208f9ba3f3SMichal Simek 	switch (fid) {
3218f9ba3f3SMichal Simek 	case SMCCC_ARCH_SOC_ID:
3228f9ba3f3SMichal Simek 		return SMC_ARCH_CALL_SUCCESS;
3238f9ba3f3SMichal Simek 	default:
3248f9ba3f3SMichal Simek 		return SMC_ARCH_CALL_NOT_SUPPORTED;
3258f9ba3f3SMichal Simek 	}
3268f9ba3f3SMichal Simek 
3278f9ba3f3SMichal Simek 	return SMC_ARCH_CALL_NOT_SUPPORTED;
3288f9ba3f3SMichal Simek }
3298f9ba3f3SMichal Simek 
3308f9ba3f3SMichal Simek int32_t plat_get_soc_version(void)
3318f9ba3f3SMichal Simek {
3328f9ba3f3SMichal Simek 	uint32_t chip_id = zynqmp_get_silicon_ver();
3338f9ba3f3SMichal Simek 	uint32_t manfid = SOC_ID_SET_JEP_106(JEDEC_XILINX_BKID, JEDEC_XILINX_MFID);
3348f9ba3f3SMichal Simek 
3358f9ba3f3SMichal Simek 	return (int32_t)(manfid | (chip_id & 0xFFFF));
3368f9ba3f3SMichal Simek }
3378f9ba3f3SMichal Simek 
3388f9ba3f3SMichal Simek int32_t plat_get_soc_revision(void)
3398f9ba3f3SMichal Simek {
3408f9ba3f3SMichal Simek 	return mmio_read_32(ZYNQMP_CSU_BASEADDR + ZYNQMP_CSU_IDCODE_OFFSET);
3418f9ba3f3SMichal Simek }
3428f9ba3f3SMichal Simek 
343ffa91031SVenkatesh Yadav Abbarapu static uint32_t zynqmp_get_ps_ver(void)
344c8284409SSoren Brinkmann {
345c8284409SSoren Brinkmann 	uint32_t ver = mmio_read_32(ZYNQMP_CSU_BASEADDR + ZYNQMP_CSU_VERSION_OFFSET);
346c8284409SSoren Brinkmann 
347c8284409SSoren Brinkmann 	ver &= ZYNQMP_PS_VER_MASK;
348c8284409SSoren Brinkmann 	ver >>= ZYNQMP_PS_VER_SHIFT;
349c8284409SSoren Brinkmann 
350bfd7c881SVenkatesh Yadav Abbarapu 	return ver + 1U;
351c8284409SSoren Brinkmann }
352c8284409SSoren Brinkmann 
353c8284409SSoren Brinkmann static void zynqmp_print_platform_name(void)
354c8284409SSoren Brinkmann {
355ffa91031SVenkatesh Yadav Abbarapu 	uint32_t ver = zynqmp_get_silicon_ver();
356ffa91031SVenkatesh Yadav Abbarapu 	uint32_t rtl = zynqmp_get_rtl_ver();
357c8284409SSoren Brinkmann 	char *label = "Unknown";
358c8284409SSoren Brinkmann 
359c8284409SSoren Brinkmann 	switch (ver) {
360c8284409SSoren Brinkmann 	case ZYNQMP_CSU_VERSION_QEMU:
361c8284409SSoren Brinkmann 		label = "QEMU";
362c8284409SSoren Brinkmann 		break;
363c8284409SSoren Brinkmann 	case ZYNQMP_CSU_VERSION_SILICON:
364c8284409SSoren Brinkmann 		label = "silicon";
365c8284409SSoren Brinkmann 		break;
366649c48f5SJonathan Wright 	default:
367649c48f5SJonathan Wright 		/* Do nothing in default case */
368649c48f5SJonathan Wright 		break;
369c8284409SSoren Brinkmann 	}
370c8284409SSoren Brinkmann 
3711277af9bSVenkatesh Yadav Abbarapu 	VERBOSE("TF-A running on %s/%s at 0x%x\n",
372db97f939SVenkatesh Yadav Abbarapu 		zynqmp_print_silicon_idcode(), label, BL31_BASE);
373db97f939SVenkatesh Yadav Abbarapu 	VERBOSE("TF-A running on v%d/RTL%d.%d\n",
374db97f939SVenkatesh Yadav Abbarapu 	       zynqmp_get_ps_ver(), (rtl & 0xf0) >> 4, rtl & 0xf);
375c8284409SSoren Brinkmann }
376c8284409SSoren Brinkmann #else
377c8284409SSoren Brinkmann static inline void zynqmp_print_platform_name(void) { }
378c8284409SSoren Brinkmann #endif
379c8284409SSoren Brinkmann 
380ffa91031SVenkatesh Yadav Abbarapu uint32_t zynqmp_get_bootmode(void)
3812cb5bac9SSoren Brinkmann {
38229bd0e66SSiva Durga Prasad Paladugu 	uint32_t r;
383a6d28520SSiva Durga Prasad Paladugu 	unsigned int ret;
38429bd0e66SSiva Durga Prasad Paladugu 
385a6d28520SSiva Durga Prasad Paladugu 	ret = pm_mmio_read(CRL_APB_BOOT_MODE_USER, &r);
386a6d28520SSiva Durga Prasad Paladugu 
387eb0d2b17SVenkatesh Yadav Abbarapu 	if (ret != PM_RET_SUCCESS) {
38829bd0e66SSiva Durga Prasad Paladugu 		r = mmio_read_32(CRL_APB_BOOT_MODE_USER);
389eb0d2b17SVenkatesh Yadav Abbarapu 	}
3902cb5bac9SSoren Brinkmann 
3912cb5bac9SSoren Brinkmann 	return r & CRL_APB_BOOT_MODE_MASK;
3922cb5bac9SSoren Brinkmann }
3932cb5bac9SSoren Brinkmann 
394c8284409SSoren Brinkmann void zynqmp_config_setup(void)
395c8284409SSoren Brinkmann {
3969f0ddae3SRajan Vaja 	uint64_t counter_freq;
3979f0ddae3SRajan Vaja 
398705bed5dSJolly Shah 	/* Configure IPI data for ZynqMP */
399705bed5dSJolly Shah 	zynqmp_ipi_config_table_init();
400705bed5dSJolly Shah 
401c8284409SSoren Brinkmann 	zynqmp_print_platform_name();
4029f0ddae3SRajan Vaja 
4039f0ddae3SRajan Vaja 	/* Configure counter frequency */
4049f0ddae3SRajan Vaja 	counter_freq = read_cntfrq_el0();
4059f0ddae3SRajan Vaja 	if (counter_freq == ZYNQMP_DEFAULT_COUNTER_FREQ) {
4069f0ddae3SRajan Vaja 		write_cntfrq_el0(plat_get_syscnt_freq2());
4079f0ddae3SRajan Vaja 	}
4089f0ddae3SRajan Vaja 
409e1cb4da4SSoren Brinkmann 	generic_delay_timer_init();
410c8284409SSoren Brinkmann }
411c8284409SSoren Brinkmann 
412ffa91031SVenkatesh Yadav Abbarapu uint32_t plat_get_syscnt_freq2(void)
413c8284409SSoren Brinkmann {
414ffa91031SVenkatesh Yadav Abbarapu 	uint32_t ver = zynqmp_get_silicon_ver();
415c8284409SSoren Brinkmann 
416eb0d2b17SVenkatesh Yadav Abbarapu 	if (ver == ZYNQMP_CSU_VERSION_QEMU) {
41765501a7cSEdgar E. Iglesias 		return 65000000;
418eb0d2b17SVenkatesh Yadav Abbarapu 	} else {
419e89f4af7SSoren Brinkmann 		return mmio_read_32(IOU_SCNTRS_BASEFREQ);
420c8284409SSoren Brinkmann 	}
421eb0d2b17SVenkatesh Yadav Abbarapu }
422