xref: /rk3399_rockchip-uboot/board/freescale/t4qds/spl.c (revision 203e94f6c9ca03e260175ce240f5856507395585)
1b6036993SShaohui Xie /* Copyright 2014 Freescale Semiconductor, Inc.
2b6036993SShaohui Xie  *
3b6036993SShaohui Xie  * SPDX-License-Identifier:    GPL-2.0+
4b6036993SShaohui Xie  */
5b6036993SShaohui Xie 
6b6036993SShaohui Xie #include <common.h>
724b852a7SSimon Glass #include <console.h>
8*203e94f6SSimon Glass #include <environment.h>
9b6036993SShaohui Xie #include <asm/spl.h>
10b6036993SShaohui Xie #include <malloc.h>
11b6036993SShaohui Xie #include <ns16550.h>
12b6036993SShaohui Xie #include <nand.h>
13b6036993SShaohui Xie #include <mmc.h>
14b6036993SShaohui Xie #include <fsl_esdhc.h>
15b6036993SShaohui Xie #include <i2c.h>
16b6036993SShaohui Xie #include "../common/qixis.h"
17b6036993SShaohui Xie #include "t4240qds_qixis.h"
18b6036993SShaohui Xie 
19b6036993SShaohui Xie #define FSL_CORENET_CCSR_PORSR1_RCW_MASK	0xFF800000
20b6036993SShaohui Xie 
21b6036993SShaohui Xie DECLARE_GLOBAL_DATA_PTR;
22b6036993SShaohui Xie 
get_effective_memsize(void)23b6036993SShaohui Xie phys_size_t get_effective_memsize(void)
24b6036993SShaohui Xie {
25b6036993SShaohui Xie 	return CONFIG_SYS_L3_SIZE;
26b6036993SShaohui Xie }
27b6036993SShaohui Xie 
get_board_sys_clk(void)28b6036993SShaohui Xie unsigned long get_board_sys_clk(void)
29b6036993SShaohui Xie {
30b6036993SShaohui Xie 	u8 sysclk_conf = QIXIS_READ(brdcfg[1]);
31b6036993SShaohui Xie 
32b6036993SShaohui Xie 	switch (sysclk_conf & 0x0F) {
33b6036993SShaohui Xie 	case QIXIS_SYSCLK_83:
34b6036993SShaohui Xie 		return 83333333;
35b6036993SShaohui Xie 	case QIXIS_SYSCLK_100:
36b6036993SShaohui Xie 		return 100000000;
37b6036993SShaohui Xie 	case QIXIS_SYSCLK_125:
38b6036993SShaohui Xie 		return 125000000;
39b6036993SShaohui Xie 	case QIXIS_SYSCLK_133:
40b6036993SShaohui Xie 		return 133333333;
41b6036993SShaohui Xie 	case QIXIS_SYSCLK_150:
42b6036993SShaohui Xie 		return 150000000;
43b6036993SShaohui Xie 	case QIXIS_SYSCLK_160:
44b6036993SShaohui Xie 		return 160000000;
45b6036993SShaohui Xie 	case QIXIS_SYSCLK_166:
46b6036993SShaohui Xie 		return 166666666;
47b6036993SShaohui Xie 	}
48b6036993SShaohui Xie 	return 66666666;
49b6036993SShaohui Xie }
50b6036993SShaohui Xie 
get_board_ddr_clk(void)51b6036993SShaohui Xie unsigned long get_board_ddr_clk(void)
52b6036993SShaohui Xie {
53b6036993SShaohui Xie 	u8 ddrclk_conf = QIXIS_READ(brdcfg[1]);
54b6036993SShaohui Xie 
55b6036993SShaohui Xie 	switch ((ddrclk_conf & 0x30) >> 4) {
56b6036993SShaohui Xie 	case QIXIS_DDRCLK_100:
57b6036993SShaohui Xie 		return 100000000;
58b6036993SShaohui Xie 	case QIXIS_DDRCLK_125:
59b6036993SShaohui Xie 		return 125000000;
60b6036993SShaohui Xie 	case QIXIS_DDRCLK_133:
61b6036993SShaohui Xie 		return 133333333;
62b6036993SShaohui Xie 	}
63b6036993SShaohui Xie 	return 66666666;
64b6036993SShaohui Xie }
65b6036993SShaohui Xie 
board_init_f(ulong bootflag)66b6036993SShaohui Xie void board_init_f(ulong bootflag)
67b6036993SShaohui Xie {
68b6036993SShaohui Xie 	u32 plat_ratio, sys_clk, ccb_clk;
69b6036993SShaohui Xie 	ccsr_gur_t *gur = (void *)CONFIG_SYS_MPC85xx_GUTS_ADDR;
70b6036993SShaohui Xie #ifdef CONFIG_SPL_NAND_BOOT
71b6036993SShaohui Xie 	u32 porsr1, pinctl;
72b6036993SShaohui Xie #endif
73b6036993SShaohui Xie 
74b6036993SShaohui Xie #ifdef CONFIG_SPL_NAND_BOOT
75b6036993SShaohui Xie 	porsr1 = in_be32(&gur->porsr1);
76b6036993SShaohui Xie 	pinctl = ((porsr1 & ~(FSL_CORENET_CCSR_PORSR1_RCW_MASK)) | 0x24800000);
77b6036993SShaohui Xie 	out_be32((unsigned int *)(CONFIG_SYS_DCSRBAR + 0x20000), pinctl);
78b6036993SShaohui Xie #endif
79b6036993SShaohui Xie 	/* Memcpy existing GD at CONFIG_SPL_GD_ADDR */
80b6036993SShaohui Xie 	memcpy((void *)CONFIG_SPL_GD_ADDR, (void *)gd, sizeof(gd_t));
81b6036993SShaohui Xie 
82b6036993SShaohui Xie 	/* Update GD pointer */
83b6036993SShaohui Xie 	gd = (gd_t *)(CONFIG_SPL_GD_ADDR);
84b6036993SShaohui Xie 
85b6036993SShaohui Xie 	/* compiler optimization barrier needed for GCC >= 3.4 */
86b6036993SShaohui Xie 	__asm__ __volatile__("" : : : "memory");
87b6036993SShaohui Xie 
88b6036993SShaohui Xie 	console_init_f();
89b6036993SShaohui Xie 
90b6036993SShaohui Xie 	/* initialize selected port with appropriate baud rate */
91b6036993SShaohui Xie 	sys_clk = get_board_sys_clk();
92b6036993SShaohui Xie 	plat_ratio = (in_be32(&gur->rcwsr[0]) >> 25) & 0x1f;
93b6036993SShaohui Xie 	ccb_clk = sys_clk * plat_ratio / 2;
94b6036993SShaohui Xie 
95b6036993SShaohui Xie 	NS16550_init((NS16550_t)CONFIG_SYS_NS16550_COM1,
96b6036993SShaohui Xie 		     ccb_clk / 16 / CONFIG_BAUDRATE);
97b6036993SShaohui Xie 
98b6036993SShaohui Xie #ifdef CONFIG_SPL_MMC_BOOT
99b6036993SShaohui Xie 	puts("\nSD boot...\n");
100b6036993SShaohui Xie #elif defined(CONFIG_SPL_NAND_BOOT)
101b6036993SShaohui Xie 	puts("\nNAND boot...\n");
102b6036993SShaohui Xie #endif
103b6036993SShaohui Xie 	relocate_code(CONFIG_SPL_RELOC_STACK, (gd_t *)CONFIG_SPL_GD_ADDR, 0x0);
104b6036993SShaohui Xie }
105b6036993SShaohui Xie 
board_init_r(gd_t * gd,ulong dest_addr)106b6036993SShaohui Xie void board_init_r(gd_t *gd, ulong dest_addr)
107b6036993SShaohui Xie {
108b6036993SShaohui Xie 	bd_t *bd;
109b6036993SShaohui Xie 
110b6036993SShaohui Xie 	bd = (bd_t *)(gd + sizeof(gd_t));
111b6036993SShaohui Xie 	memset(bd, 0, sizeof(bd_t));
112b6036993SShaohui Xie 	gd->bd = bd;
113b6036993SShaohui Xie 	bd->bi_memstart = CONFIG_SYS_INIT_L3_ADDR;
114b6036993SShaohui Xie 	bd->bi_memsize = CONFIG_SYS_L3_SIZE;
115b6036993SShaohui Xie 
116cbcbf71bSSimon Glass 	arch_cpu_init();
117b6036993SShaohui Xie 	get_clocks();
118b6036993SShaohui Xie 	mem_malloc_init(CONFIG_SPL_RELOC_MALLOC_ADDR,
119b6036993SShaohui Xie 			CONFIG_SPL_RELOC_MALLOC_SIZE);
120ed4708aaSSumit Garg 	gd->flags |= GD_FLG_FULL_MALLOC_INIT;
121b6036993SShaohui Xie 
122b6036993SShaohui Xie #ifdef CONFIG_SPL_NAND_BOOT
123b6036993SShaohui Xie 	nand_spl_load_image(CONFIG_ENV_OFFSET, CONFIG_ENV_SIZE,
124b6036993SShaohui Xie 			    (uchar *)CONFIG_ENV_ADDR);
125b6036993SShaohui Xie #endif
126b6036993SShaohui Xie #ifdef CONFIG_SPL_MMC_BOOT
127b6036993SShaohui Xie 	mmc_initialize(bd);
128b6036993SShaohui Xie 	mmc_spl_load_image(CONFIG_ENV_OFFSET, CONFIG_ENV_SIZE,
129b6036993SShaohui Xie 			   (uchar *)CONFIG_ENV_ADDR);
130b6036993SShaohui Xie #endif
131b6036993SShaohui Xie 
132b6036993SShaohui Xie 	gd->env_addr  = (ulong)(CONFIG_ENV_ADDR);
133*203e94f6SSimon Glass 	gd->env_valid = ENV_VALID;
134b6036993SShaohui Xie 
135b6036993SShaohui Xie 	i2c_init_all();
136b6036993SShaohui Xie 
137f1683aa7SSimon Glass 	dram_init();
138b6036993SShaohui Xie 
139b6036993SShaohui Xie #ifdef CONFIG_SPL_MMC_BOOT
140b6036993SShaohui Xie 	mmc_boot();
141b6036993SShaohui Xie #elif defined(CONFIG_SPL_NAND_BOOT)
142b6036993SShaohui Xie 	nand_boot();
143b6036993SShaohui Xie #endif
144b6036993SShaohui Xie }
145