Merge branch 'u-boot-imx/master' into 'u-boot-arm/master'
authorAlbert ARIBAUD <albert.u.boot@aribaud.net>
Sat, 11 May 2013 07:25:36 +0000 (09:25 +0200)
committerAlbert ARIBAUD <albert.u.boot@aribaud.net>
Sat, 11 May 2013 07:25:36 +0000 (09:25 +0200)
Conflicts:
drivers/mtd/nand/mxc_nand_spl.c
include/configs/m28evk.h

189 files changed:
Makefile
README
arch/arm/cpu/arm926ejs/mxs/spl_boot.c
arch/arm/cpu/arm926ejs/spear/spl.c
arch/arm/cpu/armv7/zynq/slcr.c
arch/arm/cpu/armv7/zynq/timer.c
arch/arm/cpu/pxa/pxa2xx.c
arch/arm/include/asm/arch-pxa/hardware.h
arch/arm/include/asm/arch-zynq/hardware.h
arch/arm/include/asm/arch-zynq/sys_proto.h
arch/arm/lib/board.c
arch/avr32/lib/board.c
arch/blackfin/lib/board.c
arch/m68k/lib/board.c
arch/microblaze/include/asm/processor.h
arch/microblaze/lib/board.c
arch/mips/lib/board.c
arch/nds32/lib/board.c
arch/nios2/lib/board.c
arch/openrisc/lib/board.c
arch/powerpc/cpu/mpc512x/speed.c
arch/powerpc/cpu/mpc85xx/cmd_errata.c
arch/powerpc/cpu/mpc85xx/cpu.c
arch/powerpc/cpu/mpc85xx/cpu_init.c
arch/powerpc/cpu/mpc85xx/fdt.c
arch/powerpc/cpu/mpc85xx/fsl_corenet_serdes.c
arch/powerpc/cpu/mpc85xx/p2041_ids.c
arch/powerpc/cpu/mpc85xx/p3041_ids.c
arch/powerpc/cpu/mpc85xx/p5020_ids.c
arch/powerpc/cpu/mpc85xx/portals.c
arch/powerpc/cpu/ppc4xx/Makefile
arch/powerpc/cpu/ppc4xx/spl_boot.c [new file with mode: 0644]
arch/powerpc/cpu/ppc4xx/start.S
arch/powerpc/cpu/ppc4xx/u-boot-spl.lds [new file with mode: 0644]
arch/powerpc/cpu/ppc4xx/u-boot.lds
arch/powerpc/include/asm/config_mpc85xx.h
arch/powerpc/include/asm/fsl_memac.h
arch/powerpc/include/asm/immap_85xx.h
arch/powerpc/lib/board.c
arch/sandbox/config.mk
arch/sandbox/cpu/cpu.c
arch/sandbox/cpu/start.c
arch/sandbox/include/asm/io.h
arch/sandbox/include/asm/state.h
arch/sandbox/include/asm/u-boot.h
arch/sandbox/lib/Makefile
arch/sandbox/lib/board.c [deleted file]
arch/sh/lib/board.c
arch/sparc/lib/board.c
arch/x86/cpu/coreboot/sdram.c
arch/x86/lib/board.c
board/a3m071/a3m071.c
board/freescale/b4860qds/tlb.c
board/freescale/common/Makefile
board/freescale/common/cds_pci_ft.c
board/freescale/common/sdhc_boot.c
board/freescale/p1010rdb/p1010rdb.c
board/freescale/p1022ds/Makefile
board/freescale/p1022ds/law.c
board/freescale/p1022ds/spl_minimal.c [new file with mode: 0644]
board/freescale/p1022ds/tlb.c
board/freescale/p1_p2_rdb_pc/p1_p2_rdb_pc.c
board/freescale/p1_p2_rdb_pc/spl_minimal.c
board/h2200/h2200.c
board/lwmon5/lwmon5.c
board/lwmon5/sdram.c
board/sandbox/sandbox/sandbox.c
board/xilinx/microblaze-generic/microblaze-generic.c
board/xilinx/microblaze-generic/xparameters.h
board/xilinx/zynq/board.c
boards.cfg
common/board_f.c
common/board_r.c
common/cmd_fdt.c
common/cmd_fpga.c
common/cmd_ide.c
common/cmd_mmc.c
common/cmd_nvedit.c
common/cmd_sandbox.c
common/cmd_sata.c
common/cmd_scsi.c
common/cmd_setexpr.c
common/cmd_source.c
common/cmd_tpm.c
common/env_mmc.c
common/flash.c
common/main.c
common/spl/spl.c
common/usb_storage.c
config.mk
disk/part_dos.c
disk/part_efi.c
disk/part_iso.c
doc/README.fdt-control
doc/README.p1010rdb [new file with mode: 0644]
doc/README.ramboot-ppc85xx [new file with mode: 0644]
doc/README.watchdog
doc/feature-removal-schedule.txt
doc/git-mailrc
drivers/block/ata_piix.c
drivers/block/pata_bfin.c
drivers/block/systemace.c
drivers/fpga/Makefile
drivers/fpga/fpga.c
drivers/fpga/xilinx.c
drivers/fpga/zynqpl.c [new file with mode: 0644]
drivers/i2c/Makefile
drivers/i2c/zynq_i2c.c [new file with mode: 0644]
drivers/mmc/Makefile
drivers/mmc/mmc.c
drivers/mmc/spl_mmc.c
drivers/mmc/zynq_sdhci.c [new file with mode: 0644]
drivers/mtd/cfi_flash.c
drivers/mtd/nand/Makefile
drivers/mtd/nand/docg4.c [new file with mode: 0644]
drivers/mtd/nand/docg4_spl.c [new file with mode: 0644]
drivers/mtd/nand/mxc_nand_spl.c
drivers/net/fm/memac.c
drivers/net/phy/marvell.c
drivers/net/zynq_gem.c
drivers/tpm/Makefile
drivers/tpm/generic_lpc_tpm.c
drivers/tpm/slb9635_i2c/compatibility.h [new file with mode: 0644]
drivers/tpm/slb9635_i2c/tpm.c [new file with mode: 0644]
drivers/tpm/slb9635_i2c/tpm.h [new file with mode: 0644]
drivers/tpm/slb9635_i2c/tpm_tis_i2c.c [new file with mode: 0644]
drivers/tpm/tis_i2c.c [new file with mode: 0644]
drivers/usb/gadget/pxa27x_udc.c
drivers/video/pxa_lcd.c
drivers/watchdog/Makefile
drivers/watchdog/xilinx_tb_wdt.c [new file with mode: 0644]
fs/fat/fat_write.c
fs/fs.c
fs/sandbox/sandboxfs.c
include/altera.h
include/asm-generic/sections.h
include/common.h
include/config_cmd_default.h
include/configs/M54455EVB.h
include/configs/MERGERBOX.h
include/configs/MVBC_P.h
include/configs/MVBLM7.h
include/configs/MVSMR.h
include/configs/P1022DS.h
include/configs/a3m071.h
include/configs/amcc-common.h
include/configs/coreboot.h
include/configs/corenet_ds.h
include/configs/exynos5250-dt.h
include/configs/lwmon5.h
include/configs/m28evk.h
include/configs/microblaze-generic.h
include/configs/mx28evk.h
include/configs/mx31pdk.h
include/configs/omap3_mvblx.h
include/configs/omap5_uevm.h
include/configs/sandbox.h
include/configs/tx25.h
include/configs/zynq.h
include/fdtdec.h
include/fpga.h
include/fs.h
include/lattice.h
include/linux/bitrev.h [new file with mode: 0644]
include/linux/mtd/docg4.h [new file with mode: 0644]
include/mmc.h
include/mtd/cfi_flash.h
include/netdev.h
include/part.h
include/part_efi.h
include/sandboxfs.h
include/search.h
include/slre.h [new file with mode: 0644]
include/tis.h [new file with mode: 0644]
include/tpm.h
include/xilinx.h
include/zynqpl.h [new file with mode: 0644]
lib/Makefile
lib/bitrev.c [new file with mode: 0644]
lib/crc32.c
lib/fdtdec.c
lib/hang.c [new file with mode: 0644]
lib/hashtable.c
lib/slre.c [new file with mode: 0644]
lib/tpm.c [new file with mode: 0644]
post/drivers/i2c.c
tools/Makefile
tools/patman/gitutil.py
tools/patman/patchstream.py

index dd7e02a..c52f0f1 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -24,7 +24,7 @@
 VERSION = 2013
 PATCHLEVEL = 04
 SUBLEVEL =
-EXTRAVERSION = -rc2
+EXTRAVERSION =
 ifneq "$(SUBLEVEL)" ""
 U_BOOT_VERSION = $(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)
 else
@@ -183,6 +183,16 @@ endif
 # load other configuration
 include $(TOPDIR)/config.mk
 
+# Targets which don't build the source code
+NON_BUILD_TARGETS = backup clean clobber distclean mkproper tidy unconfig
+
+# Only do the generic board check when actually building, not configuring
+ifeq ($(filter $(NON_BUILD_TARGETS),$(MAKECMDGOALS)),)
+ifeq ($(findstring _config,$(MAKECMDGOALS)),)
+$(CHECK_GENERIC_BOARD)
+endif
+endif
+
 # If board code explicitly specified LDSCRIPT or CONFIG_SYS_LDSCRIPT, use
 # that (or fail if absent).  Otherwise, search for a linker script in a
 # standard location.
@@ -310,7 +320,7 @@ endif
 LIBS-y += drivers/rtc/librtc.o
 LIBS-y += drivers/serial/libserial.o
 LIBS-y += drivers/sound/libsound.o
-LIBS-$(CONFIG_GENERIC_LPC_TPM) += drivers/tpm/libtpm.o
+LIBS-y += drivers/tpm/libtpm.o
 LIBS-y += drivers/twserial/libtws.o
 LIBS-y += drivers/usb/eth/libusb_eth.o
 LIBS-y += drivers/usb/gadget/libusb_gadget.o
@@ -550,6 +560,18 @@ endif
 $(obj)u-boot-img.bin: $(obj)spl/u-boot-spl.bin $(obj)u-boot.img
                cat $(obj)spl/u-boot-spl.bin $(obj)u-boot.img > $@
 
+# PPC4xx needs the SPL at the end of the image, since the reset vector
+# is located at 0xfffffffc. So we can't use the "u-boot-img.bin" target
+# and need to introduce a new build target with the full blown U-Boot
+# at the start padded up to the start of the SPL image. And then concat
+# the SPL image to the end.
+$(obj)u-boot-img-spl-at-end.bin: $(obj)spl/u-boot-spl.bin $(obj)u-boot.img
+               tr "\000" "\377" < /dev/zero | dd ibs=1 count=$(CONFIG_UBOOT_PAD_TO) \
+                       of=$(obj)u-boot-pad.img 2>/dev/null
+               dd if=$(obj)u-boot.img of=$(obj)u-boot-pad.img \
+                       conv=notrunc 2>/dev/null
+               cat $(obj)u-boot-pad.img $(obj)spl/u-boot-spl.bin > $@
+
 ifeq ($(CONFIG_SANDBOX),y)
 GEN_UBOOT = \
                cd $(LNDIR) && $(CC) $(SYMS) -T $(obj)u-boot.lds \
diff --git a/README b/README
index 7f9f547..bab1a95 100644 (file)
--- a/README
+++ b/README
@@ -931,6 +931,13 @@ The following options need to be configured:
 
                XXX - this list needs to get updated!
 
+- Regular expression support:
+               CONFIG_REGEX
+                If this variable is defined, U-Boot is linked against
+                the SLRE (Super Light Regular Expression) library,
+                which adds regex support to some commands, as for
+                example "env grep" and "setexpr".
+
 - Device tree:
                CONFIG_OF_CONTROL
                If this variable is defined, U-Boot will use a device tree
@@ -3249,6 +3256,15 @@ Configuration Settings:
                digits and dots.  Recommended value: 45 (9..1) for 80
                column displays, 15 (3..1) for 40 column displays.
 
+- CONFIG_FLASH_VERIFY
+               If defined, the content of the flash (destination) is compared
+               against the source after the write operation. An error message
+               will be printed when the contents are not identical.
+               Please note that this option is useless in nearly all cases,
+               since such flash programming errors usually are detected earlier
+               while unprotecting/erasing/programming. Please only enable
+               this option if you really know what you are doing.
+
 - CONFIG_SYS_RX_ETH_BUFFER:
                Defines the number of Ethernet receive buffers. On some
                Ethernet controllers it is recommended to set this value
index 7e70440..ed525e5 100644 (file)
@@ -148,10 +148,3 @@ inline void board_init_r(gd_t *id, ulong dest_addr)
        for (;;)
                ;
 }
-
-void hang(void) __attribute__ ((noreturn));
-void hang(void)
-{
-       for (;;)
-               ;
-}
index 48e6efb..0101c5d 100644 (file)
 #include <asm/arch/spr_misc.h>
 #include <asm/arch/spr_syscntl.h>
 
-inline void hang(void)
-{
-       serial_puts("### ERROR ### Please RESET the board ###\n");
-       for (;;)
-               ;
-}
-
 static void ddr_clock_init(void)
 {
        struct misc_regs *misc_p = (struct misc_regs *)CONFIG_SPEAR_MISCBASE;
index 788a8fd..52048c6 100644 (file)
@@ -28,6 +28,9 @@
 #define SLCR_LOCK_MAGIC                0x767B
 #define SLCR_UNLOCK_MAGIC      0xDF0D
 
+#define SLCR_IDCODE_MASK       0x1F000
+#define SLCR_IDCODE_SHIFT      12
+
 static int slcr_lock = 1; /* 1 means locked, 0 means unlocked */
 
 void zynq_slcr_lock(void)
@@ -61,3 +64,61 @@ void zynq_slcr_cpu_reset(void)
 
        writel(1, &slcr_base->pss_rst_ctrl);
 }
+
+/* Setup clk for network */
+void zynq_slcr_gem_clk_setup(u32 gem_id, u32 rclk, u32 clk)
+{
+       zynq_slcr_unlock();
+
+       if (gem_id > 1) {
+               printf("Non existing GEM id %d\n", gem_id);
+               goto out;
+       }
+
+       if (gem_id) {
+               /* Set divisors for appropriate frequency in GEM_CLK_CTRL */
+               writel(clk, &slcr_base->gem1_clk_ctrl);
+               /* Configure GEM_RCLK_CTRL */
+               writel(rclk, &slcr_base->gem1_rclk_ctrl);
+       } else {
+               /* Set divisors for appropriate frequency in GEM_CLK_CTRL */
+               writel(clk, &slcr_base->gem0_clk_ctrl);
+               /* Configure GEM_RCLK_CTRL */
+               writel(rclk, &slcr_base->gem0_rclk_ctrl);
+       }
+
+out:
+       zynq_slcr_lock();
+}
+
+void zynq_slcr_devcfg_disable(void)
+{
+       zynq_slcr_unlock();
+
+       /* Disable AXI interface */
+       writel(0xFFFFFFFF, &slcr_base->fpga_rst_ctrl);
+
+       /* Set Level Shifters DT618760 */
+       writel(0xA, &slcr_base->lvl_shftr_en);
+
+       zynq_slcr_lock();
+}
+
+void zynq_slcr_devcfg_enable(void)
+{
+       zynq_slcr_unlock();
+
+       /* Set Level Shifters DT618760 */
+       writel(0xF, &slcr_base->lvl_shftr_en);
+
+       /* Disable AXI interface */
+       writel(0x0, &slcr_base->fpga_rst_ctrl);
+
+       zynq_slcr_lock();
+}
+
+u32 zynq_slcr_get_idcode(void)
+{
+       return (readl(&slcr_base->pss_idcode) & SLCR_IDCODE_MASK) >>
+                                                       SLCR_IDCODE_SHIFT;
+}
index 45b405a..8c4357d 100644 (file)
@@ -44,6 +44,7 @@
 #include <common.h>
 #include <div64.h>
 #include <asm/io.h>
+#include <asm/arch/hardware.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
@@ -54,7 +55,7 @@ struct scu_timer {
 };
 
 static struct scu_timer *timer_base =
-                             (struct scu_timer *) CONFIG_SCUTIMER_BASEADDR;
+                             (struct scu_timer *)ZYNQ_SCUTIMER_BASEADDR;
 
 #define SCUTIMER_CONTROL_PRESCALER_MASK        0x0000FF00 /* Prescaler */
 #define SCUTIMER_CONTROL_PRESCALER_SHIFT       8
@@ -114,15 +115,43 @@ ulong get_timer_masked(void)
 
 void __udelay(unsigned long usec)
 {
-       unsigned long long tmp;
-       ulong tmo;
-
-       tmo = usec / (1000000 / CONFIG_SYS_HZ);
-       tmp = get_ticks() + tmo; /* Get current timestamp */
-
-       while (get_ticks() < tmp) { /* Loop till event */
-                /* NOP */;
-       }
+       u32 countticks;
+       u32 timeend;
+       u32 timediff;
+       u32 timenow;
+
+       if (usec == 0)
+               return;
+
+       countticks = (u32) (((unsigned long long) TIMER_TICK_HZ * usec) /
+                                                               1000000);
+
+       /* decrementing timer */
+       timeend = readl(&timer_base->counter) - countticks;
+
+#if TIMER_LOAD_VAL != 0xFFFFFFFF
+       /* do not manage multiple overflow */
+       if (countticks >= TIMER_LOAD_VAL)
+               countticks = TIMER_LOAD_VAL - 1;
+#endif
+
+       do {
+               timenow = readl(&timer_base->counter);
+
+               if (timenow >= timeend) {
+                       /* normal case */
+                       timediff = timenow - timeend;
+               } else {
+                       if ((TIMER_LOAD_VAL - timeend + timenow) <=
+                                                               countticks) {
+                               /* overflow */
+                               timediff = TIMER_LOAD_VAL - timeend + timenow;
+                       } else {
+                               /* missed the exact match */
+                               break;
+                       }
+               }
+       } while (timediff > 0);
 }
 
 /* Timer without interrupts */
index 09e8177..0c18610 100644 (file)
@@ -284,7 +284,7 @@ void i2c_clk_enable(void)
        writel(readl(CKEN) | CKEN14_I2C, CKEN);
 }
 
-void reset_cpu(ulong ignored) __attribute__((noreturn));
+void __attribute__((weak)) reset_cpu(ulong ignored) __attribute__((noreturn));
 
 void reset_cpu(ulong ignored)
 {
index 44b800f..2397bce 100644 (file)
 #define GPIO_FALLING_EDGE      1
 #define GPIO_RISING_EDGE       2
 #define GPIO_BOTH_EDGES                3
-extern void set_GPIO_IRQ_edge( int gpio_nr, int edge_mask );
-
-/*
- * Handy routine to set GPIO alternate functions
- */
-extern void set_GPIO_mode( int gpio_mode );
-
-/*
- * return current lclk frequency in units of 10kHz
- */
-extern unsigned int get_lclk_frequency_10khz(void);
 
 #endif
 
index d0c69da..8b8a91a 100644 (file)
 #ifndef _ASM_ARCH_HARDWARE_H
 #define _ASM_ARCH_HARDWARE_H
 
-#define XPSS_SYS_CTRL_BASEADDR         0xF8000000
-#define XPSS_DEV_CFG_APB_BASEADDR      0xF8007000
-#define XPSS_SCU_BASEADDR              0xF8F00000
+#define ZYNQ_SYS_CTRL_BASEADDR         0xF8000000
+#define ZYNQ_DEV_CFG_APB_BASEADDR      0xF8007000
+#define ZYNQ_SCU_BASEADDR              0xF8F00000
+#define ZYNQ_SCUTIMER_BASEADDR         0xF8F00600
+#define ZYNQ_GEM_BASEADDR0             0xE000B000
+#define ZYNQ_GEM_BASEADDR1             0xE000C000
+#define ZYNQ_SDHCI_BASEADDR0           0xE0100000
+#define ZYNQ_SDHCI_BASEADDR1           0xE0101000
+#define ZYNQ_I2C_BASEADDR0             0xE0004000
+#define ZYNQ_I2C_BASEADDR1             0xE0005000
 
 /* Reflect slcr offsets */
 struct slcr_regs {
        u32 scl; /* 0x0 */
        u32 slcr_lock; /* 0x4 */
        u32 slcr_unlock; /* 0x8 */
-       u32 reserved1[125];
+       u32 reserved0[75];
+       u32 gem0_rclk_ctrl; /* 0x138 */
+       u32 gem1_rclk_ctrl; /* 0x13c */
+       u32 gem0_clk_ctrl; /* 0x140 */
+       u32 gem1_clk_ctrl; /* 0x144 */
+       u32 reserved1[46];
        u32 pss_rst_ctrl; /* 0x200 */
        u32 reserved2[15];
        u32 fpga_rst_ctrl; /* 0x240 */
@@ -41,15 +53,21 @@ struct slcr_regs {
        u32 boot_mode; /* 0x25c */
        u32 reserved4[116];
        u32 trust_zone; /* 0x430 */ /* FIXME */
-       u32 reserved5[115];
+       u32 reserved5_1[63];
+       u32 pss_idcode; /* 0x530 */
+       u32 reserved5_2[51];
        u32 ddr_urgent; /* 0x600 */
        u32 reserved6[6];
        u32 ddr_urgent_sel; /* 0x61c */
-       u32 reserved7[188];
+       u32 reserved7[56];
+       u32 mio_pin[54]; /* 0x700 - 0x7D4 */
+       u32 reserved8[74];
+       u32 lvl_shftr_en; /* 0x900 */
+       u32 reserved9[3];
        u32 ocm_cfg; /* 0x910 */
 };
 
-#define slcr_base ((struct slcr_regs *) XPSS_SYS_CTRL_BASEADDR)
+#define slcr_base ((struct slcr_regs *)ZYNQ_SYS_CTRL_BASEADDR)
 
 struct devcfg_regs {
        u32 ctrl; /* 0x0 */
@@ -72,7 +90,7 @@ struct devcfg_regs {
        u32 read_count; /* 0x8c */
 };
 
-#define devcfg_base ((struct devcfg_regs *) XPSS_DEV_CFG_APB_BASEADDR)
+#define devcfg_base ((struct devcfg_regs *)ZYNQ_DEV_CFG_APB_BASEADDR)
 
 struct scu_regs {
        u32 reserved1[16];
@@ -80,6 +98,6 @@ struct scu_regs {
        u32 filter_end; /* 0x44 */
 };
 
-#define scu_base ((struct scu_regs *) XPSS_SCU_BASEADDR)
+#define scu_base ((struct scu_regs *)ZYNQ_SCU_BASEADDR)
 
 #endif /* _ASM_ARCH_HARDWARE_H */
index e788900..2317121 100644 (file)
 extern void zynq_slcr_lock(void);
 extern void zynq_slcr_unlock(void);
 extern void zynq_slcr_cpu_reset(void);
+extern void zynq_slcr_gem_clk_setup(u32 gem_id, u32 rclk, u32 clk);
+extern void zynq_slcr_devcfg_disable(void);
+extern void zynq_slcr_devcfg_enable(void);
+extern u32 zynq_slcr_get_idcode(void);
+
+/* Driver extern functions */
+extern int zynq_sdhci_init(u32 regbase);
 
 #endif /* _SYS_PROTO_H_ */
index 0521178..09ab4ad 100644 (file)
@@ -706,9 +706,3 @@ void board_init_r(gd_t *id, ulong dest_addr)
 
        /* NOTREACHED - no way out of command loop except booting */
 }
-
-void hang(void)
-{
-       puts("### ERROR ### Please RESET the board ###\n");
-       for (;;);
-}
index 57e07df..ccf862a 100644 (file)
@@ -120,11 +120,6 @@ static int display_banner (void)
        return 0;
 }
 
-void hang(void)
-{
-       for (;;) ;
-}
-
 static int display_dram_config (void)
 {
        int i;
index 75b6c46..ccea3b9 100644 (file)
@@ -432,17 +432,3 @@ void board_init_r(gd_t * id, ulong dest_addr)
        for (;;)
                main_loop();
 }
-
-void hang(void)
-{
-#ifdef CONFIG_STATUS_LED
-       status_led_set(STATUS_LED_BOOT, STATUS_LED_OFF);
-       status_led_set(STATUS_LED_CRASH, STATUS_LED_BLINKING);
-#endif
-       puts("### ERROR ### Please RESET the board ###\n");
-       while (1)
-               /* If a JTAG emulator is hooked up, we'll automatically trigger
-                * a breakpoint in it.  If one isn't, this is just a NOP.
-                */
-               asm("emuexcpt;");
-}
index adaccfe..b2e3068 100644 (file)
@@ -663,10 +663,3 @@ void board_init_r (gd_t *id, ulong dest_addr)
 
        /* NOTREACHED - no way out of command loop except booting */
 }
-
-
-void hang(void)
-{
-       puts ("### ERROR ### Please RESET the board ###\n");
-       for (;;);
-}
index 2c4d5ff..d33faeb 100644 (file)
@@ -31,4 +31,8 @@ extern char __text_start[];
 /* Microblaze board initialization function */
 void board_init(void);
 
+/* Watchdog functions */
+extern int hw_watchdog_init(void);
+extern void hw_watchdog_disable(void);
+
 #endif /* __ASM_MICROBLAZE_PROCESSOR_H */
index a7c2f76..bb40243 100644 (file)
@@ -61,6 +61,9 @@ init_fnc_t *init_sequence[] = {
        serial_init,
        console_init_f,
        interrupts_init,
+#ifdef CONFIG_XILINX_TB_WATCHDOG
+       hw_watchdog_init,
+#endif
        timer_init,
        NULL,
 };
@@ -71,15 +74,15 @@ void board_init_f(ulong not_used)
 {
        bd_t *bd;
        init_fnc_t **init_fnc_ptr;
-       gd = (gd_t *) (CONFIG_SYS_SDRAM_BASE + CONFIG_SYS_GBL_DATA_OFFSET);
-       bd = (bd_t *) (CONFIG_SYS_SDRAM_BASE + CONFIG_SYS_GBL_DATA_OFFSET \
+       gd = (gd_t *)(CONFIG_SYS_SDRAM_BASE + CONFIG_SYS_GBL_DATA_OFFSET);
+       bd = (bd_t *)(CONFIG_SYS_SDRAM_BASE + CONFIG_SYS_GBL_DATA_OFFSET
                                                - GENERATED_BD_INFO_SIZE);
 #if defined(CONFIG_CMD_FLASH)
        ulong flash_size = 0;
 #endif
        asm ("nop");    /* FIXME gd is not initialize - wait */
-       memset ((void *)gd, 0, GENERATED_GBL_DATA_SIZE);
-       memset ((void *)bd, 0, GENERATED_BD_INFO_SIZE);
+       memset((void *)gd, 0, GENERATED_GBL_DATA_SIZE);
+       memset((void *)bd, 0, GENERATED_BD_INFO_SIZE);
        gd->bd = bd;
        gd->baudrate = CONFIG_BAUDRATE;
        bd->bi_baudrate = CONFIG_BAUDRATE;
@@ -105,57 +108,55 @@ void board_init_f(ulong not_used)
         * aka CONFIG_SYS_MONITOR_BASE - Note there is no need for reloc_off
         * as our monitory code is run from SDRAM
         */
-       mem_malloc_init (CONFIG_SYS_MALLOC_BASE, CONFIG_SYS_MALLOC_LEN);
+       mem_malloc_init(CONFIG_SYS_MALLOC_BASE, CONFIG_SYS_MALLOC_LEN);
 
        serial_initialize();
 
        for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) {
-               WATCHDOG_RESET ();
-               if ((*init_fnc_ptr) () != 0) {
-                       hang ();
-               }
+               WATCHDOG_RESET();
+               if ((*init_fnc_ptr) () != 0)
+                       hang();
        }
 
 #ifdef CONFIG_OF_CONTROL
        /* For now, put this check after the console is ready */
-       if (fdtdec_prepare_fdt()) {
-               panic("** CONFIG_OF_CONTROL defined but no FDT - please see "
-                       "doc/README.fdt-control");
-       } else
+       if (fdtdec_prepare_fdt())
+               panic("** No FDT - please see doc/README.fdt-control");
+       else
                printf("DTB: 0x%x\n", (u32)gd->fdt_blob);
 #endif
 
-       puts ("SDRAM :\n");
-       printf ("\t\tIcache:%s\n", icache_status() ? "ON" : "OFF");
-       printf ("\t\tDcache:%s\n", dcache_status() ? "ON" : "OFF");
-       printf ("\tU-Boot Start:0x%08x\n", CONFIG_SYS_TEXT_BASE);
+       puts("SDRAM :\n");
+       printf("\t\tIcache:%s\n", icache_status() ? "ON" : "OFF");
+       printf("\t\tDcache:%s\n", dcache_status() ? "ON" : "OFF");
+       printf("\tU-Boot Start:0x%08x\n", CONFIG_SYS_TEXT_BASE);
 
 #if defined(CONFIG_CMD_FLASH)
-       puts ("Flash: ");
+       puts("Flash: ");
        bd->bi_flashstart = CONFIG_SYS_FLASH_BASE;
        flash_size = flash_init();
        if (bd->bi_flashstart && flash_size > 0) {
 # ifdef CONFIG_SYS_FLASH_CHECKSUM
-               print_size (flash_size, "");
+               print_size(flash_size, "");
                /*
                 * Compute and print flash CRC if flashchecksum is set to 'y'
                 *
                 * NOTE: Maybe we should add some WATCHDOG_RESET()? XXX
                 */
                if (getenv_yesno("flashchecksum") == 1) {
-                       printf ("  CRC: %08X",
-                               crc32(0, (const u8 *)bd->bi_flashstart,
-                                                       flash_size)
+                       printf("  CRC: %08X",
+                              crc32(0, (const u8 *)bd->bi_flashstart,
+                                    flash_size)
                        );
                }
-               putc ('\n');
+               putc('\n');
 # else /* !CONFIG_SYS_FLASH_CHECKSUM */
-               print_size (flash_size, "\n");
+               print_size(flash_size, "\n");
 # endif /* CONFIG_SYS_FLASH_CHECKSUM */
                bd->bi_flashsize = flash_size;
                bd->bi_flashoffset = bd->bi_flashstart + flash_size;
        } else {
-               puts ("Flash init FAILED");
+               puts("Flash init FAILED");
                bd->bi_flashstart = 0;
                bd->bi_flashsize = 0;
                bd->bi_flashoffset = 0;
@@ -163,10 +164,10 @@ void board_init_f(ulong not_used)
 #endif
 
        /* relocate environment function pointers etc. */
-       env_relocate ();
+       env_relocate();
 
        /* Initialize stdio devices */
-       stdio_init ();
+       stdio_init();
 
        /* Initialize the jump table for applications */
        jumptable_init();
@@ -190,13 +191,7 @@ void board_init_f(ulong not_used)
 
        /* main_loop */
        for (;;) {
-               WATCHDOG_RESET ();
-               main_loop ();
+               WATCHDOG_RESET();
+               main_loop();
        }
 }
-
-void hang (void)
-{
-       puts ("### ERROR ### Please RESET the board ###\n");
-       for (;;) ;
-}
index f19f198..fac7915 100644 (file)
@@ -344,10 +344,3 @@ void board_init_r(gd_t *id, ulong dest_addr)
 
        /* NOTREACHED - no way out of command loop except booting */
 }
-
-void hang(void)
-{
-       puts("### ERROR ### Please RESET the board ###\n");
-       for (;;)
-               ;
-}
index a7d27fc..57af1be 100644 (file)
@@ -404,10 +404,3 @@ void board_init_r(gd_t *id, ulong dest_addr)
 
        /* NOTREACHED - no way out of command loop except booting */
 }
-
-void hang(void)
-{
-       puts("### ERROR ### Please RESET the board ###\n");
-       for (;;)
-               ;
-}
index 1e495d4..f430ef0 100644 (file)
@@ -64,7 +64,6 @@ typedef int (init_fnc_t) (void);
  ***********************************************************************/
 
 init_fnc_t *init_sequence[] = {
-
 #if defined(CONFIG_BOARD_EARLY_INIT_F)
        board_early_init_f,     /* Call board-specific init code early.*/
 #endif
@@ -83,7 +82,7 @@ init_fnc_t *init_sequence[] = {
 
 
 /***********************************************************************/
-void board_init (void)
+void board_init(void)
 {
        bd_t *bd;
        init_fnc_t **init_fnc_ptr;
@@ -93,7 +92,7 @@ void board_init (void)
        /* Pointer is writable since we allocated a register for it. */
        gd = &gd_data;
        /* compiler optimization barrier needed for GCC >= 3.4 */
-       __asm__ __volatile__("": : :"memory");
+       __asm__ __volatile__("" : : : "memory");
 
        gd->bd = &bd_data;
        gd->baudrate = CONFIG_BAUDRATE;
@@ -106,25 +105,24 @@ void board_init (void)
        bd->bi_flashstart = CONFIG_SYS_FLASH_BASE;
 #endif
 #if    defined(CONFIG_SYS_SRAM_BASE) && defined(CONFIG_SYS_SRAM_SIZE)
-       bd->bi_sramstart= CONFIG_SYS_SRAM_BASE;
+       bd->bi_sramstart = CONFIG_SYS_SRAM_BASE;
        bd->bi_sramsize = CONFIG_SYS_SRAM_SIZE;
 #endif
        bd->bi_baudrate = CONFIG_BAUDRATE;
 
        for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) {
-               WATCHDOG_RESET ();
-               if ((*init_fnc_ptr) () != 0) {
-                       hang ();
-               }
+               WATCHDOG_RESET();
+               if ((*init_fnc_ptr) () != 0)
+                       hang();
        }
 
-       WATCHDOG_RESET ();
+       WATCHDOG_RESET();
 
        /* The Malloc area is immediately below the monitor copy in RAM */
        mem_malloc_init(CONFIG_SYS_MALLOC_BASE, CONFIG_SYS_MALLOC_LEN);
 
 #ifndef CONFIG_SYS_NO_FLASH
-       WATCHDOG_RESET ();
+       WATCHDOG_RESET();
        bd->bi_flashsize = flash_init();
 #endif
 
@@ -138,39 +136,29 @@ void board_init (void)
        mmc_initialize(bd);
 #endif
 
-       WATCHDOG_RESET ();
+       WATCHDOG_RESET();
        env_relocate();
 
-       WATCHDOG_RESET ();
+       WATCHDOG_RESET();
        stdio_init();
        jumptable_init();
        console_init_r();
 
-       WATCHDOG_RESET ();
-       interrupt_init ();
+       WATCHDOG_RESET();
+       interrupt_init();
 
 #if defined(CONFIG_BOARD_LATE_INIT)
-       board_late_init ();
+       board_late_init();
 #endif
 
 #if defined(CONFIG_CMD_NET)
-       puts ("Net:   ");
-       eth_initialize (bd);
+       puts("Net:   ");
+       eth_initialize(bd);
 #endif
 
        /* main_loop */
        for (;;) {
-               WATCHDOG_RESET ();
-               main_loop ();
+               WATCHDOG_RESET();
+               main_loop();
        }
 }
-
-
-/***********************************************************************/
-
-void hang (void)
-{
-       disable_interrupts ();
-       puts("### ERROR ### Please reset board ###\n");
-       for (;;);
-}
index 85aa189..630e45f 100644 (file)
@@ -154,15 +154,3 @@ void board_init(void)
                main_loop();
        }
 }
