1f22651cfSMichal Simek /*
2f22651cfSMichal Simek * (C) Copyright 2012 Michal Simek <monstr@monstr.eu>
3f22651cfSMichal Simek *
41a459660SWolfgang Denk * SPDX-License-Identifier: GPL-2.0+
5f22651cfSMichal Simek */
6f22651cfSMichal Simek
7f22651cfSMichal Simek #include <common.h>
89e0e37acSMichal Simek #include <fdtdec.h>
95b73caffSMichal Simek #include <fpga.h>
105b73caffSMichal Simek #include <mmc.h>
11d5dae85fSMichal Simek #include <zynqpl.h>
127193653eSMichal Simek #include <asm/arch/hardware.h>
137193653eSMichal Simek #include <asm/arch/sys_proto.h>
14f22651cfSMichal Simek
15f22651cfSMichal Simek DECLARE_GLOBAL_DATA_PTR;
16f22651cfSMichal Simek
170b680206SMichal Simek #if (defined(CONFIG_FPGA) && !defined(CONFIG_SPL_BUILD)) || \
180b680206SMichal Simek (defined(CONFIG_SPL_FPGA_SUPPORT) && defined(CONFIG_SPL_BUILD))
195b73caffSMichal Simek static xilinx_desc fpga;
20d5dae85fSMichal Simek
21d5dae85fSMichal Simek /* It can be done differently */
2205c59d0bSMichal Simek static xilinx_desc fpga007s = XILINX_XC7Z007S_DESC(0x7);
235b73caffSMichal Simek static xilinx_desc fpga010 = XILINX_XC7Z010_DESC(0x10);
2405c59d0bSMichal Simek static xilinx_desc fpga012s = XILINX_XC7Z012S_DESC(0x12);
2505c59d0bSMichal Simek static xilinx_desc fpga014s = XILINX_XC7Z014S_DESC(0x14);
265b73caffSMichal Simek static xilinx_desc fpga015 = XILINX_XC7Z015_DESC(0x15);
275b73caffSMichal Simek static xilinx_desc fpga020 = XILINX_XC7Z020_DESC(0x20);
285b73caffSMichal Simek static xilinx_desc fpga030 = XILINX_XC7Z030_DESC(0x30);
29b9103809SSiva Durga Prasad Paladugu static xilinx_desc fpga035 = XILINX_XC7Z035_DESC(0x35);
305b73caffSMichal Simek static xilinx_desc fpga045 = XILINX_XC7Z045_DESC(0x45);
315b73caffSMichal Simek static xilinx_desc fpga100 = XILINX_XC7Z100_DESC(0x100);
32d5dae85fSMichal Simek #endif
33d5dae85fSMichal Simek
board_init(void)34f22651cfSMichal Simek int board_init(void)
35f22651cfSMichal Simek {
360b680206SMichal Simek #if (defined(CONFIG_FPGA) && !defined(CONFIG_SPL_BUILD)) || \
370b680206SMichal Simek (defined(CONFIG_SPL_FPGA_SUPPORT) && defined(CONFIG_SPL_BUILD))
38d5dae85fSMichal Simek u32 idcode;
39d5dae85fSMichal Simek
40d5dae85fSMichal Simek idcode = zynq_slcr_get_idcode();
41d5dae85fSMichal Simek
42d5dae85fSMichal Simek switch (idcode) {
4305c59d0bSMichal Simek case XILINX_ZYNQ_7007S:
4405c59d0bSMichal Simek fpga = fpga007s;
4505c59d0bSMichal Simek break;
46d5dae85fSMichal Simek case XILINX_ZYNQ_7010:
47d5dae85fSMichal Simek fpga = fpga010;
48d5dae85fSMichal Simek break;
4905c59d0bSMichal Simek case XILINX_ZYNQ_7012S:
5005c59d0bSMichal Simek fpga = fpga012s;
5105c59d0bSMichal Simek break;
5205c59d0bSMichal Simek case XILINX_ZYNQ_7014S:
5305c59d0bSMichal Simek fpga = fpga014s;
5405c59d0bSMichal Simek break;
5531993d6aSMichal Simek case XILINX_ZYNQ_7015:
5631993d6aSMichal Simek fpga = fpga015;
5731993d6aSMichal Simek break;
58d5dae85fSMichal Simek case XILINX_ZYNQ_7020:
59d5dae85fSMichal Simek fpga = fpga020;
60d5dae85fSMichal Simek break;
61d5dae85fSMichal Simek case XILINX_ZYNQ_7030:
62d5dae85fSMichal Simek fpga = fpga030;
63d5dae85fSMichal Simek break;
64b9103809SSiva Durga Prasad Paladugu case XILINX_ZYNQ_7035:
65b9103809SSiva Durga Prasad Paladugu fpga = fpga035;
66b9103809SSiva Durga Prasad Paladugu break;
67d5dae85fSMichal Simek case XILINX_ZYNQ_7045:
68d5dae85fSMichal Simek fpga = fpga045;
69d5dae85fSMichal Simek break;
70fd2b10b6SMichal Simek case XILINX_ZYNQ_7100:
71fd2b10b6SMichal Simek fpga = fpga100;
72fd2b10b6SMichal Simek break;
73d5dae85fSMichal Simek }
74d5dae85fSMichal Simek #endif
75d5dae85fSMichal Simek
760b680206SMichal Simek #if (defined(CONFIG_FPGA) && !defined(CONFIG_SPL_BUILD)) || \
770b680206SMichal Simek (defined(CONFIG_SPL_FPGA_SUPPORT) && defined(CONFIG_SPL_BUILD))
78d5dae85fSMichal Simek fpga_init();
79d5dae85fSMichal Simek fpga_add(fpga_xilinx, &fpga);
80d5dae85fSMichal Simek #endif
81d5dae85fSMichal Simek
82f22651cfSMichal Simek return 0;
83f22651cfSMichal Simek }
84f22651cfSMichal Simek
board_late_init(void)85b3de9249SJagannadha Sutradharudu Teki int board_late_init(void)
86b3de9249SJagannadha Sutradharudu Teki {
87b3de9249SJagannadha Sutradharudu Teki switch ((zynq_slcr_get_boot_mode()) & ZYNQ_BM_MASK) {
88085b2b82SMichal Simek case ZYNQ_BM_QSPI:
89*382bee57SSimon Glass env_set("modeboot", "qspiboot");
90085b2b82SMichal Simek break;
91085b2b82SMichal Simek case ZYNQ_BM_NAND:
92*382bee57SSimon Glass env_set("modeboot", "nandboot");
93085b2b82SMichal Simek break;
94b3de9249SJagannadha Sutradharudu Teki case ZYNQ_BM_NOR:
95*382bee57SSimon Glass env_set("modeboot", "norboot");
96b3de9249SJagannadha Sutradharudu Teki break;
97b3de9249SJagannadha Sutradharudu Teki case ZYNQ_BM_SD:
98*382bee57SSimon Glass env_set("modeboot", "sdboot");
99b3de9249SJagannadha Sutradharudu Teki break;
100b3de9249SJagannadha Sutradharudu Teki case ZYNQ_BM_JTAG:
101*382bee57SSimon Glass env_set("modeboot", "jtagboot");
102b3de9249SJagannadha Sutradharudu Teki break;
103b3de9249SJagannadha Sutradharudu Teki default:
104*382bee57SSimon Glass env_set("modeboot", "");
105b3de9249SJagannadha Sutradharudu Teki break;
106b3de9249SJagannadha Sutradharudu Teki }
107b3de9249SJagannadha Sutradharudu Teki
108b3de9249SJagannadha Sutradharudu Teki return 0;
109b3de9249SJagannadha Sutradharudu Teki }
110f22651cfSMichal Simek
1115a82d53cSMichal Simek #ifdef CONFIG_DISPLAY_BOARDINFO
checkboard(void)1125a82d53cSMichal Simek int checkboard(void)
1135a82d53cSMichal Simek {
1145af08556SMichal Simek puts("Board: Xilinx Zynq\n");
1155a82d53cSMichal Simek return 0;
1165a82d53cSMichal Simek }
1175a82d53cSMichal Simek #endif
1185a82d53cSMichal Simek
zynq_board_read_rom_ethaddr(unsigned char * ethaddr)119a509a1d4SJoe Hershberger int zynq_board_read_rom_ethaddr(unsigned char *ethaddr)
120a509a1d4SJoe Hershberger {
121a509a1d4SJoe Hershberger #if defined(CONFIG_ZYNQ_GEM_EEPROM_ADDR) && \
122a509a1d4SJoe Hershberger defined(CONFIG_ZYNQ_GEM_I2C_MAC_OFFSET)
123a509a1d4SJoe Hershberger if (eeprom_read(CONFIG_ZYNQ_GEM_EEPROM_ADDR,
124a509a1d4SJoe Hershberger CONFIG_ZYNQ_GEM_I2C_MAC_OFFSET,
125a509a1d4SJoe Hershberger ethaddr, 6))
126a509a1d4SJoe Hershberger printf("I2C EEPROM MAC address read failed\n");
127a509a1d4SJoe Hershberger #endif
128a509a1d4SJoe Hershberger
129a509a1d4SJoe Hershberger return 0;
130a509a1d4SJoe Hershberger }
131a509a1d4SJoe Hershberger
132758f29d0SMichal Simek #if !defined(CONFIG_SYS_SDRAM_BASE) && !defined(CONFIG_SYS_SDRAM_SIZE)
dram_init_banksize(void)13376b00acaSSimon Glass int dram_init_banksize(void)
134361a8799STom Rini {
135de9bf1b5SNathan Rossi fdtdec_setup_memory_banksize();
13676b00acaSSimon Glass
13776b00acaSSimon Glass return 0;
138758f29d0SMichal Simek }
139758f29d0SMichal Simek
dram_init(void)1408a5db0abSMichal Simek int dram_init(void)
1418a5db0abSMichal Simek {
142de9bf1b5SNathan Rossi if (fdtdec_setup_memory_size() != 0)
143de9bf1b5SNathan Rossi return -EINVAL;
1448a5db0abSMichal Simek
1458a5db0abSMichal Simek zynq_ddrc_init();
1468a5db0abSMichal Simek
1478a5db0abSMichal Simek return 0;
1488a5db0abSMichal Simek }
149758f29d0SMichal Simek #else
dram_init(void)150758f29d0SMichal Simek int dram_init(void)
151758f29d0SMichal Simek {
152758f29d0SMichal Simek gd->ram_size = CONFIG_SYS_SDRAM_SIZE;
153758f29d0SMichal Simek
154758f29d0SMichal Simek zynq_ddrc_init();
155758f29d0SMichal Simek
156758f29d0SMichal Simek return 0;
157758f29d0SMichal Simek }
158758f29d0SMichal Simek #endif
159