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 3951564354SPrasad Kummari const mmap_region_t *plat_get_mmap(void) 4051564354SPrasad Kummari { 4151564354SPrasad Kummari return plat_zynqmp_mmap; 4251564354SPrasad Kummari } 4351564354SPrasad Kummari 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 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 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 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; 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 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 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 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 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 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 380c8284409SSoren Brinkmann static inline void zynqmp_print_platform_name(void) { } 381c8284409SSoren Brinkmann #endif 382c8284409SSoren Brinkmann 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 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 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