[U-Boot] [RFC] nand boot for 85xx
Dave Liu
daveliu at freescale.com
Thu Dec 18 07:20:30 CET 2008
---
The patch is to be done, It is only giving the context
why move the definition of fsl_law from .c to .h.
Makefile | 13 +-
board/freescale/mpc8572ds/config.mk | 5 +
board/freescale/mpc8572ds/nand_boot.c | 75 ++++
board/freescale/mpc8572ds/u-boot-nand.lds | 140 ++++++++
cpu/mpc85xx/nand_init.c | 102 ++++++
cpu/mpc85xx/nand_start.S | 469 +++++++++++++++++++++++++
cpu/mpc85xx/start.S | 3 +
drivers/misc/fsl_law.c | 9 +-
include/asm-ppc/fsl_law.h | 2 +
include/configs/MPC8572DS.h | 64 ++++-
nand_spl/board/freescale/mpc8572ds/Makefile | 110 ++++++
nand_spl/board/freescale/mpc8572ds/u-boot.lds | 56 +++
12 files changed, 1040 insertions(+), 8 deletions(-)
create mode 100644 board/freescale/mpc8572ds/nand_boot.c
create mode 100644 board/freescale/mpc8572ds/u-boot-nand.lds
create mode 100644 cpu/mpc85xx/nand_init.c
create mode 100644 cpu/mpc85xx/nand_start.S
create mode 100644 nand_spl/board/freescale/mpc8572ds/Makefile
create mode 100644 nand_spl/board/freescale/mpc8572ds/u-boot.lds
diff --git a/Makefile b/Makefile
index d6abb4d..7af02f8 100644
--- a/Makefile
+++ b/Makefile
@@ -2364,8 +2364,17 @@ MPC8555CDS_config: unconfig
MPC8568MDS_config: unconfig
@$(MKCONFIG) $(@:_config=) ppc mpc85xx mpc8568mds freescale
-MPC8572DS_config: unconfig
- @$(MKCONFIG) $(@:_config=) ppc mpc85xx mpc8572ds freescale
+MPC8572DS_config \
+MPC8572DS_NAND_config: unconfig
+ @if [ "$(findstring _NAND_,$@)" ] ; then \
+ $(XECHO) -n "...NAND..." ; \
+ echo "TEXT_BASE = 0x01001000" > $(obj)board/freescale/mpc8572ds/config.tmp ; \
+ echo "#define CONFIG_NAND_U_BOOT" >>$(obj)include/config.h ; \
+ fi ;
+ @$(MKCONFIG) -a MPC8572DS ppc mpc85xx mpc8572ds freescale
+ @if [ "$(findstring _NAND_,$@)" ] ; then \
+ echo "CONFIG_NAND_U_BOOT = y" >> $(obj)include/config.mk ; \
+ fi ;
PM854_config: unconfig
@$(MKCONFIG) $(@:_config=) ppc mpc85xx pm854
diff --git a/board/freescale/mpc8572ds/config.mk b/board/freescale/mpc8572ds/config.mk
index 5b32186..a5bfcae 100644
--- a/board/freescale/mpc8572ds/config.mk
+++ b/board/freescale/mpc8572ds/config.mk
@@ -23,6 +23,11 @@
#
# mpc8572ds board
#
+
+ifndef NAND_SPL
+sinclude $(OBJTREE)/board/$(BOARDDIR)/config.tmp
+endif
+
ifndef TEXT_BASE
TEXT_BASE = 0xeff80000
endif
diff --git a/board/freescale/mpc8572ds/nand_boot.c b/board/freescale/mpc8572ds/nand_boot.c
new file mode 100644
index 0000000..1fb0acd
--- /dev/null
+++ b/board/freescale/mpc8572ds/nand_boot.c
@@ -0,0 +1,75 @@
+/*
+ * Copyright (C) 2008 Freescale Semiconductor, Inc.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+#include <common.h>
+#include <ns16550.h>
+#include <nand.h>
+#include <asm/mmu.h>
+#include <asm/immap_85xx.h>
+#include <asm/fsl_law.h>
+#include <asm/io.h>
+
+unsigned long get_bus_clk(void);
+void tlb_set(u32 mas0, u32 mas1, u32 mas2, u32 mas3);
+phys_size_t fixed_sdram (void);
+
+DECLARE_GLOBAL_DATA_PTR;
+
+void putc(char c)
+{
+ if (c == '\n')
+ NS16550_putc((NS16550_t)(CONFIG_SYS_CCSRBAR + 0x4500), '\r');
+
+ NS16550_putc((NS16550_t)(CONFIG_SYS_CCSRBAR + 0x4500), c);
+}
+
+void board_init_f(ulong bootflag)
+{
+ volatile ccsr_local_ecm_t *ecm = (void *)(CONFIG_SYS_MPC85xx_ECM_ADDR);
+ u32 mas0, mas1, mas2, mas3;
+
+ /* init serial port */
+ NS16550_init((NS16550_t)(CONFIG_SYS_CCSRBAR + 0x4500),
+ get_bus_clk() / 16 / CONFIG_BAUDRATE);
+ puts("NAND boot... ");
+ init_timebase();
+
+ /* set TLB1[8] for DDR mapping */
+ mas0 = FSL_BOOKE_MAS0(1, 8, 0);
+ mas1 = FSL_BOOKE_MAS1(1, 1, 0, 0, BOOKE_PAGESZ_1G);
+ mas2 = FSL_BOOKE_MAS2(0, 0);
+ mas3 = FSL_BOOKE_MAS3(0, 0, MAS3_SX | MAS3_SW | MAS3_SR);
+ tlb_set(mas0, mas1, mas2, mas3);
+
+ /* set LAW0 for DDR access */
+ out_be32(&ecm->lawbar0, 0);
+ out_be32(&ecm->lawar0, LAWAR_EN | (LAW_TRGT_IF_DDR << 20)
+ | LAW_SIZE_512M);
+ /* init DDR memory controller */
+ fixed_sdram();
+
+ /* relocate the first bootstrap */
+ relocate_code(CONFIG_SYS_NAND_U_BOOT_RELOC + 0x10000, (gd_t *)gd,
+ CONFIG_SYS_NAND_U_BOOT_RELOC);
+}
+
+void board_init_r(gd_t *gd, ulong dest_addr)
+{
+ nand_boot();
+}
diff --git a/board/freescale/mpc8572ds/u-boot-nand.lds b/board/freescale/mpc8572ds/u-boot-nand.lds
new file mode 100644
index 0000000..165a956
--- /dev/null
+++ b/board/freescale/mpc8572ds/u-boot-nand.lds
@@ -0,0 +1,140 @@
+/*
+ * Copyright 2007-2008 Freescale Semiconductor, Inc.
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+OUTPUT_ARCH(powerpc)
+/* Do we need any of these for elf?
+ __DYNAMIC = 0; */
+PHDRS
+{
+ text PT_LOAD;
+ bss PT_LOAD;
+}
+
+SECTIONS
+{
+ /* Read-only sections, merged into text segment: */
+ . = + SIZEOF_HEADERS;
+ .interp : { *(.interp) }
+ .hash : { *(.hash) }
+ .dynsym : { *(.dynsym) }
+ .dynstr : { *(.dynstr) }
+ .rel.text : { *(.rel.text) }
+ .rela.text : { *(.rela.text) }
+ .rel.data : { *(.rel.data) }
+ .rela.data : { *(.rela.data) }
+ .rel.rodata : { *(.rel.rodata) }
+ .rela.rodata : { *(.rela.rodata) }
+ .rel.got : { *(.rel.got) }
+ .rela.got : { *(.rela.got) }
+ .rel.ctors : { *(.rel.ctors) }
+ .rela.ctors : { *(.rela.ctors) }
+ .rel.dtors : { *(.rel.dtors) }
+ .rela.dtors : { *(.rela.dtors) }
+ .rel.bss : { *(.rel.bss) }
+ .rela.bss : { *(.rela.bss) }
+ .rel.plt : { *(.rel.plt) }
+ .rela.plt : { *(.rela.plt) }
+ .init : { *(.init) }
+ .plt : { *(.plt) }
+ .text :
+ {
+ *(.text)
+ *(.fixup)
+ *(.got1)
+ } :text
+ _etext = .;
+ PROVIDE (etext = .);
+ .rodata :
+ {
+ *(.rodata)
+ *(.rodata1)
+ *(.rodata.str1.4)
+ *(.eh_frame)
+ } :text
+ .fini : { *(.fini) } =0
+ .ctors : { *(.ctors) }
+ .dtors : { *(.dtors) }
+
+ /* Read-write section, merged into data segment: */
+ . = (. + 0x00FF) & 0xFFFFFF00;
+ _erotext = .;
+ PROVIDE (erotext = .);
+ .reloc :
+ {
+ *(.got)
+ _GOT2_TABLE_ = .;
+ *(.got2)
+ _FIXUP_TABLE_ = .;
+ *(.fixup)
+ }
+ __got2_entries = (_FIXUP_TABLE_ - _GOT2_TABLE_) >> 2;
+ __fixup_entries = (. - _FIXUP_TABLE_) >> 2;
+
+ .data :
+ {
+ *(.data)
+ *(.data1)
+ *(.sdata)
+ *(.sdata2)
+ *(.dynamic)
+ CONSTRUCTORS
+ }
+ _edata = .;
+ PROVIDE (edata = .);
+
+ . = .;
+ __u_boot_cmd_start = .;
+ .u_boot_cmd : { *(.u_boot_cmd) }
+ __u_boot_cmd_end = .;
+
+ . = .;
+ __start___ex_table = .;
+ __ex_table : { *(__ex_table) }
+ __stop___ex_table = .;
+
+ . = ALIGN(256);
+ __init_begin = .;
+ .text.init : { *(.text.init) }
+ .data.init : { *(.data.init) }
+ . = ALIGN(256);
+ __init_end = .;
+
+ .bootpg ADDR(.text) - 0x1000 :
+ {
+ cpu/mpc85xx/start.o (.bootpg)
+ } :text = 0xffff
+
+ . = ADDR(.text) + 0x80000;
+
+ __bss_start = .;
+ .bss (NOLOAD) :
+ {
+ *(.sbss) *(.scommon)
+ *(.dynbss)
+ *(.bss)
+ *(COMMON)
+ } :bss
+
+ . = ALIGN(4);
+ _end = . ;
+ PROVIDE (end = .);
+}
diff --git a/cpu/mpc85xx/nand_init.c b/cpu/mpc85xx/nand_init.c
new file mode 100644
index 0000000..5bcf224
--- /dev/null
+++ b/cpu/mpc85xx/nand_init.c
@@ -0,0 +1,102 @@
+/*
+ * Copyright (C) 2008 Freescale Semiconductor, Inc.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+#include <common.h>
+#include <mpc85xx.h>
+#include <asm/fsl_law.h>
+#include <asm/io.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+void cpu_early_init_f(void)
+{
+ int i;
+
+ gd = (gd_t *)(CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_GBL_DATA_OFFSET);
+ /* clear initial global data */
+ for (i = 0; i < sizeof(gd_t); i++)
+ ((char *)gd)[i] = 0;
+}
+
+void cpu_init_f(void)
+{
+
+ volatile ccsr_gur_t *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR);
+ volatile ccsr_lbc_t *lbc = (void *)(CONFIG_SYS_MPC85xx_LBC_ADDR);
+ volatile ccsr_local_ecm_t *ecm = (void *)(CONFIG_SYS_MPC85xx_ECM_ADDR);
+ uint sys_clk, plat_ratio, bus_clk;
+
+ sys_clk = CONFIG_SYS_CLK_FREQ;
+ plat_ratio = (gur->porpllsr) & 0x0000003e;
+ plat_ratio >>= 1;
+ bus_clk = plat_ratio * sys_clk;
+ gd->bus_clk = bus_clk;
+
+ /*
+ * setup LAW1 for the NAND access.
+ * The 85xx has one default 8MB boot window(0xff800000-0xffffffff)
+ * we are using the default boot window to run the code, so
+ * the CONFIG_SYS_NAND_BASE must be between 0xff800000-0xffffffff.
+ * otherwise, it will broken.
+ */
+ out_be32(&ecm->lawbar1, (CONFIG_SYS_NAND_BASE >> 12) & 0xfffff);
+ out_be32(&ecm->lawar1, LAWAR_EN | (LAW_TRGT_IF_LBC << 20)
+ | LAW_SIZE_256K);
+#ifdef CONFIG_MPC8572
+ /*
+ * For 8572, the reset value of LCRR = 0x80000008 at NOR boot,
+ * however, the reset LCRR = 0x80000004 at NAND boot,
+ * make the NAND boot case same as NOR boot at here.
+ */
+ out_be32(&lbc->lcrr, 0x80000008);
+ asm volatile("isync");
+#endif
+ /*
+ * update BR0/OR0 from default to desired value. after update them,
+ * we must use the BR0[BA] to access the NAND flash.
+ */
+#if defined(CONFIG_NAND_BR_PRELIM) && defined(CONFIG_NAND_OR_PRELIM)
+ out_be32(&lbc->br0, CONFIG_NAND_BR_PRELIM);
+ out_be32(&lbc->or0, CONFIG_NAND_OR_PRELIM);
+#else
+#error CONFIG_NAND_BR_PRELIM, CONFIG_NAND_OR_PRELIM must be defined
+#endif
+}
+
+/*
+ * get ccb bus clock frquency
+ */
+unsigned long get_bus_clk(void)
+{
+ return gd->bus_clk;
+}
+
+/*
+ * get timebase clock frequency
+ */
+unsigned long get_tbclk(void)
+{
+ return (gd->bus_clk + 4UL) / 8UL;
+}
+
+void puts(const char *str)
+{
+ while (*str)
+ putc(*str++);
+}
diff --git a/cpu/mpc85xx/nand_start.S b/cpu/mpc85xx/nand_start.S
new file mode 100644
index 0000000..8de1b66
--- /dev/null
+++ b/cpu/mpc85xx/nand_start.S
@@ -0,0 +1,469 @@
+/*
+ * Copyright (C) 2004, 2007-2008 Freescale Semiconductor, Inc.
+ * Copyright (C) 2003 Motorola,Inc.
+ *
+ * nand_start.S is the start.S of the first stage bootstrap in
+ * NAND boot case.
+ * It set up the minimum cache, stack, CCSR, TLB and LAW entries for
+ * itself and the second stage u-boot.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+/* U-Boot Startup Code for Freescale 85xx PowerPC based Embedded Boards
+ *
+ * The processor starts at 0xfffffffc and the code is first executed in the
+ * last 4K page(0xfffff000-0xffffffff) in flash/rom.
+ *
+ */
+
+#include <config.h>
+#include <mpc85xx.h>
+#include <version.h>
+
+#define _LINUX_CONFIG_H 1 /* avoid reading Linux autoconf.h file */
+
+#include <ppc_asm.tmpl>
+#include <ppc_defs.h>
+
+#include <asm/cache.h>
+#include <asm/mmu.h>
+
+#ifndef CONFIG_IDENT_STRING
+#define CONFIG_IDENT_STRING ""
+#endif
+
+/*
+ * Set up GOT: Global Offset Table
+ *
+ * Use r14 to access the GOT
+ */
+ START_GOT
+ GOT_ENTRY(_GOT2_TABLE_)
+ GOT_ENTRY(__bss_start)
+ GOT_ENTRY(_end)
+ END_GOT
+
+/*
+ * e500 Startup -- after reset only the last 4KB of the effective
+ * address space is mapped in the MMU L2 TLB1 Entry0. we put the
+ * first stage boot code at THIS LAST page and basically does six
+ * things: clear some registers, update CCSRBAR, set up stack, TLB
+ * entries, LAW and random memory for the second stage boot code.
+ */
+ .text
+ .globl _start
+_start:
+ .long 0x27051956 /* U-BOOT Magic Number */
+ .globl version_string
+version_string:
+ .ascii U_BOOT_VERSION
+ .ascii " (", __DATE__, " - ", __TIME__, ")"
+ .ascii CONFIG_IDENT_STRING, "\0"
+
+ .align 4
+ .globl _start_e500
+/*
+ * We come from the relative jump instruction (b _start_e500) at
+ * 0xfffffffc, so we run at 0xfffffxxx, the default TLB1[0] 4K
+ * page space after core reset.
+ */
+_start_e500:
+
+/* clear registers, min e500 init */
+
+ /* clear machine status register */
+ li r0,0
+ mtmsr r0
+ isync
+
+ /* clear HID1, enable TB */
+ mtspr HID1, r0
+ lis r0,HID0_EMCP at h /* Enable machine check */
+ ori r0,r0,HID0_TBEN at l /* Enable Timebase */
+ mtspr HID0,r0
+
+ /* L1 cache invalidate */
+ li r0,2
+ mtspr L1CSR0,r0 /* invalidate d-cache */
+ mtspr L1CSR1,r0 /* invalidate i-cache */
+
+ mfspr r1,DBSR
+ mtspr DBSR,r1 /* clear all valid bits */
+
+ /* enable L1 cache */
+ lis r0,L1CSR0_CPE at H /* enable parity */
+ ori r0,r0,L1CSR0_DCE
+ mtspr L1CSR0,r0 /* enable L1 Dcache */
+ isync
+ mtspr L1CSR1,r0 /* enable L1 Icache */
+ isync
+ msync
+
+ /* clear and set up some registers */
+ li r0,0x0000
+ lis r1,0xffff
+ mtspr DEC,r0 /* prevent dec exceptions */
+ mttbl r0 /* prevent fit & wdt exceptions */
+ mttbu r0
+ mtspr TSR,r1 /* clear all timer exception status */
+ mtspr TCR,r0 /* disable all */
+ mtspr ESR,r0 /* clear exception syndrome register */
+ mtspr MCSR,r0 /* machine check syndrome register */
+ mtxer r0 /* clear integer exception register */
+
+/* create TLB1[15] 4K AS=0 mapping for the CCSRBAR_DEFAULT */
+ lis r3,FSL_BOOKE_MAS0(1, 15, 0)@h
+ ori r3,r3,FSL_BOOKE_MAS0(1, 15, 0)@l
+
+ /* valid, IPROT, TID=0, AS=0, TSIZE=4K */
+ lis r4,FSL_BOOKE_MAS1(1, 1, 0, 0, BOOKE_PAGESZ_4K)@h
+ ori r4,r4,FSL_BOOKE_MAS1(1, 1, 0, 0, BOOKE_PAGESZ_4K)@l
+
+ /* EPN=CCSRBAR_DEFAULT, *I*G* */
+ lis r5,FSL_BOOKE_MAS2(CONFIG_SYS_CCSRBAR_DEFAULT, (MAS2_I|MAS2_G))@h
+ ori r5,r5,FSL_BOOKE_MAS2(CONFIG_SYS_CCSRBAR_DEFAULT, (MAS2_I|MAS2_G))@l
+
+ /* RPN=CCSRBAR_DEFAULT */
+ lis r6,FSL_BOOKE_MAS3(CONFIG_SYS_CCSRBAR_DEFAULT, 0, (MAS3_SX|MAS3_SW|MAS3_SR))@h
+ ori r6,r6,FSL_BOOKE_MAS3(CONFIG_SYS_CCSRBAR_DEFAULT, 0, (MAS3_SX|MAS3_SW|MAS3_SR))@l
+ bl tlb_set
+
+#if (CONFIG_SYS_CCSRBAR_DEFAULT != CONFIG_SYS_CCSRBAR)
+ /* Special sequence needed to update CCSRBAR itself */
+ lis r4,CONFIG_SYS_CCSRBAR_DEFAULT at h
+ ori r4,r4,CONFIG_SYS_CCSRBAR_DEFAULT at l
+
+ lis r5,CONFIG_SYS_CCSRBAR at h
+ ori r5,r5,CONFIG_SYS_CCSRBAR at l
+ srwi r6,r5,12
+ stw r6,0(r4)
+ isync
+
+ lis r5, 0xffff
+ ori r5,r5, 0xf000
+ lwz r5,0(r5)
+ isync
+#endif
+
+/* create TLB0 mapping to the boot window */
+ lis r3,FSL_BOOKE_MAS0(0, 0, 0)@h
+ ori r3,r3,FSL_BOOKE_MAS0(0, 0, 0)@l
+
+ /* valid, IPROT=n/a, TID=0, AS=1, TSIZE=4K */
+ lis r4,FSL_BOOKE_MAS1(1, 0, 0, 1, BOOKE_PAGESZ_4K)@h
+ ori r4,r4,FSL_BOOKE_MAS1(1, 0, 0, 1, BOOKE_PAGESZ_4K)@l
+
+ /* EPN=TEXT_BASE & 0xfffff000, *I*G* */
+ lis r5,FSL_BOOKE_MAS2(TEXT_BASE & 0xfffff000, (MAS2_I|MAS2_G))@h
+ ori r5,r5,FSL_BOOKE_MAS2(TEXT_BASE & 0xfffff000, (MAS2_I|MAS2_G))@l
+
+ /* RPN=0xfffffxxx */
+ lis r6,FSL_BOOKE_MAS3(0xfffff000, 0, (MAS3_SX|MAS3_SW|MAS3_SR))@h
+ ori r6,r6,FSL_BOOKE_MAS3(0xfffff000, 0, (MAS3_SX|MAS3_SW|MAS3_SR))@l
+ bl tlb_set
+
+ lis r3,(MSR_IS|MSR_DS)@h
+ ori r3,r3,(MSR_IS|MSR_DS)@l
+ lis r4,switch_to_as1 at h
+ ori r4,r4,switch_to_as1 at l
+
+ mtspr SPRN_SRR0,r4
+ mtspr SPRN_SRR1,r3
+ rfi
+
+switch_to_as1:
+
+/*
+ * we run at TEXT_BASE (eg: 0xfff00xxx), the TLB0 4K AS=1 page space.
+ */
+
+/* overwrite the default 4K AS=0 TLB1[0], we set it for SYS_CCSRBAR with 1M */
+ lis r3,FSL_BOOKE_MAS0(1, 0, 0)@h
+ ori r3,r3,FSL_BOOKE_MAS0(1, 0, 0)@l
+
+ /* valid, IPROT, TID=0, AS=0, TSIZE=1M */
+ lis r4,FSL_BOOKE_MAS1(1, 1, 0, 0, BOOKE_PAGESZ_1M)@h
+ ori r4,r4,FSL_BOOKE_MAS1(1, 1, 0, 0, BOOKE_PAGESZ_1M)@l
+
+ /* EPN=SYS_CCSRBAR, *I*G* */
+ lis r5,FSL_BOOKE_MAS2(CONFIG_SYS_CCSRBAR, (MAS2_I|MAS2_G))@h
+ ori r5,r5,FSL_BOOKE_MAS2(CONFIG_SYS_CCSRBAR, (MAS2_I|MAS2_G))@l
+
+ /* RPN=SYS_CCSRBAR */
+ lis r6,FSL_BOOKE_MAS3(CONFIG_SYS_CCSRBAR, 0, (MAS3_SX|MAS3_SW|MAS3_SR))@h
+ ori r6,r6,FSL_BOOKE_MAS3(CONFIG_SYS_CCSRBAR, 0, (MAS3_SX|MAS3_SW|MAS3_SR))@l
+ bl tlb_set
+
+/* overwrite CCSRBAR_DEFAULT 4K TLB1[15], we set it for boot window with 256K */
+ lis r3,FSL_BOOKE_MAS0(1, 15, 0)@h
+ ori r3,r3,FSL_BOOKE_MAS0(1, 15, 0)@l
+
+ /* valid, IPROT, TID=0, AS=0, TSIZE=256K */
+ lis r4,FSL_BOOKE_MAS1(1, 1, 0, 0, BOOKE_PAGESZ_256K)@h
+ ori r4,r4,FSL_BOOKE_MAS1(1, 1, 0, 0, BOOKE_PAGESZ_256K)@l
+
+ /* EPN=TEXT_BASE align to 256K, *I*G* */
+ lis r5,FSL_BOOKE_MAS2(TEXT_BASE & 0xfffc0000, (MAS2_I|MAS2_G))@h
+ ori r5,r5,FSL_BOOKE_MAS2(TEXT_BASE & 0xfffc0000, (MAS2_I|MAS2_G))@l
+
+ /* RPN=TEXT_BASE & 0xfffc0000
+ * The 85xx has one default 8MB boot LAW 0xff800000->0xffffffff,
+ * we will create the new boot LAW (base=NAND_BASE, size=256K) for NAND
+ * to override the default boot LAW in nand_init.c. we assume
+ * TEXT_BASE = NAND_BASE, so there is one limitation:
+ * The CONFIG_NAND_BASE *MUST* be in the 0xff800000->0xffffffff.
+ */
+ lis r6,FSL_BOOKE_MAS3(TEXT_BASE & 0xfffc0000, 0, (MAS3_SX|MAS3_SW|MAS3_SR))@h
+ ori r6,r6,FSL_BOOKE_MAS3(TEXT_BASE & 0xfffc0000, 0, (MAS3_SX|MAS3_SW|MAS3_SR))@l
+ bl tlb_set
+
+/*
+ * switch running space from TEXT_BASE (eg: 0xfff00xxx) TLB0 4K AS=1
+ * page space to TEXT_BASE TLB1[15] AS=0 256K page space.
+ */
+ lis r3,switch_to_as0 at h
+ ori r3,r3,switch_to_as0 at l
+ li r4,0
+
+ mtspr SPRN_SRR0,r3
+ mtspr SPRN_SRR1,r4
+ rfi
+
+switch_to_as0:
+
+/* don't need AS=1 mapping any more, invalidate the TLB0 */
+ li r0,4
+ mtspr SPRN_MMUCSR0, r0
+
+/* make the CCSRBAR updated */
+ lis r3,CONFIG_SYS_CCSRBAR at h
+ lwz r4,CONFIG_SYS_CCSRBAR at l(r3)
+ isync
+
+/* create TLB1[14] mapping to the stack */
+ lis r3,FSL_BOOKE_MAS0(1, 14, 0)@h
+ ori r3,r3,FSL_BOOKE_MAS0(1, 14, 0)@l
+
+ /* valid, IPROT, TID=0, AS=0, TSIZE=16K */
+ lis r4,FSL_BOOKE_MAS1(1, 1, 0, 0, BOOKE_PAGESZ_16K)@h
+ ori r4,r4,FSL_BOOKE_MAS1(1, 1, 0, 0, BOOKE_PAGESZ_16K)@l
+
+ lis r5,FSL_BOOKE_MAS2(CONFIG_SYS_INIT_RAM_ADDR, 0)@h
+ ori r5,r5,FSL_BOOKE_MAS2(CONFIG_SYS_INIT_RAM_ADDR, 0)@l
+
+ lis r6,FSL_BOOKE_MAS3(CONFIG_SYS_INIT_RAM_ADDR, 0, (MAS3_SX|MAS3_SW|MAS3_SR))@h
+ ori r6,r6,FSL_BOOKE_MAS3(CONFIG_SYS_INIT_RAM_ADDR, 0, (MAS3_SX|MAS3_SW|MAS3_SR))@l
+ bl tlb_set
+
+/* L1 data cache is used for initial RAM */
+
+ /* allocate Initial RAM in data cache */
+ lis r3,CONFIG_SYS_INIT_RAM_ADDR at h
+ ori r3,r3,CONFIG_SYS_INIT_RAM_ADDR at l
+ mfspr r4,L1CFG0
+ andi. r4,r4,0x1ff
+ /* The initial RAM size is half of data cache
+ * r4=cache size * 1024 / (2 * L1 line size)
+ */
+ slwi r4,r4,(10 - 1 - L1_CACHE_SHIFT)
+ mtctr r4
+ li r0,0
+1:
+ dcbz r0,r3
+ dcbtls 0,r0,r3
+ addi r3,r3,CONFIG_SYS_CACHELINE_SIZE
+ bdnz 1b
+
+/* Setup the stack in L1 dcache */
+ lis r1,CONFIG_SYS_INIT_RAM_ADDR at h
+ ori r1,r1,CONFIG_SYS_INIT_SP_OFFSET at l
+
+ li r0,0
+ stwu r0,-4(r1)
+ stwu r0,-4(r1) /* Terminate call chain */
+
+ stwu r1,-8(r1) /* Save back chain and move SP */
+ lis r0,RESET_VECTOR at h /* Address of reset vector */
+ ori r0,r0,RESET_VECTOR at l
+ stwu r1,-8(r1) /* Save back chain and move SP */
+ stw r0,+12(r1) /* Save return addr (underflow vect) */
+
+/*
+ * We run at AS=0 space, leave three TLB entries:
+ * TLB1[0] - 1M CCSRBAR, TLB1[15] - 256K boot window
+ * TLB1[14] - 16K stack on L1 cache.
+ */
+ GET_GOT /* Initialize GOT access */
+
+ bl cpu_early_init_f
+ bl cpu_init_f
+ bl board_init_f
+
+ .global tlb_set
+tlb_set:
+ mtspr MAS0,r3
+ mtspr MAS1,r4
+ mtspr MAS2,r5
+ mtspr MAS3,r6
+ isync
+ msync
+ tlbwe
+ blr
+
+/*
+ * void relocate_code (addr_sp, gd, dest)
+ *
+ * This "function" does not return, instead it continues in RAM
+ * after relocating the monitor code.
+ *
+ * r3 = dest
+ * r4 = src
+ * r5 = length in bytes
+ * r6 = cachelinesize
+ */
+ .globl relocate_code
+relocate_code:
+ mr r1,r3 /* set new stack pointer */
+ mr r9,r4 /* save copy of global data pointer */
+ mr r10,r5 /* save copy of destination address */
+
+ mr r3,r5 /* destination address */
+ lis r4,CONFIG_SYS_MONITOR_BASE at h /* source address */
+ ori r4,r4,CONFIG_SYS_MONITOR_BASE at l
+ lwz r5,GOT(__bss_start)
+ sub r5,r5,r4
+ li r6,CONFIG_SYS_CACHELINE_SIZE /* cache line size */
+
+ /*
+ * Fix GOT pointer:
+ *
+ * New GOT-PTR = (old GOT-PTR - CONFIG_SYS_MONITOR_BASE)
+ * + Destination Address
+ *
+ * Offset:
+ */
+ sub r15,r10,r4
+
+ /* First our own GOT */
+ add r14,r14,r15
+ /* then the one used by the C code */
+ add r30,r30,r15
+
+ /*
+ * Now relocate code
+ */
+
+ cmplw cr1,r3,r4
+ addi r0,r5,3
+ srwi. r0,r0,2
+ beq cr1,4f /* in place copy is not necessary */
+ beq 7f /* protect against 0 count */
+ mtctr r0
+ bge cr1,2f
+
+ la r8,-4(r4)
+ la r7,-4(r3)
+1: lwzu r0,4(r8)
+ stwu r0,4(r7)
+ bdnz 1b
+ b 4f
+
+2: slwi r0,r0,2
+ add r8,r4,r0
+ add r7,r3,r0
+3: lwzu r0,-4(r8)
+ stwu r0,-4(r7)
+ bdnz 3b
+
+/*
+ * Now flush the cache: note that we must start from a cache aligned
+ * address. Otherwise we might miss one cache line.
+ */
+4: cmpwi r6,0
+ add r5,r3,r5
+ beq 7f /* always flush prefetch queue in any case */
+ subi r0,r6,1
+ andc r3,r3,r0
+ mr r4,r3
+5: dcbst 0,r4
+ add r4,r4,r6
+ cmplw r4,r5
+ blt 5b
+ sync /* wait for all dcbst to complete on bus */
+ mr r4,r3
+6: icbi 0,r4
+ add r4,r4,r6
+ cmplw r4,r5
+ blt 6b
+7: sync /* wait for all icbi to complete on bus */
+ isync
+
+/*
+ * We are done. Do not return, instead branch to second part of board
+ * initialization, now running from RAM.
+ */
+ addi r0,r10,in_ram - _start + _START_OFFSET
+ mtlr r0
+ blr
+
+in_ram:
+
+ /*
+ * Relocation Function, r14 point to got2+0x8000
+ *
+ * Adjust got2 pointers, no need to check for 0, this code
+ * already puts a few entries in the table.
+ */
+ li r0,__got2_entries at sectoff@l
+ la r3,GOT(_GOT2_TABLE_)
+ lwz r11,GOT(_GOT2_TABLE_)
+ mtctr r0
+ sub r11,r3,r11
+ addi r3,r3,-4
+1: lwzu r0,4(r3)
+ add r0,r0,r11
+ stw r0,0(r3)
+ bdnz 1b
+
+clear_bss:
+ /*
+ * Now clear BSS segment
+ */
+ lwz r3,GOT(__bss_start)
+ lwz r4,GOT(_end)
+
+ cmplw 0,r3,r4
+ beq 6f
+
+ li r0,0
+5:
+ stw r0,0(r3)
+ addi r3,r3,4
+ cmplw 0,r3,r4
+ bne 5b
+6:
+ mr r3,r9 /* global data pointer */
+ mr r4,r10 /* destination address */
+ bl board_init_r
+/*
+ * jump to board_init_r, run at AS=0 space, leave
+ * four TLB entries:
+ * TLB1[0] - 1M CCSRBAR, TLB1[15] - 256K NAND FLASH
+ * TLB1[14] - 16K stack on L1 cache, TLB1[8] - DDR memory
+ * and two LAW entries:
+ * LAW0 - DDR, LAW1 - NAND FLASH to the second u-boot.
+ */
diff --git a/cpu/mpc85xx/start.S b/cpu/mpc85xx/start.S
index 651ff1c..31cf729 100644
--- a/cpu/mpc85xx/start.S
+++ b/cpu/mpc85xx/start.S
@@ -183,6 +183,7 @@ _start_e500:
mtspr DBCR0,r0
#endif
+#ifndef CONFIG_NAND_U_BOOT
/* create a temp mapping in AS=1 to the boot window */
lis r6,FSL_BOOKE_MAS0(1, 15, 0)@h
ori r6,r6,FSL_BOOKE_MAS0(1, 15, 0)@l
@@ -254,6 +255,8 @@ switch_as:
addi r3,r3,CONFIG_SYS_CACHELINE_SIZE
bdnz 1b
+#endif
+
/* Jump out the last 4K page and continue to 'normal' start */
#ifdef CONFIG_SYS_RAMBOOT
b _start_cont
diff --git a/drivers/misc/fsl_law.c b/drivers/misc/fsl_law.c
index 44c9e91..9b18ca6 100644
--- a/drivers/misc/fsl_law.c
+++ b/drivers/misc/fsl_law.c
@@ -29,7 +29,6 @@
DECLARE_GLOBAL_DATA_PTR;
-#define LAWAR_EN 0x80000000
/* number of LAWs in the hw implementation */
#if defined(CONFIG_MPC8540) || defined(CONFIG_MPC8541) || \
defined(CONFIG_MPC8560) || defined(CONFIG_MPC8555)
@@ -166,7 +165,13 @@ void init_laws(void)
int i;
gd->used_laws = ~((1 << FSL_HW_NUM_LAWS) - 1);
-
+#ifdef CONFIG_NAND_U_BOOT
+ /*
+ * keep the LAW0 reserved as DDR at NAND boot case
+ * we init already the LAW0 for DDR in SPL nand stage
+ */
+ gd->used_laws |= (1 << 0);
+#endif
for (i = 0; i < num_law_entries; i++) {
if (law_table[i].index == -1)
set_next_law(law_table[i].addr, law_table[i].size,
diff --git a/include/asm-ppc/fsl_law.h b/include/asm-ppc/fsl_law.h
index 5bba08d..18eb9d6 100644
--- a/include/asm-ppc/fsl_law.h
+++ b/include/asm-ppc/fsl_law.h
@@ -9,6 +9,8 @@
#define SET_LAW(a, sz, trgt) \
{ .index = -1, .addr = a, .size = sz, .trgt_id = trgt }
+#define LAWAR_EN 0x80000000
+
enum law_size {
LAW_SIZE_4K = 0xb,
LAW_SIZE_8K,
diff --git a/include/configs/MPC8572DS.h b/include/configs/MPC8572DS.h
index 3365827..7776d7b 100644
--- a/include/configs/MPC8572DS.h
+++ b/include/configs/MPC8572DS.h
@@ -60,7 +60,11 @@
extern unsigned long get_board_sys_clk(unsigned long dummy);
extern unsigned long get_board_ddr_clk(unsigned long dummy);
#endif
+#ifdef CONFIG_NAND_SPL
+#define CONFIG_SYS_CLK_FREQ 100000000
+#else
#define CONFIG_SYS_CLK_FREQ get_board_sys_clk(0) /* sysclk for MPC85xx */
+#endif
#define CONFIG_DDR_CLK_FREQ get_board_ddr_clk(0) /* ddrclk for MPC85xx */
#define CONFIG_ICS307_REFCLK_HZ 33333000 /* ICS307 clock chip ref freq */
#define CONFIG_GET_CLK_FROM_ICS307 /* decode sysclk and ddrclk freq
@@ -95,8 +99,15 @@ extern unsigned long get_board_ddr_clk(unsigned long dummy);
/* DDR Setup */
#define CONFIG_FSL_DDR2
#undef CONFIG_FSL_DDR_INTERACTIVE
+
+#ifdef CONFIG_NAND_U_BOOT
+#undef CONFIG_SPD_EEPROM
+#undef CONFIG_DDR_SPD
+#else
#define CONFIG_SPD_EEPROM /* Use SPD EEPROM for DDR setup */
#define CONFIG_DDR_SPD
+#endif
+
#undef CONFIG_DDR_DLL
#define CONFIG_ECC_INIT_VIA_DDRCONTROLLER
@@ -164,8 +175,8 @@ extern unsigned long get_board_ddr_clk(unsigned long dummy);
#define CONFIG_SYS_FLASH_BASE 0xe0000000 /* start of FLASH 128M */
#define CONFIG_SYS_FLASH_BASE_PHYS CONFIG_SYS_FLASH_BASE
-#define CONFIG_SYS_BR0_PRELIM (BR_PHYS_ADDR((CONFIG_SYS_FLASH_BASE_PHYS + 0x8000000)) | BR_PS_16 | BR_V)
-#define CONFIG_SYS_OR0_PRELIM 0xf8000ff7
+#define CONFIG_FLASH_BR0_PRELIM (BR_PHYS_ADDR((CONFIG_SYS_FLASH_BASE_PHYS + 0x8000000)) | BR_PS_16 | BR_V)
+#define CONFIG_FLASH_OR0_PRELIM 0xf8000ff7
#define CONFIG_SYS_BR1_PRELIM (BR_PHYS_ADDR(CONFIG_SYS_FLASH_BASE_PHYS) | BR_PS_16 | BR_V)
#define CONFIG_SYS_OR1_PRELIM 0xf8000ff7
@@ -182,6 +193,10 @@ extern unsigned long get_board_ddr_clk(unsigned long dummy);
#define CONFIG_SYS_MONITOR_BASE TEXT_BASE /* start of monitor */
+#ifdef CONFIG_NAND_U_BOOT
+#define CONFIG_SYS_RAMBOOT
+#endif
+
#define CONFIG_FLASH_CFI_DRIVER
#define CONFIG_SYS_FLASH_CFI
#define CONFIG_SYS_FLASH_EMPTY_INFO
@@ -247,7 +262,11 @@ extern unsigned long get_board_ddr_clk(unsigned long dummy);
/* define to use L1 as initial stack */
#define CONFIG_L1_INIT_RAM
#define CONFIG_SYS_INIT_RAM_LOCK 1
+#ifdef CONFIG_NAND_SPL
#define CONFIG_SYS_INIT_RAM_ADDR 0xffd00000 /* Initial L1 address */
+#else
+#define CONFIG_SYS_INIT_RAM_ADDR 0x07f00000
+#endif
#define CONFIG_SYS_INIT_RAM_END 0x00004000 /* End of used area in RAM */
#define CONFIG_SYS_GBL_DATA_SIZE 128 /* num bytes initial data */
@@ -257,7 +276,12 @@ extern unsigned long get_board_ddr_clk(unsigned long dummy);
#define CONFIG_SYS_MONITOR_LEN (256 * 1024) /* Reserve 256 kB for Mon */
#define CONFIG_SYS_MALLOC_LEN (1024 * 1024) /* Reserved for malloc */
+#ifdef CONFIG_NAND_SPL
+#define CONFIG_SYS_NAND_BASE 0xfff00000
+#else
#define CONFIG_SYS_NAND_BASE 0xffa00000
+#endif
+
#define CONFIG_SYS_NAND_BASE_PHYS CONFIG_SYS_NAND_BASE
#define CONFIG_SYS_NAND_BASE_LIST { CONFIG_SYS_NAND_BASE,\
CONFIG_SYS_NAND_BASE + 0x40000, \
@@ -285,8 +309,17 @@ extern unsigned long get_board_ddr_clk(unsigned long dummy);
| OR_FCM_TRLX \
| OR_FCM_EHTR)
-#define CONFIG_SYS_BR2_PRELIM CONFIG_NAND_BR_PRELIM /* NAND Base Address */
-#define CONFIG_SYS_OR2_PRELIM CONFIG_NAND_OR_PRELIM /* NAND Options */
+#ifdef CONFIG_NAND_U_BOOT
+#define CONFIG_SYS_BR0_PRELIM CONFIG_NAND_BR_PRELIM /* CS0=NAND at NAND boot */
+#define CONFIG_SYS_OR0_PRELIM CONFIG_NAND_OR_PRELIM
+#define CONFIG_SYS_BR2_PRELIM CONFIG_FLASH_BR_PRELIM /* CS2=NOR at NAND boot */
+#define CONFIG_SYS_OR2_PRELIM CONFIG_FLASH_OR_PRELIM
+#else
+#define CONFIG_SYS_BR0_PRELIM CONFIG_FLASH_BR_PRELIM /* CS0=NOR at NOR boot */
+#define CONFIG_SYS_OR0_PRELIM CONFIG_FLASH_OR_PRELIM
+#define CONFIG_SYS_BR2_PRELIM CONFIG_NAND_BR_PRELIM /* CS2=NAND at NOR boot */
+#define CONFIG_SYS_OR2_PRELIM CONFIG_NAND_OR_PRELIM
+#endif
#define CONFIG_SYS_BR4_PRELIM ((CONFIG_SYS_NAND_BASE_PHYS + 0x40000)\
| (2<<BR_DECC_SHIFT) /* Use HW ECC */ \
@@ -308,6 +341,19 @@ extern unsigned long get_board_ddr_clk(unsigned long dummy);
| BR_V) /* valid */
#define CONFIG_SYS_OR6_PRELIM CONFIG_NAND_OR_PRELIM /* NAND Options */
+/* NAND boot
+ * we load the first stage and second stage binary
+ * from NAND to RAM, so the RAM will have the 1st
+ * and 2nd boot code. then, code jump to _START to
+ * excute the second stage boot.
+ */
+#define CONFIG_SYS_NAND_SPL_SIZE 0x4000 /* the first stage 16KB bootstrap */
+#define CONFIG_SYS_NAND_U_BOOT_START 0x01000000 /* the second stage u-boot */
+#define CONFIG_SYS_NAND_U_BOOT_OFFS 0 /* offset we load u-boot-nand.bin from NAND */
+#define CONFIG_SYS_NAND_U_BOOT_DST (CONFIG_SYS_NAND_U_BOOT_START \
+ - CONFIG_SYS_NAND_SPL_SIZE)
+#define CONFIG_SYS_NAND_U_BOOT_SIZE (CONFIG_SYS_NAND_SPL_SIZE + (512 << 10))
+#define CONFIG_SYS_NAND_U_BOOT_RELOC 0x00010000
/* Serial Port - controlled on board with jumper J8
@@ -507,6 +553,11 @@ extern unsigned long get_board_ddr_clk(unsigned long dummy);
/*
* Environment
*/
+#if defined(CONFIG_NAND_U_BOOT)
+#define CONFIG_ENV_IS_IN_NAND 1
+#define CONFIG_ENV_SIZE CONFIG_SYS_NAND_BLOCK_SIZE
+#define CONFIG_ENV_OFFSET CONFIG_SYS_NAND_U_BOOT_SIZE
+#elif !defined(CONFIG_SYS_RAMBOOT)
#define CONFIG_ENV_IS_IN_FLASH 1
#if CONFIG_SYS_MONITOR_BASE > 0xfff80000
#define CONFIG_ENV_ADDR 0xfff80000
@@ -515,6 +566,11 @@ extern unsigned long get_board_ddr_clk(unsigned long dummy);
#endif
#define CONFIG_ENV_SIZE 0x2000
#define CONFIG_ENV_SECT_SIZE 0x20000 /* 128K (one sector) */
+#else
+#define CONFIG_ENV_IS_NOWHERE 1
+#define CONFIG_ENV_ADDR (CONFIG_SYS_MONITOR_BASE - 0x2000)
+#define CONFIG_ENV_SIZE 0x2000
+#endif
#define CONFIG_LOADS_ECHO 1 /* echo on for serial download */
#define CONFIG_SYS_LOADS_BAUD_CHANGE 1 /* allow baudrate change */
diff --git a/nand_spl/board/freescale/mpc8572ds/Makefile b/nand_spl/board/freescale/mpc8572ds/Makefile
new file mode 100644
index 0000000..6ed1fd5
--- /dev/null
+++ b/nand_spl/board/freescale/mpc8572ds/Makefile
@@ -0,0 +1,110 @@
+#
+# (C) Copyright 2007
+# Stefan Roese, DENX Software Engineering, sr at denx.de.
+# (C) Copyright 2008 Freescale Semiconductor
+#
+# See file CREDITS for list of people who contributed to this
+# project.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as
+# published by the Free Software Foundation; either version 2 of
+# the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+# MA 02111-1307 USA
+#
+
+NAND_SPL := y
+# we should set TEXT_BASE=CONFIG_SYS_NAND_BASE
+TEXT_BASE := 0xfff00000
+PAD_TO := 0xfff04000
+
+include $(TOPDIR)/config.mk
+
+LDSCRIPT= $(TOPDIR)/nand_spl/board/$(BOARDDIR)/u-boot.lds
+LDFLAGS = -Bstatic -T $(LDSCRIPT) -Ttext $(TEXT_BASE) $(PLATFORM_LDFLAGS)
+AFLAGS += -DCONFIG_NAND_SPL
+CFLAGS += -DCONFIG_NAND_SPL
+PLATFORM_LIBS += -L $(shell dirname `$(CC) $(CFLAGS) -print-libgcc-file-name`) -lgcc
+
+SOBJS = nand_start.o resetvec.o ticks.o
+COBJS = nand_boot_fsl_elbc.o ns16550.o nand_init.o fixed-sdram.o nand_boot.o \
+ time.o cache.o
+
+SRCS := $(addprefix $(obj),$(SOBJS:.o=.S) $(COBJS:.o=.c))
+OBJS := $(addprefix $(obj),$(SOBJS) $(COBJS))
+__OBJS := $(SOBJS) $(COBJS)
+LNDIR := $(OBJTREE)/nand_spl/board/$(BOARDDIR)
+
+nandobj := $(OBJTREE)/nand_spl/
+
+ALL = $(nandobj)u-boot-spl $(nandobj)u-boot-spl.bin $(nandobj)u-boot-spl-16k.bin
+
+all: $(obj).depend $(ALL)
+
+$(nandobj)u-boot-spl-16k.bin: $(nandobj)u-boot-spl
+ $(OBJCOPY) ${OBJCFLAGS} --pad-to=$(PAD_TO) -O binary $< $@
+
+$(nandobj)u-boot-spl.bin: $(nandobj)u-boot-spl
+ $(OBJCOPY) ${OBJCFLAGS} -O binary $< $@
+
+$(nandobj)u-boot-spl: $(OBJS)
+ cd $(LNDIR) && $(LD) $(LDFLAGS) $(__OBJS) $(PLATFORM_LIBS) \
+ -Map $(nandobj)u-boot-spl.map \
+ -o $(nandobj)u-boot-spl
+
+# create symbolic links for common files
+
+$(obj)nand_start.S:
+ ln -sf $(SRCTREE)/cpu/mpc85xx/nand_start.S $(obj)nand_start.S
+
+$(obj)resetvec.S:
+ ln -sf $(SRCTREE)/cpu/mpc85xx/resetvec.S $(obj)resetvec.S
+
+$(obj)nand_init.c:
+ ln -sf $(SRCTREE)/cpu/mpc85xx/nand_init.c $(obj)nand_init.c
+
+$(obj)nand_boot_fsl_elbc.c:
+ ln -sf $(SRCTREE)/nand_spl/nand_boot_fsl_elbc.c \
+ $(obj)nand_boot_fsl_elbc.c
+
+$(obj)fixed-sdram.c:
+ ln -sf $(SRCTREE)/board/$(BOARDDIR)/fixed-sdram.c $(obj)fixed-sdram.c
+
+$(obj)nand_boot.c:
+ ln -sf $(SRCTREE)/board/$(BOARDDIR)/nand_boot.c $(obj)nand_boot.c
+
+$(obj)ns16550.c:
+ ln -sf $(SRCTREE)/drivers/serial/ns16550.c $(obj)ns16550.c
+
+$(obj)time.c:
+ ln -sf $(SRCTREE)/lib_ppc/time.c $(obj)time.c
+
+$(obj)ticks.S:
+ ln -sf $(SRCTREE)/lib_ppc/ticks.S $(obj)ticks.S
+
+$(obj)cache.c:
+ ln -sf $(SRCTREE)/lib_ppc/cache.c $(obj)cache.c
+
+#########################################################################
+
+$(obj)%.o: $(obj)%.S
+ $(CC) $(AFLAGS) -c -o $@ $<
+
+$(obj)%.o: $(obj)%.c
+ $(CC) $(CFLAGS) -c -o $@ $<
+
+# defines $(obj).depend target
+include $(SRCTREE)/rules.mk
+
+sinclude $(obj).depend
+
+#########################################################################
diff --git a/nand_spl/board/freescale/mpc8572ds/u-boot.lds b/nand_spl/board/freescale/mpc8572ds/u-boot.lds
new file mode 100644
index 0000000..877812e
--- /dev/null
+++ b/nand_spl/board/freescale/mpc8572ds/u-boot.lds
@@ -0,0 +1,56 @@
+/*
+ * (C) Copyright 2006
+ * Wolfgang Denk, DENX Software Engineering, wd at denx.de.
+ *
+ * Copyright 2008 Freescale Semiconductor, Inc.
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+OUTPUT_ARCH(powerpc)
+SECTIONS
+{
+ .resetvec 0xfff00ffc : {
+ *(.resetvec)
+ } = 0xffff
+
+ .text : {
+ nand_start.o (.text)
+ *(.text*)
+ . = ALIGN(16);
+ *(.rodata*)
+ *(.eh_frame)
+ }
+
+ . = ALIGN(8);
+ .data : {
+ *(.data*)
+ *(.sdata*)
+ _GOT2_TABLE_ = .;
+ *(.got2)
+ __got2_entries = (. - _GOT2_TABLE_) >> 2;
+ }
+
+ . = ALIGN(8);
+ __bss_start = .;
+ .bss (NOLOAD) : { *(.*bss) }
+ _end = .;
+}
+ENTRY(_start)
+ASSERT(_end <= 0xfff01000, "NAND bootstrap too big");
--
1.5.4
More information about the U-Boot
mailing list