-
-
-/***********************************************************************/
-
-void hang(void)
-{
-       disable_interrupts();
-       puts("### ERROR ### Please reset board ###\n");
-
-       for (;;)
-               ;
-}
index 9a8f315..6761877 100644 (file)
@@ -151,9 +151,3 @@ U_BOOT_CMD(clocks, 1, 0, do_clocks,
        "print clock configuration",
        "    clocks"
 );
-
-int prt_mpc512x_clks (void)
-{
-       do_clocks (NULL, 0, 0, NULL);
-       return (0);
-}
index 5d72f4c..422782c 100644 (file)
@@ -254,6 +254,9 @@ static int do_errata(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
 #endif
 #ifdef CONFIG_SYS_P4080_ERRATUM_PCIE_A003
        puts("Work-around for Erratum PCIe-A003 enabled\n");
+#endif
+#ifdef CONFIG_SYS_FSL_ERRATUM_USB14
+       puts("Work-around for Erratum USB14 enabled\n");
 #endif
        return 0;
 }
index df2ab6d..6ce483e 100644 (file)
@@ -281,14 +281,6 @@ unsigned long get_tbclk (void)
 
 
 #if defined(CONFIG_WATCHDOG)
-void
-watchdog_reset(void)
-{
-       int re_enable = disable_interrupts();
-       reset_85xx_watchdog();
-       if (re_enable) enable_interrupts();
-}
-
 void
 reset_85xx_watchdog(void)
 {
@@ -297,6 +289,16 @@ reset_85xx_watchdog(void)
         */
        mtspr(SPRN_TSR, TSR_WIS);
 }
+
+void
+watchdog_reset(void)
+{
+       int re_enable = disable_interrupts();
+
+       reset_85xx_watchdog();
+       if (re_enable)
+               enable_interrupts();
+}
 #endif /* CONFIG_WATCHDOG */
 
 /*
index de9d916..53713e3 100644 (file)
@@ -623,6 +623,20 @@ skip_l2:
        }
 #endif
 
+#ifdef CONFIG_SYS_FSL_ERRATUM_USB14
+       /* On P204x/P304x/P50x0 Rev1.0, USB transmit will result internal
+        * multi-bit ECC errors which has impact on performance, so software
+        * should disable all ECC reporting from USB1 and USB2.
+        */
+       if (IS_SVR_REV(get_svr(), 1, 0)) {
+               struct dcsr_dcfg_regs *dcfg = (struct dcsr_dcfg_regs *)
+                       (CONFIG_SYS_DCSRBAR + CONFIG_SYS_DCSR_DCFG_OFFSET);
+               setbits_be32(&dcfg->ecccr1,
+                               (DCSR_DCFG_ECC_DISABLE_USB1 |
+                                DCSR_DCFG_ECC_DISABLE_USB2));
+       }
+#endif
+
 #ifdef CONFIG_FMAN_ENET
        fman_enet_init();
 #endif
index 24eb978..288f7b2 100644 (file)
@@ -663,6 +663,13 @@ void ft_cpu_setup(void *blob, bd_t *bd)
 #ifdef CONFIG_FSL_CORENET
        do_fixup_by_compat_u32(blob, "fsl,qoriq-clockgen-1.0",
                "clock-frequency", CONFIG_SYS_CLK_FREQ, 1);
+       do_fixup_by_compat_u32(blob, "fsl,qoriq-clockgen-2",
+               "clock-frequency", CONFIG_SYS_CLK_FREQ, 1);
+       do_fixup_by_compat_u32(blob, "fsl,mpic",
+               "clock-frequency", get_bus_freq(0)/2, 1);
+#else
+       do_fixup_by_compat_u32(blob, "fsl,mpic",
+               "clock-frequency", get_bus_freq(0), 1);
 #endif
 
        fdt_fixup_memory(blob, (u64)bd->bi_memstart, (u64)bd->bi_memsize);
index 825a292..b621adf 100644 (file)
@@ -103,6 +103,10 @@ static const struct {
        { 22, 168, FSL_SRDS_BANK_3 },
        { 23, 169, FSL_SRDS_BANK_3 },
 #endif
+#if SRDS_MAX_BANK > 3
+       { 24, 175, FSL_SRDS_BANK_4 },
+       { 25, 176, FSL_SRDS_BANK_4 },
+#endif
 };
 
 int serdes_get_lane_idx(int lane)
index 91d9cac..ef685fe 100644 (file)
 #ifdef CONFIG_SYS_DPAA_QBMAN
 struct qportal_info qp_info[CONFIG_SYS_QMAN_NUM_PORTALS] = {
        /* dqrr liodn, frame data liodn, liodn off, sdest */
-       SET_QP_INFO(1, 2, 1, 0),
-       SET_QP_INFO(3, 4, 2, 1),
-       SET_QP_INFO(5, 6, 3, 2),
-       SET_QP_INFO(7, 8, 4, 3),
-       SET_QP_INFO(9, 10, 5, 0),
-       SET_QP_INFO(11, 12, 1, 1),
-       SET_QP_INFO(13, 14, 2, 2),
-       SET_QP_INFO(15, 16, 3, 3),
-       SET_QP_INFO(17, 18, 4, 0), /* for now sdest to 0 */
-       SET_QP_INFO(19, 20, 5, 0), /* for now sdest to 0 */
+       SET_QP_INFO(1,  2,  1, 0),
+       SET_QP_INFO(3,  4,  2, 1),
+       SET_QP_INFO(5,  6,  3, 2),
+       SET_QP_INFO(7,  8,  4, 3),
+       SET_QP_INFO(9, 10,  5, 0),
+       SET_QP_INFO(11, 12,  6, 1),
+       SET_QP_INFO(13, 14,  7, 2),
+       SET_QP_INFO(15, 16,  8, 3),
+       SET_QP_INFO(17, 18,  9, 0), /* for now sdest to 0 */
+       SET_QP_INFO(19, 20, 10, 0), /* for now sdest to 0 */
 };
 #endif
 
index e46a714..cab03f8 100644 (file)
 #ifdef CONFIG_SYS_DPAA_QBMAN
 struct qportal_info qp_info[CONFIG_SYS_QMAN_NUM_PORTALS] = {
        /* dqrr liodn, frame data liodn, liodn off, sdest */
-       SET_QP_INFO(1, 2, 1, 0),
-       SET_QP_INFO(3, 4, 2, 1),
-       SET_QP_INFO(5, 6, 3, 2),
-       SET_QP_INFO(7, 8, 4, 3),
-       SET_QP_INFO(9, 10, 5, 0),
-       SET_QP_INFO(11, 12, 1, 1),
-       SET_QP_INFO(13, 14, 2, 2),
-       SET_QP_INFO(15, 16, 3, 3),
-       SET_QP_INFO(17, 18, 4, 0), /* for now sdest to 0 */
-       SET_QP_INFO(19, 20, 5, 0), /* for now sdest to 0 */
+       SET_QP_INFO(1,  2,  1, 0),
+       SET_QP_INFO(3,  4,  2, 1),
+       SET_QP_INFO(5,  6,  3, 2),
+       SET_QP_INFO(7,  8,  4, 3),
+       SET_QP_INFO(9, 10,  5, 0),
+       SET_QP_INFO(1, 12,  6, 1),
+       SET_QP_INFO(13, 14,  7, 2),
+       SET_QP_INFO(15, 16,  8, 3),
+       SET_QP_INFO(17, 18,  9, 0), /* for now sdest to 0 */
+       SET_QP_INFO(19, 20, 10, 0), /* for now sdest to 0 */
 };
 #endif
 
index e8c26bf..ca05b9c 100644 (file)
 #ifdef CONFIG_SYS_DPAA_QBMAN
 struct qportal_info qp_info[CONFIG_SYS_QMAN_NUM_PORTALS] = {
        /* dqrr liodn, frame data liodn, liodn off, sdest */
-       SET_QP_INFO(1, 2, 1, 0),
-       SET_QP_INFO(3, 4, 2, 1),
-       SET_QP_INFO(5, 6, 3, 0),
-       SET_QP_INFO(7, 8, 4, 1),
-       SET_QP_INFO(9, 10, 5, 0),
-       SET_QP_INFO(11, 12, 1, 1),
-       SET_QP_INFO(13, 14, 2, 0),
-       SET_QP_INFO(15, 16, 3, 1),
-       SET_QP_INFO(17, 18, 4, 0),
-       SET_QP_INFO(19, 20, 5, 1),
+       SET_QP_INFO(1,  2,  1, 0),
+       SET_QP_INFO(3,  4,  2, 1),
+       SET_QP_INFO(5,  6,  3, 0),
+       SET_QP_INFO(7,  8,  4, 1),
+       SET_QP_INFO(9, 10,  5, 0),
+       SET_QP_INFO(11, 12,  6, 1),
+       SET_QP_INFO(13, 14,  7, 0),
+       SET_QP_INFO(15, 16,  8, 1),
+       SET_QP_INFO(17, 18,  9, 0),
+       SET_QP_INFO(19, 20, 10, 1),
 };
 #endif
 
index b59ef69..d529095 100644 (file)
 #include <asm/fsl_portals.h>
 #include <asm/fsl_liodn.h>
 
