[U-Boot] [PATCH 00/10] add boot from NAND/eSDHC/eSPI support

The MPC8536E is capable of booting form NAND/eSDHC/eSPI, this patchset implements these three bootup methods in a unified way - all of these use the general cpu/mpc85xx/start.S, and load the second stage image to L2SRAM which lets us use the SPD to initialize the SDRAM.
[PATCH 01/10] mkconfig: parse top level makefile target to multiple config targets [PATCH 02/10] NAND boot: change NAND loader's relocate SP to CONFIG param [PATCH 03/10] Add L2SRAM Register's macro definition
[PATCH 04/10] 85xx: add boot from NAND/eSDHC/eSPI support [PATCH 05/10] NAND boot: MPC8536DS support [PATCH 06/10] On-chip ROM boot: MPC8536DS support
Add description for the different boot method: [PATCH 07/10] Add README.mpc8536ds
The follow three patches implement save env to SDCard: [PATCH 08/10] Make mmc init come before env_relocate [PATCH 09/10] Add support for save environment variable to MMC/SD card [PATCH 10/10] Get the address of env on the SDCard

To simplify the top level makefile it useful to be able to paree the top level makefile target to multiple individual target, then put them to the config.h and config.mk, leave the board config file and board makefile to handle the different targets. --- mkconfig | 11 +++++++++++ 1 files changed, 11 insertions(+), 0 deletions(-)
diff --git a/mkconfig b/mkconfig index b0bbbd1..d9e216d 100755 --- a/mkconfig +++ b/mkconfig @@ -10,12 +10,14 @@
APPEND=no # Default: Create new config file BOARD_NAME="" # Name to print in make output +TARGETS=""
while [ $# -gt 0 ] ; do case "$1" in --) shift ; break ;; -a) shift ; APPEND=yes ;; -n) shift ; BOARD_NAME="${1%%_config}" ; shift ;; + -t) shift ; TARGETS="`echo $1 | sed 's:_: :g'` ${TARGETS}" ; shift ;; *) break ;; esac done @@ -72,6 +74,10 @@ echo "BOARD = $4" >> config.mk
[ "$6" ] && [ "$6" != "NULL" ] && echo "SOC = $6" >> config.mk
+for i in ${TARGETS} ; do + echo "CONFIG_OPT_${i} = y" >> config.mk ; +done + # # Create board specific header file # @@ -82,6 +88,11 @@ else > config.h # Create new config file fi echo "/* Automatically generated - do not edit */" >>config.h + +for i in ${TARGETS} ; do + echo "#define CONFIG_OPT_${i} 1" >>config.h ; +done + echo "#include <configs/$1.h>" >>config.h echo "#include <asm/config.h>" >>config.h

So that we can set the NAND loader's relocate stack pointer to the value other than the relocate address + 0x10000.
Signed-off-by: Mingkai Hu Mingkai.hu@freescale.com --- board/freescale/mpc8313erdb/mpc8313erdb.c | 2 +- board/sheldon/simpc8313/simpc8313.c | 2 +- include/configs/MPC8313ERDB.h | 1 + include/configs/SIMPC8313.h | 1 + 4 files changed, 4 insertions(+), 2 deletions(-)
diff --git a/board/freescale/mpc8313erdb/mpc8313erdb.c b/board/freescale/mpc8313erdb/mpc8313erdb.c index 9ffd4bf..e5f62ae 100644 --- a/board/freescale/mpc8313erdb/mpc8313erdb.c +++ b/board/freescale/mpc8313erdb/mpc8313erdb.c @@ -140,7 +140,7 @@ void board_init_f(ulong bootflag) puts("NAND boot... "); init_timebase(); initdram(0); - relocate_code(CONFIG_SYS_NAND_U_BOOT_RELOC + 0x10000, (gd_t *)gd, + relocate_code(CONFIG_SYS_NAND_U_BOOT_RELOC_SP, (gd_t *)gd, CONFIG_SYS_NAND_U_BOOT_RELOC); }
diff --git a/board/sheldon/simpc8313/simpc8313.c b/board/sheldon/simpc8313/simpc8313.c index 25e5c24..1044de2 100644 --- a/board/sheldon/simpc8313/simpc8313.c +++ b/board/sheldon/simpc8313/simpc8313.c @@ -112,7 +112,7 @@ void board_init_f(ulong bootflag) puts("NAND boot... "); init_timebase(); initdram(0); - relocate_code(CONFIG_SYS_NAND_U_BOOT_RELOC + 0x10000, (gd_t *)gd, + relocate_code(CONFIG_SYS_NAND_U_BOOT_RELOC_SP, (gd_t *)gd, CONFIG_SYS_NAND_U_BOOT_RELOC); }
diff --git a/include/configs/MPC8313ERDB.h b/include/configs/MPC8313ERDB.h index d9aa60b..4645d3b 100644 --- a/include/configs/MPC8313ERDB.h +++ b/include/configs/MPC8313ERDB.h @@ -242,6 +242,7 @@ #define CONFIG_SYS_NAND_U_BOOT_START 0x00100100 #define CONFIG_SYS_NAND_U_BOOT_OFFS 16384 #define CONFIG_SYS_NAND_U_BOOT_RELOC 0x00010000 +#define CONFIG_SYS_NAND_U_BOOT_RELOC_SP (CONFIG_SYS_NAND_U_BOOT_RELOC + 0x10000)
#define CONFIG_SYS_NAND_BR_PRELIM ( CONFIG_SYS_NAND_BASE \ | (2<<BR_DECC_SHIFT) /* Use HW ECC */ \ diff --git a/include/configs/SIMPC8313.h b/include/configs/SIMPC8313.h index b847ce8..866ff17 100644 --- a/include/configs/SIMPC8313.h +++ b/include/configs/SIMPC8313.h @@ -136,6 +136,7 @@ #define CONFIG_SYS_NAND_U_BOOT_DST 0x00100000 #define CONFIG_SYS_NAND_U_BOOT_START 0x00100100 #define CONFIG_SYS_NAND_U_BOOT_RELOC 0x00010000 +#define CONFIG_SYS_NAND_U_BOOT_RELOC_SP (CONFIG_SYS_NAND_U_BOOT_RELOC + 0x10000)
#define CONFIG_SYS_NAND_BR_PRELIM ( CONFIG_SYS_NAND_BASE \ | (2<<BR_DECC_SHIFT) /* Use HW ECC */ \

Signed-off-by: Mingkai Hu Mingkai.hu@freescale.com --- cpu/mpc85xx/cpu_init.c | 5 +++-- include/asm-ppc/immap_85xx.h | 5 +++++ 2 files changed, 8 insertions(+), 2 deletions(-)
diff --git a/cpu/mpc85xx/cpu_init.c b/cpu/mpc85xx/cpu_init.c index 41de694..c4d1a9d 100644 --- a/cpu/mpc85xx/cpu_init.c +++ b/cpu/mpc85xx/cpu_init.c @@ -330,11 +330,12 @@ int cpu_init_r(void) break; }
- if (l2cache->l2ctl & 0x80000000) { + if (l2cache->l2ctl & MPC85xx_L2CTL_L2E) { puts("already enabled"); l2srbar = l2cache->l2srbar0; #ifdef CONFIG_SYS_INIT_L2_ADDR - if (l2cache->l2ctl & 0x00010000 && l2srbar >= CONFIG_SYS_FLASH_BASE) { + if (l2cache->l2ctl & MPC85xx_L2CTL_L2SRAM_ENTIRE + && l2srbar >= CONFIG_SYS_FLASH_BASE) { l2srbar = CONFIG_SYS_INIT_L2_ADDR; l2cache->l2srbar0 = l2srbar; printf("moving to 0x%08x", CONFIG_SYS_INIT_L2_ADDR); diff --git a/include/asm-ppc/immap_85xx.h b/include/asm-ppc/immap_85xx.h index 0efef05..375d804 100644 --- a/include/asm-ppc/immap_85xx.h +++ b/include/asm-ppc/immap_85xx.h @@ -411,6 +411,11 @@ typedef struct ccsr_l2cache { char res15[420]; } ccsr_l2cache_t;
+#define MPC85xx_L2CTL_L2E 0x80000000 +#define MPC85xx_L2CTL_L2SRAM_ENTIRE 0x00010000 +#define MPC85xx_L2ERRDIS_MBECC 0x00000008 +#define MPC85xx_L2ERRDIS_SBECC 0x00000004 + /* * DMA Registers(0x2_1000-0x2_2000) */

The MPC8536E is capable of booting form NAND/eSDHC/eSPI, this patch implements these three bootup methods in a unified way - all of these use the general cpu/mpc85xx/start.S, and load the main image to L2SRAM which lets us use the SPD to initialize the SDRAM.
For all three bootup methods, the bootup process can be divided into two stages: the first stage will initialize the corresponding controller, configure the L2SRAM, then copy the second stage image to L2SRAM and jump to it. The second stage image is just like the general U-Boot image to configure all the hardware and boot up to U-Boot command line.
When boot from NAND, the eLBC controller will first load the first stage image to internal 4K RAM buffer because it's also stored on the NAND flash. The first stage image, also call 4K NADN loader, will initialize the L2SRAM, load the second stage image to L2SRAM and jump to it. The 4K NAND loader's code comes from the corresponding nand_spl directory, along with the code twisted by CONFIG_NAND_SPL.
When boot from eSDHC/eSPI, there's no such a first stage image because the CPU ROM code does the same work. It will initialize the L2SRAM according to the config addr/word pairs on the fixed address and initialize the eSDHC/eSPI controller, then load the second stage image to L2SRAM and jump to it.
The macro CONFIG_SYS_RAMBOOT is used to control the code to produce the second stage image for all different bootup methods. It's set in the board config file when one of the bootup methods above is selected.
Signed-off-by: Mingkai Hu Mingkai.hu@freescale.com --- cpu/mpc85xx/cpu_init.c | 19 +++++++++++++++++++ cpu/mpc85xx/start.S | 23 ++++++++++++++++++++++- cpu/mpc85xx/tlb.c | 4 ++++ drivers/misc/fsl_law.c | 2 ++ 4 files changed, 47 insertions(+), 1 deletions(-)
diff --git a/cpu/mpc85xx/cpu_init.c b/cpu/mpc85xx/cpu_init.c index c4d1a9d..c931d4a 100644 --- a/cpu/mpc85xx/cpu_init.c +++ b/cpu/mpc85xx/cpu_init.c @@ -291,6 +291,25 @@ int cpu_init_r(void)
asm("msync;isync"); cache_ctl = l2cache->l2ctl; + +#if defined(CONFIG_SYS_RAMBOOT) && defined(CONFIG_SYS_INIT_L2_ADDR) + if (cache_ctl & MPC85xx_L2CTL_L2E) { + /* Clear L2 SRAM memory-mapped base address */ + out_be32(&l2cache->l2srbar0, 0x0); + out_be32(&l2cache->l2srbar1, 0x0); + + /* set MBECCDIS=0, SBECCDIS=0 */ + clrbits_be32(&l2cache->l2errdis, + (MPC85xx_L2ERRDIS_MBECC | + MPC85xx_L2ERRDIS_SBECC)); + + /* set L2E=0, L2SRAM=0 */ + clrbits_be32(&l2cache->l2ctl, + (MPC85xx_L2CTL_L2E | + MPC85xx_L2CTL_L2SRAM_ENTIRE)); + } +#endif + l2siz_field = (cache_ctl >> 28) & 0x3;
switch (l2siz_field) { diff --git a/cpu/mpc85xx/start.S b/cpu/mpc85xx/start.S index 4f7236f..de13c25 100644 --- a/cpu/mpc85xx/start.S +++ b/cpu/mpc85xx/start.S @@ -57,10 +57,12 @@ GOT_ENTRY(_GOT2_TABLE_) GOT_ENTRY(_FIXUP_TABLE_)
+#ifndef CONFIG_NAND_SPL GOT_ENTRY(_start) GOT_ENTRY(_start_of_vectors) GOT_ENTRY(_end_of_vectors) GOT_ENTRY(transfer_to_handler) +#endif
GOT_ENTRY(__init_end) GOT_ENTRY(_end) @@ -235,10 +237,11 @@ _start_e500:
#endif /* CONFIG_MPC8569 */
- /* create a temp mapping in AS=1 to the 4M boot window */ lis r6,FSL_BOOKE_MAS0(1, 15, 0)@h ori r6,r6,FSL_BOOKE_MAS0(1, 15, 0)@l
+#ifndef CONFIG_SYS_RAMBOOT + /* create a temp mapping in AS=1 to the 4M boot window */ lis r7,FSL_BOOKE_MAS1(1, 1, 0, 1, BOOKE_PAGESZ_4M)@h ori r7,r7,FSL_BOOKE_MAS1(1, 1, 0, 1, BOOKE_PAGESZ_4M)@l
@@ -248,6 +251,20 @@ _start_e500: /* The 85xx has the default boot window 0xff800000 - 0xffffffff */ lis r9,FSL_BOOKE_MAS3(0xffc00000, 0, (MAS3_SX|MAS3_SW|MAS3_SR))@h ori r9,r9,FSL_BOOKE_MAS3(0xffc00000, 0, (MAS3_SX|MAS3_SW|MAS3_SR))@l +#else + /* + * create a temp mapping in AS=1 to the 1M TEXT_BASE space, the main + * image has been relocated to TEXT_BASE on the second stage. + */ + lis r7,FSL_BOOKE_MAS1(1, 1, 0, 1, BOOKE_PAGESZ_1M)@h + ori r7,r7,FSL_BOOKE_MAS1(1, 1, 0, 1, BOOKE_PAGESZ_1M)@l + + lis r8,FSL_BOOKE_MAS2(TEXT_BASE, (MAS2_I|MAS2_G))@h + ori r8,r8,FSL_BOOKE_MAS2(TEXT_BASE, (MAS2_I|MAS2_G))@l + + lis r9,FSL_BOOKE_MAS3(TEXT_BASE, 0, (MAS3_SX|MAS3_SW|MAS3_SR))@h + ori r9,r9,FSL_BOOKE_MAS3(TEXT_BASE, 0, (MAS3_SX|MAS3_SW|MAS3_SR))@l +#endif
mtspr MAS0,r6 mtspr MAS1,r7 @@ -359,6 +376,7 @@ _start_cont: bl board_init_f isync
+#ifndef CONFIG_NAND_SPL . = EXC_OFF_SYS_RESET .globl _start_of_vectors _start_of_vectors: @@ -813,6 +831,7 @@ in32: in32r: lwbrx r3,r0,r3 blr +#endif /* !CONFIG_NAND_SPL */
/*------------------------------------------------------------------------------*/
@@ -975,6 +994,7 @@ clear_bss: mr r4,r10 /* Destination Address */ bl board_init_r
+#ifndef CONFIG_NAND_SPL /* * Copy exception vector code to low memory * @@ -1122,3 +1142,4 @@ flush_dcache: isync
blr +#endif /* !CONFIG_NAND_SPL */ diff --git a/cpu/mpc85xx/tlb.c b/cpu/mpc85xx/tlb.c index 46925f1..962c4c7 100644 --- a/cpu/mpc85xx/tlb.c +++ b/cpu/mpc85xx/tlb.c @@ -59,6 +59,7 @@ void set_tlb(u8 tlb, u32 epn, u64 rpn, #endif }
+#ifndef CONFIG_NAND_SPL void disable_tlb(u8 esel) { u32 _mas0, _mas1, _mas2, _mas3, _mas7; @@ -83,6 +84,7 @@ void disable_tlb(u8 esel) addrmap_set_entry(0, 0, 0, esel); #endif } +#endif
void invalidate_tlb(u8 tlb) { @@ -125,6 +127,7 @@ void init_addr_map(void) } #endif
+#ifndef CONFIG_NAND_SPL #ifndef CONFIG_SYS_DDR_TLB_START #define CONFIG_SYS_DDR_TLB_START 8 #endif @@ -172,3 +175,4 @@ unsigned int setup_ddr_tlbs(unsigned int memsize_in_meg) */ return memsize_in_meg; } +#endif /* !CONFIG_NAND_SPL */ diff --git a/drivers/misc/fsl_law.c b/drivers/misc/fsl_law.c index f7d454d..473d196 100644 --- a/drivers/misc/fsl_law.c +++ b/drivers/misc/fsl_law.c @@ -72,6 +72,7 @@ int set_next_law(phys_addr_t addr, enum law_size sz, enum law_trgt_if id) return idx; }
+#ifndef CONFIG_NAND_SPL int set_last_law(phys_addr_t addr, enum law_size sz, enum law_trgt_if id) { u32 idx; @@ -164,6 +165,7 @@ int set_ddr_laws(u64 start, u64 sz, enum law_trgt_if id)
return 0; } +#endif
void init_laws(void) {

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 --- Makefile | 5 +- board/freescale/mpc8536ds/config.mk | 6 + board/freescale/mpc8536ds/tlb.c | 11 ++ board/freescale/mpc8536ds/u-boot-nand.lds | 140 ++++++++++++++++++++++++ cpu/mpc85xx/nand_init.c | 109 ++++++++++++++++++ include/configs/MPC8536DS.h | 85 +++++++++++---- nand_spl/board/freescale/mpc8536ds/Makefile | 119 ++++++++++++++++++++ nand_spl/board/freescale/mpc8536ds/nand_boot.c | 99 +++++++++++++++++ nand_spl/board/freescale/mpc8536ds/u-boot.lds | 67 +++++++++++ 9 files changed, 619 insertions(+), 22 deletions(-) create mode 100644 board/freescale/mpc8536ds/u-boot-nand.lds create mode 100644 cpu/mpc85xx/nand_init.c create mode 100644 nand_spl/board/freescale/mpc8536ds/Makefile create mode 100644 nand_spl/board/freescale/mpc8536ds/nand_boot.c create mode 100644 nand_spl/board/freescale/mpc8536ds/u-boot.lds
diff --git a/Makefile b/Makefile index 329e0f5..db69ef3 100644 --- a/Makefile +++ b/Makefile @@ -2406,8 +2406,9 @@ vme8349_config: unconfig ATUM8548_config: unconfig @$(MKCONFIG) $(@:_config=) ppc mpc85xx atum8548
-MPC8536DS_config: unconfig - @$(MKCONFIG) $(@:_config=) ppc mpc85xx mpc8536ds freescale +MPC8536DS_config \ +MPC8536DS_NAND_config: unconfig + @$(MKCONFIG) -t $(@:_config=) MPC8536DS ppc mpc85xx mpc8536ds freescale
MPC8540ADS_config: unconfig @$(MKCONFIG) $(@:_config=) ppc mpc85xx mpc8540ads freescale diff --git a/board/freescale/mpc8536ds/config.mk b/board/freescale/mpc8536ds/config.mk index 9775ff4..f747fe8 100644 --- a/board/freescale/mpc8536ds/config.mk +++ b/board/freescale/mpc8536ds/config.mk @@ -23,6 +23,12 @@ # # mpc8536ds board # +ifndef NAND_SPL +ifeq ($(CONFIG_OPT_NAND),y) +TEXT_BASE = 0xf8f82000 +endif +endif + ifndef TEXT_BASE TEXT_BASE = 0xeff80000 endif diff --git a/board/freescale/mpc8536ds/tlb.c b/board/freescale/mpc8536ds/tlb.c index 35a13d4..dc52d7f 100644 --- a/board/freescale/mpc8536ds/tlb.c +++ b/board/freescale/mpc8536ds/tlb.c @@ -71,6 +71,17 @@ struct fsl_e_tlb_entry tlb_table[] = { SET_TLB_ENTRY(1, CONFIG_SYS_NAND_BASE, CONFIG_SYS_NAND_BASE_PHYS, MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G, 0, 4, BOOKE_PAGESZ_1M, 1), + +#if defined(CONFIG_SYS_RAMBOOT) && defined(CONFIG_SYS_INIT_L2_ADDR) + /* *I*G - L2SRAM */ + SET_TLB_ENTRY(1, CONFIG_SYS_INIT_L2_ADDR, CONFIG_SYS_INIT_L2_ADDR_PHYS, + MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G, + 0, 5, BOOKE_PAGESZ_256K, 1), + SET_TLB_ENTRY(1, CONFIG_SYS_INIT_L2_ADDR + 0x40000, + CONFIG_SYS_INIT_L2_ADDR_PHYS + 0x40000, + MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G, + 0, 6, BOOKE_PAGESZ_256K, 1), +#endif };
int num_tlb_entries = ARRAY_SIZE(tlb_table); diff --git a/board/freescale/mpc8536ds/u-boot-nand.lds b/board/freescale/mpc8536ds/u-boot-nand.lds new file mode 100644 index 0000000..c14e946 --- /dev/null +++ b/board/freescale/mpc8536ds/u-boot-nand.lds @@ -0,0 +1,140 @@ +/* + * Copyright 2009 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..c29b22d --- /dev/null +++ b/cpu/mpc85xx/nand_init.c @@ -0,0 +1,109 @@ +/* + * Copyright (C) 2009 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 + */ + +#include <common.h> +#include <asm/io.h> +#include <asm/mmu.h> +#include <asm/fsl_law.h> + +DECLARE_GLOBAL_DATA_PTR; + +void cpu_init_early_f(void) +{ + int i; + + /* Pointer is writable since we allocated a register for it */ + 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; + + set_tlb(0, CONFIG_SYS_CCSRBAR, CONFIG_SYS_CCSRBAR_PHYS, + MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G, + 1, 0, BOOKE_PAGESZ_4K, 0); + + /* set up CCSR if we want it moved */ +#if (CONFIG_SYS_CCSRBAR_DEFAULT != CONFIG_SYS_CCSRBAR_PHYS) + { + volatile u32 *ccsr_virt = + (volatile u32 *)(CONFIG_SYS_CCSRBAR + 0x1000); + + set_tlb(0, (u32)ccsr_virt, CONFIG_SYS_CCSRBAR_DEFAULT, + MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G, + 1, 1, BOOKE_PAGESZ_4K, 0); + + in_be32(ccsr_virt); + out_be32(ccsr_virt, CONFIG_SYS_CCSRBAR_PHYS >> 12); + in_be32((volatile u32 *)CONFIG_SYS_CCSRBAR); + } +#endif + + init_laws(); + invalidate_tlb(0); + init_tlbs(); +} + +void cpu_init_f(void) +{ + ccsr_lbc_t *lbc = (void *)(CONFIG_SYS_MPC85xx_LBC_ADDR); + + /* + * LCRR - Clock Ratio Register - set up local bus timing + * when needed + */ + out_be32(&lbc->lcrr, LCRR_DBYP | LCRR_CLKDIV_8); + +#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); + /* for FPGA */ + out_be32(&lbc->br3, CONFIG_SYS_BR3_PRELIM); + out_be32(&lbc->or3, CONFIG_SYS_OR3_PRELIM); +#else +#error CONFIG_NAND_BR_PRELIM, CONFIG_NAND_OR_PRELIM must be defined +#endif + +#if defined(CONFIG_SYS_RAMBOOT) && defined(CONFIG_SYS_INIT_L2_ADDR) + ccsr_l2cache_t *l2cache = (void *)CONFIG_SYS_MPC85xx_L2_ADDR; + uint l2srbar; + int i; + + l2srbar = CONFIG_SYS_INIT_L2_ADDR; + out_be32(&l2cache->l2srbar0, l2srbar); + + /* set MBECCDIS=1, SBECCDIS=1 */ + out_be32(&l2cache->l2errdis, + (MPC85xx_L2ERRDIS_MBECC | + MPC85xx_L2ERRDIS_SBECC)); + + /* set L2E=1 & L2SRAM=001 */ + out_be32(&l2cache->l2ctl, + (MPC85xx_L2CTL_L2E | + MPC85xx_L2CTL_L2SRAM_ENTIRE)); + + /* Initialize L2 SRAM to zero */ + for (i = 0; i < CONFIG_SYS_L2_SIZE; i++) + ((char *)l2srbar)[i] = 0; +#endif +} diff --git a/include/configs/MPC8536DS.h b/include/configs/MPC8536DS.h index 0aaab4a..3204bdc 100644 --- a/include/configs/MPC8536DS.h +++ b/include/configs/MPC8536DS.h @@ -27,6 +27,10 @@ #ifndef __CONFIG_H #define __CONFIG_H
+#ifdef CONFIG_OPT_NAND +#define CONFIG_NAND_U_BOOT 1 +#endif + /* High Level Configuration Options */ #define CONFIG_BOOKE 1 /* BOOKE */ #define CONFIG_E500 1 /* BOOKE e500 family */ @@ -82,14 +86,27 @@ extern unsigned long get_board_ddr_clk(unsigned long dummy); #define CONFIG_PANIC_HANG /* do not reset board on panic */
/* + * Config the L2 Cache as L2 SRAM + */ +#define CONFIG_SYS_INIT_L2_ADDR 0xf8f80000 +#define CONFIG_SYS_INIT_L2_ADDR_PHYS CONFIG_SYS_INIT_L2_ADDR +#define CONFIG_SYS_L2_SIZE (512 << 10) +#define CONFIG_SYS_INIT_L2_END (CONFIG_SYS_INIT_L2_ADDR + CONFIG_SYS_L2_SIZE) + +/* * Base addresses -- Note these are effective addresses where the * actual resources get mapped (not physical addresses) */ -#define CONFIG_SYS_CCSRBAR_DEFAULT 0xff700000 /* CCSRBAR Default */ #define CONFIG_SYS_CCSRBAR 0xffe00000 /* relocated CCSRBAR */ #define CONFIG_SYS_CCSRBAR_PHYS CONFIG_SYS_CCSRBAR /* physical addr of CCSRBAR */ #define CONFIG_SYS_IMMR CONFIG_SYS_CCSRBAR /* PQII uses CONFIG_SYS_IMMR */
+#if defined(CONFIG_NAND_U_BOOT) && !defined(CONFIG_NAND_SPL) +#define CONFIG_SYS_CCSRBAR_DEFAULT CONFIG_SYS_CCSRBAR +#else +#define CONFIG_SYS_CCSRBAR_DEFAULT 0xff700000 /* CCSRBAR Default */ +#endif + #define CONFIG_SYS_PCI1_ADDR (CONFIG_SYS_CCSRBAR+0x8000) #define CONFIG_SYS_PCIE1_ADDR (CONFIG_SYS_CCSRBAR+0xa000) #define CONFIG_SYS_PCIE2_ADDR (CONFIG_SYS_CCSRBAR+0x9000) @@ -172,8 +189,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_BR_PRELIM (BR_PHYS_ADDR((CONFIG_SYS_FLASH_BASE_PHYS + 0x8000000)) | BR_PS_16 | BR_V) +#define CONFIG_FLASH_OR_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 @@ -190,6 +207,12 @@ extern unsigned long get_board_ddr_clk(unsigned long dummy);
#define CONFIG_SYS_MONITOR_BASE TEXT_BASE /* start of monitor */
+#if defined(CONFIG_SYS_SPL) || defined(CONFIG_NAND_U_BOOT) +#define CONFIG_SYS_RAMBOOT +#else +#undef CONFIG_SYS_RAMBOOT +#endif + #define CONFIG_FLASH_CFI_DRIVER #define CONFIG_SYS_FLASH_CFI #define CONFIG_SYS_FLASH_EMPTY_INFO @@ -254,7 +277,11 @@ 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, \ @@ -266,6 +293,15 @@ extern unsigned long get_board_ddr_clk(unsigned long dummy); #define CONFIG_NAND_FSL_ELBC 1 #define CONFIG_SYS_NAND_BLOCK_SIZE (128 * 1024)
+/* NAND boot: 4K NAND loader config */ +#define CONFIG_SYS_NAND_SPL_SIZE 0x1000 +#define CONFIG_SYS_NAND_U_BOOT_SIZE ((512 << 10) - 0x2000) +#define CONFIG_SYS_NAND_U_BOOT_DST (CONFIG_SYS_INIT_L2_ADDR) +#define CONFIG_SYS_NAND_U_BOOT_START (CONFIG_SYS_INIT_L2_ADDR + CONFIG_SYS_NAND_SPL_SIZE) +#define CONFIG_SYS_NAND_U_BOOT_OFFS (0) +#define CONFIG_SYS_NAND_U_BOOT_RELOC (CONFIG_SYS_INIT_L2_END - 0x2000) +#define CONFIG_SYS_NAND_U_BOOT_RELOC_SP ((CONFIG_SYS_INIT_L2_END - 1) & ~0xF) + /* NAND flash config */ #define CONFIG_NAND_BR_PRELIM (BR_PHYS_ADDR(CONFIG_SYS_NAND_BASE_PHYS) \ | (2<<BR_DECC_SHIFT) /* Use HW ECC */ \ @@ -281,8 +317,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 /* NAND Base Address */ +#define CONFIG_SYS_OR0_PRELIM CONFIG_NAND_OR_PRELIM /* NAND Options */ +#define CONFIG_SYS_BR2_PRELIM CONFIG_FLASH_BR_PRELIM /* NOR Base Address */ +#define CONFIG_SYS_OR2_PRELIM CONFIG_FLASH_OR_PRELIM /* NOR Options */ +#else +#define CONFIG_SYS_BR0_PRELIM CONFIG_FLASH_BR_PRELIM /* NOR Base Address */ +#define CONFIG_SYS_OR0_PRELIM CONFIG_FLASH_OR_PRELIM /* NOR Options */ +#define CONFIG_SYS_BR2_PRELIM CONFIG_NAND_BR_PRELIM /* NAND Base Address */ +#define CONFIG_SYS_OR2_PRELIM CONFIG_NAND_OR_PRELIM /* NAND Options */ +#endif
#define CONFIG_SYS_BR4_PRELIM (BR_PHYS_ADDR((CONFIG_SYS_NAND_BASE_PHYS + 0x40000))\ | (2<<BR_DECC_SHIFT) /* Use HW ECC */ \ @@ -464,15 +509,6 @@ extern unsigned long get_board_ddr_clk(unsigned long dummy); #define CONFIG_CMD_EXT2 #endif
-/* - * USB - */ -#define CONFIG_CMD_USB -#define CONFIG_USB_STORAGE -#define CONFIG_USB_EHCI -#define CONFIG_USB_EHCI_FSL -#define CONFIG_EHCI_HCD_INIT_AFTER_RESET - #if defined(CONFIG_TSEC_ENET)
#ifndef CONFIG_NET_MULTI @@ -507,14 +543,23 @@ extern unsigned long get_board_ddr_clk(unsigned long dummy); /* * Environment */ -#define CONFIG_ENV_IS_IN_FLASH 1 -#if CONFIG_SYS_MONITOR_BASE > 0xfff80000 -#define CONFIG_ENV_ADDR 0xfff80000 + +#if defined(CONFIG_SYS_RAMBOOT) +#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 ((512 * 1024) + CONFIG_SYS_NAND_BLOCK_SIZE) +#endif #else -#define CONFIG_ENV_ADDR (CONFIG_SYS_MONITOR_BASE - CONFIG_ENV_SECT_SIZE) + #define CONFIG_ENV_IS_IN_FLASH 1 + #if CONFIG_SYS_MONITOR_BASE > 0xfff80000 + #define CONFIG_ENV_ADDR 0xfff80000 + #else + #define CONFIG_ENV_ADDR (CONFIG_SYS_MONITOR_BASE - CONFIG_ENV_SECT_SIZE) + #endif + #define CONFIG_ENV_SIZE 0x2000 + #define CONFIG_ENV_SECT_SIZE 0x20000 /* 128K (one sector) */ #endif -#define CONFIG_ENV_SIZE 0x2000 -#define CONFIG_ENV_SECT_SIZE 0x20000 /* 128K (one sector) */
#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/mpc8536ds/Makefile b/nand_spl/board/freescale/mpc8536ds/Makefile new file mode 100644 index 0000000..c9104d3 --- /dev/null +++ b/nand_spl/board/freescale/mpc8536ds/Makefile @@ -0,0 +1,119 @@ +# +# (C) Copyright 2007 +# Stefan Roese, DENX Software Engineering, sr@denx.de. +# +# Copyright 2009 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 +# + +NAND_SPL := y +TEXT_BASE := 0xfff00000 +PAD_TO := 0xfff01000 + +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 + +SOBJS = start.o resetvec.o +COBJS = nand_boot_fsl_elbc.o ns16550.o nand_init.o nand_boot.o cache.o \ + tlb.o tlb_table.o law.o law_table.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)start.S: + @rm -f $(obj)start.S + ln -sf $(SRCTREE)/cpu/mpc85xx/start.S $(obj)start.S + +$(obj)resetvec.S: + @rm -f $(obj)resetvec.S + ln -s $(SRCTREE)/cpu/$(CPU)/resetvec.S $(obj)resetvec.S + +$(obj)nand_boot_fsl_elbc.c: + @rm -f $(obj)nand_boot_fsl_elbc.c + ln -sf $(SRCTREE)/nand_spl/nand_boot_fsl_elbc.c \ + $(obj)nand_boot_fsl_elbc.c + +$(obj)ns16550.c: + @rm -f $(obj)ns16550.c + ln -sf $(SRCTREE)/drivers/serial/ns16550.c $(obj)ns16550.c + +$(obj)nand_init.c: + @rm -f $(obj)nand_init.c + ln -sf $(SRCTREE)/cpu/mpc85xx/nand_init.c $(obj)nand_init.c + +$(obj)cache.c: + @rm -f $(obj)cache.c + ln -sf $(SRCTREE)/lib_ppc/cache.c $(obj)cache.c + +$(obj)tlb.c: + @rm -f $(obj)tlb.c + ln -sf $(SRCTREE)/cpu/mpc85xx/tlb.c $(obj)tlb.c + +$(obj)tlb_table.c: + @rm -f $(obj)tlb_table.c + ln -sf $(SRCTREE)/board/$(BOARDDIR)/tlb.c $(obj)tlb_table.c + +$(obj)law.c: + @rm -f $(obj)law.c + ln -sf $(SRCTREE)/drivers/misc/fsl_law.c $(obj)law.c + +$(obj)law_table.c: + @rm -f $(obj)law_table.c + ln -sf $(SRCTREE)/board/$(BOARDDIR)/law.c $(obj)law_table.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/mpc8536ds/nand_boot.c b/nand_spl/board/freescale/mpc8536ds/nand_boot.c new file mode 100644 index 0000000..77973d1 --- /dev/null +++ b/nand_spl/board/freescale/mpc8536ds/nand_boot.c @@ -0,0 +1,99 @@ +/* + * Copyright (C) 2009 Freescale Semiconductor, Inc. All rights reserved. + * + * 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> + +void board_init_f(ulong bootflag) +{ + u8 sysclk_ratio; + uint plat_ratio, bus_clk, sys_clk; + volatile ccsr_gur_t *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR); + + /* initialize selected port with appropriate baud rate */ + sysclk_ratio = *((volatile unsigned char *)(PIXIS_BASE + PIXIS_SPD)); + sysclk_ratio &= 0x7; + switch (sysclk_ratio) { + case 0: + sys_clk = 33333000; + break; + case 1: + sys_clk = 39999600; + break; + case 2: + sys_clk = 49999500; + break; + case 3: + sys_clk = 66666000; + break; + case 4: + sys_clk = 83332500; + break; + case 5: + sys_clk = 99999000; + break; + case 6: + sys_clk = 133332000; + break; + case 7: + sys_clk = 166665000; + break; + default: + sys_clk = 0; + break; + } + + plat_ratio = (gur->porpllsr) & 0x0000003e; + plat_ratio >>= 1; + bus_clk = plat_ratio * sys_clk; + NS16550_init((NS16550_t)(CONFIG_SYS_CCSRBAR + 0x4500), + 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_CCSRBAR + 0x4500), '\r'); + + NS16550_putc((NS16550_t)(CONFIG_SYS_CCSRBAR + 0x4500), c); +} + +void puts(const char *str) +{ + while (*str) + putc(*str++); +} + diff --git a/nand_spl/board/freescale/mpc8536ds/u-boot.lds b/nand_spl/board/freescale/mpc8536ds/u-boot.lds new file mode 100644 index 0000000..fef3e42 --- /dev/null +++ b/nand_spl/board/freescale/mpc8536ds/u-boot.lds @@ -0,0 +1,67 @@ +/* + * (C) Copyright 2006 + * Wolfgang Denk, DENX Software Engineering, wd@denx.de + * + * Copyright 2009 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 +{ + . = 0xfff00000; + .text : { + *(.text) + } + _etext = .; + + .reloc : { + _GOT2_TABLE_ = .; + *(.got2) + _FIXUP_TABLE_ = .; + *(.fixup) + } + __got2_entries = (_FIXUP_TABLE_ - _GOT2_TABLE_) >> 2; + __fixup_entries = (. - _FIXUP_TABLE_) >> 2; + + . = ALIGN(8); + .data : { + *(.rodata*) + *(.data*) + *(.sdata*) + } + _edata = .; + + . = ALIGN(8); + __init_begin = .; + __init_end = .; + + .resetvec ADDR(.text) + 0xffc : { + *(.resetvec) + } = 0xffff + + __bss_start = .; + .bss : { + *(.sbss) + *(.bss) + } + _end = .; +} +ASSERT(__init_end <= 0xfff00ffc, "NAND bootstrap too big");

The MPC8536E is capable of booting from the on-chip ROM - boot from eSDHC and boot from eSPI. When power on, the porcessor excutes the ROM code to initialize the eSPI/eSDHC controller, and loads the mian U-Boot image from the memory device that interfaced to the controller, such as the SDCard or SPI EEPROM, to the target memory, e.g. SDRAM or L2SRAM, then boot from it.
The memory device should contain a specific data structure with control word and config word at the fixed address. The config word direct the process how to config the memory device, and the control word direct the processor where to find the image on the memory device, or where copy the main image to. The user can use any method to store the data structure to the memory device, only if store it on the assigned address.
The on-chip ROM code will map the whole 4GB address space by setting entry0 in the TLB1, so the main image need to switch to Address space 1 to disable this mapping and map the address space again.
This patch implements loading the mian U-Boot image into L2SRAM, so the image can configure the system memory by using SPD EEPROM.
Signed-off-by: Mingkai Hu Mingkai.hu@freescale.com --- Makefile | 4 +++- board/freescale/mpc8536ds/config.mk | 8 ++++++++ include/configs/MPC8536DS.h | 10 +++++++++- 3 files changed, 20 insertions(+), 2 deletions(-)
diff --git a/Makefile b/Makefile index db69ef3..c4d4906 100644 --- a/Makefile +++ b/Makefile @@ -2407,7 +2407,9 @@ ATUM8548_config: unconfig @$(MKCONFIG) $(@:_config=) ppc mpc85xx atum8548
MPC8536DS_config \ -MPC8536DS_NAND_config: unconfig +MPC8536DS_NAND_config \ +MPC8536DS_SDCARD_config \ +MPC8536DS_SPIFLASH_config: unconfig @$(MKCONFIG) -t $(@:_config=) MPC8536DS ppc mpc85xx mpc8536ds freescale
MPC8540ADS_config: unconfig diff --git a/board/freescale/mpc8536ds/config.mk b/board/freescale/mpc8536ds/config.mk index f747fe8..d6b721b 100644 --- a/board/freescale/mpc8536ds/config.mk +++ b/board/freescale/mpc8536ds/config.mk @@ -29,6 +29,14 @@ TEXT_BASE = 0xf8f82000 endif endif
+ifeq ($(CONFIG_OPT_SDCARD),y) +TEXT_BASE = 0xf8f80000 +endif + +ifeq ($(CONFIG_OPT_SPIFLASH),y) +TEXT_BASE = 0xf8f80000 +endif + ifndef TEXT_BASE TEXT_BASE = 0xeff80000 endif diff --git a/include/configs/MPC8536DS.h b/include/configs/MPC8536DS.h index 3204bdc..63b86f6 100644 --- a/include/configs/MPC8536DS.h +++ b/include/configs/MPC8536DS.h @@ -207,7 +207,8 @@ extern unsigned long get_board_ddr_clk(unsigned long dummy);
#define CONFIG_SYS_MONITOR_BASE TEXT_BASE /* start of monitor */
-#if defined(CONFIG_SYS_SPL) || defined(CONFIG_NAND_U_BOOT) +#if defined(CONFIG_SYS_SPL) || defined(CONFIG_NAND_U_BOOT) \ + || defined(CONFIG_OPT_SDCARD) || defined(CONFIG_OPT_SPIFLASH) #define CONFIG_SYS_RAMBOOT #else #undef CONFIG_SYS_RAMBOOT @@ -549,6 +550,13 @@ extern unsigned long get_board_ddr_clk(unsigned long dummy); #define CONFIG_ENV_IS_IN_NAND 1 #define CONFIG_ENV_SIZE CONFIG_SYS_NAND_BLOCK_SIZE #define CONFIG_ENV_OFFSET ((512 * 1024) + CONFIG_SYS_NAND_BLOCK_SIZE) +#elif defined(CONFIG_OPT_SDCARD) + #define CONFIG_ENV_IS_IN_SDCARD 1 + #define CONFIG_ENV_SIZE 0x2000 +#elif defined(CONFIG_OPT_SPIFLASH) + #define CONFIG_ENV_IS_NOWHERE 1 /* Store ENV in memory only */ + #define CONFIG_ENV_ADDR (CONFIG_SYS_MONITOR_BASE - 0x1000) + #define CONFIG_ENV_SIZE 0x2000 #endif #else #define CONFIG_ENV_IS_IN_FLASH 1

Add boot from NAND/eSDHC/eSPI description
Signed-off-by: Mingkai Hu Mingkai.hu@freescale.com --- doc/README.mpc8536ds | 127 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 127 insertions(+), 0 deletions(-) create mode 100644 doc/README.mpc8536ds
diff --git a/doc/README.mpc8536ds b/doc/README.mpc8536ds new file mode 100644 index 0000000..4d0bee0 --- /dev/null +++ b/doc/README.mpc8536ds @@ -0,0 +1,127 @@ +Overview: +========= + +The MPC8536E integrates a PowerPC processor core with system logic +required for imaging, networking, and communications applications. + +Boot from NAND: +=============== + +The MPC8536E is capable of booting from NAND flash which uses the image +u-boot-nand.bin. This image contains two parts: a first stage image(also +call 4K NAND loader and a second stage image. The former is appended to +the latter to produce u-boot-nand.bin. + +The bootup process can be divided into two stages: the first stage will +configure the L2SRAM, then copy the second stage image to L2SRAM and jump +to it. The second stage image is to configure all the hardware and boot up +to U-Boot command line. + +The 4K NAND loader's code comes from the corresponding nand_spl directory, +along with the code twisted by CONFIG_NAND_SPL. The macro CONFIG_NAND_SPL +is mainly used to shrink the code size to the 4K size limitation. + +The macro CONFIG_SYS_RAMBOOT is used to control the code to produce the +second stage image. It's set in the board config file when boot from NAND +is selected. + +Build and boot steps +-------------------- + +1. Building image + make MPC8536DS_NAND_config + make CROSS_COMPILE=powerpc-none-linux-gnuspe- all + +2. Change dip-switch + SW2[5-8] = 1011 + SW9[1-3] = 101 + Note: 1 stands for 'on', 0 stands for 'off' + +3. Flash image + tftp 1000000 u-boot-nand.bin + nand erase 0 a0000 + nand write 1000000 0 a0000 + +Boot from On-chip ROM: +====================== + +The MPC8536E is capable of booting from the on-chip ROM - boot from eSDHC +and boot from eSPI. When power on, the porcessor excutes the ROM code to +initialize the eSPI/eSDHC controller, and loads the mian U-Boot image from +the memory device that interfaced to the controller, such as the SDCard or +SPI EEPROM, to the target memory, e.g. SDRAM or L2SRAM, then boot from it. + +The memory device should contain a specific data structure with control word +and config word at the fixed address. The config word direct the process how +to config the memory device, and the control word direct the processor where +to find the image on the memory device, or where copy the main image to. The +user can use any method to store the data structure to the memory device, only +if store it on the assigned address. + +Build and boot steps +-------------------- + +For boot from eSDHC: +1. Build image + make MPC8536DS_SDCARD_config + make CROSS_COMPILE=powerpc-none-linux-gnuspe- all + +2. Change dip-switch + SW2[5-8] = 0111 + SW3[1] = 0 + SW8[7] = 0 - The on-board SD/MMC slot is active + SW8[7] = 1 - The externel SD/MMC slot is active + +3. Put image to SDCard + Put the follwing info at the assigned address on the SDCard: + + Offset | Data | Description + -------------------------------------------------------- + | 0x40-0x43 | 0x424F4F54 | BOOT signature | + -------------------------------------------------------- + | 0x48-0x4B | 0x00080000 | u-boot.bin's size | + -------------------------------------------------------- + | 0x50-0x53 | 0x???????? | u-boot.bin's Addr on SDCard | + -------------------------------------------------------- + | 0x58-0x5B | 0xF8F80000 | Target Address | + ------------------------------------------------------- + | 0x60-0x63 | 0xF8FFF000 | Execution Starting Address | + -------------------------------------------------------- + | 0x68-0x6B | 0x6 | Number of Config Addr/Data | + -------------------------------------------------------- + | 0x80-0x83 | 0xFF720100 | Config Addr 1 | + | 0x84-0x87 | 0xF8F80000 | Config Data 1 | + -------------------------------------------------------- + | 0x88-0x8b | 0xFF720e44 | Config Addr 2 | + | 0x8c-0x8f | 0x0000000C | Config Data 2 | + -------------------------------------------------------- + | 0x90-0x93 | 0xFF720000 | Config Addr 3 | + | 0x94-0x97 | 0x80010000 | Config Data 3 | + -------------------------------------------------------- + | 0x98-0x9b | 0xFF72e40e | Config Addr 4 | + | 0x9c-0x9f | 0x00000040 | Config Data 4 | + -------------------------------------------------------- + | 0xa0-0xa3 | 0x40000001 | Config Addr 5 | + | 0xa4-0xa7 | 0x00000100 | Config Data 5 | + -------------------------------------------------------- + | 0xa8-0xab | 0x80000001 | Config Addr 6 | + | 0xac-0xaf | 0x80000001 | Config Data 6 | + -------------------------------------------------------- + | ...... | + -------------------------------------------------------- + | 0x???????? | u-boot.bin | + -------------------------------------------------------- + + then insert the SDCard to the active slot to boot up. + +For boot from eSPI: +1. Build image + make MPC8536DS_SPIFLASH_config + make CROSS_COMPILE=powerpc-none-linux-gnuspe- all + +2. Change dip-switch + SW2[5-8] = 0110 + +3. Put image to SPI flash + Put the info in the above table onto the SPI flash, then + boot up.

If the environment variables are saved on the MMC/SD card, env_relocat can't relocate env from MMC/SD card without mmc init.
Signed-off-by: Mingkai Hu Mingkai.hu@freescale.com --- lib_ppc/board.c | 12 ++++++------ 1 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/lib_ppc/board.c b/lib_ppc/board.c index 6dd4d56..b788580 100644 --- a/lib_ppc/board.c +++ b/lib_ppc/board.c @@ -849,6 +849,12 @@ void board_init_r (gd_t *id, ulong dest_addr) nand_init(); /* go init the NAND */ #endif
+#ifdef CONFIG_GENERIC_MMC + WATCHDOG_RESET (); + puts ("MMC: "); + mmc_initialize (bd); +#endif + /* relocate environment function pointers etc. */ env_relocate ();
@@ -1015,12 +1021,6 @@ void board_init_r (gd_t *id, ulong dest_addr) scsi_init (); #endif
-#ifdef CONFIG_GENERIC_MMC - WATCHDOG_RESET (); - puts ("MMC: "); - mmc_initialize (bd); -#endif - #if defined(CONFIG_CMD_DOC) WATCHDOG_RESET (); puts ("DOC: ");

Whether booting from MMC/SD card or not, the environment variables can be saved on it, this patch add the operation support.
Signed-off-by: Mingkai Hu Mingkai.hu@freescale.com --- common/Makefile | 1 + common/cmd_nvedit.c | 3 +- common/env_sdcard.c | 135 +++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 138 insertions(+), 1 deletions(-) create mode 100644 common/env_sdcard.c
diff --git a/common/Makefile b/common/Makefile index 3781738..ce6a7da 100644 --- a/common/Makefile +++ b/common/Makefile @@ -61,6 +61,7 @@ COBJS-$(CONFIG_ENV_IS_IN_NAND) += env_nand.o COBJS-$(CONFIG_ENV_IS_IN_NVRAM) += env_nvram.o COBJS-$(CONFIG_ENV_IS_IN_ONENAND) += env_onenand.o COBJS-$(CONFIG_ENV_IS_IN_SPI_FLASH) += env_sf.o +COBJS-$(CONFIG_ENV_IS_IN_SDCARD) += env_sdcard.o COBJS-$(CONFIG_ENV_IS_NOWHERE) += env_nowhere.o
# command diff --git a/common/cmd_nvedit.c b/common/cmd_nvedit.c index 2186205..83969ef 100644 --- a/common/cmd_nvedit.c +++ b/common/cmd_nvedit.c @@ -60,9 +60,10 @@ DECLARE_GLOBAL_DATA_PTR; !defined(CONFIG_ENV_IS_IN_NVRAM) && \ !defined(CONFIG_ENV_IS_IN_ONENAND) && \ !defined(CONFIG_ENV_IS_IN_SPI_FLASH) && \ + !defined(CONFIG_ENV_IS_IN_SDCARD) && \ !defined(CONFIG_ENV_IS_NOWHERE) # error Define one of CONFIG_ENV_IS_IN_{EEPROM|FLASH|DATAFLASH|ONENAND|\ -SPI_FLASH|MG_DISK|NVRAM|NOWHERE} +SPI_FLASH|MG_DISK|NVRAM|SDCARD|NOWHERE} #endif
#define XMK_STR(x) #x diff --git a/common/env_sdcard.c b/common/env_sdcard.c new file mode 100644 index 0000000..ce73358 --- /dev/null +++ b/common/env_sdcard.c @@ -0,0 +1,135 @@ +/* + * Copyright (C) 2009 Freescale Semiconductor, Inc. + * + * Changelog: + * July 2008, Intial version. + * June 2009, align to the MMC framework. + * + * 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 + */ +#include <common.h> +#include <mmc.h> + +#include <environment.h> + +DECLARE_GLOBAL_DATA_PTR; + +/* references to names in env_common.c */ +extern uchar default_environment[]; +extern int mmc_get_env_addr(int dev, u32 *env_addr); + +char *env_name_spec = "SD CARD"; +env_t *env_ptr; + +uchar env_get_char_spec(int index) +{ + return *((uchar *)(gd->env_addr + index)); +} + +static int readenv(int dev, size_t offset, u_char *buf) +{ + int ret; + struct mmc *mmc = find_mmc_device(dev); + + mmc_init(mmc); + + ret = mmc_read(mmc, offset, buf, CONFIG_ENV_SIZE); + if (ret) + return 1; + + return 0; +} + +static int writeenv(int dev, size_t offset, u_char *buf) +{ + int env_blknr, env_blkcnt, n; + uint blklen; + struct mmc *mmc = find_mmc_device(dev); + + mmc_init(mmc); + + blklen = mmc->write_bl_len; + env_blknr = offset / blklen; + env_blkcnt = CONFIG_ENV_SIZE / blklen; + + n = mmc->block_dev.block_write(dev, env_blknr, env_blkcnt, buf); + if (n != env_blkcnt) + return 1; + + return 0; +} + +int saveenv(void) +{ + int ret; + int dev = 0; + u32 env_addr; + + ret = mmc_get_env_addr(dev, &env_addr); + if (ret) { + puts("FAILED!\n"); + return 1; + } + + ret = writeenv(dev, env_addr, (u_char *) env_ptr); + if (ret) + return 1; + + puts("done\n"); + gd->env_valid = 1; + + return ret; +} + +void env_relocate_spec(void) +{ + int ret; + int dev = 0; + u32 env_addr; + + ret = mmc_get_env_addr(dev, &env_addr); + if (ret) + goto err_read; + + ret = readenv(dev, env_addr, (u_char *) env_ptr); + if (ret) + goto err_read; + + if (crc32(0, env_ptr->data, ENV_SIZE) != env_ptr->crc) + goto err_crc; + + gd->env_valid = 1; + + return; + +err_read: +err_crc: + puts("*** Warning - bad CRC, using default environment\n\n"); + + set_default_env(); +} + +int env_init(void) +{ + /* eSDHC isn't usable before relocation */ + gd->env_addr = (ulong)&default_environment[0]; + gd->env_valid = 1; + + return 0; +}

Both the save env and load env operation will call this function to get the address of env on the SDCard, so the user can control where to put the env freely.
Signed-off-by: Mingkai Hu Mingkai.hu@freescale.com --- board/freescale/mpc8536ds/mpc8536ds.c | 43 +++++++++++++++++++++++++++++++++ 1 files changed, 43 insertions(+), 0 deletions(-)
diff --git a/board/freescale/mpc8536ds/mpc8536ds.c b/board/freescale/mpc8536ds/mpc8536ds.c index 8c5984b..b32b84b 100644 --- a/board/freescale/mpc8536ds/mpc8536ds.c +++ b/board/freescale/mpc8536ds/mpc8536ds.c @@ -38,6 +38,8 @@ #include <tsec.h> #include <netdev.h> #include <sata.h> +#include <mmc.h> +#include <malloc.h>
#include "../common/pixis.h" #include "../common/sgmii_riser.h" @@ -705,3 +707,44 @@ void ft_board_setup(void *blob, bd_t *bd) #endif } #endif + +#if defined(CONFIG_MMC) +/* + * The environment variables are written to just after the u-boot image + * on SDCard, so we must read the MBR to get the start address and code + * length of the u-boot image, then calculate the address of the env. + */ +int mmc_get_env_addr(int dev, u32 *env_addr) +{ + uint blklen; + int ret, code_offset, code_len; + uchar *tmp_buf; + struct mmc *mmc = find_mmc_device(dev); + + mmc_init(mmc); + + blklen = mmc->read_bl_len; + tmp_buf = (uchar *)malloc(blklen); + if (!tmp_buf) + return 1; + + /* read out the first block, get the config data information */ + ret = mmc_read(mmc, 0, tmp_buf, blklen); + if (ret) { + free(tmp_buf); + return 1; + } + + /* Get the Source Address, from offset 0x50 */ + code_offset = *(unsigned long *)(tmp_buf + 0x50); + + /* Get the code size from offset 0x48 */ + code_len = *(unsigned long *)(tmp_buf + 0x48); + + *env_addr = code_offset + code_len; + + free(tmp_buf); + + return 0; +} +#endif

On Aug 18, 2009, at 2:37 AM, Mingkai Hu wrote:
Signed-off-by: Mingkai Hu Mingkai.hu@freescale.com
cpu/mpc85xx/cpu_init.c | 5 +++-- include/asm-ppc/immap_85xx.h | 5 +++++ 2 files changed, 8 insertions(+), 2 deletions(-)
applied to 85xx next
- k

On Tue, 18 Aug 2009 15:37:14 +0800 Mingkai Hu Mingkai.hu@freescale.com wrote:
So that we can set the NAND loader's relocate stack pointer to the value other than the relocate address + 0x10000.
Signed-off-by: Mingkai Hu Mingkai.hu@freescale.com
In case someone wants to take this via some other tree (Kumar/Andy/Scott?):
Acked-by: Kim Phillips kim.phillips@freescale.com
Kim

On Aug 18, 2009, at 2:37 AM, Mingkai Hu wrote:
To simplify the top level makefile it useful to be able to paree the top level makefile target to multiple individual target, then put them to the config.h and config.mk, leave the board config file and board makefile to handle the different targets.
mkconfig | 11 +++++++++++ 1 files changed, 11 insertions(+), 0 deletions(-)
I know you are swamped w/ARM.. but if we can make some progress on this one change it would be useful for 'next'.
thanks
- k
diff --git a/mkconfig b/mkconfig index b0bbbd1..d9e216d 100755 --- a/mkconfig +++ b/mkconfig @@ -10,12 +10,14 @@
APPEND=no # Default: Create new config file BOARD_NAME="" # Name to print in make output +TARGETS=""
while [ $# -gt 0 ] ; do case "$1" in --) shift ; break ;; -a) shift ; APPEND=yes ;; -n) shift ; BOARD_NAME="${1%%_config}" ; shift ;;
- -t) shift ; TARGETS="`echo $1 | sed 's:_: :g'` ${TARGETS}" ;
shift ;; *) break ;; esac done @@ -72,6 +74,10 @@ echo "BOARD = $4" >> config.mk
[ "$6" ] && [ "$6" != "NULL" ] && echo "SOC = $6" >> config.mk
+for i in ${TARGETS} ; do
- echo "CONFIG_OPT_${i} = y" >> config.mk ;
+done
# # Create board specific header file # @@ -82,6 +88,11 @@ else
config.h # Create new config file
fi echo "/* Automatically generated - do not edit */" >>config.h
+for i in ${TARGETS} ; do
- echo "#define CONFIG_OPT_${i} 1" >>config.h ;
+done
echo "#include <configs/$1.h>" >>config.h echo "#include <asm/config.h>" >>config.h
-- 1.5.4

-----Original Message----- From: Kumar Gala [mailto:galak@kernel.crashing.org] Sent: Tuesday, August 18, 2009 11:07 PM To: Wolfgang Denk Cc: Wood Scott-B07421; U-Boot-Users ML; Hu Mingkai-B21284; Mike Frysinger Subject: Re: [PATCH 01/10] mkconfig: parse top level makefile target to multiple config targets
On Aug 18, 2009, at 2:37 AM, Mingkai Hu wrote:
To simplify the top level makefile it useful to be able to
paree the
top level makefile target to multiple individual target,
then put them
to the config.h and config.mk, leave the board config file
and board
makefile to handle the different targets.
mkconfig | 11 +++++++++++ 1 files changed, 11 insertions(+), 0 deletions(-)
I know you are swamped w/ARM.. but if we can make some progress on this one change it would be useful for 'next'.
thanks
- k
Hi Wolfgang,
How do you think of this method? Or can we handle the different options as follows?
MPC8536DS_NAND_config: unconfig @echo "" >$(obj)include/config.h; @echo "#define CONFIG_$(subst MPC8536DS_,,$(subst config,U_BOOT,$@))" \ > $(obj)include/config.h @$(MKCONFIG) -a MPC8536DS ppc mpc85xx mpc8536ds freescale @echo "CONFIG_$(subst MPC8536DS_,,$(subst config,U_BOOT,$@)) = y" \ >> $(obj)include/config.mk
If there's an orthogonal option, such as 36BIT, we have to handle it seperately:
MPC8536DS_NAND_config \ MPC8536DS_NAND_36BIT_config: unconfig @echo "" >$(obj)include/config.h; @if [ "$(findstring _36BIT_,$@" ] ; then \ echo "#define CONFIG_PHYS_64BIT" >>$(obj)include/config.h ; \ fi @echo "#define CONFIG_$(subst MPC8536DS_,,$(subst config,U_BOOT,$@))" \ > $(obj)include/config.h @$(MKCONFIG) -a MPC8536DS ppc mpc85xx mpc8536ds freescale @echo "CONFIG_$(subst MPC8536DS_,,$(subst config,U_BOOT,$@)) = y" \ >> $(obj)include/config.mk
Look forward to your comments.
Thanks, Mingkai
diff --git a/mkconfig b/mkconfig index b0bbbd1..d9e216d 100755 --- a/mkconfig +++ b/mkconfig @@ -10,12 +10,14 @@
APPEND=no # Default: Create new config file BOARD_NAME="" # Name to print in make output +TARGETS=""
while [ $# -gt 0 ] ; do case "$1" in --) shift ; break ;; -a) shift ; APPEND=yes ;; -n) shift ; BOARD_NAME="${1%%_config}" ; shift ;;
- -t) shift ; TARGETS="`echo $1 | sed 's:_: :g'` ${TARGETS}" ;
shift ;; *) break ;; esac done @@ -72,6 +74,10 @@ echo "BOARD = $4" >> config.mk
[ "$6" ] && [ "$6" != "NULL" ] && echo "SOC = $6" >> config.mk
+for i in ${TARGETS} ; do
- echo "CONFIG_OPT_${i} = y" >> config.mk ; done
# # Create board specific header file # @@ -82,6 +88,11 @@ else
config.h # Create new config file
fi echo "/* Automatically generated - do not edit */" >>config.h
+for i in ${TARGETS} ; do
- echo "#define CONFIG_OPT_${i} 1" >>config.h ; done
echo "#include <configs/$1.h>" >>config.h echo "#include <asm/config.h>" >>config.h
-- 1.5.4

Dear "Hu Mingkai-B21284",
sorry for the late reply [I have to admit that I kind of loist track where we are with this discussion - too many diverging statements found].
In message 73839B4A0818E747864426270AC332C3043F59F0@zmy16exm20.fsl.freescale.net you wrote:
How do you think of this method? Or can we handle the different options as follows?
MPC8536DS_NAND_config: unconfig @echo "" >$(obj)include/config.h; @echo "#define CONFIG_$(subst MPC8536DS_,,$(subst config,U_BOOT,$@))" \ > $(obj)include/config.h @$(MKCONFIG) -a MPC8536DS ppc mpc85xx mpc8536ds freescale @echo "CONFIG_$(subst MPC8536DS_,,$(subst config,U_BOOT,$@)) = > y" \ >> $(obj)include/config.mk
If there's an orthogonal option, such as 36BIT, we have to handle it seperately:
MPC8536DS_NAND_config \ MPC8536DS_NAND_36BIT_config: unconfig @echo "" >$(obj)include/config.h; @if [ "$(findstring _36BIT_,$@" ] ; then \ echo "#define CONFIG_PHYS_64BIT" >>$(obj)include/config.h ; \ fi @echo "#define CONFIG_$(subst MPC8536DS_,,$(subst config,U_BOOT,$@))" \ > $(obj)include/config.h @$(MKCONFIG) -a MPC8536DS ppc mpc85xx mpc8536ds freescale @echo "CONFIG_$(subst MPC8536DS_,,$(subst config,U_BOOT,$@)) = y" \ >> $(obj)include/config.mk
I don't like either of these.
It should be enough to pass the make target name to the mkconfig script resp. the board config file, i. e. in this case either "CONFIG_MPC8536DS_NAND" or "CONFIG_MPC8536DS_NAND_36BIT". The rest of the scripting/decision making can then be done in the board config file.
If you want to avoid conflicts, feel free to chose a distict prefix, say CONFIG_MK_* or CONFIG_MAKE_* or so.
Best regards,
Wolfgang Denk

-----Original Message----- From: Wolfgang Denk [mailto:wd@denx.de] Sent: Saturday, September 05, 2009 3:43 AM To: Hu Mingkai-B21284 Cc: Kumar Gala; Wood Scott-B07421; U-Boot-Users ML; Mike Frysinger Subject: Re: [PATCH 01/10] mkconfig: parse top level makefile target to multiple config targets
Dear "Hu Mingkai-B21284",
sorry for the late reply [I have to admit that I kind of loist track where we are with this discussion - too many diverging statements found].
In message <73839B4A0818E747864426270AC332C3043F59F0@zmy16exm20.fsl.frees cale.net> you wrote:
How do you think of this method? Or can we handle the different options as follows?
MPC8536DS_NAND_config: unconfig @echo "" >$(obj)include/config.h; @echo "#define CONFIG_$(subst MPC8536DS_,,$(subst config,U_BOOT,$@))" \ > $(obj)include/config.h @$(MKCONFIG) -a MPC8536DS ppc mpc85xx mpc8536ds freescale @echo "CONFIG_$(subst MPC8536DS_,,$(subst
config,U_BOOT,$@)) = > y"
\ >> $(obj)include/config.mk
If there's an orthogonal option, such as 36BIT, we have to
handle it
seperately:
MPC8536DS_NAND_config \ MPC8536DS_NAND_36BIT_config: unconfig @echo "" >$(obj)include/config.h; @if [ "$(findstring _36BIT_,$@" ] ; then \ echo "#define CONFIG_PHYS_64BIT"
$(obj)include/config.h ; \
fi @echo "#define CONFIG_$(subst MPC8536DS_,,$(subst
config,U_BOOT,$@))" \ > $(obj)include/config.h @$(MKCONFIG) -a MPC8536DS ppc mpc85xx mpc8536ds freescale @echo "CONFIG_$(subst MPC8536DS_,,$(subst
config,U_BOOT,$@)) = y"
\ >> $(obj)include/config.mk
I don't like either of these.
It should be enough to pass the make target name to the mkconfig script resp. the board config file, i. e. in this case either "CONFIG_MPC8536DS_NAND" or "CONFIG_MPC8536DS_NAND_36BIT". The rest of the scripting/decision making can then be done in the board config file.
Thanks for your replay, but I'm not totally catch on you. "the board config file" in your words refer to board/*/config.mk, right? If yes, in the config.mk file we parse the board config name to tell the file include/configs/MPC8536DS.h what config we have, such as, 36BIT, boot from NAND, etc, but how can I implement this?
I try to use echo in config.mk to put the macro definition to the file include/config.h, but it complains the following errors: "*** commands commence before first target. Stop."
If you want to avoid conflicts, feel free to chose a distict prefix, say CONFIG_MK_* or CONFIG_MAKE_* or so.
Best regards,
Wolfgang Denk
-- DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd@denx.de To get something done, a committee should consist of no more than three men, two of them absent.

