1c8284409SSoren Brinkmann /* 21277af9bSVenkatesh Yadav Abbarapu * Copyright (c) 2013-2022, ARM Limited and Contributors. All rights reserved. 3d6760c4dSAkshay 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> 14*8f9ba3f3SMichal 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> 18*8f9ba3f3SMichal Simek #include <plat_startup.h> 1909d40e0eSAntonio Nino Diaz #include <plat/common/platform.h> 20*8f9ba3f3SMichal Simek #include <services/arm_arch_svc.h> 2109d40e0eSAntonio Nino Diaz 2229bd0e66SSiva Durga Prasad Paladugu #include "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 317*8f9ba3f3SMichal Simek int32_t plat_is_smccc_feature_available(u_register_t fid) 318*8f9ba3f3SMichal Simek { 319*8f9ba3f3SMichal Simek switch (fid) { 320*8f9ba3f3SMichal Simek case SMCCC_ARCH_SOC_ID: 321*8f9ba3f3SMichal Simek return SMC_ARCH_CALL_SUCCESS; 322*8f9ba3f3SMichal Simek default: 323*8f9ba3f3SMichal Simek return SMC_ARCH_CALL_NOT_SUPPORTED; 324*8f9ba3f3SMichal Simek } 325*8f9ba3f3SMichal Simek 326*8f9ba3f3SMichal Simek return SMC_ARCH_CALL_NOT_SUPPORTED; 327*8f9ba3f3SMichal Simek } 328*8f9ba3f3SMichal Simek 329*8f9ba3f3SMichal Simek int32_t plat_get_soc_version(void) 330*8f9ba3f3SMichal Simek { 331*8f9ba3f3SMichal Simek uint32_t chip_id = zynqmp_get_silicon_ver(); 332*8f9ba3f3SMichal Simek uint32_t manfid = SOC_ID_SET_JEP_106(JEDEC_XILINX_BKID, JEDEC_XILINX_MFID); 333*8f9ba3f3SMichal Simek 334*8f9ba3f3SMichal Simek return (int32_t)(manfid | (chip_id & 0xFFFF)); 335*8f9ba3f3SMichal Simek } 336*8f9ba3f3SMichal Simek 337*8f9ba3f3SMichal Simek int32_t plat_get_soc_revision(void) 338*8f9ba3f3SMichal Simek { 339*8f9ba3f3SMichal Simek return mmio_read_32(ZYNQMP_CSU_BASEADDR + ZYNQMP_CSU_IDCODE_OFFSET); 340*8f9ba3f3SMichal Simek } 341*8f9ba3f3SMichal 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