13e6e6983SYing Zhang /*
23e6e6983SYing Zhang * Copyright 2013 Freescale Semiconductor, Inc.
33e6e6983SYing Zhang *
43e6e6983SYing Zhang * SPDX-License-Identifier: GPL-2.0+
53e6e6983SYing Zhang */
63e6e6983SYing Zhang
73e6e6983SYing Zhang #include <common.h>
824b852a7SSimon Glass #include <console.h>
9*203e94f6SSimon Glass #include <environment.h>
103e6e6983SYing Zhang #include <ns16550.h>
113e6e6983SYing Zhang #include <malloc.h>
123e6e6983SYing Zhang #include <mmc.h>
133e6e6983SYing Zhang #include <nand.h>
143e6e6983SYing Zhang #include <i2c.h>
153e6e6983SYing Zhang #include <fsl_esdhc.h>
16d34e5624SYing Zhang #include <spi_flash.h>
17ea022a37SSimon Glass #include "../common/spl.h"
183e6e6983SYing Zhang
193e6e6983SYing Zhang DECLARE_GLOBAL_DATA_PTR;
203e6e6983SYing Zhang
get_effective_memsize(void)21e3866163SYork Sun phys_size_t get_effective_memsize(void)
223e6e6983SYing Zhang {
233e6e6983SYing Zhang return CONFIG_SYS_L2_SIZE;
243e6e6983SYing Zhang }
253e6e6983SYing Zhang
board_init_f(ulong bootflag)263e6e6983SYing Zhang void board_init_f(ulong bootflag)
273e6e6983SYing Zhang {
283e6e6983SYing Zhang u32 plat_ratio, bus_clk;
293e6e6983SYing Zhang ccsr_gur_t *gur = (void *)CONFIG_SYS_MPC85xx_GUTS_ADDR;
303e6e6983SYing Zhang
313e6e6983SYing Zhang console_init_f();
323e6e6983SYing Zhang
333e6e6983SYing Zhang /* Set pmuxcr to allow both i2c1 and i2c2 */
343e6e6983SYing Zhang setbits_be32(&gur->pmuxcr, in_be32(&gur->pmuxcr) | 0x1000);
353e6e6983SYing Zhang setbits_be32(&gur->pmuxcr,
363e6e6983SYing Zhang in_be32(&gur->pmuxcr) | MPC85xx_PMUXCR_SD_DATA);
373e6e6983SYing Zhang
383e6e6983SYing Zhang /* Read back the register to synchronize the write. */
393e6e6983SYing Zhang in_be32(&gur->pmuxcr);
403e6e6983SYing Zhang
41d34e5624SYing Zhang #ifdef CONFIG_SPL_SPI_BOOT
42d34e5624SYing Zhang clrbits_be32(&gur->pmuxcr, MPC85xx_PMUXCR_SD_DATA);
43d34e5624SYing Zhang #endif
44d34e5624SYing Zhang
453e6e6983SYing Zhang /* initialize selected port with appropriate baud rate */
463e6e6983SYing Zhang plat_ratio = in_be32(&gur->porpllsr) & MPC85xx_PORPLLSR_PLAT_RATIO;
473e6e6983SYing Zhang plat_ratio >>= 1;
483e6e6983SYing Zhang bus_clk = CONFIG_SYS_CLK_FREQ * plat_ratio;
493e6e6983SYing Zhang gd->bus_clk = bus_clk;
503e6e6983SYing Zhang
513e6e6983SYing Zhang NS16550_init((NS16550_t)CONFIG_SYS_NS16550_COM1,
523e6e6983SYing Zhang bus_clk / 16 / CONFIG_BAUDRATE);
533e6e6983SYing Zhang #ifdef CONFIG_SPL_MMC_BOOT
543e6e6983SYing Zhang puts("\nSD boot...\n");
55d34e5624SYing Zhang #elif defined(CONFIG_SPL_SPI_BOOT)
56d34e5624SYing Zhang puts("\nSPI Flash boot...\n");
573e6e6983SYing Zhang #endif
583e6e6983SYing Zhang
593e6e6983SYing Zhang /* copy code to RAM and jump to it - this should not return */
603e6e6983SYing Zhang /* NOTE - code has to be copied out of NAND buffer before
613e6e6983SYing Zhang * other blocks can be read.
623e6e6983SYing Zhang */
633e6e6983SYing Zhang relocate_code(CONFIG_SPL_RELOC_STACK, 0, CONFIG_SPL_RELOC_TEXT_BASE);
643e6e6983SYing Zhang }
653e6e6983SYing Zhang
board_init_r(gd_t * gd,ulong dest_addr)663e6e6983SYing Zhang void board_init_r(gd_t *gd, ulong dest_addr)
673e6e6983SYing Zhang {
683e6e6983SYing Zhang /* Pointer is writable since we allocated a register for it */
693e6e6983SYing Zhang gd = (gd_t *)CONFIG_SPL_GD_ADDR;
703e6e6983SYing Zhang bd_t *bd;
713e6e6983SYing Zhang
723e6e6983SYing Zhang memset(gd, 0, sizeof(gd_t));
733e6e6983SYing Zhang bd = (bd_t *)(CONFIG_SPL_GD_ADDR + sizeof(gd_t));
743e6e6983SYing Zhang memset(bd, 0, sizeof(bd_t));
753e6e6983SYing Zhang gd->bd = bd;
763e6e6983SYing Zhang bd->bi_memstart = CONFIG_SYS_INIT_L2_ADDR;
773e6e6983SYing Zhang bd->bi_memsize = CONFIG_SYS_L2_SIZE;
783e6e6983SYing Zhang
79cbcbf71bSSimon Glass arch_cpu_init();
803e6e6983SYing Zhang get_clocks();
813e6e6983SYing Zhang mem_malloc_init(CONFIG_SPL_RELOC_MALLOC_ADDR,
823e6e6983SYing Zhang CONFIG_SPL_RELOC_MALLOC_SIZE);
83ed4708aaSSumit Garg gd->flags |= GD_FLG_FULL_MALLOC_INIT;
843e6e6983SYing Zhang
8562c6ef33SYing Zhang #ifndef CONFIG_SPL_NAND_BOOT
863e6e6983SYing Zhang env_init();
8762c6ef33SYing Zhang #endif
883e6e6983SYing Zhang #ifdef CONFIG_SPL_MMC_BOOT
893e6e6983SYing Zhang mmc_initialize(bd);
903e6e6983SYing Zhang #endif
913e6e6983SYing Zhang /* relocate environment function pointers etc. */
9262c6ef33SYing Zhang #ifdef CONFIG_SPL_NAND_BOOT
9362c6ef33SYing Zhang nand_spl_load_image(CONFIG_ENV_OFFSET, CONFIG_ENV_SIZE,
9462c6ef33SYing Zhang (uchar *)CONFIG_ENV_ADDR);
9562c6ef33SYing Zhang gd->env_addr = (ulong)(CONFIG_ENV_ADDR);
96*203e94f6SSimon Glass gd->env_valid = ENV_VALID;
9762c6ef33SYing Zhang #else
983e6e6983SYing Zhang env_relocate();
9962c6ef33SYing Zhang #endif
1003e6e6983SYing Zhang
1013e6e6983SYing Zhang #ifdef CONFIG_SYS_I2C
1023e6e6983SYing Zhang i2c_init_all();
1033e6e6983SYing Zhang #else
1043e6e6983SYing Zhang i2c_init(CONFIG_SYS_I2C_SPEED, CONFIG_SYS_I2C_SLAVE);
1053e6e6983SYing Zhang #endif
1063e6e6983SYing Zhang
107f1683aa7SSimon Glass dram_init();
10862c6ef33SYing Zhang #ifdef CONFIG_SPL_NAND_BOOT
10962c6ef33SYing Zhang puts("Tertiary program loader running in sram...");
11062c6ef33SYing Zhang #else
1113e6e6983SYing Zhang puts("Second program loader running in sram...\n");
11262c6ef33SYing Zhang #endif
1133e6e6983SYing Zhang
1143e6e6983SYing Zhang #ifdef CONFIG_SPL_MMC_BOOT
1153e6e6983SYing Zhang mmc_boot();
116d34e5624SYing Zhang #elif defined(CONFIG_SPL_SPI_BOOT)
117ea022a37SSimon Glass fsl_spi_boot();
11862c6ef33SYing Zhang #elif defined(CONFIG_SPL_NAND_BOOT)
11962c6ef33SYing Zhang nand_boot();
1203e6e6983SYing Zhang #endif
1213e6e6983SYing Zhang }
122