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