1c8284409SSoren Brinkmann /* 2c8284409SSoren Brinkmann * Copyright (c) 2013-2016, ARM Limited and Contributors. All rights reserved. 3c8284409SSoren Brinkmann * 482cb2c1aSdp-arm * SPDX-License-Identifier: BSD-3-Clause 5c8284409SSoren Brinkmann */ 6c8284409SSoren Brinkmann 7c8284409SSoren Brinkmann #include <debug.h> 8e1cb4da4SSoren Brinkmann #include <generic_delay_timer.h> 9c8284409SSoren Brinkmann #include <mmio.h> 10c8284409SSoren Brinkmann #include <platform.h> 1191bf4c5cSSiva Durga Prasad Paladugu #include <stdbool.h> 1291bf4c5cSSiva Durga Prasad Paladugu #include <string.h> 13c8284409SSoren Brinkmann #include <xlat_tables.h> 14c8284409SSoren Brinkmann #include "../zynqmp_private.h" 1529bd0e66SSiva Durga Prasad Paladugu #include "pm_api_sys.h" 16c8284409SSoren Brinkmann 17c8284409SSoren Brinkmann /* 18c8284409SSoren Brinkmann * Table of regions to map using the MMU. 19c8284409SSoren Brinkmann * This doesn't include TZRAM as the 'mem_layout' argument passed to 20c8284409SSoren Brinkmann * configure_mmu_elx() will give the available subset of that, 21c8284409SSoren Brinkmann */ 22c8284409SSoren Brinkmann const mmap_region_t plat_arm_mmap[] = { 23c8284409SSoren Brinkmann { DEVICE0_BASE, DEVICE0_BASE, DEVICE0_SIZE, MT_DEVICE | MT_RW | MT_SECURE }, 24c8284409SSoren Brinkmann { DEVICE1_BASE, DEVICE1_BASE, DEVICE1_SIZE, MT_DEVICE | MT_RW | MT_SECURE }, 25c8284409SSoren Brinkmann { CRF_APB_BASE, CRF_APB_BASE, CRF_APB_SIZE, MT_DEVICE | MT_RW | MT_SECURE }, 26c8284409SSoren Brinkmann {0} 27c8284409SSoren Brinkmann }; 28c8284409SSoren Brinkmann 29c8284409SSoren Brinkmann static unsigned int zynqmp_get_silicon_ver(void) 30c8284409SSoren Brinkmann { 31466675c2SSoren Brinkmann static unsigned int ver; 32c8284409SSoren Brinkmann 33466675c2SSoren Brinkmann if (!ver) { 34466675c2SSoren Brinkmann ver = mmio_read_32(ZYNQMP_CSU_BASEADDR + 35466675c2SSoren Brinkmann ZYNQMP_CSU_VERSION_OFFSET); 36c8284409SSoren Brinkmann ver &= ZYNQMP_SILICON_VER_MASK; 37c8284409SSoren Brinkmann ver >>= ZYNQMP_SILICON_VER_SHIFT; 38466675c2SSoren Brinkmann } 39c8284409SSoren Brinkmann 40c8284409SSoren Brinkmann return ver; 41c8284409SSoren Brinkmann } 42c8284409SSoren Brinkmann 43c8284409SSoren Brinkmann unsigned int zynqmp_get_uart_clk(void) 44c8284409SSoren Brinkmann { 45c8284409SSoren Brinkmann unsigned int ver = zynqmp_get_silicon_ver(); 46c8284409SSoren Brinkmann 47c8284409SSoren Brinkmann switch (ver) { 48c8284409SSoren Brinkmann case ZYNQMP_CSU_VERSION_VELOCE: 49c8284409SSoren Brinkmann return 48000; 50c8284409SSoren Brinkmann case ZYNQMP_CSU_VERSION_EP108: 51c8284409SSoren Brinkmann return 25000000; 52c8284409SSoren Brinkmann case ZYNQMP_CSU_VERSION_QEMU: 53c8284409SSoren Brinkmann return 133000000; 54649c48f5SJonathan Wright default: 55649c48f5SJonathan Wright /* Do nothing in default case */ 56649c48f5SJonathan Wright break; 57c8284409SSoren Brinkmann } 58c8284409SSoren Brinkmann 59c8284409SSoren Brinkmann return 100000000; 60c8284409SSoren Brinkmann } 61c8284409SSoren Brinkmann 62c8284409SSoren Brinkmann #if LOG_LEVEL >= LOG_LEVEL_NOTICE 63c8284409SSoren Brinkmann static const struct { 64c8284409SSoren Brinkmann unsigned int id; 65915d4872SSiva Durga Prasad Paladugu unsigned int ver; 66c8284409SSoren Brinkmann char *name; 6791bf4c5cSSiva Durga Prasad Paladugu bool evexists; 68c8284409SSoren Brinkmann } zynqmp_devices[] = { 69c8284409SSoren Brinkmann { 70c8284409SSoren Brinkmann .id = 0x10, 71c8284409SSoren Brinkmann .name = "3EG", 72c8284409SSoren Brinkmann }, 73c8284409SSoren Brinkmann { 74915d4872SSiva Durga Prasad Paladugu .id = 0x10, 75915d4872SSiva Durga Prasad Paladugu .ver = 0x2c, 76915d4872SSiva Durga Prasad Paladugu .name = "3CG", 77915d4872SSiva Durga Prasad Paladugu }, 78915d4872SSiva Durga Prasad Paladugu { 79c8284409SSoren Brinkmann .id = 0x11, 80c8284409SSoren Brinkmann .name = "2EG", 81c8284409SSoren Brinkmann }, 82c8284409SSoren Brinkmann { 83915d4872SSiva Durga Prasad Paladugu .id = 0x11, 84915d4872SSiva Durga Prasad Paladugu .ver = 0x2c, 85915d4872SSiva Durga Prasad Paladugu .name = "2CG", 86915d4872SSiva Durga Prasad Paladugu }, 87915d4872SSiva Durga Prasad Paladugu { 88c8284409SSoren Brinkmann .id = 0x20, 89c8284409SSoren Brinkmann .name = "5EV", 9091bf4c5cSSiva Durga Prasad Paladugu .evexists = true, 91c8284409SSoren Brinkmann }, 92c8284409SSoren Brinkmann { 93915d4872SSiva Durga Prasad Paladugu .id = 0x20, 94915d4872SSiva Durga Prasad Paladugu .ver = 0x100, 95915d4872SSiva Durga Prasad Paladugu .name = "5EG", 9691bf4c5cSSiva Durga Prasad Paladugu .evexists = true, 97915d4872SSiva Durga Prasad Paladugu }, 98915d4872SSiva Durga Prasad Paladugu { 99915d4872SSiva Durga Prasad Paladugu .id = 0x20, 100915d4872SSiva Durga Prasad Paladugu .ver = 0x12c, 101915d4872SSiva Durga Prasad Paladugu .name = "5CG", 102915d4872SSiva Durga Prasad Paladugu }, 103915d4872SSiva Durga Prasad Paladugu { 104c8284409SSoren Brinkmann .id = 0x21, 105c8284409SSoren Brinkmann .name = "4EV", 10691bf4c5cSSiva Durga Prasad Paladugu .evexists = true, 107c8284409SSoren Brinkmann }, 108c8284409SSoren Brinkmann { 109915d4872SSiva Durga Prasad Paladugu .id = 0x21, 110915d4872SSiva Durga Prasad Paladugu .ver = 0x100, 111915d4872SSiva Durga Prasad Paladugu .name = "4EG", 11291bf4c5cSSiva Durga Prasad Paladugu .evexists = true, 113915d4872SSiva Durga Prasad Paladugu }, 114915d4872SSiva Durga Prasad Paladugu { 115915d4872SSiva Durga Prasad Paladugu .id = 0x21, 116915d4872SSiva Durga Prasad Paladugu .ver = 0x12c, 117915d4872SSiva Durga Prasad Paladugu .name = "4CG", 118915d4872SSiva Durga Prasad Paladugu }, 119915d4872SSiva Durga Prasad Paladugu { 120c8284409SSoren Brinkmann .id = 0x30, 121c8284409SSoren Brinkmann .name = "7EV", 12291bf4c5cSSiva Durga Prasad Paladugu .evexists = true, 123c8284409SSoren Brinkmann }, 124c8284409SSoren Brinkmann { 125915d4872SSiva Durga Prasad Paladugu .id = 0x30, 126915d4872SSiva Durga Prasad Paladugu .ver = 0x100, 127915d4872SSiva Durga Prasad Paladugu .name = "7EG", 12891bf4c5cSSiva Durga Prasad Paladugu .evexists = true, 129915d4872SSiva Durga Prasad Paladugu }, 130915d4872SSiva Durga Prasad Paladugu { 131915d4872SSiva Durga Prasad Paladugu .id = 0x30, 132915d4872SSiva Durga Prasad Paladugu .ver = 0x12c, 133915d4872SSiva Durga Prasad Paladugu .name = "7CG", 134915d4872SSiva Durga Prasad Paladugu }, 135915d4872SSiva Durga Prasad Paladugu { 136c8284409SSoren Brinkmann .id = 0x38, 137c8284409SSoren Brinkmann .name = "9EG", 138c8284409SSoren Brinkmann }, 139c8284409SSoren Brinkmann { 140915d4872SSiva Durga Prasad Paladugu .id = 0x38, 141915d4872SSiva Durga Prasad Paladugu .ver = 0x2c, 142915d4872SSiva Durga Prasad Paladugu .name = "9CG", 143915d4872SSiva Durga Prasad Paladugu }, 144915d4872SSiva Durga Prasad Paladugu { 145c8284409SSoren Brinkmann .id = 0x39, 146c8284409SSoren Brinkmann .name = "6EG", 147c8284409SSoren Brinkmann }, 148c8284409SSoren Brinkmann { 149915d4872SSiva Durga Prasad Paladugu .id = 0x39, 150915d4872SSiva Durga Prasad Paladugu .ver = 0x2c, 151915d4872SSiva Durga Prasad Paladugu .name = "6CG", 152915d4872SSiva Durga Prasad Paladugu }, 153915d4872SSiva Durga Prasad Paladugu { 154c8284409SSoren Brinkmann .id = 0x40, 155c8284409SSoren Brinkmann .name = "11EG", 156c8284409SSoren Brinkmann }, 157915d4872SSiva Durga Prasad Paladugu { /* For testing purpose only */ 158915d4872SSiva Durga Prasad Paladugu .id = 0x50, 159915d4872SSiva Durga Prasad Paladugu .ver = 0x2c, 160915d4872SSiva Durga Prasad Paladugu .name = "15CG", 161915d4872SSiva Durga Prasad Paladugu }, 162c8284409SSoren Brinkmann { 163c8284409SSoren Brinkmann .id = 0x50, 164c8284409SSoren Brinkmann .name = "15EG", 165c8284409SSoren Brinkmann }, 166c8284409SSoren Brinkmann { 167c8284409SSoren Brinkmann .id = 0x58, 168c8284409SSoren Brinkmann .name = "19EG", 169c8284409SSoren Brinkmann }, 170c8284409SSoren Brinkmann { 171c8284409SSoren Brinkmann .id = 0x59, 172c8284409SSoren Brinkmann .name = "17EG", 173c8284409SSoren Brinkmann }, 174d9710aebSSiva Durga Prasad Paladugu { 175d9710aebSSiva Durga Prasad Paladugu .id = 0x60, 176d9710aebSSiva Durga Prasad Paladugu .name = "28DR", 177d9710aebSSiva Durga Prasad Paladugu }, 178d9710aebSSiva Durga Prasad Paladugu { 179d9710aebSSiva Durga Prasad Paladugu .id = 0x61, 180d9710aebSSiva Durga Prasad Paladugu .name = "21DR", 181d9710aebSSiva Durga Prasad Paladugu }, 182d9710aebSSiva Durga Prasad Paladugu { 183d9710aebSSiva Durga Prasad Paladugu .id = 0x62, 184d9710aebSSiva Durga Prasad Paladugu .name = "29DR", 185d9710aebSSiva Durga Prasad Paladugu }, 186d9710aebSSiva Durga Prasad Paladugu { 187d9710aebSSiva Durga Prasad Paladugu .id = 0x63, 188d9710aebSSiva Durga Prasad Paladugu .name = "23DR", 189d9710aebSSiva Durga Prasad Paladugu }, 190d9710aebSSiva Durga Prasad Paladugu { 191d9710aebSSiva Durga Prasad Paladugu .id = 0x64, 192d9710aebSSiva Durga Prasad Paladugu .name = "27DR", 193d9710aebSSiva Durga Prasad Paladugu }, 194d9710aebSSiva Durga Prasad Paladugu { 195d9710aebSSiva Durga Prasad Paladugu .id = 0x65, 196d9710aebSSiva Durga Prasad Paladugu .name = "25DR", 197d9710aebSSiva Durga Prasad Paladugu }, 198c8284409SSoren Brinkmann }; 199c8284409SSoren Brinkmann 20091bf4c5cSSiva Durga Prasad Paladugu #define ZYNQMP_PL_STATUS_BIT 9 20191bf4c5cSSiva Durga Prasad Paladugu #define ZYNQMP_PL_STATUS_MASK BIT(ZYNQMP_PL_STATUS_BIT) 20291bf4c5cSSiva Durga Prasad Paladugu #define ZYNQMP_CSU_VERSION_MASK ~(ZYNQMP_PL_STATUS_MASK) 203915d4872SSiva Durga Prasad Paladugu 204c8284409SSoren Brinkmann static char *zynqmp_get_silicon_idcode_name(void) 205c8284409SSoren Brinkmann { 20691bf4c5cSSiva Durga Prasad Paladugu uint32_t id, ver, chipid[2]; 20791bf4c5cSSiva Durga Prasad Paladugu size_t i, j, len; 20891bf4c5cSSiva Durga Prasad Paladugu const char *name = "EG/EV"; 209c8284409SSoren Brinkmann 210*0435ba64SSiva Durga Prasad Paladugu #ifdef IMAGE_BL32 211*0435ba64SSiva Durga Prasad Paladugu /* 212*0435ba64SSiva Durga Prasad Paladugu * For BL32, get the chip id info directly by reading corresponding 213*0435ba64SSiva Durga Prasad Paladugu * registers instead of making pm call. This has limitation 214*0435ba64SSiva Durga Prasad Paladugu * that these registers should be configured to have access 215*0435ba64SSiva Durga Prasad Paladugu * from APU which is default case. 216*0435ba64SSiva Durga Prasad Paladugu */ 217*0435ba64SSiva Durga Prasad Paladugu chipid[0] = mmio_read_32(ZYNQMP_CSU_BASEADDR + ZYNQMP_CSU_IDCODE_OFFSET); 218*0435ba64SSiva Durga Prasad Paladugu chipid[1] = mmio_read_32(EFUSE_BASEADDR + EFUSE_IPDISABLE_OFFSET); 219*0435ba64SSiva Durga Prasad Paladugu #else 220*0435ba64SSiva Durga Prasad Paladugu if (pm_get_chipid(chipid) != PM_RET_SUCCESS) 22191bf4c5cSSiva Durga Prasad Paladugu return "UNKN"; 222*0435ba64SSiva Durga Prasad Paladugu #endif 22391bf4c5cSSiva Durga Prasad Paladugu 22491bf4c5cSSiva Durga Prasad Paladugu id = chipid[0] & (ZYNQMP_CSU_IDCODE_DEVICE_CODE_MASK | 22591bf4c5cSSiva Durga Prasad Paladugu ZYNQMP_CSU_IDCODE_SVD_MASK); 22691bf4c5cSSiva Durga Prasad Paladugu id >>= ZYNQMP_CSU_IDCODE_SVD_SHIFT; 22791bf4c5cSSiva Durga Prasad Paladugu ver = chipid[1] >> ZYNQMP_EFUSE_IPDISABLE_SHIFT; 228915d4872SSiva Durga Prasad Paladugu 229915d4872SSiva Durga Prasad Paladugu for (i = 0; i < ARRAY_SIZE(zynqmp_devices); i++) { 23091bf4c5cSSiva Durga Prasad Paladugu if (zynqmp_devices[i].id == id && 23191bf4c5cSSiva Durga Prasad Paladugu zynqmp_devices[i].ver == (ver & ZYNQMP_CSU_VERSION_MASK)) 23291bf4c5cSSiva Durga Prasad Paladugu break; 233c8284409SSoren Brinkmann } 23491bf4c5cSSiva Durga Prasad Paladugu 23591bf4c5cSSiva Durga Prasad Paladugu if (i >= ARRAY_SIZE(zynqmp_devices)) 236c8284409SSoren Brinkmann return "UNKN"; 23791bf4c5cSSiva Durga Prasad Paladugu 23891bf4c5cSSiva Durga Prasad Paladugu if (!zynqmp_devices[i].evexists) 23991bf4c5cSSiva Durga Prasad Paladugu return zynqmp_devices[i].name; 24091bf4c5cSSiva Durga Prasad Paladugu 24191bf4c5cSSiva Durga Prasad Paladugu if (ver & ZYNQMP_PL_STATUS_MASK) 24291bf4c5cSSiva Durga Prasad Paladugu return zynqmp_devices[i].name; 24391bf4c5cSSiva Durga Prasad Paladugu 24491bf4c5cSSiva Durga Prasad Paladugu len = strlen(zynqmp_devices[i].name) - 2; 24591bf4c5cSSiva Durga Prasad Paladugu for (j = 0; j < strlen(name); j++) { 24691bf4c5cSSiva Durga Prasad Paladugu zynqmp_devices[i].name[len] = name[j]; 24791bf4c5cSSiva Durga Prasad Paladugu len++; 24891bf4c5cSSiva Durga Prasad Paladugu } 24991bf4c5cSSiva Durga Prasad Paladugu zynqmp_devices[i].name[len] = '\0'; 25091bf4c5cSSiva Durga Prasad Paladugu 25191bf4c5cSSiva Durga Prasad Paladugu return zynqmp_devices[i].name; 252c8284409SSoren Brinkmann } 253c8284409SSoren Brinkmann 254c8284409SSoren Brinkmann static unsigned int zynqmp_get_rtl_ver(void) 255c8284409SSoren Brinkmann { 256c8284409SSoren Brinkmann uint32_t ver; 257c8284409SSoren Brinkmann 258c8284409SSoren Brinkmann ver = mmio_read_32(ZYNQMP_CSU_BASEADDR + ZYNQMP_CSU_VERSION_OFFSET); 259c8284409SSoren Brinkmann ver &= ZYNQMP_RTL_VER_MASK; 260c8284409SSoren Brinkmann ver >>= ZYNQMP_RTL_VER_SHIFT; 261c8284409SSoren Brinkmann 262c8284409SSoren Brinkmann return ver; 263c8284409SSoren Brinkmann } 264c8284409SSoren Brinkmann 265c8284409SSoren Brinkmann static char *zynqmp_print_silicon_idcode(void) 266c8284409SSoren Brinkmann { 267c8284409SSoren Brinkmann uint32_t id, maskid, tmp; 268c8284409SSoren Brinkmann 269c8284409SSoren Brinkmann id = mmio_read_32(ZYNQMP_CSU_BASEADDR + ZYNQMP_CSU_IDCODE_OFFSET); 270c8284409SSoren Brinkmann 271c8284409SSoren Brinkmann tmp = id; 272c8284409SSoren Brinkmann tmp &= ZYNQMP_CSU_IDCODE_XILINX_ID_MASK | 273648fe99eSSoren Brinkmann ZYNQMP_CSU_IDCODE_FAMILY_MASK; 274c8284409SSoren Brinkmann maskid = ZYNQMP_CSU_IDCODE_XILINX_ID << ZYNQMP_CSU_IDCODE_XILINX_ID_SHIFT | 275648fe99eSSoren Brinkmann ZYNQMP_CSU_IDCODE_FAMILY << ZYNQMP_CSU_IDCODE_FAMILY_SHIFT; 276c8284409SSoren Brinkmann if (tmp != maskid) { 277c8284409SSoren Brinkmann ERROR("Incorrect XILINX IDCODE 0x%x, maskid 0x%x\n", id, maskid); 278c8284409SSoren Brinkmann return "UNKN"; 279c8284409SSoren Brinkmann } 280c8284409SSoren Brinkmann VERBOSE("Xilinx IDCODE 0x%x\n", id); 281c8284409SSoren Brinkmann return zynqmp_get_silicon_idcode_name(); 282c8284409SSoren Brinkmann } 283c8284409SSoren Brinkmann 284c8284409SSoren Brinkmann static unsigned int zynqmp_get_ps_ver(void) 285c8284409SSoren Brinkmann { 286c8284409SSoren Brinkmann uint32_t ver = mmio_read_32(ZYNQMP_CSU_BASEADDR + ZYNQMP_CSU_VERSION_OFFSET); 287c8284409SSoren Brinkmann 288c8284409SSoren Brinkmann ver &= ZYNQMP_PS_VER_MASK; 289c8284409SSoren Brinkmann ver >>= ZYNQMP_PS_VER_SHIFT; 290c8284409SSoren Brinkmann 291c8284409SSoren Brinkmann return ver + 1; 292c8284409SSoren Brinkmann } 293c8284409SSoren Brinkmann 294c8284409SSoren Brinkmann static void zynqmp_print_platform_name(void) 295c8284409SSoren Brinkmann { 296c8284409SSoren Brinkmann unsigned int ver = zynqmp_get_silicon_ver(); 297c8284409SSoren Brinkmann unsigned int rtl = zynqmp_get_rtl_ver(); 298c8284409SSoren Brinkmann char *label = "Unknown"; 299c8284409SSoren Brinkmann 300c8284409SSoren Brinkmann switch (ver) { 301c8284409SSoren Brinkmann case ZYNQMP_CSU_VERSION_VELOCE: 302c8284409SSoren Brinkmann label = "VELOCE"; 303c8284409SSoren Brinkmann break; 304c8284409SSoren Brinkmann case ZYNQMP_CSU_VERSION_EP108: 305c8284409SSoren Brinkmann label = "EP108"; 306c8284409SSoren Brinkmann break; 307c8284409SSoren Brinkmann case ZYNQMP_CSU_VERSION_QEMU: 308c8284409SSoren Brinkmann label = "QEMU"; 309c8284409SSoren Brinkmann break; 310c8284409SSoren Brinkmann case ZYNQMP_CSU_VERSION_SILICON: 311c8284409SSoren Brinkmann label = "silicon"; 312c8284409SSoren Brinkmann break; 313649c48f5SJonathan Wright default: 314649c48f5SJonathan Wright /* Do nothing in default case */ 315649c48f5SJonathan Wright break; 316c8284409SSoren Brinkmann } 317c8284409SSoren Brinkmann 318a6d28520SSiva Durga Prasad Paladugu NOTICE("ATF running on XCZU%s/%s v%d/RTL%d.%d at 0x%x\n", 319c8284409SSoren Brinkmann zynqmp_print_silicon_idcode(), label, zynqmp_get_ps_ver(), 320a6d28520SSiva Durga Prasad Paladugu (rtl & 0xf0) >> 4, rtl & 0xf, BL31_BASE); 321c8284409SSoren Brinkmann } 322c8284409SSoren Brinkmann #else 323c8284409SSoren Brinkmann static inline void zynqmp_print_platform_name(void) { } 324c8284409SSoren Brinkmann #endif 325c8284409SSoren Brinkmann 3262cb5bac9SSoren Brinkmann unsigned int zynqmp_get_bootmode(void) 3272cb5bac9SSoren Brinkmann { 32829bd0e66SSiva Durga Prasad Paladugu uint32_t r; 329a6d28520SSiva Durga Prasad Paladugu unsigned int ret; 33029bd0e66SSiva Durga Prasad Paladugu 331a6d28520SSiva Durga Prasad Paladugu ret = pm_mmio_read(CRL_APB_BOOT_MODE_USER, &r); 332a6d28520SSiva Durga Prasad Paladugu 333a6d28520SSiva Durga Prasad Paladugu if (ret != PM_RET_SUCCESS) 33429bd0e66SSiva Durga Prasad Paladugu r = mmio_read_32(CRL_APB_BOOT_MODE_USER); 3352cb5bac9SSoren Brinkmann 3362cb5bac9SSoren Brinkmann return r & CRL_APB_BOOT_MODE_MASK; 3372cb5bac9SSoren Brinkmann } 3382cb5bac9SSoren Brinkmann 339c8284409SSoren Brinkmann void zynqmp_config_setup(void) 340c8284409SSoren Brinkmann { 341c8284409SSoren Brinkmann zynqmp_print_platform_name(); 342e1cb4da4SSoren Brinkmann generic_delay_timer_init(); 343c8284409SSoren Brinkmann } 344c8284409SSoren Brinkmann 345f3d3b316SAntonio Nino Diaz unsigned int plat_get_syscnt_freq2(void) 346c8284409SSoren Brinkmann { 347e89f4af7SSoren Brinkmann unsigned int ver = zynqmp_get_silicon_ver(); 348c8284409SSoren Brinkmann 349e89f4af7SSoren Brinkmann switch (ver) { 350e89f4af7SSoren Brinkmann case ZYNQMP_CSU_VERSION_VELOCE: 351e89f4af7SSoren Brinkmann return 10000; 352e89f4af7SSoren Brinkmann case ZYNQMP_CSU_VERSION_EP108: 353e89f4af7SSoren Brinkmann return 4000000; 354e89f4af7SSoren Brinkmann case ZYNQMP_CSU_VERSION_QEMU: 355e89f4af7SSoren Brinkmann return 50000000; 356649c48f5SJonathan Wright default: 357649c48f5SJonathan Wright /* Do nothing in default case */ 358649c48f5SJonathan Wright break; 359e89f4af7SSoren Brinkmann } 360c8284409SSoren Brinkmann 361e89f4af7SSoren Brinkmann return mmio_read_32(IOU_SCNTRS_BASEFREQ); 362c8284409SSoren Brinkmann } 363