xref: /rk3399_rockchip-uboot/board/freescale/p1010rdb/spl.c (revision 203e94f6c9ca03e260175ce240f5856507395585)
1c9e1f588SYing Zhang /* Copyright 2013 Freescale Semiconductor, Inc.
2c9e1f588SYing Zhang  *
3c9e1f588SYing Zhang  * SPDX-License-Identifier:    GPL-2.0+
4c9e1f588SYing Zhang  */
5c9e1f588SYing Zhang 
6c9e1f588SYing Zhang #include <common.h>
724b852a7SSimon Glass #include <console.h>
8*203e94f6SSimon Glass #include <environment.h>
9c9e1f588SYing Zhang #include <ns16550.h>
10c9e1f588SYing Zhang #include <malloc.h>
11c9e1f588SYing Zhang #include <mmc.h>
12c9e1f588SYing Zhang #include <nand.h>
13c9e1f588SYing Zhang #include <i2c.h>
14c9e1f588SYing Zhang #include <fsl_esdhc.h>
15c9e1f588SYing Zhang #include <spi_flash.h>
16ea022a37SSimon Glass #include "../common/spl.h"
17c9e1f588SYing Zhang 
18c9e1f588SYing Zhang DECLARE_GLOBAL_DATA_PTR;
19c9e1f588SYing Zhang 
get_effective_memsize(void)20a7e8c15fSTom Rini phys_size_t get_effective_memsize(void)
21c9e1f588SYing Zhang {
22c9e1f588SYing Zhang 	return CONFIG_SYS_L2_SIZE;
23c9e1f588SYing Zhang }
24c9e1f588SYing Zhang 
board_init_f(ulong bootflag)25c9e1f588SYing Zhang void board_init_f(ulong bootflag)
26c9e1f588SYing Zhang {
27c9e1f588SYing Zhang 	u32 plat_ratio;
28c9e1f588SYing Zhang 	ccsr_gur_t *gur = (void *)CONFIG_SYS_MPC85xx_GUTS_ADDR;
2939b0bbbbSJaiprakash Singh 	struct fsl_ifc ifc = {(void *)CONFIG_SYS_IFC_ADDR, (void *)NULL};
30c9e1f588SYing Zhang 
31c9e1f588SYing Zhang 	console_init_f();
32c9e1f588SYing Zhang 
33c9e1f588SYing Zhang 	/* Clock configuration to access CPLD using IFC(GPCM) */
3439b0bbbbSJaiprakash Singh 	setbits_be32(&ifc.gregs->ifc_gcr, 1 << IFC_GCR_TBCTL_TRN_TIME_SHIFT);
35c9e1f588SYing Zhang 
367601686cSYork Sun #ifdef CONFIG_TARGET_P1010RDB_PB
37c9e1f588SYing Zhang 	setbits_be32(&gur->pmuxcr2, MPC85xx_PMUXCR2_GPIO01_DRVVBUS);
38c9e1f588SYing Zhang #endif
39c9e1f588SYing Zhang 
40c9e1f588SYing Zhang 	/* initialize selected port with appropriate baud rate */
41c9e1f588SYing Zhang 	plat_ratio = in_be32(&gur->porpllsr) & MPC85xx_PORPLLSR_PLAT_RATIO;
42c9e1f588SYing Zhang 	plat_ratio >>= 1;
43c9e1f588SYing Zhang 	gd->bus_clk = CONFIG_SYS_CLK_FREQ * plat_ratio;
44c9e1f588SYing Zhang 
45c9e1f588SYing Zhang 	NS16550_init((NS16550_t)CONFIG_SYS_NS16550_COM1,
46c9e1f588SYing Zhang 		     gd->bus_clk / 16 / CONFIG_BAUDRATE);
47c9e1f588SYing Zhang 
48c9e1f588SYing Zhang #ifdef CONFIG_SPL_MMC_BOOT
49c9e1f588SYing Zhang 	puts("\nSD boot...\n");
50c9e1f588SYing Zhang #elif defined(CONFIG_SPL_SPI_BOOT)
51c9e1f588SYing Zhang 	puts("\nSPI Flash boot...\n");
52c9e1f588SYing Zhang #endif
53c9e1f588SYing Zhang 	/* copy code to RAM and jump to it - this should not return */
54c9e1f588SYing Zhang 	/* NOTE - code has to be copied out of NAND buffer before
55c9e1f588SYing Zhang 	 * other blocks can be read.
56c9e1f588SYing Zhang 	*/
57c9e1f588SYing Zhang 	relocate_code(CONFIG_SPL_RELOC_STACK, 0, CONFIG_SPL_RELOC_TEXT_BASE);
58c9e1f588SYing Zhang }
59c9e1f588SYing Zhang 
board_init_r(gd_t * gd,ulong dest_addr)60c9e1f588SYing Zhang void board_init_r(gd_t *gd, ulong dest_addr)
61c9e1f588SYing Zhang {
62c9e1f588SYing Zhang 	/* Pointer is writable since we allocated a register for it */
63c9e1f588SYing Zhang 	gd = (gd_t *)CONFIG_SPL_GD_ADDR;
64c9e1f588SYing Zhang 	bd_t *bd;
65c9e1f588SYing Zhang 
66c9e1f588SYing Zhang 	memset(gd, 0, sizeof(gd_t));
67c9e1f588SYing Zhang 	bd = (bd_t *)(CONFIG_SPL_GD_ADDR + sizeof(gd_t));
68c9e1f588SYing Zhang 	memset(bd, 0, sizeof(bd_t));
69c9e1f588SYing Zhang 	gd->bd = bd;
70c9e1f588SYing Zhang 	bd->bi_memstart = CONFIG_SYS_INIT_L2_ADDR;
71c9e1f588SYing Zhang 	bd->bi_memsize = CONFIG_SYS_L2_SIZE;
72c9e1f588SYing Zhang 
73cbcbf71bSSimon Glass 	arch_cpu_init();
74c9e1f588SYing Zhang 	get_clocks();
75c9e1f588SYing Zhang 	mem_malloc_init(CONFIG_SPL_RELOC_MALLOC_ADDR,
76c9e1f588SYing Zhang 			CONFIG_SPL_RELOC_MALLOC_SIZE);
77ed4708aaSSumit Garg 	gd->flags |= GD_FLG_FULL_MALLOC_INIT;
78c9e1f588SYing Zhang 
79c9e1f588SYing Zhang #ifndef CONFIG_SPL_NAND_BOOT
80c9e1f588SYing Zhang 	env_init();
81c9e1f588SYing Zhang #endif
82c9e1f588SYing Zhang #ifdef CONFIG_SPL_MMC_BOOT
83c9e1f588SYing Zhang 	mmc_initialize(bd);
84c9e1f588SYing Zhang #endif
85c9e1f588SYing Zhang 
86c9e1f588SYing Zhang 	/* relocate environment function pointers etc. */
87c9e1f588SYing Zhang #ifdef CONFIG_SPL_NAND_BOOT
88c9e1f588SYing Zhang 	nand_spl_load_image(CONFIG_ENV_OFFSET, CONFIG_ENV_SIZE,
89c9e1f588SYing Zhang 			    (uchar *)CONFIG_ENV_ADDR);
90c9e1f588SYing Zhang 			    gd->env_addr  = (ulong)(CONFIG_ENV_ADDR);
91*203e94f6SSimon Glass 	gd->env_valid = ENV_VALID;
92c9e1f588SYing Zhang #else
93c9e1f588SYing Zhang 	env_relocate();
94c9e1f588SYing Zhang #endif
95c9e1f588SYing Zhang 
96c9e1f588SYing Zhang 	i2c_init_all();
97c9e1f588SYing Zhang 
98f1683aa7SSimon Glass 	dram_init();
99c9e1f588SYing Zhang #ifdef CONFIG_SPL_NAND_BOOT
100c9e1f588SYing Zhang 	puts("\nTertiary program loader running in sram...");
101c9e1f588SYing Zhang #else
102c9e1f588SYing Zhang 	puts("\nSecond program loader running in sram...");
103c9e1f588SYing Zhang #endif
104c9e1f588SYing Zhang 
105c9e1f588SYing Zhang #ifdef CONFIG_SPL_MMC_BOOT
106c9e1f588SYing Zhang 	mmc_boot();
107c9e1f588SYing Zhang #elif defined(CONFIG_SPL_SPI_BOOT)
108ea022a37SSimon Glass 	fsl_spi_boot();
109c9e1f588SYing Zhang #elif defined(CONFIG_SPL_NAND_BOOT)
110c9e1f588SYing Zhang 	nand_boot();
111c9e1f588SYing Zhang #endif
112c9e1f588SYing Zhang }
113