1c8284409SSoren Brinkmann /* 21277af9bSVenkatesh Yadav Abbarapu * Copyright (c) 2013-2022, ARM Limited and Contributors. All rights reserved. 3c8284409SSoren Brinkmann * 482cb2c1aSdp-arm * SPDX-License-Identifier: BSD-3-Clause 5c8284409SSoren Brinkmann */ 6c8284409SSoren Brinkmann 791bf4c5cSSiva Durga Prasad Paladugu #include <stdbool.h> 891bf4c5cSSiva Durga Prasad Paladugu #include <string.h> 909d40e0eSAntonio Nino Diaz 1009d40e0eSAntonio Nino Diaz #include <common/debug.h> 1109d40e0eSAntonio Nino Diaz #include <drivers/generic_delay_timer.h> 1209d40e0eSAntonio Nino Diaz #include <lib/mmio.h> 1309d40e0eSAntonio Nino Diaz #include <lib/xlat_tables/xlat_tables.h> 14705bed5dSJolly Shah #include <plat_ipi.h> 1531c3842eSJolly Shah #include <plat_private.h> 1609d40e0eSAntonio Nino Diaz #include <plat/common/platform.h> 1709d40e0eSAntonio Nino Diaz 1829bd0e66SSiva Durga Prasad Paladugu #include "pm_api_sys.h" 19c8284409SSoren Brinkmann 20c8284409SSoren Brinkmann /* 21c8284409SSoren Brinkmann * Table of regions to map using the MMU. 22c8284409SSoren Brinkmann * This doesn't include TZRAM as the 'mem_layout' argument passed to 23c8284409SSoren Brinkmann * configure_mmu_elx() will give the available subset of that, 24c8284409SSoren Brinkmann */ 25c8284409SSoren Brinkmann const mmap_region_t plat_arm_mmap[] = { 26c8284409SSoren Brinkmann { DEVICE0_BASE, DEVICE0_BASE, DEVICE0_SIZE, MT_DEVICE | MT_RW | MT_SECURE }, 27c8284409SSoren Brinkmann { DEVICE1_BASE, DEVICE1_BASE, DEVICE1_SIZE, MT_DEVICE | MT_RW | MT_SECURE }, 28c8284409SSoren Brinkmann { CRF_APB_BASE, CRF_APB_BASE, CRF_APB_SIZE, MT_DEVICE | MT_RW | MT_SECURE }, 29c8284409SSoren Brinkmann {0} 30c8284409SSoren Brinkmann }; 31c8284409SSoren Brinkmann 32c8284409SSoren Brinkmann static unsigned int zynqmp_get_silicon_ver(void) 33c8284409SSoren Brinkmann { 34466675c2SSoren Brinkmann static unsigned int ver; 35c8284409SSoren Brinkmann 36466675c2SSoren Brinkmann if (!ver) { 37466675c2SSoren Brinkmann ver = mmio_read_32(ZYNQMP_CSU_BASEADDR + 38466675c2SSoren Brinkmann ZYNQMP_CSU_VERSION_OFFSET); 39c8284409SSoren Brinkmann ver &= ZYNQMP_SILICON_VER_MASK; 40c8284409SSoren Brinkmann ver >>= ZYNQMP_SILICON_VER_SHIFT; 41466675c2SSoren Brinkmann } 42c8284409SSoren Brinkmann 43c8284409SSoren Brinkmann return ver; 44c8284409SSoren Brinkmann } 45c8284409SSoren Brinkmann 46c8284409SSoren Brinkmann unsigned int zynqmp_get_uart_clk(void) 47c8284409SSoren Brinkmann { 48c8284409SSoren Brinkmann unsigned int ver = zynqmp_get_silicon_ver(); 49c8284409SSoren Brinkmann 50*eb0d2b17SVenkatesh Yadav Abbarapu if (ver == ZYNQMP_CSU_VERSION_QEMU) { 51c8284409SSoren Brinkmann return 133000000; 52*eb0d2b17SVenkatesh Yadav Abbarapu } else { 53c8284409SSoren Brinkmann return 100000000; 54c8284409SSoren Brinkmann } 55*eb0d2b17SVenkatesh Yadav Abbarapu } 56c8284409SSoren Brinkmann 57c8284409SSoren Brinkmann #if LOG_LEVEL >= LOG_LEVEL_NOTICE 58c8284409SSoren Brinkmann static const struct { 59c8284409SSoren Brinkmann unsigned int id; 60915d4872SSiva Durga Prasad Paladugu unsigned int ver; 61c8284409SSoren Brinkmann char *name; 6291bf4c5cSSiva Durga Prasad Paladugu bool evexists; 63c8284409SSoren Brinkmann } zynqmp_devices[] = { 64c8284409SSoren Brinkmann { 65c8284409SSoren Brinkmann .id = 0x10, 667a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU3EG", 67c8284409SSoren Brinkmann }, 68c8284409SSoren Brinkmann { 69915d4872SSiva Durga Prasad Paladugu .id = 0x10, 70915d4872SSiva Durga Prasad Paladugu .ver = 0x2c, 717a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU3CG", 72915d4872SSiva Durga Prasad Paladugu }, 73915d4872SSiva Durga Prasad Paladugu { 74c8284409SSoren Brinkmann .id = 0x11, 757a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU2EG", 76c8284409SSoren Brinkmann }, 77c8284409SSoren Brinkmann { 78915d4872SSiva Durga Prasad Paladugu .id = 0x11, 79915d4872SSiva Durga Prasad Paladugu .ver = 0x2c, 807a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU2CG", 81915d4872SSiva Durga Prasad Paladugu }, 82915d4872SSiva Durga Prasad Paladugu { 83c8284409SSoren Brinkmann .id = 0x20, 847a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU5EV", 8591bf4c5cSSiva Durga Prasad Paladugu .evexists = true, 86c8284409SSoren Brinkmann }, 87c8284409SSoren Brinkmann { 88915d4872SSiva Durga Prasad Paladugu .id = 0x20, 89915d4872SSiva Durga Prasad Paladugu .ver = 0x100, 907a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU5EG", 9191bf4c5cSSiva Durga Prasad Paladugu .evexists = true, 92915d4872SSiva Durga Prasad Paladugu }, 93915d4872SSiva Durga Prasad Paladugu { 94915d4872SSiva Durga Prasad Paladugu .id = 0x20, 95915d4872SSiva Durga Prasad Paladugu .ver = 0x12c, 967a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU5CG", 97915d4872SSiva Durga Prasad Paladugu }, 98915d4872SSiva Durga Prasad Paladugu { 99c8284409SSoren Brinkmann .id = 0x21, 1007a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU4EV", 10191bf4c5cSSiva Durga Prasad Paladugu .evexists = true, 102c8284409SSoren Brinkmann }, 103c8284409SSoren Brinkmann { 104915d4872SSiva Durga Prasad Paladugu .id = 0x21, 105915d4872SSiva Durga Prasad Paladugu .ver = 0x100, 1067a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU4EG", 10791bf4c5cSSiva Durga Prasad Paladugu .evexists = true, 108915d4872SSiva Durga Prasad Paladugu }, 109915d4872SSiva Durga Prasad Paladugu { 110915d4872SSiva Durga Prasad Paladugu .id = 0x21, 111915d4872SSiva Durga Prasad Paladugu .ver = 0x12c, 1127a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU4CG", 113915d4872SSiva Durga Prasad Paladugu }, 114915d4872SSiva Durga Prasad Paladugu { 115c8284409SSoren Brinkmann .id = 0x30, 1167a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU7EV", 11791bf4c5cSSiva Durga Prasad Paladugu .evexists = true, 118c8284409SSoren Brinkmann }, 119c8284409SSoren Brinkmann { 120915d4872SSiva Durga Prasad Paladugu .id = 0x30, 121915d4872SSiva Durga Prasad Paladugu .ver = 0x100, 1227a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU7EG", 12391bf4c5cSSiva Durga Prasad Paladugu .evexists = true, 124915d4872SSiva Durga Prasad Paladugu }, 125915d4872SSiva Durga Prasad Paladugu { 126915d4872SSiva Durga Prasad Paladugu .id = 0x30, 127915d4872SSiva Durga Prasad Paladugu .ver = 0x12c, 1287a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU7CG", 129915d4872SSiva Durga Prasad Paladugu }, 130915d4872SSiva Durga Prasad Paladugu { 131c8284409SSoren Brinkmann .id = 0x38, 1327a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU9EG", 133c8284409SSoren Brinkmann }, 134c8284409SSoren Brinkmann { 135915d4872SSiva Durga Prasad Paladugu .id = 0x38, 136915d4872SSiva Durga Prasad Paladugu .ver = 0x2c, 1377a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU9CG", 138915d4872SSiva Durga Prasad Paladugu }, 139915d4872SSiva Durga Prasad Paladugu { 140c8284409SSoren Brinkmann .id = 0x39, 1417a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU6EG", 142c8284409SSoren Brinkmann }, 143c8284409SSoren Brinkmann { 144915d4872SSiva Durga Prasad Paladugu .id = 0x39, 145915d4872SSiva Durga Prasad Paladugu .ver = 0x2c, 1467a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU6CG", 147915d4872SSiva Durga Prasad Paladugu }, 148915d4872SSiva Durga Prasad Paladugu { 149c8284409SSoren Brinkmann .id = 0x40, 1507a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU11EG", 151c8284409SSoren Brinkmann }, 152c8284409SSoren Brinkmann { 153c8284409SSoren Brinkmann .id = 0x50, 1547a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU15EG", 155c8284409SSoren Brinkmann }, 156c8284409SSoren Brinkmann { 157c8284409SSoren Brinkmann .id = 0x58, 1587a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU19EG", 159c8284409SSoren Brinkmann }, 160c8284409SSoren Brinkmann { 161c8284409SSoren Brinkmann .id = 0x59, 1627a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU17EG", 163c8284409SSoren Brinkmann }, 164d9710aebSSiva Durga Prasad Paladugu { 165d9710aebSSiva Durga Prasad Paladugu .id = 0x60, 1667a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU28DR", 167d9710aebSSiva Durga Prasad Paladugu }, 168d9710aebSSiva Durga Prasad Paladugu { 169d9710aebSSiva Durga Prasad Paladugu .id = 0x61, 1707a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU21DR", 171d9710aebSSiva Durga Prasad Paladugu }, 172d9710aebSSiva Durga Prasad Paladugu { 173d9710aebSSiva Durga Prasad Paladugu .id = 0x62, 1747a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU29DR", 175d9710aebSSiva Durga Prasad Paladugu }, 176d9710aebSSiva Durga Prasad Paladugu { 177d9710aebSSiva Durga Prasad Paladugu .id = 0x63, 1787a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU23DR", 179d9710aebSSiva Durga Prasad Paladugu }, 180d9710aebSSiva Durga Prasad Paladugu { 181d9710aebSSiva Durga Prasad Paladugu .id = 0x64, 1827a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU27DR", 183d9710aebSSiva Durga Prasad Paladugu }, 184d9710aebSSiva Durga Prasad Paladugu { 185d9710aebSSiva Durga Prasad Paladugu .id = 0x65, 1867a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU25DR", 187d9710aebSSiva Durga Prasad Paladugu }, 188345a85aeSSiva Durga Prasad Paladugu { 189345a85aeSSiva Durga Prasad Paladugu .id = 0x66, 1907a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU39DR", 191345a85aeSSiva Durga Prasad Paladugu }, 192c613a660SVenkatesh Yadav Abbarapu { 1931b7e5ca9SVenkatesh Yadav Abbarapu .id = 0x7d, 1947a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU43DR", 1951b7e5ca9SVenkatesh Yadav Abbarapu }, 1961b7e5ca9SVenkatesh Yadav Abbarapu { 1971b7e5ca9SVenkatesh Yadav Abbarapu .id = 0x78, 1987a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU46DR", 1991b7e5ca9SVenkatesh Yadav Abbarapu }, 2001b7e5ca9SVenkatesh Yadav Abbarapu { 2011b7e5ca9SVenkatesh Yadav Abbarapu .id = 0x7f, 2027a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU47DR", 2031b7e5ca9SVenkatesh Yadav Abbarapu }, 2041b7e5ca9SVenkatesh Yadav Abbarapu { 205c613a660SVenkatesh Yadav Abbarapu .id = 0x7b, 2067a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU48DR", 207c613a660SVenkatesh Yadav Abbarapu }, 208c613a660SVenkatesh Yadav Abbarapu { 209c613a660SVenkatesh Yadav Abbarapu .id = 0x7e, 2107a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU49DR", 211c613a660SVenkatesh Yadav Abbarapu }, 212c8284409SSoren Brinkmann }; 213c8284409SSoren Brinkmann 21491bf4c5cSSiva Durga Prasad Paladugu #define ZYNQMP_PL_STATUS_BIT 9 21591bf4c5cSSiva Durga Prasad Paladugu #define ZYNQMP_PL_STATUS_MASK BIT(ZYNQMP_PL_STATUS_BIT) 21691bf4c5cSSiva Durga Prasad Paladugu #define ZYNQMP_CSU_VERSION_MASK ~(ZYNQMP_PL_STATUS_MASK) 217915d4872SSiva Durga Prasad Paladugu 2187a30e08bSVenkatesh Yadav Abbarapu #define SILICON_ID_XCK26 0x4724093 2197a30e08bSVenkatesh Yadav Abbarapu 220c8284409SSoren Brinkmann static char *zynqmp_get_silicon_idcode_name(void) 221c8284409SSoren Brinkmann { 22291bf4c5cSSiva Durga Prasad Paladugu uint32_t id, ver, chipid[2]; 22391bf4c5cSSiva Durga Prasad Paladugu size_t i, j, len; 22491bf4c5cSSiva Durga Prasad Paladugu const char *name = "EG/EV"; 225c8284409SSoren Brinkmann 2260435ba64SSiva Durga Prasad Paladugu #ifdef IMAGE_BL32 2270435ba64SSiva Durga Prasad Paladugu /* 2280435ba64SSiva Durga Prasad Paladugu * For BL32, get the chip id info directly by reading corresponding 2290435ba64SSiva Durga Prasad Paladugu * registers instead of making pm call. This has limitation 2300435ba64SSiva Durga Prasad Paladugu * that these registers should be configured to have access 2310435ba64SSiva Durga Prasad Paladugu * from APU which is default case. 2320435ba64SSiva Durga Prasad Paladugu */ 2330435ba64SSiva Durga Prasad Paladugu chipid[0] = mmio_read_32(ZYNQMP_CSU_BASEADDR + ZYNQMP_CSU_IDCODE_OFFSET); 2340435ba64SSiva Durga Prasad Paladugu chipid[1] = mmio_read_32(EFUSE_BASEADDR + EFUSE_IPDISABLE_OFFSET); 2350435ba64SSiva Durga Prasad Paladugu #else 236*eb0d2b17SVenkatesh Yadav Abbarapu if (pm_get_chipid(chipid) != PM_RET_SUCCESS) { 2377a30e08bSVenkatesh Yadav Abbarapu return "XCZUUNKN"; 238*eb0d2b17SVenkatesh Yadav Abbarapu } 2390435ba64SSiva Durga Prasad Paladugu #endif 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++) { 24791bf4c5cSSiva Durga Prasad Paladugu if (zynqmp_devices[i].id == id && 248*eb0d2b17SVenkatesh Yadav Abbarapu zynqmp_devices[i].ver == (ver & ZYNQMP_CSU_VERSION_MASK)) { 24991bf4c5cSSiva Durga Prasad Paladugu break; 250c8284409SSoren Brinkmann } 251*eb0d2b17SVenkatesh Yadav Abbarapu } 25291bf4c5cSSiva Durga Prasad Paladugu 2537a30e08bSVenkatesh Yadav Abbarapu if (i >= ARRAY_SIZE(zynqmp_devices)) { 2547a30e08bSVenkatesh Yadav Abbarapu if (chipid[0] == SILICON_ID_XCK26) { 2557a30e08bSVenkatesh Yadav Abbarapu return "XCK26"; 2567a30e08bSVenkatesh Yadav Abbarapu } else { 2577a30e08bSVenkatesh Yadav Abbarapu return "XCZUUNKN"; 2587a30e08bSVenkatesh Yadav Abbarapu } 2597a30e08bSVenkatesh Yadav Abbarapu } 26091bf4c5cSSiva Durga Prasad Paladugu 261*eb0d2b17SVenkatesh Yadav Abbarapu if (!zynqmp_devices[i].evexists) { 26291bf4c5cSSiva Durga Prasad Paladugu return zynqmp_devices[i].name; 263*eb0d2b17SVenkatesh Yadav Abbarapu } 26491bf4c5cSSiva Durga Prasad Paladugu 265*eb0d2b17SVenkatesh Yadav Abbarapu if (ver & ZYNQMP_PL_STATUS_MASK) { 26691bf4c5cSSiva Durga Prasad Paladugu return zynqmp_devices[i].name; 267*eb0d2b17SVenkatesh Yadav Abbarapu } 26891bf4c5cSSiva Durga Prasad Paladugu 26991bf4c5cSSiva Durga Prasad Paladugu len = strlen(zynqmp_devices[i].name) - 2; 27091bf4c5cSSiva Durga Prasad Paladugu for (j = 0; j < strlen(name); j++) { 27191bf4c5cSSiva Durga Prasad Paladugu zynqmp_devices[i].name[len] = name[j]; 27291bf4c5cSSiva Durga Prasad Paladugu len++; 27391bf4c5cSSiva Durga Prasad Paladugu } 27491bf4c5cSSiva Durga Prasad Paladugu zynqmp_devices[i].name[len] = '\0'; 27591bf4c5cSSiva Durga Prasad Paladugu 27691bf4c5cSSiva Durga Prasad Paladugu return zynqmp_devices[i].name; 277c8284409SSoren Brinkmann } 278c8284409SSoren Brinkmann 279c8284409SSoren Brinkmann static unsigned int zynqmp_get_rtl_ver(void) 280c8284409SSoren Brinkmann { 281c8284409SSoren Brinkmann uint32_t ver; 282c8284409SSoren Brinkmann 283c8284409SSoren Brinkmann ver = mmio_read_32(ZYNQMP_CSU_BASEADDR + ZYNQMP_CSU_VERSION_OFFSET); 284c8284409SSoren Brinkmann ver &= ZYNQMP_RTL_VER_MASK; 285c8284409SSoren Brinkmann ver >>= ZYNQMP_RTL_VER_SHIFT; 286c8284409SSoren Brinkmann 287c8284409SSoren Brinkmann return ver; 288c8284409SSoren Brinkmann } 289c8284409SSoren Brinkmann 290c8284409SSoren Brinkmann static char *zynqmp_print_silicon_idcode(void) 291c8284409SSoren Brinkmann { 292c8284409SSoren Brinkmann uint32_t id, maskid, tmp; 293c8284409SSoren Brinkmann 294c8284409SSoren Brinkmann id = mmio_read_32(ZYNQMP_CSU_BASEADDR + ZYNQMP_CSU_IDCODE_OFFSET); 295c8284409SSoren Brinkmann 296c8284409SSoren Brinkmann tmp = id; 297c8284409SSoren Brinkmann tmp &= ZYNQMP_CSU_IDCODE_XILINX_ID_MASK | 298648fe99eSSoren Brinkmann ZYNQMP_CSU_IDCODE_FAMILY_MASK; 299c8284409SSoren Brinkmann maskid = ZYNQMP_CSU_IDCODE_XILINX_ID << ZYNQMP_CSU_IDCODE_XILINX_ID_SHIFT | 300648fe99eSSoren Brinkmann ZYNQMP_CSU_IDCODE_FAMILY << ZYNQMP_CSU_IDCODE_FAMILY_SHIFT; 301c8284409SSoren Brinkmann if (tmp != maskid) { 302c8284409SSoren Brinkmann ERROR("Incorrect XILINX IDCODE 0x%x, maskid 0x%x\n", id, maskid); 303c8284409SSoren Brinkmann return "UNKN"; 304c8284409SSoren Brinkmann } 305c8284409SSoren Brinkmann VERBOSE("Xilinx IDCODE 0x%x\n", id); 306c8284409SSoren Brinkmann return zynqmp_get_silicon_idcode_name(); 307c8284409SSoren Brinkmann } 308c8284409SSoren Brinkmann 309c8284409SSoren Brinkmann static unsigned int zynqmp_get_ps_ver(void) 310c8284409SSoren Brinkmann { 311c8284409SSoren Brinkmann uint32_t ver = mmio_read_32(ZYNQMP_CSU_BASEADDR + ZYNQMP_CSU_VERSION_OFFSET); 312c8284409SSoren Brinkmann 313c8284409SSoren Brinkmann ver &= ZYNQMP_PS_VER_MASK; 314c8284409SSoren Brinkmann ver >>= ZYNQMP_PS_VER_SHIFT; 315c8284409SSoren Brinkmann 316c8284409SSoren Brinkmann return ver + 1; 317c8284409SSoren Brinkmann } 318c8284409SSoren Brinkmann 319c8284409SSoren Brinkmann static void zynqmp_print_platform_name(void) 320c8284409SSoren Brinkmann { 321c8284409SSoren Brinkmann unsigned int ver = zynqmp_get_silicon_ver(); 322c8284409SSoren Brinkmann unsigned int rtl = zynqmp_get_rtl_ver(); 323c8284409SSoren Brinkmann char *label = "Unknown"; 324c8284409SSoren Brinkmann 325c8284409SSoren Brinkmann switch (ver) { 326c8284409SSoren Brinkmann case ZYNQMP_CSU_VERSION_QEMU: 327c8284409SSoren Brinkmann label = "QEMU"; 328c8284409SSoren Brinkmann break; 329c8284409SSoren Brinkmann case ZYNQMP_CSU_VERSION_SILICON: 330c8284409SSoren Brinkmann label = "silicon"; 331c8284409SSoren Brinkmann break; 332649c48f5SJonathan Wright default: 333649c48f5SJonathan Wright /* Do nothing in default case */ 334649c48f5SJonathan Wright break; 335c8284409SSoren Brinkmann } 336c8284409SSoren Brinkmann 3371277af9bSVenkatesh Yadav Abbarapu VERBOSE("TF-A running on %s/%s at 0x%x\n", 338db97f939SVenkatesh Yadav Abbarapu zynqmp_print_silicon_idcode(), label, BL31_BASE); 339db97f939SVenkatesh Yadav Abbarapu VERBOSE("TF-A running on v%d/RTL%d.%d\n", 340db97f939SVenkatesh Yadav Abbarapu zynqmp_get_ps_ver(), (rtl & 0xf0) >> 4, rtl & 0xf); 341c8284409SSoren Brinkmann } 342c8284409SSoren Brinkmann #else 343c8284409SSoren Brinkmann static inline void zynqmp_print_platform_name(void) { } 344c8284409SSoren Brinkmann #endif 345c8284409SSoren Brinkmann 3462cb5bac9SSoren Brinkmann unsigned int zynqmp_get_bootmode(void) 3472cb5bac9SSoren Brinkmann { 34829bd0e66SSiva Durga Prasad Paladugu uint32_t r; 349a6d28520SSiva Durga Prasad Paladugu unsigned int ret; 35029bd0e66SSiva Durga Prasad Paladugu 351a6d28520SSiva Durga Prasad Paladugu ret = pm_mmio_read(CRL_APB_BOOT_MODE_USER, &r); 352a6d28520SSiva Durga Prasad Paladugu 353*eb0d2b17SVenkatesh Yadav Abbarapu if (ret != PM_RET_SUCCESS) { 35429bd0e66SSiva Durga Prasad Paladugu r = mmio_read_32(CRL_APB_BOOT_MODE_USER); 355*eb0d2b17SVenkatesh Yadav Abbarapu } 3562cb5bac9SSoren Brinkmann 3572cb5bac9SSoren Brinkmann return r & CRL_APB_BOOT_MODE_MASK; 3582cb5bac9SSoren Brinkmann } 3592cb5bac9SSoren Brinkmann 360c8284409SSoren Brinkmann void zynqmp_config_setup(void) 361c8284409SSoren Brinkmann { 3629f0ddae3SRajan Vaja uint64_t counter_freq; 3639f0ddae3SRajan Vaja 364705bed5dSJolly Shah /* Configure IPI data for ZynqMP */ 365705bed5dSJolly Shah zynqmp_ipi_config_table_init(); 366705bed5dSJolly Shah 367c8284409SSoren Brinkmann zynqmp_print_platform_name(); 3689f0ddae3SRajan Vaja 3699f0ddae3SRajan Vaja /* Configure counter frequency */ 3709f0ddae3SRajan Vaja counter_freq = read_cntfrq_el0(); 3719f0ddae3SRajan Vaja if (counter_freq == ZYNQMP_DEFAULT_COUNTER_FREQ) { 3729f0ddae3SRajan Vaja write_cntfrq_el0(plat_get_syscnt_freq2()); 3739f0ddae3SRajan Vaja } 3749f0ddae3SRajan Vaja 375e1cb4da4SSoren Brinkmann generic_delay_timer_init(); 376c8284409SSoren Brinkmann } 377c8284409SSoren Brinkmann 378f3d3b316SAntonio Nino Diaz unsigned int plat_get_syscnt_freq2(void) 379c8284409SSoren Brinkmann { 380e89f4af7SSoren Brinkmann unsigned int ver = zynqmp_get_silicon_ver(); 381c8284409SSoren Brinkmann 382*eb0d2b17SVenkatesh Yadav Abbarapu if (ver == ZYNQMP_CSU_VERSION_QEMU) { 38365501a7cSEdgar E. Iglesias return 65000000; 384*eb0d2b17SVenkatesh Yadav Abbarapu } else { 385e89f4af7SSoren Brinkmann return mmio_read_32(IOU_SCNTRS_BASEFREQ); 386c8284409SSoren Brinkmann } 387*eb0d2b17SVenkatesh Yadav Abbarapu } 388