-static ccsr_qman_t *qman = (void *)CONFIG_SYS_FSL_QMAN_ADDR;
-static ccsr_bman_t *bman = (void *)CONFIG_SYS_FSL_BMAN_ADDR;
-
 void setup_portals(void)
 {
+       ccsr_qman_t *qman = (void *)CONFIG_SYS_FSL_QMAN_ADDR;
 #ifdef CONFIG_FSL_CORENET
        int i;
 
@@ -166,6 +164,20 @@ static int fdt_qportal(void *blob, int off, int id, char *name,
                        num = get_dpaa_liodn(dev, &liodns[0], id);
                        ret = fdt_setprop(blob, childoff, "fsl,liodn",
                                          &liodns[0], sizeof(u32) * num);
+                       if (!strncmp(name, "pme", 3)) {
+                               u32 pme_rev1, pme_rev2;
+                               ccsr_pme_t *pme_regs =
+                                       (void *)CONFIG_SYS_FSL_CORENET_PME_ADDR;
+
+                               pme_rev1 = in_be32(&pme_regs->pm_ip_rev_1);
+                               pme_rev2 = in_be32(&pme_regs->pm_ip_rev_2);
+                               ret = fdt_setprop(blob, childoff,
+                                       "fsl,pme-rev1", &pme_rev1, sizeof(u32));
+                               if (ret < 0)
+                                       return ret;
+                               ret = fdt_setprop(blob, childoff,
+                                       "fsl,pme-rev2", &pme_rev2, sizeof(u32));
+                       }
 #endif
                } else {
                        return childoff;
@@ -183,6 +195,7 @@ void fdt_fixup_qportals(void *blob)
        int off, err;
        unsigned int maj, min;
        unsigned int ip_cfg;
+       ccsr_qman_t *qman = (void *)CONFIG_SYS_FSL_QMAN_ADDR;
        u32 rev_1 = in_be32(&qman->ip_rev_1);
        u32 rev_2 = in_be32(&qman->ip_rev_2);
        char compat[64];
@@ -272,6 +285,7 @@ void fdt_fixup_bportals(void *blob)
        int off, err;
        unsigned int maj, min;
        unsigned int ip_cfg;
+       ccsr_bman_t *bman = (void *)CONFIG_SYS_FSL_BMAN_ADDR;
        u32 rev_1 = in_be32(&bman->ip_rev_1);
        u32 rev_2 = in_be32(&bman->ip_rev_2);
        char compat[64];
index 8da2f86..e301dc6 100644 (file)
@@ -68,6 +68,10 @@ COBJS        += miiphy.o
 COBJS  += uic.o
 endif
 
+ifdef CONFIG_SPL_BUILD
+COBJS-y += spl_boot.o
+endif
+
 SRCS   := $(START:.o=.S) $(SOBJS:.o=.S) $(COBJS:.o=.c)
 OBJS   := $(addprefix $(obj),$(SOBJS) $(COBJS) $(COBJS-y))
 START  := $(addprefix $(obj),$(START))
diff --git a/arch/powerpc/cpu/ppc4xx/spl_boot.c b/arch/powerpc/cpu/ppc4xx/spl_boot.c
new file mode 100644 (file)
index 0000000..80869f6
--- /dev/null
@@ -0,0 +1,72 @@
+/*
+ * Copyright (C) 2013 Stefan Roese <sr@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.
+ */
+
+#include <common.h>
+#include <spl.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+/*
+ * Return selected boot device. On PPC4xx its only NOR flash right now.
+ */
+u32 spl_boot_device(void)
+{
+       return BOOT_DEVICE_NOR;
+}
+
+/*
+ * SPL version of board_init_f()
+ */
+void board_init_f(ulong bootflag)
+{
+       /*
+        * First we need to initialize the SDRAM, so that the real
+        * U-Boot or the OS (Linux) can be loaded
+        */
+       initdram(0);
+
+       /* Clear bss */
+       memset(__bss_start, '\0', __bss_end - __bss_start);
+
+       /*
+        * Init global_data pointer. Has to be done before calling
+        * get_clocks(), as it stores some clock values into gd needed
+        * later on in the serial driver.
+        */
+       /* 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 */
+       memset((void *)gd, 0, sizeof(gd_t));
+
+       /*
+        * get_clocks() needs to be called so that the serial driver
+        * works correctly
+        */
+       get_clocks();
+
+       /*
+        * Do rudimental console / serial setup
+        */
+       preloader_console_init();
+
+       /*
+        * Call board_init_r() (SPL framework version) to load and boot
+        * real U-Boot or OS
+        */
+       board_init_r(NULL, 0);
+       /* Does not return!!! */
+}
index 52f2623..57ae1d3 100644 (file)
  *
  * Use r12 to access the GOT
  */
-#if !defined(CONFIG_NAND_SPL)
+#if !defined(CONFIG_NAND_SPL) && !defined(CONFIG_SPL_BUILD)
        START_GOT
        GOT_ENTRY(_GOT2_TABLE_)
        GOT_ENTRY(_FIXUP_TABLE_)
        END_GOT
 #endif /* CONFIG_NAND_SPL */
 
-#if defined(CONFIG_NAND_U_BOOT) && !defined(CONFIG_NAND_SPL)
+#if defined(CONFIG_NAND_U_BOOT) && !defined(CONFIG_NAND_SPL) && \
+       !defined(CONFIG_SPL_BUILD)
        /*
         * NAND U-Boot image is started from offset 0
         */
        bl      _start_440
 #endif
 
+#if defined(CONFIG_SPL) && !defined(CONFIG_SPL_BUILD)
+       /*
+        * This is the entry of the real U-Boot from a board port
+        * that supports SPL booting on the PPC4xx. We only need
+        * to call board_init_f() here. Everything else has already
+        * been done in the SPL u-boot version.
+        */
+       GET_GOT                 /* initialize GOT access                */
+       bl      board_init_f    /* run 1st part of board init code (in Flash)*/
+       /* NOTREACHED - board_init_f() does not return */
+#endif
+
 /*
  * 440 Startup -- on reset only the top 4k of the effective
  * address space is mapped in by an entry in the instruction
@@ -539,7 +552,7 @@ tlbnx2:     addi    r4,r4,1         /* Next TLB */
  * r3 - 1st arg to board_init(): IMMP pointer
  * r4 - 2nd arg to board_init(): boot flag
  */
-#ifndef CONFIG_NAND_SPL
+#if !defined(CONFIG_NAND_SPL) && !defined(CONFIG_SPL_BUILD)
        .text
        .long   0x27051956              /* U-Boot Magic Number                  */
        .globl  version_string
@@ -612,6 +625,18 @@ _end_of_vectors:
        .globl  _start
 _start:
 
+#if defined(CONFIG_SPL) && !defined(CONFIG_SPL_BUILD)
+       /*
+        * This is the entry of the real U-Boot from a board port
+        * that supports SPL booting on the PPC4xx. We only need
+        * to call board_init_f() here. Everything else has already
+        * been done in the SPL u-boot version.
+        */
+       GET_GOT                 /* initialize GOT access                */
+       bl      board_init_f    /* run 1st part of board init code (in Flash)*/
+       /* NOTREACHED - board_init_f() does not return */
+#endif
+
 /*****************************************************************************/
 #if defined(CONFIG_440)
 
@@ -796,7 +821,9 @@ _start:
 #ifdef CONFIG_NAND_SPL
        bl      nand_boot_common        /* will not return */
 #else
+#ifndef CONFIG_SPL_BUILD
        GET_GOT
+#endif
 
        bl      cpu_init_f      /* run low-level CPU init code     (from Flash) */
        bl      board_init_f
@@ -1080,7 +1107,7 @@ _start:
        /*----------------------------------------------------------------------- */
 
 
-#ifndef CONFIG_NAND_SPL
+#if !defined(CONFIG_NAND_SPL) && !defined(CONFIG_SPL_BUILD)
 /*
  * This code finishes saving the registers to the exception frame
  * and jumps to the appropriate handler for the exception.
@@ -1262,6 +1289,7 @@ in32r:
        lwbrx   r3,r0,r3
        blr
 
+#if !defined(CONFIG_SPL_BUILD)
 /*
  * void relocate_code (addr_sp, gd, addr_moni)
  *
@@ -1626,6 +1654,7 @@ __440_msr_continue:
 
        mtlr    r4                      /* restore link register        */
        blr
+#endif /* CONFIG_SPL_BUILD */
 
 #if defined(CONFIG_440)
 /*----------------------------------------------------------------------------+
diff --git a/arch/powerpc/cpu/ppc4xx/u-boot-spl.lds b/arch/powerpc/cpu/ppc4xx/u-boot-spl.lds
new file mode 100644 (file)
index 0000000..ae1df17
--- /dev/null
@@ -0,0 +1,74 @@
+/*
+ * Copyright 2012-2013 Stefan Roese <sr@denx.de>
+ *
+ * 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
+ */
+
+MEMORY
+{
+       sdram : ORIGIN = CONFIG_SPL_BSS_START_ADDR,
+               LENGTH = CONFIG_SPL_BSS_MAX_SIZE
+       flash : ORIGIN = CONFIG_SPL_TEXT_BASE,
+               LENGTH = CONFIG_SYS_SPL_MAX_LEN
+}
+
+OUTPUT_ARCH(powerpc)
+ENTRY(_start)
+SECTIONS
+{
+#ifdef CONFIG_440
+       .bootpg 0xfffff000 :
+       {
+               arch/powerpc/cpu/ppc4xx/start.o (.bootpg)
+
+               /*
+                * PPC440 board need a board specific object with the
+                * TLB definitions. This needs to get included right after
+                * start.o, since the first shadow TLB only covers 4k
+                * of address space.
+                */
+               CONFIG_BOARDDIR/init.o  (.bootpg)
+       } > flash
+#endif
+
+       .resetvec 0xFFFFFFFC :
+       {
+               KEEP(*(.resetvec))
+       } > flash
+
+       .text :
+       {
+               __start = .;
+               arch/powerpc/cpu/ppc4xx/start.o (.text)
+               CONFIG_BOARDDIR/init.o  (.text)
+               *(.text*)
+       } > flash
+
+       . = ALIGN(4);
+       .data : { *(SORT_BY_ALIGNMENT(.data*)) } > flash
+
+       . = ALIGN(4);
+       .rodata : { *(SORT_BY_ALIGNMENT(.rodata*)) } > flash
+
+       .bss :
+       {
+               . = ALIGN(4);
+               __bss_start = .;
+               *(.bss*)
+               . = ALIGN(4);
+               __bss_end = .;
+       } > sdram
+}
index 06010d6..e994f02 100644 (file)
@@ -96,6 +96,7 @@ SECTIONS
   . = ALIGN(256);
   __init_end = .;
 
+#ifndef CONFIG_SPL
 #ifdef CONFIG_440
   .bootpg RESET_VECTOR_ADDRESS - 0xffc :
   {
@@ -132,6 +133,7 @@ SECTIONS
 #if (RESET_VECTOR_ADDRESS == 0xfffffffc)
   . |= 0x10;
 #endif
+#endif /* CONFIG_SPL */
 
   __bss_start = .;
   .bss (NOLOAD)       :
index d57c178..7267611 100644 (file)
 #define CONFIG_SYS_FSL_USB_INTERNAL_UTMI_PHY
 #define CONFIG_SYS_FSL_ERRATUM_ESDHC111
 #define CONFIG_SYS_FSL_ERRATUM_NMG_CPU_A011
+#define CONFIG_SYS_FSL_ERRATUM_USB14
 #define CONFIG_SYS_FSL_ERRATUM_CPU_A003999
+#define CONFIG_SYS_FSL_ERRATUM_DDR_A003
 #define CONFIG_SYS_FSL_ERRATUM_DDR_A003474
 #define CONFIG_SYS_FSL_SRIO_PCIE_BOOT_MASTER
 #define CONFIG_SYS_FSL_SRIO_MAX_PORTS  2
 #define CONFIG_SYS_FSL_USB_INTERNAL_UTMI_PHY
 #define CONFIG_SYS_FSL_ERRATUM_ESDHC111
 #define CONFIG_SYS_FSL_ERRATUM_NMG_CPU_A011
+#define CONFIG_SYS_FSL_ERRATUM_USB14
 #define CONFIG_SYS_FSL_ERRATUM_CPU_A003999
+#define CONFIG_SYS_FSL_ERRATUM_DDR_A003
 #define CONFIG_SYS_FSL_ERRATUM_DDR_A003474
 #define CONFIG_SYS_FSL_SRIO_PCIE_BOOT_MASTER
 #define CONFIG_SYS_FSL_SRIO_MAX_PORTS  2
 #define CONFIG_SYS_FSL_USB2_PHY_ENABLE
 #define CONFIG_SYS_FSL_USB_INTERNAL_UTMI_PHY
 #define CONFIG_SYS_FSL_ERRATUM_ESDHC111
+#define CONFIG_SYS_FSL_ERRATUM_USB14
+#define CONFIG_SYS_FSL_ERRATUM_DDR_A003
 #define CONFIG_SYS_FSL_ERRATUM_DDR_A003474
 #define CONFIG_SYS_FSL_SRIO_PCIE_BOOT_MASTER
 #define CONFIG_SYS_FSL_SRIO_MAX_PORTS  2
 #define CONFIG_SYS_FSL_USB2_PHY_ENABLE
 #define CONFIG_SYS_FSL_USB_INTERNAL_UTMI_PHY
 #define CONFIG_SYS_FSL_ERRATUM_ESDHC111
-#define CONFIG_SYS_FSL_ERRATUM_USB138
+#define CONFIG_SYS_FSL_ERRATUM_USB14
 #define CONFIG_SYS_FSL_ERRATUM_DDR_A003
 #define CONFIG_SYS_FSL_ERRATUM_DDR_A003474
 #define CONFIG_SYS_FSL_ERRATUM_A004699
 #define CONFIG_NUM_DDR_CONTROLLERS     1
 #define CONFIG_SYS_CCSRBAR_DEFAULT     0xff700000
 #define CONFIG_NAND_FSL_IFC
-#define CONFIG_SYS_FSL_ERRATUM_IFC_A003399
 #define CONFIG_SYS_FSL_ERRATUM_ESDHC111
 
 #elif defined(CONFIG_BSC9132)
 #define CONFIG_NUM_DDR_CONTROLLERS     2
 #define CONFIG_SYS_CCSRBAR_DEFAULT     0xff700000
 #define CONFIG_NAND_FSL_IFC
-#define CONFIG_SYS_FSL_ERRATUM_IFC_A003399
 #define CONFIG_SYS_FSL_ERRATUM_ESDHC111
 #define CONFIG_SYS_FSL_ESDHC_P1010_BROKEN_SDCLK
 #define CONFIG_SYS_FSL_PCIE_COMPAT     "fsl,qoriq-pcie-v2.2"
 #define CONFIG_SYS_FSL_PCIE_COMPAT     "fsl,qoriq-pcie-v2.4"
 #define CONFIG_SYS_FSL_USB1_PHY_ENABLE
 #define CONFIG_SYS_FSL_ERRATUM_A_004934
+#define CONFIG_SYS_FSL_ERRATUM_A005871
 #define CONFIG_SYS_CCSRBAR_DEFAULT     0xfe000000
 
 #elif defined(CONFIG_PPC_B4860)
 #define CONFIG_SYS_FSL_SRIO_IB_WIN_NUM 5
 #define CONFIG_SYS_FSL_USB1_PHY_ENABLE
 #define CONFIG_SYS_FSL_ERRATUM_A_004934
+#define CONFIG_SYS_FSL_ERRATUM_A005871
 #define CONFIG_SYS_CCSRBAR_DEFAULT     0xfe000000
 
 #else
index d6b60e6..69f95d1 100644 (file)
@@ -222,6 +222,10 @@ struct memac {
 
 /* IF_MODE - Interface Mode Register */
 #define IF_MODE_EN_AUTO        0x00008000 /* 1 - Enable automatic speed selection */
+#define IF_MODE_SETSP_100M     0x00000000 /* 00 - 100Mbps RGMII */
+#define IF_MODE_SETSP_10M      0x00002000 /* 01 - 10Mbps RGMII */
+#define IF_MODE_SETSP_1000M    0x00004000 /* 10 - 1000Mbps RGMII */
+#define IF_MODE_SETSP_MASK     0x00006000 /* setsp mask bits */
 #define IF_MODE_XGMII  0x00000000 /* 00- XGMII(10) interface mode */
 #define IF_MODE_GMII           0x00000002 /* 10- GMII interface mode */
 #define IF_MODE_MASK   0x00000003 /* mask for mode interface mode */
index 4eb3f79..baaa9fe 100644 (file)
@@ -2914,7 +2914,8 @@ struct ccsr_pman {
 #define CONFIG_SYS_MPC85xx_IFC_OFFSET          0x124000
 #define CONFIG_SYS_MPC85xx_GPIO_OFFSET         0x130000
 #define CONFIG_SYS_FSL_CORENET_RMAN_OFFSET     0x1e0000
-#ifdef CONFIG_SYS_FSL_QORIQ_CHASSIS2
+#if defined(CONFIG_SYS_FSL_QORIQ_CHASSIS2) && !defined(CONFIG_PPC_B4860)\
+       && !defined(CONFIG_PPC_B4420)
 #define CONFIG_SYS_MPC85xx_PCIE1_OFFSET                0x240000
 #define CONFIG_SYS_MPC85xx_PCIE2_OFFSET                0x250000
 #define CONFIG_SYS_MPC85xx_PCIE3_OFFSET                0x260000
@@ -3160,4 +3161,13 @@ struct ccsr_cluster_l2 {
 #define CONFIG_SYS_FSL_CLUSTER_1_L2 \
        (CONFIG_SYS_IMMR + CONFIG_SYS_FSL_CLUSTER_1_L2_OFFSET)
 #endif /* CONFIG_SYS_FSL_QORIQ_CHASSIS2 */
+
+#define        CONFIG_SYS_DCSR_DCFG_OFFSET     0X20000
+struct dcsr_dcfg_regs {
+       u8  res_0[0x520];
+       u32 ecccr1;
+#define        DCSR_DCFG_ECC_DISABLE_USB1      0x00008000
+#define        DCSR_DCFG_ECC_DISABLE_USB2      0x00004000
+       u8  res_524[0x1000 - 0x524]; /* 0x524 - 0x1000 */
+};
 #endif /*__IMMAP_85xx__*/
index 422b4a3..41b2294 100644 (file)
@@ -1050,15 +1050,6 @@ void board_init_r(gd_t *id, ulong dest_addr)
        /* NOTREACHED - no way out of command loop except booting */
 }
 
-void hang(void)
-{
-       puts("### ERROR ### Please RESET the board ###\n");
-       bootstage_error(BOOTSTAGE_ID_NEED_RESET);
-       for (;;)
-               ;
-}
-
-
 #if 0  /* We could use plain global data, but the resulting code is bigger */
 /*
  * Pointer to initial global data area
index 4fd0d4e..988b52c 100644 (file)
@@ -18,5 +18,8 @@
 # MA 02111-1307 USA
 
 PLATFORM_CPPFLAGS += -DCONFIG_SANDBOX -D__SANDBOX__ -U_FORTIFY_SOURCE
-PLATFORM_CPPFLAGS += -DCONFIG_ARCH_MAP_SYSMEM
+PLATFORM_CPPFLAGS += -DCONFIG_ARCH_MAP_SYSMEM -DCONFIG_SYS_GENERIC_BOARD
 PLATFORM_LIBS += -lrt
+
+# Support generic board on sandbox
+__HAVE_ARCH_GENERIC_BOARD := y
index b2788d5..dd8d495 100644 (file)
@@ -57,6 +57,11 @@ void *map_physmem(phys_addr_t paddr, unsigned long len, unsigned long flags)
        return (void *)(gd->arch.ram_buf + paddr);
 }
 
+phys_addr_t map_to_sysmem(void *ptr)
+{
+       return (u8 *)ptr - gd->arch.ram_buf;
+}
+
 void flush_dcache_range(unsigned long start, unsigned long stop)
 {
 }
index 5287fd5..ae6e16c 100644 (file)
@@ -90,7 +90,7 @@ int sandbox_main_loop_init(void)
 
        /* Execute command if required */
        if (state->cmd) {
-               run_command(state->cmd, 0);
+               run_command_list(state->cmd, -1, 0);
                os_exit(state->exit_type);
        }
 
@@ -104,6 +104,13 @@ static int sb_cmdline_cb_command(struct sandbox_state *state, const char *arg)
 }
 SB_CMDLINE_OPT_SHORT(command, 'c', 1, "Execute U-Boot command");
 
+static int sb_cmdline_cb_fdt(struct sandbox_state *state, const char *arg)
+{
+       state->fdt_fname = arg;
+       return 0;
+}
+SB_CMDLINE_OPT_SHORT(fdt, 'd', 1, "Specify U-Boot's control FDT");
+
 int main(int argc, char *argv[])
 {
        struct sandbox_state *state;
index d8c0236..0c022f1 100644 (file)
@@ -20,6 +20,9 @@
  * MA 02111-1307 USA
  */
 
+#ifndef __SANDBOX_ASM_IO_H
+#define __SANDBOX_ASM_IO_H
+
 /*
  * Given a physical address and a length, return a virtual address
  * that can be used to access the memory range with the caching
@@ -49,3 +52,8 @@ static inline void *map_sysmem(phys_addr_t paddr, unsigned long len)
 static inline void unmap_sysmem(const void *vaddr)
 {
 }
+
+/* Map from a pointer to our RAM buffer */
+phys_addr_t map_to_sysmem(void *ptr);
+
+#endif
index 2b62b46..9552708 100644 (file)
@@ -34,6 +34,7 @@ enum exit_type_id {
 /* The complete state of the test system */
 struct sandbox_state {
        const char *cmd;                /* Command to execute */
+       const char *fdt_fname;          /* Filename of FDT binary */
        enum exit_type_id exit_type;    /* How we exited U-Boot */
        const char *parse_err;          /* Error to report from parsing */
        int argc;                       /* Program arguments */
index de8120a..5bea1f2 100644 (file)
 #ifndef _U_BOOT_H_
 #define _U_BOOT_H_     1
 
-typedef struct bd_info {
-       unsigned long   bi_memstart;    /* start of DRAM memory */
-       phys_size_t     bi_memsize;     /* size  of DRAM memory in bytes */
-       unsigned long   bi_flashstart;  /* start of FLASH memory */
-       unsigned long   bi_flashsize;   /* size  of FLASH memory */
-       unsigned long   bi_flashoffset; /* reserved area for startup monitor */
-       unsigned long   bi_sramstart;   /* start of SRAM memory */
-       unsigned long   bi_sramsize;    /* size  of SRAM memory */
-       unsigned long   bi_bootflags;   /* boot / reboot flag (for LynxOS) */
-       unsigned short  bi_ethspeed;    /* Ethernet speed in Mbps */
-       unsigned long   bi_intfreq;     /* Internal Freq, in MHz */
-       unsigned long   bi_busfreq;     /* Bus Freq, in MHz */
-       unsigned int    bi_baudrate;    /* Console Baudrate */
-       unsigned long   bi_boot_params; /* where this board expects params */
-       struct                          /* RAM configuration */
-       {
-               ulong start;
-               ulong size;
-       } bi_dram[CONFIG_NR_DRAM_BANKS];
-} bd_t;
+/* Use the generic board which requires a unified bd_info */
+#include <asm-generic/u-boot.h>
 
 /* For image.h:image_check_target_arch() */
 #define IH_ARCH_DEFAULT IH_ARCH_SANDBOX
index fbe579b..3aad574 100644 (file)
@@ -27,7 +27,6 @@ include $(TOPDIR)/config.mk
 
 LIB    = $(obj)lib$(ARCH).o
 
-COBJS-y        += board.o
 COBJS-y        += interrupts.o
 
 SRCS   := $(COBJS-y:.o=.c)
diff --git a/arch/sandbox/lib/board.c b/arch/sandbox/lib/board.c
deleted file mode 100644 (file)
index 3752fab..0000000
+++ /dev/null
@@ -1,285 +0,0 @@
-/*
- * Copyright (c) 2011 The Chromium OS Authors.
- *
- * (C) Copyright 2002-2006
- * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
- *
- * (C) Copyright 2002
- * Sysgo Real-Time Solutions, GmbH <www.elinos.com>
- * Marius Groeger <mgroeger@sysgo.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
- */
-
-/*
- * This file was taken from ARM and changed to remove things we don't
- * need. This is most of it, so have tried to avoid being over-zealous!
- * For example, we want to have an emulation of the 'DRAM' used by
- * U-Boot.
- *
- * has been talk upstream of unifying the architectures w.r.t board.c,
- * so the less change here the better.
- */
-
-#include <common.h>
-#include <command.h>
-#include <malloc.h>
-#include <stdio_dev.h>
-#include <timestamp.h>
-#include <version.h>
-#include <serial.h>
-
-#include <os.h>
-
-DECLARE_GLOBAL_DATA_PTR;
-
-static gd_t gd_mem;
-
-/************************************************************************
- * Init Utilities                                                      *
- ************************************************************************
- * Some of this code should be moved into the core functions,
- * or dropped completely,
- * but let's get it working (again) first...
- */
-
-static int display_banner(void)
-{
-       display_options();
-
-       return 0;
-}
-
-/**
- * Configure and report on the DRAM configuration, which in our case is
- * fairly simple.
- */
-static int display_dram_config(void)
-{
-       ulong size = 0;
-       int i;
-
-       debug("RAM Configuration:\n");
-
-       for (i = 0; i < CONFIG_NR_DRAM_BANKS; i++) {
-#ifdef DEBUG
-               printf("Bank #%d: %08lx ", i, gd->bd->bi_dram[i].start);
-               print_size(gd->bd->bi_dram[i].size, "\n");
-#endif
-               size += gd->bd->bi_dram[i].size;
-       }
-       puts("DRAM:  ");
-       print_size(size, "\n");
-       return 0;
-}
-
-/*
- * Breathe some life into the board...
- *
- * Initialize a serial port as console, and carry out some hardware
- * tests.
- *
- * 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 dependent #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);
-
-void __dram_init_banksize(void)
-{
-       gd->bd->bi_dram[0].start = 0;
-       gd->bd->bi_dram[0].size =  gd->ram_size;
-}
-
-void dram_init_banksize(void)
-       __attribute__((weak, alias("__dram_init_banksize")));
-
-init_fnc_t *init_sequence[] = {
-#if defined(CONFIG_ARCH_CPU_INIT)
-       arch_cpu_init,          /* basic arch cpu dependent setup */
-#endif
-#if defined(CONFIG_BOARD_EARLY_INIT_F)
-       board_early_init_f,
-#endif
-       timer_init,             /* initialize timer */
-       env_init,               /* initialize environment */
-       serial_init,            /* serial communications setup */
-       console_init_f,         /* stage 1 init of console */
-       sandbox_early_getopt_check,     /* process command line flags (err/help) */
-       display_banner,         /* say that we are here */
-#if defined(CONFIG_DISPLAY_CPUINFO)
-       print_cpuinfo,          /* display cpu info (and speed) */
-#endif
-#if defined(CONFIG_DISPLAY_BOARDINFO)
-       checkboard,             /* display board info */
-#endif
-       dram_init,              /* configure available RAM banks */
-       NULL,
-};
-
-void board_init_f(ulong bootflag)
-{
-       init_fnc_t **init_fnc_ptr;
-       uchar *mem;
-       unsigned long addr_sp, addr, size;
-
-       gd = &gd_mem;
-       assert(gd);
-
-       memset((void *)gd, 0, sizeof(gd_t));
-
-#if defined(CONFIG_OF_EMBED)
-       /* Get a pointer to the FDT */
-       gd->fdt_blob = _binary_dt_dtb_start;
-#elif defined(CONFIG_OF_SEPARATE)
-       /* FDT is at end of image */
-       gd->fdt_blob = (void *)(_end_ofs + _TEXT_BASE);
-#endif
-
-       for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) {
-               if ((*init_fnc_ptr)() != 0)
-                       hang();
-       }
-
-       size = CONFIG_SYS_SDRAM_SIZE;
-       mem = os_malloc(CONFIG_SYS_SDRAM_SIZE);
-
-       assert(mem);
-       gd->arch.ram_buf = mem;
-       addr = (ulong)(mem + size);
-
-       /*
-        * reserve memory for malloc() arena
-        */
-       addr_sp = addr - TOTAL_MALLOC_LEN;
-       debug("Reserving %dk for malloc() at: %08lx\n",
-                       TOTAL_MALLOC_LEN >> 10, addr_sp);
-       /*
-        * (permanently) allocate a Board Info struct
-        * and a permanent copy of the "global" data
-        */
-       addr_sp -= sizeof(bd_t);
-       gd->bd = (bd_t *) addr_sp;
-       debug("Reserving %zu Bytes for Board Info at: %08lx\n",
-                       sizeof(bd_t), addr_sp);
-
-       /* Ram ist board specific, so move it to board code ... */
-       dram_init_banksize();
-       display_dram_config();  /* and display it */
-
-       /* We don't relocate, so just run the post-relocation code */
-       board_init_r(NULL, 0);
-
-       /* NOTREACHED - no way out of command loop except booting */
-}
-
-/************************************************************************
- *
- * 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 board_init_r(gd_t *id, ulong dest_addr)
-{
-
-       if (id)
-               gd = id;
-
-       gd->flags |= GD_FLG_RELOC;      /* tell others: relocation done */
-
-       serial_initialize();
-
-#ifdef CONFIG_POST
-       post_output_backlog();
-#endif
-
-       /* The Malloc area is at the top of simulated DRAM */
-       mem_malloc_init((ulong)gd->arch.ram_buf + gd->ram_size -
-                       TOTAL_MALLOC_LEN, TOTAL_MALLOC_LEN);
-
-       /* initialize environment */
-       env_relocate();
-
-       stdio_init();   /* get the devices list going. */
-
-       jumptable_init();
-
-       console_init_r();       /* fully init console as a device */
-
-#if defined(CONFIG_DISPLAY_BOARDINFO_LATE)
-       checkboard();
-#endif
-
-#if defined(CONFIG_ARCH_MISC_INIT)
-       /* miscellaneous arch dependent initialisations */
-       arch_misc_init();
-#endif
-#if defined(CONFIG_MISC_INIT_R)
-       /* miscellaneous platform dependent initialisations */
-       misc_init_r();
-#endif
-
-        /* set up exceptions */
-       interrupt_init();
-       /* enable exceptions */
-       enable_interrupts();
-
-#ifdef CONFIG_BOARD_LATE_INIT
-       board_late_init();
-#endif
-
-#ifdef CONFIG_POST
-       post_run(NULL, POST_RAM | post_bootmode_get(0));
-#endif
-
-       sandbox_main_loop_init();
-
-       /*
-        * For now, run the main loop. Later we might let this be done
-        * in the main program.
-        */
-       while (1)
-               main_loop();
-
-       /* NOTREACHED - no way out of command loop except booting */
-}
-
-void hang(void)
-{
-       puts("### ERROR ### Please RESET the board ###\n");
-       for (;;)
-               ;
-}
index 6e43acf..0789ed0 100644 (file)
@@ -200,12 +200,3 @@ void sh_generic_init(void)
                main_loop();
        }
 }
-
-/***********************************************************************/
-
-void hang(void)
-{
-       puts("Board ERROR\n");
-       for (;;)
-               ;
-}
index 79fb4c8..fbc535f 100644 (file)
@@ -411,13 +411,4 @@ void board_init_f(ulong bootflag)
 
 }
 
-void hang(void)
-{
-       puts("### ERROR ### Please RESET the board ###\n");
-#ifdef CONFIG_SHOW_BOOT_PROGRESS
-       bootstage_error(BOOTSTAGE_ID_NEED_RESET);
-#endif
-       for (;;) ;
-}
-
 /************************************************************************/
index 786009c..b4fe6c9 100644 (file)
@@ -113,7 +113,7 @@ int dram_init_f(void)
        return 0;
 }
 
-int dram_init(void)
+int dram_init_banksize(void)
 {
        int i, j;
 
@@ -132,3 +132,8 @@ int dram_init(void)
        }
        return 0;
 }
+
+int dram_init(void)
+{
+       return dram_init_banksize();
+}
index f372898..228c2c8 100644 (file)
@@ -264,10 +264,3 @@ void board_init_r(gd_t *id, ulong dest_addr)
 
        /* NOTREACHED - no way out of command loop except booting */
 }
-
-void hang(void)
-{
-       puts("### ERROR ### Please RESET the board ###\n");
-       for (;;)
-               ;
-}
index 0f9f883..c62ba62 100644 (file)
@@ -8,7 +8,7 @@
  * (C) Copyright 2006
  * MicroSys GmbH
  *
- * Copyright 2012 Stefan Roese <sr@denx.de>
+ * Copyright 2012-2013 Stefan Roese <sr@denx.de>
  *
  * See file CREDITS for list of people who contributed to this
  * project.
@@ -241,12 +241,26 @@ void spl_board_init(void)
 
        /* And write new value back to register */
        out_be32(&mm->ipbi_ws_ctrl, val);
-#endif
 
-       /*
-        * No need to change the pin multiplexing (MPC5XXX_GPS_PORT_CONFIG)
-        * as all 3 config versions (failsave level) have the same setup.
-        */
+
+       /* Setup pin multiplexing */
+       if (failsavelevel == 2) {
+               /* fpga-version ok */
+#if defined(CONFIG_SYS_GPS_PORT_CONFIG_2)
+               out_be32(&gpio->port_config, CONFIG_SYS_GPS_PORT_CONFIG_2);
+#endif
+       } else if (failsavelevel == 1) {
+               /* digiboard-version ok - fpga not */
+#if defined(CONFIG_SYS_GPS_PORT_CONFIG_1)
+               out_be32(&gpio->port_config, CONFIG_SYS_GPS_PORT_CONFIG_1);
+#endif
+       } else {
+               /* full failsave-mode */
+#if defined(CONFIG_SYS_GPS_PORT_CONFIG)
+               out_be32(&gpio->port_config, CONFIG_SYS_GPS_PORT_CONFIG);
+#endif
+       }
+#endif
 
        /*
         * Setup gpio_wkup_7 as watchdog AS INPUT to disable it - see
index 373cb78..6d634bf 100644 (file)
@@ -111,8 +111,6 @@ struct fsl_e_tlb_entry tlb_table[] = {
 #ifdef CONFIG_SYS_NAND_BASE
        /*
         * *I*G - NAND
-        * entry 14 and 15 has been used hard coded, they will be disabled
-        * in cpu_init_f, so we use entry 16 for nand.
         */
        SET_TLB_ENTRY(1, CONFIG_SYS_NAND_BASE, CONFIG_SYS_NAND_BASE_PHYS,
                        MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G,
@@ -122,6 +120,23 @@ struct fsl_e_tlb_entry tlb_table[] = {
                      MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G,
                      0, 12, BOOKE_PAGESZ_4K, 1),
 
+       /*
+        * *I*G - SRIO
+        * entry 14 and 15 has been used hard coded, they will be disabled
+        * in cpu_init_f, so we use entry 16 for SRIO2.
+        */
+#ifdef CONFIG_SYS_SRIO1_MEM_PHYS
+       /* *I*G* - SRIO1 */
+       SET_TLB_ENTRY(1, CONFIG_SYS_SRIO1_MEM_VIRT, CONFIG_SYS_SRIO1_MEM_PHYS,
+               MAS3_SW|MAS3_SR, MAS2_I|MAS2_G,
+                     0, 13, BOOKE_PAGESZ_256M, 1),
+#endif
+#ifdef CONFIG_SYS_SRIO2_MEM_PHYS
+       /* *I*G* - SRIO2 */
+       SET_TLB_ENTRY(1, CONFIG_SYS_SRIO2_MEM_VIRT, CONFIG_SYS_SRIO2_MEM_PHYS,
+               MAS3_SW|MAS3_SR, MAS2_I|MAS2_G,
+                     0, 16, BOOKE_PAGESZ_256M, 1),
+#endif
 };
 
 int num_tlb_entries = ARRAY_SIZE(tlb_table);
index 75725b4..72bb56c 100644 (file)
@@ -33,10 +33,14 @@ COBJS-$(CONFIG_FSL_CADMUS)  += cadmus.o
 COBJS-$(CONFIG_FSL_VIA)                += cds_via.o
 COBJS-$(CONFIG_FMAN_ENET)      += fman.o
 COBJS-$(CONFIG_FSL_PIXIS)      += pixis.o
+ifndef CONFIG_SPL_BUILD
 COBJS-$(CONFIG_FSL_NGPIXIS)    += ngpixis.o
+endif
 COBJS-$(CONFIG_FSL_QIXIS)      += qixis.o
 COBJS-$(CONFIG_PQ_MDS_PIB)     += pq-mds-pib.o
+ifndef CONFIG_SPL_BUILD
 COBJS-$(CONFIG_ID_EEPROM)      += sys_eeprom.o
+endif
 COBJS-$(CONFIG_FSL_SGMII_RISER)        += sgmii_riser.o
 ifndef CONFIG_RAMBOOT_PBL
 COBJS-$(CONFIG_FSL_FIXED_MMC_LOCATION) += sdhc_boot.o
@@ -48,7 +52,9 @@ COBJS-$(CONFIG_MPC8555CDS)    += cds_pci_ft.o
 
 COBJS-$(CONFIG_MPC8536DS)      += ics307_clk.o
 COBJS-$(CONFIG_MPC8572DS)      += ics307_clk.o
+ifndef CONFIG_SPL_BUILD
 COBJS-$(CONFIG_P1022DS)                += ics307_clk.o
+endif
 COBJS-$(CONFIG_P2020DS)                += ics307_clk.o
 COBJS-$(CONFIG_P3041DS)                += ics307_clk.o
 COBJS-$(CONFIG_P4080DS)                += ics307_clk.o
index 8a09f99..32233db 100644 (file)
@@ -31,7 +31,8 @@ static void cds_pci_fixup(void *blob)
        int node;
        const char *path;
        int len, slot, i;
-       u32 *map = NULL;
+       u32 *map = NULL, *piccells = NULL;
+       int off, cells;
 
        node = fdt_path_offset(blob, "/aliases");
        if (node >= 0) {
@@ -41,6 +42,25 @@ static void cds_pci_fixup(void *blob)
                        if (node >= 0) {
                                map = fdt_getprop_w(blob, node, "interrupt-map", &len);
                        }
+                       /* Each item in "interrupt-map" property is translated with
+                        * following cells:
+                        * PCI #address-cells, PCI #interrupt-cells,
+                        * PIC address, PIC #address-cells, PIC #interrupt-cells.
+                        */
+                       cells = fdt_getprop_u32_default(blob, path, "#address-cells", 1);
+                       cells += fdt_getprop_u32_default(blob, path, "#interrupt-cells", 1);
+                       off = fdt_node_offset_by_phandle(blob, fdt32_to_cpu(*(map+cells)));
+                       if (off <= 0)
+                               return;
+                       cells += 1;
+                       piccells = (u32 *)fdt_getprop(blob, off, "#address-cells", NULL);
+                       if (piccells == NULL)
+                               return;
+                       cells += *piccells;
+                       piccells = (u32 *)fdt_getprop(blob, off, "#interrupt-cells", NULL);
+                       if (piccells == NULL)
+                               return;
+                       cells += *piccells;
                }
        }
 
@@ -49,12 +69,12 @@ static void cds_pci_fixup(void *blob)
 
                slot = get_pci_slot();
 
-               for (i=0;i<len;i+=7) {
+               for (i=0;i<len;i+=cells) {
                        /* We rotate the interrupt pins so that the mapping
                         * changes depending on the slot the carrier card is in.
                         */
                        map[3] = ((map[3] + slot - 2) % 4) + 1;
-                       map+=7;
+                       map+=cells;
                }
        }
 }
index e432318..fd0e910 100644 (file)
@@ -32,7 +32,7 @@
 #define ESDHC_BOOT_IMAGE_SIZE  0x48
 #define ESDHC_BOOT_IMAGE_ADDR  0x50
 
-int mmc_get_env_addr(struct mmc *mmc, u32 *env_addr)
+int mmc_get_env_addr(struct mmc *mmc, int copy, u32 *env_addr)
 {
        u8 *tmp_buf;
        u32 blklen, code_offset, code_len, n;
index 11e2e8a..0c30d76 100644 (file)
@@ -217,7 +217,7 @@ void fdt_del_flexcan(void *blob)
        int nodeoff = 0;
 
        while ((nodeoff = fdt_node_offset_by_compatible(blob, 0,
-                               "fsl,flexcan-v1.0")) >= 0) {
+                               "fsl,p1010-flexcan")) >= 0) {
                fdt_del_node(blob, nodeoff);
        }
 }
index c6d3418..0eeef05 100644 (file)
@@ -11,12 +11,26 @@ include $(TOPDIR)/config.mk
 
 LIB    = $(obj)lib$(BOARD).o
 
+MINIMAL=
+
+ifdef CONFIG_SPL_BUILD
+ifdef CONFIG_SPL_INIT_MINIMAL
+MINIMAL=y
+endif
+endif
+
+ifdef MINIMAL
+
+COBJS-y        += spl_minimal.o tlb.o law.o
+
+else
 COBJS-y        += $(BOARD).o
 COBJS-y        += ddr.o
 COBJS-y        += law.o
 COBJS-y        += tlb.o
 
 COBJS-$(CONFIG_FSL_DIU_FB) += diu.o
+endif
 
 SRCS   := $(SOBJS:.o=.S) $(COBJS-y:.o=.c)
 OBJS   := $(addprefix $(obj),$(COBJS-y))
index b23b8f9..c4398dd 100644 (file)
@@ -16,6 +16,7 @@
 struct law_entry law_table[] = {
        SET_LAW(CONFIG_SYS_FLASH_BASE_PHYS, LAW_SIZE_256M, LAW_TRGT_IF_LBC),
        SET_LAW(PIXIS_BASE_PHYS, LAW_SIZE_4K, LAW_TRGT_IF_LBC),
+       SET_LAW(CONFIG_SYS_NAND_BASE_PHYS, LAW_SIZE_32K, LAW_TRGT_IF_LBC),
 };
 
 int num_law_entries = ARRAY_SIZE(law_table);
