xref: /rk3399_ARM-atf/plat/xilinx/zynqmp/aarch64/zynqmp_common.c (revision 619bc13eda5b69a8c1e76b5fc0c6ee1f5dbb8a8e)
1c8284409SSoren Brinkmann /*
2*619bc13eSMichal 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>
16705bed5dSJolly Shah #include <plat_ipi.h>
1731c3842eSJolly Shah #include <plat_private.h>
188f9ba3f3SMichal Simek #include <plat_startup.h>
1909d40e0eSAntonio Nino Diaz #include <plat/common/platform.h>
208f9ba3f3SMichal Simek #include <services/arm_arch_svc.h>
2109d40e0eSAntonio Nino Diaz 
22a92681d9SJay Buddhabhatti #include "zynqmp_pm_api_sys.h"
23c8284409SSoren Brinkmann 
24c8284409SSoren Brinkmann /*
25c8284409SSoren Brinkmann  * Table of regions to map using the MMU.
26c8284409SSoren Brinkmann  * This doesn't include TZRAM as the 'mem_layout' argument passed to
27c8284409SSoren Brinkmann  * configure_mmu_elx() will give the available subset of that,
28c8284409SSoren Brinkmann  */
29c8284409SSoren Brinkmann const mmap_region_t plat_arm_mmap[] = {
30c8284409SSoren Brinkmann 	{ DEVICE0_BASE, DEVICE0_BASE, DEVICE0_SIZE, MT_DEVICE | MT_RW | MT_SECURE },
31c8284409SSoren Brinkmann 	{ DEVICE1_BASE, DEVICE1_BASE, DEVICE1_SIZE, MT_DEVICE | MT_RW | MT_SECURE },
32c8284409SSoren Brinkmann 	{ CRF_APB_BASE, CRF_APB_BASE, CRF_APB_SIZE, MT_DEVICE | MT_RW | MT_SECURE },
33c8284409SSoren Brinkmann 	{0}
34c8284409SSoren Brinkmann };
35c8284409SSoren Brinkmann 
36ffa91031SVenkatesh Yadav Abbarapu static uint32_t zynqmp_get_silicon_ver(void)
37c8284409SSoren Brinkmann {
38466675c2SSoren Brinkmann 	static unsigned int ver;
39c8284409SSoren Brinkmann 
40466675c2SSoren Brinkmann 	if (!ver) {
41466675c2SSoren Brinkmann 		ver = mmio_read_32(ZYNQMP_CSU_BASEADDR +
42466675c2SSoren Brinkmann 				   ZYNQMP_CSU_VERSION_OFFSET);
43c8284409SSoren Brinkmann 		ver &= ZYNQMP_SILICON_VER_MASK;
44c8284409SSoren Brinkmann 		ver >>= ZYNQMP_SILICON_VER_SHIFT;
45466675c2SSoren Brinkmann 	}
46c8284409SSoren Brinkmann 
47c8284409SSoren Brinkmann 	return ver;
48c8284409SSoren Brinkmann }
49c8284409SSoren Brinkmann 
50ffa91031SVenkatesh Yadav Abbarapu uint32_t zynqmp_get_uart_clk(void)
51c8284409SSoren Brinkmann {
52c8284409SSoren Brinkmann 	unsigned int ver = zynqmp_get_silicon_ver();
53c8284409SSoren Brinkmann 
54eb0d2b17SVenkatesh Yadav Abbarapu 	if (ver == ZYNQMP_CSU_VERSION_QEMU) {
55c8284409SSoren Brinkmann 		return 133000000;
56eb0d2b17SVenkatesh Yadav Abbarapu 	} else {
57c8284409SSoren Brinkmann 		return 100000000;
58c8284409SSoren Brinkmann 	}
59eb0d2b17SVenkatesh Yadav Abbarapu }
60c8284409SSoren Brinkmann 
61c8284409SSoren Brinkmann #if LOG_LEVEL >= LOG_LEVEL_NOTICE
62c8284409SSoren Brinkmann static const struct {
63ffa91031SVenkatesh Yadav Abbarapu 	uint32_t id;
64ffa91031SVenkatesh Yadav Abbarapu 	uint32_t ver;
65c8284409SSoren Brinkmann 	char *name;
6691bf4c5cSSiva Durga Prasad Paladugu 	bool evexists;
67c8284409SSoren Brinkmann } zynqmp_devices[] = {
68c8284409SSoren Brinkmann 	{
69c8284409SSoren Brinkmann 		.id = 0x10,
707a30e08bSVenkatesh Yadav Abbarapu 		.name = "XCZU3EG",
71c8284409SSoren Brinkmann 	},
72c8284409SSoren Brinkmann 	{
73915d4872SSiva Durga Prasad Paladugu 		.id = 0x10,
74915d4872SSiva Durga Prasad Paladugu 		.ver = 0x2c,
757a30e08bSVenkatesh Yadav Abbarapu 		.name = "XCZU3CG",
76915d4872SSiva Durga Prasad Paladugu 	},
77915d4872SSiva Durga Prasad Paladugu 	{
78c8284409SSoren Brinkmann 		.id = 0x11,
797a30e08bSVenkatesh Yadav Abbarapu 		.name = "XCZU2EG",
80c8284409SSoren Brinkmann 	},
81c8284409SSoren Brinkmann 	{
82915d4872SSiva Durga Prasad Paladugu 		.id = 0x11,
83915d4872SSiva Durga Prasad Paladugu 		.ver = 0x2c,
847a30e08bSVenkatesh Yadav Abbarapu 		.name = "XCZU2CG",
85915d4872SSiva Durga Prasad Paladugu 	},
86915d4872SSiva Durga Prasad Paladugu 	{
87c8284409SSoren Brinkmann 		.id = 0x20,
887a30e08bSVenkatesh Yadav Abbarapu 		.name = "XCZU5EV",
8991bf4c5cSSiva Durga Prasad Paladugu 		.evexists = true,
90c8284409SSoren Brinkmann 	},
91c8284409SSoren Brinkmann 	{
92915d4872SSiva Durga Prasad Paladugu 		.id = 0x20,
93915d4872SSiva Durga Prasad Paladugu 		.ver = 0x100,
947a30e08bSVenkatesh Yadav Abbarapu 		.name = "XCZU5EG",
9591bf4c5cSSiva Durga Prasad Paladugu 		.evexists = true,
96915d4872SSiva Durga Prasad Paladugu 	},
97915d4872SSiva Durga Prasad Paladugu 	{
98915d4872SSiva Durga Prasad Paladugu 		.id = 0x20,
99915d4872SSiva Durga Prasad Paladugu 		.ver = 0x12c,
1007a30e08bSVenkatesh Yadav Abbarapu 		.name = "XCZU5CG",
101915d4872SSiva Durga Prasad Paladugu 	},
102915d4872SSiva Durga Prasad Paladugu 	{
103c8284409SSoren Brinkmann 		.id = 0x21,
1047a30e08bSVenkatesh Yadav Abbarapu 		.name = "XCZU4EV",
10591bf4c5cSSiva Durga Prasad Paladugu 		.evexists = true,
106c8284409SSoren Brinkmann 	},
107c8284409SSoren Brinkmann 	{
108915d4872SSiva Durga Prasad Paladugu 		.id = 0x21,
109915d4872SSiva Durga Prasad Paladugu 		.ver = 0x100,
1107a30e08bSVenkatesh Yadav Abbarapu 		.name = "XCZU4EG",
11191bf4c5cSSiva Durga Prasad Paladugu 		.evexists = true,
112915d4872SSiva Durga Prasad Paladugu 	},
113915d4872SSiva Durga Prasad Paladugu 	{
114915d4872SSiva Durga Prasad Paladugu 		.id = 0x21,
115915d4872SSiva Durga Prasad Paladugu 		.ver = 0x12c,
1167a30e08bSVenkatesh Yadav Abbarapu 		.name = "XCZU4CG",
117915d4872SSiva Durga Prasad Paladugu 	},
118915d4872SSiva Durga Prasad Paladugu 	{
119c8284409SSoren Brinkmann 		.id = 0x30,
1207a30e08bSVenkatesh Yadav Abbarapu 		.name = "XCZU7EV",
12191bf4c5cSSiva Durga Prasad Paladugu 		.evexists = true,
122c8284409SSoren Brinkmann 	},
123c8284409SSoren Brinkmann 	{
124915d4872SSiva Durga Prasad Paladugu 		.id = 0x30,
125915d4872SSiva Durga Prasad Paladugu 		.ver = 0x100,
1267a30e08bSVenkatesh Yadav Abbarapu 		.name = "XCZU7EG",
12791bf4c5cSSiva Durga Prasad Paladugu 		.evexists = true,
128915d4872SSiva Durga Prasad Paladugu 	},
129915d4872SSiva Durga Prasad Paladugu 	{
130915d4872SSiva Durga Prasad Paladugu 		.id = 0x30,
131915d4872SSiva Durga Prasad Paladugu 		.ver = 0x12c,
1327a30e08bSVenkatesh Yadav Abbarapu 		.name = "XCZU7CG",
133915d4872SSiva Durga Prasad Paladugu 	},
134915d4872SSiva Durga Prasad Paladugu 	{
135c8284409SSoren Brinkmann 		.id = 0x38,
1367a30e08bSVenkatesh Yadav Abbarapu 		.name = "XCZU9EG",
137c8284409SSoren Brinkmann 	},
138c8284409SSoren Brinkmann 	{
139915d4872SSiva Durga Prasad Paladugu 		.id = 0x38,
140915d4872SSiva Durga Prasad Paladugu 		.ver = 0x2c,
1417a30e08bSVenkatesh Yadav Abbarapu 		.name = "XCZU9CG",
142915d4872SSiva Durga Prasad Paladugu 	},
143915d4872SSiva Durga Prasad Paladugu 	{
144c8284409SSoren Brinkmann 		.id = 0x39,
1457a30e08bSVenkatesh Yadav Abbarapu 		.name = "XCZU6EG",
146c8284409SSoren Brinkmann 	},
147c8284409SSoren Brinkmann 	{
148915d4872SSiva Durga Prasad Paladugu 		.id = 0x39,
149915d4872SSiva Durga Prasad Paladugu 		.ver = 0x2c,
1507a30e08bSVenkatesh Yadav Abbarapu 		.name = "XCZU6CG",
151915d4872SSiva Durga Prasad Paladugu 	},
152915d4872SSiva Durga Prasad Paladugu 	{
153c8284409SSoren Brinkmann 		.id = 0x40,
1547a30e08bSVenkatesh Yadav Abbarapu 		.name = "XCZU11EG",
155c8284409SSoren Brinkmann 	},
156c8284409SSoren Brinkmann 	{
157c8284409SSoren Brinkmann 		.id = 0x50,
1587a30e08bSVenkatesh Yadav Abbarapu 		.name = "XCZU15EG",
159c8284409SSoren Brinkmann 	},
160c8284409SSoren Brinkmann 	{
161c8284409SSoren Brinkmann 		.id = 0x58,
1627a30e08bSVenkatesh Yadav Abbarapu 		.name = "XCZU19EG",
163c8284409SSoren Brinkmann 	},
164c8284409SSoren Brinkmann 	{
165c8284409SSoren Brinkmann 		.id = 0x59,
1667a30e08bSVenkatesh Yadav Abbarapu 		.name = "XCZU17EG",
167c8284409SSoren Brinkmann 	},
168d9710aebSSiva Durga Prasad Paladugu 	{
169d9710aebSSiva Durga Prasad Paladugu 		.id = 0x60,
1707a30e08bSVenkatesh Yadav Abbarapu 		.name = "XCZU28DR",
171d9710aebSSiva Durga Prasad Paladugu 	},
172d9710aebSSiva Durga Prasad Paladugu 	{
173d9710aebSSiva Durga Prasad Paladugu 		.id = 0x61,
1747a30e08bSVenkatesh Yadav Abbarapu 		.name = "XCZU21DR",
175d9710aebSSiva Durga Prasad Paladugu 	},
176d9710aebSSiva Durga Prasad Paladugu 	{
177d9710aebSSiva Durga Prasad Paladugu 		.id = 0x62,
1787a30e08bSVenkatesh Yadav Abbarapu 		.name = "XCZU29DR",
179d9710aebSSiva Durga Prasad Paladugu 	},
180d9710aebSSiva Durga Prasad Paladugu 	{
181d9710aebSSiva Durga Prasad Paladugu 		.id = 0x63,
1827a30e08bSVenkatesh Yadav Abbarapu 		.name = "XCZU23DR",
183d9710aebSSiva Durga Prasad Paladugu 	},
184d9710aebSSiva Durga Prasad Paladugu 	{
185d9710aebSSiva Durga Prasad Paladugu 		.id = 0x64,
1867a30e08bSVenkatesh Yadav Abbarapu 		.name = "XCZU27DR",
187d9710aebSSiva Durga Prasad Paladugu 	},
188d9710aebSSiva Durga Prasad Paladugu 	{
189d9710aebSSiva Durga Prasad Paladugu 		.id = 0x65,
1907a30e08bSVenkatesh Yadav Abbarapu 		.name = "XCZU25DR",
191d9710aebSSiva Durga Prasad Paladugu 	},
192345a85aeSSiva Durga Prasad Paladugu 	{
193345a85aeSSiva Durga Prasad Paladugu 		.id = 0x66,
1947a30e08bSVenkatesh Yadav Abbarapu 		.name = "XCZU39DR",
195345a85aeSSiva Durga Prasad Paladugu 	},
196c613a660SVenkatesh Yadav Abbarapu 	{
1971b7e5ca9SVenkatesh Yadav Abbarapu 		.id = 0x7d,
1987a30e08bSVenkatesh Yadav Abbarapu 		.name = "XCZU43DR",
1991b7e5ca9SVenkatesh Yadav Abbarapu 	},
2001b7e5ca9SVenkatesh Yadav Abbarapu 	{
2011b7e5ca9SVenkatesh Yadav Abbarapu 		.id = 0x78,
2027a30e08bSVenkatesh Yadav Abbarapu 		.name = "XCZU46DR",
2031b7e5ca9SVenkatesh Yadav Abbarapu 	},
2041b7e5ca9SVenkatesh Yadav Abbarapu 	{
2051b7e5ca9SVenkatesh Yadav Abbarapu 		.id = 0x7f,
2067a30e08bSVenkatesh Yadav Abbarapu 		.name = "XCZU47DR",
2071b7e5ca9SVenkatesh Yadav Abbarapu 	},
2081b7e5ca9SVenkatesh Yadav Abbarapu 	{
209c613a660SVenkatesh Yadav Abbarapu 		.id = 0x7b,
2107a30e08bSVenkatesh Yadav Abbarapu 		.name = "XCZU48DR",
211c613a660SVenkatesh Yadav Abbarapu 	},
212c613a660SVenkatesh Yadav Abbarapu 	{
213c613a660SVenkatesh Yadav Abbarapu 		.id = 0x7e,
2147a30e08bSVenkatesh Yadav Abbarapu 		.name = "XCZU49DR",
215c613a660SVenkatesh Yadav Abbarapu 	},
216c8284409SSoren Brinkmann };
217c8284409SSoren Brinkmann 
21891bf4c5cSSiva Durga Prasad Paladugu #define ZYNQMP_PL_STATUS_BIT	9
21991bf4c5cSSiva Durga Prasad Paladugu #define ZYNQMP_PL_STATUS_MASK	BIT(ZYNQMP_PL_STATUS_BIT)
22091bf4c5cSSiva Durga Prasad Paladugu #define ZYNQMP_CSU_VERSION_MASK	~(ZYNQMP_PL_STATUS_MASK)
221915d4872SSiva Durga Prasad Paladugu 
222f1565907SMichal Simek #define SILICON_ID_XCK24	0x4712093U
223bfd7c881SVenkatesh Yadav Abbarapu #define SILICON_ID_XCK26	0x4724093U
2247a30e08bSVenkatesh Yadav Abbarapu 
225c8284409SSoren Brinkmann static char *zynqmp_get_silicon_idcode_name(void)
226c8284409SSoren Brinkmann {
22791bf4c5cSSiva Durga Prasad Paladugu 	uint32_t id, ver, chipid[2];
22891bf4c5cSSiva Durga Prasad Paladugu 	size_t i, j, len;
22991bf4c5cSSiva Durga Prasad Paladugu 	const char *name = "EG/EV";
230c8284409SSoren Brinkmann 
2310435ba64SSiva Durga Prasad Paladugu #ifdef IMAGE_BL32
2320435ba64SSiva Durga Prasad Paladugu 	/*
2330435ba64SSiva Durga Prasad Paladugu 	 * For BL32, get the chip id info directly by reading corresponding
2340435ba64SSiva Durga Prasad Paladugu 	 * registers instead of making pm call. This has limitation
2350435ba64SSiva Durga Prasad Paladugu 	 * that these registers should be configured to have access
2360435ba64SSiva Durga Prasad Paladugu 	 * from APU which is default case.
2370435ba64SSiva Durga Prasad Paladugu 	 */
2380435ba64SSiva Durga Prasad Paladugu 	chipid[0] = mmio_read_32(ZYNQMP_CSU_BASEADDR + ZYNQMP_CSU_IDCODE_OFFSET);
2390435ba64SSiva Durga Prasad Paladugu 	chipid[1] = mmio_read_32(EFUSE_BASEADDR + EFUSE_IPDISABLE_OFFSET);
2400435ba64SSiva Durga Prasad Paladugu #else
241eb0d2b17SVenkatesh Yadav Abbarapu 	if (pm_get_chipid(chipid) != PM_RET_SUCCESS) {
2427a30e08bSVenkatesh Yadav Abbarapu 		return "XCZUUNKN";
243eb0d2b17SVenkatesh Yadav Abbarapu 	}
2440435ba64SSiva Durga Prasad Paladugu #endif
24591bf4c5cSSiva Durga Prasad Paladugu 
24691bf4c5cSSiva Durga Prasad Paladugu 	id = chipid[0] & (ZYNQMP_CSU_IDCODE_DEVICE_CODE_MASK |
24791bf4c5cSSiva Durga Prasad Paladugu 			  ZYNQMP_CSU_IDCODE_SVD_MASK);
24891bf4c5cSSiva Durga Prasad Paladugu 	id >>= ZYNQMP_CSU_IDCODE_SVD_SHIFT;
24991bf4c5cSSiva Durga Prasad Paladugu 	ver = chipid[1] >> ZYNQMP_EFUSE_IPDISABLE_SHIFT;
250915d4872SSiva Durga Prasad Paladugu 
251915d4872SSiva Durga Prasad Paladugu 	for (i = 0; i < ARRAY_SIZE(zynqmp_devices); i++) {
25291bf4c5cSSiva Durga Prasad Paladugu 		if (zynqmp_devices[i].id == id &&
253eb0d2b17SVenkatesh Yadav Abbarapu 		    zynqmp_devices[i].ver == (ver & ZYNQMP_CSU_VERSION_MASK)) {
25491bf4c5cSSiva Durga Prasad Paladugu 			break;
255c8284409SSoren Brinkmann 		}
256eb0d2b17SVenkatesh Yadav Abbarapu 	}
25791bf4c5cSSiva Durga Prasad Paladugu 
2587a30e08bSVenkatesh Yadav Abbarapu 	if (i >= ARRAY_SIZE(zynqmp_devices)) {
25986869f99SVenkatesh Yadav Abbarapu 		switch (chipid[0]) {
26086869f99SVenkatesh Yadav Abbarapu 		case SILICON_ID_XCK24:
26186869f99SVenkatesh Yadav Abbarapu 			return "XCK24";
26286869f99SVenkatesh Yadav Abbarapu 		case SILICON_ID_XCK26:
2637a30e08bSVenkatesh Yadav Abbarapu 			return "XCK26";
26486869f99SVenkatesh Yadav Abbarapu 		default:
2657a30e08bSVenkatesh Yadav Abbarapu 			return "XCZUUNKN";
2667a30e08bSVenkatesh Yadav Abbarapu 		}
2677a30e08bSVenkatesh Yadav Abbarapu 	}
26891bf4c5cSSiva Durga Prasad Paladugu 
269eb0d2b17SVenkatesh Yadav Abbarapu 	if (!zynqmp_devices[i].evexists) {
27091bf4c5cSSiva Durga Prasad Paladugu 		return zynqmp_devices[i].name;
271eb0d2b17SVenkatesh Yadav Abbarapu 	}
27291bf4c5cSSiva Durga Prasad Paladugu 
273dd1fe717SVenkatesh Yadav Abbarapu 	if ((ver & ZYNQMP_PL_STATUS_MASK) != 0U) {
27491bf4c5cSSiva Durga Prasad Paladugu 		return zynqmp_devices[i].name;
275eb0d2b17SVenkatesh Yadav Abbarapu 	}
27691bf4c5cSSiva Durga Prasad Paladugu 
27791bf4c5cSSiva Durga Prasad Paladugu 	len = strlen(zynqmp_devices[i].name) - 2;
27891bf4c5cSSiva Durga Prasad Paladugu 	for (j = 0; j < strlen(name); j++) {
27991bf4c5cSSiva Durga Prasad Paladugu 		zynqmp_devices[i].name[len] = name[j];
28091bf4c5cSSiva Durga Prasad Paladugu 		len++;
28191bf4c5cSSiva Durga Prasad Paladugu 	}
28291bf4c5cSSiva Durga Prasad Paladugu 	zynqmp_devices[i].name[len] = '\0';
28391bf4c5cSSiva Durga Prasad Paladugu 
28491bf4c5cSSiva Durga Prasad Paladugu 	return zynqmp_devices[i].name;
285c8284409SSoren Brinkmann }
286c8284409SSoren Brinkmann 
287c8284409SSoren Brinkmann static unsigned int zynqmp_get_rtl_ver(void)
288c8284409SSoren Brinkmann {
289c8284409SSoren Brinkmann 	uint32_t ver;
290c8284409SSoren Brinkmann 
291c8284409SSoren Brinkmann 	ver = mmio_read_32(ZYNQMP_CSU_BASEADDR + ZYNQMP_CSU_VERSION_OFFSET);
292c8284409SSoren Brinkmann 	ver &= ZYNQMP_RTL_VER_MASK;
293c8284409SSoren Brinkmann 	ver >>= ZYNQMP_RTL_VER_SHIFT;
294c8284409SSoren Brinkmann 
295c8284409SSoren Brinkmann 	return ver;
296c8284409SSoren Brinkmann }
297c8284409SSoren Brinkmann 
298c8284409SSoren Brinkmann static char *zynqmp_print_silicon_idcode(void)
299c8284409SSoren Brinkmann {
300c8284409SSoren Brinkmann 	uint32_t id, maskid, tmp;
301c8284409SSoren Brinkmann 
302c8284409SSoren Brinkmann 	id = mmio_read_32(ZYNQMP_CSU_BASEADDR + ZYNQMP_CSU_IDCODE_OFFSET);
303c8284409SSoren Brinkmann 
304c8284409SSoren Brinkmann 	tmp = id;
305c8284409SSoren Brinkmann 	tmp &= ZYNQMP_CSU_IDCODE_XILINX_ID_MASK |
306648fe99eSSoren Brinkmann 	       ZYNQMP_CSU_IDCODE_FAMILY_MASK;
307c8284409SSoren Brinkmann 	maskid = ZYNQMP_CSU_IDCODE_XILINX_ID << ZYNQMP_CSU_IDCODE_XILINX_ID_SHIFT |
308648fe99eSSoren Brinkmann 		 ZYNQMP_CSU_IDCODE_FAMILY << ZYNQMP_CSU_IDCODE_FAMILY_SHIFT;
309c8284409SSoren Brinkmann 	if (tmp != maskid) {
310d6760c4dSAkshay Belsare 		ERROR("Incorrect IDCODE 0x%x, maskid 0x%x\n", id, maskid);
311c8284409SSoren Brinkmann 		return "UNKN";
312c8284409SSoren Brinkmann 	}
313d6760c4dSAkshay Belsare 	VERBOSE("IDCODE 0x%x\n", id);
314c8284409SSoren Brinkmann 	return zynqmp_get_silicon_idcode_name();
315c8284409SSoren Brinkmann }
316c8284409SSoren Brinkmann 
3178f9ba3f3SMichal Simek int32_t plat_is_smccc_feature_available(u_register_t fid)
3188f9ba3f3SMichal Simek {
3198f9ba3f3SMichal Simek 	switch (fid) {
3208f9ba3f3SMichal Simek 	case SMCCC_ARCH_SOC_ID:
3218f9ba3f3SMichal Simek 		return SMC_ARCH_CALL_SUCCESS;
3228f9ba3f3SMichal Simek 	default:
3238f9ba3f3SMichal Simek 		return SMC_ARCH_CALL_NOT_SUPPORTED;
3248f9ba3f3SMichal Simek 	}
3258f9ba3f3SMichal Simek 
3268f9ba3f3SMichal Simek 	return SMC_ARCH_CALL_NOT_SUPPORTED;
3278f9ba3f3SMichal Simek }
3288f9ba3f3SMichal Simek 
3298f9ba3f3SMichal Simek int32_t plat_get_soc_version(void)
3308f9ba3f3SMichal Simek {
3318f9ba3f3SMichal Simek 	uint32_t chip_id = zynqmp_get_silicon_ver();
3328f9ba3f3SMichal Simek 	uint32_t manfid = SOC_ID_SET_JEP_106(JEDEC_XILINX_BKID, JEDEC_XILINX_MFID);
3338f9ba3f3SMichal Simek 
3348f9ba3f3SMichal Simek 	return (int32_t)(manfid | (chip_id & 0xFFFF));
3358f9ba3f3SMichal Simek }
3368f9ba3f3SMichal Simek 
3378f9ba3f3SMichal Simek int32_t plat_get_soc_revision(void)
3388f9ba3f3SMichal Simek {
3398f9ba3f3SMichal Simek 	return mmio_read_32(ZYNQMP_CSU_BASEADDR + ZYNQMP_CSU_IDCODE_OFFSET);
3408f9ba3f3SMichal Simek }
3418f9ba3f3SMichal Simek 
342ffa91031SVenkatesh Yadav Abbarapu static uint32_t zynqmp_get_ps_ver(void)
343c8284409SSoren Brinkmann {
344c8284409SSoren Brinkmann 	uint32_t ver = mmio_read_32(ZYNQMP_CSU_BASEADDR + ZYNQMP_CSU_VERSION_OFFSET);
345c8284409SSoren Brinkmann 
346c8284409SSoren Brinkmann 	ver &= ZYNQMP_PS_VER_MASK;
347c8284409SSoren Brinkmann 	ver >>= ZYNQMP_PS_VER_SHIFT;
348c8284409SSoren Brinkmann 
349bfd7c881SVenkatesh Yadav Abbarapu 	return ver + 1U;
350c8284409SSoren Brinkmann }
351c8284409SSoren Brinkmann 
352c8284409SSoren Brinkmann static void zynqmp_print_platform_name(void)
353c8284409SSoren Brinkmann {
354ffa91031SVenkatesh Yadav Abbarapu 	uint32_t ver = zynqmp_get_silicon_ver();
355ffa91031SVenkatesh Yadav Abbarapu 	uint32_t rtl = zynqmp_get_rtl_ver();
356c8284409SSoren Brinkmann 	char *label = "Unknown";
357c8284409SSoren Brinkmann 
358c8284409SSoren Brinkmann 	switch (ver) {
359c8284409SSoren Brinkmann 	case ZYNQMP_CSU_VERSION_QEMU:
360c8284409SSoren Brinkmann 		label = "QEMU";
361c8284409SSoren Brinkmann 		break;
362c8284409SSoren Brinkmann 	case ZYNQMP_CSU_VERSION_SILICON:
363c8284409SSoren Brinkmann 		label = "silicon";
364c8284409SSoren Brinkmann 		break;
365649c48f5SJonathan Wright 	default:
366649c48f5SJonathan Wright 		/* Do nothing in default case */
367649c48f5SJonathan Wright 		break;
368c8284409SSoren Brinkmann 	}
369c8284409SSoren Brinkmann 
3701277af9bSVenkatesh Yadav Abbarapu 	VERBOSE("TF-A running on %s/%s at 0x%x\n",
371db97f939SVenkatesh Yadav Abbarapu 		zynqmp_print_silicon_idcode(), label, BL31_BASE);
372db97f939SVenkatesh Yadav Abbarapu 	VERBOSE("TF-A running on v%d/RTL%d.%d\n",
373db97f939SVenkatesh Yadav Abbarapu 	       zynqmp_get_ps_ver(), (rtl & 0xf0) >> 4, rtl & 0xf);
374c8284409SSoren Brinkmann }
375c8284409SSoren Brinkmann #else
376c8284409SSoren Brinkmann static inline void zynqmp_print_platform_name(void) { }
377c8284409SSoren Brinkmann #endif
378c8284409SSoren Brinkmann 
379ffa91031SVenkatesh Yadav Abbarapu uint32_t zynqmp_get_bootmode(void)
3802cb5bac9SSoren Brinkmann {
38129bd0e66SSiva Durga Prasad Paladugu 	uint32_t r;
382a6d28520SSiva Durga Prasad Paladugu 	unsigned int ret;
38329bd0e66SSiva Durga Prasad Paladugu 
384a6d28520SSiva Durga Prasad Paladugu 	ret = pm_mmio_read(CRL_APB_BOOT_MODE_USER, &r);
385a6d28520SSiva Durga Prasad Paladugu 
386eb0d2b17SVenkatesh Yadav Abbarapu 	if (ret != PM_RET_SUCCESS) {
38729bd0e66SSiva Durga Prasad Paladugu 		r = mmio_read_32(CRL_APB_BOOT_MODE_USER);
388eb0d2b17SVenkatesh Yadav Abbarapu 	}
3892cb5bac9SSoren Brinkmann 
3902cb5bac9SSoren Brinkmann 	return r & CRL_APB_BOOT_MODE_MASK;
3912cb5bac9SSoren Brinkmann }
3922cb5bac9SSoren Brinkmann 
393c8284409SSoren Brinkmann void zynqmp_config_setup(void)
394c8284409SSoren Brinkmann {
3959f0ddae3SRajan Vaja 	uint64_t counter_freq;
3969f0ddae3SRajan Vaja 
397705bed5dSJolly Shah 	/* Configure IPI data for ZynqMP */
398705bed5dSJolly Shah 	zynqmp_ipi_config_table_init();
399705bed5dSJolly Shah 
400c8284409SSoren Brinkmann 	zynqmp_print_platform_name();
4019f0ddae3SRajan Vaja 
4029f0ddae3SRajan Vaja 	/* Configure counter frequency */
4039f0ddae3SRajan Vaja 	counter_freq = read_cntfrq_el0();
4049f0ddae3SRajan Vaja 	if (counter_freq == ZYNQMP_DEFAULT_COUNTER_FREQ) {
4059f0ddae3SRajan Vaja 		write_cntfrq_el0(plat_get_syscnt_freq2());
4069f0ddae3SRajan Vaja 	}
4079f0ddae3SRajan Vaja 
408e1cb4da4SSoren Brinkmann 	generic_delay_timer_init();
409c8284409SSoren Brinkmann }
410c8284409SSoren Brinkmann 
411ffa91031SVenkatesh Yadav Abbarapu uint32_t plat_get_syscnt_freq2(void)
412c8284409SSoren Brinkmann {
413ffa91031SVenkatesh Yadav Abbarapu 	uint32_t ver = zynqmp_get_silicon_ver();
414c8284409SSoren Brinkmann 
415eb0d2b17SVenkatesh Yadav Abbarapu 	if (ver == ZYNQMP_CSU_VERSION_QEMU) {
41665501a7cSEdgar E. Iglesias 		return 65000000;
417eb0d2b17SVenkatesh Yadav Abbarapu 	} else {
418e89f4af7SSoren Brinkmann 		return mmio_read_32(IOU_SCNTRS_BASEFREQ);
419c8284409SSoren Brinkmann 	}
420eb0d2b17SVenkatesh Yadav Abbarapu }
421