diff options
Diffstat (limited to 'package/uboot-lantiq/patches/400-lzma.patch')
-rw-r--r-- | package/uboot-lantiq/patches/400-lzma.patch | 1687 |
1 files changed, 1687 insertions, 0 deletions
diff --git a/package/uboot-lantiq/patches/400-lzma.patch b/package/uboot-lantiq/patches/400-lzma.patch new file mode 100644 index 0000000000..b2f498ac5a --- /dev/null +++ b/package/uboot-lantiq/patches/400-lzma.patch @@ -0,0 +1,1687 @@ +--- a/.gitignore ++++ b/.gitignore +@@ -23,6 +23,11 @@ + /u-boot.hex + /u-boot.map + /u-boot.bin ++/u-boot.bin.bz2 ++/u-boot.bin.gz ++/u-boot.bin.lzma ++/u-boot.bin.lzo ++/u-boot.dis + /u-boot.srec + /u-boot.ldr + /u-boot.ldr.hex +@@ -30,6 +35,20 @@ + /u-boot.lds + /u-boot-onenand.bin + /u-boot-flexonenand.bin ++/u-boot-bootstrap ++/u-boot-bootstrap.hex ++/u-boot-bootstrap.map ++/u-boot-bootstrap.bin ++/u-boot-bootstrap.bin.bz2 ++/u-boot-bootstrap.bin.gz ++/u-boot-bootstrap.bin.lzma ++/u-boot-bootstrap.bin.lzo ++/u-boot-bootstrap.dis ++/u-boot-bootstrap.srec ++/u-boot-bootstrap.ldr ++/u-boot-bootstrap.ldr.hex ++/u-boot-bootstrap.ldr.srec ++/u-boot-bootstrap.lds + + # + # Generated files +@@ -38,6 +57,7 @@ + *.depend + /LOG + /errlog ++/.payload.s + /reloc_off + + # stgit generated dirs +@@ -63,3 +83,6 @@ + /onenand_ipl/onenand-ipl* + /onenand_ipl/board/*/onenand* + /onenand_ipl/board/*/*.S ++examples/standalone/ ++ ++setvars +--- a/Makefile ++++ b/Makefile +@@ -183,6 +183,12 @@ + + OBJS := $(addprefix $(obj),$(OBJS)) + ++ifeq ($(CONFIG_BOOTSTRAP),y) ++BOOTSTRAP_OBJS = cpu/$(ARCH)/start_bootstrap.o ++ ++BOOTSTRAP_OBJS := $(addprefix $(obj),$(BOOTSTRAP_OBJS)) ++endif ++ + LIBS = lib_generic/libgeneric.a + LIBS += lib_generic/lzma/liblzma.a + LIBS += lib_generic/lzo/liblzo.a +@@ -254,6 +260,25 @@ + LIBBOARD = board/$(BOARDDIR)/lib$(BOARD).a + LIBBOARD := $(addprefix $(obj),$(LIBBOARD)) + ++ifeq ($(CONFIG_BOOTSTRAP),y) ++BOOTSTRAP_LIBS = lib_generic/libgeneric_bootstrap.a ++BOOTSTRAP_LIBS += cpu/$(ARCH)/lib$(ARCH)_bootstrap.a ++BOOTSTRAP_LIBS += lib_$(ARCH)/lib$(ARCH)_bootstrap.a ++BOOTSTRAP_LIBS += common/libcommon_bootstrap.a ++BOOTSTRAP_LIBS-$(CONFIG_BOOTSTRAP_SERIAL) += drivers/serial/libserial.a ++ ++BOOTSTRAP_LIBS-$(CONFIG_BOOTSTRAP_LZMA) += lib_generic/lzma/liblzma.a ++BOOTSTRAP_LIBS-$(CONFIG_BOOTSTRAP_LZO) += lib/lzo/liblzo.a ++BOOTSTRAP_LIBS += $(BOOTSTRAP_LIBS-y) ++ ++BOOTSTRAP_LIBS := $(addprefix $(obj),$(BOOTSTRAP_LIBS)) ++.PHONY : $(BOOTSTRAP_LIBS) ++ ++BOOTSTRAP_LIBBOARD = board/$(BOARDDIR)/lib$(BOARD)_bootstrap.a ++BOOTSTRAP_LIBBOARD := $(addprefix $(obj),$(BOOTSTRAP_LIBBOARD)) ++endif ++ ++ + # Add GCC lib + ifdef USE_PRIVATE_LIBGCC + ifeq ("$(USE_PRIVATE_LIBGCC)", "yes") +@@ -267,6 +292,9 @@ + PLATFORM_LIBS += $(PLATFORM_LIBGCC) + export PLATFORM_LIBS + ++BOOTSTRAP_PLATFORM_LIBS += $(PLATFORM_LIBGCC) ++export BOOTSTRAP_PLATFORM_LIBS ++ + # Special flags for CPP when processing the linker script. + # Pass the version down so we can handle backwards compatibility + # on the fly. +@@ -289,12 +317,19 @@ + __OBJS := $(subst $(obj),,$(OBJS)) + __LIBS := $(subst $(obj),,$(LIBS)) $(subst $(obj),,$(LIBBOARD)) + ++__BOOTSTRAP_OBJS := $(subst $(obj),,$(BOOTSTRAP_OBJS)) ++__BOOTSTRAP_LIBS := $(subst $(obj),,$(BOOTSTRAP_LIBS)) $(subst $(obj),,$(BOOTSTRAP_LIBBOARD)) ++ + ######################################################################### + ######################################################################### + + # Always append ALL so that arch config.mk's can add custom ones + ALL += $(obj)u-boot.srec $(obj)u-boot.bin $(obj)System.map $(U_BOOT_NAND) $(U_BOOT_ONENAND) + ++ifeq ($(CONFIG_BOOTSTRAP),y) ++ALL += $(obj)u-boot-bootstrap.srec $(obj)u-boot-bootstrap.bin ++endif ++ + all: $(ALL) + + $(obj)u-boot.hex: $(obj)u-boot +@@ -306,6 +341,19 @@ + $(obj)u-boot.bin: $(obj)u-boot + $(OBJCOPY) ${OBJCFLAGS} -O binary $< $@ + ++$(obj)u-boot.bin.gz: $(obj)u-boot.bin ++ gzip -c $< > $@ ++ ++$(obj)u-boot.bin.lzma: $(obj)u-boot.bin ++ echo lzma -e -z -c $< $@ ++ lzma e $< $@ ++ ++$(obj)u-boot.bin.lzo: $(obj)u-boot.bin ++ lzop -9 -c $< > $@ ++ ++$(obj)u-boot.bin.bz2: $(obj)u-boot.bin ++ bzip2 --best -z -c $< > $@ ++ + $(obj)u-boot.ldr: $(obj)u-boot + $(CREATE_LDR_ENV) + $(LDR) -T $(CONFIG_BFIN_CPU) -c $@ $< $(LDR_FLAGS) +@@ -335,12 +383,12 @@ + $(obj)tools/ubsha1 $(obj)u-boot.bin + + $(obj)u-boot.dis: $(obj)u-boot +- $(OBJDUMP) -d $< > $@ ++ $(OBJDUMP) -S -d $< > $@ + + GEN_UBOOT = \ + UNDEF_SYM=`$(OBJDUMP) -x $(LIBBOARD) $(LIBS) | \ + sed -n -e 's/.*\($(SYM_PREFIX)__u_boot_cmd_.*\)/-u\1/p'|sort|uniq`;\ +- cd $(LNDIR) && $(LD) $(LDFLAGS) $$UNDEF_SYM $(__OBJS) \ ++ cd $(LNDIR) && $(LD) --gc-sections $(LDFLAGS) $$UNDEF_SYM $(__OBJS) \ + --start-group $(__LIBS) --end-group $(PLATFORM_LIBS) \ + -Map u-boot.map -o u-boot + $(obj)u-boot: depend $(SUBDIRS) $(OBJS) $(LIBBOARD) $(LIBS) $(LDSCRIPT) $(obj)u-boot.lds +@@ -362,6 +410,120 @@ + $(LIBBOARD): depend $(LIBS) + $(MAKE) -C $(dir $(subst $(obj),,$@)) + ++# Bootstrap targets ++ ++ifeq ($(CONFIG_BOOTSTRAP),y) ++$(obj)u-boot-bootstrap.hex: $(obj)u-boot-bootstrap ++ $(OBJCOPY) ${OBJCFLAGS} -O ihex $< $@ ++ ++$(obj)u-boot-bootstrap.srec: $(obj)u-boot-bootstrap ++ $(OBJCOPY) -O srec $< $@ ++ ++$(obj)u-boot-bootstrap.bin: $(obj)u-boot-bootstrap ++ $(OBJCOPY) ${OBJCFLAGS} -O binary $< $@ ++ $(BOARD_SIZE_CHECK) ++ ++$(obj)u-boot-bootstrap.bin.gz: $(obj)u-boot-bootstrap.bin ++ gzip -c $< > $@ ++ ++$(obj)u-boot-bootstrap.bin.lzma: $(obj)u-boot-bootstrap.bin ++ lzma -e -z -c $< > $@ ++ ++$(obj)u-boot.bin-bootstrap.lzo: $(obj)u-boot-bootstrap.bin ++ lzop -9 -c $< > $@ ++ ++$(obj)u-boot.bin-bootstrap.bz2: $(obj)u-boot-bootstrap.bin ++ bzip2 --best -z -c $< > $@ ++ ++$(obj)u-boot-bootstrap.ldr: $(obj)u-boot-bootstrap ++ $(CREATE_LDR_ENV) ++ $(LDR) -T $(CONFIG_BFIN_CPU) -c $@ $< $(LDR_FLAGS) ++ $(BOARD_SIZE_CHECK) ++ ++$(obj)u-boot-bootstrap.ldr.hex: $(obj)u-boot-bootstrap.ldr ++ $(OBJCOPY) ${OBJCFLAGS} -O ihex $< $@ -I binary ++ ++$(obj)u-boot-bootstrap.ldr.srec: $(obj)u-boot-bootstrap.ldr ++ $(OBJCOPY) ${OBJCFLAGS} -O srec $< $@ -I binary ++ ++$(obj)u-boot-bootstrap.img: $(obj)u-boot-bootstrap.bin ++ $(obj)tools/mkimage -A $(ARCH) -T firmware -C none \ ++ -a $(CONFIG_BOOTSTRAP_BASE) -e 0 \ ++ -n $(shell sed -n -e 's/.*U_BOOT_VERSION//p' $(VERSION_FILE) | \ ++ sed -e 's/"[ ]*$$/ for $(BOARD) board"/') \ ++ -d $< $@ ++ ++$(obj)u-boot-bootstrap.imx: $(obj)u-boot-bootstrap.bin ++ $(obj)tools/mkimage -n $(IMX_CONFIG) -T imximage \ ++ -e $(CONFIG_BOOTSTRAP_BASE) -d $< $@ ++ ++$(obj)u-boot-bootstrap.kwb: $(obj)u-boot-bootstrap.bin ++ $(obj)tools/mkimage -n $(CONFIG_SYS_KWD_CONFIG) -T kwbimage \ ++ -a $(CONFIG_SYS_TEXT_BASE) -e $(CONFIG_SYS_TEXT_BASE) -d $< $@ ++ ++$(obj)u-boot-bootstrap.sha1: $(obj)u-boot-bootstrap.bin ++ $(obj)tools/ubsha1 $(obj)u-boot-bootstrap.bin ++ ++$(obj)u-boot-bootstrap.dis: $(obj)u-boot-bootstrap ++ echo $(OBJDUMP) -S -d $< > $@ ++ $(OBJDUMP) -S -d $< > $@ ++ ++PAYLOAD_FILE_BASE=$(obj)u-boot.bin ++ifeq ($(CONFIG_BOOTSTRAP_GZIP),y) ++PAYLOAD_FILE_EXT:=.gz ++endif ++ifeq ($(CONFIG_BOOTSTRAP_LZMA),y) ++PAYLOAD_FILE_EXT:=.lzma ++endif ++ifeq ($(CONFIG_BOOTSTRAP_LZO),y) ++PAYLOAD_FILE_EXT:=.lzo ++endif ++ifeq ($(CONFIG_BOOTSTRAP_BZIP2),y) ++PAYLOAD_FILE_EXT:=.bz2 ++endif ++ ++PAYLOAD_FILE := $(PAYLOAD_FILE_BASE)$(PAYLOAD_FILE_EXT) ++ ++$(obj).payload.s: $(PAYLOAD_FILE) ++ echo ".globl payload_start" > $@ ++ echo ".globl payload_end" >> $@ ++ echo ".globl payload_size" >> $@ ++ echo ".globl payload_uncsize" >> $@ ++ echo .section .payload,\"a\",@progbits >> $@ ++ echo "payload_size:" >> $@ ++ echo -n ".word " >> $@ ++ wc -c $(PAYLOAD_FILE) | cut -f1 -d' ' >> $@ ++ echo "payload_uncsize:" >> $@ ++ echo -n ".word " >> $@ ++ wc -c $(obj)u-boot.bin | cut -f1 -d' ' >> $@ ++ echo "payload_start:" >> $@ ++ echo .incbin \"$(PAYLOAD_FILE)\" >> $@ ++ echo "payload_end:" >> $@ ++ ++ ++GEN_UBOOT_BOOTSTRAP = \ ++ UNDEF_SYM=`$(OBJDUMP) -x $(BOOTSTRAP_LIBBOARD) $(BOOTSTRAP_LIBS) | \ ++ sed -n -e 's/.*\($(SYM_PREFIX)__u_boot_cmd_.*\)/-u\1/p'|sort|uniq`;\ ++ cd $(LNDIR) && $(LD) --gc-sections $(BOOTSTRAP_LDFLAGS) $$UNDEF_SYM $(obj).payload.o $(__BOOTSTRAP_OBJS) \ ++ --start-group $(__BOOTSTRAP_LIBS) --end-group $(BOOTSTRAP_PLATFORM_LIBS) \ ++ -Map u-boot-bootstrap.map -o u-boot-bootstrap ++ ++$(obj)u-boot-bootstrap: depend $(SUBDIRS) $(BOOTSTRAP_OBJS) $(BOOTSTRAP_LIBS) $(BOOTSTRAP_LDSCRIPT) $(obj)u-boot-bootstrap.lds $(obj).payload.o #$(BOOTSTRAP_LIBBOARD) ++ #echo "--------$(BOOTSTRAP_LIBBOARD)" ++ #echo "$(GEN_UBOOT_BOOTSTRAP)" ++ $(GEN_UBOOT_BOOTSTRAP) ++ifeq ($(CONFIG_KALLSYMS),y) ++ smap=`$(call SYSTEM_MAP,u-boot-bootstrap) | \ ++ awk '$$2 ~ /[tTwW]/ {printf $$1 $$3 "\\\\000"}'` ; \ ++ $(CC) $(CFLAGS) -DSYSTEM_MAP="\"$${smap}\"" \ ++ -c common/system_map.c -o $(obj)common/system_map.o ++ $(GEN_UBOOT_BOOTSTRAP) $(obj)common/system_map.o ++endif ++ ++$(BOOTSTRAP_LIBBOARD): depend $(BOOTSTRAP_LIBS) ++ $(MAKE) -C $(dir $(subst $(obj),,$@)) $(notdir $@) ++endif ++ + $(SUBDIRS): depend + $(MAKE) -C $@ all + +@@ -371,6 +533,9 @@ + $(obj)u-boot.lds: $(LDSCRIPT) + $(CPP) $(CPPFLAGS) $(LDPPFLAGS) -ansi -D__ASSEMBLY__ -P - <$^ >$@ + ++$(obj)u-boot-bootstrap.lds: $(BOOTSTRAP_LDSCRIPT) ++ $(CPP) $(CPPFLAGS) $(BOOTSTRAP_LDPPFLAGS) -ansi -D__ASSEMBLY__ -P - <$^ >$@ ++ + $(NAND_SPL): $(TIMESTAMP_FILE) $(VERSION_FILE) $(obj)include/autoconf.mk + $(MAKE) -C nand_spl/board/$(BOARDDIR) all + +@@ -3829,6 +3994,7 @@ + $(obj)board/netstar/{eeprom,crcek,crcit,*.srec,*.bin} \ + $(obj)board/trab/trab_fkt $(obj)board/voiceblue/eeprom \ + $(obj)board/armltd/{integratorap,integratorcp}/u-boot.lds \ ++ $(obj)u-boot-bootstrap.lds \ + $(obj)lib_blackfin/u-boot.lds \ + $(obj)u-boot.lds \ + $(obj)cpu/blackfin/bootrom-asm-offsets.[chs] +@@ -3853,6 +4019,12 @@ + @rm -f $(obj)u-boot $(obj)u-boot.map $(obj)u-boot.hex $(ALL) + @rm -f $(obj)u-boot.kwb + @rm -f $(obj)u-boot.imx ++ @rm -f $(obj)u-boot.bin{.gz,.lzma,.lzo,.bz2} ++ @rm -f $(obj)u-boot-bootstrap $(obj)u-boot-bootstrap.map $(obj)u-boot-bootstrap.hex ++ @rm -f $(obj)u-boot-bootstrap.kwb ++ @rm -f $(obj)u-boot-bootstrap.imx ++ @rm -f $(obj)u-boot-bootstrap.bin{.gz,.lzma,.lzo,.bz2} ++ @rm -f $(obj).payload.s + @rm -f $(obj)tools/{env/crc32.c,inca-swap-bytes} + @rm -f $(obj)cpu/mpc824x/bedbug_603e.c + @rm -f $(obj)include/asm/proc $(obj)include/asm/arch $(obj)include/asm +--- a/lib_mips/config.mk ++++ b/lib_mips/config.mk +@@ -47,6 +47,6 @@ + # On the other hand, we want PIC in the U-Boot code to relocate it from ROM + # to RAM. $28 is always used as gp. + # +-PLATFORM_CPPFLAGS += -G 0 -mabicalls -fpic ++PLATFORM_CPPFLAGS += -G 0 -mabicalls -fpic -g + PLATFORM_CPPFLAGS += -msoft-float + PLATFORM_LDFLAGS += -G 0 -static -n -nostdlib +--- /dev/null ++++ b/cpu/mips/reset.c +@@ -0,0 +1,39 @@ ++/* ++ * (C) Copyright 2003 ++ * Wolfgang Denk, DENX Software Engineering, <wd@denx.de> ++ * ++ * 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 <command.h> ++#include <asm/mipsregs.h> ++#include <asm/reboot.h> ++ ++void __attribute__((weak)) _machine_restart(void) ++{ ++} ++ ++int __attribute__((weak)) do_reset(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) ++{ ++ _machine_restart(); ++ ++ fprintf(stderr, "*** reset failed ***\n"); ++ return 0; ++} +--- /dev/null ++++ b/cpu/mips/reset_bootstrap.c +@@ -0,0 +1,39 @@ ++/* ++ * (C) Copyright 2003 ++ * Wolfgang Denk, DENX Software Engineering, <wd@denx.de> ++ * ++ * 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 <command.h> ++#include <asm/mipsregs.h> ++#include <asm/reboot.h> ++ ++void __attribute__((weak)) _machine_restart(void) ++{ ++} ++ ++int __attribute__((weak)) do_reset(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) ++{ ++ _machine_restart(); ++ ++ printf("*** reset failed ***\n"); ++ return 0; ++} +--- /dev/null ++++ b/cpu/mips/start_bootstrap.S +@@ -0,0 +1,534 @@ ++/* ++ * Startup Code for MIPS32 CPU-core base on start.S source ++ * ++ * Copyright (c) 2010 Industrie Dial Face S.p.A. ++ * Luigi 'Comio' Mantellini <luigi.mantellini@idf-hit.com> ++ * ++ * Copyright (c) 2003 Wolfgang Denk <wd@denx.de> ++ * ++ * 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 <generated/generic-asm-offsets.h> ++#include <config.h> ++#include <asm/regdef.h> ++//#include <asm/mipsregs.h> ++#define CP0_INDEX $0 ++#define CP0_RANDOM $1 ++#define CP0_ENTRYLO0 $2 ++#define CP0_ENTRYLO1 $3 ++#define CP0_CONF $3 ++#define CP0_CONTEXT $4 ++#define CP0_PAGEMASK $5 ++#define CP0_WIRED $6 ++#define CP0_INFO $7 ++#define CP0_BADVADDR $8 ++#define CP0_COUNT $9 ++#define CP0_ENTRYHI $10 ++#define CP0_COMPARE $11 ++#define CP0_STATUS $12 ++#define CP0_CAUSE $13 ++#define CP0_EPC $14 ++#define CP0_PRID $15 ++#define CP0_EBASE $15,1 ++#define CP0_CONFIG $16 ++#define CP0_LLADDR $17 ++#define CP0_WATCHLO $18 ++#define CP0_WATCHHI $19 ++#define CP0_XCONTEXT $20 ++#define CP0_FRAMEMASK $21 ++#define CP0_DIAGNOSTIC $22 ++#define CP0_DEBUG $23 ++#define CP0_DEPC $24 ++#define CP0_PERFORMANCE $25 ++#define CP0_ECC $26 ++#define CP0_CACHEERR $27 ++#define CP0_TAGLO $28 ++#define CP0_TAGHI $29 ++#define CP0_ERROREPC $30 ++#define CP0_DESAVE $31 ++#define ST0_CU0 0x10000000 ++#define CONF_CM_UNCACHED 2 ++#define CONF_CM_CACHABLE_NONCOHERENT 3 ++#define EBASEB_CPUNUM 0 ++#define EBASEF_CPUNUM (0x3ff << EBASEB_CPUNUM) ++#define MIPS_CONF7_RPS 4 //((unsigned long)(1) << 2) ++#define CONF_CM_CACHABLE_NONCOHERENT 3 ++#ifndef CONFIG_SYS_MIPS_CACHE_OPER_MODE ++#define CONFIG_SYS_MIPS_CACHE_OPER_MODE CONF_CM_CACHABLE_NONCOHERENT ++#endif ++ ++ /* ++ * For the moment disable interrupts, mark the kernel mode and ++ * set ST0_KX so that the CPU does not spit fire when using ++ * 64-bit addresses. ++ */ ++ .macro setup_c0_status set clr ++ .set push ++ mfc0 t0, CP0_STATUS ++ or t0, ST0_CU0 | \set | 0x1f | \clr ++ xor t0, 0x1f | \clr ++ mtc0 t0, CP0_STATUS ++ .set noreorder ++ sll zero, 3 # ehb ++ .set pop ++ .endm ++ ++ .macro setup_c0_status_reset ++#ifdef CONFIG_64BIT ++ setup_c0_status ST0_KX 0 ++#else ++ setup_c0_status 0 0 ++#endif ++ .endm ++ ++#define RVECENT(f,n) \ ++ b f; nop ++#define XVECENT(f,bev) \ ++ b f ; \ ++ li k0,bev ++ ++ .set noreorder ++ ++ .globl _start ++ .text ++_start: ++ RVECENT(reset,0) /* U-boot entry point */ ++ RVECENT(reset,1) /* software reboot */ ++#if defined(CONFIG_INCA_IP) ++ .word INFINEON_EBU_BOOTCFG /* EBU init code, fetched during booting */ ++ .word 0x00000000 /* phase of the flash */ ++#elif defined(CONFIG_PURPLE) ++ .word INFINEON_EBU_BOOTCFG /* EBU init code, fetched during booting */ ++ .word INFINEON_EBU_BOOTCFG /* EBU init code, fetched during booting */ ++#else ++ .word INFINEON_EBU_BOOTCFG /* EBU init code, fetched during booting */ ++ .word 0x00000000 /* phase of the flash */ ++#endif ++ RVECENT(romReserved,3) ++ RVECENT(romReserved,4) ++ RVECENT(romReserved,5) ++ RVECENT(romReserved,6) ++ RVECENT(romReserved,7) ++ RVECENT(romReserved,8) ++ RVECENT(romReserved,9) ++ RVECENT(romReserved,10) ++ RVECENT(romReserved,11) ++ RVECENT(romReserved,12) ++ RVECENT(romReserved,13) ++ RVECENT(romReserved,14) ++ RVECENT(romReserved,15) ++ RVECENT(romReserved,16) ++ RVECENT(romReserved,17) ++ RVECENT(romReserved,18) ++ RVECENT(romReserved,19) ++ RVECENT(romReserved,20) ++ RVECENT(romReserved,21) ++ RVECENT(romReserved,22) ++ RVECENT(romReserved,23) ++ RVECENT(romReserved,24) ++ RVECENT(romReserved,25) ++ RVECENT(romReserved,26) ++ RVECENT(romReserved,27) ++ RVECENT(romReserved,28) ++ RVECENT(romReserved,29) ++ RVECENT(romReserved,30) ++ RVECENT(romReserved,31) ++ RVECENT(romReserved,32) ++ RVECENT(romReserved,33) ++ RVECENT(romReserved,34) ++ RVECENT(romReserved,35) ++ RVECENT(romReserved,36) ++ RVECENT(romReserved,37) ++ RVECENT(romReserved,38) ++ RVECENT(romReserved,39) ++ RVECENT(romReserved,40) ++ RVECENT(romReserved,41) ++ RVECENT(romReserved,42) ++ RVECENT(romReserved,43) ++ RVECENT(romReserved,44) ++ RVECENT(romReserved,45) ++ RVECENT(romReserved,46) ++ RVECENT(romReserved,47) ++ RVECENT(romReserved,48) ++ RVECENT(romReserved,49) ++ RVECENT(romReserved,50) ++ RVECENT(romReserved,51) ++ RVECENT(romReserved,52) ++ RVECENT(romReserved,53) ++ RVECENT(romReserved,54) ++ RVECENT(romReserved,55) ++ RVECENT(romReserved,56) ++ RVECENT(romReserved,57) ++ RVECENT(romReserved,58) ++ RVECENT(romReserved,59) ++ RVECENT(romReserved,60) ++ RVECENT(romReserved,61) ++ RVECENT(romReserved,62) ++ RVECENT(romReserved,63) ++ XVECENT(romExcHandle,0x200) /* bfc00200: R4000 tlbmiss vector */ ++ RVECENT(romReserved,65) ++ RVECENT(romReserved,66) ++ RVECENT(romReserved,67) ++ RVECENT(romReserved,68) ++ RVECENT(romReserved,69) ++ RVECENT(romReserved,70) ++ RVECENT(romReserved,71) ++ RVECENT(romReserved,72) ++ RVECENT(romReserved,73) ++ RVECENT(romReserved,74) ++ RVECENT(romReserved,75) ++ RVECENT(romReserved,76) ++ RVECENT(romReserved,77) ++ RVECENT(romReserved,78) ++ RVECENT(romReserved,79) ++ XVECENT(romExcHandle,0x280) /* bfc00280: R4000 xtlbmiss vector */ ++ RVECENT(romReserved,81) ++ RVECENT(romReserved,82) ++ RVECENT(romReserved,83) ++ RVECENT(romReserved,84) ++ RVECENT(romReserved,85) ++ RVECENT(romReserved,86) ++ RVECENT(romReserved,87) ++ RVECENT(romReserved,88) ++ RVECENT(romReserved,89) ++ RVECENT(romReserved,90) ++ RVECENT(romReserved,91) ++ RVECENT(romReserved,92) ++ RVECENT(romReserved,93) ++ RVECENT(romReserved,94) ++ RVECENT(romReserved,95) ++ XVECENT(romExcHandle,0x300) /* bfc00300: R4000 cache vector */ ++ RVECENT(romReserved,97) ++ RVECENT(romReserved,98) ++ RVECENT(romReserved,99) ++ RVECENT(romReserved,100) ++ RVECENT(romReserved,101) ++ RVECENT(romReserved,102) ++ RVECENT(romReserved,103) ++ RVECENT(romReserved,104) ++ RVECENT(romReserved,105) ++ RVECENT(romReserved,106) ++ RVECENT(romReserved,107) ++ RVECENT(romReserved,108) ++ RVECENT(romReserved,109) ++ RVECENT(romReserved,110) ++ RVECENT(romReserved,111) ++ XVECENT(romExcHandle,0x380) /* bfc00380: R4000 general vector */ ++ RVECENT(romReserved,113) ++ RVECENT(romReserved,114) ++ RVECENT(romReserved,115) ++ RVECENT(romReserved,116) ++ RVECENT(romReserved,116) ++ RVECENT(romReserved,118) ++ RVECENT(romReserved,119) ++ RVECENT(romReserved,120) ++ RVECENT(romReserved,121) ++ RVECENT(romReserved,122) ++ RVECENT(romReserved,123) ++ RVECENT(romReserved,124) ++ RVECENT(romReserved,125) ++ RVECENT(romReserved,126) ++ RVECENT(romReserved,127) ++ ++ /* We hope there are no more reserved vectors! ++ * 128 * 8 == 1024 == 0x400 ++ * so this is address R_VEC+0x400 == 0xbfc00400 ++ */ ++#if 1 ++ XVECENT(romExcHandle,0x400); /* bfc00400: Int, CauseIV=1 */ ++ RVECENT(romReserved,129); ++ RVECENT(romReserved,130); ++ RVECENT(romReserved,131); ++ RVECENT(romReserved,132); ++ RVECENT(romReserved,133); ++ RVECENT(romReserved,134); ++ RVECENT(romReserved,135); ++ RVECENT(romReserved,136); ++ RVECENT(romReserved,137); ++ RVECENT(romReserved,138); ++ RVECENT(romReserved,139); ++ RVECENT(romReserved,140); ++ RVECENT(romReserved,141); ++ RVECENT(romReserved,142); ++ RVECENT(romReserved,143); ++ XVECENT(romExcHandle,0x480); /* bfc00480: EJTAG debug exception */ ++#elif defined(CONFIG_PURPLE) ++/* 0xbfc00400 */ ++ .word 0xdc870000 ++ .word 0xfca70000 ++ .word 0x20840008 ++ .word 0x20a50008 ++ .word 0x20c6ffff ++ .word 0x14c0fffa ++ .word 0x00000000 ++ .word 0x03e00008 ++ .word 0x00000000 ++ .word 0x00000000 ++/* 0xbfc00428 */ ++ .word 0xdc870000 ++ .word 0xfca70000 ++ .word 0x20840008 ++ .word 0x20a50008 ++ .word 0x20c6ffff ++ .word 0x14c0fffa ++ .word 0x00000000 ++ .word 0x03e00008 ++ .word 0x00000000 ++ .word 0x00000000 ++#endif /* CONFIG_PURPLE */ ++ .align 4 ++reset: ++#ifdef CONFIG_SYS_MIPS_MULTI_CPU ++ mfc0 k0, CP0_EBASE ++ and k0, EBASEF_CPUNUM ++ bne k0, zero, ifx_mips_handler_cpux ++ nop ++#endif ++ /* Clear watch registers. ++ */ ++ mtc0 zero, CP0_WATCHLO ++ mtc0 zero, CP0_WATCHHI ++ ++ /* WP(Watch Pending), SW0/1 should be cleared. */ ++ mtc0 zero, CP0_CAUSE ++ ++ setup_c0_status_reset ++#if defined(CONFIG_MIPS24KEC) || defined(CONFIG_MIPS34KC) ++ /* CONFIG7 register */ ++ /* Erratum "RPS May Cause Incorrect Instruction Execution" ++ * for 24KEC and 34KC */ ++ mfc0 k0, CP0_CONFIG, 7 ++ li k1, MIPS_CONF7_RPS ++ or k0, k1 ++ mtc0 k0, CP0_CONFIG, 7 ++#endif ++ ++ /* Init Timer */ ++ mtc0 zero, CP0_COUNT ++ mtc0 zero, CP0_COMPARE ++ ++ /* CONFIG0 register */ ++ li t0, CONF_CM_UNCACHED ++ mtc0 t0, CP0_CONFIG ++ ++ /* Initialize $gp. ++ */ ++ bal 1f ++ nop ++ .word _gp ++1: ++ lw gp, 0(ra) ++ ++ /* Initialize any external memory. ++ */ ++ la t9, lowlevel_init ++ jalr t9 ++ nop ++ ++ /* Initialize caches... ++ */ ++ la t9, mips_cache_reset ++ jalr t9 ++ nop ++ ++ /* ... and enable them. ++ */ ++ li t0, CONF_CM_CACHABLE_NONCOHERENT /*CONFIG_SYS_MIPS_CACHE_OPER_MODE*/ ++ mtc0 t0, CP0_CONFIG ++ ++ /* Set up temporary stack. ++ */ ++#ifdef CONFIG_SYS_INIT_RAM_LOCK_MIPS ++ li a0, CONFIG_SYS_INIT_SP_OFFSET ++ la t9, mips_cache_lock ++ jalr t9 ++ nop ++#endif ++ ++ li t0, CONFIG_SYS_SDRAM_BASE + CONFIG_SYS_INIT_SP_OFFSET ++ la sp, 0(t0) ++ ++ la t9, bootstrap_board_init_f ++ jr t9 ++ nop ++ ++/* ++ * void relocate_code (addr_sp, gd, addr_moni) ++ * ++ * This "function" does not return, instead it continues in RAM ++ * after relocating the monitor code. ++ * ++ * a0 = addr_sp ++ * a1 = gd ++ * a2 = destination address ++ */ ++ .globl relocate_code ++ .ent relocate_code ++relocate_code: ++ move sp, a0 /* Set new stack pointer */ ++ ++ li t0, CONFIG_BOOTSTRAP_TEXT_BASE ++ la t3, in_ram ++ lw t2, -12(t3) /* t2 <-- uboot_end_data */ ++ move t1, a2 ++ move s2, a2 /* s2 <-- destination address */ ++ ++ /* ++ * Fix $gp: ++ * ++ * New $gp = (Old $gp - CONFIG_SYS_MONITOR_BASE) + Destination Address ++ */ ++ move t6, gp ++ sub gp, CONFIG_BOOTSTRAP_TEXT_BASE ++ add gp, a2 /* gp now adjusted */ ++ sub s1, gp, t6 /* s1 <-- relocation offset */ ++ ++ /* ++ * t0 = source address ++ * t1 = target address ++ * t2 = source end address ++ */ ++ ++ /* ++ * Save destination address and size for later usage in flush_cache() ++ */ ++ move s0, a1 /* save gd in s0 */ ++ move a0, t1 /* a0 <-- destination addr */ ++ sub a1, t2, t0 /* a1 <-- size */ ++ ++ /* On the purple board we copy the code earlier in a special way ++ * in order to solve flash problems ++ */ ++#ifndef CONFIG_PURPLE ++1: ++ lw t3, 0(t0) ++ sw t3, 0(t1) ++ addu t0, 4 ++ ble t0, t2, 1b ++ addu t1, 4 /* delay slot */ ++#endif ++ ++ /* If caches were enabled, we would have to flush them here. ++ */ ++ ++ /* a0 & a1 are already set up for flush_cache(start, size) */ ++ la t9, flush_cache ++ jalr t9 ++ nop ++ ++ /* Jump to where we've relocated ourselves. ++ */ ++ addi t0, s2, in_ram - _start ++ jr t0 ++ nop ++ ++ .word _gp ++ .word _GLOBAL_OFFSET_TABLE_ ++ .word uboot_end_data ++ .word uboot_end ++ .word num_got_entries ++ ++in_ram: ++ /* ++ * Now we want to update GOT. ++ * ++ * GOT[0] is reserved. GOT[1] is also reserved for the dynamic object ++ * generated by GNU ld. Skip these reserved entries from relocation. ++ */ ++ lw t3, -4(t0) /* t3 <-- num_got_entries */ ++ lw t4, -16(t0) /* t4 <-- _GLOBAL_OFFSET_TABLE_ */ ++ lw t5, -20(t0) /* t5 <-- _gp */ ++ sub t4, t5 /* compute offset*/ ++ add t4, t4, gp /* t4 now holds relocated _GLOBAL_OFFSET_TABLE_ */ ++ addi t4, t4, 8 /* Skipping first two entries. */ ++ li t2, 2 ++1: ++ lw t1, 0(t4) ++ beqz t1, 2f ++ add t1, s1 ++ sw t1, 0(t4) ++2: ++ addi t2, 1 ++ blt t2, t3, 1b ++ addi t4, 4 /* delay slot */ ++ ++ /* Clear BSS. ++ */ ++ lw t1, -12(t0) /* t1 <-- uboot_end_data */ ++ lw t2, -8(t0) /* t2 <-- uboot_end */ ++ add t1, s1 /* adjust pointers */ ++ add t2, s1 ++ ++ sub t1, 4 ++1: ++ addi t1, 4 ++ bltl t1, t2, 1b ++ sw zero, 0(t1) /* delay slot */ ++ ++ move a0, s0 /* a0 <-- gd */ ++ la t9, bootstrap_board_init_r ++ jr t9 ++ move a1, s2 /* delay slot */ ++ ++ .end relocate_code ++ ++/* ++ * void copy_and_jump (void) ++ * ++ * This function copies/unzips the u-boot image and runs it. ++ * This "function" does not return ++ * ++*/ ++ .globl copy_and_jump ++ .ent copy_and_jump ++copy_and_jump: ++ ++ /* copy_uboot(CONFIG_SYS_MONITOR_BASE, payload_uncsize, payload_start, payload_size) */ ++ li a0, CONFIG_SYS_MONITOR_BASE ++ la a1, payload_uncsize ++ lw a1, 0(a1) ++ la a2, payload_start ++ la a3, payload_size ++ la t9, copy_uboot ++ jalr t9 ++ lw a3, 0(a3) /* delay slot */ ++ ++ li t9, CONFIG_SYS_MONITOR_BASE ++ jr t9 ++ nop ++ ++ .end copy_and_jump ++ ++ /* Exception handlers. ++ */ ++romReserved: ++ b romReserved ++ ++romExcHandle: ++ b romExcHandle ++#ifdef CONFIG_SYS_MIPS_MULTI_CPU ++/* ++ * Stop Slave CPUs ++ */ ++ifx_mips_handler_cpux: ++ wait; ++ b ifx_mips_handler_cpux; ++ nop; ++#endif +--- a/lib_mips/Makefile ++++ b/lib_mips/Makefile +@@ -24,6 +24,9 @@ + include $(TOPDIR)/config.mk + + LIB = $(obj)lib$(ARCH).a ++BOOTSTRAP_LIB = $(obj)lib$(ARCH)_bootstrap.a ++ ++BOOTSTRAP_LIB-$(CONFIG_BOOTSTRAP) = $(BOOTSTRAP_LIB) + + SOBJS-y += + +@@ -35,12 +38,21 @@ + endif + COBJS-y += time.o + +-SRCS := $(SOBJS-y:.o=.S) $(COBJS-y:.o=.c) ++BOOTSTRAP_COBJS-$(CONFIG_BOOTSTRAP) += board_bootstrap.o ++BOOTSTRAP_COBJS-$(CONFIG_BOOTSTRAP) += time.o ++ ++BOOTSTRAP_OBJS := $(addprefix $(obj),$(BOOTSTRAP_SOBJS-y) $(BOOTSTRAP_COBJS-y)) ++ ++SRCS := $(SOBJS-y:.o=.S) $(COBJS-y:.o=.c) $(BOOTSTRAP_SOBJS-y:.o=.S) $(BOOTSTRAP_COBJS-y:.o=.c) + OBJS := $(addprefix $(obj),$(SOBJS-y) $(COBJS-y)) + ++all: $(obj).depend $(LIB) $(BOOTSTRAP_LIB) + $(LIB): $(obj).depend $(OBJS) + $(AR) $(ARFLAGS) $@ $(OBJS) + ++$(BOOTSTRAP_LIB): $(obj).depend $(BOOTSTRAP_OBJS) ++ $(AR) $(ARFLAGS) $@ $(BOOTSTRAP_OBJS) ++ + ######################################################################### + + # defines $(obj).depend target +--- /dev/null ++++ b/lib_mips/board_bootstrap.c +@@ -0,0 +1,270 @@ ++/* ++ * (C) Copyright 2010 Industrie Dial Face S.p.A. ++ * Luigi 'Comio' Mantellini, luigi.mantellini@idf-hit.com ++ * ++ * (C) Copyright 2003 ++ * Wolfgang Denk, DENX Software Engineering, wd@denx.de. ++ * ++ * 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 <command.h> ++#include <malloc.h> ++#include <stdio_dev.h> ++ ++DECLARE_GLOBAL_DATA_PTR; ++ ++extern int timer_init(void); ++ ++extern int incaip_set_cpuclk(void); ++ ++extern ulong uboot_end_data; ++extern ulong uboot_end; ++ ++#ifdef CONFIG_BOOTSTRAP_SERIAL ++static char *failed = "*** failed ***\n"; ++#endif ++/* ++ * mips_io_port_base is the begin of the address space to which x86 style ++ * I/O ports are mapped. ++ */ ++unsigned long mips_io_port_base = -1; ++ ++int __board_early_init_f(void) ++{ ++ /* ++ * Nothing to do in this dummy implementation ++ */ ++ return 0; ++} ++ ++int board_early_init_f(void) __attribute__((weak, alias("__board_early_init_f"))); ++int bootstrap_board_early_init_f(void) __attribute__((weak, alias("board_early_init_f"))); ++ ++static int bootstrap_init_func_ram (void) ++{ ++ if ((gd->ram_size = bootstrap_initdram (0)) > 0) { ++ return (0); ++ } ++#ifdef CONFIG_BOOTSTRAP_SERIAL ++ puts (failed); ++#endif ++ return (1); ++} ++ ++static int bootstrap_display_banner(void) ++{ ++#ifdef CONFIG_BOOTSTRAP_SERIAL ++ puts ("bootstrap..."); ++#endif ++ return (0); ++} ++ ++static int bootstrap_init_baudrate (void) ++{ ++#if defined(CONFIG_BOOTSTRAP_BAUDRATE) ++ gd->baudrate = CONFIG_BOOTSTRAP_BAUDRATE; ++#else ++ gd->baudrate = CONFIG_BAUDRATE; ++#endif ++ return 0; ++} ++ ++/* ++ * Breath some life into the board... ++ * ++ * The first part of initialization is running from Flash memory; ++ * its main purpose is to initialize the RAM so that we ++ * can relocate the monitor code to RAM. ++ */ ++ ++/* ++ * All attempts to come up with a "common" initialization sequence ++ * that works for all boards and architectures failed: some of the ++ * requirements are just _too_ different. To get rid of the resulting ++ * mess of board dependend #ifdef'ed code we now make the whole ++ * initialization sequence configurable to the user. ++ * ++ * The requirements for any new initalization function is simple: it ++ * receives a pointer to the "global data" structure as it's only ++ * argument, and returns an integer return code, where 0 means ++ * "continue" and != 0 means "fatal error, hang the system". ++ */ ++typedef int (init_fnc_t) (void); ++ ++static init_fnc_t *init_sequence[] = { ++ bootstrap_board_early_init_f, ++ timer_init, ++ bootstrap_init_baudrate,/* initialze baudrate settings */ ++#ifdef CONFIG_BOOTSTRAP_SERIAL ++ serial_init, /* serial communications setup */ ++#endif ++ bootstrap_display_banner, /* say that we are here */ ++ bootstrap_checkboard, ++ bootstrap_init_func_ram, ++ NULL, ++}; ++ ++ ++void bootstrap_board_init_f(ulong bootflag) ++{ ++ gd_t gd_data, *id; ++ bd_t *bd; ++ init_fnc_t **init_fnc_ptr; ++ ulong addr, addr_sp, len = (ulong)&uboot_end - CONFIG_BOOTSTRAP_TEXT_BASE; ++ ulong *s; ++ ++ /* Pointer is writable since we allocated a register for it. ++ */ ++ gd = &gd_data; ++ /* compiler optimization barrier needed for GCC >= 3.4 */ ++ __asm__ __volatile__("": : :"memory"); ++ ++ memset ((void *)gd, 0, sizeof (gd_t)); ++ ++ for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) { ++ if ((*init_fnc_ptr)() != 0) { ++ bootstrap_hang (); ++ } ++ } ++ ++ /* ++ * Now that we have DRAM mapped and working, we can ++ * relocate the code and continue running from DRAM. ++ */ ++ addr = CONFIG_SYS_SDRAM_BASE + gd->ram_size; ++ ++ /* We can reserve some RAM "on top" here. ++ */ ++ ++ /* round down to next 4 kB limit. ++ */ ++ addr &= ~(4096 - 1); ++ debug ("Top of RAM usable for U-Boot at: %08lx\n", addr); ++ ++ /* Reserve memory for U-Boot code, data & bss ++ * round down to next 16 kB limit ++ */ ++ addr -= len; ++ addr &= ~(16 * 1024 - 1); ++ ++ debug ("Reserving %ldk for U-Boot at: %08lx\n", len >> 10, addr); ++ ++ /* Reserve memory for malloc() arena. ++ */ ++ addr_sp = addr - CONFIG_SYS_MALLOC_LEN; ++ debug ("Reserving %dk for malloc() at: %08lx\n", ++ CONFIG_SYS_MALLOC_LEN >> 10, addr_sp); ++ ++ /* ++ * (permanently) allocate a Board Info struct ++ * and a permanent copy of the "global" data ++ */ ++ addr_sp -= sizeof(bd_t); ++ bd = (bd_t *)addr_sp; ++ gd->bd = bd; ++ debug ("Reserving %zu Bytes for Board Info at: %08lx\n", ++ sizeof(bd_t), addr_sp); ++ ++ addr_sp -= sizeof(gd_t); ++ id = (gd_t *)addr_sp; ++ debug ("Reserving %zu Bytes for Global Data at: %08lx\n", ++ sizeof (gd_t), addr_sp); ++ ++ /* Reserve memory for boot params. ++ */ ++ addr_sp -= CONFIG_SYS_BOOTPARAMS_LEN; ++ bd->bi_boot_params = addr_sp; ++ debug ("Reserving %dk for boot params() at: %08lx\n", ++ CONFIG_SYS_BOOTPARAMS_LEN >> 10, addr_sp); ++ ++ /* ++ * Finally, we set up a new (bigger) stack. ++ * ++ * Leave some safety gap for SP, force alignment on 16 byte boundary ++ * Clear initial stack frame ++ */ ++ addr_sp -= 16; ++ addr_sp &= ~0xF; ++ s = (ulong *)addr_sp; ++ *s-- = 0; ++ *s-- = 0; ++ addr_sp = (ulong)s; ++ debug ("Stack Pointer at: %08lx\n", addr_sp); ++ ++ /* ++ * Save local variables to board info struct ++ */ ++ bd->bi_memstart = CONFIG_SYS_SDRAM_BASE; /* start of DRAM memory */ ++ bd->bi_memsize = gd->ram_size; /* size of DRAM memory in bytes */ ++ bd->bi_baudrate = gd->baudrate; /* Console Baudrate */ ++ ++ memcpy (id, (void *)gd, sizeof (gd_t)); ++ ++ /* On the purple board we copy the code in a special way ++ * in order to solve flash problems ++ */ ++ relocate_code (addr_sp, id, addr); ++ ++ /* NOTREACHED - relocate_code() does not return */ ++} ++/************************************************************************ ++ * ++ * This is the next part if the initialization sequence: we are now ++ * running from RAM and have a "normal" C environment, i. e. global ++ * data can be written, BSS has been cleared, the stack size in not ++ * that critical any more, etc. ++ * ++ ************************************************************************ ++ */ ++ ++void bootstrap_board_init_r (gd_t *id, ulong dest_addr) ++{ ++ extern void malloc_bin_reloc (void); ++ extern void copy_and_jump(void); ++ ++ bd_t *bd; ++ ++ gd = id; ++ gd->flags |= GD_FLG_RELOC; /* tell others: relocation done */ ++ ++ debug ("Now running in RAM - U-Boot at: %08lx\n", dest_addr); ++ ++ gd->reloc_off = dest_addr - CONFIG_BOOTSTRAP_TEXT_BASE; ++ ++ bd = gd->bd; ++ ++ /* The Malloc area is immediately below the monitor copy in DRAM */ ++ mem_malloc_init(CONFIG_BOOTSTRAP_BASE + gd->reloc_off - ++ CONFIG_SYS_MALLOC_LEN, CONFIG_SYS_MALLOC_LEN); ++ malloc_bin_reloc(); ++ ++ copy_and_jump(); ++ ++ /* NOTREACHED - no way out of command loop except booting */ ++} ++ ++void bootstrap_hang (void) ++{ ++#ifdef CONFIG_BOOTSTRAP_SERIAL ++ puts ("### ERROR ### Please RESET the board ###\n"); ++#endif ++ for (;;); ++} +--- a/common/Makefile ++++ b/common/Makefile +@@ -24,6 +24,9 @@ + include $(TOPDIR)/config.mk + + LIB = $(obj)libcommon.a ++BOOTSTRAP_LIB = $(obj)libcommon_bootstrap.a ++ ++BOOTSTRAP_LIB-$(CONFIG_BOOTSTRAP) = $(BOOTSTRAP_LIB) + + AOBJS = + +@@ -168,18 +171,27 @@ + COBJS-$(CONFIG_UPDATE_TFTP) += update.o + COBJS-$(CONFIG_USB_KEYBOARD) += usb_kbd.o + ++BOOTSTRAP_COBJS-$(CONFIG_BOOTSTRAP) += dlmalloc.o ++BOOTSTRAP_COBJS-$(CONFIG_BOOTSTRAP_SERIAL) += console_bootstrap.o ++ ++BOOTSTRAP_COBJS := $(sort $(BOOTSTRAP_COBJS-y)) ++BOOTSTRAP_OBJS := $(addprefix $(obj),$(BOOTSTRAP_COBJS)) ++ + + COBJS := $(sort $(COBJS-y)) +-SRCS := $(AOBJS:.o=.S) $(COBJS:.o=.c) ++SRCS := $(AOBJS:.o=.S) $(COBJS:.o=.c) $(BOOTSTRAP_COBJS:.o=.c) + OBJS := $(addprefix $(obj),$(AOBJS) $(COBJS)) + + CPPFLAGS += -I.. + +-all: $(LIB) $(AOBJS) ++all: $(LIB) $(BOOTSTRAP_LIB-y) $(AOBJS) + + $(LIB): $(obj).depend $(OBJS) + $(AR) $(ARFLAGS) $@ $(OBJS) + ++$(BOOTSTRAP_LIB): $(obj).depend $(BOOTSTRAP_OBJS) ++ $(AR) $(ARFLAGS) $@ $(BOOTSTRAP_OBJS) ++ + $(obj)env_embedded.o: $(src)env_embedded.c $(obj)../tools/envcrc + $(CC) $(AFLAGS) -Wa,--no-warn \ + -DENV_CRC=$(shell $(obj)../tools/envcrc) \ +--- /dev/null ++++ b/common/console_bootstrap.c +@@ -0,0 +1,81 @@ ++/* ++ * (C) Copyright 2000 ++ * Paolo Scaffardi, AIRVENT SAM s.p.a - RIMINI(ITALY), arsenio@tin.it ++ * ++ * 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 <stdarg.h> ++#include <malloc.h> ++ ++/** U-Boot INITIAL CONSOLE-COMPATIBLE FUNCTION *****************************/ ++ ++int getc(void) ++{ ++ /* Send directly to the handler */ ++ return serial_getc(); ++} ++ ++int tstc(void) ++{ ++ /* Send directly to the handler */ ++ return serial_tstc(); ++} ++ ++void putc(const char c) ++{ ++ /* Send directly to the handler */ ++ serial_putc(c); ++} ++ ++void puts(const char *s) ++{ ++ serial_puts(s); ++} ++ ++void printf(const char *fmt, ...) ++{ ++ va_list args; ++ char printbuffer[CONFIG_SYS_PBSIZE]; ++ ++ va_start(args, fmt); ++ ++ /* For this to work, printbuffer must be larger than ++ * anything we ever want to print. ++ */ ++ vsprintf(printbuffer, fmt, args); ++ va_end(args); ++ ++ /* Print the string */ ++ puts(printbuffer); ++} ++ ++void vprintf(const char *fmt, va_list args) ++{ ++ char printbuffer[CONFIG_SYS_PBSIZE]; ++ ++ /* For this to work, printbuffer must be larger than ++ * anything we ever want to print. ++ */ ++ vsprintf(printbuffer, fmt, args); ++ ++ /* Print the string */ ++ puts(printbuffer); ++} +--- a/config.mk ++++ b/config.mk +@@ -136,7 +136,7 @@ + ARFLAGS = crv + endif + RELFLAGS= $(PLATFORM_RELFLAGS) +-DBGFLAGS= -g # -DDEBUG ++DBGFLAGS= -g + OPTFLAGS= -Os #-fomit-frame-pointer + ifndef LDSCRIPT + #LDSCRIPT := $(TOPDIR)/board/$(BOARDDIR)/u-boot.lds.debug +@@ -146,6 +146,11 @@ + LDSCRIPT := $(TOPDIR)/board/$(BOARDDIR)/u-boot.lds + endif + endif ++ifeq ($(CONFIG_BOOTSTRAP),y) ++ifndef BOOTSTRAP_LDSCRIPT ++BOOTSTRAP_LDSCRIPT := $(TOPDIR)/board/$(BOARDDIR)/u-boot-bootstrap.lds ++endif ++endif + OBJCFLAGS += --gap-fill=0xff + + gccincdir := $(shell $(CC) -print-file-name=include) +@@ -156,6 +161,10 @@ + CPPFLAGS += -DTEXT_BASE=$(TEXT_BASE) + endif + ++ifneq ($(CONFIG_BOOTSTRAP_TEXT_BASE),) ++CPPFLAGS += -DCONFIG_BOOTSTRAP_TEXT_BASE=$(CONFIG_BOOTSTRAP_TEXT_BASE) ++endif ++ + ifneq ($(RESET_VECTOR_ADDRESS),) + CPPFLAGS += -DRESET_VECTOR_ADDRESS=$(RESET_VECTOR_ADDRESS) + endif +@@ -176,6 +185,7 @@ + endif + + CFLAGS += $(call cc-option,-fno-stack-protector) ++CFLAGS += $(call cc-option,-ffunction-sections) + + # avoid trigraph warnings while parsing pci.h (produced by NIOS gcc-2.9) + # this option have to be placed behind -Wall -- that's why it is here +@@ -203,6 +213,13 @@ + LDFLAGS += -Ttext $(TEXT_BASE) + endif + ++ifeq ($(CONFIG_BOOTSTRAP),y) ++BOOTSTRAP_LDFLAGS += -Bstatic -T $(obj)u-boot-bootstrap.lds $(PLATFORM_LDFLAGS) ++ifneq ($(CONFIG_BOOTSTRAP_TEXT_BASE),) ++BOOTSTRAP_LDFLAGS += -Ttext $(CONFIG_BOOTSTRAP_TEXT_BASE) ++endif ++endif ++ + # Location of a usable BFD library, where we define "usable" as + # "built for ${HOST}, supports ${TARGET}". Sensible values are + # - When cross-compiling: the root of the cross-environment +--- a/include/common.h ++++ b/include/common.h +@@ -722,6 +722,27 @@ + int cpu_release(int nr, int argc, char *argv[]); + #endif + ++/* Bootstrap specific code */ ++#ifdef CONFIG_BOOTSTRAP ++void bootstrap_hang(void) __attribute__ ((noreturn)); ++void bootstrap_board_init_f(ulong) __attribute__ ((noreturn)); ++void bootstrap_board_init_r(gd_t *, ulong) __attribute__ ((noreturn)); ++int bootstrap_checkboard(void); ++ ++int bootstrap_serial_init(void); ++void bootstrap_serial_exit(void); ++void bootstrap_serial_setbrg(void); ++void bootstrap_serial_putc(const char); ++void bootstrap_serial_putc_raw(const char); ++void bootstrap_serial_puts(const char *); ++int bootstrap_serial_getc(void); ++int bootstrap_serial_tstc(void); ++ ++phys_size_t bootstrap_initdram (int); ++ ++int copy_uboot(void *dst, size_t unc_size, void *src, size_t size); ++#endif ++ + #endif /* __ASSEMBLY__ */ + + /* Put only stuff here that the assembler can digest */ +--- a/lib_generic/Makefile ++++ b/lib_generic/Makefile +@@ -24,6 +24,9 @@ + include $(TOPDIR)/config.mk + + LIB = $(obj)libgeneric.a ++BOOTSTRAP_LIB = $(obj)libgeneric_bootstrap.a ++ ++BOOTSTRAP_LIB-$(CONFIG_BOOTSTRAP) = $(BOOTSTRAP_LIB) + + COBJS-$(CONFIG_ADDR_MAP) += addr_map.o + COBJS-$(CONFIG_BZIP2) += bzlib.o +@@ -50,14 +53,37 @@ + COBJS-y += vsprintf.o + COBJS-$(CONFIG_ZLIB) += zlib.o + COBJS-$(CONFIG_RBTREE) += rbtree.o ++BOOTSTRAP_COBJS-$(CONFIG_BOOTSTRAP) += string.o ++BOOTSTRAP_COBJS-$(CONFIG_BOOTSTRAP) += vsprintf.o ++BOOTSTRAP_COBJS-$(CONFIG_BOOTSTRAP) += div64.o ++BOOTSTRAP_COBJS-$(CONFIG_BOOTSTRAP) += ctype.o ++BOOTSTRAP_COBJS-$(CONFIG_BOOTSTRAP) += time.o ++BOOTSTRAP_COBJS-$(CONFIG_BOOTSTRAP) += bootstrap.o ++BOOTSTRAP_COBJS-$(CONFIG_BOOTSTRAP_GZIP) += zlib.o ++BOOTSTRAP_COBJS-$(CONFIG_BOOTSTRAP_GZIP) += gunzip.o ++BOOTSTRAP_COBJS-$(CONFIG_BOOTSTRAP_GZIP) += crc32.o ++BOOTSTRAP_COBJS-$(CONFIG_BOOTSTRAP_BZIP2) += bzlib.o ++BOOTSTRAP_COBJS-$(CONFIG_BOOTSTRAP_BZIP2) += bzlib_crctable.o ++BOOTSTRAP_COBJS-$(CONFIG_BOOTSTRAP_BZIP2) += bzlib_decompress.o ++BOOTSTRAP_COBJS-$(CONFIG_BOOTSTRAP_BZIP2) += bzlib_randtable.o ++BOOTSTRAP_COBJS-$(CONFIG_BOOTSTRAP_BZIP2) += bzlib_huffman.o ++ ++BOOTSTRAP_COBJS := $(BOOTSTRAP_COBJS-y) ++BOOTSTRAP_OBJS := $(addprefix $(obj),$(BOOTSTRAP_COBJS)) + + COBJS := $(COBJS-y) +-SRCS := $(COBJS:.o=.c) ++SRCS := $(COBJS:.o=.c) $(BOOTSTRAP_COBJS:.o=.c) + OBJS := $(addprefix $(obj),$(COBJS)) + ++all: $(obj).depend $(LIB) $(BOOTSTRAP_LIB-y) ++ + $(LIB): $(obj).depend $(OBJS) + $(AR) $(ARFLAGS) $@ $(OBJS) + ++$(BOOTSTRAP_LIB): $(obj).depend $(BOOTSTRAP_OBJS) ++ $(AR) $(ARFLAGS) $@ $(BOOTSTRAP_OBJS) ++ ++ + ######################################################################### + + # defines $(obj).depend target +--- /dev/null ++++ b/lib_generic/bootstrap.c +@@ -0,0 +1,95 @@ ++/* ++ * (C) Copyright 2010 Industrie Dial Face S.p.A. ++ * Luigi 'Comio' Mantellini, luigi.mantellini@idf-hit.com ++ * ++ * (C) Copyright 2003 ++ * Wolfgang Denk, DENX Software Engineering, wd@denx.de. ++ * ++ * 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 <command.h> ++#include <stdio_dev.h> ++ ++#ifdef CONFIG_BOOTSTRAP_LZMA ++#include <lzma/LzmaTypes.h> ++#include <lzma/LzmaDec.h> ++#include <lzma/LzmaTools.h> ++#endif /* CONFIG_BOOTSTRAP_LZMA */ ++ ++#ifdef CONFIG_BOOTSTRAP_LZO ++#include <linux/lzo.h> ++#endif /* CONFIG_BOOTSTRAP_LZO */ ++ ++#ifdef CONFIG_BOOTSTRAP_BZIP2 ++#include <bzlib.h> ++#endif ++ ++DECLARE_GLOBAL_DATA_PTR; ++ ++#if defined(CONFIG_BOOTSTRAP_SERIAL) ++static const char *algo = ++#if defined(CONFIG_BOOTSTRAP_GZIP) ++ "gzip"; ++#elif defined(CONFIG_BOOTSTRAP_LZMA) ++ "lzma"; ++#elif defined(CONFIG_BOOTSTRAP_LZO) ++ "lzo"; ++#elif defined(CONFIG_BOOTSTRAP_BZIP2) ++ "bzip2"; ++#else ++ "flat"; ++#endif ++#endif ++ ++int copy_uboot(void *dst, size_t unc_size, void *src, size_t size) ++{ ++ int ret; ++ debug("copy from %p (%d) to %p (%d)\n", src, size, dst, unc_size); ++#if defined(CONFIG_BOOTSTRAP_SERIAL) ++ printf("Uncompressing payload (%s)...", algo); ++#endif ++#if defined(CONFIG_BOOTSTRAP_GZIP) ++ ret = gunzip(dst, unc_size, src, &size); ++#elif defined(CONFIG_BOOTSTRAP_LZMA) ++ SizeT outsize = unc_size; ++ ret = lzmaBuffToBuffDecompress(dst, &outsize, src, size); ++#elif defined(CONFIG_BOOTSTRAP_LZO) ++ uint unc_len = unc_size; ++ ret = lzop_decompress(src, size, dst, &unc_len); ++#elif defined(CONFIG_BOOTSTRAP_BZIP2) ++ uint unc_len = unc_size; ++ ret = BZ2_bzBuffToBuffDecompress ((char*)dst, &unc_len, (char *)src, size, CONFIG_SYS_MALLOC_LEN < (4096 * 1024), 0); ++#else ++ memcpy(dst, src, size); ++ ret = 0; ++#endif ++ if (ret) { ++#if defined(CONFIG_BOOTSTRAP_SERIAL) ++ printf("failed with error %d.\n", ret); ++#endif ++ bootstrap_hang(); ++ } else { ++#if defined(CONFIG_BOOTSTRAP_SERIAL) ++ puts("done.\n"); ++#endif ++ } ++ return ret; ++} +--- a/lib_generic/lzma/Makefile ++++ b/lib_generic/lzma/Makefile +@@ -32,7 +32,9 @@ + + CFLAGS += -D_LZMA_PROB32 + +-COBJS-$(CONFIG_LZMA) += LzmaDec.o LzmaTools.o ++COBJS-$(CONFIG_LZMA)$(CONFIG_BOOTSTRAP_LZMA) += LzmaDec.o LzmaTools.o ++ ++COBJS-y += $(COBJS-yy) + + COBJS = $(COBJS-y) + SRCS := $(SOBJS:.o=.S) $(COBJS:.o=.c) +--- a/lib_generic/lzo/Makefile ++++ b/lib_generic/lzo/Makefile +@@ -27,7 +27,9 @@ + + SOBJS = + +-COBJS-$(CONFIG_LZO) += lzo1x_decompress.o ++COBJS-$(CONFIG_LZO)$(CONFIG_BOOTSTRAP_LZO) += lzo1x_decompress.o ++ ++COBJS-y += $(OBJS-yy) + + COBJS = $(COBJS-y) + SRCS := $(SOBJS:.o=.S) $(COBJS:.o=.c) +--- a/cpu/mips/Makefile ++++ b/cpu/mips/Makefile +@@ -24,25 +24,46 @@ + include $(TOPDIR)/config.mk + + LIB = $(obj)lib$(CPU).a ++BOOTSTRAP_LIB = $(obj)lib$(CPU)_bootstrap.a ++ ++BOOTSTRAP_LIB-$(CONFIG_BOOTSTRAP) = $(BOOTSTRAP_LIB) + + START = start.o + SOBJS-y = cache.o +-COBJS-y = cpu.o interrupts.o ++COBJS-y = cpu.o reset.o interrupts.o + + SOBJS-$(CONFIG_INCA_IP) += incaip_wdt.o + COBJS-$(CONFIG_INCA_IP) += asc_serial.o incaip_clock.o ++#COBJS-$(CONFIG_IFX_ASC) += ifx_asc.o + COBJS-$(CONFIG_PURPLE) += asc_serial.o + COBJS-$(CONFIG_SOC_AU1X00) += au1x00_eth.o au1x00_serial.o au1x00_usb_ohci.o + +-SRCS := $(START:.o=.S) $(SOBJS-y:.o=.S) $(COBJS-y:.o=.c) ++#BOOTSTRAP_START = start_bootstrap.o ++BOOTSTRAP_START-$(CONFIG_BOOTSTRAP) += start_bootstrap.o #$(BOOTSTRAP_START) ++BOOTSTRAP_COBJS-$(CONFIG_BOOTSTRAP) += cpu.o interrupts.o reset_bootstrap.o ++BOOTSTRAP_SOBJS-$(CONFIG_BOOTSTRAP) += cache.o ++BOOTSTRAP_COBJS-$(CONFIG_DANUBE) += danube-clock.o ++BOOTSTRAP_COBJS-$(CONFIG_AR9) += ar9-clock.o ++BOOTSTRAP_COBJS-$(CONFIG_BOOTSTRAP_SERIAL) += ifx_asc.o ++ ++BOOTSTRAP_OBJS := $(addprefix $(obj),$(BOOTSTRAP_SOBJS-y) $(BOOTSTRAP_COBJS-y)) ++BOOTSTRAP_START := $(addprefix $(obj),$(BOOTSTRAP_START-y)) ++ ++SRCS := $(SOBJS-y:.o=.S) $(COBJS-y:.o=.c) $(BOOTSTRAP_START-y:.o=.S) $(BOOTSTRAP_SOBJS-y:.o=.S) $(BOOTSTRAP_COBJS-y:.o=.c) + OBJS := $(addprefix $(obj),$(SOBJS-y) $(COBJS-y)) + START := $(addprefix $(obj),$(START)) + +-all: $(obj).depend $(START) $(LIB) ++all: $(obj).depend $(START) $(LIB) $(BOOTSTRAP_START-y) $(BOOTSTRAP_LIB-y) + +-$(LIB): $(OBJS) ++$(LIB): $(OBJS) + $(AR) $(ARFLAGS) $@ $(OBJS) + ++#$(BOOTSTRAP_START): $(obj).depend ++ ++$(BOOTSTRAP_LIB): $(BOOTSTRAP_OBJS) ++ $(AR) $(ARFLAGS) $@ $(BOOTSTRAP_OBJS) ++ ++ + ######################################################################### + + # defines $(obj).depend target |