xref: /rk3399_rockchip-uboot/board/liebherr/display5/spl.c (revision f1ba13f8e2acf648740a4a8a3594509a3e16b3aa)
1*f1ba13f8SMasahiro Yamada /*
2*f1ba13f8SMasahiro Yamada  * Copyright (C) 2017 DENX Software Engineering
3*f1ba13f8SMasahiro Yamada  * Lukasz Majewski, DENX Software Engineering, lukma@denx.de
4*f1ba13f8SMasahiro Yamada  *
5*f1ba13f8SMasahiro Yamada  * SPDX-License-Identifier:	GPL-2.0+
6*f1ba13f8SMasahiro Yamada  */
7*f1ba13f8SMasahiro Yamada 
8*f1ba13f8SMasahiro Yamada #include <common.h>
9*f1ba13f8SMasahiro Yamada #include <spl.h>
10*f1ba13f8SMasahiro Yamada #include <linux/libfdt.h>
11*f1ba13f8SMasahiro Yamada #include <asm/io.h>
12*f1ba13f8SMasahiro Yamada #include <asm/arch/clock.h>
13*f1ba13f8SMasahiro Yamada #include <asm/arch/mx6-ddr.h>
14*f1ba13f8SMasahiro Yamada #include <asm/arch/mx6-pins.h>
15*f1ba13f8SMasahiro Yamada #include "asm/arch/crm_regs.h"
16*f1ba13f8SMasahiro Yamada #include <asm/arch/sys_proto.h>
17*f1ba13f8SMasahiro Yamada #include <asm/arch/imx-regs.h>
18*f1ba13f8SMasahiro Yamada #include "asm/arch/iomux.h"
19*f1ba13f8SMasahiro Yamada #include <asm/mach-imx/iomux-v3.h>
20*f1ba13f8SMasahiro Yamada #include <environment.h>
21*f1ba13f8SMasahiro Yamada #include <fsl_esdhc.h>
22*f1ba13f8SMasahiro Yamada #include <netdev.h>
23*f1ba13f8SMasahiro Yamada #include "common.h"
24*f1ba13f8SMasahiro Yamada 
25*f1ba13f8SMasahiro Yamada DECLARE_GLOBAL_DATA_PTR;
26*f1ba13f8SMasahiro Yamada 
27*f1ba13f8SMasahiro Yamada static const struct mx6dq_iomux_ddr_regs mx6_ddr_ioregs = {
28*f1ba13f8SMasahiro Yamada 	.dram_sdclk_0 = 0x00000030,
29*f1ba13f8SMasahiro Yamada 	.dram_sdclk_1 = 0x00000030,
30*f1ba13f8SMasahiro Yamada 	.dram_cas = 0x00000030,
31*f1ba13f8SMasahiro Yamada 	.dram_ras = 0x00000030,
32*f1ba13f8SMasahiro Yamada 	.dram_reset = 0x00000030,
33*f1ba13f8SMasahiro Yamada 	.dram_sdcke0 = 0x00003000,
34*f1ba13f8SMasahiro Yamada 	.dram_sdcke1 = 0x00003000,
35*f1ba13f8SMasahiro Yamada 	.dram_sdba2 = 0x00000000,
36*f1ba13f8SMasahiro Yamada 	.dram_sdodt0 = 0x00000030,
37*f1ba13f8SMasahiro Yamada 	.dram_sdodt1 = 0x00000030,
38*f1ba13f8SMasahiro Yamada 
39*f1ba13f8SMasahiro Yamada 	.dram_sdqs0 = 0x00000030,
40*f1ba13f8SMasahiro Yamada 	.dram_sdqs1 = 0x00000030,
41*f1ba13f8SMasahiro Yamada 	.dram_sdqs2 = 0x00000030,
42*f1ba13f8SMasahiro Yamada 	.dram_sdqs3 = 0x00000030,
43*f1ba13f8SMasahiro Yamada 	.dram_sdqs4 = 0x00000030,
44*f1ba13f8SMasahiro Yamada 	.dram_sdqs5 = 0x00000030,
45*f1ba13f8SMasahiro Yamada 	.dram_sdqs6 = 0x00000030,
46*f1ba13f8SMasahiro Yamada 	.dram_sdqs7 = 0x00000030,
47*f1ba13f8SMasahiro Yamada 
48*f1ba13f8SMasahiro Yamada 	.dram_dqm0 = 0x00000030,
49*f1ba13f8SMasahiro Yamada 	.dram_dqm1 = 0x00000030,
50*f1ba13f8SMasahiro Yamada 	.dram_dqm2 = 0x00000030,
51*f1ba13f8SMasahiro Yamada 	.dram_dqm3 = 0x00000030,
52*f1ba13f8SMasahiro Yamada 	.dram_dqm4 = 0x00000030,
53*f1ba13f8SMasahiro Yamada 	.dram_dqm5 = 0x00000030,
54*f1ba13f8SMasahiro Yamada 	.dram_dqm6 = 0x00000030,
55*f1ba13f8SMasahiro Yamada 	.dram_dqm7 = 0x00000030,
56*f1ba13f8SMasahiro Yamada };
57*f1ba13f8SMasahiro Yamada 
58*f1ba13f8SMasahiro Yamada static const struct mx6dq_iomux_grp_regs mx6_grp_ioregs = {
59*f1ba13f8SMasahiro Yamada 	.grp_ddr_type = 0x000c0000,
60*f1ba13f8SMasahiro Yamada 	.grp_ddrmode_ctl = 0x00020000,
61*f1ba13f8SMasahiro Yamada 	.grp_ddrpke = 0x00000000,
62*f1ba13f8SMasahiro Yamada 	.grp_addds = 0x00000030,
63*f1ba13f8SMasahiro Yamada 	.grp_ctlds = 0x00000030,
64*f1ba13f8SMasahiro Yamada 	.grp_ddrmode = 0x00020000,
65*f1ba13f8SMasahiro Yamada 	.grp_b0ds = 0x00000030,
66*f1ba13f8SMasahiro Yamada 	.grp_b1ds = 0x00000030,
67*f1ba13f8SMasahiro Yamada 	.grp_b2ds = 0x00000030,
68*f1ba13f8SMasahiro Yamada 	.grp_b3ds = 0x00000030,
69*f1ba13f8SMasahiro Yamada 	.grp_b4ds = 0x00000030,
70*f1ba13f8SMasahiro Yamada 	.grp_b5ds = 0x00000030,
71*f1ba13f8SMasahiro Yamada 	.grp_b6ds = 0x00000030,
72*f1ba13f8SMasahiro Yamada 	.grp_b7ds = 0x00000030,
73*f1ba13f8SMasahiro Yamada };
74*f1ba13f8SMasahiro Yamada 
75*f1ba13f8SMasahiro Yamada /* 4x128Mx16.cfg */
76*f1ba13f8SMasahiro Yamada static const struct mx6_mmdc_calibration mx6_4x256mx16_mmdc_calib = {
77*f1ba13f8SMasahiro Yamada 	.p0_mpwldectrl0 = 0x002D0028,
78*f1ba13f8SMasahiro Yamada 	.p0_mpwldectrl1 = 0x0032002D,
79*f1ba13f8SMasahiro Yamada 	.p1_mpwldectrl0 = 0x00210036,
80*f1ba13f8SMasahiro Yamada 	.p1_mpwldectrl1 = 0x0019002E,
81*f1ba13f8SMasahiro Yamada 	.p0_mpdgctrl0 = 0x4349035C,
82*f1ba13f8SMasahiro Yamada 	.p0_mpdgctrl1 = 0x0348033D,
83*f1ba13f8SMasahiro Yamada 	.p1_mpdgctrl0 = 0x43550362,
84*f1ba13f8SMasahiro Yamada 	.p1_mpdgctrl1 = 0x03520316,
85*f1ba13f8SMasahiro Yamada 	.p0_mprddlctl = 0x41393940,
86*f1ba13f8SMasahiro Yamada 	.p1_mprddlctl = 0x3F3A3C47,
87*f1ba13f8SMasahiro Yamada 	.p0_mpwrdlctl = 0x413A423A,
88*f1ba13f8SMasahiro Yamada 	.p1_mpwrdlctl = 0x4042483E,
89*f1ba13f8SMasahiro Yamada };
90*f1ba13f8SMasahiro Yamada 
91*f1ba13f8SMasahiro Yamada /* MT41K128M16JT-125 (2Gb density) */
92*f1ba13f8SMasahiro Yamada static const struct mx6_ddr3_cfg mt41k128m16jt_125 = {
93*f1ba13f8SMasahiro Yamada 	.mem_speed = 1600,
94*f1ba13f8SMasahiro Yamada 	.density = 2,
95*f1ba13f8SMasahiro Yamada 	.width = 16,
96*f1ba13f8SMasahiro Yamada 	.banks = 8,
97*f1ba13f8SMasahiro Yamada 	.rowaddr = 14,
98*f1ba13f8SMasahiro Yamada 	.coladdr = 10,
99*f1ba13f8SMasahiro Yamada 	.pagesz = 2,
100*f1ba13f8SMasahiro Yamada 	.trcd = 1375,
101*f1ba13f8SMasahiro Yamada 	.trcmin = 4875,
102*f1ba13f8SMasahiro Yamada 	.trasmin = 3500,
103*f1ba13f8SMasahiro Yamada };
104*f1ba13f8SMasahiro Yamada 
ccgr_init(void)105*f1ba13f8SMasahiro Yamada static void ccgr_init(void)
106*f1ba13f8SMasahiro Yamada {
107*f1ba13f8SMasahiro Yamada 	struct mxc_ccm_reg *ccm = (struct mxc_ccm_reg *)CCM_BASE_ADDR;
108*f1ba13f8SMasahiro Yamada 
109*f1ba13f8SMasahiro Yamada 	writel(0x00C03F3F, &ccm->CCGR0);
110*f1ba13f8SMasahiro Yamada 	writel(0x0030FC3F, &ccm->CCGR1);
111*f1ba13f8SMasahiro Yamada 	writel(0x0FFFCFC0, &ccm->CCGR2);
112*f1ba13f8SMasahiro Yamada 	writel(0x3FF00000, &ccm->CCGR3);
113*f1ba13f8SMasahiro Yamada 	writel(0x00FFF300, &ccm->CCGR4);
114*f1ba13f8SMasahiro Yamada 	writel(0x0F0000C3, &ccm->CCGR5);
115*f1ba13f8SMasahiro Yamada 	writel(0x000003FF, &ccm->CCGR6);
116*f1ba13f8SMasahiro Yamada }
117*f1ba13f8SMasahiro Yamada 
spl_dram_init(void)118*f1ba13f8SMasahiro Yamada static void spl_dram_init(void)
119*f1ba13f8SMasahiro Yamada {
120*f1ba13f8SMasahiro Yamada 	struct mx6_ddr_sysinfo sysinfo = {
121*f1ba13f8SMasahiro Yamada 		/* width of data bus:0=16,1=32,2=64 */
122*f1ba13f8SMasahiro Yamada 		.dsize = 2,
123*f1ba13f8SMasahiro Yamada 		/* config for full 4GB range so that get_mem_size() works */
124*f1ba13f8SMasahiro Yamada 		.cs_density = 32, /* 32Gb per CS */
125*f1ba13f8SMasahiro Yamada 		/* single chip select */
126*f1ba13f8SMasahiro Yamada 		.ncs = 1,
127*f1ba13f8SMasahiro Yamada 		.cs1_mirror = 0,
128*f1ba13f8SMasahiro Yamada 		.rtt_wr = 1 /*DDR3_RTT_60_OHM*/,	/* RTT_Wr = RZQ/4 */
129*f1ba13f8SMasahiro Yamada 		.rtt_nom = 2 /*DDR3_RTT_120_OHM*/,	/* RTT_Nom = RZQ/2 */
130*f1ba13f8SMasahiro Yamada 		.walat = 1,	/* Write additional latency */
131*f1ba13f8SMasahiro Yamada 		.ralat = 5,	/* Read additional latency */
132*f1ba13f8SMasahiro Yamada 		.mif3_mode = 3,	/* Command prediction working mode */
133*f1ba13f8SMasahiro Yamada 		.bi_on = 1,	/* Bank interleaving enabled */
134*f1ba13f8SMasahiro Yamada 		.sde_to_rst = 0x10,	/* 14 cycles, 200us (JEDEC default) */
135*f1ba13f8SMasahiro Yamada 		.rst_to_cke = 0x23,	/* 33 cycles, 500us (JEDEC default) */
136*f1ba13f8SMasahiro Yamada 		.pd_fast_exit = 1, /* enable precharge power-down fast exit */
137*f1ba13f8SMasahiro Yamada 		.ddr_type = DDR_TYPE_DDR3,
138*f1ba13f8SMasahiro Yamada 		.refsel = 1,	/* Refresh cycles at 32KHz */
139*f1ba13f8SMasahiro Yamada 		.refr = 7,	/* 8 refresh commands per refresh cycle */
140*f1ba13f8SMasahiro Yamada 	};
141*f1ba13f8SMasahiro Yamada 
142*f1ba13f8SMasahiro Yamada 	mx6dq_dram_iocfg(64, &mx6_ddr_ioregs, &mx6_grp_ioregs);
143*f1ba13f8SMasahiro Yamada 	mx6_dram_cfg(&sysinfo, &mx6_4x256mx16_mmdc_calib, &mt41k128m16jt_125);
144*f1ba13f8SMasahiro Yamada }
145*f1ba13f8SMasahiro Yamada 
146*f1ba13f8SMasahiro Yamada #ifdef CONFIG_SPL_SPI_SUPPORT
displ5_init_ecspi(void)147*f1ba13f8SMasahiro Yamada static void displ5_init_ecspi(void)
148*f1ba13f8SMasahiro Yamada {
149*f1ba13f8SMasahiro Yamada 	displ5_set_iomux_ecspi_spl();
150*f1ba13f8SMasahiro Yamada 	enable_spi_clk(1, 1);
151*f1ba13f8SMasahiro Yamada }
152*f1ba13f8SMasahiro Yamada #else
displ5_init_ecspi(void)153*f1ba13f8SMasahiro Yamada static inline void displ5_init_ecspi(void) { }
154*f1ba13f8SMasahiro Yamada #endif
155*f1ba13f8SMasahiro Yamada 
156*f1ba13f8SMasahiro Yamada #ifdef CONFIG_SPL_MMC_SUPPORT
157*f1ba13f8SMasahiro Yamada static struct fsl_esdhc_cfg usdhc_cfg = {
158*f1ba13f8SMasahiro Yamada 	.esdhc_base = USDHC4_BASE_ADDR,
159*f1ba13f8SMasahiro Yamada 	.max_bus_width = 8,
160*f1ba13f8SMasahiro Yamada };
161*f1ba13f8SMasahiro Yamada 
board_mmc_init(bd_t * bd)162*f1ba13f8SMasahiro Yamada int board_mmc_init(bd_t *bd)
163*f1ba13f8SMasahiro Yamada {
164*f1ba13f8SMasahiro Yamada 	displ5_set_iomux_usdhc_spl();
165*f1ba13f8SMasahiro Yamada 
166*f1ba13f8SMasahiro Yamada 	usdhc_cfg.sdhc_clk = mxc_get_clock(MXC_ESDHC4_CLK);
167*f1ba13f8SMasahiro Yamada 	gd->arch.sdhc_clk = usdhc_cfg.sdhc_clk;
168*f1ba13f8SMasahiro Yamada 
169*f1ba13f8SMasahiro Yamada 	return fsl_esdhc_initialize(bd, &usdhc_cfg);
170*f1ba13f8SMasahiro Yamada }
171*f1ba13f8SMasahiro Yamada #endif
172*f1ba13f8SMasahiro Yamada 
board_init_f(ulong dummy)173*f1ba13f8SMasahiro Yamada void board_init_f(ulong dummy)
174*f1ba13f8SMasahiro Yamada {
175*f1ba13f8SMasahiro Yamada 	ccgr_init();
176*f1ba13f8SMasahiro Yamada 
177*f1ba13f8SMasahiro Yamada 	arch_cpu_init();
178*f1ba13f8SMasahiro Yamada 
179*f1ba13f8SMasahiro Yamada 	gpr_init();
180*f1ba13f8SMasahiro Yamada 
181*f1ba13f8SMasahiro Yamada 	/* setup GP timer */
182*f1ba13f8SMasahiro Yamada 	timer_init();
183*f1ba13f8SMasahiro Yamada 
184*f1ba13f8SMasahiro Yamada 	displ5_set_iomux_uart_spl();
185*f1ba13f8SMasahiro Yamada 
186*f1ba13f8SMasahiro Yamada 	/* UART clocks enabled and gd valid - init serial console */
187*f1ba13f8SMasahiro Yamada 	preloader_console_init();
188*f1ba13f8SMasahiro Yamada 
189*f1ba13f8SMasahiro Yamada 	displ5_init_ecspi();
190*f1ba13f8SMasahiro Yamada 
191*f1ba13f8SMasahiro Yamada 	/* DDR initialization */
192*f1ba13f8SMasahiro Yamada 	spl_dram_init();
193*f1ba13f8SMasahiro Yamada 
194*f1ba13f8SMasahiro Yamada 	/* Clear the BSS. */
195*f1ba13f8SMasahiro Yamada 	memset(__bss_start, 0, __bss_end - __bss_start);
196*f1ba13f8SMasahiro Yamada 
197*f1ba13f8SMasahiro Yamada 	/* load/boot image from boot device */
198*f1ba13f8SMasahiro Yamada 	board_init_r(NULL, 0);
199*f1ba13f8SMasahiro Yamada }
200*f1ba13f8SMasahiro Yamada 
board_boot_order(u32 * spl_boot_list)201*f1ba13f8SMasahiro Yamada void board_boot_order(u32 *spl_boot_list)
202*f1ba13f8SMasahiro Yamada {
203*f1ba13f8SMasahiro Yamada 	/* Default boot sequence SPI -> MMC */
204*f1ba13f8SMasahiro Yamada 	spl_boot_list[0] = spl_boot_device();
205*f1ba13f8SMasahiro Yamada 	spl_boot_list[1] = BOOT_DEVICE_MMC1;
206*f1ba13f8SMasahiro Yamada 	spl_boot_list[2] = BOOT_DEVICE_UART;
207*f1ba13f8SMasahiro Yamada 	spl_boot_list[3] = BOOT_DEVICE_NONE;
208*f1ba13f8SMasahiro Yamada 
209*f1ba13f8SMasahiro Yamada #ifdef CONFIG_SPL_ENV_SUPPORT
210*f1ba13f8SMasahiro Yamada 	/* 'fastboot' */
211*f1ba13f8SMasahiro Yamada 	const char *s;
212*f1ba13f8SMasahiro Yamada 
213*f1ba13f8SMasahiro Yamada 	env_init();
214*f1ba13f8SMasahiro Yamada 	env_load();
215*f1ba13f8SMasahiro Yamada 
216*f1ba13f8SMasahiro Yamada 	s = env_get("BOOT_FROM");
217*f1ba13f8SMasahiro Yamada 	if (s && strcmp(s, "ACTIVE") == 0) {
218*f1ba13f8SMasahiro Yamada 		spl_boot_list[0] = BOOT_DEVICE_MMC1;
219*f1ba13f8SMasahiro Yamada 		spl_boot_list[1] = spl_boot_device();
220*f1ba13f8SMasahiro Yamada 	}
221*f1ba13f8SMasahiro Yamada #endif
222*f1ba13f8SMasahiro Yamada }
223*f1ba13f8SMasahiro Yamada 
reset_cpu(ulong addr)224*f1ba13f8SMasahiro Yamada void reset_cpu(ulong addr) {}
225*f1ba13f8SMasahiro Yamada 
226*f1ba13f8SMasahiro Yamada #ifdef CONFIG_SPL_LOAD_FIT
board_fit_config_name_match(const char * name)227*f1ba13f8SMasahiro Yamada int board_fit_config_name_match(const char *name)
228*f1ba13f8SMasahiro Yamada {
229*f1ba13f8SMasahiro Yamada 	return 0;
230*f1ba13f8SMasahiro Yamada }
231*f1ba13f8SMasahiro Yamada #endif
232*f1ba13f8SMasahiro Yamada 
233*f1ba13f8SMasahiro Yamada #ifdef CONFIG_SPL_OS_BOOT
234*f1ba13f8SMasahiro Yamada /* Return: 1 - boot to U-Boot. 0 - boot OS (falcon mode) */
spl_start_uboot(void)235*f1ba13f8SMasahiro Yamada int spl_start_uboot(void)
236*f1ba13f8SMasahiro Yamada {
237*f1ba13f8SMasahiro Yamada 	/* break into full u-boot on 'c' */
238*f1ba13f8SMasahiro Yamada 	if (serial_tstc() && serial_getc() == 'c')
239*f1ba13f8SMasahiro Yamada 		return 1;
240*f1ba13f8SMasahiro Yamada 
241*f1ba13f8SMasahiro Yamada #ifdef CONFIG_SPL_ENV_SUPPORT
242*f1ba13f8SMasahiro Yamada 	if (env_get_yesno("boot_os") != 1)
243*f1ba13f8SMasahiro Yamada 		return 1;
244*f1ba13f8SMasahiro Yamada #endif
245*f1ba13f8SMasahiro Yamada 	return 0;
246*f1ba13f8SMasahiro Yamada }
247*f1ba13f8SMasahiro Yamada #endif
248