]> git.ipfire.org Git - people/ms/u-boot.git/commitdiff
Merge branch 'u-boot-microblaze/zynq' into 'u-boot-arm/master'
authorAlbert ARIBAUD <albert.u.boot@aribaud.net>
Wed, 25 Jun 2014 08:40:23 +0000 (10:40 +0200)
committerAlbert ARIBAUD <albert.u.boot@aribaud.net>
Wed, 25 Jun 2014 08:40:23 +0000 (10:40 +0200)
139 files changed:
Makefile
README
arch/.gitignore
arch/arm/cpu/armv7/at91/cpu.c
arch/arm/cpu/armv8/transition.S
arch/arm/dts/include/dt-bindings [new symlink]
arch/arm/dts/tegra114.dtsi
arch/arm/dts/tegra124.dtsi
arch/arm/dts/tegra20.dtsi
arch/arm/dts/tegra30.dtsi
arch/arm/include/asm/arch-vf610/crm_regs.h
arch/arm/include/asm/arch-vf610/imx-regs.h
arch/arm/include/asm/arch-vf610/iomux-vf610.h
arch/arm/include/asm/imx-common/iomux-v3.h
arch/arm/include/asm/io.h
arch/arm/lib/vectors.S
arch/avr32/cpu/cache.c
arch/avr32/include/asm/arch-at32ap700x/cacheflush.h
arch/avr32/include/asm/dma-mapping.h
arch/avr32/lib/board.c
arch/m68k/cpu/mcf5445x/cpu_init.c
arch/m68k/include/asm/io.h
arch/m68k/lib/board.c
arch/microblaze/dts/include/dt-bindings [new symlink]
arch/microblaze/lib/bootm.c
arch/sandbox/cpu/os.c
arch/sandbox/dts/include/dt-bindings [new symlink]
arch/sandbox/include/asm/bitops.h
arch/sandbox/include/asm/io.h
arch/sandbox/include/asm/system.h
arch/x86/config.mk
arch/x86/cpu/config.mk
arch/x86/dts/include/dt-bindings [new symlink]
board/altera/common/sevenseg.c [deleted file]
board/altera/common/sevenseg.h [deleted file]
board/altera/nios2-generic/Makefile
board/freescale/m5253demo/flash.c
board/freescale/vf610twr/vf610twr.c
board/gdsys/405ex/io64.c
board/gdsys/p1022/controlcenterd-id.c
board/pcs440ep/pcs440ep.c
board/psyent/common/AMDLV065D.c
common/Makefile
common/autoboot.c
common/bootm.c [new file with mode: 0644]
common/bootm_os.c [new file with mode: 0644]
common/cmd_bootm.c
common/cmd_fdt.c
common/cmd_iotrace.c [new file with mode: 0644]
common/cmd_md5sum.c
common/cmd_sandbox.c
common/cmd_sha1sum.c
common/fdt_support.c
common/hash.c
common/image-fdt.c
common/image-fit.c
common/image-sig.c
common/image.c
common/iotrace.c [new file with mode: 0644]
disk/part.c
doc/README.fdt-control
doc/driver-model/README.txt
doc/uImage.FIT/beaglebone_vboot.txt [new file with mode: 0644]
doc/uImage.FIT/signature.txt
drivers/core/lists.c
drivers/core/root.c
drivers/core/uclass.c
drivers/crypto/ace_sha.c
drivers/demo/demo-shape.c
drivers/demo/demo-simple.c
drivers/gpio/gpio-uclass.c
drivers/gpio/sandbox.c
drivers/misc/cros_ec_sandbox.c
drivers/mmc/rpmb.c
drivers/net/macb.c
drivers/power/pmic/pmic_tps65090.c
drivers/spi/Makefile
drivers/spi/fsl_qspi.c [new file with mode: 0644]
drivers/spi/fsl_qspi.h [new file with mode: 0644]
drivers/video/atmel_hlcdfb.c
dts/Makefile
fs/ext4/ext4_common.c
include/bootm.h [new file with mode: 0644]
include/command.h
include/configs/am335x_evm.h
include/configs/bcm28155_ap.h
include/configs/ethernut5.h
include/configs/ids8313.h
include/configs/iocon.h
include/configs/sandbox.h
include/configs/tegra-common.h
include/configs/vf610twr.h
include/dm.h
include/dm/device-internal.h
include/dm/device.h
include/dm/lists.h
include/dm/root.h
include/dm/uclass.h
include/dt-bindings/gpio/gpio.h [new file with mode: 0644]
include/dt-bindings/gpio/tegra-gpio.h [new file with mode: 0644]
include/dt-bindings/interrupt-controller/arm-gic.h [new file with mode: 0644]
include/dt-bindings/interrupt-controller/irq.h [new file with mode: 0644]
include/fdt_support.h
include/hash.h
include/image.h
include/iotrace.h [new file with mode: 0644]
include/u-boot/rsa-checksum.h [moved from include/rsa-checksum.h with 91% similarity]
include/u-boot/rsa.h [moved from include/rsa.h with 100% similarity]
include/u-boot/sha1.h [moved from include/sha1.h with 100% similarity]
include/u-boot/sha256.h [moved from include/sha256.h with 100% similarity]
lib/Makefile
lib/fdtdec.c
lib/fdtdec_common.c [new file with mode: 0644]
lib/libfdt/fdt_ro.c
lib/rsa/rsa-checksum.c
lib/rsa/rsa-sign.c
lib/rsa/rsa-verify.c
lib/sha1.c
lib/sha256.c
lib/tpm.c
net/net.c
scripts/Makefile.build
scripts/Makefile.host
scripts/Makefile.lib
scripts/basic/fixdep.c
scripts/docproc.c
test/command_ut.c
test/dm/Makefile
test/dm/cmd_dm.c
test/dm/test-fdt.c
test/vboot/vboot_test.sh
tools/Makefile
tools/dumpimage.h
tools/fit_check_sign.c
tools/fit_info.c
tools/image-host.c
tools/imagetool.h
tools/mkimage.h
tools/ubsha1.c

index 24d96877ac60536e9ac8adbdf6341b1141c96bd7..e42921222869a74cef31185f6111b00eb83596c0 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -244,18 +244,18 @@ endif
 KBUILD_MODULES :=
 KBUILD_BUILTIN := 1
 
-#      If we have only "make modules", don't compile built-in objects.
-#      When we're building modules with modversions, we need to consider
-#      the built-in objects during the descend as well, in order to
-#      make sure the checksums are up to date before we record them.
+# If we have only "make modules", don't compile built-in objects.
+# When we're building modules with modversions, we need to consider
+# the built-in objects during the descend as well, in order to
+# make sure the checksums are up to date before we record them.
 
 ifeq ($(MAKECMDGOALS),modules)
   KBUILD_BUILTIN := $(if $(CONFIG_MODVERSIONS),1)
 endif
 
-#      If we have "make <whatever> modules", compile modules
-#      in addition to whatever we do anyway.
-#      Just "make" or "make all" shall build modules as well
+# If we have "make <whatever> modules", compile modules
+# in addition to whatever we do anyway.
+# Just "make" or "make all" shall build modules as well
 
 # U-Boot does not need modules
 #ifneq ($(filter all _all modules,$(MAKECMDGOALS)),)
@@ -832,7 +832,7 @@ MKIMAGEFLAGS_u-boot.kwb = -n $(srctree)/$(CONFIG_SYS_KWD_CONFIG:"%"=%) \
 MKIMAGEFLAGS_u-boot.pbl = -n $(srctree)/$(CONFIG_SYS_FSL_PBL_RCW:"%"=%) \
                -R $(srctree)/$(CONFIG_SYS_FSL_PBL_PBI:"%"=%) -T pblimage
 
-u-boot.img u-boot.kwb u-boot.pbl: u-boot$(if $(CONFIG_OF_SEPARATE),-dtb,).bin FORCE
+u-boot.img u-boot.kwb u-boot.pbl: u-boot.bin FORCE
        $(call if_changed,mkimage)
 
 MKIMAGEFLAGS_u-boot-dtb.img = $(MKIMAGEFLAGS_u-boot.img)
@@ -1219,7 +1219,7 @@ CLOBBER_FILES += u-boot* MLO* SPL System.map
 
 # Directories & files removed with 'make mrproper'
 MRPROPER_DIRS  += include/config include/generated          \
-                  .tmp_objdiff
+                 .tmp_objdiff
 MRPROPER_FILES += .config .config.old \
                  tags TAGS cscope* GPATH GTAGS GRTAGS GSYMS \
                  include/config.h include/config.mk
diff --git a/README b/README
index 7129df822c17c9c9bc5c7089ec54b0fed6381d01..fe5cacbaa55a86450838b0cc129b538732a8daea 100644 (file)
--- a/README
+++ b/README
@@ -1000,6 +1000,7 @@ The following options need to be configured:
                CONFIG_CMD_IMLS           List all images found in NOR flash
                CONFIG_CMD_IMLS_NAND    * List all images found in NAND flash
                CONFIG_CMD_IMMAP        * IMMR dump support
+               CONFIG_CMD_IOTRACE      * I/O tracing for debugging
                CONFIG_CMD_IMPORTENV    * import an environment
                CONFIG_CMD_INI          * import data from an ini file into the env
                CONFIG_CMD_IRQ          * irqinfo
@@ -1171,6 +1172,28 @@ The following options need to be configured:
                Note that if the GPIO device uses I2C, then the I2C interface
                must also be configured. See I2C Support, below.
 
+- I/O tracing:
+               When CONFIG_IO_TRACE is selected, U-Boot intercepts all I/O
+               accesses and can checksum them or write a list of them out
+               to memory. See the 'iotrace' command for details. This is
+               useful for testing device drivers since it can confirm that
+               the driver behaves the same way before and after a code
+               change. Currently this is supported on sandbox and arm. To
+               add support for your architecture, add '#include <iotrace.h>'
+               to the bottom of arch/<arch>/include/asm/io.h and test.
+
+               Example output from the 'iotrace stats' command is below.
+               Note that if the trace buffer is exhausted, the checksum will
+               still continue to operate.
+
+                       iotrace is enabled
+                       Start:  10000000        (buffer start address)
+                       Size:   00010000        (buffer size)
+                       Offset: 00000120        (current buffer offset)
+                       Output: 10000120        (start + offset)
+                       Count:  00000018        (number of trace records)
+                       CRC32:  9526fb66        (CRC32 of all trace records)
+
 - Timestamp Support:
 
                When CONFIG_TIMESTAMP is selected, the timestamp
@@ -5308,6 +5331,11 @@ Information structure as we define in include/asm-<arch>/u-boot.h,
 and make sure that your definition of IMAP_ADDR uses the same value
 as your U-Boot configuration in CONFIG_SYS_IMMR.
 
+Note that U-Boot now has a driver model, a unified model for drivers.
+If you are adding a new driver, plumb it into driver model. If there
+is no uclass available, you are encouraged to create one. See
+doc/driver-model.
+
 
 Configuring the Linux kernel:
 -----------------------------
index a1fbe01d57d0bdbfdc0a316342ec277d8d1e4bef..2714b86ff30a13623e806f57c1eb600b16b5951d 100644 (file)
@@ -1,2 +1 @@
 /*/include/asm/arch
-/*/include/asm/proc
index 2fbf60d5427bdf3145930de0a070e506fda240bb..8d86f97e3dab36be1b26af44ec9999a2c4d3a477 100644 (file)
@@ -61,6 +61,8 @@ int print_cpuinfo(void)
 
 void enable_caches(void)
 {
+       icache_enable();
+       dcache_enable();
 }
 
 unsigned int get_chip_id(void)
index e0a59460091e04afd0e4abddb9d63cea03e35875..38dea5c51871eb4e20abf86f67aaf5bd9c4f6b10 100644 (file)
@@ -43,7 +43,7 @@ ENTRY(armv8_switch_to_el1)
        mrs     x0, cnthctl_el2
        orr     x0, x0, #0x3            /* Enable EL1 access to timers */
        msr     cnthctl_el2, x0
-       msr     cntvoff_el2, x0
+       msr     cntvoff_el2, xzr
        mrs     x0, cntkctl_el1
        orr     x0, x0, #0x3            /* Enable EL0 access to timers */
        msr     cntkctl_el1, x0
diff --git a/arch/arm/dts/include/dt-bindings b/arch/arm/dts/include/dt-bindings
new file mode 120000 (symlink)
index 0000000..0cecb3d
--- /dev/null
@@ -0,0 +1 @@
+../../../../include/dt-bindings
\ No newline at end of file
index f52fcf14dddc2f0f712a2624f2617af27b1c1314..59434e0a8f76dd540f506a235da06b2b24c55206 100644 (file)
@@ -1,3 +1,6 @@
+#include <dt-bindings/gpio/tegra-gpio.h>
+#include <dt-bindings/interrupt-controller/arm-gic.h>
+
 #include "skeleton.dtsi"
 
 / {
                              0 143 0x04>;
        };
 
-       gpio: gpio {
+       gpio: gpio@6000d000 {
                compatible = "nvidia,tegra114-gpio", "nvidia,tegra30-gpio";
                reg = <0x6000d000 0x1000>;
-               interrupts = <0 32 0x04
-                             0 33 0x04
-                             0 34 0x04
-                             0 35 0x04
-                             0 55 0x04
-                             0 87 0x04
-                             0 89 0x04
-                             0 125 0x04>;
+               interrupts = <GIC_SPI 32 IRQ_TYPE_LEVEL_HIGH>,
+                            <GIC_SPI 33 IRQ_TYPE_LEVEL_HIGH>,
+                            <GIC_SPI 34 IRQ_TYPE_LEVEL_HIGH>,
+                            <GIC_SPI 35 IRQ_TYPE_LEVEL_HIGH>,
+                            <GIC_SPI 55 IRQ_TYPE_LEVEL_HIGH>,
+                            <GIC_SPI 87 IRQ_TYPE_LEVEL_HIGH>,
+                            <GIC_SPI 89 IRQ_TYPE_LEVEL_HIGH>,
+                            <GIC_SPI 125 IRQ_TYPE_LEVEL_HIGH>;
                #gpio-cells = <2>;
                gpio-controller;
                #interrupt-cells = <2>;
index 18a8b24b71f788c130f6007d4410cecad64cbcb0..4561c5f839438c4bdf4e181e38fbde57ff9e780f 100644 (file)
@@ -1,3 +1,6 @@
+#include <dt-bindings/gpio/tegra-gpio.h>
+#include <dt-bindings/interrupt-controller/arm-gic.h>
+
 #include "skeleton.dtsi"
 
 / {
        gpio: gpio@6000d000 {
                compatible = "nvidia,tegra124-gpio", "nvidia,tegra30-gpio";
                reg = <0x6000d000 0x1000>;
-               interrupts = <0 32 0x04
-                             0 33 0x04
-                             0 34 0x04
-                             0 35 0x04
-                             0 55 0x04
-                             0 87 0x04
-                             0 89 0x04
-                             0 125 0x04>;
+               interrupts = <GIC_SPI 32 IRQ_TYPE_LEVEL_HIGH>,
+                            <GIC_SPI 33 IRQ_TYPE_LEVEL_HIGH>,
+                            <GIC_SPI 34 IRQ_TYPE_LEVEL_HIGH>,
+                            <GIC_SPI 35 IRQ_TYPE_LEVEL_HIGH>,
+                            <GIC_SPI 55 IRQ_TYPE_LEVEL_HIGH>,
+                            <GIC_SPI 87 IRQ_TYPE_LEVEL_HIGH>,
+                            <GIC_SPI 89 IRQ_TYPE_LEVEL_HIGH>,
+                            <GIC_SPI 125 IRQ_TYPE_LEVEL_HIGH>;
                #gpio-cells = <2>;
                gpio-controller;
                #interrupt-cells = <2>;
index 3805750581f42fc0788545137d38ce056f4ed6bd..a524f6eed4107b669ecc935b247f6b2393bd2629 100644 (file)
@@ -1,3 +1,6 @@
+#include <dt-bindings/gpio/tegra-gpio.h>
+#include <dt-bindings/interrupt-controller/arm-gic.h>
+
 #include "skeleton.dtsi"
 
 / {
 
        gpio: gpio@6000d000 {
                compatible = "nvidia,tegra20-gpio";
-               reg = < 0x6000d000 0x1000 >;
-               interrupts = < 64 65 66 67 87 119 121 >;
+               reg = <0x6000d000 0x1000>;
+               interrupts = <GIC_SPI 32 IRQ_TYPE_LEVEL_HIGH>,
+                            <GIC_SPI 33 IRQ_TYPE_LEVEL_HIGH>,
+                            <GIC_SPI 34 IRQ_TYPE_LEVEL_HIGH>,
+                            <GIC_SPI 35 IRQ_TYPE_LEVEL_HIGH>,
+                            <GIC_SPI 55 IRQ_TYPE_LEVEL_HIGH>,
+                            <GIC_SPI 87 IRQ_TYPE_LEVEL_HIGH>,
+                            <GIC_SPI 89 IRQ_TYPE_LEVEL_HIGH>;
                #gpio-cells = <2>;
                gpio-controller;
+               #interrupt-cells = <2>;
+               interrupt-controller;
        };
 
        pinmux: pinmux@70000000 {
index fee1c36efb2a510c6027412576424401bf3d684e..7be3791fc9a679536a1d63b1aac3fbb81c03eb31 100644 (file)
@@ -1,3 +1,6 @@
+#include <dt-bindings/gpio/tegra-gpio.h>
+#include <dt-bindings/interrupt-controller/arm-gic.h>
+
 #include "skeleton.dtsi"
 
 / {
                clocks = <&tegra_car 34>;
        };
 
-       gpio: gpio {
+       gpio: gpio@6000d000 {
                compatible = "nvidia,tegra30-gpio";
                reg = <0x6000d000 0x1000>;
-               interrupts = <0 32 0x04
-                             0 33 0x04
-                             0 34 0x04
-                             0 35 0x04
-                             0 55 0x04
-                             0 87 0x04
-                             0 89 0x04
-                             0 125 0x04>;
+               interrupts = <GIC_SPI 32 IRQ_TYPE_LEVEL_HIGH>,
+                            <GIC_SPI 33 IRQ_TYPE_LEVEL_HIGH>,
+                            <GIC_SPI 34 IRQ_TYPE_LEVEL_HIGH>,
+                            <GIC_SPI 35 IRQ_TYPE_LEVEL_HIGH>,
+                            <GIC_SPI 55 IRQ_TYPE_LEVEL_HIGH>,
+                            <GIC_SPI 87 IRQ_TYPE_LEVEL_HIGH>,
+                            <GIC_SPI 89 IRQ_TYPE_LEVEL_HIGH>,
+                            <GIC_SPI 125 IRQ_TYPE_LEVEL_HIGH>;
                #gpio-cells = <2>;
                gpio-controller;
                #interrupt-cells = <2>;
index e17c7d1f7042f138ac41acb48eb100ebd02953e5..5256624adf4691c33d68395faef0ab06594de7fc 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright 2013 Freescale Semiconductor, Inc.
+ * Copyright 2013-2014 Freescale Semiconductor, Inc.
  *
  * SPDX-License-Identifier:    GPL-2.0+
  */
@@ -150,6 +150,9 @@ struct anadig_reg {
 #define CCM_CACRR_ARM_CLK_DIV_MASK             0x7
 #define CCM_CACRR_ARM_CLK_DIV(v)               ((v) & 0x7)
 
+#define CCM_CSCMR1_QSPI0_CLK_SEL_OFFSET                22
+#define CCM_CSCMR1_QSPI0_CLK_SEL_MASK          (0x3 << 22)
+#define CCM_CSCMR1_QSPI0_CLK_SEL(v)            (((v) & 0x3) << 22)
 #define CCM_CSCMR1_ESDHC1_CLK_SEL_OFFSET       18
 #define CCM_CSCMR1_ESDHC1_CLK_SEL_MASK         (0x3 << 18)
 #define CCM_CSCMR1_ESDHC1_CLK_SEL(v)           (((v) & 0x3) << 18)
@@ -161,6 +164,11 @@ struct anadig_reg {
 #define CCM_CSCDR2_ESDHC1_CLK_DIV_MASK         (0xf << 20)
 #define CCM_CSCDR2_ESDHC1_CLK_DIV(v)           (((v) & 0xf) << 20)
 
+#define CCM_CSCDR3_QSPI0_EN                    (1 << 4)
+#define CCM_CSCDR3_QSPI0_DIV(v)                        ((v) << 3)
+#define CCM_CSCDR3_QSPI0_X2_DIV(v)             ((v) << 2)
+#define CCM_CSCDR3_QSPI0_X4_DIV(v)             ((v) & 0x3)
+
 #define CCM_CSCMR2_RMII_CLK_SEL_OFFSET         4
 #define CCM_CSCMR2_RMII_CLK_SEL_MASK           (0x3 << 4)
 #define CCM_CSCMR2_RMII_CLK_SEL(v)             (((v) & 0x3) << 4)
@@ -170,6 +178,7 @@ struct anadig_reg {
 #define CCM_CCGR0_UART1_CTRL_MASK              (0x3 << 16)
 #define CCM_CCGR1_PIT_CTRL_MASK                        (0x3 << 14)
 #define CCM_CCGR1_WDOGA5_CTRL_MASK             (0x3 << 28)
+#define CCM_CCGR2_QSPI0_CTRL_MASK              (0x3 << 8)
 #define CCM_CCGR2_IOMUXC_CTRL_MASK             (0x3 << 16)
 #define CCM_CCGR2_PORTA_CTRL_MASK              (0x3 << 18)
 #define CCM_CCGR2_PORTB_CTRL_MASK              (0x3 << 20)
index 0c28e1b8403a4f52a89c1e26117ea5a558323b23..bd6f680b63baaa00ffb01b27291f38461494441f 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright 2013 Freescale Semiconductor, Inc.
+ * Copyright 2013-2014 Freescale Semiconductor, Inc.
  *
  * SPDX-License-Identifier:    GPL-2.0+
  */
@@ -87,6 +87,8 @@
 #define ENET_BASE_ADDR         (AIPS1_BASE_ADDR + 0x00050000)
 #define ENET1_BASE_ADDR                (AIPS1_BASE_ADDR + 0x00051000)
 
+#define QSPI0_AMBA_BASE                0x20000000
+
 /* MUX mode and PAD ctrl are in one register */
 #define CONFIG_IOMUX_SHARE_CONF_REG
 
index 88807d8db47355e35b389c0e6db789818f711e5f..a9656416815768f4183e623705da162572054040 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright 2013 Freescale Semiconductor, Inc.
+ * Copyright 2013-2014 Freescale Semiconductor, Inc.
  *
  * SPDX-License-Identifier:    GPL-2.0+
  */
@@ -20,6 +20,9 @@
 #define VF610_I2C_PAD_CTRL     (PAD_CTL_PUS_47K_UP | PAD_CTL_DSE_50ohm | \
                                PAD_CTL_SPEED_HIGH | PAD_CTL_OBE_IBE_ENABLE)
 
+#define VF610_QSPI_PAD_CTRL    (PAD_CTL_SPEED_HIGH | PAD_CTL_DSE_150ohm | \
+                               PAD_CTL_PUS_22K_UP | PAD_CTL_OBE_IBE_ENABLE)
+
 enum {
        VF610_PAD_PTA6__RMII0_CLKIN             = IOMUX_PAD(0x0000, 0x0000, 2, __NA_, 0, VF610_ENET_PAD_CTRL),
        VF610_PAD_PTA6__RMII0_CLKOUT            = IOMUX_PAD(0x0000, 0x0000, 1, __NA_, 0, VF610_ENET_PAD_CTRL),
@@ -53,6 +56,18 @@ enum {
        VF610_PAD_PTA29__ESDHC1_DAT3            = IOMUX_PAD(0x004c, 0x004c, 5, __NA_, 0, VF610_SDHC_PAD_CTRL),
        VF610_PAD_PTB14__I2C0_SCL               = IOMUX_PAD(0x0090, 0x0090, 2, 0x033c, 1, VF610_I2C_PAD_CTRL),
        VF610_PAD_PTB15__I2C0_SDA               = IOMUX_PAD(0x0094, 0x0094, 2, 0x0340, 1, VF610_I2C_PAD_CTRL),
+       VF610_PAD_PTD0__QSPI0_A_QSCK            = IOMUX_PAD(0x013c, 0x013c, 1, __NA_, 0, VF610_QSPI_PAD_CTRL),
+       VF610_PAD_PTD1__QSPI0_A_CS0             = IOMUX_PAD(0x0140, 0x0140, 1, __NA_, 0, VF610_QSPI_PAD_CTRL),
+       VF610_PAD_PTD2__QSPI0_A_DATA3           = IOMUX_PAD(0x0144, 0x0144, 1, __NA_, 0, VF610_QSPI_PAD_CTRL),
+       VF610_PAD_PTD3__QSPI0_A_DATA2           = IOMUX_PAD(0x0148, 0x0148, 1, __NA_, 0, VF610_QSPI_PAD_CTRL),
+       VF610_PAD_PTD4__QSPI0_A_DATA1           = IOMUX_PAD(0x014c, 0x014c, 1, __NA_, 0, VF610_QSPI_PAD_CTRL),
+       VF610_PAD_PTD5__QSPI0_A_DATA0           = IOMUX_PAD(0x0150, 0x0150, 1, __NA_, 0, VF610_QSPI_PAD_CTRL),
+       VF610_PAD_PTD7__QSPI0_B_QSCK            = IOMUX_PAD(0x0158, 0x0158, 1, __NA_, 0, VF610_QSPI_PAD_CTRL),
+       VF610_PAD_PTD8__QSPI0_B_CS0             = IOMUX_PAD(0x015c, 0x015c, 1, __NA_, 0, VF610_QSPI_PAD_CTRL),
+       VF610_PAD_PTD9__QSPI0_B_DATA3           = IOMUX_PAD(0x0160, 0x0160, 1, __NA_, 0, VF610_QSPI_PAD_CTRL),
+       VF610_PAD_PTD10__QSPI0_B_DATA2          = IOMUX_PAD(0x0164, 0x0164, 1, __NA_, 0, VF610_QSPI_PAD_CTRL),
+       VF610_PAD_PTD11__QSPI0_B_DATA1          = IOMUX_PAD(0x0168, 0x0168, 1, __NA_, 0, VF610_QSPI_PAD_CTRL),
+       VF610_PAD_PTD12__QSPI0_B_DATA0          = IOMUX_PAD(0x016c, 0x016c, 1, __NA_, 0, VF610_QSPI_PAD_CTRL),
        VF610_PAD_DDR_A15__DDR_A_15             = IOMUX_PAD(0x0220, 0x0220, 0, __NA_, 0, VF610_DDR_PAD_CTRL),
        VF610_PAD_DDR_A14__DDR_A_14             = IOMUX_PAD(0x0224, 0x0224, 0, __NA_, 0, VF610_DDR_PAD_CTRL),
        VF610_PAD_DDR_A13__DDR_A_13             = IOMUX_PAD(0x0228, 0x0228, 0, __NA_, 0, VF610_DDR_PAD_CTRL),
index cca920b28ecfd1e527ec66a66ce729bf4741ec1f..ff45618e45521f2dc74b085981bd217ef43233c5 100644 (file)
@@ -123,12 +123,14 @@ typedef u64 iomux_v3_cfg_t;
 #define PAD_CTL_SPEED_MED      (1 << 12)
 #define PAD_CTL_SPEED_HIGH     (3 << 12)
 
+#define PAD_CTL_DSE_150ohm     (1 << 6)
 #define PAD_CTL_DSE_50ohm      (3 << 6)
 #define PAD_CTL_DSE_25ohm      (6 << 6)
 #define PAD_CTL_DSE_20ohm      (7 << 6)
 
 #define PAD_CTL_PUS_47K_UP     (1 << 4 | PAD_CTL_PUE)
 #define PAD_CTL_PUS_100K_UP    (2 << 4 | PAD_CTL_PUE)
+#define PAD_CTL_PUS_22K_UP     (3 << 4 | PAD_CTL_PUE)
 #define PAD_CTL_PKE            (1 << 3)
 #define PAD_CTL_PUE            (1 << 2 | PAD_CTL_PKE)
 
index 6a1f05ac3efd5326723a94440fc21feee285034c..9f35fd694b35124d9d2db94aea84df36b9c3727d 100644 (file)
@@ -437,4 +437,7 @@ out:
 
 #endif /* __mem_isa */
 #endif /* __KERNEL__ */
+
+#include <iotrace.h>
+
 #endif /* __ASM_ARM_IO_H */
index d68cc477dc68e7a1ba60eaba046747901dae38f7..e6538eff43360f9118af07c4163b154cfad66ecd 100644 (file)
@@ -43,8 +43,6 @@
  *************************************************************************
  */
 
-_start:
-
 #ifdef CONFIG_SYS_DV_NOR_BOOT_CFG
        .word   CONFIG_SYS_DV_NOR_BOOT_CFG
 #endif
index ab0374e587b4ad478fc97d5ace0f426ad26c7745..b3ffc3348b514e90805336b4e1a308b37b84bf92 100644 (file)
@@ -24,31 +24,31 @@ void dcache_clean_range(volatile void *start, size_t size)
        sync_write_buffer();
 }
 
-void dcache_invalidate_range(volatile void *start, size_t size)
+void invalidate_dcache_range(unsigned long start, unsigned long stop)
 {
-       unsigned long v, begin, end, linesz;
+       unsigned long v, linesz;
 
        linesz = CONFIG_SYS_DCACHE_LINESZ;
 
        /* You asked for it, you got it */
-       begin = (unsigned long)start & ~(linesz - 1);
-       end = ((unsigned long)start + size + linesz - 1) & ~(linesz - 1);
+       start = start & ~(linesz - 1);
+       stop = (stop + linesz - 1) & ~(linesz - 1);
 
-       for (v = begin; v < end; v += linesz)
+       for (v = start; v < stop; v += linesz)
                dcache_invalidate_line((void *)v);
 }
 
-void dcache_flush_range(volatile void *start, size_t size)
+void flush_dcache_range(unsigned long start, unsigned long stop)
 {
-       unsigned long v, begin, end, linesz;
+       unsigned long v, linesz;
 
        linesz = CONFIG_SYS_DCACHE_LINESZ;
 
        /* You asked for it, you got it */
-       begin = (unsigned long)start & ~(linesz - 1);
-       end = ((unsigned long)start + size + linesz - 1) & ~(linesz - 1);
+       start = start & ~(linesz - 1);
+       stop = (stop + linesz - 1) & ~(linesz - 1);
 
-       for (v = begin; v < end; v += linesz)
+       for (v = start; v < stop; v += linesz)
                dcache_flush_line((void *)v);
 
        sync_write_buffer();
index 13d6d3aed366d875357f37e171ae315d63b52bd7..e08cd9de6d22687d22d1cde3872efb74f3f07271 100644 (file)
@@ -49,9 +49,7 @@ static inline void icache_invalidate_line(volatile void *vaddr)
  * Applies the above functions on all lines that are touched by the
  * specified virtual address range.
  */
-void dcache_invalidate_range(volatile void *start, size_t len);
 void dcache_clean_range(volatile void *start, size_t len);
-void dcache_flush_range(volatile void *start, size_t len);
 void icache_invalidate_range(volatile void *start, size_t len);
 
 static inline void dcache_flush_unlocked(void)
index 95ea81ff5e624f7b2d11edf9293afe8b164b0518..dbdd2fee3806c32e7c8a48597d0b603882cd7564 100644 (file)
@@ -23,13 +23,15 @@ static inline unsigned long dma_map_single(volatile void *vaddr, size_t len,
 
        switch (dir) {
        case DMA_BIDIRECTIONAL:
-               dcache_flush_range(vaddr, len);
+               flush_dcache_range((unsigned long)vaddr,
+                                  (unsigned long)vaddr + len);
                break;
        case DMA_TO_DEVICE:
                dcache_clean_range(vaddr, len);
                break;
        case DMA_FROM_DEVICE:
-               dcache_invalidate_range(vaddr, len);
+               invalidate_dcache_range((unsigned long)vaddr,
+                                       (unsigned long)vaddr + len);
                break;
        default:
                /* This will cause a linker error */
index 7680102f523f2f8ba5ea090d08d7fad4235a0bd1..bf0997f98dc3802626418d190bb3cec2e165992c 100644 (file)
@@ -65,8 +65,8 @@ static void dma_alloc_init(void)
        printf("DMA: Using memory from 0x%08lx to 0x%08lx\n",
               dma_alloc_start, dma_alloc_end);
 
-       dcache_invalidate_range(cached(dma_alloc_start),
-                               dma_alloc_end - dma_alloc_start);
+       invalidate_dcache_range((unsigned long)cached(dma_alloc_start),
+                               dma_alloc_end);
 }
 
 void *dma_alloc_coherent(size_t len, unsigned long *handle)
index 9c324dc968dfb3e24ca404349442618216c6a176..b4a8eefa94d9af90e3b8a7d37745f0ded520f8cd 100644 (file)
@@ -364,9 +364,9 @@ void uart_port_conf(int port)
 int fecpin_setclear(struct eth_device *dev, int setclear)
 {
        gpio_t *gpio = (gpio_t *) MMAP_GPIO;
+#ifdef CONFIG_MCF5445x
        struct fec_info_s *info = (struct fec_info_s *)dev->priv;
 
-#ifdef CONFIG_MCF5445x
        if (setclear) {
 #ifdef CONFIG_SYS_FEC_NO_SHARED_PHY
                if (info->iobase == CONFIG_SYS_FEC0_IOBASE)
index 5a87a9b810d06ce8eb4a9ec60f10376ab79792f6..2d2a51901b88d0e7eef16d3a07a194cebb67d98f 100644 (file)
 #define writew(b,addr)         ((*(volatile u16 *) (addr)) = (b))
 #define writel(b,addr)         ((*(volatile u32 *) (addr)) = (b))
 #else
-#define readw(addr)            in_le16((volatile u16 *)(addr))
-#define readl(addr)            in_le32((volatile u32 *)(addr))
-#define writew(b,addr)         out_le16((volatile u16 *)(addr),(b))
-#define writel(b,addr)         out_le32((volatile u32 *)(addr),(b))
+#define readw(addr)            in_be16((volatile u16 *)(addr))
+#define readl(addr)            in_be32((volatile u32 *)(addr))
+#define writew(b,addr)         out_be16((volatile u16 *)(addr),(b))
+#define writel(b,addr)         out_be32((volatile u32 *)(addr),(b))
 #endif
 
 /*
index 6de920eb43735f08e5949902975fedc250374454..9caff7350550fafbbc82fd69aad5f81f2a5dc4bc 100644 (file)
@@ -31,9 +31,6 @@
 #endif
 #include <net.h>
 #include <serial.h>
-#if defined(CONFIG_CMD_BEDBUG)
-#include <cmd_bedbug.h>
-#endif
 #ifdef CONFIG_SYS_ALLOC_DPRAM
 #include <commproc.h>
 #endif
@@ -602,11 +599,6 @@ void board_init_r (gd_t *id, ulong dest_addr)
        last_stage_init ();
 #endif
 
-#if defined(CONFIG_CMD_BEDBUG)
-       WATCHDOG_RESET ();
-       bedbug_init ();
-#endif
-
 #if defined(CONFIG_PRAM) || defined(CONFIG_LOGBUFFER)
        /*
         * Export available size of memory for Linux,
diff --git a/arch/microblaze/dts/include/dt-bindings b/arch/microblaze/dts/include/dt-bindings
new file mode 120000 (symlink)
index 0000000..0cecb3d
--- /dev/null
@@ -0,0 +1 @@
+../../../../include/dt-bindings
\ No newline at end of file
index d60b307f6fd5c0f04f9f56dd3f43e1a6350c5eba..6977dd641aba734e23d599127e2a901bb2e397b8 100644 (file)
@@ -58,7 +58,7 @@ int do_bootm_linux(int flag, int argc, char * const argv[],
        /* fixup the initrd now that we know where it should be */
        if (images->rd_start && images->rd_end && of_flat_tree)
                ret = fdt_initrd(of_flat_tree, images->rd_start,
-                                images->rd_end, 1);
+                                images->rd_end);
                if (ret)
                        return 1;
 
index 57d04a45b22b7edf813629bbff4bb7c6e5bef255..1c4aa3f9bc4c4d054b7cbcd502163693a44319bc 100644 (file)
@@ -341,6 +341,7 @@ int os_dirent_ls(const char *dirname, struct os_dirent_node **headp)
                        ret = -ENOMEM;
                        goto done;
                }
+               next->next = NULL;
                strcpy(next->name, entry.d_name);
                switch (entry.d_type) {
                case DT_REG:
diff --git a/arch/sandbox/dts/include/dt-bindings b/arch/sandbox/dts/include/dt-bindings
new file mode 120000 (symlink)
index 0000000..0cecb3d
--- /dev/null
@@ -0,0 +1 @@
+../../../../include/dt-bindings
\ No newline at end of file
index 74219c56a7f6d42685ad48db33a920280b2abef0..e807c4ef34bda06b5f1d555bb248ea02fccf4390 100644 (file)
@@ -17,6 +17,7 @@
 #ifndef __ASM_SANDBOX_BITOPS_H
 #define __ASM_SANDBOX_BITOPS_H
 
+#include <linux/compiler.h>
 #include <asm/system.h>
 
 #ifdef __KERNEL__
@@ -53,7 +54,7 @@ static inline int __test_and_set_bit(int nr, void *addr)
 
 static inline int test_and_set_bit(int nr, void *addr)
 {
-       unsigned long flags;
+       unsigned long __always_unused flags;
        int out;
 
        local_irq_save(flags);
@@ -75,7 +76,7 @@ static inline int __test_and_clear_bit(int nr, void *addr)
 
 static inline int test_and_clear_bit(int nr, void *addr)
 {
-       unsigned long flags;
+       unsigned long __always_unused flags;
        int out;
 
        local_irq_save(flags);
index 7956041171f52beaaeb5b263da17926414d5dcdd..895fcb872f6a375876fdd05c5fe73714871fbc00 100644 (file)
@@ -40,4 +40,14 @@ static inline void unmap_sysmem(const void *vaddr)
 /* Map from a pointer to our RAM buffer */
 phys_addr_t map_to_sysmem(const void *ptr);
 
+/* Define nops for sandbox I/O access */
+#define readb(addr) 0
+#define readw(addr) 0
+#define readl(addr) 0
+#define writeb(v, addr)
+#define writew(v, addr)
+#define writel(v, addr)
+
+#include <iotrace.h>
+
 #endif
index 066acc53fdb9e1685cdbb61cc1dab384aaf7f348..02beed35a775b1596257296bb6607d1848fb1691 100644 (file)
@@ -8,10 +8,7 @@
 #define __ASM_SANDBOX_SYSTEM_H
 
 /* Define this as nops for sandbox architecture */
-static inline void local_irq_save(unsigned flags __attribute__((unused)))
-{
-}
-
+#define local_irq_save(x)
 #define local_irq_enable()
 #define local_irq_disable()
 #define local_save_flags(x)
index 38cb7c93a5b6639dbabbfb715040a70caa67203e..3106079c852c0ca54a4c3609805e3413909be2d4 100644 (file)
@@ -16,17 +16,18 @@ PF_CPPFLAGS_X86   := $(call cc-option, -fno-toplevel-reorder, \
 PLATFORM_CPPFLAGS += $(PF_CPPFLAGS_X86)
 PLATFORM_CPPFLAGS += -fno-dwarf2-cfi-asm
 PLATFORM_CPPFLAGS += -DREALMODE_BASE=0x7c0
+PLATFORM_CPPFLAGS += -march=i386 -m32
 
 # Support generic board on x86
 __HAVE_ARCH_GENERIC_BOARD := y
 
 PLATFORM_RELFLAGS += -ffunction-sections -fvisibility=hidden
 
-PLATFORM_LDFLAGS += --emit-relocs -Bsymbolic -Bsymbolic-functions
+PLATFORM_LDFLAGS += --emit-relocs -Bsymbolic -Bsymbolic-functions -m elf_i386
 
 LDFLAGS_FINAL += --gc-sections -pie
 LDFLAGS_FINAL += --wrap=__divdi3 --wrap=__udivdi3
 LDFLAGS_FINAL += --wrap=__moddi3 --wrap=__umoddi3
 
-export NORMAL_LIBGCC = $(shell $(CC) $(CFLAGS) -print-libgcc-file-name)
+export NORMAL_LIBGCC = $(shell $(CC) $(PLATFORM_CPPFLAGS) -print-libgcc-file-name)
 CONFIG_USE_PRIVATE_LIBGCC := arch/x86/lib
index c1568cacd077c9d1efc54a4f75f37dccffe487fe..4b2c873b0efce6bde6e1ea2d6a194e2ff1ea6083 100644 (file)
@@ -7,7 +7,7 @@
 
 CROSS_COMPILE ?= i386-linux-
 
-PLATFORM_CPPFLAGS += -DCONFIG_X86 -D__I386__ -march=i386 -Werror
+PLATFORM_CPPFLAGS += -DCONFIG_X86 -D__I386__ -Werror
 
 # DO NOT MODIFY THE FOLLOWING UNLESS YOU REALLY KNOW WHAT YOU ARE DOING!
 LDPPFLAGS += -DRESET_SEG_START=0xffff0000
diff --git a/arch/x86/dts/include/dt-bindings b/arch/x86/dts/include/dt-bindings
new file mode 120000 (symlink)
index 0000000..0cecb3d
--- /dev/null
@@ -0,0 +1 @@
+../../../../include/dt-bindings
\ No newline at end of file
diff --git a/board/altera/common/sevenseg.c b/board/altera/common/sevenseg.c
deleted file mode 100644 (file)
index 1f22c85..0000000
+++ /dev/null
@@ -1,204 +0,0 @@
-/*
- * (C) Copyright 2003, Li-Pro.Net <www.li-pro.net>
- * Stephan Linz <linz@li-pro.net>
- *
- * SPDX-License-Identifier:    GPL-2.0+
- *
- * common/sevenseg.c
- *
- * NIOS PIO based seven segment led support functions
- */
-
-#include <common.h>
-#include <nios-io.h>
-
-#ifdef CONFIG_SEVENSEG
-
-#define SEVENDEG_MASK_DP       ((SEVENSEG_DIGIT_DP << 8) | SEVENSEG_DIGIT_DP)
-
-#ifdef SEVENSEG_WRONLY /* emulate read access */
-#if (SEVENSEG_ACTIVE == 0)
-static unsigned int sevenseg_portval = ~0;
-#else
-static unsigned int sevenseg_portval = 0;
-#endif
-#endif
-
-static int sevenseg_init_done = 0;
-
-static inline void __sevenseg_set_masked (unsigned int mask, int value)
-{
-       nios_pio_t *piop __attribute__((unused)) = (nios_pio_t*)SEVENSEG_BASE;
-
-#ifdef SEVENSEG_WRONLY /* emulate read access */
-
-#if (SEVENSEG_ACTIVE == 0)
-       if (value)
-               sevenseg_portval &= ~mask;
-       else
-               sevenseg_portval |= mask;
-#else
-       if (value)
-               sevenseg_portval |= mask;
-       else
-               sevenseg_portval &= ~mask;
-#endif
-
-       piop->data = sevenseg_portval;
-
-#else  /* !SEVENSEG_WRONLY */
-
-#if (SEVENSEG_ACTIVE == 0)
-       if (value)
-               piop->data &= ~mask;
-       else
-               piop->data |= mask;
-#else
-       if (value)
-               piop->data |= mask;
-       else
-               piop->data &= ~mask;
-#endif
-
-#endif /* SEVENSEG_WRONLY */
-}
-
-static inline void __sevenseg_toggle_masked (unsigned int mask)
-{
-       nios_pio_t *piop = (nios_pio_t*)SEVENSEG_BASE;
-
-#ifdef SEVENSEG_WRONLY /* emulate read access */
-
-       sevenseg_portval ^= mask;
-       piop->data = sevenseg_portval;
-
-#else  /* !SEVENSEG_WRONLY */
-
-       piop->data ^= mask;
-
-#endif /* SEVENSEG_WRONLY */
-}
-
-static inline void __sevenseg_set (unsigned int value)
-{
-       nios_pio_t *piop __attribute__((unused)) = (nios_pio_t*)SEVENSEG_BASE;
-
-#ifdef SEVENSEG_WRONLY /* emulate read access */
-
-#if (SEVENSEG_ACTIVE == 0)
-       sevenseg_portval = (sevenseg_portval &   SEVENDEG_MASK_DP)
-                        | ((~value)         & (~SEVENDEG_MASK_DP));
-#else
-       sevenseg_portval = (sevenseg_portval & SEVENDEG_MASK_DP)
-                        | (value);
-#endif
-
-       piop->data = sevenseg_portval;
-
-#else  /* !SEVENSEG_WRONLY */
-
-#if (SEVENSEG_ACTIVE == 0)
-       piop->data = (piop->data &   SEVENDEG_MASK_DP)
-                  | ((~value)   & (~SEVENDEG_MASK_DP));
-#else
-       piop->data = (piop->data & SEVENDEG_MASK_DP)
-                  | (value);
-#endif
-
-#endif /* SEVENSEG_WRONLY */
-}
-
-static inline void __sevenseg_init (void)
-{
-       nios_pio_t *piop __attribute__((unused)) = (nios_pio_t*)SEVENSEG_BASE;
-
-       __sevenseg_set(0);
-
-#ifndef        SEVENSEG_WRONLY /* setup direction */
-
-       piop->direction |= mask;
-
-#endif /* SEVENSEG_WRONLY */
-}
-
-
-void sevenseg_set(int value)
-{
-       unsigned char   digits[] = {
-               SEVENSEG_DIGITS_0,
-               SEVENSEG_DIGITS_1,
-               SEVENSEG_DIGITS_2,
-               SEVENSEG_DIGITS_3,
-               SEVENSEG_DIGITS_4,
-               SEVENSEG_DIGITS_5,
-               SEVENSEG_DIGITS_6,
-               SEVENSEG_DIGITS_7,
-               SEVENSEG_DIGITS_8,
-               SEVENSEG_DIGITS_9,
-               SEVENSEG_DIGITS_A,
-               SEVENSEG_DIGITS_B,
-               SEVENSEG_DIGITS_C,
-               SEVENSEG_DIGITS_D,
-               SEVENSEG_DIGITS_E,
-               SEVENSEG_DIGITS_F
-       };
-
-       if (!sevenseg_init_done) {
-               __sevenseg_init();
-               sevenseg_init_done++;
-       }
-
-       switch (value & SEVENSEG_MASK_CTRL) {
-
-               case SEVENSEG_RAW:
-                       __sevenseg_set( (
-                               (digits[((value & SEVENSEG_MASK_VAL) >>  4)] << 8) |
-                               digits[((value & SEVENSEG_MASK_VAL) & 0xf)] ) );
-                       return;
-                       break;  /* paranoia */
-
-               case SEVENSEG_OFF:
-                       __sevenseg_set(0);
-                       __sevenseg_set_masked(SEVENDEG_MASK_DP, 0);
-                       return;
-                       break;  /* paranoia */
-
-               case SEVENSEG_SET_DPL:
-                       __sevenseg_set_masked(SEVENSEG_DIGIT_DP, 1);
-                       return;
-                       break;  /* paranoia */
-
-               case SEVENSEG_SET_DPH:
-                       __sevenseg_set_masked((SEVENSEG_DIGIT_DP << 8), 1);
-                       return;
-                       break;  /* paranoia */
-
-               case SEVENSEG_RES_DPL:
-                       __sevenseg_set_masked(SEVENSEG_DIGIT_DP, 0);
-                       return;
-                       break;  /* paranoia */
-
-               case SEVENSEG_RES_DPH:
-                       __sevenseg_set_masked((SEVENSEG_DIGIT_DP << 8), 0);
-                       return;
-                       break;  /* paranoia */
-
-               case SEVENSEG_TOG_DPL:
-                       __sevenseg_toggle_masked(SEVENSEG_DIGIT_DP);
-                       return;
-                       break;  /* paranoia */
-
-               case SEVENSEG_TOG_DPH:
-                       __sevenseg_toggle_masked((SEVENSEG_DIGIT_DP << 8));
-                       return;
-                       break;  /* paranoia */
-
-               case SEVENSEG_LO:
-               case SEVENSEG_HI:
-               case SEVENSEG_STR:
-               default:
-                       break;
-       }
-}
-
-#endif /* CONFIG_SEVENSEG */
diff --git a/board/altera/common/sevenseg.h b/board/altera/common/sevenseg.h
deleted file mode 100644 (file)
index 3434832..0000000
+++ /dev/null
@@ -1,126 +0,0 @@
-/*
- * (C) Copyright 2003, Li-Pro.Net <www.li-pro.net>
- * Stephan Linz <linz@li-pro.net>
- *
- * SPDX-License-Identifier:    GPL-2.0+
- *
- * common/sevenseg.h
- *
- * NIOS PIO based seven segment led support functions
- */
-
-#ifndef __DK1S10_SEVENSEG_H__
-#define __DK1S10_SEVENSEG_H__
-
-#ifdef CONFIG_SEVENSEG
-
-/*
- *  15                    8 7      0
- * |-----------------------|--------|
- * |   controll value      |  value |
- * ----------------------------------
- */
-#define        SEVENSEG_RAW            (int)(0)        /* write out byte value (hex) */
-#define        SEVENSEG_OFF            (int)( 1 << 8)  /* display switch off */
-#define        SEVENSEG_SET_DPL        (int)( 2 << 8)  /* set dp low  nibble */
-#define        SEVENSEG_SET_DPH        (int)( 3 << 8)  /* set dp high nibble */
-#define        SEVENSEG_RES_DPL        (int)( 4 << 8)  /* reset dp low  nibble */
-#define        SEVENSEG_RES_DPH        (int)( 5 << 8)  /* reset dp high nibble */
-#define        SEVENSEG_TOG_DPL        (int)( 6 << 8)  /* toggle dp low  nibble */
-#define        SEVENSEG_TOG_DPH        (int)( 7 << 8)  /* toggle dp high nibble */
-#define        SEVENSEG_LO             (int)( 8 << 8)  /* write out low nibble only */
-#define        SEVENSEG_HI             (int)( 9 << 8)  /* write out high nibble only */
-#define        SEVENSEG_STR            (int)(10 << 8)  /* write out a string */
-
-#define        SEVENSEG_MASK_VAL       (0xff)          /* only used by SEVENSEG_RAW */
-#define        SEVENSEG_MASK_CTRL      (~SEVENSEG_MASK_VAL)
-
-#ifdef SEVENSEG_DIGIT_HI_LO_EQUAL
-
-#define        SEVENSEG_DIGITS_0       (       SEVENSEG_DIGIT_A        \
-                               |       SEVENSEG_DIGIT_B        \
-                               |       SEVENSEG_DIGIT_C        \
-                               |       SEVENSEG_DIGIT_D        \
-                               |       SEVENSEG_DIGIT_E        \
-                               |       SEVENSEG_DIGIT_F        )
-#define        SEVENSEG_DIGITS_1       (       SEVENSEG_DIGIT_B        \
-                               |       SEVENSEG_DIGIT_C        )
-#define        SEVENSEG_DIGITS_2       (       SEVENSEG_DIGIT_A        \
-                               |       SEVENSEG_DIGIT_B        \
-                               |       SEVENSEG_DIGIT_D        \
-                               |       SEVENSEG_DIGIT_E        \
-                               |       SEVENSEG_DIGIT_G        )
-#define        SEVENSEG_DIGITS_3       (       SEVENSEG_DIGIT_A        \
-                               |       SEVENSEG_DIGIT_B        \
-                               |       SEVENSEG_DIGIT_C        \
-                               |       SEVENSEG_DIGIT_D        \
-                               |       SEVENSEG_DIGIT_G        )
-#define        SEVENSEG_DIGITS_4       (       SEVENSEG_DIGIT_B        \
-                               |       SEVENSEG_DIGIT_C        \
-                               |       SEVENSEG_DIGIT_F        \
-                               |       SEVENSEG_DIGIT_G        )
-#define        SEVENSEG_DIGITS_5       (       SEVENSEG_DIGIT_A        \
-                               |       SEVENSEG_DIGIT_C        \
-                               |       SEVENSEG_DIGIT_D        \
-                               |       SEVENSEG_DIGIT_F        \
-                               |       SEVENSEG_DIGIT_G        )
-#define        SEVENSEG_DIGITS_6       (       SEVENSEG_DIGIT_A        \
-                               |       SEVENSEG_DIGIT_C        \
-                               |       SEVENSEG_DIGIT_D        \
-                               |       SEVENSEG_DIGIT_E        \
-                               |       SEVENSEG_DIGIT_F        \
-                               |       SEVENSEG_DIGIT_G        )
-#define        SEVENSEG_DIGITS_7       (       SEVENSEG_DIGIT_A        \
-                               |       SEVENSEG_DIGIT_B        \
-                               |       SEVENSEG_DIGIT_C        )
-#define        SEVENSEG_DIGITS_8       (       SEVENSEG_DIGIT_A        \
-                               |       SEVENSEG_DIGIT_B        \
-                               |       SEVENSEG_DIGIT_C        \
-                               |       SEVENSEG_DIGIT_D        \
-                               |       SEVENSEG_DIGIT_E        \
-                               |       SEVENSEG_DIGIT_F        \
-                               |       SEVENSEG_DIGIT_G        )
-#define        SEVENSEG_DIGITS_9       (       SEVENSEG_DIGIT_A        \
-                               |       SEVENSEG_DIGIT_B        \
-                               |       SEVENSEG_DIGIT_C        \
-                               |       SEVENSEG_DIGIT_D        \
-                               |       SEVENSEG_DIGIT_F        \
-                               |       SEVENSEG_DIGIT_G        )
-#define        SEVENSEG_DIGITS_A       (       SEVENSEG_DIGIT_A        \
-                               |       SEVENSEG_DIGIT_B        \
-                               |       SEVENSEG_DIGIT_C        \
-                               |       SEVENSEG_DIGIT_E        \
-                               |       SEVENSEG_DIGIT_F        \
-                               |       SEVENSEG_DIGIT_G        )
-#define        SEVENSEG_DIGITS_B       (       SEVENSEG_DIGIT_C        \
-                               |       SEVENSEG_DIGIT_D        \
-                               |       SEVENSEG_DIGIT_E        \
-                               |       SEVENSEG_DIGIT_F        \
-                               |       SEVENSEG_DIGIT_G        )
-#define        SEVENSEG_DIGITS_C       (       SEVENSEG_DIGIT_D        \
-                               |       SEVENSEG_DIGIT_E        \
-                               |       SEVENSEG_DIGIT_G        )
-#define        SEVENSEG_DIGITS_D       (       SEVENSEG_DIGIT_B        \
-                               |       SEVENSEG_DIGIT_C        \
-                               |       SEVENSEG_DIGIT_D        \
-                               |       SEVENSEG_DIGIT_E        \
-                               |       SEVENSEG_DIGIT_G        )
-#define        SEVENSEG_DIGITS_E       (       SEVENSEG_DIGIT_A        \
-                               |       SEVENSEG_DIGIT_D        \
-                               |       SEVENSEG_DIGIT_E        \
-                               |       SEVENSEG_DIGIT_F        \
-                               |       SEVENSEG_DIGIT_G        )
-#define        SEVENSEG_DIGITS_F       (       SEVENSEG_DIGIT_A        \
-                               |       SEVENSEG_DIGIT_E        \
-                               |       SEVENSEG_DIGIT_F        \
-                               |       SEVENSEG_DIGIT_G        )
-
-#else  /* !SEVENSEG_DIGIT_HI_LO_EQUAL */
-#error SEVENSEG: different pin asssignments not supported
-#endif
-
-void sevenseg_set(int value);
-
-#endif /* CONFIG_SEVENSEG */
-
-#endif /* __DK1S10_SEVENSEG_H__ */
index 84690fe04d764768cb57f3ccf48cabec0cc41baa..aa362b36090c79f7a86755b63a0fa5f4453e041a 100644 (file)
@@ -9,5 +9,4 @@
 obj-y  := nios2-generic.o
 obj-$(CONFIG_CMD_IDE) += ../common/cfide.o
 obj-$(CONFIG_EPLED) += ../common/epled.o
-obj-$(CONFIG_SEVENSEG) += ../common/sevenseg.o
 obj-y  += text_base.o
index 387e454cef66eb721adae4cdbeec44e4fa4adb29..16bba59ba81dfcaf6f290b5d88d1be9d2c428c99 100644 (file)
@@ -177,7 +177,7 @@ int flash_erase(flash_info_t * info, int s_first, int s_last)
 {
        FPWV *addr;
        int flag, prot, sect, count;
-       ulong type, start, last;
+       ulong type, start;
        int rcode = 0, flashtype = 0;
 
        if ((s_first < 0) || (s_first > s_last)) {
@@ -217,7 +217,6 @@ int flash_erase(flash_info_t * info, int s_first, int s_last)
        flag = disable_interrupts();
 
        start = get_timer(0);
-       last = start;
 
        if ((s_last - s_first) == (CONFIG_SYS_SST_SECT - 1)) {
                if (prot == 0) {
@@ -319,14 +318,13 @@ int write_buff(flash_info_t * info, uchar * src, ulong addr, ulong cnt)
 {
        ulong wp, count;
        u16 data;
-       int rc, port_width;
+       int rc;
 
        if (info->flash_id == FLASH_UNKNOWN)
                return 4;
 
        /* get lower word aligned address */
        wp = addr;
-       port_width = sizeof(FPW);
 
        /* handle unaligned start bytes */
        if (wp & 1) {
index d64d3aa872205f237fce290ae4ec0187c1ead705..54a9f2c7c35d122a050e3f67b41be7dd4b052b24 100644 (file)
@@ -278,6 +278,26 @@ static void setup_iomux_i2c(void)
        imx_iomux_v3_setup_multiple_pads(i2c0_pads, ARRAY_SIZE(i2c0_pads));
 }
 
+static void setup_iomux_qspi(void)
+{
+       static const iomux_v3_cfg_t qspi0_pads[] = {
+               VF610_PAD_PTD0__QSPI0_A_QSCK,
+               VF610_PAD_PTD1__QSPI0_A_CS0,
+               VF610_PAD_PTD2__QSPI0_A_DATA3,
+               VF610_PAD_PTD3__QSPI0_A_DATA2,
+               VF610_PAD_PTD4__QSPI0_A_DATA1,
+               VF610_PAD_PTD5__QSPI0_A_DATA0,
+               VF610_PAD_PTD7__QSPI0_B_QSCK,
+               VF610_PAD_PTD8__QSPI0_B_CS0,
+               VF610_PAD_PTD9__QSPI0_B_DATA3,
+               VF610_PAD_PTD10__QSPI0_B_DATA2,
+               VF610_PAD_PTD11__QSPI0_B_DATA1,
+               VF610_PAD_PTD12__QSPI0_B_DATA0,
+       };
+
+       imx_iomux_v3_setup_multiple_pads(qspi0_pads, ARRAY_SIZE(qspi0_pads));
+}
+
 #ifdef CONFIG_FSL_ESDHC
 struct fsl_esdhc_cfg esdhc_cfg[1] = {
        {ESDHC1_BASE_ADDR},
@@ -321,7 +341,8 @@ static void clock_init(void)
        clrsetbits_le32(&ccm->ccgr2, CCM_REG_CTRL_MASK,
                CCM_CCGR2_IOMUXC_CTRL_MASK | CCM_CCGR2_PORTA_CTRL_MASK |
                CCM_CCGR2_PORTB_CTRL_MASK | CCM_CCGR2_PORTC_CTRL_MASK |
-               CCM_CCGR2_PORTD_CTRL_MASK | CCM_CCGR2_PORTE_CTRL_MASK);
+               CCM_CCGR2_PORTD_CTRL_MASK | CCM_CCGR2_PORTE_CTRL_MASK |
+               CCM_CCGR2_QSPI0_CTRL_MASK);
        clrsetbits_le32(&ccm->ccgr3, CCM_REG_CTRL_MASK,
                CCM_CCGR3_ANADIG_CTRL_MASK);
        clrsetbits_le32(&ccm->ccgr4, CCM_REG_CTRL_MASK,
@@ -352,11 +373,14 @@ static void clock_init(void)
                CCM_CACRR_IPG_CLK_DIV(1) | CCM_CACRR_BUS_CLK_DIV(2) |
                CCM_CACRR_ARM_CLK_DIV(0));
        clrsetbits_le32(&ccm->cscmr1, CCM_REG_CTRL_MASK,
-               CCM_CSCMR1_ESDHC1_CLK_SEL(3));
+               CCM_CSCMR1_ESDHC1_CLK_SEL(3) | CCM_CSCMR1_QSPI0_CLK_SEL(3));
        clrsetbits_le32(&ccm->cscdr1, CCM_REG_CTRL_MASK,
                CCM_CSCDR1_RMII_CLK_EN);
        clrsetbits_le32(&ccm->cscdr2, CCM_REG_CTRL_MASK,
                CCM_CSCDR2_ESDHC1_EN | CCM_CSCDR2_ESDHC1_CLK_DIV(0));
+       clrsetbits_le32(&ccm->cscdr3, CCM_REG_CTRL_MASK,
+               CCM_CSCDR3_QSPI0_EN | CCM_CSCDR3_QSPI0_DIV(1) |
+               CCM_CSCDR3_QSPI0_X2_DIV(1) | CCM_CSCDR3_QSPI0_X4_DIV(3));
        clrsetbits_le32(&ccm->cscmr2, CCM_REG_CTRL_MASK,
                CCM_CSCMR2_RMII_CLK_SEL(0));
 }
@@ -386,6 +410,7 @@ int board_early_init_f(void)
        setup_iomux_uart();
        setup_iomux_enet();
        setup_iomux_i2c();
+       setup_iomux_qspi();
 
        return 0;
 }
index 2f8e306261815acd00e51137c31d2034acf34b4b..3a075c471f87d63df491120267367bed84702243 100644 (file)
@@ -287,7 +287,7 @@ int last_stage_init(void)
        for (fpga = 0; fpga < 2; ++fpga) {
                for (k = 0; k < 32; ++k) {
                        u16 status;
-                       FPGA_GET_REG(k, ch[k].status_int, &status);
+                       FPGA_GET_REG(fpga, ch[k].status_int, &status);
                        if (!(status & (1 << 4))) {
                                failed = 1;
                                printf("fpga %d channel %d: no serdes lock\n",
@@ -304,7 +304,7 @@ int last_stage_init(void)
        for (fpga = 0; fpga < 2; ++fpga) {
                for (k = 0; k < 32; ++k) {
                        u16 status;
-                       FPGA_GET_REG(k, hicb_ch[k].status_int, &status);
+                       FPGA_GET_REG(fpga, hicb_ch[k].status_int, &status);
                        if (status)
                                printf("fpga %d hicb %d: hicb status %04x\n",
                                        fpga, k, status);
index 3fca3c53b2e12d5af12b39af88c9c2c9c0465ec9..7e13c9051cbc815762f930df38678b8bb0770d1a 100644 (file)
@@ -30,7 +30,7 @@
 #include <i2c.h>
 #include <mmc.h>
 #include <tpm.h>
-#include <sha1.h>
+#include <u-boot/sha1.h>
 #include <asm/byteorder.h>
 #include <asm/unaligned.h>
 #include <pca9698.h>
index f90e809d158b4b388c54bf696af6ff8b195fbc63..267c0014359eb8d9cfde7e43fd4ade139da2025b 100644 (file)
@@ -13,7 +13,7 @@
 #include <asm/processor.h>
 #include <spd_sdram.h>
 #include <status_led.h>
-#include <sha1.h>
+#include <u-boot/sha1.h>
 #include <asm/io.h>
 #include <net.h>
 #include <ata.h>
index 409a7a82fb49c3dc05509515caa2897ecb8addbe..64cb97029eeb043fde19fc6f6ca7ae78bc8c14a5 100644 (file)
@@ -7,11 +7,7 @@
 
 
 #include <common.h>
-#if defined(CONFIG_NIOS)
-#include <nios.h>
-#else
 #include <asm/io.h>
-#endif
 
 #define SECTSZ         (64 * 1024)
 flash_info_t flash_info[CONFIG_SYS_MAX_FLASH_BANKS];
index 391a8d6230a3ebb68cdeb3259971055377dac745..de5cce86cc6990c99a3f2f5d5d59084343f5fb01 100644 (file)
@@ -40,7 +40,7 @@ obj-$(CONFIG_SYS_GENERIC_BOARD) += board_r.o
 
 # core command
 obj-y += cmd_boot.o
-obj-$(CONFIG_CMD_BOOTM) += cmd_bootm.o
+obj-$(CONFIG_CMD_BOOTM) += cmd_bootm.o bootm.o bootm_os.o
 obj-y += cmd_help.o
 obj-y += cmd_version.o
 
@@ -114,6 +114,7 @@ obj-$(CONFIG_CMD_FUSE) += cmd_fuse.o
 obj-$(CONFIG_CMD_GETTIME) += cmd_gettime.o
 obj-$(CONFIG_CMD_GPIO) += cmd_gpio.o
 obj-$(CONFIG_CMD_I2C) += cmd_i2c.o
+obj-$(CONFIG_CMD_IOTRACE) += cmd_iotrace.o
 obj-$(CONFIG_CMD_HASH) += cmd_hash.o
 obj-$(CONFIG_CMD_IDE) += cmd_ide.o
 obj-$(CONFIG_CMD_IMMAP) += cmd_immap.o
@@ -261,6 +262,7 @@ obj-$(CONFIG_ANDROID_BOOT_IMAGE) += image-android.o
 obj-$(CONFIG_OF_LIBFDT) += image-fdt.o
 obj-$(CONFIG_FIT) += image-fit.o
 obj-$(CONFIG_FIT_SIGNATURE) += image-sig.o
+obj-$(CONFIG_IO_TRACE) += iotrace.o
 obj-y += memsize.o
 obj-y += stdio.o
 
index dc24cae61201c98dabd992a6344d2700e7e02fbf..30102a47a8aefecf85ccd38984e054541bbe669a 100644 (file)
@@ -40,10 +40,10 @@ static int abortboot_keyed(int bootdelay)
                int retry;
        }
        delaykey[] = {
-               { str: getenv("bootdelaykey"),  retry: 1 },
-               { str: getenv("bootdelaykey2"), retry: 1 },
-               { str: getenv("bootstopkey"),   retry: 0 },
-               { str: getenv("bootstopkey2"),  retry: 0 },
+               { .str = getenv("bootdelaykey"),  .retry = 1 },
+               { .str = getenv("bootdelaykey2"), .retry = 1 },
+               { .str = getenv("bootstopkey"),   .retry = 0 },
+               { .str = getenv("bootstopkey2"),  .retry = 0 },
        };
 
        char presskey[MAX_DELAY_STOP_STR];
diff --git a/common/bootm.c b/common/bootm.c
new file mode 100644 (file)
index 0000000..7ec2ed8
--- /dev/null
@@ -0,0 +1,913 @@
+/*
+ * (C) Copyright 2000-2009
+ * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#ifndef USE_HOSTCC
+#include <common.h>
+#include <bootstage.h>
+#include <bzlib.h>
+#include <fdt_support.h>
+#include <lmb.h>
+#include <malloc.h>
+#include <asm/io.h>
+#include <linux/lzo.h>
+#include <lzma/LzmaTypes.h>
+#include <lzma/LzmaDec.h>
+#include <lzma/LzmaTools.h>
+#if defined(CONFIG_CMD_USB)
+#include <usb.h>
+#endif
+#else
+#include "mkimage.h"
+#endif
+
+#include <command.h>
+#include <bootm.h>
+#include <image.h>
+
+#ifndef CONFIG_SYS_BOOTM_LEN
+/* use 8MByte as default max gunzip size */
+#define CONFIG_SYS_BOOTM_LEN   0x800000
+#endif
+
+#define IH_INITRD_ARCH IH_ARCH_DEFAULT
+
+#ifndef USE_HOSTCC
+
+DECLARE_GLOBAL_DATA_PTR;
+
+static const void *boot_get_kernel(cmd_tbl_t *cmdtp, int flag, int argc,
+                                  char * const argv[], bootm_headers_t *images,
+                                  ulong *os_data, ulong *os_len);
+
+#ifdef CONFIG_LMB
+static void boot_start_lmb(bootm_headers_t *images)
+{
+       ulong           mem_start;
+       phys_size_t     mem_size;
+
+       lmb_init(&images->lmb);
+
+       mem_start = getenv_bootm_low();
+       mem_size = getenv_bootm_size();
+
+       lmb_add(&images->lmb, (phys_addr_t)mem_start, mem_size);
+
+       arch_lmb_reserve(&images->lmb);
+       board_lmb_reserve(&images->lmb);
+}
+#else
+#define lmb_reserve(lmb, base, size)
+static inline void boot_start_lmb(bootm_headers_t *images) { }
+#endif
+
+static int bootm_start(cmd_tbl_t *cmdtp, int flag, int argc,
+                      char * const argv[])
+{
+       memset((void *)&images, 0, sizeof(images));
+       images.verify = getenv_yesno("verify");
+
+       boot_start_lmb(&images);
+
+       bootstage_mark_name(BOOTSTAGE_ID_BOOTM_START, "bootm_start");
+       images.state = BOOTM_STATE_START;
+
+       return 0;
+}
+
+static int bootm_find_os(cmd_tbl_t *cmdtp, int flag, int argc,
+                        char * const argv[])
+{
+       const void *os_hdr;
+       bool ep_found = false;
+
+       /* get kernel image header, start address and length */
+       os_hdr = boot_get_kernel(cmdtp, flag, argc, argv,
+                       &images, &images.os.image_start, &images.os.image_len);
+       if (images.os.image_len == 0) {
+               puts("ERROR: can't get kernel image!\n");
+               return 1;
+       }
+
+       /* get image parameters */
+       switch (genimg_get_format(os_hdr)) {
+#if defined(CONFIG_IMAGE_FORMAT_LEGACY)
+       case IMAGE_FORMAT_LEGACY:
+               images.os.type = image_get_type(os_hdr);
+               images.os.comp = image_get_comp(os_hdr);
+               images.os.os = image_get_os(os_hdr);
+
+               images.os.end = image_get_image_end(os_hdr);
+               images.os.load = image_get_load(os_hdr);
+               break;
+#endif
+#if defined(CONFIG_FIT)
+       case IMAGE_FORMAT_FIT:
+               if (fit_image_get_type(images.fit_hdr_os,
+                                      images.fit_noffset_os,
+                                      &images.os.type)) {
+                       puts("Can't get image type!\n");
+                       bootstage_error(BOOTSTAGE_ID_FIT_TYPE);
+                       return 1;
+               }
+
+               if (fit_image_get_comp(images.fit_hdr_os,
+                                      images.fit_noffset_os,
+                                      &images.os.comp)) {
+                       puts("Can't get image compression!\n");
+                       bootstage_error(BOOTSTAGE_ID_FIT_COMPRESSION);
+                       return 1;
+               }
+
+               if (fit_image_get_os(images.fit_hdr_os, images.fit_noffset_os,
+                                    &images.os.os)) {
+                       puts("Can't get image OS!\n");
+                       bootstage_error(BOOTSTAGE_ID_FIT_OS);
+                       return 1;
+               }
+
+               images.os.end = fit_get_end(images.fit_hdr_os);
+
+               if (fit_image_get_load(images.fit_hdr_os, images.fit_noffset_os,
+                                      &images.os.load)) {
+                       puts("Can't get image load address!\n");
+                       bootstage_error(BOOTSTAGE_ID_FIT_LOADADDR);
+                       return 1;
+               }
+               break;
+#endif
+#ifdef CONFIG_ANDROID_BOOT_IMAGE
+       case IMAGE_FORMAT_ANDROID:
+               images.os.type = IH_TYPE_KERNEL;
+               images.os.comp = IH_COMP_NONE;
+               images.os.os = IH_OS_LINUX;
+               images.ep = images.os.load;
+               ep_found = true;
+
+               images.os.end = android_image_get_end(os_hdr);
+               images.os.load = android_image_get_kload(os_hdr);
+               break;
+#endif
+       default:
+               puts("ERROR: unknown image format type!\n");
+               return 1;
+       }
+
+       /* find kernel entry point */
+       if (images.legacy_hdr_valid) {
+               images.ep = image_get_ep(&images.legacy_hdr_os_copy);
+#if defined(CONFIG_FIT)
+       } else if (images.fit_uname_os) {
+               int ret;
+
+               ret = fit_image_get_entry(images.fit_hdr_os,
+                                         images.fit_noffset_os, &images.ep);
+               if (ret) {
+                       puts("Can't get entry point property!\n");
+                       return 1;
+               }
+#endif
+       } else if (!ep_found) {
+               puts("Could not find kernel entry point!\n");
+               return 1;
+       }
+
+       if (images.os.type == IH_TYPE_KERNEL_NOLOAD) {
+               images.os.load = images.os.image_start;
+               images.ep += images.os.load;
+       }
+
+       images.os.start = (ulong)os_hdr;
+
+       return 0;
+}
+
+static int bootm_find_ramdisk(int flag, int argc, char * const argv[])
+{
+       int ret;
+
+       /* find ramdisk */
+       ret = boot_get_ramdisk(argc, argv, &images, IH_INITRD_ARCH,
+                              &images.rd_start, &images.rd_end);
+       if (ret) {
+               puts("Ramdisk image is corrupt or invalid\n");
+               return 1;
+       }
+
+       return 0;
+}
+
+#if defined(CONFIG_OF_LIBFDT)
+static int bootm_find_fdt(int flag, int argc, char * const argv[])
+{
+       int ret;
+
+       /* find flattened device tree */
+       ret = boot_get_fdt(flag, argc, argv, IH_ARCH_DEFAULT, &images,
+                          &images.ft_addr, &images.ft_len);
+       if (ret) {
+               puts("Could not find a valid device tree\n");
+               return 1;
+       }
+
+       set_working_fdt_addr(images.ft_addr);
+
+       return 0;
+}
+#endif
+
+int bootm_find_ramdisk_fdt(int flag, int argc, char * const argv[])
+{
+       if (bootm_find_ramdisk(flag, argc, argv))
+               return 1;
+
+#if defined(CONFIG_OF_LIBFDT)
+       if (bootm_find_fdt(flag, argc, argv))
+               return 1;
+#endif
+
+       return 0;
+}
+
+static int bootm_find_other(cmd_tbl_t *cmdtp, int flag, int argc,
+                           char * const argv[])
+{
+       if (((images.os.type == IH_TYPE_KERNEL) ||
+            (images.os.type == IH_TYPE_KERNEL_NOLOAD) ||
+            (images.os.type == IH_TYPE_MULTI)) &&
+           (images.os.os == IH_OS_LINUX ||
+                images.os.os == IH_OS_VXWORKS))
+               return bootm_find_ramdisk_fdt(flag, argc, argv);
+
+       return 0;
+}
+#endif /* USE_HOSTCC */
+
+/**
+ * decomp_image() - decompress the operating system
+ *
+ * @comp:      Compression algorithm that is used (IH_COMP_...)
+ * @load:      Destination load address in U-Boot memory
+ * @image_start Image start address (where we are decompressing from)
+ * @type:      OS type (IH_OS_...)
+ * @load_bug:  Place to decompress to
+ * @image_buf: Address to decompress from
+ * @return 0 if OK, -ve on error (BOOTM_ERR_...)
+ */
+static int decomp_image(int comp, ulong load, ulong image_start, int type,
+                       void *load_buf, void *image_buf, ulong image_len,
+                       ulong *load_end)
+{
+       const char *type_name = genimg_get_type_name(type);
+       __attribute__((unused)) uint unc_len = CONFIG_SYS_BOOTM_LEN;
+
+       *load_end = load;
+       switch (comp) {
+       case IH_COMP_NONE:
+               if (load == image_start) {
+                       printf("   XIP %s ... ", type_name);
+               } else {
+                       printf("   Loading %s ... ", type_name);
+                       memmove_wd(load_buf, image_buf, image_len, CHUNKSZ);
+               }
+               *load_end = load + image_len;
+               break;
+#ifdef CONFIG_GZIP
+       case IH_COMP_GZIP:
+               printf("   Uncompressing %s ... ", type_name);
+               if (gunzip(load_buf, unc_len, image_buf, &image_len) != 0) {
+                       puts("GUNZIP: uncompress, out-of-mem or overwrite error - must RESET board to recover\n");
+                       return BOOTM_ERR_RESET;
+               }
+
+               *load_end = load + image_len;
+               break;
+#endif /* CONFIG_GZIP */
+#ifdef CONFIG_BZIP2
+       case IH_COMP_BZIP2:
+               printf("   Uncompressing %s ... ", type_name);
+               /*
+                * If we've got less than 4 MB of malloc() space,
+                * use slower decompression algorithm which requires
+                * at most 2300 KB of memory.
+                */
+               int i = BZ2_bzBuffToBuffDecompress(load_buf, &unc_len,
+                       image_buf, image_len,
+                       CONFIG_SYS_MALLOC_LEN < (4096 * 1024), 0);
+               if (i != BZ_OK) {
+                       printf("BUNZIP2: uncompress or overwrite error %d - must RESET board to recover\n",
+                              i);
+                       return BOOTM_ERR_RESET;
+               }
+
+               *load_end = load + unc_len;
+               break;
+#endif /* CONFIG_BZIP2 */
+#ifdef CONFIG_LZMA
+       case IH_COMP_LZMA: {
+               SizeT lzma_len = unc_len;
+               int ret;
+
+               printf("   Uncompressing %s ... ", type_name);
+
+               ret = lzmaBuffToBuffDecompress(load_buf, &lzma_len,
+                                              image_buf, image_len);
+               unc_len = lzma_len;
+               if (ret != SZ_OK) {
+                       printf("LZMA: uncompress or overwrite error %d - must RESET board to recover\n",
+                              ret);
+                       bootstage_error(BOOTSTAGE_ID_DECOMP_IMAGE);
+                       return BOOTM_ERR_RESET;
+               }
+               *load_end = load + unc_len;
+               break;
+       }
+#endif /* CONFIG_LZMA */
+#ifdef CONFIG_LZO
+       case IH_COMP_LZO: {
+               size_t size = unc_len;
+               int ret;
+
+               printf("   Uncompressing %s ... ", type_name);
+
+               ret = lzop_decompress(image_buf, image_len, load_buf, &size);
+               if (ret != LZO_E_OK) {
+                       printf("LZO: uncompress or overwrite error %d - must RESET board to recover\n",
+                              ret);
+                       return BOOTM_ERR_RESET;
+               }
+
+               *load_end = load + size;
+               break;
+       }
+#endif /* CONFIG_LZO */
+       default:
+               printf("Unimplemented compression type %d\n", comp);
+               return BOOTM_ERR_UNIMPLEMENTED;
+       }
+
+       puts("OK\n");
+
+       return 0;
+}
+
+#ifndef USE_HOSTCC
+static int bootm_load_os(bootm_headers_t *images, unsigned long *load_end,
+                        int boot_progress)
+{
+       image_info_t os = images->os;
+       ulong load = os.load;
+       ulong blob_start = os.start;
+       ulong blob_end = os.end;
+       ulong image_start = os.image_start;
+       ulong image_len = os.image_len;
+       bool no_overlap;
+       void *load_buf, *image_buf;
+       int err;
+
+       load_buf = map_sysmem(load, 0);
+       image_buf = map_sysmem(os.image_start, image_len);
+       err = decomp_image(os.comp, load, os.image_start, os.type, load_buf,
+                          image_buf, image_len, load_end);
+       if (err) {
+               bootstage_error(BOOTSTAGE_ID_DECOMP_IMAGE);
+               return err;
+       }
+       flush_cache(load, (*load_end - load) * sizeof(ulong));
+
+       debug("   kernel loaded at 0x%08lx, end = 0x%08lx\n", load, *load_end);
+       bootstage_mark(BOOTSTAGE_ID_KERNEL_LOADED);
+
+       no_overlap = (os.comp == IH_COMP_NONE && load == image_start);
+
+       if (!no_overlap && (load < blob_end) && (*load_end > blob_start)) {
+               debug("images.os.start = 0x%lX, images.os.end = 0x%lx\n",
+                     blob_start, blob_end);
+               debug("images.os.load = 0x%lx, load_end = 0x%lx\n", load,
+                     *load_end);
+
+               /* Check what type of image this is. */
+               if (images->legacy_hdr_valid) {
+                       if (image_get_type(&images->legacy_hdr_os_copy)
+                                       == IH_TYPE_MULTI)
+                               puts("WARNING: legacy format multi component image overwritten\n");
+                       return BOOTM_ERR_OVERLAP;
+               } else {
+                       puts("ERROR: new format image overwritten - must RESET the board to recover\n");
+                       bootstage_error(BOOTSTAGE_ID_OVERWRITTEN);
+                       return BOOTM_ERR_RESET;
+               }
+       }
+
+       return 0;
+}
+
+/**
+ * bootm_disable_interrupts() - Disable interrupts in preparation for load/boot
+ *
+ * @return interrupt flag (0 if interrupts were disabled, non-zero if they were
+ *     enabled)
+ */
+ulong bootm_disable_interrupts(void)
+{
+       ulong iflag;
+
+       /*
+        * We have reached the point of no return: we are going to
+        * overwrite all exception vector code, so we cannot easily
+        * recover from any failures any more...
+        */
+       iflag = disable_interrupts();
+#ifdef CONFIG_NETCONSOLE
+       /* Stop the ethernet stack if NetConsole could have left it up */
+       eth_halt();
+       eth_unregister(eth_get_dev());
+#endif
+
+#if defined(CONFIG_CMD_USB)
+       /*
+        * turn off USB to prevent the host controller from writing to the
+        * SDRAM while Linux is booting. This could happen (at least for OHCI
+        * controller), because the HCCA (Host Controller Communication Area)
+        * lies within the SDRAM and the host controller writes continously to
+        * this area (as busmaster!). The HccaFrameNumber is for example
+        * updated every 1 ms within the HCCA structure in SDRAM! For more
+        * details see the OpenHCI specification.
+        */
+       usb_stop();
+#endif
+       return iflag;
+}
+
+#if defined(CONFIG_SILENT_CONSOLE) && !defined(CONFIG_SILENT_U_BOOT_ONLY)
+
+#define CONSOLE_ARG     "console="
+#define CONSOLE_ARG_LEN (sizeof(CONSOLE_ARG) - 1)
+
+static void fixup_silent_linux(void)
+{
+       char *buf;
+       const char *env_val;
+       char *cmdline = getenv("bootargs");
+       int want_silent;
+
+       /*
+        * Only fix cmdline when requested. The environment variable can be:
+        *
+        *      no - we never fixup
+        *      yes - we always fixup
+        *      unset - we rely on the console silent flag
+        */
+       want_silent = getenv_yesno("silent_linux");
+       if (want_silent == 0)
+               return;
+       else if (want_silent == -1 && !(gd->flags & GD_FLG_SILENT))
+               return;
+
+       debug("before silent fix-up: %s\n", cmdline);
+       if (cmdline && (cmdline[0] != '\0')) {
+               char *start = strstr(cmdline, CONSOLE_ARG);
+
+               /* Allocate space for maximum possible new command line */
+               buf = malloc(strlen(cmdline) + 1 + CONSOLE_ARG_LEN + 1);
+               if (!buf) {
+                       debug("%s: out of memory\n", __func__);
+                       return;
+               }
+
+               if (start) {
+                       char *end = strchr(start, ' ');
+                       int num_start_bytes = start - cmdline + CONSOLE_ARG_LEN;
+
+                       strncpy(buf, cmdline, num_start_bytes);
+                       if (end)
+                               strcpy(buf + num_start_bytes, end);
+                       else
+                               buf[num_start_bytes] = '\0';
+               } else {
+                       sprintf(buf, "%s %s", cmdline, CONSOLE_ARG);
+               }
+               env_val = buf;
+       } else {
+               buf = NULL;
+               env_val = CONSOLE_ARG;
+       }
+
+       setenv("bootargs", env_val);
+       debug("after silent fix-up: %s\n", env_val);
+       free(buf);
+}
+#endif /* CONFIG_SILENT_CONSOLE */
+
+/**
+ * Execute selected states of the bootm command.
+ *
+ * Note the arguments to this state must be the first argument, Any 'bootm'
+ * or sub-command arguments must have already been taken.
+ *
+ * Note that if states contains more than one flag it MUST contain
+ * BOOTM_STATE_START, since this handles and consumes the command line args.
+ *
+ * Also note that aside from boot_os_fn functions and bootm_load_os no other
+ * functions we store the return value of in 'ret' may use a negative return
+ * value, without special handling.
+ *
+ * @param cmdtp                Pointer to bootm command table entry
+ * @param flag         Command flags (CMD_FLAG_...)
+ * @param argc         Number of subcommand arguments (0 = no arguments)
+ * @param argv         Arguments
+ * @param states       Mask containing states to run (BOOTM_STATE_...)
+ * @param images       Image header information
+ * @param boot_progress 1 to show boot progress, 0 to not do this
+ * @return 0 if ok, something else on error. Some errors will cause this
+ *     function to perform a reboot! If states contains BOOTM_STATE_OS_GO
+ *     then the intent is to boot an OS, so this function will not return
+ *     unless the image type is standalone.
+ */
+int do_bootm_states(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[],
+                   int states, bootm_headers_t *images, int boot_progress)
+{
+       boot_os_fn *boot_fn;
+       ulong iflag = 0;
+       int ret = 0, need_boot_fn;
+
+       images->state |= states;
+
+       /*
+        * Work through the states and see how far we get. We stop on
+        * any error.
+        */
+       if (states & BOOTM_STATE_START)
+               ret = bootm_start(cmdtp, flag, argc, argv);
+
+       if (!ret && (states & BOOTM_STATE_FINDOS))
+               ret = bootm_find_os(cmdtp, flag, argc, argv);
+
+       if (!ret && (states & BOOTM_STATE_FINDOTHER)) {
+               ret = bootm_find_other(cmdtp, flag, argc, argv);
+               argc = 0;       /* consume the args */
+       }
+
+       /* Load the OS */
+       if (!ret && (states & BOOTM_STATE_LOADOS)) {
+               ulong load_end;
+
+               iflag = bootm_disable_interrupts();
+               ret = bootm_load_os(images, &load_end, 0);
+               if (ret == 0)
+                       lmb_reserve(&images->lmb, images->os.load,
+                                   (load_end - images->os.load));
+               else if (ret && ret != BOOTM_ERR_OVERLAP)
+                       goto err;
+               else if (ret == BOOTM_ERR_OVERLAP)
+                       ret = 0;
+#if defined(CONFIG_SILENT_CONSOLE) && !defined(CONFIG_SILENT_U_BOOT_ONLY)
+               if (images->os.os == IH_OS_LINUX)
+                       fixup_silent_linux();
+#endif
+       }
+
+       /* Relocate the ramdisk */
+#ifdef CONFIG_SYS_BOOT_RAMDISK_HIGH
+       if (!ret && (states & BOOTM_STATE_RAMDISK)) {
+               ulong rd_len = images->rd_end - images->rd_start;
+
+               ret = boot_ramdisk_high(&images->lmb, images->rd_start,
+                       rd_len, &images->initrd_start, &images->initrd_end);
+               if (!ret) {
+                       setenv_hex("initrd_start", images->initrd_start);
+                       setenv_hex("initrd_end", images->initrd_end);
+               }
+       }
+#endif
+#if defined(CONFIG_OF_LIBFDT) && defined(CONFIG_LMB)
+       if (!ret && (states & BOOTM_STATE_FDT)) {
+               boot_fdt_add_mem_rsv_regions(&images->lmb, images->ft_addr);
+               ret = boot_relocate_fdt(&images->lmb, &images->ft_addr,
+                                       &images->ft_len);
+       }
+#endif
+
+       /* From now on, we need the OS boot function */
+       if (ret)
+               return ret;
+       boot_fn = bootm_os_get_boot_func(images->os.os);
+       need_boot_fn = states & (BOOTM_STATE_OS_CMDLINE |
+                       BOOTM_STATE_OS_BD_T | BOOTM_STATE_OS_PREP |
+                       BOOTM_STATE_OS_FAKE_GO | BOOTM_STATE_OS_GO);
+       if (boot_fn == NULL && need_boot_fn) {
+               if (iflag)
+                       enable_interrupts();
+               printf("ERROR: booting os '%s' (%d) is not supported\n",
+                      genimg_get_os_name(images->os.os), images->os.os);
+               bootstage_error(BOOTSTAGE_ID_CHECK_BOOT_OS);
+               return 1;
+       }
+
+       /* Call various other states that are not generally used */
+       if (!ret && (states & BOOTM_STATE_OS_CMDLINE))
+               ret = boot_fn(BOOTM_STATE_OS_CMDLINE, argc, argv, images);
+       if (!ret && (states & BOOTM_STATE_OS_BD_T))
+               ret = boot_fn(BOOTM_STATE_OS_BD_T, argc, argv, images);
+       if (!ret && (states & BOOTM_STATE_OS_PREP))
+               ret = boot_fn(BOOTM_STATE_OS_PREP, argc, argv, images);
+
+#ifdef CONFIG_TRACE
+       /* Pretend to run the OS, then run a user command */
+       if (!ret && (states & BOOTM_STATE_OS_FAKE_GO)) {
+               char *cmd_list = getenv("fakegocmd");
+
+               ret = boot_selected_os(argc, argv, BOOTM_STATE_OS_FAKE_GO,
+                               images, boot_fn);
+               if (!ret && cmd_list)
+                       ret = run_command_list(cmd_list, -1, flag);
+       }
+#endif
+
+       /* Check for unsupported subcommand. */
+       if (ret) {
+               puts("subcommand not supported\n");
+               return ret;
+       }
+
+       /* Now run the OS! We hope this doesn't return */
+       if (!ret && (states & BOOTM_STATE_OS_GO))
+               ret = boot_selected_os(argc, argv, BOOTM_STATE_OS_GO,
+                               images, boot_fn);
+
+       /* Deal with any fallout */
+err:
+       if (iflag)
+               enable_interrupts();
+
+       if (ret == BOOTM_ERR_UNIMPLEMENTED)
+               bootstage_error(BOOTSTAGE_ID_DECOMP_UNIMPL);
+       else if (ret == BOOTM_ERR_RESET)
+               do_reset(cmdtp, flag, argc, argv);
+
+       return ret;
+}
+
+#if defined(CONFIG_IMAGE_FORMAT_LEGACY)
+/**
+ * image_get_kernel - verify legacy format kernel image
+ * @img_addr: in RAM address of the legacy format image to be verified
+ * @verify: data CRC verification flag
+ *
+ * image_get_kernel() verifies legacy image integrity and returns pointer to
+ * legacy image header if image verification was completed successfully.
+ *
+ * returns:
+ *     pointer to a legacy image header if valid image was found
+ *     otherwise return NULL
+ */
+static image_header_t *image_get_kernel(ulong img_addr, int verify)
+{
+       image_header_t *hdr = (image_header_t *)img_addr;
+
+       if (!image_check_magic(hdr)) {
+               puts("Bad Magic Number\n");
+               bootstage_error(BOOTSTAGE_ID_CHECK_MAGIC);
+               return NULL;
+       }
+       bootstage_mark(BOOTSTAGE_ID_CHECK_HEADER);
+
+       if (!image_check_hcrc(hdr)) {
+               puts("Bad Header Checksum\n");
+               bootstage_error(BOOTSTAGE_ID_CHECK_HEADER);
+               return NULL;
+       }
+
+       bootstage_mark(BOOTSTAGE_ID_CHECK_CHECKSUM);
+       image_print_contents(hdr);
+
+       if (verify) {
+               puts("   Verifying Checksum ... ");
+               if (!image_check_dcrc(hdr)) {
+                       printf("Bad Data CRC\n");
+                       bootstage_error(BOOTSTAGE_ID_CHECK_CHECKSUM);
+                       return NULL;
+               }
+               puts("OK\n");
+       }
+       bootstage_mark(BOOTSTAGE_ID_CHECK_ARCH);
+
+       if (!image_check_target_arch(hdr)) {
+               printf("Unsupported Architecture 0x%x\n", image_get_arch(hdr));
+               bootstage_error(BOOTSTAGE_ID_CHECK_ARCH);
+               return NULL;
+       }
+       return hdr;
+}
+#endif
+
+/**
+ * boot_get_kernel - find kernel image
+ * @os_data: pointer to a ulong variable, will hold os data start address
+ * @os_len: pointer to a ulong variable, will hold os data length
+ *
+ * boot_get_kernel() tries to find a kernel image, verifies its integrity
+ * and locates kernel data.
+ *
+ * returns:
+ *     pointer to image header if valid image was found, plus kernel start
+ *     address and length, otherwise NULL
+ */
+static const void *boot_get_kernel(cmd_tbl_t *cmdtp, int flag, int argc,
+                                  char * const argv[], bootm_headers_t *images,
+                                  ulong *os_data, ulong *os_len)
+{
+#if defined(CONFIG_IMAGE_FORMAT_LEGACY)
+       image_header_t  *hdr;
+#endif
+       ulong           img_addr;
+       const void *buf;
+#if defined(CONFIG_FIT)
+       const char      *fit_uname_config = NULL;
+       const char      *fit_uname_kernel = NULL;
+       int             os_noffset;
+#endif
+
+       /* find out kernel image address */
+       if (argc < 1) {
+               img_addr = load_addr;
+               debug("*  kernel: default image load address = 0x%08lx\n",
+                     load_addr);
+#if defined(CONFIG_FIT)
+       } else if (fit_parse_conf(argv[0], load_addr, &img_addr,
+                                 &fit_uname_config)) {
+               debug("*  kernel: config '%s' from image at 0x%08lx\n",
+                     fit_uname_config, img_addr);
+       } else if (fit_parse_subimage(argv[0], load_addr, &img_addr,
+                                    &fit_uname_kernel)) {
+               debug("*  kernel: subimage '%s' from image at 0x%08lx\n",
+                     fit_uname_kernel, img_addr);
+#endif
+       } else {
+               img_addr = simple_strtoul(argv[0], NULL, 16);
+               debug("*  kernel: cmdline image address = 0x%08lx\n",
+                     img_addr);
+       }
+
+       bootstage_mark(BOOTSTAGE_ID_CHECK_MAGIC);
+
+       /* copy from dataflash if needed */
+       img_addr = genimg_get_image(img_addr);
+
+       /* check image type, for FIT images get FIT kernel node */
+       *os_data = *os_len = 0;
+       buf = map_sysmem(img_addr, 0);
+       switch (genimg_get_format(buf)) {
+#if defined(CONFIG_IMAGE_FORMAT_LEGACY)
+       case IMAGE_FORMAT_LEGACY:
+               printf("## Booting kernel from Legacy Image at %08lx ...\n",
+                      img_addr);
+               hdr = image_get_kernel(img_addr, images->verify);
+               if (!hdr)
+                       return NULL;
+               bootstage_mark(BOOTSTAGE_ID_CHECK_IMAGETYPE);
+
+               /* get os_data and os_len */
+               switch (image_get_type(hdr)) {
+               case IH_TYPE_KERNEL:
+               case IH_TYPE_KERNEL_NOLOAD:
+                       *os_data = image_get_data(hdr);
+                       *os_len = image_get_data_size(hdr);
+                       break;
+               case IH_TYPE_MULTI:
+                       image_multi_getimg(hdr, 0, os_data, os_len);
+                       break;
+               case IH_TYPE_STANDALONE:
+                       *os_data = image_get_data(hdr);
+                       *os_len = image_get_data_size(hdr);
+                       break;
+               default:
+                       printf("Wrong Image Type for %s command\n",
+                              cmdtp->name);
+                       bootstage_error(BOOTSTAGE_ID_CHECK_IMAGETYPE);
+                       return NULL;
+               }
+
+               /*
+                * copy image header to allow for image overwrites during
+                * kernel decompression.
+                */
+               memmove(&images->legacy_hdr_os_copy, hdr,
+                       sizeof(image_header_t));
+
+               /* save pointer to image header */
+               images->legacy_hdr_os = hdr;
+
+               images->legacy_hdr_valid = 1;
+               bootstage_mark(BOOTSTAGE_ID_DECOMP_IMAGE);
+               break;
+#endif
+#if defined(CONFIG_FIT)
+       case IMAGE_FORMAT_FIT:
+               os_noffset = fit_image_load(images, img_addr,
+                               &fit_uname_kernel, &fit_uname_config,
+                               IH_ARCH_DEFAULT, IH_TYPE_KERNEL,
+                               BOOTSTAGE_ID_FIT_KERNEL_START,
+                               FIT_LOAD_IGNORED, os_data, os_len);
+               if (os_noffset < 0)
+                       return NULL;
+
+               images->fit_hdr_os = map_sysmem(img_addr, 0);
+               images->fit_uname_os = fit_uname_kernel;
+               images->fit_uname_cfg = fit_uname_config;
+               images->fit_noffset_os = os_noffset;
+               break;
+#endif
+#ifdef CONFIG_ANDROID_BOOT_IMAGE
+       case IMAGE_FORMAT_ANDROID:
+               printf("## Booting Android Image at 0x%08lx ...\n", img_addr);
+               if (android_image_get_kernel(buf, images->verify,
+                                            os_data, os_len))
+                       return NULL;
+               break;
+#endif
+       default:
+               printf("Wrong Image Format for %s command\n", cmdtp->name);
+               bootstage_error(BOOTSTAGE_ID_FIT_KERNEL_INFO);
+               return NULL;
+       }
+
+       debug("   kernel data at 0x%08lx, len = 0x%08lx (%ld)\n",
+             *os_data, *os_len, *os_len);
+
+       return buf;
+}
+#else /* USE_HOSTCC */
+
+void memmove_wd(void *to, void *from, size_t len, ulong chunksz)
+{
+       memmove(to, from, len);
+}
+
+static int bootm_host_load_image(const void *fit, int req_image_type)
+{
+       const char *fit_uname_config = NULL;
+       ulong data, len;
+       bootm_headers_t images;
+       int noffset;
+       ulong load_end;
+       uint8_t image_type;
+       uint8_t imape_comp;
+       void *load_buf;
+       int ret;
+
+       memset(&images, '\0', sizeof(images));
+       images.verify = 1;
+       noffset = fit_image_load(&images, (ulong)fit,
+               NULL, &fit_uname_config,
+               IH_ARCH_DEFAULT, req_image_type, -1,
+               FIT_LOAD_IGNORED, &data, &len);
+       if (noffset < 0)
+               return noffset;
+       if (fit_image_get_type(fit, noffset, &image_type)) {
+               puts("Can't get image type!\n");
+               return -EINVAL;
+       }
+
+       if (fit_image_get_comp(fit, noffset, &imape_comp)) {
+               puts("Can't get image compression!\n");
+               return -EINVAL;
+       }
+
+       /* Allow the image to expand by a factor of 4, should be safe */
+       load_buf = malloc((1 << 20) + len * 4);
+       ret = decomp_image(imape_comp, 0, data, image_type, load_buf,
+                          (void *)data, len, &load_end);
+       free(load_buf);
+       if (ret && ret != BOOTM_ERR_UNIMPLEMENTED)
+               return ret;
+
+       return 0;
+}
+
+int bootm_host_load_images(const void *fit, int cfg_noffset)
+{
+       static uint8_t image_types[] = {
+               IH_TYPE_KERNEL,
+               IH_TYPE_FLATDT,
+               IH_TYPE_RAMDISK,
+       };
+       int err = 0;
+       int i;
+
+       for (i = 0; i < ARRAY_SIZE(image_types); i++) {
+               int ret;
+
+               ret = bootm_host_load_image(fit, image_types[i]);
+               if (!err && ret && ret != -ENOENT)
+                       err = ret;
+       }
+
+       /* Return the first error we found */
+       return err;
+}
+
+#endif /* ndef USE_HOSTCC */
diff --git a/common/bootm_os.c b/common/bootm_os.c
new file mode 100644 (file)
index 0000000..f7769ac
--- /dev/null
@@ -0,0 +1,480 @@
+/*
+ * (C) Copyright 2000-2009
+ * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#include <common.h>
+#include <bootm.h>
+#include <fdt_support.h>
+#include <libfdt.h>
+#include <malloc.h>
+#include <vxworks.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+static int do_bootm_standalone(int flag, int argc, char * const argv[],
+                              bootm_headers_t *images)
+{
+       char *s;
+       int (*appl)(int, char *const[]);
+
+       /* Don't start if "autostart" is set to "no" */
+       s = getenv("autostart");
+       if ((s != NULL) && !strcmp(s, "no")) {
+               setenv_hex("filesize", images->os.image_len);
+               return 0;
+       }
+       appl = (int (*)(int, char * const []))images->ep;
+       appl(argc, argv);
+       return 0;
+}
+
+/*******************************************************************/
+/* OS booting routines */
+/*******************************************************************/
+
+#if defined(CONFIG_BOOTM_NETBSD) || defined(CONFIG_BOOTM_PLAN9)
+static void copy_args(char *dest, int argc, char * const argv[], char delim)
+{
+       int i;
+
+       for (i = 0; i < argc; i++) {
+               if (i > 0)
+                       *dest++ = delim;
+               strcpy(dest, argv[i]);
+               dest += strlen(argv[i]);
+       }
+}
+#endif
+
+#ifdef CONFIG_BOOTM_NETBSD
+static int do_bootm_netbsd(int flag, int argc, char * const argv[],
+                           bootm_headers_t *images)
+{
+       void (*loader)(bd_t *, image_header_t *, char *, char *);
+       image_header_t *os_hdr, *hdr;
+       ulong kernel_data, kernel_len;
+       char *consdev;
+       char *cmdline;
+
+       if (flag != BOOTM_STATE_OS_GO)
+               return 0;
+
+#if defined(CONFIG_FIT)
+       if (!images->legacy_hdr_valid) {
+               fit_unsupported_reset("NetBSD");
+               return 1;
+       }
+#endif
+       hdr = images->legacy_hdr_os;
+
+       /*
+        * Booting a (NetBSD) kernel image
+        *
+        * This process is pretty similar to a standalone application:
+        * The (first part of an multi-) image must be a stage-2 loader,
+        * which in turn is responsible for loading & invoking the actual
+        * kernel.  The only differences are the parameters being passed:
+        * besides the board info strucure, the loader expects a command
+        * line, the name of the console device, and (optionally) the
+        * address of the original image header.
+        */
+       os_hdr = NULL;
+       if (image_check_type(&images->legacy_hdr_os_copy, IH_TYPE_MULTI)) {
+               image_multi_getimg(hdr, 1, &kernel_data, &kernel_len);
+               if (kernel_len)
+                       os_hdr = hdr;
+       }
+
+       consdev = "";
+#if   defined(CONFIG_8xx_CONS_SMC1)
+       consdev = "smc1";
+#elif defined(CONFIG_8xx_CONS_SMC2)
+       consdev = "smc2";
+#elif defined(CONFIG_8xx_CONS_SCC2)
+       consdev = "scc2";
+#elif defined(CONFIG_8xx_CONS_SCC3)
+       consdev = "scc3";
+#endif
+
+       if (argc > 0) {
+               ulong len;
+               int   i;
+
+               for (i = 0, len = 0; i < argc; i += 1)
+                       len += strlen(argv[i]) + 1;
+               cmdline = malloc(len);
+               copy_args(cmdline, argc, argv, ' ');
+       } else {
+               cmdline = getenv("bootargs");
+               if (cmdline == NULL)
+                       cmdline = "";
+       }
+
+       loader = (void (*)(bd_t *, image_header_t *, char *, char *))images->ep;
+
+       printf("## Transferring control to NetBSD stage-2 loader (at address %08lx) ...\n",
+              (ulong)loader);
+
+       bootstage_mark(BOOTSTAGE_ID_RUN_OS);
+
+       /*
+        * NetBSD Stage-2 Loader Parameters:
+        *   arg[0]: pointer to board info data
+        *   arg[1]: image load address
+        *   arg[2]: char pointer to the console device to use
+        *   arg[3]: char pointer to the boot arguments
+        */
+       (*loader)(gd->bd, os_hdr, consdev, cmdline);
+
+       return 1;
+}
+#endif /* CONFIG_BOOTM_NETBSD*/
+
+#ifdef CONFIG_LYNXKDI
+static int do_bootm_lynxkdi(int flag, int argc, char * const argv[],
+                            bootm_headers_t *images)
+{
+       image_header_t *hdr = &images->legacy_hdr_os_copy;
+
+       if (flag != BOOTM_STATE_OS_GO)
+               return 0;
+
+#if defined(CONFIG_FIT)
+       if (!images->legacy_hdr_valid) {
+               fit_unsupported_reset("Lynx");
+               return 1;
+       }
+#endif
+
+       lynxkdi_boot((image_header_t *)hdr);
+
+       return 1;
+}
+#endif /* CONFIG_LYNXKDI */
+
+#ifdef CONFIG_BOOTM_RTEMS
+static int do_bootm_rtems(int flag, int argc, char * const argv[],
+                          bootm_headers_t *images)
+{
+       void (*entry_point)(bd_t *);
+
+       if (flag != BOOTM_STATE_OS_GO)
+               return 0;
+
+#if defined(CONFIG_FIT)
+       if (!images->legacy_hdr_valid) {
+               fit_unsupported_reset("RTEMS");
+               return 1;
+       }
+#endif
+
+       entry_point = (void (*)(bd_t *))images->ep;
+
+       printf("## Transferring control to RTEMS (at address %08lx) ...\n",
+              (ulong)entry_point);
+
+       bootstage_mark(BOOTSTAGE_ID_RUN_OS);
+
+       /*
+        * RTEMS Parameters:
+        *   r3: ptr to board info data
+        */
+       (*entry_point)(gd->bd);
+
+       return 1;
+}
+#endif /* CONFIG_BOOTM_RTEMS */
+
+#if defined(CONFIG_BOOTM_OSE)
+static int do_bootm_ose(int flag, int argc, char * const argv[],
+                          bootm_headers_t *images)
+{
+       void (*entry_point)(void);
+
+       if (flag != BOOTM_STATE_OS_GO)
+               return 0;
+
+#if defined(CONFIG_FIT)
+       if (!images->legacy_hdr_valid) {
+               fit_unsupported_reset("OSE");
+               return 1;
+       }
+#endif
+
+       entry_point = (void (*)(void))images->ep;
+
+       printf("## Transferring control to OSE (at address %08lx) ...\n",
+              (ulong)entry_point);
+
+       bootstage_mark(BOOTSTAGE_ID_RUN_OS);
+
+       /*
+        * OSE Parameters:
+        *   None
+        */
+       (*entry_point)();
+
+       return 1;
+}
+#endif /* CONFIG_BOOTM_OSE */
+
+#if defined(CONFIG_BOOTM_PLAN9)
+static int do_bootm_plan9(int flag, int argc, char * const argv[],
+                          bootm_headers_t *images)
+{
+       void (*entry_point)(void);
+       char *s;
+
+       if (flag != BOOTM_STATE_OS_GO)
+               return 0;
+
+#if defined(CONFIG_FIT)
+       if (!images->legacy_hdr_valid) {
+               fit_unsupported_reset("Plan 9");
+               return 1;
+       }
+#endif
+
+       /* See README.plan9 */
+       s = getenv("confaddr");
+       if (s != NULL) {
+               char *confaddr = (char *)simple_strtoul(s, NULL, 16);
+
+               if (argc > 0) {
+                       copy_args(confaddr, argc, argv, '\n');
+               } else {
+                       s = getenv("bootargs");
+                       if (s != NULL)
+                               strcpy(confaddr, s);
+               }
+       }
+
+       entry_point = (void (*)(void))images->ep;
+
+       printf("## Transferring control to Plan 9 (at address %08lx) ...\n",
+              (ulong)entry_point);
+
+       bootstage_mark(BOOTSTAGE_ID_RUN_OS);
+
+       /*
+        * Plan 9 Parameters:
+        *   None
+        */
+       (*entry_point)();
+
+       return 1;
+}
+#endif /* CONFIG_BOOTM_PLAN9 */
+
+#if defined(CONFIG_BOOTM_VXWORKS) && \
+       (defined(CONFIG_PPC) || defined(CONFIG_ARM))
+
+void do_bootvx_fdt(bootm_headers_t *images)
+{
+#if defined(CONFIG_OF_LIBFDT)
+       int ret;
+       char *bootline;
+       ulong of_size = images->ft_len;
+       char **of_flat_tree = &images->ft_addr;
+       struct lmb *lmb = &images->lmb;
+
+       if (*of_flat_tree) {
+               boot_fdt_add_mem_rsv_regions(lmb, *of_flat_tree);
+
+               ret = boot_relocate_fdt(lmb, of_flat_tree, &of_size);
+               if (ret)
+                       return;
+
+               ret = fdt_add_subnode(*of_flat_tree, 0, "chosen");
+               if ((ret >= 0 || ret == -FDT_ERR_EXISTS)) {
+                       bootline = getenv("bootargs");
+                       if (bootline) {
+                               ret = fdt_find_and_setprop(*of_flat_tree,
+                                               "/chosen", "bootargs",
+                                               bootline,
+                                               strlen(bootline) + 1, 1);
+                               if (ret < 0) {
+                                       printf("## ERROR: %s : %s\n", __func__,
+                                              fdt_strerror(ret));
+                                       return;
+                               }
+                       }
+               } else {
+                       printf("## ERROR: %s : %s\n", __func__,
+                              fdt_strerror(ret));
+                       return;
+               }
+       }
+#endif
+
+       boot_prep_vxworks(images);
+
+       bootstage_mark(BOOTSTAGE_ID_RUN_OS);
+
+#if defined(CONFIG_OF_LIBFDT)
+       printf("## Starting vxWorks at 0x%08lx, device tree at 0x%08lx ...\n",
+              (ulong)images->ep, (ulong)*of_flat_tree);
+#else
+       printf("## Starting vxWorks at 0x%08lx\n", (ulong)images->ep);
+#endif
+
+       boot_jump_vxworks(images);
+
+       puts("## vxWorks terminated\n");
+}
+
+static int do_bootm_vxworks(int flag, int argc, char * const argv[],
+                            bootm_headers_t *images)
+{
+       if (flag != BOOTM_STATE_OS_GO)
+               return 0;
+
+#if defined(CONFIG_FIT)
+       if (!images->legacy_hdr_valid) {
+               fit_unsupported_reset("VxWorks");
+               return 1;
+       }
+#endif
+
+       do_bootvx_fdt(images);
+
+       return 1;
+}
+#endif
+
+#if defined(CONFIG_CMD_ELF)
+static int do_bootm_qnxelf(int flag, int argc, char * const argv[],
+                           bootm_headers_t *images)
+{
+       char *local_args[2];
+       char str[16];
+
+       if (flag != BOOTM_STATE_OS_GO)
+               return 0;
+
+#if defined(CONFIG_FIT)
+       if (!images->legacy_hdr_valid) {
+               fit_unsupported_reset("QNX");
+               return 1;
+       }
+#endif
+
+       sprintf(str, "%lx", images->ep); /* write entry-point into string */
+       local_args[0] = argv[0];
+       local_args[1] = str;    /* and provide it via the arguments */
+       do_bootelf(NULL, 0, 2, local_args);
+
+       return 1;
+}
+#endif
+
+#ifdef CONFIG_INTEGRITY
+static int do_bootm_integrity(int flag, int argc, char * const argv[],
+                          bootm_headers_t *images)
+{
+       void (*entry_point)(void);
+
+       if (flag != BOOTM_STATE_OS_GO)
+               return 0;
+
+#if defined(CONFIG_FIT)
+       if (!images->legacy_hdr_valid) {
+               fit_unsupported_reset("INTEGRITY");
+               return 1;
+       }
+#endif
+
+       entry_point = (void (*)(void))images->ep;
+
+       printf("## Transferring control to INTEGRITY (at address %08lx) ...\n",
+              (ulong)entry_point);
+
+       bootstage_mark(BOOTSTAGE_ID_RUN_OS);
+
+       /*
+        * INTEGRITY Parameters:
+        *   None
+        */
+       (*entry_point)();
+
+       return 1;
+}
+#endif
+
+static boot_os_fn *boot_os[] = {
+       [IH_OS_U_BOOT] = do_bootm_standalone,
+#ifdef CONFIG_BOOTM_LINUX
+       [IH_OS_LINUX] = do_bootm_linux,
+#endif
+#ifdef CONFIG_BOOTM_NETBSD
+       [IH_OS_NETBSD] = do_bootm_netbsd,
+#endif
+#ifdef CONFIG_LYNXKDI
+       [IH_OS_LYNXOS] = do_bootm_lynxkdi,
+#endif
+#ifdef CONFIG_BOOTM_RTEMS
+       [IH_OS_RTEMS] = do_bootm_rtems,
+#endif
+#if defined(CONFIG_BOOTM_OSE)
+       [IH_OS_OSE] = do_bootm_ose,
+#endif
+#if defined(CONFIG_BOOTM_PLAN9)
+       [IH_OS_PLAN9] = do_bootm_plan9,
+#endif
+#if defined(CONFIG_BOOTM_VXWORKS) && \
+       (defined(CONFIG_PPC) || defined(CONFIG_ARM))
+       [IH_OS_VXWORKS] = do_bootm_vxworks,
+#endif
+#if defined(CONFIG_CMD_ELF)
+       [IH_OS_QNX] = do_bootm_qnxelf,
+#endif
+#ifdef CONFIG_INTEGRITY
+       [IH_OS_INTEGRITY] = do_bootm_integrity,
+#endif
+};
+
+/* Allow for arch specific config before we boot */
+static void __arch_preboot_os(void)
+{
+       /* please define platform specific arch_preboot_os() */
+}
+void arch_preboot_os(void) __attribute__((weak, alias("__arch_preboot_os")));
+
+int boot_selected_os(int argc, char * const argv[], int state,
+                    bootm_headers_t *images, boot_os_fn *boot_fn)
+{
+       arch_preboot_os();
+       boot_fn(state, argc, argv, images);
+
+       /* Stand-alone may return when 'autostart' is 'no' */
+       if (images->os.type == IH_TYPE_STANDALONE ||
+           state == BOOTM_STATE_OS_FAKE_GO) /* We expect to return */
+               return 0;
+       bootstage_error(BOOTSTAGE_ID_BOOT_OS_RETURNED);
+#ifdef DEBUG
+       puts("\n## Control returned to monitor - resetting...\n");
+#endif
+       return BOOTM_ERR_RESET;
+}
+
+boot_os_fn *bootm_os_get_boot_func(int os)
+{
+#ifdef CONFIG_NEEDS_MANUAL_RELOC
+       static bool relocated;
+
+       if (!relocated) {
+               int i;
+
+               /* relocate boot function table */
+               for (i = 0; i < ARRAY_SIZE(boot_os); i++)
+                       if (boot_os[i] != NULL)
+                               boot_os[i] += gd->reloc_off;
+
+               relocated = true;
+       }
+#endif
+       return boot_os[os];
+}
index c06f4b730f363e64826531dc2d3fd8b0b85a51cf..8b897c8d66410db8daa79dda714a0b77635aa0c8 100644 (file)
@@ -5,58 +5,25 @@
  * SPDX-License-Identifier:    GPL-2.0+
  */
 
-
 /*
  * Boot support
  */
 #include <common.h>
-#include <watchdog.h>
+#include <bootm.h>
 #include <command.h>
-#include <image.h>
-#include <malloc.h>
-#include <u-boot/zlib.h>
-#include <bzlib.h>
 #include <environment.h>
+#include <image.h>
 #include <lmb.h>
-#include <linux/ctype.h>
+#include <malloc.h>
+#include <nand.h>
 #include <asm/byteorder.h>
-#include <asm/io.h>
 #include <linux/compiler.h>
-
-#if defined(CONFIG_BOOTM_VXWORKS) && \
-       (defined(CONFIG_PPC) || defined(CONFIG_ARM))
-#include <vxworks.h>
-#endif
-
-#if defined(CONFIG_CMD_USB)
-#include <usb.h>
-#endif
-
-#if defined(CONFIG_OF_LIBFDT)
-#include <libfdt.h>
-#include <fdt_support.h>
-#endif
-
-#ifdef CONFIG_LZMA
-#include <lzma/LzmaTypes.h>
-#include <lzma/LzmaDec.h>
-#include <lzma/LzmaTools.h>
-#endif /* CONFIG_LZMA */
-
-#ifdef CONFIG_LZO
-#include <linux/lzo.h>
-#endif /* CONFIG_LZO */
+#include <linux/ctype.h>
+#include <linux/err.h>
+#include <u-boot/zlib.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
-#ifndef CONFIG_SYS_BOOTM_LEN
-#define CONFIG_SYS_BOOTM_LEN   0x800000        /* use 8MByte as default max gunzip size */
-#endif
-
-#ifdef CONFIG_BZIP2
-extern void bz_internal_error(int);
-#endif
-
 #if defined(CONFIG_CMD_IMI)
 static int image_info(unsigned long addr);
 #endif
@@ -71,465 +38,8 @@ extern flash_info_t flash_info[]; /* info for FLASH chips */
 static int do_imls(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]);
 #endif
 
-#include <linux/err.h>
-#include <nand.h>
-
-#if defined(CONFIG_SILENT_CONSOLE) && !defined(CONFIG_SILENT_U_BOOT_ONLY)
-static void fixup_silent_linux(void);
-#endif
-
-static int do_bootm_standalone(int flag, int argc, char * const argv[],
-                              bootm_headers_t *images);
-
-static const void *boot_get_kernel(cmd_tbl_t *cmdtp, int flag, int argc,
-                               char * const argv[], bootm_headers_t *images,
-                               ulong *os_data, ulong *os_len);
-
-/*
- *  Continue booting an OS image; caller already has:
- *  - copied image header to global variable `header'
- *  - checked header magic number, checksums (both header & image),
- *  - verified image architecture (PPC) and type (KERNEL or MULTI),
- *  - loaded (first part of) image to header load address,
- *  - disabled interrupts.
- *
- * @flag: Flags indicating what to do (BOOTM_STATE_...)
- * @argc: Number of arguments. Note that the arguments are shifted down
- *      so that 0 is the first argument not processed by U-Boot, and
- *      argc is adjusted accordingly. This avoids confusion as to how
- *      many arguments are available for the OS.
- * @images: Pointers to os/initrd/fdt
- * @return 1 on error. On success the OS boots so this function does
- * not return.
- */
-typedef int boot_os_fn(int flag, int argc, char * const argv[],
-                       bootm_headers_t *images);
-
-#ifdef CONFIG_BOOTM_LINUX
-extern boot_os_fn do_bootm_linux;
-#endif
-#ifdef CONFIG_BOOTM_NETBSD
-static boot_os_fn do_bootm_netbsd;
-#endif
-#if defined(CONFIG_LYNXKDI)
-static boot_os_fn do_bootm_lynxkdi;
-extern void lynxkdi_boot(image_header_t *);
-#endif
-#ifdef CONFIG_BOOTM_RTEMS
-static boot_os_fn do_bootm_rtems;
-#endif
-#if defined(CONFIG_BOOTM_OSE)
-static boot_os_fn do_bootm_ose;
-#endif
-#if defined(CONFIG_BOOTM_PLAN9)
-static boot_os_fn do_bootm_plan9;
-#endif
-#if defined(CONFIG_BOOTM_VXWORKS) && \
-       (defined(CONFIG_PPC) || defined(CONFIG_ARM))
-static boot_os_fn do_bootm_vxworks;
-#endif
-#if defined(CONFIG_CMD_ELF)
-static boot_os_fn do_bootm_qnxelf;
-int do_bootvx(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]);
-int do_bootelf(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]);
-#endif
-#if defined(CONFIG_INTEGRITY)
-static boot_os_fn do_bootm_integrity;
-#endif
-
-static boot_os_fn *boot_os[] = {
-       [IH_OS_U_BOOT] = do_bootm_standalone,
-#ifdef CONFIG_BOOTM_LINUX
-       [IH_OS_LINUX] = do_bootm_linux,
-#endif
-#ifdef CONFIG_BOOTM_NETBSD
-       [IH_OS_NETBSD] = do_bootm_netbsd,
-#endif
-#ifdef CONFIG_LYNXKDI
-       [IH_OS_LYNXOS] = do_bootm_lynxkdi,
-#endif
-#ifdef CONFIG_BOOTM_RTEMS
-       [IH_OS_RTEMS] = do_bootm_rtems,
-#endif
-#if defined(CONFIG_BOOTM_OSE)
-       [IH_OS_OSE] = do_bootm_ose,
-#endif
-#if defined(CONFIG_BOOTM_PLAN9)
-       [IH_OS_PLAN9] = do_bootm_plan9,
-#endif
-#if defined(CONFIG_BOOTM_VXWORKS) && \
-       (defined(CONFIG_PPC) || defined(CONFIG_ARM))
-       [IH_OS_VXWORKS] = do_bootm_vxworks,
-#endif
-#if defined(CONFIG_CMD_ELF)
-       [IH_OS_QNX] = do_bootm_qnxelf,
-#endif
-#ifdef CONFIG_INTEGRITY
-       [IH_OS_INTEGRITY] = do_bootm_integrity,
-#endif
-};
-
 bootm_headers_t images;                /* pointers to os/initrd/fdt images */
 
-/* Allow for arch specific config before we boot */
-static void __arch_preboot_os(void)
-{
-       /* please define platform specific arch_preboot_os() */
-}
-void arch_preboot_os(void) __attribute__((weak, alias("__arch_preboot_os")));
-
-#define IH_INITRD_ARCH IH_ARCH_DEFAULT
-
-#ifdef CONFIG_LMB
-static void boot_start_lmb(bootm_headers_t *images)
-{
-       ulong           mem_start;
-       phys_size_t     mem_size;
-
-       lmb_init(&images->lmb);
-
-       mem_start = getenv_bootm_low();
-       mem_size = getenv_bootm_size();
-
-       lmb_add(&images->lmb, (phys_addr_t)mem_start, mem_size);
-
-       arch_lmb_reserve(&images->lmb);
-       board_lmb_reserve(&images->lmb);
-}
-#else
-#define lmb_reserve(lmb, base, size)
-static inline void boot_start_lmb(bootm_headers_t *images) { }
-#endif
-
-static int bootm_start(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
-{
-       memset((void *)&images, 0, sizeof(images));
-       images.verify = getenv_yesno("verify");
-
-       boot_start_lmb(&images);
-
-       bootstage_mark_name(BOOTSTAGE_ID_BOOTM_START, "bootm_start");
-       images.state = BOOTM_STATE_START;
-
-       return 0;
-}
-
-static int bootm_find_os(cmd_tbl_t *cmdtp, int flag, int argc,
-                        char * const argv[])
-{
-       const void *os_hdr;
-       bool ep_found = false;
-
-       /* get kernel image header, start address and length */
-       os_hdr = boot_get_kernel(cmdtp, flag, argc, argv,
-                       &images, &images.os.image_start, &images.os.image_len);
-       if (images.os.image_len == 0) {
-               puts("ERROR: can't get kernel image!\n");
-               return 1;
-       }
-
-       /* get image parameters */
-       switch (genimg_get_format(os_hdr)) {
-#if defined(CONFIG_IMAGE_FORMAT_LEGACY)
-       case IMAGE_FORMAT_LEGACY:
-               images.os.type = image_get_type(os_hdr);
-               images.os.comp = image_get_comp(os_hdr);
-               images.os.os = image_get_os(os_hdr);
-
-               images.os.end = image_get_image_end(os_hdr);
-               images.os.load = image_get_load(os_hdr);
-               break;
-#endif
-#if defined(CONFIG_FIT)
-       case IMAGE_FORMAT_FIT:
-               if (fit_image_get_type(images.fit_hdr_os,
-                                       images.fit_noffset_os, &images.os.type)) {
-                       puts("Can't get image type!\n");
-                       bootstage_error(BOOTSTAGE_ID_FIT_TYPE);
-                       return 1;
-               }
-
-               if (fit_image_get_comp(images.fit_hdr_os,
-                                       images.fit_noffset_os, &images.os.comp)) {
-                       puts("Can't get image compression!\n");
-                       bootstage_error(BOOTSTAGE_ID_FIT_COMPRESSION);
-                       return 1;
-               }
-
-               if (fit_image_get_os(images.fit_hdr_os,
-                                       images.fit_noffset_os, &images.os.os)) {
-                       puts("Can't get image OS!\n");
-                       bootstage_error(BOOTSTAGE_ID_FIT_OS);
-                       return 1;
-               }
-
-               images.os.end = fit_get_end(images.fit_hdr_os);
-
-               if (fit_image_get_load(images.fit_hdr_os, images.fit_noffset_os,
-                                       &images.os.load)) {
-                       puts("Can't get image load address!\n");
-                       bootstage_error(BOOTSTAGE_ID_FIT_LOADADDR);
-                       return 1;
-               }
-               break;
-#endif
-#ifdef CONFIG_ANDROID_BOOT_IMAGE
-       case IMAGE_FORMAT_ANDROID:
-               images.os.type = IH_TYPE_KERNEL;
-               images.os.comp = IH_COMP_NONE;
-               images.os.os = IH_OS_LINUX;
-               images.ep = images.os.load;
-               ep_found = true;
-
-               images.os.end = android_image_get_end(os_hdr);
-               images.os.load = android_image_get_kload(os_hdr);
-               break;
-#endif
-       default:
-               puts("ERROR: unknown image format type!\n");
-               return 1;
-       }
-
-       /* find kernel entry point */
-       if (images.legacy_hdr_valid) {
-               images.ep = image_get_ep(&images.legacy_hdr_os_copy);
-#if defined(CONFIG_FIT)
-       } else if (images.fit_uname_os) {
-               int ret;
-
-               ret = fit_image_get_entry(images.fit_hdr_os,
-                                         images.fit_noffset_os, &images.ep);
-               if (ret) {
-                       puts("Can't get entry point property!\n");
-                       return 1;
-               }
-#endif
-       } else if (!ep_found) {
-               puts("Could not find kernel entry point!\n");
-               return 1;
-       }
-
-       if (images.os.type == IH_TYPE_KERNEL_NOLOAD) {
-               images.os.load = images.os.image_start;
-               images.ep += images.os.load;
-       }
-
-       images.os.start = (ulong)os_hdr;
-
-       return 0;
-}
-
-static int bootm_find_ramdisk(int flag, int argc, char * const argv[])
-{
-       int ret;
-
-       /* find ramdisk */
-       ret = boot_get_ramdisk(argc, argv, &images, IH_INITRD_ARCH,
-                              &images.rd_start, &images.rd_end);
-       if (ret) {
-               puts("Ramdisk image is corrupt or invalid\n");
-               return 1;
-       }
-
-       return 0;
-}
-
-#if defined(CONFIG_OF_LIBFDT)
-static int bootm_find_fdt(int flag, int argc, char * const argv[])
-{
-       int ret;
-
-       /* find flattened device tree */
-       ret = boot_get_fdt(flag, argc, argv, IH_ARCH_DEFAULT, &images,
-                          &images.ft_addr, &images.ft_len);
-       if (ret) {
-               puts("Could not find a valid device tree\n");
-               return 1;
-       }
-
-       set_working_fdt_addr(images.ft_addr);
-
-       return 0;
-}
-#endif
-
-static int bootm_find_other(cmd_tbl_t *cmdtp, int flag, int argc,
-                           char * const argv[])
-{
-       if (((images.os.type == IH_TYPE_KERNEL) ||
-            (images.os.type == IH_TYPE_KERNEL_NOLOAD) ||
-            (images.os.type == IH_TYPE_MULTI)) &&
-           (images.os.os == IH_OS_LINUX ||
-                images.os.os == IH_OS_VXWORKS)) {
-               if (bootm_find_ramdisk(flag, argc, argv))
-                       return 1;
-
-#if defined(CONFIG_OF_LIBFDT)
-               if (bootm_find_fdt(flag, argc, argv))
-                       return 1;
-#endif
-       }
-
-       return 0;
-}
-
-#define BOOTM_ERR_RESET                -1
-#define BOOTM_ERR_OVERLAP      -2
-#define BOOTM_ERR_UNIMPLEMENTED        -3
-static int bootm_load_os(bootm_headers_t *images, unsigned long *load_end,
-               int boot_progress)
-{
-       image_info_t os = images->os;
-       uint8_t comp = os.comp;
-       ulong load = os.load;
-       ulong blob_start = os.start;
-       ulong blob_end = os.end;
-       ulong image_start = os.image_start;
-       ulong image_len = os.image_len;
-       __maybe_unused uint unc_len = CONFIG_SYS_BOOTM_LEN;
-       int no_overlap = 0;
-       void *load_buf, *image_buf;
-#if defined(CONFIG_LZMA) || defined(CONFIG_LZO)
-       int ret;
-#endif /* defined(CONFIG_LZMA) || defined(CONFIG_LZO) */
-
-       const char *type_name = genimg_get_type_name(os.type);
-
-       load_buf = map_sysmem(load, unc_len);
-       image_buf = map_sysmem(image_start, image_len);
-       switch (comp) {
-       case IH_COMP_NONE:
-               if (load == image_start) {
-                       printf("   XIP %s ... ", type_name);
-                       no_overlap = 1;
-               } else {
-                       printf("   Loading %s ... ", type_name);
-                       memmove_wd(load_buf, image_buf, image_len, CHUNKSZ);
-               }
-               *load_end = load + image_len;
-               break;
-#ifdef CONFIG_GZIP
-       case IH_COMP_GZIP:
-               printf("   Uncompressing %s ... ", type_name);
-               if (gunzip(load_buf, unc_len, image_buf, &image_len) != 0) {
-                       puts("GUNZIP: uncompress, out-of-mem or overwrite "
-                               "error - must RESET board to recover\n");
-                       if (boot_progress)
-                               bootstage_error(BOOTSTAGE_ID_DECOMP_IMAGE);
-                       return BOOTM_ERR_RESET;
-               }
-
-               *load_end = load + image_len;
-               break;
-#endif /* CONFIG_GZIP */
-#ifdef CONFIG_BZIP2
-       case IH_COMP_BZIP2:
-               printf("   Uncompressing %s ... ", type_name);
-               /*
-                * If we've got less than 4 MB of malloc() space,
-                * use slower decompression algorithm which requires
-                * at most 2300 KB of memory.
-                */
-               int i = BZ2_bzBuffToBuffDecompress(load_buf, &unc_len,
-                       image_buf, image_len,
-                       CONFIG_SYS_MALLOC_LEN < (4096 * 1024), 0);
-               if (i != BZ_OK) {
-                       printf("BUNZIP2: uncompress or overwrite error %d "
-                               "- must RESET board to recover\n", i);
-                       if (boot_progress)
-                               bootstage_error(BOOTSTAGE_ID_DECOMP_IMAGE);
-                       return BOOTM_ERR_RESET;
-               }
-
-               *load_end = load + unc_len;
-               break;
-#endif /* CONFIG_BZIP2 */
-#ifdef CONFIG_LZMA
-       case IH_COMP_LZMA: {
-               SizeT lzma_len = unc_len;
-               printf("   Uncompressing %s ... ", type_name);
-
-               ret = lzmaBuffToBuffDecompress(load_buf, &lzma_len,
-                                              image_buf, image_len);
-               unc_len = lzma_len;
-               if (ret != SZ_OK) {
-                       printf("LZMA: uncompress or overwrite error %d "
-                               "- must RESET board to recover\n", ret);
-                       bootstage_error(BOOTSTAGE_ID_DECOMP_IMAGE);
-                       return BOOTM_ERR_RESET;
-               }
-               *load_end = load + unc_len;
-               break;
-       }
-#endif /* CONFIG_LZMA */
-#ifdef CONFIG_LZO
-       case IH_COMP_LZO: {
-               size_t size = unc_len;
-
-               printf("   Uncompressing %s ... ", type_name);
-
-               ret = lzop_decompress(image_buf, image_len, load_buf, &size);
-               if (ret != LZO_E_OK) {
-                       printf("LZO: uncompress or overwrite error %d "
-                             "- must RESET board to recover\n", ret);
-                       if (boot_progress)
-                               bootstage_error(BOOTSTAGE_ID_DECOMP_IMAGE);
-                       return BOOTM_ERR_RESET;
-               }
-
-               *load_end = load + size;
-               break;
-       }
-#endif /* CONFIG_LZO */
-       default:
-               printf("Unimplemented compression type %d\n", comp);
-               return BOOTM_ERR_UNIMPLEMENTED;
-       }
-
-       flush_cache(load, (*load_end - load) * sizeof(ulong));
-
-       puts("OK\n");
-       debug("   kernel loaded at 0x%08lx, end = 0x%08lx\n", load, *load_end);
-       bootstage_mark(BOOTSTAGE_ID_KERNEL_LOADED);
-
-       if (!no_overlap && (load < blob_end) && (*load_end > blob_start)) {
-               debug("images.os.start = 0x%lX, images.os.end = 0x%lx\n",
-                       blob_start, blob_end);
-               debug("images.os.load = 0x%lx, load_end = 0x%lx\n", load,
-                       *load_end);
-
-               /* Check what type of image this is. */
-               if (images->legacy_hdr_valid) {
-                       if (image_get_type(&images->legacy_hdr_os_copy)
-                                       == IH_TYPE_MULTI)
-                               puts("WARNING: legacy format multi component image overwritten\n");
-                       return BOOTM_ERR_OVERLAP;
-               } else {
-                       puts("ERROR: new format image overwritten - must RESET the board to recover\n");
-                       bootstage_error(BOOTSTAGE_ID_OVERWRITTEN);
-                       return BOOTM_ERR_RESET;
-               }
-       }
-
-       return 0;
-}
-
-static int do_bootm_standalone(int flag, int argc, char * const argv[],
-                              bootm_headers_t *images)
-{
-       char  *s;
-       int   (*appl)(int, char * const []);
-
-       /* Don't start if "autostart" is set to "no" */
-       if (((s = getenv("autostart")) != NULL) && (strcmp(s, "no") == 0)) {
-               setenv_hex("filesize", images->os.image_len);
-               return 0;
-       }
-       appl = (int (*)(int, char * const []))images->ep;
-       appl(argc, argv);
-       return 0;
-}
-
 /* we overload the cmd field with our state machine info instead of a
  * function pointer */
 static cmd_tbl_t cmd_bootm_sub[] = {
@@ -548,210 +58,6 @@ static cmd_tbl_t cmd_bootm_sub[] = {
        U_BOOT_CMD_MKENT(go, 0, 1, (void *)BOOTM_STATE_OS_GO, "", ""),
 };
 
-static int boot_selected_os(int argc, char * const argv[], int state,
-               bootm_headers_t *images, boot_os_fn *boot_fn)
-{
-       arch_preboot_os();
-       boot_fn(state, argc, argv, images);
-
-       /* Stand-alone may return when 'autostart' is 'no' */
-       if (images->os.type == IH_TYPE_STANDALONE ||
-           state == BOOTM_STATE_OS_FAKE_GO) /* We expect to return */
-               return 0;
-       bootstage_error(BOOTSTAGE_ID_BOOT_OS_RETURNED);
-#ifdef DEBUG
-       puts("\n## Control returned to monitor - resetting...\n");
-#endif
-       return BOOTM_ERR_RESET;
-}
-
-/**
- * bootm_disable_interrupts() - Disable interrupts in preparation for load/boot
- *
- * @return interrupt flag (0 if interrupts were disabled, non-zero if they were
- *     enabled)
- */
-static ulong bootm_disable_interrupts(void)
-{
-       ulong iflag;
-
-       /*
-        * We have reached the point of no return: we are going to
-        * overwrite all exception vector code, so we cannot easily
-        * recover from any failures any more...
-        */
-       iflag = disable_interrupts();
-#ifdef CONFIG_NETCONSOLE
-       /* Stop the ethernet stack if NetConsole could have left it up */
-       eth_halt();
-       eth_unregister(eth_get_dev());
-#endif
-
-#if defined(CONFIG_CMD_USB)
-       /*
-        * turn off USB to prevent the host controller from writing to the
-        * SDRAM while Linux is booting. This could happen (at least for OHCI
-        * controller), because the HCCA (Host Controller Communication Area)
-        * lies within the SDRAM and the host controller writes continously to
-        * this area (as busmaster!). The HccaFrameNumber is for example
-        * updated every 1 ms within the HCCA structure in SDRAM! For more
-        * details see the OpenHCI specification.
-        */
-       usb_stop();
-#endif
-       return iflag;
-}
-
-/**
- * Execute selected states of the bootm command.
- *
- * Note the arguments to this state must be the first argument, Any 'bootm'
- * or sub-command arguments must have already been taken.
- *
- * Note that if states contains more than one flag it MUST contain
- * BOOTM_STATE_START, since this handles and consumes the command line args.
- *
- * Also note that aside from boot_os_fn functions and bootm_load_os no other
- * functions we store the return value of in 'ret' may use a negative return
- * value, without special handling.
- *
- * @param cmdtp                Pointer to bootm command table entry
- * @param flag         Command flags (CMD_FLAG_...)
- * @param argc         Number of subcommand arguments (0 = no arguments)
- * @param argv         Arguments
- * @param states       Mask containing states to run (BOOTM_STATE_...)
- * @param images       Image header information
- * @param boot_progress 1 to show boot progress, 0 to not do this
- * @return 0 if ok, something else on error. Some errors will cause this
- *     function to perform a reboot! If states contains BOOTM_STATE_OS_GO
- *     then the intent is to boot an OS, so this function will not return
- *     unless the image type is standalone.
- */
-static int do_bootm_states(cmd_tbl_t *cmdtp, int flag, int argc,
-               char * const argv[], int states, bootm_headers_t *images,
-               int boot_progress)
-{
-       boot_os_fn *boot_fn;
-       ulong iflag = 0;
-       int ret = 0, need_boot_fn;
-
-       images->state |= states;
-
-       /*
-        * Work through the states and see how far we get. We stop on
-        * any error.
-        */
-       if (states & BOOTM_STATE_START)
-               ret = bootm_start(cmdtp, flag, argc, argv);
-
-       if (!ret && (states & BOOTM_STATE_FINDOS))
-               ret = bootm_find_os(cmdtp, flag, argc, argv);
-
-       if (!ret && (states & BOOTM_STATE_FINDOTHER)) {
-               ret = bootm_find_other(cmdtp, flag, argc, argv);
-               argc = 0;       /* consume the args */
-       }
-
-       /* Load the OS */
-       if (!ret && (states & BOOTM_STATE_LOADOS)) {
-               ulong load_end;
-
-               iflag = bootm_disable_interrupts();
-               ret = bootm_load_os(images, &load_end, 0);
-               if (ret == 0)
-                       lmb_reserve(&images->lmb, images->os.load,
-                                   (load_end - images->os.load));
-               else if (ret && ret != BOOTM_ERR_OVERLAP)
-                       goto err;
-               else if (ret == BOOTM_ERR_OVERLAP)
-                       ret = 0;
-#if defined(CONFIG_SILENT_CONSOLE) && !defined(CONFIG_SILENT_U_BOOT_ONLY)
-               if (images->os.os == IH_OS_LINUX)
-                       fixup_silent_linux();
-#endif
-       }
-
-       /* Relocate the ramdisk */
-#ifdef CONFIG_SYS_BOOT_RAMDISK_HIGH
-       if (!ret && (states & BOOTM_STATE_RAMDISK)) {
-               ulong rd_len = images->rd_end - images->rd_start;
-
-               ret = boot_ramdisk_high(&images->lmb, images->rd_start,
-                       rd_len, &images->initrd_start, &images->initrd_end);
-               if (!ret) {
-                       setenv_hex("initrd_start", images->initrd_start);
-                       setenv_hex("initrd_end", images->initrd_end);
-               }
-       }
-#endif
-#if defined(CONFIG_OF_LIBFDT) && defined(CONFIG_LMB)
-       if (!ret && (states & BOOTM_STATE_FDT)) {
-               boot_fdt_add_mem_rsv_regions(&images->lmb, images->ft_addr);
-               ret = boot_relocate_fdt(&images->lmb, &images->ft_addr,
-                                       &images->ft_len);
-       }
-#endif
-
-       /* From now on, we need the OS boot function */
-       if (ret)
-               return ret;
-       boot_fn = boot_os[images->os.os];
-       need_boot_fn = states & (BOOTM_STATE_OS_CMDLINE |
-                       BOOTM_STATE_OS_BD_T | BOOTM_STATE_OS_PREP |
-                       BOOTM_STATE_OS_FAKE_GO | BOOTM_STATE_OS_GO);
-       if (boot_fn == NULL && need_boot_fn) {
-               if (iflag)
-                       enable_interrupts();
-               printf("ERROR: booting os '%s' (%d) is not supported\n",
-                      genimg_get_os_name(images->os.os), images->os.os);
-               bootstage_error(BOOTSTAGE_ID_CHECK_BOOT_OS);
-               return 1;
-       }
-
-       /* Call various other states that are not generally used */
-       if (!ret && (states & BOOTM_STATE_OS_CMDLINE))
-               ret = boot_fn(BOOTM_STATE_OS_CMDLINE, argc, argv, images);
-       if (!ret && (states & BOOTM_STATE_OS_BD_T))
-               ret = boot_fn(BOOTM_STATE_OS_BD_T, argc, argv, images);
-       if (!ret && (states & BOOTM_STATE_OS_PREP))
-               ret = boot_fn(BOOTM_STATE_OS_PREP, argc, argv, images);
-
-#ifdef CONFIG_TRACE
-       /* Pretend to run the OS, then run a user command */
-       if (!ret && (states & BOOTM_STATE_OS_FAKE_GO)) {
-               char *cmd_list = getenv("fakegocmd");
-
-               ret = boot_selected_os(argc, argv, BOOTM_STATE_OS_FAKE_GO,
-                               images, boot_fn);
-               if (!ret && cmd_list)
-                       ret = run_command_list(cmd_list, -1, flag);
-       }
-#endif
-
-       /* Check for unsupported subcommand. */
-       if (ret) {
-               puts("subcommand not supported\n");
-               return ret;
-       }
-
-       /* Now run the OS! We hope this doesn't return */
-       if (!ret && (states & BOOTM_STATE_OS_GO))
-               ret = boot_selected_os(argc, argv, BOOTM_STATE_OS_GO,
-                               images, boot_fn);
-
-       /* Deal with any fallout */
-err:
-       if (iflag)
-               enable_interrupts();
-
-       if (ret == BOOTM_ERR_UNIMPLEMENTED)
-               bootstage_error(BOOTSTAGE_ID_DECOMP_UNIMPL);
-       else if (ret == BOOTM_ERR_RESET)
-               do_reset(cmdtp, flag, argc, argv);
-
-       return ret;
-}
-
 static int do_bootm_subcommand(cmd_tbl_t *cmdtp, int flag, int argc,
                        char * const argv[])
 {
@@ -793,11 +99,6 @@ int do_bootm(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
        if (!relocated) {
                int i;
 
-               /* relocate boot function table */
-               for (i = 0; i < ARRAY_SIZE(boot_os); i++)
-                       if (boot_os[i] != NULL)
-                               boot_os[i] += gd->reloc_off;
-
                /* relocate names of sub-command table */
                for (i = 0; i < ARRAY_SIZE(cmd_bootm_sub); i++)
                        cmd_bootm_sub[i].name += gd->reloc_off;
@@ -849,196 +150,6 @@ int bootm_maybe_autostart(cmd_tbl_t *cmdtp, const char *cmd)
        return 0;
 }
 
-#if defined(CONFIG_IMAGE_FORMAT_LEGACY)
-/**
- * image_get_kernel - verify legacy format kernel image
- * @img_addr: in RAM address of the legacy format image to be verified
- * @verify: data CRC verification flag
- *
- * image_get_kernel() verifies legacy image integrity and returns pointer to
- * legacy image header if image verification was completed successfully.
- *
- * returns:
- *     pointer to a legacy image header if valid image was found
- *     otherwise return NULL
- */
-static image_header_t *image_get_kernel(ulong img_addr, int verify)
-{
-       image_header_t *hdr = (image_header_t *)img_addr;
-
-       if (!image_check_magic(hdr)) {
-               puts("Bad Magic Number\n");
-               bootstage_error(BOOTSTAGE_ID_CHECK_MAGIC);
-               return NULL;
-       }
-       bootstage_mark(BOOTSTAGE_ID_CHECK_HEADER);
-
-       if (!image_check_hcrc(hdr)) {
-               puts("Bad Header Checksum\n");
-               bootstage_error(BOOTSTAGE_ID_CHECK_HEADER);
-               return NULL;
-       }
-
-       bootstage_mark(BOOTSTAGE_ID_CHECK_CHECKSUM);
-       image_print_contents(hdr);
-
-       if (verify) {
-               puts("   Verifying Checksum ... ");
-               if (!image_check_dcrc(hdr)) {
-                       printf("Bad Data CRC\n");
-                       bootstage_error(BOOTSTAGE_ID_CHECK_CHECKSUM);
-                       return NULL;
-               }
-               puts("OK\n");
-       }
-       bootstage_mark(BOOTSTAGE_ID_CHECK_ARCH);
-
-       if (!image_check_target_arch(hdr)) {
-               printf("Unsupported Architecture 0x%x\n", image_get_arch(hdr));
-               bootstage_error(BOOTSTAGE_ID_CHECK_ARCH);
-               return NULL;
-       }
-       return hdr;
-}
-#endif
-
-/**
- * boot_get_kernel - find kernel image
- * @os_data: pointer to a ulong variable, will hold os data start address
- * @os_len: pointer to a ulong variable, will hold os data length
- *
- * boot_get_kernel() tries to find a kernel image, verifies its integrity
- * and locates kernel data.
- *
- * returns:
- *     pointer to image header if valid image was found, plus kernel start
- *     address and length, otherwise NULL
- */
-static const void *boot_get_kernel(cmd_tbl_t *cmdtp, int flag, int argc,
-               char * const argv[], bootm_headers_t *images, ulong *os_data,
-               ulong *os_len)
-{
-#if defined(CONFIG_IMAGE_FORMAT_LEGACY)
-       image_header_t  *hdr;
-#endif
-       ulong           img_addr;
-       const void *buf;
-#if defined(CONFIG_FIT)
-       const char      *fit_uname_config = NULL;
-       const char      *fit_uname_kernel = NULL;
-       int             os_noffset;
-#endif
-
-       /* find out kernel image address */
-       if (argc < 1) {
-               img_addr = load_addr;
-               debug("*  kernel: default image load address = 0x%08lx\n",
-                               load_addr);
-#if defined(CONFIG_FIT)
-       } else if (fit_parse_conf(argv[0], load_addr, &img_addr,
-                                                       &fit_uname_config)) {
-               debug("*  kernel: config '%s' from image at 0x%08lx\n",
-                               fit_uname_config, img_addr);
-       } else if (fit_parse_subimage(argv[0], load_addr, &img_addr,
-                                                       &fit_uname_kernel)) {
-               debug("*  kernel: subimage '%s' from image at 0x%08lx\n",
-                               fit_uname_kernel, img_addr);
-#endif
-       } else {
-               img_addr = simple_strtoul(argv[0], NULL, 16);
-               debug("*  kernel: cmdline image address = 0x%08lx\n", img_addr);
-       }
-
-       bootstage_mark(BOOTSTAGE_ID_CHECK_MAGIC);
-
-       /* copy from dataflash if needed */
-       img_addr = genimg_get_image(img_addr);
-
-       /* check image type, for FIT images get FIT kernel node */
-       *os_data = *os_len = 0;
-       buf = map_sysmem(img_addr, 0);
-       switch (genimg_get_format(buf)) {
-#if defined(CONFIG_IMAGE_FORMAT_LEGACY)
-       case IMAGE_FORMAT_LEGACY:
-               printf("## Booting kernel from Legacy Image at %08lx ...\n",
-                               img_addr);
-               hdr = image_get_kernel(img_addr, images->verify);
-               if (!hdr)
-                       return NULL;
-               bootstage_mark(BOOTSTAGE_ID_CHECK_IMAGETYPE);
-
-               /* get os_data and os_len */
-               switch (image_get_type(hdr)) {
-               case IH_TYPE_KERNEL:
-               case IH_TYPE_KERNEL_NOLOAD:
-                       *os_data = image_get_data(hdr);
-                       *os_len = image_get_data_size(hdr);
-                       break;
-               case IH_TYPE_MULTI:
-                       image_multi_getimg(hdr, 0, os_data, os_len);
-                       break;
-               case IH_TYPE_STANDALONE:
-                       *os_data = image_get_data(hdr);
-                       *os_len = image_get_data_size(hdr);
-                       break;
-               default:
-                       printf("Wrong Image Type for %s command\n",
-                               cmdtp->name);
-                       bootstage_error(BOOTSTAGE_ID_CHECK_IMAGETYPE);
-                       return NULL;
-               }
-
-               /*
-                * copy image header to allow for image overwrites during
-                * kernel decompression.
-                */
-               memmove(&images->legacy_hdr_os_copy, hdr,
-                       sizeof(image_header_t));
-
-               /* save pointer to image header */
-               images->legacy_hdr_os = hdr;
-
-               images->legacy_hdr_valid = 1;
-               bootstage_mark(BOOTSTAGE_ID_DECOMP_IMAGE);
-               break;
-#endif
-#if defined(CONFIG_FIT)
-       case IMAGE_FORMAT_FIT:
-               os_noffset = fit_image_load(images, FIT_KERNEL_PROP,
-                               img_addr,
-                               &fit_uname_kernel, &fit_uname_config,
-                               IH_ARCH_DEFAULT, IH_TYPE_KERNEL,
-                               BOOTSTAGE_ID_FIT_KERNEL_START,
-                               FIT_LOAD_IGNORED, os_data, os_len);
-               if (os_noffset < 0)
-                       return NULL;
-
-               images->fit_hdr_os = map_sysmem(img_addr, 0);
-               images->fit_uname_os = fit_uname_kernel;
-               images->fit_uname_cfg = fit_uname_config;
-               images->fit_noffset_os = os_noffset;
-               break;
-#endif
-#ifdef CONFIG_ANDROID_BOOT_IMAGE
-       case IMAGE_FORMAT_ANDROID:
-               printf("## Booting Android Image at 0x%08lx ...\n", img_addr);
-               if (android_image_get_kernel((void *)img_addr, images->verify,
-                                            os_data, os_len))
-                       return NULL;
-               break;
-#endif
-       default:
-               printf("Wrong Image Format for %s command\n", cmdtp->name);
-               bootstage_error(BOOTSTAGE_ID_FIT_KERNEL_INFO);
-               return NULL;
-       }
-
-       debug("   kernel data at 0x%08lx, len = 0x%08lx (%ld)\n",
-                       *os_data, *os_len, *os_len);
-
-       return buf;
-}
-
 #ifdef CONFIG_SYS_LONGHELP
 static char bootm_help_text[] =
        "[addr [arg ...]]\n    - boot application image stored in memory\n"
@@ -1420,441 +531,6 @@ U_BOOT_CMD(
 );
 #endif
 
-/*******************************************************************/
-/* helper routines */
-/*******************************************************************/
-#if defined(CONFIG_SILENT_CONSOLE) && !defined(CONFIG_SILENT_U_BOOT_ONLY)
-
-#define CONSOLE_ARG     "console="
-#define CONSOLE_ARG_LEN (sizeof(CONSOLE_ARG) - 1)
-
-static void fixup_silent_linux(void)
-{
-       char *buf;
-       const char *env_val;
-       char *cmdline = getenv("bootargs");
-       int want_silent;
-
-       /*
-        * Only fix cmdline when requested. The environment variable can be:
-        *
-        *      no - we never fixup
-        *      yes - we always fixup
-        *      unset - we rely on the console silent flag
-        */
-       want_silent = getenv_yesno("silent_linux");
-       if (want_silent == 0)
-               return;
-       else if (want_silent == -1 && !(gd->flags & GD_FLG_SILENT))
-               return;
-
-       debug("before silent fix-up: %s\n", cmdline);
-       if (cmdline && (cmdline[0] != '\0')) {
-               char *start = strstr(cmdline, CONSOLE_ARG);
-
-               /* Allocate space for maximum possible new command line */
-               buf = malloc(strlen(cmdline) + 1 + CONSOLE_ARG_LEN + 1);
-               if (!buf) {
-                       debug("%s: out of memory\n", __func__);
-                       return;
-               }
-
-               if (start) {
-                       char *end = strchr(start, ' ');
-                       int num_start_bytes = start - cmdline + CONSOLE_ARG_LEN;
-
-                       strncpy(buf, cmdline, num_start_bytes);
-                       if (end)
-                               strcpy(buf + num_start_bytes, end);
-                       else
-                               buf[num_start_bytes] = '\0';
-               } else {
-                       sprintf(buf, "%s %s", cmdline, CONSOLE_ARG);
-               }
-               env_val = buf;
-       } else {
-               buf = NULL;
-               env_val = CONSOLE_ARG;
-       }
-
-       setenv("bootargs", env_val);
-       debug("after silent fix-up: %s\n", env_val);
-       free(buf);
-}
-#endif /* CONFIG_SILENT_CONSOLE */
-
-#if defined(CONFIG_BOOTM_NETBSD) || defined(CONFIG_BOOTM_PLAN9)
-static void copy_args(char *dest, int argc, char * const argv[], char delim)
-{
-       int i;
-
-       for (i = 0; i < argc; i++) {
-               if (i > 0)
-                       *dest++ = delim;
-               strcpy(dest, argv[i]);
-               dest += strlen(argv[i]);
-       }
-}
-#endif
-
-/*******************************************************************/
-/* OS booting routines */
-/*******************************************************************/
-
-#ifdef CONFIG_BOOTM_NETBSD
-static int do_bootm_netbsd(int flag, int argc, char * const argv[],
-                           bootm_headers_t *images)
-{
-       void (*loader)(bd_t *, image_header_t *, char *, char *);
-       image_header_t *os_hdr, *hdr;
-       ulong kernel_data, kernel_len;
-       char *consdev;
-       char *cmdline;
-
-       if (flag != BOOTM_STATE_OS_GO)
-               return 0;
-
-#if defined(CONFIG_FIT)
-       if (!images->legacy_hdr_valid) {
-               fit_unsupported_reset("NetBSD");
-               return 1;
-       }
-#endif
-       hdr = images->legacy_hdr_os;
-
-       /*
-        * Booting a (NetBSD) kernel image
-        *
-        * This process is pretty similar to a standalone application:
-        * The (first part of an multi-) image must be a stage-2 loader,
-        * which in turn is responsible for loading & invoking the actual
-        * kernel.  The only differences are the parameters being passed:
-        * besides the board info strucure, the loader expects a command
-        * line, the name of the console device, and (optionally) the
-        * address of the original image header.
-        */
-       os_hdr = NULL;
-       if (image_check_type(&images->legacy_hdr_os_copy, IH_TYPE_MULTI)) {
-               image_multi_getimg(hdr, 1, &kernel_data, &kernel_len);
-               if (kernel_len)
-                       os_hdr = hdr;
-       }
-
-       consdev = "";
-#if   defined(CONFIG_8xx_CONS_SMC1)
-       consdev = "smc1";
-#elif defined(CONFIG_8xx_CONS_SMC2)
-       consdev = "smc2";
-#elif defined(CONFIG_8xx_CONS_SCC2)
-       consdev = "scc2";
-#elif defined(CONFIG_8xx_CONS_SCC3)
-       consdev = "scc3";
-#endif
-
-       if (argc > 0) {
-               ulong len;
-               int   i;
-
-               for (i = 0, len = 0; i < argc; i += 1)
-                       len += strlen(argv[i]) + 1;
-               cmdline = malloc(len);
-               copy_args(cmdline, argc, argv, ' ');
-       } else if ((cmdline = getenv("bootargs")) == NULL) {
-               cmdline = "";
-       }
-
-       loader = (void (*)(bd_t *, image_header_t *, char *, char *))images->ep;
-
-       printf("## Transferring control to NetBSD stage-2 loader "
-               "(at address %08lx) ...\n",
-               (ulong)loader);
-
-       bootstage_mark(BOOTSTAGE_ID_RUN_OS);
-
-       /*
-        * NetBSD Stage-2 Loader Parameters:
-        *   arg[0]: pointer to board info data
-        *   arg[1]: image load address
-        *   arg[2]: char pointer to the console device to use
-        *   arg[3]: char pointer to the boot arguments
-        */
-       (*loader)(gd->bd, os_hdr, consdev, cmdline);
-
-       return 1;
-}
-#endif /* CONFIG_BOOTM_NETBSD*/
-
-#ifdef CONFIG_LYNXKDI
-static int do_bootm_lynxkdi(int flag, int argc, char * const argv[],
-                            bootm_headers_t *images)
-{
-       image_header_t *hdr = &images->legacy_hdr_os_copy;
-
-       if (flag != BOOTM_STATE_OS_GO)
-               return 0;
-
-#if defined(CONFIG_FIT)
-       if (!images->legacy_hdr_valid) {
-               fit_unsupported_reset("Lynx");
-               return 1;
-       }
-#endif
-
-       lynxkdi_boot((image_header_t *)hdr);
-
-       return 1;
-}
-#endif /* CONFIG_LYNXKDI */
-
-#ifdef CONFIG_BOOTM_RTEMS
-static int do_bootm_rtems(int flag, int argc, char * const argv[],
-                          bootm_headers_t *images)
-{
-       void (*entry_point)(bd_t *);
-
-       if (flag != BOOTM_STATE_OS_GO)
-               return 0;
-
-#if defined(CONFIG_FIT)
-       if (!images->legacy_hdr_valid) {
-               fit_unsupported_reset("RTEMS");
-               return 1;
-       }
-#endif
-
-       entry_point = (void (*)(bd_t *))images->ep;
-
-       printf("## Transferring control to RTEMS (at address %08lx) ...\n",
-               (ulong)entry_point);
-
-       bootstage_mark(BOOTSTAGE_ID_RUN_OS);
-
-       /*
-        * RTEMS Parameters:
-        *   r3: ptr to board info data
-        */
-       (*entry_point)(gd->bd);
-
-       return 1;
-}
-#endif /* CONFIG_BOOTM_RTEMS */
-
-#if defined(CONFIG_BOOTM_OSE)
-static int do_bootm_ose(int flag, int argc, char * const argv[],
-                          bootm_headers_t *images)
-{
-       void (*entry_point)(void);
-
-       if (flag != BOOTM_STATE_OS_GO)
-               return 0;
-
-#if defined(CONFIG_FIT)
-       if (!images->legacy_hdr_valid) {
-               fit_unsupported_reset("OSE");
-               return 1;
-       }
-#endif
-
-       entry_point = (void (*)(void))images->ep;
-
-       printf("## Transferring control to OSE (at address %08lx) ...\n",
-               (ulong)entry_point);
-
-       bootstage_mark(BOOTSTAGE_ID_RUN_OS);
-
-       /*
-        * OSE Parameters:
-        *   None
-        */
-       (*entry_point)();
-
-       return 1;
-}
-#endif /* CONFIG_BOOTM_OSE */
-
-#if defined(CONFIG_BOOTM_PLAN9)
-static int do_bootm_plan9(int flag, int argc, char * const argv[],
-                          bootm_headers_t *images)
-{
-       void (*entry_point)(void);
-       char *s;
-
-       if (flag != BOOTM_STATE_OS_GO)
-               return 0;
-
-#if defined(CONFIG_FIT)
-       if (!images->legacy_hdr_valid) {
-               fit_unsupported_reset("Plan 9");
-               return 1;
-       }
-#endif
-
-       /* See README.plan9 */
-       s = getenv("confaddr");
-       if (s != NULL) {
-               char *confaddr = (char *)simple_strtoul(s, NULL, 16);
-
-               if (argc > 0) {
-                       copy_args(confaddr, argc, argv, '\n');
-               } else {
-                       s = getenv("bootargs");
-                       if (s != NULL)
-                               strcpy(confaddr, s);
-               }
-       }
-
-       entry_point = (void (*)(void))images->ep;
-
-       printf("## Transferring control to Plan 9 (at address %08lx) ...\n",
-               (ulong)entry_point);
-
-       bootstage_mark(BOOTSTAGE_ID_RUN_OS);
-
-       /*
-        * Plan 9 Parameters:
-        *   None
-        */
-       (*entry_point)();
-
-       return 1;
-}
-#endif /* CONFIG_BOOTM_PLAN9 */
-
-#if defined(CONFIG_BOOTM_VXWORKS) && \
-       (defined(CONFIG_PPC) || defined(CONFIG_ARM))
-
-void do_bootvx_fdt(bootm_headers_t *images)
-{
-#if defined(CONFIG_OF_LIBFDT)
-       int ret;
-       char *bootline;
-       ulong of_size = images->ft_len;
-       char **of_flat_tree = &images->ft_addr;
-       struct lmb *lmb = &images->lmb;
-
-       if (*of_flat_tree) {
-               boot_fdt_add_mem_rsv_regions(lmb, *of_flat_tree);
-
-               ret = boot_relocate_fdt(lmb, of_flat_tree, &of_size);
-               if (ret)
-                       return;
-
-               ret = fdt_add_subnode(*of_flat_tree, 0, "chosen");
-               if ((ret >= 0 || ret == -FDT_ERR_EXISTS)) {
-                       bootline = getenv("bootargs");
-                       if (bootline) {
-                               ret = fdt_find_and_setprop(*of_flat_tree,
-                                               "/chosen", "bootargs",
-                                               bootline,
-                                               strlen(bootline) + 1, 1);
-                               if (ret < 0) {
-                                       printf("## ERROR: %s : %s\n", __func__,
-                                              fdt_strerror(ret));
-                                       return;
-                               }
-                       }
-               } else {
-                       printf("## ERROR: %s : %s\n", __func__,
-                              fdt_strerror(ret));
-                       return;
-               }
-       }
-#endif
-
-       boot_prep_vxworks(images);
-
-       bootstage_mark(BOOTSTAGE_ID_RUN_OS);
-
-#if defined(CONFIG_OF_LIBFDT)
-       printf("## Starting vxWorks at 0x%08lx, device tree at 0x%08lx ...\n",
-              (ulong)images->ep, (ulong)*of_flat_tree);
-#else
-       printf("## Starting vxWorks at 0x%08lx\n", (ulong)images->ep);
-#endif
-
-       boot_jump_vxworks(images);
-
-       puts("## vxWorks terminated\n");
-}
-
-static int do_bootm_vxworks(int flag, int argc, char * const argv[],
-                            bootm_headers_t *images)
-{
-       if (flag != BOOTM_STATE_OS_GO)
-               return 0;
-
-#if defined(CONFIG_FIT)
-       if (!images->legacy_hdr_valid) {
-               fit_unsupported_reset("VxWorks");
-               return 1;
-       }
-#endif
-
-       do_bootvx_fdt(images);
-
-       return 1;
-}
-#endif
-
-#if defined(CONFIG_CMD_ELF)
-static int do_bootm_qnxelf(int flag, int argc, char * const argv[],
-                           bootm_headers_t *images)
-{
-       char *local_args[2];
-       char str[16];
-
-       if (flag != BOOTM_STATE_OS_GO)
-               return 0;
-
-#if defined(CONFIG_FIT)
-       if (!images->legacy_hdr_valid) {
-               fit_unsupported_reset("QNX");
-               return 1;
-       }
-#endif
-
-       sprintf(str, "%lx", images->ep); /* write entry-point into string */
-       local_args[0] = argv[0];
-       local_args[1] = str;    /* and provide it via the arguments */
-       do_bootelf(NULL, 0, 2, local_args);
-
-       return 1;
-}
-#endif
-
-#ifdef CONFIG_INTEGRITY
-static int do_bootm_integrity(int flag, int argc, char * const argv[],
-                          bootm_headers_t *images)
-{
-       void (*entry_point)(void);
-
-       if (flag != BOOTM_STATE_OS_GO)
-               return 0;
-
-#if defined(CONFIG_FIT)
-       if (!images->legacy_hdr_valid) {
-               fit_unsupported_reset("INTEGRITY");
-               return 1;
-       }
-#endif
-
-       entry_point = (void (*)(void))images->ep;
-
-       printf("## Transferring control to INTEGRITY (at address %08lx) ...\n",
-               (ulong)entry_point);
-
-       bootstage_mark(BOOTSTAGE_ID_RUN_OS);
-
-       /*
-        * INTEGRITY Parameters:
-        *   None
-        */
-       (*entry_point)();
-
-       return 1;
-}
-#endif
-
 #ifdef CONFIG_CMD_BOOTZ
 
 int __weak bootz_setup(ulong image, ulong *start, ulong *end)
@@ -1898,14 +574,9 @@ static int bootz_start(cmd_tbl_t *cmdtp, int flag, int argc,
         * Handle the BOOTM_STATE_FINDOTHER state ourselves as we do not
         * have a header that provide this informaiton.
         */
-       if (bootm_find_ramdisk(flag, argc, argv))
+       if (bootm_find_ramdisk_fdt(flag, argc, argv))
                return 1;
 
-#if defined(CONFIG_OF_LIBFDT)
-       if (bootm_find_fdt(flag, argc, argv))
-               return 1;
-#endif
-
        return 0;
 }
 
index a6744ed9c2509eb14cb441df45d4cb64974f385c..e86d992838ee2986f57e9466271b4d393a7e05a0 100644 (file)
@@ -581,8 +581,8 @@ static int do_fdt(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
                        initrd_end = simple_strtoul(argv[3], NULL, 16);
                }
 
-               fdt_chosen(working_fdt, 1);
-               fdt_initrd(working_fdt, initrd_start, initrd_end, 1);
+               fdt_chosen(working_fdt);
+               fdt_initrd(working_fdt, initrd_start, initrd_end);
 
 #if defined(CONFIG_FIT_SIGNATURE)
        } else if (strncmp(argv[1], "che", 3) == 0) {
@@ -612,7 +612,7 @@ static int do_fdt(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
                }
 
                ret = fit_config_verify(working_fdt, cfg_noffset);
-               if (ret == 1)
+               if (ret == 0)
                        return CMD_RET_SUCCESS;
                else
                        return CMD_RET_FAILURE;
diff --git a/common/cmd_iotrace.c b/common/cmd_iotrace.c
new file mode 100644 (file)
index 0000000..f54276d
--- /dev/null
@@ -0,0 +1,73 @@
+/*
+ * Copyright (c) 2014 Google, Inc
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#include <common.h>
+#include <command.h>
+#include <iotrace.h>
+
+static void do_print_stats(void)
+{
+       ulong start, size, offset, count;
+
+       printf("iotrace is %sabled\n", iotrace_get_enabled() ? "en" : "dis");
+       iotrace_get_buffer(&start, &size, &offset, &count);
+       printf("Start:  %08lx\n", start);
+       printf("Size:   %08lx\n", size);
+       printf("Offset: %08lx\n", offset);
+       printf("Output: %08lx\n", start + offset);
+       printf("Count:  %08lx\n", count);
+       printf("CRC32:  %08lx\n", (ulong)iotrace_get_checksum());
+}
+
+static int do_set_buffer(int argc, char * const argv[])
+{
+       ulong addr = 0, size = 0;
+
+       if (argc == 2) {
+               addr = simple_strtoul(*argv++, NULL, 16);
+               size = simple_strtoul(*argv++, NULL, 16);
+       } else if (argc != 0) {
+               return CMD_RET_USAGE;
+       }
+
+       iotrace_set_buffer(addr, size);
+
+       return 0;
+}
+
+int do_iotrace(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
+{
+       const char *cmd = argc < 2 ? NULL : argv[1];
+
+       if (!cmd)
+               return cmd_usage(cmdtp);
+       switch (*cmd) {
+       case 'b':
+               return do_set_buffer(argc - 2, argv + 2);
+       case 'p':
+               iotrace_set_enabled(0);
+               break;
+       case 'r':
+               iotrace_set_enabled(1);
+               break;
+       case 's':
+               do_print_stats();
+               break;
+       default:
+               return CMD_RET_USAGE;
+       }
+
+       return 0;
+}
+
+U_BOOT_CMD(
+       iotrace,        4,      1,      do_iotrace,
+       "iotrace utility commands",
+       "stats                        - display iotrace stats\n"
+       "iotrace buffer <address> <size>      - set iotrace buffer\n"
+       "iotrace pause                        - pause tracing\n"
+       "iotrace resume                       - resume tracing"
+);
index ae0f62e26067fef480cc756370b10f4c8595c29c..3ac8cc41b1a450edc7f5e489b3a6e9e4c2d14a38 100644 (file)
@@ -33,7 +33,6 @@ static void store_result(const u8 *sum, const char *dest)
                        sprintf(str_ptr, "%02x", sum[i]);
                        str_ptr += 2;
                }
-               str_ptr = '\0';
                setenv(dest, str_output);
        }
 }
index 00982b164dd3c41e562fadffa0adf522c8841e66..3d9fce7e554883f8dbb6b886d17420704f2f8a03 100644 (file)
@@ -114,11 +114,13 @@ static int do_sandbox(cmd_tbl_t *cmdtp, int flag, int argc,
 U_BOOT_CMD(
        sb,     8,      1,      do_sandbox,
        "Miscellaneous sandbox commands",
-       "load host <dev> <addr> <filename> [<bytes> <offset>]  - "
+       "load hostfs - <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>] - "
+       "sb ls hostfs - <filename>                    - list files on host\n"
+       "sb save hostfs - <filename> <addr> <bytes> [<offset>] - "
                "save a file to host\n"
        "sb bind <dev> [<filename>] - bind \"host\" device to file\n"
-       "sb info [<dev>]            - show device binding & info"
+       "sb info [<dev>]            - show device binding & info\n"
+       "sb commands use the \"hostfs\" device. The \"host\" device is used\n"
+       "with standard IO commands such as fatls or ext2load"
 );
index 644b9a0e668e661b4add6f3eab5c90705edc5f48..783ea2e32db3725909d13e76b843aeb7e5f92bc3 100644 (file)
@@ -11,7 +11,7 @@
 #include <common.h>
 #include <command.h>
 #include <hash.h>
-#include <sha1.h>
+#include <u-boot/sha1.h>
 
 int do_sha1sum(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
 {
index fcd252336cdf15d8cebe503e4025ef2f07d41b09..7927a83b896988441d3358a0071c55c26c4c2bb5 100644 (file)
 #include <fdt_support.h>
 #include <exports.h>
 
-/*
- * Global data (for the gd->bd)
- */
-DECLARE_GLOBAL_DATA_PTR;
-
 /*
  * Get cells len in bytes
  *     if #NNNN-cells property is 2 then len is 8
  *     otherwise len is 4
  */
-static int get_cells_len(void *blob, char *nr_cells_name)
+static int get_cells_len(const void *fdt, const char *nr_cells_name)
 {
        const fdt32_t *cell;
 
-       cell = fdt_getprop(blob, 0, nr_cells_name, NULL);
+       cell = fdt_getprop(fdt, 0, nr_cells_name, NULL);
        if (cell && fdt32_to_cpu(*cell) == 2)
                return 8;
 
        return 4;
 }
 
-/*
- * Write a 4 or 8 byte big endian cell
- */
-static void write_cell(u8 *addr, u64 val, int size)
-{
-       int shift = (size - 1) * 8;
-       while (size-- > 0) {
-               *addr++ = (val >> shift) & 0xff;
-               shift -= 8;
-       }
-}
-
 /**
  * fdt_getprop_u32_default_node - Return a node's property or a default
  *
@@ -129,9 +112,39 @@ int fdt_find_and_setprop(void *fdt, const char *node, const char *prop,
        return fdt_setprop(fdt, nodeoff, prop, val, len);
 }
 
-#ifdef CONFIG_OF_STDOUT_VIA_ALIAS
+/**
+ * fdt_find_or_add_subnode - find or possibly add a subnode of a given node
+ * @fdt: pointer to the device tree blob
+ * @parentoffset: structure block offset of a node
+ * @name: name of the subnode to locate
+ *
+ * fdt_subnode_offset() finds a subnode of the node with a given name.
+ * If the subnode does not exist, it will be created.
+ */
+static int fdt_find_or_add_subnode(void *fdt, int parentoffset,
+                                  const char *name)
+{
+       int offset;
+
+       offset = fdt_subnode_offset(fdt, parentoffset, name);
+
+       if (offset == -FDT_ERR_NOTFOUND)
+               offset = fdt_add_subnode(fdt, parentoffset, name);
 
-#ifdef CONFIG_CONS_INDEX
+       if (offset < 0)
+               printf("%s: %s: %s\n", __func__, name, fdt_strerror(offset));
+
+       return offset;
+}
+
+/* rename to CONFIG_OF_STDOUT_PATH ? */
+#if defined(OF_STDOUT_PATH)
+static int fdt_fixup_stdout(void *fdt, int chosenoff)
+{
+       return fdt_setprop(fdt, chosenoff, "linux,stdout-path",
+                             OF_STDOUT_PATH, strlen(OF_STDOUT_PATH) + 1);
+}
+#elif defined(CONFIG_OF_STDOUT_VIA_ALIAS) && defined(CONFIG_CONS_INDEX)
 static void fdt_fill_multisername(char *sername, size_t maxlen)
 {
        const char *outname = stdio_devices[stdout]->name;
@@ -143,66 +156,75 @@ static void fdt_fill_multisername(char *sername, size_t maxlen)
        if (strcmp(outname + 1, "serial") > 0)
                strncpy(sername, outname + 1, maxlen);
 }
-#endif
 
 static int fdt_fixup_stdout(void *fdt, int chosenoff)
 {
-       int err = 0;
-#ifdef CONFIG_CONS_INDEX
-       int node;
+       int err;
+       int aliasoff;
        char sername[9] = { 0 };
-       const char *path;
+       const void *path;
+       int len;
+       char tmp[256]; /* long enough */
 
        fdt_fill_multisername(sername, sizeof(sername) - 1);
        if (!sername[0])
                sprintf(sername, "serial%d", CONFIG_CONS_INDEX - 1);
 
-       err = node = fdt_path_offset(fdt, "/aliases");
-       if (node >= 0) {
-               int len;
-               path = fdt_getprop(fdt, node, sername, &len);
-               if (path) {
-                       char *p = malloc(len);
-                       err = -FDT_ERR_NOSPACE;
-                       if (p) {
-                               memcpy(p, path, len);
-                               err = fdt_setprop(fdt, chosenoff,
-                                       "linux,stdout-path", p, len);
-                               free(p);
-                       }
-               } else {
-                       err = len;
-               }
+       aliasoff = fdt_path_offset(fdt, "/aliases");
+       if (aliasoff < 0) {
+               err = aliasoff;
+               goto error;
        }
-#endif
+
+       path = fdt_getprop(fdt, aliasoff, sername, &len);
+       if (!path) {
+               err = len;
+               goto error;
+       }
+
+       /* fdt_setprop may break "path" so we copy it to tmp buffer */
+       memcpy(tmp, path, len);
+
+       err = fdt_setprop(fdt, chosenoff, "linux,stdout-path", tmp, len);
+error:
        if (err < 0)
                printf("WARNING: could not set linux,stdout-path %s.\n",
-                               fdt_strerror(err));
+                      fdt_strerror(err));
 
        return err;
 }
+#else
+static int fdt_fixup_stdout(void *fdt, int chosenoff)
+{
+       return 0;
+}
 #endif
 
-int fdt_initrd(void *fdt, ulong initrd_start, ulong initrd_end, int force)
+static inline int fdt_setprop_uxx(void *fdt, int nodeoffset, const char *name,
+                                 uint64_t val, int is_u64)
+{
+       if (is_u64)
+               return fdt_setprop_u64(fdt, nodeoffset, name, val);
+       else
+               return fdt_setprop_u32(fdt, nodeoffset, name, (uint32_t)val);
+}
+
+
+int fdt_initrd(void *fdt, ulong initrd_start, ulong initrd_end)
 {
-       int   nodeoffset, addr_cell_len;
+       int   nodeoffset;
        int   err, j, total;
-       fdt64_t  tmp;
-       const char *path;
+       int is_u64;
        uint64_t addr, size;
 
-       /* Find the "chosen" node.  */
-       nodeoffset = fdt_path_offset (fdt, "/chosen");
+       /* just return if the size of initrd is zero */
+       if (initrd_start == initrd_end)
+               return 0;
 
-       /* If there is no "chosen" node in the blob return */
-       if (nodeoffset < 0) {
-               printf("fdt_initrd: %s\n", fdt_strerror(nodeoffset));
+       /* find or create "/chosen" node. */
+       nodeoffset = fdt_find_or_add_subnode(fdt, 0, "chosen");
+       if (nodeoffset < 0)
                return nodeoffset;
-       }
-
-       /* just return if initrd_start/end aren't valid */
-       if ((initrd_start == 0) || (initrd_end == 0))
-               return 0;
 
        total = fdt_num_mem_rsv(fdt);
 
@@ -224,39 +246,35 @@ int fdt_initrd(void *fdt, ulong initrd_start, ulong initrd_end, int force)
                return err;
        }
 
-       addr_cell_len = get_cells_len(fdt, "#address-cells");
+       is_u64 = (get_cells_len(fdt, "#address-cells") == 8);
 
-       path = fdt_getprop(fdt, nodeoffset, "linux,initrd-start", NULL);
-       if ((path == NULL) || force) {
-               write_cell((u8 *)&tmp, initrd_start, addr_cell_len);
-               err = fdt_setprop(fdt, nodeoffset,
-                       "linux,initrd-start", &tmp, addr_cell_len);
-               if (err < 0) {
-                       printf("WARNING: "
-                               "could not set linux,initrd-start %s.\n",
-                               fdt_strerror(err));
-                       return err;
-               }
-               write_cell((u8 *)&tmp, initrd_end, addr_cell_len);
-               err = fdt_setprop(fdt, nodeoffset,
-                       "linux,initrd-end", &tmp, addr_cell_len);
-               if (err < 0) {
-                       printf("WARNING: could not set linux,initrd-end %s.\n",
-                               fdt_strerror(err));
+       err = fdt_setprop_uxx(fdt, nodeoffset, "linux,initrd-start",
+                             (uint64_t)initrd_start, is_u64);
 
-                       return err;
-               }
+       if (err < 0) {
+               printf("WARNING: could not set linux,initrd-start %s.\n",
+                      fdt_strerror(err));
+               return err;
+       }
+
+       err = fdt_setprop_uxx(fdt, nodeoffset, "linux,initrd-end",
+                             (uint64_t)initrd_end, is_u64);
+
+       if (err < 0) {
+               printf("WARNING: could not set linux,initrd-end %s.\n",
+                      fdt_strerror(err));
+
+               return err;
        }
 
        return 0;
 }
 
-int fdt_chosen(void *fdt, int force)
+int fdt_chosen(void *fdt)
 {
        int   nodeoffset;
        int   err;
        char  *str;             /* used to set string properties */
-       const char *path;
 
        err = fdt_check_header(fdt);
        if (err < 0) {
@@ -264,61 +282,23 @@ int fdt_chosen(void *fdt, int force)
                return err;
        }
 
-       /*
-        * Find the "chosen" node.
-        */
-       nodeoffset = fdt_path_offset (fdt, "/chosen");
-
-       /*
-        * If there is no "chosen" node in the blob, create it.
-        */
-       if (nodeoffset < 0) {
-               /*
-                * Create a new node "/chosen" (offset 0 is root level)
-                */
-               nodeoffset = fdt_add_subnode(fdt, 0, "chosen");
-               if (nodeoffset < 0) {
-                       printf("WARNING: could not create /chosen %s.\n",
-                               fdt_strerror(nodeoffset));
-                       return nodeoffset;
-               }
-       }
+       /* find or create "/chosen" node. */
+       nodeoffset = fdt_find_or_add_subnode(fdt, 0, "chosen");
+       if (nodeoffset < 0)
+               return nodeoffset;
 
-       /*
-        * Create /chosen properites that don't exist in the fdt.
-        * If the property exists, update it only if the "force" parameter
-        * is true.
-        */
        str = getenv("bootargs");
-       if (str != NULL) {
-               path = fdt_getprop(fdt, nodeoffset, "bootargs", NULL);
-               if ((path == NULL) || force) {
-                       err = fdt_setprop(fdt, nodeoffset,
-                               "bootargs", str, strlen(str)+1);
-                       if (err < 0)
-                               printf("WARNING: could not set bootargs %s.\n",
-                                       fdt_strerror(err));
+       if (str) {
+               err = fdt_setprop(fdt, nodeoffset, "bootargs", str,
+                                 strlen(str) + 1);
+               if (err < 0) {
+                       printf("WARNING: could not set bootargs %s.\n",
+                              fdt_strerror(err));
+                       return err;
                }
        }
 
-#ifdef CONFIG_OF_STDOUT_VIA_ALIAS
-       path = fdt_getprop(fdt, nodeoffset, "linux,stdout-path", NULL);
-       if ((path == NULL) || force)
-               err = fdt_fixup_stdout(fdt, nodeoffset);
-#endif
-
-#ifdef OF_STDOUT_PATH
-       path = fdt_getprop(fdt, nodeoffset, "linux,stdout-path", NULL);
-       if ((path == NULL) || force) {
-               err = fdt_setprop(fdt, nodeoffset,
-                       "linux,stdout-path", OF_STDOUT_PATH, strlen(OF_STDOUT_PATH)+1);
-               if (err < 0)
-                       printf("WARNING: could not set linux,stdout-path %s.\n",
-                               fdt_strerror(err));
-       }
-#endif
-
-       return err;
+       return fdt_fixup_stdout(fdt, nodeoffset);
 }
 
 void do_fixup_by_path(void *fdt, const char *path, const char *prop,
@@ -399,6 +379,34 @@ void do_fixup_by_compat_u32(void *fdt, const char *compat,
        do_fixup_by_compat(fdt, compat, prop, &tmp, 4, create);
 }
 
+/*
+ * fdt_pack_reg - pack address and size array into the "reg"-suitable stream
+ */
+static int fdt_pack_reg(const void *fdt, void *buf, uint64_t *address,
+                       uint64_t *size, int n)
+{
+       int i;
+       int address_len = get_cells_len(fdt, "#address-cells");
+       int size_len = get_cells_len(fdt, "#size-cells");
+       char *p = buf;
+
+       for (i = 0; i < n; i++) {
+               if (address_len == 8)
+                       *(fdt64_t *)p = cpu_to_fdt64(address[i]);
+               else
+                       *(fdt32_t *)p = cpu_to_fdt32(address[i]);
+               p += address_len;
+
+               if (size_len == 8)
+                       *(fdt64_t *)p = cpu_to_fdt64(size[i]);
+               else
+                       *(fdt32_t *)p = cpu_to_fdt32(size[i]);
+               p += size_len;
+       }
+
+       return p - (char *)buf;
+}
+
 #ifdef CONFIG_NR_DRAM_BANKS
 #define MEMORY_BANKS_MAX CONFIG_NR_DRAM_BANKS
 #else
@@ -407,9 +415,8 @@ void do_fixup_by_compat_u32(void *fdt, const char *compat,
 int fdt_fixup_memory_banks(void *blob, u64 start[], u64 size[], int banks)
 {
        int err, nodeoffset;
-       int addr_cell_len, size_cell_len, len;
+       int len;
        u8 tmp[MEMORY_BANKS_MAX * 16]; /* Up to 64-bit address + 64-bit size */
-       int bank;
 
        if (banks > MEMORY_BANKS_MAX) {
                printf("%s: num banks %d exceeds hardcoded limit %d."
@@ -424,16 +431,11 @@ int fdt_fixup_memory_banks(void *blob, u64 start[], u64 size[], int banks)
                return err;
        }
 
-       /* update, or add and update /memory node */
-       nodeoffset = fdt_path_offset(blob, "/memory");
-       if (nodeoffset < 0) {
-               nodeoffset = fdt_add_subnode(blob, 0, "memory");
-               if (nodeoffset < 0) {
-                       printf("WARNING: could not create /memory: %s.\n",
-                                       fdt_strerror(nodeoffset));
+       /* find or create "/memory" node. */
+       nodeoffset = fdt_find_or_add_subnode(blob, 0, "memory");
+       if (nodeoffset < 0)
                        return nodeoffset;
-               }
-       }
+
        err = fdt_setprop(blob, nodeoffset, "device_type", "memory",
                        sizeof("memory"));
        if (err < 0) {
@@ -442,16 +444,7 @@ int fdt_fixup_memory_banks(void *blob, u64 start[], u64 size[], int banks)
                return err;
        }
 
-       addr_cell_len = get_cells_len(blob, "#address-cells");
-       size_cell_len = get_cells_len(blob, "#size-cells");
-
-       for (bank = 0, len = 0; bank < banks; bank++) {
-               write_cell(tmp + len, start[bank], addr_cell_len);
-               len += addr_cell_len;
-
-               write_cell(tmp + len, size[bank], size_cell_len);
-               len += size_cell_len;
-       }
+       len = fdt_pack_reg(blob, tmp, start, size, banks);
 
        err = fdt_setprop(blob, nodeoffset, "reg", tmp, len);
        if (err < 0) {
@@ -479,8 +472,18 @@ void fdt_fixup_ethernet(void *fdt)
        if (node < 0)
                return;
 
+       if (!getenv("ethaddr")) {
+               if (getenv("usbethaddr")) {
+                       strcpy(mac, "usbethaddr");
+               } else {
+                       debug("No ethernet MAC Address defined\n");
+                       return;
+               }
+       } else {
+               strcpy(mac, "ethaddr");
+       }
+
        i = 0;
-       strcpy(mac, "ethaddr");
        while ((tmp = getenv(mac)) != NULL) {
                sprintf(enet, "ethernet%d", i);
                path = fdt_getprop(fdt, node, enet, NULL);
index 237bd04bb12e67fe95542b9068a5ef2eb12a4a3c..12d67594abe0c6f912f5dcd80f5b0f4d1c3cd867 100644 (file)
@@ -15,8 +15,8 @@
 #include <malloc.h>
 #include <hw_sha.h>
 #include <hash.h>
-#include <sha1.h>
-#include <sha256.h>
+#include <u-boot/sha1.h>
+#include <u-boot/sha256.h>
 #include <asm/io.h>
 #include <asm/errno.h>
 
@@ -187,7 +187,7 @@ static struct hash_algo hash_algo[] = {
  * @allow_env_vars:    non-zero to permit storing the result to an
  *                     variable environment
  */
-static void store_result(struct hash_algo *algo, const u8 *sum,
+static void store_result(struct hash_algo *algo, const uint8_t *sum,
                         const char *dest, int allow_env_vars)
 {
        unsigned int i;
@@ -243,8 +243,8 @@ static void store_result(struct hash_algo *algo, const u8 *sum,
  *                     address, and the * prefix is not expected.
  * @return 0 if ok, non-zero on error
  */
-static int parse_verify_sum(struct hash_algo *algo, char *verify_str, u8 *vsum,
-                           int allow_env_vars)
+static int parse_verify_sum(struct hash_algo *algo, char *verify_str,
+                           uint8_t *vsum, int allow_env_vars)
 {
        int env_var = 0;
 
@@ -311,7 +311,7 @@ int hash_lookup_algo(const char *algo_name, struct hash_algo **algop)
        return -EPROTONOSUPPORT;
 }
 
-void hash_show(struct hash_algo *algo, ulong addr, ulong len, u8 *output)
+void hash_show(struct hash_algo *algo, ulong addr, ulong len, uint8_t *output)
 {
        int i;
 
@@ -355,8 +355,8 @@ int hash_command(const char *algo_name, int flags, cmd_tbl_t *cmdtp, int flag,
 
        if (multi_hash()) {
                struct hash_algo *algo;
-               u8 output[HASH_MAX_DIGEST_SIZE];
-               u8 vsum[HASH_MAX_DIGEST_SIZE];
+               uint8_t output[HASH_MAX_DIGEST_SIZE];
+               uint8_t vsum[HASH_MAX_DIGEST_SIZE];
                void *buf;
 
                if (hash_lookup_algo(algo_name, &algo)) {
index ac4563f4a70f70d2e801edafe9dafb4b478517db..9fc7481fd80d190a015814b626091dd8a65bdcce 100644 (file)
@@ -355,7 +355,6 @@ int boot_get_fdt(int flag, int argc, char * const argv[], uint8_t arch,
                                ulong load, len;
 
                                fdt_noffset = fit_image_load(images,
-                                       FIT_FDT_PROP,
                                        fdt_addr, &fit_uname_fdt,
                                        &fit_uname_config,
                                        arch, IH_TYPE_FLATDT,
@@ -463,7 +462,7 @@ int image_setup_libfdt(bootm_headers_t *images, void *blob,
        ulong *initrd_end = &images->initrd_end;
        int ret;
 
-       if (fdt_chosen(blob, 1) < 0) {
+       if (fdt_chosen(blob) < 0) {
                puts("ERROR: /chosen node create failed");
                puts(" - must RESET the board to recover.\n");
                return -1;
@@ -489,7 +488,7 @@ int image_setup_libfdt(bootm_headers_t *images, void *blob,
        /* Create a new LMB reservation */
        lmb_reserve(lmb, (ulong)blob, of_size);
 
-       fdt_initrd(blob, *initrd_start, *initrd_end, 1);
+       fdt_initrd(blob, *initrd_start, *initrd_end);
        if (!ft_verify_fdt(blob))
                return -1;
 
index 732505a36c165436b0751890378d3d76e6b479e9..c61be651334a0240cf81607f6624b0d770ef6fb7 100644 (file)
@@ -21,10 +21,10 @@ DECLARE_GLOBAL_DATA_PTR;
 #endif /* !USE_HOSTCC*/
 
 #include <bootstage.h>
-#include <sha1.h>
-#include <sha256.h>
 #include <u-boot/crc.h>
 #include <u-boot/md5.h>
+#include <u-boot/sha1.h>
+#include <u-boot/sha256.h>
 
 /*****************************************************************************/
 /* New uImage format routines */
@@ -1477,7 +1477,32 @@ int fit_get_node_from_config(bootm_headers_t *images, const char *prop_name,
        return noffset;
 }
 
-int fit_image_load(bootm_headers_t *images, const char *prop_name, ulong addr,
+/**
+ * fit_get_image_type_property() - get property name for IH_TYPE_...
+ *
+ * @return the properly name where we expect to find the image in the
+ * config node
+ */
+static const char *fit_get_image_type_property(int type)
+{
+       /*
+        * This is sort-of available in the uimage_type[] table in image.c
+        * but we don't have access to the sohrt name, and "fdt" is different
+        * anyway. So let's just keep it here.
+        */
+       switch (type) {
+       case IH_TYPE_FLATDT:
+               return FIT_FDT_PROP;
+       case IH_TYPE_KERNEL:
+               return FIT_KERNEL_PROP;
+       case IH_TYPE_RAMDISK:
+               return FIT_RAMDISK_PROP;
+       }
+
+       return "unknown";
+}
+
+int fit_image_load(bootm_headers_t *images, ulong addr,
                   const char **fit_unamep, const char **fit_uname_configp,
                   int arch, int image_type, int bootstage_id,
                   enum fit_load_op load_op, ulong *datap, ulong *lenp)
@@ -1490,11 +1515,13 @@ int fit_image_load(bootm_headers_t *images, const char *prop_name, ulong addr,
        size_t size;
        int type_ok, os_ok;
        ulong load, data, len;
+       const char *prop_name;
        int ret;
 
        fit = map_sysmem(addr, 0);
        fit_uname = fit_unamep ? *fit_unamep : NULL;
        fit_uname_config = fit_uname_configp ? *fit_uname_configp : NULL;
+       prop_name = fit_get_image_type_property(image_type);
        printf("## Loading %s from FIT Image at %08lx ...\n", prop_name, addr);
 
        bootstage_mark(bootstage_id + BOOTSTAGE_SUB_FORMAT);
@@ -1534,7 +1561,7 @@ int fit_image_load(bootm_headers_t *images, const char *prop_name, ulong addr,
                        images->fit_uname_cfg = fit_uname_config;
                        if (IMAGE_ENABLE_VERIFY && images->verify) {
                                puts("   Verifying Hash Integrity ... ");
-                               if (!fit_config_verify(fit, cfg_noffset)) {
+                               if (fit_config_verify(fit, cfg_noffset)) {
                                        puts("Bad Data Hash\n");
                                        bootstage_error(bootstage_id +
                                                BOOTSTAGE_SUB_HASH);
@@ -1564,12 +1591,13 @@ int fit_image_load(bootm_headers_t *images, const char *prop_name, ulong addr,
        }
 
        bootstage_mark(bootstage_id + BOOTSTAGE_SUB_CHECK_ARCH);
+#ifndef USE_HOSTCC
        if (!fit_image_check_target_arch(fit, noffset)) {
                puts("Unsupported Architecture\n");
                bootstage_error(bootstage_id + BOOTSTAGE_SUB_CHECK_ARCH);
                return -ENOEXEC;
        }
-
+#endif
        if (image_type == IH_TYPE_FLATDT &&
            !fit_image_check_comp(fit, noffset, IH_COMP_NONE)) {
                puts("FDT image is compressed");
@@ -1610,7 +1638,7 @@ int fit_image_load(bootm_headers_t *images, const char *prop_name, ulong addr,
 
        /*
         * Work-around for eldk-4.2 which gives this warning if we try to
-        * case in the unmap_sysmem() call:
+        * cast in the unmap_sysmem() call:
         * warning: initialization discards qualifiers from pointer target type
         */
        {
index 72284eb1d1fd00947863c63b55b1a3f3ece6f8c0..8601edaca35f41d0c996e15fb7f447179a8255b3 100644 (file)
@@ -13,8 +13,8 @@
 DECLARE_GLOBAL_DATA_PTR;
 #endif /* !USE_HOSTCC*/
 #include <image.h>
-#include <rsa.h>
-#include <rsa-checksum.h>
+#include <u-boot/rsa.h>
+#include <u-boot/rsa-checksum.h>
 
 #define IMAGE_MAX_HASHED_NODES         100
 
@@ -467,6 +467,6 @@ int fit_config_verify_required_sigs(const void *fit, int conf_noffset,
 
 int fit_config_verify(const void *fit, int conf_noffset)
 {
-       return !fit_config_verify_required_sigs(fit, conf_noffset,
-                                               gd_fdt_blob());
+       return fit_config_verify_required_sigs(fit, conf_noffset,
+                                              gd_fdt_blob());
 }
index f33b17522a89e2cc47628685c5cb401e3f0f5cc1..11b3cf58e6fe197c48e724bbcd02532ea30cf5ae 100644 (file)
@@ -34,7 +34,7 @@
 #endif
 
 #include <u-boot/md5.h>
-#include <sha1.h>
+#include <u-boot/sha1.h>
 #include <asm/errno.h>
 #include <asm/io.h>
 
@@ -903,7 +903,7 @@ int boot_get_ramdisk(int argc, char * const argv[], bootm_headers_t *images,
 #endif
 #if defined(CONFIG_FIT)
                case IMAGE_FORMAT_FIT:
-                       rd_noffset = fit_image_load(images, FIT_RAMDISK_PROP,
+                       rd_noffset = fit_image_load(images,
                                        rd_addr, &fit_uname_ramdisk,
                                        &fit_uname_config, arch,
                                        IH_TYPE_RAMDISK,
diff --git a/common/iotrace.c b/common/iotrace.c
new file mode 100644 (file)
index 0000000..ced426e
--- /dev/null
@@ -0,0 +1,169 @@
+/*
+ * Copyright (c) 2014 Google, Inc.
+ *
+ * SPDX-License-Identifier:     GPL-2.0+
+ */
+
+#define IOTRACE_IMPL
+
+#include <common.h>
+#include <asm/io.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+/* Support up to the machine word length for now */
+typedef ulong iovalue_t;
+
+enum iotrace_flags {
+       IOT_8 = 0,
+       IOT_16,
+       IOT_32,
+
+       IOT_READ = 0 << 3,
+       IOT_WRITE = 1 << 3,
+};
+
+/**
+ * struct iotrace_record - Holds a single I/O trace record
+ *
+ * @flags: I/O access type
+ * @addr: Address of access
+ * @value: Value written or read
+ */
+struct iotrace_record {
+       enum iotrace_flags flags;
+       phys_addr_t addr;
+       iovalue_t value;
+};
+
+/**
+ * struct iotrace - current trace status and checksum
+ *
+ * @start:     Start address of iotrace buffer
+ * @size:      Size of iotrace buffer in bytes
+ * @offset:    Current write offset into iotrace buffer
+ * @crc32:     Current value of CRC chceksum of trace records
+ * @enabled:   true if enabled, false if disabled
+ */
+static struct iotrace {
+       ulong start;
+       ulong size;
+       ulong offset;
+       u32 crc32;
+       bool enabled;
+} iotrace;
+
+static void add_record(int flags, const void *ptr, ulong value)
+{
+       struct iotrace_record srec, *rec = &srec;
+
+       /*
+        * We don't support iotrace before relocation. Since the trace buffer
+        * is set up by a command, it can't be enabled at present. To change
+        * this we would need to set the iotrace buffer at build-time. See
+        * lib/trace.c for how this might be done if you are interested.
+        */
+       if (!(gd->flags & GD_FLG_RELOC) || !iotrace.enabled)
+               return;
+
+       /* Store it if there is room */
+       if (iotrace.offset + sizeof(*rec) < iotrace.size) {
+               rec = (struct iotrace_record *)map_sysmem(
+                                       iotrace.start + iotrace.offset,
+                                       sizeof(value));
+       }
+
+       rec->flags = flags;
+       rec->addr = map_to_sysmem(ptr);
+       rec->value = value;
+
+       /* Update our checksum */
+       iotrace.crc32 = crc32(iotrace.crc32, (unsigned char *)rec,
+                             sizeof(*rec));
+
+       iotrace.offset += sizeof(struct iotrace_record);
+}
+
+u32 iotrace_readl(const void *ptr)
+{
+       u32 v;
+
+       v = readl(ptr);
+       add_record(IOT_32 | IOT_READ, ptr, v);
+
+       return v;
+}
+
+void iotrace_writel(ulong value, const void *ptr)
+{
+       add_record(IOT_32 | IOT_WRITE, ptr, value);
+       writel(value, ptr);
+}
+
+u16 iotrace_readw(const void *ptr)
+{
+       u32 v;
+
+       v = readw(ptr);
+       add_record(IOT_16 | IOT_READ, ptr, v);
+
+       return v;
+}
+
+void iotrace_writew(ulong value, const void *ptr)
+{
+       add_record(IOT_16 | IOT_WRITE, ptr, value);
+       writew(value, ptr);
+}
+
+u8 iotrace_readb(const void *ptr)
+{
+       u32 v;
+
+       v = readb(ptr);
+       add_record(IOT_8 | IOT_READ, ptr, v);
+
+       return v;
+}
+
+void iotrace_writeb(ulong value, const void *ptr)
+{
+       add_record(IOT_8 | IOT_WRITE, ptr, value);
+       writeb(value, ptr);
+}
+
+void iotrace_reset_checksum(void)
+{
+       iotrace.crc32 = 0;
+}
+
+u32 iotrace_get_checksum(void)
+{
+       return iotrace.crc32;
+}
+
+void iotrace_set_enabled(int enable)
+{
+       iotrace.enabled = enable;
+}
+
+int iotrace_get_enabled(void)
+{
+       return iotrace.enabled;
+}
+
+void iotrace_set_buffer(ulong start, ulong size)
+{
+       iotrace.start = start;
+       iotrace.size = size;
+       iotrace.offset = 0;
+       iotrace.crc32 = 0;
+}
+
+void iotrace_get_buffer(ulong *start, ulong *size, ulong *offset, ulong *count)
+{
+       *start = iotrace.start;
+       *size = iotrace.size;
+       *offset = iotrace.offset;
+       *count = iotrace.offset / sizeof(struct iotrace_record);
+}
index b3097e32f0eb0a14bb356f21d816abb39e78ca72..baceb19c60c7212c215e69eaba0be55d3f720170 100644 (file)
@@ -510,6 +510,25 @@ int get_device_and_partition(const char *ifname, const char *dev_part_str,
        int part;
        disk_partition_t tmpinfo;
 
+       /*
+        * Special-case a psuedo block device "hostfs", to allow access to the
+        * host's own filesystem.
+        */
+       if (0 == strcmp(ifname, "hostfs")) {
+               *dev_desc = NULL;
+               info->start = 0;
+               info->size = 0;
+               info->blksz = 0;
+               info->bootable = 0;
+               strcpy((char *)info->type, BOOT_PART_TYPE);
+               strcpy((char *)info->name, "Sandbox host");
+#ifdef CONFIG_PARTITION_UUIDS
+               info->uuid[0] = 0;
+#endif
+
+               return 0;
+       }
+
        /* If no dev_part_str, use bootdevice environment variable */
        if (!dev_part_str || !strlen(dev_part_str) ||
            !strcmp(dev_part_str, "-"))
index be92d7ae88384ac784a9c30ddd8c640277e01ee5..d8fe4a826f20d41335067b6c3a251d1a12d4dfd8 100644 (file)
@@ -143,9 +143,9 @@ specify the file to read.
 You cannot use more than one of these options at the same time.
 
 To use a device tree file that you have compiled yourself, pass
-DEV_TREE_BIN=<filename> to 'make', as in:
+EXT_DTB=<filename> to 'make', as in:
 
-       make DEV_TREE_BIN=boot/am335x-boneblack-pubkey.dtb
+       make EXT_DTB=boot/am335x-boneblack-pubkey.dtb
 
 Then U-Boot will copy that file to u-boot.dtb, put it in the .img file
 if used, and u-boot-dtb.bin.
index a5035beca6e36c0270b2b6efe9bde9bff591ed49..22c3fcb6eff81aedb062d197e97f5ab089eb3f50 100644 (file)
@@ -222,7 +222,44 @@ device tree) and probe.
 Platform Data
 -------------
 
-Where does the platform data come from? See demo-pdata.c which
+Platform data is like Linux platform data, if you are familiar with that.
+It provides the board-specific information to start up a device.
+
+Why is this information not just stored in the device driver itself? The
+idea is that the device driver is generic, and can in principle operate on
+any board that has that type of device. For example, with modern
+highly-complex SoCs it is common for the IP to come from an IP vendor, and
+therefore (for example) the MMC controller may be the same on chips from
+different vendors. It makes no sense to write independent drivers for the
+MMC controller on each vendor's SoC, when they are all almost the same.
+Similarly, we may have 6 UARTs in an SoC, all of which are mostly the same,
+but lie at different addresses in the address space.
+
+Using the UART example, we have a single driver and it is instantiated 6
+times by supplying 6 lots of platform data. Each lot of platform data
+gives the driver name and a pointer to a structure containing information
+about this instance - e.g. the address of the register space. It may be that
+one of the UARTS supports RS-485 operation - this can be added as a flag in
+the platform data, which is set for this one port and clear for the rest.
+
+Think of your driver as a generic piece of code which knows how to talk to
+a device, but needs to know where it is, any variant/option information and
+so on. Platform data provides this link between the generic piece of code
+and the specific way it is bound on a particular board.
+
+Examples of platform data include:
+
+   - The base address of the IP block's register space
+   - Configuration options, like:
+         - the SPI polarity and maximum speed for a SPI controller
+         - the I2C speed to use for an I2C device
+         - the number of GPIOs available in a GPIO device
+
+Where does the platform data come from? It is either held in a structure
+which is compiled into U-Boot, or it can be parsed from the Device Tree
+(see 'Device Tree' below).
+
+For an example of how it can be compiled in, see demo-pdata.c which
 sets up a table of driver names and their associated platform data.
 The data can be interpreted by the drivers however they like - it is
 basically a communication scheme between the board-specific code and
@@ -259,21 +296,30 @@ following device tree fragment:
                sides = <4>;
        };
 
+This means that instead of having lots of U_BOOT_DEVICE() declarations in
+the board file, we put these in the device tree. This approach allows a lot
+more generality, since the same board file can support many types of boards
+(e,g. with the same SoC) just by using different device trees. An added
+benefit is that the Linux device tree can be used, thus further simplifying
+the task of board-bring up either for U-Boot or Linux devs (whoever gets to
+the board first!).
 
 The easiest way to make this work it to add a few members to the driver:
 
        .platdata_auto_alloc_size = sizeof(struct dm_test_pdata),
        .ofdata_to_platdata = testfdt_ofdata_to_platdata,
-       .probe  = testfdt_drv_probe,
 
 The 'auto_alloc' feature allowed space for the platdata to be allocated
-and zeroed before the driver's ofdata_to_platdata method is called. This
-method reads the information out of the device tree and puts it in
-dev->platdata. Then the probe method is called to set up the device.
+and zeroed before the driver's ofdata_to_platdata() method is called. The
+ofdata_to_platdata() method, which the driver write supplies, should parse
+the device tree node for this device and place it in dev->platdata. Thus
+when the probe method is called later (to set up the device ready for use)
+the platform data will be present.
 
 Note that both methods are optional. If you provide an ofdata_to_platdata
-method then it will be called first (after bind). If you provide a probe
-method it will be called next.
+method then it will be called first (during activation). If you provide a
+probe method it will be called next. See Driver Lifecycle below for more
+details.
 
 If you don't want to have the platdata automatically allocated then you
 can leave out platdata_auto_alloc_size. In this case you can use malloc
@@ -295,6 +341,166 @@ numbering comes from include/dm/uclass.h. To add a new uclass, add to the
 end of the enum there, then declare your uclass as above.
 
 
+Driver Lifecycle
+----------------
+
+Here are the stages that a device goes through in driver model. Note that all
+methods mentioned here are optional - e.g. if there is no probe() method for
+a device then it will not be called. A simple device may have very few
+methods actually defined.
+
+1. Bind stage
+
+A device and its driver are bound using one of these two methods:
+
+   - Scan the U_BOOT_DEVICE() definitions. U-Boot It looks up the
+name specified by each, to find the appropriate driver. It then calls
+device_bind() to create a new device and bind' it to its driver. This will
+call the device's bind() method.
+
+   - Scan through the device tree definitions. U-Boot looks at top-level
+nodes in the the device tree. It looks at the compatible string in each node
+and uses the of_match part of the U_BOOT_DRIVER() structure to find the
+right driver for each node. It then calls device_bind() to bind the
+newly-created device to its driver (thereby creating a device structure).
+This will also call the device's bind() method.
+
+At this point all the devices are known, and bound to their drivers. There
+is a 'struct udevice' allocated for all devices. However, nothing has been
+activated (except for the root device). Each bound device that was created
+from a U_BOOT_DEVICE() declaration will hold the platdata pointer specified
+in that declaration. For a bound device created from the device tree,
+platdata will be NULL, but of_offset will be the offset of the device tree
+node that caused the device to be created. The uclass is set correctly for
+the device.
+
+The device's bind() method is permitted to perform simple actions, but
+should not scan the device tree node, not initialise hardware, nor set up
+structures or allocate memory. All of these tasks should be left for
+the probe() method.
+
+Note that compared to Linux, U-Boot's driver model has a separate step of
+probe/remove which is independent of bind/unbind. This is partly because in
+U-Boot it may be expensive to probe devices and we don't want to do it until
+they are needed, or perhaps until after relocation.
+
+2. Activation/probe
+
+When a device needs to be used, U-Boot activates it, by following these
+steps (see device_probe()):
+
+   a. If priv_auto_alloc_size is non-zero, then the device-private space
+   is allocated for the device and zeroed. It will be accessible as
+   dev->priv. The driver can put anything it likes in there, but should use
+   it for run-time information, not platform data (which should be static
+   and known before the device is probed).
+
+   b. If platdata_auto_alloc_size is non-zero, then the platform data space
+   is allocated. This is only useful for device tree operation, since
+   otherwise you would have to specific the platform data in the
+   U_BOOT_DEVICE() declaration. The space is allocated for the device and
+   zeroed. It will be accessible as dev->platdata.
+
+   c. If the device's uclass specifies a non-zero per_device_auto_alloc_size,
+   then this space is allocated and zeroed also. It is allocated for and
+   stored in the device, but it is uclass data. owned by the uclass driver.
+   It is possible for the device to access it.
+
+   d. All parent devices are probed. It is not possible to activate a device
+   unless its predecessors (all the way up to the root device) are activated.
+   This means (for example) that an I2C driver will require that its bus
+   be activated.
+
+   e. If the driver provides an ofdata_to_platdata() method, then this is
+   called to convert the device tree data into platform data. This should
+   do various calls like fdtdec_get_int(gd->fdt_blob, dev->of_offset, ...)
+   to access the node and store the resulting information into dev->platdata.
+   After this point, the device works the same way whether it was bound
+   using a device tree node or U_BOOT_DEVICE() structure. In either case,
+   the platform data is now stored in the platdata structure. Typically you
+   will use the platdata_auto_alloc_size feature to specify the size of the
+   platform data structure, and U-Boot will automatically allocate and zero
+   it for you before entry to ofdata_to_platdata(). But if not, you can
+   allocate it yourself in ofdata_to_platdata(). Note that it is preferable
+   to do all the device tree decoding in ofdata_to_platdata() rather than
+   in probe(). (Apart from the ugliness of mixing configuration and run-time
+   data, one day it is possible that U-Boot will cache platformat data for
+   devices which are regularly de/activated).
+
+   f. The device's probe() method is called. This should do anything that
+   is required by the device to get it going. This could include checking
+   that the hardware is actually present, setting up clocks for the
+   hardware and setting up hardware registers to initial values. The code
+   in probe() can access:
+
+      - platform data in dev->platdata (for configuration)
+      - private data in dev->priv (for run-time state)
+      - uclass data in dev->uclass_priv (for things the uclass stores
+        about this device)
+
+   Note: If you don't use priv_auto_alloc_size then you will need to
+   allocate the priv space here yourself. The same applies also to
+   platdata_auto_alloc_size. Remember to free them in the remove() method.
+
+   g. The device is marked 'activated'
+
+   h. The uclass's post_probe() method is called, if one exists. This may
+   cause the uclass to do some housekeeping to record the device as
+   activated and 'known' by the uclass.
+
+3. Running stage
+
+The device is now activated and can be used. From now until it is removed
+all of the above structures are accessible. The device appears in the
+uclass's list of devices (so if the device is in UCLASS_GPIO it will appear
+as a device in the GPIO uclass). This is the 'running' state of the device.
+
+4. Removal stage
+
+When the device is no-longer required, you can call device_remove() to
+remove it. This performs the probe steps in reverse:
+
+   a. The uclass's pre_remove() method is called, if one exists. This may
+   cause the uclass to do some housekeeping to record the device as
+   deactivated and no-longer 'known' by the uclass.
+
+   b. All the device's children are removed. It is not permitted to have
+   an active child device with a non-active parent. This means that
+   device_remove() is called for all the children recursively at this point.
+
+   c. The device's remove() method is called. At this stage nothing has been
+   deallocated so platform data, private data and the uclass data will all
+   still be present. This is where the hardware can be shut down. It is
+   intended that the device be completely inactive at this point, For U-Boot
+   to be sure that no hardware is running, it should be enough to remove
+   all devices.
+
+   d. The device memory is freed (platform data, private data, uclass data).
+
+   Note: Because the platform data for a U_BOOT_DEVICE() is defined with a
+   static pointer, it is not de-allocated during the remove() method. For
+   a device instantiated using the device tree data, the platform data will
+   be dynamically allocated, and thus needs to be deallocated during the
+   remove() method, either:
+
+      1. if the platdata_auto_alloc_size is non-zero, the deallocation
+      happens automatically within the driver model core; or
+
+      2. when platdata_auto_alloc_size is 0, both the allocation (in probe()
+      or preferably ofdata_to_platdata()) and the deallocation in remove()
+      are the responsibility of the driver author.
+
+   e. The device is marked inactive. Note that it is still bound, so the
+   device structure itself is not freed at this point. Should the device be
+   activated again, then the cycle starts again at step 2 above.
+
+5. Unbind stage
+
+The device is unbound. This is the step that actually destroys the device.
+If a parent has children these will be destroyed first. After this point
+the device does not exist and its memory has be deallocated.
+
+
 Data Structures
 ---------------
 
@@ -315,7 +521,7 @@ is little or no 'driver model' code to write.
 - Moved some data from code into data structure - e.g. store a pointer to
 the driver operations structure in the driver, rather than passing it
 to the driver bind function.
-- Rename some structures to make them more similar to Linux (struct device
+- Rename some structures to make them more similar to Linux (struct udevice
 instead of struct instance, struct platdata, etc.)
 - Change the name 'core' to 'uclass', meaning U-Boot class. It seems that
 this concept relates to a class of drivers (or a subsystem). We shouldn't
diff --git a/doc/uImage.FIT/beaglebone_vboot.txt b/doc/uImage.FIT/beaglebone_vboot.txt
new file mode 100644 (file)
index 0000000..b4ab285
--- /dev/null
@@ -0,0 +1,608 @@
+Verified Boot on the Beaglebone Black
+=====================================
+
+Introduction
+------------
+
+Before reading this, please read verified-boot.txt and signature.txt. These
+instructions are for mainline U-Boot from v2014.07 onwards.
+
+There is quite a bit of documentation in this directory describing how
+verified boot works in U-Boot. There is also a test which runs through the
+entire process of signing an image and running U-Boot (sandbox) to check it.
+However, it might be useful to also have an example on a real board.
+
+Beaglebone Black is a fairly common board so seems to be a reasonable choice
+for an example of how to enable verified boot using U-Boot.
+
+First a note that may to help avoid confusion. U-Boot and Linux both use
+device tree. They may use the same device tree source, but it is seldom useful
+for them to use the exact same binary from the same place. More typically,
+U-Boot has its device tree packaged wtih it, and the kernel's device tree is
+packaged with the kernel. In particular this is important with verified boot,
+since U-Boot's device tree must be immutable. If it can be changed then the
+public keys can be changed and verified boot is useless. An attacker can
+simply generate a new key and put his public key into U-Boot so that
+everything verifies. On the other hand the kernel's device tree typically
+changes when the kernel changes, so it is useful to package an updated device
+tree with the kernel binary. U-Boot supports the latter with its flexible FIT
+format (Flat Image Tree).
+
+
+Overview
+--------
+
+The steps are roughly as follows:
+
+1. Build U-Boot for the board, with the verified boot options enabled.
+
+2. Obtain a suitable Linux kernel
+
+3. Create a Image Tree Source file (ITS) file describing how you want the
+kernel to be packaged, compressed and signed.
+
+4. Create a key pair
+
+5. Sign the kernel
+
+6. Put the public key into U-Boot's image
+
+7. Put U-Boot and the kernel onto the board
+
+8. Try it
+
+
+Step 1: Build U-Boot
+--------------------
+
+a. Set up the environment variable to point to your toolchain. You will need
+this for U-Boot and also for the kernel if you build it. For example if you
+installed a Linaro version manually it might be something like:
+
+   export CROSS_COMPILE=/opt/linaro/gcc-linaro-arm-linux-gnueabihf-4.8-2013.08_linux/bin/arm-linux-gnueabihf-
+
+or if you just installed gcc-arm-linux-gnueabi then it might be
+
+   export CROSS_COMPILE=arm-linux-gnueabi-
+
+b. Configure and build U-Boot with verified boot enabled:
+
+   export ARCH=arm
+   export UBOOT=/path/to/u-boot
+   cd $UBOOT
+   # You can add -j10 if you have 10 CPUs to make it faster
+   make O=b/am335x_boneblack_vboot am335x_boneblack_vboot_config all
+   export UOUT=$UBOOT/b/am335x_boneblack_vboot
+
+c. You will now have a U-Boot image:
+
+   file b/am335x_boneblack_vboot/u-boot-dtb.img
+b/am335x_boneblack_vboot/u-boot-dtb.img: u-boot legacy uImage, U-Boot 2014.07-rc2-00065-g2f69f8, Firmware/ARM, Firmware Image (Not compressed), 395375 bytes, Sat May 31 16:19:04 2014, Load Address: 0x80800000, Entry Point: 0x00000000, Header CRC: 0x0ABD6ACA, Data CRC: 0x36DEF7E4
+
+
+Step 2: Build Linux
+--------------------
+
+a. Find the kernel image ('Image') and device tree (.dtb) file you plan to
+use. In our case it is am335x-boneblack.dtb and it is built with the kernel.
+At the time of writing an SD Boot image can be obtained from here:
+
+   http://www.elinux.org/Beagleboard:Updating_The_Software#Image_For_Booting_From_microSD
+
+You can write this to an SD card and then mount it to extract the kernel and
+device tree files.
+
+You can also build a kernel. Instructions for this are are here:
+
+   http://elinux.org/Building_BBB_Kernel
+
+or you can use your favourite search engine. Following these instructions
+produces a kernel Image and device tree files. For the record the steps were:
+
+   export KERNEL=/path/to/kernel
+   cd $KERNEL
+   git clone git://github.com/beagleboard/kernel.git .
+   git checkout v3.14
+   ./patch.sh
+   cp configs/beaglebone kernel/arch/arm/configs/beaglebone_defconfig
+   cd kernel
+   make beaglebone_defconfig
+   make uImage dtbs   # -j10 if you have 10 CPUs
+   export OKERNEL=$KERNEL/kernel/arch/arm/boot
+
+c. You now have the 'Image' and 'am335x-boneblack.dtb' files needed to boot.
+
+
+Step 3: Create the ITS
+----------------------
+
+Set up a directory for your work.
+
+   export WORK=/path/to/dir
+   cd $WORK
+
+Put this into a file in that directory called sign.its:
+
+/dts-v1/;
+
+/ {
+       description = "Beaglebone black";
+       #address-cells = <1>;
+
+       images {
+               kernel@1 {
+                       data = /incbin/("Image.lzo");
+                       type = "kernel";
+                       arch = "arm";
+                       os = "linux";
+                       compression = "lzo";
+                       load = <0x80008000>;
+                       entry = <0x80008000>;
+                       hash@1 {
+                               algo = "sha1";
+                       };
+               };
+               fdt@1 {
+                       description = "beaglebone-black";
+                       data = /incbin/("am335x-boneblack.dtb");
+                       type = "flat_dt";
+                       arch = "arm";
+                       compression = "none";
+                       hash@1 {
+                               algo = "sha1";
+                       };
+               };
+       };
+       configurations {
+               default = "conf@1";
+               conf@1 {
+                       kernel = "kernel@1";
+                       fdt = "fdt@1";
+                       signature@1 {
+                               algo = "sha1,rsa2048";
+                               key-name-hint = "dev";
+                               sign-images = "fdt", "kernel";
+                       };
+               };
+       };
+};
+
+
+The explanation for this is all in the documentation you have already read.
+But briefly it packages a kernel and device tree, and provides a single
+configuration to be signed with a key named 'dev'. The kernel is compressed
+with LZO to make it smaller.
+
+
+Step 4: Create a key pair
+-------------------------
+
+See signature.txt for details on this step.
+
+   cd $WORK
+   mkdir keys
+   openssl genrsa -F4 -out keys/dev.key 2048
+   openssl req -batch -new -x509 -key keys/dev.key -out keys/dev.crt
+
+Note: keys/dev.key contains your private key and is very secret. If anyone
+gets access to that file they can sign kernels with it. Keep it secure.
+
+
+Step 5: Sign the kernel
+-----------------------
+
+We need to use mkimage (which was built when you built U-Boot) to package the
+Linux kernel into a FIT (Flat Image Tree, a flexible file format that U-Boot
+can load) using the ITS file you just created.
+
+At the same time we must put the public key into U-Boot device tree, with the
+'required' property, which tells U-Boot that this key must be verified for the
+image to be valid. You will make this key available to U-Boot for booting in
+step 6.
+
+   ln -s $OKERNEL/dts/am335x-boneblack.dtb
+   ln -s $OKERNEL/Image
+   ln -s $UOUT/u-boot-dtb.img
+   cp $UOUT/arch/arm/dts/am335x-boneblack.dtb am335x-boneblack-pubkey.dtb
+   lzop Image
+   $UOUT/tools/mkimage -f sign.its -K am335x-boneblack-pubkey.dtb -k keys -r image.fit
+
+You should see something like this:
+
+FIT description: Beaglebone black
+Created:         Sun Jun  1 12:50:30 2014
+ Image 0 (kernel@1)
+  Description:  unavailable
+  Created:      Sun Jun  1 12:50:30 2014
+  Type:         Kernel Image
+  Compression:  lzo compressed
+  Data Size:    7790938 Bytes = 7608.34 kB = 7.43 MB
+  Architecture: ARM
+  OS:           Linux
+  Load Address: 0x80008000
+  Entry Point:  0x80008000
+  Hash algo:    sha1
+  Hash value:   c94364646427e10f423837e559898ef02c97b988
+ Image 1 (fdt@1)
+  Description:  beaglebone-black
+  Created:      Sun Jun  1 12:50:30 2014
+  Type:         Flat Device Tree
+  Compression:  uncompressed
+  Data Size:    31547 Bytes = 30.81 kB = 0.03 MB
+  Architecture: ARM
+  Hash algo:    sha1
+  Hash value:   cb09202f889d824f23b8e4404b781be5ad38a68d
+ Default Configuration: 'conf@1'
+ Configuration 0 (conf@1)
+  Description:  unavailable
+  Kernel:       kernel@1
+  FDT:          fdt@1
+
+
+Now am335x-boneblack-pubkey.dtb contains the public key and image.fit contains
+the signed kernel. Jump to step 6 if you like, or continue reading to increase
+your understanding.
+
+You can also run fit_check_sign to check it:
+
+   $UOUT/tools/fit_check_sign -f image.fit -k am335x-boneblack-pubkey.dtb
+
+which results in:
+
+Verifying Hash Integrity ... sha1,rsa2048:dev+
+## Loading kernel from FIT Image at 7fc6ee469000 ...
+   Using 'conf@1' configuration
+   Verifying Hash Integrity ...
+sha1,rsa2048:dev+
+OK
+
+   Trying 'kernel@1' kernel subimage
+     Description:  unavailable
+     Created:      Sun Jun  1 12:50:30 2014
+     Type:         Kernel Image
+     Compression:  lzo compressed
+     Data Size:    7790938 Bytes = 7608.34 kB = 7.43 MB
+     Architecture: ARM
+     OS:           Linux
+     Load Address: 0x80008000
+     Entry Point:  0x80008000
+     Hash algo:    sha1
+     Hash value:   c94364646427e10f423837e559898ef02c97b988
+   Verifying Hash Integrity ...
+sha1+
+OK
+
+Unimplemented compression type 4
+## Loading fdt from FIT Image at 7fc6ee469000 ...
+   Using 'conf@1' configuration
+   Trying 'fdt@1' fdt subimage
+     Description:  beaglebone-black
+     Created:      Sun Jun  1 12:50:30 2014
+     Type:         Flat Device Tree
+     Compression:  uncompressed
+     Data Size:    31547 Bytes = 30.81 kB = 0.03 MB
+     Architecture: ARM
+     Hash algo:    sha1
+     Hash value:   cb09202f889d824f23b8e4404b781be5ad38a68d
+   Verifying Hash Integrity ...
+sha1+
+OK
+
+   Loading Flat Device Tree ... OK
+
+## Loading ramdisk from FIT Image at 7fc6ee469000 ...
+   Using 'conf@1' configuration
+Could not find subimage node
+
+Signature check OK
+
+
+At the top, you see "sha1,rsa2048:dev+". This means that it checked an RSA key
+of size 2048 bits using SHA1 as the hash algorithm. The key name checked was
+'dev' and the '+' means that it verified. If it showed '-' that would be bad.
+
+Once the configuration is verified it is then possible to rely on the hashes
+in each image referenced by that configuration. So fit_check_sign goes on to
+load each of the images. We have a kernel and an FDT but no ramkdisk. In each
+case fit_check_sign checks the hash and prints sha1+ meaning that the SHA1
+hash verified. This means that none of the images has been tampered with.
+
+There is a test in test/vboot which uses U-Boot's sandbox build to verify that
+the above flow works.
+
+But it is fun to do this by hand, so you can load image.fit into a hex editor
+like ghex, and change a byte in the kernel:
+
+   $UOUT/tools/fit_info -f image.fit -n /images/kernel@1 -p data
+NAME: kernel@1
+LEN: 7790938
+OFF: 168
+
+This tells us that the kernel starts at byte offset 168 (decimal) in image.fit
+and extends for about 7MB. Try changing a byte at 0x2000 (say) and run
+fit_check_sign again. You should see something like:
+
+Verifying Hash Integrity ... sha1,rsa2048:dev+
+## Loading kernel from FIT Image at 7f5a39571000 ...
+   Using 'conf@1' configuration
+   Verifying Hash Integrity ...
+sha1,rsa2048:dev+
+OK
+
+   Trying 'kernel@1' kernel subimage
+     Description:  unavailable
+     Created:      Sun Jun  1 13:09:21 2014
+     Type:         Kernel Image
+     Compression:  lzo compressed
+     Data Size:    7790938 Bytes = 7608.34 kB = 7.43 MB
+     Architecture: ARM
+     OS:           Linux
+     Load Address: 0x80008000
+     Entry Point:  0x80008000
+     Hash algo:    sha1
+     Hash value:   c94364646427e10f423837e559898ef02c97b988
+   Verifying Hash Integrity ...
+sha1 error
+Bad hash value for 'hash@1' hash node in 'kernel@1' image node
+Bad Data Hash
+
+## Loading fdt from FIT Image at 7f5a39571000 ...
+   Using 'conf@1' configuration
+   Trying 'fdt@1' fdt subimage
+     Description:  beaglebone-black
+     Created:      Sun Jun  1 13:09:21 2014
+     Type:         Flat Device Tree
+     Compression:  uncompressed
+     Data Size:    31547 Bytes = 30.81 kB = 0.03 MB
+     Architecture: ARM
+     Hash algo:    sha1
+     Hash value:   cb09202f889d824f23b8e4404b781be5ad38a68d
+   Verifying Hash Integrity ...
+sha1+
+OK
+
+   Loading Flat Device Tree ... OK
+
+## Loading ramdisk from FIT Image at 7f5a39571000 ...
+   Using 'conf@1' configuration
+Could not find subimage node
+
+Signature check Bad (error 1)
+
+
+It has detected the change in the kernel.
+
+You can also be sneaky and try to switch images, using the libfdt utilities
+that come with dtc (package name is device-tree-compiler but you will need a
+recent version like 1.4:
+
+   dtc -v
+Version: DTC 1.4.0
+
+First we can check which nodes are actually hashed by the configuration:
+
+   fdtget -l image.fit /
+images
+configurations
+
+   fdtget -l image.fit /configurations
+conf@1
+fdtget -l image.fit /configurations/conf@1
+signature@1
+
+   fdtget -p image.fit /configurations/conf@1/signature@1
+hashed-strings
+hashed-nodes
+timestamp
+signer-version
+signer-name
+value
+algo
+key-name-hint
+sign-images
+
+   fdtget image.fit /configurations/conf@1/signature@1 hashed-nodes
+/ /configurations/conf@1 /images/fdt@1 /images/fdt@1/hash@1 /images/kernel@1 /images/kernel@1/hash@1
+
+This gives us a bit of a look into the signature that mkimage added. Note you
+can also use fdtdump to list the entire device tree.
+
+Say we want to change the kernel that this configuration uses
+(/images/kernel@1). We could just put a new kernel in the image, but we will
+need to change the hash to match. Let's simulate that by changing a byte of
+the hash:
+
+    fdtget -tx image.fit /images/kernel@1/hash@1 value
+c9436464 6427e10f 423837e5 59898ef0 2c97b988
+    fdtput -tx image.fit /images/kernel@1/hash@1 value c9436464 6427e10f 423837e5 59898ef0 2c97b981
+
+Now check it again:
+
+   $UOUT/tools/fit_check_sign -f image.fit -k am335x-boneblack-pubkey.dtb
+Verifying Hash Integrity ... sha1,rsa2048:devrsa_verify_with_keynode: RSA failed to verify: -13
+rsa_verify_with_keynode: RSA failed to verify: -13
+-
+Failed to verify required signature 'key-dev'
+Signature check Bad (error 1)
+
+This time we don't even get as far as checking the images, since the
+configuration signature doesn't match. We can't change any hashes without the
+signature check noticing. The configuration is essentially locked. U-Boot has
+a public key for which it requires a match, and will not permit the use of any
+configuration that does not match that public key. The only way the
+configuration will match is if it was signed by the matching private key.
+
+It would also be possible to add a new signature node that does match your new
+configuration. But that won't work since you are not allowed to change the
+configuration in any way. Try it with a fresh (valid) image if you like by
+running the mkimage link again. Then:
+
+   fdtput -p image.fit /configurations/conf@1/signature@2 value fred
+   $UOUT/tools/fit_check_sign -f image.fit -k am335x-boneblack-pubkey.dtb
+Verifying Hash Integrity ... -
+sha1,rsa2048:devrsa_verify_with_keynode: RSA failed to verify: -13
+rsa_verify_with_keynode: RSA failed to verify: -13
+-
+Failed to verify required signature 'key-dev'
+Signature check Bad (error 1)
+
+
+Of course it would be possible to add an entirely new configuration and boot
+with that, but it still needs to be signed, so it won't help.
+
+
+6. Put the public key into U-Boot's image
+-----------------------------------------
+
+Having confirmed that the signature is doing its job, let's try it out in
+U-Boot on the board. U-Boot needs access to the public key corresponding to
+the private key that you signed with so that it can verify any kernels that
+you sign.
+
+   cd $UBOOT
+   make O=b/am335x_boneblack_vboot EXT_DTB=${WORK}/am335x-boneblack-pubkey.dtb
+
+Here we are overrriding the normal device tree file with our one, which
+contains the public key.
+
+Now you have a special U-Boot image with the public key. It can verify can
+kernel that you sign with the private key as in step 5.
+
+If you like you can take a look at the public key information that mkimage
+added to U-Boot's device tree:
+
+   fdtget -p am335x-boneblack-pubkey.dtb /signature/key-dev
+required
+algo
+rsa,r-squared
+rsa,modulus
+rsa,n0-inverse
+rsa,num-bits
+key-name-hint
+
+This has information about the key and some pre-processed values which U-Boot
+can use to verify against it. These values are obtained from the public key
+certificate by mkimage, but require quite a bit of code to generate. To save
+code space in U-Boot, the information is extracted and written in raw form for
+U-Boot to easily use. The same mechanism is used in Google's Chrome OS.
+
+Notice the 'required' property. This marks the key as required - U-Boot will
+not boot any image that does not verify against this key.
+
+
+7. Put U-Boot and the kernel onto the board
+-------------------------------------------
+
+The method here varies depending on how you are booting. For this example we
+are booting from an micro-SD card with two partitions, one for U-Boot and one
+for Linux. Put it into your machine and write U-Boot and the kernel to it.
+Here the card is /dev/sde:
+
+   cd $WORK
+   export UDEV=/dev/sde1   # Change thes two lines to the correct device
+   export KDEV=/dev/sde2
+   sudo mount $UDEV /mnt/tmp && sudo cp $UOUT/u-boot-dtb.img /mnt/tmp/u-boot.img  && sleep 1 && sudo umount $UDEV
+   sudo mount $KDEV /mnt/tmp && sudo cp $WORK/image.fit /mnt/tmp/boot/image.fit && sleep 1 && sudo umount $KDEV
+
+
+8. Try it
+---------
+
+Boot the board using the commands below:
+
+   setenv bootargs console=ttyO0,115200n8 quiet root=/dev/mmcblk0p2 ro rootfstype=ext4 rootwait
+   ext2load mmc 0:2 82000000 /boot/image.fit
+   bootm 82000000
+
+You should then see something like this:
+
+U-Boot# setenv bootargs console=ttyO0,115200n8 quiet root=/dev/mmcblk0p2 ro rootfstype=ext4 rootwait
+U-Boot# ext2load mmc 0:2 82000000 /boot/image.fit
+7824930 bytes read in 589 ms (12.7 MiB/s)
+U-Boot# bootm 82000000
+## Loading kernel from FIT Image at 82000000 ...
+   Using 'conf@1' configuration
+   Verifying Hash Integrity ... sha1,rsa2048:dev+ OK
+   Trying 'kernel@1' kernel subimage
+     Description:  unavailable
+     Created:      2014-06-01  19:32:54 UTC
+     Type:         Kernel Image
+     Compression:  lzo compressed
+     Data Start:   0x820000a8
+     Data Size:    7790938 Bytes = 7.4 MiB
+     Architecture: ARM
+     OS:           Linux
+     Load Address: 0x80008000
+     Entry Point:  0x80008000
+     Hash algo:    sha1
+     Hash value:   c94364646427e10f423837e559898ef02c97b988
+   Verifying Hash Integrity ... sha1+ OK
+## Loading fdt from FIT Image at 82000000 ...
+   Using 'conf@1' configuration
+   Trying 'fdt@1' fdt subimage
+     Description:  beaglebone-black
+     Created:      2014-06-01  19:32:54 UTC
+     Type:         Flat Device Tree
+     Compression:  uncompressed
+     Data Start:   0x8276e2ec
+     Data Size:    31547 Bytes = 30.8 KiB
+     Architecture: ARM
+     Hash algo:    sha1
+     Hash value:   cb09202f889d824f23b8e4404b781be5ad38a68d
+   Verifying Hash Integrity ... sha1+ OK
+   Booting using the fdt blob at 0x8276e2ec
+   Uncompressing Kernel Image ... OK
+   Loading Device Tree to 8fff5000, end 8ffffb3a ... OK
+
+Starting kernel ...
+
+[    0.582377] omap_init_mbox: hwmod doesn't have valid attrs
+[    2.589651] musb-hdrc musb-hdrc.0.auto: Failed to request rx1.
+[    2.595830] musb-hdrc musb-hdrc.0.auto: musb_init_controller failed with status -517
+[    2.606470] musb-hdrc musb-hdrc.1.auto: Failed to request rx1.
+[    2.612723] musb-hdrc musb-hdrc.1.auto: musb_init_controller failed with status -517
+[    2.940808] drivers/rtc/hctosys.c: unable to open rtc device (rtc0)
+[    7.248889] libphy: PHY 4a101000.mdio:01 not found
+[    7.253995] net eth0: phy 4a101000.mdio:01 not found on slave 1
+systemd-fsck[83]: Angstrom: clean, 50607/218160 files, 306348/872448 blocks
+
+.---O---.
+|       |                  .-.           o o
+|   |   |-----.-----.-----.| |   .----..-----.-----.
+|       |     | __  |  ---'| '--.|  .-'|     |     |
+|   |   |  |  |     |---  ||  --'|  |  |  '  | | | |
+'---'---'--'--'--.  |-----''----''--'  '-----'-'-'-'
+                -'  |
+                '---'
+
+The Angstrom Distribution beaglebone ttyO0
+
+Angstrom v2012.12 - Kernel 3.14.1+
+
+beaglebone login:
+
+At this point your kernel has been verified and you can be sure that it is one
+that you signed. As an exercise, try changing image.fit as in step 5 and see
+what happens.
+
+
+Further Improvements
+--------------------
+
+Several of the steps here can be easily automated. In particular it would be
+capital if signing and packaging a kernel were easy, perhaps a simple make
+target in the kernel.
+
+Some mention of how to use multiple .dtb files in a FIT might be useful.
+
+U-Boot's verified boot mechanism has not had a robust and independent security
+review. Such a review should look at the implementation and its resistance to
+attacks.
+
+Perhaps the verified boot feature could could be integrated into the Amstrom
+distribution.
+
+
+Simon Glass
+sjg@chromium.org
+2-June-14
index 672dc3536f53af5bb3bcc9e4efd383c36b081c00..a6ab543de43c18e6c11c2f3b9a4c893014848636 100644 (file)
@@ -361,6 +361,7 @@ Test Verified Boot Run: unsigned config: OK
 Sign images
 Test Verified Boot Run: signed config: OK
 check signed config on the host
+Signature check OK
 OK
 Test Verified Boot Run: signed config: OK
 Test Verified Boot Run: signed config with bad hash: OK
@@ -374,12 +375,14 @@ Test Verified Boot Run: unsigned config: OK
 Sign images
 Test Verified Boot Run: signed config: OK
 check signed config on the host
+Signature check OK
 OK
 Test Verified Boot Run: signed config: OK
 Test Verified Boot Run: signed config with bad hash: OK
 
 Test passed
 
+
 Future Work
 -----------
 - Roll-back protection using a TPM is done using the tpm command. This can
index 205b140ef3d7c9d367df75f94ad62c1510454197..afb59d1d8dd277f62601c225679064f341dbdfa5 100644 (file)
@@ -14,6 +14,7 @@
 #include <dm/platdata.h>
 #include <dm/uclass.h>
 #include <dm/util.h>
+#include <fdtdec.h>
 #include <linux/compiler.h>
 
 struct driver *lists_driver_lookup_name(const char *name)
@@ -94,7 +95,7 @@ int lists_bind_drivers(struct udevice *parent)
  * tree error
  */
 static int driver_check_compatible(const void *blob, int offset,
-                                  const struct device_id *of_match)
+                                  const struct udevice_id *of_match)
 {
        int ret;
 
index 4977875c7f947f60178b60a824a2a109147acbc6..1cbb096494d2638a57c1a9d7998cda9685054896 100644 (file)
@@ -10,6 +10,7 @@
 #include <common.h>
 #include <errno.h>
 #include <malloc.h>
+#include <libfdt.h>
 #include <dm/device.h>
 #include <dm/device-internal.h>
 #include <dm/lists.h>
@@ -42,9 +43,9 @@ int dm_init(void)
                dm_warn("Virtual root driver already exists!\n");
                return -EINVAL;
        }
-       INIT_LIST_HEAD(&gd->uclass_root);
+       INIT_LIST_HEAD(&DM_UCLASS_ROOT_NON_CONST);
 
-       ret = device_bind_by_name(NULL, &root_info, &gd->dm_root);
+       ret = device_bind_by_name(NULL, &root_info, &DM_ROOT_NON_CONST);
        if (ret)
                return ret;
 
@@ -55,7 +56,7 @@ int dm_scan_platdata(void)
 {
        int ret;
 
-       ret = lists_bind_drivers(gd->dm_root);
+       ret = lists_bind_drivers(DM_ROOT_NON_CONST);
        if (ret == -ENOENT) {
                dm_warn("Some drivers were not found\n");
                ret = 0;
index f6867e4a23226cf5b7aa631f431da314f256dfc8..34723ec42a75fccca2df41a95c3b5a37ae0ec9d6 100644 (file)
@@ -75,7 +75,7 @@ static int uclass_add(enum uclass_id id, struct uclass **ucp)
        uc->uc_drv = uc_drv;
        INIT_LIST_HEAD(&uc->sibling_node);
        INIT_LIST_HEAD(&uc->dev_head);
-       list_add(&uc->sibling_node, &gd->uclass_root);
+       list_add(&uc->sibling_node, &DM_UCLASS_ROOT_NON_CONST);
 
        if (uc_drv->init) {
                ret = uc_drv->init(uc);
index ed4f5418238c710d34da4751ffdb769df6d195d9..efef4911233adafe60df7065b719b2adbdd23d93 100644 (file)
@@ -8,8 +8,8 @@
 #include "ace_sha.h"
 
 #ifdef CONFIG_SHA_HW_ACCEL
-#include <sha256.h>
-#include <sha1.h>
+#include <u-boot/sha256.h>
+#include <u-boot/sha1.h>
 #include <asm/errno.h>
 
 /* SHA1 value for the message of zero length */
index a68cc1092cf4720e7c6dce8b3ee7775b96b511c1..3fa9c5994703d473494a4d2199ecae3e34a0c9c0 100644 (file)
@@ -111,7 +111,7 @@ static int shape_ofdata_to_platdata(struct udevice *dev)
        return 0;
 }
 
-static const struct device_id demo_shape_id[] = {
+static const struct udevice_id demo_shape_id[] = {
        { "demo-shape", 0 },
        { },
 };
index 11def86032c6b0a319dae3d4add27d061a546bce..2bcb7dfb479c4c123b3e2b875e4df4c680906290 100644 (file)
@@ -32,7 +32,7 @@ static int demo_shape_ofdata_to_platdata(struct udevice *dev)
        return demo_parse_dt(dev);
 }
 
-static const struct device_id demo_shape_id[] = {
+static const struct udevice_id demo_shape_id[] = {
        { "demo-simple", 0 },
        { },
 };
index fa2c2fb7c47c391ca5c505dafd98946f5098171e..f1bbc587961709dec3922c52c76585227acecd9b 100644 (file)
@@ -58,7 +58,7 @@ int gpio_lookup_name(const char *name, struct udevice **devp,
                uc_priv = dev->uclass_priv;
                len = uc_priv->bank_name ? strlen(uc_priv->bank_name) : 0;
 
-               if (!strncmp(name, uc_priv->bank_name, len)) {
+               if (!strncasecmp(name, uc_priv->bank_name, len)) {
                        if (strict_strtoul(name + len, 10, &offset))
                                continue;
                        if (devp)
index 09cebe2286f434317f8072092a0274ac410aefbf..75ada5d3871a844935c22b1bb9557f2e3229c84f 100644 (file)
@@ -239,7 +239,7 @@ static int gpio_sandbox_probe(struct udevice *dev)
        return 0;
 }
 
-static const struct device_id sandbox_gpio_ids[] = {
+static const struct udevice_id sandbox_gpio_ids[] = {
        { .compatible = "sandbox,gpio" },
        { }
 };
index 4bb1d60e5a9964c6d8415d015deb03a605565f26..8a04af557d035e6211865e4f2e1662d105d4447d 100644 (file)
@@ -13,7 +13,7 @@
 #include <hash.h>
 #include <malloc.h>
 #include <os.h>
-#include <sha256.h>
+#include <u-boot/sha256.h>
 #include <spi.h>
 #include <asm/state.h>
 #include <asm/sdl.h>
index 05936f5d1f344e7928c19ba116581cdae172b7aa..9d0b8bc0c8f9b41fd91185729e87c3777e8c7a23 100644 (file)
@@ -11,7 +11,7 @@
 #include <config.h>
 #include <common.h>
 #include <mmc.h>
-#include <sha256.h>
+#include <u-boot/sha256.h>
 #include "mmc_private.h"
 
 /* Request codes */
index 781a272cff2edec4650025c5c3b94515186e0f41..01a94a4c4d117795fc6b2f42b8da701974b7e184 100644 (file)
 
 #include "macb.h"
 
-#define CONFIG_SYS_MACB_RX_BUFFER_SIZE         4096
-#define CONFIG_SYS_MACB_RX_RING_SIZE           (CONFIG_SYS_MACB_RX_BUFFER_SIZE / 128)
-#define CONFIG_SYS_MACB_TX_RING_SIZE           16
-#define CONFIG_SYS_MACB_TX_TIMEOUT             1000
-#define CONFIG_SYS_MACB_AUTONEG_TIMEOUT        5000000
+#define MACB_RX_BUFFER_SIZE            4096
+#define MACB_RX_RING_SIZE              (MACB_RX_BUFFER_SIZE / 128)
+#define MACB_TX_RING_SIZE              16
+#define MACB_TX_TIMEOUT                1000
+#define MACB_AUTONEG_TIMEOUT   5000000
 
 struct macb_dma_desc {
        u32     addr;
        u32     ctrl;
 };
 
+#define DMA_DESC_BYTES(n)      (n * sizeof(struct macb_dma_desc))
+#define MACB_TX_DMA_DESC_SIZE  (DMA_DESC_BYTES(MACB_TX_RING_SIZE))
+#define MACB_RX_DMA_DESC_SIZE  (DMA_DESC_BYTES(MACB_RX_RING_SIZE))
+
 #define RXADDR_USED            0x00000001
 #define RXADDR_WRAP            0x00000002
 
@@ -170,7 +174,7 @@ int macb_miiphy_read(const char *devname, u8 phy_adr, u8 reg, u16 *value)
        struct eth_device *dev = eth_get_dev_by_name(devname);
        struct macb_device *macb = to_macb(dev);
 
-       if ( macb->phy_addr != phy_adr )
+       if (macb->phy_addr != phy_adr)
                return -1;
 
        arch_get_mdio_control(devname);
@@ -184,7 +188,7 @@ int macb_miiphy_write(const char *devname, u8 phy_adr, u8 reg, u16 value)
        struct eth_device *dev = eth_get_dev_by_name(devname);
        struct macb_device *macb = to_macb(dev);
 
-       if ( macb->phy_addr != phy_adr )
+       if (macb->phy_addr != phy_adr)
                return -1;
 
        arch_get_mdio_control(devname);
@@ -194,6 +198,39 @@ int macb_miiphy_write(const char *devname, u8 phy_adr, u8 reg, u16 value)
 }
 #endif
 
+#define RX     1
+#define TX     0
+static inline void macb_invalidate_ring_desc(struct macb_device *macb, bool rx)
+{
+       if (rx)
+               invalidate_dcache_range(macb->rx_ring_dma, macb->rx_ring_dma +
+                       MACB_RX_DMA_DESC_SIZE);
+       else
+               invalidate_dcache_range(macb->tx_ring_dma, macb->tx_ring_dma +
+                       MACB_TX_DMA_DESC_SIZE);
+}
+
+static inline void macb_flush_ring_desc(struct macb_device *macb, bool rx)
+{
+       if (rx)
+               flush_dcache_range(macb->rx_ring_dma, macb->rx_ring_dma +
+                       MACB_RX_DMA_DESC_SIZE);
+       else
+               flush_dcache_range(macb->tx_ring_dma, macb->tx_ring_dma +
+                       MACB_TX_DMA_DESC_SIZE);
+}
+
+static inline void macb_flush_rx_buffer(struct macb_device *macb)
+{
+       flush_dcache_range(macb->rx_buffer_dma, macb->rx_buffer_dma +
+                               MACB_RX_BUFFER_SIZE);
+}
+
+static inline void macb_invalidate_rx_buffer(struct macb_device *macb)
+{
+       invalidate_dcache_range(macb->rx_buffer_dma, macb->rx_buffer_dma +
+                               MACB_RX_BUFFER_SIZE);
+}
 
 #if defined(CONFIG_CMD_NET)
 
@@ -208,23 +245,28 @@ static int macb_send(struct eth_device *netdev, void *packet, int length)
 
        ctrl = length & TXBUF_FRMLEN_MASK;
        ctrl |= TXBUF_FRAME_END;
-       if (tx_head == (CONFIG_SYS_MACB_TX_RING_SIZE - 1)) {
+       if (tx_head == (MACB_TX_RING_SIZE - 1)) {
                ctrl |= TXBUF_WRAP;
                macb->tx_head = 0;
-       } else
+       } else {
                macb->tx_head++;
+       }
 
        macb->tx_ring[tx_head].ctrl = ctrl;
        macb->tx_ring[tx_head].addr = paddr;
        barrier();
+       macb_flush_ring_desc(macb, TX);
+       /* Do we need check paddr and length is dcache line aligned? */
+       flush_dcache_range(paddr, paddr + length);
        macb_writel(macb, NCR, MACB_BIT(TE) | MACB_BIT(RE) | MACB_BIT(TSTART));
 
        /*
         * I guess this is necessary because the networking core may
         * re-use the transmit buffer as soon as we return...
         */
-       for (i = 0; i <= CONFIG_SYS_MACB_TX_TIMEOUT; i++) {
+       for (i = 0; i <= MACB_TX_TIMEOUT; i++) {
                barrier();
+               macb_invalidate_ring_desc(macb, TX);
                ctrl = macb->tx_ring[tx_head].ctrl;
                if (ctrl & TXBUF_USED)
                        break;
@@ -233,7 +275,7 @@ static int macb_send(struct eth_device *netdev, void *packet, int length)
 
        dma_unmap_single(packet, length, paddr);
 
-       if (i <= CONFIG_SYS_MACB_TX_TIMEOUT) {
+       if (i <= MACB_TX_TIMEOUT) {
                if (ctrl & TXBUF_UNDERRUN)
                        printf("%s: TX underrun\n", netdev->name);
                if (ctrl & TXBUF_EXHAUSTED)
@@ -253,10 +295,12 @@ static void reclaim_rx_buffers(struct macb_device *macb,
        unsigned int i;
 
        i = macb->rx_tail;
+
+       macb_invalidate_ring_desc(macb, RX);
        while (i > new_tail) {
                macb->rx_ring[i].addr &= ~RXADDR_USED;
                i++;
-               if (i > CONFIG_SYS_MACB_RX_RING_SIZE)
+               if (i > MACB_RX_RING_SIZE)
                        i = 0;
        }
 
@@ -266,6 +310,7 @@ static void reclaim_rx_buffers(struct macb_device *macb,
        }
 
        barrier();
+       macb_flush_ring_desc(macb, RX);
        macb->rx_tail = new_tail;
 }
 
@@ -279,6 +324,8 @@ static int macb_recv(struct eth_device *netdev)
        u32 status;
 
        for (;;) {
+               macb_invalidate_ring_desc(macb, RX);
+
                if (!(macb->rx_ring[rx_tail].addr & RXADDR_USED))
                        return -1;
 
@@ -292,10 +339,12 @@ static int macb_recv(struct eth_device *netdev)
                if (status & RXBUF_FRAME_END) {
                        buffer = macb->rx_buffer + 128 * macb->rx_tail;
                        length = status & RXBUF_FRMLEN_MASK;
+
+                       macb_invalidate_rx_buffer(macb);
                        if (wrapped) {
                                unsigned int headlen, taillen;
 
-                               headlen = 128 * (CONFIG_SYS_MACB_RX_RING_SIZE
+                               headlen = 128 * (MACB_RX_RING_SIZE
                                                 - macb->rx_tail);
                                taillen = length - headlen;
                                memcpy((void *)NetRxPackets[0],
@@ -306,11 +355,11 @@ static int macb_recv(struct eth_device *netdev)
                        }
 
                        NetReceive(buffer, length);
-                       if (++rx_tail >= CONFIG_SYS_MACB_RX_RING_SIZE)
+                       if (++rx_tail >= MACB_RX_RING_SIZE)
                                rx_tail = 0;
                        reclaim_rx_buffers(macb, rx_tail);
                } else {
-                       if (++rx_tail >= CONFIG_SYS_MACB_RX_RING_SIZE) {
+                       if (++rx_tail >= MACB_RX_RING_SIZE) {
                                wrapped = 1;
                                rx_tail = 0;
                        }
@@ -333,7 +382,7 @@ static void macb_phy_reset(struct macb_device *macb)
        macb_mdio_write(macb, MII_BMCR, (BMCR_ANENABLE
                                         | BMCR_ANRESTART));
 
-       for (i = 0; i < CONFIG_SYS_MACB_AUTONEG_TIMEOUT / 100; i++) {
+       for (i = 0; i < MACB_AUTONEG_TIMEOUT / 100; i++) {
                status = macb_mdio_read(macb, MII_BMSR);
                if (status & BMSR_ANEGCOMPLETE)
                        break;
@@ -385,9 +434,8 @@ static int macb_phy_init(struct macb_device *macb)
        arch_get_mdio_control(netdev->name);
 #ifdef CONFIG_MACB_SEARCH_PHY
        /* Auto-detect phy_addr */
-       if (!macb_phy_find(macb)) {
+       if (!macb_phy_find(macb))
                return 0;
-       }
 #endif /* CONFIG_MACB_SEARCH_PHY */
 
        /* Check if the PHY is up to snuff... */
@@ -414,7 +462,7 @@ static int macb_phy_init(struct macb_device *macb)
                /* Try to re-negotiate if we don't have link already. */
                macb_phy_reset(macb);
 
-               for (i = 0; i < CONFIG_SYS_MACB_AUTONEG_TIMEOUT / 100; i++) {
+               for (i = 0; i < MACB_AUTONEG_TIMEOUT / 100; i++) {
                        status = macb_mdio_read(macb, MII_BMSR);
                        if (status & BMSR_LSTATUS)
                                break;
@@ -499,21 +547,28 @@ static int macb_init(struct eth_device *netdev, bd_t *bd)
 
        /* initialize DMA descriptors */
        paddr = macb->rx_buffer_dma;
-       for (i = 0; i < CONFIG_SYS_MACB_RX_RING_SIZE; i++) {
-               if (i == (CONFIG_SYS_MACB_RX_RING_SIZE - 1))
+       for (i = 0; i < MACB_RX_RING_SIZE; i++) {
+               if (i == (MACB_RX_RING_SIZE - 1))
                        paddr |= RXADDR_WRAP;
                macb->rx_ring[i].addr = paddr;
                macb->rx_ring[i].ctrl = 0;
                paddr += 128;
        }
-       for (i = 0; i < CONFIG_SYS_MACB_TX_RING_SIZE; i++) {
+       macb_flush_ring_desc(macb, RX);
+       macb_flush_rx_buffer(macb);
+
+       for (i = 0; i < MACB_TX_RING_SIZE; i++) {
                macb->tx_ring[i].addr = 0;
-               if (i == (CONFIG_SYS_MACB_TX_RING_SIZE - 1))
+               if (i == (MACB_TX_RING_SIZE - 1))
                        macb->tx_ring[i].ctrl = TXBUF_USED | TXBUF_WRAP;
                else
                        macb->tx_ring[i].ctrl = TXBUF_USED;
        }
-       macb->rx_tail = macb->tx_head = macb->tx_tail = 0;
+       macb_flush_ring_desc(macb, TX);
+
+       macb->rx_tail = 0;
+       macb->tx_head = 0;
+       macb->tx_tail = 0;
 
        macb_writel(macb, RBQP, macb->rx_ring_dma);
        macb_writel(macb, TBQP, macb->tx_ring_dma);
@@ -654,15 +709,15 @@ int macb_eth_initialize(int id, void *regs, unsigned int phy_addr)
 
        netdev = &macb->netdev;
 
-       macb->rx_buffer = dma_alloc_coherent(CONFIG_SYS_MACB_RX_BUFFER_SIZE,
+       macb->rx_buffer = dma_alloc_coherent(MACB_RX_BUFFER_SIZE,
                                             &macb->rx_buffer_dma);
-       macb->rx_ring = dma_alloc_coherent(CONFIG_SYS_MACB_RX_RING_SIZE
-                                          * sizeof(struct macb_dma_desc),
+       macb->rx_ring = dma_alloc_coherent(MACB_RX_DMA_DESC_SIZE,
                                           &macb->rx_ring_dma);
-       macb->tx_ring = dma_alloc_coherent(CONFIG_SYS_MACB_TX_RING_SIZE
-                                          * sizeof(struct macb_dma_desc),
+       macb->tx_ring = dma_alloc_coherent(MACB_TX_DMA_DESC_SIZE,
                                           &macb->tx_ring_dma);
 
+       /* TODO: we need check the rx/tx_ring_dma is dcache line aligned */
+
        macb->regs = regs;
        macb->phy_addr = phy_addr;
 
index c5b396610ac3ecec91c22ffeaf600c723299fb9b..337903acec8a56c493c32543cafbe978fd8f3b2e 100644 (file)
@@ -285,7 +285,7 @@ int tps65090_init(void)
        }
 
        bus = i2c_get_bus_num_fdt(parent);
-       if (p->bus < 0) {
+       if (bus < 0) {
                debug("%s: Cannot find I2C bus\n", __func__);
                return -ENOENT;
        }
index 81b6af66949bd3aaec4eb8aefdad4c8a78e5885d..b587308c849d95051aad1eb0fb07fdb2be18adfe 100644 (file)
@@ -40,3 +40,4 @@ obj-$(CONFIG_TEGRA114_SPI) += tegra114_spi.o
 obj-$(CONFIG_TI_QSPI) += ti_qspi.o
 obj-$(CONFIG_XILINX_SPI) += xilinx_spi.o
 obj-$(CONFIG_ZYNQ_SPI) += zynq_spi.o
+obj-$(CONFIG_FSL_QSPI) += fsl_qspi.o
diff --git a/drivers/spi/fsl_qspi.c b/drivers/spi/fsl_qspi.c
new file mode 100644 (file)
index 0000000..ba20bef
--- /dev/null
@@ -0,0 +1,482 @@
+/*
+ * Copyright 2013-2014 Freescale Semiconductor, Inc.
+ *
+ * Freescale Quad Serial Peripheral Interface (QSPI) driver
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#include <common.h>
+#include <malloc.h>
+#include <spi.h>
+#include <asm/io.h>
+#include <linux/sizes.h>
+#include "fsl_qspi.h"
+
+#define RX_BUFFER_SIZE         0x80
+#define TX_BUFFER_SIZE         0x40
+
+#define OFFSET_BITS_MASK       0x00ffffff
+
+#define FLASH_STATUS_WEL       0x02
+
+/* SEQID */
+#define SEQID_WREN             1
+#define SEQID_FAST_READ                2
+#define SEQID_RDSR             3
+#define SEQID_SE               4
+#define SEQID_CHIP_ERASE       5
+#define SEQID_PP               6
+#define SEQID_RDID             7
+
+/* Flash opcodes */
+#define OPCODE_PP              0x02    /* Page program (up to 256 bytes) */
+#define OPCODE_RDSR            0x05    /* Read status register */
+#define OPCODE_WREN            0x06    /* Write enable */
+#define OPCODE_FAST_READ       0x0b    /* Read data bytes (high frequency) */
+#define OPCODE_CHIP_ERASE      0xc7    /* Erase whole flash chip */
+#define OPCODE_SE              0xd8    /* Sector erase (usually 64KiB) */
+#define OPCODE_RDID            0x9f    /* Read JEDEC ID */
+
+/* 4-byte address opcodes - used on Spansion and some Macronix flashes */
+#define OPCODE_FAST_READ_4B    0x0c    /* Read data bytes (high frequency) */
+#define OPCODE_PP_4B           0x12    /* Page program (up to 256 bytes) */
+#define OPCODE_SE_4B           0xdc    /* Sector erase (usually 64KiB) */
+
+#ifdef CONFIG_SYS_FSL_QSPI_LE
+#define qspi_read32            in_le32
+#define qspi_write32           out_le32
+#elif defined(CONFIG_SYS_FSL_QSPI_BE)
+#define qspi_read32            in_be32
+#define qspi_write32           out_be32
+#endif
+
+static unsigned long spi_bases[] = {
+       QSPI0_BASE_ADDR,
+};
+
+static unsigned long amba_bases[] = {
+       QSPI0_AMBA_BASE,
+};
+
+struct fsl_qspi {
+       struct spi_slave slave;
+       unsigned long reg_base;
+       unsigned long amba_base;
+       u32 sf_addr;
+       u8 cur_seqid;
+};
+
+/* QSPI support swapping the flash read/write data
+ * in hardware for LS102xA, but not for VF610 */
+static inline u32 qspi_endian_xchg(u32 data)
+{
+#ifdef CONFIG_VF610
+       return swab32(data);
+#else
+       return data;
+#endif
+}
+
+static inline struct fsl_qspi *to_qspi_spi(struct spi_slave *slave)
+{
+       return container_of(slave, struct fsl_qspi, slave);
+}
+
+static void qspi_set_lut(struct fsl_qspi *qspi)
+{
+       struct fsl_qspi_regs *regs = (struct fsl_qspi_regs *)qspi->reg_base;
+       u32 lut_base;
+
+       /* Unlock the LUT */
+       qspi_write32(&regs->lutkey, LUT_KEY_VALUE);
+       qspi_write32(&regs->lckcr, QSPI_LCKCR_UNLOCK);
+
+       /* Write Enable */
+       lut_base = SEQID_WREN * 4;
+       qspi_write32(&regs->lut[lut_base], OPRND0(OPCODE_WREN) |
+               PAD0(LUT_PAD1) | INSTR0(LUT_CMD));
+       qspi_write32(&regs->lut[lut_base + 1], 0);
+       qspi_write32(&regs->lut[lut_base + 2], 0);
+       qspi_write32(&regs->lut[lut_base + 3], 0);
+
+       /* Fast Read */
+       lut_base = SEQID_FAST_READ * 4;
+       if (FSL_QSPI_FLASH_SIZE  <= SZ_16M)
+               qspi_write32(&regs->lut[lut_base], OPRND0(OPCODE_FAST_READ) |
+                       PAD0(LUT_PAD1) | INSTR0(LUT_CMD) | OPRND1(ADDR24BIT) |
+                       PAD1(LUT_PAD1) | INSTR1(LUT_ADDR));
+       else
+               qspi_write32(&regs->lut[lut_base], OPRND0(OPCODE_FAST_READ_4B) |
+                       PAD0(LUT_PAD1) | INSTR0(LUT_CMD) | OPRND1(ADDR32BIT) |
+                       PAD1(LUT_PAD1) | INSTR1(LUT_ADDR));
+       qspi_write32(&regs->lut[lut_base + 1], OPRND0(8) | PAD0(LUT_PAD1) |
+               INSTR0(LUT_DUMMY) | OPRND1(RX_BUFFER_SIZE) | PAD1(LUT_PAD1) |
+               INSTR1(LUT_READ));
+       qspi_write32(&regs->lut[lut_base + 2], 0);
+       qspi_write32(&regs->lut[lut_base + 3], 0);
+
+       /* Read Status */
+       lut_base = SEQID_RDSR * 4;
+       qspi_write32(&regs->lut[lut_base], OPRND0(OPCODE_RDSR) |
+               PAD0(LUT_PAD1) | INSTR0(LUT_CMD) | OPRND1(1) |
+               PAD1(LUT_PAD1) | INSTR1(LUT_READ));
+       qspi_write32(&regs->lut[lut_base + 1], 0);
+       qspi_write32(&regs->lut[lut_base + 2], 0);
+       qspi_write32(&regs->lut[lut_base + 3], 0);
+
+       /* Erase a sector */
+       lut_base = SEQID_SE * 4;
+       if (FSL_QSPI_FLASH_SIZE  <= SZ_16M)
+               qspi_write32(&regs->lut[lut_base], OPRND0(OPCODE_SE) |
+                       PAD0(LUT_PAD1) | INSTR0(LUT_CMD) | OPRND1(ADDR24BIT) |
+                       PAD1(LUT_PAD1) | INSTR1(LUT_ADDR));
+       else
+               qspi_write32(&regs->lut[lut_base], OPRND0(OPCODE_SE_4B) |
+                       PAD0(LUT_PAD1) | INSTR0(LUT_CMD) | OPRND1(ADDR32BIT) |
+                       PAD1(LUT_PAD1) | INSTR1(LUT_ADDR));
+       qspi_write32(&regs->lut[lut_base + 1], 0);
+       qspi_write32(&regs->lut[lut_base + 2], 0);
+       qspi_write32(&regs->lut[lut_base + 3], 0);
+
+       /* Erase the whole chip */
+       lut_base = SEQID_CHIP_ERASE * 4;
+       qspi_write32(&regs->lut[lut_base], OPRND0(OPCODE_CHIP_ERASE) |
+               PAD0(LUT_PAD1) | INSTR0(LUT_CMD));
+       qspi_write32(&regs->lut[lut_base + 1], 0);
+       qspi_write32(&regs->lut[lut_base + 2], 0);
+       qspi_write32(&regs->lut[lut_base + 3], 0);
+
+       /* Page Program */
+       lut_base = SEQID_PP * 4;
+       if (FSL_QSPI_FLASH_SIZE  <= SZ_16M)
+               qspi_write32(&regs->lut[lut_base], OPRND0(OPCODE_PP) |
+                       PAD0(LUT_PAD1) | INSTR0(LUT_CMD) | OPRND1(ADDR24BIT) |
+                       PAD1(LUT_PAD1) | INSTR1(LUT_ADDR));
+       else
+               qspi_write32(&regs->lut[lut_base], OPRND0(OPCODE_PP_4B) |
+                       PAD0(LUT_PAD1) | INSTR0(LUT_CMD) | OPRND1(ADDR32BIT) |
+                       PAD1(LUT_PAD1) | INSTR1(LUT_ADDR));
+       qspi_write32(&regs->lut[lut_base + 1], OPRND0(TX_BUFFER_SIZE) |
+               PAD0(LUT_PAD1) | INSTR0(LUT_WRITE));
+       qspi_write32(&regs->lut[lut_base + 2], 0);
+       qspi_write32(&regs->lut[lut_base + 3], 0);
+
+       /* READ ID */
+       lut_base = SEQID_RDID * 4;
+       qspi_write32(&regs->lut[lut_base], OPRND0(OPCODE_RDID) |
+               PAD0(LUT_PAD1) | INSTR0(LUT_CMD) | OPRND1(8) |
+               PAD1(LUT_PAD1) | INSTR1(LUT_READ));
+       qspi_write32(&regs->lut[lut_base + 1], 0);
+       qspi_write32(&regs->lut[lut_base + 2], 0);
+       qspi_write32(&regs->lut[lut_base + 3], 0);
+
+       /* Lock the LUT */
+       qspi_write32(&regs->lutkey, LUT_KEY_VALUE);
+       qspi_write32(&regs->lckcr, QSPI_LCKCR_LOCK);
+}
+
+void spi_init()
+{
+       /* do nothing */
+}
+
+struct spi_slave *spi_setup_slave(unsigned int bus, unsigned int cs,
+               unsigned int max_hz, unsigned int mode)
+{
+       struct fsl_qspi *qspi;
+       struct fsl_qspi_regs *regs;
+       u32 reg_val, smpr_val;
+       u32 total_size, seq_id;
+
+       if (bus >= ARRAY_SIZE(spi_bases))
+               return NULL;
+
+       qspi = spi_alloc_slave(struct fsl_qspi, bus, cs);
+       if (!qspi)
+               return NULL;
+
+       qspi->reg_base = spi_bases[bus];
+       qspi->amba_base = amba_bases[bus];
+
+       qspi->slave.max_write_size = TX_BUFFER_SIZE;
+
+       regs = (struct fsl_qspi_regs *)qspi->reg_base;
+       qspi_write32(&regs->mcr, QSPI_MCR_RESERVED_MASK | QSPI_MCR_MDIS_MASK);
+
+       smpr_val = qspi_read32(&regs->smpr);
+       qspi_write32(&regs->smpr, smpr_val & ~(QSPI_SMPR_FSDLY_MASK |
+               QSPI_SMPR_FSPHS_MASK | QSPI_SMPR_HSENA_MASK));
+       qspi_write32(&regs->mcr, QSPI_MCR_RESERVED_MASK);
+
+       total_size = FSL_QSPI_FLASH_SIZE * FSL_QSPI_FLASH_NUM;
+       qspi_write32(&regs->sfa1ad, FSL_QSPI_FLASH_SIZE | qspi->amba_base);
+       qspi_write32(&regs->sfa2ad, FSL_QSPI_FLASH_SIZE | qspi->amba_base);
+       qspi_write32(&regs->sfb1ad, total_size | qspi->amba_base);
+       qspi_write32(&regs->sfb2ad, total_size | qspi->amba_base);
+
+       qspi_set_lut(qspi);
+
+       smpr_val = qspi_read32(&regs->smpr);
+       smpr_val &= ~QSPI_SMPR_DDRSMP_MASK;
+       qspi_write32(&regs->smpr, smpr_val);
+       qspi_write32(&regs->mcr, QSPI_MCR_RESERVED_MASK);
+
+       seq_id = 0;
+       reg_val = qspi_read32(&regs->bfgencr);
+       reg_val &= ~QSPI_BFGENCR_SEQID_MASK;
+       reg_val |= (seq_id << QSPI_BFGENCR_SEQID_SHIFT);
+       reg_val &= ~QSPI_BFGENCR_PAR_EN_MASK;
+       qspi_write32(&regs->bfgencr, reg_val);
+
+       return &qspi->slave;
+}
+
+void spi_free_slave(struct spi_slave *slave)
+{
+       struct fsl_qspi *qspi = to_qspi_spi(slave);
+
+       free(qspi);
+}
+
+int spi_claim_bus(struct spi_slave *slave)
+{
+       return 0;
+}
+
+static void qspi_op_rdid(struct fsl_qspi *qspi, u32 *rxbuf, u32 len)
+{
+       struct fsl_qspi_regs *regs = (struct fsl_qspi_regs *)qspi->reg_base;
+       u32 mcr_reg, rbsr_reg, data;
+       int i, size;
+
+       mcr_reg = qspi_read32(&regs->mcr);
+       qspi_write32(&regs->mcr, QSPI_MCR_CLR_RXF_MASK | QSPI_MCR_CLR_TXF_MASK |
+               QSPI_MCR_RESERVED_MASK | QSPI_MCR_END_CFD_LE);
+       qspi_write32(&regs->rbct, QSPI_RBCT_RXBRD_USEIPS);
+
+       qspi_write32(&regs->sfar, qspi->amba_base);
+
+       qspi_write32(&regs->ipcr, (SEQID_RDID << QSPI_IPCR_SEQID_SHIFT) | 0);
+       while (qspi_read32(&regs->sr) & QSPI_SR_BUSY_MASK)
+               ;
+
+       i = 0;
+       size = len;
+       while ((RX_BUFFER_SIZE >= size) && (size > 0)) {
+               rbsr_reg = qspi_read32(&regs->rbsr);
+               if (rbsr_reg & QSPI_RBSR_RDBFL_MASK) {
+                       data = qspi_read32(&regs->rbdr[i]);
+                       data = qspi_endian_xchg(data);
+                       memcpy(rxbuf, &data, 4);
+                       rxbuf++;
+                       size -= 4;
+                       i++;
+               }
+       }
+
+       qspi_write32(&regs->mcr, mcr_reg);
+}
+
+static void qspi_op_read(struct fsl_qspi *qspi, u32 *rxbuf, u32 len)
+{
+       struct fsl_qspi_regs *regs = (struct fsl_qspi_regs *)qspi->reg_base;
+       u32 mcr_reg, data;
+       int i, size;
+       u32 to_or_from;
+
+       mcr_reg = qspi_read32(&regs->mcr);
+       qspi_write32(&regs->mcr, QSPI_MCR_CLR_RXF_MASK | QSPI_MCR_CLR_TXF_MASK |
+               QSPI_MCR_RESERVED_MASK | QSPI_MCR_END_CFD_LE);
+       qspi_write32(&regs->rbct, QSPI_RBCT_RXBRD_USEIPS);
+
+       to_or_from = qspi->sf_addr + qspi->amba_base;
+
+       while (len > 0) {
+               qspi_write32(&regs->sfar, to_or_from);
+
+               size = (len > RX_BUFFER_SIZE) ?
+                       RX_BUFFER_SIZE : len;
+
+               qspi_write32(&regs->ipcr,
+                       (SEQID_FAST_READ << QSPI_IPCR_SEQID_SHIFT) | size);
+               while (qspi_read32(&regs->sr) & QSPI_SR_BUSY_MASK)
+                       ;
+
+               to_or_from += size;
+               len -= size;
+
+               i = 0;
+               while ((RX_BUFFER_SIZE >= size) && (size > 0)) {
+                       data = qspi_read32(&regs->rbdr[i]);
+                       data = qspi_endian_xchg(data);
+                       memcpy(rxbuf, &data, 4);
+                       rxbuf++;
+                       size -= 4;
+                       i++;
+               }
+               qspi_write32(&regs->mcr, qspi_read32(&regs->mcr) |
+                       QSPI_MCR_CLR_RXF_MASK);
+       }
+
+       qspi_write32(&regs->mcr, mcr_reg);
+}
+
+static void qspi_op_pp(struct fsl_qspi *qspi, u32 *txbuf, u32 len)
+{
+       struct fsl_qspi_regs *regs = (struct fsl_qspi_regs *)qspi->reg_base;
+       u32 mcr_reg, data, reg, status_reg;
+       int i, size, tx_size;
+       u32 to_or_from = 0;
+
+       mcr_reg = qspi_read32(&regs->mcr);
+       qspi_write32(&regs->mcr, QSPI_MCR_CLR_RXF_MASK | QSPI_MCR_CLR_TXF_MASK |
+               QSPI_MCR_RESERVED_MASK | QSPI_MCR_END_CFD_LE);
+       qspi_write32(&regs->rbct, QSPI_RBCT_RXBRD_USEIPS);
+
+       status_reg = 0;
+       while ((status_reg & FLASH_STATUS_WEL) != FLASH_STATUS_WEL) {
+               qspi_write32(&regs->ipcr,
+                       (SEQID_WREN << QSPI_IPCR_SEQID_SHIFT) | 0);
+               while (qspi_read32(&regs->sr) & QSPI_SR_BUSY_MASK)
+                       ;
+
+               qspi_write32(&regs->ipcr,
+                       (SEQID_RDSR << QSPI_IPCR_SEQID_SHIFT) | 1);
+               while (qspi_read32(&regs->sr) & QSPI_SR_BUSY_MASK)
+                       ;
+
+               reg = qspi_read32(&regs->rbsr);
+               if (reg & QSPI_RBSR_RDBFL_MASK) {
+                       status_reg = qspi_read32(&regs->rbdr[0]);
+                       status_reg = qspi_endian_xchg(status_reg);
+               }
+               qspi_write32(&regs->mcr,
+                       qspi_read32(&regs->mcr) | QSPI_MCR_CLR_RXF_MASK);
+       }
+
+       to_or_from = qspi->sf_addr + qspi->amba_base;
+       qspi_write32(&regs->sfar, to_or_from);
+
+       tx_size = (len > TX_BUFFER_SIZE) ?
+               TX_BUFFER_SIZE : len;
+
+       size = (tx_size + 3) / 4;
+
+       for (i = 0; i < size; i++) {
+               data = qspi_endian_xchg(*txbuf);
+               qspi_write32(&regs->tbdr, data);
+               txbuf++;
+       }
+
+       qspi_write32(&regs->ipcr,
+               (SEQID_PP << QSPI_IPCR_SEQID_SHIFT) | tx_size);
+       while (qspi_read32(&regs->sr) & QSPI_SR_BUSY_MASK)
+               ;
+
+       qspi_write32(&regs->mcr, mcr_reg);
+}
+
+static void qspi_op_rdsr(struct fsl_qspi *qspi, u32 *rxbuf)
+{
+       struct fsl_qspi_regs *regs = (struct fsl_qspi_regs *)qspi->reg_base;
+       u32 mcr_reg, reg, data;
+
+       mcr_reg = qspi_read32(&regs->mcr);
+       qspi_write32(&regs->mcr, QSPI_MCR_CLR_RXF_MASK | QSPI_MCR_CLR_TXF_MASK |
+               QSPI_MCR_RESERVED_MASK | QSPI_MCR_END_CFD_LE);
+       qspi_write32(&regs->rbct, QSPI_RBCT_RXBRD_USEIPS);
+
+       qspi_write32(&regs->sfar, qspi->amba_base);
+
+       qspi_write32(&regs->ipcr,
+               (SEQID_RDSR << QSPI_IPCR_SEQID_SHIFT) | 0);
+       while (qspi_read32(&regs->sr) & QSPI_SR_BUSY_MASK)
+               ;
+
+       while (1) {
+               reg = qspi_read32(&regs->rbsr);
+               if (reg & QSPI_RBSR_RDBFL_MASK) {
+                       data = qspi_read32(&regs->rbdr[0]);
+                       data = qspi_endian_xchg(data);
+                       memcpy(rxbuf, &data, 4);
+                       qspi_write32(&regs->mcr, qspi_read32(&regs->mcr) |
+                               QSPI_MCR_CLR_RXF_MASK);
+                       break;
+               }
+       }
+
+       qspi_write32(&regs->mcr, mcr_reg);
+}
+
+static void qspi_op_se(struct fsl_qspi *qspi)
+{
+       struct fsl_qspi_regs *regs = (struct fsl_qspi_regs *)qspi->reg_base;
+       u32 mcr_reg;
+       u32 to_or_from = 0;
+
+       mcr_reg = qspi_read32(&regs->mcr);
+       qspi_write32(&regs->mcr, QSPI_MCR_CLR_RXF_MASK | QSPI_MCR_CLR_TXF_MASK |
+               QSPI_MCR_RESERVED_MASK | QSPI_MCR_END_CFD_LE);
+       qspi_write32(&regs->rbct, QSPI_RBCT_RXBRD_USEIPS);
+
+       to_or_from = qspi->sf_addr + qspi->amba_base;
+       qspi_write32(&regs->sfar, to_or_from);
+
+       qspi_write32(&regs->ipcr,
+               (SEQID_WREN << QSPI_IPCR_SEQID_SHIFT) | 0);
+       while (qspi_read32(&regs->sr) & QSPI_SR_BUSY_MASK)
+               ;
+
+       qspi_write32(&regs->ipcr,
+               (SEQID_SE << QSPI_IPCR_SEQID_SHIFT) | 0);
+       while (qspi_read32(&regs->sr) & QSPI_SR_BUSY_MASK)
+               ;
+
+       qspi_write32(&regs->mcr, mcr_reg);
+}
+
+int spi_xfer(struct spi_slave *slave, unsigned int bitlen,
+               const void *dout, void *din, unsigned long flags)
+{
+       struct fsl_qspi *qspi = to_qspi_spi(slave);
+       u32 bytes = DIV_ROUND_UP(bitlen, 8);
+       static u32 pp_sfaddr;
+       u32 txbuf;
+
+       if (dout) {
+               memcpy(&txbuf, dout, 4);
+               qspi->cur_seqid = *(u8 *)dout;
+
+               if (flags == SPI_XFER_END) {
+                       qspi->sf_addr = pp_sfaddr;
+                       qspi_op_pp(qspi, (u32 *)dout, bytes);
+                       return 0;
+               }
+
+               if (qspi->cur_seqid == OPCODE_FAST_READ) {
+                       qspi->sf_addr = swab32(txbuf) & OFFSET_BITS_MASK;
+               } else if (qspi->cur_seqid == OPCODE_SE) {
+                       qspi->sf_addr = swab32(txbuf) & OFFSET_BITS_MASK;
+                       qspi_op_se(qspi);
+               } else if (qspi->cur_seqid == OPCODE_PP) {
+                       pp_sfaddr = swab32(txbuf) & OFFSET_BITS_MASK;
+               }
+       }
+
+       if (din) {
+               if (qspi->cur_seqid == OPCODE_FAST_READ)
+                       qspi_op_read(qspi, din, bytes);
+               else if (qspi->cur_seqid == OPCODE_RDID)
+                       qspi_op_rdid(qspi, din, bytes);
+               else if (qspi->cur_seqid == OPCODE_RDSR)
+                       qspi_op_rdsr(qspi, din);
+       }
+
+       return 0;
+}
+
+void spi_release_bus(struct spi_slave *slave)
+{
+       /* Nothing to do */
+}
diff --git a/drivers/spi/fsl_qspi.h b/drivers/spi/fsl_qspi.h
new file mode 100644 (file)
index 0000000..db400e6
--- /dev/null
@@ -0,0 +1,127 @@
+/*
+ * Copyright 2013-2014 Freescale Semiconductor, Inc.
+ *
+ * Register definitions for Freescale QSPI
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#ifndef _FSL_QSPI_H_
+#define _FSL_QSPI_H_
+
+struct fsl_qspi_regs {
+       u32 mcr;
+       u32 rsvd0[1];
+       u32 ipcr;
+       u32 flshcr;
+       u32 buf0cr;
+       u32 buf1cr;
+       u32 buf2cr;
+       u32 buf3cr;
+       u32 bfgencr;
+       u32 soccr;
+       u32 rsvd1[2];
+       u32 buf0ind;
+       u32 buf1ind;
+       u32 buf2ind;
+       u32 rsvd2[49];
+       u32 sfar;
+       u32 rsvd3[1];
+       u32 smpr;
+       u32 rbsr;
+       u32 rbct;
+       u32 rsvd4[15];
+       u32 tbsr;
+       u32 tbdr;
+       u32 rsvd5[1];
+       u32 sr;
+       u32 fr;
+       u32 rser;
+       u32 spndst;
+       u32 sptrclr;
+       u32 rsvd6[4];
+       u32 sfa1ad;
+       u32 sfa2ad;
+       u32 sfb1ad;
+       u32 sfb2ad;
+       u32 rsvd7[28];
+       u32 rbdr[32];
+       u32 rsvd8[32];
+       u32 lutkey;
+       u32 lckcr;
+       u32 rsvd9[2];
+       u32 lut[64];
+};
+
+#define QSPI_IPCR_SEQID_SHIFT          24
+#define QSPI_IPCR_SEQID_MASK           (0xf << QSPI_IPCR_SEQID_SHIFT)
+
+#define QSPI_MCR_END_CFD_SHIFT         2
+#define QSPI_MCR_END_CFD_MASK          (3 << QSPI_MCR_END_CFD_SHIFT)
+#define QSPI_MCR_END_CFD_LE            (1 << QSPI_MCR_END_CFD_SHIFT)
+#define QSPI_MCR_DDR_EN_SHIFT          7
+#define QSPI_MCR_DDR_EN_MASK           (1 << QSPI_MCR_DDR_EN_SHIFT)
+#define QSPI_MCR_CLR_RXF_SHIFT         10
+#define QSPI_MCR_CLR_RXF_MASK          (1 << QSPI_MCR_CLR_RXF_SHIFT)
+#define QSPI_MCR_CLR_TXF_SHIFT         11
+#define QSPI_MCR_CLR_TXF_MASK          (1 << QSPI_MCR_CLR_TXF_SHIFT)
+#define QSPI_MCR_MDIS_SHIFT            14
+#define QSPI_MCR_MDIS_MASK             (1 << QSPI_MCR_MDIS_SHIFT)
+#define QSPI_MCR_RESERVED_SHIFT                16
+#define QSPI_MCR_RESERVED_MASK         (0xf << QSPI_MCR_RESERVED_SHIFT)
+
+#define QSPI_SMPR_HSENA_SHIFT          0
+#define QSPI_SMPR_HSENA_MASK           (1 << QSPI_SMPR_HSENA_SHIFT)
+#define QSPI_SMPR_FSPHS_SHIFT          5
+#define QSPI_SMPR_FSPHS_MASK           (1 << QSPI_SMPR_FSPHS_SHIFT)
+#define QSPI_SMPR_FSDLY_SHIFT          6
+#define QSPI_SMPR_FSDLY_MASK           (1 << QSPI_SMPR_FSDLY_SHIFT)
+#define QSPI_SMPR_DDRSMP_SHIFT         16
+#define QSPI_SMPR_DDRSMP_MASK          (7 << QSPI_SMPR_DDRSMP_SHIFT)
+
+#define QSPI_BFGENCR_SEQID_SHIFT       12
+#define QSPI_BFGENCR_SEQID_MASK                (0xf << QSPI_BFGENCR_SEQID_SHIFT)
+#define QSPI_BFGENCR_PAR_EN_SHIFT      16
+#define QSPI_BFGENCR_PAR_EN_MASK       (1 << QSPI_BFGENCR_PAR_EN_SHIFT)
+
+#define QSPI_RBSR_RDBFL_SHIFT          8
+#define QSPI_RBSR_RDBFL_MASK           (0x3f << QSPI_RBSR_RDBFL_SHIFT)
+
+#define QSPI_RBCT_RXBRD_SHIFT          8
+#define QSPI_RBCT_RXBRD_USEIPS         (1 << QSPI_RBCT_RXBRD_SHIFT)
+
+#define QSPI_SR_BUSY_SHIFT             0
+#define QSPI_SR_BUSY_MASK              (1 << QSPI_SR_BUSY_SHIFT)
+
+#define QSPI_LCKCR_LOCK                        0x1
+#define QSPI_LCKCR_UNLOCK              0x2
+
+#define LUT_KEY_VALUE                  0x5af05af0
+
+#define OPRND0_SHIFT                   0
+#define OPRND0(x)                      ((x) << OPRND0_SHIFT)
+#define PAD0_SHIFT                     8
+#define PAD0(x)                                ((x) << PAD0_SHIFT)
+#define INSTR0_SHIFT                   10
+#define INSTR0(x)                      ((x) << INSTR0_SHIFT)
+#define OPRND1_SHIFT                   16
+#define OPRND1(x)                      ((x) << OPRND1_SHIFT)
+#define PAD1_SHIFT                     24
+#define PAD1(x)                                ((x) << PAD1_SHIFT)
+#define INSTR1_SHIFT                   26
+#define INSTR1(x)                      ((x) << INSTR1_SHIFT)
+
+#define LUT_CMD                                1
+#define LUT_ADDR                       2
+#define LUT_DUMMY                      3
+#define LUT_READ                       7
+#define LUT_WRITE                      8
+
+#define LUT_PAD1                       0
+#define LUT_PAD2                       1
+#define LUT_PAD4                       2
+
+#define ADDR24BIT                      0x18
+#define ADDR32BIT                      0x20
+
+#endif /* _FSL_QSPI_H_ */
index bb4d7d8c1471ad9ca79b203ad4cc7cc03c673c01..935ae42a9c873904ff8e7a174332438fe5d7d34c 100644 (file)
@@ -171,6 +171,9 @@ void lcd_ctrl_init(void *lcdbase)
                        | LCDC_BASECTRL_DMAIEN | LCDC_BASECTRL_DFETCH;
        desc->next = (u32)desc;
 
+       /* Flush the DMA descriptor if we enabled dcache */
+       flush_dcache_range((u32)desc, (u32)desc + sizeof(*desc));
+
        lcdc_writel(&regs->lcdc_baseaddr, desc->address);
        lcdc_writel(&regs->lcdc_basectrl, desc->control);
        lcdc_writel(&regs->lcdc_basenext, desc->next);
@@ -194,4 +197,7 @@ void lcd_ctrl_init(void *lcdbase)
        lcdc_writel(&regs->lcdc_lcden, value | LCDC_LCDEN_PWMEN);
        while (!(lcdc_readl(&regs->lcdc_lcdsr) & LCDC_LCDSR_PWMSTS))
                udelay(1);
+
+       /* Enable flushing if we enabled dcache */
+       lcd_set_flush_dcache(1);
 }
index f344efe64b83f51eac4c312aa5d8d529147b20c5..d3122aa3b96eeaa8820300060c958bcb5cf1d6dd 100644 (file)
@@ -12,8 +12,8 @@ ifeq ($(DEVICE_TREE),)
 DEVICE_TREE := unset
 endif
 
-ifneq ($(DEV_TREE_BIN),)
-DTB := $(DEV_TREE_BIN)
+ifneq ($(EXT_DTB),)
+DTB := $(EXT_DTB)
 else
 DTB := arch/$(ARCH)/dts/$(DEVICE_TREE).dtb
 endif
index 1c1172163c091b79893b2da2d3876719bf513c38..33d69c9c71f07819c73678c2efc7abc175a8c607 100644 (file)
@@ -1380,7 +1380,7 @@ void ext4fs_allocate_blocks(struct ext2_inode *file_inode,
        unsigned int no_blks_reqd = 0;
 
        /* allocation of direct blocks */
-       for (i = 0; i < INDIRECT_BLOCKS; i++) {
+       for (i = 0; total_remaining_blocks && i < INDIRECT_BLOCKS; i++) {
                direct_blockno = ext4fs_get_new_blk_no();
                if (direct_blockno == -1) {
                        printf("no block left to assign\n");
@@ -1390,8 +1390,6 @@ void ext4fs_allocate_blocks(struct ext2_inode *file_inode,
                debug("DB %ld: %u\n", direct_blockno, total_remaining_blocks);
 
                total_remaining_blocks--;
-               if (total_remaining_blocks == 0)
-                       break;
        }
 
        alloc_single_indirect_block(file_inode, &total_remaining_blocks,
diff --git a/include/bootm.h b/include/bootm.h
new file mode 100644 (file)
index 0000000..4a308d8
--- /dev/null
@@ -0,0 +1,57 @@
+/*
+ * (C) Copyright 2000-2009
+ * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#ifndef _BOOTM_H
+#define _BOOTM_H
+
+#include <command.h>
+#include <image.h>
+
+#define BOOTM_ERR_RESET                (-1)
+#define BOOTM_ERR_OVERLAP              (-2)
+#define BOOTM_ERR_UNIMPLEMENTED        (-3)
+
+/*
+ *  Continue booting an OS image; caller already has:
+ *  - copied image header to global variable `header'
+ *  - checked header magic number, checksums (both header & image),
+ *  - verified image architecture (PPC) and type (KERNEL or MULTI),
+ *  - loaded (first part of) image to header load address,
+ *  - disabled interrupts.
+ *
+ * @flag: Flags indicating what to do (BOOTM_STATE_...)
+ * @argc: Number of arguments. Note that the arguments are shifted down
+ *      so that 0 is the first argument not processed by U-Boot, and
+ *      argc is adjusted accordingly. This avoids confusion as to how
+ *      many arguments are available for the OS.
+ * @images: Pointers to os/initrd/fdt
+ * @return 1 on error. On success the OS boots so this function does
+ * not return.
+ */
+typedef int boot_os_fn(int flag, int argc, char * const argv[],
+                       bootm_headers_t *images);
+
+extern boot_os_fn do_bootm_linux;
+int do_bootelf(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]);
+void lynxkdi_boot(image_header_t *hdr);
+
+boot_os_fn *bootm_os_get_boot_func(int os);
+
+int bootm_host_load_images(const void *fit, int cfg_noffset);
+
+int boot_selected_os(int argc, char * const argv[], int state,
+                    bootm_headers_t *images, boot_os_fn *boot_fn);
+
+ulong bootm_disable_interrupts(void);
+
+/* This is a special function used by bootz */
+int bootm_find_ramdisk_fdt(int flag, int argc, char * const argv[]);
+
+int do_bootm_states(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[],
+                   int states, bootm_headers_t *images, int boot_progress);
+
+#endif
index d3f700fc3c83f2f5da74f9d50ccfd6350f2512b1..6f06db1cc302ee219bd5c3ad75dd04723ec8895e 100644 (file)
@@ -11,7 +11,6 @@
 #ifndef __COMMAND_H
 #define __COMMAND_H
 
-#include <config.h>
 #include <linker_lists.h>
 
 #ifndef NULL
index 5ae8c46c85d29d8e743b0cd89b806369533daccf..a48b386477167010c8e0d206423a3bdbe611cf83 100644 (file)
 # define CONFIG_FIT
 # define CONFIG_TIMESTAMP
 # define CONFIG_LZO
-# define CONFIG_OF_CONTROL
-# define CONFIG_OF_SEPARATE
-# define CONFIG_DEFAULT_DEVICE_TREE am335x-boneblack
 # ifdef CONFIG_ENABLE_VBOOT
+#  define CONFIG_OF_CONTROL
+#  define CONFIG_OF_SEPARATE
+#  define CONFIG_DEFAULT_DEVICE_TREE am335x-boneblack
 #  define CONFIG_FIT_SIGNATURE
 #  define CONFIG_RSA
 # endif
index e93b855f8f69ef74e12adacfc8b0be45cef49dad..bf09939c8174ffc17c5a9d03b173948676e66a53 100644 (file)
@@ -14,6 +14,7 @@
 #define CONFIG_ARMV7
 #define CONFIG_KONA
 #define CONFIG_SKIP_LOWLEVEL_INIT
+#define CONFIG_SYS_GENERIC_BOARD
 
 /*
  * Memory configuration
index c81fc44b121c5e28db83dea0642b5892a7799b18..4c69af6af3f30da2d60994a3559e95426b8e3468 100644 (file)
@@ -12,6 +12,8 @@
 
 #include <asm/hardware.h>
 
+#define CONFIG_SYS_GENERIC_BOARD
+
 /* The first stage boot loader expects u-boot running at this address. */
 #define CONFIG_SYS_TEXT_BASE   0x27000000      /* 16MB available */
 
index 1de5750d8d64aced7019717a6c0ca293402bc7ee..3e55247465f718338f242e9896348ab24590d941 100644 (file)
@@ -19,6 +19,8 @@
 #define CONFIG_MPC8313
 #define CONFIG_IDS8313
 
+#define CONFIG_SYS_GENERIC_BOARD
+
 #define CONFIG_FSL_ELBC
 
 #define CONFIG_MISC_INIT_R
 #define CONFIG_RSA
 #define CONFIG_SHA1
 #define CONFIG_SHA256
-#define CONFIG_OF_CONTROL
 
 #endif /* __CONFIG_H */
index 79c4736bc5df949fc39cb9f667eddd11ccd59744..f36c2a3504e442f718bba1843bcaaf79d8b6fca1 100644 (file)
@@ -62,8 +62,7 @@
  * Commands additional to the ones defined in amcc-common.h
  */
 #define CONFIG_CMD_CACHE
-#define CONFIG_CMD_FPGA
-#define CONFIG_CMD_FPGA_LOADMK
+#define CONFIG_CMD_FPGAD
 #undef CONFIG_CMD_EEPROM
 
 /*
index 6bb2546eda5664a82289e5879a7068e3254363a6..12b69d9a249f08d4991189c2a28cb2bd02eb8ee6 100644 (file)
@@ -16,6 +16,9 @@
 
 #endif
 
+#define CONFIG_IO_TRACE
+#define CONFIG_CMD_IOTRACE
+
 #define CONFIG_SYS_TIMER_RATE          1000000
 
 #define CONFIG_BOOTSTAGE
@@ -41,6 +44,7 @@
 #define CONFIG_RSA
 #define CONFIG_CMD_FDT
 #define CONFIG_DEFAULT_DEVICE_TREE     sandbox
+#define CONFIG_ANDROID_BOOT_IMAGE
 
 #define CONFIG_FS_FAT
 #define CONFIG_FS_EXT4
index 129acf2cbf81551c35608ffbba17b0f1228e7dbb..3b88a83c04f3763a446b071b89926992f1b029a6 100644 (file)
@@ -19,6 +19,9 @@
 
 #include <asm/arch/tegra.h>            /* get chip and board defs */
 
+#define CONFIG_DM
+#define CONFIG_CMD_DM
+
 #define CONFIG_SYS_TIMER_RATE          1000000
 #define CONFIG_SYS_TIMER_COUNTER       NV_PA_TMRUS_BASE
 
index 500fd2fd6135086320f78bbced1fa86862a501ce..034255041226079f5078e6f2d16d6f502c08eab0 100644 (file)
 #define CONFIG_PHYLIB
 #define CONFIG_PHY_MICREL
 
+/* QSPI Configs*/
+#define CONFIG_FSL_QSPI
+
+#ifdef CONFIG_FSL_QSPI
+#define CONFIG_CMD_SF
+#define CONFIG_SPI_FLASH
+#define CONFIG_SPI_FLASH_SPANSION
+#define FSL_QSPI_FLASH_SIZE            (1 << 24)
+#define FSL_QSPI_FLASH_NUM             2
+#define CONFIG_SYS_FSL_QSPI_LE
+#endif
+
 /* I2C Configs */
 #define CONFIG_CMD_I2C
 #define CONFIG_SYS_I2C
index 8bbb21b575e56f077abaa28eeff542169c7251e9..a179c8a6e38c7e0900e185b952624d7df6f56bbc 100644 (file)
@@ -5,7 +5,7 @@
  */
 
 #ifndef _DM_H_
-#define _DM_H
+#define _DM_H_
 
 #include <dm/device.h>
 #include <dm/platdata.h>
index ea3df36632d80fc907412e4d5c71771006206d53..26e5cf530ebc8b6bb81ec34c72abc0a4ecd268f2 100644 (file)
@@ -84,4 +84,8 @@ int device_remove(struct udevice *dev);
  */
 int device_unbind(struct udevice *dev);
 
+/* Cast away any volatile pointer */
+#define DM_ROOT_NON_CONST              (((gd_t *)gd)->dm_root)
+#define DM_UCLASS_ROOT_NON_CONST       (((gd_t *)gd)->uclass_root)
+
 #endif
index ec049824e8cf485a07d5619963e6fafe56c345c6..ae75a3f54db53c927fb81159b42f7870c81b64f7 100644 (file)
@@ -21,7 +21,7 @@ struct driver_info;
 #define DM_FLAG_ACTIVATED      (1 << 0)
 
 /* DM is responsible for allocating and freeing platdata */
-#define DM_FLAG_ALLOC_PDATA    (2 << 0)
+#define DM_FLAG_ALLOC_PDATA    (1 << 1)
 
 /**
  * struct udevice - An instance of a driver
@@ -75,11 +75,11 @@ struct udevice {
 #define device_active(dev)     ((dev)->flags & DM_FLAG_ACTIVATED)
 
 /**
- * struct device_id - Lists the compatible strings supported by a driver
+ * struct udevice_id - Lists the compatible strings supported by a driver
  * @compatible: Compatible string
  * @data: Data for this compatible string
  */
-struct device_id {
+struct udevice_id {
        const char *compatible;
        ulong data;
 };
@@ -121,7 +121,7 @@ struct device_id {
 struct driver {
        char *name;
        enum uclass_id id;
-       const struct device_id *of_match;
+       const struct udevice_id *of_match;
        int (*bind)(struct udevice *dev);
        int (*probe)(struct udevice *dev);
        int (*remove)(struct udevice *dev);
index 7feba4b00ff98df67a7affe486a567c60cb12f0e..49d87e617687465d289b88e9a002f0ac4ea14223 100644 (file)
@@ -32,8 +32,28 @@ struct driver *lists_driver_lookup_name(const char *name);
  */
 struct uclass_driver *lists_uclass_lookup(enum uclass_id id);
 
+/**
+ * lists_bind_drivers() - search for and bind all drivers to parent
+ *
+ * This searches the U_BOOT_DEVICE() structures and creates new devices for
+ * each one. The devices will have @parent as their parent.
+ *
+ * @parent: parent driver (root)
+ * @early_only: If true, bind only drivers with the DM_INIT_F flag. If false
+ * bind all drivers.
+ */
 int lists_bind_drivers(struct udevice *parent);
 
+/**
+ * lists_bind_fdt() - bind a device tree node
+ *
+ * This creates a new device bound to the given device tree node, with
+ * @parent as its parent.
+ *
+ * @parent: parent driver (root)
+ * @blob: device tree blob
+ * @offset: offset of this device tree node
+ */
 int lists_bind_fdt(struct udevice *parent, const void *blob, int offset);
 
 #endif
index 3018bc8627a54c132eed61f799c1ac0c594bfe6f..a4826a6e3cc485abeb619604c13ac4767abe6184 100644 (file)
@@ -41,7 +41,7 @@ int dm_scan_platdata(void);
 int dm_scan_fdt(const void *blob);
 
 /**
- * dm_init() - Initialize Driver Model structures
+ * dm_init() - Initialise Driver Model structures
  *
  * This function will initialize roots of driver tree and class tree.
  * This needs to be called before anything uses the DM
index 931d9c0b9a1f78cf099939abb2224ce7ba242c04..afd9923fb382fc8c6e6ee55bcde331ca8f5615a4 100644 (file)
@@ -26,7 +26,7 @@
  * @priv: Private data for this uclass
  * @uc_drv: The driver for the uclass itself, not to be confused with a
  * 'struct driver'
- * dev_head: List of devices in this uclass (devices are attached to their
+ * @dev_head: List of devices in this uclass (devices are attached to their
  * uclass when their bind method is called)
  * @sibling_node: Next uclass in the linked list of uclasses
  */
@@ -96,12 +96,14 @@ int uclass_get(enum uclass_id key, struct uclass **ucp);
 /**
  * uclass_get_device() - Get a uclass device based on an ID and index
  *
+ * The device is probed to activate it ready for use.
+ *
  * id: ID to look up
  * @index: Device number within that uclass (0=first)
- * @ucp: Returns pointer to uclass (there is only one per for each ID)
+ * @devp: Returns pointer to device (there is only one per for each ID)
  * @return 0 if OK, -ve on error
  */
-int uclass_get_device(enum uclass_id id, int index, struct udevice **ucp);
+int uclass_get_device(enum uclass_id id, int index, struct udevice **devp);
 
 /**
  * uclass_first_device() - Get the first device in a uclass
@@ -129,7 +131,7 @@ int uclass_next_device(struct udevice **devp);
  *
  * @pos: struct udevice * to hold the current device. Set to NULL when there
  * are no more devices.
- * uc: uclass to scan
+ * @uc: uclass to scan
  */
 #define uclass_foreach_dev(pos, uc)                                    \
        for (pos = list_entry((&(uc)->dev_head)->next, typeof(*pos),    \
diff --git a/include/dt-bindings/gpio/gpio.h b/include/dt-bindings/gpio/gpio.h
new file mode 100644 (file)
index 0000000..e6b1e0a
--- /dev/null
@@ -0,0 +1,15 @@
+/*
+ * This header provides constants for most GPIO bindings.
+ *
+ * Most GPIO bindings include a flags cell as part of the GPIO specifier.
+ * In most cases, the format of the flags cell uses the standard values
+ * defined in this header.
+ */
+
+#ifndef _DT_BINDINGS_GPIO_GPIO_H
+#define _DT_BINDINGS_GPIO_GPIO_H
+
+#define GPIO_ACTIVE_HIGH 0
+#define GPIO_ACTIVE_LOW 1
+
+#endif
diff --git a/include/dt-bindings/gpio/tegra-gpio.h b/include/dt-bindings/gpio/tegra-gpio.h
new file mode 100644 (file)
index 0000000..197dc28
--- /dev/null
@@ -0,0 +1,51 @@
+/*
+ * This header provides constants for binding nvidia,tegra*-gpio.
+ *
+ * The first cell in Tegra's GPIO specifier is the GPIO ID. The macros below
+ * provide names for this.
+ *
+ * The second cell contains standard flag values specified in gpio.h.
+ */
+
+#ifndef _DT_BINDINGS_GPIO_TEGRA_GPIO_H
+#define _DT_BINDINGS_GPIO_TEGRA_GPIO_H
+
+#include <dt-bindings/gpio/gpio.h>
+
+#define TEGRA_GPIO_BANK_ID_A 0
+#define TEGRA_GPIO_BANK_ID_B 1
+#define TEGRA_GPIO_BANK_ID_C 2
+#define TEGRA_GPIO_BANK_ID_D 3
+#define TEGRA_GPIO_BANK_ID_E 4
+#define TEGRA_GPIO_BANK_ID_F 5
+#define TEGRA_GPIO_BANK_ID_G 6
+#define TEGRA_GPIO_BANK_ID_H 7
+#define TEGRA_GPIO_BANK_ID_I 8
+#define TEGRA_GPIO_BANK_ID_J 9
+#define TEGRA_GPIO_BANK_ID_K 10
+#define TEGRA_GPIO_BANK_ID_L 11
+#define TEGRA_GPIO_BANK_ID_M 12
+#define TEGRA_GPIO_BANK_ID_N 13
+#define TEGRA_GPIO_BANK_ID_O 14
+#define TEGRA_GPIO_BANK_ID_P 15
+#define TEGRA_GPIO_BANK_ID_Q 16
+#define TEGRA_GPIO_BANK_ID_R 17
+#define TEGRA_GPIO_BANK_ID_S 18
+#define TEGRA_GPIO_BANK_ID_T 19
+#define TEGRA_GPIO_BANK_ID_U 20
+#define TEGRA_GPIO_BANK_ID_V 21
+#define TEGRA_GPIO_BANK_ID_W 22
+#define TEGRA_GPIO_BANK_ID_X 23
+#define TEGRA_GPIO_BANK_ID_Y 24
+#define TEGRA_GPIO_BANK_ID_Z 25
+#define TEGRA_GPIO_BANK_ID_AA 26
+#define TEGRA_GPIO_BANK_ID_BB 27
+#define TEGRA_GPIO_BANK_ID_CC 28
+#define TEGRA_GPIO_BANK_ID_DD 29
+#define TEGRA_GPIO_BANK_ID_EE 30
+#define TEGRA_GPIO_BANK_ID_FF 31
+
+#define TEGRA_GPIO(bank, offset) \
+       ((TEGRA_GPIO_BANK_ID_##bank * 8) + offset)
+
+#endif
diff --git a/include/dt-bindings/interrupt-controller/arm-gic.h b/include/dt-bindings/interrupt-controller/arm-gic.h
new file mode 100644 (file)
index 0000000..1ea1b70
--- /dev/null
@@ -0,0 +1,22 @@
+/*
+ * This header provides constants for the ARM GIC.
+ */
+
+#ifndef _DT_BINDINGS_INTERRUPT_CONTROLLER_ARM_GIC_H
+#define _DT_BINDINGS_INTERRUPT_CONTROLLER_ARM_GIC_H
+
+#include <dt-bindings/interrupt-controller/irq.h>
+
+/* interrupt specific cell 0 */
+
+#define GIC_SPI 0
+#define GIC_PPI 1
+
+/*
+ * Interrupt specifier cell 2.
+ * The flaggs in irq.h are valid, plus those below.
+ */
+#define GIC_CPU_MASK_RAW(x) ((x) << 8)
+#define GIC_CPU_MASK_SIMPLE(num) GIC_CPU_MASK_RAW((1 << (num)) - 1)
+
+#endif
diff --git a/include/dt-bindings/interrupt-controller/irq.h b/include/dt-bindings/interrupt-controller/irq.h
new file mode 100644 (file)
index 0000000..33a1003
--- /dev/null
@@ -0,0 +1,19 @@
+/*
+ * This header provides constants for most IRQ bindings.
+ *
+ * Most IRQ bindings include a flags cell as part of the IRQ specifier.
+ * In most cases, the format of the flags cell uses the standard values
+ * defined in this header.
+ */
+
+#ifndef _DT_BINDINGS_INTERRUPT_CONTROLLER_IRQ_H
+#define _DT_BINDINGS_INTERRUPT_CONTROLLER_IRQ_H
+
+#define IRQ_TYPE_NONE          0
+#define IRQ_TYPE_EDGE_RISING   1
+#define IRQ_TYPE_EDGE_FALLING  2
+#define IRQ_TYPE_EDGE_BOTH     (IRQ_TYPE_EDGE_FALLING | IRQ_TYPE_EDGE_RISING)
+#define IRQ_TYPE_LEVEL_HIGH    4
+#define IRQ_TYPE_LEVEL_LOW     8
+
+#endif
index ae010bb6248a5bd840166a0d32b9471b7988b1ac..21d7b44453286cbf78904f4620cb4fdc172fd2e6 100644 (file)
@@ -16,8 +16,8 @@ u32 fdt_getprop_u32_default_node(const void *fdt, int off, int cell,
                                const char *prop, const u32 dflt);
 u32 fdt_getprop_u32_default(const void *fdt, const char *path,
                                const char *prop, const u32 dflt);
-int fdt_chosen(void *fdt, int force);
-int fdt_initrd(void *fdt, ulong initrd_start, ulong initrd_end, int force);
+int fdt_chosen(void *fdt);
+int fdt_initrd(void *fdt, ulong initrd_start, ulong initrd_end);
 void do_fixup_by_path(void *fdt, const char *path, const char *prop,
                      const void *val, int len, int create);
 void do_fixup_by_path_u32(void *fdt, const char *path, const char *prop,
index 5cb4dbfcb2bb671639ae9f06eb6a8dd15f43a256..d8ec4f08e166702d6a33b145f82eee3c78f6a6a3 100644 (file)
@@ -139,6 +139,7 @@ int hash_lookup_algo(const char *algo_name, struct hash_algo **algop);
  * @len:               Length of data that was hashed
  * @output:            Hash value to display
  */
-void hash_show(struct hash_algo *algo, ulong addr, ulong len, u8 *output);
+void hash_show(struct hash_algo *algo, ulong addr, ulong len,
+              uint8_t *output);
 #endif /* !USE_HOSTCC */
 #endif
index b71e4ba35f633555b435448ba3ce119a19837b89..0a072f5336c7f24fe1e81a9838c7565b3606820b 100644 (file)
@@ -425,6 +425,7 @@ ulong genimg_get_image(ulong img_addr);
 
 int boot_get_ramdisk(int argc, char * const argv[], bootm_headers_t *images,
                uint8_t arch, ulong *rd_start, ulong *rd_end);
+#endif
 
 /**
  * fit_image_load() - load an image from a FIT
@@ -434,8 +435,9 @@ int boot_get_ramdisk(int argc, char * const argv[], bootm_headers_t *images,
  * out progress messages, checking the type/arch/os and optionally copying it
  * to the right load address.
  *
+ * The property to look up is defined by image_type.
+ *
  * @param images       Boot images structure
- * @param prop_name    Property name to look up (FIT_..._PROP)
  * @param addr         Address of FIT in memory
  * @param fit_unamep   On entry this is the requested image name
  *                     (e.g. "kernel@1") or NULL to use the default. On exit
@@ -453,12 +455,14 @@ int boot_get_ramdisk(int argc, char * const argv[], bootm_headers_t *images,
  * @param load_op      Decribes what to do with the load address
  * @param datap                Returns address of loaded image
  * @param lenp         Returns length of loaded image
+ * @return node offset of image, or -ve error code on error
  */
-int fit_image_load(bootm_headers_t *images, const char *prop_name, ulong addr,
+int fit_image_load(bootm_headers_t *images, ulong addr,
                   const char **fit_unamep, const char **fit_uname_configp,
                   int arch, int image_type, int bootstage_id,
                   enum fit_load_op load_op, ulong *datap, ulong *lenp);
 
+#ifndef USE_HOSTCC
 /**
  * fit_get_node_from_config() - Look up an image a FIT by type
  *
@@ -603,8 +607,8 @@ int image_check_dcrc(const image_header_t *hdr);
 ulong getenv_bootm_low(void);
 phys_size_t getenv_bootm_size(void);
 phys_size_t getenv_bootm_mapsize(void);
-void memmove_wd(void *to, void *from, size_t len, ulong chunksz);
 #endif
+void memmove_wd(void *to, void *from, size_t len, ulong chunksz);
 
 static inline int image_check_magic(const image_header_t *hdr)
 {
@@ -882,7 +886,7 @@ struct image_region {
 };
 
 #if IMAGE_ENABLE_VERIFY
-# include <rsa-checksum.h>
+# include <u-boot/rsa-checksum.h>
 #endif
 struct checksum_algo {
        const char *name;
diff --git a/include/iotrace.h b/include/iotrace.h
new file mode 100644 (file)
index 0000000..9bd1f16
--- /dev/null
@@ -0,0 +1,104 @@
+/*
+ * Copyright (c) 2014 Google, Inc.
+ *
+ * SPDX-License-Identifier:     GPL-2.0+
+ */
+
+#ifndef __IOTRACE_H
+#define __IOTRACE_H
+
+#include <linux/types.h>
+
+/*
+ * This file is designed to be included in arch/<arch>/include/asm/io.h.
+ * It redirects all IO access through a tracing/checksumming feature for
+ * testing purposes.
+ */
+
+#if defined(CONFIG_IO_TRACE) && !defined(IOTRACE_IMPL) && \
+       !defined(CONFIG_SPL_BUILD)
+
+#undef readl
+#define readl(addr)    iotrace_readl((const void *)(addr))
+
+#undef writel
+#define writel(val, addr)      iotrace_writel(val, (const void *)(addr))
+
+#undef readw
+#define readw(addr)    iotrace_readw((const void *)(addr))
+
+#undef writew
+#define writew(val, addr)      iotrace_writew(val, (const void *)(addr))
+
+#undef readb
+#define readb(addr)    iotrace_readb((const void *)(addr))
+
+#undef writeb
+#define writeb(val, addr)      iotrace_writeb(val, (const void *)(addr))
+
+#endif
+
+/* Tracing functions which mirror their io.h counterparts */
+u32 iotrace_readl(const void *ptr);
+void iotrace_writel(ulong value, const void *ptr);
+u16 iotrace_readw(const void *ptr);
+void iotrace_writew(ulong value, const void *ptr);
+u8 iotrace_readb(const void *ptr);
+void iotrace_writeb(ulong value, const void *ptr);
+
+/**
+ * iotrace_reset_checksum() - Reset the iotrace checksum
+ */
+void iotrace_reset_checksum(void);
+
+/**
+ * iotrace_get_checksum() - Get the current checksum value
+ *
+ * @return currect checksum value
+ */
+u32 iotrace_get_checksum(void);
+
+/**
+ * iotrace_set_enabled() - Set whether iotracing is enabled or not
+ *
+ * This controls whether the checksum is updated and a trace record added
+ * for each I/O access.
+ *
+ * @enable: true to enable iotracing, false to disable
+ */
+void iotrace_set_enabled(int enable);
+
+/**
+ * iotrace_get_enabled() - Get whether iotracing is enabled or not
+ *
+ * @return true if enabled, false if disabled
+ */
+int iotrace_get_enabled(void);
+
+/**
+ * iotrace_set_buffer() - Set position and size of iotrace buffer
+ *
+ * Defines where the iotrace buffer goes, and resets the output pointer to
+ * the start of the buffer.
+ *
+ * The buffer can be 0 size in which case the checksum is updated but no
+ * trace records are writen. If the buffer is exhausted, the offset will
+ * continue to increase but not new data will be written.
+ *
+ * @start: Start address of buffer
+ * @size: Size of buffer in bytes
+ */
+void iotrace_set_buffer(ulong start, ulong size);
+
+/**
+ * iotrace_get_buffer() - Get buffer information
+ *
+ * @start: Returns start address of buffer
+ * @size: Returns size of buffer in bytes
+ * @offset: Returns the byte offset where the next output trace record will
+ * @count: Returns the number of trace records recorded
+ * be written (or would be if the buffer was large enough)
+ */
+void iotrace_get_buffer(ulong *start, ulong *size, ulong *offset, ulong *count);
+
+#endif /* __IOTRACE_H */
similarity index 91%
rename from include/rsa-checksum.h
rename to include/u-boot/rsa-checksum.h
index 612db85fe0f6095afc5aa41bfd4c68e57d15cce9..c996fb3e4c10eaf7c73451bbc8e7cf420b96d3d3 100644 (file)
@@ -9,8 +9,8 @@
 
 #include <errno.h>
 #include <image.h>
-#include <sha1.h>
-#include <sha256.h>
+#include <u-boot/sha1.h>
+#include <u-boot/sha256.h>
 
 extern const uint8_t padding_sha256_rsa4096[];
 extern const uint8_t padding_sha256_rsa2048[];
similarity index 100%
rename from include/rsa.h
rename to include/u-boot/rsa.h
similarity index 100%
rename from include/sha1.h
rename to include/u-boot/sha1.h
similarity index 100%
rename from include/sha256.h
rename to include/u-boot/sha256.h
index 377ab134ba34e77835ed8b6db7e38280d4eaf98c..68210a59b73fbbc6c52e2e1f8234ffd73e8b3007 100644 (file)
@@ -23,6 +23,8 @@ obj-$(CONFIG_USB_TTY) += circbuf.o
 obj-y += crc7.o
 obj-y += crc8.o
 obj-y += crc16.o
+obj-$(CONFIG_FIT) += fdtdec_common.o
+obj-$(CONFIG_OF_CONTROL) += fdtdec_common.o
 obj-$(CONFIG_OF_CONTROL) += fdtdec.o
 obj-$(CONFIG_TEST_FDTDEC) += fdtdec_test.o
 obj-$(CONFIG_GZIP) += gunzip.o
index 13d3d2f522f177fc994e7be91d859858d32e3d9c..aaa6620cc37c1471bb3bfdc6464eeb2ab5d93485 100644 (file)
@@ -111,24 +111,6 @@ fdt_addr_t fdtdec_get_addr(const void *blob, int node,
        return fdtdec_get_addr_size(blob, node, prop_name, NULL);
 }
 
-s32 fdtdec_get_int(const void *blob, int node, const char *prop_name,
-               s32 default_val)
-{
-       const s32 *cell;
-       int len;
-
-       debug("%s: %s: ", __func__, prop_name);
-       cell = fdt_getprop(blob, node, prop_name, &len);
-       if (cell && len >= sizeof(s32)) {
-               s32 val = fdt32_to_cpu(cell[0]);
-
-               debug("%#x (%d)\n", val, val);
-               return val;
-       }
-       debug("(not found)\n");
-       return default_val;
-}
-
 uint64_t fdtdec_get_uint64(const void *blob, int node, const char *prop_name,
                uint64_t default_val)
 {
@@ -648,22 +630,4 @@ int fdtdec_read_fmap_entry(const void *blob, int node, const char *name,
 
        return 0;
 }
-#else
-#include "libfdt.h"
-#include "fdt_support.h"
-
-int fdtdec_get_int(const void *blob, int node, const char *prop_name,
-               int default_val)
-{
-       const int *cell;
-       int len;
-
-       cell = fdt_getprop_w((void *)blob, node, prop_name, &len);
-       if (cell && len >= sizeof(int)) {
-               int val = fdt32_to_cpu(cell[0]);
-
-               return val;
-       }
-       return default_val;
-}
 #endif
diff --git a/lib/fdtdec_common.c b/lib/fdtdec_common.c
new file mode 100644 (file)
index 0000000..757931a
--- /dev/null
@@ -0,0 +1,38 @@
+/*
+ * Copyright (c) 2014
+ * Heiko Schocher, DENX Software Engineering, hs@denx.de.
+ *
+ * Based on lib/fdtdec.c:
+ * Copyright (c) 2011 The Chromium OS Authors.
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#ifndef USE_HOSTCC
+#include <common.h>
+#include <libfdt.h>
+#include <fdtdec.h>
+#else
+#include "libfdt.h"
+#include "fdt_support.h"
+
+#define debug(...)
+#endif
+
+int fdtdec_get_int(const void *blob, int node, const char *prop_name,
+               int default_val)
+{
+       const int *cell;
+       int len;
+
+       debug("%s: %s: ", __func__, prop_name);
+       cell = fdt_getprop(blob, node, prop_name, &len);
+       if (cell && len >= sizeof(int)) {
+               int val = fdt32_to_cpu(cell[0]);
+
+               debug("%#x (%d)\n", val, val);
+               return val;
+       }
+       debug("(not found)\n");
+       return default_val;
+}
index f2154e8370272eeac529644e80a19923902a7265..36af0435254b47cb0d2599836d1c81638266adf8 100644 (file)
@@ -44,7 +44,7 @@ static int _fdt_string_eq(const void *fdt, int stroffset,
 {
        const char *p = fdt_string(fdt, stroffset);
 
-       return (strlen(p) == len) && (memcmp(p, s, len) == 0);
+       return (strnlen(p, len + 1) == len) && (memcmp(p, s, len) == 0);
 }
 
 int fdt_get_mem_rsv(const void *fdt, int n, uint64_t *address, uint64_t *size)
index 32d6602e9758ef553b7a20a06dc0ff581c33a071..8d8b59f779a2bd7d5d9eeb413706c86b5307d9ff 100644 (file)
@@ -13,9 +13,9 @@
 #else
 #include "fdt_host.h"
 #endif
-#include <rsa.h>
-#include <sha1.h>
-#include <sha256.h>
+#include <u-boot/rsa.h>
+#include <u-boot/sha1.h>
+#include <u-boot/sha256.h>
 
 /* PKCS 1.5 paddings as described in the RSA PKCS#1 v2.1 standard. */
 
index 48f3197209686156c325226d94866556886f3fee..83f5e87838950a7fb63f2de0aac6891cf40e2abd 100644 (file)
@@ -405,11 +405,15 @@ int rsa_add_verify_data(struct image_sign_info *info, void *keydest)
        if (parent == -FDT_ERR_NOTFOUND) {
                parent = fdt_add_subnode(keydest, 0, FIT_SIG_NODENAME);
                if (parent < 0) {
-                       fprintf(stderr, "Couldn't create signature node: %s\n",
-                               fdt_strerror(parent));
-                       return -EINVAL;
+                       ret = parent;
+                       if (ret != -FDT_ERR_NOSPACE) {
+                               fprintf(stderr, "Couldn't create signature node: %s\n",
+                                       fdt_strerror(parent));
+                       }
                }
        }
+       if (ret)
+               goto done;
 
        /* Either create or overwrite the named key node */
        snprintf(name, sizeof(name), "key-%s", info->keyname);
@@ -417,18 +421,22 @@ int rsa_add_verify_data(struct image_sign_info *info, void *keydest)
        if (node == -FDT_ERR_NOTFOUND) {
                node = fdt_add_subnode(keydest, parent, name);
                if (node < 0) {
-                       fprintf(stderr, "Could not create key subnode: %s\n",
-                               fdt_strerror(node));
-                       return -EINVAL;
+                       ret = node;
+                       if (ret != -FDT_ERR_NOSPACE) {
+                               fprintf(stderr, "Could not create key subnode: %s\n",
+                                       fdt_strerror(node));
+                       }
                }
        } else if (node < 0) {
                fprintf(stderr, "Cannot select keys parent: %s\n",
                        fdt_strerror(node));
-               return -ENOSPC;
+               ret = node;
        }
 
-       ret = fdt_setprop_string(keydest, node, "key-name-hint",
+       if (!ret) {
+               ret = fdt_setprop_string(keydest, node, "key-name-hint",
                                 info->keyname);
+       }
        if (!ret)
                ret = fdt_setprop_u32(keydest, node, "rsa,num-bits", bits);
        if (!ret)
@@ -449,10 +457,11 @@ int rsa_add_verify_data(struct image_sign_info *info, void *keydest)
                ret = fdt_setprop_string(keydest, node, "required",
                                         info->require_keys);
        }
+done:
        BN_free(modulus);
        BN_free(r_squared);
        if (ret)
-               return ret == FDT_ERR_NOSPACE ? -ENOSPC : -EIO;
+               return ret == -FDT_ERR_NOSPACE ? -ENOSPC : -EIO;
 
        return 0;
 }
index 587da5b470685de78ebc86bf611c0abf8fd0c387..bcb906368d0dc273eb462a023a8d0477f2c51795 100644 (file)
@@ -17,9 +17,9 @@
 #include "mkimage.h"
 #include <fdt_support.h>
 #endif
-#include <rsa.h>
-#include <sha1.h>
-#include <sha256.h>
+#include <u-boot/rsa.h>
+#include <u-boot/sha1.h>
+#include <u-boot/sha256.h>
 
 #define UINT64_MULT32(v, multby)  (((uint64_t)(v)) * ((uint32_t)(multby)))
 
index a121224855f4786f9ca92de5396bd1262301c6bc..0a5f68864c74cd6c1e6fa59443ae10706e62b0f9 100644 (file)
@@ -36,7 +36,7 @@
 #include <string.h>
 #endif /* USE_HOSTCC */
 #include <watchdog.h>
-#include "sha1.h"
+#include <u-boot/sha1.h>
 
 /*
  * 32-bit integer manipulation macros (big endian)
index b1085ea791759128dad36cc338bb8430d5389a32..bb338baefa836a6a73d5872c9f7412536b0a25f2 100644 (file)
@@ -13,7 +13,7 @@
 #include <string.h>
 #endif /* USE_HOSTCC */
 #include <watchdog.h>
-#include <sha256.h>
+#include <u-boot/sha256.h>
 
 /*
  * 32-bit integer manipulation macros (big endian)
index 967c8e65150a354a098db3c8196db6e4cc129f5c..d9789b022ab3e9c507f4d2983da1bb6c746c90a9 100644 (file)
--- a/lib/tpm.c
+++ b/lib/tpm.c
@@ -7,7 +7,7 @@
 
 #include <common.h>
 #include <stdarg.h>
-#include <sha1.h>
+#include <u-boot/sha1.h>
 #include <tpm.h>
 #include <asm/unaligned.h>
 
index f7cc29f03956a6b1b56ccc27e479f351d86cf570..0f7625fde1dc52de2df5fb3ecd91589db24c7c56 100644 (file)
--- a/net/net.c
+++ b/net/net.c
@@ -419,7 +419,7 @@ restart:
                        CDPStart();
                        break;
 #endif
-#ifdef CONFIG_NETCONSOLE
+#if defined (CONFIG_NETCONSOLE) && !(CONFIG_SPL_BUILD)
                case NETCONS:
                        NcStart();
                        break;
@@ -1182,7 +1182,7 @@ NetReceive(uchar *inpkt, int len)
 #endif
 
 
-#ifdef CONFIG_NETCONSOLE
+#if defined (CONFIG_NETCONSOLE) && !(CONFIG_SPL_BUILD)
                nc_input_packet((uchar *)ip + IP_UDP_HDR_SIZE,
                                        src_ip,
                                        ntohs(ip->udp_dst),
index 6416c1a8bc9ab9a67c0bada6fd7274e60392560b..04c6f7d2396761bc34486417c29c1fbd1efeadfa 100644 (file)
@@ -369,7 +369,7 @@ $(real-objs-m)      : modkern_aflags := $(KBUILD_AFLAGS_MODULE) $(AFLAGS_MODULE)
 $(real-objs-m:.o=.s): modkern_aflags := $(KBUILD_AFLAGS_MODULE) $(AFLAGS_MODULE)
 
 quiet_cmd_as_s_S = CPP $(quiet_modtag) $@
-cmd_as_s_S       = $(CPP) $(a_flags)   -o $@ $< 
+cmd_as_s_S       = $(CPP) $(a_flags)   -o $@ $<
 
 $(obj)/%.s: $(src)/%.S FORCE
        $(call if_changed_dep,as_s_S)
@@ -463,7 +463,7 @@ link_multi_deps =                     \
 $(filter $(addprefix $(obj)/,         \
 $($(subst $(obj)/,,$(@:.o=-objs)))    \
 $($(subst $(obj)/,,$(@:.o=-y)))), $^)
+
 quiet_cmd_link_multi-y = LD      $@
 cmd_link_multi-y = $(LD) $(ld_flags) -r -o $@ $(link_multi_deps) $(cmd_secanalysis)
 
index 1ac414fd50300384663248c0ac651c9887bfe45d..66893643fd7d14a6f59bb52a17b0393180e7051d 100644 (file)
@@ -166,5 +166,4 @@ $(host-cshlib): $(obj)/%: $(host-cshobjs) FORCE
        $(call if_changed,host-cshlib)
 
 targets += $(host-csingle)  $(host-cmulti) $(host-cobjs)\
-          $(host-cxxmulti) $(host-cxxobjs) $(host-cshlib) $(host-cshobjs) 
-
+          $(host-cxxmulti) $(host-cxxobjs) $(host-cshlib) $(host-cshobjs)
index c24c5e868a8f869f50c88d1798b6a2a23869e3d9..072abaafb189b9f512a677e67ca2a571af2ce2c4 100644 (file)
@@ -27,7 +27,7 @@ lib-y := $(filter-out $(obj-y), $(sort $(lib-y) $(lib-m)))
 # ---------------------------------------------------------------------------
 # o if we encounter foo/ in $(obj-y), replace it by foo/built-in.o
 #   and add the directory to the list of dirs to descend into: $(subdir-y)
-# o if we encounter foo/ in $(obj-m), remove it from $(obj-m) 
+# o if we encounter foo/ in $(obj-m), remove it from $(obj-m)
 #   and add the directory to the list of dirs to descend into: $(subdir-m)
 
 # Determine modorder.
@@ -46,7 +46,7 @@ obj-m         := $(filter-out %/, $(obj-m))
 
 subdir-ym      := $(sort $(subdir-y) $(subdir-m))
 
-# if $(foo-objs) exists, foo.o is a composite object 
+# if $(foo-objs) exists, foo.o is a composite object
 multi-used-y := $(sort $(foreach m,$(obj-y), $(if $(strip $($(m:.o=-objs)) $($(m:.o=-y))), $(m))))
 multi-used-m := $(sort $(foreach m,$(obj-m), $(if $(strip $($(m:.o=-objs)) $($(m:.o=-y))), $(m))))
 multi-used   := $(multi-used-y) $(multi-used-m)
@@ -91,7 +91,7 @@ obj-dirs      := $(addprefix $(obj)/,$(obj-dirs))
 
 # These flags are needed for modversions and compiling, so we define them here
 # already
-# $(modname_flags) #defines KBUILD_MODNAME as the name of the module it will 
+# $(modname_flags) #defines KBUILD_MODNAME as the name of the module it will
 # end up in (or would, if it gets compiled in)
 # Note: Files that end up in two or more modules are compiled without the
 #       KBUILD_MODNAME definition. The reason is that any made-up name would
@@ -153,6 +153,7 @@ ld_flags       = $(LDFLAGS) $(ldflags-y)
 # Modified for U-Boot
 dtc_cpp_flags  = -Wp,-MD,$(depfile).pre.tmp -nostdinc                    \
                 -I$(srctree)/arch/$(ARCH)/dts                           \
+                -I$(srctree)/arch/$(ARCH)/dts/include                   \
                 -undef -D__DTS__
 
 # Finds the multi-part object the current object will be linked into
@@ -212,7 +213,7 @@ $(obj)/%: $(src)/%_shipped
 
 # Commands useful for building a boot image
 # ===========================================================================
-# 
+#
 #      Use as following:
 #
 #      target: source(s) FORCE
@@ -226,7 +227,7 @@ $(obj)/%: $(src)/%_shipped
 
 quiet_cmd_ld = LD      $@
 cmd_ld = $(LD) $(LDFLAGS) $(ldflags-y) $(LDFLAGS_$(@F)) \
-              $(filter-out FORCE,$^) -o $@ 
+              $(filter-out FORCE,$^) -o $@
 
 # Objcopy
 # ---------------------------------------------------------------------------
index 078fe1d64e7df3e38e94dcd595bb834e5bd9da9c..b30406860b7397881e4e6ffeedcda1f5b2959cc0 100644 (file)
@@ -409,10 +409,10 @@ static void print_deps(void)
                exit(2);
        }
        if (fstat(fd, &st) < 0) {
-                fprintf(stderr, "fixdep: error fstat'ing depfile: ");
-                perror(depfile);
-                exit(2);
-        }
+               fprintf(stderr, "fixdep: error fstat'ing depfile: ");
+               perror(depfile);
+               exit(2);
+       }
        if (st.st_size == 0) {
                fprintf(stderr,"fixdep: %s is empty\n",depfile);
                close(fd);
index 2b69eaf5b646e309d95fc9fda3c5a94efce236f6..e267e621431a6b83768ac5efa5d37eba6fb2f55c 100644 (file)
@@ -154,7 +154,7 @@ int symfilecnt = 0;
 static void add_new_symbol(struct symfile *sym, char * symname)
 {
        sym->symbollist =
-          realloc(sym->symbollist, (sym->symbolcnt + 1) * sizeof(char *));
+         realloc(sym->symbollist, (sym->symbolcnt + 1) * sizeof(char *));
        sym->symbollist[sym->symbolcnt++].name = strdup(symname);
 }
 
@@ -215,7 +215,7 @@ static void find_export_symbols(char * filename)
                        char *p;
                        char *e;
                        if (((p = strstr(line, "EXPORT_SYMBOL_GPL")) != NULL) ||
-                            ((p = strstr(line, "EXPORT_SYMBOL")) != NULL)) {
+                           ((p = strstr(line, "EXPORT_SYMBOL")) != NULL)) {
                                /* Skip EXPORT_SYMBOL{_GPL} */
                                while (isalnum(*p) || *p == '_')
                                        p++;
@@ -291,28 +291,28 @@ static void extfunc(char * filename) { docfunctions(filename, FUNCTION);   }
 static void singfunc(char * filename, char * line)
 {
        char *vec[200]; /* Enough for specific functions */
-        int i, idx = 0;
-        int startofsym = 1;
+       int i, idx = 0;
+       int startofsym = 1;
        vec[idx++] = KERNELDOC;
        vec[idx++] = DOCBOOK;
        vec[idx++] = SHOWNOTFOUND;
 
-        /* Split line up in individual parameters preceded by FUNCTION */
-        for (i=0; line[i]; i++) {
-                if (isspace(line[i])) {
-                        line[i] = '\0';
-                        startofsym = 1;
-                        continue;
-                }
-                if (startofsym) {
-                        startofsym = 0;
-                        vec[idx++] = FUNCTION;
-                        vec[idx++] = &line[i];
-                }
-        }
+       /* Split line up in individual parameters preceded by FUNCTION */
+       for (i=0; line[i]; i++) {
+               if (isspace(line[i])) {
+                       line[i] = '\0';
+                       startofsym = 1;
+                       continue;
+               }
+               if (startofsym) {
+                       startofsym = 0;
+                       vec[idx++] = FUNCTION;
+                       vec[idx++] = &line[i];
+               }
+       }
        for (i = 0; i < idx; i++) {
-               if (strcmp(vec[i], FUNCTION))
-                       continue;
+               if (strcmp(vec[i], FUNCTION))
+                       continue;
                consume_symbol(vec[i + 1]);
        }
        vec[idx++] = filename;
@@ -460,14 +460,14 @@ static void parse_file(FILE *infile)
                                        break;
                                case 'D':
                                        while (*s && !isspace(*s)) s++;
-                                        *s = '\0';
-                                        symbolsonly(line+2);
-                                        break;
+                                       *s = '\0';
+                                       symbolsonly(line+2);
+                                       break;
                                case 'F':
                                        /* filename */
                                        while (*s && !isspace(*s)) s++;
                                        *s++ = '\0';
-                                        /* function names */
+                                       /* function names */
                                        while (isspace(*s))
                                                s++;
                                        singlefunctions(line +2, s);
@@ -515,11 +515,11 @@ int main(int argc, char *argv[])
        }
        /* Open file, exit on error */
        infile = fopen(argv[2], "r");
-        if (infile == NULL) {
-                fprintf(stderr, "docproc: ");
-                perror(argv[2]);
-                exit(2);
-        }
+       if (infile == NULL) {
+               fprintf(stderr, "docproc: ");
+               perror(argv[2]);
+               exit(2);
+       }
 
        if (strcmp("doc", argv[1]) == 0) {
                /* Need to do this in two passes.
index b2666bfc182b7641d6d2b8130e5c17f868015d83..ae6466d0ed8340fc64d833bdf29a618896e80d04 100644 (file)
@@ -165,12 +165,12 @@ static int do_ut_cmd(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
 
 #ifdef CONFIG_SANDBOX
        /* File existence */
-       HUSH_TEST(e, "-e host - creating_this_file_breaks_uboot_unit_test", n);
-       run_command("sb save host - creating_this_file_breaks_uboot_unit_test 0 1", 0);
-       HUSH_TEST(e, "-e host - creating_this_file_breaks_uboot_unit_test", y);
+       HUSH_TEST(e, "-e hostfs - creating_this_file_breaks_uboot_unit_test", n);
+       run_command("sb save hostfs - creating_this_file_breaks_uboot_unit_test 0 1", 0);
+       HUSH_TEST(e, "-e hostfs - creating_this_file_breaks_uboot_unit_test", y);
        /* Perhaps this could be replaced by an "rm" shell command one day */
        assert(!os_unlink("creating_this_file_breaks_uboot_unit_test"));
-       HUSH_TEST(e, "-e host - creating_this_file_breaks_uboot_unit_test", n);
+       HUSH_TEST(e, "-e hostfs - creating_this_file_breaks_uboot_unit_test", n);
 #endif
 #endif
 
index 4e9afe6c9cec17b4cbc6bc075d59e414e33812b9..c0f21351d7435cf9399baf6c0ad5a6b59dcdff85 100644 (file)
@@ -15,4 +15,6 @@ obj-$(CONFIG_DM_TEST) += ut.o
 # subsystem you must add sandbox tests here.
 obj-$(CONFIG_DM_TEST) += core.o
 obj-$(CONFIG_DM_TEST) += ut.o
+ifneq ($(CONFIG_SANDBOX),)
 obj-$(CONFIG_DM_GPIO) += gpio.o
+endif
index 083f15c31d137c6456ba457c9d2a6cab820653b6..96f10f3b1d45b9b19fb7a296be8394be9b1f78fb 100644 (file)
@@ -23,9 +23,9 @@ static int display_succ(struct udevice *in, char *buf)
        char local[16];
        struct udevice *pos, *n, *prev = NULL;
 
-       printf("%s- %s @ %08x", buf, in->name, map_to_sysmem(in));
-       if (in->flags & DM_FLAG_ACTIVATED)
-               puts(" - activated");
+       printf("%s- %c %s @ %08lx", buf,
+              in->flags & DM_FLAG_ACTIVATED ? '*' : ' ',
+              in->name, (ulong)map_to_sysmem(in));
        puts("\n");
 
        if (list_empty(&in->child_head))
@@ -62,7 +62,7 @@ static int do_dm_dump_all(cmd_tbl_t *cmdtp, int flag, int argc,
        struct udevice *root;
 
        root = dm_root();
-       printf("ROOT %08x\n", map_to_sysmem(root));
+       printf("ROOT %08lx\n", (ulong)map_to_sysmem(root));
        return dm_dump(root);
 }
 
@@ -84,8 +84,9 @@ static int do_dm_dump_uclass(cmd_tbl_t *cmdtp, int flag, int argc,
                for (ret = uclass_first_device(id, &dev);
                     dev;
                     ret = uclass_next_device(&dev)) {
-                       printf("  %s @  %08x:\n", dev->name,
-                              map_to_sysmem(dev));
+                       printf("  %c %s @ %08lx:\n",
+                              dev->flags & DM_FLAG_ACTIVATED ? '*' : ' ',
+                              dev->name, (ulong)map_to_sysmem(dev));
                }
                puts("\n");
        }
@@ -93,16 +94,23 @@ static int do_dm_dump_uclass(cmd_tbl_t *cmdtp, int flag, int argc,
        return 0;
 }
 
+#ifdef CONFIG_DM_TEST
 static int do_dm_test(cmd_tbl_t *cmdtp, int flag, int argc,
                          char * const argv[])
 {
        return dm_test_main();
 }
+#define TEST_HELP "\ndm test         Run tests"
+#else
+#define TEST_HELP
+#endif
 
 static cmd_tbl_t test_commands[] = {
        U_BOOT_CMD_MKENT(tree, 0, 1, do_dm_dump_all, "", ""),
        U_BOOT_CMD_MKENT(uclass, 1, 1, do_dm_dump_uclass, "", ""),
+#ifdef CONFIG_DM_TEST
        U_BOOT_CMD_MKENT(test, 1, 1, do_dm_test, "", ""),
+#endif
 };
 
 static int do_dm(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
@@ -128,6 +136,6 @@ U_BOOT_CMD(
        dm,     2,      1,      do_dm,
        "Driver model low level access",
        "tree         Dump driver model tree\n"
-       "dm uclass        Dump list of instances for each uclass\n"
-       "dm test         Run tests"
+       "dm uclass        Dump list of instances for each uclass"
+       TEST_HELP
 );
index 6eccf111279c2bbee53417f508c6b3ed514b8156..98e3936527ea11a594f4abd215c86b9fdfaf01ba 100644 (file)
@@ -53,7 +53,7 @@ static int testfdt_drv_probe(struct udevice *dev)
        return 0;
 }
 
-static const struct device_id testfdt_ids[] = {
+static const struct udevice_id testfdt_ids[] = {
        {
                .compatible = "denx,u-boot-fdt-test",
                .data = DM_TEST_TYPE_FIRST },
index 3c6efa774ec72c3dbd790b31e2946a063eabcfb1..8074fc6adc0708c984297c2172ad41ded4f0995e 100755 (executable)
@@ -1,4 +1,4 @@
-#!/bin/sh
+#!/bin/bash
 #
 # Copyright (c) 2013, Google Inc.
 #
@@ -14,7 +14,7 @@ set -e
 run_uboot() {
        echo -n "Test Verified Boot Run: $1: "
        ${uboot} -d sandbox-u-boot.dtb >${tmp} -c '
-sb load host 0 100 test.fit;
+sb load hostfs - 100 test.fit;
 fdt addr 100;
 bootm 100;
 reset'
index 0088c1aae150386ff5938f650034d3ffc3933ec8..61b2048211dfc7ed4d122dc914a2cac3fc7b66d7 100644 (file)
@@ -66,8 +66,10 @@ RSA_OBJS-$(CONFIG_FIT_SIGNATURE) := $(addprefix lib/rsa/, \
 dumpimage-mkimage-objs := aisimage.o \
                        atmelimage.o \
                        $(FIT_SIG_OBJS-y) \
+                       common/bootm.o \
                        lib/crc32.o \
                        default_image.o \
+                       lib/fdtdec_common.o \
                        lib/fdtdec.o \
                        fit_common.o \
                        fit_image.o \
@@ -191,7 +193,6 @@ endif # !LOGO_BMP
 # Define _GNU_SOURCE to obtain the getline prototype from stdio.h
 #
 HOST_EXTRACFLAGS += -include $(srctree)/include/libfdt_env.h \
-               -include $(srctree)/include/sha256.h \
                $(patsubst -I%,-idirafter%, $(UBOOTINCLUDE)) \
                -I$(srctree)/lib/libfdt \
                -I$(srctree)/tools \
index d78523ded7231e869f29193cf15bb072ffc86333..e415f14e147ed8729dae2f44a0c9f7192944135a 100644 (file)
@@ -18,7 +18,7 @@
 #include <sys/stat.h>
 #include <time.h>
 #include <unistd.h>
-#include <sha1.h>
+#include <u-boot/sha1.h>
 #include "fdt_host.h"
 #include "imagetool.h"
 
index af257cc8a2a2bf0bce3b51efc78f9aa58d1db4a0..69e99c0d179e048231b8c6ef0429e47e54ec3cfe 100644 (file)
@@ -62,6 +62,15 @@ int main(int argc, char **argv)
                        break;
        }
 
+       if (!fdtfile) {
+               fprintf(stderr, "%s: Missing fdt file\n", *argv);
+               usage(*argv);
+       }
+       if (!keyfile) {
+               fprintf(stderr, "%s: Missing key file\n", *argv);
+               usage(*argv);
+       }
+
        ffd = mmap_fdt(cmdname, fdtfile, 0, &fit_blob, &fsbuf, false);
        if (ffd < 0)
                return EXIT_FAILURE;
@@ -71,11 +80,13 @@ int main(int argc, char **argv)
 
        image_set_host_blob(key_blob);
        ret = fit_check_sign(fit_blob, key_blob);
-
-       if (ret)
+       if (!ret) {
                ret = EXIT_SUCCESS;
-       else
+               fprintf(stderr, "Signature check OK\n");
+       } else {
                ret = EXIT_FAILURE;
+               fprintf(stderr, "Signature check Bad (error %d)\n", ret);
+       }
 
        (void) munmap((void *)fit_blob, fsbuf.st_size);
        (void) munmap((void *)key_blob, ksbuf.st_size);
index afbed7b5995a69a261bae2a4d055963c9fc9b543..481ac6dd8147c3cab6261edab0f3c994911a2189 100644 (file)
@@ -68,6 +68,18 @@ int main(int argc, char **argv)
                        break;
                }
 
+       if (!fdtfile) {
+               fprintf(stderr, "%s: Missing fdt file\n", *argv);
+               usage(*argv);
+       }
+       if (!nodename) {
+               fprintf(stderr, "%s: Missing node name\n", *argv);
+               usage(*argv);
+       }
+       if (!propertyname) {
+               fprintf(stderr, "%s: Missing property name\n", *argv);
+               usage(*argv);
+       }
        ffd = mmap_fdt(cmdname, fdtfile, 0, &fit_blob, &fsbuf, false);
 
        if (ffd < 0) {
index 2be5e8043c1dd9cefa7b0380dd51533bee473fea..0eff720b62178972aa92290aea457590c8c42b56 100644 (file)
@@ -10,6 +10,7 @@
  */
 
 #include "mkimage.h"
+#include <bootm.h>
 #include <image.h>
 #include <version.h>
 
@@ -609,11 +610,13 @@ static int fit_config_process_sig(const char *keydir, void *keydest,
        /* Write the public key into the supplied FDT file */
        if (keydest) {
                ret = info.algo->add_verify_data(&info, keydest);
+               if (ret == -ENOSPC)
+                       return -ENOSPC;
                if (ret) {
                        printf("Failed to add verification data for '%s' signature node in '%s' image node\n",
                               node_name, conf_name);
-                       return ret == FDT_ERR_NOSPACE ? -ENOSPC : -EIO;
                }
+               return ret;
        }
 
        return 0;
@@ -705,16 +708,21 @@ int fit_add_verification_data(const char *keydir, void *keydest, void *fit,
 }
 
 #ifdef CONFIG_FIT_SIGNATURE
-int fit_check_sign(const void *working_fdt, const void *key)
+int fit_check_sign(const void *fit, const void *key)
 {
        int cfg_noffset;
        int ret;
 
-       cfg_noffset = fit_conf_get_node(working_fdt, NULL);
+       cfg_noffset = fit_conf_get_node(fit, NULL);
        if (!cfg_noffset)
                return -1;
 
-       ret = fit_config_verify(working_fdt, cfg_noffset);
+       printf("Verifying Hash Integrity ... ");
+       ret = fit_config_verify(fit, cfg_noffset);
+       if (ret)
+               return ret;
+       ret = bootm_host_load_images(fit, cfg_noffset);
+
        return ret;
 }
 #endif
index c480687ec13884c43cb99ac39a977847198aa375..c8af0e82f8b7247d5acdcbfd7db7d242ca8401e1 100644 (file)
@@ -18,7 +18,7 @@
 #include <sys/stat.h>
 #include <time.h>
 #include <unistd.h>
-#include <sha1.h>
+#include <u-boot/sha1.h>
 #include "fdt_host.h"
 
 #define ARRAY_SIZE(x)          (sizeof(x) / sizeof((x)[0]))
index d5491b6e60ae8eddcbbf8d6e67db8ed19ab4db5c..3f369b748ed19ed4896a0a529f86052717080c52 100644 (file)
@@ -18,7 +18,7 @@
 #include <sys/stat.h>
 #include <time.h>
 #include <unistd.h>
-#include <sha1.h>
+#include <u-boot/sha1.h>
 #include "fdt_host.h"
 #include "imagetool.h"
 
index 1041588d0b037aa7bdd5909644d352c5b20bab25..4a17246da78f1832876771000127c61183827232 100644 (file)
@@ -13,7 +13,7 @@
 #include <errno.h>
 #include <string.h>
 #include <sys/stat.h>
-#include "sha1.h"
+#include <u-boot/sha1.h>
 
 int main (int argc, char **argv)
 {