Dear "Hu Mingkai-B21284",
In message 73839B4A0818E747864426270AC332C30447ECAF@zmy16exm20.fsl.freescale.net you wrote:
It should be enough to pass the make target name to the mkconfig script resp. the board config file, i. e. in this case either "CONFIG_MPC8536DS_NAND" or "CONFIG_MPC8536DS_NAND_36BIT". The rest of the scripting/decision making can then be done in the board config file.
Thanks for your replay, but I'm not totally catch on you. "the board config file" in your words refer to board/*/config.mk, right?
No, with "board config file" I mean include/configs/*.h
Best regards,
Wolfgang Denk

-----Original Message----- From: Wolfgang Denk [mailto:wd@denx.de] Sent: Monday, September 07, 2009 6:18 PM To: Hu Mingkai-B21284 Cc: Kumar Gala; Wood Scott-B07421; U-Boot-Users ML; Mike Frysinger Subject: Re: [PATCH 01/10] mkconfig: parse top level makefile target to multiple config targets
Dear "Hu Mingkai-B21284",
In message <73839B4A0818E747864426270AC332C30447ECAF@zmy16exm20.fsl.frees cale.net> you wrote:
It should be enough to pass the make target name to the mkconfig script resp. the board config file, i. e. in this case either "CONFIG_MPC8536DS_NAND" or "CONFIG_MPC8536DS_NAND_36BIT".
The rest
of the scripting/decision making can then be done in the board config file.
Thanks for your replay, but I'm not totally catch on you. "the board config file" in your words refer to
board/*/config.mk, right?
No, with "board config file" I mean include/configs/*.h
How can I parse the board name in a header file?
If config booting from NAND, we also need to override the TEXT_BASE in the board/*/config.mk file, how could we do that?
Thanks, Mingkai

