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