diff --git a/board/freescale/p1022ds/spl_minimal.c b/board/freescale/p1022ds/spl_minimal.c
new file mode 100644 (file)
index 0000000..8d12fa6
--- /dev/null
@@ -0,0 +1,129 @@
+/*
+ * Copyright 2011 Freescale Semiconductor, Inc.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ *
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ *
+ */
+
+#include <common.h>
+#include <ns16550.h>
+#include <asm/io.h>
+#include <nand.h>
+#include <asm/fsl_law.h>
+#include <asm/fsl_ddr_sdram.h>
+
+
+/*
+ * Fixed sdram init -- doesn't use serial presence detect.
+ */
+void sdram_init(void)
+{
+       volatile ccsr_ddr_t *ddr = (ccsr_ddr_t *)CONFIG_SYS_MPC8xxx_DDR_ADDR;
+
+       __raw_writel(CONFIG_SYS_DDR_CS0_BNDS, &ddr->cs0_bnds);
+       __raw_writel(CONFIG_SYS_DDR_CS0_CONFIG, &ddr->cs0_config);
+#if CONFIG_CHIP_SELECTS_PER_CTRL > 1
+       __raw_writel(CONFIG_SYS_DDR_CS1_BNDS, &ddr->cs1_bnds);
+       __raw_writel(CONFIG_SYS_DDR_CS1_CONFIG, &ddr->cs1_config);
+#endif
+       __raw_writel(CONFIG_SYS_DDR_TIMING_3, &ddr->timing_cfg_3);
+       __raw_writel(CONFIG_SYS_DDR_TIMING_0, &ddr->timing_cfg_0);
+       __raw_writel(CONFIG_SYS_DDR_TIMING_1, &ddr->timing_cfg_1);
+       __raw_writel(CONFIG_SYS_DDR_TIMING_2, &ddr->timing_cfg_2);
+
+       __raw_writel(CONFIG_SYS_DDR_CONTROL_2, &ddr->sdram_cfg_2);
+       __raw_writel(CONFIG_SYS_DDR_MODE_1, &ddr->sdram_mode);
+       __raw_writel(CONFIG_SYS_DDR_MODE_2, &ddr->sdram_mode_2);
+
+       __raw_writel(CONFIG_SYS_DDR_INTERVAL, &ddr->sdram_interval);
+       __raw_writel(CONFIG_SYS_DDR_DATA_INIT, &ddr->sdram_data_init);
+       __raw_writel(CONFIG_SYS_DDR_CLK_CTRL, &ddr->sdram_clk_cntl);
+
+       __raw_writel(CONFIG_SYS_DDR_TIMING_4, &ddr->timing_cfg_4);
+       __raw_writel(CONFIG_SYS_DDR_TIMING_5, &ddr->timing_cfg_5);
+       __raw_writel(CONFIG_SYS_DDR_ZQ_CONTROL, &ddr->ddr_zq_cntl);
+       __raw_writel(CONFIG_SYS_DDR_WRLVL_CONTROL, &ddr->ddr_wrlvl_cntl);
+
+       /* Set, but do not enable the memory */
+       __raw_writel(CONFIG_SYS_DDR_CONTROL & ~SDRAM_CFG_MEM_EN,
+                       &ddr->sdram_cfg);
+
+       in_be32(&ddr->sdram_cfg);
+       udelay(500);
+
+       /* Let the controller go */
+       out_be32(&ddr->sdram_cfg, in_be32(&ddr->sdram_cfg) | SDRAM_CFG_MEM_EN);
+       in_be32(&ddr->sdram_cfg);
+
+       set_next_law(0, CONFIG_SYS_SDRAM_SIZE_LAW, LAW_TRGT_IF_DDR_1);
+}
+
+const static u32 sysclk_tbl[] = {
+       66666000, 7499900, 83332500, 8999900,
+       99999000, 11111000, 12499800, 13333200
+};
+
+void board_init_f(ulong bootflag)
+{
+       int px_spd;
+       u32 plat_ratio, sys_clk, bus_clk;
+       ccsr_gur_t *gur = (void *)CONFIG_SYS_MPC85xx_GUTS_ADDR;
+
+       /* for FPGA */
+       set_lbc_br(2, CONFIG_SYS_BR2_PRELIM);
+       set_lbc_or(2, CONFIG_SYS_OR2_PRELIM);
+
+       /* initialize selected port with appropriate baud rate */
+       px_spd = in_8((unsigned char *)(PIXIS_BASE + PIXIS_SPD));
+       sys_clk = sysclk_tbl[px_spd & PIXIS_SPD_SYSCLK_MASK];
+       plat_ratio = in_be32(&gur->porpllsr) & MPC85xx_PORPLLSR_PLAT_RATIO;
+       bus_clk = sys_clk * plat_ratio / 2;
+
+       NS16550_init((NS16550_t)CONFIG_SYS_NS16550_COM1,
+                       bus_clk / 16 / CONFIG_BAUDRATE);
+
+       puts("\nNAND boot... ");
+
+       /* Initialize the DDR3 */
+       sdram_init();
+
+       /* 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_SPL_RELOC_STACK, 0,
+                       CONFIG_SPL_RELOC_TEXT_BASE);
+}
+
+void board_init_r(gd_t *gd, ulong dest_addr)
+{
+       nand_boot();
+}
+
+void putc(char c)
+{
+       if (c == '\n')
+               NS16550_putc((NS16550_t)CONFIG_SYS_NS16550_COM1, '\r');
+
+       NS16550_putc((NS16550_t)CONFIG_SYS_NS16550_COM1, c);
+}
+
+void puts(const char *str)
+{
+       while (*str)
+               putc(*str++);
+}
index 71e71f7..3acc449 100644 (file)
@@ -41,6 +41,7 @@ struct fsl_e_tlb_entry tlb_table[] = {
                      MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G,
                      0, 1, BOOKE_PAGESZ_1M, 1),
 
+#ifndef CONFIG_SPL_BUILD
        /* W**G* - Flash/promjet, localbus */
        /* This will be changed to *I*G* after relocation to RAM. */
        SET_TLB_ENTRY(1, CONFIG_SYS_FLASH_BASE, CONFIG_SYS_FLASH_BASE_PHYS,
@@ -67,24 +68,31 @@ struct fsl_e_tlb_entry tlb_table[] = {
        SET_TLB_ENTRY(1, CONFIG_SYS_PCIE3_IO_VIRT, CONFIG_SYS_PCIE3_IO_PHYS,
                      MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G,
                      0, 6, BOOKE_PAGESZ_256K, 1),
+#endif
 
        SET_TLB_ENTRY(1, PIXIS_BASE, PIXIS_BASE_PHYS,
                      MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G,
                      0, 7, BOOKE_PAGESZ_4K, 1),
 
-#ifdef CONFIG_SYS_RAMBOOT
-       /* *I*G - eSDHC/eSPI/NAND boot */
+#if defined(CONFIG_SYS_RAMBOOT) || defined(CONFIG_SPL)
+       /* **** - eSDHC/eSPI/NAND boot */
        SET_TLB_ENTRY(1, CONFIG_SYS_DDR_SDRAM_BASE, CONFIG_SYS_DDR_SDRAM_BASE,
                        MAS3_SX|MAS3_SW|MAS3_SR, 0,
                        0, 8, BOOKE_PAGESZ_1G, 1),
-
-       /* map the second 1G */
+       /* **** - eSDHC/eSPI/NAND boot - second 1GB of memory */
        SET_TLB_ENTRY(1, CONFIG_SYS_DDR_SDRAM_BASE + 0x40000000,
                        CONFIG_SYS_DDR_SDRAM_BASE + 0x40000000,
-                       MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G,
+                       MAS3_SX|MAS3_SW|MAS3_SR, 0,
                        0, 9, BOOKE_PAGESZ_1G, 1),
 #endif
-#
+
+#ifdef CONFIG_SYS_NAND_BASE
+       /* *I*G - NAND */
+       SET_TLB_ENTRY(1, CONFIG_SYS_NAND_BASE, CONFIG_SYS_NAND_BASE_PHYS,
+                       MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G,
+                       0, 10, BOOKE_PAGESZ_16K, 1),
+#endif
+
 };
 
 int num_tlb_entries = ARRAY_SIZE(tlb_table);
index 5b5b86c..2e0e0c7 100644 (file)
 #define GPIO_SLIC_PIN          30
 #define GPIO_SLIC_DATA         (1 << (31 - GPIO_SLIC_PIN))
 
+#if defined(CONFIG_P1021RDB) && !defined(CONFIG_SYS_RAMBOOT)
+#define GPIO_DDR_RST_PORT      1
+#define GPIO_DDR_RST_PIN       8
+#define GPIO_DDR_RST_DATA      (1 << (31 - GPIO_DDR_RST_PIN))
+
+#define GPIO_2BIT_MASK         (0x3 << (32 - (GPIO_DDR_RST_PIN + 1) * 2))
+#endif
 
 #if defined(CONFIG_P1025RDB) || defined(CONFIG_P1021RDB)
 #define PCA_IOPORT_I2C_ADDR            0x23
@@ -67,7 +74,7 @@
 const qe_iop_conf_t qe_iop_conf_tab[] = {
        /* GPIO */
        {1,   1, 2, 0, 0}, /* GPIO7/PB1   - LOAD_DEFAULT_N */
-#if 0
+#if defined(CONFIG_P1021RDB) && !defined(CONFIG_SYS_RAMBOOT)
        {1,   8, 1, 1, 0}, /* GPIO10/PB8  - DDR_RST */
 #endif
        {0,  15, 1, 0, 0}, /* GPIO11/A15  - WDI */
@@ -159,6 +166,16 @@ void board_gpio_init(void)
        ccsr_gur_t *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR);
        par_io_t *par_io = (par_io_t *) &(gur->qe_par_io);
 
+#if defined(CONFIG_P1021RDB) && !defined(CONFIG_SYS_RAMBOOT)
+       /* reset DDR3 */
+       setbits_be32(&par_io[GPIO_DDR_RST_PORT].cpdat, GPIO_DDR_RST_DATA);
+       udelay(1000);
+       clrbits_be32(&par_io[GPIO_DDR_RST_PORT].cpdat, GPIO_DDR_RST_DATA);
+       udelay(1000);
+       setbits_be32(&par_io[GPIO_DDR_RST_PORT].cpdat, GPIO_DDR_RST_DATA);
+       /* disable CE_PB8 */
+       clrbits_be32(&par_io[GPIO_DDR_RST_PORT].cpdir1, GPIO_2BIT_MASK);
+#endif
        /* Enable VSC7385 switch */
        setbits_be32(&par_io[GPIO_GETH_SW_PORT].cpdat, GPIO_GETH_SW_DATA);
 
@@ -421,6 +438,8 @@ void ft_board_setup(void *blob, bd_t *bd)
 {
        phys_addr_t base;
        phys_size_t size;
+       const char *soc_usb_compat = "fsl-usb2-dr";
+       int err, usb1_off, usb2_off;
 
        ft_cpu_setup(blob, bd);
 
@@ -442,5 +461,50 @@ void ft_board_setup(void *blob, bd_t *bd)
 #if defined(CONFIG_HAS_FSL_DR_USB)
        fdt_fixup_dr_usb(blob, bd);
 #endif
+
+#if defined(CONFIG_SDCARD) || defined(CONFIG_SPIFLASH)
+       /* Delete eLBC node as it is muxed with USB2 controller */
+       if (hwconfig("usb2")) {
+               const char *soc_elbc_compat = "fsl,p1020-elbc";
+               int off = fdt_node_offset_by_compatible(blob, -1,
+                               soc_elbc_compat);
+               if (off < 0) {
+                       printf("WARNING: could not find compatible node %s: %s.\n",
+                              soc_elbc_compat,
+                              fdt_strerror(off));
+                               return;
+               }
+               err = fdt_del_node(blob, off);
+               if (err < 0) {
+                       printf("WARNING: could not remove %s: %s.\n",
+                              soc_elbc_compat, fdt_strerror(err));
+               }
+               return;
+       }
+#endif
+
+/* Delete USB2 node as it is muxed with eLBC */
+       usb1_off = fdt_node_offset_by_compatible(blob, -1,
+               soc_usb_compat);
+       if (usb1_off < 0) {
+               printf("WARNING: could not find compatible node %s: %s.\n",
+                      soc_usb_compat,
+                      fdt_strerror(usb1_off));
+               return;
+       }
+       usb2_off = fdt_node_offset_by_compatible(blob, usb1_off,
+                       soc_usb_compat);
+       if (usb2_off < 0) {
+               printf("WARNING: could not find compatible node %s: %s.\n",
+                      soc_usb_compat,
+                      fdt_strerror(usb2_off));
+               return;
+       }
+       err = fdt_del_node(blob, usb2_off);
+       if (err < 0) {
+               printf("WARNING: could not remove %s: %s.\n",
+                      soc_usb_compat, fdt_strerror(err));
+       }
+
 }
 #endif
index 09019e9..e2bfb0d 100644 (file)
@@ -81,6 +81,8 @@ void board_init_f(ulong bootflag)
        ccsr_gur_t *gur = (void *)CONFIG_SYS_MPC85xx_GUTS_ADDR;
 #ifndef CONFIG_QE
        ccsr_gpio_t *pgpio = (void *)(CONFIG_SYS_MPC85xx_GPIO_ADDR);
+#elif defined(CONFIG_P1021RDB)
+       par_io_t *par_io = (par_io_t *)&(gur->qe_par_io);
 #endif
 
        /* initialize selected port with appropriate baud rate */
@@ -102,6 +104,19 @@ void board_init_f(ulong bootflag)
        __raw_writel(0x00200000, &pgpio->gpdat);
        udelay(1000);
        __raw_writel(0x00000000, &pgpio->gpdir);
+#elif defined(CONFIG_P1021RDB)
+       /* init DDR3 reset signal CE_PB8 */
+       out_be32(&par_io[1].cpdir1, 0x00004000);
+       out_be32(&par_io[1].cpodr, 0x00800000);
+       out_be32(&par_io[1].cppar1, 0x00000000);
+       /* reset DDR3 */
+       out_be32(&par_io[1].cpdat, 0x00800000);
+       udelay(1000);
+       out_be32(&par_io[1].cpdat, 0x00000000);
+       udelay(1000);
+       out_be32(&par_io[1].cpdat, 0x00800000);
+       /* disable the CE_PB8 */
+       out_be32(&par_io[1].cpdir1, 0x00000000);
 #endif
 
 #ifndef CONFIG_SYS_INIT_L2_ADDR
index 720b06e..738e480 100644 (file)
@@ -32,6 +32,15 @@ int board_eth_init(bd_t *bis)
        return 0;
 }
 
+void reset_cpu(ulong ignore)
+{
+       /* Enable VLIO interface on Hamcop */
+       writeb(0x1, 0x4000);
+
+       /* Reset board (cold reset) */
+       writeb(0xff, 0x4002);
+}
+
 int board_init(void)
 {
        /* We have RAM, disable cache */
index 29e24fb..9cf0fa1 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * (C) Copyright 2007-2010
+ * (C) Copyright 2007-2013
  * Stefan Roese, DENX Software Engineering, sr@denx.de.
  *
  * This program is free software; you can redistribute it and/or
@@ -200,9 +200,11 @@ int misc_init_r(void)
        u32 pbcr;
        int size_val = 0;
        u32 reg;
+#ifndef CONFIG_LCD4_LWMON5
        unsigned long usb2d0cr = 0;
        unsigned long usb2phy0cr, usb2h0cr = 0;
        unsigned long sdr0_pfc1, sdr0_srst;
+#endif
 
        /*
         * FLASH stuff...
@@ -233,6 +235,7 @@ int misc_init_r(void)
                      CONFIG_ENV_ADDR_REDUND + 2 * CONFIG_ENV_SECT_SIZE - 1,
                      &flash_info[cfi_flash_num_flash_banks - 1]);
 
+#ifndef CONFIG_LCD4_LWMON5
        /*
         * USB suff...
         */
@@ -306,6 +309,7 @@ int misc_init_r(void)
        /* 7. Reassert internal PHY reset: */
        mtsdr(SDR0_SRST1, SDR0_SRST1_USB20PHY);
        udelay(1000);
+#endif
 
        /*
         * Clear resets
@@ -313,7 +317,9 @@ int misc_init_r(void)
        mtsdr(SDR0_SRST1, 0x00000000);
        mtsdr(SDR0_SRST0, 0x00000000);
 
+#ifndef CONFIG_LCD4_LWMON5
        printf("USB:   Host(int phy) Device(ext phy)\n");
+#endif
 
        /*
         * Clear PLB4A0_ACR[WRP]
@@ -323,10 +329,12 @@ int misc_init_r(void)
        reg = mfdcr(PLB4A0_ACR) & ~PLB4Ax_ACR_WRP_MASK;
        mtdcr(PLB4A0_ACR, reg);
 
+#ifndef CONFIG_LCD4_LWMON5
        /*
         * Init matrix keyboard
         */
        misc_init_r_kbd();
+#endif
 
        return 0;
 }
@@ -336,7 +344,7 @@ int checkboard(void)
        char buf[64];
        int i = getenv_f("serial#", buf, sizeof(buf));
 
-       puts("Board: lwmon5");
+       printf("Board: %s", __stringify(CONFIG_HOSTNAME));
 
        if (i > 0) {
                puts(", serial# ");
@@ -495,3 +503,66 @@ void board_reset(void)
 {
        gpio_write_bit(CONFIG_SYS_GPIO_BOARD_RESET, 1);
 }
+
+#ifdef CONFIG_SPL_OS_BOOT
+/*
+ * lwmon5 specific implementation of spl_start_uboot()
+ *
+ * RETURN
+ * 0 if booting into OS is selected (default)
+ * 1 if booting into U-Boot is selected
+ */
+int spl_start_uboot(void)
+{
+       char s[8];
+
+       env_init();
+       getenv_f("boot_os", s, sizeof(s));
+       if ((s != NULL) && (strcmp(s, "yes") == 0))
+               return 0;
+
+       return 1;
+}
+
+/*
+ * This function is called from the SPL U-Boot version for
+ * early init stuff, that needs to be done for OS (e.g. Linux)
+ * booting. Doing it later in the real U-Boot would not work
+ * in case that the SPL U-Boot boots Linux directly.
+ */
+void spl_board_init(void)
+{
+       const gdc_regs *regs = board_get_regs();
+
+       /*
+        * Setup PFC registers, mainly for ethernet support
+        * later on in Linux
+        */
+       board_early_init_f();
+
+       /*
+        * Clear resets
+        */
+       mtsdr(SDR0_SRST1, 0x00000000);
+       mtsdr(SDR0_SRST0, 0x00000000);
+
+       /*
+        * Reset Lime controller
+        */
+       gpio_write_bit(CONFIG_SYS_GPIO_LIME_S, 1);
+       udelay(500);
+       gpio_write_bit(CONFIG_SYS_GPIO_LIME_RST, 1);
+
+       out_be32((void *)CONFIG_SYS_LIME_SDRAM_CLOCK, CONFIG_SYS_MB862xx_CCF);
+       udelay(300);
+       out_be32((void *)CONFIG_SYS_LIME_MMR, CONFIG_SYS_MB862xx_MMR);
+
+       while (regs->index) {
+               out_be32((void *)(CONFIG_SYS_LIME_BASE_0 + GC_DISP_BASE) +
+                        regs->index, regs->value);
+               regs++;
+       }
+
+       board_backlight_brightness(DEFAULT_BRIGHTNESS);
+}
+#endif
index b64b35a..78b8fbc 100644 (file)
@@ -6,7 +6,7 @@
  * Alain Saurel,           AMCC/IBM, alain.saurel@fr.ibm.com
  * Robert Snyder,          AMCC/IBM, rob.snyder@fr.ibm.com
  *
- * (C) Copyright 2007-2008
+ * (C) Copyright 2007-2013
  * Stefan Roese, DENX Software Engineering, sr@denx.de.
  *
  * This program is free software; you can redistribute it and/or
@@ -160,6 +160,7 @@ static void program_ecc(u32 start_address,
  ************************************************************************/
 phys_size_t initdram (int board_type)
 {
+#if defined(CONFIG_SPL_BUILD) || !defined(CONFIG_LCD4_LWMON5)
        /* CL=4 */
        mtsdram(DDR0_02, 0x00000000);
 
@@ -253,6 +254,7 @@ phys_size_t initdram (int board_type)
         * exceptions are enabled.
         */
        set_mcsr(get_mcsr());
+#endif /* CONFIG_SPL_BUILD */
 
        return (CONFIG_SYS_MBYTES_SDRAM << 20);
 }
index 9883013..8bdba92 100644 (file)
@@ -56,6 +56,6 @@ int timer_init(void)
 
 int dram_init(void)
 {
-       gd->ram_size = CONFIG_DRAM_SIZE;
+       gd->ram_size = CONFIG_SYS_SDRAM_SIZE;
        return 0;
 }
index 70f94c1..befbb3a 100644 (file)
@@ -38,10 +38,15 @@ int do_reset(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
        *((unsigned long *)(CONFIG_SYS_GPIO_0_ADDR)) =
            ++(*((unsigned long *)(CONFIG_SYS_GPIO_0_ADDR)));
 #endif
-#ifdef CONFIG_SYS_RESET_ADDRESS
-       puts ("Reseting board\n");
-       asm ("bra r0");
+
+#ifdef CONFIG_XILINX_TB_WATCHDOG
+       hw_watchdog_disable();
 #endif
+
+       puts ("Reseting board\n");
+       __asm__ __volatile__ (" mts rmsr, r0;" \
+                               "bra r0");
+
        return 0;
 }
 
index 50a82d9..c846f97 100644 (file)
@@ -77,3 +77,7 @@
 #define XILINX_LLTEMAC_SDMA_CTRL_BASEADDR      0x42000180
 #define XILINX_LLTEMAC_BASEADDR1               0x44200000
 #define XILINX_LLTEMAC_FIFO_BASEADDR1          0x42100000
+
+/* Watchdog IP is wxi_timebase_wdt_0 */
+#define XILINX_WATCHDOG_BASEADDR       0x50000000
+#define XILINX_WATCHDOG_IRQ            1
index 8ed75c3..b02c364 100644 (file)
 
 #include <common.h>
 #include <netdev.h>
+#include <zynqpl.h>
+#include <asm/arch/hardware.h>
+#include <asm/arch/sys_proto.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
+#ifdef CONFIG_FPGA
+Xilinx_desc fpga;
+
+/* It can be done differently */
+Xilinx_desc fpga010 = XILINX_XC7Z010_DESC(0x10);
+Xilinx_desc fpga020 = XILINX_XC7Z020_DESC(0x20);
+Xilinx_desc fpga030 = XILINX_XC7Z030_DESC(0x30);
+Xilinx_desc fpga045 = XILINX_XC7Z045_DESC(0x45);
+#endif
+
 int board_init(void)
 {
+#ifdef CONFIG_FPGA
+       u32 idcode;
+
+       idcode = zynq_slcr_get_idcode();
+
+       switch (idcode) {
+       case XILINX_ZYNQ_7010:
+               fpga = fpga010;
+               break;
+       case XILINX_ZYNQ_7020:
+               fpga = fpga020;
+               break;
+       case XILINX_ZYNQ_7030:
+               fpga = fpga030;
+               break;
+       case XILINX_ZYNQ_7045:
+               fpga = fpga045;
+               break;
+       }
+#endif
+
        icache_enable();
 
+#ifdef CONFIG_FPGA
+       fpga_init();
+       fpga_add(fpga_xilinx, &fpga);
+#endif
+
        return 0;
 }
 
@@ -38,10 +77,33 @@ int board_eth_init(bd_t *bis)
 {
        u32 ret = 0;
 
-#if defined(CONFIG_ZYNQ_GEM) && defined(CONFIG_ZYNQ_GEM_BASEADDR0)
-       ret = zynq_gem_initialize(bis, CONFIG_ZYNQ_GEM_BASEADDR0);
+#if defined(CONFIG_ZYNQ_GEM)
+# if defined(CONFIG_ZYNQ_GEM0)
+       ret |= zynq_gem_initialize(bis, ZYNQ_GEM_BASEADDR0,
+                                               CONFIG_ZYNQ_GEM_PHY_ADDR0, 0);
+# endif
+# if defined(CONFIG_ZYNQ_GEM1)
+       ret |= zynq_gem_initialize(bis, ZYNQ_GEM_BASEADDR1,
+                                               CONFIG_ZYNQ_GEM_PHY_ADDR1, 0);
+# endif
+#endif
+       return ret;
+}
 #endif
 
+#ifdef CONFIG_CMD_MMC
+int board_mmc_init(bd_t *bd)
+{
+       int ret = 0;
+
+#if defined(CONFIG_ZYNQ_SDHCI)
+# if defined(CONFIG_ZYNQ_SDHCI0)
+       ret = zynq_sdhci_init(ZYNQ_SDHCI_BASEADDR0);
+# endif
+# if defined(CONFIG_ZYNQ_SDHCI1)
+       ret |= zynq_sdhci_init(ZYNQ_SDHCI_BASEADDR1);
+# endif
+#endif
        return ret;
 }
 #endif
index 91723b9..0e082a0 100644 (file)
@@ -814,6 +814,8 @@ P1021RDB-PC_NAND             powerpc     mpc85xx     p1_p2_rdb_pc        freesca
 P1021RDB-PC_SDCARD           powerpc     mpc85xx     p1_p2_rdb_pc        freescale      -           p1_p2_rdb_pc:P1021RDB,SDCARD
 P1021RDB-PC_SPIFLASH         powerpc     mpc85xx     p1_p2_rdb_pc        freescale      -           p1_p2_rdb_pc:P1021RDB,SPIFLASH
 P1022DS                      powerpc     mpc85xx     p1022ds             freescale
+P1022DS_NAND                 powerpc     mpc85xx     p1022ds             freescale     -           P1022DS:NAND
+P1022DS_36BIT_NAND           powerpc     mpc85xx     p1022ds             freescale     -           P1022DS:36BIT,NAND
 P1022DS_SPIFLASH             powerpc     mpc85xx     p1022ds             freescale     -           P1022DS:SPIFLASH
 P1022DS_36BIT_SPIFLASH       powerpc     mpc85xx     p1022ds             freescale     -           P1022DS:36BIT,SPIFLASH
 P1022DS_SDCARD               powerpc     mpc85xx     p1022ds             freescale     -           P1022DS:SDCARD
@@ -1013,6 +1015,7 @@ JSE                          powerpc     ppc4xx      jse
 korat                        powerpc     ppc4xx
 korat_perm                   powerpc     ppc4xx      korat               -              -           korat:KORAT_PERMANENT
 lwmon5                       powerpc     ppc4xx
+lcd4_lwmon5                  powerpc     ppc4xx      lwmon5              -              -           lwmon5:LCD4_LWMON5
 pcs440ep                     powerpc     ppc4xx
 quad100hd                    powerpc     ppc4xx
 sbc405                       powerpc     ppc4xx
index 7698891..32e59fa 100644 (file)
@@ -31,6 +31,7 @@
 #include <version.h>
 #include <environment.h>
 #include <fdtdec.h>
+#include <fs.h>
 #if defined(CONFIG_CMD_IDE)
 #include <ide.h>
 #endif
 #include <mpc5xxx.h>
 #endif
 
+#include <os.h>
 #include <post.h>
 #include <spi.h>
 #include <watchdog.h>
+#include <asm/errno.h>
 #include <asm/io.h>
 #ifdef CONFIG_MP
 #include <asm/mp.h>
@@ -61,6 +64,9 @@
 #include <asm/init_helpers.h>
 #include <asm/relocate.h>
 #endif
+#ifdef CONFIG_SANDBOX
+#include <asm/state.h>
+#endif
 #include <linux/compiler.h>
 
 /*
@@ -155,6 +161,7 @@ static int init_baud_rate(void)
 
 static int display_text_info(void)
 {
+#ifndef CONFIG_SANDBOX
        ulong bss_start, bss_end;
 
 #ifdef CONFIG_SYS_SYM_OFFSETS
@@ -166,6 +173,7 @@ static int display_text_info(void)
 #endif
        debug("U-Boot code: %08X -> %08lX  BSS: -> %08lX\n",
              CONFIG_SYS_TEXT_BASE, bss_start, bss_end);
+#endif
 
 #ifdef CONFIG_MODEM_SUPPORT
        debug("Modem Support enabled\n");
@@ -284,6 +292,8 @@ static int setup_mon_len(void)
 {
 #ifdef CONFIG_SYS_SYM_OFFSETS
        gd->mon_len = _bss_end_ofs;
+#elif defined(CONFIG_SANDBOX)
+       gd->mon_len = (ulong)&_end - (ulong)_init;
 #else
        /* TODO: use (ulong)&__bss_end - (ulong)&__text_start; ? */
        gd->mon_len = (ulong)&__bss_end - CONFIG_SYS_MONITOR_BASE;
@@ -296,6 +306,66 @@ __weak int arch_cpu_init(void)
        return 0;
 }
 
+#ifdef CONFIG_OF_HOSTFILE
+
+#define CHECK(x)               err = (x); if (err) goto failed;
+
+/* Create an empty device tree blob */
+static int make_empty_fdt(void *fdt)
+{
+       int err;
+
+       CHECK(fdt_create(fdt, 256));
+       CHECK(fdt_finish_reservemap(fdt));
+       CHECK(fdt_begin_node(fdt, ""));
+       CHECK(fdt_end_node(fdt));
+       CHECK(fdt_finish(fdt));
+
+       return 0;
+failed:
+       printf("Unable to create empty FDT: %s\n", fdt_strerror(err));
+       return -EACCES;
+}
+
+static int read_fdt_from_file(void)
+{
+       struct sandbox_state *state = state_get_current();
+       void *blob;
+       int size;
+       int err;
+
+       blob = map_sysmem(CONFIG_SYS_FDT_LOAD_ADDR, 0);
+       if (!state->fdt_fname) {
+               err = make_empty_fdt(blob);
+               if (!err)
+                       goto done;
+               return err;
+       }
+       err = fs_set_blk_dev("host", NULL, FS_TYPE_SANDBOX);
+       if (err)
+               return err;
+       size = fs_read(state->fdt_fname, CONFIG_SYS_FDT_LOAD_ADDR, 0, 0);
+       if (size < 0)
+               return -EIO;
+
+done:
+       gd->fdt_blob = blob;
+
+       return 0;
+}
+#endif
+
+#ifdef CONFIG_SANDBOX
+static int setup_ram_buf(void)
+{
+       gd->arch.ram_buf = os_malloc(CONFIG_SYS_SDRAM_SIZE);
+       assert(gd->arch.ram_buf);
+       gd->ram_size = CONFIG_SYS_SDRAM_SIZE;
+
+       return 0;
+}
+#endif
+
 static int setup_fdt(void)
 {
 #ifdef CONFIG_OF_EMBED
@@ -308,6 +378,11 @@ static int setup_fdt(void)
 # else
        gd->fdt_blob = (ulong *)&_end;
 # endif
+#elif defined(CONFIG_OF_HOSTFILE)
+       if (read_fdt_from_file()) {
+               puts("Failed to read control FDT\n");
+               return -1;
+       }
 #endif
        /* Allow the early environment to override the fdt address */
        gd->fdt_blob = (void *)getenv_ulong("fdtcontroladdr", 16,
@@ -470,7 +545,7 @@ static int reserve_malloc(void)
 static int reserve_board(void)
 {
        gd->dest_addr_sp -= sizeof(bd_t);
-       gd->bd = (bd_t *)gd->dest_addr_sp;
+       gd->bd = (bd_t *)map_sysmem(gd->dest_addr_sp, sizeof(bd_t));
        memset(gd->bd, '\0', sizeof(bd_t));
        debug("Reserving %zu Bytes for Board Info at: %08lx\n",
                        sizeof(bd_t), gd->dest_addr_sp);
@@ -489,7 +564,7 @@ static int setup_machine(void)
 static int reserve_global_data(void)
 {
        gd->dest_addr_sp -= sizeof(gd_t);
-       gd->new_gd = (gd_t *)gd->dest_addr_sp;
+       gd->new_gd = (gd_t *)map_sysmem(gd->dest_addr_sp, sizeof(gd_t));
        debug("Reserving %zu Bytes for Global Data at: %08lx\n",
                        sizeof(gd_t), gd->dest_addr_sp);
        return 0;
@@ -506,9 +581,9 @@ static int reserve_fdt(void)
                gd->fdt_size = ALIGN(fdt_totalsize(gd->fdt_blob) + 0x1000, 32);
 
                gd->dest_addr_sp -= gd->fdt_size;
-               gd->new_fdt = (void *)gd->dest_addr_sp;
-               debug("Reserving %lu Bytes for FDT at: %p\n",
-                     gd->fdt_size, gd->new_fdt);
+               gd->new_fdt = map_sysmem(gd->dest_addr_sp, gd->fdt_size);
+               debug("Reserving %lu Bytes for FDT at: %08lx\n",
+                     gd->fdt_size, gd->dest_addr_sp);
        }
 
        return 0;
@@ -709,8 +784,9 @@ static int setup_reloc(void)
        memcpy(gd->new_gd, (char *)gd, sizeof(gd_t));
 
        debug("Relocation Offset is: %08lx\n", gd->reloc_off);
-       debug("Relocating to %08lx, new gd at %p, sp at %08lx\n",
-             gd->dest_addr, gd->new_gd, gd->dest_addr_sp);
+       debug("Relocating to %08lx, new gd at %08lx, sp at %08lx\n",
+             gd->dest_addr, (ulong)map_to_sysmem(gd->new_gd),
+             gd->dest_addr_sp);
 
        return 0;
 }
@@ -736,6 +812,8 @@ static int jump_to_copy(void)
         * (CPU cache)
         */
        board_init_f_r_trampoline(gd->start_addr_sp);
+#elif defined(CONFIG_SANDBOX)
+       board_init_r(gd->new_gd, 0);
 #else
        relocate_code(gd->dest_addr_sp, gd->new_gd, gd->dest_addr);
 #endif
@@ -755,8 +833,11 @@ static int mark_bootstage(void)
 static init_fnc_t init_sequence_f[] = {
 #if !defined(CONFIG_CPM2) && !defined(CONFIG_MPC512X) && \
                !defined(CONFIG_MPC83xx) && !defined(CONFIG_MPC85xx) && \
-               !defined(CONFIG_MPC86xx)
+               !defined(CONFIG_MPC86xx) && !defined(CONFIG_X86)
        zero_global_data,
+#endif
+#ifdef CONFIG_SANDBOX
+       setup_ram_buf,
 #endif
        setup_fdt,
        setup_mon_len,
@@ -816,8 +897,11 @@ static init_fnc_t init_sequence_f[] = {
        init_baud_rate,         /* initialze baudrate settings */
        serial_init,            /* serial communications setup */
        console_init_f,         /* stage 1 init of console */
-#if defined(CONFIG_X86) && defined(CONFIG_OF_CONTROL)
-       prepare_fdt,            /* TODO(sjg@chromium.org): remove */
+#ifdef CONFIG_SANDBOX
+       sandbox_early_getopt_check,
+#endif
+#ifdef CONFIG_OF_CONTROL
+       fdtdec_prepare_fdt,
 #endif
        display_options,        /* say that we are here */
        display_text_info,      /* show debugging info if required */
@@ -856,8 +940,7 @@ static init_fnc_t init_sequence_f[] = {
 #endif
 #ifdef CONFIG_X86
        dram_init_f,            /* configure available RAM banks */
-       /* x86 would prefer that this happens after relocation */
-       dram_init,
+       calculate_relocation_address,
 #endif
        announce_dram_init,
        /* TODO: unify all these dram functions? */
@@ -1004,9 +1087,3 @@ void board_init_f_r(void)
        hang();
 }
 #endif /* CONFIG_X86 */
-
-void hang(void)
-{
-       puts("### ERROR ### Please RESET the board ###\n");
-       for (;;);
-}
index 9605f80..f801e41 100644 (file)
@@ -136,7 +136,7 @@ static int initr_reloc_global_data(void)
 {
 #ifdef CONFIG_SYS_SYM_OFFSETS
        monitor_flash_len = _end_ofs;
-#else
+#elif !defined(CONFIG_SANDBOX)
        monitor_flash_len = (ulong)&__init_end - gd->dest_addr;
 #endif
 #if defined(CONFIG_MPC85xx) || defined(CONFIG_MPC86xx)
@@ -264,7 +264,8 @@ static int initr_malloc(void)
 
        /* The malloc area is immediately below the monitor copy in DRAM */
        malloc_start = gd->dest_addr - TOTAL_MALLOC_LEN;
-       mem_malloc_init(malloc_start, TOTAL_MALLOC_LEN);
+       mem_malloc_init((ulong)map_sysmem(malloc_start, TOTAL_MALLOC_LEN),
+                       TOTAL_MALLOC_LEN);
        return 0;
 }
 
@@ -691,6 +692,9 @@ static int initr_modem(void)
 
 static int run_main_loop(void)
 {
+#ifdef CONFIG_SANDBOX
+       sandbox_main_loop_init();
+#endif
        /* main_loop() can return to retry autoboot, if so just run it again */
        for (;;)
                main_loop();
@@ -721,9 +725,6 @@ init_fnc_t init_sequence_r[] = {
         */
 #ifdef CONFIG_CLOCKS
        set_cpu_clk_info, /* Setup clock information */
-#endif
-#ifdef CONFIG_X86
-       init_bd_struct_r,
 #endif
        initr_reloc_global_data,
        initr_serial,
index ac77a08..edefd77 100644 (file)
@@ -31,6 +31,7 @@
 #include <asm/global_data.h>
 #include <libfdt.h>
 #include <fdt_support.h>
+#include <asm/io.h>
 
 #define MAX_LEVEL      32              /* how deeply nested we will go */
 #define SCRATCHPAD     1024            /* bytes of scratchpad memory */
@@ -43,7 +44,7 @@
  */
 DECLARE_GLOBAL_DATA_PTR;
 
-static int fdt_valid(void);
+static int fdt_valid(struct fdt_header **blobp);
 static int fdt_parse_prop(char *const*newval, int count, char *data, int *len);
 static int fdt_print(const char *pathp, char *prop, int depth);
 static int is_printable_string(const void *data, int len);
@@ -55,7 +56,10 @@ struct fdt_header *working_fdt;
 
 void set_working_fdt_addr(void *addr)
 {
-       working_fdt = addr;
+       void *buf;
+
+       buf = map_sysmem((ulong)addr, 0);
+       working_fdt = buf;
        setenv_addr("fdtaddr", addr);
 }
 
@@ -100,40 +104,59 @@ static int do_fdt(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
         */
        if (argv[1][0] == 'a') {
                unsigned long addr;
+               int control = 0;
+               struct fdt_header *blob;
                /*
                 * Set the address [and length] of the fdt.
                 */
-               if (argc == 2) {
-                       if (!fdt_valid()) {
+               argc -= 2;
+               argv += 2;
+/* Temporary #ifdef - some archs don't have fdt_blob yet */
+#ifdef CONFIG_OF_CONTROL
+               if (argc && !strcmp(*argv, "-c")) {
+                       control = 1;
+                       argc--;
+                       argv++;
+               }
+#endif
+               if (argc == 0) {
+                       if (control)
+                               blob = (struct fdt_header *)gd->fdt_blob;
+                       else
+                               blob = working_fdt;
+                       if (!blob || !fdt_valid(&blob))
                                return 1;
-                       }
-                       printf("The address of the fdt is %p\n", working_fdt);
+                       printf("The address of the fdt is %#08lx\n",
+                              control ? (ulong)blob :
+                                       getenv_hex("fdtaddr", 0));
                        return 0;
                }
 
-               addr = simple_strtoul(argv[2], NULL, 16);
-               set_working_fdt_addr((void *)addr);
-
-               if (!fdt_valid()) {
+               addr = simple_strtoul(argv[0], NULL, 16);
+               blob = map_sysmem(addr, 0);
+               if (!fdt_valid(&blob))
                        return 1;
-               }
+               if (control)
+                       gd->fdt_blob = blob;
+               else
+                       set_working_fdt_addr(blob);
 
-               if (argc >= 4) {
+               if (argc >= 2) {
                        int  len;
                        int  err;
                        /*
                         * Optional new length
                         */
-                       len = simple_strtoul(argv[3], NULL, 16);
-                       if (len < fdt_totalsize(working_fdt)) {
+                       len = simple_strtoul(argv[1], NULL, 16);
+                       if (len < fdt_totalsize(blob)) {
                                printf ("New length %d < existing length %d, "
                                        "ignoring.\n",
-                                       len, fdt_totalsize(working_fdt));
+                                       len, fdt_totalsize(blob));
                        } else {
                                /*
                                 * Open in place with a new length.
                                 */
-                               err = fdt_open_into(working_fdt, working_fdt, len);
+                               err = fdt_open_into(blob, blob, len);
                                if (err != 0) {
                                        printf ("libfdt fdt_open_into(): %s\n",
                                                fdt_strerror(err));
@@ -167,9 +190,8 @@ static int do_fdt(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
                 * Set the address and length of the fdt.
                 */
                working_fdt = (struct fdt_header *)simple_strtoul(argv[2], NULL, 16);
-               if (!fdt_valid()) {
+               if (!fdt_valid(&working_fdt))
                        return 1;
-               }
 
                newaddr = (struct fdt_header *)simple_strtoul(argv[3],NULL,16);
 
@@ -592,16 +614,23 @@ static int do_fdt(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
 
 /****************************************************************************/
 
-static int fdt_valid(void)
+/**
+ * fdt_valid() - Check if an FDT is valid. If not, change it to NULL
+ *
+ * @blobp: Pointer to FDT pointer
+ * @return 1 if OK, 0 if bad (in which case *blobp is set to NULL)
+ */
+static int fdt_valid(struct fdt_header **blobp)
 {
-       int  err;
+       const void *blob = *blobp;
+       int err;
 
-       if (working_fdt == NULL) {
+       if (blob == NULL) {
                printf ("The address of the fdt is invalid (NULL).\n");
                return 0;
        }
 
-       err = fdt_check_header(working_fdt);
+       err = fdt_check_header(blob);
        if (err == 0)
                return 1;       /* valid */
 
@@ -611,23 +640,21 @@ static int fdt_valid(void)
                 * Be more informative on bad version.
                 */
                if (err == -FDT_ERR_BADVERSION) {
-                       if (fdt_version(working_fdt) <
+                       if (fdt_version(blob) <
                            FDT_FIRST_SUPPORTED_VERSION) {
                                printf (" - too old, fdt %d < %d",
-                                       fdt_version(working_fdt),
+                                       fdt_version(blob),
                                        FDT_FIRST_SUPPORTED_VERSION);
-                               working_fdt = NULL;
                        }
-                       if (fdt_last_comp_version(working_fdt) >
+                       if (fdt_last_comp_version(blob) >
                            FDT_LAST_SUPPORTED_VERSION) {
                                printf (" - too new, fdt %d > %d",
-                                       fdt_version(working_fdt),
+                                       fdt_version(blob),
                                        FDT_LAST_SUPPORTED_VERSION);
-                               working_fdt = NULL;
                        }
-                       return 0;
                }
                printf("\n");
+               *blobp = NULL;
                return 0;
        }
        return 1;
@@ -958,7 +985,7 @@ static int fdt_print(const char *pathp, char *prop, int depth)
 /********************************************************************/
 #ifdef CONFIG_SYS_LONGHELP
 static char fdt_help_text[] =
-       "addr   <addr> [<length>]        - Set the fdt location to <addr>\n"
+       "addr [-c]  <addr> [<length>]   - Set the [control] fdt location to <addr>\n"
 #ifdef CONFIG_OF_BOARD_SETUP
        "fdt boardsetup                      - Do board-specific set up\n"
 #endif
index 1834246..5e1d037 100644 (file)
  */
 #include <common.h>
 #include <command.h>
-#if defined(CONFIG_CMD_NET)
-#include <net.h>
-#endif
 #include <fpga.h>
 #include <malloc.h>
 
 /* Local functions */
-static int fpga_get_op (char *opstr);
+static int fpga_get_op(char *opstr);
 
 /* Local defines */
 #define FPGA_NONE   -1
@@ -44,102 +41,6 @@ static int fpga_get_op (char *opstr);
 #define FPGA_DUMP   3
 #define FPGA_LOADMK 4
 
-/* Convert bitstream data and load into the fpga */
-int fpga_loadbitstream(unsigned long dev, char* fpgadata, size_t size)
-{
-#if defined(CONFIG_FPGA_XILINX)
-       unsigned int length;
-       unsigned int swapsize;
-       char buffer[80];
-       unsigned char *dataptr;
-       unsigned int i;
-       int rc;
-
-       dataptr = (unsigned char *)fpgadata;
-
-       /* skip the first bytes of the bitsteam, their meaning is unknown */
-       length = (*dataptr << 8) + *(dataptr+1);
-       dataptr+=2;
-       dataptr+=length;
-
-       /* get design name (identifier, length, string) */
-       length = (*dataptr << 8) + *(dataptr+1);
-       dataptr+=2;
-       if (*dataptr++ != 0x61) {
-               debug("%s: Design name identifier not recognized "
-                       "in bitstream\n",
-                       __func__);
-               return FPGA_FAIL;
-       }
-
-       length = (*dataptr << 8) + *(dataptr+1);
-       dataptr+=2;
-       for(i=0;i<length;i++)
-               buffer[i] = *dataptr++;
-
-       printf("  design filename = \"%s\"\n", buffer);
-
-       /* get part number (identifier, length, string) */
-       if (*dataptr++ != 0x62) {
-               printf("%s: Part number identifier not recognized "
-                       "in bitstream\n",
-                       __func__);
-               return FPGA_FAIL;
-       }
-
-       length = (*dataptr << 8) + *(dataptr+1);
-       dataptr+=2;
-       for(i=0;i<length;i++)
-               buffer[i] = *dataptr++;
-       printf("  part number = \"%s\"\n", buffer);
-
-       /* get date (identifier, length, string) */
-       if (*dataptr++ != 0x63) {
-               printf("%s: Date identifier not recognized in bitstream\n",
-                      __func__);
-               return FPGA_FAIL;
-       }
-
-       length = (*dataptr << 8) + *(dataptr+1);
-       dataptr+=2;
-       for(i=0;i<length;i++)
-               buffer[i] = *dataptr++;
-       printf("  date = \"%s\"\n", buffer);
-
-       /* get time (identifier, length, string) */
-       if (*dataptr++ != 0x64) {
-               printf("%s: Time identifier not recognized in bitstream\n",
-                       __func__);
-               return FPGA_FAIL;
-       }
-
-       length = (*dataptr << 8) + *(dataptr+1);
-       dataptr+=2;
-       for(i=0;i<length;i++)
-               buffer[i] = *dataptr++;
-       printf("  time = \"%s\"\n", buffer);
-
-       /* get fpga data length (identifier, length) */
-       if (*dataptr++ != 0x65) {
-               printf("%s: Data length identifier not recognized in bitstream\n",
-                       __func__);
-               return FPGA_FAIL;
-       }
-       swapsize = ((unsigned int) *dataptr     <<24) +
-                  ((unsigned int) *(dataptr+1) <<16) +
-                  ((unsigned int) *(dataptr+2) <<8 ) +
-                  ((unsigned int) *(dataptr+3)     ) ;
-       dataptr+=4;
-       printf("  bytes in bitstream = %d\n", swapsize);
-
-       rc = fpga_load(dev, dataptr, swapsize);
-       return rc;
-#else
-       printf("Bitstream support only for Xilinx devices\n");
-       return FPGA_FAIL;
-#endif
-}
-
 /* ------------------------------------------------------------------------- */
 /* command form:
  *   fpga <op> <device number> <data addr> <datasize>
@@ -148,81 +49,81 @@ int fpga_loadbitstream(unsigned long dev, char* fpgadata, size_t size)
  * If there is no data addr field, the fpgadata environment variable is used.
  * The info command requires no data address field.
  */
-int do_fpga (cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[])
+int do_fpga(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
 {
        int op, dev = FPGA_INVALID_DEVICE;
        size_t data_size = 0;
        void *fpga_data = NULL;
-       char *devstr = getenv ("fpga");
-       char *datastr = getenv ("fpgadata");
+       char *devstr = getenv("fpga");
+       char *datastr = getenv("fpgadata");
        int rc = FPGA_FAIL;
        int wrong_parms = 0;
-#if defined (CONFIG_FIT)
+#if defined(CONFIG_FIT)
        const char *fit_uname = NULL;
        ulong fit_addr;
 #endif
 
        if (devstr)
-               dev = (int) simple_strtoul (devstr, NULL, 16);
+               dev = (int) simple_strtoul(devstr, NULL, 16);
        if (datastr)
-               fpga_data = (void *) simple_strtoul (datastr, NULL, 16);
+               fpga_data = (void *)simple_strtoul(datastr, NULL, 16);
 
        switch (argc) {
        case 5:         /* fpga <op> <dev> <data> <datasize> */
-               data_size = simple_strtoul (argv[4], NULL, 16);
+               data_size = simple_strtoul(argv[4], NULL, 16);
 
        case 4:         /* fpga <op> <dev> <data> */
 #if defined(CONFIG_FIT)
-               if (fit_parse_subimage (argv[3], (ulong)fpga_data,
-                                       &fit_addr, &fit_uname)) {
+               if (fit_parse_subimage(argv[3], (ulong)fpga_data,
+                                      &fit_addr, &fit_uname)) {
                        fpga_data = (void *)fit_addr;
-                       debug("*  fpga: subimage '%s' from FIT image "
-                               "at 0x%08lx\n",
-                               fit_uname, fit_addr);
+                       debug("*  fpga: subimage '%s' from FIT image ",
+                             fit_uname);
+                       debug("at 0x%08lx\n", fit_addr);
                } else
 #endif
                {
-                       fpga_data = (void *) simple_strtoul (argv[3], NULL, 16);
+                       fpga_data = (void *)simple_strtoul(argv[3], NULL, 16);
                        debug("*  fpga: cmdline image address = 0x%08lx\n",
-                               (ulong)fpga_data);
+                             (ulong)fpga_data);
                }
-               debug("%s: fpga_data = 0x%x\n", __func__, (uint) fpga_data);
+               debug("%s: fpga_data = 0x%x\n", __func__, (uint)fpga_data);
 
        case 3:         /* fpga <op> <dev | data addr> */
-               dev = (int) simple_strtoul (argv[2], NULL, 16);
+               dev = (int)simple_strtoul(argv[2], NULL, 16);
                debug("%s: device = %d\n", __func__, dev);
                /* FIXME - this is a really weak test */
-               if ((argc == 3) && (dev > fpga_count ())) {     /* must be buffer ptr */
+               if ((argc == 3) && (dev > fpga_count())) {
+                       /* must be buffer ptr */
                        debug("%s: Assuming buffer pointer in arg 3\n",
-                               __func__);
+                             __func__);
 
 #if defined(CONFIG_FIT)
-                       if (fit_parse_subimage (argv[2], (ulong)fpga_data,
-                                               &fit_addr, &fit_uname)) {
+                       if (fit_parse_subimage(argv[2], (ulong)fpga_data,
+                                              &fit_addr, &fit_uname)) {
                                fpga_data = (void *)fit_addr;
-                               debug("*  fpga: subimage '%s' from FIT image "
-                                       "at 0x%08lx\n",
-                                       fit_uname, fit_addr);
+                               debug("*  fpga: subimage '%s' from FIT image ",
+                                     fit_uname);
+                               debug("at 0x%08lx\n", fit_addr);
                        } else
 #endif
                        {
-                               fpga_data = (void *) dev;
-                               debug("*  fpga: cmdline image address = "
-                                       "0x%08lx\n", (ulong)fpga_data);
+                               fpga_data = (void *)dev;
+                               debug("*  fpga: cmdline image addr = 0x%08lx\n",
+                                     (ulong)fpga_data);
                        }
 
                        debug("%s: fpga_data = 0x%x\n",
-                               __func__, (uint) fpga_data);
+                             __func__, (uint)fpga_data);
                        dev = FPGA_INVALID_DEVICE;      /* reset device num */
                }
 
        case 2:         /* fpga <op> */
-               op = (int) fpga_get_op (argv[1]);
+               op = (int)fpga_get_op(argv[1]);
                break;
 
        default:
-               debug("%s: Too many or too few args (%d)\n",
-                       __func__, argc);
+               debug("%s: Too many or too few args (%d)\n", __func__, argc);
                op = FPGA_NONE; /* force usage display */
                break;
        }
@@ -258,11 +159,11 @@ int do_fpga (cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[])
                return CMD_RET_USAGE;
 
        case FPGA_INFO:
-               rc = fpga_info (dev);
+               rc = fpga_info(dev);
                break;
 
        case FPGA_LOAD:
-               rc = fpga_load (dev, fpga_data, data_size);
+               rc = fpga_load(dev, fpga_data, data_size);
                break;
 
        case FPGA_LOADB:
@@ -270,15 +171,16 @@ int do_fpga (cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[])
                break;
 
        case FPGA_LOADMK:
-               switch (genimg_get_format (fpga_data)) {
+               switch (genimg_get_format(fpga_data)) {
                case IMAGE_FORMAT_LEGACY:
                        {
-                               image_header_t *hdr = (image_header_t *)fpga_data;
-                               ulong   data;
+                               image_header_t *hdr =
+                                               (image_header_t *)fpga_data;
+                               ulong data;
 
-                               data = (ulong)image_get_data (hdr);
-                               data_size = image_get_data_size (hdr);
-                               rc = fpga_load (dev, (void *)data, data_size);
+                               data = (ulong)image_get_data(hdr);
+                               data_size = image_get_data_size(hdr);
+                               rc = fpga_load(dev, (void *)data, data_size);
                        }
                        break;
 #if defined(CONFIG_FIT)
@@ -289,95 +191,97 @@ int do_fpga (cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[])
                                const void *fit_data;
 
                                if (fit_uname == NULL) {
-                                       puts ("No FIT subimage unit name\n");
+                                       puts("No FIT subimage unit name\n");
                                        return 1;
                                }
 
-                               if (!fit_check_format (fit_hdr)) {
-                                       puts ("Bad FIT image format\n");
+                               if (!fit_check_format(fit_hdr)) {
+                                       puts("Bad FIT image format\n");
                                        return 1;
                                }
 
                                /* get fpga component image node offset */
-                               noffset = fit_image_get_node (fit_hdr, fit_uname);
+                               noffset = fit_image_get_node(fit_hdr,
+                                                            fit_uname);
                                if (noffset < 0) {
-                                       printf ("Can't find '%s' FIT subimage\n", fit_uname);
+                                       printf("Can't find '%s' FIT subimage\n",
+                                              fit_uname);
                                        return 1;
                                }
 
                                /* verify integrity */
-                               if (!fit_image_check_hashes (fit_hdr, noffset)) {
-                                       puts ("Bad Data Hash\n");
+                               if (!fit_image_check_hashes(fit_hdr, noffset)) {
+                                       puts("Bad Data Hash\n");
                                        return 1;
                                }
 
                                /* get fpga subimage data address and length */
-                               if (fit_image_get_data (fit_hdr, noffset, &fit_data, &data_size)) {
-                                       puts ("Could not find fpga subimage data\n");
+                               if (fit_image_get_data(fit_hdr, noffset,
+                                                      &fit_data, &data_size)) {
+                                       puts("Fpga subimage data not found\n");
                                        return 1;
                                }
 
-                               rc = fpga_load (dev, fit_data, data_size);
+                               rc = fpga_load(dev, fit_data, data_size);
                        }
                        break;
 #endif
                default:
-                       puts ("** Unknown image type\n");
+                       puts("** Unknown image type\n");
                        rc = FPGA_FAIL;
                        break;
                }
                break;
 
        case FPGA_DUMP:
-               rc = fpga_dump (dev, fpga_data, data_size);
+               rc = fpga_dump(dev, fpga_data, data_size);
                break;
 
        default:
-               printf ("Unknown operation\n");
+               printf("Unknown operation\n");
                return CMD_RET_USAGE;
        }
-       return (rc);
+       return rc;
 }
 
 /*
  * Map op to supported operations.  We don't use a table since we
  * would just have to relocate it from flash anyway.
  */
-static int fpga_get_op (char *opstr)
+static int fpga_get_op(char *opstr)
 {
        int op = FPGA_NONE;
 
-       if (!strcmp ("info", opstr)) {
+       if (!strcmp("info", opstr))
                op = FPGA_INFO;
-       } else if (!strcmp ("loadb", opstr)) {
+       else if (!strcmp("loadb", opstr))
                op = FPGA_LOADB;
-       } else if (!strcmp ("load", opstr)) {
+       else if (!strcmp("load", opstr))
                op = FPGA_LOAD;
-       } else if (!strcmp ("loadmk", opstr)) {
+       else if (!strcmp("loadmk", opstr))
                op = FPGA_LOADMK;
-       } else if (!strcmp ("dump", opstr)) {
+       else if (!strcmp("dump", opstr))
                op = FPGA_DUMP;
-       }
 
-       if (op == FPGA_NONE) {
-               printf ("Unknown fpga operation \"%s\"\n", opstr);
-       }
+       if (op == FPGA_NONE)
+               printf("Unknown fpga operation \"%s\"\n", opstr);
+
        return op;
 }
 
-U_BOOT_CMD (fpga, 6, 1, do_fpga,
-       "loadable FPGA image support",
-       "[operation type] [device number] [image address] [image size]\n"
-       "fpga operations:\n"
-       "  dump\t[dev]\t\t\tLoad device to memory buffer\n"
-       "  info\t[dev]\t\t\tlist known device information\n"
-       "  load\t[dev] [address] [size]\tLoad device from memory buffer\n"
-       "  loadb\t[dev] [address] [size]\t"
-       "Load device from bitstream buffer (Xilinx only)\n"
-       "  loadmk [dev] [address]\tLoad device generated with mkimage"
+U_BOOT_CMD(fpga, 6, 1, do_fpga,
+          "loadable FPGA image support",
+          "[operation type] [device number] [image address] [image size]\n"
+          "fpga operations:\n"
+          "  dump\t[dev]\t\t\tLoad device to memory buffer\n"
+          "  info\t[dev]\t\t\tlist known device information\n"
+          "  load\t[dev] [address] [size]\tLoad device from memory buffer\n"
+          "  loadb\t[dev] [address] [size]\t"
+          "Load device from bitstream buffer (Xilinx only)\n"
+          "  loadmk [dev] [address]\tLoad device generated with mkimage"
 #if defined(CONFIG_FIT)
-       "\n"
-       "\tFor loadmk operating on FIT format uImage address must include\n"
-       "\tsubimage unit name in the form of addr:<subimg_uname>"
+          "\n"
+          "\tFor loadmk operating on FIT format uImage address must include\n"
+          "\tsubimage unit name in the form of addr:<subimg_uname>"
 #endif
 );
index 0105bdb..78b4aa7 100644 (file)
@@ -455,6 +455,8 @@ void ide_init(void)
                ide_dev_desc[i].dev = i;
                ide_dev_desc[i].part_type = PART_TYPE_UNKNOWN;
                ide_dev_desc[i].blksz = 0;
+               ide_dev_desc[i].log2blksz =
+                       LOG2_INVALID(typeof(ide_dev_desc[i].log2blksz));
                ide_dev_desc[i].lba = 0;
                ide_dev_desc[i].block_read = ide_read;
                ide_dev_desc[i].block_write = ide_write;
@@ -806,6 +808,7 @@ static void ide_ident(block_dev_desc_t *dev_desc)
        /* assuming HD */
        dev_desc->type = DEV_TYPE_HARDDISK;
        dev_desc->blksz = ATA_BLOCKSIZE;
+       dev_desc->log2blksz = LOG2(dev_desc->blksz);
        dev_desc->lun = 0;      /* just to fill something in... */
 
 #if 0                          /* only used to test the powersaving mode,
@@ -1448,6 +1451,7 @@ static void atapi_inquiry(block_dev_desc_t *dev_desc)
        dev_desc->lun = 0;
        dev_desc->lba = 0;
        dev_desc->blksz = 0;
+       dev_desc->log2blksz = LOG2_INVALID(typeof(dev_desc->log2blksz));
        dev_desc->type = iobuf[0] & 0x1f;
 
        if ((iobuf[1] & 0x80) == 0x80)
@@ -1492,6 +1496,7 @@ static void atapi_inquiry(block_dev_desc_t *dev_desc)
        dev_desc->blksz = ((unsigned long) iobuf[4] << 24) +
                ((unsigned long) iobuf[5] << 16) +
                ((unsigned long) iobuf[6] << 8) + ((unsigned long) iobuf[7]);
+       dev_desc->log2blksz = LOG2(dev_desc->blksz);
 #ifdef CONFIG_LBA48
        /* ATAPI devices cannot use 48bit addressing (ATA/ATAPI v7) */
        dev_desc->lba48 = 0;
index 9f3d6c5..7d82469 100644 (file)
@@ -106,7 +106,7 @@ static void print_mmcinfo(struct mmc *mmc)
        printf("Rd Block Len: %d\n", mmc->read_bl_len);
 
        printf("%s version %d.%d\n", IS_SD(mmc) ? "SD" : "MMC",
-                       (mmc->version >> 4) & 0xf, mmc->version & 0xf);
+                       (mmc->version >> 8) & 0xf, mmc->version & 0xff);
 
        printf("High Capacity: %s\n", mmc->high_capacity ? "Yes" : "No");
        puts("Capacity: ");
index afa128e..f8dc38e 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * (C) Copyright 2000-2010
+ * (C) Copyright 2000-2013
  * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
  *
  * (C) Copyright 2001 Sysgo Real-Time Solutions, GmbH <www.elinos.com>
@@ -96,7 +96,7 @@ int get_env_id(void)
 static int env_print(char *name, int flag)
 {
        char *res = NULL;
-       size_t len;
+       ssize_t len;
 
        if (name) {             /* print a single name */
                ENTRY e, *ep;
@@ -120,6 +120,7 @@ static int env_print(char *name, int flag)
        }
 
        /* should never happen */
+       printf("## Error: cannot export environment\n");
        return 0;
 }
 
@@ -163,31 +164,57 @@ static int do_env_print(cmd_tbl_t *cmdtp, int flag, int argc,
 static int do_env_grep(cmd_tbl_t *cmdtp, int flag,
                       int argc, char * const argv[])
 {
-       ENTRY *match;
-       unsigned char matched[env_htab.size / 8];
-       int rcode = 1, arg = 1, idx;
+       char *res = NULL;
+       int len, grep_how, grep_what;
 
        if (argc < 2)
                return CMD_RET_USAGE;
 
-       memset(matched, 0, env_htab.size / 8);
+       grep_how  = H_MATCH_SUBSTR;     /* default: substring search    */
+       grep_what = H_MATCH_BOTH;       /* default: grep names and values */
 
-       while (arg <= argc) {
-               idx = 0;
-               while ((idx = hstrstr_r(argv[arg], idx, &match, &env_htab))) {
-                       if (!(matched[idx / 8] & (1 << (idx & 7)))) {
-                               puts(match->key);
-                               puts("=");
-                               puts(match->data);
-                               puts("\n");
+       while (argc > 1 && **(argv + 1) == '-') {
+               char *arg = *++argv;
+
+               --argc;
+               while (*++arg) {
+                       switch (*arg) {
+#ifdef CONFIG_REGEX
+                       case 'e':               /* use regex matching */
+                               grep_how  = H_MATCH_REGEX;
+                               break;
+#endif
+                       case 'n':               /* grep for name */
+                               grep_what = H_MATCH_KEY;
+                               break;
+                       case 'v':               /* grep for value */
+                               grep_what = H_MATCH_DATA;
+                               break;
+                       case 'b':               /* grep for both */
+                               grep_what = H_MATCH_BOTH;
+                               break;
+                       case '-':
+                               goto DONE;
+                       default:
+                               return CMD_RET_USAGE;
                        }
-                       matched[idx / 8] |= 1 << (idx & 7);
-                       rcode = 0;
                }
-               arg++;
        }
 
-       return rcode;
+DONE:
+       len = hexport_r(&env_htab, '\n',
+                       flag | grep_what | grep_how,
+                       &res, 0, argc, argv);
+
+       if (len > 0) {
+               puts(res);
+               free(res);
+       }
+
+       if (len < 2)
+               return 1;
+
+       return 0;
 }
 #endif
 #endif /* CONFIG_SPL_BUILD */
@@ -314,6 +341,21 @@ int setenv_hex(const char *varname, ulong value)
        return setenv(varname, str);
 }
 
+ulong getenv_hex(const char *varname, ulong default_val)
+{
+       const char *s;
+       ulong value;
+       char *endp;
+
+       s = getenv(varname);
+       if (s)
+               value = simple_strtoul(s, &endp, 16);
+       if (!s || endp == s)
+               return default_val;
+
+       return value;
+}
+
 #ifndef CONFIG_SPL_BUILD
 static int do_env_set(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
 {
@@ -876,7 +918,9 @@ NXTARG:             ;
        argv++;
 
        if (sep) {              /* export as text file */
-               len = hexport_r(&env_htab, sep, 0, &addr, size, argc, argv);
+               len = hexport_r(&env_htab, sep,
+                               H_MATCH_KEY | H_MATCH_IDENT,
+                               &addr, size, argc, argv);
                if (len < 0) {
                        error("Cannot export environment: errno = %d\n", errno);
                        return 1;
@@ -894,7 +938,9 @@ NXTARG:             ;
        else                    /* export as raw binary data */
                res = addr;
 
-       len = hexport_r(&env_htab, '\0', 0, &res, ENV_SIZE, argc, argv);
+       len = hexport_r(&env_htab, '\0',
+                       H_MATCH_KEY | H_MATCH_IDENT,
+                       &res, ENV_SIZE, argc, argv);
        if (len < 0) {
                error("Cannot export environment: errno = %d\n", errno);
                return 1;
@@ -1113,7 +1159,11 @@ static char env_help_text[] =
        "env flags - print variables that have non-default flags\n"
 #endif
 #if defined(CONFIG_CMD_GREPENV)
-       "env grep string [...] - search environment\n"
+#ifdef CONFIG_REGEX
+       "env grep [-e] [-n | -v | -b] string [...] - search environment\n"
+#else
+       "env grep [-n | -v | -b] string [...] - search environment\n"
+#endif
 #endif
 #if defined(CONFIG_CMD_IMPORTENV)
        "env import [-d] [-t | -b | -c] addr [size] - import environment\n"
@@ -1160,8 +1210,17 @@ U_BOOT_CMD_COMPLETE(
 U_BOOT_CMD_COMPLETE(
        grepenv, CONFIG_SYS_MAXARGS, 0,  do_env_grep,
        "search environment variables",
-       "string ...\n"
-       "    - list environment name=value pairs matching 'string'",
+#ifdef CONFIG_REGEX
+       "[-e] [-n | -v | -b] string ...\n"
+#else
+       "[-n | -v | -b] string ...\n"
+#endif
+       "    - list environment name=value pairs matching 'string'\n"
+#ifdef CONFIG_REGEX
+       "      \"-e\": enable regular expressions;\n"
+#endif
+       "      \"-n\": search variable names; \"-v\": search values;\n"
+       "      \"-b\": search both names and values (default)",
        var_complete
 );
 #endif
index 206a486..a28a844 100644 (file)
@@ -32,9 +32,16 @@ static int do_sandbox_ls(cmd_tbl_t *cmdtp, int flag, int argc,
        return do_ls(cmdtp, flag, argc, argv, FS_TYPE_SANDBOX);
 }
 
+static int do_sandbox_save(cmd_tbl_t *cmdtp, int flag, int argc,
+                          char * const argv[])
+{
+       return do_save(cmdtp, flag, argc, argv, FS_TYPE_SANDBOX, 16);
+}
+
 static cmd_tbl_t cmd_sandbox_sub[] = {
-       U_BOOT_CMD_MKENT(load, 3, 0, do_sandbox_load, "", ""),
+       U_BOOT_CMD_MKENT(load, 7, 0, do_sandbox_load, "", ""),
        U_BOOT_CMD_MKENT(ls, 3, 0, do_sandbox_ls, "", ""),
+       U_BOOT_CMD_MKENT(save, 6, 0, do_sandbox_save, "", ""),
 };
 
 static int do_sandbox(cmd_tbl_t *cmdtp, int flag, int argc,
@@ -56,8 +63,11 @@ static int do_sandbox(cmd_tbl_t *cmdtp, int flag, int argc,
 }
 
 U_BOOT_CMD(
-       sb,     6,      1,      do_sandbox,
+       sb,     8,      1,      do_sandbox,
        "Miscellaneous sandbox commands",
-       "load host <addr> <filename> [<bytes> <offset>]  - load a file from host\n"
-       "sb ls host <filename>      - save a file to host"
+       "load host <dev> <addr> <filename> [<bytes> <offset>]  - "
+               "load a file from host\n"
+       "sb ls host <filename>                      - list files on host\n"
+       "sb save host <dev> <filename> <addr> <bytes> [<offset>] - "
+               "save a file to host\n"
 );
index 8d57285..5a57a37 100644 (file)
@@ -44,6 +44,7 @@ int __sata_initialize(void)
                sata_dev_desc[i].type = DEV_TYPE_HARDDISK;
                sata_dev_desc[i].lba = 0;
                sata_dev_desc[i].blksz = 512;
+               sata_dev_desc[i].log2blksz = LOG2(sata_dev_desc[i].blksz);
                sata_dev_desc[i].block_read = sata_read;
                sata_dev_desc[i].block_write = sata_write;
 
index 13b3d99..294d9f5 100644 (file)
@@ -106,6 +106,8 @@ void scsi_scan(int mode)
                scsi_dev_desc[i].lun=0xff;
                scsi_dev_desc[i].lba=0;
                scsi_dev_desc[i].blksz=0;
+               scsi_dev_desc[i].log2blksz =
+                       LOG2_INVALID(typeof(scsi_dev_desc[i].log2blksz));
                scsi_dev_desc[i].type=DEV_TYPE_UNKNOWN;
                scsi_dev_desc[i].vendor[0]=0;
                scsi_dev_desc[i].product[0]=0;
@@ -166,6 +168,8 @@ void scsi_scan(int mode)
                        }
                        scsi_dev_desc[scsi_max_devs].lba=capacity;
                        scsi_dev_desc[scsi_max_devs].blksz=blksz;
+                       scsi_dev_desc[scsi_max_devs].log2blksz =
+                               LOG2(scsi_dev_desc[scsi_max_devs].blksz);
                        scsi_dev_desc[scsi_max_devs].type=perq;
                        init_part(&scsi_dev_desc[scsi_max_devs]);
 removable:
index 7a38e94..93cb255 100644 (file)
@@ -1,5 +1,6 @@
 /*
  * Copyright 2008 Freescale Semiconductor, Inc.
+ * Copyright 2013 Wolfgang Denk <wd@denx.de>
  *
  * See file CREDITS for list of people who contributed to this
  * project.
@@ -50,28 +51,295 @@ static ulong get_arg(char *s, int w)
        }
 }
 
+#ifdef CONFIG_REGEX
+
+#include <slre.h>
+
+#define SLRE_BUFSZ     16384
+#define SLRE_PATSZ     4096
+
+/*
+ * memstr - Find the first substring in memory
+ * @s1: The string to be searched
+ * @s2: The string to search for
+ *
+ * Similar to and based on strstr(),
+ * but strings do not need to be NUL terminated.
+ */
+static char *memstr(const char *s1, int l1, const char *s2, int l2)
+{
+       if (!l2)
+               return (char *)s1;
+
+       while (l1 >= l2) {
+               l1--;
+               if (!memcmp(s1, s2, l2))
+                       return (char *)s1;
+               s1++;
+       }
+       return NULL;
+}
+
+static char *substitute(char *string,  /* string buffer */
+                       int *slen,      /* current string length */
+                       int ssize,      /* string bufer size */
+                       const char *old,/* old (replaced) string */
+                       int olen,       /* length of old string */
+                       const char *new,/* new (replacement) string */
+                       int nlen)       /* length of new string */
+{
+       char *p = memstr(string, *slen, old, olen);
+
+       if (p == NULL)
+               return NULL;
+
+       debug("## Match at pos %ld: match len %d, subst len %d\n",
+               (long)(p - string), olen, nlen);
+
+       /* make sure replacement matches */
+       if (*slen + nlen - olen > ssize) {
+               printf("## error: substitution buffer overflow\n");
+               return NULL;
+       }
+
+       /* move tail if needed */
+       if (olen != nlen) {
+               int tail, len;
+
+               len = (olen > nlen) ? olen : nlen;
+
+               tail = ssize - (p + len - string);
+
+               debug("## tail len %d\n", tail);
+
+               memmove(p + nlen, p + olen, tail);
+       }
+
+       /* insert substitue */
+       memcpy(p, new, nlen);
+
+       *slen += nlen - olen;
+
+       return p + nlen;
+}
+
+/*
+ * Perform regex operations on a environment variable
+ *
+ * Returns 0 if OK, 1 in case of errors.
+ */
+static int regex_sub(const char *name,
+       const char *r, const char *s, const char *t,
+       int global)
+{
+       struct slre slre;
+       char data[SLRE_BUFSZ];
+       char *datap = data;
+       const char *value;
+       int res, len, nlen, loop;
+
+       if (name == NULL)
+               return 1;
+
+       if (slre_compile(&slre, r) == 0) {
+               printf("Error compiling regex: %s\n", slre.err_str);
+               return 1;
+       }
+
+       if (t == NULL) {
+               value = getenv(name);
+
+               if (value == NULL) {
+                       printf("## Error: variable \"%s\" not defined\n", name);
+                       return 1;
+               }
+               t = value;
+       }
+
+       debug("REGEX on %s=%s\n", name, t);
+       debug("REGEX=\"%s\", SUBST=\"%s\", GLOBAL=%d\n",
+               r, s ? s : "<NULL>", global);
+
+       len = strlen(t);
+       if (len + 1 > SLRE_BUFSZ) {
+               printf("## error: subst buffer overflow: have %d, need %d\n",
+                       SLRE_BUFSZ, len + 1);
+               return 1;
+       }
+
+       strcpy(data, t);
+
+       if (s == NULL)
+               nlen = 0;
+       else
+               nlen = strlen(s);
+
+       for (loop = 0;; loop++) {
+               struct cap caps[slre.num_caps + 2];
+               char nbuf[SLRE_PATSZ];
+               const char *old;
+               char *np;
+               int i, olen;
+
+               (void) memset(caps, 0, sizeof(caps));
+
+               res = slre_match(&slre, datap, len, caps);
+
+               debug("Result: %d\n", res);
+
+               for (i = 0; i < slre.num_caps; i++) {
+                       if (caps[i].len > 0) {
+                               debug("Substring %d: [%.*s]\n", i,
+                                       caps[i].len, caps[i].ptr);
+                       }
+               }
+
+               if (res == 0) {
+                       if (loop == 0) {
+                               printf("%s: No match\n", t);
+                               return 1;
+                       } else {
+                               break;
+                       }
+               }
+
+               debug("## MATCH ## %s\n", data);
+
+               if (s == NULL) {
+                       printf("%s=%s\n", name, t);
+                       return 1;
+               }
+
+               old = caps[0].ptr;
+               olen = caps[0].len;
+
+               if (nlen + 1 >= SLRE_PATSZ) {
+                       printf("## error: pattern buffer overflow: have %d, need %d\n",
+                               SLRE_BUFSZ, nlen + 1);
+                       return 1;
+               }
+               strcpy(nbuf, s);
+
+               debug("## SUBST(1) ## %s\n", nbuf);
+
+               /*
+                * Handle back references
+                *
+                * Support for \0 ... \9, where \0 is the
+                * whole matched pattern (similar to &).
+                *
+                * Implementation is a bit simpleminded as
+                * backrefs are substituted sequentially, one
+                * by one.  This will lead to somewhat
+                * unexpected results if the replacement
+                * strings contain any \N strings then then
+                * may get substitued, too.  We accept this
+                * restriction for the sake of simplicity.
+                */
+               for (i = 0; i < 10; ++i) {
+                       char backref[2] = {
+                               '\\',
+                               '0',
+                       };
+
+                       if (caps[i].len == 0)
+                               break;
+
+                       backref[1] += i;
+
+                       debug("## BACKREF %d: replace \"%.*s\" by \"%.*s\" in \"%s\"\n",
+                               i,
+                               2, backref,
+                               caps[i].len, caps[i].ptr,
+                               nbuf);
+
+                       for (np = nbuf;;) {
+                               char *p = memstr(np, nlen, backref, 2);
+
+                               if (p == NULL)
+                                       break;
+
+                               np = substitute(np, &nlen,
+                                       SLRE_PATSZ,
+                                       backref, 2,
+                                       caps[i].ptr, caps[i].len);
+
+                               if (np == NULL)
+                                       return 1;
+                       }
+               }
+               debug("## SUBST(2) ## %s\n", nbuf);
+
+               datap = substitute(datap, &len, SLRE_BUFSZ,
+                               old, olen,
+                               nbuf, nlen);
+
+               if (datap == NULL)
+                       return 1;
+
+               debug("## REMAINDER: %s\n", datap);
+
+               debug("## RESULT: %s\n", data);
+
+               if (!global)
+                       break;
+       }
+       debug("## FINAL (now setenv()) :  %s\n", data);
+
+       printf("%s=%s\n", name, data);
+
+       return setenv(name, data);
+}
+#endif
+
 static int do_setexpr(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
 {
        ulong a, b;
        ulong value;
        int w;
 
-       /* Validate arguments */
-       if (argc != 5 && argc != 3)
-               return CMD_RET_USAGE;
-       if (argc == 5 && strlen(argv[3]) != 1)
+       /*
+        * We take 3, 5, or 6 arguments:
+        * 3 : setexpr name value
+        * 5 : setexpr name val1 op val2
+        *     setexpr name [g]sub r s
+        * 6 : setexpr name [g]sub r s t
+        */
+
+       /* > 6 already tested by max command args */
+       if ((argc < 3) || (argc == 4))
                return CMD_RET_USAGE;
 
        w = cmd_get_data_size(argv[0], 4);
 
        a = get_arg(argv[2], w);
 
+       /* plain assignment: "setexpr name value" */
        if (argc == 3) {
                setenv_hex(argv[1], a);
-
                return 0;
        }
 
+       /* 5 or 6 args (6 args only with [g]sub) */
+#ifdef CONFIG_REGEX
+       /*
+        * rexep handling: "setexpr name [g]sub r s [t]"
+        * with 5 args, "t" will be NULL
+        */
+       if (strcmp(argv[2], "gsub") == 0)
+               return regex_sub(argv[1], argv[3], argv[4], argv[5], 1);
+
+       if (strcmp(argv[2], "sub") == 0)
+               return regex_sub(argv[1], argv[3], argv[4], argv[5], 0);
+#endif
+
+       /* standard operators: "setexpr name val1 op val2" */
+       if (argc != 5)
+               return CMD_RET_USAGE;
+
+       if (strlen(argv[3]) != 1)
+               return CMD_RET_USAGE;
+
        b = get_arg(argv[4], w);
 
        switch (argv[3][0]) {
@@ -110,13 +378,23 @@ static int do_setexpr(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
 }
 
 U_BOOT_CMD(
-       setexpr, 5, 0, do_setexpr,
+       setexpr, 6, 0, do_setexpr,
        "set environment variable as the result of eval expression",
        "[.b, .w, .l] name [*]value1 <op> [*]value2\n"
        "    - set environment variable 'name' to the result of the evaluated\n"
-       "      express specified by <op>.  <op> can be &, |, ^, +, -, *, /, %\n"
+       "      expression specified by <op>.  <op> can be &, |, ^, +, -, *, /, %\n"
        "      size argument is only meaningful if value1 and/or value2 are\n"
        "      memory addresses (*)\n"
-       "setexpr[.b, .w, .l] name *value\n"
-       "    - load a memory address into a variable"
+       "setexpr[.b, .w, .l] name [*]value\n"
+       "    - load a value into a variable"
+#ifdef CONFIG_REGEX
+       "\n"
+       "setexpr name gsub r s [t]\n"
+       "    - For each substring matching the regular expression <r> in the\n"
+       "      string <t>, substitute the string <s>.  The result is\n"
+       "      assigned to <name>.  If <t> is not supplied, use the old\n"
+       "      value of <name>\n"
+       "setexpr name sub r s [t]\n"
+       "    - Just like gsub(), but replace only the first matching substring"
+#endif
 );
index 02a862c..f0d7f52 100644 (file)
@@ -36,6 +36,7 @@
 #include <image.h>
 #include <malloc.h>
 #include <asm/byteorder.h>
+#include <asm/io.h>
 #if defined(CONFIG_8xx)
 #include <mpc8xx.h>
 #endif
@@ -44,9 +45,10 @@ int
 source (ulong addr, const char *fit_uname)
 {
        ulong           len;
-       image_header_t  *hdr;
+       const image_header_t *hdr;
        ulong           *data;
        int             verify;
+       void *buf;
 #if defined(CONFIG_FIT)
        const void*     fit_hdr;
        int             noffset;
@@ -56,9 +58,10 @@ source (ulong addr, const char *fit_uname)
 
        verify = getenv_yesno ("verify");
 
-       switch (genimg_get_format ((void *)addr)) {
+       buf = map_sysmem(addr, 0);
+       switch (genimg_get_format(buf)) {
        case IMAGE_FORMAT_LEGACY:
-               hdr = (image_header_t *)addr;
+               hdr = buf;
 
                if (!image_check_magic (hdr)) {
                        puts ("Bad magic number\n");
@@ -104,7 +107,7 @@ source (ulong addr, const char *fit_uname)
                        return 1;
                }
 
-               fit_hdr = (const void *)addr;
+               fit_hdr = buf;
                if (!fit_check_format (fit_hdr)) {
                        puts ("Bad FIT image format\n");
                        return 1;
index 0970a6f..46fae18 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011 The Chromium OS Authors.
+ * Copyright (c) 2013 The Chromium OS Authors.
  *
  * See file CREDITS for list of people who contributed to this
  * project.
 
 #include <common.h>
 #include <command.h>
+#include <malloc.h>
 #include <tpm.h>
+#include <asm/unaligned.h>
+#include <linux/string.h>
 
-#define MAX_TRANSACTION_SIZE 30
+/**
+ * Print a byte string in hexdecimal format, 16-bytes per line.
+ *
+ * @param data         byte string to be printed
+ * @param count                number of bytes to be printed
+ */
+static void print_byte_string(uint8_t *data, size_t count)
+{
+       int i, print_newline = 0;
 
-/*
- * tpm_write() expects a variable number of parameters: the internal address
- * followed by data to write, byte by byte.
+       for (i = 0; i < count; i++) {
+               printf(" %02x", data[i]);
+               print_newline = (i % 16 == 15);
+               if (print_newline)
+                       putc('\n');
+       }
+       /* Avoid duplicated newline at the end */
+       if (!print_newline)
+               putc('\n');
+}
+
+/**
+ * Convert a text string of hexdecimal values into a byte string.
  *
- * Returns 0 on success or -1 on errors (wrong arguments or TPM failure).
+ * @param bytes                text string of hexdecimal values with no space
+ *                     between them
+ * @param data         output buffer for byte string.  The caller has to make
+ *                     sure it is large enough for storing the output.  If
+ *                     NULL is passed, a large enough buffer will be allocated,
+ *                     and the caller must free it.
+ * @param count_ptr    output variable for the length of byte string
+ * @return pointer to output buffer
  */
-static int tpm_process(int argc, char * const argv[], cmd_tbl_t *cmdtp)
-{
-       u8 tpm_buffer[MAX_TRANSACTION_SIZE];
-       u32 write_size, read_size;
-       char *p;
-       int rv = -1;
-
-       for (write_size = 0; write_size < argc; write_size++) {
-               u32 datum = simple_strtoul(argv[write_size], &p, 0);
-               if (*p || (datum > 0xff)) {
-                       printf("\n%s: bad data value\n\n", argv[write_size]);
-                       cmd_usage(cmdtp);
-                       return rv;
-               }
-               tpm_buffer[write_size] = (u8)datum;
+static void *parse_byte_string(char *bytes, uint8_t *data, size_t *count_ptr)
+{
+       char byte[3];
+       size_t count, length;
+       int i;
+
+       length = strlen(bytes);
+       count = length / 2;
+
+       if (!data)
+               data = malloc(count);
+       if (!data)
+               return NULL;
+
+       byte[2] = '\0';
+       for (i = 0; i < length; i += 2) {
+               byte[0] = bytes[i];
+               byte[1] = bytes[i + 1];
+               data[i / 2] = (uint8_t)simple_strtoul(byte, NULL, 16);
        }
 
-       read_size = sizeof(tpm_buffer);
-       if (!tis_sendrecv(tpm_buffer, write_size, tpm_buffer, &read_size)) {
-               int i;
-               puts("Got TPM response:\n");
-               for (i = 0; i < read_size; i++)
-                       printf(" %2.2x", tpm_buffer[i]);
-               puts("\n");
-               rv = 0;
-       } else {
-               puts("tpm command failed\n");
+       if (count_ptr)
+               *count_ptr = count;
+
+       return data;
+}
+
+/**
+ * Convert TPM command return code to U-Boot command error codes.
+ *
+ * @param return_code  TPM command return code
+ * @return value of enum command_ret_t
+ */
+static int convert_return_code(uint32_t return_code)
+{
+       if (return_code)
+               return CMD_RET_FAILURE;
+       else
+               return CMD_RET_SUCCESS;
+}
+
+/**
+ * Return number of values defined by a type string.
+ *
+ * @param type_str     type string
+ * @return number of values of type string
+ */
+static int type_string_get_num_values(const char *type_str)
+{
+       return strlen(type_str);
+}
+
+/**
+ * Return total size of values defined by a type string.
+ *
+ * @param type_str     type string
+ * @return total size of values of type string, or 0 if type string
+ *  contains illegal type character.
+ */
+static size_t type_string_get_space_size(const char *type_str)
+{
+       size_t size;
+
+       for (size = 0; *type_str; type_str++) {
+               switch (*type_str) {
+               case 'b':
+                       size += 1;
+                       break;
+               case 'w':
+                       size += 2;
+                       break;
+               case 'd':
+                       size += 4;
+                       break;
+               default:
+                       return 0;
+               }
        }
-       return rv;
+
+       return size;
 }
 
-#define CHECK(exp) do {                                                        \
-               int _rv = exp;                                          \
-               if (_rv) {                                              \
-                       printf("CHECK: %s %d %x\n", #exp, __LINE__, _rv);\
-               }                                                       \
-       } while (0)
+/**
+ * Allocate a buffer large enough to hold values defined by a type
+ * string.  The caller has to free the buffer.
+ *
+ * @param type_str     type string
+ * @param count                pointer for storing size of buffer
+ * @return pointer to buffer or NULL on error
+ */
+static void *type_string_alloc(const char *type_str, uint32_t *count)
+{
+       void *data;
+       size_t size;
+
+       size = type_string_get_space_size(type_str);
+       if (!size)
+               return NULL;
+       data = malloc(size);
+       if (data)
+               *count = size;
 
-static int tpm_process_stress(int repeat_count)
+       return data;
+}
+
+/**
+ * Pack values defined by a type string into a buffer.  The buffer must have
+ * large enough space.
+ *
+ * @param type_str     type string
+ * @param values       text strings of values to be packed
+ * @param data         output buffer of values
+ * @return 0 on success, non-0 on error
+ */
+static int type_string_pack(const char *type_str, char * const values[],
+               uint8_t *data)
 {
-       int i;
-       int rv = 0;
-       u8 request[] = {0x0, 0xc1,
-                       0x0, 0x0, 0x0, 0x16,
-                       0x0, 0x0, 0x0, 0x65,
-                       0x0, 0x0, 0x0, 0x4,
-                       0x0, 0x0, 0x0, 0x4,
-                       0x0, 0x0, 0x1, 0x9};
-       u8 response[MAX_TRANSACTION_SIZE];
-       u32 rlength = MAX_TRANSACTION_SIZE;
-
-       CHECK(tis_init());
-
-       for (i = 0; i < repeat_count; i++) {
-               CHECK(tis_open());
-               rv = tis_sendrecv(request, sizeof(request), response, &rlength);
-               if (rv) {
-                       printf("tpm test failed at step %d with 0x%x\n", i, rv);
-                       CHECK(tis_close());
+       size_t offset;
+       uint32_t value;
+
+       for (offset = 0; *type_str; type_str++, values++) {
+               value = simple_strtoul(values[0], NULL, 0);
+               switch (*type_str) {
+               case 'b':
+                       data[offset] = value;
+                       offset += 1;
+                       break;
+               case 'w':
+                       put_unaligned_be16(value, data + offset);
+                       offset += 2;
+                       break;
+               case 'd':
+                       put_unaligned_be32(value, data + offset);
+                       offset += 4;
                        break;
+               default:
+                       return -1;
                }
-               CHECK(tis_close());
-               if ((response[6] || response[7] || response[8] || response[9])
-                   && response[9] != 0x26) {
-                       /* Ignore postinit errors */
-                       printf("tpm command failed at step %d\n"
-                              "tpm error code: %02x%02x%02x%02x\n", i,
-                              response[6], response[7],
-                              response[8], response[9]);
-                       rv = -1;
+       }
+
+       return 0;
+}
+
+/**
+ * Read values defined by a type string from a buffer, and write these values
+ * to environment variables.
+ *
+ * @param type_str     type string
+ * @param data         input buffer of values
+ * @param vars         names of environment variables
+ * @return 0 on success, non-0 on error
+ */
+static int type_string_write_vars(const char *type_str, uint8_t *data,
+               char * const vars[])
+{
+       size_t offset;
+       uint32_t value;
+
+       for (offset = 0; *type_str; type_str++, vars++) {
+               switch (*type_str) {
+               case 'b':
+                       value = data[offset];
+                       offset += 1;
+                       break;
+               case 'w':
+                       value = get_unaligned_be16(data + offset);
+                       offset += 2;
                        break;
+               case 'd':
+                       value = get_unaligned_be32(data + offset);
+                       offset += 4;
+                       break;
+               default:
+                       return -1;
                }
+               if (setenv_ulong(*vars, value))
+                       return -1;
        }
-       return rv;
+
+       return 0;
 }
 
+static int do_tpm_startup(cmd_tbl_t *cmdtp, int flag,
+               int argc, char * const argv[])
+{
+       enum tpm_startup_type mode;
 
-static int do_tpm_many(cmd_tbl_t *cmdtp, int flag,
-                      int argc, char * const argv[], int repeat_count)
+       if (argc != 2)
+               return CMD_RET_USAGE;
+       if (!strcasecmp("TPM_ST_CLEAR", argv[1])) {
+               mode = TPM_ST_CLEAR;
+       } else if (!strcasecmp("TPM_ST_STATE", argv[1])) {
+               mode = TPM_ST_STATE;
+       } else if (!strcasecmp("TPM_ST_DEACTIVATED", argv[1])) {
+               mode = TPM_ST_DEACTIVATED;
+       } else {
+               printf("Couldn't recognize mode string: %s\n", argv[1]);
+               return CMD_RET_FAILURE;
+       }
+
+       return convert_return_code(tpm_startup(mode));
+}
+
+static int do_tpm_nv_define_space(cmd_tbl_t *cmdtp, int flag,
+               int argc, char * const argv[])
+{
+       uint32_t index, perm, size;
+
+       if (argc != 4)
+               return CMD_RET_USAGE;
+       index = simple_strtoul(argv[1], NULL, 0);
+       perm = simple_strtoul(argv[2], NULL, 0);
+       size = simple_strtoul(argv[3], NULL, 0);
+
+       return convert_return_code(tpm_nv_define_space(index, perm, size));
+}
 
+static int do_tpm_nv_read_value(cmd_tbl_t *cmdtp, int flag,
+               int argc, char * const argv[])
 {
-       int rv = 0;
+       uint32_t index, count, rc;
+       void *data;
 
-       if (argc < 7 && repeat_count == 0) {
-               puts("command should be at least six bytes in size\n");
-               return -1;
+       if (argc != 4)
+               return CMD_RET_USAGE;
+       index = simple_strtoul(argv[1], NULL, 0);
+       data = (void *)simple_strtoul(argv[2], NULL, 0);
+       count = simple_strtoul(argv[3], NULL, 0);
+
+       rc = tpm_nv_read_value(index, data, count);
+       if (!rc) {
+               puts("area content:\n");
+               print_byte_string(data, count);
        }
 
-       if (repeat_count > 0) {
-               rv = tpm_process_stress(repeat_count);
-               return rv;
+       return convert_return_code(rc);
+}
+
+static int do_tpm_nv_write_value(cmd_tbl_t *cmdtp, int flag,
+               int argc, char * const argv[])
+{
+       uint32_t index, rc;
+       size_t count;
+       void *data;
+
+       if (argc != 3)
+               return CMD_RET_USAGE;
+       index = simple_strtoul(argv[1], NULL, 0);
+       data = parse_byte_string(argv[2], NULL, &count);
+       if (!data) {
+               printf("Couldn't parse byte string %s\n", argv[2]);
+               return CMD_RET_FAILURE;
        }
 
-       if (tis_init()) {
-               puts("tis_init() failed!\n");
-               return -1;
+       rc = tpm_nv_write_value(index, data, count);
+       free(data);
+
+       return convert_return_code(rc);
+}
+
+static int do_tpm_extend(cmd_tbl_t *cmdtp, int flag,
+               int argc, char * const argv[])
+{
+       uint32_t index, rc;
+       uint8_t in_digest[20], out_digest[20];
+
+       if (argc != 3)
+               return CMD_RET_USAGE;
+       index = simple_strtoul(argv[1], NULL, 0);
+       if (!parse_byte_string(argv[2], in_digest, NULL)) {
+               printf("Couldn't parse byte string %s\n", argv[2]);
+               return CMD_RET_FAILURE;
        }
 
-       if (tis_open()) {
-               puts("tis_open() failed!\n");
-               return -1;
+       rc = tpm_extend(index, in_digest, out_digest);
+       if (!rc) {
+               puts("PCR value after execution of the command:\n");
+               print_byte_string(out_digest, sizeof(out_digest));
        }
 
-       rv = tpm_process(argc - 1, argv + 1, cmdtp);
+       return convert_return_code(rc);
+}
+
+static int do_tpm_pcr_read(cmd_tbl_t *cmdtp, int flag,
+               int argc, char * const argv[])
+{
+       uint32_t index, count, rc;
+       void *data;
+
+       if (argc != 4)
+               return CMD_RET_USAGE;
+       index = simple_strtoul(argv[1], NULL, 0);
+       data = (void *)simple_strtoul(argv[2], NULL, 0);
+       count = simple_strtoul(argv[3], NULL, 0);
 
-       if (tis_close()) {
-               puts("tis_close() failed!\n");
-               rv = -1;
+       rc = tpm_pcr_read(index, data, count);
+       if (!rc) {
+               puts("Named PCR content:\n");
+               print_byte_string(data, count);
        }
 
-       return rv;
+       return convert_return_code(rc);
 }
 
+static int do_tpm_tsc_physical_presence(cmd_tbl_t *cmdtp, int flag,
+               int argc, char * const argv[])
+{
+       uint16_t presence;
+
+       if (argc != 2)
+               return CMD_RET_USAGE;
+       presence = (uint16_t)simple_strtoul(argv[1], NULL, 0);
 
-static int do_tpm(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
+       return convert_return_code(tpm_tsc_physical_presence(presence));
+}
+
+static int do_tpm_read_pubek(cmd_tbl_t *cmdtp, int flag,
+               int argc, char * const argv[])
 {
-       return do_tpm_many(cmdtp, flag, argc, argv, 0);
+       uint32_t count, rc;
+       void *data;
+
+       if (argc != 3)
+               return CMD_RET_USAGE;
+       data = (void *)simple_strtoul(argv[1], NULL, 0);
+       count = simple_strtoul(argv[2], NULL, 0);
+
+       rc = tpm_read_pubek(data, count);
+       if (!rc) {
+               puts("pubek value:\n");
+               print_byte_string(data, count);
+       }
+
+       return convert_return_code(rc);
 }
 
+static int do_tpm_physical_set_deactivated(cmd_tbl_t *cmdtp, int flag,
+               int argc, char * const argv[])
+{
+       uint8_t state;
+
+       if (argc != 2)
+               return CMD_RET_USAGE;
+       state = (uint8_t)simple_strtoul(argv[1], NULL, 0);
 
-U_BOOT_CMD(tpm, MAX_TRANSACTION_SIZE, 1, do_tpm,
-          "<byte> [<byte> ...]   - write data and read response",
-          "send arbitrary data (at least 6 bytes) to the TPM "
-          "device and read the response"
-);
+       return convert_return_code(tpm_physical_set_deactivated(state));
+}
+
+static int do_tpm_get_capability(cmd_tbl_t *cmdtp, int flag,
+               int argc, char * const argv[])
+{
+       uint32_t cap_area, sub_cap, rc;
+       void *cap;
+       size_t count;
+
+       if (argc != 5)
+               return CMD_RET_USAGE;
+       cap_area = simple_strtoul(argv[1], NULL, 0);
+       sub_cap = simple_strtoul(argv[2], NULL, 0);
+       cap = (void *)simple_strtoul(argv[3], NULL, 0);
+       count = simple_strtoul(argv[4], NULL, 0);
+
+       rc = tpm_get_capability(cap_area, sub_cap, cap, count);
+       if (!rc) {
+               puts("capability information:\n");
+               print_byte_string(cap, count);
+       }
+
+       return convert_return_code(rc);
+}
 
-static int do_tpm_stress(cmd_tbl_t *cmdtp, int flag,
-                        int argc, char * const argv[])
+#define TPM_COMMAND_NO_ARG(cmd)                                \
+static int do_##cmd(cmd_tbl_t *cmdtp, int flag,                \
+               int argc, char * const argv[])          \
+{                                                      \
+       if (argc != 1)                                  \
+               return CMD_RET_USAGE;                   \
+       return convert_return_code(cmd());              \
+}
+
+TPM_COMMAND_NO_ARG(tpm_init)
+TPM_COMMAND_NO_ARG(tpm_self_test_full)
+TPM_COMMAND_NO_ARG(tpm_continue_self_test)
+TPM_COMMAND_NO_ARG(tpm_force_clear)
+TPM_COMMAND_NO_ARG(tpm_physical_enable)
+TPM_COMMAND_NO_ARG(tpm_physical_disable)
+
+static int do_tpm_raw_transfer(cmd_tbl_t *cmdtp, int flag,
+               int argc, char * const argv[])
+{
+       void *command;
+       uint8_t response[1024];
+       size_t count, response_length = sizeof(response);
+       uint32_t rc;
+
+       command = parse_byte_string(argv[1], NULL, &count);
+       if (!command) {
+               printf("Couldn't parse byte string %s\n", argv[1]);
+               return CMD_RET_FAILURE;
+       }
+
+       rc = tis_sendrecv(command, count, response, &response_length);
+       free(command);
+       if (!rc) {
+               puts("tpm response:\n");
+               print_byte_string(response, response_length);
+       }
+
+       return convert_return_code(rc);
+}
+
+static int do_tpm_nv_define(cmd_tbl_t *cmdtp, int flag,
+               int argc, char * const argv[])
+{
+       uint32_t index, perm, size;
+
+       if (argc != 4)
+               return CMD_RET_USAGE;
+       size = type_string_get_space_size(argv[1]);
+       if (!size) {
+               printf("Couldn't parse arguments\n");
+               return CMD_RET_USAGE;
+       }
+       index = simple_strtoul(argv[2], NULL, 0);
+       perm = simple_strtoul(argv[3], NULL, 0);
+
+       return convert_return_code(tpm_nv_define_space(index, perm, size));
+}
+
+static int do_tpm_nv_read(cmd_tbl_t *cmdtp, int flag,
+               int argc, char * const argv[])
 {
-       long unsigned int n;
-       int rv;
+       uint32_t index, count, err;
+       void *data;
 
-       if (argc != 2) {
-               puts("usage: tpm_stress <count>\n");
-               return -1;
+       if (argc < 3)
+               return CMD_RET_USAGE;
+       if (argc != 3 + type_string_get_num_values(argv[1]))
+               return CMD_RET_USAGE;
+       index = simple_strtoul(argv[2], NULL, 0);
+       data = type_string_alloc(argv[1], &count);
+       if (!data) {
+               printf("Couldn't parse arguments\n");
+               return CMD_RET_USAGE;
        }
 
-       rv = strict_strtoul(argv[1], 10, &n);
-       if (rv) {
-               puts("tpm_stress: bad count");
-               return -1;
+       err = tpm_nv_read_value(index, data, count);
+       if (!err) {
+               if (type_string_write_vars(argv[1], data, argv + 3)) {
+                       printf("Couldn't write to variables\n");
+                       err = ~0;
+               }
        }
+       free(data);
+
+       return convert_return_code(err);
+}
+
+static int do_tpm_nv_write(cmd_tbl_t *cmdtp, int flag,
+               int argc, char * const argv[])
+{
+       uint32_t index, count, err;
+       void *data;
+
+       if (argc < 3)
+               return CMD_RET_USAGE;
+       if (argc != 3 + type_string_get_num_values(argv[1]))
+               return CMD_RET_USAGE;
+       index = simple_strtoul(argv[2], NULL, 0);
+       data = type_string_alloc(argv[1], &count);
+       if (!data) {
+               printf("Couldn't parse arguments\n");
+               return CMD_RET_USAGE;
+       }
+       if (type_string_pack(argv[1], argv + 3, data)) {
+               printf("Couldn't parse arguments\n");
+               free(data);
+               return CMD_RET_USAGE;
+       }
+
+       err = tpm_nv_write_value(index, data, count);
+       free(data);
+
+       return convert_return_code(err);
+}
+
+#define MAKE_TPM_CMD_ENTRY(cmd) \
+       U_BOOT_CMD_MKENT(cmd, 0, 1, do_tpm_ ## cmd, "", "")
+
+static cmd_tbl_t tpm_commands[] = {
+       U_BOOT_CMD_MKENT(init, 0, 1,
+                       do_tpm_init, "", ""),
+       U_BOOT_CMD_MKENT(startup, 0, 1,
+                       do_tpm_startup, "", ""),
+       U_BOOT_CMD_MKENT(self_test_full, 0, 1,
+                       do_tpm_self_test_full, "", ""),
+       U_BOOT_CMD_MKENT(continue_self_test, 0, 1,
+                       do_tpm_continue_self_test, "", ""),
+       U_BOOT_CMD_MKENT(force_clear, 0, 1,
+                       do_tpm_force_clear, "", ""),
+       U_BOOT_CMD_MKENT(physical_enable, 0, 1,
+                       do_tpm_physical_enable, "", ""),
+       U_BOOT_CMD_MKENT(physical_disable, 0, 1,
+                       do_tpm_physical_disable, "", ""),
+       U_BOOT_CMD_MKENT(nv_define_space, 0, 1,
+                       do_tpm_nv_define_space, "", ""),
+       U_BOOT_CMD_MKENT(nv_read_value, 0, 1,
+                       do_tpm_nv_read_value, "", ""),
+       U_BOOT_CMD_MKENT(nv_write_value, 0, 1,
+                       do_tpm_nv_write_value, "", ""),
+       U_BOOT_CMD_MKENT(extend, 0, 1,
+                       do_tpm_extend, "", ""),
+       U_BOOT_CMD_MKENT(pcr_read, 0, 1,
+                       do_tpm_pcr_read, "", ""),
+       U_BOOT_CMD_MKENT(tsc_physical_presence, 0, 1,
+                       do_tpm_tsc_physical_presence, "", ""),
+       U_BOOT_CMD_MKENT(read_pubek, 0, 1,
+                       do_tpm_read_pubek, "", ""),
+       U_BOOT_CMD_MKENT(physical_set_deactivated, 0, 1,
+                       do_tpm_physical_set_deactivated, "", ""),
+       U_BOOT_CMD_MKENT(get_capability, 0, 1,
+                       do_tpm_get_capability, "", ""),
+       U_BOOT_CMD_MKENT(raw_transfer, 0, 1,
+                       do_tpm_raw_transfer, "", ""),
+       U_BOOT_CMD_MKENT(nv_define, 0, 1,
+                       do_tpm_nv_define, "", ""),
+       U_BOOT_CMD_MKENT(nv_read, 0, 1,
+                       do_tpm_nv_read, "", ""),
+       U_BOOT_CMD_MKENT(nv_write, 0, 1,
+                       do_tpm_nv_write, "", ""),
+};
+
+static int do_tpm(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
+{
+       cmd_tbl_t *tpm_cmd;
+
+       if (argc < 2)
+               return CMD_RET_USAGE;
+       tpm_cmd = find_cmd_tbl(argv[1], tpm_commands, ARRAY_SIZE(tpm_commands));
+       if (!tpm_cmd)
+               return CMD_RET_USAGE;
 
-       return do_tpm_many(cmdtp, flag, argc, argv, n);
+       return tpm_cmd->cmd(cmdtp, flag, argc - 1, argv + 1);
 }
 
-U_BOOT_CMD(tpm_stress, 2, 1, do_tpm_stress,
-          "<n>   - stress-test communication with TPM",
-          "Repeat a TPM transaction (request-response) N times"
+U_BOOT_CMD(tpm, CONFIG_SYS_MAXARGS, 1, do_tpm,
+"Issue a TPM command",
+"cmd args...\n"
+"    - Issue TPM command <cmd> with arguments <args...>.\n"
+"Admin Startup and State Commands:\n"
+"  init\n"
+"    - Put TPM into a state where it waits for 'startup' command.\n"
+"  startup mode\n"
+"    - Issue TPM_Starup command.  <mode> is one of TPM_ST_CLEAR,\n"
+"      TPM_ST_STATE, and TPM_ST_DEACTIVATED.\n"
+"Admin Testing Commands:\n"
+"  self_test_full\n"
+"    - Test all of the TPM capabilities.\n"
+"  continue_self_test\n"
+"    - Inform TPM that it should complete the self-test.\n"
+"Admin Opt-in Commands:\n"
+"  physical_enable\n"
+"    - Set the PERMANENT disable flag to FALSE using physical presence as\n"
+"      authorization.\n"
+"  physical_disable\n"
+"    - Set the PERMANENT disable flag to TRUE using physical presence as\n"
+"      authorization.\n"
+"  physical_set_deactivated 0|1\n"
+"    - Set deactivated flag.\n"
+"Admin Ownership Commands:\n"
+"  force_clear\n"
+"    - Issue TPM_ForceClear command.\n"
+"  tsc_physical_presence flags\n"
+"    - Set TPM device's Physical Presence flags to <flags>.\n"
+"The Capability Commands:\n"
+"  get_capability cap_area sub_cap addr count\n"
+"    - Read <count> bytes of TPM capability indexed by <cap_area> and\n"
+"      <sub_cap> to memory address <addr>.\n"
+"Endorsement Key Handling Commands:\n"
+"  read_pubek addr count\n"
+"    - Read <count> bytes of the public endorsement key to memory\n"
+"      address <addr>\n"
+"Integrity Collection and Reporting Commands:\n"
+"  extend index digest_hex_string\n"
+"    - Add a new measurement to a PCR.  Update PCR <index> with the 20-bytes\n"
+"      <digest_hex_string>\n"
+"  pcr_read index addr count\n"
+"    - Read <count> bytes from PCR <index> to memory address <addr>.\n"
+"Non-volatile Storage Commands:\n"
+"  nv_define_space index permission size\n"
+"    - Establish a space at index <index> with <permission> of <size> bytes.\n"
+"  nv_read_value index addr count\n"
+"    - Read <count> bytes from space <index> to memory address <addr>.\n"
+"  nv_write_value index addr count\n"
+"    - Write <count> bytes from memory address <addr> to space <index>.\n"
+"Miscellaneous helper functions:\n"
+"  raw_transfer byte_string\n"
+"    - Send a byte string <byte_string> to TPM and print the response.\n"
+" Non-volatile storage helper functions:\n"
+"    These helper functions treat a non-volatile space as a non-padded\n"
+"    sequence of integer values.  These integer values are defined by a type\n"
+"    string, which is a text string of 'bwd' characters: 'b' means a 8-bit\n"
+"    value, 'w' 16-bit value, 'd' 32-bit value.  All helper functions take\n"
+"    a type string as their first argument.\n"
+"  nv_define type_string index perm\n"
+"    - Define a space <index> with permission <perm>.\n"
+"  nv_read types_string index vars...\n"
+"    - Read from space <index> to environment variables <vars...>.\n"
+"  nv_write types_string index values...\n"
+"    - Write to space <index> from values <values...>.\n"
 );
index 02bd5ae..9ca098f 100644 (file)
 #include <search.h>
 #include <errno.h>
 
+#if defined(CONFIG_ENV_SIZE_REDUND) &&  \
+       (CONFIG_ENV_SIZE_REDUND != CONFIG_ENV_SIZE)
+#error CONFIG_ENV_SIZE_REDUND should be the same as CONFIG_ENV_SIZE
+#endif
+
 char *env_name_spec = "MMC";
 
 #ifdef ENV_IS_EMBEDDED
@@ -46,9 +51,13 @@ DECLARE_GLOBAL_DATA_PTR;
 #define CONFIG_ENV_OFFSET 0
 #endif
 
-__weak int mmc_get_env_addr(struct mmc *mmc, u32 *env_addr)
+__weak int mmc_get_env_addr(struct mmc *mmc, int copy, u32 *env_addr)
 {
        *env_addr = CONFIG_ENV_OFFSET;
+#ifdef CONFIG_ENV_OFFSET_REDUND
+       if (copy)
+               *env_addr = CONFIG_ENV_OFFSET_REDUND;
+#endif
        return 0;
 }
 
@@ -110,6 +119,10 @@ static inline int write_env(struct mmc *mmc, unsigned long size,
        return (n == blk_cnt) ? 0 : -1;
 }
 
+#ifdef CONFIG_ENV_OFFSET_REDUND
+static unsigned char env_flags;
+#endif
+
 int saveenv(void)
 {
        ALLOC_CACHE_ALIGN_BUFFER(env_t, env_new, 1);
@@ -117,16 +130,11 @@ int saveenv(void)
        char    *res;
        struct mmc *mmc = find_mmc_device(CONFIG_SYS_MMC_ENV_DEV);
        u32     offset;
-       int     ret;
+       int     ret, copy = 0;
 
        if (init_mmc_for_env(mmc))
                return 1;
 
-       if (mmc_get_env_addr(mmc, &offset)) {
-               ret = 1;
-               goto fini;
-       }
-
        res = (char *)&env_new->data;
        len = hexport_r(&env_htab, '\0', 0, &res, ENV_SIZE, 0, NULL);
        if (len < 0) {
@@ -136,7 +144,21 @@ int saveenv(void)
        }
 
        env_new->crc = crc32(0, &env_new->data[0], ENV_SIZE);
-       printf("Writing to MMC(%d)... ", CONFIG_SYS_MMC_ENV_DEV);
+
+#ifdef CONFIG_ENV_OFFSET_REDUND
+       env_new->flags  = ++env_flags; /* increase the serial */
+
+       if (gd->env_valid == 1)
+               copy = 1;
+#endif
+
+       if (mmc_get_env_addr(mmc, copy, &offset)) {
+               ret = 1;
+               goto fini;
+       }
+
+       printf("Writing to %sMMC(%d)... ", copy ? "redundant " : "",
+              CONFIG_SYS_MMC_ENV_DEV);
        if (write_env(mmc, CONFIG_ENV_SIZE, offset, (u_char *)env_new)) {
                puts("failed\n");
                ret = 1;
@@ -146,6 +168,10 @@ int saveenv(void)
        puts("done\n");
        ret = 0;
 
+#ifdef CONFIG_ENV_OFFSET_REDUND
+       gd->env_valid = gd->env_valid == 2 ? 1 : 2;
+#endif
+
 fini:
        fini_mmc_for_env(mmc);
        return ret;
@@ -166,6 +192,93 @@ static inline int read_env(struct mmc *mmc, unsigned long size,
        return (n == blk_cnt) ? 0 : -1;
 }
 
+#ifdef CONFIG_ENV_OFFSET_REDUND
+void env_relocate_spec(void)
+{
+#if !defined(ENV_IS_EMBEDDED)
+       struct mmc *mmc = find_mmc_device(CONFIG_SYS_MMC_ENV_DEV);
+       u32 offset1, offset2;
+       int read1_fail = 0, read2_fail = 0;
+       int crc1_ok = 0, crc2_ok = 0;
+       env_t *ep, *tmp_env1, *tmp_env2;
+       int ret;
+
+       tmp_env1 = (env_t *)malloc(CONFIG_ENV_SIZE);
+       tmp_env2 = (env_t *)malloc(CONFIG_ENV_SIZE);
+       if (tmp_env1 == NULL || tmp_env2 == NULL) {
+               puts("Can't allocate buffers for environment\n");
+               ret = 1;
+               goto err;
+       }
+
+       if (init_mmc_for_env(mmc)) {
+               ret = 1;
+               goto err;
+       }
+
+       if (mmc_get_env_addr(mmc, 0, &offset1) ||
+           mmc_get_env_addr(mmc, 1, &offset2)) {
+               ret = 1;
+               goto fini;
+       }
+
+       read1_fail = read_env(mmc, CONFIG_ENV_SIZE, offset1, tmp_env1);
+       read2_fail = read_env(mmc, CONFIG_ENV_SIZE, offset2, tmp_env2);
+
+       if (read1_fail && read2_fail)
+               puts("*** Error - No Valid Environment Area found\n");
+       else if (read1_fail || read2_fail)
+               puts("*** Warning - some problems detected "
+                    "reading environment; recovered successfully\n");
+
+       crc1_ok = !read1_fail &&
+               (crc32(0, tmp_env1->data, ENV_SIZE) == tmp_env1->crc);
+       crc2_ok = !read2_fail &&
+               (crc32(0, tmp_env2->data, ENV_SIZE) == tmp_env2->crc);
+
+       if (!crc1_ok && !crc2_ok) {
+               ret = 1;
+               goto fini;
+       } else if (crc1_ok && !crc2_ok) {
+               gd->env_valid = 1;
+       } else if (!crc1_ok && crc2_ok) {
+               gd->env_valid = 2;
+       } else {
+               /* both ok - check serial */
+               if (tmp_env1->flags == 255 && tmp_env2->flags == 0)
+                       gd->env_valid = 2;
+               else if (tmp_env2->flags == 255 && tmp_env1->flags == 0)
+                       gd->env_valid = 1;
+               else if (tmp_env1->flags > tmp_env2->flags)
+                       gd->env_valid = 1;
+               else if (tmp_env2->flags > tmp_env1->flags)
+                       gd->env_valid = 2;
+               else /* flags are equal - almost impossible */
+                       gd->env_valid = 1;
+       }
+
+       free(env_ptr);
+
+       if (gd->env_valid == 1)
+               ep = tmp_env1;
+       else
+               ep = tmp_env2;
+
+       env_flags = ep->flags;
+       env_import((char *)ep, 0);
+       ret = 0;
+
+fini:
+       fini_mmc_for_env(mmc);
+err:
+       if (ret)
+               set_default_env(NULL);
+
+       free(tmp_env1);
+       free(tmp_env2);
+#endif
+}
+#else /* ! CONFIG_ENV_OFFSET_REDUND */
 void env_relocate_spec(void)
 {
 #if !defined(ENV_IS_EMBEDDED)
@@ -179,7 +292,7 @@ void env_relocate_spec(void)
                goto err;
        }
 
-       if (mmc_get_env_addr(mmc, &offset)) {
+       if (mmc_get_env_addr(mmc, 0, &offset)) {
                ret = 1;
                goto fini;
        }
@@ -199,3 +312,4 @@ err:
                set_default_env(NULL);
 #endif
 }
+#endif /* CONFIG_ENV_OFFSET_REDUND */
index 8244ba2..0c57a3f 100644 (file)
@@ -149,6 +149,9 @@ flash_write (char *src, ulong addr, ulong cnt)
        flash_info_t *info_first = addr2info (addr);
        flash_info_t *info_last  = addr2info (end );
        flash_info_t *info;
+       __maybe_unused char *src_orig = src;
+       __maybe_unused char *addr_orig = (char *)addr;
+       __maybe_unused ulong cnt_orig = cnt;
 
        if (cnt == 0) {
                return (ERR_OK);
@@ -185,6 +188,14 @@ flash_write (char *src, ulong addr, ulong cnt)
                addr += len;
                src  += len;
        }
+
+#if defined(CONFIG_FLASH_VERIFY)
+       if (memcmp(src_orig, addr_orig, cnt_orig)) {
+               printf("\nVerify failed!\n");
+               return ERR_PROG_ERROR;
+       }
+#endif /* CONFIG_SYS_FLASH_VERIFY_AFTER_WRITE */
+
        return (ERR_OK);
 #endif /* CONFIG_SPD823TS */
 }
index a15f020..953ef29 100644 (file)
 #include <fdtdec.h>
 #endif
 
-#ifdef CONFIG_OF_LIBFDT
-#include <fdt_support.h>
-#endif /* CONFIG_OF_LIBFDT */
-
 #include <post.h>
 #include <linux/ctype.h>
 #include <menu.h>
@@ -376,10 +372,6 @@ void main_loop (void)
 
        bootstage_mark_name(BOOTSTAGE_ID_MAIN_LOOP, "main_loop");
 
-#if defined CONFIG_OF_CONTROL
-       set_working_fdt_addr((void *)gd->fdt_blob);
-#endif /* CONFIG_OF_CONTROL */
-
 #ifdef CONFIG_BOOTCOUNT_LIMIT
        bootcount = bootcount_load();
        bootcount++;
index 6715e0d..7ce2d5f 100644 (file)
@@ -48,13 +48,6 @@ struct spl_image_info spl_image;
 /* Define board data structure */
 static bd_t bdata __attribute__ ((section(".data")));
 
-inline void hang(void)
-{
-       puts("### ERROR ### Please RESET the board ###\n");
-       for (;;)
-               ;
-}
-
 /*
  * Default function to determine if u-boot or the OS should
  * be started. This implementation always returns 1.
index fb322b4..c5db044 100644 (file)
@@ -1430,6 +1430,7 @@ int usb_stor_get_info(struct usb_device *dev, struct us_data *ss,
                        *capacity, *blksz);
        dev_desc->lba = *capacity;
        dev_desc->blksz = *blksz;
+       dev_desc->log2blksz = LOG2(dev_desc->blksz);
        dev_desc->type = perq;
        USB_STOR_PRINTF(" address %d\n", dev_desc->target);
        USB_STOR_PRINTF("partype: %d\n", dev_desc->part_type);
index 1fd109f..b427a4e 100644 (file)
--- a/config.mk
+++ b/config.mk
@@ -222,6 +222,10 @@ ifneq ($(CONFIG_SPL_PAD_TO),)
 CPPFLAGS += -DCONFIG_SPL_PAD_TO=$(CONFIG_SPL_PAD_TO)
 endif
 
+ifneq ($(CONFIG_UBOOT_PAD_TO),)
+CPPFLAGS += -DCONFIG_UBOOT_PAD_TO=$(CONFIG_UBOOT_PAD_TO)
+endif
+
 ifeq ($(CONFIG_SPL_BUILD),y)
 CPPFLAGS += -DCONFIG_SPL_BUILD
 endif
@@ -229,8 +233,8 @@ endif
 # Does this architecture support generic board init?
 ifeq ($(__HAVE_ARCH_GENERIC_BOARD),)
 ifneq ($(CONFIG_SYS_GENERIC_BOARD),)
-$(error Your architecture does not support generic board. Please undefined \
-CONFIG_SYS_GENERIC_BOARD in your board config file)
+CHECK_GENERIC_BOARD = $(error Your architecture does not support generic board. \
+Please undefined CONFIG_SYS_GENERIC_BOARD in your board config file)
 endif
 endif
 
index 37087a6..ab984cd 100644 (file)
@@ -74,13 +74,26 @@ static void print_one_part(dos_partition_t *p, int ext_part_sector,
 
 static int test_block_type(unsigned char *buffer)
 {
+       int slot;
+       struct dos_partition *p;
+
        if((buffer[DOS_PART_MAGIC_OFFSET + 0] != 0x55) ||
            (buffer[DOS_PART_MAGIC_OFFSET + 1] != 0xaa) ) {
                return (-1);
        } /* no DOS Signature at all */
-       if (strncmp((char *)&buffer[DOS_PBR_FSTYPE_OFFSET],"FAT",3)==0 ||
-           strncmp((char *)&buffer[DOS_PBR32_FSTYPE_OFFSET],"FAT32",5)==0) {
-               return DOS_PBR; /* is PBR */
+       p = (struct dos_partition *)&buffer[DOS_PART_TBL_OFFSET];
+       for (slot = 0; slot < 3; slot++) {
+               if (p->boot_ind != 0 && p->boot_ind != 0x80) {
+                       if (!slot &&
+                           (strncmp((char *)&buffer[DOS_PBR_FSTYPE_OFFSET],
+                                    "FAT", 3) == 0 ||
+                            strncmp((char *)&buffer[DOS_PBR32_FSTYPE_OFFSET],
+                                    "FAT32", 5) == 0)) {
+                               return DOS_PBR; /* is PBR */
+                       } else {
+                               return -1;
+                       }
+               }
        }
        return DOS_MBR;     /* Is MBR */
 }
index e9987f0..5986589 100644 (file)
@@ -115,7 +115,7 @@ static inline int is_bootable(gpt_entry *p)
 
 void print_part_efi(block_dev_desc_t * dev_desc)
 {
-       ALLOC_CACHE_ALIGN_BUFFER(gpt_header, gpt_head, 1);
+       ALLOC_CACHE_ALIGN_BUFFER_PAD(gpt_header, gpt_head, 1, dev_desc->blksz);
        gpt_entry *gpt_pte = NULL;
        int i = 0;
        char uuid[37];
@@ -162,7 +162,7 @@ void print_part_efi(block_dev_desc_t * dev_desc)
 int get_partition_info_efi(block_dev_desc_t * dev_desc, int part,
                                disk_partition_t * info)
 {
-       ALLOC_CACHE_ALIGN_BUFFER(gpt_header, gpt_head, 1);
+       ALLOC_CACHE_ALIGN_BUFFER_PAD(gpt_header, gpt_head, 1, dev_desc->blksz);
        gpt_entry *gpt_pte = NULL;
 
        /* "part" argument must be at least 1 */
@@ -190,7 +190,7 @@ int get_partition_info_efi(block_dev_desc_t * dev_desc, int part,
        /* The ending LBA is inclusive, to calculate size, add 1 to it */
        info->size = ((u64)le64_to_cpu(gpt_pte[part - 1].ending_lba) + 1)
                     - info->start;
-       info->blksz = GPT_BLOCK_SIZE;
+       info->blksz = dev_desc->blksz;
 
        sprintf((char *)info->name, "%s",
                        print_efiname(&gpt_pte[part - 1]));
@@ -210,7 +210,7 @@ int get_partition_info_efi(block_dev_desc_t * dev_desc, int part,
 
 int test_part_efi(block_dev_desc_t * dev_desc)
 {
-       ALLOC_CACHE_ALIGN_BUFFER(legacy_mbr, legacymbr, 1);
+       ALLOC_CACHE_ALIGN_BUFFER_PAD(legacy_mbr, legacymbr, 1, dev_desc->blksz);
 
        /* Read legacy MBR from block 0 and validate it */
        if ((dev_desc->block_read(dev_desc->dev, 0, 1, (ulong *)legacymbr) != 1)
@@ -311,9 +311,8 @@ static int string_uuid(char *uuid, u8 *dst)
 int write_gpt_table(block_dev_desc_t *dev_desc,
                gpt_header *gpt_h, gpt_entry *gpt_e)
 {
-       const int pte_blk_num = (gpt_h->num_partition_entries
-               * sizeof(gpt_entry)) / dev_desc->blksz;
-
+       const int pte_blk_cnt = BLOCK_CNT((gpt_h->num_partition_entries
+                                          * sizeof(gpt_entry)), dev_desc);
        u32 calc_crc32;
        u64 val;
 
@@ -336,8 +335,8 @@ int write_gpt_table(block_dev_desc_t *dev_desc,
        if (dev_desc->block_write(dev_desc->dev, 1, 1, gpt_h) != 1)
                goto err;
 
-       if (dev_desc->block_write(dev_desc->dev, 2, pte_blk_num, gpt_e)
-           != pte_blk_num)
+       if (dev_desc->block_write(dev_desc->dev, 2, pte_blk_cnt, gpt_e)
+           != pte_blk_cnt)
                goto err;
 
        /* recalculate the values for the Second GPT Header */
@@ -352,7 +351,7 @@ int write_gpt_table(block_dev_desc_t *dev_desc,
 
        if (dev_desc->block_write(dev_desc->dev,
                                  le32_to_cpu(gpt_h->last_usable_lba + 1),
-                                 pte_blk_num, gpt_e) != pte_blk_num)
+                                 pte_blk_cnt, gpt_e) != pte_blk_cnt)
                goto err;
 
        if (dev_desc->block_write(dev_desc->dev,
@@ -462,13 +461,18 @@ int gpt_restore(block_dev_desc_t *dev_desc, char *str_disk_guid,
 {
        int ret;
 
-       gpt_header *gpt_h = calloc(1, sizeof(gpt_header));
+       gpt_header *gpt_h = calloc(1, PAD_TO_BLOCKSIZE(sizeof(gpt_header),
+                                                      dev_desc));
+       gpt_entry *gpt_e;
+
        if (gpt_h == NULL) {
                printf("%s: calloc failed!\n", __func__);
                return -1;
        }
 
-       gpt_entry *gpt_e = calloc(GPT_ENTRY_NUMBERS, sizeof(gpt_entry));
+       gpt_e = calloc(1, PAD_TO_BLOCKSIZE(GPT_ENTRY_NUMBERS
+                                              * sizeof(gpt_entry),
+                                              dev_desc));
        if (gpt_e == NULL) {
                printf("%s: calloc failed!\n", __func__);
                free(gpt_h);
@@ -652,7 +656,7 @@ static int is_gpt_valid(block_dev_desc_t * dev_desc, unsigned long long lba,
 static gpt_entry *alloc_read_gpt_entries(block_dev_desc_t * dev_desc,
                                         gpt_header * pgpt_head)
 {
-       size_t count = 0;
+       size_t count = 0, blk_cnt;
        gpt_entry *pte = NULL;
 
        if (!dev_desc || !pgpt_head) {
@@ -669,7 +673,8 @@ static gpt_entry *alloc_read_gpt_entries(block_dev_desc_t * dev_desc,
 
        /* Allocate memory for PTE, remember to FREE */
        if (count != 0) {
-               pte = memalign(ARCH_DMA_MINALIGN, count);
+               pte = memalign(ARCH_DMA_MINALIGN,
+                              PAD_TO_BLOCKSIZE(count, dev_desc));
        }
 
        if (count == 0 || pte == NULL) {
@@ -680,10 +685,11 @@ static gpt_entry *alloc_read_gpt_entries(block_dev_desc_t * dev_desc,
        }
 
        /* Read GPT Entries from device */
+       blk_cnt = BLOCK_CNT(count, dev_desc);
        if (dev_desc->block_read (dev_desc->dev,
                le64_to_cpu(pgpt_head->partition_entry_lba),
-               (lbaint_t) (count / GPT_BLOCK_SIZE), pte)
-               != (count / GPT_BLOCK_SIZE)) {
+               (lbaint_t) (blk_cnt), pte)
+               != blk_cnt) {
 
                printf("*** ERROR: Can't read GPT Entries ***\n");
                free(pte);
index 49639af..cc323b0 100644 (file)
@@ -73,6 +73,9 @@ int get_partition_info_iso_verb(block_dev_desc_t * dev_desc, int part_num, disk_
        iso_val_entry_t *pve = (iso_val_entry_t *)tmpbuf;
        iso_init_def_entry_t *pide;
 
+       if (dev_desc->blksz != CD_SECTSIZE)
+               return -1;
+
        /* the first sector (sector 0x10) must be a primary volume desc */
        blkaddr=PVD_OFFSET;
        if (dev_desc->block_read (dev_desc->dev, PVD_OFFSET, 1, (ulong *) tmpbuf) != 1)
index 8352835..5963f78 100644 (file)
@@ -142,7 +142,11 @@ join the two:
 
 and then flash image.bin onto your board.
 
-You cannot use both of these options at the same time.
+If CONFIG_OF_HOSTFILE is defined, then it will be read from a file on
+startup. This is only useful for sandbox. Use the -d flag to U-Boot to
+specify the file to read.
+
+You cannot use more than one of these options at the same time.
 
 If you wish to put the fdt at a different address in memory, you can
 define the "fdtcontroladdr" environment variable. This is the hex
diff --git a/doc/README.p1010rdb b/doc/README.p1010rdb
new file mode 100644 (file)
index 0000000..dee63d7
--- /dev/null
@@ -0,0 +1,199 @@
+Overview
+=========
+The P1010RDB is a Freescale reference design board that hosts the P1010 SoC.
+
+The P1010 is a cost-effective, low-power, highly integrated host processor
+based on a Power Architecture e500v2 core (maximum core frequency 800/1000 MHz),
+that addresses the requirements of several routing, gateways, storage, consumer,
+and industrial applications. Applications of interest include the main CPUs and
+I/O processors in network attached storage (NAS), the voice over IP (VoIP)
+router/gateway, and wireless LAN (WLAN) and industrial controllers.
+
+The P1010RDB board features are as follows:
+Memory subsystem:
+       - 1Gbyte unbuffered DDR3 SDRAM discrete devices (32-bit bus)
+       - 32 Mbyte NOR flash single-chip memory
+       - 32 Mbyte NAND flash memory
+       - 256 Kbit M24256 I2C EEPROM
+       - 16 Mbyte SPI memory
+       - I2C Board EEPROM 128x8 bit memory
+       - SD/MMC connector to interface with the SD memory card
+Interfaces:
+       - PCIe:
+               - Lane0: x1 mini-PCIe slot
+               - Lane1: x1 PCIe standard slot
+       - SATA:
+               - 1 internal SATA connector to 2.5" 160G SATA2 HDD
+               - 1 eSATA connector to rear panel
+       - 10/100/1000 BaseT Ethernet ports:
+               - eTSEC1, RGMII: one 10/100/1000 port using Vitesse VSC8641XKO
+               - eTSEC2, SGMII: one 10/100/1000 port using Vitesse VSC8221
+               - eTSEC3, SGMII: one 10/100/1000 port using Vitesse VSC8221
+       - USB 2.0 port:
+               - x1 USB2.0 port: via an ULPI PHY to micro-AB connector
+               - x1 USB2.0 poort via an internal PHY to micro-AB connector
+       - FlexCAN ports:
+               - x2 DB-9 female connectors for FlexCAN bus(revision 2.0B)
+                  interface;
+       - DUART interface:
+               - DUART interface: supports two UARTs up to 115200 bps for
+                 console display
+               - J45 connectors are used for these 2 UART ports.
+       - TDM
+               - 2 FXS ports connected via an external SLIC to the TDM
+                  interface. SLIC is controllled via SPI.
+               - 1 FXO port connected via a relay to FXS for switchover to
+                  POTS
+Board connectors:
+       - Mini-ITX power supply connector
+       - JTAG/COP for debugging
+IEEE Std. 1588 signals for test and measurement
+Real-time clock on I2C bus
+POR
+       - support critical POR setting changed via switch on board
+PCB
+       - 6-layer routing (4-layer signals, 2-layer power and ground)
+
+
+Serial Port Configuration on P1010RDB
+=====================================
+Configure the serial port of the attached computer with the following values:
+       -Data rate: 115200 bps
+       -Number of data bits: 8
+       -Parity: None
+       -Number of Stop bits: 1
+       -Flow Control: Hardware/None
+
+
+Settings of DIP-switch
+======================
+  SW4[1:4]= 1111 and SW6[4]=0 for boot from 16bit NOR flash
+  SW4[1:4]= 1000 and SW6[4]=1 for boot from 8bit NAND flash
+  SW4[1:4]= 0110 and SW6[4]=0 for boot from SPI flash
+Note: 1 stands for 'on', 0 stands for 'off'
+
+
+Setting of hwconfig
+===================
+If FlexCAN or TDM is needed, please set "fsl_p1010mux:tdm_can=can" or
+"fsl_p1010mux:tdm_can=tdm" explicitly in u-booot prompt as below for example:
+setenv hwconfig "fsl_p1010mux:tdm_can=tdm;usb1:dr_mode=host,phy_type=utmi"
+By default, don't set fsl_p1010mux:tdm_can, in this case, spi chip selection
+is set to spi-flash instead of to SLIC/TDM/DAC and tdm_can_sel is set to TDM
+instead of to CAN/UART1.
+
+
+Build and burn u-boot to NOR flash
+==================================
+1. Build u-boot.bin image
+       export ARCH=powerpc
+       export CROSS_COMPILE=/your_path/powerpc-linux-gnu-
+       make P1010RDB_NOR
+
+2. Burn u-boot.bin into NOR flash
+       => tftp $loadaddr $uboot
+       => protect off eff80000 +$filesize
+       => erase eff80000 +$filesize
+       => cp.b $loadaddr eff80000 $filesize
+
+3. Check SW4[1:4]= 1111 and SW6[4]=0, then power on.
+
+
+Alternate NOR bank
+============================
+1. Burn u-boot.bin into alternate NOR bank
+       => tftp $loadaddr $uboot
+       => protect off eef80000 +$filesize
+       => erase eef80000 +$filesize
+       => cp.b $loadaddr eef80000 $filesize
+
+2. Switch to alternate NOR bank
+       => mw.b ffb00009 1
+       => reset
+       or set SW1[8]= ON
+
+SW1[8]= OFF: Upper bank used for booting start
+SW1[8]= ON:  Lower bank used for booting start
+CPLD NOR bank selection register address 0xFFB00009 Bit[0]:
+0 - boot from upper 4 sectors
+1 - boot from lower 4 sectors
+
+
+Build and burn u-boot to NAND flash
+===================================
+1. Build u-boot.bin image
+       export ARCH=powerpc
+       export CROSS_COMPILE=/your_path/powerpc-linux-gnu-
+       make P1010RDB_NAND
+
+2. Burn u-boot-nand.bin into NAND flash
+       => tftp $loadaddr $uboot-nand
+       => nand erase 0 $filesize
+       => nand write $loadaddr 0 $filesize
+
+3. Check SW4[1:4]= 1000 and SW6[4]=1, then power on.
+
+
+
+Build and burn u-boot to SPI flash
+==================================
+1. Build u-boot-spi.bin image
+       make P1010RDB_SPIFLASH_config; make
+       Boot up kernel with rootfs.ext2.gz.uboot.p1010rdb
+       Download u-boot.bin to linux and you can find some config files
+       under /usr/share such as config_xx.dat. Do below command:
+       boot_format config_ddr3_1gb_p1010rdb_800M.dat u-boot.bin -spi \
+                       u-boot-spi.bin
+       to generate u-boot-spi.bin.
+
+2. Burn u-boot-spi.bin into SPI flash
+       => tftp $loadaddr $uboot-spi
+       => sf erase 0 100000
+       => sf write $loadaddr 0 $filesize
+
+3. Check SW4[1:4]= 0110 and SW6[4]=0, then power on.
+
+
+
+CPLD POR setting registers
+==========================
+1. Set POR switch selection register (addr 0xFFB00011) to 0.
+2. Write CPLD POR registers (BCSR0~BCSR3, addr 0xFFB00014~0xFFB00017) with
+   proper values.
+   If change boot ROM location to NOR or NAND flash, need write the IFC_CS0
+   switch command by I2C.
+3. Send reset command.
+   After reset, the new POR setting will be implemented.
+
+Two examples are given in below:
+Switch from NOR to NAND boot with default frequency:
+       => i2c dev 0
+       => i2c mw 18 1 f9
+       => i2c mw 18 3 f0
+       => mw.b ffb00011 0
+       => mw.b ffb00017 1
+       => reset
+Switch from NAND to NOR boot with Core/CCB/DDR (800/400/667 MHz):
+       => i2c dev 0
+       => i2c mw 18 1 f1
+       => i2c mw 18 3 f0
+       => mw.b ffb00011 0
+       => mw.b ffb00014 2
+       => mw.b ffb00015 5
+       => mw.b ffb00016 3
+       => mw.b ffb00017 f
+       => reset
+
+
+
+Boot Linux from network using TFTP on P1010RDB
+==============================================
+Place uImage, p1010rdb.dtb and rootfs files in the TFTP disk area.
+       => tftp 1000000 uImage
+       => tftp 2000000 p1010rdb.dtb
+       => tftp 3000000 rootfs.ext2.gz.uboot.p1010rdb
+       => bootm 1000000 3000000 2000000
+
+
+Please contact your local field applications engineer or sales representative
+to obtain related documents, such as P1010-RDB User Guide for details.
diff --git a/doc/README.ramboot-ppc85xx b/doc/README.ramboot-ppc85xx
new file mode 100644 (file)
index 0000000..8ed45fb
--- /dev/null
@@ -0,0 +1,102 @@
+                       RAMBOOT for MPC85xx Platforms
+                       ==============================
+
+RAMBOOT literally means boot from DDR. But since DDR is volatile memory some
+pre-mechanism is required to load the DDR with the bootloader binary.
+- In case of SD and SPI boot this is done by BootROM code inside the chip
+  itself.
+- In case of NAND boot FCM supports loading initial 4K code from NAND flash
+  which can initialize the DDR and get the complete bootloader copied to DDR.
+
+In addition to the above there could be some more methods to initialize the DDR
+and load it manually.
+Two of them are described below.There is also an explanation as to where these
+methods could be handy.
+1. Load the RAM based bootloader onto DDR via JTAG/BDI interface. And then
+   execute the bootloader from DDR.
+   This may be handy in the following cases:
+     - In very early stage of platform bringup where other boot options are not
+       functional because of various reasons.
+     - In case the support to program the flashes on the board is not available.
+
+2. Load the RAM based bootloader onto DDR using already existing bootloader on
+   the board.And then execute the bootloader from DDR.
+   Some usecases where this may be used:
+      - While developing some new feature of u-boot, for example USB driver or
+        SPI driver.
+        Suppose the board already has a working bootloader on it. And you would
+        prefer to keep it intact, at the same time want to test your bootloader.
+        In this case you can get your test bootloader binary into DDR via tftp
+        for example. Then execute the test bootloader.
+     - Suppose a platform already has a propreitery bootloader which does not
+       support for example AMP boot. In this case also RAM boot loader can be
+       utilized.
+
+   So basically when the original bootloader is required to be kept intact
+   RAM based bootloader can offer an updated bootloader on the system.
+
+Both the above Bootloaders are slight variants of SDcard or SPI Flash
+bootloader or for that matter even NAND bootloader.
+All of them define CONFIG_SYS_RAMBOOT.
+The main difference among all of them is the way the pre-environment is getting
+configured and who is doing that.
+- In case of SD card and SPI flash bootloader this is done by On Chip BootROM inside the Si itself.
+- In case of NAND boot SPL/TPL code does it with some support from Si itself.
+- In case of the pure RAM based bootloaders we have to do it by JTAG manually or already existing bootloader.
+
+How to use them:
+1. Using JTAG
+   Boot up in core hold off mode or stop the core after reset using JTAG
+   interface.
+   Preconfigure DDR/L2SRAM through JTAG interface.
+       - setup DDR controller registers.
+       - setup DDR LAWs
+       - setup DDR TLB
+   Load the RAM based boot loader to the proper location in DDR/L2SRAM.
+   set up IAR (Instruction counter properly)
+   Enable the core to execute.
+
+2. Using already existing bootloader.
+   get the rambased boot loader binary into DDR/L2SRAM via tftp.
+   execute the RAM based bootloader.
+      => tftp 11000000 u-boot-ram.bin
+      => go 1107f000
+
+Please note that L2SRAM can also be used instead of DDR if the SOC has
+sufficient size of L2SRAM.
+
+Necessary Code changes Required:
+=====================================
+Please note that below mentioned changes are for 85xx platforms.
+They have been tested on P1020/P2020/P1010 RDB.
+
+The main difference between the above two methods from technical perspective is
+that in 1st case SOC is just out of reset so it is in default configuration.
+(CCSRBAR is at 0xff700000).
+In the 2nd case bootloader has already re-located CCSRBAR to 0xffe00000
+
+1. File name-> boards.cfg
+   There can be added specific Make options for RAMBoot. We can keep different
+   options for the two cases mentioned above.
+   for example
+   P1020RDB_JTAG_RAMBOOT and P1020RDB_GO_RAMBOOT.
+
+2. platform config file
+   for example include/configs/P1_P2_RDB.h
+
+   #ifdef CONFIG_RAMBOOT
+   #define CONFIG_SDCARD
+   #endif
+
+   This will finally use the CONFIG_SYS_RAMBOOT.
+
+3. File name-> arch/powerpc/include/asm/config_mpc85xx.h
+   In the section of the particular SOC, for example P1020,
+
+   #if defined(CONFIG_GO)
+   #define CONFIG_SYS_CCSRBAR_DEFAULT  0xffe00000
+   #else
+   #define CONFIG_SYS_CCSRBAR_DEFAULT  0xff700000
+   #endif
+
+For JTAG  RAMBOOT this is not required because CCSRBAR is at ff700000.
index ee65008..33f31c2 100644 (file)
@@ -27,3 +27,6 @@ CONFIG_IMX_WATCHDOG
        Available for i.mx31/35/5x/6x to service the watchdog. This is not
        automatically set because some boards (vision2) still need to define
        their own hw_watchdog_reset routine.
+
+CONFIG_XILINX_TB_WATCHDOG
+       Available for Xilinx Axi platforms to service timebase watchdog timer.
index ce72861..1c79c14 100644 (file)
@@ -7,20 +7,15 @@ file.
 
 ---------------------------
 
-What:  Remove CONFIG_CMD_MEMTEST from default list
-When:  Release v2013.07
+What:  Remove unused CONFIG_SYS_MEMTEST_START/END
+When:  Release v2013.10
 
-Why:   The "mtest" command is of little practical use (if any), and
-       experience has shown that a large number of board configu-
-       rations define useless or even dangerous start and end
-       addresses.  If not even the board maintainers are able to
-       figure out which memory range can be reliably tested, how can
-       we expect such from the end users?  As this problem comes up
-       repeatedly, we rather do not enable this command by default,
-       so only people who know what they are doing will be confronted
-       with it.
+Why:   As the 'mtest' command is no longer default, a number of platforms
+       have not opted to turn the command back on and thus provide unused
+       defines (which are likely to be propogated to new platforms from
+       copy/paste).  Remove these defines when unused.
 
-Who:   Wolfgang Denk <wd@denx.de>
+Who:   Tom Rini <trini@ti.com>
 
 ---------------------------
 
index 0f23776..e3a47c4 100644 (file)
@@ -34,6 +34,7 @@ alias sjg            Simon Glass <sjg@chromium.org>
 alias smcnutt        Scott McNutt <smcnutt@psyent.com>
 alias sonic          Sonic Zhang <sonic.adi@gmail.com>
 alias stroese        Stefan Roese <sr@denx.de>
+alias trini          Tom Rini <trini@ti.com>
 alias vapier         Mike Frysinger <vapier@gentoo.org>
 alias wd             Wolfgang Denk <wd@denx.de>
 
@@ -54,7 +55,7 @@ alias s5pc           samsung
 alias samsung        uboot, prom
 alias tegra          uboot, sjg, Tom Warren <twarren@nvidia.com>, Stephen Warren <swarren@nvidia.com>
 alias tegra2         tegra
-alias ti             uboot, Tom Rini <trini@ti.com>
+alias ti             uboot, trini
 
 alias avr32          uboot, abiessmann
 
index 1e33a66..fcae448 100644 (file)
@@ -406,6 +406,7 @@ void sata_identify(int num, int dev)
        /* assuming HD */
        sata_dev_desc[devno].type = DEV_TYPE_HARDDISK;
        sata_dev_desc[devno].blksz = ATA_BLOCKSIZE;
+       sata_dev_desc[devno].log2blksz = LOG2(sata_dev_desc[devno].blksz);
        sata_dev_desc[devno].lun = 0;   /* just to fill something in... */
 }
 
index b847dd9..27ecaf4 100644 (file)
@@ -897,6 +897,8 @@ static void bfin_ata_identify(struct ata_port *ap, int dev)
        /* assuming HD */
        sata_dev_desc[ap->port_no].type = DEV_TYPE_HARDDISK;
        sata_dev_desc[ap->port_no].blksz = ATA_SECT_SIZE;
+       sata_dev_desc[ap->port_no].log2blksz =
+               LOG2(sata_dev_desc[ap->port_no].blksz);
        sata_dev_desc[ap->port_no].lun = 0;     /* just to fill something in... */
 
        printf("PATA device#%d %s is found on ata port#%d.\n",
index bf29cbb..b08715f 100644 (file)
@@ -127,6 +127,7 @@ block_dev_desc_t *systemace_get_dev(int dev)
                systemace_dev.part_type = PART_TYPE_UNKNOWN;
                systemace_dev.type = DEV_TYPE_HARDDISK;
                systemace_dev.blksz = 512;
+               systemace_dev.log2blksz = LOG2(systemace_dev.blksz);
                systemace_dev.removable = 1;
                systemace_dev.block_read = systemace_read;
 
index b48f623..0b51dcd 100644 (file)
@@ -30,6 +30,7 @@ COBJS-y += fpga.o
 COBJS-$(CONFIG_FPGA_SPARTAN2) += spartan2.o
 COBJS-$(CONFIG_FPGA_SPARTAN3) += spartan3.o
 COBJS-$(CONFIG_FPGA_VIRTEX2) += virtex2.o
+COBJS-$(CONFIG_FPGA_ZYNQPL) += zynqpl.o
 COBJS-$(CONFIG_FPGA_XILINX) += xilinx.o
 COBJS-$(CONFIG_FPGA_LATTICE) += ivm_core.o lattice.o
 ifdef CONFIG_FPGA_ALTERA
index 26d2443..f70bff6 100644 (file)
  *
  */
 
-/*
- *  Generic FPGA support
- */
+/* Generic FPGA support */
 #include <common.h>             /* core U-Boot definitions */
 #include <xilinx.h>             /* xilinx specific definitions */
 #include <altera.h>             /* altera specific definitions */
 #include <lattice.h>
 
-#if 0
-#define FPGA_DEBUG              /* define FPGA_DEBUG to get debug messages */
-#endif
-
 /* Local definitions */
 #ifndef CONFIG_MAX_FPGA_DEVICES
 #define CONFIG_MAX_FPGA_DEVICES                5
 #endif
 
-/* Enable/Disable debug console messages */
-#ifdef FPGA_DEBUG
-#define        PRINTF(fmt,args...)     printf (fmt ,##args)
-#else
-#define        PRINTF(fmt,args...)
-#endif
-
 /* Local static data */
 static int next_desc = FPGA_INVALID_DEVICE;
 static fpga_desc desc_table[CONFIG_MAX_FPGA_DEVICES];
 
-/* Local static functions */
-static __attribute__((__const__)) fpga_desc * __attribute__((__const__)) fpga_get_desc( int devnum );
-static __attribute__((__const__)) fpga_desc * __attribute__((__const__)) fpga_validate(int devnum, const void *buf,
-                                        size_t bsize, char *fn );
-static int fpga_dev_info( int devnum );
-
-
-/* ------------------------------------------------------------------------- */
-
-/* fpga_no_sup
+/*
+ * fpga_no_sup
  * 'no support' message function
  */
-static void fpga_no_sup( char *fn, char *msg )
+static void fpga_no_sup(char *fn, char *msg)
 {
-       if ( fn && msg ) {
-               printf( "%s: No support for %s.\n", fn, msg);
-       } else if ( msg ) {
-               printf( "No support for %s.\n", msg);
-       } else {
-               printf( "No FPGA suport!\n");
-       }
+       if (fn && msg)
+               printf("%s: No support for %s.\n", fn, msg);
+       else if (msg)
+               printf("No support for %s.\n", msg);
+       else
+               printf("No FPGA suport!\n");
 }
 
 
 /* fpga_get_desc
  *     map a device number to a descriptor
  */
-static __attribute__((__const__)) fpga_desc * __attribute__((__const__)) fpga_get_desc( int devnum )
+static const fpga_desc *const fpga_get_desc(int devnum)
 {
-       fpga_desc *desc = (fpga_desc * )NULL;
+       fpga_desc *desc = (fpga_desc *)NULL;
 
-       if (( devnum >= 0 ) && (devnum < next_desc )) {
+       if ((devnum >= 0) && (devnum < next_desc)) {
                desc = &desc_table[devnum];
-               PRINTF( "%s: found fpga descriptor #%d @ 0x%p\n",
-                               __FUNCTION__, devnum, desc );
+               debug("%s: found fpga descriptor #%d @ 0x%p\n",
+                     __func__, devnum, desc);
        }
 
        return desc;
 }
 
-
-/* fpga_validate
+/*
+ * fpga_validate
  *     generic parameter checking code
  */
-static __attribute__((__const__)) fpga_desc * __attribute__((__const__)) fpga_validate(int devnum, const void *buf,
-                                        size_t bsize, char *fn )
+const fpga_desc *const fpga_validate(int devnum, const void *buf,
+                                    size_t bsize, char *fn)
 {
-       fpga_desc * desc = fpga_get_desc( devnum );
+       const fpga_desc *desc = fpga_get_desc(devnum);
<