Dear "Hu Mingkai-B21284",
In message 73839B4A0818E747864426270AC332C30447ECB9@zmy16exm20.fsl.freescale.net you wrote:
It should be enough to pass the make target name to the mkconfig script resp. the board config file, i. e. in this case either "CONFIG_MPC8536DS_NAND" or "CONFIG_MPC8536DS_NAND_36BIT".
The rest
of the scripting/decision making can then be done in the board config file.
Thanks for your replay, but I'm not totally catch on you. "the board config file" in your words refer to
board/*/config.mk, right?
No, with "board config file" I mean include/configs/*.h
How can I parse the board name in a header file?
I'm not sure I understand the question (or rather the problem you are seeing).
You already know the board name, because the board config file is clearly related ot one (or eventually more) boards. The rest can be done with some trivial #ifdef'fery.
If config booting from NAND, we also need to override the TEXT_BASE in the board/*/config.mk file, how could we do that?
You can for example set CONFIG_SYS_MONITOR_BASE (or some other CONFIG_ variable - but CONFIG_SYS_MONITOR_BASE is used anyway) as needed in your include/configs/*.h, which then gets exported through include/autoconf.mk, so you can use some "TEXT_BASE = $(CONFIG_SYS_MONITOR_BASE)" in your config.mk
Best regards,
Wolfgang Denk

-----Original Message----- From: Wolfgang Denk [mailto:wd@denx.de] Sent: Monday, September 07, 2009 6:59 PM To: Hu Mingkai-B21284 Cc: Kumar Gala; Wood Scott-B07421; U-Boot-Users ML; Mike Frysinger Subject: Re: [PATCH 01/10] mkconfig: parse top level makefile target to multiple config targets
Dear "Hu Mingkai-B21284",
In message <73839B4A0818E747864426270AC332C30447ECB9@zmy16exm20.fsl.frees cale.net> you wrote:
It should be enough to pass the make target name to
the mkconfig
script resp. the board config file, i. e. in this case either "CONFIG_MPC8536DS_NAND" or "CONFIG_MPC8536DS_NAND_36BIT".
The rest
of the scripting/decision making can then be done in
the board
config file.
Thanks for your replay, but I'm not totally catch on you. "the board config file" in your words refer to
board/*/config.mk, right?
No, with "board config file" I mean include/configs/*.h
How can I parse the board name in a header file?
I'm not sure I understand the question (or rather the problem you are seeing).
You already know the board name, because the board config file is clearly related ot one (or eventually more) boards. The rest can be done with some trivial #ifdef'fery.
Oh... I complicated the matters, you means as the follows, right?
In the Makefile: MPC8536DS_NAND_config \ MPC8536DS_NAND_36BIT_config \ MPC8536DS_36BIT_config \ MPC8536DS_config: unconfig @echo "#define CONFIG_$(@:_config=) 1" >$(obj)include/config.h @$(MKCONFIG) -a MPC8536DS ppc mpc85xx mpc8536ds freescale
then in the include/configs/*.h: #ifdef MPC8536DS_NAND blablabla #endif
#ifdef MPC8536DS_NAND_36BIT blablabla #endif
#ifdef MPC8536DS_36BIT blablabla #endif
If config booting from NAND, we also need to override the
TEXT_BASE in
the board/*/config.mk file, how could we do that?
You can for example set CONFIG_SYS_MONITOR_BASE (or some other CONFIG_ variable - but CONFIG_SYS_MONITOR_BASE is used anyway) as needed in your include/configs/*.h, which then gets exported through include/autoconf.mk, so you can use some "TEXT_BASE = $(CONFIG_SYS_MONITOR_BASE)" in your config.mk
Thanks.
I'll intergate your comments, align the patchset to the latest U-Boot and resend the patches, please comments then.
Many thanks, Mingkai

Dear "Hu Mingkai-B21284",
In message 73839B4A0818E747864426270AC332C30447ECC6@zmy16exm20.fsl.freescale.net you wrote:
... [Full quote deleted] ...
You already know the board name, because the board config=20 file is clearly related ot one (or eventually more) boards.=20 The rest can be done with some trivial #ifdef'fery.
Could you please stop full-quoting? Please see http://www.netmeister.org/news/learn2quote.html
Oh... I complicated the matters, you means as the follows, right?
In the Makefile: MPC8536DS_NAND_config \ MPC8536DS_NAND_36BIT_config \ MPC8536DS_36BIT_config \ MPC8536DS_config: unconfig @echo "#define CONFIG_$(@:_config=) 1" >$(obj)include/config.h @$(MKCONFIG) -a MPC8536DS ppc mpc85xx mpc8536ds freescale
Yes, except that the "echo" line should not be needed either, as mkconfig would to that automatically for you.
then in the include/configs/*.h: #ifdef MPC8536DS_NAND blablabla #endif
#ifdef MPC8536DS_NAND_36BIT blablabla #endif
#ifdef MPC8536DS_36BIT blablabla #endif
That would be CONFIG_MPC8536DS_NAND etc., but except of that that's whaty I mean. [Eventually it might make sense to ise a common prefix for Maefile generated symbols, like CONFIG_MK_ or so.]
I'll intergate your comments, align the patchset to the latest U-Boot and resend the patches, please comments then.
Thanks.
Best regards,
Wolfgang Denk

On Mon, Sep 07, 2009 at 02:38:22PM +0200, Wolfgang Denk wrote:
then in the include/configs/*.h: #ifdef MPC8536DS_NAND blablabla #endif
#ifdef MPC8536DS_NAND_36BIT blablabla #endif
#ifdef MPC8536DS_36BIT blablabla #endif
That would be CONFIG_MPC8536DS_NAND etc., but except of that that's whaty I mean.
NAND and 36BIT are orthogonal options -- what is wrong with the previous suggestion of splitting them in mkconfig?
With more than two orthogonal options, things will get rather silly trying to list every combination -- and it would be nice if it didn't matter which order the user specifies the options in.
-Scott

Dear Scott Wood,
In message 20090908153825.GA18061@b07421-ec1.am.freescale.net you wrote:
#ifdef MPC8536DS_36BIT blablabla #endif
That would be CONFIG_MPC8536DS_NAND etc., but except of that that's whaty I mean.
NAND and 36BIT are orthogonal options -- what is wrong with the previous suggestion of splitting them in mkconfig?
I don't like this idea as it will pollute the namespace by a number of uncontrolled auto-generated #defines, which may be a nightmare to debug because you quickly forget where such definitions might be coming from - after you realize that they are actually set because you cannot find them in any board-related config or source file.
There are a number of board names that have an underscore embedded which may or may not indicate such options. Also, such auto-generated symbols may be wrong. For example "omap1610inn_cs_autoboot_config" would auto-generate
CONFIG_OMAP1610INN CONFIG_CS CONFIG_AUTOBOOT
instead of the expected CONFIG_CS_AUTOBOOT
With more than two orthogonal options, things will get rather silly trying to list every combination -- and it would be nice if it didn't matter which order the user specifies the options in.
Agreed. Unfortunately I don't have a clever idea how to implement this either.
Best regards,
Wolfgang Denk

On Tue, Sep 08, 2009 at 07:46:29PM +0200, Wolfgang Denk wrote:
NAND and 36BIT are orthogonal options -- what is wrong with the previous suggestion of splitting them in mkconfig?
I don't like this idea as it will pollute the namespace by a number of uncontrolled auto-generated #defines, which may be a nightmare to debug because you quickly forget where such definitions might be coming from - after you realize that they are actually set because you cannot find them in any board-related config or source file.
Would this still be a big problem if the auto-generated defines were put in their own namespace (such as the CONFIG_MK_* that you suggested)?
-Scott

Dear Scott Wood,
In message 20090908202143.GA26672@b07421-ec1.am.freescale.net you wrote:
On Tue, Sep 08, 2009 at 07:46:29PM +0200, Wolfgang Denk wrote:
NAND and 36BIT are orthogonal options -- what is wrong with the previous suggestion of splitting them in mkconfig?
I don't like this idea as it will pollute the namespace by a number of uncontrolled auto-generated #defines, which may be a nightmare to debug because you quickly forget where such definitions might be coming from - after you realize that they are actually set because you cannot find them in any board-related config or source file.
Would this still be a big problem if the auto-generated defines were put in their own namespace (such as the CONFIG_MK_* that you suggested)?
Probably not a big problem, and maybe not even a practical problem. But it is still ugly, and nothing I really like.
But as it seems that nobody else cares about this, and I don;t have any better ideas either, I guess I should not block this.
Best regards,
Wolfgang Denk

Wolfgang Denk wrote:
Would this still be a big problem if the auto-generated defines were put in their own namespace (such as the CONFIG_MK_* that you suggested)?
Probably not a big problem, and maybe not even a practical problem. But it is still ugly, and nothing I really like.
Well, yes -- the long term, less-ugly solution is kconfig.
But as it seems that nobody else cares about this, and I don;t have any better ideas either, I guess I should not block this.
Thanks.
-Scott

Hi All,
About this question, now we have two interim methods until we have kconfig:
1. As talked about with Wolfgang yesterday, just pass the board config name to config.h, then leave the board config file to handle the different targets.
The patch can find through this link: http://lists.denx.de/pipermail/u-boot/2009-September/060173.html
2. Add a '-t'option in mkconfig to split board config name to individual targets, then put them to board config file.
I modified the patch over version 1 and sent it again: http://lists.denx.de/pipermail/u-boot/2009-September/060268.html
Maybe the option 1 is a little clear than option 2, after all it just produces one uncontrolled macro, but it'll make the board config file lengthy when there are more orthogonal options as Scott pointed it.
For me these two options both work - 8536 just have two orthognal options at most now :-) For anyone else, I don't know, it looks like anyone else doesn't care about this issue.
Wolfgang, I think it'll be hlep to pick up one of these for multiple board config targets, or else we have to go back to 'findstring' method on the top makefile. How do you think about it?
BTW, when can we get kconfig in U-Boot? :-)
Mang thanks, Mingkai
________________________________
From: Wood Scott-B07421 Sent: 2009-9-9 (星期三) 4:58 To: Wolfgang Denk Cc: Hu Mingkai-B21284; Kumar Gala; U-Boot-Users ML; Mike Frysinger Subject: Re: [PATCH 01/10] mkconfig: parse top level makefile target to multiple config targets
Wolfgang Denk wrote:
Would this still be a big problem if the auto-generated defines were put in their own namespace (such as the CONFIG_MK_* that you suggested)?
Probably not a big problem, and maybe not even a practical problem. But it is still ugly, and nothing I really like.
Well, yes -- the long term, less-ugly solution is kconfig.
But as it seems that nobody else cares about this, and I don;t have any better ideas either, I guess I should not block this.
Thanks.
-Scott

Dear "Hu Mingkai-B21284",
In message 73839B4A0818E747864426270AC332C303B8BA05@zmy16exm20.fsl.freescale.net you wrote:
About this question, now we have two interim methods until we have kconfig:
...
- Add a '-t'option in mkconfig to split board config name to individual > targets,
then put them to board config file.
This is what we have now, after the other approach didn't work well.
BTW, when can we get kconfig in U-Boot? :-)
Of course we can - as soon as someone posts clean patches.
Jean-Christophe claimed several times before he had this nearly complete resp. ready for posting, but at the moment it seems he just beamed himself off this planet.
Best regards,
Wolfgang Denk
participants (6)
-
Hu Mingkai-B21284
-
Kim Phillips
-
Kumar Gala
-
Mingkai Hu
-
Scott Wood
-
Wolfgang Denk