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> 1701a326abSPrasad Kummari #include <services/arm_arch_svc.h> 1801a326abSPrasad 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 */ 3051564354SPrasad Kummari const mmap_region_t plat_zynqmp_mmap[] = { 31fdda980aSPrasad Kummari MAP_REGION_FLAT(DEVICE0_BASE, DEVICE0_SIZE, MT_DEVICE | MT_RW | MT_SECURE), 32fdda980aSPrasad Kummari MAP_REGION_FLAT(DEVICE1_BASE, DEVICE1_SIZE, MT_DEVICE | MT_RW | MT_SECURE), 33fdda980aSPrasad Kummari MAP_REGION_FLAT(CRF_APB_BASE, CRF_APB_SIZE, MT_DEVICE | MT_RW | MT_SECURE), 34c8284409SSoren Brinkmann {0} 35c8284409SSoren Brinkmann }; 36c8284409SSoren Brinkmann 3751564354SPrasad Kummari const mmap_region_t *plat_get_mmap(void) 3851564354SPrasad Kummari { 3951564354SPrasad Kummari return plat_zynqmp_mmap; 4051564354SPrasad Kummari } 4151564354SPrasad Kummari 42ffa91031SVenkatesh Yadav Abbarapu static uint32_t zynqmp_get_silicon_ver(void) 43c8284409SSoren Brinkmann { 44466675c2SSoren Brinkmann static unsigned int ver; 45c8284409SSoren Brinkmann 46466675c2SSoren Brinkmann if (!ver) { 47466675c2SSoren Brinkmann ver = mmio_read_32(ZYNQMP_CSU_BASEADDR + 48466675c2SSoren Brinkmann ZYNQMP_CSU_VERSION_OFFSET); 49c8284409SSoren Brinkmann ver &= ZYNQMP_SILICON_VER_MASK; 50c8284409SSoren Brinkmann ver >>= ZYNQMP_SILICON_VER_SHIFT; 51466675c2SSoren Brinkmann } 52c8284409SSoren Brinkmann 53c8284409SSoren Brinkmann return ver; 54c8284409SSoren Brinkmann } 55c8284409SSoren Brinkmann 5604a48335SMichal Simek uint32_t get_uart_clk(void) 57c8284409SSoren Brinkmann { 58c8284409SSoren Brinkmann unsigned int ver = zynqmp_get_silicon_ver(); 59c8284409SSoren Brinkmann 60eb0d2b17SVenkatesh Yadav Abbarapu if (ver == ZYNQMP_CSU_VERSION_QEMU) { 61c8284409SSoren Brinkmann return 133000000; 62eb0d2b17SVenkatesh Yadav Abbarapu } else { 63c8284409SSoren Brinkmann return 100000000; 64c8284409SSoren Brinkmann } 65eb0d2b17SVenkatesh Yadav Abbarapu } 66c8284409SSoren Brinkmann 67c8284409SSoren Brinkmann #if LOG_LEVEL >= LOG_LEVEL_NOTICE 68c8284409SSoren Brinkmann static const struct { 697e3e7999SMichal Simek uint8_t id; 7091bf4c5cSSiva Durga Prasad Paladugu bool evexists; 717e3e7999SMichal Simek uint16_t ver; 727e3e7999SMichal Simek char *name; 737e3e7999SMichal Simek } __packed zynqmp_devices[] = { 74c8284409SSoren Brinkmann { 75c8284409SSoren Brinkmann .id = 0x10, 767a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU3EG", 77c8284409SSoren Brinkmann }, 78c8284409SSoren Brinkmann { 79915d4872SSiva Durga Prasad Paladugu .id = 0x10, 80915d4872SSiva Durga Prasad Paladugu .ver = 0x2c, 817a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU3CG", 82915d4872SSiva Durga Prasad Paladugu }, 83915d4872SSiva Durga Prasad Paladugu { 84c8284409SSoren Brinkmann .id = 0x11, 857a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU2EG", 86c8284409SSoren Brinkmann }, 87c8284409SSoren Brinkmann { 88915d4872SSiva Durga Prasad Paladugu .id = 0x11, 89915d4872SSiva Durga Prasad Paladugu .ver = 0x2c, 907a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU2CG", 91915d4872SSiva Durga Prasad Paladugu }, 92915d4872SSiva Durga Prasad Paladugu { 93c8284409SSoren Brinkmann .id = 0x20, 947a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU5EV", 9591bf4c5cSSiva Durga Prasad Paladugu .evexists = true, 96c8284409SSoren Brinkmann }, 97c8284409SSoren Brinkmann { 98915d4872SSiva Durga Prasad Paladugu .id = 0x20, 99915d4872SSiva Durga Prasad Paladugu .ver = 0x100, 1007a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU5EG", 10191bf4c5cSSiva Durga Prasad Paladugu .evexists = true, 102915d4872SSiva Durga Prasad Paladugu }, 103915d4872SSiva Durga Prasad Paladugu { 104915d4872SSiva Durga Prasad Paladugu .id = 0x20, 105915d4872SSiva Durga Prasad Paladugu .ver = 0x12c, 1067a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU5CG", 107915d4872SSiva Durga Prasad Paladugu }, 108915d4872SSiva Durga Prasad Paladugu { 109c8284409SSoren Brinkmann .id = 0x21, 1107a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU4EV", 11191bf4c5cSSiva Durga Prasad Paladugu .evexists = true, 112c8284409SSoren Brinkmann }, 113c8284409SSoren Brinkmann { 114915d4872SSiva Durga Prasad Paladugu .id = 0x21, 115915d4872SSiva Durga Prasad Paladugu .ver = 0x100, 1167a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU4EG", 11791bf4c5cSSiva Durga Prasad Paladugu .evexists = true, 118915d4872SSiva Durga Prasad Paladugu }, 119915d4872SSiva Durga Prasad Paladugu { 120915d4872SSiva Durga Prasad Paladugu .id = 0x21, 121915d4872SSiva Durga Prasad Paladugu .ver = 0x12c, 1227a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU4CG", 123915d4872SSiva Durga Prasad Paladugu }, 124915d4872SSiva Durga Prasad Paladugu { 125c8284409SSoren Brinkmann .id = 0x30, 1267a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU7EV", 12791bf4c5cSSiva Durga Prasad Paladugu .evexists = true, 128c8284409SSoren Brinkmann }, 129c8284409SSoren Brinkmann { 130915d4872SSiva Durga Prasad Paladugu .id = 0x30, 131915d4872SSiva Durga Prasad Paladugu .ver = 0x100, 1327a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU7EG", 13391bf4c5cSSiva Durga Prasad Paladugu .evexists = true, 134915d4872SSiva Durga Prasad Paladugu }, 135915d4872SSiva Durga Prasad Paladugu { 136915d4872SSiva Durga Prasad Paladugu .id = 0x30, 137915d4872SSiva Durga Prasad Paladugu .ver = 0x12c, 1387a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU7CG", 139915d4872SSiva Durga Prasad Paladugu }, 140915d4872SSiva Durga Prasad Paladugu { 141c8284409SSoren Brinkmann .id = 0x38, 1427a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU9EG", 143c8284409SSoren Brinkmann }, 144c8284409SSoren Brinkmann { 145915d4872SSiva Durga Prasad Paladugu .id = 0x38, 146915d4872SSiva Durga Prasad Paladugu .ver = 0x2c, 1477a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU9CG", 148915d4872SSiva Durga Prasad Paladugu }, 149915d4872SSiva Durga Prasad Paladugu { 150c8284409SSoren Brinkmann .id = 0x39, 1517a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU6EG", 152c8284409SSoren Brinkmann }, 153c8284409SSoren Brinkmann { 154915d4872SSiva Durga Prasad Paladugu .id = 0x39, 155915d4872SSiva Durga Prasad Paladugu .ver = 0x2c, 1567a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU6CG", 157915d4872SSiva Durga Prasad Paladugu }, 158915d4872SSiva Durga Prasad Paladugu { 159c8284409SSoren Brinkmann .id = 0x40, 1607a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU11EG", 161c8284409SSoren Brinkmann }, 162c8284409SSoren Brinkmann { 163c8284409SSoren Brinkmann .id = 0x50, 1647a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU15EG", 165c8284409SSoren Brinkmann }, 166c8284409SSoren Brinkmann { 167c8284409SSoren Brinkmann .id = 0x58, 1687a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU19EG", 169c8284409SSoren Brinkmann }, 170c8284409SSoren Brinkmann { 171c8284409SSoren Brinkmann .id = 0x59, 1727a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU17EG", 173c8284409SSoren Brinkmann }, 174d9710aebSSiva Durga Prasad Paladugu { 175d9710aebSSiva Durga Prasad Paladugu .id = 0x60, 1767a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU28DR", 177d9710aebSSiva Durga Prasad Paladugu }, 178d9710aebSSiva Durga Prasad Paladugu { 179d9710aebSSiva Durga Prasad Paladugu .id = 0x61, 1807a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU21DR", 181d9710aebSSiva Durga Prasad Paladugu }, 182d9710aebSSiva Durga Prasad Paladugu { 183d9710aebSSiva Durga Prasad Paladugu .id = 0x62, 1847a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU29DR", 185d9710aebSSiva Durga Prasad Paladugu }, 186d9710aebSSiva Durga Prasad Paladugu { 187d9710aebSSiva Durga Prasad Paladugu .id = 0x63, 1887a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU23DR", 189d9710aebSSiva Durga Prasad Paladugu }, 190d9710aebSSiva Durga Prasad Paladugu { 191d9710aebSSiva Durga Prasad Paladugu .id = 0x64, 1927a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU27DR", 193d9710aebSSiva Durga Prasad Paladugu }, 194d9710aebSSiva Durga Prasad Paladugu { 195d9710aebSSiva Durga Prasad Paladugu .id = 0x65, 1967a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU25DR", 197d9710aebSSiva Durga Prasad Paladugu }, 198345a85aeSSiva Durga Prasad Paladugu { 199345a85aeSSiva Durga Prasad Paladugu .id = 0x66, 2007a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU39DR", 201345a85aeSSiva Durga Prasad Paladugu }, 202c613a660SVenkatesh Yadav Abbarapu { 2031b7e5ca9SVenkatesh Yadav Abbarapu .id = 0x7d, 2047a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU43DR", 2051b7e5ca9SVenkatesh Yadav Abbarapu }, 2061b7e5ca9SVenkatesh Yadav Abbarapu { 2071b7e5ca9SVenkatesh Yadav Abbarapu .id = 0x78, 2087a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU46DR", 2091b7e5ca9SVenkatesh Yadav Abbarapu }, 2101b7e5ca9SVenkatesh Yadav Abbarapu { 2111b7e5ca9SVenkatesh Yadav Abbarapu .id = 0x7f, 2127a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU47DR", 2131b7e5ca9SVenkatesh Yadav Abbarapu }, 2141b7e5ca9SVenkatesh Yadav Abbarapu { 215c613a660SVenkatesh Yadav Abbarapu .id = 0x7b, 2167a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU48DR", 217c613a660SVenkatesh Yadav Abbarapu }, 218c613a660SVenkatesh Yadav Abbarapu { 219c613a660SVenkatesh Yadav Abbarapu .id = 0x7e, 2207a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU49DR", 221c613a660SVenkatesh Yadav Abbarapu }, 222c8284409SSoren Brinkmann }; 223c8284409SSoren Brinkmann 22491bf4c5cSSiva Durga Prasad Paladugu #define ZYNQMP_PL_STATUS_BIT 9 22591bf4c5cSSiva Durga Prasad Paladugu #define ZYNQMP_PL_STATUS_MASK BIT(ZYNQMP_PL_STATUS_BIT) 22691bf4c5cSSiva Durga Prasad Paladugu #define ZYNQMP_CSU_VERSION_MASK ~(ZYNQMP_PL_STATUS_MASK) 227915d4872SSiva Durga Prasad Paladugu 228f1565907SMichal Simek #define SILICON_ID_XCK24 0x4712093U 229bfd7c881SVenkatesh Yadav Abbarapu #define SILICON_ID_XCK26 0x4724093U 2307a30e08bSVenkatesh Yadav Abbarapu 231c8284409SSoren Brinkmann static char *zynqmp_get_silicon_idcode_name(void) 232c8284409SSoren Brinkmann { 23391bf4c5cSSiva Durga Prasad Paladugu uint32_t id, ver, chipid[2]; 23491bf4c5cSSiva Durga Prasad Paladugu size_t i, j, len; 23591bf4c5cSSiva Durga Prasad Paladugu const char *name = "EG/EV"; 236c8284409SSoren Brinkmann 237eb0d2b17SVenkatesh Yadav Abbarapu if (pm_get_chipid(chipid) != PM_RET_SUCCESS) { 2387a30e08bSVenkatesh Yadav Abbarapu return "XCZUUNKN"; 239eb0d2b17SVenkatesh Yadav Abbarapu } 24091bf4c5cSSiva Durga Prasad Paladugu 24191bf4c5cSSiva Durga Prasad Paladugu id = chipid[0] & (ZYNQMP_CSU_IDCODE_DEVICE_CODE_MASK | 24291bf4c5cSSiva Durga Prasad Paladugu ZYNQMP_CSU_IDCODE_SVD_MASK); 24391bf4c5cSSiva Durga Prasad Paladugu id >>= ZYNQMP_CSU_IDCODE_SVD_SHIFT; 24491bf4c5cSSiva Durga Prasad Paladugu ver = chipid[1] >> ZYNQMP_EFUSE_IPDISABLE_SHIFT; 245915d4872SSiva Durga Prasad Paladugu 246915d4872SSiva Durga Prasad Paladugu for (i = 0; i < ARRAY_SIZE(zynqmp_devices); i++) { 247*5b542313SMaheedhar Bollapalli if ((zynqmp_devices[i].id == id) && 248*5b542313SMaheedhar Bollapalli (zynqmp_devices[i].ver == (ver & ZYNQMP_CSU_VERSION_MASK))) { 24991bf4c5cSSiva Durga Prasad Paladugu break; 250c8284409SSoren Brinkmann } 251eb0d2b17SVenkatesh Yadav Abbarapu } 25291bf4c5cSSiva Durga Prasad Paladugu 2537a30e08bSVenkatesh Yadav Abbarapu if (i >= ARRAY_SIZE(zynqmp_devices)) { 25486869f99SVenkatesh Yadav Abbarapu switch (chipid[0]) { 25586869f99SVenkatesh Yadav Abbarapu case SILICON_ID_XCK24: 25686869f99SVenkatesh Yadav Abbarapu return "XCK24"; 25786869f99SVenkatesh Yadav Abbarapu case SILICON_ID_XCK26: 2587a30e08bSVenkatesh Yadav Abbarapu return "XCK26"; 25986869f99SVenkatesh Yadav Abbarapu default: 2607a30e08bSVenkatesh Yadav Abbarapu return "XCZUUNKN"; 2617a30e08bSVenkatesh Yadav Abbarapu } 2627a30e08bSVenkatesh Yadav Abbarapu } 26391bf4c5cSSiva Durga Prasad Paladugu 264eb0d2b17SVenkatesh Yadav Abbarapu if (!zynqmp_devices[i].evexists) { 26591bf4c5cSSiva Durga Prasad Paladugu return zynqmp_devices[i].name; 266eb0d2b17SVenkatesh Yadav Abbarapu } 26791bf4c5cSSiva Durga Prasad Paladugu 268dd1fe717SVenkatesh Yadav Abbarapu if ((ver & ZYNQMP_PL_STATUS_MASK) != 0U) { 26991bf4c5cSSiva Durga Prasad Paladugu return zynqmp_devices[i].name; 270eb0d2b17SVenkatesh Yadav Abbarapu } 27191bf4c5cSSiva Durga Prasad Paladugu 27291bf4c5cSSiva Durga Prasad Paladugu len = strlen(zynqmp_devices[i].name) - 2; 27391bf4c5cSSiva Durga Prasad Paladugu for (j = 0; j < strlen(name); j++) { 27491bf4c5cSSiva Durga Prasad Paladugu zynqmp_devices[i].name[len] = name[j]; 27591bf4c5cSSiva Durga Prasad Paladugu len++; 27691bf4c5cSSiva Durga Prasad Paladugu } 27791bf4c5cSSiva Durga Prasad Paladugu zynqmp_devices[i].name[len] = '\0'; 27891bf4c5cSSiva Durga Prasad Paladugu 27991bf4c5cSSiva Durga Prasad Paladugu return zynqmp_devices[i].name; 280c8284409SSoren Brinkmann } 281c8284409SSoren Brinkmann 282c8284409SSoren Brinkmann static unsigned int zynqmp_get_rtl_ver(void) 283c8284409SSoren Brinkmann { 284c8284409SSoren Brinkmann uint32_t ver; 285c8284409SSoren Brinkmann 286c8284409SSoren Brinkmann ver = mmio_read_32(ZYNQMP_CSU_BASEADDR + ZYNQMP_CSU_VERSION_OFFSET); 287c8284409SSoren Brinkmann ver &= ZYNQMP_RTL_VER_MASK; 288c8284409SSoren Brinkmann ver >>= ZYNQMP_RTL_VER_SHIFT; 289c8284409SSoren Brinkmann 290c8284409SSoren Brinkmann return ver; 291c8284409SSoren Brinkmann } 292c8284409SSoren Brinkmann 293c8284409SSoren Brinkmann static char *zynqmp_print_silicon_idcode(void) 294c8284409SSoren Brinkmann { 295c8284409SSoren Brinkmann uint32_t id, maskid, tmp; 296c8284409SSoren Brinkmann 297c8284409SSoren Brinkmann id = mmio_read_32(ZYNQMP_CSU_BASEADDR + ZYNQMP_CSU_IDCODE_OFFSET); 298c8284409SSoren Brinkmann 299c8284409SSoren Brinkmann tmp = id; 300c8284409SSoren Brinkmann tmp &= ZYNQMP_CSU_IDCODE_XILINX_ID_MASK | 301648fe99eSSoren Brinkmann ZYNQMP_CSU_IDCODE_FAMILY_MASK; 302*5b542313SMaheedhar Bollapalli maskid = (ZYNQMP_CSU_IDCODE_XILINX_ID << ZYNQMP_CSU_IDCODE_XILINX_ID_SHIFT) | 303*5b542313SMaheedhar Bollapalli (ZYNQMP_CSU_IDCODE_FAMILY << ZYNQMP_CSU_IDCODE_FAMILY_SHIFT); 304c8284409SSoren Brinkmann if (tmp != maskid) { 305d6760c4dSAkshay Belsare ERROR("Incorrect IDCODE 0x%x, maskid 0x%x\n", id, maskid); 306c8284409SSoren Brinkmann return "UNKN"; 307c8284409SSoren Brinkmann } 308d6760c4dSAkshay Belsare VERBOSE("IDCODE 0x%x\n", id); 309c8284409SSoren Brinkmann return zynqmp_get_silicon_idcode_name(); 310c8284409SSoren Brinkmann } 311c8284409SSoren Brinkmann 3128f9ba3f3SMichal Simek int32_t plat_is_smccc_feature_available(u_register_t fid) 3138f9ba3f3SMichal Simek { 3148f9ba3f3SMichal Simek switch (fid) { 3158f9ba3f3SMichal Simek case SMCCC_ARCH_SOC_ID: 3168f9ba3f3SMichal Simek return SMC_ARCH_CALL_SUCCESS; 3178f9ba3f3SMichal Simek default: 3188f9ba3f3SMichal Simek return SMC_ARCH_CALL_NOT_SUPPORTED; 3198f9ba3f3SMichal Simek } 3208f9ba3f3SMichal Simek 3218f9ba3f3SMichal Simek return SMC_ARCH_CALL_NOT_SUPPORTED; 3228f9ba3f3SMichal Simek } 3238f9ba3f3SMichal Simek 3248f9ba3f3SMichal Simek int32_t plat_get_soc_version(void) 3258f9ba3f3SMichal Simek { 3268f9ba3f3SMichal Simek uint32_t chip_id = zynqmp_get_silicon_ver(); 3278f9ba3f3SMichal Simek uint32_t manfid = SOC_ID_SET_JEP_106(JEDEC_XILINX_BKID, JEDEC_XILINX_MFID); 3288f9ba3f3SMichal Simek 3298f9ba3f3SMichal Simek return (int32_t)(manfid | (chip_id & 0xFFFF)); 3308f9ba3f3SMichal Simek } 3318f9ba3f3SMichal Simek 3328f9ba3f3SMichal Simek int32_t plat_get_soc_revision(void) 3338f9ba3f3SMichal Simek { 3348f9ba3f3SMichal Simek return mmio_read_32(ZYNQMP_CSU_BASEADDR + ZYNQMP_CSU_IDCODE_OFFSET); 3358f9ba3f3SMichal Simek } 3368f9ba3f3SMichal Simek 337ffa91031SVenkatesh Yadav Abbarapu static uint32_t zynqmp_get_ps_ver(void) 338c8284409SSoren Brinkmann { 339c8284409SSoren Brinkmann uint32_t ver = mmio_read_32(ZYNQMP_CSU_BASEADDR + ZYNQMP_CSU_VERSION_OFFSET); 340c8284409SSoren Brinkmann 341c8284409SSoren Brinkmann ver &= ZYNQMP_PS_VER_MASK; 342c8284409SSoren Brinkmann ver >>= ZYNQMP_PS_VER_SHIFT; 343c8284409SSoren Brinkmann 344bfd7c881SVenkatesh Yadav Abbarapu return ver + 1U; 345c8284409SSoren Brinkmann } 346c8284409SSoren Brinkmann 347c8284409SSoren Brinkmann static void zynqmp_print_platform_name(void) 348c8284409SSoren Brinkmann { 349ffa91031SVenkatesh Yadav Abbarapu uint32_t ver = zynqmp_get_silicon_ver(); 350ffa91031SVenkatesh Yadav Abbarapu uint32_t rtl = zynqmp_get_rtl_ver(); 351bb145c9dSMaheedhar Bollapalli const char *label = "Unknown"; 352c8284409SSoren Brinkmann 353c8284409SSoren Brinkmann switch (ver) { 354c8284409SSoren Brinkmann case ZYNQMP_CSU_VERSION_QEMU: 355c8284409SSoren Brinkmann label = "QEMU"; 356c8284409SSoren Brinkmann break; 357c8284409SSoren Brinkmann case ZYNQMP_CSU_VERSION_SILICON: 358c8284409SSoren Brinkmann label = "silicon"; 359c8284409SSoren Brinkmann break; 360649c48f5SJonathan Wright default: 361649c48f5SJonathan Wright /* Do nothing in default case */ 362649c48f5SJonathan Wright break; 363c8284409SSoren Brinkmann } 364c8284409SSoren Brinkmann 3651277af9bSVenkatesh Yadav Abbarapu VERBOSE("TF-A running on %s/%s at 0x%x\n", 366db97f939SVenkatesh Yadav Abbarapu zynqmp_print_silicon_idcode(), label, BL31_BASE); 367db97f939SVenkatesh Yadav Abbarapu VERBOSE("TF-A running on v%d/RTL%d.%d\n", 368db97f939SVenkatesh Yadav Abbarapu zynqmp_get_ps_ver(), (rtl & 0xf0) >> 4, rtl & 0xf); 369c8284409SSoren Brinkmann } 370c8284409SSoren Brinkmann #else 371c8284409SSoren Brinkmann static inline void zynqmp_print_platform_name(void) { } 372c8284409SSoren Brinkmann #endif 373c8284409SSoren Brinkmann 374ffa91031SVenkatesh Yadav Abbarapu uint32_t zynqmp_get_bootmode(void) 3752cb5bac9SSoren Brinkmann { 37629bd0e66SSiva Durga Prasad Paladugu uint32_t r; 377a6d28520SSiva Durga Prasad Paladugu unsigned int ret; 37829bd0e66SSiva Durga Prasad Paladugu 379a6d28520SSiva Durga Prasad Paladugu ret = pm_mmio_read(CRL_APB_BOOT_MODE_USER, &r); 380a6d28520SSiva Durga Prasad Paladugu 381eb0d2b17SVenkatesh Yadav Abbarapu if (ret != PM_RET_SUCCESS) { 38229bd0e66SSiva Durga Prasad Paladugu r = mmio_read_32(CRL_APB_BOOT_MODE_USER); 383eb0d2b17SVenkatesh Yadav Abbarapu } 3842cb5bac9SSoren Brinkmann 3852cb5bac9SSoren Brinkmann return r & CRL_APB_BOOT_MODE_MASK; 3862cb5bac9SSoren Brinkmann } 3872cb5bac9SSoren Brinkmann 388c8284409SSoren Brinkmann void zynqmp_config_setup(void) 389c8284409SSoren Brinkmann { 3909f0ddae3SRajan Vaja uint64_t counter_freq; 3919f0ddae3SRajan Vaja 392705bed5dSJolly Shah /* Configure IPI data for ZynqMP */ 393705bed5dSJolly Shah zynqmp_ipi_config_table_init(); 394705bed5dSJolly Shah 395c8284409SSoren Brinkmann zynqmp_print_platform_name(); 3969f0ddae3SRajan Vaja 3979f0ddae3SRajan Vaja /* Configure counter frequency */ 3989f0ddae3SRajan Vaja counter_freq = read_cntfrq_el0(); 3999f0ddae3SRajan Vaja if (counter_freq == ZYNQMP_DEFAULT_COUNTER_FREQ) { 4009f0ddae3SRajan Vaja write_cntfrq_el0(plat_get_syscnt_freq2()); 4019f0ddae3SRajan Vaja } 4029f0ddae3SRajan Vaja 403e1cb4da4SSoren Brinkmann generic_delay_timer_init(); 404c8284409SSoren Brinkmann } 405c8284409SSoren Brinkmann 406ffa91031SVenkatesh Yadav Abbarapu uint32_t plat_get_syscnt_freq2(void) 407c8284409SSoren Brinkmann { 408ffa91031SVenkatesh Yadav Abbarapu uint32_t ver = zynqmp_get_silicon_ver(); 409c8284409SSoren Brinkmann 410eb0d2b17SVenkatesh Yadav Abbarapu if (ver == ZYNQMP_CSU_VERSION_QEMU) { 41165501a7cSEdgar E. Iglesias return 65000000; 412eb0d2b17SVenkatesh Yadav Abbarapu } else { 413e89f4af7SSoren Brinkmann return mmio_read_32(IOU_SCNTRS_BASEFREQ); 414c8284409SSoren Brinkmann } 415eb0d2b17SVenkatesh Yadav Abbarapu } 416