NAND boot: MPC8536DS support
MPC8536E can support booting from NAND flash which uses the
image u-boot-nand.bin. This image contains two parts: a 4K
NAND loader and a main U-Boot image. The former is appended
to the latter to produce u-boot-nand.bin. The 4K NAND loader
includes the corresponding nand_spl directory, along with the
code twisted by CONFIG_NAND_SPL. The main U-Boot image just
like a general U-Boot image except the parts that included by
CONFIG_SYS_RAMBOOT.
When power on, eLBC will automatically load from bank 0 the
4K NAND loader into the FCM buffer RAM where CPU can execute
the boot code directly. In the first stage, the NAND loader
copies itself to RAM or L2SRAM to free up the FCM buffer RAM,
then loads the main image from NAND flash to RAM or L2SRAM
and boot from it.
This patch implements the NAND loader to load the main image
into L2SRAM, so the main image can configure the RAM by using
SPD EEPROM. In the first stage, the NAND loader copies itself
to the second to last 4K address space, and uses the last 4K
address space as the initial RAM for stack.
Obviously, the size of L2SRAM shouldn't be less than the size
of the image used. If so, the workaround is to generate another
image that includes the code to configure the RAM by SPD and
load it to L2SRAM first, then relocate the main image to RAM
to boot up.
Signed-off-by: Mingkai Hu <Mingkai.hu@freescale.com>
Signed-off-by: Kumar Gala <galak@kernel.crashing.org>
16 years ago
|
|
|
/*
|
|
|
|
* Copyright 2009 Freescale Semiconductor, Inc.
|
|
|
|
*
|
|
|
|
* SPDX-License-Identifier: GPL-2.0+
|
NAND boot: MPC8536DS support
MPC8536E can support booting from NAND flash which uses the
image u-boot-nand.bin. This image contains two parts: a 4K
NAND loader and a main U-Boot image. The former is appended
to the latter to produce u-boot-nand.bin. The 4K NAND loader
includes the corresponding nand_spl directory, along with the
code twisted by CONFIG_NAND_SPL. The main U-Boot image just
like a general U-Boot image except the parts that included by
CONFIG_SYS_RAMBOOT.
When power on, eLBC will automatically load from bank 0 the
4K NAND loader into the FCM buffer RAM where CPU can execute
the boot code directly. In the first stage, the NAND loader
copies itself to RAM or L2SRAM to free up the FCM buffer RAM,
then loads the main image from NAND flash to RAM or L2SRAM
and boot from it.
This patch implements the NAND loader to load the main image
into L2SRAM, so the main image can configure the RAM by using
SPD EEPROM. In the first stage, the NAND loader copies itself
to the second to last 4K address space, and uses the last 4K
address space as the initial RAM for stack.
Obviously, the size of L2SRAM shouldn't be less than the size
of the image used. If so, the workaround is to generate another
image that includes the code to configure the RAM by SPD and
load it to L2SRAM first, then relocate the main image to RAM
to boot up.
Signed-off-by: Mingkai Hu <Mingkai.hu@freescale.com>
Signed-off-by: Kumar Gala <galak@kernel.crashing.org>
16 years ago
|
|
|
*/
|
|
|
|
|
|
|
|
#include <common.h>
|
|
|
|
#include <ns16550.h>
|
|
|
|
#include <asm/io.h>
|
|
|
|
#include <nand.h>
|
|
|
|
|
|
|
|
u32 sysclk_tbl[] = {
|
|
|
|
33333000, 39999600, 49999500, 66666000,
|
|
|
|
83332500, 99999000, 133332000, 166665000
|
|
|
|
};
|
|
|
|
|
|
|
|
void board_init_f(ulong bootflag)
|
|
|
|
{
|
|
|
|
int px_spd;
|
|
|
|
u32 plat_ratio, bus_clk, sys_clk;
|
|
|
|
ccsr_gur_t *gur = (void *)CONFIG_SYS_MPC85xx_GUTS_ADDR;
|
|
|
|
|
|
|
|
#if defined(CONFIG_SYS_BR3_PRELIM) && defined(CONFIG_SYS_OR3_PRELIM)
|
|
|
|
/* for FPGA */
|
|
|
|
set_lbc_br(3, CONFIG_SYS_BR3_PRELIM);
|
|
|
|
set_lbc_or(3, CONFIG_SYS_OR3_PRELIM);
|
NAND boot: MPC8536DS support
MPC8536E can support booting from NAND flash which uses the
image u-boot-nand.bin. This image contains two parts: a 4K
NAND loader and a main U-Boot image. The former is appended
to the latter to produce u-boot-nand.bin. The 4K NAND loader
includes the corresponding nand_spl directory, along with the
code twisted by CONFIG_NAND_SPL. The main U-Boot image just
like a general U-Boot image except the parts that included by
CONFIG_SYS_RAMBOOT.
When power on, eLBC will automatically load from bank 0 the
4K NAND loader into the FCM buffer RAM where CPU can execute
the boot code directly. In the first stage, the NAND loader
copies itself to RAM or L2SRAM to free up the FCM buffer RAM,
then loads the main image from NAND flash to RAM or L2SRAM
and boot from it.
This patch implements the NAND loader to load the main image
into L2SRAM, so the main image can configure the RAM by using
SPD EEPROM. In the first stage, the NAND loader copies itself
to the second to last 4K address space, and uses the last 4K
address space as the initial RAM for stack.
Obviously, the size of L2SRAM shouldn't be less than the size
of the image used. If so, the workaround is to generate another
image that includes the code to configure the RAM by SPD and
load it to L2SRAM first, then relocate the main image to RAM
to boot up.
Signed-off-by: Mingkai Hu <Mingkai.hu@freescale.com>
Signed-off-by: Kumar Gala <galak@kernel.crashing.org>
16 years ago
|
|
|
#else
|
|
|
|
#error CONFIG_SYS_BR3_PRELIM, CONFIG_SYS_OR3_PRELIM must be defined
|
|
|
|
#endif
|
|
|
|
|
|
|
|
/* initialize selected port with appropriate baud rate */
|
|
|
|
px_spd = in_8((unsigned char *)(PIXIS_BASE + PIXIS_SPD));
|
|
|
|
sys_clk = sysclk_tbl[px_spd & PIXIS_SPD_SYSCLK];
|
|
|
|
plat_ratio = in_be32(&gur->porpllsr) & MPC85xx_PORPLLSR_PLAT_RATIO;
|
|
|
|
bus_clk = sys_clk * plat_ratio / 2;
|
|
|
|
|
|
|
|
NS16550_init((NS16550_t)CONFIG_SYS_NS16550_COM1,
|
|
|
|
bus_clk / 16 / CONFIG_BAUDRATE);
|
|
|
|
|
|
|
|
puts("\nNAND boot... ");
|
|
|
|
|
|
|
|
/* copy code to RAM and jump to it - this should not return */
|
|
|
|
/* NOTE - code has to be copied out of NAND buffer before
|
|
|
|
* other blocks can be read.
|
|
|
|
*/
|
|
|
|
relocate_code(CONFIG_SYS_NAND_U_BOOT_RELOC_SP, 0,
|
|
|
|
CONFIG_SYS_NAND_U_BOOT_RELOC);
|
|
|
|
}
|
|
|
|
|
|
|
|
void board_init_r(gd_t *gd, ulong dest_addr)
|
|
|
|
{
|
|
|
|
nand_boot();
|
|
|
|
}
|
|
|
|
|
|
|
|
void putc(char c)
|
|
|
|
{
|
|
|
|
if (c == '\n')
|
|
|
|
NS16550_putc((NS16550_t)CONFIG_SYS_NS16550_COM1, '\r');
|
|
|
|
|
|
|
|
NS16550_putc((NS16550_t)CONFIG_SYS_NS16550_COM1, c);
|
|
|
|
}
|
|
|
|
|
|
|
|
void puts(const char *str)
|
|
|
|
{
|
|
|
|
while (*str)
|
|
|
|
putc(*str++);
|
|
|
|
}
|