1c8284409SSoren Brinkmann /*
2619bc13eSMichal Simek * Copyright (c) 2013-2022, Arm Limited and Contributors. All rights reserved.
3*8ce93ec9SRonak Jain * Copyright (c) 2022-2025, 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 <lib/mmio.h>
138f9ba3f3SMichal Simek #include <lib/smccc.h>
14fdda980aSPrasad Kummari #include <lib/xlat_tables/xlat_tables_v2.h>
1501a326abSPrasad Kummari #include <plat/common/platform.h>
166c08d1dfSMaheedhar Bollapalli #include <plat_arm.h>
1701a326abSPrasad Kummari #include <services/arm_arch_svc.h>
1801a326abSPrasad Kummari
19705bed5dSJolly Shah #include <plat_ipi.h>
20*8ce93ec9SRonak Jain #include <plat_pm_common.h>
2131c3842eSJolly Shah #include <plat_private.h>
228f9ba3f3SMichal Simek #include <plat_startup.h>
2309d40e0eSAntonio Nino Diaz
24a92681d9SJay Buddhabhatti #include "zynqmp_pm_api_sys.h"
25*8ce93ec9SRonak Jain #include "zynqmp_def.h"
26c8284409SSoren Brinkmann
27c8284409SSoren Brinkmann /*
28c8284409SSoren Brinkmann * Table of regions to map using the MMU.
29c8284409SSoren Brinkmann * This doesn't include TZRAM as the 'mem_layout' argument passed to
30c8284409SSoren Brinkmann * configure_mmu_elx() will give the available subset of that,
31c8284409SSoren Brinkmann */
3251564354SPrasad Kummari const mmap_region_t plat_zynqmp_mmap[] = {
33fdda980aSPrasad Kummari MAP_REGION_FLAT(DEVICE0_BASE, DEVICE0_SIZE, MT_DEVICE | MT_RW | MT_SECURE),
34fdda980aSPrasad Kummari MAP_REGION_FLAT(DEVICE1_BASE, DEVICE1_SIZE, MT_DEVICE | MT_RW | MT_SECURE),
35fdda980aSPrasad Kummari MAP_REGION_FLAT(CRF_APB_BASE, CRF_APB_SIZE, MT_DEVICE | MT_RW | MT_SECURE),
36c8284409SSoren Brinkmann {0}
37c8284409SSoren Brinkmann };
38c8284409SSoren Brinkmann
plat_get_mmap(void)3951564354SPrasad Kummari const mmap_region_t *plat_get_mmap(void)
4051564354SPrasad Kummari {
4151564354SPrasad Kummari return plat_zynqmp_mmap;
4251564354SPrasad Kummari }
4351564354SPrasad Kummari
zynqmp_get_silicon_ver(void)44ffa91031SVenkatesh Yadav Abbarapu static uint32_t zynqmp_get_silicon_ver(void)
45c8284409SSoren Brinkmann {
462863b0c4SMaheedhar Bollapalli static uint32_t ver;
47c8284409SSoren Brinkmann
482863b0c4SMaheedhar Bollapalli if (ver == 0U) {
49466675c2SSoren Brinkmann ver = mmio_read_32(ZYNQMP_CSU_BASEADDR +
50466675c2SSoren Brinkmann ZYNQMP_CSU_VERSION_OFFSET);
51c8284409SSoren Brinkmann ver &= ZYNQMP_SILICON_VER_MASK;
52c8284409SSoren Brinkmann ver >>= ZYNQMP_SILICON_VER_SHIFT;
53466675c2SSoren Brinkmann }
54c8284409SSoren Brinkmann
55c8284409SSoren Brinkmann return ver;
56c8284409SSoren Brinkmann }
57c8284409SSoren Brinkmann
get_uart_clk(void)5804a48335SMichal Simek uint32_t get_uart_clk(void)
59c8284409SSoren Brinkmann {
60c8284409SSoren Brinkmann unsigned int ver = zynqmp_get_silicon_ver();
613f6d4794SMaheedhar Bollapalli uint32_t uart_clk = 0U;
62c8284409SSoren Brinkmann
63eb0d2b17SVenkatesh Yadav Abbarapu if (ver == ZYNQMP_CSU_VERSION_QEMU) {
643f6d4794SMaheedhar Bollapalli uart_clk = 133000000U;
65eb0d2b17SVenkatesh Yadav Abbarapu } else {
663f6d4794SMaheedhar Bollapalli uart_clk = 100000000U;
67c8284409SSoren Brinkmann }
683f6d4794SMaheedhar Bollapalli
693f6d4794SMaheedhar Bollapalli return uart_clk;
70eb0d2b17SVenkatesh Yadav Abbarapu }
71c8284409SSoren Brinkmann
72c8284409SSoren Brinkmann #if LOG_LEVEL >= LOG_LEVEL_NOTICE
73c8284409SSoren Brinkmann static const struct {
747e3e7999SMichal Simek uint8_t id;
7591bf4c5cSSiva Durga Prasad Paladugu bool evexists;
767e3e7999SMichal Simek uint16_t ver;
777e3e7999SMichal Simek char *name;
787e3e7999SMichal Simek } __packed zynqmp_devices[] = {
79c8284409SSoren Brinkmann {
80c8284409SSoren Brinkmann .id = 0x10,
817a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU3EG",
82c8284409SSoren Brinkmann },
83c8284409SSoren Brinkmann {
84915d4872SSiva Durga Prasad Paladugu .id = 0x10,
85915d4872SSiva Durga Prasad Paladugu .ver = 0x2c,
867a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU3CG",
87915d4872SSiva Durga Prasad Paladugu },
88915d4872SSiva Durga Prasad Paladugu {
89c8284409SSoren Brinkmann .id = 0x11,
907a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU2EG",
91c8284409SSoren Brinkmann },
92c8284409SSoren Brinkmann {
93915d4872SSiva Durga Prasad Paladugu .id = 0x11,
94915d4872SSiva Durga Prasad Paladugu .ver = 0x2c,
957a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU2CG",
96915d4872SSiva Durga Prasad Paladugu },
97915d4872SSiva Durga Prasad Paladugu {
98c8284409SSoren Brinkmann .id = 0x20,
997a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU5EV",
10091bf4c5cSSiva Durga Prasad Paladugu .evexists = true,
101c8284409SSoren Brinkmann },
102c8284409SSoren Brinkmann {
103915d4872SSiva Durga Prasad Paladugu .id = 0x20,
104915d4872SSiva Durga Prasad Paladugu .ver = 0x100,
1057a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU5EG",
10691bf4c5cSSiva Durga Prasad Paladugu .evexists = true,
107915d4872SSiva Durga Prasad Paladugu },
108915d4872SSiva Durga Prasad Paladugu {
109915d4872SSiva Durga Prasad Paladugu .id = 0x20,
110915d4872SSiva Durga Prasad Paladugu .ver = 0x12c,
1117a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU5CG",
112915d4872SSiva Durga Prasad Paladugu },
113915d4872SSiva Durga Prasad Paladugu {
114c8284409SSoren Brinkmann .id = 0x21,
1157a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU4EV",
11691bf4c5cSSiva Durga Prasad Paladugu .evexists = true,
117c8284409SSoren Brinkmann },
118c8284409SSoren Brinkmann {
119915d4872SSiva Durga Prasad Paladugu .id = 0x21,
120915d4872SSiva Durga Prasad Paladugu .ver = 0x100,
1217a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU4EG",
12291bf4c5cSSiva Durga Prasad Paladugu .evexists = true,
123915d4872SSiva Durga Prasad Paladugu },
124915d4872SSiva Durga Prasad Paladugu {
125915d4872SSiva Durga Prasad Paladugu .id = 0x21,
126915d4872SSiva Durga Prasad Paladugu .ver = 0x12c,
1277a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU4CG",
128915d4872SSiva Durga Prasad Paladugu },
129915d4872SSiva Durga Prasad Paladugu {
130c8284409SSoren Brinkmann .id = 0x30,
1317a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU7EV",
13291bf4c5cSSiva Durga Prasad Paladugu .evexists = true,
133c8284409SSoren Brinkmann },
134c8284409SSoren Brinkmann {
135915d4872SSiva Durga Prasad Paladugu .id = 0x30,
136915d4872SSiva Durga Prasad Paladugu .ver = 0x100,
1377a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU7EG",
13891bf4c5cSSiva Durga Prasad Paladugu .evexists = true,
139915d4872SSiva Durga Prasad Paladugu },
140915d4872SSiva Durga Prasad Paladugu {
141915d4872SSiva Durga Prasad Paladugu .id = 0x30,
142915d4872SSiva Durga Prasad Paladugu .ver = 0x12c,
1437a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU7CG",
144915d4872SSiva Durga Prasad Paladugu },
145915d4872SSiva Durga Prasad Paladugu {
146c8284409SSoren Brinkmann .id = 0x38,
1477a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU9EG",
148c8284409SSoren Brinkmann },
149c8284409SSoren Brinkmann {
150915d4872SSiva Durga Prasad Paladugu .id = 0x38,
151915d4872SSiva Durga Prasad Paladugu .ver = 0x2c,
1527a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU9CG",
153915d4872SSiva Durga Prasad Paladugu },
154915d4872SSiva Durga Prasad Paladugu {
155c8284409SSoren Brinkmann .id = 0x39,
1567a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU6EG",
157c8284409SSoren Brinkmann },
158c8284409SSoren Brinkmann {
159915d4872SSiva Durga Prasad Paladugu .id = 0x39,
160915d4872SSiva Durga Prasad Paladugu .ver = 0x2c,
1617a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU6CG",
162915d4872SSiva Durga Prasad Paladugu },
163915d4872SSiva Durga Prasad Paladugu {
164c8284409SSoren Brinkmann .id = 0x40,
1657a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU11EG",
166c8284409SSoren Brinkmann },
167c8284409SSoren Brinkmann {
168c8284409SSoren Brinkmann .id = 0x50,
1697a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU15EG",
170c8284409SSoren Brinkmann },
171c8284409SSoren Brinkmann {
172c8284409SSoren Brinkmann .id = 0x58,
1737a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU19EG",
174c8284409SSoren Brinkmann },
175c8284409SSoren Brinkmann {
176c8284409SSoren Brinkmann .id = 0x59,
1777a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU17EG",
178c8284409SSoren Brinkmann },
179d9710aebSSiva Durga Prasad Paladugu {
180d9710aebSSiva Durga Prasad Paladugu .id = 0x60,
1817a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU28DR",
182d9710aebSSiva Durga Prasad Paladugu },
183d9710aebSSiva Durga Prasad Paladugu {
184d9710aebSSiva Durga Prasad Paladugu .id = 0x61,
1857a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU21DR",
186d9710aebSSiva Durga Prasad Paladugu },
187d9710aebSSiva Durga Prasad Paladugu {
188d9710aebSSiva Durga Prasad Paladugu .id = 0x62,
1897a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU29DR",
190d9710aebSSiva Durga Prasad Paladugu },
191d9710aebSSiva Durga Prasad Paladugu {
192d9710aebSSiva Durga Prasad Paladugu .id = 0x63,
1937a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU23DR",
194d9710aebSSiva Durga Prasad Paladugu },
195d9710aebSSiva Durga Prasad Paladugu {
196d9710aebSSiva Durga Prasad Paladugu .id = 0x64,
1977a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU27DR",
198d9710aebSSiva Durga Prasad Paladugu },
199d9710aebSSiva Durga Prasad Paladugu {
200d9710aebSSiva Durga Prasad Paladugu .id = 0x65,
2017a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU25DR",
202d9710aebSSiva Durga Prasad Paladugu },
203345a85aeSSiva Durga Prasad Paladugu {
204345a85aeSSiva Durga Prasad Paladugu .id = 0x66,
2057a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU39DR",
206345a85aeSSiva Durga Prasad Paladugu },
207c613a660SVenkatesh Yadav Abbarapu {
2081b7e5ca9SVenkatesh Yadav Abbarapu .id = 0x7d,
2097a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU43DR",
2101b7e5ca9SVenkatesh Yadav Abbarapu },
2111b7e5ca9SVenkatesh Yadav Abbarapu {
2121b7e5ca9SVenkatesh Yadav Abbarapu .id = 0x78,
2137a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU46DR",
2141b7e5ca9SVenkatesh Yadav Abbarapu },
2151b7e5ca9SVenkatesh Yadav Abbarapu {
2161b7e5ca9SVenkatesh Yadav Abbarapu .id = 0x7f,
2177a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU47DR",
2181b7e5ca9SVenkatesh Yadav Abbarapu },
2191b7e5ca9SVenkatesh Yadav Abbarapu {
220c613a660SVenkatesh Yadav Abbarapu .id = 0x7b,
2217a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU48DR",
222c613a660SVenkatesh Yadav Abbarapu },
223c613a660SVenkatesh Yadav Abbarapu {
224c613a660SVenkatesh Yadav Abbarapu .id = 0x7e,
2257a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU49DR",
226c613a660SVenkatesh Yadav Abbarapu },
227c8284409SSoren Brinkmann };
228c8284409SSoren Brinkmann
22991bf4c5cSSiva Durga Prasad Paladugu #define ZYNQMP_PL_STATUS_BIT 9
23091bf4c5cSSiva Durga Prasad Paladugu #define ZYNQMP_PL_STATUS_MASK BIT(ZYNQMP_PL_STATUS_BIT)
23191bf4c5cSSiva Durga Prasad Paladugu #define ZYNQMP_CSU_VERSION_MASK ~(ZYNQMP_PL_STATUS_MASK)
232915d4872SSiva Durga Prasad Paladugu
233f1565907SMichal Simek #define SILICON_ID_XCK24 0x4712093U
234bfd7c881SVenkatesh Yadav Abbarapu #define SILICON_ID_XCK26 0x4724093U
2357a30e08bSVenkatesh Yadav Abbarapu
zynqmp_get_silicon_idcode_name(void)236c8284409SSoren Brinkmann static char *zynqmp_get_silicon_idcode_name(void)
237c8284409SSoren Brinkmann {
23891bf4c5cSSiva Durga Prasad Paladugu uint32_t id, ver, chipid[2];
23991bf4c5cSSiva Durga Prasad Paladugu size_t i, j, len;
24091bf4c5cSSiva Durga Prasad Paladugu const char *name = "EG/EV";
241c8284409SSoren Brinkmann
242*8ce93ec9SRonak Jain if (pm_get_chipid(chipid, SECURE) != PM_RET_SUCCESS) {
2437a30e08bSVenkatesh Yadav Abbarapu return "XCZUUNKN";
244eb0d2b17SVenkatesh Yadav Abbarapu }
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++) {
2525b542313SMaheedhar Bollapalli if ((zynqmp_devices[i].id == id) &&
2535b542313SMaheedhar Bollapalli (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
277895e8029SMaheedhar Bollapalli len = strlen(zynqmp_devices[i].name) - 2U;
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
zynqmp_get_rtl_ver(void)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
zynqmp_print_silicon_idcode(void)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;
3075b542313SMaheedhar Bollapalli maskid = (ZYNQMP_CSU_IDCODE_XILINX_ID << ZYNQMP_CSU_IDCODE_XILINX_ID_SHIFT) |
3085b542313SMaheedhar Bollapalli (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
plat_is_smccc_feature_available(u_register_t fid)3178f9ba3f3SMichal Simek int32_t plat_is_smccc_feature_available(u_register_t fid)
3188f9ba3f3SMichal Simek {
3193f6d4794SMaheedhar Bollapalli int32_t ret = SMC_ARCH_CALL_NOT_SUPPORTED;
3203f6d4794SMaheedhar Bollapalli
3218f9ba3f3SMichal Simek switch (fid) {
3228f9ba3f3SMichal Simek case SMCCC_ARCH_SOC_ID:
3233f6d4794SMaheedhar Bollapalli ret = SMC_ARCH_CALL_SUCCESS;
3243f6d4794SMaheedhar Bollapalli break;
3258f9ba3f3SMichal Simek default:
3263f6d4794SMaheedhar Bollapalli break;
3278f9ba3f3SMichal Simek }
3288f9ba3f3SMichal Simek
3293f6d4794SMaheedhar Bollapalli return ret;
3308f9ba3f3SMichal Simek }
3318f9ba3f3SMichal Simek
plat_get_soc_version(void)3328f9ba3f3SMichal Simek int32_t plat_get_soc_version(void)
3338f9ba3f3SMichal Simek {
3348f9ba3f3SMichal Simek uint32_t chip_id = zynqmp_get_silicon_ver();
3358f9ba3f3SMichal Simek uint32_t manfid = SOC_ID_SET_JEP_106(JEDEC_XILINX_BKID, JEDEC_XILINX_MFID);
3362863b0c4SMaheedhar Bollapalli uint32_t result = (manfid | (chip_id & 0xFFFFU));
3378f9ba3f3SMichal Simek
3382863b0c4SMaheedhar Bollapalli return (int32_t)result;
3398f9ba3f3SMichal Simek }
3408f9ba3f3SMichal Simek
plat_get_soc_revision(void)3418f9ba3f3SMichal Simek int32_t plat_get_soc_revision(void)
3428f9ba3f3SMichal Simek {
3436ae95624SMaheedhar Bollapalli return (int32_t)mmio_read_32(ZYNQMP_CSU_BASEADDR + ZYNQMP_CSU_IDCODE_OFFSET);
3448f9ba3f3SMichal Simek }
3458f9ba3f3SMichal Simek
zynqmp_get_ps_ver(void)346ffa91031SVenkatesh Yadav Abbarapu static uint32_t zynqmp_get_ps_ver(void)
347c8284409SSoren Brinkmann {
348c8284409SSoren Brinkmann uint32_t ver = mmio_read_32(ZYNQMP_CSU_BASEADDR + ZYNQMP_CSU_VERSION_OFFSET);
349c8284409SSoren Brinkmann
350c8284409SSoren Brinkmann ver &= ZYNQMP_PS_VER_MASK;
351c8284409SSoren Brinkmann ver >>= ZYNQMP_PS_VER_SHIFT;
352c8284409SSoren Brinkmann
353bfd7c881SVenkatesh Yadav Abbarapu return ver + 1U;
354c8284409SSoren Brinkmann }
355c8284409SSoren Brinkmann
zynqmp_print_platform_name(void)356c8284409SSoren Brinkmann static void zynqmp_print_platform_name(void)
357c8284409SSoren Brinkmann {
358ffa91031SVenkatesh Yadav Abbarapu uint32_t ver = zynqmp_get_silicon_ver();
359ffa91031SVenkatesh Yadav Abbarapu uint32_t rtl = zynqmp_get_rtl_ver();
360bb145c9dSMaheedhar Bollapalli const char *label = "Unknown";
361c8284409SSoren Brinkmann
362c8284409SSoren Brinkmann switch (ver) {
363c8284409SSoren Brinkmann case ZYNQMP_CSU_VERSION_QEMU:
364c8284409SSoren Brinkmann label = "QEMU";
365c8284409SSoren Brinkmann break;
366c8284409SSoren Brinkmann case ZYNQMP_CSU_VERSION_SILICON:
367c8284409SSoren Brinkmann label = "silicon";
368c8284409SSoren Brinkmann break;
369649c48f5SJonathan Wright default:
370649c48f5SJonathan Wright /* Do nothing in default case */
371649c48f5SJonathan Wright break;
372c8284409SSoren Brinkmann }
373c8284409SSoren Brinkmann
3741277af9bSVenkatesh Yadav Abbarapu VERBOSE("TF-A running on %s/%s at 0x%x\n",
375db97f939SVenkatesh Yadav Abbarapu zynqmp_print_silicon_idcode(), label, BL31_BASE);
376db97f939SVenkatesh Yadav Abbarapu VERBOSE("TF-A running on v%d/RTL%d.%d\n",
3772863b0c4SMaheedhar Bollapalli zynqmp_get_ps_ver(), (rtl & 0xf0U) >> 4U, rtl & 0xfU);
378c8284409SSoren Brinkmann }
379c8284409SSoren Brinkmann #else
zynqmp_print_platform_name(void)380c8284409SSoren Brinkmann static inline void zynqmp_print_platform_name(void) { }
381c8284409SSoren Brinkmann #endif
382c8284409SSoren Brinkmann
zynqmp_get_bootmode(void)383ffa91031SVenkatesh Yadav Abbarapu uint32_t zynqmp_get_bootmode(void)
3842cb5bac9SSoren Brinkmann {
38529bd0e66SSiva Durga Prasad Paladugu uint32_t r;
386895e8029SMaheedhar Bollapalli enum pm_ret_status ret;
38729bd0e66SSiva Durga Prasad Paladugu
388*8ce93ec9SRonak Jain ret = pm_mmio_read(CRL_APB_BOOT_MODE_USER, &r, SECURE);
389a6d28520SSiva Durga Prasad Paladugu
390eb0d2b17SVenkatesh Yadav Abbarapu if (ret != PM_RET_SUCCESS) {
39129bd0e66SSiva Durga Prasad Paladugu r = mmio_read_32(CRL_APB_BOOT_MODE_USER);
392eb0d2b17SVenkatesh Yadav Abbarapu }
3932cb5bac9SSoren Brinkmann
3942cb5bac9SSoren Brinkmann return r & CRL_APB_BOOT_MODE_MASK;
3952cb5bac9SSoren Brinkmann }
3962cb5bac9SSoren Brinkmann
zynqmp_config_setup(void)397c8284409SSoren Brinkmann void zynqmp_config_setup(void)
398c8284409SSoren Brinkmann {
399705bed5dSJolly Shah /* Configure IPI data for ZynqMP */
400705bed5dSJolly Shah zynqmp_ipi_config_table_init();
401705bed5dSJolly Shah
402c8284409SSoren Brinkmann zynqmp_print_platform_name();
403c8284409SSoren Brinkmann }
404c8284409SSoren Brinkmann
plat_get_syscnt_freq2(void)405ffa91031SVenkatesh Yadav Abbarapu uint32_t plat_get_syscnt_freq2(void)
406c8284409SSoren Brinkmann {
407ffa91031SVenkatesh Yadav Abbarapu uint32_t ver = zynqmp_get_silicon_ver();
4083f6d4794SMaheedhar Bollapalli uint32_t ret = 0U;
409c8284409SSoren Brinkmann
410eb0d2b17SVenkatesh Yadav Abbarapu if (ver == ZYNQMP_CSU_VERSION_QEMU) {
41155ae162fSLuc Michel ret = 62500000U;
412eb0d2b17SVenkatesh Yadav Abbarapu } else {
4133f6d4794SMaheedhar Bollapalli ret = mmio_read_32((uint64_t)IOU_SCNTRS_BASEFREQ);
414c8284409SSoren Brinkmann }
4153f6d4794SMaheedhar Bollapalli
4163f6d4794SMaheedhar Bollapalli return ret;
417eb0d2b17SVenkatesh Yadav Abbarapu }
418