xref: /rk3399_rockchip-uboot/board/xilinx/zynq/board.c (revision 382bee57f19b4454e2015bc19a010bc2d0ab9337)
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