184c7204bSMichal Simek /* 284c7204bSMichal Simek * (C) Copyright 2014 - 2015 Xilinx, Inc. 384c7204bSMichal Simek * Michal Simek <michal.simek@xilinx.com> 484c7204bSMichal Simek * 584c7204bSMichal Simek * SPDX-License-Identifier: GPL-2.0+ 684c7204bSMichal Simek */ 784c7204bSMichal Simek 884c7204bSMichal Simek #include <common.h> 9679b994aSMichal Simek #include <sata.h> 106fe6f135SMichal Simek #include <ahci.h> 116fe6f135SMichal Simek #include <scsi.h> 12b72894f1SMichal Simek #include <malloc.h> 130785dfd8SMichal Simek #include <asm/arch/clk.h> 1484c7204bSMichal Simek #include <asm/arch/hardware.h> 1584c7204bSMichal Simek #include <asm/arch/sys_proto.h> 162ad341edSMichal Simek #include <asm/arch/psu_init_gpl.h> 1784c7204bSMichal Simek #include <asm/io.h> 1816fa00a7SSiva Durga Prasad Paladugu #include <usb.h> 1916fa00a7SSiva Durga Prasad Paladugu #include <dwc3-uboot.h> 2047e60cbdSMichal Simek #include <zynqmppl.h> 216919b4bfSMichal Simek #include <i2c.h> 229feff385SMichal Simek #include <g_dnl.h> 2384c7204bSMichal Simek 2484c7204bSMichal Simek DECLARE_GLOBAL_DATA_PTR; 2584c7204bSMichal Simek 2647e60cbdSMichal Simek #if defined(CONFIG_FPGA) && defined(CONFIG_FPGA_ZYNQMPPL) && \ 2747e60cbdSMichal Simek !defined(CONFIG_SPL_BUILD) 2847e60cbdSMichal Simek static xilinx_desc zynqmppl = XILINX_ZYNQMP_DESC; 2947e60cbdSMichal Simek 3047e60cbdSMichal Simek static const struct { 318ebdf9efSMichal Simek u32 id; 32494fffe7SMichal Simek u32 ver; 3347e60cbdSMichal Simek char *name; 3447e60cbdSMichal Simek } zynqmp_devices[] = { 3547e60cbdSMichal Simek { 3647e60cbdSMichal Simek .id = 0x10, 3747e60cbdSMichal Simek .name = "3eg", 3847e60cbdSMichal Simek }, 3947e60cbdSMichal Simek { 40494fffe7SMichal Simek .id = 0x10, 41494fffe7SMichal Simek .ver = 0x2c, 42494fffe7SMichal Simek .name = "3cg", 43494fffe7SMichal Simek }, 44494fffe7SMichal Simek { 4547e60cbdSMichal Simek .id = 0x11, 4647e60cbdSMichal Simek .name = "2eg", 4747e60cbdSMichal Simek }, 4847e60cbdSMichal Simek { 49494fffe7SMichal Simek .id = 0x11, 50494fffe7SMichal Simek .ver = 0x2c, 51494fffe7SMichal Simek .name = "2cg", 52494fffe7SMichal Simek }, 53494fffe7SMichal Simek { 5447e60cbdSMichal Simek .id = 0x20, 5547e60cbdSMichal Simek .name = "5ev", 5647e60cbdSMichal Simek }, 5747e60cbdSMichal Simek { 58494fffe7SMichal Simek .id = 0x20, 59494fffe7SMichal Simek .ver = 0x100, 60494fffe7SMichal Simek .name = "5eg", 61494fffe7SMichal Simek }, 62494fffe7SMichal Simek { 63494fffe7SMichal Simek .id = 0x20, 64494fffe7SMichal Simek .ver = 0x12c, 65494fffe7SMichal Simek .name = "5cg", 66494fffe7SMichal Simek }, 67494fffe7SMichal Simek { 6847e60cbdSMichal Simek .id = 0x21, 6947e60cbdSMichal Simek .name = "4ev", 7047e60cbdSMichal Simek }, 7147e60cbdSMichal Simek { 72494fffe7SMichal Simek .id = 0x21, 73494fffe7SMichal Simek .ver = 0x100, 74494fffe7SMichal Simek .name = "4eg", 75494fffe7SMichal Simek }, 76494fffe7SMichal Simek { 77494fffe7SMichal Simek .id = 0x21, 78494fffe7SMichal Simek .ver = 0x12c, 79494fffe7SMichal Simek .name = "4cg", 80494fffe7SMichal Simek }, 81494fffe7SMichal Simek { 8247e60cbdSMichal Simek .id = 0x30, 8347e60cbdSMichal Simek .name = "7ev", 8447e60cbdSMichal Simek }, 8547e60cbdSMichal Simek { 86494fffe7SMichal Simek .id = 0x30, 87494fffe7SMichal Simek .ver = 0x100, 88494fffe7SMichal Simek .name = "7eg", 89494fffe7SMichal Simek }, 90494fffe7SMichal Simek { 91494fffe7SMichal Simek .id = 0x30, 92494fffe7SMichal Simek .ver = 0x12c, 93494fffe7SMichal Simek .name = "7cg", 94494fffe7SMichal Simek }, 95494fffe7SMichal Simek { 9647e60cbdSMichal Simek .id = 0x38, 9747e60cbdSMichal Simek .name = "9eg", 9847e60cbdSMichal Simek }, 9947e60cbdSMichal Simek { 100494fffe7SMichal Simek .id = 0x38, 101494fffe7SMichal Simek .ver = 0x2c, 102494fffe7SMichal Simek .name = "9cg", 103494fffe7SMichal Simek }, 104494fffe7SMichal Simek { 10547e60cbdSMichal Simek .id = 0x39, 10647e60cbdSMichal Simek .name = "6eg", 10747e60cbdSMichal Simek }, 10847e60cbdSMichal Simek { 109494fffe7SMichal Simek .id = 0x39, 110494fffe7SMichal Simek .ver = 0x2c, 111494fffe7SMichal Simek .name = "6cg", 112494fffe7SMichal Simek }, 113494fffe7SMichal Simek { 11447e60cbdSMichal Simek .id = 0x40, 11547e60cbdSMichal Simek .name = "11eg", 11647e60cbdSMichal Simek }, 117494fffe7SMichal Simek { /* For testing purpose only */ 118494fffe7SMichal Simek .id = 0x50, 119494fffe7SMichal Simek .ver = 0x2c, 120494fffe7SMichal Simek .name = "15cg", 121494fffe7SMichal Simek }, 12247e60cbdSMichal Simek { 12347e60cbdSMichal Simek .id = 0x50, 12447e60cbdSMichal Simek .name = "15eg", 12547e60cbdSMichal Simek }, 12647e60cbdSMichal Simek { 12747e60cbdSMichal Simek .id = 0x58, 12847e60cbdSMichal Simek .name = "19eg", 12947e60cbdSMichal Simek }, 13047e60cbdSMichal Simek { 13147e60cbdSMichal Simek .id = 0x59, 13247e60cbdSMichal Simek .name = "17eg", 13347e60cbdSMichal Simek }, 134b030fedfSMichal Simek { 135b030fedfSMichal Simek .id = 0x61, 136b030fedfSMichal Simek .name = "21dr", 137b030fedfSMichal Simek }, 138b030fedfSMichal Simek { 139b030fedfSMichal Simek .id = 0x63, 140b030fedfSMichal Simek .name = "23dr", 141b030fedfSMichal Simek }, 142b030fedfSMichal Simek { 143b030fedfSMichal Simek .id = 0x65, 144b030fedfSMichal Simek .name = "25dr", 145b030fedfSMichal Simek }, 146b030fedfSMichal Simek { 147b030fedfSMichal Simek .id = 0x64, 148b030fedfSMichal Simek .name = "27dr", 149b030fedfSMichal Simek }, 150b030fedfSMichal Simek { 151b030fedfSMichal Simek .id = 0x60, 152b030fedfSMichal Simek .name = "28dr", 153b030fedfSMichal Simek }, 154b030fedfSMichal Simek { 155b030fedfSMichal Simek .id = 0x62, 156b030fedfSMichal Simek .name = "29dr", 157b030fedfSMichal Simek }, 15847e60cbdSMichal Simek }; 15974ba69dbSSiva Durga Prasad Paladugu #endif 16047e60cbdSMichal Simek 161f52bf5a3SSiva Durga Prasad Paladugu int chip_id(unsigned char id) 16247e60cbdSMichal Simek { 16347e60cbdSMichal Simek struct pt_regs regs; 16474ba69dbSSiva Durga Prasad Paladugu int val = -EINVAL; 16574ba69dbSSiva Durga Prasad Paladugu 16674ba69dbSSiva Durga Prasad Paladugu if (current_el() != 3) { 16747e60cbdSMichal Simek regs.regs[0] = ZYNQMP_SIP_SVC_CSU_DMA_CHIPID; 16847e60cbdSMichal Simek regs.regs[1] = 0; 16947e60cbdSMichal Simek regs.regs[2] = 0; 17047e60cbdSMichal Simek regs.regs[3] = 0; 17147e60cbdSMichal Simek 17247e60cbdSMichal Simek smc_call(®s); 17347e60cbdSMichal Simek 1740cba6abbSSoren Brinkmann /* 1750cba6abbSSoren Brinkmann * SMC returns: 1760cba6abbSSoren Brinkmann * regs[0][31:0] = status of the operation 1770cba6abbSSoren Brinkmann * regs[0][63:32] = CSU.IDCODE register 1780cba6abbSSoren Brinkmann * regs[1][31:0] = CSU.version register 179494fffe7SMichal Simek * regs[1][63:32] = CSU.IDCODE2 register 1800cba6abbSSoren Brinkmann */ 181db3123b4SSiva Durga Prasad Paladugu switch (id) { 182db3123b4SSiva Durga Prasad Paladugu case IDCODE: 1830cba6abbSSoren Brinkmann regs.regs[0] = upper_32_bits(regs.regs[0]); 1840cba6abbSSoren Brinkmann regs.regs[0] &= ZYNQMP_CSU_IDCODE_DEVICE_CODE_MASK | 1850cba6abbSSoren Brinkmann ZYNQMP_CSU_IDCODE_SVD_MASK; 1860cba6abbSSoren Brinkmann regs.regs[0] >>= ZYNQMP_CSU_IDCODE_SVD_SHIFT; 187db3123b4SSiva Durga Prasad Paladugu val = regs.regs[0]; 188db3123b4SSiva Durga Prasad Paladugu break; 189db3123b4SSiva Durga Prasad Paladugu case VERSION: 190db3123b4SSiva Durga Prasad Paladugu regs.regs[1] = lower_32_bits(regs.regs[1]); 191db3123b4SSiva Durga Prasad Paladugu regs.regs[1] &= ZYNQMP_CSU_SILICON_VER_MASK; 192db3123b4SSiva Durga Prasad Paladugu val = regs.regs[1]; 193db3123b4SSiva Durga Prasad Paladugu break; 194494fffe7SMichal Simek case IDCODE2: 195494fffe7SMichal Simek regs.regs[1] = lower_32_bits(regs.regs[1]); 196494fffe7SMichal Simek regs.regs[1] >>= ZYNQMP_CSU_VERSION_EMPTY_SHIFT; 197494fffe7SMichal Simek val = regs.regs[1]; 198494fffe7SMichal Simek break; 199db3123b4SSiva Durga Prasad Paladugu default: 200db3123b4SSiva Durga Prasad Paladugu printf("%s, Invalid Req:0x%x\n", __func__, id); 201db3123b4SSiva Durga Prasad Paladugu } 20274ba69dbSSiva Durga Prasad Paladugu } else { 20374ba69dbSSiva Durga Prasad Paladugu switch (id) { 20474ba69dbSSiva Durga Prasad Paladugu case IDCODE: 20574ba69dbSSiva Durga Prasad Paladugu val = readl(ZYNQMP_CSU_IDCODE_ADDR); 20674ba69dbSSiva Durga Prasad Paladugu val &= ZYNQMP_CSU_IDCODE_DEVICE_CODE_MASK | 20774ba69dbSSiva Durga Prasad Paladugu ZYNQMP_CSU_IDCODE_SVD_MASK; 20874ba69dbSSiva Durga Prasad Paladugu val >>= ZYNQMP_CSU_IDCODE_SVD_SHIFT; 20974ba69dbSSiva Durga Prasad Paladugu break; 21074ba69dbSSiva Durga Prasad Paladugu case VERSION: 21174ba69dbSSiva Durga Prasad Paladugu val = readl(ZYNQMP_CSU_VER_ADDR); 21274ba69dbSSiva Durga Prasad Paladugu val &= ZYNQMP_CSU_SILICON_VER_MASK; 21374ba69dbSSiva Durga Prasad Paladugu break; 21474ba69dbSSiva Durga Prasad Paladugu default: 21574ba69dbSSiva Durga Prasad Paladugu printf("%s, Invalid Req:0x%x\n", __func__, id); 21674ba69dbSSiva Durga Prasad Paladugu } 21774ba69dbSSiva Durga Prasad Paladugu } 2180cba6abbSSoren Brinkmann 219db3123b4SSiva Durga Prasad Paladugu return val; 22047e60cbdSMichal Simek } 22147e60cbdSMichal Simek 22274ba69dbSSiva Durga Prasad Paladugu #if defined(CONFIG_FPGA) && defined(CONFIG_FPGA_ZYNQMPPL) && \ 22374ba69dbSSiva Durga Prasad Paladugu !defined(CONFIG_SPL_BUILD) 22447e60cbdSMichal Simek static char *zynqmp_get_silicon_idcode_name(void) 22547e60cbdSMichal Simek { 226494fffe7SMichal Simek u32 i, id, ver; 22747e60cbdSMichal Simek 228db3123b4SSiva Durga Prasad Paladugu id = chip_id(IDCODE); 229494fffe7SMichal Simek ver = chip_id(IDCODE2); 230494fffe7SMichal Simek 23147e60cbdSMichal Simek for (i = 0; i < ARRAY_SIZE(zynqmp_devices); i++) { 232494fffe7SMichal Simek if (zynqmp_devices[i].id == id && zynqmp_devices[i].ver == ver) 23347e60cbdSMichal Simek return zynqmp_devices[i].name; 23447e60cbdSMichal Simek } 23547e60cbdSMichal Simek return "unknown"; 23647e60cbdSMichal Simek } 23747e60cbdSMichal Simek #endif 23847e60cbdSMichal Simek 239fb4000e8SMichal Simek int board_early_init_f(void) 240fb4000e8SMichal Simek { 241f32e79f1SMichal Simek int ret = 0; 242fb4000e8SMichal Simek #if !defined(CONFIG_SPL_BUILD) && defined(CONFIG_CLK_ZYNQMP) 243fb4000e8SMichal Simek zynqmp_pmufw_version(); 244fb4000e8SMichal Simek #endif 24555de0929SMichal Simek 24688f05a92SMichal Simek #if defined(CONFIG_ZYNQMP_PSU_INIT_ENABLED) 247f32e79f1SMichal Simek ret = psu_init(); 24855de0929SMichal Simek #endif 24955de0929SMichal Simek 250f32e79f1SMichal Simek return ret; 251fb4000e8SMichal Simek } 252fb4000e8SMichal Simek 25347e60cbdSMichal Simek #define ZYNQMP_VERSION_SIZE 9 25447e60cbdSMichal Simek 25584c7204bSMichal Simek int board_init(void) 25684c7204bSMichal Simek { 257a0736efbSMichal Simek printf("EL Level:\tEL%d\n", current_el()); 258a0736efbSMichal Simek 25947e60cbdSMichal Simek #if defined(CONFIG_FPGA) && defined(CONFIG_FPGA_ZYNQMPPL) && \ 26047e60cbdSMichal Simek !defined(CONFIG_SPL_BUILD) || (defined(CONFIG_SPL_FPGA_SUPPORT) && \ 26147e60cbdSMichal Simek defined(CONFIG_SPL_BUILD)) 26247e60cbdSMichal Simek if (current_el() != 3) { 26347e60cbdSMichal Simek static char version[ZYNQMP_VERSION_SIZE]; 26447e60cbdSMichal Simek 2650fc9d848SMichal Simek strncat(version, "zu", 2); 26647e60cbdSMichal Simek zynqmppl.name = strncat(version, 26747e60cbdSMichal Simek zynqmp_get_silicon_idcode_name(), 2680fc9d848SMichal Simek ZYNQMP_VERSION_SIZE - 3); 26947e60cbdSMichal Simek printf("Chip ID:\t%s\n", zynqmppl.name); 27047e60cbdSMichal Simek fpga_init(); 27147e60cbdSMichal Simek fpga_add(fpga_xilinx, &zynqmppl); 27247e60cbdSMichal Simek } 27347e60cbdSMichal Simek #endif 27447e60cbdSMichal Simek 27584c7204bSMichal Simek return 0; 27684c7204bSMichal Simek } 27784c7204bSMichal Simek 27884c7204bSMichal Simek int board_early_init_r(void) 27984c7204bSMichal Simek { 28084c7204bSMichal Simek u32 val; 28184c7204bSMichal Simek 282ec60a279SSiva Durga Prasad Paladugu if (current_el() != 3) 283ec60a279SSiva Durga Prasad Paladugu return 0; 284ec60a279SSiva Durga Prasad Paladugu 28590a35db4SMichal Simek val = readl(&crlapb_base->timestamp_ref_ctrl); 28690a35db4SMichal Simek val &= ZYNQMP_CRL_APB_TIMESTAMP_REF_CTRL_CLKACT; 28790a35db4SMichal Simek 288ec60a279SSiva Durga Prasad Paladugu if (!val) { 28984c7204bSMichal Simek val = readl(&crlapb_base->timestamp_ref_ctrl); 29084c7204bSMichal Simek val |= ZYNQMP_CRL_APB_TIMESTAMP_REF_CTRL_CLKACT; 29184c7204bSMichal Simek writel(val, &crlapb_base->timestamp_ref_ctrl); 29284c7204bSMichal Simek 2930785dfd8SMichal Simek /* Program freq register in System counter */ 2940785dfd8SMichal Simek writel(zynqmp_get_system_timer_freq(), 2950785dfd8SMichal Simek &iou_scntr_secure->base_frequency_id_register); 2960785dfd8SMichal Simek /* And enable system counter */ 2970785dfd8SMichal Simek writel(ZYNQMP_IOU_SCNTR_COUNTER_CONTROL_REGISTER_EN, 2980785dfd8SMichal Simek &iou_scntr_secure->counter_control_register); 2990785dfd8SMichal Simek } 30084c7204bSMichal Simek return 0; 30184c7204bSMichal Simek } 30284c7204bSMichal Simek 3036919b4bfSMichal Simek int zynq_board_read_rom_ethaddr(unsigned char *ethaddr) 3046919b4bfSMichal Simek { 3056919b4bfSMichal Simek #if defined(CONFIG_ZYNQ_GEM_EEPROM_ADDR) && \ 3066919b4bfSMichal Simek defined(CONFIG_ZYNQ_GEM_I2C_MAC_OFFSET) && \ 3076919b4bfSMichal Simek defined(CONFIG_ZYNQ_EEPROM_BUS) 3086919b4bfSMichal Simek i2c_set_bus_num(CONFIG_ZYNQ_EEPROM_BUS); 3096919b4bfSMichal Simek 3106919b4bfSMichal Simek if (eeprom_read(CONFIG_ZYNQ_GEM_EEPROM_ADDR, 3116919b4bfSMichal Simek CONFIG_ZYNQ_GEM_I2C_MAC_OFFSET, 3126919b4bfSMichal Simek ethaddr, 6)) 3136919b4bfSMichal Simek printf("I2C EEPROM MAC address read failed\n"); 3146919b4bfSMichal Simek #endif 3156919b4bfSMichal Simek 3166919b4bfSMichal Simek return 0; 3176919b4bfSMichal Simek } 3186919b4bfSMichal Simek 319*51916864SNitin Jain unsigned long do_go_exec(ulong (*entry)(int, char * const []), int argc, 320*51916864SNitin Jain char * const argv[]) 321*51916864SNitin Jain { 322*51916864SNitin Jain int ret = 0; 323*51916864SNitin Jain 324*51916864SNitin Jain if (current_el() > 1) { 325*51916864SNitin Jain smp_kick_all_cpus(); 326*51916864SNitin Jain dcache_disable(); 327*51916864SNitin Jain armv8_switch_to_el1(0x0, 0, 0, 0, (unsigned long)entry, 328*51916864SNitin Jain ES_TO_AARCH64); 329*51916864SNitin Jain } else { 330*51916864SNitin Jain printf("FAIL: current EL is not above EL1\n"); 331*51916864SNitin Jain ret = EINVAL; 332*51916864SNitin Jain } 333*51916864SNitin Jain return ret; 334*51916864SNitin Jain } 335*51916864SNitin Jain 3368d59d7f6SMichal Simek #if !defined(CONFIG_SYS_SDRAM_BASE) && !defined(CONFIG_SYS_SDRAM_SIZE) 33776b00acaSSimon Glass int dram_init_banksize(void) 338361a8799STom Rini { 339da3f003bSMichal Simek return fdtdec_setup_memory_banksize(); 3408d59d7f6SMichal Simek } 3418d59d7f6SMichal Simek 3428d59d7f6SMichal Simek int dram_init(void) 3438d59d7f6SMichal Simek { 344950f86caSNathan Rossi if (fdtdec_setup_memory_size() != 0) 345950f86caSNathan Rossi return -EINVAL; 3468d59d7f6SMichal Simek 3478d59d7f6SMichal Simek return 0; 3488d59d7f6SMichal Simek } 3498d59d7f6SMichal Simek #else 35084c7204bSMichal Simek int dram_init(void) 35184c7204bSMichal Simek { 35284c7204bSMichal Simek gd->ram_size = CONFIG_SYS_SDRAM_SIZE; 35384c7204bSMichal Simek 35484c7204bSMichal Simek return 0; 35584c7204bSMichal Simek } 3568d59d7f6SMichal Simek #endif 35784c7204bSMichal Simek 35884c7204bSMichal Simek void reset_cpu(ulong addr) 35984c7204bSMichal Simek { 36084c7204bSMichal Simek } 36184c7204bSMichal Simek 36284c7204bSMichal Simek int board_late_init(void) 36384c7204bSMichal Simek { 36484c7204bSMichal Simek u32 reg = 0; 36584c7204bSMichal Simek u8 bootmode; 366b72894f1SMichal Simek const char *mode; 367b72894f1SMichal Simek char *new_targets; 36801c42d3dSSiva Durga Prasad Paladugu char *env_targets; 369d1db89f4SSiva Durga Prasad Paladugu int ret; 370b72894f1SMichal Simek 371b72894f1SMichal Simek if (!(gd->flags & GD_FLG_ENV_DEFAULT)) { 372b72894f1SMichal Simek debug("Saved variables - Skipping\n"); 373b72894f1SMichal Simek return 0; 374b72894f1SMichal Simek } 37584c7204bSMichal Simek 376d1db89f4SSiva Durga Prasad Paladugu ret = zynqmp_mmio_read((ulong)&crlapb_base->boot_mode, ®); 377d1db89f4SSiva Durga Prasad Paladugu if (ret) 378d1db89f4SSiva Durga Prasad Paladugu return -EINVAL; 379d1db89f4SSiva Durga Prasad Paladugu 38047359a03SMichal Simek if (reg >> BOOT_MODE_ALT_SHIFT) 38147359a03SMichal Simek reg >>= BOOT_MODE_ALT_SHIFT; 38247359a03SMichal Simek 38384c7204bSMichal Simek bootmode = reg & BOOT_MODES_MASK; 38484c7204bSMichal Simek 385fb90917cSMichal Simek puts("Bootmode: "); 38684c7204bSMichal Simek switch (bootmode) { 387d58fc12eSMichal Simek case USB_MODE: 388d58fc12eSMichal Simek puts("USB_MODE\n"); 389d58fc12eSMichal Simek mode = "usb"; 39007656ba5SMichal Simek env_set("modeboot", "usb_dfu_spl"); 391d58fc12eSMichal Simek break; 3920a5bcc8cSSiva Durga Prasad Paladugu case JTAG_MODE: 393fb90917cSMichal Simek puts("JTAG_MODE\n"); 394b72894f1SMichal Simek mode = "pxe dhcp"; 39507656ba5SMichal Simek env_set("modeboot", "jtagboot"); 3960a5bcc8cSSiva Durga Prasad Paladugu break; 3970a5bcc8cSSiva Durga Prasad Paladugu case QSPI_MODE_24BIT: 3980a5bcc8cSSiva Durga Prasad Paladugu case QSPI_MODE_32BIT: 399b72894f1SMichal Simek mode = "qspi0"; 400fb90917cSMichal Simek puts("QSPI_MODE\n"); 40107656ba5SMichal Simek env_set("modeboot", "qspiboot"); 4020a5bcc8cSSiva Durga Prasad Paladugu break; 40339c56f55SMichal Simek case EMMC_MODE: 40478678feeSMichal Simek puts("EMMC_MODE\n"); 405b72894f1SMichal Simek mode = "mmc0"; 40607656ba5SMichal Simek env_set("modeboot", "emmcboot"); 40778678feeSMichal Simek break; 40878678feeSMichal Simek case SD_MODE: 409fb90917cSMichal Simek puts("SD_MODE\n"); 410b72894f1SMichal Simek mode = "mmc0"; 41107656ba5SMichal Simek env_set("modeboot", "sdboot"); 41284c7204bSMichal Simek break; 413e1992276SSiva Durga Prasad Paladugu case SD1_LSHFT_MODE: 414e1992276SSiva Durga Prasad Paladugu puts("LVL_SHFT_"); 415e1992276SSiva Durga Prasad Paladugu /* fall through */ 416af813acdSMichal Simek case SD_MODE1: 417fb90917cSMichal Simek puts("SD_MODE1\n"); 4182d9925bcSMichal Simek #if defined(CONFIG_ZYNQ_SDHCI0) && defined(CONFIG_ZYNQ_SDHCI1) 419b72894f1SMichal Simek mode = "mmc1"; 42007656ba5SMichal Simek env_set("sdbootdev", "1"); 421b72894f1SMichal Simek #else 422b72894f1SMichal Simek mode = "mmc0"; 4232d9925bcSMichal Simek #endif 42407656ba5SMichal Simek env_set("modeboot", "sdboot"); 425af813acdSMichal Simek break; 426af813acdSMichal Simek case NAND_MODE: 427fb90917cSMichal Simek puts("NAND_MODE\n"); 428b72894f1SMichal Simek mode = "nand0"; 42907656ba5SMichal Simek env_set("modeboot", "nandboot"); 430af813acdSMichal Simek break; 43184c7204bSMichal Simek default: 432b72894f1SMichal Simek mode = ""; 43384c7204bSMichal Simek printf("Invalid Boot Mode:0x%x\n", bootmode); 43484c7204bSMichal Simek break; 43584c7204bSMichal Simek } 43684c7204bSMichal Simek 437b72894f1SMichal Simek /* 438b72894f1SMichal Simek * One terminating char + one byte for space between mode 439b72894f1SMichal Simek * and default boot_targets 440b72894f1SMichal Simek */ 44101c42d3dSSiva Durga Prasad Paladugu env_targets = env_get("boot_targets"); 44201c42d3dSSiva Durga Prasad Paladugu if (env_targets) { 443b72894f1SMichal Simek new_targets = calloc(1, strlen(mode) + 44401c42d3dSSiva Durga Prasad Paladugu strlen(env_targets) + 2); 44501c42d3dSSiva Durga Prasad Paladugu sprintf(new_targets, "%s %s", mode, env_targets); 44601c42d3dSSiva Durga Prasad Paladugu } else { 44701c42d3dSSiva Durga Prasad Paladugu new_targets = calloc(1, strlen(mode) + 2); 44801c42d3dSSiva Durga Prasad Paladugu sprintf(new_targets, "%s", mode); 44901c42d3dSSiva Durga Prasad Paladugu } 450b72894f1SMichal Simek 451382bee57SSimon Glass env_set("boot_targets", new_targets); 452b72894f1SMichal Simek 45384c7204bSMichal Simek return 0; 45484c7204bSMichal Simek } 45584696ff5SSiva Durga Prasad Paladugu 45684696ff5SSiva Durga Prasad Paladugu int checkboard(void) 45784696ff5SSiva Durga Prasad Paladugu { 4585af08556SMichal Simek puts("Board: Xilinx ZynqMP\n"); 45984696ff5SSiva Durga Prasad Paladugu return 0; 46084696ff5SSiva Durga Prasad Paladugu } 46116fa00a7SSiva Durga Prasad Paladugu 46216fa00a7SSiva Durga Prasad Paladugu #ifdef CONFIG_USB_DWC3 463275bd6d1SMichal Simek static struct dwc3_device dwc3_device_data0 = { 46416fa00a7SSiva Durga Prasad Paladugu .maximum_speed = USB_SPEED_HIGH, 46516fa00a7SSiva Durga Prasad Paladugu .base = ZYNQMP_USB0_XHCI_BASEADDR, 46616fa00a7SSiva Durga Prasad Paladugu .dr_mode = USB_DR_MODE_PERIPHERAL, 46716fa00a7SSiva Durga Prasad Paladugu .index = 0, 46816fa00a7SSiva Durga Prasad Paladugu }; 46916fa00a7SSiva Durga Prasad Paladugu 470275bd6d1SMichal Simek static struct dwc3_device dwc3_device_data1 = { 471275bd6d1SMichal Simek .maximum_speed = USB_SPEED_HIGH, 472275bd6d1SMichal Simek .base = ZYNQMP_USB1_XHCI_BASEADDR, 473275bd6d1SMichal Simek .dr_mode = USB_DR_MODE_PERIPHERAL, 474275bd6d1SMichal Simek .index = 1, 475275bd6d1SMichal Simek }; 476275bd6d1SMichal Simek 4779feff385SMichal Simek int usb_gadget_handle_interrupts(int index) 47816fa00a7SSiva Durga Prasad Paladugu { 4799feff385SMichal Simek dwc3_uboot_handle_interrupt(index); 48016fa00a7SSiva Durga Prasad Paladugu return 0; 48116fa00a7SSiva Durga Prasad Paladugu } 48216fa00a7SSiva Durga Prasad Paladugu 48316fa00a7SSiva Durga Prasad Paladugu int board_usb_init(int index, enum usb_init_type init) 48416fa00a7SSiva Durga Prasad Paladugu { 485275bd6d1SMichal Simek debug("%s: index %x\n", __func__, index); 486275bd6d1SMichal Simek 4878ecd50c8SMichal Simek #if defined(CONFIG_USB_GADGET_DOWNLOAD) 4888ecd50c8SMichal Simek g_dnl_set_serialnumber(CONFIG_SYS_CONFIG_NAME); 4898ecd50c8SMichal Simek #endif 4908ecd50c8SMichal Simek 491275bd6d1SMichal Simek switch (index) { 492275bd6d1SMichal Simek case 0: 493275bd6d1SMichal Simek return dwc3_uboot_init(&dwc3_device_data0); 494275bd6d1SMichal Simek case 1: 495275bd6d1SMichal Simek return dwc3_uboot_init(&dwc3_device_data1); 496275bd6d1SMichal Simek }; 497275bd6d1SMichal Simek 498275bd6d1SMichal Simek return -1; 49916fa00a7SSiva Durga Prasad Paladugu } 50016fa00a7SSiva Durga Prasad Paladugu 50116fa00a7SSiva Durga Prasad Paladugu int board_usb_cleanup(int index, enum usb_init_type init) 50216fa00a7SSiva Durga Prasad Paladugu { 50316fa00a7SSiva Durga Prasad Paladugu dwc3_uboot_exit(index); 50416fa00a7SSiva Durga Prasad Paladugu return 0; 50516fa00a7SSiva Durga Prasad Paladugu } 50616fa00a7SSiva Durga Prasad Paladugu #endif 507