1c8284409SSoren Brinkmann /* 21277af9bSVenkatesh Yadav Abbarapu * Copyright (c) 2013-2022, ARM Limited and Contributors. All rights reserved. 3*d6760c4dSAkshay Belsare * 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> 1409d40e0eSAntonio Nino Diaz #include <lib/xlat_tables/xlat_tables.h> 15705bed5dSJolly Shah #include <plat_ipi.h> 1631c3842eSJolly Shah #include <plat_private.h> 1709d40e0eSAntonio Nino Diaz #include <plat/common/platform.h> 1809d40e0eSAntonio Nino Diaz 1929bd0e66SSiva Durga Prasad Paladugu #include "pm_api_sys.h" 20c8284409SSoren Brinkmann 21c8284409SSoren Brinkmann /* 22c8284409SSoren Brinkmann * Table of regions to map using the MMU. 23c8284409SSoren Brinkmann * This doesn't include TZRAM as the 'mem_layout' argument passed to 24c8284409SSoren Brinkmann * configure_mmu_elx() will give the available subset of that, 25c8284409SSoren Brinkmann */ 26c8284409SSoren Brinkmann const mmap_region_t plat_arm_mmap[] = { 27c8284409SSoren Brinkmann { DEVICE0_BASE, DEVICE0_BASE, DEVICE0_SIZE, MT_DEVICE | MT_RW | MT_SECURE }, 28c8284409SSoren Brinkmann { DEVICE1_BASE, DEVICE1_BASE, DEVICE1_SIZE, MT_DEVICE | MT_RW | MT_SECURE }, 29c8284409SSoren Brinkmann { CRF_APB_BASE, CRF_APB_BASE, CRF_APB_SIZE, MT_DEVICE | MT_RW | MT_SECURE }, 30c8284409SSoren Brinkmann {0} 31c8284409SSoren Brinkmann }; 32c8284409SSoren Brinkmann 33ffa91031SVenkatesh Yadav Abbarapu static uint32_t zynqmp_get_silicon_ver(void) 34c8284409SSoren Brinkmann { 35466675c2SSoren Brinkmann static unsigned int ver; 36c8284409SSoren Brinkmann 37466675c2SSoren Brinkmann if (!ver) { 38466675c2SSoren Brinkmann ver = mmio_read_32(ZYNQMP_CSU_BASEADDR + 39466675c2SSoren Brinkmann ZYNQMP_CSU_VERSION_OFFSET); 40c8284409SSoren Brinkmann ver &= ZYNQMP_SILICON_VER_MASK; 41c8284409SSoren Brinkmann ver >>= ZYNQMP_SILICON_VER_SHIFT; 42466675c2SSoren Brinkmann } 43c8284409SSoren Brinkmann 44c8284409SSoren Brinkmann return ver; 45c8284409SSoren Brinkmann } 46c8284409SSoren Brinkmann 47ffa91031SVenkatesh Yadav Abbarapu uint32_t zynqmp_get_uart_clk(void) 48c8284409SSoren Brinkmann { 49c8284409SSoren Brinkmann unsigned int ver = zynqmp_get_silicon_ver(); 50c8284409SSoren Brinkmann 51eb0d2b17SVenkatesh Yadav Abbarapu if (ver == ZYNQMP_CSU_VERSION_QEMU) { 52c8284409SSoren Brinkmann return 133000000; 53eb0d2b17SVenkatesh Yadav Abbarapu } else { 54c8284409SSoren Brinkmann return 100000000; 55c8284409SSoren Brinkmann } 56eb0d2b17SVenkatesh Yadav Abbarapu } 57c8284409SSoren Brinkmann 58c8284409SSoren Brinkmann #if LOG_LEVEL >= LOG_LEVEL_NOTICE 59c8284409SSoren Brinkmann static const struct { 60ffa91031SVenkatesh Yadav Abbarapu uint32_t id; 61ffa91031SVenkatesh Yadav Abbarapu uint32_t ver; 62c8284409SSoren Brinkmann char *name; 6391bf4c5cSSiva Durga Prasad Paladugu bool evexists; 64c8284409SSoren Brinkmann } zynqmp_devices[] = { 65c8284409SSoren Brinkmann { 66c8284409SSoren Brinkmann .id = 0x10, 677a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU3EG", 68c8284409SSoren Brinkmann }, 69c8284409SSoren Brinkmann { 70915d4872SSiva Durga Prasad Paladugu .id = 0x10, 71915d4872SSiva Durga Prasad Paladugu .ver = 0x2c, 727a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU3CG", 73915d4872SSiva Durga Prasad Paladugu }, 74915d4872SSiva Durga Prasad Paladugu { 75c8284409SSoren Brinkmann .id = 0x11, 767a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU2EG", 77c8284409SSoren Brinkmann }, 78c8284409SSoren Brinkmann { 79915d4872SSiva Durga Prasad Paladugu .id = 0x11, 80915d4872SSiva Durga Prasad Paladugu .ver = 0x2c, 817a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU2CG", 82915d4872SSiva Durga Prasad Paladugu }, 83915d4872SSiva Durga Prasad Paladugu { 84c8284409SSoren Brinkmann .id = 0x20, 857a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU5EV", 8691bf4c5cSSiva Durga Prasad Paladugu .evexists = true, 87c8284409SSoren Brinkmann }, 88c8284409SSoren Brinkmann { 89915d4872SSiva Durga Prasad Paladugu .id = 0x20, 90915d4872SSiva Durga Prasad Paladugu .ver = 0x100, 917a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU5EG", 9291bf4c5cSSiva Durga Prasad Paladugu .evexists = true, 93915d4872SSiva Durga Prasad Paladugu }, 94915d4872SSiva Durga Prasad Paladugu { 95915d4872SSiva Durga Prasad Paladugu .id = 0x20, 96915d4872SSiva Durga Prasad Paladugu .ver = 0x12c, 977a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU5CG", 98915d4872SSiva Durga Prasad Paladugu }, 99915d4872SSiva Durga Prasad Paladugu { 100c8284409SSoren Brinkmann .id = 0x21, 1017a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU4EV", 10291bf4c5cSSiva Durga Prasad Paladugu .evexists = true, 103c8284409SSoren Brinkmann }, 104c8284409SSoren Brinkmann { 105915d4872SSiva Durga Prasad Paladugu .id = 0x21, 106915d4872SSiva Durga Prasad Paladugu .ver = 0x100, 1077a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU4EG", 10891bf4c5cSSiva Durga Prasad Paladugu .evexists = true, 109915d4872SSiva Durga Prasad Paladugu }, 110915d4872SSiva Durga Prasad Paladugu { 111915d4872SSiva Durga Prasad Paladugu .id = 0x21, 112915d4872SSiva Durga Prasad Paladugu .ver = 0x12c, 1137a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU4CG", 114915d4872SSiva Durga Prasad Paladugu }, 115915d4872SSiva Durga Prasad Paladugu { 116c8284409SSoren Brinkmann .id = 0x30, 1177a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU7EV", 11891bf4c5cSSiva Durga Prasad Paladugu .evexists = true, 119c8284409SSoren Brinkmann }, 120c8284409SSoren Brinkmann { 121915d4872SSiva Durga Prasad Paladugu .id = 0x30, 122915d4872SSiva Durga Prasad Paladugu .ver = 0x100, 1237a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU7EG", 12491bf4c5cSSiva Durga Prasad Paladugu .evexists = true, 125915d4872SSiva Durga Prasad Paladugu }, 126915d4872SSiva Durga Prasad Paladugu { 127915d4872SSiva Durga Prasad Paladugu .id = 0x30, 128915d4872SSiva Durga Prasad Paladugu .ver = 0x12c, 1297a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU7CG", 130915d4872SSiva Durga Prasad Paladugu }, 131915d4872SSiva Durga Prasad Paladugu { 132c8284409SSoren Brinkmann .id = 0x38, 1337a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU9EG", 134c8284409SSoren Brinkmann }, 135c8284409SSoren Brinkmann { 136915d4872SSiva Durga Prasad Paladugu .id = 0x38, 137915d4872SSiva Durga Prasad Paladugu .ver = 0x2c, 1387a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU9CG", 139915d4872SSiva Durga Prasad Paladugu }, 140915d4872SSiva Durga Prasad Paladugu { 141c8284409SSoren Brinkmann .id = 0x39, 1427a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU6EG", 143c8284409SSoren Brinkmann }, 144c8284409SSoren Brinkmann { 145915d4872SSiva Durga Prasad Paladugu .id = 0x39, 146915d4872SSiva Durga Prasad Paladugu .ver = 0x2c, 1477a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU6CG", 148915d4872SSiva Durga Prasad Paladugu }, 149915d4872SSiva Durga Prasad Paladugu { 150c8284409SSoren Brinkmann .id = 0x40, 1517a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU11EG", 152c8284409SSoren Brinkmann }, 153c8284409SSoren Brinkmann { 154c8284409SSoren Brinkmann .id = 0x50, 1557a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU15EG", 156c8284409SSoren Brinkmann }, 157c8284409SSoren Brinkmann { 158c8284409SSoren Brinkmann .id = 0x58, 1597a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU19EG", 160c8284409SSoren Brinkmann }, 161c8284409SSoren Brinkmann { 162c8284409SSoren Brinkmann .id = 0x59, 1637a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU17EG", 164c8284409SSoren Brinkmann }, 165d9710aebSSiva Durga Prasad Paladugu { 166d9710aebSSiva Durga Prasad Paladugu .id = 0x60, 1677a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU28DR", 168d9710aebSSiva Durga Prasad Paladugu }, 169d9710aebSSiva Durga Prasad Paladugu { 170d9710aebSSiva Durga Prasad Paladugu .id = 0x61, 1717a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU21DR", 172d9710aebSSiva Durga Prasad Paladugu }, 173d9710aebSSiva Durga Prasad Paladugu { 174d9710aebSSiva Durga Prasad Paladugu .id = 0x62, 1757a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU29DR", 176d9710aebSSiva Durga Prasad Paladugu }, 177d9710aebSSiva Durga Prasad Paladugu { 178d9710aebSSiva Durga Prasad Paladugu .id = 0x63, 1797a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU23DR", 180d9710aebSSiva Durga Prasad Paladugu }, 181d9710aebSSiva Durga Prasad Paladugu { 182d9710aebSSiva Durga Prasad Paladugu .id = 0x64, 1837a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU27DR", 184d9710aebSSiva Durga Prasad Paladugu }, 185d9710aebSSiva Durga Prasad Paladugu { 186d9710aebSSiva Durga Prasad Paladugu .id = 0x65, 1877a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU25DR", 188d9710aebSSiva Durga Prasad Paladugu }, 189345a85aeSSiva Durga Prasad Paladugu { 190345a85aeSSiva Durga Prasad Paladugu .id = 0x66, 1917a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU39DR", 192345a85aeSSiva Durga Prasad Paladugu }, 193c613a660SVenkatesh Yadav Abbarapu { 1941b7e5ca9SVenkatesh Yadav Abbarapu .id = 0x7d, 1957a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU43DR", 1961b7e5ca9SVenkatesh Yadav Abbarapu }, 1971b7e5ca9SVenkatesh Yadav Abbarapu { 1981b7e5ca9SVenkatesh Yadav Abbarapu .id = 0x78, 1997a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU46DR", 2001b7e5ca9SVenkatesh Yadav Abbarapu }, 2011b7e5ca9SVenkatesh Yadav Abbarapu { 2021b7e5ca9SVenkatesh Yadav Abbarapu .id = 0x7f, 2037a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU47DR", 2041b7e5ca9SVenkatesh Yadav Abbarapu }, 2051b7e5ca9SVenkatesh Yadav Abbarapu { 206c613a660SVenkatesh Yadav Abbarapu .id = 0x7b, 2077a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU48DR", 208c613a660SVenkatesh Yadav Abbarapu }, 209c613a660SVenkatesh Yadav Abbarapu { 210c613a660SVenkatesh Yadav Abbarapu .id = 0x7e, 2117a30e08bSVenkatesh Yadav Abbarapu .name = "XCZU49DR", 212c613a660SVenkatesh Yadav Abbarapu }, 213c8284409SSoren Brinkmann }; 214c8284409SSoren Brinkmann 21591bf4c5cSSiva Durga Prasad Paladugu #define ZYNQMP_PL_STATUS_BIT 9 21691bf4c5cSSiva Durga Prasad Paladugu #define ZYNQMP_PL_STATUS_MASK BIT(ZYNQMP_PL_STATUS_BIT) 21791bf4c5cSSiva Durga Prasad Paladugu #define ZYNQMP_CSU_VERSION_MASK ~(ZYNQMP_PL_STATUS_MASK) 218915d4872SSiva Durga Prasad Paladugu 219f1565907SMichal Simek #define SILICON_ID_XCK24 0x4712093U 220bfd7c881SVenkatesh Yadav Abbarapu #define SILICON_ID_XCK26 0x4724093U 2217a30e08bSVenkatesh Yadav Abbarapu 222c8284409SSoren Brinkmann static char *zynqmp_get_silicon_idcode_name(void) 223c8284409SSoren Brinkmann { 22491bf4c5cSSiva Durga Prasad Paladugu uint32_t id, ver, chipid[2]; 22591bf4c5cSSiva Durga Prasad Paladugu size_t i, j, len; 22691bf4c5cSSiva Durga Prasad Paladugu const char *name = "EG/EV"; 227c8284409SSoren Brinkmann 2280435ba64SSiva Durga Prasad Paladugu #ifdef IMAGE_BL32 2290435ba64SSiva Durga Prasad Paladugu /* 2300435ba64SSiva Durga Prasad Paladugu * For BL32, get the chip id info directly by reading corresponding 2310435ba64SSiva Durga Prasad Paladugu * registers instead of making pm call. This has limitation 2320435ba64SSiva Durga Prasad Paladugu * that these registers should be configured to have access 2330435ba64SSiva Durga Prasad Paladugu * from APU which is default case. 2340435ba64SSiva Durga Prasad Paladugu */ 2350435ba64SSiva Durga Prasad Paladugu chipid[0] = mmio_read_32(ZYNQMP_CSU_BASEADDR + ZYNQMP_CSU_IDCODE_OFFSET); 2360435ba64SSiva Durga Prasad Paladugu chipid[1] = mmio_read_32(EFUSE_BASEADDR + EFUSE_IPDISABLE_OFFSET); 2370435ba64SSiva Durga Prasad Paladugu #else 238eb0d2b17SVenkatesh Yadav Abbarapu if (pm_get_chipid(chipid) != PM_RET_SUCCESS) { 2397a30e08bSVenkatesh Yadav Abbarapu return "XCZUUNKN"; 240eb0d2b17SVenkatesh Yadav Abbarapu } 2410435ba64SSiva Durga Prasad Paladugu #endif 24291bf4c5cSSiva Durga Prasad Paladugu 24391bf4c5cSSiva Durga Prasad Paladugu id = chipid[0] & (ZYNQMP_CSU_IDCODE_DEVICE_CODE_MASK | 24491bf4c5cSSiva Durga Prasad Paladugu ZYNQMP_CSU_IDCODE_SVD_MASK); 24591bf4c5cSSiva Durga Prasad Paladugu id >>= ZYNQMP_CSU_IDCODE_SVD_SHIFT; 24691bf4c5cSSiva Durga Prasad Paladugu ver = chipid[1] >> ZYNQMP_EFUSE_IPDISABLE_SHIFT; 247915d4872SSiva Durga Prasad Paladugu 248915d4872SSiva Durga Prasad Paladugu for (i = 0; i < ARRAY_SIZE(zynqmp_devices); i++) { 24991bf4c5cSSiva Durga Prasad Paladugu if (zynqmp_devices[i].id == id && 250eb0d2b17SVenkatesh Yadav Abbarapu zynqmp_devices[i].ver == (ver & ZYNQMP_CSU_VERSION_MASK)) { 25191bf4c5cSSiva Durga Prasad Paladugu break; 252c8284409SSoren Brinkmann } 253eb0d2b17SVenkatesh Yadav Abbarapu } 25491bf4c5cSSiva Durga Prasad Paladugu 2557a30e08bSVenkatesh Yadav Abbarapu if (i >= ARRAY_SIZE(zynqmp_devices)) { 25686869f99SVenkatesh Yadav Abbarapu switch (chipid[0]) { 25786869f99SVenkatesh Yadav Abbarapu case SILICON_ID_XCK24: 25886869f99SVenkatesh Yadav Abbarapu return "XCK24"; 25986869f99SVenkatesh Yadav Abbarapu case SILICON_ID_XCK26: 2607a30e08bSVenkatesh Yadav Abbarapu return "XCK26"; 26186869f99SVenkatesh Yadav Abbarapu default: 2627a30e08bSVenkatesh Yadav Abbarapu return "XCZUUNKN"; 2637a30e08bSVenkatesh Yadav Abbarapu } 2647a30e08bSVenkatesh Yadav Abbarapu } 26591bf4c5cSSiva Durga Prasad Paladugu 266eb0d2b17SVenkatesh Yadav Abbarapu if (!zynqmp_devices[i].evexists) { 26791bf4c5cSSiva Durga Prasad Paladugu return zynqmp_devices[i].name; 268eb0d2b17SVenkatesh Yadav Abbarapu } 26991bf4c5cSSiva Durga Prasad Paladugu 270dd1fe717SVenkatesh Yadav Abbarapu if ((ver & ZYNQMP_PL_STATUS_MASK) != 0U) { 27191bf4c5cSSiva Durga Prasad Paladugu return zynqmp_devices[i].name; 272eb0d2b17SVenkatesh Yadav Abbarapu } 27391bf4c5cSSiva Durga Prasad Paladugu 27491bf4c5cSSiva Durga Prasad Paladugu len = strlen(zynqmp_devices[i].name) - 2; 27591bf4c5cSSiva Durga Prasad Paladugu for (j = 0; j < strlen(name); j++) { 27691bf4c5cSSiva Durga Prasad Paladugu zynqmp_devices[i].name[len] = name[j]; 27791bf4c5cSSiva Durga Prasad Paladugu len++; 27891bf4c5cSSiva Durga Prasad Paladugu } 27991bf4c5cSSiva Durga Prasad Paladugu zynqmp_devices[i].name[len] = '\0'; 28091bf4c5cSSiva Durga Prasad Paladugu 28191bf4c5cSSiva Durga Prasad Paladugu return zynqmp_devices[i].name; 282c8284409SSoren Brinkmann } 283c8284409SSoren Brinkmann 284c8284409SSoren Brinkmann static unsigned int zynqmp_get_rtl_ver(void) 285c8284409SSoren Brinkmann { 286c8284409SSoren Brinkmann uint32_t ver; 287c8284409SSoren Brinkmann 288c8284409SSoren Brinkmann ver = mmio_read_32(ZYNQMP_CSU_BASEADDR + ZYNQMP_CSU_VERSION_OFFSET); 289c8284409SSoren Brinkmann ver &= ZYNQMP_RTL_VER_MASK; 290c8284409SSoren Brinkmann ver >>= ZYNQMP_RTL_VER_SHIFT; 291c8284409SSoren Brinkmann 292c8284409SSoren Brinkmann return ver; 293c8284409SSoren Brinkmann } 294c8284409SSoren Brinkmann 295c8284409SSoren Brinkmann static char *zynqmp_print_silicon_idcode(void) 296c8284409SSoren Brinkmann { 297c8284409SSoren Brinkmann uint32_t id, maskid, tmp; 298c8284409SSoren Brinkmann 299c8284409SSoren Brinkmann id = mmio_read_32(ZYNQMP_CSU_BASEADDR + ZYNQMP_CSU_IDCODE_OFFSET); 300c8284409SSoren Brinkmann 301c8284409SSoren Brinkmann tmp = id; 302c8284409SSoren Brinkmann tmp &= ZYNQMP_CSU_IDCODE_XILINX_ID_MASK | 303648fe99eSSoren Brinkmann ZYNQMP_CSU_IDCODE_FAMILY_MASK; 304c8284409SSoren Brinkmann maskid = ZYNQMP_CSU_IDCODE_XILINX_ID << ZYNQMP_CSU_IDCODE_XILINX_ID_SHIFT | 305648fe99eSSoren Brinkmann ZYNQMP_CSU_IDCODE_FAMILY << ZYNQMP_CSU_IDCODE_FAMILY_SHIFT; 306c8284409SSoren Brinkmann if (tmp != maskid) { 307*d6760c4dSAkshay Belsare ERROR("Incorrect IDCODE 0x%x, maskid 0x%x\n", id, maskid); 308c8284409SSoren Brinkmann return "UNKN"; 309c8284409SSoren Brinkmann } 310*d6760c4dSAkshay Belsare VERBOSE("IDCODE 0x%x\n", id); 311c8284409SSoren Brinkmann return zynqmp_get_silicon_idcode_name(); 312c8284409SSoren Brinkmann } 313c8284409SSoren Brinkmann 314ffa91031SVenkatesh Yadav Abbarapu static uint32_t zynqmp_get_ps_ver(void) 315c8284409SSoren Brinkmann { 316c8284409SSoren Brinkmann uint32_t ver = mmio_read_32(ZYNQMP_CSU_BASEADDR + ZYNQMP_CSU_VERSION_OFFSET); 317c8284409SSoren Brinkmann 318c8284409SSoren Brinkmann ver &= ZYNQMP_PS_VER_MASK; 319c8284409SSoren Brinkmann ver >>= ZYNQMP_PS_VER_SHIFT; 320c8284409SSoren Brinkmann 321bfd7c881SVenkatesh Yadav Abbarapu return ver + 1U; 322c8284409SSoren Brinkmann } 323c8284409SSoren Brinkmann 324c8284409SSoren Brinkmann static void zynqmp_print_platform_name(void) 325c8284409SSoren Brinkmann { 326ffa91031SVenkatesh Yadav Abbarapu uint32_t ver = zynqmp_get_silicon_ver(); 327ffa91031SVenkatesh Yadav Abbarapu uint32_t rtl = zynqmp_get_rtl_ver(); 328c8284409SSoren Brinkmann char *label = "Unknown"; 329c8284409SSoren Brinkmann 330c8284409SSoren Brinkmann switch (ver) { 331c8284409SSoren Brinkmann case ZYNQMP_CSU_VERSION_QEMU: 332c8284409SSoren Brinkmann label = "QEMU"; 333c8284409SSoren Brinkmann break; 334c8284409SSoren Brinkmann case ZYNQMP_CSU_VERSION_SILICON: 335c8284409SSoren Brinkmann label = "silicon"; 336c8284409SSoren Brinkmann break; 337649c48f5SJonathan Wright default: 338649c48f5SJonathan Wright /* Do nothing in default case */ 339649c48f5SJonathan Wright break; 340c8284409SSoren Brinkmann } 341c8284409SSoren Brinkmann 3421277af9bSVenkatesh Yadav Abbarapu VERBOSE("TF-A running on %s/%s at 0x%x\n", 343db97f939SVenkatesh Yadav Abbarapu zynqmp_print_silicon_idcode(), label, BL31_BASE); 344db97f939SVenkatesh Yadav Abbarapu VERBOSE("TF-A running on v%d/RTL%d.%d\n", 345db97f939SVenkatesh Yadav Abbarapu zynqmp_get_ps_ver(), (rtl & 0xf0) >> 4, rtl & 0xf); 346c8284409SSoren Brinkmann } 347c8284409SSoren Brinkmann #else 348c8284409SSoren Brinkmann static inline void zynqmp_print_platform_name(void) { } 349c8284409SSoren Brinkmann #endif 350c8284409SSoren Brinkmann 351ffa91031SVenkatesh Yadav Abbarapu uint32_t zynqmp_get_bootmode(void) 3522cb5bac9SSoren Brinkmann { 35329bd0e66SSiva Durga Prasad Paladugu uint32_t r; 354a6d28520SSiva Durga Prasad Paladugu unsigned int ret; 35529bd0e66SSiva Durga Prasad Paladugu 356a6d28520SSiva Durga Prasad Paladugu ret = pm_mmio_read(CRL_APB_BOOT_MODE_USER, &r); 357a6d28520SSiva Durga Prasad Paladugu 358eb0d2b17SVenkatesh Yadav Abbarapu if (ret != PM_RET_SUCCESS) { 35929bd0e66SSiva Durga Prasad Paladugu r = mmio_read_32(CRL_APB_BOOT_MODE_USER); 360eb0d2b17SVenkatesh Yadav Abbarapu } 3612cb5bac9SSoren Brinkmann 3622cb5bac9SSoren Brinkmann return r & CRL_APB_BOOT_MODE_MASK; 3632cb5bac9SSoren Brinkmann } 3642cb5bac9SSoren Brinkmann 365c8284409SSoren Brinkmann void zynqmp_config_setup(void) 366c8284409SSoren Brinkmann { 3679f0ddae3SRajan Vaja uint64_t counter_freq; 3689f0ddae3SRajan Vaja 369705bed5dSJolly Shah /* Configure IPI data for ZynqMP */ 370705bed5dSJolly Shah zynqmp_ipi_config_table_init(); 371705bed5dSJolly Shah 372c8284409SSoren Brinkmann zynqmp_print_platform_name(); 3739f0ddae3SRajan Vaja 3749f0ddae3SRajan Vaja /* Configure counter frequency */ 3759f0ddae3SRajan Vaja counter_freq = read_cntfrq_el0(); 3769f0ddae3SRajan Vaja if (counter_freq == ZYNQMP_DEFAULT_COUNTER_FREQ) { 3779f0ddae3SRajan Vaja write_cntfrq_el0(plat_get_syscnt_freq2()); 3789f0ddae3SRajan Vaja } 3799f0ddae3SRajan Vaja 380e1cb4da4SSoren Brinkmann generic_delay_timer_init(); 381c8284409SSoren Brinkmann } 382c8284409SSoren Brinkmann 383ffa91031SVenkatesh Yadav Abbarapu uint32_t plat_get_syscnt_freq2(void) 384c8284409SSoren Brinkmann { 385ffa91031SVenkatesh Yadav Abbarapu uint32_t ver = zynqmp_get_silicon_ver(); 386c8284409SSoren Brinkmann 387eb0d2b17SVenkatesh Yadav Abbarapu if (ver == ZYNQMP_CSU_VERSION_QEMU) { 38865501a7cSEdgar E. Iglesias return 65000000; 389eb0d2b17SVenkatesh Yadav Abbarapu } else { 390e89f4af7SSoren Brinkmann return mmio_read_32(IOU_SCNTRS_BASEFREQ); 391c8284409SSoren Brinkmann } 392eb0d2b17SVenkatesh Yadav Abbarapu } 393