]> git.kernelconcepts.de Git - karo-tx-uboot.git/commitdiff
Merge git://git.denx.de/u-boot-dm
authorTom Rini <trini@ti.com>
Mon, 24 Nov 2014 17:01:48 +0000 (12:01 -0500)
committerTom Rini <trini@ti.com>
Mon, 24 Nov 2014 17:01:48 +0000 (12:01 -0500)
Conflicts:
drivers/serial/serial-uclass.c

Signed-off-by: Tom Rini <trini@ti.com>
296 files changed:
Kconfig
Makefile
README
arch/arm/Kconfig
arch/arm/cpu/arm1136/Makefile
arch/arm/cpu/arm1176/Makefile
arch/arm/cpu/arm1176/tnetv107x/clock.c
arch/arm/cpu/arm720t/Makefile
arch/arm/cpu/arm920t/Makefile
arch/arm/cpu/arm926ejs/Makefile
arch/arm/cpu/arm926ejs/mxs/spl_power_init.c
arch/arm/cpu/armv7/Makefile
arch/arm/cpu/armv7/bcm281xx/clk-core.h
arch/arm/cpu/armv7/exynos/clock.c
arch/arm/cpu/armv7/exynos/spl_boot.c
arch/arm/cpu/armv7/omap-common/abb.c
arch/arm/cpu/armv7/tegra114/Makefile [deleted file]
arch/arm/cpu/armv7/tegra124/Makefile [deleted file]
arch/arm/cpu/armv7/tegra20/display.c
arch/arm/cpu/armv7/tegra30/Makefile [deleted file]
arch/arm/cpu/armv8/Makefile
arch/arm/include/asm/arch-armada100/config.h
arch/arm/include/asm/arch-at91/at91rm9200.h
arch/arm/include/asm/arch-at91/at91sam9260.h
arch/arm/include/asm/arch-at91/at91sam9261.h
arch/arm/include/asm/arch-at91/at91sam9263.h
arch/arm/include/asm/arch-at91/at91sam9g45.h
arch/arm/include/asm/arch-at91/at91sam9rl.h
arch/arm/include/asm/arch-at91/at91sam9x5.h
arch/arm/include/asm/arch-at91/sama5d3.h
arch/arm/include/asm/arch-kirkwood/config.h
arch/arm/include/asm/arch-lpc32xx/config.h
arch/arm/include/asm/arch-pantheon/config.h
arch/arm/lib/cache.c
arch/avr32/cpu/Makefile
arch/avr32/cpu/at32ap700x/clk.c
arch/blackfin/cpu/jtag-console.c
arch/blackfin/lib/string.c
arch/mips/cpu/mips32/Makefile
arch/mips/cpu/mips32/au1x00/au1x00_usb_ohci.c
arch/nds32/cpu/n1213/Makefile
arch/powerpc/cpu/mpc5xxx/usb_ohci.c
arch/powerpc/cpu/mpc85xx/tlb.c
arch/powerpc/cpu/ppc4xx/44x_spd_ddr2.c
arch/powerpc/cpu/ppc4xx/usb_ohci.c
arch/powerpc/lib/bootm.c
arch/sandbox/cpu/os.c
arch/sandbox/cpu/start.c
arch/sandbox/cpu/state.c
arch/x86/Kconfig
arch/x86/config.mk
arch/x86/cpu/Makefile
arch/x86/cpu/coreboot/Makefile
arch/x86/cpu/coreboot/coreboot.c
arch/x86/cpu/coreboot/ipchecksum.c
arch/x86/cpu/coreboot/pci.c
arch/x86/cpu/coreboot/sdram.c
arch/x86/cpu/coreboot/tables.c
arch/x86/cpu/cpu.c
arch/x86/cpu/interrupts.c
arch/x86/cpu/ivybridge/Kconfig [new file with mode: 0644]
arch/x86/cpu/ivybridge/Makefile [new file with mode: 0644]
arch/x86/cpu/ivybridge/car.S [new file with mode: 0644]
arch/x86/cpu/ivybridge/cpu.c [new file with mode: 0644]
arch/x86/cpu/ivybridge/early_init.c [new file with mode: 0644]
arch/x86/cpu/ivybridge/early_me.c [new file with mode: 0644]
arch/x86/cpu/ivybridge/lpc.c [new file with mode: 0644]
arch/x86/cpu/ivybridge/me_status.c [new file with mode: 0644]
arch/x86/cpu/ivybridge/microcode_intel.c [new file with mode: 0644]
arch/x86/cpu/ivybridge/pci.c [new file with mode: 0644]
arch/x86/cpu/ivybridge/report_platform.c [new file with mode: 0644]
arch/x86/cpu/ivybridge/sdram.c [new file with mode: 0644]
arch/x86/cpu/pci.c [new file with mode: 0644]
arch/x86/cpu/start.S
arch/x86/cpu/start16.S
arch/x86/dts/Makefile
arch/x86/dts/chromebook_link.dts [new symlink]
arch/x86/dts/link.dts
arch/x86/dts/m12206a7_00000028.dtsi [new file with mode: 0644]
arch/x86/dts/m12306a9_00000017.dtsi [new file with mode: 0644]
arch/x86/include/asm/arch-coreboot/gpio.h
arch/x86/include/asm/arch-ivybridge/gpio.h [new file with mode: 0644]
arch/x86/include/asm/arch-ivybridge/me.h [new file with mode: 0644]
arch/x86/include/asm/arch-ivybridge/microcode.h [new file with mode: 0644]
arch/x86/include/asm/arch-ivybridge/model_206ax.h [new file with mode: 0644]
arch/x86/include/asm/arch-ivybridge/pch.h [new file with mode: 0644]
arch/x86/include/asm/arch-ivybridge/pei_data.h [new file with mode: 0644]
arch/x86/include/asm/arch-ivybridge/sandybridge.h [new file with mode: 0644]
arch/x86/include/asm/config.h
arch/x86/include/asm/cpu.h
arch/x86/include/asm/global_data.h
arch/x86/include/asm/gpio.h
arch/x86/include/asm/i8254.h
arch/x86/include/asm/init_helpers.h
arch/x86/include/asm/io.h
arch/x86/include/asm/lapic.h [new file with mode: 0644]
arch/x86/include/asm/lapic_def.h [new file with mode: 0644]
arch/x86/include/asm/msr.h
arch/x86/include/asm/mtrr.h [new file with mode: 0644]
arch/x86/include/asm/pci.h
arch/x86/include/asm/post.h [new file with mode: 0644]
arch/x86/include/asm/processor.h
arch/x86/include/asm/u-boot-x86.h
arch/x86/lib/Makefile
arch/x86/lib/init_helpers.c
arch/x86/lib/ramtest.c [new file with mode: 0644]
arch/x86/lib/tsc_timer.c
board/broadcom/bcm11130/MAINTAINERS [new file with mode: 0644]
board/broadcom/bcm11130_nand/MAINTAINERS [new file with mode: 0644]
board/broadcom/bcm911360_entphn-ns/MAINTAINERS [new file with mode: 0644]
board/broadcom/bcm911360_entphn/MAINTAINERS [new file with mode: 0644]
board/broadcom/bcm911360k/MAINTAINERS [new file with mode: 0644]
board/broadcom/bcm958300k-ns/MAINTAINERS [new file with mode: 0644]
board/broadcom/bcm958300k/MAINTAINERS
board/broadcom/bcm958305k/MAINTAINERS [new file with mode: 0644]
board/broadcom/bcm958622hr/MAINTAINERS
board/broadcom/bcm_ep/board.c
board/broadcom/bcmcygnus/Kconfig [moved from board/broadcom/bcm958300k/Kconfig with 88% similarity]
board/broadcom/bcmnsp/Kconfig [moved from board/broadcom/bcm958622hr/Kconfig with 88% similarity]
board/coreboot/coreboot/Kconfig [moved from board/chromebook-x86/coreboot/Kconfig with 86% similarity]
board/coreboot/coreboot/MAINTAINERS [moved from board/chromebook-x86/coreboot/MAINTAINERS with 78% similarity]
board/coreboot/coreboot/Makefile [moved from board/chromebook-x86/coreboot/Makefile with 100% similarity]
board/coreboot/coreboot/coreboot.c [moved from board/chromebook-x86/coreboot/coreboot.c with 100% similarity]
board/coreboot/coreboot/coreboot_start.S [moved from board/chromebook-x86/coreboot/coreboot_start.S with 100% similarity]
board/davinci/da8xxevm/u-boot-spl-hawk.lds
board/esd/common/auto_update.c
board/freescale/common/sys_eeprom.c
board/gdsys/p1022/controlcenterd-id.c
board/google/chromebook_link/Kconfig [new file with mode: 0644]
board/google/chromebook_link/MAINTAINERS [new file with mode: 0644]
board/google/chromebook_link/Makefile [new file with mode: 0644]
board/google/chromebook_link/link.c [new file with mode: 0644]
board/google/common/Makefile [new file with mode: 0644]
board/google/common/early_init.S [new file with mode: 0644]
board/imgtec/malta/malta.c
common/Kconfig
common/Makefile
common/board_f.c
common/cmd_elf.c
common/cmd_ext4.c
common/cmd_fat.c
common/cmd_fs.c
common/cmd_fs_uuid.c [new file with mode: 0644]
common/cmd_md5sum.c
common/cmd_pci.c
common/cmd_sf.c
common/env_fat.c
common/env_nand.c
common/fdt_support.c
common/lcd.c
common/spl/spl.c
common/spl/spl_ext.c
common/usb_hub.c
configs/bcm11130_defconfig [new file with mode: 0644]
configs/bcm11130_nand_defconfig [new file with mode: 0644]
configs/bcm911360_entphn-ns_defconfig [new file with mode: 0644]
configs/bcm911360_entphn_defconfig [new file with mode: 0644]
configs/bcm911360k_defconfig [new file with mode: 0644]
configs/bcm958300k-ns_defconfig [new file with mode: 0644]
configs/bcm958300k_defconfig
configs/bcm958305k_defconfig [new file with mode: 0644]
configs/bcm958622hr_defconfig
configs/chromebook_link_defconfig [new file with mode: 0644]
doc/device-tree-bindings/misc/intel-lpc.txt [new file with mode: 0644]
drivers/block/ahci.c
drivers/block/sata_sil.c
drivers/ddr/fsl/ctrl_regs.c
drivers/ddr/fsl/lc_common_dimm_params.c
drivers/ddr/fsl/main.c
drivers/dfu/dfu.c
drivers/fpga/zynqpl.c
drivers/gpio/gpio-uclass.c
drivers/gpio/intel_ich6_gpio.c
drivers/i2c/fsl_i2c.c
drivers/misc/cros_ec_spi.c
drivers/misc/mxc_ocotp.c
drivers/mmc/fsl_esdhc.c
drivers/mmc/pxa_mmc_gen.c
drivers/mtd/nand/denali_spl.c
drivers/mtd/spi/sandbox.c
drivers/mtd/spi/sf_ops.c
drivers/net/netconsole.c
drivers/pci/pci.c
drivers/pci/pci_auto.c
drivers/serial/serial-uclass.c
drivers/serial/usbtty.c
drivers/spi/fsl_espi.c
drivers/spi/mxc_spi.c
drivers/spi/spi-uclass.c
drivers/tpm/tpm_tis_lpc.c
drivers/usb/gadget/composite.c
drivers/usb/gadget/designware_udc.c
drivers/usb/gadget/pxa27x_udc.c
drivers/usb/gadget/s3c_udc_otg_xfer_dma.c
drivers/usb/host/dwc2.c
drivers/usb/host/ehci-hcd.c
drivers/usb/host/isp116x-hcd.c
drivers/usb/host/ohci-hcd.c
drivers/usb/host/ohci-s3c24xx.c
drivers/usb/host/r8a66597-hcd.c
drivers/usb/host/xhci-ring.c
drivers/usb/host/xhci.c
drivers/usb/musb/musb_hcd.h
drivers/video/ati_radeon_fb.c
drivers/video/cfb_console.c
fs/ext4/dev.c
fs/ext4/ext4_common.c
fs/ext4/ext4_common.h
fs/ext4/ext4_write.c
fs/ext4/ext4fs.c
fs/fat/fat.c
fs/fat/fat_write.c
fs/fat/file.c
fs/fs.c
fs/sandbox/sandboxfs.c
fs/ubifs/ubifs.h
include/asm-generic/global_data.h
include/asm-generic/gpio.h
include/common.h
include/configs/T1040QDS.h
include/configs/T104xRDB.h
include/configs/T208xQDS.h
include/configs/T208xRDB.h
include/configs/VCMA9.h
include/configs/apf27.h
include/configs/armadillo-800eva.h
include/configs/bcm28155_ap.h
include/configs/bcm_ep_board.h
include/configs/calimain.h
include/configs/cam_enc_4xx.h
include/configs/chromebook_link.h [new file with mode: 0644]
include/configs/coreboot.h
include/configs/cpuat91.h
include/configs/da830evm.h
include/configs/da850evm.h
include/configs/davinci_dm355evm.h
include/configs/davinci_dm355leopard.h
include/configs/davinci_dm365evm.h
include/configs/davinci_dm6467evm.h
include/configs/davinci_dvevm.h
include/configs/davinci_schmoogie.h
include/configs/davinci_sffsdr.h
include/configs/davinci_sonata.h
include/configs/ea20.h
include/configs/edb93xx.h
include/configs/edminiv2.h
include/configs/enbw_cmc.h
include/configs/flea3.h
include/configs/hawkboard.h
include/configs/ids8313.h
include/configs/imx27lite-common.h
include/configs/imx31_litekit.h
include/configs/imx31_phycore.h
include/configs/ipam390.h
include/configs/jadecpu.h
include/configs/ks2_evm.h
include/configs/ls1021aqds.h
include/configs/ls1021atwr.h
include/configs/mx31ads.h
include/configs/mx31pdk.h
include/configs/mx35pdk.h
include/configs/nhk8815.h
include/configs/omap3_mvblx.h
include/configs/qong.h
include/configs/rpi_b.h
include/configs/sandbox.h
include/configs/scb9328.h
include/configs/smdk2410.h
include/configs/socfpga_common.h
include/configs/tao3530.h
include/configs/tnetv107x_evm.h
include/configs/tt01.h
include/configs/udoo.h
include/configs/versatile.h
include/configs/woodburn_common.h
include/configs/x86-common.h [new file with mode: 0644]
include/configs/zmx25.h
include/configs/zynq-common.h
include/ext4fs.h
include/fat.h
include/fdtdec.h
include/fs.h
include/linux/compat.h
include/linux/kernel.h [new file with mode: 0644]
include/os.h
include/pci.h
include/sandboxfs.h
lib/asm-offsets.c
lib/fdtdec.c
lib/strmhz.c
lib/vsprintf.c
scripts/Makefile.spl
test/fs/fs-test.sh [new file with mode: 0755]
tools/Makefile
tools/ifdtool.c [new file with mode: 0644]
tools/ifdtool.h [new file with mode: 0644]

diff --git a/Kconfig b/Kconfig
index f34f341dd72777151faeacb76d70e8e838c702ee..9b16d665f245178fa63fe3a16bc3d5b9c4defed2 100644 (file)
--- a/Kconfig
+++ b/Kconfig
@@ -93,6 +93,28 @@ config TPL
        help
          If you want to build TPL as well as the normal image and SPL, say Y.
 
+config FIT
+       bool "Support Flattened Image Tree"
+       depends on !SPL_BUILD
+       help
+         This option allows to boot the new uImage structrure,
+         Flattened Image Tree.  FIT is formally a FDT, which can include
+         images of various types (kernel, FDT blob, ramdisk, etc.)
+         in a single blob.  To boot this new uImage structure,
+         pass the the address of the blob to the "bootm" command.
+
+config FIT_VERBOSE
+       bool "Display verbose messages on FIT boot"
+       depends on FIT
+
+config FIT_SIGNATURE
+       bool "Enabel signature verification of FIT uImages"
+       depends on FIT
+       help
+         This option enables signature verification of FIT uImages,
+         using a hash signed and verified using RSA.
+         See doc/uImage.FIT/signature.txt for more details.
+
 config SYS_EXTRA_OPTIONS
        string "Extra Options (DEPRECATED)"
        depends on !SPL_BUILD
index ddea53485a1e016ec80e8e4dc5a526a72fada41d..db82dfe061ab767e62e5492fa5640376ee06ae48 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -610,9 +610,6 @@ HAVE_VENDOR_COMMON_LIB = $(if $(wildcard $(srctree)/board/$(VENDOR)/common/Makef
 libs-y += lib/
 libs-$(HAVE_VENDOR_COMMON_LIB) += board/$(VENDOR)/common/
 libs-y += $(CPUDIR)/
-ifdef SOC
-libs-y += $(CPUDIR)/$(SOC)/
-endif
 libs-$(CONFIG_OF_EMBED) += dts/
 libs-y += arch/$(ARCH)/lib/
 libs-y += fs/
@@ -749,6 +746,9 @@ ALL-$(CONFIG_SPL) += $(CONFIG_SPL_TARGET:"%"=%)
 endif
 ALL-$(CONFIG_REMAKE_ELF) += u-boot.elf
 
+# We can't do this yet due to the need for binary blobs
+# ALL-$(CONFIG_X86_RESET_VECTOR) += u-boot.rom
+
 # enable combined SPL/u-boot/dtb rules for tegra
 ifneq ($(CONFIG_TEGRA),)
 ifeq ($(CONFIG_SPL),y)
@@ -817,7 +817,8 @@ OBJCOPYFLAGS_u-boot.srec := -O srec
 u-boot.hex u-boot.srec: u-boot FORCE
        $(call if_changed,objcopy)
 
-OBJCOPYFLAGS_u-boot.bin := -O binary
+OBJCOPYFLAGS_u-boot.bin := -O binary \
+               $(if $(CONFIG_X86_RESET_VECTOR),-R .start16 -R .resetvec)
 
 binary_size_check: u-boot.bin FORCE
        @file_size=$(shell wc -c u-boot.bin | awk '{print $$1}') ; \
@@ -956,6 +957,36 @@ u-boot-nand.gph: u-boot.bin FORCE
        $(call if_changed,mkimage)
        @dd if=/dev/zero bs=8 count=1 2>/dev/null >> $@
 
+# x86 uses a large ROM. We fill it with 0xff, put the 16-bit stuff (including
+# reset vector) at the top, Intel ME descriptor at the bottom, and U-Boot in
+# the middle.
+ifneq ($(CONFIG_X86_RESET_VECTOR),)
+rom: u-boot.rom FORCE
+
+u-boot.rom: u-boot-x86-16bit.bin u-boot-dtb.bin \
+               $(srctree)/board/$(BOARDDIR)/mrc.bin
+       $(objtree)/tools/ifdtool -c -r $(CONFIG_ROM_SIZE) u-boot.tmp
+       if [ -n "$(CONFIG_HAVE_INTEL_ME)" ]; then \
+               $(objtree)/tools/ifdtool -D \
+                       $(srctree)/board/$(BOARDDIR)/descriptor.bin u-boot.tmp; \
+               $(objtree)/tools/ifdtool \
+                       -i ME:$(srctree)/board/$(BOARDDIR)/me.bin u-boot.tmp; \
+       fi
+       $(objtree)/tools/ifdtool -w \
+               $(CONFIG_SYS_TEXT_BASE):$(objtree)/u-boot-dtb.bin u-boot.tmp
+       $(objtree)/tools/ifdtool -w \
+               $(CONFIG_X86_MRC_START):$(srctree)/board/$(BOARDDIR)/mrc.bin \
+               u-boot.tmp
+       $(objtree)/tools/ifdtool -w \
+               $(CONFIG_SYS_X86_START16):$(objtree)/u-boot-x86-16bit.bin \
+               u-boot.tmp
+       mv u-boot.tmp $@
+
+OBJCOPYFLAGS_u-boot-x86-16bit.bin := -O binary -j .start16 -j .resetvec
+u-boot-x86-16bit.bin: u-boot FORCE
+       $(call if_changed,objcopy)
+endif
+
 ifneq ($(CONFIG_SUNXI),)
 OBJCOPYFLAGS_u-boot-sunxi-with-spl.bin = -I binary -O binary \
                                   --pad-to=$(CONFIG_SPL_PAD_TO) --gap-fill=0xff
diff --git a/README b/README
index df3781a0fce372fa6eb489a38448d016e4b478b7..e7cd1bcb436dff45feb2be387eaee30323cc15ae 100644 (file)
--- a/README
+++ b/README
@@ -1103,6 +1103,7 @@ The following options need to be configured:
                CONFIG_CMD_EXT4         * ext4 command support
                CONFIG_CMD_FS_GENERIC   * filesystem commands (e.g. load, ls)
                                          that work for multiple fs types
+               CONFIG_CMD_FS_UUID      * Look up a filesystem UUID
                CONFIG_CMD_SAVEENV        saveenv
                CONFIG_CMD_FDC          * Floppy Disk Support
                CONFIG_CMD_FAT          * FAT command support
@@ -2948,18 +2949,6 @@ CBFS (Coreboot Filesystem) support
 
                Enable auto completion of commands using TAB.
 
-               CONFIG_SYS_HUSH_PARSER
-
-               Define this variable to enable the "hush" shell (from
-               Busybox) as command line interpreter, thus enabling
-               powerful command line syntax like
-               if...then...else...fi conditionals or `&&' and '||'
-               constructs ("shell scripts").
-
-               If undefined, you get the old, much simpler behaviour
-               with a somewhat smaller memory footprint.
-
-
                CONFIG_SYS_PROMPT_HUSH_PS2
 
                This defines the secondary prompt string, which is
index 9b492bea3a065eab711bf2ac5f0129591f015c61..5241cb473b7777679f630c00b4f906a93df2f0dd 100644 (file)
@@ -521,12 +521,12 @@ config TARGET_BCM28155_AP
        bool "Support bcm28155_ap"
        select CPU_V7
 
-config TARGET_BCM958300K
-       bool "Support bcm958300k"
+config TARGET_BCMCYGNUS
+       bool "Support bcmcygnus"
        select CPU_V7
 
-config TARGET_BCM958622HR
-       bool "Support bcm958622hr"
+config TARGET_BCMNSP
+       bool "Support bcmnsp"
        select CPU_V7
 
 config ARCH_EXYNOS
@@ -861,8 +861,8 @@ source "board/bluegiga/apx4devkit/Kconfig"
 source "board/bluewater/snapper9260/Kconfig"
 source "board/boundary/nitrogen6x/Kconfig"
 source "board/broadcom/bcm28155_ap/Kconfig"
-source "board/broadcom/bcm958300k/Kconfig"
-source "board/broadcom/bcm958622hr/Kconfig"
+source "board/broadcom/bcmcygnus/Kconfig"
+source "board/broadcom/bcmnsp/Kconfig"
 source "board/calao/sbc35_a9g20/Kconfig"
 source "board/calao/tny_a9260/Kconfig"
 source "board/calao/usb_a9263/Kconfig"
index 3279f125f6534e2c1348c9d0561ee2044ba9ffc0..56a9390b0111856fcb335f858ec5bef5a75b2277 100644 (file)
@@ -7,3 +7,6 @@
 
 extra-y        = start.o
 obj-y  = cpu.o
+
+obj-$(CONFIG_MX31) += mx31/
+obj-$(CONFIG_MX35) += mx35/
index deec4274477551b17b13b8e1b601892246d2641c..ead2303373e58420270fc55ef7f570b71e81f419 100644 (file)
@@ -10,3 +10,6 @@
 
 extra-y        = start.o
 obj-y  = cpu.o
+
+obj-$(CONFIG_BCM2835) += bcm2835/
+obj-$(CONFIG_TNETV107X) += tnetv107x/
index 47c23bb2688f6f9cc5070998db1d7a795eb7c92a..7ba28d329fa8f6dc2766891425e086043a50cb9e 100644 (file)
@@ -16,7 +16,7 @@
 #define BIT(x)                 (1 << (x))
 
 #define MAX_PREDIV             64
-#define MAX_POSTDIV            8
+#define MAX_POSTDIV            8UL
 #define MAX_MULT               512
 #define MAX_DIV                        (MAX_PREDIV * MAX_POSTDIV)
 
@@ -362,7 +362,7 @@ static void init_pll(const struct pll_init_data *data)
        pllctl_reg_write(data->pll, ctl, tmp);
 
        mult = data->pll_freq / fpll;
-       for (mult = max(mult, 1); mult <= MAX_MULT; mult++) {
+       for (mult = max(mult, 1UL); mult <= MAX_MULT; mult++) {
                div = (fpll * mult) / data->pll_freq;
                if (div < 1 || div > MAX_DIV)
                        continue;
index 6badb3bb84b7200d9714c47d7f99ab09fdc11430..9f61ea25167d6bfc98ed01f2176cc628a03b9bf4 100644 (file)
@@ -9,3 +9,7 @@ extra-y = start.o
 obj-y  = interrupts.o cpu.o
 
 obj-$(CONFIG_TEGRA) += tegra-common/
+obj-$(CONFIG_TEGRA20) += tegra20/
+obj-$(CONFIG_TEGRA30) += tegra30/
+obj-$(CONFIG_TEGRA114) += tegra114/
+obj-$(CONFIG_TEGRA124) += tegra124/
index aac8043f6a8d0039ed8298164dfd0d6fc571955d..a72e5de99eb78b81e616b773df017d19657e1987 100644 (file)
@@ -9,3 +9,10 @@ extra-y        = start.o
 
 obj-y  += cpu.o
 obj-$(CONFIG_USE_IRQ)  += interrupts.o
+
+obj-$(if $(filter a320,$(SOC)),y) += a320/
+obj-$(CONFIG_AT91FAMILY) += at91/
+obj-$(CONFIG_EP93XX) += ep93xx/
+obj-$(CONFIG_IMX) += imx/
+obj-$(CONFIG_KS8695) += ks8695/
+obj-$(CONFIG_S3C24X0) += s3c24x0/
index 125299537f4dd60fe85b77ac76d7588f107d9fd5..adcea9f6834c0fbfc15e64ce1f8d084dac7e758f 100644 (file)
@@ -13,3 +13,18 @@ ifdef        CONFIG_SPL_NO_CPU_SUPPORT_CODE
 extra-y        :=
 endif
 endif
+
+obj-$(CONFIG_ARMADA100) += armada100/
+obj-$(CONFIG_AT91FAMILY) += at91/
+obj-$(CONFIG_ARCH_DAVINCI) += davinci/
+obj-$(CONFIG_KIRKWOOD) += kirkwood/
+obj-$(if $(filter lpc32xx,$(SOC)),y) += lpc32xx/
+obj-$(CONFIG_MB86R0x) += mb86r0x/
+obj-$(CONFIG_MX25) += mx25/
+obj-$(CONFIG_MX27) += mx27/
+obj-$(if $(filter mxs,$(SOC)),y) += mxs/
+obj-$(CONFIG_ARCH_NOMADIK) += nomadik/
+obj-$(CONFIG_ORION5X) += orion5x/
+obj-$(CONFIG_PANTHEON) += pantheon/
+obj-$(if $(filter spear,$(SOC)),y) += spear/
+obj-$(CONFIG_ARCH_VERSATILE) += versatile/
index d25019a51ef2ab0aa58ac75b923898a885365959..1c54ab7de3bfc3726b1c823e47500a462607b1a4 100644 (file)
@@ -1002,7 +1002,8 @@ static void mxs_power_set_vddx(const struct mxs_vddx_cfg *cfg,
        uint32_t powered_by_linreg = 0;
        int adjust_up, tmp;
 
-       new_brownout = DIV_ROUND(new_target - new_brownout, cfg->step_mV);
+       new_brownout = DIV_ROUND_CLOSEST(new_target - new_brownout,
+                                        cfg->step_mV);
 
        cur_target = readl(cfg->reg);
        cur_target &= cfg->trg_mask;
index afeed4dad84bdddd4557604d6978549879e2dc59..e4197164706e3bc1c86dac97ca5bbd7c7d2cf306 100644 (file)
@@ -37,3 +37,28 @@ obj-$(CONFIG_TEGRA) += tegra-common/
 ifneq (,$(filter s5pc1xx exynos,$(SOC)))
 obj-y += s5p-common/
 endif
+
+obj-$(if $(filter am33xx,$(SOC)),y) += am33xx/
+obj-$(if $(filter armada-xp,$(SOC)),y) += armada-xp/
+obj-$(CONFIG_AT91FAMILY) += at91/
+obj-$(if $(filter bcm281xx,$(SOC)),y) += bcm281xx/
+obj-$(if $(filter bcmcygnus,$(SOC)),y) += bcmcygnus/
+obj-$(if $(filter bcmnsp,$(SOC)),y) += bcmnsp/
+obj-$(CONFIG_ARCH_EXYNOS) += exynos/
+obj-$(CONFIG_ARCH_HIGHBANK) += highbank/
+obj-$(CONFIG_ARCH_KEYSTONE) += keystone/
+obj-$(if $(filter ls102xa,$(SOC)),y) += ls102xa/
+obj-$(if $(filter mx5,$(SOC)),y) += mx5/
+obj-$(CONFIG_MX6) += mx6/
+obj-$(CONFIG_OMAP34XX) += omap3/
+obj-$(CONFIG_OMAP44XX) += omap4/
+obj-$(CONFIG_OMAP54XX) += omap5/
+obj-$(CONFIG_RMOBILE) += rmobile/
+obj-$(CONFIG_ARCH_S5PC1XX) += s5pc1xx/
+obj-$(CONFIG_SOCFPGA) += socfpga/
+obj-$(CONFIG_ARCH_SUNXI) += sunxi/
+obj-$(CONFIG_TEGRA20) += tegra20/
+obj-$(CONFIG_U8500) += u8500/
+obj-$(CONFIG_ARCH_UNIPHIER) += uniphier/
+obj-$(CONFIG_VF610) += vf610/
+obj-$(CONFIG_ZYNQ) += zynq/
index 882a2977979c7fd87c09fe1866731a38da0a663f..4a694d7fe782267b0cd0b32df4004636827a7b0c 100644 (file)
@@ -73,10 +73,6 @@ struct clk {
 
 struct refclk *refclk_str_to_clk(const char *name);
 
-#define U8_MAX ((u8)~0U)
-#define U32_MAX        ((u32)~0U)
-#define U64_MAX        ((u64)~0U)
-
 /* The common clock framework uses u8 to represent a parent index */
 #define PARENT_COUNT_MAX       ((u32)U8_MAX)
 
index 7558effdb3388b7dce91a5561e7df0a5071fa85c..c0c95fbc83dc805953717b48d8701b15c52f7211 100644 (file)
@@ -1422,8 +1422,8 @@ static int clock_calc_best_scalar(unsigned int main_scaler_bits,
                return 1;
 
        for (i = 1; i <= loops; i++) {
-               const unsigned int effective_div = max(min(input_rate / i /
-                                                       target_rate, cap), 1);
+               const unsigned int effective_div =
+                       max(min(input_rate / i / target_rate, cap), 1U);
                const unsigned int effective_rate = input_rate / i /
                                                        effective_div;
                const int error = target_rate - effective_rate;
index 658e4cb715f92647d108780c4c81a70b10295bf0..ae3ad0167d19d5197e95c477ace390e58ead0147 100644 (file)
@@ -151,7 +151,7 @@ static void exynos_spi_copy(unsigned int uboot_size, unsigned int uboot_addr)
        }
 
        for (upto = 0, i = 0; upto < uboot_size; upto += todo, i++) {
-               todo = min(uboot_size - upto, (1 << 15));
+               todo = min(uboot_size - upto, (unsigned int)(1 << 15));
                spi_rx_tx(regs, todo, (void *)(uboot_addr),
                          (void *)(SPI_FLASH_UBOOT_POS), i);
        }
index 423aeb980725c1bd700956f6cbfe50f40294e05b..a0add6643e1715a65a3e05a9b38cc7d08b809b41 100644 (file)
@@ -48,9 +48,9 @@ static void abb_setup_timings(u32 setup)
         */
 
        /* calculate SR2_WTCNT_VALUE */
-       sys_rate = DIV_ROUND(V_OSCK, 1000000);
-       clk_cycles = DIV_ROUND(OMAP_ABB_CLOCK_CYCLES * 10, sys_rate);
-       sr2_cnt = DIV_ROUND(OMAP_ABB_SETTLING_TIME * 10, clk_cycles);
+       sys_rate = DIV_ROUND_CLOSEST(V_OSCK, 1000000);
+       clk_cycles = DIV_ROUND_CLOSEST(OMAP_ABB_CLOCK_CYCLES * 10, sys_rate);
+       sr2_cnt = DIV_ROUND_CLOSEST(OMAP_ABB_SETTLING_TIME * 10, clk_cycles);
 
        setbits_le32(setup,
                     sr2_cnt << (ffs(OMAP_ABB_SETUP_SR2_WTCNT_VALUE_MASK) - 1));
diff --git a/arch/arm/cpu/armv7/tegra114/Makefile b/arch/arm/cpu/armv7/tegra114/Makefile
deleted file mode 100644 (file)
index 77e2319..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-#
-# Copyright (c) 2010-2013, NVIDIA CORPORATION.  All rights reserved.
-#
-# (C) Copyright 2000-2003
-# Wolfgang Denk, DENX Software Engineering, wd@denx.de.
-#
-# This program is free software; you can redistribute it and/or modify it
-# under the terms and conditions of the GNU General Public License,
-# version 2, as published by the Free Software Foundation.
-#
-# This program is distributed in the hope it will be useful, but WITHOUT
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
-# more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
-#
-
-# necessary to create built-in.o
-obj- := __dummy__.o
diff --git a/arch/arm/cpu/armv7/tegra124/Makefile b/arch/arm/cpu/armv7/tegra124/Makefile
deleted file mode 100644 (file)
index 9478d44..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-#
-# (C) Copyright 2013-2014
-# NVIDIA Corporation <www.nvidia.com>
-#
-# SPDX-License-Identifier:     GPL-2.0+
-#
-
-# necessary to create built-in.o
-obj- := __dummy__.o
index d98cec90180f5d133432d57c68bf6759649c0c0c..61efed6464455b2e0a85d0efe54835a9fb9a5d0c 100644 (file)
@@ -45,8 +45,8 @@ static void update_window(struct dc_ctlr *dc, struct disp_ctl_win *win)
        writel(0, &dc->win.h_initial_dda);
        writel(0, &dc->win.v_initial_dda);
 
-       h_dda = (win->w * 0x1000) / max(win->out_w - 1, 1);
-       v_dda = (win->h * 0x1000) / max(win->out_h - 1, 1);
+       h_dda = (win->w * 0x1000) / max(win->out_w - 1, 1U);
+       v_dda = (win->h * 0x1000) / max(win->out_h - 1, 1U);
 
        val = h_dda << H_DDA_INC_SHIFT;
        val |= v_dda << V_DDA_INC_SHIFT;
diff --git a/arch/arm/cpu/armv7/tegra30/Makefile b/arch/arm/cpu/armv7/tegra30/Makefile
deleted file mode 100644 (file)
index 413eba1..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-#
-# Copyright (c) 2010-2012, NVIDIA CORPORATION.  All rights reserved.
-#
-# (C) Copyright 2000-2003
-# Wolfgang Denk, DENX Software Engineering, wd@denx.de.
-#
-# This program is free software; you can redistribute it and/or modify it
-# under the terms and conditions of the GNU General Public License,
-# version 2, as published by the Free Software Foundation.
-#
-# This program is distributed in the hope it will be useful, but WITHOUT
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
-# more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
-#
-
-# necessary to create built-in.o
-obj- := __dummy__.o
index 7d93f59428ea79e7c7f7ee825376e62b2b598061..0c102230aef40785b12699fb1d4a2c4d5af630b7 100644 (file)
@@ -14,3 +14,5 @@ obj-y += exceptions.o
 obj-y  += cache.o
 obj-y  += tlb.o
 obj-y  += transition.o
+
+obj-$(CONFIG_FSL_LSCH3) += fsl-lsch3/
index 532411e1c3627b9951e4d4f79dfb650b8ca6d554..e062da18b113b0eff0550881f583da2e843a66f4 100644 (file)
@@ -16,7 +16,6 @@
 #define _ARMD1_CONFIG_H
 
 #include <asm/arch/armada100.h>
-#define CONFIG_ARM926EJS       1       /* Basic Architecture */
 /* default Dcache Line length for armada100 */
 #define CONFIG_SYS_CACHELINE_SIZE       32
 
index 25bb071e918535009c1b87efdf5dec8871239abf..d177bdcae56cd72565ab057ee12743d1e3891175 100644 (file)
@@ -7,7 +7,6 @@
 #define __AT91RM9200_H__
 
 #define CONFIG_AT91FAMILY      /* it's a member of AT91 family */
-#define CONFIG_ARM920T         /* it's an ARM920T Core */
 #define CONFIG_ARCH_CPU_INIT   /* we need arch_cpu_init() for hw timers */
 #define CONFIG_AT91_GPIO       /* and require always gpio features */
 
index bb48875290371f7d4dafd5a1e1caf7597d16c88c..8950d674093a09a1663d8643fec4385dc2b16197 100644 (file)
@@ -21,7 +21,6 @@
 /*
  * defines to be used in other places
  */
-#define CONFIG_ARM926EJS       /* ARM926EJS Core */
 #define CONFIG_AT91FAMILY      /* it's a member of AT91 */
 
 /*
index f7ad11349a787f1770c2686b882af5cc66df5f42..6dfcf4c0c865706205a790245a57b747cb74af07 100644 (file)
@@ -21,7 +21,6 @@
 /*
  * defines to be used in other places
  */
-#define CONFIG_ARM926EJS       /* ARM926EJS Core */
 #define CONFIG_AT91FAMILY      /* it's a member of AT91 */
 
 /*
index 3206af8c3ea2e310d38e68a21b03a274486b426c..64a3888e227cc7bed21f2f3068d2340ab199b91b 100644 (file)
@@ -17,7 +17,6 @@
 /*
  * defines to be used in other places
  */
-#define CONFIG_ARM926EJS       /* ARM926EJS Core */
 #define CONFIG_AT91FAMILY      /* it's a member of AT91 */
 
 /*
index 9cbfc277bd6b0ca459d2fd70cc03af65e37f23e5..6df8cdb56d07bb72501272b45e517976b017c56d 100644 (file)
@@ -15,7 +15,6 @@
 /*
  * defines to be used in other places
  */
-#define CONFIG_ARM926EJS       /* ARM926EJS Core */
 #define CONFIG_AT91FAMILY      /* it's a member of AT91 */
 
 /*
index 00b6aa469fe3a432bf06564c2ab6ac1a64076125..3a8e6d62ce51e351b51c9253109c70278fdc839d 100644 (file)
@@ -17,7 +17,6 @@
 /*
  * defines to be used in other places
  */
-#define CONFIG_ARM926EJS       /* ARM926EJS Core */
 #define CONFIG_AT91FAMILY      /* it's a member of AT91 */
 
 /*
index d49c18480dca68ac56c9eec2aa83ba549e7ee002..36a5cdf476882bb6f4161ef12dd33d625482fbaf 100644 (file)
@@ -12,7 +12,6 @@
 #ifndef __AT91SAM9X5_H__
 #define __AT91SAM9X5_H__
 
-#define CONFIG_ARM926EJS       /* ARM926EJS Core */
 #define CONFIG_AT91FAMILY      /* it's a member of AT91 family */
 
 /*
index f7bc4ad33834b17ff2c610f777886af1f80e8442..227ba8082551b039e8ace1d7ee77ad3e70abd60b 100644 (file)
@@ -16,7 +16,6 @@
 /*
  * defines to be used in other places
  */
-#define CONFIG_ARMV7           /* ARM A5 Core */
 #define CONFIG_AT91FAMILY      /* it's a member of AT91 */
 
 /*
index ccc8e4e7d64b57bc9d1e94587b5e8d0e42d3d690..e77ac400d8d09e819bcfb1aa70143821df3e71e8 100644 (file)
@@ -24,7 +24,6 @@
 #endif /* CONFIG_KW88F6281 */
 
 #include <asm/arch/soc.h>
-#define CONFIG_ARM926EJS       1       /* Basic Architecture */
 #define CONFIG_SYS_CACHELINE_SIZE      32
                                /* default Dcache Line length for kirkwood */
 #define CONFIG_MD5     /* get_random_hex on krikwood needs MD5 support */
index c985401d3c551e486173b62fa894cdd5efae9fb5..8f6426bc1b0184d4c362487ca499268aa7e783f1 100644 (file)
@@ -10,7 +10,6 @@
 #define _LPC32XX_CONFIG_H
 
 /* Basic CPU architecture */
-#define CONFIG_ARM926EJS
 #define CONFIG_ARCH_CPU_INIT
 
 #define CONFIG_NR_DRAM_BANKS_MAX       2
index fdccd222dd4e439bc0eae2c8da95e01931b4bf86..1eed7b1d569d2ac51e8cfca0321650547674e56d 100644 (file)
@@ -11,7 +11,6 @@
 
 #include <asm/arch/pantheon.h>
 
-#define CONFIG_ARM926EJS       1       /* Basic Architecture */
 /* default Dcache Line length for pantheon */
 #define CONFIG_SYS_CACHELINE_SIZE      32
 
index 4e597a4c1d16281a7efbaa2f15ca339db0109835..f1c0792ce8da0afcf1b17b68f6cd9b7547b07822 100644 (file)
@@ -11,7 +11,7 @@
 
 __weak void flush_cache(unsigned long start, unsigned long size)
 {
-#if defined(CONFIG_ARM1136)
+#if defined(CONFIG_CPU_ARM1136)
 
 #if !defined(CONFIG_SYS_ICACHE_OFF)
        asm("mcr p15, 0, r1, c7, c5, 0"); /* invalidate I cache */
@@ -21,14 +21,14 @@ __weak void flush_cache(unsigned long start, unsigned long size)
        asm("mcr p15, 0, r1, c7, c14, 0"); /* Clean+invalidate D cache */
 #endif
 
-#endif /* CONFIG_ARM1136 */
+#endif /* CONFIG_CPU_ARM1136 */
 
-#ifdef CONFIG_ARM926EJS
+#ifdef CONFIG_CPU_ARM926EJS
        /* test and clean, page 2-23 of arm926ejs manual */
        asm("0: mrc p15, 0, r15, c7, c10, 3\n\t" "bne 0b\n" : : : "memory");
        /* disable write buffer as well (page 2-22) */
        asm("mcr p15, 0, %0, c7, c10, 4" : : "r" (0));
-#endif /* CONFIG_ARM926EJS */
+#endif /* CONFIG_CPU_ARM926EJS */
        return;
 }
 
index 5e117212574af315bb3df2b3950271c8ea5bd0ce..00cede3fd981be7be855df45f0a84ef727c4edc1 100644 (file)
@@ -16,3 +16,5 @@ obj-y                 += cache.o
 obj-y                  += interrupts.o
 obj-$(CONFIG_PORTMUX_PIO) += portmux-pio.o
 obj-$(CONFIG_PORTMUX_GPIO) += portmux-gpio.o
+
+obj-$(if $(filter at32ap700x,$(SOC)),y) += at32ap700x/
index d5dbe3b908f9ef08fdaea5b1d213245b4ef044d7..0fc6088e3ee10e23584df8203a92ad39dfd15b33 100644 (file)
@@ -72,7 +72,7 @@ unsigned long __gclk_set_rate(unsigned int id, enum gclk_parent parent,
                sm_writel(PM_GCCTRL(id), parent | SM_BIT(CEN));
                rate = parent_rate;
        } else {
-               divider = min(255, divider / 2 - 1);
+               divider = min(255UL, divider / 2 - 1);
                sm_writel(PM_GCCTRL(id), parent | SM_BIT(CEN) | SM_BIT(DIVEN)
                                | SM_BF(DIV, divider));
                rate = parent_rate / (2 * (divider + 1));
index b8be3182a0906ff309ff8cb3ccc744b95fe8d21a..b0abeda90aec71025aa8568426bc93b7620d28bc 100644 (file)
@@ -168,7 +168,7 @@ static int jtag_getc(struct stdio_dev *dev)
                inbound_len = emudat;
        } else {
                /* store the bytes */
-               leftovers_len = min(4, inbound_len);
+               leftovers_len = min((size_t)4, inbound_len);
                inbound_len -= leftovers_len;
                leftovers = emudat;
        }
index f0a061b47ab1ee5555294cc858f4c6e8be415059..211df7b430c246b28b3977d6ecfadced44dac0ef 100644 (file)
@@ -121,7 +121,7 @@ static void dma_calc_size(unsigned long ldst, unsigned long lsrc, size_t count,
        *dshift = WDSIZE_P;
 #endif
 
-       *bpos = min(limit, ffs(ldst | lsrc | count)) - 1;
+       *bpos = min(limit, (unsigned long)ffs(ldst | lsrc | count)) - 1;
 }
 
 /* This version misbehaves for count values of 0 and 2^16+.
@@ -157,7 +157,7 @@ void dma_memcpy_nocache(void *dst, const void *src, size_t count)
 
 #ifdef PSIZE
        /* The max memory DMA peripheral transfer size is 4 bytes. */
-       dsize |= min(2, bpos) << PSIZE_P;
+       dsize |= min(2UL, bpos) << PSIZE_P;
 #endif
 
        /* Copy sram functions from sdram to sram */
index e0e6309c6f04e44c62825e02c9641c6adf51fb59..fa82dd375f4faa4f0a05867942e98049ee4c0dbf 100644 (file)
@@ -8,3 +8,5 @@
 extra-y        = start.o
 obj-y  = cache.o
 obj-y  += cpu.o interrupts.o time.o
+
+obj-$(CONFIG_SOC_AU1X00) += au1x00/
index a3dac70798d999de87da3d7851fabea03750a449..74bdb773032f10bac9a19d8d649f628436a919b7 100644 (file)
@@ -54,8 +54,6 @@
 #define readl(a)     au_readl((long)(a))
 #define writel(v,a)  au_writel((v),(int)(a))
 
-#define min_t(type,x,y) ({ type __x = (x); type __y = (y); __x < __y ? __x: __y; })
-
 #define DEBUG
 #ifdef DEBUG
 #define dbg(format, arg...) printf("DEBUG: " format "\n", ## arg)
index 206d304d4c5ff597f41b248c7c2af01c525d93f3..8ab1fcea26d9fe68a6f5ce16a73f6f23211a1874 100644 (file)
@@ -9,7 +9,7 @@
 # SPDX-License-Identifier:     GPL-2.0+
 #
 
-# necessary to create built-in.o
-obj- := __dummy__.o
-
 extra-y        = start.o
+
+obj-$(if $(filter ag101,$(SOC)),y) += ag101/
+obj-$(if $(filter ag102,$(SOC)),y) += ag102/
index 3c8b2d904fef6942874551516b385808c8de83f1..b7c1b5594a003a4c7b28f98ec3db67d48d199061 100644 (file)
@@ -42,8 +42,6 @@
 #define readl(a) (*((volatile u32 *)(a)))
 #define writel(a, b) (*((volatile u32 *)(b)) = ((volatile u32)a))
 
-#define min_t(type,x,y) ({ type __x = (x); type __y = (y); __x < __y ? __x: __y; })
-
 #ifdef DEBUG
 #define dbg(format, arg...) printf("DEBUG: " format "\n", ## arg)
 #else
index 129ec662fe8a84ba289bb914cddd296eb8e08967..4adba95aaf804995cf6ed6a81b67e5534f1e2cd7 100644 (file)
@@ -300,7 +300,7 @@ unsigned int setup_ddr_tlbs_phys(phys_addr_t p_addr,
        unsigned int ram_tlb_address = (unsigned int)CONFIG_SYS_DDR_SDRAM_BASE;
        u64 memsize = (u64)memsize_in_meg << 20;
 
-       memsize = min(memsize, CONFIG_MAX_MEM_MAPPED);
+       memsize = min(memsize, (u64)CONFIG_MAX_MEM_MAPPED);
        memsize = tlb_map_range(ram_tlb_address, p_addr, memsize, TLB_MAP_RAM);
 
        if (memsize)
index f8d03cba2d6f7a27dd69d3b5a5f793f166e87dcb..71bb9d776fa59c24303d985d21a269e10938a344 100644 (file)
@@ -1661,7 +1661,7 @@ static void program_mode(unsigned long *dimm_populated,
                for (dimm_num = 0; dimm_num < num_dimm_banks; dimm_num++) {
                        /* If a dimm is installed in a particular slot ... */
                        if (dimm_populated[dimm_num] != SDRAM_NONE)
-                               t_wr_ns = max(t_wr_ns,
+                               t_wr_ns = max(t_wr_ns, (unsigned long)
                                              spd_read(iic0_dimm_addr[dimm_num], 36) >> 2);
                }
 
@@ -1838,12 +1838,18 @@ static void program_tr(unsigned long *dimm_populated,
                        else
                                sdram_ddr1 = false;
 
-                       t_rcd_ns = max(t_rcd_ns, spd_read(iic0_dimm_addr[dimm_num], 29) >> 2);
-                       t_rrd_ns = max(t_rrd_ns, spd_read(iic0_dimm_addr[dimm_num], 28) >> 2);
-                       t_rp_ns  = max(t_rp_ns,  spd_read(iic0_dimm_addr[dimm_num], 27) >> 2);
-                       t_ras_ns = max(t_ras_ns, spd_read(iic0_dimm_addr[dimm_num], 30));
-                       t_rc_ns  = max(t_rc_ns,  spd_read(iic0_dimm_addr[dimm_num], 41));
-                       t_rfc_ns = max(t_rfc_ns, spd_read(iic0_dimm_addr[dimm_num], 42));
+                       t_rcd_ns = max(t_rcd_ns,
+                                      (unsigned long)spd_read(iic0_dimm_addr[dimm_num], 29) >> 2);
+                       t_rrd_ns = max(t_rrd_ns,
+                                      (unsigned long)spd_read(iic0_dimm_addr[dimm_num], 28) >> 2);
+                       t_rp_ns  = max(t_rp_ns,
+                                      (unsigned long)spd_read(iic0_dimm_addr[dimm_num], 27) >> 2);
+                       t_ras_ns = max(t_ras_ns,
+                                      (unsigned long)spd_read(iic0_dimm_addr[dimm_num], 30));
+                       t_rc_ns  = max(t_rc_ns,
+                                      (unsigned long)spd_read(iic0_dimm_addr[dimm_num], 41));
+                       t_rfc_ns = max(t_rfc_ns,
+                                      (unsigned long)spd_read(iic0_dimm_addr[dimm_num], 42));
                }
        }
 
@@ -1916,9 +1922,12 @@ static void program_tr(unsigned long *dimm_populated,
                for (dimm_num = 0; dimm_num < num_dimm_banks; dimm_num++) {
                        /* If a dimm is installed in a particular slot ... */
                        if (dimm_populated[dimm_num] != SDRAM_NONE) {
-                               t_wpc_ns = max(t_wtr_ns, spd_read(iic0_dimm_addr[dimm_num], 36) >> 2);
-                               t_wtr_ns = max(t_wtr_ns, spd_read(iic0_dimm_addr[dimm_num], 37) >> 2);
-                               t_rpc_ns = max(t_rpc_ns, spd_read(iic0_dimm_addr[dimm_num], 38) >> 2);
+                               t_wpc_ns = max(t_wtr_ns,
+                                              (unsigned long)spd_read(iic0_dimm_addr[dimm_num], 36) >> 2);
+                               t_wtr_ns = max(t_wtr_ns,
+                                              (unsigned long)spd_read(iic0_dimm_addr[dimm_num], 37) >> 2);
+                               t_rpc_ns = max(t_rpc_ns,
+                                              (unsigned long)spd_read(iic0_dimm_addr[dimm_num], 38) >> 2);
                        }
                }
 
@@ -2314,7 +2323,8 @@ static void program_ecc(unsigned long *dimm_populated,
        for (dimm_num = 0; dimm_num < MAXDIMMS; dimm_num++) {
                /* If a dimm is installed in a particular slot ... */
                if (dimm_populated[dimm_num] != SDRAM_NONE)
-                       ecc = max(ecc, spd_read(iic0_dimm_addr[dimm_num], 11));
+                       ecc = max(ecc,
+                                 (unsigned long)spd_read(iic0_dimm_addr[dimm_num], 11));
        }
        if (ecc == 0)
                return;
index d1e78f6b0c3c78901d45fe43faef782c604f1d91..65a0675446e5bf41030d80e8dea1c1c2e18f76c5 100644 (file)
@@ -40,8 +40,6 @@
 #define readl(a) (*((volatile u32 *)(a)))
 #define writel(a, b) (*((volatile u32 *)(b)) = ((volatile u32)a))
 
-#define min_t(type,x,y) ({ type __x = (x); type __y = (y); __x < __y ? __x: __y; })
-
 #ifdef DEBUG
 #define dbg(format, arg...) printf("DEBUG: " format "\n", ## arg)
 #else
index 33099a492dbe92ac7b31f20fe26f3b625b22f6f6..ef15e7ac92f292dd482cf65cf7bf9d2c05da91dc 100644 (file)
@@ -126,7 +126,7 @@ void arch_lmb_reserve(struct lmb *lmb)
 #endif
 
        size = min(bootm_size, get_effective_memsize());
-       size = min(size, CONFIG_SYS_LINUX_LOWMEM_MAX_SIZE);
+       size = min(size, (ulong)CONFIG_SYS_LINUX_LOWMEM_MAX_SIZE);
 
        if (size < bootm_size) {
                ulong base = bootmap_base + size;
index 1c4aa3f9bc4c4d054b7cbcd502163693a44319bc..31c93443dba008036e49723fe284eab58a40bda1 100644 (file)
@@ -385,7 +385,7 @@ const char *os_dirent_get_typename(enum os_dirent_t type)
        return os_dirent_typename[OS_FILET_UNKNOWN];
 }
 
-ssize_t os_get_filesize(const char *fname)
+int os_get_filesize(const char *fname, loff_t *size)
 {
        struct stat buf;
        int ret;
@@ -393,7 +393,8 @@ ssize_t os_get_filesize(const char *fname)
        ret = stat(fname, &buf);
        if (ret)
                return ret;
-       return buf.st_size;
+       *size = buf.st_size;
+       return 0;
 }
 
 void os_putc(int ch)
@@ -427,11 +428,11 @@ int os_read_ram_buf(const char *fname)
 {
        struct sandbox_state *state = state_get_current();
        int fd, ret;
-       int size;
+       loff_t size;
 
-       size = os_get_filesize(fname);
-       if (size < 0)
-               return -ENOENT;
+       ret = os_get_filesize(fname, &size);
+       if (ret < 0)
+               return ret;
        if (size != state->ram_size)
                return -ENOSPC;
        fd = open(fname, O_RDONLY);
index 53a99ae71b1361131637b0827a8b2afb142273e7..0df77704c6f769c7085940ca81592d064c7362af 100644 (file)
@@ -39,7 +39,7 @@ int sandbox_early_getopt_check(void)
 
        max_arg_len = 0;
        for (i = 0; i < num_options; ++i)
-               max_arg_len = max(strlen(sb_opt[i]->flag), max_arg_len);
+               max_arg_len = max((int)strlen(sb_opt[i]->flag), max_arg_len);
        max_noarg_len = max_arg_len + 7;
 
        for (i = 0; i < num_options; ++i) {
index 59adad653c2a9f59741ec0276363ea73eee2a3b2..ba73b7e251040831f45a38d29132479b605c0abc 100644 (file)
@@ -49,14 +49,14 @@ static int state_ensure_space(int extra_size)
 
 static int state_read_file(struct sandbox_state *state, const char *fname)
 {
-       int size;
+       loff_t size;
        int ret;
        int fd;
 
-       size = os_get_filesize(fname);
-       if (size < 0) {
+       ret = os_get_filesize(fname, &size);
+       if (ret < 0) {
                printf("Cannot find sandbox state file '%s'\n", fname);
-               return -ENOENT;
+               return ret;
        }
        state->state_fdt = os_malloc(size);
        if (!state->state_fdt) {
index 0dba8acbb2b320671541c939c739b98402f100b9..6e29868f5f8f90fcb03e115e6375e02ab90a6997 100644 (file)
@@ -12,9 +12,81 @@ choice
 
 config TARGET_COREBOOT
        bool "Support coreboot"
+       help
+         This target is used for running U-Boot on top of Coreboot. In
+         this case Coreboot does the early inititalisation, and U-Boot
+         takes over once the RAM, video and CPU are fully running.
+         U-Boot is loaded as a fallback payload from Coreboot, in
+         Coreboot terminology. This method was used for the Chromebook
+         Pixel when launched.
+
+config TARGET_CHROMEBOOK_LINK
+       bool "Support Chromebook link"
+       help
+         This is the Chromebook Pixel released in 2013. It uses an Intel
+         i5 Ivybridge which is a die-shrink of Sandybridge, with 4GB of
+         SDRAM. It has a Panther Point platform controller hub, PCIe
+         WiFi and Bluetooth. It also includes a 720p webcam, USB SD
+         reader, microphone and speakers, display port and 32GB SATA
+         solid state drive. There is a Chrome OS EC connected on LPC,
+         and it provides a 2560x1700 high resolution touch-enabled LCD
+         display.
 
 endchoice
 
-source "board/chromebook-x86/coreboot/Kconfig"
+config RAMBASE
+       hex
+       default 0x100000
+
+config RAMTOP
+       hex
+       default 0x200000
+
+config XIP_ROM_SIZE
+       hex
+       default 0x10000
+
+config CPU_ADDR_BITS
+       int
+       default 36
+
+config HPET_ADDRESS
+       hex
+       default 0xfed00000 if !HPET_ADDRESS_OVERRIDE
+
+config SMM_TSEG
+       bool
+       default n
+
+config SMM_TSEG_SIZE
+       hex
+
+config ROM_SIZE
+       hex
+       default 0x800000
+
+config HAVE_INTEL_ME
+       bool "Platform requires Intel Management Engine"
+       help
+         Newer higher-end devices have an Intel Management Engine (ME)
+         which is a very large binary blob (typically 1.5MB) which is
+         required for the platform to work. This enforces a particular
+         SPI flash format. You will need to supply the me.bin file in
+         your board directory.
+
+config X86_RAMTEST
+       bool "Perform a simple RAM test after SDRAM initialisation"
+       help
+         If there is something wrong with SDRAM then the platform will
+         often crash within U-Boot or the kernel. This option enables a
+         very simple RAM test that quickly checks whether the SDRAM seems
+         to work correctly. It is not exhaustive but can save time by
+         detecting obvious failures.
+
+source "arch/x86/cpu/ivybridge/Kconfig"
+
+source "board/coreboot/coreboot/Kconfig"
+
+source "board/google/chromebook_link/Kconfig"
 
 endmenu
index 3e7fedb913bed80965c0ca4e2765a35aaec98017..bb2da4637e59afa7504f86a65ef5e7c28f0b0cee 100644 (file)
@@ -15,7 +15,6 @@ PF_CPPFLAGS_X86   := $(call cc-option, -fno-toplevel-reorder, \
                     $(call cc-option, -mpreferred-stack-boundary=2)
 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
index 9d38ef73a7d302a41fb2e536d3b45be2cfb3a9aa..2b9e9b9cf07f0996650f4c16b1c36aa13e579206 100644 (file)
@@ -11,3 +11,6 @@
 extra-y        = start.o
 obj-$(CONFIG_X86_RESET_VECTOR) += resetvec.o start16.o
 obj-y  += interrupts.o cpu.o call64.o
+
+obj-$(CONFIG_SYS_COREBOOT) += coreboot/
+obj-$(CONFIG_PCI) += pci.o
index cd0bf4ed31608e6efd66cbb5678c4c3c968cf65a..35e6cdd74164fde67a1f95a06a0fe831927842ba 100644 (file)
 # SPDX-License-Identifier:     GPL-2.0+
 #
 
-obj-$(CONFIG_SYS_COREBOOT) += car.o
-obj-$(CONFIG_SYS_COREBOOT) += coreboot.o
-obj-$(CONFIG_SYS_COREBOOT) += tables.o
-obj-$(CONFIG_SYS_COREBOOT) += ipchecksum.o
-obj-$(CONFIG_SYS_COREBOOT) += sdram.o
-obj-$(CONFIG_SYS_COREBOOT) += timestamp.o
+obj-y += car.o
+obj-y += coreboot.o
+obj-y += tables.o
+obj-y += ipchecksum.o
+obj-y += sdram.o
+obj-y += timestamp.o
 obj-$(CONFIG_PCI) += pci.o
index e24f13afaf1efcb8f7579c3763fce4145958583e..2df72884f9232cb8203fb1f308f56829d58b1168 100644 (file)
 #include <ns16550.h>
 #include <asm/msr.h>
 #include <asm/cache.h>
+#include <asm/cpu.h>
 #include <asm/io.h>
-#include <asm/arch-coreboot/tables.h>
-#include <asm/arch-coreboot/sysinfo.h>
+#include <asm/arch/tables.h>
+#include <asm/arch/sysinfo.h>
 #include <asm/arch/timestamp.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
-/*
- * Miscellaneous platform dependent initializations
- */
-int cpu_init_f(void)
+int arch_cpu_init(void)
 {
        int ret = get_coreboot_info(&lib_sysinfo);
-       if (ret != 0)
+       if (ret != 0) {
                printf("Failed to parse coreboot tables.\n");
+               return ret;
+       }
 
        timestamp_init();
 
-       return ret;
+       return x86_cpu_init_f();
 }
 
 int board_early_init_f(void)
@@ -50,27 +50,9 @@ int board_early_init_r(void)
        return 0;
 }
 
-void show_boot_progress(int val)
+int print_cpuinfo(void)
 {
-#if MIN_PORT80_KCLOCKS_DELAY
-       /*
-        * Scale the time counter reading to avoid using 64 bit arithmetics.
-        * Can't use get_timer() here becuase it could be not yet
-        * initialized or even implemented.
-        */
-       if (!gd->arch.tsc_prev) {
-               gd->arch.tsc_base_kclocks = rdtsc() / 1000;
-               gd->arch.tsc_prev = 0;
-       } else {
-               uint32_t now;
-
-               do {
-                       now = rdtsc() / 1000 - gd->arch.tsc_base_kclocks;
-               } while (now < (gd->arch.tsc_prev + MIN_PORT80_KCLOCKS_DELAY));
-               gd->arch.tsc_prev = now;
-       }
-#endif
-       outb(val, 0x80);
+       return default_print_cpuinfo();
 }
 
 int last_stage_init(void)
@@ -98,7 +80,7 @@ int board_eth_init(bd_t *bis)
 #define MTRRphysBase_MSR(reg) (0x200 + 2 * (reg))
 #define MTRRphysMask_MSR(reg) (0x200 + 2 * (reg) + 1)
 
-int board_final_cleanup(void)
+void board_final_cleanup(void)
 {
        /* Un-cache the ROM so the kernel has one
         * more MTRR available.
@@ -120,8 +102,6 @@ int board_final_cleanup(void)
        /* Issue SMI to Coreboot to lock down ME and registers */
        printf("Finalizing Coreboot\n");
        outb(0xcb, 0xb2);
-
-       return 0;
 }
 
 void panic_puts(const char *str)
index 57733d8f0dd1dbb51c7cee65084702137d5ec2a0..5f6c00945bb292ec706b6afe1a152ab0618e090b 100644 (file)
@@ -30,7 +30,7 @@
  */
 
 #include <compiler.h>
-#include <asm/arch-coreboot/ipchecksum.h>
+#include <asm/arch/ipchecksum.h>
 
 unsigned short ipchksum(const void *vptr, unsigned long nbytes)
 {
index 33f16a3079381e15f694b94418791e5aa96d255a..6a3dd9391432017898e85c714100ee8e53232ce2 100644 (file)
 #include <pci.h>
 #include <asm/pci.h>
 
-static struct pci_controller coreboot_hose;
-
 static void config_pci_bridge(struct pci_controller *hose, pci_dev_t dev,
                              struct pci_config_table *table)
 {
        u8 secondary;
        hose->read_byte(hose, dev, PCI_SECONDARY_BUS, &secondary);
-       hose->last_busno = max(hose->last_busno, secondary);
+       hose->last_busno = max(hose->last_busno, (int)secondary);
        pci_hose_scan_bus(hose, secondary);
 }
 
@@ -31,19 +29,13 @@ static struct pci_config_table pci_coreboot_config_table[] = {
        {}
 };
 
-void pci_init_board(void)
+void board_pci_setup_hose(struct pci_controller *hose)
 {
-       coreboot_hose.config_table = pci_coreboot_config_table;
-       coreboot_hose.first_busno = 0;
-       coreboot_hose.last_busno = 0;
-
-       pci_set_region(coreboot_hose.regions + 0, 0x0, 0x0, 0xffffffff,
-               PCI_REGION_MEM);
-       coreboot_hose.region_count = 1;
-
-       pci_setup_type1(&coreboot_hose);
-
-       pci_register_hose(&coreboot_hose);
+       hose->config_table = pci_coreboot_config_table;
+       hose->first_busno = 0;
+       hose->last_busno = 0;
 
-       pci_hose_scan(&coreboot_hose);
+       pci_set_region(hose->regions + 0, 0x0, 0x0, 0xffffffff,
+                      PCI_REGION_MEM);
+       hose->region_count = 1;
 }
index 959feaaea3407b7c92da443b22c1c795ab4753f9..e98a2302e79d83c51ff63a43a74e206d507b861a 100644 (file)
 #include <asm/e820.h>
 #include <asm/u-boot-x86.h>
 #include <asm/global_data.h>
+#include <asm/init_helpers.h>
 #include <asm/processor.h>
 #include <asm/sections.h>
+#include <asm/zimage.h>
 #include <asm/arch/sysinfo.h>
 #include <asm/arch/tables.h>
 
@@ -22,7 +24,7 @@ unsigned install_e820_map(unsigned max_entries, struct e820entry *entries)
 {
        int i;
 
-       unsigned num_entries = min(lib_sysinfo.n_memranges, max_entries);
+       unsigned num_entries = min((unsigned)lib_sysinfo.n_memranges, max_entries);
        if (num_entries < lib_sysinfo.n_memranges) {
                printf("Warning: Limiting e820 map to %d entries.\n",
                        num_entries);
@@ -79,7 +81,7 @@ ulong board_get_usable_ram_top(ulong total_size)
        return (ulong)dest_addr;
 }
 
-int dram_init_f(void)
+int dram_init(void)
 {
        int i;
        phys_size_t ram_size = 0;
@@ -94,10 +96,11 @@ int dram_init_f(void)
        gd->ram_size = ram_size;
        if (ram_size == 0)
                return -1;
-       return 0;
+
+       return calculate_relocation_address();
 }
 
-int dram_init_banksize(void)
+void dram_init_banksize(void)
 {
        int i, j;
 
@@ -114,10 +117,4 @@ int dram_init_banksize(void)
                        }
                }
        }
-       return 0;
-}
-
-int dram_init(void)
-{
-       return dram_init_banksize();
 }
index 0d91adc5e47b60b84c363f0516af7b64c8336634..92b75286b188f3e9f383582e05efb96cf578cc7c 100644 (file)
@@ -8,9 +8,9 @@
  */
 
 #include <common.h>
-#include <asm/arch-coreboot/ipchecksum.h>
-#include <asm/arch-coreboot/sysinfo.h>
-#include <asm/arch-coreboot/tables.h>
+#include <asm/arch/ipchecksum.h>
+#include <asm/arch/sysinfo.h>
+#include <asm/arch/tables.h>
 
 /*
  * This needs to be in the .data section so that it's copied over during
index 2e252532d61363b4501c76f327193e8f877aeb6f..b391b7ade47298336bb9042c9b3cbb8f2bebde14 100644 (file)
@@ -13,6 +13,9 @@
  * Sysgo Real-Time Solutions, GmbH <www.elinos.com>
  * Alex Zuepke <azu@sysgo.de>
  *
+ * Part of this file is adapted from coreboot
+ * src/arch/x86/lib/cpu.c
+ *
  * SPDX-License-Identifier:    GPL-2.0+
  */
 
 #include <malloc.h>
 #include <asm/control_regs.h>
 #include <asm/cpu.h>
+#include <asm/post.h>
 #include <asm/processor.h>
 #include <asm/processor-flags.h>
 #include <asm/interrupt.h>
 #include <linux/compiler.h>
 
+DECLARE_GLOBAL_DATA_PTR;
+
 /*
  * Constructor for a conventional segment GDT (or LDT) entry
  * This is a macro so it can be used in initialisers
@@ -43,6 +49,52 @@ struct gdt_ptr {
        u32 ptr;
 } __packed;
 
+struct cpu_device_id {
+       unsigned vendor;
+       unsigned device;
+};
+
+struct cpuinfo_x86 {
+       uint8_t x86;            /* CPU family */
+       uint8_t x86_vendor;     /* CPU vendor */
+       uint8_t x86_model;
+       uint8_t x86_mask;
+};
+
+/*
+ * List of cpu vendor strings along with their normalized
+ * id values.
+ */
+static struct {
+       int vendor;
+       const char *name;
+} x86_vendors[] = {
+       { X86_VENDOR_INTEL,     "GenuineIntel", },
+       { X86_VENDOR_CYRIX,     "CyrixInstead", },
+       { X86_VENDOR_AMD,       "AuthenticAMD", },
+       { X86_VENDOR_UMC,       "UMC UMC UMC ", },
+       { X86_VENDOR_NEXGEN,    "NexGenDriven", },
+       { X86_VENDOR_CENTAUR,   "CentaurHauls", },
+       { X86_VENDOR_RISE,      "RiseRiseRise", },
+       { X86_VENDOR_TRANSMETA, "GenuineTMx86", },
+       { X86_VENDOR_TRANSMETA, "TransmetaCPU", },
+       { X86_VENDOR_NSC,       "Geode by NSC", },
+       { X86_VENDOR_SIS,       "SiS SiS SiS ", },
+};
+
+static const char *const x86_vendor_name[] = {
+       [X86_VENDOR_INTEL]     = "Intel",
+       [X86_VENDOR_CYRIX]     = "Cyrix",
+       [X86_VENDOR_AMD]       = "AMD",
+       [X86_VENDOR_UMC]       = "UMC",
+       [X86_VENDOR_NEXGEN]    = "NexGen",
+       [X86_VENDOR_CENTAUR]   = "Centaur",
+       [X86_VENDOR_RISE]      = "Rise",
+       [X86_VENDOR_TRANSMETA] = "Transmeta",
+       [X86_VENDOR_NSC]       = "NSC",
+       [X86_VENDOR_SIS]       = "SiS",
+};
+
 static void load_ds(u32 segment)
 {
        asm volatile("movl %0, %%ds" : : "r" (segment * X86_GDT_ENTRY_SIZE));
@@ -115,6 +167,129 @@ int __weak x86_cleanup_before_linux(void)
        return 0;
 }
 
+/*
+ * Cyrix CPUs without cpuid or with cpuid not yet enabled can be detected
+ * by the fact that they preserve the flags across the division of 5/2.
+ * PII and PPro exhibit this behavior too, but they have cpuid available.
+ */
+
+/*
+ * Perform the Cyrix 5/2 test. A Cyrix won't change
+ * the flags, while other 486 chips will.
+ */
+static inline int test_cyrix_52div(void)
+{
+       unsigned int test;
+
+       __asm__ __volatile__(
+            "sahf\n\t"         /* clear flags (%eax = 0x0005) */
+            "div %b2\n\t"      /* divide 5 by 2 */
+            "lahf"             /* store flags into %ah */
+            : "=a" (test)
+            : "0" (5), "q" (2)
+            : "cc");
+
+       /* AH is 0x02 on Cyrix after the divide.. */
+       return (unsigned char) (test >> 8) == 0x02;
+}
+
+/*
+ *     Detect a NexGen CPU running without BIOS hypercode new enough
+ *     to have CPUID. (Thanks to Herbert Oppmann)
+ */
+
+static int deep_magic_nexgen_probe(void)
+{
+       int ret;
+
+       __asm__ __volatile__ (
+               "       movw    $0x5555, %%ax\n"
+               "       xorw    %%dx,%%dx\n"
+               "       movw    $2, %%cx\n"
+               "       divw    %%cx\n"
+               "       movl    $0, %%eax\n"
+               "       jnz     1f\n"
+               "       movl    $1, %%eax\n"
+               "1:\n"
+               : "=a" (ret) : : "cx", "dx");
+       return  ret;
+}
+
+static bool has_cpuid(void)
+{
+       return flag_is_changeable_p(X86_EFLAGS_ID);
+}
+
+static int build_vendor_name(char *vendor_name)
+{
+       struct cpuid_result result;
+       result = cpuid(0x00000000);
+       unsigned int *name_as_ints = (unsigned int *)vendor_name;
+
+       name_as_ints[0] = result.ebx;
+       name_as_ints[1] = result.edx;
+       name_as_ints[2] = result.ecx;
+
+       return result.eax;
+}
+
+static void identify_cpu(struct cpu_device_id *cpu)
+{
+       char vendor_name[16];
+       int i;
+
+       vendor_name[0] = '\0'; /* Unset */
+       cpu->device = 0; /* fix gcc 4.4.4 warning */
+
+       /* Find the id and vendor_name */
+       if (!has_cpuid()) {
+               /* Its a 486 if we can modify the AC flag */
+               if (flag_is_changeable_p(X86_EFLAGS_AC))
+                       cpu->device = 0x00000400; /* 486 */
+               else
+                       cpu->device = 0x00000300; /* 386 */
+               if ((cpu->device == 0x00000400) && test_cyrix_52div()) {
+                       memcpy(vendor_name, "CyrixInstead", 13);
+                       /* If we ever care we can enable cpuid here */
+               }
+               /* Detect NexGen with old hypercode */
+               else if (deep_magic_nexgen_probe())
+                       memcpy(vendor_name, "NexGenDriven", 13);
+       }
+       if (has_cpuid()) {
+               int  cpuid_level;
+
+               cpuid_level = build_vendor_name(vendor_name);
+               vendor_name[12] = '\0';
+
+               /* Intel-defined flags: level 0x00000001 */
+               if (cpuid_level >= 0x00000001) {
+                       cpu->device = cpuid_eax(0x00000001);
+               } else {
+                       /* Have CPUID level 0 only unheard of */
+                       cpu->device = 0x00000400;
+               }
+       }
+       cpu->vendor = X86_VENDOR_UNKNOWN;
+       for (i = 0; i < ARRAY_SIZE(x86_vendors); i++) {
+               if (memcmp(vendor_name, x86_vendors[i].name, 12) == 0) {
+                       cpu->vendor = x86_vendors[i].vendor;
+                       break;
+               }
+       }
+}
+
+static inline void get_fms(struct cpuinfo_x86 *c, uint32_t tfms)
+{
+       c->x86 = (tfms >> 8) & 0xf;
+       c->x86_model = (tfms >> 4) & 0xf;
+       c->x86_mask = tfms & 0xf;
+       if (c->x86 == 0xf)
+               c->x86 += (tfms >> 20) & 0xff;
+       if (c->x86 >= 0x6)
+               c->x86_model += ((tfms >> 16) & 0xF) << 4;
+}
+
 int x86_cpu_init_f(void)
 {
        const u32 em_rst = ~X86_CR0_EM;
@@ -128,9 +303,22 @@ int x86_cpu_init_f(void)
             "movl %%eax, %%cr0\n" \
             : : "i" (em_rst), "i" (mp_ne_set) : "eax");
 
+       /* identify CPU via cpuid and store the decoded info into gd->arch */
+       if (has_cpuid()) {
+               struct cpu_device_id cpu;
+               struct cpuinfo_x86 c;
+
+               identify_cpu(&cpu);
+               get_fms(&c, cpu.device);
+               gd->arch.x86 = c.x86;
+               gd->arch.x86_vendor = cpu.vendor;
+               gd->arch.x86_model = c.x86_model;
+               gd->arch.x86_mask = c.x86_mask;
+               gd->arch.x86_device = cpu.device;
+       }
+
        return 0;
 }
-int cpu_init_f(void) __attribute__((weak, alias("x86_cpu_init_f")));
 
 int x86_cpu_init_r(void)
 {
@@ -198,14 +386,13 @@ asm(".globl generate_gpf\n"
        "generate_gpf:\n"
        "ljmp   $0x70, $0x47114711\n");
 
-void __reset_cpu(ulong addr)
+__weak void reset_cpu(ulong addr)
 {
        printf("Resetting using x86 Triple Fault\n");
        set_vector(13, generate_gpf);   /* general protection fault handler */
        set_vector(8, generate_gpf);    /* double fault handler */
        generate_gpf();                 /* start the show */
 }
-void reset_cpu(ulong addr) __attribute__((weak, alias("__reset_cpu")));
 
 int dcache_status(void)
 {
@@ -279,66 +466,63 @@ void cpu_disable_paging_pae(void)
                : "eax");
 }
 
-static bool has_cpuid(void)
+static bool can_detect_long_mode(void)
 {
-       unsigned long flag;
-
-       asm volatile("pushf\n" \
-               "pop %%eax\n"
-               "mov %%eax, %%ecx\n"    /* ecx = flags */
-               "xor %1, %%eax\n"
-               "push %%eax\n"
-               "popf\n"                /* flags ^= $2 */
-               "pushf\n"
-               "pop %%eax\n"           /* eax = flags */
-               "push %%ecx\n"
-               "popf\n"                /* flags = ecx */
-               "xor %%ecx, %%eax\n"
-               "mov %%eax, %0"
-               : "=r" (flag)
-               : "i" (1 << 21)
-               : "eax", "ecx", "memory");
+       return cpuid_eax(0x80000000) > 0x80000000UL;
+}
 
-       return flag != 0;
+static bool has_long_mode(void)
+{
+       return cpuid_edx(0x80000001) & (1 << 29) ? true : false;
 }
 
-static bool can_detect_long_mode(void)
+int cpu_has_64bit(void)
 {
-       unsigned long flag;
+       return has_cpuid() && can_detect_long_mode() &&
+               has_long_mode();
+}
 
-       asm volatile("mov $0x80000000, %%eax\n"
-               "cpuid\n"
-               "mov %%eax, %0"
-               : "=r" (flag)
-               :
-               : "eax", "ebx", "ecx", "edx", "memory");
+const char *cpu_vendor_name(int vendor)
+{
+       const char *name;
+       name = "<invalid cpu vendor>";
+       if ((vendor < (ARRAY_SIZE(x86_vendor_name))) &&
+           (x86_vendor_name[vendor] != 0))
+               name = x86_vendor_name[vendor];
 
-       return flag > 0x80000000UL;
+       return name;
 }
 
-static bool has_long_mode(void)
+char *cpu_get_name(char *name)
 {
-       unsigned long flag;
+       unsigned int *name_as_ints = (unsigned int *)name;
+       struct cpuid_result regs;
+       char *ptr;
+       int i;
 
-       asm volatile("mov $0x80000001, %%eax\n"
-               "cpuid\n"
-               "mov %%edx, %0"
-               : "=r" (flag)
-               :
-               : "eax", "ebx", "ecx", "edx", "memory");
+       /* This bit adds up to 48 bytes */
+       for (i = 0; i < 3; i++) {
+               regs = cpuid(0x80000002 + i);
+               name_as_ints[i * 4 + 0] = regs.eax;
+               name_as_ints[i * 4 + 1] = regs.ebx;
+               name_as_ints[i * 4 + 2] = regs.ecx;
+               name_as_ints[i * 4 + 3] = regs.edx;
+       }
+       name[CPU_MAX_NAME_LEN - 1] = '\0';
 
-       return flag & (1 << 29) ? true : false;
-}
+       /* Skip leading spaces. */
+       ptr = name;
+       while (*ptr == ' ')
+               ptr++;
 
-int cpu_has_64bit(void)
-{
-       return has_cpuid() && can_detect_long_mode() &&
-               has_long_mode();
+       return ptr;
 }
 
-int print_cpuinfo(void)
+int default_print_cpuinfo(void)
 {
-       printf("CPU:   %s\n", cpu_has_64bit() ? "x86_64" : "x86");
+       printf("CPU: %s, vendor %s, device %xh\n",
+              cpu_has_64bit() ? "x86_64" : "x86",
+              cpu_vendor_name(gd->arch.x86_vendor), gd->arch.x86_device);
 
        return 0;
 }
@@ -384,3 +568,26 @@ int cpu_jump_to_64bit(ulong setup_base, ulong target)
 
        return -EFAULT;
 }
+
+void show_boot_progress(int val)
+{
+#if MIN_PORT80_KCLOCKS_DELAY
+       /*
+        * Scale the time counter reading to avoid using 64 bit arithmetics.
+        * Can't use get_timer() here becuase it could be not yet
+        * initialized or even implemented.
+        */
+       if (!gd->arch.tsc_prev) {
+               gd->arch.tsc_base_kclocks = rdtsc() / 1000;
+               gd->arch.tsc_prev = 0;
+       } else {
+               uint32_t now;
+
+               do {
+                       now = rdtsc() / 1000 - gd->arch.tsc_base_kclocks;
+               } while (now < (gd->arch.tsc_prev + MIN_PORT80_KCLOCKS_DELAY));
+               gd->arch.tsc_prev = now;
+       }
+#endif
+       outb(val, POST_PORT);
+}
index 6f3d85fab084eea52458dece8e63d5573bd46839..51e2c5923a7d2958f034befbbe1e753e2ae41dad 100644 (file)
@@ -31,7 +31,7 @@ DECLARE_GLOBAL_DATA_PTR;
        "pushl $"#x"\n" \
        "jmp irq_common_entry\n"
 
-void dump_regs(struct irq_regs *regs)
+static void dump_regs(struct irq_regs *regs)
 {
        unsigned long cr0 = 0L, cr2 = 0L, cr3 = 0L, cr4 = 0L;
        unsigned long d0, d1, d2, d3, d6, d7;
diff --git a/arch/x86/cpu/ivybridge/Kconfig b/arch/x86/cpu/ivybridge/Kconfig
new file mode 100644 (file)
index 0000000..afca957
--- /dev/null
@@ -0,0 +1,172 @@
+#
+# From Coreboot src/northbridge/intel/sandybridge/Kconfig
+#
+# Copyright (C) 2010 Google Inc.
+#
+# SPDX-License-Identifier:     GPL-2.0
+
+
+config NORTHBRIDGE_INTEL_SANDYBRIDGE
+       bool
+       select CACHE_MRC_BIN
+       select CPU_INTEL_MODEL_206AX
+
+config NORTHBRIDGE_INTEL_IVYBRIDGE
+       bool
+       select CACHE_MRC_BIN
+       select CPU_INTEL_MODEL_306AX
+
+if NORTHBRIDGE_INTEL_SANDYBRIDGE
+
+config VGA_BIOS_ID
+       string
+       default "8086,0106"
+
+config CACHE_MRC_SIZE_KB
+       int
+       default 256
+
+config MRC_CACHE_BASE
+       hex
+       default 0xff800000
+
+config MRC_CACHE_LOCATION
+       hex
+       depends on !CHROMEOS
+       default 0x1ec000
+
+config MRC_CACHE_SIZE
+       hex
+       depends on !CHROMEOS
+       default 0x10000
+
+config DCACHE_RAM_BASE
+       hex
+       default 0xff7f0000
+
+config DCACHE_RAM_SIZE
+       hex
+       default 0x10000
+
+endif
+
+if NORTHBRIDGE_INTEL_IVYBRIDGE
+
+config VGA_BIOS_ID
+       string
+       default "8086,0166"
+
+config EXTERNAL_MRC_BLOB
+       bool
+       default n
+
+config CACHE_MRC_SIZE_KB
+       int
+       default 512
+
+config MRC_CACHE_BASE
+       hex
+       default 0xff800000
+
+config MRC_CACHE_LOCATION
+       hex
+       depends on !CHROMEOS
+       default 0x370000
+
+config MRC_CACHE_SIZE
+       hex
+       depends on !CHROMEOS
+       default 0x10000
+
+config DCACHE_RAM_BASE
+       hex
+       default 0xff7e0000
+
+config DCACHE_RAM_SIZE
+       hex
+       default 0x20000
+
+endif
+
+if NORTHBRIDGE_INTEL_SANDYBRIDGE || NORTHBRIDGE_INTEL_IVYBRIDGE
+
+config HAVE_MRC
+        bool "Add a System Agent binary"
+        help
+          Select this option to add a System Agent binary to
+          the resulting U-Boot image. MRC stands for Memory Reference Code.
+          It is a binary blob which U-Boot uses to set up SDRAM.
+
+          Note: Without this binary U-Boot will not be able to set up its
+          SDRAM so will not boot.
+
+config DCACHE_RAM_MRC_VAR_SIZE
+       hex
+       default 0x4000
+       help
+         This is the amount of CAR (Cache as RAM) reserved for use by the
+         memory reference code. This should be set to 16KB (0x4000 hex)
+         so that MRC has enough space to run.
+
+config MRC_FILE
+       string "Intel System Agent path and filename"
+       depends on HAVE_MRC
+       default "systemagent-ivybridge.bin" if NORTHBRIDGE_INTEL_IVYBRIDGE
+       default "systemagent-sandybridge.bin" if NORTHBRIDGE_INTEL_SANDYBRIDGE
+       help
+         The path and filename of the file to use as System Agent
+         binary.
+
+config CPU_SPECIFIC_OPTIONS
+       def_bool y
+       select SMM_TSEG
+       select ARCH_BOOTBLOCK_X86_32
+       select ARCH_ROMSTAGE_X86_32
+       select ARCH_RAMSTAGE_X86_32
+       select SMP
+       select SSE2
+       select UDELAY_LAPIC
+       select CPU_MICROCODE_IN_CBFS
+       select TSC_SYNC_MFENCE
+       select HAVE_INTEL_ME
+       select X86_RAMTEST
+
+config SMM_TSEG_SIZE
+       hex
+       default 0x800000
+
+config ENABLE_VMX
+       bool "Enable VMX for virtualization"
+       default n
+       help
+         Virtual Machine Extensions are provided in many x86 CPUs. These
+         provide various facilities for allowing a host OS to provide an
+         environment where potentially several guest OSes have only
+         limited access to the underlying hardware. This is achieved
+         without resorting to software trapping and/or instruction set
+         emulation (which would be very slow).
+
+         Intel's implementation of this is called VT-x. This option enables
+         VT-x this so that the OS that is booted by U-Boot can make use of
+         these facilities. If this option is not enabled, then the host OS
+         will be unable to support virtualisation, or it will run very
+         slowly.
+
+endif
+
+config CPU_INTEL_SOCKET_RPGA989
+       bool
+
+if CPU_INTEL_SOCKET_RPGA989
+
+config SOCKET_SPECIFIC_OPTIONS # dummy
+       def_bool y
+       select MMX
+       select SSE
+       select CACHE_AS_RAM
+
+config CACHE_MRC_BIN
+       bool
+       default n
+
+endif
diff --git a/arch/x86/cpu/ivybridge/Makefile b/arch/x86/cpu/ivybridge/Makefile
new file mode 100644 (file)
index 0000000..721b37e
--- /dev/null
@@ -0,0 +1,16 @@
+#
+# Copyright (c) 2014 Google, Inc
+#
+# SPDX-License-Identifier:     GPL-2.0+
+#
+
+obj-y += car.o
+obj-y += cpu.o
+obj-y += early_init.o
+obj-y += early_me.o
+obj-y += lpc.o
+obj-y += me_status.o
+obj-y += microcode_intel.o
+obj-y += pci.o
+obj-y += report_platform.o
+obj-y += sdram.o
diff --git a/arch/x86/cpu/ivybridge/car.S b/arch/x86/cpu/ivybridge/car.S
new file mode 100644 (file)
index 0000000..dca68e4
--- /dev/null
@@ -0,0 +1,178 @@
+/*
+ * Copyright (c) 2014 Google, Inc
+ *
+ * From Coreboot file cpu/intel/model_206ax/cache_as_ram.inc
+ *
+ * Copyright (C) 2000,2007 Ronald G. Minnich <rminnich@gmail.com>
+ * Copyright (C) 2005 Tyan (written by Yinghai Lu for Tyan)
+ * Copyright (C) 2007-2008 coresystems GmbH
+ * Copyright (C) 2012 Kyösti Mälkki <kyosti.malkki@gmail.com>
+ *
+ * SPDX-License-Identifier:    GPL-2.0
+ */
+
+#include <common.h>
+#include <asm/mtrr.h>
+#include <asm/post.h>
+#include <asm/processor-flags.h>
+
+#define MTRR_PHYS_BASE_MSR(reg) (0x200 + 2 * (reg))
+#define MTRR_PHYS_MASK_MSR(reg) (0x200 + 2 * (reg) + 1)
+
+#define CACHE_AS_RAM_SIZE      CONFIG_DCACHE_RAM_SIZE
+#define CACHE_AS_RAM_BASE      CONFIG_DCACHE_RAM_BASE
+
+/* Cache 4GB - MRC_SIZE_KB for MRC */
+#define CACHE_MRC_BYTES        ((CONFIG_CACHE_MRC_SIZE_KB << 10) - 1)
+#define CACHE_MRC_BASE         (0xFFFFFFFF - CACHE_MRC_BYTES)
+#define CACHE_MRC_MASK         (~CACHE_MRC_BYTES)
+
+#define CPU_PHYSMASK_HI        (1 << (CONFIG_CPU_ADDR_BITS - 32) - 1)
+
+#define NOEVICTMOD_MSR 0x2e0
+
+       /*
+        * Note: ebp must not be touched in this code as it holds the BIST
+        * value (built-in self test). We preserve this value until it can
+        * be written to global_data when CAR is ready for use.
+        */
+.globl car_init
+car_init:
+       post_code(POST_CAR_START)
+
+       /* Send INIT IPI to all excluding ourself */
+       movl    $0x000C4500, %eax
+       movl    $0xFEE00300, %esi
+       movl    %eax, (%esi)
+
+       post_code(POST_CAR_SIPI)
+       /* Zero out all fixed range and variable range MTRRs */
+       movl    $mtrr_table, %esi
+       movl    $((mtrr_table_end - mtrr_table) / 2), %edi
+       xorl    %eax, %eax
+       xorl    %edx, %edx
+clear_mtrrs:
+       movw    (%esi), %bx
+       movzx   %bx, %ecx
+       wrmsr
+       add     $2, %esi
+       dec     %edi
+       jnz     clear_mtrrs
+
+       post_code(POST_CAR_MTRR)
+       /* Configure the default memory type to uncacheable */
+       movl    $MTRRdefType_MSR, %ecx
+       rdmsr
+       andl    $(~0x00000cff), %eax
+       wrmsr
+
+       post_code(POST_CAR_UNCACHEABLE)
+       /* Set Cache-as-RAM base address */
+       movl    $(MTRR_PHYS_BASE_MSR(0)), %ecx
+       movl    $(CACHE_AS_RAM_BASE | MTRR_TYPE_WRBACK), %eax
+       xorl    %edx, %edx
+       wrmsr
+
+       post_code(POST_CAR_BASE_ADDRESS)
+       /* Set Cache-as-RAM mask */
+       movl    $(MTRR_PHYS_MASK_MSR(0)), %ecx
+       movl    $(~(CACHE_AS_RAM_SIZE - 1) | MTRRphysMaskValid), %eax
+       movl    $CPU_PHYSMASK_HI, %edx
+       wrmsr
+
+       post_code(POST_CAR_MASK)
+
+       /* Enable MTRR */
+       movl    $MTRRdefType_MSR, %ecx
+       rdmsr
+       orl     $MTRRdefTypeEn, %eax
+       wrmsr
+
+       /* Enable cache (CR0.CD = 0, CR0.NW = 0) */
+        movl   %cr0, %eax
+       andl    $(~(X86_CR0_CD | X86_CR0_NW)), %eax
+       invd
+       movl    %eax, %cr0
+
+       /* enable the 'no eviction' mode */
+       movl    $NOEVICTMOD_MSR, %ecx
+       rdmsr
+       orl     $1, %eax
+       andl    $~2, %eax
+       wrmsr
+
+       /* Clear the cache memory region. This will also fill up the cache */
+       movl    $CACHE_AS_RAM_BASE, %esi
+       movl    %esi, %edi
+       movl    $(CACHE_AS_RAM_SIZE / 4), %ecx
+       xorl    %eax, %eax
+       rep     stosl
+
+       /* enable the 'no eviction run' state */
+       movl    $NOEVICTMOD_MSR, %ecx
+       rdmsr
+       orl     $3, %eax
+       wrmsr
+
+       post_code(POST_CAR_FILL)
+       /* Enable Cache-as-RAM mode by disabling cache */
+       movl    %cr0, %eax
+       orl     $X86_CR0_CD, %eax
+       movl    %eax, %cr0
+
+       /* Enable cache for our code in Flash because we do XIP here */
+       movl    $MTRR_PHYS_BASE_MSR(1), %ecx
+       xorl    %edx, %edx
+       movl    $car_init_ret, %eax
+       andl    $(~(CONFIG_XIP_ROM_SIZE - 1)), %eax
+       orl     $MTRR_TYPE_WRPROT, %eax
+       wrmsr
+
+       movl    $MTRR_PHYS_MASK_MSR(1), %ecx
+       movl    $CPU_PHYSMASK_HI, %edx
+       movl    $(~(CONFIG_XIP_ROM_SIZE - 1) | MTRRphysMaskValid), %eax
+       wrmsr
+
+       post_code(POST_CAR_ROM_CACHE)
+#ifdef CONFIG_CACHE_MRC_BIN
+       /* Enable caching for ram init code to run faster */
+       movl    $MTRR_PHYS_BASE_MSR(2), %ecx
+       movl    $(CACHE_MRC_BASE | MTRR_TYPE_WRPROT), %eax
+       xorl    %edx, %edx
+       wrmsr
+       movl    $MTRR_PHYS_MASK_MSR(2), %ecx
+       movl    $(CACHE_MRC_MASK | MTRRphysMaskValid), %eax
+       movl    $CPU_PHYSMASK_HI, %edx
+       wrmsr
+#endif
+
+       post_code(POST_CAR_MRC_CACHE)
+       /* Enable cache */
+       movl    %cr0, %eax
+       andl    $(~(X86_CR0_CD | X86_CR0_NW)), %eax
+       movl    %eax, %cr0
+
+       post_code(POST_CAR_CPU_CACHE)
+
+       /* All CPUs need to be in Wait for SIPI state */
+wait_for_sipi:
+       movl    (%esi), %eax
+       bt      $12, %eax
+       jc      wait_for_sipi
+
+       /* return */
+       jmp     car_init_ret
+
+mtrr_table:
+       /* Fixed MTRRs */
+       .word 0x250, 0x258, 0x259
+       .word 0x268, 0x269, 0x26A
+       .word 0x26B, 0x26C, 0x26D
+       .word 0x26E, 0x26F
+       /* Variable MTRRs */
+       .word 0x200, 0x201, 0x202, 0x203
+       .word 0x204, 0x205, 0x206, 0x207
+       .word 0x208, 0x209, 0x20A, 0x20B
+       .word 0x20C, 0x20D, 0x20E, 0x20F
+       .word 0x210, 0x211, 0x212, 0x213
+mtrr_table_end:
diff --git a/arch/x86/cpu/ivybridge/cpu.c b/arch/x86/cpu/ivybridge/cpu.c
new file mode 100644 (file)
index 0000000..60976db
--- /dev/null
@@ -0,0 +1,357 @@
+/*
+ * Copyright (c) 2014 Google, Inc
+ * (C) Copyright 2008
+ * Graeme Russ, graeme.russ@gmail.com.
+ *
+ * Some portions from coreboot src/mainboard/google/link/romstage.c
+ * and src/cpu/intel/model_206ax/bootblock.c
+ * Copyright (C) 2007-2010 coresystems GmbH
+ * Copyright (C) 2011 Google Inc.
+ *
+ * SPDX-License-Identifier:    GPL-2.0
+ */
+
+#include <common.h>
+#include <errno.h>
+#include <fdtdec.h>
+#include <asm/cpu.h>
+#include <asm/io.h>
+#include <asm/lapic.h>
+#include <asm/msr.h>
+#include <asm/mtrr.h>
+#include <asm/pci.h>
+#include <asm/post.h>
+#include <asm/processor.h>
+#include <asm/arch/model_206ax.h>
+#include <asm/arch/microcode.h>
+#include <asm/arch/pch.h>
+#include <asm/arch/sandybridge.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+static void enable_port80_on_lpc(struct pci_controller *hose, pci_dev_t dev)
+{
+       /* Enable port 80 POST on LPC */
+       pci_hose_write_config_dword(hose, dev, PCH_RCBA_BASE, DEFAULT_RCBA | 1);
+       clrbits_le32(RCB_REG(GCS), 4);
+}
+
+/*
+ * Enable Prefetching and Caching.
+ */
+static void enable_spi_prefetch(struct pci_controller *hose, pci_dev_t dev)
+{
+       u8 reg8;
+
+       pci_hose_read_config_byte(hose, dev, 0xdc, &reg8);
+       reg8 &= ~(3 << 2);
+       reg8 |= (2 << 2); /* Prefetching and Caching Enabled */
+       pci_hose_write_config_byte(hose, dev, 0xdc, reg8);
+}
+
+static void set_var_mtrr(
+       unsigned reg, unsigned base, unsigned size, unsigned type)
+
+{
+       /* Bit Bit 32-35 of MTRRphysMask should be set to 1 */
+       /* FIXME: It only support 4G less range */
+       wrmsr(MTRRphysBase_MSR(reg), base | type, 0);
+       wrmsr(MTRRphysMask_MSR(reg), ~(size - 1) | MTRRphysMaskValid,
+             (1 << (CONFIG_CPU_ADDR_BITS - 32)) - 1);
+}
+
+static void enable_rom_caching(void)
+{
+       disable_caches();
+       set_var_mtrr(1, 0xffc00000, 4 << 20, MTRR_TYPE_WRPROT);
+       enable_caches();
+
+       /* Enable Variable MTRRs */
+       wrmsr(MTRRdefType_MSR, 0x800, 0);
+}
+
+static int set_flex_ratio_to_tdp_nominal(void)
+{
+       msr_t flex_ratio, msr;
+       u8 nominal_ratio;
+
+       /* Minimum CPU revision for configurable TDP support */
+       if (cpuid_eax(1) < IVB_CONFIG_TDP_MIN_CPUID)
+               return -EINVAL;
+
+       /* Check for Flex Ratio support */
+       flex_ratio = msr_read(MSR_FLEX_RATIO);
+       if (!(flex_ratio.lo & FLEX_RATIO_EN))
+               return -EINVAL;
+
+       /* Check for >0 configurable TDPs */
+       msr = msr_read(MSR_PLATFORM_INFO);
+       if (((msr.hi >> 1) & 3) == 0)
+               return -EINVAL;
+
+       /* Use nominal TDP ratio for flex ratio */
+       msr = msr_read(MSR_CONFIG_TDP_NOMINAL);
+       nominal_ratio = msr.lo & 0xff;
+
+       /* See if flex ratio is already set to nominal TDP ratio */
+       if (((flex_ratio.lo >> 8) & 0xff) == nominal_ratio)
+               return 0;
+
+       /* Set flex ratio to nominal TDP ratio */
+       flex_ratio.lo &= ~0xff00;
+       flex_ratio.lo |= nominal_ratio << 8;
+       flex_ratio.lo |= FLEX_RATIO_LOCK;
+       msr_write(MSR_FLEX_RATIO, flex_ratio);
+
+       /* Set flex ratio in soft reset data register bits 11:6 */
+       clrsetbits_le32(RCB_REG(SOFT_RESET_DATA), 0x3f << 6,
+                       (nominal_ratio & 0x3f) << 6);
+
+       /* Set soft reset control to use register value */
+       setbits_le32(RCB_REG(SOFT_RESET_CTRL), 1);
+
+       /* Issue warm reset, will be "CPU only" due to soft reset data */
+       outb(0x0, PORT_RESET);
+       outb(0x6, PORT_RESET);
+       cpu_hlt();
+
+       /* Not reached */
+       return -EINVAL;
+}
+
+static void set_spi_speed(void)
+{
+       u32 fdod;
+
+       /* Observe SPI Descriptor Component Section 0 */
+       writel(0x1000, RCB_REG(SPI_DESC_COMP0));
+
+       /* Extract the1 Write/Erase SPI Frequency from descriptor */
+       fdod = readl(RCB_REG(SPI_FREQ_WR_ERA));
+       fdod >>= 24;
+       fdod &= 7;
+
+       /* Set Software Sequence frequency to match */
+       clrsetbits_8(RCB_REG(SPI_FREQ_SWSEQ), 7, fdod);
+}
+
+int arch_cpu_init(void)
+{
+       const void *blob = gd->fdt_blob;
+       struct pci_controller *hose;
+       int node;
+       int ret;
+
+       post_code(POST_CPU_INIT);
+       timer_set_base(rdtsc());
+
+       ret = x86_cpu_init_f();
+       if (ret)
+               return ret;
+
+       ret = pci_early_init_hose(&hose);
+       if (ret)
+               return ret;
+
+       node = fdtdec_next_compatible(blob, 0, COMPAT_INTEL_LPC);
+       if (node < 0)
+               return -ENOENT;
+       ret = lpc_early_init(gd->fdt_blob, node, PCH_LPC_DEV);
+       if (ret)
+               return ret;
+
+       enable_spi_prefetch(hose, PCH_LPC_DEV);
+
+       /* This is already done in start.S, but let's do it in C */
+       enable_port80_on_lpc(hose, PCH_LPC_DEV);
+
+       /* already done in car.S */
+       if (false)
+               enable_rom_caching();
+
+       set_spi_speed();
+
+       /*
+        * We should do as little as possible before the serial console is
+        * up. Perhaps this should move to later. Our next lot of init
+        * happens in print_cpuinfo() when we have a console
+        */
+       ret = set_flex_ratio_to_tdp_nominal();
+       if (ret)
+               return ret;
+
+       return 0;
+}
+
+static int enable_smbus(void)
+{
+       pci_dev_t dev;
+       uint16_t value;
+
+       /* Set the SMBus device statically. */
+       dev = PCI_BDF(0x0, 0x1f, 0x3);
+
+       /* Check to make sure we've got the right device. */
+       value = pci_read_config16(dev, 0x0);
+       if (value != 0x8086) {
+               printf("SMBus controller not found\n");
+               return -ENOSYS;
+       }
+
+       /* Set SMBus I/O base. */
+       pci_write_config32(dev, SMB_BASE,
+                          SMBUS_IO_BASE | PCI_BASE_ADDRESS_SPACE_IO);
+
+       /* Set SMBus enable. */
+       pci_write_config8(dev, HOSTC, HST_EN);
+
+       /* Set SMBus I/O space enable. */
+       pci_write_config16(dev, PCI_COMMAND, PCI_COMMAND_IO);
+
+       /* Disable interrupt generation. */
+       outb(0, SMBUS_IO_BASE + SMBHSTCTL);
+
+       /* Clear any lingering errors, so transactions can run. */
+       outb(inb(SMBUS_IO_BASE + SMBHSTSTAT), SMBUS_IO_BASE + SMBHSTSTAT);
+       debug("SMBus controller enabled\n");
+
+       return 0;
+}
+
+#define PCH_EHCI0_TEMP_BAR0 0xe8000000
+#define PCH_EHCI1_TEMP_BAR0 0xe8000400
+#define PCH_XHCI_TEMP_BAR0  0xe8001000
+
+/*
+ * Setup USB controller MMIO BAR to prevent the reference code from
+ * resetting the controller.
+ *
+ * The BAR will be re-assigned during device enumeration so these are only
+ * temporary.
+ *
+ * This is used to speed up the resume path.
+ */
+static void enable_usb_bar(void)
+{
+       pci_dev_t usb0 = PCH_EHCI1_DEV;
+       pci_dev_t usb1 = PCH_EHCI2_DEV;
+       pci_dev_t usb3 = PCH_XHCI_DEV;
+       u32 cmd;
+
+       /* USB Controller 1 */
+       pci_write_config32(usb0, PCI_BASE_ADDRESS_0,
+                          PCH_EHCI0_TEMP_BAR0);
+       cmd = pci_read_config32(usb0, PCI_COMMAND);
+       cmd |= PCI_COMMAND_MASTER | PCI_COMMAND_MEMORY;
+       pci_write_config32(usb0, PCI_COMMAND, cmd);
+
+       /* USB Controller 1 */
+       pci_write_config32(usb1, PCI_BASE_ADDRESS_0,
+                          PCH_EHCI1_TEMP_BAR0);
+       cmd = pci_read_config32(usb1, PCI_COMMAND);
+       cmd |= PCI_COMMAND_MASTER | PCI_COMMAND_MEMORY;
+       pci_write_config32(usb1, PCI_COMMAND, cmd);
+
+       /* USB3 Controller */
+       pci_write_config32(usb3, PCI_BASE_ADDRESS_0,
+                          PCH_XHCI_TEMP_BAR0);
+       cmd = pci_read_config32(usb3, PCI_COMMAND);
+       cmd |= PCI_COMMAND_MASTER | PCI_COMMAND_MEMORY;
+       pci_write_config32(usb3, PCI_COMMAND, cmd);
+}
+
+static int report_bist_failure(void)
+{
+       if (gd->arch.bist != 0) {
+               printf("BIST failed: %08x\n", gd->arch.bist);
+               return -EFAULT;
+       }
+
+       return 0;
+}
+
+int print_cpuinfo(void)
+{
+       enum pei_boot_mode_t boot_mode = PEI_BOOT_NONE;
+       char processor_name[CPU_MAX_NAME_LEN];
+       const char *name;
+       uint32_t pm1_cnt;
+       uint16_t pm1_sts;
+       int ret;
+
+       /* Halt if there was a built in self test failure */
+       ret = report_bist_failure();
+       if (ret)
+               return ret;
+
+       enable_lapic();
+
+       ret = microcode_update_intel();
+       if (ret && ret != -ENOENT && ret != -EEXIST)
+               return ret;
+
+       /* Enable upper 128bytes of CMOS */
+       writel(1 << 2, RCB_REG(RC));
+
+       /* TODO: cmos_post_init() */
+       if (readl(MCHBAR_REG(SSKPD)) == 0xCAFE) {
+               debug("soft reset detected\n");
+               boot_mode = PEI_BOOT_SOFT_RESET;
+
+               /* System is not happy after keyboard reset... */
+               debug("Issuing CF9 warm reset\n");
+               outb(0x6, 0xcf9);
+               cpu_hlt();
+       }
+
+       /* Early chipset init required before RAM init can work */
+       sandybridge_early_init(SANDYBRIDGE_MOBILE);
+
+       /* Check PM1_STS[15] to see if we are waking from Sx */
+       pm1_sts = inw(DEFAULT_PMBASE + PM1_STS);
+
+       /* Read PM1_CNT[12:10] to determine which Sx state */
+       pm1_cnt = inl(DEFAULT_PMBASE + PM1_CNT);
+
+       if ((pm1_sts & WAK_STS) && ((pm1_cnt >> 10) & 7) == 5) {
+#if CONFIG_HAVE_ACPI_RESUME
+               debug("Resume from S3 detected.\n");
+               boot_mode = PEI_BOOT_RESUME;
+               /* Clear SLP_TYPE. This will break stage2 but
+                * we care for that when we get there.
+                */
+               outl(pm1_cnt & ~(7 << 10), DEFAULT_PMBASE + PM1_CNT);
+#else
+               debug("Resume from S3 detected, but disabled.\n");
+#endif
+       } else {
+               /*
+                * TODO: An indication of life might be possible here (e.g.
+                * keyboard light)
+                */
+       }
+       post_code(POST_EARLY_INIT);
+
+       /* Enable SPD ROMs and DDR-III DRAM */
+       ret = enable_smbus();
+       if (ret)
+               return ret;
+
+       /* Prepare USB controller early in S3 resume */
+       if (boot_mode == PEI_BOOT_RESUME)
+               enable_usb_bar();
+
+       gd->arch.pei_boot_mode = boot_mode;
+
+       /* TODO: Move this to the board or driver */
+       pci_write_config32(PCH_LPC_DEV, GPIO_BASE, DEFAULT_GPIOBASE | 1);
+       pci_write_config32(PCH_LPC_DEV, GPIO_CNTL, 0x10);
+
+       /* Print processor name */
+       name = cpu_get_name(processor_name);
+       printf("CPU:   %s\n", name);
+
+       post_code(POST_CPU_INFO);
+
+       return 0;
+}
diff --git a/arch/x86/cpu/ivybridge/early_init.c b/arch/x86/cpu/ivybridge/early_init.c
new file mode 100644 (file)
index 0000000..eb8f613
--- /dev/null
@@ -0,0 +1,145 @@
+/*
+ * From Coreboot
+ *
+ * Copyright (C) 2007-2010 coresystems GmbH
+ * Copyright (C) 2011 Google Inc
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#include <common.h>
+#include <asm/io.h>
+#include <asm/pci.h>
+#include <asm/arch/pch.h>
+#include <asm/arch/sandybridge.h>
+
+static void sandybridge_setup_bars(pci_dev_t pch_dev, pci_dev_t lpc_dev)
+{
+       /* Setting up Southbridge. In the northbridge code. */
+       debug("Setting up static southbridge registers\n");
+       pci_write_config32(lpc_dev, PCH_RCBA_BASE, DEFAULT_RCBA | 1);
+
+       pci_write_config32(lpc_dev, PMBASE, DEFAULT_PMBASE | 1);
+       pci_write_config8(lpc_dev, ACPI_CNTL, 0x80); /* Enable ACPI BAR */
+
+       debug("Disabling watchdog reboot\n");
+       setbits_le32(RCB_REG(GCS), 1 >> 5);     /* No reset */
+       outw(1 << 11, DEFAULT_PMBASE | 0x60 | 0x08);    /* halt timer */
+
+       /* Set up all hardcoded northbridge BARs */
+       debug("Setting up static registers\n");
+       pci_write_config32(pch_dev, EPBAR, DEFAULT_EPBAR | 1);
+       pci_write_config32(pch_dev, EPBAR + 4, (0LL + DEFAULT_EPBAR) >> 32);
+       pci_write_config32(pch_dev, MCHBAR, DEFAULT_MCHBAR | 1);
+       pci_write_config32(pch_dev, MCHBAR + 4, (0LL + DEFAULT_MCHBAR) >> 32);
+       /* 64MB - busses 0-63 */
+       pci_write_config32(pch_dev, PCIEXBAR, DEFAULT_PCIEXBAR | 5);
+       pci_write_config32(pch_dev, PCIEXBAR + 4,
+                          (0LL + DEFAULT_PCIEXBAR) >> 32);
+       pci_write_config32(pch_dev, DMIBAR, DEFAULT_DMIBAR | 1);
+       pci_write_config32(pch_dev, DMIBAR + 4, (0LL + DEFAULT_DMIBAR) >> 32);
+
+       /* Set C0000-FFFFF to access RAM on both reads and writes */
+       pci_write_config8(pch_dev, PAM0, 0x30);
+       pci_write_config8(pch_dev, PAM1, 0x33);
+       pci_write_config8(pch_dev, PAM2, 0x33);
+       pci_write_config8(pch_dev, PAM3, 0x33);
+       pci_write_config8(pch_dev, PAM4, 0x33);
+       pci_write_config8(pch_dev, PAM5, 0x33);
+       pci_write_config8(pch_dev, PAM6, 0x33);
+}
+
+static void sandybridge_setup_graphics(pci_dev_t pch_dev, pci_dev_t video_dev)
+{
+       u32 reg32;
+       u16 reg16;
+       u8 reg8;
+
+       reg16 = pci_read_config16(video_dev, PCI_DEVICE_ID);
+       switch (reg16) {
+       case 0x0102: /* GT1 Desktop */
+       case 0x0106: /* GT1 Mobile */
+       case 0x010a: /* GT1 Server */
+       case 0x0112: /* GT2 Desktop */
+       case 0x0116: /* GT2 Mobile */
+       case 0x0122: /* GT2 Desktop >=1.3GHz */
+       case 0x0126: /* GT2 Mobile >=1.3GHz */
+       case 0x0156: /* IvyBridge */
+       case 0x0166: /* IvyBridge */
+               break;
+       default:
+               debug("Graphics not supported by this CPU/chipset\n");
+               return;
+       }
+
+       debug("Initialising Graphics\n");
+
+       /* Setup IGD memory by setting GGC[7:3] = 1 for 32MB */
+       reg16 = pci_read_config16(pch_dev, GGC);
+       reg16 &= ~0x00f8;
+       reg16 |= 1 << 3;
+       /* Program GTT memory by setting GGC[9:8] = 2MB */
+       reg16 &= ~0x0300;
+       reg16 |= 2 << 8;
+       /* Enable VGA decode */
+       reg16 &= ~0x0002;
+       pci_write_config16(pch_dev, GGC, reg16);
+
+       /* Enable 256MB aperture */
+       reg8 = pci_read_config8(video_dev, MSAC);
+       reg8 &= ~0x06;
+       reg8 |= 0x02;
+       pci_write_config8(video_dev, MSAC, reg8);
+
+       /* Erratum workarounds */
+       reg32 = readl(MCHBAR_REG(0x5f00));
+       reg32 |= (1 << 9) | (1 << 10);
+       writel(reg32, MCHBAR_REG(0x5f00));
+
+       /* Enable SA Clock Gating */
+       reg32 = readl(MCHBAR_REG(0x5f00));
+       writel(reg32 | 1, MCHBAR_REG(0x5f00));
+
+       /* GPU RC6 workaround for sighting 366252 */
+       reg32 = readl(MCHBAR_REG(0x5d14));
+       reg32 |= (1 << 31);
+       writel(reg32, MCHBAR_REG(0x5d14));
+
+       /* VLW */
+       reg32 = readl(MCHBAR_REG(0x6120));
+       reg32 &= ~(1 << 0);
+       writel(reg32, MCHBAR_REG(0x6120));
+
+       reg32 = readl(MCHBAR_REG(0x5418));
+       reg32 |= (1 << 4) | (1 << 5);
+       writel(reg32, MCHBAR_REG(0x5418));
+}
+
+void sandybridge_early_init(int chipset_type)
+{
+       pci_dev_t pch_dev = PCH_DEV;
+       pci_dev_t video_dev = PCH_VIDEO_DEV;
+       pci_dev_t lpc_dev = PCH_LPC_DEV;
+       u32 capid0_a;
+       u8 reg8;
+
+       /* Device ID Override Enable should be done very early */
+       capid0_a = pci_read_config32(pch_dev, 0xe4);
+       if (capid0_a & (1 << 10)) {
+               reg8 = pci_read_config8(pch_dev, 0xf3);
+               reg8 &= ~7; /* Clear 2:0 */
+
+               if (chipset_type == SANDYBRIDGE_MOBILE)
+                       reg8 |= 1; /* Set bit 0 */
+
+               pci_write_config8(pch_dev, 0xf3, reg8);
+       }
+
+       /* Setup all BARs required for early PCIe and raminit */
+       sandybridge_setup_bars(pch_dev, lpc_dev);
+
+       /* Device Enable */
+       pci_write_config32(pch_dev, DEVEN, DEVEN_HOST | DEVEN_IGD);
+
+       sandybridge_setup_graphics(pch_dev, video_dev);
+}
diff --git a/arch/x86/cpu/ivybridge/early_me.c b/arch/x86/cpu/ivybridge/early_me.c
new file mode 100644 (file)
index 0000000..b24dea1
--- /dev/null
@@ -0,0 +1,191 @@
+/*
+ * From Coreboot src/southbridge/intel/bd82x6x/early_me.c
+ *
+ * Copyright (C) 2011 The Chromium OS Authors. All rights reserved.
+ *
+ * SPDX-License-Identifier:    GPL-2.0
+ */
+
+#include <common.h>
+#include <errno.h>
+#include <asm/pci.h>
+#include <asm/processor.h>
+#include <asm/arch/me.h>
+#include <asm/arch/pch.h>
+#include <asm/io.h>
+
+static const char *const me_ack_values[] = {
+       [ME_HFS_ACK_NO_DID]     = "No DID Ack received",
+       [ME_HFS_ACK_RESET]      = "Non-power cycle reset",
+       [ME_HFS_ACK_PWR_CYCLE]  = "Power cycle reset",
+       [ME_HFS_ACK_S3]         = "Go to S3",
+       [ME_HFS_ACK_S4]         = "Go to S4",
+       [ME_HFS_ACK_S5]         = "Go to S5",
+       [ME_HFS_ACK_GBL_RESET]  = "Global Reset",
+       [ME_HFS_ACK_CONTINUE]   = "Continue to boot"
+};
+
+static inline void pci_read_dword_ptr(void *ptr, int offset)
+{
+       u32 dword;
+
+       dword = pci_read_config32(PCH_ME_DEV, offset);
+       memcpy(ptr, &dword, sizeof(dword));
+}
+
+static inline void pci_write_dword_ptr(void *ptr, int offset)
+{
+       u32 dword = 0;
+       memcpy(&dword, ptr, sizeof(dword));
+       pci_write_config32(PCH_ME_DEV, offset, dword);
+}
+
+void intel_early_me_status(void)
+{
+       struct me_hfs hfs;
+       struct me_gmes gmes;
+
+       pci_read_dword_ptr(&hfs, PCI_ME_HFS);
+       pci_read_dword_ptr(&gmes, PCI_ME_GMES);
+
+       intel_me_status(&hfs, &gmes);
+}
+
+int intel_early_me_init(void)
+{
+       int count;
+       struct me_uma uma;
+       struct me_hfs hfs;
+
+       debug("Intel ME early init\n");
+
+       /* Wait for ME UMA SIZE VALID bit to be set */
+       for (count = ME_RETRY; count > 0; --count) {
+               pci_read_dword_ptr(&uma, PCI_ME_UMA);
+               if (uma.valid)
+                       break;
+               udelay(ME_DELAY);
+       }
+       if (!count) {
+               printf("ERROR: ME is not ready!\n");
+               return -EBUSY;
+       }
+
+       /* Check for valid firmware */
+       pci_read_dword_ptr(&hfs, PCI_ME_HFS);
+       if (hfs.fpt_bad) {
+               printf("WARNING: ME has bad firmware\n");
+               return -EBADF;
+       }
+
+       debug("Intel ME firmware is ready\n");
+
+       return 0;
+}
+
+int intel_early_me_uma_size(void)
+{
+       struct me_uma uma;
+
+       pci_read_dword_ptr(&uma, PCI_ME_UMA);
+       if (uma.valid) {
+               debug("ME: Requested %uMB UMA\n", uma.size);
+               return uma.size;
+       }
+
+       debug("ME: Invalid UMA size\n");
+       return -EINVAL;
+}
+
+static inline void set_global_reset(int enable)
+{
+       u32 etr3;
+
+       etr3 = pci_read_config32(PCH_LPC_DEV, ETR3);
+
+       /* Clear CF9 Without Resume Well Reset Enable */
+       etr3 &= ~ETR3_CWORWRE;
+
+       /* CF9GR indicates a Global Reset */
+       if (enable)
+               etr3 |= ETR3_CF9GR;
+       else
+               etr3 &= ~ETR3_CF9GR;
+
+       pci_write_config32(PCH_LPC_DEV, ETR3, etr3);
+}
+
+int intel_early_me_init_done(u8 status)
+{
+       u8 reset;
+       int count;
+       u32 mebase_l, mebase_h;
+       struct me_hfs hfs;
+       struct me_did did = {
+               .init_done = ME_INIT_DONE,
+               .status = status
+       };
+
+       /* MEBASE from MESEG_BASE[35:20] */
+       mebase_l = pci_read_config32(PCH_DEV, PCI_CPU_MEBASE_L);
+       mebase_h = pci_read_config32(PCH_DEV, PCI_CPU_MEBASE_H);
+       mebase_h &= 0xf;
+       did.uma_base = (mebase_l >> 20) | (mebase_h << 12);
+
+       /* Send message to ME */
+       debug("ME: Sending Init Done with status: %d, UMA base: 0x%04x\n",
+             status, did.uma_base);
+
+       pci_write_dword_ptr(&did, PCI_ME_H_GS);
+
+       /* Must wait for ME acknowledgement */
+       for (count = ME_RETRY; count > 0; --count) {
+               pci_read_dword_ptr(&hfs, PCI_ME_HFS);
+               if (hfs.bios_msg_ack)
+                       break;
+               udelay(ME_DELAY);
+       }
+       if (!count) {
+               printf("ERROR: ME failed to respond\n");
+               return -1;
+       }
+
+       /* Return the requested BIOS action */
+       debug("ME: Requested BIOS Action: %s\n", me_ack_values[hfs.ack_data]);
+
+       /* Check status after acknowledgement */
+       intel_early_me_status();
+
+       reset = 0;
+       switch (hfs.ack_data) {
+       case ME_HFS_ACK_CONTINUE:
+               /* Continue to boot */
+               return 0;
+       case ME_HFS_ACK_RESET:
+               /* Non-power cycle reset */
+               set_global_reset(0);
+               reset = 0x06;
+               break;
+       case ME_HFS_ACK_PWR_CYCLE:
+               /* Power cycle reset */
+               set_global_reset(0);
+               reset = 0x0e;
+               break;
+       case ME_HFS_ACK_GBL_RESET:
+               /* Global reset */
+               set_global_reset(1);
+               reset = 0x0e;
+               break;
+       case ME_HFS_ACK_S3:
+       case ME_HFS_ACK_S4:
+       case ME_HFS_ACK_S5:
+               break;
+       }
+
+       /* Perform the requested reset */
+       if (reset) {
+               outb(reset, 0xcf9);
+               cpu_hlt();
+       }
+       return -1;
+}
diff --git a/arch/x86/cpu/ivybridge/lpc.c b/arch/x86/cpu/ivybridge/lpc.c
new file mode 100644 (file)
index 0000000..621ef2c
--- /dev/null
@@ -0,0 +1,48 @@
+/*
+ * From coreboot southbridge/intel/bd82x6x/lpc.c
+ *
+ * Copyright (C) 2008-2009 coresystems GmbH
+ *
+ * SPDX-License-Identifier:    GPL-2.0
+ */
+
+#include <common.h>
+#include <errno.h>
+#include <fdtdec.h>
+#include <pci.h>
+#include <asm/pci.h>
+#include <asm/arch/pch.h>
+
+int lpc_early_init(const void *blob, int node, pci_dev_t dev)
+{
+       struct reg_info {
+               u32 base;
+               u32 size;
+       } values[4], *ptr;
+       int count;
+       int i;
+
+       count = fdtdec_get_int_array_count(blob, node, "gen-dec",
+                       (u32 *)values, sizeof(values) / sizeof(u32));
+       if (count < 0)
+               return -EINVAL;
+
+       /* Set COM1/COM2 decode range */
+       pci_write_config16(dev, LPC_IO_DEC, 0x0010);
+
+       /* Enable PS/2 Keyboard/Mouse, EC areas and COM1 */
+       pci_write_config16(dev, LPC_EN, KBC_LPC_EN | MC_LPC_EN |
+                          GAMEL_LPC_EN | COMA_LPC_EN);
+
+       /* Write all registers but use 0 if we run out of data */
+       count = count * sizeof(u32) / sizeof(values[0]);
+       for (i = 0, ptr = values; i < ARRAY_SIZE(values); i++, ptr++) {
+               u32 reg = 0;
+
+               if (i < count)
+                       reg = ptr->base | PCI_COMMAND_IO | (ptr->size << 16);
+               pci_write_config32(dev, LPC_GENX_DEC(i), reg);
+       }
+
+       return 0;
+}
diff --git a/arch/x86/cpu/ivybridge/me_status.c b/arch/x86/cpu/ivybridge/me_status.c
new file mode 100644 (file)
index 0000000..15cf69f
--- /dev/null
@@ -0,0 +1,195 @@
+/*
+ * From Coreboot src/southbridge/intel/bd82x6x/me_status.c
+ *
+ * Copyright (C) 2011 The Chromium OS Authors. All rights reserved.
+ *
+ * SPDX-License-Identifier:    GPL-2.0
+ */
+
+#include <common.h>
+#include <asm/arch/me.h>
+
+/* HFS1[3:0] Current Working State Values */
+static const char *const me_cws_values[] = {
+       [ME_HFS_CWS_RESET]      = "Reset",
+       [ME_HFS_CWS_INIT]       = "Initializing",
+       [ME_HFS_CWS_REC]        = "Recovery",
+       [ME_HFS_CWS_NORMAL]     = "Normal",
+       [ME_HFS_CWS_WAIT]       = "Platform Disable Wait",
+       [ME_HFS_CWS_TRANS]      = "OP State Transition",
+       [ME_HFS_CWS_INVALID]    = "Invalid CPU Plugged In"
+};
+
+/* HFS1[8:6] Current Operation State Values */
+static const char *const me_opstate_values[] = {
+       [ME_HFS_STATE_PREBOOT]  = "Preboot",
+       [ME_HFS_STATE_M0_UMA]   = "M0 with UMA",
+       [ME_HFS_STATE_M3]       = "M3 without UMA",
+       [ME_HFS_STATE_M0]       = "M0 without UMA",
+       [ME_HFS_STATE_BRINGUP]  = "Bring up",
+       [ME_HFS_STATE_ERROR]    = "M0 without UMA but with error"
+};
+
+/* HFS[19:16] Current Operation Mode Values */
+static const char *const me_opmode_values[] = {
+       [ME_HFS_MODE_NORMAL]    = "Normal",
+       [ME_HFS_MODE_DEBUG]     = "Debug",
+       [ME_HFS_MODE_DIS]       = "Soft Temporary Disable",
+       [ME_HFS_MODE_OVER_JMPR] = "Security Override via Jumper",
+       [ME_HFS_MODE_OVER_MEI]  = "Security Override via MEI Message"
+};
+
+/* HFS[15:12] Error Code Values */
+static const char *const me_error_values[] = {
+       [ME_HFS_ERROR_NONE]     = "No Error",
+       [ME_HFS_ERROR_UNCAT]    = "Uncategorized Failure",
+       [ME_HFS_ERROR_IMAGE]    = "Image Failure",
+       [ME_HFS_ERROR_DEBUG]    = "Debug Failure"
+};
+
+/* GMES[31:28] ME Progress Code */
+static const char *const me_progress_values[] = {
+       [ME_GMES_PHASE_ROM]     = "ROM Phase",
+       [ME_GMES_PHASE_BUP]     = "BUP Phase",
+       [ME_GMES_PHASE_UKERNEL] = "uKernel Phase",
+       [ME_GMES_PHASE_POLICY]  = "Policy Module",
+       [ME_GMES_PHASE_MODULE]  = "Module Loading",
+       [ME_GMES_PHASE_UNKNOWN] = "Unknown",
+       [ME_GMES_PHASE_HOST]    = "Host Communication"
+};
+
+/* GMES[27:24] Power Management Event */
+static const char *const me_pmevent_values[] = {
+       [0x00] = "Clean Moff->Mx wake",
+       [0x01] = "Moff->Mx wake after an error",
+       [0x02] = "Clean global reset",
+       [0x03] = "Global reset after an error",
+       [0x04] = "Clean Intel ME reset",
+       [0x05] = "Intel ME reset due to exception",
+       [0x06] = "Pseudo-global reset",
+       [0x07] = "S0/M0->Sx/M3",
+       [0x08] = "Sx/M3->S0/M0",
+       [0x09] = "Non-power cycle reset",
+       [0x0a] = "Power cycle reset through M3",
+       [0x0b] = "Power cycle reset through Moff",
+       [0x0c] = "Sx/Mx->Sx/Moff"
+};
+
+/* Progress Code 0 states */
+static const char *const me_progress_rom_values[] = {
+       [0x00] = "BEGIN",
+       [0x06] = "DISABLE"
+};
+
+/* Progress Code 1 states */
+static const char *const me_progress_bup_values[] = {
+       [0x00] = "Initialization starts",
+       [0x01] = "Disable the host wake event",
+       [0x04] = "Flow determination start process",
+       [0x08] = "Error reading/matching the VSCC table in the descriptor",
+       [0x0a] = "Check to see if straps say ME DISABLED",
+       [0x0b] = "Timeout waiting for PWROK",
+       [0x0d] = "Possibly handle BUP manufacturing override strap",
+       [0x11] = "Bringup in M3",
+       [0x12] = "Bringup in M0",
+       [0x13] = "Flow detection error",
+       [0x15] = "M3 clock switching error",
+       [0x18] = "M3 kernel load",
+       [0x1c] = "T34 missing - cannot program ICC",
+       [0x1f] = "Waiting for DID BIOS message",
+       [0x20] = "Waiting for DID BIOS message failure",
+       [0x21] = "DID reported an error",
+       [0x22] = "Enabling UMA",
+       [0x23] = "Enabling UMA error",
+       [0x24] = "Sending DID Ack to BIOS",
+       [0x25] = "Sending DID Ack to BIOS error",
+       [0x26] = "Switching clocks in M0",
+       [0x27] = "Switching clocks in M0 error",
+       [0x28] = "ME in temp disable",
+       [0x32] = "M0 kernel load",
+};
+
+/* Progress Code 3 states */
+static const char *const me_progress_policy_values[] = {
+       [0x00] = "Entery into Policy Module",
+       [0x03] = "Received S3 entry",
+       [0x04] = "Received S4 entry",
+       [0x05] = "Received S5 entry",
+       [0x06] = "Received UPD entry",
+       [0x07] = "Received PCR entry",
+       [0x08] = "Received NPCR entry",
+       [0x09] = "Received host wake",
+       [0x0a] = "Received AC<>DC switch",
+       [0x0b] = "Received DRAM Init Done",
+       [0x0c] = "VSCC Data not found for flash device",
+       [0x0d] = "VSCC Table is not valid",
+       [0x0e] = "Flash Partition Boundary is outside address space",
+       [0x0f] = "ME cannot access the chipset descriptor region",
+       [0x10] = "Required VSCC values for flash parts do not match",
+};
+
+void intel_me_status(struct me_hfs *hfs, struct me_gmes *gmes)
+{
+       /* Check Current States */
+       debug("ME: FW Partition Table      : %s\n",
+             hfs->fpt_bad ? "BAD" : "OK");
+       debug("ME: Bringup Loader Failure  : %s\n",
+             hfs->ft_bup_ld_flr ? "YES" : "NO");
+       debug("ME: Firmware Init Complete  : %s\n",
+             hfs->fw_init_complete ? "YES" : "NO");
+       debug("ME: Manufacturing Mode      : %s\n",
+             hfs->mfg_mode ? "YES" : "NO");
+       debug("ME: Boot Options Present    : %s\n",
+             hfs->boot_options_present ? "YES" : "NO");
+       debug("ME: Update In Progress      : %s\n",
+             hfs->update_in_progress ? "YES" : "NO");
+       debug("ME: Current Working State   : %s\n",
+             me_cws_values[hfs->working_state]);
+       debug("ME: Current Operation State : %s\n",
+             me_opstate_values[hfs->operation_state]);
+       debug("ME: Current Operation Mode  : %s\n",
+             me_opmode_values[hfs->operation_mode]);
+       debug("ME: Error Code              : %s\n",
+             me_error_values[hfs->error_code]);
+       debug("ME: Progress Phase          : %s\n",
+             me_progress_values[gmes->progress_code]);
+       debug("ME: Power Management Event  : %s\n",
+             me_pmevent_values[gmes->current_pmevent]);
+
+       debug("ME: Progress Phase State    : ");
+       switch (gmes->progress_code) {
+       case ME_GMES_PHASE_ROM:         /* ROM Phase */
+               debug("%s", me_progress_rom_values[gmes->current_state]);
+               break;
+
+       case ME_GMES_PHASE_BUP:         /* Bringup Phase */
+               if (gmes->current_state < ARRAY_SIZE(me_progress_bup_values) &&
+                   me_progress_bup_values[gmes->current_state])
+                       debug("%s",
+                             me_progress_bup_values[gmes->current_state]);
+               else
+                       debug("0x%02x", gmes->current_state);
+               break;
+
+       case ME_GMES_PHASE_POLICY:      /* Policy Module Phase */
+               if (gmes->current_state <
+                               ARRAY_SIZE(me_progress_policy_values) &&
+                   me_progress_policy_values[gmes->current_state])
+                       debug("%s",
+                             me_progress_policy_values[gmes->current_state]);
+               else
+                       debug("0x%02x", gmes->current_state);
+               break;
+
+       case ME_GMES_PHASE_HOST:        /* Host Communication Phase */
+               if (!gmes->current_state)
+                       debug("Host communication established");
+               else
+                       debug("0x%02x", gmes->current_state);
+               break;
+
+       default:
+               debug("Unknown 0x%02x", gmes->current_state);
+       }
+       debug("\n");
+}
diff --git a/arch/x86/cpu/ivybridge/microcode_intel.c b/arch/x86/cpu/ivybridge/microcode_intel.c
new file mode 100644 (file)
index 0000000..8c11a63
--- /dev/null
@@ -0,0 +1,151 @@
+/*
+ * Copyright (c) 2014 Google, Inc
+ * Copyright (C) 2000 Ronald G. Minnich
+ *
+ * Microcode update for Intel PIII and later CPUs
+ *
+ * SPDX-License-Identifier:    GPL-2.0
+ */
+
+#include <common.h>
+#include <errno.h>
+#include <fdtdec.h>
+#include <libfdt.h>
+#include <asm/cpu.h>
+#include <asm/msr.h>
+#include <asm/processor.h>
+
+/**
+ * struct microcode_update - standard microcode header from Intel
+ *
+ * We read this information out of the device tree and use it to determine
+ * whether the update is applicable or not. We also use the same structure
+ * to read information from the CPU.
+ */
+struct microcode_update {
+       uint header_version;
+       uint update_revision;
+       uint date_code;
+       uint processor_signature;
+       uint checksum;
+       uint loader_revision;
+       uint processor_flags;
+       const void *data;
+       int size;
+};
+
+static int microcode_decode_node(const void *blob, int node,
+                                struct microcode_update *update)
+{
+       update->data = fdt_getprop(blob, node, "data", &update->size);
+       if (!update->data)
+               return -EINVAL;
+
+       update->header_version = fdtdec_get_int(blob, node,
+                                               "intel,header-version", 0);
+       update->update_revision = fdtdec_get_int(blob, node,
+                                                "intel,update-revision", 0);
+       update->date_code = fdtdec_get_int(blob, node,
+                                          "intel,date-code", 0);
+       update->processor_signature = fdtdec_get_int(blob, node,
+                                       "intel.processor-signature", 0);
+       update->checksum = fdtdec_get_int(blob, node, "intel,checksum", 0);
+       update->loader_revision = fdtdec_get_int(blob, node,
+                                                "loader-revision", 0);
+       update->processor_flags = fdtdec_get_int(blob, node,
+                                                "processor-flags", 0);
+
+       return 0;
+}
+
+static uint32_t microcode_read_rev(void)
+{
+       /*
+        * Some Intel CPUs can be very finicky about the CPUID sequence used.
+        * So this is implemented in assembly so that it works reliably.
+        */
+       uint32_t low, high;
+
+       asm volatile (
+               "xorl %%eax, %%eax\n"
+               "xorl %%edx, %%edx\n"
+               "movl $0x8b, %%ecx\n"
+               "wrmsr\n"
+               "movl $0x01, %%eax\n"
+               "cpuid\n"
+               "movl $0x8b, %%ecx\n"
+               "rdmsr\n"
+               : /* outputs */
+               "=a" (low), "=d" (high)
+               : /* inputs */
+               : /* clobbers */
+                "ebx", "ecx"
+       );
+
+       return high;
+}
+
+static void microcode_read_cpu(struct microcode_update *cpu)
+{
+       /* CPUID sets MSR 0x8B iff a microcode update has been loaded. */
+       unsigned int x86_model, x86_family;
+       struct cpuid_result result;
+       uint32_t low, high;
+
+       wrmsr(0x8b, 0, 0);
+       result = cpuid(1);
+       rdmsr(0x8b, low, cpu->update_revision);
+       x86_model = (result.eax >> 4) & 0x0f;
+       x86_family = (result.eax >> 8) & 0x0f;
+       cpu->processor_signature = result.eax;
+
+       cpu->processor_flags = 0;
+       if ((x86_model >= 5) || (x86_family > 6)) {
+               rdmsr(0x17, low, high);
+               cpu->processor_flags = 1 << ((high >> 18) & 7);
+       }
+       debug("microcode: sig=%#x pf=%#x revision=%#x\n",
+             cpu->processor_signature, cpu->processor_flags,
+             cpu->update_revision);
+}
+
+/* Get a microcode update from the device tree and apply it */
+int microcode_update_intel(void)
+{
+       struct microcode_update cpu, update;
+       const void *blob = gd->fdt_blob;
+       int count;
+       int node;
+       int ret;
+
+       microcode_read_cpu(&cpu);
+       node = 0;
+       count = 0;
+       do {
+               node = fdtdec_next_compatible(blob, node,
+                                             COMPAT_INTEL_MICROCODE);
+               if (node < 0) {
+                       debug("%s: Found %d updates\n", __func__, count);
+                       return count ? 0 : -ENOENT;
+               }
+
+               ret = microcode_decode_node(blob, node, &update);
+               if (ret) {
+                       debug("%s: Unable to decode update: %d\n", __func__,
+                             ret);
+                       return ret;
+               }
+               if (update.processor_signature == cpu.processor_signature &&
+                   (update.processor_flags & cpu.processor_flags)) {
+                       debug("%s: Update already exists\n", __func__);
+                       return -EEXIST;
+               }
+
+               wrmsr(0x79, (ulong)update.data, 0);
+               debug("microcode: updated to revision 0x%x date=%04x-%02x-%02x\n",
+                     microcode_read_rev(), update.date_code & 0xffff,
+                     (update.date_code >> 24) & 0xff,
+                     (update.date_code >> 16) & 0xff);
+               count++;
+       } while (1);
+}
diff --git a/arch/x86/cpu/ivybridge/pci.c b/arch/x86/cpu/ivybridge/pci.c
new file mode 100644 (file)
index 0000000..c1ae658
--- /dev/null
@@ -0,0 +1,60 @@
+/*
+ * Copyright (c) 2011 The Chromium OS Authors.
+ * (C) Copyright 2008,2009
+ * Graeme Russ, <graeme.russ@gmail.com>
+ *
+ * (C) Copyright 2002
+ * Daniel Engström, Omicron Ceti AB, <daniel@omicron.se>
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#include <common.h>
+#include <pci.h>
+#include <asm/pci.h>
+
+static void config_pci_bridge(struct pci_controller *hose, pci_dev_t dev,
+                             struct pci_config_table *table)
+{
+       u8 secondary;
+
+       hose->read_byte(hose, dev, PCI_SECONDARY_BUS, &secondary);
+       if (secondary != 0)
+               pci_hose_scan_bus(hose, secondary);
+}
+
+static struct pci_config_table pci_ivybridge_config_table[] = {
+       /* vendor, device, class, bus, dev, func */
+       { PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_BRIDGE_PCI,
+               PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, &config_pci_bridge },
+       {}
+};
+
+void board_pci_setup_hose(struct pci_controller *hose)
+{
+       hose->config_table = pci_ivybridge_config_table;
+       hose->first_busno = 0;
+       hose->last_busno = 0;
+
+       /* PCI memory space */
+       pci_set_region(hose->regions + 0,
+                      CONFIG_PCI_MEM_BUS,
+                      CONFIG_PCI_MEM_PHYS,
+                      CONFIG_PCI_MEM_SIZE,
+                      PCI_REGION_MEM);
+
+       /* PCI IO space */
+       pci_set_region(hose->regions + 1,
+                      CONFIG_PCI_IO_BUS,
+                      CONFIG_PCI_IO_PHYS,
+                      CONFIG_PCI_IO_SIZE,
+                      PCI_REGION_IO);
+
+       pci_set_region(hose->regions + 2,
+                      CONFIG_PCI_PREF_BUS,
+                      CONFIG_PCI_PREF_PHYS,
+                      CONFIG_PCI_PREF_SIZE,
+                      PCI_REGION_PREFETCH);
+
+       hose->region_count = 3;
+}
diff --git a/arch/x86/cpu/ivybridge/report_platform.c b/arch/x86/cpu/ivybridge/report_platform.c
new file mode 100644 (file)
index 0000000..69e31b3
--- /dev/null
@@ -0,0 +1,89 @@
+/*
+ * From Coreboot src/northbridge/intel/sandybridge/report_platform.c
+ *
+ * Copyright (C) 2012 Google Inc.
+ *
+ * SPDX-License-Identifier:    GPL-2.0
+ */
+
+#include <common.h>
+#include <asm/cpu.h>
+#include <asm/pci.h>
+#include <asm/arch/pch.h>
+
+static void report_cpu_info(void)
+{
+       char cpu_string[CPU_MAX_NAME_LEN], *cpu_name;
+       const char *mode[] = {"NOT ", ""};
+       struct cpuid_result cpuidr;
+       int vt, txt, aes;
+       u32 index;
+
+       index = 0x80000000;
+       cpuidr = cpuid(index);
+       if (cpuidr.eax < 0x80000004) {
+               strcpy(cpu_string, "Platform info not available");
+               cpu_name = cpu_string;
+       } else {
+               cpu_name = cpu_get_name(cpu_string);
+       }
+
+       cpuidr = cpuid(1);
+       debug("CPU id(%x): %s\n", cpuidr.eax, cpu_name);
+       aes = (cpuidr.ecx & (1 << 25)) ? 1 : 0;
+       txt = (cpuidr.ecx & (1 << 6)) ? 1 : 0;
+       vt = (cpuidr.ecx & (1 << 5)) ? 1 : 0;
+       debug("AES %ssupported, TXT %ssupported, VT %ssupported\n",
+             mode[aes], mode[txt], mode[vt]);
+}
+
+/* The PCI id name match comes from Intel document 472178 */
+static struct {
+       u16 dev_id;
+       const char *dev_name;
+} pch_table[] = {
+       {0x1E41, "Desktop Sample"},
+       {0x1E42, "Mobile Sample"},
+       {0x1E43, "SFF Sample"},
+       {0x1E44, "Z77"},
+       {0x1E45, "H71"},
+       {0x1E46, "Z75"},
+       {0x1E47, "Q77"},
+       {0x1E48, "Q75"},
+       {0x1E49, "B75"},
+       {0x1E4A, "H77"},
+       {0x1E53, "C216"},
+       {0x1E55, "QM77"},
+       {0x1E56, "QS77"},
+       {0x1E58, "UM77"},
+       {0x1E57, "HM77"},
+       {0x1E59, "HM76"},
+       {0x1E5D, "HM75"},
+       {0x1E5E, "HM70"},
+       {0x1E5F, "NM70"},
+};
+
+static void report_pch_info(void)
+{
+       const char *pch_type = "Unknown";
+       int i;
+       u16 dev_id;
+       uint8_t rev_id;
+
+       dev_id = pci_read_config16(PCH_LPC_DEV, 2);
+       for (i = 0; i < ARRAY_SIZE(pch_table); i++) {
+               if (pch_table[i].dev_id == dev_id) {
+                       pch_type = pch_table[i].dev_name;
+                       break;
+               }
+       }
+       rev_id = pci_read_config8(PCH_LPC_DEV, 8);
+       debug("PCH type: %s, device id: %x, rev id %x\n", pch_type, dev_id,
+             rev_id);
+}
+
+void report_platform_info(void)
+{
+       report_cpu_info();
+       report_pch_info();
+}
diff --git a/arch/x86/cpu/ivybridge/sdram.c b/arch/x86/cpu/ivybridge/sdram.c
new file mode 100644 (file)
index 0000000..df2b990
--- /dev/null
@@ -0,0 +1,571 @@
+/*
+ * Copyright (c) 2011 The Chromium OS Authors.
+ * (C) Copyright 2010,2011
+ * Graeme Russ, <graeme.russ@gmail.com>
+ *
+ * Portions from Coreboot mainboard/google/link/romstage.c
+ * Copyright (C) 2007-2010 coresystems GmbH
+ * Copyright (C) 2011 Google Inc.
+ *
+ * SPDX-License-Identifier:    GPL-2.0
+ */
+
+#include <common.h>
+#include <errno.h>
+#include <fdtdec.h>
+#include <malloc.h>
+#include <asm/processor.h>
+#include <asm/gpio.h>
+#include <asm/global_data.h>
+#include <asm/pci.h>
+#include <asm/arch/me.h>
+#include <asm/arch/pei_data.h>
+#include <asm/arch/pch.h>
+#include <asm/post.h>
+#include <asm/arch/sandybridge.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+/*
+ * This function looks for the highest region of memory lower than 4GB which
+ * has enough space for U-Boot where U-Boot is aligned on a page boundary.
+ * It overrides the default implementation found elsewhere which simply
+ * picks the end of ram, wherever that may be. The location of the stack,
+ * the relocation address, and how far U-Boot is moved by relocation are
+ * set in the global data structure.
+ */
+ulong board_get_usable_ram_top(ulong total_size)
+{
+       struct memory_info *info = &gd->arch.meminfo;
+       uintptr_t dest_addr = 0;
+       struct memory_area *largest = NULL;
+       int i;
+
+       /* Find largest area of memory below 4GB */
+
+       for (i = 0; i < info->num_areas; i++) {
+               struct memory_area *area = &info->area[i];
+
+               if (area->start >= 1ULL << 32)
+                       continue;
+               if (!largest || area->size > largest->size)
+                       largest = area;
+       }
+
+       /* If no suitable area was found, return an error. */
+       assert(largest);
+       if (!largest || largest->size < (2 << 20))
+               panic("No available memory found for relocation");
+
+       dest_addr = largest->start + largest->size;
+
+       return (ulong)dest_addr;
+}
+
+void dram_init_banksize(void)
+{
+       struct memory_info *info = &gd->arch.meminfo;
+       int num_banks;
+       int i;
+
+       for (i = 0, num_banks = 0; i < info->num_areas; i++) {
+               struct memory_area *area = &info->area[i];
+
+               if (area->start >= 1ULL << 32)
+                       continue;
+               gd->bd->bi_dram[num_banks].start = area->start;
+               gd->bd->bi_dram[num_banks].size = area->size;
+               num_banks++;
+       }
+}
+
+static const char *const ecc_decoder[] = {
+       "inactive",
+       "active on IO",
+       "disabled on IO",
+       "active"
+};
+
+/*
+ * Dump in the log memory controller configuration as read from the memory
+ * controller registers.
+ */
+static void report_memory_config(void)
+{
+       u32 addr_decoder_common, addr_decode_ch[2];
+       int i;
+
+       addr_decoder_common = readl(MCHBAR_REG(0x5000));
+       addr_decode_ch[0] = readl(MCHBAR_REG(0x5004));
+       addr_decode_ch[1] = readl(MCHBAR_REG(0x5008));
+
+       debug("memcfg DDR3 clock %d MHz\n",
+             (readl(MCHBAR_REG(0x5e04)) * 13333 * 2 + 50) / 100);
+       debug("memcfg channel assignment: A: %d, B % d, C % d\n",
+             addr_decoder_common & 3,
+             (addr_decoder_common >> 2) & 3,
+             (addr_decoder_common >> 4) & 3);
+
+       for (i = 0; i < ARRAY_SIZE(addr_decode_ch); i++) {
+               u32 ch_conf = addr_decode_ch[i];
+               debug("memcfg channel[%d] config (%8.8x):\n", i, ch_conf);
+               debug("   ECC %s\n", ecc_decoder[(ch_conf >> 24) & 3]);
+               debug("   enhanced interleave mode %s\n",
+                     ((ch_conf >> 22) & 1) ? "on" : "off");
+               debug("   rank interleave %s\n",
+                     ((ch_conf >> 21) & 1) ? "on" : "off");
+               debug("   DIMMA %d MB width x%d %s rank%s\n",
+                     ((ch_conf >> 0) & 0xff) * 256,
+                     ((ch_conf >> 19) & 1) ? 16 : 8,
+                     ((ch_conf >> 17) & 1) ? "dual" : "single",
+                     ((ch_conf >> 16) & 1) ? "" : ", selected");
+               debug("   DIMMB %d MB width x%d %s rank%s\n",
+                     ((ch_conf >> 8) & 0xff) * 256,
+                     ((ch_conf >> 20) & 1) ? 16 : 8,
+                     ((ch_conf >> 18) & 1) ? "dual" : "single",
+                     ((ch_conf >> 16) & 1) ? ", selected" : "");
+       }
+}
+
+static void post_system_agent_init(struct pei_data *pei_data)
+{
+       /* If PCIe init is skipped, set the PEG clock gating */
+       if (!pei_data->pcie_init)
+               setbits_le32(MCHBAR_REG(0x7010), 1);
+}
+
+static asmlinkage void console_tx_byte(unsigned char byte)
+{
+#ifdef DEBUG
+       putc(byte);
+#endif
+}
+
+/**
+ * Find the PEI executable in the ROM and execute it.
+ *
+ * @param pei_data: configuration data for UEFI PEI reference code
+ */
+int sdram_initialise(struct pei_data *pei_data)
+{
+       unsigned version;
+       const char *data;
+       uint16_t done;
+       int ret;
+
+       report_platform_info();
+
+       /* Wait for ME to be ready */
+       ret = intel_early_me_init();
+       if (ret)
+               return ret;
+       ret = intel_early_me_uma_size();
+       if (ret < 0)
+               return ret;
+
+       debug("Starting UEFI PEI System Agent\n");
+
+       /* If MRC data is not found we cannot continue S3 resume. */
+       if (pei_data->boot_mode == PEI_BOOT_RESUME && !pei_data->mrc_input) {
+               debug("Giving up in sdram_initialize: No MRC data\n");
+               outb(0x6, PORT_RESET);
+               cpu_hlt();
+       }
+
+       /* Pass console handler in pei_data */
+       pei_data->tx_byte = console_tx_byte;
+
+       debug("PEI data at %p, size %x:\n", pei_data, sizeof(*pei_data));
+
+       data = (char *)CONFIG_X86_MRC_START;
+       if (data) {
+               int rv;
+               int (*func)(struct pei_data *);
+
+               debug("Calling MRC at %p\n", data);
+               post_code(POST_PRE_MRC);
+               func = (int (*)(struct pei_data *))data;
+               rv = func(pei_data);
+               post_code(POST_MRC);
+               if (rv) {
+                       switch (rv) {
+                       case -1:
+                               printf("PEI version mismatch.\n");
+                               break;
+                       case -2:
+                               printf("Invalid memory frequency.\n");
+                               break;
+                       default:
+                               printf("MRC returned %x.\n", rv);
+                       }
+                       printf("Nonzero MRC return value.\n");
+                       return -EFAULT;
+               }
+       } else {
+               printf("UEFI PEI System Agent not found.\n");
+               return -ENOSYS;
+       }
+
+#if CONFIG_USBDEBUG
+       /* mrc.bin reconfigures USB, so reinit it to have debug */
+       early_usbdebug_init();
+#endif
+
+       version = readl(MCHBAR_REG(0x5034));
+       debug("System Agent Version %d.%d.%d Build %d\n",
+             version >> 24 , (version >> 16) & 0xff,
+             (version >> 8) & 0xff, version & 0xff);
+
+       /*
+        * Send ME init done for SandyBridge here.  This is done inside the
+        * SystemAgent binary on IvyBridge
+        */
+       done = pci_read_config32(PCH_DEV, PCI_DEVICE_ID);
+       done &= BASE_REV_MASK;
+       if (BASE_REV_SNB == done)
+               intel_early_me_init_done(ME_INIT_STATUS_SUCCESS);
+       else
+               intel_early_me_status();
+
+       post_system_agent_init(pei_data);
+       report_memory_config();
+
+       return 0;
+}
+
+static int copy_spd(struct pei_data *peid)
+{
+       const int gpio_vector[] = {41, 42, 43, 10, -1};
+       int spd_index;
+       const void *blob = gd->fdt_blob;
+       int node, spd_node;
+       int ret, i;
+
+       for (i = 0; ; i++) {
+               if (gpio_vector[i] == -1)
+                       break;
+               ret = gpio_requestf(gpio_vector[i], "spd_id%d", i);
+               if (ret) {
+                       debug("%s: Could not request gpio %d\n", __func__,
+                             gpio_vector[i]);
+                       return ret;
+               }
+       }
+       spd_index = gpio_get_values_as_int(gpio_vector);
+       debug("spd index %d\n", spd_index);
+       node = fdtdec_next_compatible(blob, 0, COMPAT_MEMORY_SPD);
+       if (node < 0) {
+               printf("SPD data not found.\n");
+               return -ENOENT;
+       }
+
+       for (spd_node = fdt_first_subnode(blob, node);
+            spd_node > 0;
+            spd_node = fdt_next_subnode(blob, spd_node)) {
+               const char *data;
+               int len;
+
+               if (fdtdec_get_int(blob, spd_node, "reg", -1) != spd_index)
+                       continue;
+               data = fdt_getprop(blob, spd_node, "data", &len);
+               if (len < sizeof(peid->spd_data[0])) {
+                       printf("Missing SPD data\n");
+                       return -EINVAL;
+               }
+
+               debug("Using SDRAM SPD data for '%s'\n",
+                     fdt_get_name(blob, spd_node, NULL));
+               memcpy(peid->spd_data[0], data, sizeof(peid->spd_data[0]));
+               break;
+       }
+
+       if (spd_node < 0) {
+               printf("No SPD data found for index %d\n", spd_index);
+               return -ENOENT;
+       }
+
+       return 0;
+}
+
+/**
+ * add_memory_area() - Add a new usable memory area to our list
+ *
+ * Note: @start and @end must not span the first 4GB boundary
+ *
+ * @info:      Place to store memory info
+ * @start:     Start of this memory area
+ * @end:       End of this memory area + 1
+ */
+static int add_memory_area(struct memory_info *info,
+                          uint64_t start, uint64_t end)
+{
+       struct memory_area *ptr;
+
+       if (info->num_areas == CONFIG_NR_DRAM_BANKS)
+               return -ENOSPC;
+
+       ptr = &info->area[info->num_areas];
+       ptr->start = start;
+       ptr->size = end - start;
+       info->total_memory += ptr->size;
+       if (ptr->start < (1ULL << 32))
+               info->total_32bit_memory += ptr->size;
+       debug("%d: memory %llx size %llx, total now %llx / %llx\n",
+             info->num_areas, ptr->start, ptr->size,
+             info->total_32bit_memory, info->total_memory);
+       info->num_areas++;
+
+       return 0;
+}
+
+/**
+ * sdram_find() - Find available memory
+ *
+ * This is a bit complicated since on x86 there are system memory holes all
+ * over the place. We create a list of available memory blocks
+ */
+static int sdram_find(pci_dev_t dev)
+{
+       struct memory_info *info = &gd->arch.meminfo;
+       uint32_t tseg_base, uma_size, tolud;
+       uint64_t tom, me_base, touud;
+       uint64_t uma_memory_base = 0;
+       uint64_t uma_memory_size;
+       unsigned long long tomk;
+       uint16_t ggc;
+
+       /* Total Memory 2GB example:
+        *
+        *  00000000  0000MB-1992MB  1992MB  RAM     (writeback)
+        *  7c800000  1992MB-2000MB     8MB  TSEG    (SMRR)
+        *  7d000000  2000MB-2002MB     2MB  GFX GTT (uncached)
+        *  7d200000  2002MB-2034MB    32MB  GFX UMA (uncached)
+        *  7f200000   2034MB TOLUD
+        *  7f800000   2040MB MEBASE
+        *  7f800000  2040MB-2048MB     8MB  ME UMA  (uncached)
+        *  80000000   2048MB TOM
+        * 100000000  4096MB-4102MB     6MB  RAM     (writeback)
+        *
+        * Total Memory 4GB example:
+        *
+        *  00000000  0000MB-2768MB  2768MB  RAM     (writeback)
+        *  ad000000  2768MB-2776MB     8MB  TSEG    (SMRR)
+        *  ad800000  2776MB-2778MB     2MB  GFX GTT (uncached)
+        *  ada00000  2778MB-2810MB    32MB  GFX UMA (uncached)
+        *  afa00000   2810MB TOLUD
+        *  ff800000   4088MB MEBASE
+        *  ff800000  4088MB-4096MB     8MB  ME UMA  (uncached)
+        * 100000000   4096MB TOM
+        * 100000000  4096MB-5374MB  1278MB  RAM     (writeback)
+        * 14fe00000   5368MB TOUUD
+        */
+
+       /* Top of Upper Usable DRAM, including remap */
+       touud = pci_read_config32(dev, TOUUD+4);
+       touud <<= 32;
+       touud |= pci_read_config32(dev, TOUUD);
+
+       /* Top of Lower Usable DRAM */
+       tolud = pci_read_config32(dev, TOLUD);
+
+       /* Top of Memory - does not account for any UMA */
+       tom = pci_read_config32(dev, 0xa4);
+       tom <<= 32;
+       tom |= pci_read_config32(dev, 0xa0);
+
+       debug("TOUUD %llx TOLUD %08x TOM %llx\n", touud, tolud, tom);
+
+       /* ME UMA needs excluding if total memory <4GB */
+       me_base = pci_read_config32(dev, 0x74);
+       me_base <<= 32;
+       me_base |= pci_read_config32(dev, 0x70);
+
+       debug("MEBASE %llx\n", me_base);
+
+       /* TODO: Get rid of all this shifting by 10 bits */
+       tomk = tolud >> 10;
+       if (me_base == tolud) {
+               /* ME is from MEBASE-TOM */
+               uma_size = (tom - me_base) >> 10;
+               /* Increment TOLUD to account for ME as RAM */
+               tolud += uma_size << 10;
+               /* UMA starts at old TOLUD */
+               uma_memory_base = tomk * 1024ULL;
+               uma_memory_size = uma_size * 1024ULL;
+               debug("ME UMA base %llx size %uM\n", me_base, uma_size >> 10);
+       }
+
+       /* Graphics memory comes next */
+       ggc = pci_read_config16(dev, GGC);
+       if (!(ggc & 2)) {
+               debug("IGD decoded, subtracting ");
+
+               /* Graphics memory */
+               uma_size = ((ggc >> 3) & 0x1f) * 32 * 1024ULL;
+               debug("%uM UMA", uma_size >> 10);
+               tomk -= uma_size;
+               uma_memory_base = tomk * 1024ULL;
+               uma_memory_size += uma_size * 1024ULL;
+
+               /* GTT Graphics Stolen Memory Size (GGMS) */
+               uma_size = ((ggc >> 8) & 0x3) * 1024ULL;
+               tomk -= uma_size;
+               uma_memory_base = tomk * 1024ULL;
+               uma_memory_size += uma_size * 1024ULL;
+               debug(" and %uM GTT\n", uma_size >> 10);
+       }
+
+       /* Calculate TSEG size from its base which must be below GTT */
+       tseg_base = pci_read_config32(dev, 0xb8);
+       uma_size = (uma_memory_base - tseg_base) >> 10;
+       tomk -= uma_size;
+       uma_memory_base = tomk * 1024ULL;
+       uma_memory_size += uma_size * 1024ULL;
+       debug("TSEG base 0x%08x size %uM\n", tseg_base, uma_size >> 10);
+
+       debug("Available memory below 4GB: %lluM\n", tomk >> 10);
+
+       /* Report the memory regions */
+       add_memory_area(info, 1 << 20, 2 << 28);
+       add_memory_area(info, (2 << 28) + (2 << 20), 4 << 28);
+       add_memory_area(info, (4 << 28) + (2 << 20), tseg_base);
+       add_memory_area(info, 1ULL << 32, touud);
+       /*
+        * If >= 4GB installed then memory from TOLUD to 4GB
+        * is remapped above TOM, TOUUD will account for both
+        */
+       if (touud > (1ULL << 32ULL)) {
+               debug("Available memory above 4GB: %lluM\n",
+                     (touud >> 20) - 4096);
+       }
+
+       return 0;
+}
+
+static void rcba_config(void)
+{
+       /*
+        *             GFX    INTA -> PIRQA (MSI)
+        * D28IP_P3IP  WLAN   INTA -> PIRQB
+        * D29IP_E1P   EHCI1  INTA -> PIRQD
+        * D26IP_E2P   EHCI2  INTA -> PIRQF
+        * D31IP_SIP   SATA   INTA -> PIRQF (MSI)
+        * D31IP_SMIP  SMBUS  INTB -> PIRQH
+        * D31IP_TTIP  THRT   INTC -> PIRQA
+        * D27IP_ZIP   HDA    INTA -> PIRQA (MSI)
+        *
+        * TRACKPAD                -> PIRQE (Edge Triggered)
+        * TOUCHSCREEN             -> PIRQG (Edge Triggered)
+        */
+
+       /* Device interrupt pin register (board specific) */
+       writel((INTC << D31IP_TTIP) | (NOINT << D31IP_SIP2) |
+              (INTB << D31IP_SMIP) | (INTA << D31IP_SIP), RCB_REG(D31IP));
+       writel(NOINT << D30IP_PIP, RCB_REG(D30IP));
+       writel(INTA << D29IP_E1P, RCB_REG(D29IP));
+       writel(INTA << D28IP_P3IP, RCB_REG(D28IP));
+       writel(INTA << D27IP_ZIP, RCB_REG(D27IP));
+       writel(INTA << D26IP_E2P, RCB_REG(D26IP));
+       writel(NOINT << D25IP_LIP, RCB_REG(D25IP));
+       writel(NOINT << D22IP_MEI1IP, RCB_REG(D22IP));
+
+       /* Device interrupt route registers */
+       writel(DIR_ROUTE(PIRQB, PIRQH, PIRQA, PIRQC), RCB_REG(D31IR));
+       writel(DIR_ROUTE(PIRQD, PIRQE, PIRQF, PIRQG), RCB_REG(D29IR));
+       writel(DIR_ROUTE(PIRQB, PIRQC, PIRQD, PIRQE), RCB_REG(D28IR));
+       writel(DIR_ROUTE(PIRQA, PIRQH, PIRQA, PIRQB), RCB_REG(D27IR));
+       writel(DIR_ROUTE(PIRQF, PIRQE, PIRQG, PIRQH), RCB_REG(D26IR));
+       writel(DIR_ROUTE(PIRQA, PIRQB, PIRQC, PIRQD), RCB_REG(D25IR));
+       writel(DIR_ROUTE(PIRQA, PIRQB, PIRQC, PIRQD), RCB_REG(D22IR));
+
+       /* Enable IOAPIC (generic) */
+       writew(0x0100, RCB_REG(OIC));
+       /* PCH BWG says to read back the IOAPIC enable register */
+       (void)readw(RCB_REG(OIC));
+
+       /* Disable unused devices (board specific) */
+       setbits_le32(RCB_REG(FD), PCH_DISABLE_ALWAYS);
+}
+
+int dram_init(void)
+{
+       struct pei_data pei_data __aligned(8) = {
+               .pei_version = PEI_VERSION,
+               .mchbar = DEFAULT_MCHBAR,
+               .dmibar = DEFAULT_DMIBAR,
+               .epbar = DEFAULT_EPBAR,
+               .pciexbar = CONFIG_MMCONF_BASE_ADDRESS,
+               .smbusbar = SMBUS_IO_BASE,
+               .wdbbar = 0x4000000,
+               .wdbsize = 0x1000,
+               .hpet_address = CONFIG_HPET_ADDRESS,
+               .rcba = DEFAULT_RCBABASE,
+               .pmbase = DEFAULT_PMBASE,
+               .gpiobase = DEFAULT_GPIOBASE,
+               .thermalbase = 0xfed08000,
+               .system_type = 0, /* 0 Mobile, 1 Desktop/Server */
+               .tseg_size = CONFIG_SMM_TSEG_SIZE,
+               .ts_addresses = { 0x00, 0x00, 0x00, 0x00 },
+               .ec_present = 1,
+               .ddr3lv_support = 1,
+               /*
+                * 0 = leave channel enabled
+                * 1 = disable dimm 0 on channel
+                * 2 = disable dimm 1 on channel
+                * 3 = disable dimm 0+1 on channel
+                */
+               .dimm_channel0_disabled = 2,
+               .dimm_channel1_disabled = 2,
+               .max_ddr3_freq = 1600,
+               .usb_port_config = {
+                       /*
+                        * Empty and onboard Ports 0-7, set to un-used pin
+                        * OC3
+                        */
+                       { 0, 3, 0x0000 }, /* P0= Empty */
+                       { 1, 0, 0x0040 }, /* P1= Left USB 1  (OC0) */
+                       { 1, 1, 0x0040 }, /* P2= Left USB 2  (OC1) */
+                       { 1, 3, 0x0040 }, /* P3= SDCARD      (no OC) */
+                       { 0, 3, 0x0000 }, /* P4= Empty */
+                       { 1, 3, 0x0040 }, /* P5= WWAN        (no OC) */
+                       { 0, 3, 0x0000 }, /* P6= Empty */
+                       { 0, 3, 0x0000 }, /* P7= Empty */
+                       /*
+                        * Empty and onboard Ports 8-13, set to un-used pin
+                        * OC4
+                        */
+                       { 1, 4, 0x0040 }, /* P8= Camera      (no OC) */
+                       { 1, 4, 0x0040 }, /* P9= Bluetooth   (no OC) */
+                       { 0, 4, 0x0000 }, /* P10= Empty */
+                       { 0, 4, 0x0000 }, /* P11= Empty */
+                       { 0, 4, 0x0000 }, /* P12= Empty */
+                       { 0, 4, 0x0000 }, /* P13= Empty */
+               },
+       };
+       pci_dev_t dev = PCI_BDF(0, 0, 0);
+       int ret;
+
+       debug("Boot mode %d\n", gd->arch.pei_boot_mode);
+       debug("mcr_input %p\n", pei_data.mrc_input);
+       pei_data.boot_mode = gd->arch.pei_boot_mode;
+       ret = copy_spd(&pei_data);
+       if (!ret)
+               ret = sdram_initialise(&pei_data);
+       if (ret)
+               return ret;
+
+       rcba_config();
+       quick_ram_check();
+
+       writew(0xCAFE, MCHBAR_REG(SSKPD));
+
+       post_code(POST_DRAM);
+
+       ret = sdram_find(dev);
+       if (ret)
+               return ret;
+
+       gd->ram_size = gd->arch.meminfo.total_32bit_memory;
+
+       return 0;
+}
diff --git a/arch/x86/cpu/pci.c b/arch/x86/cpu/pci.c
new file mode 100644 (file)
index 0000000..e399388
--- /dev/null
@@ -0,0 +1,98 @@
+/*
+ * Copyright (c) 2011 The Chromium OS Authors.
+ * (C) Copyright 2008,2009
+ * Graeme Russ, <graeme.russ@gmail.com>
+ *
+ * (C) Copyright 2002
+ * Daniel Engström, Omicron Ceti AB, <daniel@omicron.se>
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#include <common.h>
+#include <errno.h>
+#include <malloc.h>
+#include <pci.h>
+#include <asm/pci.h>
+
+static struct pci_controller x86_hose;
+
+int pci_early_init_hose(struct pci_controller **hosep)
+{
+       struct pci_controller *hose;
+
+       hose = calloc(1, sizeof(struct pci_controller));
+       if (!hose)
+               return -ENOMEM;
+
+       board_pci_setup_hose(hose);
+       pci_setup_type1(hose);
+       gd->arch.hose = hose;
+       *hosep = hose;
+
+       return 0;
+}
+
+void pci_init_board(void)
+{
+       struct pci_controller *hose = &x86_hose;
+
+       /* Stop using the early hose */
+       gd->arch.hose = NULL;
+
+       board_pci_setup_hose(hose);
+       pci_setup_type1(hose);
+       pci_register_hose(hose);
+
+       hose->last_busno = pci_hose_scan(hose);
+}
+
+static struct pci_controller *get_hose(void)
+{
+       if (gd->arch.hose)
+               return gd->arch.hose;
+
+       return pci_bus_to_hose(0);
+}
+
+unsigned int pci_read_config8(pci_dev_t dev, unsigned where)
+{
+       uint8_t value;
+
+       pci_hose_read_config_byte(get_hose(), dev, where, &value);
+
+       return value;
+}
+
+unsigned int pci_read_config16(pci_dev_t dev, unsigned where)
+{
+       uint16_t value;
+
+       pci_hose_read_config_word(get_hose(), dev, where, &value);
+
+       return value;
+}
+
+unsigned int pci_read_config32(pci_dev_t dev, unsigned where)
+{
+       uint32_t value;
+
+       pci_hose_read_config_dword(get_hose(), dev, where, &value);
+
+       return value;
+}
+
+void pci_write_config8(pci_dev_t dev, unsigned where, unsigned value)
+{
+       pci_hose_write_config_byte(get_hose(), dev, where, value);
+}
+
+void pci_write_config16(pci_dev_t dev, unsigned where, unsigned value)
+{
+       pci_hose_write_config_word(get_hose(), dev, where, value);
+}
+
+void pci_write_config32(pci_dev_t dev, unsigned where, unsigned value)
+{
+       pci_hose_write_config_dword(get_hose(), dev, where, value);
+}
index 338bab19e471fdd3f4ab088aa999afeb2e10145e..b0d0ac0610b158be02ac05327214e7219d2f0323 100644 (file)
@@ -13,6 +13,7 @@
 #include <config.h>
 #include <version.h>
 #include <asm/global_data.h>
+#include <asm/post.h>
 #include <asm/processor.h>
 #include <asm/processor-flags.h>
 #include <generated/generic-asm-offsets.h>
@@ -49,6 +50,8 @@ _start:
         */
        movw    $GD_FLG_COLD_BOOT, %bx
 1:
+       /* Save BIST */
+       movl    %eax, %ebp
 
        /* Load the segement registes to match the gdt loaded in start16.S */
        movl    $(X86_GDT_ENTRY_32BIT_DS * X86_GDT_ENTRY_SIZE), %eax
@@ -65,6 +68,7 @@ _start:
        jmp     early_board_init
 .globl early_board_init_ret
 early_board_init_ret:
+       post_code(POST_START)
 
        /* Initialise Cache-As-RAM */
        jmp     car_init
@@ -74,16 +78,29 @@ car_init_ret:
         * We now have CONFIG_SYS_CAR_SIZE bytes of Cache-As-RAM (or SRAM,
         * or fully initialised SDRAM - we really don't care which)
         * starting at CONFIG_SYS_CAR_ADDR to be used as a temporary stack
+        * and early malloc area. The MRC requires some space at the top.
+        *
+        * Stack grows down from top of CAR. We have:
+        *
+        * top-> CONFIG_SYS_CAR_ADDR + CONFIG_SYS_CAR_SIZE
+        *      MRC area
+        *      global_data
+        *      x86 global descriptor table
+        *      early malloc area
+        *      stack
+        * bottom-> CONFIG_SYS_CAR_ADDR
         */
-
-       /* Stack grows down from top of CAR */
-       movl    $(CONFIG_SYS_CAR_ADDR + CONFIG_SYS_CAR_SIZE), %esp
+       movl    $(CONFIG_SYS_CAR_ADDR + CONFIG_SYS_CAR_SIZE - 4), %esp
+#ifdef CONFIG_DCACHE_RAM_MRC_VAR_SIZE
+       subl    $CONFIG_DCACHE_RAM_MRC_VAR_SIZE, %esp
+#endif
 
        /* Reserve space on stack for global data */
        subl    $GENERATED_GBL_DATA_SIZE, %esp
 
        /* Align global data to 16-byte boundary */
        andl    $0xfffffff0, %esp
+       post_code(POST_START_STACK)
 
        /* Zero the global data since it won't happen later */
        xorl    %eax, %eax
@@ -91,31 +108,36 @@ car_init_ret:
        movl    %esp, %edi
        rep     stosb
 
-       /* Setup first parameter to setup_gdt */
+       /* Setup first parameter to setup_gdt, pointer to global_data */
        movl    %esp, %eax
 
        /* Reserve space for global descriptor table */
        subl    $X86_GDT_SIZE, %esp
 
+       /* Align temporary global descriptor table to 16-byte boundary */
+       andl    $0xfffffff0, %esp
+       movl    %esp, %ecx
+
 #if defined(CONFIG_SYS_MALLOC_F_LEN)
        subl    $CONFIG_SYS_MALLOC_F_LEN, %esp
        movl    %eax, %edx
        addl    $GD_MALLOC_BASE, %edx
        movl    %esp, (%edx)
 #endif
-
-       /* Align temporary global descriptor table to 16-byte boundary */
-       andl    $0xfffffff0, %esp
+       /* Store BIST */
+       movl    %eax, %edx
+       addl    $GD_BIST, %edx
+       movl    %ebp, (%edx)
 
        /* Set second parameter to setup_gdt */
-       movl    %esp, %edx
+       movl    %ecx, %edx
 
        /* Setup global descriptor table so gd->xyz works */
        call    setup_gdt
 
        /* Set parameter to board_init_f() to boot flags */
+       post_code(POST_START_DONE)
        xorl    %eax, %eax
-       movw    %bx, %ax
 
        /* Enter, U-boot! */
        call    board_init_f
index 6968fda6494998d1d595c9862e64a10a8082a3e1..9550502e9ae8f58e79f24929945058a006924d4a 100644 (file)
 .code16
 .globl start16
 start16:
+       /* Save BIST */
+       movl    %eax, %ecx
+
        /* Set the Cold Boot / Hard Reset flag */
        movl    $GD_FLG_COLD_BOOT, %ebx
 
-       /*
-        * First we let the BSP do some early initialization
-        * this code have to map the flash to its final position
-        */
-       jmp     board_init16
-.globl board_init16_ret
-board_init16_ret:
+       xorl    %eax, %eax
+       movl    %eax, %cr3    /* Invalidate TLB */
 
-       /* Turn of cache (this might require a 486-class CPU) */
+       /* Turn off cache (this might require a 486-class CPU) */
        movl    %cr0, %eax
        orl     $(X86_CR0_NW | X86_CR0_CD), %eax
        movl    %eax, %cr0
@@ -50,9 +48,11 @@ o32 cs       lgdt    gdt_ptr
        /* Flush the prefetch queue */
        jmp     ff
 ff:
-       /* Finally jump to the 32bit initialization code */
+
+       /* Finally restore BIST and jump to the 32bit initialization code */
        movw    $code32start, %ax
        movw    %ax, %bp
+       movl    %ecx, %eax
 o32 cs ljmp    *(%bp)
 
        /* 48-bit far pointer */
index 48265ef6dd45b6d9af18950a9355fcfd918a2638..bb3b116533e8f31c5e7b7e9478b3f960fa6374a5 100644 (file)
@@ -1,4 +1,5 @@
 dtb-y += link.dtb \
+       chromebook_link.dtb \
        alex.dtb
 
 targets += $(dtb-y)
diff --git a/arch/x86/dts/chromebook_link.dts b/arch/x86/dts/chromebook_link.dts
new file mode 120000 (symlink)
index 0000000..6f8c5cd
--- /dev/null
@@ -0,0 +1 @@
+link.dts
\ No newline at end of file
index f2fcb3927cbbb323f30c69468c8aaf687b390f06..932991604f7c9503af72210faefddebbabf941b9 100644 (file)
 
        gpioa {
                compatible = "intel,ich6-gpio";
+               u-boot,dm-pre-reloc;
                reg = <0 0x10>;
                bank-name = "A";
        };
 
        gpiob {
                compatible = "intel,ich6-gpio";
+               u-boot,dm-pre-reloc;
                reg = <0x30 0x10>;
                bank-name = "B";
        };
 
        gpioc {
                compatible = "intel,ich6-gpio";
+               u-boot,dm-pre-reloc;
                reg = <0x40 0x10>;
                bank-name = "C";
        };
        chosen { };
        memory { device_type = "memory"; reg = <0 0>; };
 
+       spd {
+               compatible = "memory-spd";
+               #address-cells = <1>;
+               #size-cells = <0>;
+               elpida_4Gb_1600_x16 {
+                       reg = <0>;
+                       data = [92 10 0b 03 04 19 02 02
+                               03 52 01 08 0a 00 fe 00
+                               69 78 69 3c 69 11 18 81
+                               20 08 3c 3c 01 40 83 81
+                               00 00 00 00 00 00 00 00
+                               00 00 00 00 00 00 00 00
+                               00 00 00 00 00 00 00 00
+                               00 00 00 00 0f 11 42 00
+                               00 00 00 00 00 00 00 00
+                               00 00 00 00 00 00 00 00
+                               00 00 00 00 00 00 00 00
+                               00 00 00 00 00 00 00 00
+                               00 00 00 00 00 00 00 00
+                               00 00 00 00 00 00 00 00
+                               00 00 00 00 00 02 fe 00
+                               11 52 00 00 00 07 7f 37
+                               45 42 4a 32 30 55 47 36
+                               45 42 55 30 2d 47 4e 2d
+                               46 20 30 20 02 fe 00 00
+                               00 00 00 00 00 00 00 00
+                               00 00 00 00 00 00 00 00
+                               00 00 00 00 00 00 00 00
+                               00 00 00 00 00 00 00 00
+                               00 00 00 00 00 00 00 00
+                               00 00 00 00 00 00 00 00
+                               00 00 00 00 00 00 00 00
+                               00 00 00 00 00 00 00 00
+                               00 00 00 00 00 00 00 00
+                               00 00 00 00 00 00 00 00
+                               00 00 00 00 00 00 00 00
+                               00 00 00 00 00 00 00 00
+                               00 00 00 00 00 00 00 00];
+               };
+               samsung_4Gb_1600_1.35v_x16 {
+                       reg = <1>;
+                       data = [92 11 0b 03 04 19 02 02
+                               03 11 01 08 0a 00 fe 00
+                               69 78 69 3c 69 11 18 81
+                               f0 0a 3c 3c 01 40 83 01
+                               00 80 00 00 00 00 00 00
+                               00 00 00 00 00 00 00 00
+                               00 00 00 00 00 00 00 00
+                               00 00 00 00 0f 11 02 00
+                               00 00 00 00 00 00 00 00
+                               00 00 00 00 00 00 00 00
+                               00 00 00 00 00 00 00 00
+                               00 00 00 00 00 00 00 00
+                               00 00 00 00 00 00 00 00
+                               00 00 00 00 00 00 00 00
+                               00 00 00 00 00 80 ce 01
+                               00 00 00 00 00 00 6a 04
+                               4d 34 37 31 42 35 36 37
+                               34 42 48 30 2d 59 4b 30
+                               20 20 00 00 80 ce 00 00
+                               00 00 00 00 00 00 00 00
+                               00 00 00 00 00 00 00 00
+                               00 00 00 00 00 00 00 00
+                               00 00 00 00 00 00 00 00
+                               00 00 00 00 00 00 00 00
+                               00 00 00 00 00 00 00 00
+                               00 00 00 00 00 00 00 00
+                               00 00 00 00 00 00 00 00
+                               00 00 00 00 00 00 00 00
+                               00 00 00 00 00 00 00 00
+                               00 00 00 00 00 00 00 00
+                               00 00 00 00 00 00 00 00
+                               00 00 00 00 00 00 00 00];
+                       };
+               micron_4Gb_1600_1.35v_x16 {
+                       reg = <2>;
+                       data = [92 11 0b 03 04 19 02 02
+                               03 11 01 08 0a 00 fe 00
+                               69 78 69 3c 69 11 18 81
+                               20 08 3c 3c 01 40 83 05
+                               00 00 00 00 00 00 00 00
+                               00 00 00 00 00 00 00 00
+                               00 00 00 00 00 00 00 00
+                               00 00 00 00 0f 01 02 00
+                               00 00 00 00 00 00 00 00
+                               00 00 00 00 00 00 00 00
+                               00 00 00 00 00 00 00 00
+                               00 00 00 00 00 00 00 00
+                               00 00 00 00 00 00 00 00
+                               00 00 00 00 00 00 00 00
+                               00 00 00 00 00 80 2c 00
+                               00 00 00 00 00 00 ad 75
+                               34 4b 54 46 32 35 36 36
+                               34 48 5a 2d 31 47 36 45
+                               31 20 45 31 80 2c 00 00
+                               00 00 00 00 00 00 00 00
+                               00 00 00 00 00 00 00 00
+                               00 00 00 00 00 00 00 00
+                               ff ff ff ff ff ff ff ff
+                               ff ff ff ff ff ff ff ff
+                               ff ff ff ff ff ff ff ff
+                               ff ff ff ff ff ff ff ff
+                               ff ff ff ff ff ff ff ff
+                               ff ff ff ff ff ff ff ff
+                               ff ff ff ff ff ff ff ff
+                               ff ff ff ff ff ff ff ff
+                               ff ff ff ff ff ff ff ff
+                               ff ff ff ff ff ff ff ff];
+               };
+       };
+
        spi {
                #address-cells = <1>;
                #size-cells = <0>;
                compatible = "intel,lpc";
                #address-cells = <1>;
                #size-cells = <1>;
+               gen-dec = <0x800 0xfc 0x900 0xfc>;
                cros-ec@200 {
                        compatible = "google,cros-ec";
                        reg = <0x204 1 0x200 1 0x880 0x80>;
                        };
                };
        };
+
+       microcode {
+               update@0 {
+#include "m12206a7_00000028.dtsi"
+               };
+               update@1 {
+#include "m12306a9_00000017.dtsi"
+               };
+       };
+
 };
diff --git a/arch/x86/dts/m12206a7_00000028.dtsi b/arch/x86/dts/m12206a7_00000028.dtsi
new file mode 100644 (file)
index 0000000..bcd5248
--- /dev/null
@@ -0,0 +1,622 @@
+/*
+ * Copyright (c) <1995-2013>, Intel Corporation.
+ * All rights reserved.
+ *
+ * Redistribution. Redistribution and use in binary form, without modification, are
+ * permitted provided that the following conditions are met:
+ *     .Redistributions must reproduce the above copyright notice and the following
+ * disclaimer in the documentation and/or other materials provided with the
+ * distribution.
+ * Neither the name of Intel Corporation nor the names of its suppliers may be used
+ * to endorse or promote products derived from this software without specific prior
+ * written permission.
+ *     .No reverse engineering, decompilation, or disassembly of this software is
+ * permitted.
+ *     ."Binary form" includes any format commonly used for electronic conveyance
+ * which is a reversible, bit-exact translation of binary representation to ASCII or
+ * ISO text, for example, "uuencode."
+ *
+ * DISCLAIMER. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT
+ * HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
+ * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ *---
+ * This is a device tree fragment. Use #include to add these properties to a
+ * node.
+ */
+
+compatible = "intel,microcode";
+intel,header-version = <1>;
+intel,update-revision = <0x28>;
+intel,date-code = <0x04242012>;
+intel,processor-signature = <0x000206a7>;
+intel,checksum = <0xf3e9935d>;
+intel,loader-revision = <1>;
+intel,processor-flags = <0x12>;
+
+/* The 48-byte public header is omitted. */
+data = <
+       0x00000000      0x000000a1      0x00020001      0x00000028
+       0x00000000      0x00000000      0x20120423      0x000008f1
+       0x00000001      0x000206a7      0x00000000      0x00000000
+       0x00000000      0x00000000      0x00000000      0x00000000
+       0x00000000      0x000008f1      0x00000000      0x00000000
+       0x00000000      0x00000000      0x00000000      0x00000000
+       0x52b813ac      0xdb8994c7      0x70e9f6bb      0x9d6db2ff
+       0xf4d70f5d      0x5b1eccf6      0xac59106f      0x0ae2e2c1
+       0x1a7bbeb1      0x355a1d62      0x2e7eb594      0x09f8dea9
+       0x432a49e4      0xbf520253      0xdafa4010      0x893a858a
+       0x766e0efb      0xd91e196d      0x838bd2ef      0xe5146494
+       0xd515f413      0x29704828      0xe85598b6      0xdcbe6c51
+       0x88eabbfa      0xa1e8909f      0xd8931721      0x35386554
+       0x089a78a7      0xd9914775      0xd4644748      0x1556a4dc
+       0xf44448f6      0xd054d7db      0xf30f2b7d      0x5ae223d0
+       0xcbbb48b0      0x5c8b0383      0x177de157      0x9c1e5f73
+       0x2ec28289      0xd72a7b6c      0x823b6eb2      0x35e02171
+       0xba8deae4      0x06f4d468      0x13dbafaa      0x72b419f1
+       0x033385b5      0x05806920      0x4c6034cf      0x9bd117dc
+       0x976e2d04      0x250330f0      0x7250b5e1      0x184980c2
+       0x12a9d7d6      0x1bc808f9      0xae79994f      0xc6f87901
+       0xc0e3132f      0x671491c5      0x236cad39      0x37889d9c
+       0x67f7c3f3      0x964a6be5      0xbcced7da      0x57eeaa6e
+       0x7bca1522      0x654fee4c      0x2a1ca5d9      0xa1803cf3
+       0x00000011      0x8c316d2c      0x17603b7e      0x32e42981
+       0xc26c1400      0xf0fbccb6      0xeab6b43a      0x11d456a5
+       0x5b912d46      0x15195fe0      0x542f6db3      0x0b7f212e
+       0x47718dd9      0x7c41b108      0x06c21111      0x4445d5ea
+       0xb4fb8128      0xe07404a6      0x8d503da4      0x78fc7e44
+       0xb9919656      0x9968c797      0x87f26ab0      0x23bb1af7
+       0x1ec5d761      0x26f30d2c      0x7cdb747c      0xe4d42033
+       0x8a5d4801      0x768aff57      0xbcfd5d11      0x7c853c2d
+       0x231e6207      0x8b1988a6      0xd68fdb75      0x58dcb417
+       0x44422ef9      0x2a186ebb      0x7d27e85f      0x36ac31f7
+       0x1e487e77      0x2b0b8c37      0xd8ba682f      0x2cba791b
+       0xe6d3dece      0x1b2c2a99      0x4e5decab      0xfbd313a3
+       0xdbc78294      0x5a80cce7      0x2d8e0f0b      0xcf564f71
+       0x073d1f37      0x25162870      0x96cdb85b      0x9c553048
+       0x24eba740      0xfc0f352e      0x0c83be68      0x89b5076c
+       0xc39c4355      0x6a4cf25c      0x2bbd2682      0xc524fdb9
+       0x7ea19bae      0x191ad6f1      0xd3fbf3bf      0x21bf77fa
+       0x8f77fec4      0x0f90f635      0xe55e165c      0x868d58c0
+       0x966bc0ad      0x6c276364      0x9d8f7eff      0x4b7925d4
+       0x8b2f9326      0x4ab7b47e      0x33a9087c      0xf31ab949
+       0x69831dfb      0x4711a215      0x8128c1fa      0x8481c213
+       0x7401b01b      0xfdcfdc50      0xd6b55266      0xae9b23ac
+       0xfa2ad275      0xa225bb45      0x4dd720c4      0x760a20e6
+       0x5f1223c9      0x2f334372      0x6e1dcdab      0xe8ee8638
+       0x1c19ba8a      0xef9341c4      0x360aaa9d      0x90452ea9
+       0x65852446      0xe9398fa3      0xbba6a631      0x1a3e90b9
+       0xe2a73a56      0x6e8c0747      0x35c7c53d      0xcc1ac842
+       0x183356af      0xb6e98608      0x987b43c2      0xa8a3cfd2
+       0xc2c5fce0      0xcc3af64a      0xd6d3a291      0xe59ad1f5
+       0x124ca513      0x9522b50a      0x25150477      0xa2eb5797
+       0x7fc63626      0x648c48e3      0x9f5797ff      0x2307b84d
+       0x980625a4      0xabc05983      0x24980807      0x773c4f99
+       0x3407b872      0x07c3657a      0xa2cd9e48      0x49c1e6a8
+       0xa881b84c      0xf804d72c      0xb5319d2a      0x3e39780f
+       0x97518822      0x0acd54c2      0x0721a9ff      0x10e1d2fd
+       0xa7b6db77      0x845b1a56      0xef00160e      0x6b41bfd5
+       0xc994df0d      0xcf44a5ca      0x794b36a4      0xf9fdb127
+       0x922a1366      0x822aa8a9      0x4b137bd5      0x5722a49f
+       0x8933719a      0x17edc1a9      0x079d9538      0x21fae7d5
+       0xe534fd73      0x9d3038d5      0x48c3a056      0x5b22d58a
+       0x6f142866      0xf1d767cd      0xb51ad5a6      0x34a0ef85
+       0x0111703e      0xca4b3a30      0xa0f3c34d      0x9d48775a
+       0x3f2059f9      0xf2fe2c36      0x588861a9      0xed5bd9fe
+       0x8231f7cb      0x8c115969      0x3f82ba00      0x21b3730c
+       0xba757997      0x3ec0bb2c      0x16f11def      0x5d4356c6
+       0xdc2e0bc2      0x58c1eb6e      0x313ede0c      0xb68fcc52
+       0x84d3e1b5      0xcc6d9201      0x95046196      0x276b527b
+       0x80a4a729      0xe782916d      0x5cf09e0b      0x98aaf9fa
+       0x1de6dd43      0xab4f1962      0x49ece734      0x81455488
+       0xc2597b61      0x5b22af85      0x646f7b94      0x09213a1f
+       0x08edf7e4      0x963d343c      0x059ba888      0xb4e804ed
+       0xe7cc826c      0xf87bafc7      0xeecaec10      0x8e60919c
+       0xbf14c996      0xd3dcaee3      0xb8fa0b7e      0x81563c6e
+       0x7f59a258      0x2f344446      0x374d8aa6      0x9b6de5c9
+       0xbf992857      0xbc5b94fc      0x28adb080      0x17e41044
+       0xb87b469e      0xda504d12      0xf21bef8b      0xce75c1e3
+       0xdbd92c83      0x58bba0af      0x77b42977      0x506cfd75
+       0x1139e875      0x6ce5fe43      0xc6a5d7b3      0x87f9e628
+       0x7b5c500b      0x130066b3      0x789b611f      0xec8c1ba9
+       0xb7e6872d      0xaf828cd6      0xc28d3316      0x2a91f6d0
+       0xc725f063      0x065ac531      0x4f9ef4b8      0x2b9d927e
+       0xaf54f3f9      0x7c924f72      0xda1d77ad      0xff00db67
+       0xaf4f03c0      0xb4f4ee64      0x169e64e5      0x04653ac0
+       0xed51cb70      0xfeaff0e5      0x51dbf346      0x072a2407
+       0x23fb74f4      0x9a906eef      0x5d6fc3f0      0xbc3c374c
+       0x1cf9f063      0x919015d9      0x5b3e9d07      0xd6209d8b
+       0xa3710b3d      0x90ad23b8      0x420ceedc      0x58e8371f
+       0x5d419d1f      0xb8acd13f      0x7d100d6d      0x210c10d1
+       0xcd0a697e      0x5023db4b      0x33e6d8e7      0x44bbe6b4
+       0x827e859f      0x6ca4cc81      0x661bb2c3      0x71209ee8
+       0xb8c3ffaf      0xd1075f51      0xba1eae10      0x728b0a6a
+       0xe4af7a2f      0xca9bcf2e      0xb249a631      0xdce6be47
+       0x5c910321      0x425c3c27      0x33083e43      0xdea067ae
+       0xea594a23      0x41b75c2c      0x3a401a95      0xd33cd88a
+       0xc295cad0      0x67f48045      0x1dc9ad4c      0x4bc48864
+       0x53991b6e      0x7aadde5f      0x2b0bf775      0x06ba5380
+       0x9eb874be      0x2c4b967a      0x1bcc342f      0xe875001b
+       0x15b5642d      0x5be99c9d      0xcb210ace      0x1b4924ad
+       0x3793ed81      0x8b983114      0x3ec33981      0x75ec71e7
+       0x8b5b7df3      0x834756f4      0x100fad01      0x70037fdf
+       0x0cef9a36      0x3d9e3a2d      0x38b48efd      0xfc4034b6
+       0xa32e29dd      0x388944bc      0xc1c15614      0x3877e9c7
+       0xa5e733fa      0xa621bd53      0x4b651df6      0xce082970
+       0x85f30d6f      0x729a5c87      0x31dd7ba9      0xdb495828
+       0x7b12c698      0x953495c9      0x6b5f99e7      0x2cc42fa8
+       0x697ac512      0x1be679de      0xc116d305      0x94a36606
+       0x9e5e141e      0x874affed      0x58d40b0b      0x5e3cf5e5
+       0x5d05e9a9      0x06840efc      0xd2f98b21      0xa1e83ab2
+       0x4f726202      0xa6394535      0x62a02403      0x9f2167ec
+       0x4f9fc77b      0x98073be4      0x2bc781fa      0xfc8e4c89
+       0xc7179b97      0x692cf793      0x708ff7bb      0x12ecba93
+       0xacd06e21      0x202bef76      0x03852241      0xe84e02a1
+       0xf1f9ac8d      0xcee61aef      0x61a4f235      0xd22991eb
+       0x67a81345      0x375a15c6      0xe8fae8a3      0xb4ff2b37
+       0x339ee4ea      0x14ffadc3      0xf49340dd      0xf285e568
+       0x00fc6970      0x369c52d1      0x4f55368f      0x3f4d75f1
+       0x6a73b603      0x963c1f59      0x171e2bdc      0x72bac76b
+       0x9e2e5c32      0x307f7c3f      0xd3b48637      0x3a917acf
+       0xea52a65f      0xecd209fb      0xf0ad84bf      0xd4bdea70
+       0xa2647b38      0xce040b49      0xc6d5f13d      0x5d942c52
+       0xf8edc042      0x798fdefd      0x4b074246      0x1cb1873a
+       0x6793c186      0x23b9c774      0x77bb0202      0xc519b3aa
+       0xa30c09a2      0xe1f6669a      0xb7eddb8d      0x7aaa91d6
+       0x076a3789      0x0ac47791      0x1e503404      0x44fe8c54
+       0xf3cbbf49      0xd3234eef      0x0d898b3f      0xe854984b
+       0xe3986de9      0x923a5c76      0x2ee9abca      0x1a9fedbe
+       0xdf76dcd1      0xea07936b      0xcdaaf247      0xe62d98fa
+       0xa99c7f7b      0x34fc84d4      0x03a35111      0xad5675c8
+       0xcc64075b      0x408203f9      0x846e1f08      0xe934019e
+       0x423d1223      0x2f04f9e3      0xee1dbf40      0x65edc60f
+       0x097aa22f      0x7058a2b7      0x41c8a0a5      0xa68aa391
+       0x0f345c40      0x667517e6      0x860838ba      0x6dae933b
+       0x764d5919      0x6673fa0f      0xf0a5e97d      0x4262ebbe
+       0x64b413f2      0xd2c4145a      0x0b2c11f3      0xfdfe9f93
+       0x96c77107      0x1399fdda      0xf599f215      0xb504da5d
+       0xf8a95268      0x9ed1ef87      0x9ae33cfb      0x3b21f1ef
+       0xc6d447c2      0xe0694d4e      0x967febab      0xc13f631d
+       0x8393bfba      0x37438788      0x1724194d      0x8e77a045
+       0x20e2483c      0xb961c2fc      0x485cf593      0xb3462621
+       0xcb2959b8      0x10307e19      0xf71fbbfd      0xdda641e1
+       0x0daf5f66      0x56d85178      0x145f6749      0xebc46ed1
+       0x5593c249      0x94561f51      0x534cc654      0xca7c8814
+       0xb59a578c      0x40b2b614      0xeaf3437a      0x198d5b4e
+       0xf245fa53      0xfb75e0b0      0xa363c46d      0xc43b5468
+       0xdf036413      0xc59f5a36      0xd8ff4381      0xa3af3e36
+       0x7af63462      0x414526d7      0x7bdc41c5      0xa416f1e7
+       0x6987d9ad      0x472c5499      0x4f10ee37      0x47bb7ff7
+       0xc7f2e621      0x820008f7      0x33a475db      0x91ff5d72
+       0x0517401c      0x73d067c8      0xe417b69d      0xb86d9903
+       0x1ac9a032      0x74bbf582      0x8b65596e      0x883be34c
+       0x95dcc26f      0xe232c646      0xfae9c19f      0x35cb5273
+       0x6a94d095      0xfff6ca91      0xb9c40eb5      0xd351dcac
+       0xc90d464f      0x9b609642      0x15663b56      0x15f7f88d
+       0x22499f60      0x417fd6c5      0x2dc36fe2      0x712bf66a
+       0x22f1fba8      0x531b8092      0x40d269b6      0x1d227898
+       0xeb6ff35b      0x2490ac31      0xc958ed65      0x3ce6ffb7
+       0x9338a806      0x3beadfe2      0x1c361ac9      0x53d0e3b0
+       0x91d46102      0x4d57045f      0xb5c8afb3      0xfd2c9e7d
+       0x3d578410      0x2adb9406      0x10df7459      0x90abccfb
+       0xe3f217ed      0xef5f4e09      0x74925ce4      0x169b5879
+       0xfeff4ad5      0xb300dd1d      0xc96022ba      0x72da501b
+       0x1e694296      0x9efa33cb      0x0dc3ee6c      0x0ac4e7ea
+       0x73041130      0xf0e6a295      0xc46bdb6a      0x6a927044
+       0xd217ceca      0x0b744007      0xd5a2bafb      0x4220cd92
+       0x70d3352a      0x5ee4f661      0xfa07e5c0      0x155542d9
+       0x4a39fba0      0xcec0552d      0x30c1d8ef      0xbef9d21e
+       0x183879aa      0x5b3f30a8      0x54a06db4      0xef876e4e
+       0x5e823680      0x53e2a353      0xc9aa4112      0x13a56ee5
+       0x848859fd      0x0ba2b801      0xec15260f      0x7bb22672
+       0x1a097332      0xb141339f      0x752a67d9      0xdae373f3
+       0x3c8cfd49      0x2dfaf2a9      0x95820c6c      0x956b39a2
+       0x1ca0d24e      0x1312b978      0x7280e1bd      0xa7a7c2ff
+       0x0b48e987      0xb6083e55      0x4b4b82f4      0x9c6104ad
+       0xcb93beca      0xe1c34035      0x34de740d      0xbb151baa
+       0x71f5942f      0x1eaac228      0x0c68331b      0x3d2a1dd0
+       0xe7a3d41a      0x7253acae      0xfd4de230      0x79988d80
+       0x4468f19b      0xac4440fd      0x6e8a6ef3      0x5736adf8
+       0xded67716      0x1f1d5a4b      0x96c5f451      0x85bae181
+       0x1293ab28      0xc2ba53c2      0x729ff4cf      0x60218df8
+       0xc2870138      0x6127d844      0x89604e9e      0xd2b9ad4e
+       0x4f6ded9f      0xdd263849      0x1633bd92      0x64b03a24
+       0x96dabd4d      0x6e85d235      0x1ab69ad0      0x9aa80454
+       0x6b9041e0      0x106c7e9a      0x8f54812f      0xa274efe4
+       0xe45d6695      0xf3aa7bd3      0x6a5a2a63      0xe36f3525
+       0x6238fa4b      0x7d6cb06f      0x16d3b4a2      0xf3b04822
+       0x638f1a60      0x0e1875fa      0x1c0292b9      0x6b519ea4
+       0x9faba37b      0x209341ec      0x83c9061f      0x3387dfe8
+       0xc7f12ceb      0x2bef45d7      0x8f8acb47      0x35d9741b
+       0x7009f514      0xfd003802      0x6f9489c5      0xe2ea2504
+       0x910e996a      0xcc81d016      0x3280730d      0xdedfef59
+       0x5a7357cc      0x8fe8dd39      0x15543fe5      0x976c4207
+       0xe41cf62b      0x0ba6b4b5      0x5c3b7ced      0xa6c5b72b
+       0x72ad3b4d      0xff143181      0x2b78a157      0x7fe231a5
+       0x6ff0538a      0xe58ed1ac      0x81a311a5      0xefaa54b8
+       0xf04a797e      0xce6e69c7      0xdc810726      0x7bab7be3
+       0xdd5923e8      0x5a2413ed      0x31cef794      0x73dfd806
+       0x1b9223c1      0x0c370882      0x04fa3b68      0x87c50bc1
+       0x1d78c90f      0xf4e2cee6      0xebea941b      0x73e5838f
+       0xca8d39a6      0xe004296b      0x28cf8a0e      0x7c73e7ef
+       0x26a296c2      0x789d4c72      0xd1490265      0xd9a9e843
+       0xf03504c3      0xfae6dffb      0x7a48f00d      0x51e369c8
+       0xcb3eeee6      0x0625e936      0xe93d0d7d      0xfb15ba6b
+       0xec5c76da      0x8fdf44f1      0xa036653a      0x5730c4a3
+       0xe5bfe6dd      0x0b8c091f      0x3b51558c      0x403748f4
+       0xf4007f86      0x952b5db6      0x5524d8ba      0x8046409a
+       0xe3fc61a9      0x66f4ea56      0x5645150b      0xdb2bec15
+       0x50672218      0x7f40e87d      0x2b8359f8      0x438787dc
+       0x7f221597      0xf8b1590c      0x4f468251      0xff586d05
+       0xb9195380      0x0ee09e0b      0x2fa7dbd9      0xd197b327
+       0xa0dbad58      0xb485681f      0x5ef0937c      0x1e07ebb6
+       0xcb49fe3f      0xc2427cd9      0x6c2c5298      0x4a2e171a
+       0xa7f333a8      0xb3609ad6      0x94e374d6      0x0e1eb64d
+       0x22c3367d      0xcdf89975      0x647aceef      0x16727c9c
+       0xf476ae53      0x35a1212e      0x0db768b8      0xfff8b53d
+       0xbd4fe45e      0xab28a5a3      0x59cec0af      0x28bcd1ef
+       0x6f43ad69      0x2658a059      0x27aee0ec      0x4e8bbd15
+       0xa9fdcf04      0xc9aa329f      0x687f010f      0x5c968a07
+       0xb894e607      0x0e1cba22      0x2f00f203      0xe8e133ac
+       0x494a4746      0xe8bdff9a      0xf69791a2      0x64179ce2
+       0xbfd10dc6      0xc026f6d8      0x4871923a      0x8946b277
+       0x609f49a4      0x6466df1b      0xd8c3c131      0x46ef0291
+       0x0fdce8b6      0x2b9aedb7      0x225c4520      0x72b332cf
+       0x4e220d47      0xf2f69c36      0x2c23fad9      0x57a2a918
+       0xe017409c      0x490819af      0xf2121afd      0x951ff7ff
+       0x40363fcf      0x5078b94e      0x9e4be775      0xee97ef16
+       0xdb3a2390      0x17d42af9      0x96f56a51      0x1b4c2934
+       0xc866315c      0x2b746f99      0x9a3b73f6      0xa1e081fc
+       0xa9d07ebd      0xa6359fae      0xdf50d099      0x55304e01
+       0xfe5aaa81      0x1e74267d      0x38b1d2d7      0x8633e9af
+       0x99b013df      0x3aa05831      0x86279736      0xd2b464e0
+       0xdf036a9f      0xe8162915      0x876c0d4f      0x4beb7d0e
+       0xfec9b170      0x46bc9df4      0x46cb88fa      0x0cb5904d
+       0x2e2961cf      0x7ea5dc1a      0x60670df2      0xf935ca32
+       0x67e6777b      0x8bacc97a      0x5cd07248      0x32e483e6
+       0xfdf09b0d      0xca57150b      0x3f432d09      0xdea2d7db
+       0x9f6a2954      0x6f07dff3      0x4133f394      0x60272f97
+       0x1b98c9ec      0x2ab648d9      0xb5df14a8      0x0d2c38f2
+       0x5dfde2c4      0x7cb43ca3      0x8d0c6c01      0xe80ea41e
+       0x5f58b71e      0x4ca9fef2      0xabd201a4      0x50905c08
+       0xca8ba387      0x5592922b      0xfa4e05f5      0xceb64b14
+       0x0845c5bd      0x518d369b      0x727e570c      0x1daaab31
+       0x801e8b9c      0xec6568f3      0xd4c3760f      0x40a78d22
+       0x38af58b5      0xc406a76e      0x8c3a7779      0x18272c42
+       0x45cf7b70      0xa6f3c0f3      0x88021e41      0xda662504
+       0xe97aa709      0xe93bafe0      0x8862ed5f      0x35bc8268
+       0xf5a41551      0x3dd3bb21      0x1af0cf11      0x08fe1ad7
+       0x53ecae41      0x01a4a8ae      0xfed636b7      0xf09323e6
+       0x73b9b253      0x7ebd7ce2      0x7074b4de      0x21c719b2
+       0x50982743      0xd23cfd27      0x136a1f4a      0x23260f6e
+       0xfad89dcd      0x57586681      0xadc4fba5      0xad0f71b8
+       0x91a3f188      0x20d62385      0xfecda9cb      0x33d67776
+       0x2abb0e6c      0x0ad16087      0x486332da      0x2928d342
+       0xf6d1b174      0x5e133a4e      0x72fc0ad4      0x940578b8
+       0x320a42b1      0x9cbda7d4      0xf2a36135      0x00ab8de3
+       0x5bad9000      0x5778e633      0x3952763d      0xe0e58583
+       0xdfb0bf19      0xb11914b6      0xa67da7a1      0x8d9a9f81
+       0x638cbcf7      0x83bf931d      0x8703b0dd      0xcab30fa4
+       0xd6db2ee6      0x5cc2e5ac      0x717e636b      0xfdcbc760
+       0x563b3b25      0x0e4df458      0x9efb8fa7      0x95aaa7a1
+       0xf05b6680      0x5e237e59      0xc884018a      0x177b5a30
+       0x3ea2c9bc      0xd0325ee6      0xb1dae51b      0x812ee29d
+       0x6d58db21      0xb787fa68      0xfd092294      0x09683dd3
+       0xfe0d6405      0xfdd99aad      0x78744a59      0x936738e6
+       0x6ad6cba7      0x370f7f8f      0xd208c214      0x12239384
+       0xbe71f0e7      0xfc0ef264      0xc04e4a49      0x354f9cf3
+       0xf5d7572c      0x07839ad0      0x834a003d      0x23ba26e2
+       0xf4049ecf      0x5ff402b2      0xff9d6769      0x074ebe6d
+       0xdc829da1      0xc3d7697d      0x973efe4f      0xfc2a9165
+       0x126dc518      0x0b824ca4      0xc438fb70      0xb7b0ee00
+       0xbe56afd9      0xa3d8defd      0x971455ae      0xc11ffde7
+       0x346e619a      0xb41111a9      0x6004b62e      0x896c668d
+       0x738e458c      0x351f9fdd      0xe771b2ba      0xad6d7464
+       0x719b57c2      0x6f6a4611      0x8a676f2d      0xb8db1c43
+       0x3f102641      0x51bffdbc      0xb7862565      0x5d8dd231
+       0x7a79bd39      0xfa472894      0x0fd1d2ff      0x64cf589a
+       0x38234d7a      0x5c9acefd      0x8eb0b9f8      0x761e1c95
+       0xf2fe78fa      0xe06220d7      0xaf82a919      0xf4e196e1
+       0xa17c8935      0x06d08d16      0x6bad807b      0xf410805d
+       0x4ff2bce6      0x3297c81f      0x06e35353      0xbe1f5e1c
+       0x65d1cb92      0x0dc69b2f      0xac55d597      0x636ff24c
+       0xe2e4f2ba      0x63d64922      0x4b2e9f71      0xad2279ec
+       0x5f0b5c0e      0xac688638      0x35613358      0xf5531360
+       0x54a304e8      0x27ebfe65      0x977b5a3c      0x3dc5e10c
+       0x73b32ee9      0x3a2c9454      0x30a149c6      0x31e5b55c
+       0x2c10854f      0x745cd38a      0x2853a27b      0x6629e355
+       0x0bb67e39      0x5469184d      0x694a9bb6      0x0a0ca25f
+       0xa878c5de      0xee15fd46      0x23d92ff8      0x02328404
+       0x1c9402b5      0xa46b6ce0      0xefc3e947      0x0e9312ad
+       0x5830ae9e      0xe30e32f2      0x9db8ee81      0xe8aeebbc
+       0x30675c83      0x447278c2      0xab2bad3b      0x08ba3d0c
+       0x1124e681      0x3691242d      0x903c8d2b      0x3281c312
+       0x22af690f      0xd69a150c      0x57622c5b      0x29313c73
+       0x6ab2d7c6      0x39b06dad      0x6e1f9f81      0x03324986
+       0x53a49093      0x7654eba3      0x2527245a      0x9af596fb
+       0x818ffb3a      0xa3817173      0x6a2c4b80      0xfcc42ad5
+       0xfb1bbb69      0x3a3720a2      0x90a89bcf      0xed80308d
+       0x7753cb1c      0x1c2654a5      0xb01ee4af      0x81091e85
+       0x9067b3f1      0x2e2b9b5e      0x9fb0c7d1      0x78fd9f69
+       0x5771c46d      0xacdf498d      0xfd8b8e77      0x4c15fa61
+       0x607120ce      0x18a298d8      0x73716420      0x65e5e06a
+       0x18c53e04      0x35b84427      0xcd82b522      0x9a7d26bb
+       0xd56b4b74      0x49b47fe8      0x63178dc6      0x0bac0f46
+       0xc8b0755a      0x9bbaaf1f      0x18131d2b      0xcc019330
+       0x0ceb89bb      0x8808c2d6      0xfb5bd86c      0x6c945b71
+       0xdc911924      0x4ebb8d35      0x44e46d08      0xabfee615
+       0xf456931f      0x7a244955      0x0bffce7d      0x5533ca5f
+       0xb1b2c636      0x4f29075e      0x64012561      0x7aa5e7c7
+       0x9c8a0666      0x9698782d      0x3481ad8f      0x21a55b19
+       0x735aa45d      0x4245b9c4      0x0d4c3fdc      0xd1b10966
+       0x7035fcde      0xc2257947      0x4a37271a      0x9da464a9
+       0x228adbf8      0xbf309e03      0x096f560a      0xa2b8ca78
+       0x427702cd      0x35a99cf5      0x99811758      0x6953db58
+       0xec07533e      0xe95838b9      0x61c71654      0xc9cce595
+       0x275af106      0xc8697af3      0xb3f27e58      0x411d8d30
+       0xd0d90ecd      0x1503b9dc      0x76bf070e      0x49f89ef0
+       0x7333b083      0x53f9c44b      0x8330c3a2      0x6a1119c3
+       0xca555f2b      0x3d51fc6f      0xac7b3320      0xf8e42cdf
+       0x053753fe      0xc122336f      0x94d289c6      0x088b5a64
+       0xc3aac7f0      0x96a76344      0x2ff05828      0x9b4f2af3
+       0x46de6a46      0x4ed29d98      0xe2ab7634      0x27481ddc
+       0x300ca71f      0xce7ac539      0x88240e09      0xb1a14e78
+       0x2addd4c5      0xb3a7f320      0xe91f549b      0x6881c45b
+       0x0e381c47      0x1018feb4      0x64679650      0xe62281cc
+       0x670ee6d4      0x0d226160      0x947b7f08      0xbc595a74
+       0x2380c0b3      0xc0235785      0x63b41221      0x80b9cc31
+       0x3231b4ae      0x33ed5718      0xf2c5c90f      0xdd3b03ea
+       0x67dfca08      0x453e9d29      0xa2bdecbf      0x5e9a3181
+       0xad17aea2      0xff0a8f13      0xdf946849      0xcfbbecb7
+       0xb0a602d7      0xb1a820c6      0xfe7abbc8      0x7f70790d
+       0xeb5f8863      0x266d3cc1      0xbd552a44      0xe19b1b3d
+       0x856aefbd      0x51c11f1e      0xde661b7f      0x61c075d2
+       0xd0f6a834      0xff1d0d37      0x6793d1c2      0x70c133a5
+       0x20c4d2cf      0x8c80d4d3      0x61ebe382      0x788b74df
+       0x11c56903      0x535889ba      0x0a9c7380      0xf9de2837
+       0x09437fe7      0x1627c6b2      0xb943bdb8      0x69bc29b2
+       0xee9795a4      0x83c992e0      0x95437918      0x8ce166a2
+       0x56b56b66      0xb0680941      0x623d38a9      0x2add07ad
+       0xe583ba09      0x96f6532a      0x3eff4696      0x2a8a6b0b
+       0x905b913b      0xafc01673      0xe871e006      0x2c2339ad
+       0x248438e5      0x96d83e53      0xb3a75d6b      0x2258cf63
+       0x69ff39bf      0x95727173      0xc3ac09d5      0xea8d2c06
+       0x0e7c0a4b      0x144fcade      0x28a9a5a3      0x97c11ae8
+       0x89865e3d      0x1640cd32      0xe3e551f8      0x1f7ba770
+       0x6d23fb31      0x11eceae3      0xc8ccb8ee      0x46dd0bb0
+       0xd01a46ff      0x0504adf5      0xec6e170e      0x2e3d7ac5
+       0x70f893ac      0xaf9963db      0x061e283c      0xf0ad248f
+       0x2fe97e19      0x881fd340      0xc686c9d5      0x88ea8ba5
+       0x92f05cd7      0xd6716148      0x6fc47fc3      0x2c51d9b9
+       0xd50a7faf      0x4eccacd1      0x7c92f802      0xa63ffc83
+       0x7cb0ab1d      0x4492e81b      0x7d906554      0x43306ba1
+       0x73a5d57a      0xe57a05d6      0x6850b964      0xefed595c
+       0x7754978f      0x629e8236      0x62ec4dde      0x247439ee
+       0x8b9982fa      0x4eece5c2      0x48599175      0x0fdc752c
+       0xecd87b12      0x94936c75      0x17a45ea1      0x80a899ac
+       0x22a39ee7      0x745730b6      0x03ea4daf      0x4a7570d7
+       0x307621fa      0x7322e0a7      0x3a8e0316      0x454e46f7
+       0x08773750      0x156dcaad      0x5562bc06      0xa23a1ee3
+       0x20435211      0x1d679ea0      0xb220e205      0x682cc1a6
+       0xd64a71c7      0x3ca7f8e3      0x2e92f253      0xa7cfdd0b
+       0xd62b4053      0xf5c5f641      0xbf72dde1      0xdcb716c1
+       0xe2f7b05d      0xa03145ea      0xc09828d2      0x7dae7916
+       0x6fb97c79      0xb3a85204      0x998a9c7b      0x5f42ba8c
+       0xd9c628b3      0x6b17bacb      0xa889b716      0x450ff97d
+       0xe9166f3c      0x2d20777b      0x82a003ae      0x2c7ae0aa
+       0x6011a9fe      0xfeed34be      0x1328f67e      0xf61003a3
+       0xfaecdf20      0xee18c81e      0x731a0302      0x11a39e60
+       0x355d78dc      0x99088f2c      0xcf253759      0x97347603
+       0x736f71f1      0x37e4b395      0x9cc74540      0xf7e39994
+       0xf01c5f64      0xbec519f1      0xa79c1067      0x76000d5e
+       0x1ac85b6e      0x51e5b7a3      0x62a97ddf      0x6f20096a
+       0x2af51e77      0xea5554f6      0xb4e581da      0xc1ac4ba8
+       0xc8f22bf7      0x9e254d3b      0xd7dd62f6      0x6461ae3e
+       0x423e1f10      0xf143e7b9      0x18c73b04      0xa43de614
+       0x2da8d02f      0x9befa706      0xc01dcd49      0xa278f1e0
+       0xd85f3177      0x6b6679fd      0x1ccef04e      0x53af9252
+       0x34d751db      0xc8d32c86      0x3d725097      0xa64ed581
+       0xd090c42f      0x9e92bf3f      0x6f82b089      0xd42728eb
+       0x3dd651e0      0x1985bc52      0x4b0f4159      0x0f99bd7f
+       0xe2597023      0xca0cae4c      0xce48a894      0x7249dd88
+       0x8e146632      0xb4be1d6c      0x790ae7e5      0x6747b657
+       0x52143947      0xa2e42ed3      0xea359617      0x6ca01a11
+       0x35c5e2dc      0xc97b78fc      0x5db6db2a      0x80fe3414
+       0x27da19d4      0xd7431d04      0xa91e9110      0x7d8ecb23
+       0x2508700a      0xc8c71ed9      0xd28835af      0x018c2887
+       0x3d0a6fab      0x3e8523d6      0xd0688dee      0xe5c3865c
+       0x838d72e4      0x6bb73a1d      0x497a59ca      0xf77c56de
+       0x38ecb72e      0xa55e3565      0x04b12c92      0x1aec9997
+       0x037c340a      0xef0d04c3      0x78f74bd6      0xdec9b9e8
+       0xd95b61ea      0x5528e8f5      0x4ecd325c      0x88ffdc0b
+       0xb337ac61      0x899d90e7      0xb5eeb978      0x8295d9ae
+       0x1ed8978b      0xa8849eda      0x8633b4a3      0xb8c858b5
+       0xbe3c4375      0x28b9e84e      0xb2a26def      0x22f8f66b
+       0x3a4aed99      0x0c4914ea      0xad103249      0xba5a5eff
+       0x8a052461      0x26938899      0x915c6ed7      0xe6268ad9
+       0x246e8c74      0x75f3c196      0xc3e725d6      0x92e02549
+       0x1f78a5cb      0xeada57e5      0x40f14906      0x0215e49c
+       0x57c06bae      0xc1896b87      0x0cd40a63      0x60741d80
+       0x11a69899      0x80fed942      0x0497e115      0x56697b55
+       0xba89c3d4      0x27d6b7c5      0xddff87b0      0xd3b1ff2f
+       0x3160e528      0x9cca1286      0x13b4fdf1      0x38cdd907
+       0xb50c4597      0x4c151714      0x1cab86c7      0x23126a3e
+       0xe26e9749      0x289a0d0e      0xc4004640      0x9d33928d
+       0x33b691a2      0x15ed6e6b      0x6e773980      0xadd59678
+       0x188ba49f      0x08da4c6d      0x6d150d0b      0x0c6c7b98
+       0xc8e1df7e      0xb8b1e692      0x5e89fd35      0xcb253d24
+       0xfc6ee27c      0x8013de3d      0x1d38012b      0xe50a8f7b
+       0x7d410ff1      0xceee4e9f      0x0e8094b6      0xaa1a5f57
+       0xb395a551      0xbd62b2ae      0x5d7b34c8      0xbd2d6195
+       0x33af4109      0x0769ff18      0x9c6cc123      0x78ee6eb6
+       0x412644e7      0x70e0c6f4      0xf45d8fc6      0x0435f5af
+       0xd43622b7      0x27409d5b      0x6dd04e8f      0x9f02ecf5
+       0xca415f7d      0xc9f439c2      0x7198e539      0x20476b75
+       0x3cdd8dd8      0xce17fbb0      0xa5bc115e      0xb0ee52c1
+       0x0b074cfa      0xd26d4f99      0x3b43320b      0x230b680b
+       0x9908f2d2      0xcbcb1952      0xf45a2f53      0x7b4564c6
+       0xcf2fd983      0x414fe4b2      0x55ea7f11      0x63e8117d
+       0xe8954052      0x7c2ea344      0x97a02aaf      0x6ca874c3
+       0x1ae5b4ee      0x41754eae      0x6954abe0      0x115ddcda
+       0x9a27968b      0x32a53e65      0xffe47b2f      0x4fe7e5a7
+       0x6016dedc      0xb3c0893e      0x9626776d      0x5ec773f9
+       0x1104e01c      0x1473cfb3      0x43b2cedf      0x8ca9d119
+       0x7f1bc844      0xd8bb7387      0xba90d2ef      0x2bb0dcf4
+       0x2340f124      0xa5bd514c      0x50afab05      0x718f5ad5
+       0x7c03fad9      0x71d00d2d      0x1c31fdc2      0x4a938809
+       0x40945ded      0x437f2a0d      0x83c10d64      0xd224c6ab
+       0x0cd44481      0xb0040966      0x27fd6e7f      0x6ff45d4c
+       0xab057ad1      0x8fa4e5d4      0xac50270c      0x6e4926ca
+       0xc5721498      0x2529b458      0x40ee2ad5      0xde5e21f2
+       0xea8964ca      0x56766e60      0xdc3b8702      0xa93528d4
+       0x28d7713d      0x42edf022      0x59774dd8      0x200ff942
+       0xe7a4d769      0xd8c4ef5e      0xe177f715      0xe9d53cd6
+       0xc11270bb      0xb25977e5      0xb80867b4      0xfb48468b
+       0xdbf166a8      0x49700d85      0x0f85f98a      0xa7ca7a75
+       0x109817ce      0xca243f19      0x8bed7688      0x9a1c8231
+       0x94f0ce97      0xc36309ca      0x90ecac24      0x67e7e0de
+       0x86b18d62      0x18c7b7a5      0x622f5d3a      0x47e1e067
+       0xdc96b94d      0xe4a03beb      0x59d17692      0x040abc0d
+       0x44a5ae50      0x3d3dab7d      0xc18dfd30      0x2802b9d9
+       0x6818379f      0x56db41d7      0x97cbf039      0xe41d6a32
+       0x64b5fb01      0x6506e0b4      0xd60a3234      0xdf3573d2
+       0xac148579      0xe7f46ac0      0x05e1c763      0x904a5aa9
+       0xc7ca1ee0      0xe0c3b047      0x5e36e1bc      0x447a9141
+       0xe24654df      0x9853a49b      0x6a29cedb      0x022f00dc
+       0x6df2a7a7      0x3636da02      0x72bb9c81      0x4f0e0918
+       0xd649f4a5      0xbb0c81f9      0xc0ba93fd      0xc1b390f1
+       0xda84e720      0x1aea0064      0xf3ee67e1      0xb874ef4a
+       0x82467ce6      0x59abf506      0xafbf145a      0x9a4cf8a1
+       0x17247c89      0xd8669398      0x1796eaf7      0xbc2d24a9
+       0xcb486570      0x17a9db23      0x3e6504f0      0x08684517
+       0x2723ab28      0x7081b814      0x8a265a04      0x697e6d8b
+       0x69b146dc      0x6434c182      0x27ec8101      0x864405c5
+       0xfff86c9e      0x3052d8a6      0x23d283db      0x492970e8
+       0xbc6c64c3      0x46d8f98b      0xe16e7ff3      0x731e4f82
+       0xbd26b1af      0x6b30e6c1      0xff192fce      0x097e0bba
+       0x49df63a5      0x2fdc3f01      0x50aae053      0x60177b8f
+       0x1949eb85      0xa46084ce      0x9658f694      0xcb951fbc
+       0xc53806d9      0x63a17d30      0x3b3f86c2      0x8a37aa6c
+       0xedf8fe5c      0x87aee1d3      0x8c680126      0xfd8b27a6
+       0x231fa106      0x69358c25      0x4502c348      0xc107861c
+       0x46280e70      0xcf6067ac      0xf6a04ff3      0x3e488677
+       0x6f3fb4c1      0xeec1f758      0x560e1c48      0xb604c06b
+       0x69e34b1e      0x8ef41dec      0x854cea22      0x726581d7
+       0x55ea91f3      0x38ae4053      0x5ff7389d      0x6952cbf6
+       0x09aa0fc1      0xcccb1d50      0x5c1a633a      0xde1eba46
+       0x797212d8      0xa943fb3d      0x6063a1a8      0xbe68ef36
+       0x6ba0d5ba      0x0dbe2061      0x47711712      0x62679807
+       0x6f34009e      0xe6fe8f18      0x66a6a64b      0x3f80f472
+       0xe953d5e0      0xbcd8196a      0x086faad0      0x49da7f16
+       0x7f2199a5      0x55af4af2      0x085b4d38      0x22e634bd
+       0x6cff0416      0x343466f4      0xd121a7a6      0x6caa3942
+       0xe4f365a2      0xd832eb0c      0x616728e5      0xcca4c71a
+       0x4010cdc2      0xd0f1d1cb      0x5e695f89      0x27719206
+       0x0ec92854      0x76144a1b      0x49808021      0x12457a1b
+       0xdde7aa5c      0x8f1a077f      0x110a4a5a      0xb3a5ad31
+       0xaacebf8f      0x66ff7f33      0xa2340971      0xfb4c7e82
+       0x8dd536d7      0xafd2021a      0x72aa9c6e      0x22df6952
+       0x83c4b4fb      0xba515555      0x93eee8f0      0x22d0ed5a
+       0xbec05586      0x83828f28      0xe0d7f930      0xac0f0199
+       0xef6d76f9      0xf56ebdf8      0xf67323c9      0x8b805745
+       0xce5902c0      0xfa2ce3da      0x10f836dd      0xe1ac6d97
+       0xa0e415ea      0xbb7c32ad      0xc421f3b0      0x8166e898
+       0x74e7a73c      0xf454b82a      0x631369b1      0xe30ed23f
+       0xdaa1c75b      0xe7c9c6a7      0x5f33c375      0x99c05187
+       0xf2d6e6ae      0xcd2045b8      0x92ff3009      0x15082015
+       0xd1a1580e      0xdce25f9b      0x21984a75      0xa9be5388
+       0x099a5372      0x3ab9bcfa      0xdb9069aa      0x49a99be6
+       0x42a9ee0b      0xfe32d832      0x24e11ad3      0xd16f596b
+       0xb95982cc      0x754ab1c8      0x42ffa128      0x539e823d
+       0x28e0f976      0x262ddfc0      0x2a16e7ad      0x49b5acd9
+       0x931f3def      0xdc419b84      0x8412cc3c      0x81056cd9
+       0x91933e1f      0x57710b15      0xa55d2696      0x87d88724
+       0xd4fedfdc      0xcc3825c6      0x397f382f      0x80f9b6ba
+       0xcdd6d59f      0x24b984d8      0x8f1c5bcf      0x25bcef1d
+       0x00dc603a      0x76fd94c2      0xa267a7dc      0xa6e90a6a
+       0x5c5916d6      0x065a52cf      0xa28d3263      0x9b17b72d
+       0xb8436b48      0x1b1c2391      0x1fda3395      0xa6cecbcb
+       0xbc4ec502      0x1766b590      0x5945fbd6      0x6a124405
+       0xf92d06f2      0xe24694b7      0xf6befd08      0x8266cf5c
+       0x03ed670a      0x5f98be62      0xf27b7e2e      0x598cf22c
+       0x2e855591      0x879815fb      0x153799c6      0x3820faf6
+       0x3d3a2cc6      0xdbb6dece      0x1a3c46b2      0x5031bdda
+       0x47894c03      0xe43661fe      0x7a6ee548      0xa5ca9779
+       0x6aa9e105      0xbc8505a3      0xa03b860a      0x448faeb9
+       0x367de4a9      0xc9779c7d      0x6535ad8c      0x4b7fcacc
+       0xb2db5c10      0x0ab41ec6      0xe528ab90      0x5e6f03da
+       0x98bc76d3      0xf38df42e      0xea59b039      0x1c2eaa28
+       0xca30dac5      0xdb0eb8c6      0x60063860      0x18823f8d
+       0x164e2f28      0x7cbbe080      0x70a12315      0xb08f44d9
+       0x5fbb9453      0x4bc62738      0x9fa15ffc      0xe4033ca1
+       0xc9dfbc13      0x58245d7d      0x588113aa      0x8f5a6ac8
+       0x92588a60      0x26330c74      0xb2aaf0e3      0x24ada1ea
+       0xa9e973ae      0x624b73e7      0x4ef961db      0x95ede155
+       0xf2bb86ff      0x96bc79d9      0x95cd646b      0x1c3af453
+       0xf60fa711      0x10905115      0x0e24b740      0x169bb227
+       0x34cee6f0      0x990980db      0x18d8ace5      0xd4c87504
+       0x29515d32      0x2e5d9c04      0x87dffa60      0x12e815d1
+       0x021db8e9      0x2c5a42fd      0x6e3a1a13      0x88889ab5
+       0x3bc915a6      0x608919c5      0xd310a970      0xea8f3218
+       0x949f55bc      0x9ed7aadd      0x6d990157      0x181f1c2f
+       0xa940df64      0xf3be8c39      0x7ca2e699      0x7b4f07f9
+       0x89e83fee      0xe66b9493      0x54fc3d17      0xa63d2d46
+       0xd5e835d5      0x910e0144      0xecf67025      0x1fa6a93a
+       0xe692dbca      0x466af681      0xc2bc808c      0xbb4ebd60
+       0x74d5c729      0xa283ad25      0x1e66fa23      0x6d372988
+       0x753c9fcb      0x1742efdb      0x5b68cf15      0x372a0e33
+       0xaa3a7ebd      0xa0e944d5      0x95d5cbb4      0x4fb6020b
+       0xced927b0      0xb2afea78      0xd0646b72      0x1622fad4
+       0x4672c6b6      0x736ae4f8      0x8d46a4db      0x0e6a432e
+       0xe0a30a98      0x4c2bcf4f      0xd87acedd      0x19682d7a
+       0xf97c025c      0x55d8feb3      0xbcd4d2ff      0x236c6f9f
+       0x8ba0246d      0x42812f73      0x327636f5      0xc92cd30a
+       0x08a69d9d      0xc735a946      0x82eca01f      0xda0753a0
+       0x7077b1d1      0x17b05834      0xfa24bc02      0xf49f4473
+       0x8f9ac6b4      0xa880c630      0xf7457b4d      0xd5f829e4
+       0x25c49a99      0x1176a997      0xbb2d2009      0x61d35764
+       0xa322c752      0x6ef3ae02      0x5faae6f8      0x9a52acf1
+       0x19176f43      0x43843b07      0x14efc471      0xee474403
+       0x319c4857      0xa19adcf0      0xc0a466e1      0x02db14ad
+       0xb7f211f3      0x72aa6ca6      0x0eb9bffe      0x48a6d284
+       0x9a93a2ee      0xac09fc5f      0x92a62c4f      0xd34f0271
+       0xffb348c7      0xf229b6e2      0xc68ec1ca      0x19577dbc
+       0x069a10bf      0xf64ac347      0xf7c3c848      0x81975294
+       0x6376e550      0x93b53440      0x8bb17daa      0xc4c64c07
+       0xcaeff293      0xd51497b0      0x33da3565      0xa73d5def
+       0x4bf4dcde      0xfb470fcd      0xca7db864      0x7ef17022
+       0x47567363      0xd8fb8d74      0xa68c3c72      0x8202e4f3
+       0x75bf1798      0x16a70fd2      0xcc3b697f      0xab9a1075
+       0x13f56ef3      0x269d0302      0xcb655a43      0xc9a4de88
+       0xfb8363de      0xff40f36d      0xd2555489      0x647a7995
+       0xfd8eda6e      0xa3958c9a      0x20e029b4      0xbed3e225
+       0xa7df5f17      0x63bc3c1a      0x337ecc9d      0x6c329508
+       0x786aa47e      0x1db5b093      0xc0acd73b      0xf9587237
+       0x243e5d40      0xd3623c3a      0x338c4740      0xb672140e
+       0x43640a9b      0xb7ef3f6a      0x44151074      0x749bcc46
+       0xfa1f103b      0x0fefb19e      0x58855538      0x138ad276
+       0x2641fd80      0x297d99d0      0xfaa63ba2      0x00b6f11a
+       0x3793fb6b      0x124763a1      0x8b9419ac      0x56abf9eb
+       0xdbf83419      0x43570571      0x37299cd8      0x8b201e62
+       0xa4058fa5      0xb320e91b      0xbe7d40b7      0x4eca3b2d
+       0x8519c155      0xf4b17021      0x9e4c572a      0xdc1f9e16
+       0x39a589a3      0xa6cfc7a8      0x5b986910      0x64e150e7
+       0x60b6f2c1      0x02bacd3f      0x2f3b5a5c      0xc6f453a8
+       0x15a87a7e      0x76104a14      0xafa2ef63      0x2cd48dbe
+       0x3c7abddc      0xd786ea5a      0x4f65867a      0x355cda38
+       0x2ae03d9e      0x4f11f6be      0xfc0a0034      0xde4ea602
+       0x21ff83ea      0x0f12d913      0xedf4da28      0xc96d8fd1
+       0xd7e82c3c      0xfec63bdc      0x37a456d7      0x3007e18c
+       0x091a47b6      0x82f1c641      0x82219cce      0x3e7e6993
+       0x7b3a2115      0x0b8e1a02      0x40f88213      0xfa2f9c21
+       >;
diff --git a/arch/x86/dts/m12306a9_00000017.dtsi b/arch/x86/dts/m12306a9_00000017.dtsi
new file mode 100644 (file)
index 0000000..299d663
--- /dev/null
@@ -0,0 +1,750 @@
+/*
+ * Copyright (c) <1995-2013>, Intel Corporation.
+ * All rights reserved.
+ *
+ * Redistribution. Redistribution and use in binary form, without modification, are
+ * permitted provided that the following conditions are met:
+ *     .Redistributions must reproduce the above copyright notice and the following
+ * disclaimer in the documentation and/or other materials provided with the
+ * distribution.
+ * Neither the name of Intel Corporation nor the names of its suppliers may be used
+ * to endorse or promote products derived from this software without specific prior
+ * written permission.
+ *     .No reverse engineering, decompilation, or disassembly of this software is
+ * permitted.
+ *     ."Binary form" includes any format commonly used for electronic conveyance
+ * which is a reversible, bit-exact translation of binary representation to ASCII or
+ * ISO text, for example, "uuencode."
+ *
+ * DISCLAIMER. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT
+ * HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
+ * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ *---
+ * This is a device tree fragment. Use #include to add these properties to a
+ * node.
+ */
+
+compatible = "intel,microcode";
+intel,header-version = <1>;
+intel,update-revision = <0x17>;
+intel,date-code = <0x01092013>;
+intel,processor-signature = <0x000306a9>;
+intel,checksum = <0x3546450b>;
+intel,loader-revision = <1>;
+intel,processor-flags = <0x12>;
+
+/* The 48-byte public header is omitted. */
+data = <
+       0x00000000      0x000000a1      0x00020001      0x00000017
+       0x00000000      0x00000000      0x20130107      0x00000a61
+       0x00000001      0x000306a9      0x00000000      0x00000000
+       0x00000000      0x00000000      0x00000000      0x00000000
+       0x00000000      0x00000000      0x00000000      0x00000000
+       0x00000000      0x00000000      0x00000000      0x00000000
+       0x86c5b0d4      0xf6978804      0x7f4f5870      0x6319dc3c
+       0xbb3b7d61      0x33cf9075      0xe8424658      0xf611a357
+       0x5a3401db      0x42caecce      0xb4d8e75e      0xe6dbaf24
+       0x7861b35f      0x6bd717bc      0x23b9b731      0x82ec1ac8
+       0x20337b64      0x5396dbf1      0x59973bff      0x724bc7e9
+       0x5237193b      0x0b8647c1      0x6a0d0e16      0xbf9ddb5b
+       0xace2cc1c      0xad707638      0x056f102f      0xa37e60f8
+       0x76255642      0xfb86e030      0xb8069a40      0x367795f1
+       0x653fb05e      0xab7f14ad      0xb6e8a8e1      0xd2598d20
+       0x2eba3f68      0x78b372f1      0xba8d13f8      0x1f1de861
+       0x97f951d5      0x8097c728      0x27dbf904      0xb97906a8
+       0xffe7a4ac      0x4b947668      0xc1dbd726      0x2adcf777
+       0x63b1bcf0      0x818e2a1b      0x49aa907b      0x2faf5e8d
+       0xae842352      0x82707fae      0x0aa12b41      0xa0bae11c
+       0xb4298c47      0xd2b4099c      0x4ff625f2      0xcd2630d4
+       0x79850981      0x05dbf57d      0xb05b81a5      0x56e73ec7
+       0x95cb3897      0xe262bda5      0xb2c6e288      0xcb7f8e77
+       0x72b8bdd3      0x3f400494      0x63ade65b      0xbc4adc71
+       0x00000011      0x06c0f8ff      0x0eb63d77      0xc54cdabf
+       0x76bc8860      0xdd142643      0xe7bfc220      0x17aa0a91
+       0x4fd676ba      0x4b6b1a15      0x2a1a1c16      0x4fed6de0
+       0x8c3d6bcf      0xbb319bf6      0xa82532f1      0x7c8ce014
+       0xb830a38b      0xec25bc6b      0x61c8a8a9      0x49a21dba
+       0xfcf8bad0      0x7372f29c      0x1f7fbcdd      0xc2ff42f4
+       0x780878f0      0xc967068e      0xe19cc3c9      0x155e6646
+       0x75235c43      0x9aaf3741      0x9dfd116d      0x0f031b6a
+       0x4963e039      0x6918daa8      0x7f0ca4ab      0xd77dad79
+       0x2f8847e8      0xf79c82a4      0x6a6aaad4      0x24f07dbc
+       0x895d3f6a      0xc96b2eb0      0xff50228f      0x573d364a
+       0x5fca9d56      0x3c11c35b      0x3e90fb12      0xc4604067
+       0x5c980234      0x7c42e0c7      0x60cca3de      0x637a4644
+       0xedc43956      0xb0efb4e1      0xe94716fa      0xa6478f51
+       0x33965654      0xdf6b40a3      0x48ac1b18      0xd6723c94
+       0xf040d6d1      0xaf850470      0xe2bcde48      0xb90a4998
+       0x8f620105      0x3d592878      0x2f697bad      0x9f7721d9
+       0xec34444a      0xb0594770      0xd7180f9f      0xa510a168
+       0x460563b0      0x5d4f34f4      0x21dfc16b      0x051de344
+       0xa57bc344      0xff2c7863      0xf0bc063d      0xf5a89004
+       0x79a81dab      0x9e8cb974      0x2309b0a4      0xa47a46de
+       0xcf9c0c44      0xf761c817      0x67ab642c      0x0db4422f
+       0xca3616fc      0x79e66c8a      0xd56a3332      0x5e0f338b
+       0x5814cb3a      0xed1b9a4d      0x47d59f72      0x25b03786
+       0x3edd1d42      0x8cd947cd      0x706e6ebd      0x82c2bada
+       0x1bf6a96b      0x77dd859a      0xda35335f      0x22fab458
+       0xd0661fd8      0x02bb4a42      0xe2a2bcdb      0x0616580e
+       0xd35be23f      0xc206d16c      0x401218be      0x51107c3d
+       0xba84b8be      0xace4d8f2      0x505b9b28      0xc517034b
+       0xac5ba582      0x7419fe54      0x43493cb1      0x2fe0a66e
+       0x206039b5      0x07569011      0x230ce53d      0x168d427f
+       0xbfe0bd10      0x82bf11be      0x5b55475b      0x5490a0e9
+       0x1c3c1e3c      0xacad77de      0x1666512f      0xfc3250d8
+       0x930a6312      0xdd85c066      0x1b95c18f      0xc8bbd3b0
+       0x1bb2a34e      0x642c7653      0x0f536213      0x1f7ab4eb
+       0xaa5ef677      0xe6ac9581      0xd7a2fe73      0xd417dc79
+       0x455a6877      0xae825a40      0xe0c98bec      0xac39ba49
+       0x299d9bd9      0x957d0bb0      0x1645111b      0xe9da4beb
+       0x1b005ce7      0xddb742ce      0x6c5f3ffc      0x24f74d2c
+       0xf4ace044      0xb21bc7ba      0x338002dc      0x240effa1
+       0xd208ae00      0xfe8c2b5c      0x9a457293      0xd9365ac4
+       0x98f24244      0xf6d1aaea      0x7b874350      0x1ba4086b
+       0x1d3bf168      0x2bb6f4fa      0xb27f8477      0x8da836f6
+       0xa8762693      0xc377fa64      0x74cfd979      0x90435c25
+       0x29d80e17      0xc3503c9c      0xaacd2178      0x232c748d
+       0x6fecd3ba      0x00fb4aa0      0xbac3ee19      0x6e5c63e3
+       0x17823c14      0x0e9d33bc      0x0fa9de06      0x998b14b2
+       0xfdd8c80d      0x01b0591b      0xf70bc4ce      0xb278c496
+       0xa7e30708      0x69cf8420      0x14f8b744      0x8bb8a0ff
+       0x168f6db0      0x95da6db2      0xf96d121d      0x67fd06f7
+       0xcd81d278      0x8693d095      0x15e1a24c      0xe5f554f2
+       0x499874e8      0x30fc0785      0x0f4fa1b9      0x65c93dad
+       0xd939bf24      0xdad29721      0xf253b752      0xf6ff59da
+       0xc5dfaffc      0xf0071f34      0xdb0db8b0      0x24475e2d
+       0x2a4d5b8a      0xf7624bea      0x3fdcbc90      0xb5a66e35
+       0xd0f08636      0x24643caa      0xc5d08e83      0xb134c55c
+       0x8e3653c7      0x34496b0c      0x6b2aeebc      0x2fbab601
+       0x105613a2      0x7babd55d      0xa01af846      0x248be690
+       0xed27917c      0x26ee6e13      0xa1dac5fe      0x852ed91a
+       0xfc83fcca      0xdf479c33      0xfd6efe96      0xdc62521b
+       0xa37d2a8c      0x1d2bad9e      0x4287614f      0xc4f7b62c
+       0x2aab0562      0xec6d4226      0x52853fb4      0x264e3507
+       0x1c3af366      0x33269776      0x81b8529d      0x115530dc
+       0xe035f98f      0x433d1b6c      0x1ea6daea      0xecfd2ad2
+       0xa57a0c22      0x1dbe3e12      0x6fafe41b      0x8e579e35
+       0x6c493fbb      0x034dd4f9      0xd17cd6f2      0x05c5cfa8
+       0xd9bffa39      0x0fc16e9c      0x831b88c8      0x7e7dce3e
+       0x3320bc7f      0xd5abafaa      0x217ab526      0xade2597d
+       0xf01b00f2      0xc9e34b72      0x00a4cb0b      0xdc198512
+       0xdc7cc8a1      0x89db07b5      0x6c2153ea      0xb8bdb8aa
+       0xdf8a1ae8      0xa517f6b1      0xd32569d9      0x37e79008
+       0x3c7527c3      0x7d5b2d3b      0xb31cb907      0x35db7f6c
+       0x0ab0cd65      0x75feaded      0x7c8260a9      0x5bc04f56
+       0x2fac9f60      0xd7b3a2c0      0x2b393634      0xc2df7f43
+       0x1ff2fa9f      0xc81af169      0x188b1f4e      0x08bf6f86
+       0x5ab2f188      0x0a71eb64      0x03b57501      0xa684fc23
+       0xa729ffef      0xe3b4a709      0xf9eb97d2      0x01506c95
+       0x0d9285f5      0x8e1ee93c      0x7d15a0d8      0xd9390673
+       0xf116ebd8      0x7e68798b      0x3dc8412e      0x5a9a04b4
+       0xe3805f51      0x00493bb1      0x4ec65ca2      0x2aedd69a
+       0x7f2a5b18      0x9994ac32      0x476f3703      0x7d3da882
+       0x5635f55f      0x7a0887e0      0x0af46feb      0xfc2f3591
+       0x02e29400      0x70fd3234      0xc549379e      0xaf34fa5a
+       0x5bf7c649      0xeb183cff      0xa236d508      0x4525ab64
+       0xc4301026      0xf281df99      0x0b298e46      0x9b7c1a99
+       0xc4b24e77      0xea536992      0x5a39e37c      0x570fb6df
+       0xae5d5c49      0x01142cc2      0xda05d3f1      0x337bf65c
+       0x3c986598      0xbecefd30      0xb5e34c2a      0xe7c3847f
+       0x18cb24b4      0x71278c26      0x4b8d6caa      0xaf7c300e
+       0xfb6ce9b8      0x94c4b785      0x67275f17      0x59498cf5
+       0xca8eeec6      0x3374e7a6      0x649affac      0x9049ba78
+       0xff9d3908      0xaceec446      0x225ece3a      0xac1d4fec
+       0xdc050fed      0x04e3ed8a      0xb303d8e9      0xe9d26aff
+       0x0a98691d      0xf243492d      0xe3b42f00      0x6c21a97b
+       0xa385ae98      0x14ba3f4d      0xc0215cc1      0xe1ba6c0d
+       0x412bbbe4      0x39f95d1c      0x593bd878      0x45d3066a
+       0x9fcee8a1      0x3f29b2fa      0xc9ae58ee      0xed6def92
+       0x6c8f2182      0xdba64e20      0x276c2c21      0x81ea9dfe
+       0x20ae00b2      0x8c2d2724      0x66c09f5c      0x24908e2e
+       0xfecf8194      0x6be61e94      0xcdf5d7db      0x98b829a3
+       0x4241ab07      0x1207ef2f      0x96e7b073      0x766293ea
+       0x58eb0882      0xf12a6426      0x741b074b      0xbd4302cb
+       0x909b6c4f      0x1c4949cc      0xd4d6a3e9      0x442b74b3
+       0xbc8cb3f9      0x0efad89a      0xa2ceff3d      0xecdf86bb
+       0x46a4a72e      0xe9d8abe4      0x94c91479      0xe99a80b9
+       0x1072b708      0xb8318ad3      0x0685426f      0x3e89a0d8
+       0x0b7c438e      0xb4b577d0      0x046599e2      0xd0ef85f2
+       0x3566d2d2      0x43ade22b      0x8753a78a      0x8f6d8e02
+       0xbdf33e56      0x8b2b6696      0x22a5e911      0xd0e0f4eb
+       0x42729c29      0x425921fb      0x82f7634e      0x2c145fd5
+       0xff59deeb      0x018a5372      0x33c4e11a      0xc001c097
+       0xf250cfcf      0x2f682912      0x21f40dc0      0x883196aa
+       0xcd5c58d0      0x7c329754      0x481c450e      0x9411c6c0
+       0x69a9df82      0xacb01a1a      0xc0b569a7      0x0b7fd1a9
+       0x4c339ad3      0xb0d9e211      0x07098664      0x14a5cff9
+       0x53beae37      0x4e173257      0x4e1d2e6c      0xce981dd1
+       0x45d6204f      0x3c193268      0x4f51ac3c      0x5ecffa12
+       0x48068ee9      0xde12270f      0x0a0aa980      0xd6fe8ca2
+       0x97d51da8      0xccf2db36      0xb3ad0598      0xbc56eb56
+       0x0adf5e5e      0x9e320aa1      0x8ebb75ef      0x3973a323
+       0x7e3d87e0      0x2c0d1858      0x83b7fa0c      0x36effdb5
+       0xcd9eba1a      0xab5b5790      0xa48fbf00      0x536e2ae9
+       0x2f2a3f61      0x05706a73      0xd2dfed08      0x7e4626b1
+       0x172c6ced      0xbf2e44ba      0x15aefc2e      0x9cf56c37
+       0x663c6695      0x04cece5f      0x4ce00027      0x465b1cd4
+       0x333dc2c7      0xce41f1f1      0x6dd8503b      0x52b79af7
+       0x564c81de      0x0e5e2daf      0x869753f5      0x16667889
+       0xe1acaf08      0x38ffbb0b      0x83400589      0x5144052f
+       0xa3819950      0xd21501c5      0x1bdadeda      0x0a874e2b
+       0x05480284      0xe8f76f11      0x582cad8a      0x0553f942
+       0xb6451cb9      0x76bdc86f      0x96ffe0c7      0xc630eba2
+       0xa82ec683      0x5902ef45      0xc362248c      0x18c412a9
+       0x1d09c103      0x2355ed98      0x5ec5c718      0x5037e359
+       0x1508f804      0x09cfea9d      0xa16cbdfa      0x5f962b17
+       0x85a35a27      0xa048dd30      0x6fe7ba90      0x0dc20150
+       0xcb56daa0      0x4188fb20      0xb4182598      0xa1bc5dd7
+       0x8c11e0bf      0x2104df35      0x025e74b8      0x79d177df
+       0xad74bb77      0x4b2419aa      0xe374add2      0x411593d5
+       0x796778da      0x9e43a420      0x4a2e0860      0xefb48578
+       0x47cafbdb      0xea15924d      0x70ac1467      0xf52fd888
+       0xd2df4bd6      0xc1fc63bb      0x119ab88e      0x0e147ead
+       0xa85bd8b5      0xc2e61ddb      0xd566417d      0x6bb9f9ec
+       0x69bbcf1e      0x24d46989      0x3caf067f      0x58151211
+       0xc2a6b6e5      0xb233416f      0x3da28155      0xf9cd9385
+       0x7a530045      0x1eab05ce      0xb86ed141      0xa8f13a5b
+       0xf9819f81      0x66d5d5c5      0x148c1a02      0x496d3c56
+       0x370dcd45      0x5f13f0b6      0xdd4eaeed      0x8dbad50d
+       0x0747ce54      0x69d2adcc      0xfb69c18f      0xd44ea186
+       0x74ab7537      0x0c642449      0x88b096cf      0x3a8ad683
+       0x408cd7aa      0x6daa6708      0xb267b312      0xa4225c7a
+       0x7a56dce7      0x6a8d497d      0x8837bcbb      0x6125397c
+       0xeb51d233      0x362bdde9      0x689657f7      0x32d09e1f
+       0x753a3d39      0xf77db5b2      0x8057908a      0xef12815d
+       0x594fffe6      0xcf3402c5      0x1a0d4923      0xca547b2f
+       0xaf9d604d      0x5d2e30f3      0xffe18005      0xe29bb0d9
+       0x36fc10f9      0x3720aac6      0x37bc1ad3      0x47d000ae
+       0xa4b0da0a      0xa178228b      0xdd9374e6      0xa1f3df5f
+       0x9ae2e451      0x21c4aceb      0x8f9fb226      0x5190b712
+       0x70253633      0x9c9cb5f1      0xc9178689      0x551c1a2d
+       0x6db67cc0      0xcf1b1ade      0x48449272      0xd18634f1
+       0x9d9c3de7      0x19025530      0x121d78d4      0xae4a39e1
+       0x62850819      0xf3d4af6a      0xe5ad5b80      0xfa053c7d
+       0x7ed68b9a      0xdbde2894      0x4b5c04de      0x65178203
+       0x9181cdd8      0xb17e27b9      0x0e29b338      0x50156ab4
+       0xf7726438      0x178108d6      0x1d8dc6b7      0xc3e7512f
+       0x0eb8339c      0xe2684a6f      0x7668ed31      0xd0ed6eda
+       0x4342a534      0x03840286      0xad1e6969      0xa9a6c98d
+       0x1bf77774      0xd32fc9d8      0x405620d2      0x8ab19efc
+       0xce4d7506      0x6f4eaae4      0x3e830dbd      0x76818782
+       0xfde4ee8d      0x1953cd0f      0xd47be276      0xf2480bc0
+       0xd1010013      0x2dd56a58      0x083084f4      0xc91b0ad6
+       0xc2524e12      0xa60710f2      0x3d955047      0xce380846
+       0x0f6dec2b      0x604d1492      0x5ca43ee1      0x6b51a626
+       0x350d5483      0x8d99ae30      0xcba06491      0xcc0185eb
+       0x7b64caa6      0x2f1754db      0xca0691f1      0x6219efb6
+       0x43291db0      0x259d3f12      0xeaf6ef9f      0x5f0e065b
+       0xad576541      0x8615a414      0x81124bdf      0x62b855a9
+       0xabdc529f      0x01bfdf75      0x10e4c656      0xf8e86f78
+       0x1fbe10d1      0xa6873c2c      0xdf83dcd8      0x20d35872
+       0xf46f2861      0x22f3d642      0xfdcda29a      0x16adbdb4
+       0x01e5844c      0x011e5454      0xf5432b04      0xd5f6a80d
+       0xb081fab6      0x64fc2fbd      0x4ca76e0f      0x3a8d8b29
+       0x3f03ec12      0x58e2bf6c      0x24f2b8b1      0x108e414f
+       0xe76a02ab      0xcb525af9      0x623ba7a3      0x31412c27
+       0x69c2f5db      0xd5546d8b      0x8200d2c9      0xf1e34a71
+       0x393e24dd      0x2b867933      0x0596e778      0xc5112b49
+       0xf433cdea      0xbc505e7b      0xf64bb064      0x1e892633
+       0xbf17307b      0x9118de2c      0x6b1d61a8      0x1945519c
+       0x32638ca4      0x5e436733      0x3dc20ff6      0x9babf127
+       0x485c1555      0x0d0c4e2d      0xc4d5d718      0x8cfffc16
+       0xf64050db      0xaa4ef416      0x8d398a00      0xe4a16eca
+       0x5d9d9314      0xefa2bf1c      0x05917dd4      0xca5f1660
+       0x59642534      0x02639b9f      0x12b895df      0xb2deaf0e
+       0x20d8f0b9      0x04d8342c      0xa1ba5f57      0xa26cdb06
+       0xca732ca8      0xdce0c561      0xf5e4b205      0xc05f5cfb
+       0xba4a41a6      0xaf219d7b      0xce08df01      0xa02bbdb9
+       0xc1adbc20      0xcb9ae4fd      0xd828cfb5      0x690b17db
+       0xd29ae8bc      0x8fc71289      0xd6fc9cf6      0x61c7a6fc
+       0x8e8012d5      0xd3320498      0x36e80084      0x0036d3ab
+       0x53141aae      0x987d0cba      0x57581df5      0xace4704c
+       0x3ce49642      0x991556c1      0x6cb0b984      0xac15e528
+       0xe7d208ca      0x2486d1c5      0x93b6623e      0x340b7622
+       0xe7e1cf7b      0x3cdeed88      0xa23c849a      0xcc6e8b3b
+       0x292add5a      0x17763ee1      0x9f87203e      0x72cf4551
+       0x2053e66f      0x06c3a411      0xb61c2e0c      0xa4a7f3ae
+       0x0ff87dbb      0x03999ed8      0x48aacedc      0x2e126ef3
+       0x799441bb      0xaee15b4d      0xea08bf54      0x47248787
+       0xb60afc11      0x8c3d6a20      0x7c04f801      0xb902760e
+       0x319040eb      0x370bbd5d      0x9a1dd5e6      0x63f7da1d
+       0xb3784eac      0x3b304dea      0x987ada9f      0x2b6b1cda
+       0xf9241003      0x0d3d16f2      0x1185dcbf      0x519b7a5f
+       0xeb612361      0x28b57da5      0xdeb8419a      0x0ba13122
+       0x062e28fa      0x5ffb9b36      0xb1258247      0x8337401f
+       0xed1f6423      0x730cafe6      0xf728c690      0xe40557eb
+       0xc4951a15      0x04a988a9      0xbf5fe18c      0x2766e40a
+       0xe4d74d13      0x8638d052      0x8eefeaf2      0x9ad07978
+       0x32042a87      0x4385f38d      0xc9b48f02      0x02ab0ae7
+       0x9eaeb632      0xf386c14d      0x8b1c2ab2      0xad432a24
+       0xfc5bd462      0x2d7ac5fe      0x45dff5c6      0xa235e1a6
+       0x825b770c      0x5568471b      0xa7ac3a3a      0xfcc6e40c
+       0x0c1be59c      0x77685a3c      0x5b1bafbd      0x40b8a139
+       0x3dd1bf01      0xb6651001      0xf2915a6a      0x16fe1cf2
+       0xe78467d1      0x4bec9fb1      0x88615320      0xa3920831
+       0xed4afac7      0x206cffba      0x96c42567      0xcc2b5215
+       0x7ca0193f      0x0e1a60e5      0xf3892c10      0x2ceee7b2
+       0x110d3311      0x9a322e7e      0x3cb7e5fc      0x3fb971c1
+       0x59971332      0x08386001      0xe4a2444d      0x17d9c47f
+       0x9f53c4a5      0xdb54e5c2      0xfaac9f08      0x975c07c6
+       0x8a6e6bcd      0x4392053a      0x6473bef8      0x4b3b91a3
+       0xfb7e8ebc      0x46c6ffed      0x04939839      0x71b93766
+       0x47e4f74a      0x786545c8      0x77f55b59      0xdf8e992d
+       0x60a0d2a5      0x6cc8a5cb      0x113ee95c      0xa378558d
+       0x5d3b8bd9      0x3c95b2a8      0x6efa3682      0x9535dd34
+       0x3e29974d      0xa477d069      0x2dbf58d2      0x165edae3
+       0xea25d53d      0x44e3ef71      0xba6341cf      0xc61b964c
+       0x4612838b      0x62151b9e      0xc1de2511      0xa364130c
+       0xa9710643      0x1a436c70      0x97030b09      0x5cef28e0
+       0xd5197e49      0x02b9ffa8      0x1b52dc7b      0x04f9428b
+       0x01ebed2a      0x1eaecbee      0xc53c4d54      0x3e34c125
+       0x05b4f37a      0x6e3d042b      0xf1c1f40d      0x39cfe9e1
+       0xd2938e89      0xa14b9846      0xb1333676      0x31068254
+       0x4b627e4b      0xb5185882      0x101b52bc      0x73e05abf
+       0x68a4e24c      0x67e301f4      0x6bf8b538      0xc502e1e1
+       0xc3889b5b      0xdfbc6d96      0x4239d0e1      0xbf3667ab
+       0xb0c4cb00      0x3efdcffd      0x7cd9661d      0x4f5eca03
+       0x0ef218dd      0x464f0826      0x048fc539      0x6a1c63fe
+       0x76cc341a      0x1ae2945c      0x7a339006      0x858fdc20
+       0x2a4a7270      0xd4cbe12c      0x7b27e5d8      0x998cf520
+       0x4795ccf7      0x52e15388      0x86aa7b96      0xff1845fa
+       0xd49d1061      0x035b6a80      0x1df18220      0x28fc4fd1
+       0xa8e8f333      0x3a9240a6      0x41a4caca      0xee736b6f
+       0xdfa7ce4b      0xd4bf5c0c      0x4e62f6d3      0xe98ae9b4
+       0x7f544550      0x2b0706df      0x8fb2e752      0x546af9d1
+       0x8517758f      0x53f522fc      0x03bd1819      0x6fd264e2
+       0x16839ef8      0x44a1200d      0xcd5a586b      0x1ead251c
+       0xf58dd3be      0x80217ce7      0x0367ff42      0x2d8f2ce8
+       0xe8a0a689      0xba33e366      0x5dc7980d      0x005c0eaf
+       0xc0c44118      0x5553076a      0xdaf39389      0x703e09eb
+       0xc54c8112      0x4a26135c      0x36a46f2b      0xdc93ee12
+       0x7060db72      0x7778befc      0xe028fc55      0x52e86278
+       0xd0b00188      0x6ed5565a      0xb5e2785c      0x3608bffa
+       0x55c3f5a3      0xe1e41afa      0x08a227fe      0x94c793ce
+       0x650934f7      0xddc36524      0x6dac40de      0x9eec3ceb
+       0x8fe3d1cc      0x3cebab86      0x61e4d63a      0x5382ea11
+       0xa90c9495      0x0277ccb3      0x412cecc1      0x5853c945
+       0x97df9a48      0x364d9b10      0x7e8c9bf1      0x6b4974ef
+       0xd3dbaeeb      0x6626dd26      0x2b746d2c      0xfb762155
+       0xf942f687      0x1317d1b5      0x0c989def      0x5f4c0ed6
+       0x31aebbd3      0x51cd8d5b      0x3d729511      0xc07c8f23
+       0xa7f3e6f7      0x7683dba9      0x5f051d5c      0x750437f5
+       0x1b9ffe98      0xa4de609b      0x4c498e9a      0x18dfc535
+       0x376c6c34      0x19a57039      0xa70e93eb      0x7e966bc7
+       0xb6e9d77a      0x3ab98e5f      0x1607125e      0xe8845aa3
+       0xa20a2d80      0xb17ac63b      0xa07a9790      0x71e5a14f
+       0xb6b5fc78      0x4c610f86      0xb57b21b6      0x1bcfb3ac
+       0xbf812998      0xd429986b      0x02b837e9      0x0823aca8
+       0xd8a85194      0x708bad39      0xff94ef19      0xc3599461
+       0xaee622f6      0xa8b5a808      0xf801b298      0x0aeb35b7
+       0x4db4bf27      0xfa31c205      0xa047dc66      0x7e0ae406
+       0x2ceea6cb      0xef0ef96f      0x4cc4fdba      0x6161256f
+       0x94505fd1      0xbced5596      0xbf9e36a5      0x271e68bd
+       0x7a3308b6      0xef1af50d      0xb55ede06      0x6783e602
+       0x1152acf0      0xdc644ccd      0x1b692da3      0x59f6886b
+       0xd7236158      0xe39d75a6      0xe7026697      0x25496283
+       0xb6b0a61c      0x09d0931c      0xe8d459a1      0x1a124097
+       0x88e50621      0xf2ed18ff      0x37681783      0x4afa1ffc
+       0x8a96ec4a      0x4474a860      0x274591b1      0x59df3968
+       0x34f56fb9      0xce821f96      0x7ec825b2      0x6ed4a9bf
+       0x687253cf      0xa511c1d3      0xaf2bd6f0      0xd1ce1a5c
+       0x241dd505      0x39037238      0x0c761934      0x53181db5
+       0x11ad47ec      0x915a527b      0x748bc970      0xeb8f2669
+       0xb8bfd5af      0xd8d19145      0x0361ff58      0x6dc6e2f2
+       0x1fd06556      0x120db4c5      0xbd704c8b      0x70a1a57c
+       0x27543851      0x095403a6      0x28171887      0x640e7c92
+       0xb48fd7d1      0x62ad2774      0x224767cd      0x347b8843
+       0x821ca7f3      0xf94749c6      0x2bc7f40f      0x700cc1d8
+       0x50d50832      0xc2f9465c      0xa6e1cbaa      0xe0f5e934
+       0x7f33617f      0x8876cb07      0x408c24fe      0xc0cfcdf7
+       0x39152b72      0xa0ba80ab      0x301a73eb      0x6e704f6c
+       0x3b73c24b      0xd433f861      0x43192007      0xa56d2ca4
+       0x2d28bd5d      0x14f4c9cd      0xb7fe189c      0x031e1818
+       0xf8f4133e      0xdc8e7727      0x4f8f5a06      0xe7b114cd
+       0x5cb9ff12      0xdb4c5a53      0xed956df5      0xf3634f5f
+       0x6cce1cc2      0x5393f9ac      0x1184c2f7      0x0b6fd240
+       0x64771374      0xaafed1a1      0xbdc55bcf      0x976414ef
+       0x6a333e56      0x0c5cefb2      0xff2574e0      0x11b059ef
+       0xff8b7f2a      0x9651e97b      0x594fe89b      0x7be60f6a
+       0x7b7695ac      0x612036f7      0x5be0d4fa      0x25855737
+       0x12e32ee2      0x8e86130f      0x46d75d41      0x3769d438
+       0xd14752d4      0x1612ad6d      0x8f86f2a0      0x63e01251
+       0x9a44ac4a      0x49fdb148      0xe1757062      0x42798804
+       0xf21f46c1      0xed0a3794      0x5528add4      0xeddc0c90
+       0x7f188ce8      0x59568b7a      0x8e25d50f      0x9277c492
+       0x955c6e6a      0x79f94a59      0x3a65fb08      0xceb23267
+       0x7d8dce01      0xd15c492d      0xa35f005c      0x0e7cba9a
+       0x950485d9      0x2d92e448      0x4aced016      0x0d10136d
+       0x3d2ec365      0xd982e881      0xe81940d2      0xb1a84849
+       0xdb30d967      0x9f51d3d4      0x4fbe18a9      0xef21cd28
+       0x5d3cba6c      0xaa89b02b      0xbe1e9526      0xa20a918e
+       0x0c26bd72      0x8372eff8      0xcf7ab414      0x1d3ab83f
+       0xfd2c8f79      0x4929f77e      0x2416e8df      0x65dcaaca
+       0x58fbf7b3      0x1c4a3089      0x9bfb6e26      0xc7338ac9
+       0x88e5ad26      0xc62bb3d4      0xad6d36f5      0x6445167d
+       0xe9de8daf      0xc391c6bc      0xa78b4558      0x0216bcdd
+       0xbd4365b9      0xb0a874b2      0xe95e9453      0x77296b9a
+       0x49803c1e      0xc01fd0ed      0x165a9d5d      0xf7da6442
+       0x4c00818d      0xaad5bfca      0xdb252937      0x0e4e0f74
+       0x0c2738e8      0xd075b8ba      0xe3b2df11      0x8aee60a4
+       0x36052cd8      0xb4aa190b      0x413e7155      0x3e7e646d
+       0x807e6eea      0x97993e6f      0xa5129ff5      0x98e01bca
+       0xa8bd70c9      0x8800721e      0xb3407ffa      0x266b2f99
+       0xd9da73ee      0xa06f634a      0xcaae53b1      0xd98e53c6
+       0x49368291      0xc89485fe      0x938a8a29      0xb57f77cc
+       0x58c867de      0xcdac8a84      0xf4d57b6f      0xc6daf080
+       0xe3d9c67f      0x0264b194      0xc3b2ca50      0x6d214667
+       0x88503872      0x549ed8cf      0xe827689f      0xcbe94e2e
+       0x4a02516d      0x24ddcfa1      0x3cbc736e      0x34c88707
+       0x9f4c9376      0x4ced4d41      0xfdbabfb5      0xafd291d9
+       0x2fa602a3      0x53e19d9c      0x44422427      0xf85e2c53
+       0x40e91ef7      0x02646045      0x3d1fa703      0x1613b99f
+       0xa108de10      0xf9cb3d04      0x7b9f9523      0x007d74b1
+       0x961771dc      0x2e49fe1b      0x5fefe27d      0x54737b43
+       0xa11d7c40      0x7f0cc2d9      0x67c6533e      0xd1ab10fa
+       0xb1950645      0x536087d2      0xd6937b40      0xc35960c1
+       0x2df0c356      0xecb5ab53      0x61e08998      0x1671bdd0
+       0xd72935b5      0xdf1a9d7c      0x70b1aa4e      0xa9272818
+       0x1f7b8d55      0xc7292a0f      0xda7af847      0x190076ad
+       0x58370ba6      0x3020fb4e      0xff8a4b30      0x13818958
+       0x6ba1ca38      0x6a90d39b      0x5e180929      0x206e8a22
+       0x0568f241      0x5f83ad21      0xef05e5c6      0x21d0521c
+       0xe7886eff      0x68eebbce      0x550c1659      0xa0843444
+       0x19468c2b      0x539cb9b8      0xa4b18b62      0xdab0680e
+       0x1b254dbc      0x47068aaf      0xa8193743      0x44b60b88
+       0x90c07337      0x2e55666a      0x632f4b23      0x68af10db
+       0x8e29f54b      0x5f436bcd      0x8bf81d55      0xb640ccc5
+       0x2e4ab6a9      0x198697a5      0x8a1c8481      0x572fb679
+       0x7597c416      0x608fd45e      0x57c8c7f4      0xe151d349
+       0xed9e17bb      0xa66f2816      0x8175fe68      0xd57d91ad
+       0x79df0711      0x7a349868      0x13403cd4      0x7d974c60
+       0x8860ce70      0x2e6d62ea      0x8916e2f2      0x0e336838
+       0xf54d382d      0xc4e172c8      0x94bfcfbf      0x5fa53172
+       0x2933cecd      0x4d5b8439      0x0ca0e6e4      0x8ef87b00
+       0x2fdd121c      0x24beae76      0xa85b47f4      0x4e38af2e
+       0x12b8734a      0xf698abf4      0xde2c2d93      0xeb100795
+       0x8ab19df8      0x93a6f4d1      0x43c4b2cb      0xbaff7c4a
+       0xf52b1471      0x72804f4f      0x0c0ca257      0x1dc24c77
+       0xbad7203b      0x3a998fa0      0x9cb20388      0x7ef1fb3b
+       0xbae66020      0x9a22144f      0x39ac47db      0x3f145996
+       0x05a32b6c      0xd201a2ec      0xd868727f      0x08b2df4f
+       0x4583bbfa      0x9a422baa      0xa6a2e8f5      0x236310ec
+       0x5aafc3cf      0x344156a6      0x6f964ceb      0xed0495ae
+       0xb5638c98      0x2c8e84ba      0x63d8c7a5      0xec956b66
+       0x69c54f32      0x767874ec      0xe8fb6ce1      0x68b1c780
+       0xe4b861e4      0x2787cc38      0x4b2202e7      0x23b476be
+       0xecdf296f      0x094aa000      0xe95ef073      0x4182ebb5
+       0x30daa31a      0xef68cb68      0x2fbcf6bc      0x21c52620
+       0x19abf83e      0x4de7528c      0x05fe4c05      0x32c2a1e9
+       0x8c23abdb      0xabba9a90      0xa6a215c1      0x891f915c
+       0x667cd65a      0xaa5a9b2c      0x689fd1e9      0x42b52c95
+       0xd9872e76      0x05dd5278      0xc19798f7      0x8d031d86
+       0x25690670      0x165f4b19      0x76b51d6f      0x61cd8232
+       0x7b530271      0xa8e9326c      0xd952e94d      0x56a7021b
+       0x128be860      0x4da40144      0xeb4ac3d5      0x82b7ff5a
+       0xea2abda7      0x690a9ebc      0x33562378      0x6bc91b2f
+       0x46134185      0x8fb77fb2      0x029518a2      0xe1fa1f4c
+       0xf78783b9      0x5d8ebe63      0x103e8050      0x924085bf
+       0x80593f2e      0x5be4bcb6      0xcb935edd      0x882d0a5f
+       0x7deb8205      0xcdc0fe2e      0x9c333db4      0x1d0c888d
+       0xf8dc3575      0x2f901125      0x6bf48cdb      0x98ab6fb4
+       0x491d7df2      0xa064922e      0xbbb86c70      0x88aad77d
+       0xfcff0669      0xb0c47c1c      0x0fcc6fe1      0x50df8a83
+       0x014460e4      0xb014e6ab      0xbeff4bc5      0x8d939fae
+       0xd750ae17      0x42dd29c9      0xdb1cbf70      0x82265be9
+       0xd11afd6a      0x21834e1c      0xd11e3c3a      0xbe568139
+       0x6cf92d50      0x9304ebf1      0xf177046b      0xa5b127a5
+       0xfb57e4a7      0xf94291df      0x0f089d58      0x07395b5f
+       0xde4ba5b9      0xf7371fc5      0xae44f190      0xd529271d
+       0xbcaea246      0xfa777c0b      0xad3bab9f      0x0d6251ec
+       0x6f4fa894      0xc39273e2      0x7710fcc3      0x81f08a5d
+       0x395b54ee      0x87295638      0x57398bb0      0xfd46c7c9
+       0x3f1dafc6      0x548479b7      0x37c42fba      0xa2130147
+       0x99dc0bb0      0x3596c5cf      0xbcca6bec      0x418735ed
+       0xfcd4273d      0xee141135      0x8457cf47      0x95fe7220
+       0x041aaf8a      0x6e947153      0xc963afa7      0x09390a74
+       0xc40dffd3      0x4208039c      0x319b1f84      0x42b6b3b7
+       0xade789da      0x83338c91      0xf2d74712      0xe80011dd
+       0xdd61645e      0x286fc63a      0x26e2fb23      0xfef2b4ea
+       0x3290efb8      0x595a0c17      0x6cd9bea9      0x7be1338e
+       0xe0ff2c09      0x1b93aea5      0xbbd97e91      0x5e1ae1e7
+       0x7c6c078b      0x0b9b3a03      0x43d38011      0x824cd94b
+       0x9725170d      0x87ce6f33      0x60525d85      0xc0a5e853
+       0x242e613b      0xebf72857      0xcb500fc6      0x0de5c3f0
+       0x382b625d      0x08840e50      0xcef30663      0x1bc848b6
+       0xefa78141      0x81b860d6      0x4eb125fe      0x7e125296
+       0x276a5558      0x45caa775      0x7c6ec23c      0x5dcddd08
+       0xc41aa32d      0x6a2851b1      0xb69ae1c1      0x8f603c43
+       0x763497f2      0x73344cbd      0xcffd175c      0xfccf5a91
+       0xb2318bf7      0x66ac628f      0xa98fa975      0xb68e5426
+       0x27555715      0x5157a93f      0x666fd404      0xb37fcc40
+       0x563b0512      0xb70f8446      0xe10d257f      0x73793ef2
+       0x31a84915      0xe0de9489      0x08dfa368      0x9169d4fd
+       0xc14f5c9a      0x92e6db4f      0xa30b6cec      0xca04670e
+       0x8a664367      0xe8984e70      0x1c96a39c      0x655f9abd
+       0x6999a190      0x76267621      0x0f49f963      0x8ddad3a1
+       0x51fdab6a      0xaf0d6863      0x23b71bdb      0x32818c8a
+       0x6398044d      0x26c60bec      0xb0b631fa      0x938f69c7
+       0x52f11913      0x1e6fbe7a      0x92dcd409      0x419bfeae
+       0xb147bb96      0xbac5bf9d      0x08de155a      0xde8ca968
+       0x20aef902      0x62df25a8      0x64a4042f      0xef19da4e
+       0xc75fd112      0xc9863e47      0xaccfdbcb      0xd29b6090
+       0x6dc67b4a      0xa84b3cd6      0x45a0e708      0xd28673bd
+       0x00bebebe      0xd5e518d7      0xc63d647c      0xa28f5f6d
+       0x3372edc8      0xa1c44ed1      0x88e61d44      0x5e095835
+       0x2d8713ce      0x6791a885      0xae89c04a      0xf1dc5105
+       0x6423f3b7      0xf4e2f384      0x2d2761a7      0x38ea905d
+       0xa263d776      0xd1936fa6      0x2fc54081      0x429a25c2
+       0x13f6c5df      0xffffa6c1      0xfaf82002      0xe4bbb103
+       0x2fc0c622      0x669ee281      0xec785fda      0x91156b25
+       0xa9f4444e      0x354fdfc2      0x7c5f5069      0x72ae591b
+       0x73bfd64e      0x6b96d744      0xf261daaa      0x2de15dae
+       0xedaba9c2      0xf287b3fd      0x8b2097b6      0x589934c0
+       0x7edc2a73      0x469b16eb      0x247b9a22      0x8b7e6c7b
+       0x3e71ffe2      0x5275f242      0x032a211f      0x977bff60
+       0x4306ad03      0x6a212383      0xceb36448      0xa2a79209
+       0xe3842f42      0xcee0cbe7      0x37cdb626      0x29a0a515
+       0x2857ead6      0x981d5d9b      0xf0ff9b06      0x95de8cad
+       0x4dcb565b      0x065d585d      0xe7eb754b      0x278fa774
+       0xe4d8fb7a      0xe152f018      0xfb7bb25e      0x50323b64
+       0xba618e43      0xf8cb1c61      0x1b6dce25      0xb4fc7867
+       0x2a7fb213      0xea9e646e      0x3f9b735b      0x5640315d
+       0x0793ba5b      0x71ff31fb      0x4b41f1d6      0xb1538146
+       0x336f4272      0xf176d509      0xb7fc03c5      0xd6a1c927
+       0x56a68c10      0x8b4740cd      0x14c54f8a      0xf07ad8a9
+       0xa8403db8      0x37c23f2b      0xdca69aba      0x4b39ef9d
+       0x2af13bdb      0x6baace1f      0x8c7ca0d2      0xba86bd02
+       0x2a74681c      0x5542ae58      0xc36709e2      0x82b34568
+       0x26ea06be      0xd4bf458c      0xde209de7      0xa311b4e5
+       0xdc00e139      0x7d305958      0xc5d76ed7      0x0943a285
+       0x48ce4e29      0xe371bd9a      0xfe6a6501      0x4167d215
+       0x402e47ba      0x588458be      0xbf4bcf37      0xf7fa27a8
+       0xb725f91a      0xc17f5c07      0xce771dbe      0x66f9d592
+       0xe8521ed4      0x42f75171      0x343b3e74      0x2d5448b5
+       0x2d1fca8c      0xd7a32431      0xc29a88d2      0xffb07fd7
+       0xcca0333f      0x43204f2f      0x866c1867      0xcb215814
+       0xfcb67d4f      0x423680be      0xdf22f6d6      0x03373eda
+       0x3bd202e3      0xd8972fe3      0xb7733d70      0x7a472c76
+       0x6cc8a627      0x3b27e643      0xa3475f3f      0x87ffb286
+       0xf823d69f      0x6d57c38e      0xa0fd464e      0x53e2e341
+       0xaaab23ef      0x439429ef      0x55ba2a2b      0x4da5ea4c
+       0xc1fe05fc      0x874b7a34      0x9a875956      0x713ccc90
+       0x49afcff2      0x5905dc0b      0x1f5dddb7      0x8ef5c1d9
+       0xf60eca50      0x25172569      0x3525639a      0x25804bbe
+       0x5729cd49      0x17f84e66      0xc540d86d      0x51524bc9
+       0x9a6e9901      0xf5bcc70e      0xf7a73ffd      0x54509c8f
+       0xec58b8a4      0x9993703b      0x6ef45fc4      0x5ce3a507
+       0x1d73c611      0x8780e8ff      0xc7d2e02b      0x0bc825f2
+       0x02f75fca      0xe80c0758      0x24646fe9      0xd378ff5a
+       0x592c5619      0x6c80372e      0x1f7351d1      0x4db5182d
+       0x3985fdfb      0x16ca9158      0x58ee1ae4      0xaf2b9fa0
+       0xe97f60ce      0xbb911e68      0x01748fa0      0xaef578d3
+       0xc3736418      0x8ab0deb5      0x0de16af1      0xb8369f7b
+       0x68e43c12      0x914ca0f6      0xe950ef28      0x834eff90
+       0x51adb952      0xc42ee4ce      0xf70ab4a5      0xbf9fc916
+       0xed9444b1      0x845a6a1e      0xf92e7b64      0xb9ca8a1b
+       0xa9cdfcd0      0xb5956bc8      0xb8520e59      0xdde7aa57
+       0xb41d390f      0x364aef3c      0xf39d4482      0x8b4e651e
+       0x0b82f5fb      0x7960e81c      0x12ed7b84      0xe9f123ca
+       0x88a64db2      0xa0c714cb      0x57b01471      0x80ff31a6
+       0x7571d8cd      0x857035d9      0x0508587c      0x594a4a42
+       0x011503e5      0x27c75e55      0x03264f62      0x9316ed1d
+       0x36e5cd1e      0xfa9b23b4      0x5bc8c606      0x0902bd38
+       0xd6745c69      0x6fa73118      0xa50f7b94      0xc529e962
+       0x28738486      0x7b85a599      0x2c495a35      0x85f2cbef
+       0xa09dfe51      0x1c763ab2      0x4effdb5c      0x506586f0
+       0xec182a58      0x45293146      0xaf8d78b8      0xa89bd228
+       0xec24826a      0x752cc421      0xbf36aa46      0x6760e225
+       0xe15d0987      0x6fa9bdf3      0x6837c755      0x9426d654
+       0x14b48f5b      0x5d70567d      0x63a14f92      0x809d5361
+       0x3b6e2729      0x84ce5415      0x7eaca6e0      0x9b467302
+       0x8f39d484      0x8e78398c      0x33108b33      0xdc07005c
+       0xbdc2500f      0x35f1f452      0x9d254e3d      0xfa61eb21
+       0x2ab6c7aa      0x83561fdc      0x8735d598      0x416e8591
+       0xfe10e93a      0x18da409d      0xab6d0bfd      0x675baaf1
+       0x287fdd24      0x6b50b63c      0x8c08abca      0x871a59c9
+       0x41bb2ae4      0xfba9abdf      0xb46491c7      0x4e433d5a
+       0x01e4fbda      0x0bc40399      0x3bdb61c2      0x3cf051ba
+       0x910daa46      0x8d4065d6      0x270667eb      0xf6d42459
+       0x01993a1b      0x00a95dda      0x6ed5a693      0xed4fbf7b
+       0x24dbb70f      0x67fd62ee      0xcef5f0a4      0x9e65b798
+       0x9a9913fd      0x3d0e7190      0x4265b4e4      0x80bfc46f
+       0x6b354d2c      0x2b90a987      0xc989cb75      0x773e6b64
+       0x55325e9f      0x18816a56      0x07413406      0x5177ae31
+       0x24a19ef7      0xdac405a4      0xdca2d3b4      0xab7c7b70
+       0x42b5de0e      0xfcf918a5      0xa54d934b      0xcaa9eab6
+       0x50e63e2a      0x4b168926      0xb2442913      0x594c0f94
+       0xf387f31f      0x4d716749      0xc8433297      0x34c1a5de
+       0xe929008e      0x5644251b      0x736476d0      0x0d00aee7
+       0xf20b2f64      0x5e158173      0x9af3e568      0x5f19fa7e
+       0xb23b2861      0x8659ee6e      0x94058a64      0x66ec4fb1
+       0x37cd6a4a      0xbd2944fe      0x0ea44ec6      0xe7d64c24
+       0x75a170e3      0xb4a9479c      0x2215716a      0x64a8a574
+       0x257e86ab      0x86bae993      0x3030352b      0x15cb88bc
+       0x576363a0      0x61138c36      0x7cc4fe7f      0x648977a8
+       0x0ef71fec      0x1c60df47      0xc75f70ea      0x88509798
+       0x172b407a      0xf888e400      0xef33cd15      0x5976757d
+       0xf8cfef13      0xbf024380      0xbb9c1b02      0xe4c38ec9
+       0xf30fce01      0x8efa5213      0xf4b48aad      0xc94c3a37
+       0xeb1bcece      0x09a18b56      0x4e83c0d3      0x6fcf9f77
+       0xf52f4d76      0xf3368a12      0x33b2797f      0x627b6e41
+       0xefd05154      0xa83ae2a0      0xea211129      0xd25723d5
+       0x7bbb0e3b      0x7131f088      0x5dd5193f      0xef5aa905
+       0x39f77be7      0xa21b48c1      0x1ded01c1      0x5cf98c5f
+       0x6e23d207      0xd7e7dadf      0x5932ed1a      0x2a729061
+       0x29a89f4a      0xac0e8447      0x01ff4205      0x8b1456c6
+       0x3fba0156      0x658c03f7      0x5c69f968      0xf6570582
+       0x21bb0145      0x8683bf5b      0xa4b6eba5      0x4ccfe5cb
+       0xd202898c      0xbd2411cc      0xc2fc702a      0x5c39b695
+       0x87584ccf      0xeae3c735      0xc472b6f9      0x4249f637
+       0x3fa89c0e      0xce5a8bd7      0xbb28138b      0xc080ecb1
+       0x9cbf1916      0xd70424e9      0x75cc4ed1      0xa575f3e9
+       0x1c571f68      0xe2906205      0xc26520cf      0xf9c1fc8e
+       0x61c982de      0x1af6cfcc      0xaf397c9a      0x46830771
+       0x623d98bb      0xda7b52fa      0x5a3c57d3      0xfa35d2f0
+       0x4783df19      0x6ad07325      0x487406f4      0x3fae5152
+       0x189137cb      0xd98a644e      0x17ffe880      0xeb6aa9f7
+       0x67184e3e      0xe475734b      0x0f1113c2      0x39a4df47
+       0xbf8f6ec9      0xe13a4d8b      0x63ec02f5      0xdfe7d75d
+       0x1379034c      0x5db7314a      0xa9d9ad3e      0xfaaed8f2
+       0xf0fb6074      0x12f27b84      0xc97a92bb      0xae5e3bb7
+       0x5f7fc2bf      0x00cbc1f7      0x9360a4d9      0x3632ba04
+       0xad044c83      0xeda13ec1      0x34a214c0      0xcf9c972a
+       0x96352243      0xf1a35357      0x2d77bc30      0x8485bbad
+       0x67fbaa99      0x8035b1a5      0x8ca763c0      0x109d7887
+       0xa1c35cd8      0xdc79e308      0x4495404d      0x64419226
+       0xacdcea08      0x9545c0ef      0x5493e09e      0x7fe16336
+       0x41381aa2      0x5c344f46      0xb40cab9f      0xc43951c4
+       0xd86e52a5      0xb141d934      0xd78efcff      0xf37ec320
+       0xc184a45b      0xf4a57954      0xc8aed0bd      0xe602c15a
+       0x71a6b48b      0xce837428      0x02733706      0xc4a4a044
+       0xa75efb97      0xcb63d62e      0xd0580b5a      0xce499087
+       0xc12bf4ca      0x9c995345      0x1d8adfbc      0xe62fd60e
+       0xccbf5412      0x6161f8d0      0x64268e34      0x565d066b
+       0x1896b63f      0x838f8f2a      0x1e314a00      0xac470276
+       0x1879cfdf      0x4702d7f9      0x83b4d777      0x81fcb068
+       0x1b6da94d      0xd075ed01      0x3c7734e8      0x56389a0b
+       0x0743b9cd      0xb6b0bf0d      0x63107ab9      0x193172bc
+       0xc7b84c8e      0x982ce2aa      0xb8e387a6      0xc264a4b0
+       0x2ac6c802      0xb89ea335      0x052332a4      0x49932ecc
+       0xb940f808      0xa7a09330      0x19f3f49d      0x7aef6b5a
+       0x201d8ed0      0xf29aac4b      0x8ae2ac0f      0x998c1ca7
+       0x665c3927      0xab4ef641      0xf136710d      0x9644ee9b
+       0x34efae96      0x4c596035      0x8cfe8b3b      0x5d9f742e
+       0xab2c63ca      0x017d864d      0xd0604d6e      0xab24eee0
+       0x75916a9a      0xad0d1167      0xbeb47775      0x6ac822d1
+       0x776907aa      0x9e9377f2      0x438c5d81      0xd70e9964
+       0x1c09c914      0xab90e5cf      0x31cee523      0x26ba6ea7
+       0xef00781d      0x622b886d      0x36a54031      0x88b1221c
+       0x666333f5      0x60e1c93e      0x5e4d0e0a      0x3ee6ff69
+       0xceb4c76b      0xa5deb4f8      0x0668ced8      0x30225378
+       0x6697cf37      0xc5d9661d      0x089eab85      0x7684a876
+       0x018a81af      0x221a7fb2      0x31d80de0      0x9f18ae90
+       0xa29c9af0      0xc3e2b00f      0xda0edbab      0x7ee9cd2a
+       0x3ab0f88e      0x02c58228      0x606fa7aa      0x7776cb0a
+       0x4e8ad99c      0x3b527469      0x58123d62      0x4ce428d2
+       0xee91a210      0x466ba2cc      0x043c57b9      0xaf7bdd43
+       0x98e76fee      0x8f3eac1b      0x00dffd6c      0x6fcb1c6a
+       0x5cb90573      0x485d4505      0x0df5418a      0x26eafe35
+       0x0faddf3e      0x4e972930      0xe113c823      0xe45944d1
+       0xa646077f      0xc1708ae5      0x6ba07c20      0xc7e4e234
+       0xc6754ed5      0xbd6e85aa      0x8cc1756e      0x02afda29
+       0x72809597      0x75b6f5a1      0x61141874      0x1774047f
+       0x7a10afed      0xfac2c4ad      0x42cf5c99      0x24f0350e
+       0x042f2864      0xfab55b67      0xc8ead5bc      0x914e9512
+       0x77c8ef6b      0x8369aeb1      0x71bc947f      0x0c6b49d8
+       0x8ddd0513      0x028ad10d      0x99a1b28f      0xe6cfbdc8
+       0x7978b4a6      0x3ebbade8      0x9985f5cf      0x431f42f1
+       0x004372b2      0x18b67f68      0x20111c21      0xbb6f77ff
+       0x1783b030      0xa045d7d1      0x0e9c7e09      0x3ccbd95f
+       0x0b84a2ed      0xf0ee3325      0x63f2e126      0x5ec4c67b
+       0x2ca782cc      0xcaf20d04      0x8b59d515      0x3212aa33
+       0x335ca0c3      0x6f9e0cdd      0x4d4bf189      0x44d2fa0c
+       0x5abe9396      0x492794ee      0x10dcfcb1      0x9acda9bd
+       0xe8aa2803      0x3f1b9605      0x3e2ecb5a      0x971bfa8a
+       0xcbf141d2      0x0afafe10      0x2fc906a6      0xefad20c0
+       0x9e922581      0xe69142cc      0xc9c0ba82      0xc069e640
+       0xb99c08b6      0x4b62ca1f      0xf3c5767a      0x6ab088c7
+       0x8f0f0c0b      0x6726f64a      0x9711a3cd      0x46462571
+       0x3a58350e      0xa2561911      0xe24dfdfe      0x97443fdc
+       0xf80540be      0x069978bf      0xb38a359b      0x8e574f62
+       0x69aea75c      0xdc753fcb      0x2a74002c      0xced027b4
+       0xda993254      0x03409b83      0xf827331d      0x75fb3271
+       0x01ad839d      0x68520842      0xca65c45c      0x1a3db5a0
+       0x91d37dd3      0x6168c0fb      0x935f5a08      0x002007c3
+       0x42eb4760      0xdab3a804      0x72a6297e      0x905c32d9
+       0x81abcfa9      0x1b21d04a      0x5a1289ae      0x424e7183
+       0xc207906c      0x31fe9134      0x5eb2e5af      0xc9253fc7
+       0xc32be24f      0xe5474cbd      0xeff6e1b0      0x710e5e69
+       0xe6c4c538      0x96b5f1de      0x2abc9c35      0xddbd1a92
+       0x8aca40d7      0xe359c238      0x954718f4      0x18b157e5
+       0xeeed790e      0x6948a963      0x24e70bfb      0x4d681547
+       0xf68369a7      0x5b54409a      0x1f0b787a      0xc2610047
+       0x0f8bd269      0xd7c8c154      0x9dee62d9      0xd4738ed8
+       0x1a66c6b1      0x5bad5a5b      0xb110311a      0xfaec6802
+       0x6b750f2d      0xcbf8d0e0      0x11edaf4b      0xf64a07bb
+       0x422e7c15      0xb1732663      0x1ff404f0      0x2d5052b0
+       0x6e45356c      0x7e2201e8      0x7c5ebcd1      0x1cb4425a
+       0xb1539a64      0xa2e4459f      0xcf1ade8a      0xfc476473
+       0xf4147deb      0x2afbdd77      0xff01fabc      0x6597408a
+       0x0951220b      0x6750f3ec      0x0a242763      0xf3d71c05
+       0x84cb1c26      0xdb7a81bd      0x7aea1a5d      0x7e719a48
+       0xc5c12fe1      0x0ce2e988      0x29ecc6f0      0x5ede901a
+       0xda8399b1      0x31c05d6b      0xe1956aff      0x59ed7c3d
+       0x60832637      0x9bcb7cac      0x63c530d1      0x14c677de
+       0x9225ed18      0x065327c9      0xd1ff6a0e      0x5516517e
+       0x53c6f5c2      0xed5983cf      0xaa1d18b9      0xbe300d7f
+       0xadc525a7      0x07ea81b6      0xfc517a09      0x4ead3f86
+       0x45435f41      0x2efa58df      0x02348ebc      0x30ed6783
+       0x190b4fb9      0x85c55d6e      0xc9ed8896      0x416ee113
+       0x9b3536d9      0x30577cc0      0xbc4b88c8      0xcda59612
+       0xdfe2bd89      0xd60cde71      0x98843881      0xcc1f32f2
+       0x18b3f643      0x671a14ca      0xd6482a47      0xac6a7d38
+       0x1897da16      0x91b6fcb3      0xf199bb35      0xd38c00ba
+       0xa8c946b6      0x52a1ad37      0xd38ed2d4      0xa1d6f81d
+       0x5af6865b      0xebdb858f      0xb844b110      0x53201ea2
+       0x08870945      0x10c869de      0x19849613      0xdb35d3ed
+       0xd68ebd6e      0x1056fd48      0xf1a0e305      0xe3982ebd
+       0x6f7cc391      0x5956374a      0xf414a5a2      0x325119ab
+       0x99ee1f96      0x6f044bd9      0x8374805b      0xb55c366c
+       0xa2c77051      0x68f199e5      0xd36a9714      0x878f847b
+       0xec0394ae      0x86d0584b      0xf4df66b9      0x451cd039
+       0xf4de06ae      0x35dd0554      0x818a342f      0xeefdbfc9
+       0x5b4e9edd      0x22d9313a      0x3b710d60      0x6deaeb4c
+       0xa9e26512      0x98d31867      0x3c2c2d61      0x7eb5ce41
+       0x40890db6      0x7a3aa660      0x3ef4f306      0x7322881f
+       0x49dac4d5      0x96efe685      0x27bb7f49      0xbb955283
+       0x79c5f2b7      0xff599c28      0x28ee7f5e      0x9f324b73
+       0x45edb7cf      0x39a8b79c      0xd0919c6e      0xe149b29d
+       0x62f5f82e      0xebcfa23e      0xd4d68937      0x54270090
+       0x958af0d4      0xa1e4e799      0xaf68ac19      0x82a84f4e
+       0x50f67b84      0xd5e59629      0xf5fdf24c      0xab1d63c5
+       0x30835807      0x431fce5f      0xe5f96f4d      0x3f6b4802
+       0x14010be8      0xdca45ae5      0xc82709af      0xff76ce2c
+       0x8b222c22      0x73a2d948      0xa8d59cea      0x8c31849e
+       0x469c2e5f      0x3777ee84      0x5fdfa5da      0x02ef9bb2
+       0x792d3194      0xbed63f21      0x0b6dc5f1      0xc9d7fe08
+       0x6df7883d      0x366566cf      0xef772769      0x37826465
+       0x1cdc3086      0xa69ff7b6      0x235012ea      0x292f7e75
+       0x30bdd0fd      0xffdc9df1      0x95c6d570      0xec206204
+       0xc6cd42cb      0xc0d6dfd9      0xb7a16b71      0x17fa527e
+       0x295f2c79      0x990f9820      0x8b8f447d      0x193f9ad1
+       0xebddb2af      0x5dd532eb      0xf1bbd8e8      0x3444a3f4
+       0x18ccce93      0x05edeb4f      0xc4a6b935      0xba37aab0
+       0x96076ba4      0x250dc2f7      0xc4093548      0x030e777d
+       0x7ea40933      0x8da7b1dd      0x59c0b79f      0x807d437c
+       0xf5233ddf      0x54c1983f      0xfc18771b      0xe74b85f0
+       0xdbd725b5      0x70cdd153      0x4ffe300c      0xfda4bdae
+       0xf4ac75d2      0x91c4e15a      0x34d92b97      0x16356a79
+       >;
index 3ec18168339a4650ae48ce1ba28b8f01889c53e1..4951a8c957412ca116fd581ffd44841e499b8593 100644 (file)
@@ -7,9 +7,4 @@
 #ifndef _X86_ARCH_GPIO_H_
 #define _X86_ARCH_GPIO_H_
 
-struct ich6_bank_platdata {
-       uint32_t base_addr;
-       const char *bank_name;
-};
-
 #endif /* _X86_ARCH_GPIO_H_ */
diff --git a/arch/x86/include/asm/arch-ivybridge/gpio.h b/arch/x86/include/asm/arch-ivybridge/gpio.h
new file mode 100644 (file)
index 0000000..4951a8c
--- /dev/null
@@ -0,0 +1,10 @@
+/*
+ * Copyright (c) 2014, Google Inc.
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#ifndef _X86_ARCH_GPIO_H_
+#define _X86_ARCH_GPIO_H_
+
+#endif /* _X86_ARCH_GPIO_H_ */
diff --git a/arch/x86/include/asm/arch-ivybridge/me.h b/arch/x86/include/asm/arch-ivybridge/me.h
new file mode 100644 (file)
index 0000000..3a0809d
--- /dev/null
@@ -0,0 +1,356 @@
+/*
+ * From Coreboot src/southbridge/intel/bd82x6x/me.h
+ *
+ * Copyright (C) 2011 The Chromium OS Authors. All rights reserved.
+ *
+ * SPDX-License-Identifier:    GPL-2.0
+ */
+
+#ifndef _ASM_INTEL_ME_H
+#define _ASM_INTEL_ME_H
+
+#include <linux/compiler.h>
+#include <linux/types.h>
+
+#define ME_RETRY               100000  /* 1 second */
+#define ME_DELAY               10      /* 10 us */
+
+/*
+ * Management Engine PCI registers
+ */
+
+#define PCI_CPU_MEBASE_L       0x70    /* Set by MRC */
+#define PCI_CPU_MEBASE_H       0x74    /* Set by MRC */
+
+#define PCI_ME_HFS             0x40
+#define  ME_HFS_CWS_RESET      0
+#define  ME_HFS_CWS_INIT       1
+#define  ME_HFS_CWS_REC                2
+#define  ME_HFS_CWS_NORMAL     5
+#define  ME_HFS_CWS_WAIT       6
+#define  ME_HFS_CWS_TRANS      7
+#define  ME_HFS_CWS_INVALID    8
+#define  ME_HFS_STATE_PREBOOT  0
+#define  ME_HFS_STATE_M0_UMA   1
+#define  ME_HFS_STATE_M3       4
+#define  ME_HFS_STATE_M0       5
+#define  ME_HFS_STATE_BRINGUP  6
+#define  ME_HFS_STATE_ERROR    7
+#define  ME_HFS_ERROR_NONE     0
+#define  ME_HFS_ERROR_UNCAT    1
+#define  ME_HFS_ERROR_IMAGE    3
+#define  ME_HFS_ERROR_DEBUG    4
+#define  ME_HFS_MODE_NORMAL    0
+#define  ME_HFS_MODE_DEBUG     2
+#define  ME_HFS_MODE_DIS       3
+#define  ME_HFS_MODE_OVER_JMPR 4
+#define  ME_HFS_MODE_OVER_MEI  5
+#define  ME_HFS_BIOS_DRAM_ACK  1
+#define  ME_HFS_ACK_NO_DID     0
+#define  ME_HFS_ACK_RESET      1
+#define  ME_HFS_ACK_PWR_CYCLE  2
+#define  ME_HFS_ACK_S3         3
+#define  ME_HFS_ACK_S4         4
+#define  ME_HFS_ACK_S5         5
+#define  ME_HFS_ACK_GBL_RESET  6
+#define  ME_HFS_ACK_CONTINUE   7
+
+struct me_hfs {
+       u32 working_state:4;
+       u32 mfg_mode:1;
+       u32 fpt_bad:1;
+       u32 operation_state:3;
+       u32 fw_init_complete:1;
+       u32 ft_bup_ld_flr:1;
+       u32 update_in_progress:1;
+       u32 error_code:4;
+       u32 operation_mode:4;
+       u32 reserved:4;
+       u32 boot_options_present:1;
+       u32 ack_data:3;
+       u32 bios_msg_ack:4;
+} __packed;
+
+#define PCI_ME_UMA             0x44
+
+struct me_uma {
+       u32 size:6;
+       u32 reserved_1:10;
+       u32 valid:1;
+       u32 reserved_0:14;
+       u32 set_to_one:1;
+} __packed;
+
+#define PCI_ME_H_GS            0x4c
+#define  ME_INIT_DONE          1
+#define  ME_INIT_STATUS_SUCCESS        0
+#define  ME_INIT_STATUS_NOMEM  1
+#define  ME_INIT_STATUS_ERROR  2
+
+struct me_did {
+       u32 uma_base:16;
+       u32 reserved:8;
+       u32 status:4;
+       u32 init_done:4;
+} __packed;
+
+#define PCI_ME_GMES            0x48
+#define  ME_GMES_PHASE_ROM     0
+#define  ME_GMES_PHASE_BUP     1
+#define  ME_GMES_PHASE_UKERNEL 2
+#define  ME_GMES_PHASE_POLICY  3
+#define  ME_GMES_PHASE_MODULE  4
+#define  ME_GMES_PHASE_UNKNOWN 5
+#define  ME_GMES_PHASE_HOST    6
+
+struct me_gmes {
+       u32 bist_in_prog:1;
+       u32 icc_prog_sts:2;
+       u32 invoke_mebx:1;
+       u32 cpu_replaced_sts:1;
+       u32 mbp_rdy:1;
+       u32 mfs_failure:1;
+       u32 warm_rst_req_for_df:1;
+       u32 cpu_replaced_valid:1;
+       u32 reserved_1:2;
+       u32 fw_upd_ipu:1;
+       u32 reserved_2:4;
+       u32 current_state:8;
+       u32 current_pmevent:4;
+       u32 progress_code:4;
+} __packed;
+
+#define PCI_ME_HERES           0xbc
+#define  PCI_ME_EXT_SHA1       0x00
+#define  PCI_ME_EXT_SHA256     0x02
+#define PCI_ME_HER(x)          (0xc0+(4*(x)))
+
+struct me_heres {
+       u32 extend_reg_algorithm:4;
+       u32 reserved:26;
+       u32 extend_feature_present:1;
+       u32 extend_reg_valid:1;
+} __packed;
+
+/*
+ * Management Engine MEI registers
+ */
+
+#define MEI_H_CB_WW            0x00
+#define MEI_H_CSR              0x04
+#define MEI_ME_CB_RW           0x08
+#define MEI_ME_CSR_HA          0x0c
+
+struct mei_csr {
+       u32 interrupt_enable:1;
+       u32 interrupt_status:1;
+       u32 interrupt_generate:1;
+       u32 ready:1;
+       u32 reset:1;
+       u32 reserved:3;
+       u32 buffer_read_ptr:8;
+       u32 buffer_write_ptr:8;
+       u32 buffer_depth:8;
+} __packed;
+
+#define MEI_ADDRESS_CORE       0x01
+#define MEI_ADDRESS_AMT                0x02
+#define MEI_ADDRESS_RESERVED   0x03
+#define MEI_ADDRESS_WDT                0x04
+#define MEI_ADDRESS_MKHI       0x07
+#define MEI_ADDRESS_ICC                0x08
+#define MEI_ADDRESS_THERMAL    0x09
+
+#define MEI_HOST_ADDRESS       0
+
+struct mei_header {
+       u32 client_address:8;
+       u32 host_address:8;
+       u32 length:9;
+       u32 reserved:6;
+       u32 is_complete:1;
+} __packed;
+
+#define MKHI_GROUP_ID_CBM      0x00
+#define MKHI_GROUP_ID_FWCAPS   0x03
+#define MKHI_GROUP_ID_MDES     0x08
+#define MKHI_GROUP_ID_GEN      0xff
+
+#define MKHI_GLOBAL_RESET      0x0b
+
+#define MKHI_FWCAPS_GET_RULE   0x02
+
+#define MKHI_MDES_ENABLE       0x09
+
+#define MKHI_GET_FW_VERSION    0x02
+#define MKHI_END_OF_POST       0x0c
+#define MKHI_FEATURE_OVERRIDE  0x14
+
+struct mkhi_header {
+       u32 group_id:8;
+       u32 command:7;
+       u32 is_response:1;
+       u32 reserved:8;
+       u32 result:8;
+} __packed;
+
+struct me_fw_version {
+       u16 code_minor;
+       u16 code_major;
+       u16 code_build_number;
+       u16 code_hot_fix;
+       u16 recovery_minor;
+       u16 recovery_major;
+       u16 recovery_build_number;
+       u16 recovery_hot_fix;
+} __packed;
+
+
+#define HECI_EOP_STATUS_SUCCESS       0x0
+#define HECI_EOP_PERFORM_GLOBAL_RESET 0x1
+
+#define CBM_RR_GLOBAL_RESET    0x01
+
+#define GLOBAL_RESET_BIOS_MRC  0x01
+#define GLOBAL_RESET_BIOS_POST 0x02
+#define GLOBAL_RESET_MEBX      0x03
+
+struct me_global_reset {
+       u8 request_origin;
+       u8 reset_type;
+} __packed;
+
+enum me_bios_path {
+       ME_NORMAL_BIOS_PATH,
+       ME_S3WAKE_BIOS_PATH,
+       ME_ERROR_BIOS_PATH,
+       ME_RECOVERY_BIOS_PATH,
+       ME_DISABLE_BIOS_PATH,
+       ME_FIRMWARE_UPDATE_BIOS_PATH,
+};
+
+struct __packed mbp_fw_version_name {
+       u32 major_version:16;
+       u32 minor_version:16;
+       u32 hotfix_version:16;
+       u32 build_version:16;
+};
+
+struct __packed mbp_icc_profile {
+       u8 num_icc_profiles;
+       u8 icc_profile_soft_strap;
+       u8 icc_profile_index;
+       u8 reserved;
+       u32 register_lock_mask[3];
+};
+
+struct __packed mefwcaps_sku {
+       u32 full_net:1;
+       u32 std_net:1;
+       u32 manageability:1;
+       u32 small_business:1;
+       u32 l3manageability:1;
+       u32 intel_at:1;
+       u32 intel_cls:1;
+       u32 reserved:3;
+       u32 intel_mpc:1;
+       u32 icc_over_clocking:1;
+       u32 pavp:1;
+       u32 reserved_1:4;
+       u32 ipv6:1;
+       u32 kvm:1;
+       u32 och:1;
+       u32 vlan:1;
+       u32 tls:1;
+       u32 reserved_4:1;
+       u32 wlan:1;
+       u32 reserved_5:8;
+};
+
+struct __packed tdt_state_flag {
+       u16 lock_state:1;
+       u16 authenticate_module:1;
+       u16 s3authentication:1;
+       u16 flash_wear_out:1;
+       u16 flash_variable_security:1;
+       u16 wwan3gpresent:1;
+       u16 wwan3goob:1;
+       u16 reserved:9;
+};
+
+struct __packed tdt_state_info {
+       u8 state;
+       u8 last_theft_trigger;
+       struct tdt_state_flag flags;
+};
+
+struct __packed platform_type_rule_data {
+       u32 platform_target_usage_type:4;
+       u32 platform_target_market_type:2;
+       u32 super_sku:1;
+       u32 reserved:1;
+       u32 intel_me_fw_image_type:4;
+       u32 platform_brand:4;
+       u32 reserved_1:16;
+};
+
+struct __packed mbp_fw_caps {
+       struct mefwcaps_sku fw_capabilities;
+       u8 available;
+};
+
+struct __packed mbp_rom_bist_data {
+       u16 device_id;
+       u16 fuse_test_flags;
+       u32 umchid[4];
+};
+
+struct __packed mbp_platform_key {
+       u32 key[8];
+};
+
+struct __packed mbp_plat_type {
+       struct platform_type_rule_data rule_data;
+       u8 available;
+};
+
+struct __packed me_bios_payload {
+       struct mbp_fw_version_name fw_version_name;
+       struct mbp_fw_caps fw_caps_sku;
+       struct mbp_rom_bist_data rom_bist_data;
+       struct mbp_platform_key platform_key;
+       struct mbp_plat_type fw_plat_type;
+       struct mbp_icc_profile icc_profile;
+       struct tdt_state_info at_state;
+       u32 mfsintegrity;
+};
+
+struct __packed mbp_header {
+       u32 mbp_size:8;
+       u32 num_entries:8;
+       u32 rsvd:16;
+};
+
+struct __packed mbp_item_header {
+       u32 app_id:8;
+       u32 item_id:8;
+       u32 length:8;
+       u32 rsvd:8;
+};
+
+struct __packed me_fwcaps {
+       u32 id;
+       u8 length;
+       struct mefwcaps_sku caps_sku;
+       u8 reserved[3];
+};
+
+/* Defined in me_status.c for both romstage and ramstage */
+void intel_me_status(struct me_hfs *hfs, struct me_gmes *gmes);
+
+void intel_early_me_status(void);
+int intel_early_me_init(void);
+int intel_early_me_uma_size(void);
+int intel_early_me_init_done(u8 status);
+
+#endif
diff --git a/arch/x86/include/asm/arch-ivybridge/microcode.h b/arch/x86/include/asm/arch-ivybridge/microcode.h
new file mode 100644 (file)
index 0000000..bc9b87c
--- /dev/null
@@ -0,0 +1,20 @@
+/*
+ * Copyright (c) 2015 Google, Inc
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#ifndef __ASM_ARCH_MICROCODE_H
+#define __ASM_ARCH_MICROCODE_H
+
+/**
+ * microcode_update_intel() - Apply microcode updates
+ *
+ * Applies any microcode updates in the device tree.
+ *
+ * @return 0 if OK, -EEXIST if the updates were already applied, -ENOENT if
+ * not updates were found, -EINVAL if an update was invalid
+ */
+int microcode_update_intel(void);
+
+#endif
diff --git a/arch/x86/include/asm/arch-ivybridge/model_206ax.h b/arch/x86/include/asm/arch-ivybridge/model_206ax.h
new file mode 100644 (file)
index 0000000..8281d7a
--- /dev/null
@@ -0,0 +1,82 @@
+/*
+ * From Coreboot file of the same name
+ *
+ * Copyright (C) 2011 The ChromiumOS Authors.
+ *
+ * SPDX-License-Identifier:    GPL-2.0
+ */
+
+#ifndef _ASM_ARCH_MODEL_206AX_H
+#define _ASM_ARCH_MODEL_206AX_H
+
+/* SandyBridge/IvyBridge bus clock is fixed at 100MHz */
+#define SANDYBRIDGE_BCLK               100
+
+#define  CPUID_VMX                     (1 << 5)
+#define  CPUID_SMX                     (1 << 6)
+#define MSR_FEATURE_CONFIG             0x13c
+#define MSR_FLEX_RATIO                 0x194
+#define  FLEX_RATIO_LOCK               (1 << 20)
+#define  FLEX_RATIO_EN                 (1 << 16)
+#define IA32_PLATFORM_DCA_CAP          0x1f8
+#define IA32_MISC_ENABLE               0x1a0
+#define MSR_TEMPERATURE_TARGET         0x1a2
+#define IA32_PERF_CTL                  0x199
+#define IA32_THERM_INTERRUPT           0x19b
+#define IA32_ENERGY_PERFORMANCE_BIAS   0x1b0
+#define  ENERGY_POLICY_PERFORMANCE     0
+#define  ENERGY_POLICY_NORMAL          6
+#define  ENERGY_POLICY_POWERSAVE       15
+#define IA32_PACKAGE_THERM_INTERRUPT   0x1b2
+#define MSR_LT_LOCK_MEMORY             0x2e7
+#define IA32_MC0_STATUS                0x401
+
+#define MSR_PIC_MSG_CONTROL            0x2e
+#define  PLATFORM_INFO_SET_TDP         (1 << 29)
+
+#define MSR_MISC_PWR_MGMT              0x1aa
+#define  MISC_PWR_MGMT_EIST_HW_DIS     (1 << 0)
+#define MSR_TURBO_RATIO_LIMIT          0x1ad
+#define MSR_POWER_CTL                  0x1fc
+
+#define MSR_PKGC3_IRTL                 0x60a
+#define MSR_PKGC6_IRTL                 0x60b
+#define MSR_PKGC7_IRTL                 0x60c
+#define  IRTL_VALID                    (1 << 15)
+#define  IRTL_1_NS                     (0 << 10)
+#define  IRTL_32_NS                    (1 << 10)
+#define  IRTL_1024_NS                  (2 << 10)
+#define  IRTL_32768_NS                 (3 << 10)
+#define  IRTL_1048576_NS               (4 << 10)
+#define  IRTL_33554432_NS              (5 << 10)
+#define  IRTL_RESPONSE_MASK            (0x3ff)
+
+/* long duration in low dword, short duration in high dword */
+#define  PKG_POWER_LIMIT_MASK          0x7fff
+#define  PKG_POWER_LIMIT_EN            (1 << 15)
+#define  PKG_POWER_LIMIT_CLAMP         (1 << 16)
+#define  PKG_POWER_LIMIT_TIME_SHIFT    17
+#define  PKG_POWER_LIMIT_TIME_MASK     0x7f
+
+#define MSR_PP0_CURRENT_CONFIG         0x601
+#define  PP0_CURRENT_LIMIT             (112 << 3) /* 112 A */
+#define MSR_PP1_CURRENT_CONFIG         0x602
+#define  PP1_CURRENT_LIMIT_SNB         (35 << 3) /* 35 A */
+#define  PP1_CURRENT_LIMIT_IVB         (50 << 3) /* 50 A */
+#define MSR_PKG_POWER_SKU_UNIT         0x606
+#define MSR_PKG_POWER_SKU              0x614
+
+#define IVB_CONFIG_TDP_MIN_CPUID       0x306a2
+#define MSR_CONFIG_TDP_NOMINAL         0x648
+#define MSR_CONFIG_TDP_LEVEL1          0x649
+#define MSR_CONFIG_TDP_LEVEL2          0x64a
+#define MSR_CONFIG_TDP_CONTROL         0x64b
+#define MSR_TURBO_ACTIVATION_RATIO     0x64c
+
+/* P-state configuration */
+#define PSS_MAX_ENTRIES                        8
+#define PSS_RATIO_STEP                 2
+#define PSS_LATENCY_TRANSITION         10
+#define PSS_LATENCY_BUSMASTER          10
+
+#endif
diff --git a/arch/x86/include/asm/arch-ivybridge/pch.h b/arch/x86/include/asm/arch-ivybridge/pch.h
new file mode 100644 (file)
index 0000000..c6efdb8
--- /dev/null
@@ -0,0 +1,356 @@
+/*
+ * Copyright (c) 2014 Google, Inc
+ *
+ * From Coreboot src/southbridge/intel/bd82x6x/pch.h
+ *
+ * Copyright (C) 2008-2009 coresystems GmbH
+ * Copyright (C) 2012 The Chromium OS Authors.  All rights reserved.
+ *
+ * SPDX-License-Identifier:    GPL-2.0
+ */
+
+#ifndef _ASM_ARCH_PCH_H
+#define _ASM_ARCH_PCH_H
+
+#include <pci.h>
+
+#define DEFAULT_GPIOBASE       0x0480
+#define DEFAULT_PMBASE         0x0500
+
+#define SMBUS_IO_BASE          0x0400
+
+#define PCH_EHCI1_DEV          PCI_BDF(0, 0x1d, 0)
+#define PCH_EHCI2_DEV          PCI_BDF(0, 0x1a, 0)
+#define PCH_XHCI_DEV           PCI_BDF(0, 0x14, 0)
+#define PCH_ME_DEV             PCI_BDF(0, 0x16, 0)
+#define PCH_PCIE_DEV_SLOT      28
+
+#define PCH_DEV                        PCI_BDF(0, 0, 0)
+#define PCH_VIDEO_DEV          PCI_BDF(0, 2, 0)
+
+/* PCI Configuration Space (D31:F0): LPC */
+#define PCH_LPC_DEV            PCI_BDF(0, 0x1f, 0)
+
+#define GEN_PMCON_1            0xa0
+#define GEN_PMCON_2            0xa2
+#define GEN_PMCON_3            0xa4
+#define ETR3                   0xac
+#define  ETR3_CWORWRE          (1 << 18)
+#define  ETR3_CF9GR            (1 << 20)
+
+#define PMBASE                 0x40
+#define ACPI_CNTL              0x44
+#define BIOS_CNTL              0xDC
+#define GPIO_BASE              0x48 /* LPC GPIO Base Address Register */
+#define GPIO_CNTL              0x4C /* LPC GPIO Control Register */
+#define GPIO_ROUT              0xb8
+
+#define LPC_IO_DEC             0x80 /* IO Decode Ranges Register */
+#define LPC_EN                 0x82 /* LPC IF Enables Register */
+#define  CNF2_LPC_EN           (1 << 13) /* 0x4e/0x4f */
+#define  CNF1_LPC_EN           (1 << 12) /* 0x2e/0x2f */
+#define  MC_LPC_EN             (1 << 11) /* 0x62/0x66 */
+#define  KBC_LPC_EN            (1 << 10) /* 0x60/0x64 */
+#define  GAMEH_LPC_EN          (1 << 9)  /* 0x208/0x20f */
+#define  GAMEL_LPC_EN          (1 << 8)  /* 0x200/0x207 */
+#define  FDD_LPC_EN            (1 << 3)  /* LPC_IO_DEC[12] */
+#define  LPT_LPC_EN            (1 << 2)  /* LPC_IO_DEC[9:8] */
+#define  COMB_LPC_EN           (1 << 1)  /* LPC_IO_DEC[6:4] */
+#define  COMA_LPC_EN           (1 << 0)  /* LPC_IO_DEC[3:2] */
+#define LPC_GEN1_DEC           0x84 /* LPC IF Generic Decode Range 1 */
+#define LPC_GEN2_DEC           0x88 /* LPC IF Generic Decode Range 2 */
+#define LPC_GEN3_DEC           0x8c /* LPC IF Generic Decode Range 3 */
+#define LPC_GEN4_DEC           0x90 /* LPC IF Generic Decode Range 4 */
+#define LPC_GENX_DEC(x)                (0x84 + 4 * (x))
+
+/* PCI Configuration Space (D31:F3): SMBus */
+#define PCH_SMBUS_DEV          PCI_BDF(0, 0x1f, 3)
+#define SMB_BASE               0x20
+#define HOSTC                  0x40
+#define SMB_RCV_SLVA           0x09
+
+/* HOSTC bits */
+#define I2C_EN                 (1 << 2)
+#define SMB_SMI_EN             (1 << 1)
+#define HST_EN                 (1 << 0)
+
+/* SMBus I/O bits. */
+#define SMBHSTSTAT             0x0
+#define SMBHSTCTL              0x2
+#define SMBHSTCMD              0x3
+#define SMBXMITADD             0x4
+#define SMBHSTDAT0             0x5
+#define SMBHSTDAT1             0x6
+#define SMBBLKDAT              0x7
+#define SMBTRNSADD             0x9
+#define SMBSLVDATA             0xa
+#define SMLINK_PIN_CTL         0xe
+#define SMBUS_PIN_CTL          0xf
+
+#define SMBUS_TIMEOUT          (10 * 1000 * 100)
+
+
+/* Root Complex Register Block */
+#define DEFAULT_RCBA           0xfed1c000
+#define RCB_REG(reg)           (DEFAULT_RCBA + (reg))
+
+#define PCH_RCBA_BASE          0xf0
+
+#define VCH            0x0000  /* 32bit */
+#define VCAP1          0x0004  /* 32bit */
+#define VCAP2          0x0008  /* 32bit */
+#define PVC            0x000c  /* 16bit */
+#define PVS            0x000e  /* 16bit */
+
+#define V0CAP          0x0010  /* 32bit */
+#define V0CTL          0x0014  /* 32bit */
+#define V0STS          0x001a  /* 16bit */
+
+#define V1CAP          0x001c  /* 32bit */
+#define V1CTL          0x0020  /* 32bit */
+#define V1STS          0x0026  /* 16bit */
+
+#define RCTCL          0x0100  /* 32bit */
+#define ESD            0x0104  /* 32bit */
+#define ULD            0x0110  /* 32bit */
+#define ULBA           0x0118  /* 64bit */
+
+#define RP1D           0x0120  /* 32bit */
+#define RP1BA          0x0128  /* 64bit */
+#define RP2D           0x0130  /* 32bit */
+#define RP2BA          0x0138  /* 64bit */
+#define RP3D           0x0140  /* 32bit */
+#define RP3BA          0x0148  /* 64bit */
+#define RP4D           0x0150  /* 32bit */
+#define RP4BA          0x0158  /* 64bit */
+#define HDD            0x0160  /* 32bit */
+#define HDBA           0x0168  /* 64bit */
+#define RP5D           0x0170  /* 32bit */
+#define RP5BA          0x0178  /* 64bit */
+#define RP6D           0x0180  /* 32bit */
+#define RP6BA          0x0188  /* 64bit */
+
+#define RPC            0x0400  /* 32bit */
+#define RPFN           0x0404  /* 32bit */
+
+#define TRSR           0x1e00  /*  8bit */
+#define TRCR           0x1e10  /* 64bit */
+#define TWDR           0x1e18  /* 64bit */
+
+#define IOTR0          0x1e80  /* 64bit */
+#define IOTR1          0x1e88  /* 64bit */
+#define IOTR2          0x1e90  /* 64bit */
+#define IOTR3          0x1e98  /* 64bit */
+
+#define TCTL           0x3000  /*  8bit */
+
+#define NOINT          0
+#define INTA           1
+#define INTB           2
+#define INTC           3
+#define INTD           4
+
+#define DIR_IDR                12      /* Interrupt D Pin Offset */
+#define DIR_ICR                8       /* Interrupt C Pin Offset */
+#define DIR_IBR                4       /* Interrupt B Pin Offset */
+#define DIR_IAR                0       /* Interrupt A Pin Offset */
+
+#define PIRQA          0
+#define PIRQB          1
+#define PIRQC          2
+#define PIRQD          3
+#define PIRQE          4
+#define PIRQF          5
+#define PIRQG          6
+#define PIRQH          7
+
+/* IO Buffer Programming */
+#define IOBPIRI                0x2330
+#define IOBPD          0x2334
+#define IOBPS          0x2338
+#define  IOBPS_RW_BX    ((1 << 9)|(1 << 10))
+#define  IOBPS_WRITE_AX        ((1 << 9)|(1 << 10))
+#define  IOBPS_READ_AX ((1 << 8)|(1 << 9)|(1 << 10))
+
+#define D31IP          0x3100  /* 32bit */
+#define D31IP_TTIP     24      /* Thermal Throttle Pin */
+#define D31IP_SIP2     20      /* SATA Pin 2 */
+#define D31IP_SMIP     12      /* SMBUS Pin */
+#define D31IP_SIP      8       /* SATA Pin */
+#define D30IP          0x3104  /* 32bit */
+#define D30IP_PIP      0       /* PCI Bridge Pin */
+#define D29IP          0x3108  /* 32bit */
+#define D29IP_E1P      0       /* EHCI #1 Pin */
+#define D28IP          0x310c  /* 32bit */
+#define D28IP_P8IP     28      /* PCI Express Port 8 */
+#define D28IP_P7IP     24      /* PCI Express Port 7 */
+#define D28IP_P6IP     20      /* PCI Express Port 6 */
+#define D28IP_P5IP     16      /* PCI Express Port 5 */
+#define D28IP_P4IP     12      /* PCI Express Port 4 */
+#define D28IP_P3IP     8       /* PCI Express Port 3 */
+#define D28IP_P2IP     4       /* PCI Express Port 2 */
+#define D28IP_P1IP     0       /* PCI Express Port 1 */
+#define D27IP          0x3110  /* 32bit */
+#define D27IP_ZIP      0       /* HD Audio Pin */
+#define D26IP          0x3114  /* 32bit */
+#define D26IP_E2P      0       /* EHCI #2 Pin */
+#define D25IP          0x3118  /* 32bit */
+#define D25IP_LIP      0       /* GbE LAN Pin */
+#define D22IP          0x3124  /* 32bit */
+#define D22IP_KTIP     12      /* KT Pin */
+#define D22IP_IDERIP   8       /* IDE-R Pin */
+#define D22IP_MEI2IP   4       /* MEI #2 Pin */
+#define D22IP_MEI1IP   0       /* MEI #1 Pin */
+#define D20IP          0x3128  /* 32bit */
+#define D20IP_XHCIIP   0
+#define D31IR          0x3140  /* 16bit */
+#define D30IR          0x3142  /* 16bit */
+#define D29IR          0x3144  /* 16bit */
+#define D28IR          0x3146  /* 16bit */
+#define D27IR          0x3148  /* 16bit */
+#define D26IR          0x314c  /* 16bit */
+#define D25IR          0x3150  /* 16bit */
+#define D22IR          0x315c  /* 16bit */
+#define D20IR          0x3160  /* 16bit */
+#define OIC            0x31fe  /* 16bit */
+
+#define SPI_FREQ_SWSEQ 0x3893
+#define SPI_DESC_COMP0 0x38b0
+#define SPI_FREQ_WR_ERA        0x38b4
+#define SOFT_RESET_CTRL 0x38f4
+#define SOFT_RESET_DATA 0x38f8
+
+#define DIR_ROUTE(a, b, c, d) \
+               (((d) << DIR_IDR) | ((c) << DIR_ICR) | \
+                       ((b) << DIR_IBR) | ((a) << DIR_IAR))
+
+#define RC             0x3400  /* 32bit */
+#define HPTC           0x3404  /* 32bit */
+#define GCS            0x3410  /* 32bit */
+#define BUC            0x3414  /* 32bit */
+#define PCH_DISABLE_GBE                (1 << 5)
+#define FD             0x3418  /* 32bit */
+#define DISPBDF                0x3424  /* 16bit */
+#define FD2            0x3428  /* 32bit */
+#define CG             0x341c  /* 32bit */
+
+/* Function Disable 1 RCBA 0x3418 */
+#define PCH_DISABLE_ALWAYS     ((1 << 0)|(1 << 26))
+#define PCH_DISABLE_P2P                (1 << 1)
+#define PCH_DISABLE_SATA1      (1 << 2)
+#define PCH_DISABLE_SMBUS      (1 << 3)
+#define PCH_DISABLE_HD_AUDIO   (1 << 4)
+#define PCH_DISABLE_EHCI2      (1 << 13)
+#define PCH_DISABLE_LPC                (1 << 14)
+#define PCH_DISABLE_EHCI1      (1 << 15)
+#define PCH_DISABLE_PCIE(x)    (1 << (16 + x))
+#define PCH_DISABLE_THERMAL    (1 << 24)
+#define PCH_DISABLE_SATA2      (1 << 25)
+#define PCH_DISABLE_XHCI       (1 << 27)
+
+/* Function Disable 2 RCBA 0x3428 */
+#define PCH_DISABLE_KT         (1 << 4)
+#define PCH_DISABLE_IDER       (1 << 3)
+#define PCH_DISABLE_MEI2       (1 << 2)
+#define PCH_DISABLE_MEI1       (1 << 1)
+#define PCH_ENABLE_DBDF                (1 << 0)
+
+/* ICH7 GPIOBASE */
+#define GPIO_USE_SEL   0x00
+#define GP_IO_SEL      0x04
+#define GP_LVL         0x0c
+#define GPO_BLINK      0x18
+#define GPI_INV                0x2c
+#define GPIO_USE_SEL2  0x30
+#define GP_IO_SEL2     0x34
+#define GP_LVL2                0x38
+#define GPIO_USE_SEL3  0x40
+#define GP_IO_SEL3     0x44
+#define GP_LVL3                0x48
+#define GP_RST_SEL1    0x60
+#define GP_RST_SEL2    0x64
+#define GP_RST_SEL3    0x68
+
+/* ICH7 PMBASE */
+#define PM1_STS                0x00
+#define   WAK_STS      (1 << 15)
+#define   PCIEXPWAK_STS        (1 << 14)
+#define   PRBTNOR_STS  (1 << 11)
+#define   RTC_STS      (1 << 10)
+#define   PWRBTN_STS   (1 << 8)
+#define   GBL_STS      (1 << 5)
+#define   BM_STS       (1 << 4)
+#define   TMROF_STS    (1 << 0)
+#define PM1_EN         0x02
+#define   PCIEXPWAK_DIS        (1 << 14)
+#define   RTC_EN       (1 << 10)
+#define   PWRBTN_EN    (1 << 8)
+#define   GBL_EN       (1 << 5)
+#define   TMROF_EN     (1 << 0)
+#define PM1_CNT                0x04
+#define   SLP_EN       (1 << 13)
+#define   SLP_TYP      (7 << 10)
+#define    SLP_TYP_S0  0
+#define    SLP_TYP_S1  1
+#define    SLP_TYP_S3  5
+#define    SLP_TYP_S4  6
+#define    SLP_TYP_S5  7
+#define   GBL_RLS      (1 << 2)
+#define   BM_RLD       (1 << 1)
+#define   SCI_EN       (1 << 0)
+#define PM1_TMR                0x08
+#define PROC_CNT       0x10
+#define LV2            0x14
+#define LV3            0x15
+#define LV4            0x16
+#define PM2_CNT                0x50 /* mobile only */
+#define GPE0_STS       0x20
+#define   PME_B0_STS   (1 << 13)
+#define   PME_STS      (1 << 11)
+#define   BATLOW_STS   (1 << 10)
+#define   PCI_EXP_STS  (1 << 9)
+#define   RI_STS       (1 << 8)
+#define   SMB_WAK_STS  (1 << 7)
+#define   TCOSCI_STS   (1 << 6)
+#define   SWGPE_STS    (1 << 2)
+#define   HOT_PLUG_STS (1 << 1)
+#define GPE0_EN                0x28
+#define   PME_B0_EN    (1 << 13)
+#define   PME_EN       (1 << 11)
+#define   TCOSCI_EN    (1 << 6)
+#define SMI_EN         0x30
+#define   INTEL_USB2_EN         (1 << 18) /* Intel-Specific USB2 SMI logic */
+#define   LEGACY_USB2_EN (1 << 17) /* Legacy USB2 SMI logic */
+#define   PERIODIC_EN   (1 << 14) /* SMI on PERIODIC_STS in SMI_STS */
+#define   TCO_EN        (1 << 13) /* Enable TCO Logic (BIOSWE et al) */
+#define   MCSMI_EN      (1 << 11) /* Trap microcontroller range access */
+#define   BIOS_RLS      (1 <<  7) /* asserts SCI on bit set */
+#define   SWSMI_TMR_EN  (1 <<  6) /* start software smi timer on bit set */
+#define   APMC_EN       (1 <<  5) /* Writes to APM_CNT cause SMI# */
+#define   SLP_SMI_EN    (1 <<  4) /* Write SLP_EN in PM1_CNT asserts SMI# */
+#define   LEGACY_USB_EN  (1 <<  3) /* Legacy USB circuit SMI logic */
+#define   BIOS_EN       (1 <<  2) /* Assert SMI# on setting GBL_RLS bit */
+#define   EOS           (1 <<  1) /* End of SMI (deassert SMI#) */
+#define   GBL_SMI_EN    (1 <<  0) /* SMI# generation at all? */
+#define SMI_STS                0x34
+#define ALT_GP_SMI_EN  0x38
+#define ALT_GP_SMI_STS 0x3a
+#define GPE_CNTL       0x42
+#define DEVACT_STS     0x44
+#define SS_CNT         0x50
+#define C3_RES         0x54
+#define TCO1_STS       0x64
+#define   DMISCI_STS   (1 << 9)
+#define TCO2_STS       0x66
+
+/**
+ * lpc_early_init() - set up LPC serial ports and other early things
+ *
+ * @blob:      Device tree blob
+ * @node:      Offset of LPC node
+ * @dev:       PCH PCI device containing the LPC
+ * @return 0 if OK, -ve on error
+ */
+int lpc_early_init(const void *blob, int node, pci_dev_t dev);
+
+#endif
diff --git a/arch/x86/include/asm/arch-ivybridge/pei_data.h b/arch/x86/include/asm/arch-ivybridge/pei_data.h
new file mode 100644 (file)
index 0000000..5026c8b
--- /dev/null
@@ -0,0 +1,121 @@
+/*
+ * Copyright (c) 2011, Google Inc.
+ *
+ * SPDX-License-Identifier:    GPL-2.0
+ */
+
+#ifndef ASM_ARCH_PEI_DATA_H
+#define ASM_ARCH_PEI_DATA_H
+
+struct pch_usb3_controller_settings {
+       /* 0: Disable, 1: Enable, 2: Auto, 3: Smart Auto */
+       uint16_t mode;
+       /* 4 bit mask, 1: switchable, 0: not switchable */
+       uint16_t hs_port_switch_mask;
+       /* 0: No xHCI preOS driver, 1: xHCI preOS driver */
+       uint16_t preboot_support;
+       /* 0: Disable, 1: Enable */
+       uint16_t xhci_streams;
+};
+
+typedef asmlinkage void (*tx_byte_func)(unsigned char byte);
+
+#define PEI_VERSION 6
+
+struct __packed pei_data {
+       uint32_t pei_version;
+       uint32_t mchbar;
+       uint32_t dmibar;
+       uint32_t epbar;
+       uint32_t pciexbar;
+       uint16_t smbusbar;
+       uint32_t wdbbar;
+       uint32_t wdbsize;
+       uint32_t hpet_address;
+       uint32_t rcba;
+       uint32_t pmbase;
+       uint32_t gpiobase;
+       uint32_t thermalbase;
+       uint32_t system_type; /* 0 Mobile, 1 Desktop/Server */
+       uint32_t tseg_size;
+       uint8_t spd_addresses[4];
+       uint8_t ts_addresses[4];
+       int boot_mode;
+       int ec_present;
+       int gbe_enable;
+       /*
+        * 0 = leave channel enabled
+        * 1 = disable dimm 0 on channel
+        * 2 = disable dimm 1 on channel
+        * 3 = disable dimm 0+1 on channel
+        */
+       int dimm_channel0_disabled;
+       int dimm_channel1_disabled;
+       /* Seed values saved in CMOS */
+       uint32_t scrambler_seed;
+       uint32_t scrambler_seed_s3;
+       /* Data read from flash and passed into MRC */
+       unsigned char *mrc_input;
+       unsigned int mrc_input_len;
+       /* Data from MRC that should be saved to flash */
+       unsigned char *mrc_output;
+       unsigned int mrc_output_len;
+       /*
+        * Max frequency DDR3 could be ran at. Could be one of four values:
+        * 800, 1067, 1333, 1600
+        */
+       uint32_t max_ddr3_freq;
+       /*
+        * USB Port Configuration:
+        *  [0] = enable
+        *  [1] = overcurrent pin
+        *  [2] = length
+        *
+        * Ports 0-7 can be mapped to OC0-OC3
+        * Ports 8-13 can be mapped to OC4-OC7
+        *
+        * Port Length
+        *  MOBILE:
+        *   < 0x050 = Setting 1 (back panel, 1-5in, lowest tx amplitude)
+        *   < 0x140 = Setting 2 (back panel, 5-14in, highest tx amplitude)
+        *  DESKTOP:
+        *   < 0x080 = Setting 1 (front/back panel, <8in, lowest tx amplitude)
+        *   < 0x130 = Setting 2 (back panel, 8-13in, higher tx amplitude)
+        *   < 0x150 = Setting 3 (back panel, 13-15in, higest tx amplitude)
+        */
+       uint16_t usb_port_config[16][3];
+       /* See the usb3 struct above for details */
+       struct pch_usb3_controller_settings usb3;
+       /*
+        * SPD data array for onboard RAM. Specify address 0xf0,
+        * 0xf1, 0xf2, 0xf3 to index one of the 4 slots in
+        * spd_address for a given "DIMM".
+        */
+       uint8_t spd_data[4][256];
+       tx_byte_func tx_byte;
+       int ddr3lv_support;
+       /*
+        * pcie_init needs to be set to 1 to have the system agent initialise
+        * PCIe. Note: This should only be required if your system has Gen3
+        * devices and it will increase your boot time by at least 100ms.
+        */
+       int pcie_init;
+       /*
+        * N mode functionality. Leave this setting at 0.
+        * 0 Auto
+        * 1 1N
+        * 2 2N
+        */
+       int nmode;
+       /*
+        * DDR refresh rate config. JEDEC Standard No.21-C Annex K allows
+        * for DIMM SPD data to specify whether double-rate is required for
+        * extended operating temperature range.
+        * 0 Enable double rate based upon temperature thresholds
+        * 1 Normal rate
+        * 2 Always enable double rate
+        */
+       int ddr_refresh_rate_config;
+};
+
+#endif
diff --git a/arch/x86/include/asm/arch-ivybridge/sandybridge.h b/arch/x86/include/asm/arch-ivybridge/sandybridge.h
new file mode 100644 (file)
index 0000000..114ee19
--- /dev/null
@@ -0,0 +1,109 @@
+/*
+ * Copyright (c) 2014 Google, Inc
+ *
+ * From Coreboot file of the same name
+ *
+ * Copyright (C) 2007-2008 coresystems GmbH
+ * Copyright (C) 2011 Google Inc.
+ *
+ * SPDX-License-Identifier:    GPL-2.0
+ */
+
+#ifndef _ACH_ASM_SANDYBRIDGE_H
+#define _ACH_ASM_SANDYBRIDGE_H
+
+/* Chipset types */
+#define SANDYBRIDGE_MOBILE     0
+#define SANDYBRIDGE_DESKTOP    1
+#define SANDYBRIDGE_SERVER     2
+
+/* Device ID for SandyBridge and IvyBridge */
+#define BASE_REV_SNB   0x00
+#define BASE_REV_IVB   0x50
+#define BASE_REV_MASK  0x50
+
+/* SandyBridge CPU stepping */
+#define SNB_STEP_D0    (BASE_REV_SNB + 5) /* Also J0 */
+#define SNB_STEP_D1    (BASE_REV_SNB + 6)
+#define SNB_STEP_D2    (BASE_REV_SNB + 7) /* Also J1/Q0 */
+
+/* IvyBridge CPU stepping */
+#define IVB_STEP_A0    (BASE_REV_IVB + 0)
+#define IVB_STEP_B0    (BASE_REV_IVB + 2)
+#define IVB_STEP_C0    (BASE_REV_IVB + 4)
+#define IVB_STEP_K0    (BASE_REV_IVB + 5)
+#define IVB_STEP_D0    (BASE_REV_IVB + 6)
+
+/* Intel Enhanced Debug region must be 4MB */
+#define IED_SIZE       0x400000
+
+/* Northbridge BARs */
+#define DEFAULT_MCHBAR         0xfed10000      /* 16 KB */
+#define DEFAULT_DMIBAR         0xfed18000      /* 4 KB */
+#define DEFAULT_EPBAR          0xfed19000      /* 4 KB */
+#define DEFAULT_RCBABASE       0xfed1c000
+/* 4 KB per PCIe device */
+#define DEFAULT_PCIEXBAR       CONFIG_MMCONF_BASE_ADDRESS
+
+/* Device 0:0.0 PCI configuration space (Host Bridge) */
+#define EPBAR          0x40
+#define MCHBAR         0x48
+#define PCIEXBAR       0x60
+#define DMIBAR         0x68
+#define X60BAR         0x60
+
+#define GGC            0x50                    /* GMCH Graphics Control */
+
+#define DEVEN          0x54                    /* Device Enable */
+#define  DEVEN_PEG60   (1 << 13)
+#define  DEVEN_IGD     (1 << 4)
+#define  DEVEN_PEG10   (1 << 3)
+#define  DEVEN_PEG11   (1 << 2)
+#define  DEVEN_PEG12   (1 << 1)
+#define  DEVEN_HOST    (1 << 0)
+
+#define PAM0           0x80
+#define PAM1           0x81
+#define PAM2           0x82
+#define PAM3           0x83
+#define PAM4           0x84
+#define PAM5           0x85
+#define PAM6           0x86
+
+#define LAC            0x87    /* Legacy Access Control */
+#define SMRAM          0x88    /* System Management RAM Control */
+#define  D_OPEN                (1 << 6)
+#define  D_CLS         (1 << 5)
+#define  D_LCK         (1 << 4)
+#define  G_SMRAME      (1 << 3)
+#define  C_BASE_SEG    ((0 << 2) | (1 << 1) | (0 << 0))
+
+#define TOM            0xa0
+#define TOUUD          0xa8    /* Top of Upper Usable DRAM */
+#define TSEG           0xb8    /* TSEG base */
+#define TOLUD          0xbc    /* Top of Low Used Memory */
+
+#define SKPAD          0xdc    /* Scratchpad Data */
+
+/* Device 0:1.0 PCI configuration space (PCI Express) */
+#define BCTRL1         0x3e    /* 16bit */
+
+/* Device 0:2.0 PCI configuration space (Graphics Device) */
+
+#define MSAC           0x62    /* Multi Size Aperture Control */
+#define SWSCI          0xe8    /* SWSCI  enable */
+#define ASLS           0xfc    /* OpRegion Base */
+
+/*
+ * MCHBAR
+ */
+#define MCHBAR_REG(reg)                (DEFAULT_RCBA + (reg))
+
+#define SSKPD          0x5d14  /* 16bit (scratchpad) */
+#define BIOS_RESET_CPL 0x5da8  /* 8bit */
+
+void report_platform_info(void);
+
+void sandybridge_early_init(int chipset_type);
+
+#endif
index ff15828a713de5d1258aada2dc5aa599734ca900..c97d988f3be87c42fb8588a94f0824ba61fec7fb 100644 (file)
@@ -10,5 +10,6 @@
 #define CONFIG_SYS_GENERIC_BOARD
 #define CONFIG_LMB
 #define CONFIG_SYS_BOOT_RAMDISK_HIGH
+#define asmlinkage __attribute__((regparm(0)))
 
 #endif
index 6c6774af76c8142d6aaf5af16bcd4c38c5fa1bb2..c8392915f1dbe87ce741946970682334281d1c85 100644 (file)
 /*
  * Copyright (c) 2014 The Chromium OS Authors.
  *
+ * Part of this file is adapted from coreboot
+ * src/arch/x86/include/arch/cpu.h and
+ * src/arch/x86/lib/cpu.c
+ *
  * SPDX-License-Identifier:    GPL-2.0+
  */
 
-#ifndef __X86_CPU_H
-#define __X86_CPU_H
+#ifndef _ASM_CPU_H
+#define _ASM_CPU_H
+
+enum {
+       X86_VENDOR_INVALID = 0,
+       X86_VENDOR_INTEL,
+       X86_VENDOR_CYRIX,
+       X86_VENDOR_AMD,
+       X86_VENDOR_UMC,
+       X86_VENDOR_NEXGEN,
+       X86_VENDOR_CENTAUR,
+       X86_VENDOR_RISE,
+       X86_VENDOR_TRANSMETA,
+       X86_VENDOR_NSC,
+       X86_VENDOR_SIS,
+       X86_VENDOR_ANY = 0xfe,
+       X86_VENDOR_UNKNOWN = 0xff
+};
+
+struct cpuid_result {
+       uint32_t eax;
+       uint32_t ebx;
+       uint32_t ecx;
+       uint32_t edx;
+};
+
+/*
+ * Generic CPUID function
+ */
+static inline struct cpuid_result cpuid(int op)
+{
+       struct cpuid_result result;
+       asm volatile(
+               "mov %%ebx, %%edi;"
+               "cpuid;"
+               "mov %%ebx, %%esi;"
+               "mov %%edi, %%ebx;"
+               : "=a" (result.eax),
+                 "=S" (result.ebx),
+                 "=c" (result.ecx),
+                 "=d" (result.edx)
+               : "0" (op)
+               : "edi");
+       return result;
+}
+
+/*
+ * Generic Extended CPUID function
+ */
+static inline struct cpuid_result cpuid_ext(int op, unsigned ecx)
+{
+       struct cpuid_result result;
+       asm volatile(
+               "mov %%ebx, %%edi;"
+               "cpuid;"
+               "mov %%ebx, %%esi;"
+               "mov %%edi, %%ebx;"
+               : "=a" (result.eax),
+                 "=S" (result.ebx),
+                 "=c" (result.ecx),
+                 "=d" (result.edx)
+               : "0" (op), "2" (ecx)
+               : "edi");
+       return result;
+}
+
+/*
+ * CPUID functions returning a single datum
+ */
+static inline unsigned int cpuid_eax(unsigned int op)
+{
+       unsigned int eax;
+
+       __asm__("mov %%ebx, %%edi;"
+               "cpuid;"
+               "mov %%edi, %%ebx;"
+               : "=a" (eax)
+               : "0" (op)
+               : "ecx", "edx", "edi");
+       return eax;
+}
+
+static inline unsigned int cpuid_ebx(unsigned int op)
+{
+       unsigned int eax, ebx;
+
+       __asm__("mov %%ebx, %%edi;"
+               "cpuid;"
+               "mov %%ebx, %%esi;"
+               "mov %%edi, %%ebx;"
+               : "=a" (eax), "=S" (ebx)
+               : "0" (op)
+               : "ecx", "edx", "edi");
+       return ebx;
+}
+
+static inline unsigned int cpuid_ecx(unsigned int op)
+{
+       unsigned int eax, ecx;
 
- /**
+       __asm__("mov %%ebx, %%edi;"
+               "cpuid;"
+               "mov %%edi, %%ebx;"
+               : "=a" (eax), "=c" (ecx)
+               : "0" (op)
+               : "edx", "edi");
+       return ecx;
+}
+
+static inline unsigned int cpuid_edx(unsigned int op)
+{
+       unsigned int eax, edx;
+
+       __asm__("mov %%ebx, %%edi;"
+               "cpuid;"
+               "mov %%edi, %%ebx;"
+               : "=a" (eax), "=d" (edx)
+               : "0" (op)
+               : "ecx", "edi");
+       return edx;
+}
+
+/* Standard macro to see if a specific flag is changeable */
+static inline int flag_is_changeable_p(uint32_t flag)
+{
+       uint32_t f1, f2;
+
+       asm(
+               "pushfl\n\t"
+               "pushfl\n\t"
+               "popl %0\n\t"
+               "movl %0,%1\n\t"
+               "xorl %2,%0\n\t"
+               "pushl %0\n\t"
+               "popfl\n\t"
+               "pushfl\n\t"
+               "popl %0\n\t"
+               "popfl\n\t"
+               : "=&r" (f1), "=&r" (f2)
+               : "ir" (flag));
+       return ((f1^f2) & flag) != 0;
+}
+
+/**
  * cpu_enable_paging_pae() - Enable PAE-paging
  *
- * @pdpt:      Value to set in cr3 (PDPT or PML4T)
+ * @cr3:       Value to set in cr3 (PDPT or PML4T)
  */
 void cpu_enable_paging_pae(ulong cr3);
 
@@ -26,6 +170,27 @@ void cpu_disable_paging_pae(void);
  */
 int cpu_has_64bit(void);
 
+/**
+ * cpu_vendor_name() - Get CPU vendor name
+ *
+ * @vendor:    CPU vendor enumeration number
+ *
+ * @return:    Address to hold the CPU vendor name string
+ */
+const char *cpu_vendor_name(int vendor);
+
+#define CPU_MAX_NAME_LEN       49
+
+/**
+ * cpu_get_name() - Get the name of the current cpu
+ *
+ * @name: Place to put name, which must be CPU_MAX_NAME_LEN bytes including
+ * @return pointer to name, which will likely be a few bytes after the start
+ * of @name
+ * \0 terminator
+ */
+char *cpu_get_name(char *name);
+
 /**
  * cpu_call64() - Jump to a 64-bit Linux kernel (internal function)
  *
index 3e8e2cdb9ebdd65f304848678f7038250db72c8d..48bbd1ae43e52c80f0971e860345aaf23711f8c1 100644 (file)
 
 #ifndef __ASSEMBLY__
 
+enum pei_boot_mode_t {
+       PEI_BOOT_NONE = 0,
+       PEI_BOOT_SOFT_RESET,
+       PEI_BOOT_RESUME,
+
+};
+
+struct memory_area {
+       uint64_t start;
+       uint64_t size;
+};
+
+struct memory_info {
+       int num_areas;
+       uint64_t total_memory;
+       uint64_t total_32bit_memory;
+       struct memory_area area[CONFIG_NR_DRAM_BANKS];
+};
+
 /* Architecture-specific global data */
 struct arch_global_data {
        struct global_data *gd_addr;            /* Location of Global Data */
+       uint8_t  x86;                   /* CPU family */
+       uint8_t  x86_vendor;            /* CPU vendor */
+       uint8_t  x86_model;
+       uint8_t  x86_mask;
+       uint32_t x86_device;
        uint64_t tsc_base;              /* Initial value returned by rdtsc() */
        uint32_t tsc_base_kclocks;      /* Initial tsc as a kclocks value */
        uint32_t tsc_prev;              /* For show_boot_progress() */
+       uint32_t tsc_mhz;               /* TSC frequency in MHz */
        void *new_fdt;                  /* Relocated FDT */
+       uint32_t bist;                  /* Built-in self test value */
+       struct pci_controller *hose;    /* PCI hose for early use */
+       enum pei_boot_mode_t pei_boot_mode;
+       const struct pch_gpio_map *gpio_map;    /* board GPIO map */
+       struct memory_info meminfo;     /* Memory information */
 };
 
 #endif
index 8bda414dbd73bdef24c93a816b39a1eb8a6129e6..5540d422b4afe2d1627c634e5937fc0b9785e8c1 100644 (file)
 /*
  * Copyright (c) 2012, Google Inc. All rights reserved.
- * SPDX-License-Identifier:    GPL-2.0+
+ * SPDX-License-Identifier:    GPL-2.0
  */
 
 #ifndef _X86_GPIO_H_
 #define _X86_GPIO_H_
 
+#include <linux/compiler.h>
 #include <asm/arch/gpio.h>
 #include <asm-generic/gpio.h>
 
+struct ich6_bank_platdata {
+       uint32_t base_addr;
+       const char *bank_name;
+};
+
+#define GPIO_MODE_NATIVE       0
+#define GPIO_MODE_GPIO         1
+#define GPIO_MODE_NONE         1
+
+#define GPIO_DIR_OUTPUT                0
+#define GPIO_DIR_INPUT         1
+
+#define GPIO_NO_INVERT         0
+#define GPIO_INVERT            1
+
+#define GPIO_LEVEL_LOW         0
+#define GPIO_LEVEL_HIGH                1
+
+#define GPIO_NO_BLINK          0
+#define GPIO_BLINK             1
+
+#define GPIO_RESET_PWROK       0
+#define GPIO_RESET_RSMRST      1
+
+struct pch_gpio_set1 {
+       u32 gpio0:1;
+       u32 gpio1:1;
+       u32 gpio2:1;
+       u32 gpio3:1;
+       u32 gpio4:1;
+       u32 gpio5:1;
+       u32 gpio6:1;
+       u32 gpio7:1;
+       u32 gpio8:1;
+       u32 gpio9:1;
+       u32 gpio10:1;
+       u32 gpio11:1;
+       u32 gpio12:1;
+       u32 gpio13:1;
+       u32 gpio14:1;
+       u32 gpio15:1;
+       u32 gpio16:1;
+       u32 gpio17:1;
+       u32 gpio18:1;
+       u32 gpio19:1;
+       u32 gpio20:1;
+       u32 gpio21:1;
+       u32 gpio22:1;
+       u32 gpio23:1;
+       u32 gpio24:1;
+       u32 gpio25:1;
+       u32 gpio26:1;
+       u32 gpio27:1;
+       u32 gpio28:1;
+       u32 gpio29:1;
+       u32 gpio30:1;
+       u32 gpio31:1;
+} __packed;
+
+struct pch_gpio_set2 {
+       u32 gpio32:1;
+       u32 gpio33:1;
+       u32 gpio34:1;
+       u32 gpio35:1;
+       u32 gpio36:1;
+       u32 gpio37:1;
+       u32 gpio38:1;
+       u32 gpio39:1;
+       u32 gpio40:1;
+       u32 gpio41:1;
+       u32 gpio42:1;
+       u32 gpio43:1;
+       u32 gpio44:1;
+       u32 gpio45:1;
+       u32 gpio46:1;
+       u32 gpio47:1;
+       u32 gpio48:1;
+       u32 gpio49:1;
+       u32 gpio50:1;
+       u32 gpio51:1;
+       u32 gpio52:1;
+       u32 gpio53:1;
+       u32 gpio54:1;
+       u32 gpio55:1;
+       u32 gpio56:1;
+       u32 gpio57:1;
+       u32 gpio58:1;
+       u32 gpio59:1;
+       u32 gpio60:1;
+       u32 gpio61:1;
+       u32 gpio62:1;
+       u32 gpio63:1;
+} __packed;
+
+struct pch_gpio_set3 {
+       u32 gpio64:1;
+       u32 gpio65:1;
+       u32 gpio66:1;
+       u32 gpio67:1;
+       u32 gpio68:1;
+       u32 gpio69:1;
+       u32 gpio70:1;
+       u32 gpio71:1;
+       u32 gpio72:1;
+       u32 gpio73:1;
+       u32 gpio74:1;
+       u32 gpio75:1;
+} __packed;
+
+/*
+ * This hilariously complex structure came from Coreboot. The
+ * setup_pch_gpios() function uses it. It could be move to device tree, or
+ * adjust to use masks instead of bitfields.
+ */
+struct pch_gpio_map {
+       struct {
+               const struct pch_gpio_set1 *mode;
+               const struct pch_gpio_set1 *direction;
+               const struct pch_gpio_set1 *level;
+               const struct pch_gpio_set1 *reset;
+               const struct pch_gpio_set1 *invert;
+               const struct pch_gpio_set1 *blink;
+       } set1;
+       struct {
+               const struct pch_gpio_set2 *mode;
+               const struct pch_gpio_set2 *direction;
+               const struct pch_gpio_set2 *level;
+               const struct pch_gpio_set2 *reset;
+       } set2;
+       struct {
+               const struct pch_gpio_set3 *mode;
+               const struct pch_gpio_set3 *direction;
+               const struct pch_gpio_set3 *level;
+               const struct pch_gpio_set3 *reset;
+       } set3;
+};
+
+void ich_gpio_set_gpio_map(const struct pch_gpio_map *map);
+
 #endif /* _X86_GPIO_H_ */
index c3ccd4f9064b83ce5d3e6208bfb29d47ea6dc8dd..4116de1f076bc6db13f2c6a60aca5aa7f9159fb9 100644 (file)
@@ -36,4 +36,7 @@
 #define PIT_CMD_MODE4  0x08            /* Select mode 4 */
 #define PIT_CMD_MODE5  0x0A            /* Select mode 5 */
 
+/* The clock frequency of the i8253/i8254 PIT */
+#define PIT_TICK_RATE  1193182ul
+
 #endif
index b07887eadcf587245333ec50308185a938cbf70a..8cbe08eb5655dff8c5da840646cf1a370918a5cd 100644 (file)
@@ -13,7 +13,5 @@ int calculate_relocation_address(void);
 int init_cache_f_r(void);
 int init_bd_struct_r(void);
 int init_func_spi(void);
-int find_fdt(void);
-int prepare_fdt(void);
 
 #endif /* !_INIT_HELPERS_H_ */
index 86bac90e8e882650829b7ce9177e5198339237a5..fcd9aa98574cd15f0b87bed7eaef3ee59bf8c978 100644 (file)
 #define memcpy_fromio(a,b,c)   memcpy((a),(b),(c))
 #define memcpy_toio(a,b,c)     memcpy((a),(b),(c))
 
+#define write_arch(type, endian, a, v) __raw_write##type(cpu_to_##endian(v), a)
+#define read_arch(type, endian, a) endian##_to_cpu(__raw_read##type(a))
+
+#define write_le64(a, v)       write_arch(q, le64, a, v)
+#define write_le32(a, v)       write_arch(l, le32, a, v)
+#define write_le16(a, v)       write_arch(w, le16, a, v)
+
+#define read_le64(a)   read_arch(q, le64, a)
+#define read_le32(a)   read_arch(l, le32, a)
+#define read_le16(a)   read_arch(w, le16, a)
+
+#define write_be32(a, v)       write_arch(l, be32, a, v)
+#define write_be16(a, v)       write_arch(w, be16, a, v)
+
+#define read_be32(a)   read_arch(l, be32, a)
+#define read_be16(a)   read_arch(w, be16, a)
+
+#define write_8(a, v)  __raw_writeb(v, a)
+#define read_8(a)      __raw_readb(a)
+
+#define clrbits(type, addr, clear) \
+       write_##type((addr), read_##type(addr) & ~(clear))
+
+#define setbits(type, addr, set) \
+       write_##type((addr), read_##type(addr) | (set))
+
+#define clrsetbits(type, addr, clear, set) \
+       write_##type((addr), (read_##type(addr) & ~(clear)) | (set))
+
+#define clrbits_be32(addr, clear) clrbits(be32, addr, clear)
+#define setbits_be32(addr, set) setbits(be32, addr, set)
+#define clrsetbits_be32(addr, clear, set) clrsetbits(be32, addr, clear, set)
+
+#define clrbits_le32(addr, clear) clrbits(le32, addr, clear)
+#define setbits_le32(addr, set) setbits(le32, addr, set)
+#define clrsetbits_le32(addr, clear, set) clrsetbits(le32, addr, clear, set)
+
+#define clrbits_be16(addr, clear) clrbits(be16, addr, clear)
+#define setbits_be16(addr, set) setbits(be16, addr, set)
+#define clrsetbits_be16(addr, clear, set) clrsetbits(be16, addr, clear, set)
+
+#define clrbits_le16(addr, clear) clrbits(le16, addr, clear)
+#define setbits_le16(addr, set) setbits(le16, addr, set)
+#define clrsetbits_le16(addr, clear, set) clrsetbits(le16, addr, clear, set)
+
+#define clrbits_8(addr, clear) clrbits(8, addr, clear)
+#define setbits_8(addr, set) setbits(8, addr, set)
+#define clrsetbits_8(addr, clear, set) clrsetbits(8, addr, clear, set)
+
 /*
  * ISA space is 'always mapped' on a typical x86 system, no need to
  * explicitly ioremap() it. The fact that the ISA IO space is mapped
diff --git a/arch/x86/include/asm/lapic.h b/arch/x86/include/asm/lapic.h
new file mode 100644 (file)
index 0000000..948e643
--- /dev/null
@@ -0,0 +1,59 @@
+/*
+ * From Coreboot file of same name
+ *
+ * Copyright (C) 2014 Google, Inc
+ *
+ * SPDX-License-Identifier:    GPL-2.0
+ */
+
+#ifndef _ARCH_ASM_LAPIC_H
+#define _ARCH_ASM_LAPIC_H
+
+#include <asm/io.h>
+#include <asm/lapic_def.h>
+#include <asm/msr.h>
+#include <asm/processor.h>
+
+static inline __attribute__((always_inline))
+               unsigned long lapic_read(unsigned long reg)
+{
+       return readl(LAPIC_DEFAULT_BASE + reg);
+}
+
+static inline __attribute__((always_inline))
+               void lapic_write(unsigned long reg, unsigned long val)
+{
+       writel(val, LAPIC_DEFAULT_BASE + reg);
+}
+
+static inline __attribute__((always_inline)) void lapic_wait_icr_idle(void)
+{
+       do { } while (lapic_read(LAPIC_ICR) & LAPIC_ICR_BUSY);
+}
+
+static inline void enable_lapic(void)
+{
+       msr_t msr;
+
+       msr = msr_read(LAPIC_BASE_MSR);
+       msr.hi &= 0xffffff00;
+       msr.lo &= 0x000007ff;
+       msr.lo |= LAPIC_DEFAULT_BASE | (1 << 11);
+       msr_write(LAPIC_BASE_MSR, msr);
+}
+
+static inline void disable_lapic(void)
+{
+       msr_t msr;
+
+       msr = msr_read(LAPIC_BASE_MSR);
+       msr.lo &= ~(1 << 11);
+       msr_write(LAPIC_BASE_MSR, msr);
+}
+
+static inline __attribute__((always_inline)) unsigned long lapicid(void)
+{
+       return lapic_read(LAPIC_ID) >> 24;
+}
+
+#endif
diff --git a/arch/x86/include/asm/lapic_def.h b/arch/x86/include/asm/lapic_def.h
new file mode 100644 (file)
index 0000000..722cead
--- /dev/null
@@ -0,0 +1,101 @@
+/*
+ * Taken from the Coreboot file of the same name
+ *
+ * (C) Copyright 2014 Google, Inc
+ *
+ * SPDX-License-Identifier:    GPL-2.0
+ */
+
+#ifndef _ASM_LAPIC_DEF_H
+#define _ASM_LAPIC_DEF_H
+
+#define LAPIC_BASE_MSR                 0x1B
+#define LAPIC_BASE_MSR_BOOTSTRAP_PROCESSOR     (1 << 8)
+#define LAPIC_BASE_MSR_ENABLE          (1 << 11)
+#define LAPIC_BASE_MSR_ADDR_MASK       0xFFFFF000
+
+#define LOCAL_APIC_ADDR                        0xfee00000
+#define LAPIC_DEFAULT_BASE             LOCAL_APIC_ADDR
+
+#define LAPIC_ID                       0x020
+#define LAPIC_LVR                      0x030
+#define LAPIC_TASKPRI                  0x80
+#define LAPIC_TPRI_MASK                        0xFF
+#define LAPIC_ARBID                    0x090
+#define LAPIC_RRR                      0x0C0
+#define LAPIC_SVR                      0x0f0
+#define LAPIC_SPIV                     0x0f0
+#define LAPIC_SPIV_ENABLE              0x100
+#define LAPIC_ESR                      0x280
+#define LAPIC_ESR_SEND_CS              0x00001
+#define LAPIC_ESR_RECV_CS              0x00002
+#define LAPIC_ESR_SEND_ACC             0x00004
+#define LAPIC_ESR_RECV_ACC             0x00008
+#define LAPIC_ESR_SENDILL              0x00020
+#define LAPIC_ESR_RECVILL              0x00040
+#define LAPIC_ESR_ILLREGA              0x00080
+#define LAPIC_ICR                      0x300
+#define LAPIC_DEST_SELF                        0x40000
+#define LAPIC_DEST_ALLINC              0x80000
+#define LAPIC_DEST_ALLBUT              0xC0000
+#define LAPIC_ICR_RR_MASK              0x30000
+#define LAPIC_ICR_RR_INVALID           0x00000
+#define LAPIC_ICR_RR_INPROG            0x10000
+#define LAPIC_ICR_RR_VALID             0x20000
+#define LAPIC_INT_LEVELTRIG            0x08000
+#define LAPIC_INT_ASSERT               0x04000
+#define LAPIC_ICR_BUSY                 0x01000
+#define LAPIC_DEST_LOGICAL             0x00800
+#define LAPIC_DM_FIXED                 0x00000
+#define LAPIC_DM_LOWEST                        0x00100
+#define LAPIC_DM_SMI                   0x00200
+#define LAPIC_DM_REMRD                 0x00300
+#define LAPIC_DM_NMI                   0x00400
+#define LAPIC_DM_INIT                  0x00500
+#define LAPIC_DM_STARTUP               0x00600
+#define LAPIC_DM_EXTINT                        0x00700
+#define LAPIC_VECTOR_MASK              0x000FF
+#define LAPIC_ICR2                     0x310
+#define GET_LAPIC_DEST_FIELD(x)                (((x) >> 24) & 0xFF)
+#define SET_LAPIC_DEST_FIELD(x)                ((x) << 24)
+#define LAPIC_LVTT                     0x320
+#define LAPIC_LVTPC                    0x340
+#define LAPIC_LVT0                     0x350
+#define LAPIC_LVT_TIMER_BASE_MASK      (0x3 << 18)
+#define GET_LAPIC_TIMER_BASE(x)                (((x) >> 18) & 0x3)
+#define SET_LAPIC_TIMER_BASE(x)                (((x) << 18))
+#define LAPIC_TIMER_BASE_CLKIN         0x0
+#define LAPIC_TIMER_BASE_TMBASE                0x1
+#define LAPIC_TIMER_BASE_DIV           0x2
+#define LAPIC_LVT_TIMER_PERIODIC       (1 << 17)
+#define LAPIC_LVT_MASKED               (1 << 16)
+#define LAPIC_LVT_LEVEL_TRIGGER                (1 << 15)
+#define LAPIC_LVT_REMOTE_IRR           (1 << 14)
+#define LAPIC_INPUT_POLARITY           (1 << 13)
+#define LAPIC_SEND_PENDING             (1 << 12)
+#define LAPIC_LVT_RESERVED_1           (1 << 11)
+#define LAPIC_DELIVERY_MODE_MASK       (7 << 8)
+#define LAPIC_DELIVERY_MODE_FIXED      (0 << 8)
+#define LAPIC_DELIVERY_MODE_NMI                (4 << 8)
+#define LAPIC_DELIVERY_MODE_EXTINT     (7 << 8)
+#define GET_LAPIC_DELIVERY_MODE(x)     (((x) >> 8) & 0x7)
+#define SET_LAPIC_DELIVERY_MODE(x, y)  (((x) & ~0x700)|((y) << 8))
+#define LAPIC_MODE_FIXED               0x0
+#define LAPIC_MODE_NMI                 0x4
+#define LAPIC_MODE_EXINT               0x7
+#define LAPIC_LVT1                     0x360
+#define LAPIC_LVTERR                   0x370
+#define LAPIC_TMICT                    0x380
+#define LAPIC_TMCCT                    0x390
+#define LAPIC_TDCR                     0x3E0
+#define LAPIC_TDR_DIV_TMBASE           (1 << 2)
+#define LAPIC_TDR_DIV_1                        0xB
+#define LAPIC_TDR_DIV_2                        0x0
+#define LAPIC_TDR_DIV_4                        0x1
+#define LAPIC_TDR_DIV_8                        0x2
+#define LAPIC_TDR_DIV_16               0x3
+#define LAPIC_TDR_DIV_32               0x8
+#define LAPIC_TDR_DIV_64               0x9
+#define LAPIC_TDR_DIV_128              0xA
+
+#endif
index 3b5915d5e26a871b828677b3f92bb8914fe7ff8e..df4398378caaa9ee2373814316180bdf77deafb1 100644 (file)
@@ -175,6 +175,25 @@ static inline int wrmsr_safe_regs(u32 regs[8])
        return native_wrmsr_safe_regs(regs);
 }
 
+typedef struct msr_t {
+       uint32_t lo;
+       uint32_t hi;
+} msr_t;
+
+static inline struct msr_t msr_read(unsigned msr_num)
+{
+       struct msr_t msr;
+
+       rdmsr(msr_num, msr.lo, msr.hi);
+
+       return msr;
+}
+
+static inline void msr_write(unsigned msr_num, msr_t msr)
+{
+       wrmsr(msr_num, msr.lo, msr.hi);
+}
+
 #define rdtscl(low)                                            \
        ((low) = (u32)__native_read_tsc())
 
diff --git a/arch/x86/include/asm/mtrr.h b/arch/x86/include/asm/mtrr.h
new file mode 100644 (file)
index 0000000..5f05a48
--- /dev/null
@@ -0,0 +1,121 @@
+/*
+ * Copyright (c) 2014 Google, Inc
+ *
+ * From Coreboot file of the same name
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#ifndef _ASM_MTRR_H
+#define _ASM_MTRR_H
+
+/*  These are the region types  */
+#define MTRR_TYPE_UNCACHEABLE 0
+#define MTRR_TYPE_WRCOMB     1
+/*#define MTRR_TYPE_         2*/
+/*#define MTRR_TYPE_         3*/
+#define MTRR_TYPE_WRTHROUGH  4
+#define MTRR_TYPE_WRPROT     5
+#define MTRR_TYPE_WRBACK     6
+#define MTRR_NUM_TYPES       7
+
+#define MTRRcap_MSR     0x0fe
+#define MTRRdefType_MSR 0x2ff
+
+#define MTRRdefTypeEn          (1 << 11)
+#define MTRRdefTypeFixEn       (1 << 10)
+
+#define SMRRphysBase_MSR 0x1f2
+#define SMRRphysMask_MSR 0x1f3
+
+#define MTRRphysBase_MSR(reg) (0x200 + 2 * (reg))
+#define MTRRphysMask_MSR(reg) (0x200 + 2 * (reg) + 1)
+
+#define MTRRphysMaskValid      (1 << 11)
+
+#define NUM_FIXED_RANGES 88
+#define RANGES_PER_FIXED_MTRR 8
+#define MTRRfix64K_00000_MSR 0x250
+#define MTRRfix16K_80000_MSR 0x258
+#define MTRRfix16K_A0000_MSR 0x259
+#define MTRRfix4K_C0000_MSR 0x268
+#define MTRRfix4K_C8000_MSR 0x269
+#define MTRRfix4K_D0000_MSR 0x26a
+#define MTRRfix4K_D8000_MSR 0x26b
+#define MTRRfix4K_E0000_MSR 0x26c
+#define MTRRfix4K_E8000_MSR 0x26d
+#define MTRRfix4K_F0000_MSR 0x26e
+#define MTRRfix4K_F8000_MSR 0x26f
+
+#if !defined(__ASSEMBLER__)
+
+/*
+ * The MTRR code has some side effects that the callers should be aware for.
+ * 1. The call sequence matters. x86_setup_mtrrs() calls
+ *    x86_setup_fixed_mtrrs_no_enable() then enable_fixed_mtrrs() (equivalent
+ *    of x86_setup_fixed_mtrrs()) then x86_setup_var_mtrrs(). If the callers
+ *    want to call the components of x86_setup_mtrrs() because of other
+ *    rquirements the ordering should still preserved.
+ * 2. enable_fixed_mtrr() will enable both variable and fixed MTRRs because
+ *    of the nature of the global MTRR enable flag. Therefore, all direct
+ *    or indirect callers of enable_fixed_mtrr() should ensure that the
+ *    variable MTRR MSRs do not contain bad ranges.
+ * 3. If CONFIG_CACHE_ROM is selected an MTRR is allocated for enabling
+ *    the caching of the ROM. However, it is set to uncacheable (UC). It
+ *    is the responsiblity of the caller to enable it by calling
+ *    x86_mtrr_enable_rom_caching().
+ */
+void x86_setup_mtrrs(void);
+/*
+ * x86_setup_var_mtrrs() parameters:
+ * address_bits - number of physical address bits supported by cpu
+ * above4gb - 2 means dynamically detect number of variable MTRRs available.
+ *            non-zero means handle memory ranges above 4GiB.
+ *            0 means ignore memory ranges above 4GiB
+ */
+void x86_setup_var_mtrrs(unsigned int address_bits, unsigned int above4gb);
+void enable_fixed_mtrr(void);
+void x86_setup_fixed_mtrrs(void);
+/* Set up fixed MTRRs but do not enable them. */
+void x86_setup_fixed_mtrrs_no_enable(void);
+int x86_mtrr_check(void);
+/* ROM caching can be used after variable MTRRs are set up. Beware that
+ * enabling CONFIG_CACHE_ROM will eat through quite a few MTRRs based on
+ * one's IO hole size and WRCOMB resources. Be sure to check the console
+ * log when enabling CONFIG_CACHE_ROM or adding WRCOMB resources. Beware that
+ * on CPUs with core-scoped MTRR registers such as hyperthreaded CPUs the
+ * rom caching will be disabled if all threads run the MTRR code. Therefore,
+ * one needs to call x86_mtrr_enable_rom_caching() after all threads of the
+ * same core have run the MTRR code. */
+#if CONFIG_CACHE_ROM
+void x86_mtrr_enable_rom_caching(void);
+void x86_mtrr_disable_rom_caching(void);
+/* Return the variable range MTRR index of the ROM cache. */
+long x86_mtrr_rom_cache_var_index(void);
+#else
+static inline void x86_mtrr_enable_rom_caching(void) {}
+static inline void x86_mtrr_disable_rom_caching(void) {}
+static inline long x86_mtrr_rom_cache_var_index(void) { return -1; }
+#endif /* CONFIG_CACHE_ROM */
+
+#endif
+
+#if !defined(CONFIG_RAMTOP)
+# error "CONFIG_RAMTOP not defined"
+#endif
+
+#if ((CONFIG_XIP_ROM_SIZE & (CONFIG_XIP_ROM_SIZE - 1)) != 0)
+# error "CONFIG_XIP_ROM_SIZE is not a power of 2"
+#endif
+
+#if ((CONFIG_CACHE_ROM_SIZE & (CONFIG_CACHE_ROM_SIZE - 1)) != 0)
+# error "CONFIG_CACHE_ROM_SIZE is not a power of 2"
+#endif
+
+#define CACHE_ROM_BASE (((1 << 20) - (CONFIG_CACHE_ROM_SIZE >> 12)) << 12)
+
+#if (CONFIG_RAMTOP & (CONFIG_RAMTOP - 1)) != 0
+# error "CONFIG_RAMTOP must be a power of 2"
+#endif
+
+#endif
index 6b161881e74513aa6169673266dd66ac6de11808..98817aa8a228d1a06feee3dfa4d33e7e22441293 100644 (file)
 #define DEFINE_PCI_DEVICE_TABLE(_table) \
        const struct pci_device_id _table[]
 
+struct pci_controller;
+
 void pci_setup_type1(struct pci_controller *hose);
+
+/**
+ * board_pci_setup_hose() - Set up the PCI hose
+ *
+ * This is called by the common x86 PCI code to set up the PCI controller
+ * hose. It may be called when no memory/BSS is available so should just
+ * store things in 'hose' and not in BSS variables.
+ */
+void board_pci_setup_hose(struct pci_controller *hose);
+
+/**
+ * pci_early_init_hose() - Set up PCI host before relocation
+ *
+ * This allocates memory for, sets up and returns the PCI hose. It can be
+ * called before relocation. The hose will be stored in gd->arch.hose for
+ * later use, but will become invalid one DRAM is available.
+ */
+int pci_early_init_hose(struct pci_controller **hosep);
+
+/*
+ * Simple PCI access routines - these work from either the early PCI hose
+ * or the 'real' one, created after U-Boot has memory available
+ */
+unsigned int pci_read_config8(pci_dev_t dev, unsigned where);
+unsigned int pci_read_config16(pci_dev_t dev, unsigned where);
+unsigned int pci_read_config32(pci_dev_t dev, unsigned where);
+
+void pci_write_config8(pci_dev_t dev, unsigned where, unsigned value);
+void pci_write_config16(pci_dev_t dev, unsigned where, unsigned value);
+void pci_write_config32(pci_dev_t dev, unsigned where, unsigned value);
+
 #endif
diff --git a/arch/x86/include/asm/post.h b/arch/x86/include/asm/post.h
new file mode 100644 (file)
index 0000000..ce68839
--- /dev/null
@@ -0,0 +1,50 @@
+/*
+ * Copyright (c) 2014 Google, Inc
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#ifndef _post_h
+#define _post_h
+
+/* port to use for post codes */
+#define POST_PORT              0x80
+
+/* post codes which represent various stages of init */
+#define POST_START             0x1e
+#define POST_CAR_START         0x1f
+#define POST_CAR_SIPI          0x20
+#define POST_CAR_MTRR          0x21
+#define POST_CAR_UNCACHEABLE   0x22
+#define POST_CAR_BASE_ADDRESS  0x23
+#define POST_CAR_MASK          0x24
+#define POST_CAR_FILL          0x25
+#define POST_CAR_ROM_CACHE     0x26
+#define POST_CAR_MRC_CACHE     0x27
+#define POST_CAR_CPU_CACHE     0x28
+#define POST_START_STACK       0x29
+#define POST_START_DONE                0x2a
+#define POST_CPU_INIT          0x2b
+#define POST_EARLY_INIT                0x2c
+#define POST_CPU_INFO          0x2d
+#define POST_PRE_MRC           0x2e
+#define POST_MRC               0x2f
+#define POST_DRAM              0x2f
+
+#define POST_RAM_FAILURE       0xea
+
+/* Output a post code using al - value must be 0 to 0xff */
+#ifdef __ASSEMBLY__
+#define post_code(value) \
+       movb    $value, %al; \
+       outb    %al, $POST_PORT
+#else
+#include <asm/io.h>
+
+static inline void post_code(int code)
+{
+       outb(code, POST_PORT);
+}
+#endif
+
+#endif
index bb3172ff91a447e5103d066c825495914b788d2d..b9317cb34b22bc343173ea0291798923d1874bae 100644 (file)
@@ -30,4 +30,25 @@ enum {
 
 #define X86_GDT_SIZE           (X86_GDT_NUM_ENTRIES * X86_GDT_ENTRY_SIZE)
 
+#ifndef __ASSEMBLY__
+
+#define PORT_RESET             0xcf9
+
+static inline __attribute__((always_inline)) void cpu_hlt(void)
+{
+       asm("hlt");
+}
+
+static inline ulong cpu_get_sp(void)
+{
+       ulong result;
+
+       asm volatile(
+               "mov %%esp, %%eax"
+               : "=a" (result));
+       return result;
+}
+
+#endif /* __ASSEMBLY__ */
+
 #endif
index 9e525dd7820b7f4ef7e77d25cdfafad83d784df3..98217dd615ff3ea9661c7cb0ce78c4f68bef9a36 100644 (file)
@@ -9,6 +9,7 @@
 #define _U_BOOT_I386_H_        1
 
 /* cpu/.../cpu.c */
+int arch_cpu_init(void);
 int x86_cpu_init_r(void);
 int cpu_init_r(void);
 int x86_cpu_init_f(void);
@@ -27,8 +28,8 @@ unsigned long get_tbclk_mhz(void);
 void timer_set_base(uint64_t base);
 int pcat_timer_init(void);
 
-/* Architecture specific - can be in arch/x86/cpu/, arch/x86/lib/, or $(BOARD)/ */
-int dram_init_f(void);
+/* Architecture specific DRAM init */
+int dram_init(void);
 
 /* cpu/.../interrupts.c */
 int cpu_init_interrupts(void);
@@ -36,6 +37,16 @@ int cpu_init_interrupts(void);
 /* board/.../... */
 int dram_init(void);
 
+int cleanup_before_linux(void);
+int x86_cleanup_before_linux(void);
+void x86_enable_caches(void);
+void x86_disable_caches(void);
+int x86_init_cache(void);
+void reset_cpu(ulong addr);
+ulong board_get_usable_ram_top(ulong total_size);
+void dram_init_banksize(void);
+int default_print_cpuinfo(void);
+
 void setup_pcat_compatibility(void);
 
 void isa_unmap_rom(u32 addr);
@@ -59,4 +70,6 @@ static inline __attribute__((no_instrument_function)) uint64_t rdtsc(void)
 void timer_set_tsc_base(uint64_t new_base);
 uint64_t timer_get_tsc(void);
 
+void quick_ram_check(void);
+
 #endif /* _U_BOOT_I386_H_ */
index 25b672a0c13d831f0ddf1df0f4c17717dab8c863..e146e646cdba11a58ed50fb3d5764586d9f1a52e 100644 (file)
@@ -15,6 +15,7 @@ obj-$(CONFIG_SYS_PCAT_TIMER) += pcat_timer.o
 obj-$(CONFIG_PCI) += pci_type1.o
 obj-y  += relocate.o
 obj-y += physmem.o
+obj-$(CONFIG_X86_RAMTEST) += ramtest.o
 obj-y  += string.o
 obj-$(CONFIG_SYS_X86_TSC_TIMER)        += tsc_timer.o
 obj-$(CONFIG_VIDEO_VGA)        += video.o
index b5d937feb3a5a10c9ed04e83c4f0718de602c16c..be4eb12c53c0e5f12dbe3af235a10d0fdf6b9392 100644 (file)
@@ -87,30 +87,3 @@ int init_func_spi(void)
        puts("ready\n");
        return 0;
 }
-
-int find_fdt(void)
-{
-#ifdef CONFIG_OF_EMBED
-       /* Get a pointer to the FDT */
-       gd->fdt_blob = __dtb_dt_begin;
-#elif defined CONFIG_OF_SEPARATE
-       /* FDT is at end of image */
-       gd->fdt_blob = (ulong *)&_end;
-#endif
-       /* Allow the early environment to override the fdt address */
-       gd->fdt_blob = (void *)getenv_ulong("fdtcontroladdr", 16,
-                                               (uintptr_t)gd->fdt_blob);
-
-       return 0;
-}
-
-int prepare_fdt(void)
-{
-       /* For now, put this check after the console is ready */
-       if (fdtdec_prepare_fdt()) {
-               panic("** CONFIG_OF_CONTROL defined but no FDT - please see "
-                       "doc/README.fdt-control");
-       }
-
-       return 0;
-}
diff --git a/arch/x86/lib/ramtest.c b/arch/x86/lib/ramtest.c
new file mode 100644 (file)
index 0000000..c21be03
--- /dev/null
@@ -0,0 +1,79 @@
+/*
+ * Copyright (c) 2014 Google, Inc
+ *
+ * From Coreboot src/lib/ramtest.c
+ *
+ * SPDX-License-Identifier:    GPL-2.0
+ */
+
+#include <common.h>
+#include <asm/io.h>
+#include <asm/post.h>
+
+static void write_phys(unsigned long addr, u32 value)
+{
+#if CONFIG_SSE2
+       asm volatile(
+               "movnti %1, (%0)"
+               : /* outputs */
+               : "r" (addr), "r" (value) /* inputs */
+               : /* clobbers */
+               );
+#else
+       writel(value, addr);
+#endif
+}
+
+static u32 read_phys(unsigned long addr)
+{
+       return readl(addr);
+}
+
+static void phys_memory_barrier(void)
+{
+#if CONFIG_SSE2
+       /* Needed for movnti */
+       asm volatile(
+               "sfence"
+               :
+               :
+               : "memory"
+       );
+#else
+       asm volatile(""
+               :
+               :
+               : "memory");
+#endif
+}
+
+void quick_ram_check(void)
+{
+       int fail = 0;
+       u32 backup;
+
+       backup = read_phys(CONFIG_RAMBASE);
+       write_phys(CONFIG_RAMBASE, 0x55555555);
+       phys_memory_barrier();
+       if (read_phys(CONFIG_RAMBASE) != 0x55555555)
+               fail = 1;
+       write_phys(CONFIG_RAMBASE, 0xaaaaaaaa);
+       phys_memory_barrier();
+       if (read_phys(CONFIG_RAMBASE) != 0xaaaaaaaa)
+               fail = 1;
+       write_phys(CONFIG_RAMBASE, 0x00000000);
+       phys_memory_barrier();
+       if (read_phys(CONFIG_RAMBASE) != 0x00000000)
+               fail = 1;
+       write_phys(CONFIG_RAMBASE, 0xffffffff);
+       phys_memory_barrier();
+       if (read_phys(CONFIG_RAMBASE) != 0xffffffff)
+               fail = 1;
+
+       write_phys(CONFIG_RAMBASE, backup);
+       if (fail) {
+               post_code(POST_RAM_FAILURE);
+               panic("RAM INIT FAILURE!\n");
+       }
+       phys_memory_barrier();
+}
index 8b38702ef56c779f70a3a8dbacb4b079158691c4..fb9afed18fda9d64da3fb84259cb59f4dbbad906 100644 (file)
@@ -1,6 +1,9 @@
 /*
  * Copyright (c) 2012 The Chromium OS Authors.
  *
+ * TSC calibration codes are adapted from Linux kernel
+ * arch/x86/kernel/tsc_msr.c and arch/x86/kernel/tsc.c
+ *
  * SPDX-License-Identifier:    GPL-2.0+
  */
 
 #include <asm/msr.h>
 #include <asm/u-boot-x86.h>
 
+/* CPU reference clock frequency: in KHz */
+#define FREQ_83                83200
+#define FREQ_100       99840
+#define FREQ_133       133200
+#define FREQ_166       166400
+
+#define MAX_NUM_FREQS  8
+
 DECLARE_GLOBAL_DATA_PTR;
 
+/*
+ * According to Intel 64 and IA-32 System Programming Guide,
+ * if MSR_PERF_STAT[31] is set, the maximum resolved bus ratio can be
+ * read in MSR_PLATFORM_ID[12:8], otherwise in MSR_PERF_STAT[44:40].
+ * Unfortunately some Intel Atom SoCs aren't quite compliant to this,
+ * so we need manually differentiate SoC families. This is what the
+ * field msr_plat does.
+ */
+struct freq_desc {
+       u8 x86_family;  /* CPU family */
+       u8 x86_model;   /* model */
+       /* 2: use 100MHz, 1: use MSR_PLATFORM_INFO, 0: MSR_IA32_PERF_STATUS */
+       u8 msr_plat;
+       u32 freqs[MAX_NUM_FREQS];
+};
+
+static struct freq_desc freq_desc_tables[] = {
+       /* PNW */
+       { 6, 0x27, 0, { 0, 0, 0, 0, 0, FREQ_100, 0, FREQ_83 } },
+       /* CLV+ */
+       { 6, 0x35, 0, { 0, FREQ_133, 0, 0, 0, FREQ_100, 0, FREQ_83 } },
+       /* TNG */
+       { 6, 0x4a, 1, { 0, FREQ_100, FREQ_133, 0, 0, 0, 0, 0 } },
+       /* VLV2 */
+       { 6, 0x37, 1, { FREQ_83, FREQ_100, FREQ_133, FREQ_166, 0, 0, 0, 0 } },
+       /* Ivybridge */
+       { 6, 0x3a, 2, { 0, 0, 0, 0, 0, 0, 0, 0 } },
+       /* ANN */
+       { 6, 0x5a, 1, { FREQ_83, FREQ_100, FREQ_133, FREQ_100, 0, 0, 0, 0 } },
+};
+
+static int match_cpu(u8 family, u8 model)
+{
+       int i;
+
+       for (i = 0; i < ARRAY_SIZE(freq_desc_tables); i++) {
+               if ((family == freq_desc_tables[i].x86_family) &&
+                   (model == freq_desc_tables[i].x86_model))
+                       return i;
+       }
+
+       return -1;
+}
+
+/* Map CPU reference clock freq ID(0-7) to CPU reference clock freq(KHz) */
+#define id_to_freq(cpu_index, freq_id) \
+       (freq_desc_tables[cpu_index].freqs[freq_id])
+
+/*
+ * Do MSR calibration only for known/supported CPUs.
+ *
+ * Returns the calibration value or 0 if MSR calibration failed.
+ */
+static unsigned long try_msr_calibrate_tsc(void)
+{
+       u32 lo, hi, ratio, freq_id, freq;
+       unsigned long res;
+       int cpu_index;
+
+       cpu_index = match_cpu(gd->arch.x86, gd->arch.x86_model);
+       if (cpu_index < 0)
+               return 0;
+
+       if (freq_desc_tables[cpu_index].msr_plat) {
+               rdmsr(MSR_PLATFORM_INFO, lo, hi);
+               ratio = (lo >> 8) & 0x1f;
+       } else {
+               rdmsr(MSR_IA32_PERF_STATUS, lo, hi);
+               ratio = (hi >> 8) & 0x1f;
+       }
+       debug("Maximum core-clock to bus-clock ratio: 0x%x\n", ratio);
+
+       if (!ratio)
+               goto fail;
+
+       if (freq_desc_tables[cpu_index].msr_plat == 2) {
+               /* TODO: Figure out how best to deal with this */
+               freq = FREQ_100;
+               debug("Using frequency: %u KHz\n", freq);
+       } else {
+               /* Get FSB FREQ ID */
+               rdmsr(MSR_FSB_FREQ, lo, hi);
+               freq_id = lo & 0x7;
+               freq = id_to_freq(cpu_index, freq_id);
+               debug("Resolved frequency ID: %u, frequency: %u KHz\n",
+                     freq_id, freq);
+       }
+       if (!freq)
+               goto fail;
+
+       /* TSC frequency = maximum resolved freq * maximum resolved bus ratio */
+       res = freq * ratio / 1000;
+       debug("TSC runs at %lu MHz\n", res);
+
+       return res;
+
+fail:
+       debug("Fast TSC calibration using MSR failed\n");
+       return 0;
+}
+
+/*
+ * This reads the current MSB of the PIT counter, and
+ * checks if we are running on sufficiently fast and
+ * non-virtualized hardware.
+ *
+ * Our expectations are:
+ *
+ *  - the PIT is running at roughly 1.19MHz
+ *
+ *  - each IO is going to take about 1us on real hardware,
+ *    but we allow it to be much faster (by a factor of 10) or
+ *    _slightly_ slower (ie we allow up to a 2us read+counter
+ *    update - anything else implies a unacceptably slow CPU
+ *    or PIT for the fast calibration to work.
+ *
+ *  - with 256 PIT ticks to read the value, we have 214us to
+ *    see the same MSB (and overhead like doing a single TSC
+ *    read per MSB value etc).
+ *
+ *  - We're doing 2 reads per loop (LSB, MSB), and we expect
+ *    them each to take about a microsecond on real hardware.
+ *    So we expect a count value of around 100. But we'll be
+ *    generous, and accept anything over 50.
+ *
+ *  - if the PIT is stuck, and we see *many* more reads, we
+ *    return early (and the next caller of pit_expect_msb()
+ *    then consider it a failure when they don't see the
+ *    next expected value).
+ *
+ * These expectations mean that we know that we have seen the
+ * transition from one expected value to another with a fairly
+ * high accuracy, and we didn't miss any events. We can thus
+ * use the TSC value at the transitions to calculate a pretty
+ * good value for the TSC frequencty.
+ */
+static inline int pit_verify_msb(unsigned char val)
+{
+       /* Ignore LSB */
+       inb(0x42);
+       return inb(0x42) == val;
+}
+
+static inline int pit_expect_msb(unsigned char val, u64 *tscp,
+                                unsigned long *deltap)
+{
+       int count;
+       u64 tsc = 0, prev_tsc = 0;
+
+       for (count = 0; count < 50000; count++) {
+               if (!pit_verify_msb(val))
+                       break;
+               prev_tsc = tsc;
+               tsc = rdtsc();
+       }
+       *deltap = rdtsc() - prev_tsc;
+       *tscp = tsc;
+
+       /*
+        * We require _some_ success, but the quality control
+        * will be based on the error terms on the TSC values.
+        */
+       return count > 5;
+}
+
+/*
+ * How many MSB values do we want to see? We aim for
+ * a maximum error rate of 500ppm (in practice the
+ * real error is much smaller), but refuse to spend
+ * more than 50ms on it.
+ */
+#define MAX_QUICK_PIT_MS 50
+#define MAX_QUICK_PIT_ITERATIONS (MAX_QUICK_PIT_MS * PIT_TICK_RATE / 1000 / 256)
+
+static unsigned long quick_pit_calibrate(void)
+{
+       int i;
+       u64 tsc, delta;
+       unsigned long d1, d2;
+
+       /* Set the Gate high, disable speaker */
+       outb((inb(0x61) & ~0x02) | 0x01, 0x61);
+
+       /*
+        * Counter 2, mode 0 (one-shot), binary count
+        *
+        * NOTE! Mode 2 decrements by two (and then the
+        * output is flipped each time, giving the same
+        * final output frequency as a decrement-by-one),
+        * so mode 0 is much better when looking at the
+        * individual counts.
+        */
+       outb(0xb0, 0x43);
+
+       /* Start at 0xffff */
+       outb(0xff, 0x42);
+       outb(0xff, 0x42);
+
+       /*
+        * The PIT starts counting at the next edge, so we
+        * need to delay for a microsecond. The easiest way
+        * to do that is to just read back the 16-bit counter
+        * once from the PIT.
+        */
+       pit_verify_msb(0);
+
+       if (pit_expect_msb(0xff, &tsc, &d1)) {
+               for (i = 1; i <= MAX_QUICK_PIT_ITERATIONS; i++) {
+                       if (!pit_expect_msb(0xff-i, &delta, &d2))
+                               break;
+
+                       /*
+                        * Iterate until the error is less than 500 ppm
+                        */
+                       delta -= tsc;
+                       if (d1+d2 >= delta >> 11)
+                               continue;
+
+                       /*
+                        * Check the PIT one more time to verify that
+                        * all TSC reads were stable wrt the PIT.
+                        *
+                        * This also guarantees serialization of the
+                        * last cycle read ('d2') in pit_expect_msb.
+                        */
+                       if (!pit_verify_msb(0xfe - i))
+                               break;
+                       goto success;
+               }
+       }
+       debug("Fast TSC calibration failed\n");
+       return 0;
+
+success:
+       /*
+        * Ok, if we get here, then we've seen the
+        * MSB of the PIT decrement 'i' times, and the
+        * error has shrunk to less than 500 ppm.
+        *
+        * As a result, we can depend on there not being
+        * any odd delays anywhere, and the TSC reads are
+        * reliable (within the error).
+        *
+        * kHz = ticks / time-in-seconds / 1000;
+        * kHz = (t2 - t1) / (I * 256 / PIT_TICK_RATE) / 1000
+        * kHz = ((t2 - t1) * PIT_TICK_RATE) / (I * 256 * 1000)
+        */
+       delta *= PIT_TICK_RATE;
+       delta /= (i*256*1000);
+       debug("Fast TSC calibration using PIT\n");
+       return delta / 1000;
+}
+
 void timer_set_base(u64 base)
 {
        gd->arch.tsc_base = base;
@@ -34,17 +298,24 @@ u64 __attribute__((no_instrument_function)) get_ticks(void)
        return now_tick - gd->arch.tsc_base;
 }
 
-#define PLATFORM_INFO_MSR 0xce
-
 /* Get the speed of the TSC timer in MHz */
 unsigned __attribute__((no_instrument_function)) long get_tbclk_mhz(void)
 {
-       u32 ratio;
-       u64 platform_info = native_read_msr(PLATFORM_INFO_MSR);
+       unsigned long fast_calibrate;
+
+       if (gd->arch.tsc_mhz)
+               return gd->arch.tsc_mhz;
+
+       fast_calibrate = try_msr_calibrate_tsc();
+       if (!fast_calibrate) {
+
+               fast_calibrate = quick_pit_calibrate();
+               if (!fast_calibrate)
+                       panic("TSC frequency is ZERO");
+       }
 
-       /* 100MHz times Max Non Turbo ratio */
-       ratio = (platform_info >> 8) & 0xff;
-       return 100 * ratio;
+       gd->arch.tsc_mhz = fast_calibrate;
+       return fast_calibrate;
 }
 
 unsigned long get_tbclk(void)
diff --git a/board/broadcom/bcm11130/MAINTAINERS b/board/broadcom/bcm11130/MAINTAINERS
new file mode 100644 (file)
index 0000000..b22e86f
--- /dev/null
@@ -0,0 +1,6 @@
+BCM11130 BOARD
+M:     Steve Rae <srae@broadcom.com>
+S:     Maintained
+F:     board/broadcom/bcm28155_ap/
+F:     include/configs/bcm_ep_board.h
+F:     configs/bcm11130_defconfig
diff --git a/board/broadcom/bcm11130_nand/MAINTAINERS b/board/broadcom/bcm11130_nand/MAINTAINERS
new file mode 100644 (file)
index 0000000..881db5b
--- /dev/null
@@ -0,0 +1,6 @@
+BCM11130_NAND BOARD
+M:     Steve Rae <srae@broadcom.com>
+S:     Maintained
+F:     board/broadcom/bcm28155_ap/
+F:     include/configs/bcm_ep_board.h
+F:     configs/bcm11130_nand_defconfig
diff --git a/board/broadcom/bcm911360_entphn-ns/MAINTAINERS b/board/broadcom/bcm911360_entphn-ns/MAINTAINERS
new file mode 100644 (file)
index 0000000..b5f0207
--- /dev/null
@@ -0,0 +1,6 @@
+BCM911360_ENTPHN-NS BOARD
+M:     Steve Rae <srae@broadcom.com>
+S:     Maintained
+F:     board/broadcom/bcmcygnus/
+F:     include/configs/bcm_ep_board.h
+F:     configs/bcm911360_entphn-ns_defconfig
diff --git a/board/broadcom/bcm911360_entphn/MAINTAINERS b/board/broadcom/bcm911360_entphn/MAINTAINERS
new file mode 100644 (file)
index 0000000..fb7ee2b
--- /dev/null
@@ -0,0 +1,6 @@
+BCM911360_ENTPHN BOARD
+M:     Steve Rae <srae@broadcom.com>
+S:     Maintained
+F:     board/broadcom/bcmcygnus/
+F:     include/configs/bcm_ep_board.h
+F:     configs/bcm911360_entphn_defconfig
diff --git a/board/broadcom/bcm911360k/MAINTAINERS b/board/broadcom/bcm911360k/MAINTAINERS
new file mode 100644 (file)
index 0000000..754a15f
--- /dev/null
@@ -0,0 +1,6 @@
+BCM911360K BOARD
+M:     Steve Rae <srae@broadcom.com>
+S:     Maintained
+F:     board/broadcom/bcmcygnus/
+F:     include/configs/bcm_ep_board.h
+F:     configs/bcm911360k_defconfig
diff --git a/board/broadcom/bcm958300k-ns/MAINTAINERS b/board/broadcom/bcm958300k-ns/MAINTAINERS
new file mode 100644 (file)
index 0000000..763401a
--- /dev/null
@@ -0,0 +1,6 @@
+BCM958300K-NS BOARD
+M:     Steve Rae <srae@broadcom.com>
+S:     Maintained
+F:     board/broadcom/bcmcygnus/
+F:     include/configs/bcm_ep_board.h
+F:     configs/bcm958300k-ns_defconfig
index f75ee6e73c0fae484d65cffc9256a56866a85ebe..8afc728a25a8dc72304f7c91bde742dfae73f8d1 100644 (file)
@@ -1,6 +1,6 @@
-Broadcom: Cygnus
+BCM958300K BOARD
 M:     Steve Rae <srae@broadcom.com>
 S:     Maintained
-F:     board/broadcom/bcm958300k/
+F:     board/broadcom/bcmcygnus/
 F:     include/configs/bcm_ep_board.h
 F:     configs/bcm958300k_defconfig
diff --git a/board/broadcom/bcm958305k/MAINTAINERS b/board/broadcom/bcm958305k/MAINTAINERS
new file mode 100644 (file)
index 0000000..179fd4e
--- /dev/null
@@ -0,0 +1,6 @@
+BCM958305K BOARD
+M:     Steve Rae <srae@broadcom.com>
+S:     Maintained
+F:     board/broadcom/bcmcygnus/
+F:     include/configs/bcm_ep_board.h
+F:     configs/bcm958305k_defconfig
index c34272f70db4b14f8074782cfff955972074ae3b..d08aded83f2df279b7ab951b2135b22aabd80aab 100644 (file)
@@ -1,6 +1,6 @@
-Broadcom: Northstar Plus
+BCM958622HR BOARD
 M:     Steve Rae <srae@broadcom.com>
 S:     Maintained
-F:     board/broadcom/bcm958622hr/
+F:     board/broadcom/bcmnsp/
 F:     include/configs/bcm_ep_board.h
 F:     configs/bcm958622hr_defconfig
index e48cd3f76735cc7456a9c4da672cafe2bb279856..6a70a2e3056007a38958e0df03d63e75a6c9879b 100644 (file)
@@ -53,3 +53,17 @@ int board_early_init_f(void)
 
        return status;
 }
+
+#if defined(CONFIG_ARMV7_NONSEC) || defined(CONFIG_ARMV7_VIRT)
+void smp_set_core_boot_addr(unsigned long addr, int corenr)
+{
+}
+
+void smp_kick_all_cpus(void)
+{
+}
+
+void smp_waitloop(unsigned previous_address)
+{
+}
+#endif
similarity index 88%
rename from board/broadcom/bcm958300k/Kconfig
rename to board/broadcom/bcmcygnus/Kconfig
index 92892881afef5a34ebf74163a6b933e07add3554..faba4cf82b1f01e8e7c840e58dab80604add720c 100644 (file)
@@ -1,4 +1,4 @@
-if TARGET_BCM958300K
+if TARGET_BCMCYGNUS
 
 config SYS_BOARD
        default "bcm_ep"
similarity index 88%
rename from board/broadcom/bcm958622hr/Kconfig
rename to board/broadcom/bcmnsp/Kconfig
index 861c55909bf34fae0aebb0a0276bfbb6f8c15992..a975082355a43e477d7f3598337a8818da5edf9c 100644 (file)
@@ -1,4 +1,4 @@
-if TARGET_BCM958622HR
+if TARGET_BCMNSP
 
 config SYS_BOARD
        default "bcm_ep"
similarity index 86%
rename from board/chromebook-x86/coreboot/Kconfig
rename to board/coreboot/coreboot/Kconfig
index 83385c7207d6d059e1000c7074c81f5315a81fe0..6ca6cedf0d71bbb128d86000cbce1034fa22e1a9 100644 (file)
@@ -4,7 +4,7 @@ config SYS_BOARD
        default "coreboot"
 
 config SYS_VENDOR
-       default "chromebook-x86"
+       default "coreboot"
 
 config SYS_SOC
        default "coreboot"
similarity index 78%
rename from board/chromebook-x86/coreboot/MAINTAINERS
rename to board/coreboot/coreboot/MAINTAINERS
index 3b2fb52266df1465ec2aa9f581bbfa9e2cc5b272..6ce66f551f114eb0aaad975253dd0fc1acc4b09a 100644 (file)
@@ -1,6 +1,6 @@
 COREBOOT BOARD
 M:     Simon Glass <sjg@chromium.org>
 S:     Maintained
-F:     board/chromebook-x86/coreboot/
+F:     board/coreboot/coreboot/
 F:     include/configs/coreboot.h
 F:     configs/coreboot-x86_defconfig
index 682f2685dc11293111419f77d9913dff927157f1..5c629db139bae17b89ff55121c180513d62f4bd1 100644 (file)
@@ -20,7 +20,7 @@ SECTIONS
        {
          *(.vectors)
          arch/arm/cpu/arm926ejs/start.o                (.text*)
-         arch/arm/cpu/arm926ejs/davinci/built-in.o     (.text*)
+         arch/arm/cpu/arm926ejs/built-in.o             (.text*)
          drivers/mtd/nand/built-in.o                   (.text*)
 
          *(.text*)
index b1680741e16b29202089e12378b45eb3df92e3c5..f3f70ffbad8caf6037a1ee265de0616901847f8e 100644 (file)
@@ -12,6 +12,7 @@
 #include <image.h>
 #include <asm/byteorder.h>
 #include <fat.h>
+#include <flash.h>
 #include <part.h>
 
 #include "auto_update.h"
@@ -30,14 +31,8 @@ extern int N_AU_IMAGES;
 #define MAX_LOADSZ 0x1c00000
 
 /* externals */
-extern int fat_register_device(block_dev_desc_t *, int);
-extern int file_fat_detectfs(void);
-extern long file_fat_read(const char *, void *, unsigned long);
 long do_fat_read (const char *filename, void *buffer,
                  unsigned long maxsize, int dols);
-extern int flash_sect_erase(ulong, ulong);
-extern int flash_sect_protect (int, ulong, ulong);
-extern int flash_write (char *, ulong, ulong);
 
 extern block_dev_desc_t ide_dev_desc[CONFIG_SYS_IDE_MAXDEVICE];
 
index 6144c533ef27af60d629103aa5f117369ed373b4..c9c8eaade233d590c702236b06b70585d98b116b 100644 (file)
@@ -114,7 +114,7 @@ static void show_eeprom(void)
                e.date[3] & 0x80 ? "PM" : "");
 
        /* Show MAC addresses  */
-       for (i = 0; i < min(e.mac_count, MAX_NUM_PORTS); i++) {
+       for (i = 0; i < min(e.mac_count, (u8)MAX_NUM_PORTS); i++) {
 
                u8 *p = e.mac[i];
 
@@ -223,7 +223,7 @@ static int prog_eeprom(void)
         */
        for (i = 0, p = &e; i < sizeof(e); i += 8, p += 8) {
                ret = i2c_write(CONFIG_SYS_I2C_EEPROM_ADDR, i, CONFIG_SYS_I2C_EEPROM_ADDR_LEN,
-                       p, min((sizeof(e) - i), 8));
+                               p, min((int)(sizeof(e) - i), 8));
                if (ret)
                        break;
                udelay(5000);   /* 5ms write cycle timing */
@@ -461,7 +461,7 @@ int mac_read_from_eeprom(void)
                memset(e.mac[8], 0xff, 6);
 #endif
 
-       for (i = 0; i < min(e.mac_count, MAX_NUM_PORTS); i++) {
+       for (i = 0; i < min(e.mac_count, (u8)MAX_NUM_PORTS); i++) {
                if (memcmp(&e.mac[i], "\0\0\0\0\0\0", 6) &&
                    memcmp(&e.mac[i], "\xFF\xFF\xFF\xFF\xFF\xFF", 6)) {
                        char ethaddr[18];
index 70eff912aa6bc7d99634d101e7b54225c61f98b4..11d075c38593c91d0ce588ff7c11ee56796427fd 100644 (file)
@@ -236,7 +236,7 @@ static int ccdm_mmc_read(struct mmc *mmc, u64 src, u8 *dst, int size)
                        tmp_buf);
                if (!n)
                        goto failure;
-               result = min(size, blk_len - ofs);
+               result = min(size, (int)(blk_len - ofs));
                memcpy(dst, tmp_buf + ofs, result);
                dst += result;
                size -= result;
@@ -736,7 +736,8 @@ do_bin_func:
                                src_buf = buf;
                                for (ptr = (uint8_t *)src_buf, i = 20; i > 0;
                                        i -= data_size, ptr += data_size)
-                                       memcpy(ptr, data, min(i, data_size));
+                                       memcpy(ptr, data,
+                                              min_t(size_t, i, data_size));
                        }
                }
                bin_func(dst_reg->digest, src_buf, 20);
@@ -931,11 +932,12 @@ static struct key_program *load_key_chunk(const char *ifname,
        struct key_program header;
        uint32_t crc;
        uint8_t buf[12];
-       int i;
+       loff_t i;
 
        if (fs_set_blk_dev(ifname, dev_part_str, fs_type))
                goto failure;
-       i = fs_read(path, (ulong)buf, 0, 12);
+       if (fs_read(path, (ulong)buf, 0, 12, &i) < 0)
+               goto failure;
        if (i < 12)
                goto failure;
        header.magic = get_unaligned_be32(buf);
@@ -950,8 +952,9 @@ static struct key_program *load_key_chunk(const char *ifname,
                goto failure;
        if (fs_set_blk_dev(ifname, dev_part_str, fs_type))
                goto failure;
-       i = fs_read(path, (ulong)result, 0,
-               sizeof(struct key_program) + header.code_size);
+       if (fs_read(path, (ulong)result, 0,
+                   sizeof(struct key_program) + header.code_size, &i) < 0)
+               goto failure;
        if (i <= 0)
                goto failure;
        *result = header;
@@ -1042,7 +1045,7 @@ static int second_stage_init(void)
        const char *image_path = "/ccdm.itb";
        char *mac_path = NULL;
        ulong image_addr;
-       size_t image_size;
+       loff_t image_size;
        uint32_t err;
 
        printf("CCDM S2\n");
@@ -1084,10 +1087,11 @@ static int second_stage_init(void)
        image_addr = (ulong)get_image_location();
        if (fs_set_blk_dev("mmc", mmcdev, FS_TYPE_EXT))
                goto failure;
-       image_size = fs_read(image_path, image_addr, 0, 0);
+       if (fs_read(image_path, image_addr, 0, 0, &image_size) < 0)
+               goto failure;
        if (image_size <= 0)
                goto failure;
-       printf("CCDM image found on %s, %d bytes\n", mmcdev, image_size);
+       printf("CCDM image found on %s, %lld bytes\n", mmcdev, image_size);
 
        hmac_blob = load_key_chunk("mmc", mmcdev, FS_TYPE_EXT, mac_path);
        if (!hmac_blob) {
diff --git a/board/google/chromebook_link/Kconfig b/board/google/chromebook_link/Kconfig
new file mode 100644 (file)
index 0000000..3a4f557
--- /dev/null
@@ -0,0 +1,31 @@
+if TARGET_CHROMEBOOK_LINK
+
+config SYS_BOARD
+       default "chromebook_link"
+
+config SYS_VENDOR
+       default "google"
+
+config SYS_SOC
+       default "ivybridge"
+
+config SYS_CONFIG_NAME
+       default "chromebook_link"
+
+config BOARD_SPECIFIC_OPTIONS # dummy
+       def_bool y
+       select CPU_INTEL_SOCKET_RPGA989
+       select NORTHBRIDGE_INTEL_IVYBRIDGE
+       select SOUTHBRIDGE_INTEL_C216
+       select HAVE_ACPI_RESUME
+       select MARK_GRAPHICS_MEM_WRCOMB
+
+config MMCONF_BASE_ADDRESS
+       hex
+       default 0xf0000000
+
+config EARLY_POST_CROS_EC
+       bool "Enable early post to Chrome OS EC"
+       default y
+
+endif
diff --git a/board/google/chromebook_link/MAINTAINERS b/board/google/chromebook_link/MAINTAINERS
new file mode 100644 (file)
index 0000000..bc253a2
--- /dev/null
@@ -0,0 +1,6 @@
+CHROMEBOOK LINK BOARD
+M:     Simon Glass <sjg@chromium.org>
+S:     Maintained
+F:     board/google/chromebook_link/
+F:     include/configs/chromebook_link.h
+F:     configs/chromebook_link_defconfig
diff --git a/board/google/chromebook_link/Makefile b/board/google/chromebook_link/Makefile
new file mode 100644 (file)
index 0000000..a133c2e
--- /dev/null
@@ -0,0 +1,15 @@
+#
+# Copyright (c) 2011 The Chromium OS Authors.
+# (C) Copyright 2008
+# Graeme Russ, graeme.russ@gmail.com.
+#
+# (C) Copyright 2006
+# Wolfgang Denk, DENX Software Engineering, wd@denx.de.
+#
+# (C) Copyright 2002
+# Daniel Engström, Omicron Ceti AB, daniel@omicron.se.
+#
+# SPDX-License-Identifier:     GPL-2.0+
+#
+
+obj-y  += link.o
diff --git a/board/google/chromebook_link/link.c b/board/google/chromebook_link/link.c
new file mode 100644 (file)
index 0000000..88cee05
--- /dev/null
@@ -0,0 +1,124 @@
+/*
+ * Copyright (C) 2014 Google, Inc
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#include <common.h>
+#include <asm/gpio.h>
+
+int arch_early_init_r(void)
+{
+       return 0;
+}
+
+int board_early_init_r(void)
+{
+       return 0;
+}
+
+static const struct pch_gpio_set1 pch_gpio_set1_mode = {
+       .gpio0 = GPIO_MODE_GPIO,  /* NMI_DBG# */
+       .gpio3 = GPIO_MODE_GPIO,  /* ALS_INT# */
+       .gpio5 = GPIO_MODE_GPIO,  /* SIM_DET */
+       .gpio7 = GPIO_MODE_GPIO,  /* EC_SCI# */
+       .gpio8 = GPIO_MODE_GPIO,  /* EC_SMI# */
+       .gpio9 = GPIO_MODE_GPIO,  /* RECOVERY# */
+       .gpio10 = GPIO_MODE_GPIO, /* SPD vector D3 */
+       .gpio11 = GPIO_MODE_GPIO, /* smbalert#, let's keep it initialized */
+       .gpio12 = GPIO_MODE_GPIO, /* TP_INT# */
+       .gpio14 = GPIO_MODE_GPIO, /* Touch_INT_L */
+       .gpio15 = GPIO_MODE_GPIO, /* EC_LID_OUT# (EC_WAKE#) */
+       .gpio21 = GPIO_MODE_GPIO, /* EC_IN_RW */
+       .gpio24 = GPIO_MODE_GPIO, /* DDR3L_EN */
+       .gpio28 = GPIO_MODE_GPIO, /* SLP_ME_CSW_DEV# */
+};
+
+static const struct pch_gpio_set1 pch_gpio_set1_direction = {
+       .gpio0 = GPIO_DIR_INPUT,
+       .gpio3 = GPIO_DIR_INPUT,
+       .gpio5 = GPIO_DIR_INPUT,
+       .gpio7 = GPIO_DIR_INPUT,
+       .gpio8 = GPIO_DIR_INPUT,
+       .gpio9 = GPIO_DIR_INPUT,
+       .gpio10 = GPIO_DIR_INPUT,
+       .gpio11 = GPIO_DIR_INPUT,
+       .gpio12 = GPIO_DIR_INPUT,
+       .gpio14 = GPIO_DIR_INPUT,
+       .gpio15 = GPIO_DIR_INPUT,
+       .gpio21 = GPIO_DIR_INPUT,
+       .gpio24 = GPIO_DIR_OUTPUT,
+       .gpio28 = GPIO_DIR_INPUT,
+};
+
+static const struct pch_gpio_set1 pch_gpio_set1_level = {
+       .gpio1 = GPIO_LEVEL_HIGH,
+       .gpio6 = GPIO_LEVEL_HIGH,
+       .gpio24 = GPIO_LEVEL_LOW,
+};
+
+static const struct pch_gpio_set1 pch_gpio_set1_invert = {
+       .gpio7 = GPIO_INVERT,
+       .gpio8 = GPIO_INVERT,
+       .gpio12 = GPIO_INVERT,
+       .gpio14 = GPIO_INVERT,
+       .gpio15 = GPIO_INVERT,
+};
+
+static const struct pch_gpio_set2 pch_gpio_set2_mode = {
+       .gpio36 = GPIO_MODE_GPIO, /* W_DISABLE_L */
+       .gpio41 = GPIO_MODE_GPIO, /* SPD vector D0 */
+       .gpio42 = GPIO_MODE_GPIO, /* SPD vector D1 */
+       .gpio43 = GPIO_MODE_GPIO, /* SPD vector D2 */
+       .gpio57 = GPIO_MODE_GPIO, /* PCH_SPI_WP_D */
+       .gpio60 = GPIO_MODE_GPIO, /* DRAMRST_CNTRL_PCH */
+};
+
+static const struct pch_gpio_set2 pch_gpio_set2_direction = {
+       .gpio36 = GPIO_DIR_OUTPUT,
+       .gpio41 = GPIO_DIR_INPUT,
+       .gpio42 = GPIO_DIR_INPUT,
+       .gpio43 = GPIO_DIR_INPUT,
+       .gpio57 = GPIO_DIR_INPUT,
+       .gpio60 = GPIO_DIR_OUTPUT,
+};
+
+static const struct pch_gpio_set2 pch_gpio_set2_level = {
+       .gpio36 = GPIO_LEVEL_HIGH,
+       .gpio60 = GPIO_LEVEL_HIGH,
+};
+
+static const struct pch_gpio_set3 pch_gpio_set3_mode = {
+};
+
+static const struct pch_gpio_set3 pch_gpio_set3_direction = {
+};
+
+static const struct pch_gpio_set3 pch_gpio_set3_level = {
+};
+
+static const struct pch_gpio_map link_gpio_map = {
+       .set1 = {
+               .mode      = &pch_gpio_set1_mode,
+               .direction = &pch_gpio_set1_direction,
+               .level     = &pch_gpio_set1_level,
+               .invert    = &pch_gpio_set1_invert,
+       },
+       .set2 = {
+               .mode      = &pch_gpio_set2_mode,
+               .direction = &pch_gpio_set2_direction,
+               .level     = &pch_gpio_set2_level,
+       },
+       .set3 = {
+               .mode      = &pch_gpio_set3_mode,
+               .direction = &pch_gpio_set3_direction,
+               .level     = &pch_gpio_set3_level,
+       },
+};
+
+int board_early_init_f(void)
+{
+       ich_gpio_set_gpio_map(&link_gpio_map);
+
+       return 0;
+}
diff --git a/board/google/common/Makefile b/board/google/common/Makefile
new file mode 100644 (file)
index 0000000..b38bc14
--- /dev/null
@@ -0,0 +1,7 @@
+#
+# Copyright (c) 2014 Google, Inc
+#
+# SPDX-License-Identifier:     GPL-2.0+
+#
+
+obj-y += early_init.o
diff --git a/board/google/common/early_init.S b/board/google/common/early_init.S
new file mode 100644 (file)
index 0000000..7017185
--- /dev/null
@@ -0,0 +1,29 @@
+/*
+ * Copyright (c) 2014 Google, Inc
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+.globl early_board_init
+early_board_init:
+       /* Enable post codes to EC */
+#ifdef CONFIG_EARLY_POST_CROS_EC
+       mov    $0x1b, %ecx
+       rdmsr
+       and    $0x100, %eax
+       test   %eax, %eax
+       je     1f
+
+       mov    $0x8000f8f0, %eax
+       mov    $0xcf8, %dx
+       out    %eax, (%dx)
+       mov    $0xfed1c001, %eax
+       mov    $0xcfc, %dx
+       out    %eax, (%dx)
+       mov    $0xfed1f410, %esp
+       mov    (%esp), %eax
+       and    $0xfffffffb, %eax
+       mov    %eax, (%esp)
+1:
+#endif
+       jmp     early_board_init_ret
index d363e49919e96454e692658289271b448c29f64f..78c4bd4efe7114767e9c52ef07a42c6fe8c1460c 100644 (file)
@@ -37,7 +37,7 @@ static void malta_lcd_puts(const char *str)
        void *reg = (void *)CKSEG1ADDR(MALTA_ASCIIPOS0);
 
        /* print up to 8 characters of the string */
-       for (i = 0; i < min(strlen(str), 8); i++) {
+       for (i = 0; i < min((int)strlen(str), 8); i++) {
                __raw_writel(str[i], reg);
                reg += MALTA_ASCIIPOS1 - MALTA_ASCIIPOS0;
        }
index 216a8debd9afb7021622d70453511ea9f35c9fc2..fd84fa08bd3efc2569ac4200684f26abca5ac205 100644 (file)
 menu "Command line interface"
        depends on !SPL_BUILD
 
+config HUSH_PARSER
+       bool "Use hush shell"
+       select SYS_HUSH_PARSER
+       help
+         This option enables the "hush" shell (from Busybox) as command line
+         interpreter, thus enabling powerful command line syntax like
+         if...then...else...fi conditionals or `&&' and '||'
+         constructs ("shell scripts").
+
+         If disabled, you get the old, much simpler behaviour with a somewhat
+         smaller memory footprint.
+
+config SYS_HUSH_PARSER
+       bool
+       help
+         Backward compatibility.
+
+comment "Commands"
+
+menu "Info commands"
+
+config CMD_BDI
+       bool "bdinfo"
+       help
+         Print board info
+
+config CMD_CONSOLE
+       bool "coninfo"
+       help
+         Print console devices and information.
+
+config CMD_LICENSE
+       bool "license"
+       help
+         Print GPL license text
+
+endmenu
+
+menu "Boot commands"
+
+config CMD_BOOTD
+       bool "bootd"
+       help
+         Run the command stored in the environment "bootcmd", i.e.
+         "bootd" does the same thing as "run bootcmd".
+
 config CMD_BOOTM
-       bool "Enable bootm command"
+       bool "bootm"
        default y
        help
          Boot an application image from the memory.
 
-config CMD_CRC32
-       bool "Enable crc32 command"
+config CMD_GO
+       bool "go"
        default y
        help
-         Compute CRC32.
+         Start an application at a given address.
+
+config CMD_RUN
+       bool "run"
+       help
+         Run the command in the given environment variable.
+
+config CMD_IMI
+       bool "iminfo"
+       help
+         Print header information for application image.
+
+config CMD_IMLS
+       bool "imls"
+       help
+         List all images found in flash
+
+config CMD_XIMG
+       bool "imxtract"
+       help
+         Extract a part of a multi-image.
+
+endmenu
+
+menu "Environment commands"
 
 config CMD_EXPORTENV
-       bool "Enable env export command"
+       bool "env export"
        default y
        help
          Export environments.
 
 config CMD_IMPORTENV
-       bool "Enable env import command"
+       bool "env import"
        default y
        help
          Import environments.
 
-config CMD_GO
-       bool "Enable go command"
+config CMD_EDITENV
+       bool "editenv"
+       help
+         Edit environment variable.
+
+config CMD_SAVEENV
+       bool "saveenv"
+       help
+         Run the command in the given environment variable.
+
+endmenu
+
+menu "Memory commands"
+
+config CMD_MEMORY
+       bool "md, mm, nm, mw, cp, cmp, base, loop"
+       help
+         Memeory commands.
+           md - memory display
+           mm - memory modify (auto-incrementing address)
+           nm - memory modify (constant address)
+           mw - memory write (fill)
+           cp - memory copy
+           cmp - memory compare
+           base - print or set address offset
+           loop - initinite loop on address range
+
+config CMD_CRC32
+       bool "crc32"
        default y
        help
-         Start an application at a given address.
+         Compute CRC32.
+
+config LOOPW
+       bool "loopw"
+       help
+         Infinite write loop on address range
+
+config CMD_MEMTEST
+       bool "crc32"
+       help
+         Simple RAM read/write test.
+
+config CMD_MX_CYCLIC
+       bool "mdc, mwc"
+       help
+         mdc - memory display cyclic
+         mwc - memory write cyclic
+
+config CMD_MEMINFO
+       bool "meminfo"
+       help
+         Display memory information.
+
+endmenu
+
+menu "Device access commands"
+
+config CMD_LOADB
+       bool "loadb"
+       help
+         Load a binary file over serial line.
+
+config CMD_LOADS
+       bool "loads"
+       help
+         Load an S-Record file over serial line
+
+config CMD_FLASH
+       bool "flinfo, erase, protect"
+       help
+         NOR flash support.
+           flinfo - print FLASH memory information
+           erase - FLASH memory
+           protect - enable or disable FLASH write protection
+
+config CMD_NAND
+       bool "nand"
+       help
+         NAND support.
+
+config CMD_SPI
+       bool "sspi"
+       help
+         SPI utility command.
+
+config CMD_I2C
+       bool "i2c"
+       help
+         I2C support.
+
+config CMD_USB
+       bool "usb"
+       help
+         USB support.
+
+config CMD_FPGA
+       bool "fpga"
+       help
+         FPGA support.
+
+endmenu
+
+
+menu "Shell scripting commands"
+
+config CMD_ECHO
+       bool "echo"
+       help
+         Echo args to console
+
+config CMD_ITEST
+       bool "itest"
+       help
+         Return true/false on integer compare.
+
+config CMD_SOURCE
+       bool "source"
+       help
+         Run script from memory
+
+endmenu
+
+menu "Network commands"
+
+config CMD_NET
+       bool "bootp, tftpboot"
+       help
+         Network commands.
+         bootp - boot image via network using BOOTP/TFTP protocol
+         tftpboot - boot image via network using TFTP protocol
+
+config CMD_TFTPPUT
+       bool "tftp put"
+       help
+         TFTP put command, for uploading files to a server
+
+config CMD_TFTPSRV
+       bool "tftpsrv"
+       help
+         Act as a TFTP server and boot the first received file
+
+config CMD_RARP
+       bool "rarpboot"
+       help
+         Boot image via network using RARP/TFTP protocol
+
+config CMD_DHCP
+       bool "dhcp"
+       help
+         Boot image via network using DHCP/TFTP protocol
+
+config CMD_NFS
+       bool "nfs"
+       help
+         Boot image via network using NFS protocol.
+
+config CMD_PING
+       bool "ping"
+       help
+         Send ICMP ECHO_REQUEST to network host
+
+config CMD_CDP
+       bool "cdp"
+       help
+         Perform CDP network configuration
+
+config CMD_SNTP
+       bool "sntp"
+       help
+         Synchronize RTC via network
+
+config CMD_DNS
+       bool "dns"
+       help
+         Lookup the IP of a hostname
+
+config CMD_DNS
+       bool "dns"
+       help
+         Lookup the IP of a hostname
+
+config CMD_LINK_LOCAL
+       bool "linklocal"
+       help
+         Acquire a network IP address using the link-local protocol
+
+endmenu
+
+menu "Misc commands"
+
+config CMD_TIME
+       bool "time"
+       help
+         Run commands and summarize execution time.
+
+# TODO: rename to CMD_SLEEP
+config CMD_MISC
+       bool "sleep"
+       help
+         Delay execution for some time
+
+config CMD_TIMER
+       bool "timer"
+       help
+         Access the system timer.
+
+config CMD_SETGETDCR
+       bool "getdcr, setdcr, getidcr, setidcr"
+       depends on 4xx
+       help
+         getdcr - Get an AMCC PPC 4xx DCR's value
+         setdcr - Set an AMCC PPC 4xx DCR's value
+         getidcr - Get a register value via indirect DCR addressing
+         setidcr - Set a register value via indirect DCR addressing
+
+endmenu
 
 endmenu
index 7a5c58e41c2feaf99b4e5aba4825608cc3b9f023..9c47e20c6d19f477170d96b29eadf6a365159d8e 100644 (file)
@@ -188,6 +188,7 @@ obj-y += usb.o usb_hub.o
 obj-$(CONFIG_USB_STORAGE) += usb_storage.o
 endif
 obj-$(CONFIG_CMD_FASTBOOT) += cmd_fastboot.o
+obj-$(CONFIG_CMD_FS_UUID) += cmd_fs_uuid.o
 
 obj-$(CONFIG_CMD_USB_MASS_STORAGE) += cmd_usb_mass_storage.o
 obj-$(CONFIG_CMD_THOR_DOWNLOAD) += cmd_thordown.o
index b5bebc9dc862727b7aa2386f64691ace23475cc0..f8fd324d0d79741c0741f24d38645895c22a2fbb 100644 (file)
@@ -142,17 +142,19 @@ static int init_baud_rate(void)
 static int display_text_info(void)
 {
 #ifndef CONFIG_SANDBOX
-       ulong bss_start, bss_end;
+       ulong bss_start, bss_end, text_base;
 
        bss_start = (ulong)&__bss_start;
        bss_end = (ulong)&__bss_end;
 
-       debug("U-Boot code: %08X -> %08lX  BSS: -> %08lX\n",
 #ifdef CONFIG_SYS_TEXT_BASE
-             CONFIG_SYS_TEXT_BASE, bss_start, bss_end);
+       text_base = CONFIG_SYS_TEXT_BASE;
 #else
-             CONFIG_SYS_MONITOR_BASE, bss_start, bss_end);
+       text_base = CONFIG_SYS_MONITOR_BASE;
 #endif
+
+       debug("U-Boot code: %08lX -> %08lX  BSS: -> %08lX\n",
+               text_base, bss_start, bss_end);
 #endif
 
 #ifdef CONFIG_MODEM_SUPPORT
@@ -285,7 +287,7 @@ static int read_fdt_from_file(void)
        struct sandbox_state *state = state_get_current();
        const char *fname = state->fdt_fname;
        void *blob;
-       ssize_t size;
+       loff_t size;
        int err;
        int fd;
 
@@ -298,10 +300,10 @@ static int read_fdt_from_file(void)
                return -EINVAL;
        }
 
-       size = os_get_filesize(fname);
-       if (size < 0) {
+       err = os_get_filesize(fname, &size);
+       if (err < 0) {
                printf("Failed to file FDT file '%s'\n", fname);
-               return -ENOENT;
+               return err;
        }
        fd = os_open(fname, OS_O_RDONLY);
        if (fd < 0) {
@@ -579,7 +581,7 @@ static int reserve_stacks(void)
        gd->irq_sp = gd->start_addr_sp;
 # endif
 #else
-# ifdef CONFIG_PPC
+# if defined(CONFIG_PPC) || defined(CONFIG_MIPS)
        ulong *s;
 # endif
 
@@ -609,6 +611,12 @@ static int reserve_stacks(void)
        s = (ulong *) gd->start_addr_sp;
        *s = 0; /* Terminate back chain */
        *++s = 0; /* NULL return address */
+# elif defined(CONFIG_MIPS)
+       /* Clear initial stack frame */
+       s = (ulong *) gd->start_addr_sp;
+       *s-- = 0;
+       *s-- = 0;
+       gd->start_addr_sp = (ulong) s;
 # endif /* Architecture specific code */
 
        return 0;
@@ -812,22 +820,16 @@ static init_fnc_t init_sequence_f[] = {
        setup_mon_len,
        setup_fdt,
        trace_early_init,
+       initf_malloc,
 #if defined(CONFIG_MPC85xx) || defined(CONFIG_MPC86xx)
        /* TODO: can this go into arch_cpu_init()? */
        probecpu,
 #endif
        arch_cpu_init,          /* basic arch cpu dependent setup */
-#ifdef CONFIG_X86
-       cpu_init_f,             /* TODO(sjg@chromium.org): remove */
-# ifdef CONFIG_OF_CONTROL
-       find_fdt,               /* TODO(sjg@chromium.org): remove */
-# endif
-#endif
        mark_bootstage,
 #ifdef CONFIG_OF_CONTROL
        fdtdec_check_fdt,
 #endif
-       initf_malloc,
        initf_dm,
 #if defined(CONFIG_BOARD_EARLY_INIT_F)
        board_early_init_f,
@@ -902,14 +904,10 @@ static init_fnc_t init_sequence_f[] = {
 #endif
 #if defined(CONFIG_HARD_SPI)
        init_func_spi,
-#endif
-#ifdef CONFIG_X86
-       dram_init_f,            /* configure available RAM banks */
-       calculate_relocation_address,
 #endif
        announce_dram_init,
        /* TODO: unify all these dram functions? */
-#ifdef CONFIG_ARM
+#if defined(CONFIG_ARM) || defined(CONFIG_X86)
        dram_init,              /* configure available RAM banks */
 #endif
 #if defined(CONFIG_MIPS) || defined(CONFIG_PPC)
index 42a52965c2722282c36e6ebeaa0049c8c21b4c9f..58b61c26403b9fe79fe041c7c6cf2b6123309759 100644 (file)
@@ -210,9 +210,9 @@ int do_bootvx(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
         */
        bootline = getenv("bootargs");
        if (bootline) {
-               memcpy((void *) bootaddr, bootline,
-                       max(strlen(bootline), 255));
-               flush_cache(bootaddr, max(strlen(bootline), 255));
+               memcpy((void *)bootaddr, bootline,
+                      max(strlen(bootline), (size_t)255));
+               flush_cache(bootaddr, max(strlen(bootline), (size_t)255));
        } else {
                sprintf(build_buf, CONFIG_SYS_VXWORKS_BOOT_DEVICE);
                tmp = getenv("bootfile");
@@ -240,9 +240,9 @@ int do_bootvx(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
                         CONFIG_SYS_VXWORKS_ADD_PARAMS);
 #endif
 
-               memcpy((void *) bootaddr, build_buf,
-                       max(strlen(build_buf), 255));
-               flush_cache(bootaddr, max(strlen(build_buf), 255));
+               memcpy((void *)bootaddr, build_buf,
+                      max(strlen(build_buf), (size_t)255));
+               flush_cache(bootaddr, max(strlen(build_buf), (size_t)255));
        }
 
        /*
index ecfc6d3c9bb077fa523ba6c476be388906862fbc..19423d1c81b83aec61545e1c9fb37d006e94806e 100644 (file)
@@ -61,61 +61,16 @@ int do_ext4_ls(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
 
 #if defined(CONFIG_CMD_EXT4_WRITE)
 int do_ext4_write(cmd_tbl_t *cmdtp, int flag, int argc,
-                               char *const argv[])
+                 char *const argv[])
 {
-       const char *filename = "/";
-       int dev, part;
-       unsigned long ram_address;
-       unsigned long file_size;
-       disk_partition_t info;
-       block_dev_desc_t *dev_desc;
-
-       if (argc < 6)
-               return cmd_usage(cmdtp);
-
-       part = get_device_and_partition(argv[1], argv[2], &dev_desc, &info, 1);
-       if (part < 0)
-               return 1;
-
-       dev = dev_desc->dev;
-
-       /* get the filename */
-       filename = argv[4];
-
-       /* get the address in hexadecimal format (string to int) */
-       ram_address = simple_strtoul(argv[3], NULL, 16);
-
-       /* get the filesize in hexadecimal format */
-       file_size = simple_strtoul(argv[5], NULL, 16);
-
-       /* set the device as block device */
-       ext4fs_set_blk_dev(dev_desc, &info);
-
-       /* mount the filesystem */
-       if (!ext4fs_mount(info.size)) {
-               printf("Bad ext4 partition %s %d:%d\n", argv[1], dev, part);
-               goto fail;
-       }
-
-       /* start write */
-       if (ext4fs_write(filename, (unsigned char *)ram_address, file_size)) {
-               printf("** Error ext4fs_write() **\n");
-               goto fail;
-       }
-       ext4fs_close();
-
-       return 0;
-
-fail:
-       ext4fs_close();
-
-       return 1;
+       return do_save(cmdtp, flag, argc, argv, FS_TYPE_EXT);
 }
 
-U_BOOT_CMD(ext4write, 6, 1, do_ext4_write,
-       "create a file in the root directory",
-       "<interface> <dev[:part]> <addr> <absolute filename path> [sizebytes]\n"
-       "    - create a file in / directory");
+U_BOOT_CMD(ext4write, 7, 1, do_ext4_write,
+          "create a file in the root directory",
+          "<interface> <dev[:part]> <addr> <absolute filename path>\n"
+          "    [sizebytes] [file offset]\n"
+          "    - create a file in / directory");
 
 #endif
 
@@ -132,7 +87,7 @@ U_BOOT_CMD(ext4ls, 4, 1, do_ext4_ls,
           "<interface> <dev[:part]> [directory]\n"
           "    - list files from 'dev' on 'interface' in a 'directory'");
 
-U_BOOT_CMD(ext4load, 6, 0, do_ext4_load,
+U_BOOT_CMD(ext4load, 7, 0, do_ext4_load,
           "load binary file from a Ext4 filesystem",
           "<interface> [<dev[:part]> [addr [filename [bytes [pos]]]]]\n"
           "    - load binary file 'filename' from 'dev' on 'interface'\n"
index 633fbf1d311391bb9aa69fd9ce905013b12e9805..c00fb28b620b6d7108fda494f4e032724e829fe3 100644 (file)
@@ -100,7 +100,8 @@ U_BOOT_CMD(
 static int do_fat_fswrite(cmd_tbl_t *cmdtp, int flag,
                int argc, char * const argv[])
 {
-       long size;
+       loff_t size;
+       int ret;
        unsigned long addr;
        unsigned long count;
        block_dev_desc_t *dev_desc = NULL;
@@ -127,15 +128,15 @@ static int do_fat_fswrite(cmd_tbl_t *cmdtp, int flag,
        count = simple_strtoul(argv[5], NULL, 16);
 
        buf = map_sysmem(addr, count);
-       size = file_fat_write(argv[4], buf, count);
+       ret = file_fat_write(argv[4], buf, 0, count, &size);
        unmap_sysmem(buf);
-       if (size == -1) {
+       if (ret < 0) {
                printf("\n** Unable to write \"%s\" from %s %d:%d **\n",
                        argv[4], argv[1], dev, part);
                return 1;
        }
 
-       printf("%ld bytes written\n", size);
+       printf("%llu bytes written\n", size);
 
        return 0;
 }
index 675434078633400ff85866e4c7554458412b7dc1..0d9da113bf0c1305bc64e7e67368d6eba800b5e0 100644 (file)
@@ -51,6 +51,23 @@ U_BOOT_CMD(
        "      If 'pos' is 0 or omitted, the file is read from the start."
 )
 
+static int do_save_wrapper(cmd_tbl_t *cmdtp, int flag, int argc,
+                               char * const argv[])
+{
+       return do_save(cmdtp, flag, argc, argv, FS_TYPE_ANY);
+}
+
+U_BOOT_CMD(
+       save,   7,      0,      do_save_wrapper,
+       "save file to a filesystem",
+       "<interface> <dev[:part]> <addr> <filename> bytes [pos]\n"
+       "    - Save binary file 'filename' to partition 'part' on device\n"
+       "      type 'interface' instance 'dev' from addr 'addr' in memory.\n"
+       "      'bytes' gives the size to save in bytes and is mandatory.\n"
+       "      'pos' gives the file byte position to start writing to.\n"
+       "      If 'pos' is 0 or omitted, the file is written from the start."
+)
+
 static int do_ls_wrapper(cmd_tbl_t *cmdtp, int flag, int argc,
                                char * const argv[])
 {
diff --git a/common/cmd_fs_uuid.c b/common/cmd_fs_uuid.c
new file mode 100644 (file)
index 0000000..613f3a4
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * cmd_fs_uuid.c -- fsuuid command
+ *
+ * Copyright (C) 2014, Bachmann electronic GmbH
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#include <common.h>
+#include <command.h>
+#include <fs.h>
+
+static int do_fs_uuid_wrapper(cmd_tbl_t *cmdtp, int flag,
+       int argc, char * const argv[])
+{
+       return do_fs_uuid(cmdtp, flag, argc, argv, FS_TYPE_ANY);
+}
+
+U_BOOT_CMD(
+       fsuuid, 4, 1, do_fs_uuid_wrapper,
+       "Look up a filesystem UUID",
+       "<interface> <dev>:<part>\n"
+       "    - print filesystem UUID\n"
+       "fsuuid <interface> <dev>:<part> <varname>\n"
+       "    - set environment variable to filesystem UUID\n"
+);
index 3ac8cc41b1a450edc7f5e489b3a6e9e4c2d14a38..d22ace52206580052e47073eb47d6e59bb9d936c 100644 (file)
@@ -11,6 +11,7 @@
 #include <common.h>
 #include <command.h>
 #include <u-boot/md5.h>
+#include <asm/io.h>
 
 /*
  * Store the resulting sum to an address or variable
@@ -79,6 +80,7 @@ int do_md5sum(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
        int verify = 0;
        int ac;
        char * const *av;
+       void *buf;
 
        if (argc < 3)
                return CMD_RET_USAGE;
@@ -96,7 +98,9 @@ int do_md5sum(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
        addr = simple_strtoul(*av++, NULL, 16);
        len = simple_strtoul(*av++, NULL, 16);
 
-       md5_wd((unsigned char *) addr, len, output, CHUNKSZ_MD5);
+       buf = map_sysmem(addr, len);
+       md5_wd(buf, len, output, CHUNKSZ_MD5);
+       unmap_sysmem(buf);
 
        if (!verify) {
                printf("md5 for %08lx ... %08lx ==> ", addr, addr + len - 1);
@@ -135,6 +139,7 @@ static int do_md5sum(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
        unsigned long addr, len;
        unsigned int i;
        u8 output[16];
+       void *buf;
 
        if (argc < 3)
                return CMD_RET_USAGE;
@@ -142,7 +147,10 @@ static int do_md5sum(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
        addr = simple_strtoul(argv[1], NULL, 16);
        len = simple_strtoul(argv[2], NULL, 16);
 
-       md5_wd((unsigned char *) addr, len, output, CHUNKSZ_MD5);
+       buf = map_sysmem(addr, len);
+       md5_wd(buf, len, output, CHUNKSZ_MD5);
+       unmap_sysmem(buf);
+
        printf("md5 for %08lx ... %08lx ==> ", addr, addr + len - 1);
        for (i = 0; i < 16; i++)
                printf("%02x", output[i]);
index a1ba42e2f3a2c3a4abc625af674a4599af451f38..e3a77e35820cbda7c663f2b737c187ed0f9e2227 100644 (file)
@@ -42,12 +42,16 @@ void pci_header_show_brief(pci_dev_t dev);
  */
 void pciinfo(int BusNum, int ShortPCIListing)
 {
+       struct pci_controller *hose = pci_bus_to_hose(BusNum);
        int Device;
        int Function;
        unsigned char HeaderType;
        unsigned short VendorID;
        pci_dev_t dev;
 
+       if (!hose)
+               return;
+
        printf("Scanning PCI devices on bus %d\n", BusNum);
 
        if (ShortPCIListing) {
@@ -67,6 +71,9 @@ void pciinfo(int BusNum, int ShortPCIListing)
 
                        dev = PCI_BDF(BusNum, Device, Function);
 
+                       if (pci_skip_dev(hose, dev))
+                               continue;
+
                        pci_read_config_word(dev, PCI_VENDOR_ID, &VendorID);
                        if ((VendorID == 0xFFFF) || (VendorID == 0x0000))
                                continue;
index 95a6f89a845da57b5e5430b339dbda12f4d5d354..5c788e96bdb821de3b7cd6f4f6cb8a40a0238cc4 100644 (file)
@@ -18,7 +18,6 @@
 
 static struct spi_flash *flash;
 
-
 /*
  * This function computes the length argument for the erase command.
  * The length on which the command is to operate can be given in two forms:
@@ -71,9 +70,9 @@ static ulong bytes_per_second(unsigned int len, ulong start_ms)
 {
        /* less accurate but avoids overflow */
        if (len >= ((unsigned int) -1) / 1024)
-               return len / (max(get_timer(start_ms) / 1024, 1));
+               return len / (max(get_timer(start_ms) / 1024, 1UL));
        else
-               return 1024 * len / max(get_timer(start_ms), 1);
+               return 1024 * len / max(get_timer(start_ms), 1UL);
 }
 
 static int do_spi_flash_probe(int argc, char * const argv[])
@@ -223,7 +222,7 @@ static int spi_flash_update(struct spi_flash *flash, u32 offset,
                ulong last_update = get_timer(0);
 
                for (; buf < end && !err_oper; buf += todo, offset += todo) {
-                       todo = min(end - buf, flash->sector_size);
+                       todo = min_t(size_t, end - buf, flash->sector_size);
                        if (get_timer(last_update) > 100) {
                                printf("   \rUpdating, %zu%% %lu B/s",
                                       100 - (end - buf) / scale,
@@ -421,7 +420,8 @@ static int spi_flash_test(struct spi_flash *flash, uint8_t *buf, ulong len,
        for (i = 0; i < len; i++) {
                if (vbuf[i] != 0xff) {
                        printf("Check failed at %d\n", i);
-                       print_buffer(i, vbuf + i, 1, min(len - i, 0x40), 0);
+                       print_buffer(i, vbuf + i, 1,
+                                    min_t(uint, len - i, 0x40), 0);
                        return -1;
                }
        }
@@ -443,9 +443,11 @@ static int spi_flash_test(struct spi_flash *flash, uint8_t *buf, ulong len,
        for (i = 0; i < len; i++) {
                if (buf[i] != vbuf[i]) {
                        printf("Verify failed at %d, good data:\n", i);
-                       print_buffer(i, buf + i, 1, min(len - i, 0x40), 0);
+                       print_buffer(i, buf + i, 1,
+                                    min_t(uint, len - i, 0x40), 0);
                        printf("Bad data:\n");
-                       print_buffer(i, vbuf + i, 1, min(len - i, 0x40), 0);
+                       print_buffer(i, vbuf + i, 1,
+                                    min_t(uint, len - i, 0x40), 0);
                        return -1;
                }
        }
index 8db0160ceb0ced4fc703a2a11840d5e6bedde30d..e4c848935ad19d7cac64d07102e7ebe39841b58b 100644 (file)
@@ -41,6 +41,7 @@ int saveenv(void)
        disk_partition_t info;
        int dev, part;
        int err;
+       loff_t size;
 
        err = env_export(&env_new);
        if (err)
@@ -59,7 +60,8 @@ int saveenv(void)
                return 1;
        }
 
-       err = file_fat_write(FAT_ENV_FILE, (void *)&env_new, sizeof(env_t));
+       err = file_fat_write(FAT_ENV_FILE, (void *)&env_new, 0, sizeof(env_t),
+                            &size);
        if (err == -1) {
                printf("\n** Unable to write \"%s\" from %s%d:%d **\n",
                        FAT_ENV_FILE, FAT_ENV_INTERFACE, dev, part);
index 749605fe3fa89ab798a0ebde92f1f90e4a40fb2b..9c9bb82c0faf81f3d6d6295f99ecfcfd3a1cea2b 100644 (file)
@@ -132,7 +132,7 @@ static int writeenv(size_t offset, u_char *buf)
        u_char *char_ptr;
 
        blocksize = nand_info[0].erasesize;
-       len = min(blocksize, CONFIG_ENV_SIZE);
+       len = min(blocksize, (size_t)CONFIG_ENV_SIZE);
 
        while (amount_saved < CONFIG_ENV_SIZE && offset < end) {
                if (nand_block_isbad(&nand_info[0], offset)) {
@@ -244,7 +244,7 @@ static int readenv(size_t offset, u_char *buf)
        if (!blocksize)
                return 1;
 
-       len = min(blocksize, CONFIG_ENV_SIZE);
+       len = min(blocksize, (size_t)CONFIG_ENV_SIZE);
 
        while (amount_loaded < CONFIG_ENV_SIZE && offset < end) {
                if (nand_block_isbad(&nand_info[0], offset)) {
index 3f641566b977aff76275656c86093051d2b1217c..2d3c3870b19a3d42f0edb0e4f1f9c88272072b1e 100644 (file)
@@ -1199,7 +1199,8 @@ int fdt_node_offset_by_compat_reg(void *blob, const char *compat,
  */
 int fdt_alloc_phandle(void *blob)
 {
-       int offset, phandle = 0;
+       int offset;
+       uint32_t phandle = 0;
 
        for (offset = fdt_next_node(blob, -1, NULL); offset >= 0;
             offset = fdt_next_node(blob, offset, NULL)) {
index 37147af805ce8972081dd7a59420ecb14a2b0453..d8e13715c18f82c269cfd3b670a9567bbf895fd3 100644 (file)
@@ -746,7 +746,7 @@ static void splash_align_axis(int *axis, unsigned long panel_size,
        else
                return;
 
-       *axis = max(0, axis_alignment);
+       *axis = max(0, (int)axis_alignment);
 }
 #endif
 
@@ -1145,8 +1145,8 @@ U_BOOT_ENV_CALLBACK(splashimage, on_splashimage);
 
 void lcd_position_cursor(unsigned col, unsigned row)
 {
-       console_col = min(col, CONSOLE_COLS - 1);
-       console_row = min(row, CONSOLE_ROWS - 1);
+       console_col = min_t(short, col, CONSOLE_COLS - 1);
+       console_row = min_t(short, row, CONSOLE_ROWS - 1);
 }
 
 int lcd_get_pixel_width(void)
index 3cd19f0e186fb9c9bcc71dbc6d48689af7b5b7e5..1826c47a99c464bd0023f3c173cab788de49acb0 100644 (file)
@@ -230,7 +230,9 @@ void board_init_r(gd_t *dummy1, ulong dummy2)
                break;
 #endif
        default:
-               debug("SPL: Un-supported Boot Device\n");
+#if defined(CONFIG_SPL_SERIAL_SUPPORT) && defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
+               printf("SPL: Unsupported Boot Device %d\n", boot_device);
+#endif
                hang();
        }
 
index d9eba5aef3a7bfae56ceda43df0a1726639d8804..5ff9bc5626c4f8ce669f60112735ab60a6da412e 100644 (file)
@@ -15,7 +15,7 @@ int spl_load_image_ext(block_dev_desc_t *block_dev,
 {
        s32 err;
        struct image_header *header;
-       int filelen;
+       loff_t filelen, actlen;
        disk_partition_t part_info = {};
 
        header = (struct image_header *)(CONFIG_SYS_TEXT_BASE -
@@ -37,12 +37,12 @@ int spl_load_image_ext(block_dev_desc_t *block_dev,
                goto end;
        }
 
-       filelen = err = ext4fs_open(filename);
+       err = ext4fs_open(filename, &filelen);
        if (err < 0) {
                puts("spl: ext4fs_open failed\n");
                goto end;
        }
-       err = ext4fs_read((char *)header, sizeof(struct image_header));
+       err = ext4fs_read((char *)header, sizeof(struct image_header), &actlen);
        if (err <= 0) {
                puts("spl: ext4fs_read failed\n");
                goto end;
@@ -50,7 +50,7 @@ int spl_load_image_ext(block_dev_desc_t *block_dev,
 
        spl_parse_image_header(header);
 
-       err = ext4fs_read((char *)spl_image.load_addr, filelen);
+       err = ext4fs_read((char *)spl_image.load_addr, filelen, &actlen);
 
 end:
 #ifdef CONFIG_SPL_LIBCOMMON_SUPPORT
@@ -66,7 +66,7 @@ end:
 int spl_load_image_ext_os(block_dev_desc_t *block_dev, int partition)
 {
        int err;
-       int filelen;
+       __maybe_unused loff_t filelen, actlen;
        disk_partition_t part_info = {};
        __maybe_unused char *file;
 
@@ -89,12 +89,12 @@ int spl_load_image_ext_os(block_dev_desc_t *block_dev, int partition)
 #if defined(CONFIG_SPL_ENV_SUPPORT) && defined(CONFIG_SPL_OS_BOOT)
        file = getenv("falcon_args_file");
        if (file) {
-               filelen = err = ext4fs_open(file);
+               err = ext4fs_open(file, &filelen);
                if (err < 0) {
                        puts("spl: ext4fs_open failed\n");
                        goto defaults;
                }
-               err = ext4fs_read((void *)CONFIG_SYS_SPL_ARGS_ADDR, filelen);
+               err = ext4fs_read((void *)CONFIG_SYS_SPL_ARGS_ADDR, filelen, &actlen);
                if (err <= 0) {
                        printf("spl: error reading image %s, err - %d, falling back to default\n",
                               file, err);
@@ -119,11 +119,11 @@ int spl_load_image_ext_os(block_dev_desc_t *block_dev, int partition)
 defaults:
 #endif
 
-       filelen = err = ext4fs_open(CONFIG_SPL_FS_LOAD_ARGS_NAME);
+       err = ext4fs_open(CONFIG_SPL_FS_LOAD_ARGS_NAME, &filelen);
        if (err < 0)
                puts("spl: ext4fs_open failed\n");
 
-       err = ext4fs_read((void *)CONFIG_SYS_SPL_ARGS_ADDR, filelen);
+       err = ext4fs_read((void *)CONFIG_SYS_SPL_ARGS_ADDR, filelen, &actlen);
        if (err <= 0) {
 #ifdef CONFIG_SPL_LIBCOMMON_SUPPORT
                printf("%s: error reading image %s, err - %d\n",
index 0f1eab448649541a45e674bcfbd599460cc89677..66b4a725d1b3c1d2caf0fe005fe40e036b9b251f 100644 (file)
@@ -300,7 +300,8 @@ static int usb_hub_configure(struct usb_device *dev)
        }
        descriptor = (struct usb_hub_descriptor *)buffer;
 
-       length = min(descriptor->bLength, sizeof(struct usb_hub_descriptor));
+       length = min_t(int, descriptor->bLength,
+                      sizeof(struct usb_hub_descriptor));
 
        if (usb_get_hub_descriptor(dev, buffer, length) < 0) {
                debug("usb_hub_configure: failed to get hub " \
diff --git a/configs/bcm11130_defconfig b/configs/bcm11130_defconfig
new file mode 100644 (file)
index 0000000..f8c9f03
--- /dev/null
@@ -0,0 +1,3 @@
+CONFIG_SYS_EXTRA_OPTIONS="SYS_MMC_ENV_DEV=0"
+CONFIG_ARM=y
+CONFIG_TARGET_BCM28155_AP=y
diff --git a/configs/bcm11130_nand_defconfig b/configs/bcm11130_nand_defconfig
new file mode 100644 (file)
index 0000000..39cb709
--- /dev/null
@@ -0,0 +1,3 @@
+CONFIG_SYS_EXTRA_OPTIONS="NAND"
+CONFIG_ARM=y
+CONFIG_TARGET_BCM28155_AP=y
diff --git a/configs/bcm911360_entphn-ns_defconfig b/configs/bcm911360_entphn-ns_defconfig
new file mode 100644 (file)
index 0000000..6f5c154
--- /dev/null
@@ -0,0 +1,3 @@
+CONFIG_SYS_EXTRA_OPTIONS="SYS_SDRAM_SIZE=0x20000000,ARMV7_NONSEC"
+CONFIG_ARM=y
+CONFIG_TARGET_BCMCYGNUS=y
diff --git a/configs/bcm911360_entphn_defconfig b/configs/bcm911360_entphn_defconfig
new file mode 100644 (file)
index 0000000..37b5846
--- /dev/null
@@ -0,0 +1,3 @@
+CONFIG_SYS_EXTRA_OPTIONS="SYS_SDRAM_SIZE=0x20000000"
+CONFIG_ARM=y
+CONFIG_TARGET_BCMCYGNUS=y
diff --git a/configs/bcm911360k_defconfig b/configs/bcm911360k_defconfig
new file mode 100644 (file)
index 0000000..527e407
--- /dev/null
@@ -0,0 +1,3 @@
+CONFIG_SYS_EXTRA_OPTIONS="SYS_SDRAM_SIZE=0x40000000"
+CONFIG_ARM=y
+CONFIG_TARGET_BCMCYGNUS=y
diff --git a/configs/bcm958300k-ns_defconfig b/configs/bcm958300k-ns_defconfig
new file mode 100644 (file)
index 0000000..0e3aaa7
--- /dev/null
@@ -0,0 +1,3 @@
+CONFIG_SYS_EXTRA_OPTIONS="SYS_SDRAM_SIZE=0x40000000,ARMV7_NONSEC"
+CONFIG_ARM=y
+CONFIG_TARGET_BCMCYGNUS=y
index 066739db8bf0781be5745ee2c3f4f1fc702f1f27..527e4072c9211496231017dce134b5f9f31ac8ea 100644 (file)
@@ -1,3 +1,3 @@
-CONFIG_SYS_EXTRA_OPTIONS="SYS_SDRAM_SIZE=0x20000000"
+CONFIG_SYS_EXTRA_OPTIONS="SYS_SDRAM_SIZE=0x40000000"
 CONFIG_ARM=y
-CONFIG_TARGET_BCM958300K=y
+CONFIG_TARGET_BCMCYGNUS=y
diff --git a/configs/bcm958305k_defconfig b/configs/bcm958305k_defconfig
new file mode 100644 (file)
index 0000000..527e407
--- /dev/null
@@ -0,0 +1,3 @@
+CONFIG_SYS_EXTRA_OPTIONS="SYS_SDRAM_SIZE=0x40000000"
+CONFIG_ARM=y
+CONFIG_TARGET_BCMCYGNUS=y
index 8a45e515fbbe8b2b441fd7c4dd0e3599c02c6398..7c8630096822986c6cc968312b682bfd69deb97d 100644 (file)
@@ -1,3 +1,3 @@
 CONFIG_SYS_EXTRA_OPTIONS="SYS_SDRAM_SIZE=0x01000000"
 CONFIG_ARM=y
-CONFIG_TARGET_BCM958622HR=y
+CONFIG_TARGET_BCMNSP=y
diff --git a/configs/chromebook_link_defconfig b/configs/chromebook_link_defconfig
new file mode 100644 (file)
index 0000000..b83803e
--- /dev/null
@@ -0,0 +1,10 @@
+CONFIG_SYS_EXTRA_OPTIONS="SYS_TEXT_BASE=0xfff00000"
+CONFIG_X86=y
+CONFIG_TARGET_CHROMEBOOK_LINK=y
+CONFIG_OF_CONTROL=y
+CONFIG_OF_SEPARATE=y
+CONFIG_DEFAULT_DEVICE_TREE="chromebook_link"
+CONFIG_HAVE_MRC=y
+CONFIG_SMM_TSEG_SIZE=0x800000
+CONFIG_FRAMEBUFFER_SET_VESA_MODE=y
+CONFIG_FRAMEBUFFER_VESA_MODE_11A=y
diff --git a/doc/device-tree-bindings/misc/intel-lpc.txt b/doc/device-tree-bindings/misc/intel-lpc.txt
new file mode 100644 (file)
index 0000000..7e1b389
--- /dev/null
@@ -0,0 +1,23 @@
+Intel LPC Device Binding
+========================
+
+The device tree node which describes the operation of the Intel Low Pin
+Count device is as follows:
+
+Required properties :
+- compatible = "intel,lpc"
+- gen-dec : Specifies the values for the gen-dec registers. Up to four cell
+   pairs can be provided - the first of each pair is the base address and
+   the second is the size. These are written into the GENx_DEC registers of
+   the LPC device
+
+
+Example
+-------
+
+lpc {
+       compatible = "intel,lpc";
+       #address-cells = <1>;
+       #size-cells = <1>;
+       gen-dec = <0x800 0xfc 0x900 0xfc>;
+};
index a93a8e1c04b797fe4d8cce58b3e232721c886519..c9a3beb79b2368d96905160052cbec38003ea2cb 100644 (file)
@@ -730,7 +730,7 @@ static int ata_scsiop_read_write(ccb *pccb, u8 is_write)
                u16 now_blocks; /* number of blocks per iteration */
                u32 transfer_size; /* number of bytes per iteration */
 
-               now_blocks = min(MAX_SATA_BLOCKS_READ_WRITE, blocks);
+               now_blocks = min((u16)MAX_SATA_BLOCKS_READ_WRITE, blocks);
 
                transfer_size = ATA_SECT_SIZE * now_blocks;
                if (transfer_size > user_buffer_size) {
index 1f510cd265c0b42657fc74b28253965bea1c3de0..b483dbb5d188888fdbacda243b2d1f78f10a5a0c 100644 (file)
@@ -519,7 +519,7 @@ int init_sata(int dev)
        u16 word;
 
        if (init_done == 1 && dev < sata_info.maxport)
-               return 1;
+               return 0;
 
        init_done = 1;
 
index 9a156bfd5e18c41d9ddcdfb4add0f63937808e11..9e2a4d2f467ee834078369344c2bf178c9d33f9c 100644 (file)
@@ -303,7 +303,7 @@ static void set_timing_cfg_0(fsl_ddr_cfg_regs_t *ddr,
 
 #ifdef CONFIG_SYS_FSL_DDR4
        /* tXP=max(4nCK, 6ns) */
-       int txp = max(mclk_ps * 4, 6000); /* unit=ps */
+       int txp = max((int)mclk_ps * 4, 6000); /* unit=ps */
        trwt_mclk = 2;
        twrt_mclk = 1;
        act_pd_exit_mclk = picos_to_mclk(txp);
@@ -312,7 +312,7 @@ static void set_timing_cfg_0(fsl_ddr_cfg_regs_t *ddr,
         * MRS_CYC = max(tMRD, tMOD)
         * tMRD = 8nCK, tMOD = max(24nCK, 15ns)
         */
-       tmrd_mclk = max(24, picos_to_mclk(15000));
+       tmrd_mclk = max(24U, picos_to_mclk(15000));
 #elif defined(CONFIG_SYS_FSL_DDR3)
        unsigned int data_rate = get_ddr_freq(0);
        int txp;
@@ -325,7 +325,7 @@ static void set_timing_cfg_0(fsl_ddr_cfg_regs_t *ddr,
         * spec has not the tAXPD, we use
         * tAXPD=1, need design to confirm.
         */
-       txp = max(mclk_ps * 3, (mclk_ps > 1540 ? 7500 : 6000));
+       txp = max((int)mclk_ps * 3, (mclk_ps > 1540 ? 7500 : 6000));
 
        tmrd_mclk = 4;
        /* set the turnaround time */
@@ -511,8 +511,8 @@ static void set_timing_cfg_1(fsl_ddr_cfg_regs_t *ddr,
 #ifdef CONFIG_SYS_FSL_DDR4
        refrec_ctrl = picos_to_mclk(common_dimm->trfc1_ps) - 8;
        wrrec_mclk = picos_to_mclk(common_dimm->twr_ps);
-       acttoact_mclk = max(picos_to_mclk(common_dimm->trrds_ps), 4);
-       wrtord_mclk = max(2, picos_to_mclk(2500));
+       acttoact_mclk = max(picos_to_mclk(common_dimm->trrds_ps), 4U);
+       wrtord_mclk = max(2U, picos_to_mclk(2500));
        if ((wrrec_mclk < 1) || (wrrec_mclk > 24))
                printf("Error: WRREC doesn't support %d clocks\n", wrrec_mclk);
        else
@@ -627,14 +627,14 @@ static void set_timing_cfg_2(fsl_ddr_cfg_regs_t *ddr,
        wr_data_delay = popts->write_data_delay;
 #ifdef CONFIG_SYS_FSL_DDR4
        cpo = 0;
-       cke_pls = max(3, picos_to_mclk(5000));
+       cke_pls = max(3U, picos_to_mclk(5000));
 #elif defined(CONFIG_SYS_FSL_DDR3)
        /*
         * cke pulse = max(3nCK, 7.5ns) for DDR3-800
         *             max(3nCK, 5.625ns) for DDR3-1066, 1333
         *             max(3nCK, 5ns) for DDR3-1600, 1866, 2133
         */
-       cke_pls = max(3, picos_to_mclk(mclk_ps > 1870 ? 7500 :
+       cke_pls = max(3U, picos_to_mclk(mclk_ps > 1870 ? 7500 :
                                       (mclk_ps > 1245 ? 5625 : 5000)));
 #else
        cke_pls = FSL_DDR_MIN_TCKE_PULSE_WIDTH_DDR;
@@ -1810,9 +1810,9 @@ static void set_timing_cfg_7(fsl_ddr_cfg_regs_t *ddr,
        unsigned int txpr, tcksre, tcksrx;
        unsigned int cke_rst, cksre, cksrx, par_lat, cs_to_cmd;
 
-       txpr = max(5, picos_to_mclk(common_dimm->trfc1_ps + 10000));
-       tcksre = max(5, picos_to_mclk(10000));
-       tcksrx = max(5, picos_to_mclk(10000));
+       txpr = max(5U, picos_to_mclk(common_dimm->trfc1_ps + 10000));
+       tcksre = max(5U, picos_to_mclk(10000));
+       tcksrx = max(5U, picos_to_mclk(10000));
        par_lat = 0;
        cs_to_cmd = 0;
 
@@ -1877,7 +1877,7 @@ static void set_timing_cfg_8(fsl_ddr_cfg_regs_t *ddr,
        }
 
        acttoact_bg = picos_to_mclk(common_dimm->trrdl_ps);
-       wrtord_bg = max(4, picos_to_mclk(7500));
+       wrtord_bg = max(4U, picos_to_mclk(7500));
        if (popts->otf_burst_chop_en)
                wrtord_bg += 2;
 
index 05a24dd6efdba2658cfcf68898dd7f7948edb922..73db4446153a213f127dfa31bb0bf8bd9ef74c04 100644 (file)
@@ -289,48 +289,58 @@ compute_lowest_common_dimm_parameters(const dimm_params_t *dimm_params,
                 * Find minimum tckmax_ps to find fastest slow speed,
                 * i.e., this is the slowest the whole system can go.
                 */
-               tckmax_ps = min(tckmax_ps, dimm_params[i].tckmax_ps);
+               tckmax_ps = min(tckmax_ps,
+                               (unsigned int)dimm_params[i].tckmax_ps);
 #if defined(CONFIG_SYS_FSL_DDR3) || defined(CONFIG_SYS_FSL_DDR4)
-               taamin_ps = max(taamin_ps, dimm_params[i].taa_ps);
+               taamin_ps = max(taamin_ps,
+                               (unsigned int)dimm_params[i].taa_ps);
 #endif
-               tckmin_x_ps = max(tckmin_x_ps, dimm_params[i].tckmin_x_ps);
-               trcd_ps = max(trcd_ps, dimm_params[i].trcd_ps);
-               trp_ps = max(trp_ps, dimm_params[i].trp_ps);
-               tras_ps = max(tras_ps, dimm_params[i].tras_ps);
+               tckmin_x_ps = max(tckmin_x_ps,
+                                 (unsigned int)dimm_params[i].tckmin_x_ps);
+               trcd_ps = max(trcd_ps, (unsigned int)dimm_params[i].trcd_ps);
+               trp_ps = max(trp_ps, (unsigned int)dimm_params[i].trp_ps);
+               tras_ps = max(tras_ps, (unsigned int)dimm_params[i].tras_ps);
 #ifdef CONFIG_SYS_FSL_DDR4
-               trfc1_ps = max(trfc1_ps, dimm_params[i].trfc1_ps);
-               trfc2_ps = max(trfc2_ps, dimm_params[i].trfc2_ps);
-               trfc4_ps = max(trfc4_ps, dimm_params[i].trfc4_ps);
-               trrds_ps = max(trrds_ps, dimm_params[i].trrds_ps);
-               trrdl_ps = max(trrdl_ps, dimm_params[i].trrdl_ps);
-               tccdl_ps = max(tccdl_ps, dimm_params[i].tccdl_ps);
+               trfc1_ps = max(trfc1_ps,
+                              (unsigned int)dimm_params[i].trfc1_ps);
+               trfc2_ps = max(trfc2_ps,
+                              (unsigned int)dimm_params[i].trfc2_ps);
+               trfc4_ps = max(trfc4_ps,
+                              (unsigned int)dimm_params[i].trfc4_ps);
+               trrds_ps = max(trrds_ps,
+                              (unsigned int)dimm_params[i].trrds_ps);
+               trrdl_ps = max(trrdl_ps,
+                              (unsigned int)dimm_params[i].trrdl_ps);
+               tccdl_ps = max(tccdl_ps,
+                              (unsigned int)dimm_params[i].tccdl_ps);
 #else
-               twr_ps = max(twr_ps, dimm_params[i].twr_ps);
-               twtr_ps = max(twtr_ps, dimm_params[i].twtr_ps);
-               trfc_ps = max(trfc_ps, dimm_params[i].trfc_ps);
-               trrd_ps = max(trrd_ps, dimm_params[i].trrd_ps);
-               trtp_ps = max(trtp_ps, dimm_params[i].trtp_ps);
+               twr_ps = max(twr_ps, (unsigned int)dimm_params[i].twr_ps);
+               twtr_ps = max(twtr_ps, (unsigned int)dimm_params[i].twtr_ps);
+               trfc_ps = max(trfc_ps, (unsigned int)dimm_params[i].trfc_ps);
+               trrd_ps = max(trrd_ps, (unsigned int)dimm_params[i].trrd_ps);
+               trtp_ps = max(trtp_ps, (unsigned int)dimm_params[i].trtp_ps);
 #endif
-               trc_ps = max(trc_ps, dimm_params[i].trc_ps);
+               trc_ps = max(trc_ps, (unsigned int)dimm_params[i].trc_ps);
 #if defined(CONFIG_SYS_FSL_DDR1) || defined(CONFIG_SYS_FSL_DDR2)
-               tis_ps = max(tis_ps, dimm_params[i].tis_ps);
-               tih_ps = max(tih_ps, dimm_params[i].tih_ps);
-               tds_ps = max(tds_ps, dimm_params[i].tds_ps);
-               tdh_ps = max(tdh_ps, dimm_params[i].tdh_ps);
-               tqhs_ps = max(tqhs_ps, dimm_params[i].tqhs_ps);
+               tis_ps = max(tis_ps, (unsigned int)dimm_params[i].tis_ps);
+               tih_ps = max(tih_ps, (unsigned int)dimm_params[i].tih_ps);
+               tds_ps = max(tds_ps, (unsigned int)dimm_params[i].tds_ps);
+               tdh_ps = max(tdh_ps, (unsigned int)dimm_params[i].tdh_ps);
+               tqhs_ps = max(tqhs_ps, (unsigned int)dimm_params[i].tqhs_ps);
                /*
                 * Find maximum tdqsq_max_ps to find slowest.
                 *
                 * FIXME: is finding the slowest value the correct
                 * strategy for this parameter?
                 */
-               tdqsq_max_ps = max(tdqsq_max_ps, dimm_params[i].tdqsq_max_ps);
+               tdqsq_max_ps = max(tdqsq_max_ps,
+                                  (unsigned int)dimm_params[i].tdqsq_max_ps);
 #endif
                refresh_rate_ps = max(refresh_rate_ps,
-                                     dimm_params[i].refresh_rate_ps);
+                                     (unsigned int)dimm_params[i].refresh_rate_ps);
                /* extended_op_srt is either 0 or 1, 0 having priority */
                extended_op_srt = min(extended_op_srt,
-                                     dimm_params[i].extended_op_srt);
+                                     (unsigned int)dimm_params[i].extended_op_srt);
        }
 
        outpdimm->ndimms_present = number_of_dimms - temp1;
index b43b669e41ffc9be2b1bf812de30fa1eb714d6ff..6f291ebc03222c7a72f18a417f73554412b796ef 100644 (file)
@@ -106,7 +106,8 @@ static void __get_spd(generic_spd_eeprom_t *spd, u8 i2c_address)
                i2c_write(SPD_SPA1_ADDRESS, 0, 1, &dummy, 1);
                ret = i2c_read(i2c_address, 0, 1,
                               (uchar *)((ulong)spd + 256),
-                              min(256, sizeof(generic_spd_eeprom_t) - 256));
+                              min(256,
+                                  (int)sizeof(generic_spd_eeprom_t) - 256));
        }
 #else
        ret = i2c_read(i2c_address, 0, 1, (uchar *)spd,
index 55e6a83b9ad6956ccc1013bdb227d99d5f9ddfbc..c0aba6e197c5ef3ea940685f874f75dd014c4dc4 100644 (file)
@@ -289,7 +289,7 @@ static int dfu_read_buffer_fill(struct dfu_entity *dfu, void *buf, int size)
        readn = 0;
        while (size > 0) {
                /* get chunk that can be read */
-               chunk = min(size, dfu->b_left);
+               chunk = min((long)size, dfu->b_left);
                /* consume */
                if (chunk > 0) {
                        memcpy(buf, dfu->i_buf, chunk);
index 68fe0f3b03afb99085fada927806cbe7afca6407..6a74f8961063c278a4088616e0a512ff75ddbeaa 100644 (file)
@@ -406,8 +406,8 @@ static int zynq_loadfs(xilinx_desc *desc, const void *buf, size_t bsize,
        unsigned long ts; /* Timestamp */
        u32 isr_status, swap;
        u32 partialbit = 0;
-       u32 blocksize;
-       u32 pos = 0;
+       loff_t blocksize, actread;
+       loff_t pos = 0;
        int fstype;
        char *interface, *dev_part, *filename;
 
@@ -420,7 +420,7 @@ static int zynq_loadfs(xilinx_desc *desc, const void *buf, size_t bsize,
        if (fs_set_blk_dev(interface, dev_part, fstype))
                return FPGA_FAIL;
 
-       if (fs_read(filename, (u32) buf, pos, blocksize) < 0)
+       if (fs_read(filename, (u32) buf, pos, blocksize, &actread) < 0)
                return FPGA_FAIL;
 
        if (zynq_validate_bitstream(desc, buf, bsize, blocksize, &swap,
@@ -443,10 +443,10 @@ static int zynq_loadfs(xilinx_desc *desc, const void *buf, size_t bsize,
                        return FPGA_FAIL;
 
                if (bsize > blocksize) {
-                       if (fs_read(filename, (u32) buf, pos, blocksize) < 0)
+                       if (fs_read(filename, (u32) buf, pos, blocksize, &actread) < 0)
                                return FPGA_FAIL;
                } else {
-                       if (fs_read(filename, (u32) buf, pos, bsize) < 0)
+                       if (fs_read(filename, (u32) buf, pos, bsize, &actread) < 0)
                                return FPGA_FAIL;
                }
        } while (bsize > blocksize);
index 45e9a5ad2278378814b7351c5d70dd5c53fbf287..255700ab18d2d93cf107fcbf3b5a10b2e66e855f 100644 (file)
@@ -390,6 +390,25 @@ int gpio_get_status(struct udevice *dev, int offset, char *buf, int buffsize)
        return 0;
 }
 
+/*
+ * get a number comprised of multiple GPIO values. gpio_num_array points to
+ * the array of gpio pin numbers to scan, terminated by -1.
+ */
+unsigned gpio_get_values_as_int(const int *gpio_num_array)
+{
+       int gpio;
+       unsigned bitmask = 1;
+       unsigned vector = 0;
+
+       while (bitmask &&
+              ((gpio = *gpio_num_array++) != -1)) {
+               if (gpio_get_value(gpio))
+                       vector |= bitmask;
+               bitmask <<= 1;
+       }
+       return vector;
+}
+
 /* We need to renumber the GPIOs when any driver is probed/removed */
 static int gpio_renumber(struct udevice *removed_dev)
 {
index d3381b0369c1a4122f30c0e80aecd154d4e4e896..b095d17f5745c982c24c7acf69bcdf6ef0dbde93 100644 (file)
 #include <pci.h>
 #include <asm/gpio.h>
 #include <asm/io.h>
+#include <asm/pci.h>
+#ifdef CONFIG_X86_RESET_VECTOR
+#include <asm/arch/pch.h>
+#define SUPPORT_GPIO_SETUP
+#endif
 
 #define GPIO_PER_BANK  32
 
@@ -46,6 +51,53 @@ struct ich6_bank_priv {
        uint32_t lvl;
 };
 
+#ifdef SUPPORT_GPIO_SETUP
+static void setup_pch_gpios(const struct pch_gpio_map *gpio)
+{
+       u16 gpiobase = pci_read_config16(PCH_LPC_DEV, GPIO_BASE) & 0xfffc;
+
+       /* GPIO Set 1 */
+       if (gpio->set1.level)
+               outl(*((u32 *)gpio->set1.level), gpiobase + GP_LVL);
+       if (gpio->set1.mode)
+               outl(*((u32 *)gpio->set1.mode), gpiobase + GPIO_USE_SEL);
+       if (gpio->set1.direction)
+               outl(*((u32 *)gpio->set1.direction), gpiobase + GP_IO_SEL);
+       if (gpio->set1.reset)
+               outl(*((u32 *)gpio->set1.reset), gpiobase + GP_RST_SEL1);
+       if (gpio->set1.invert)
+               outl(*((u32 *)gpio->set1.invert), gpiobase + GPI_INV);
+       if (gpio->set1.blink)
+               outl(*((u32 *)gpio->set1.blink), gpiobase + GPO_BLINK);
+
+       /* GPIO Set 2 */
+       if (gpio->set2.level)
+               outl(*((u32 *)gpio->set2.level), gpiobase + GP_LVL2);
+       if (gpio->set2.mode)
+               outl(*((u32 *)gpio->set2.mode), gpiobase + GPIO_USE_SEL2);
+       if (gpio->set2.direction)
+               outl(*((u32 *)gpio->set2.direction), gpiobase + GP_IO_SEL2);
+       if (gpio->set2.reset)
+               outl(*((u32 *)gpio->set2.reset), gpiobase + GP_RST_SEL2);
+
+       /* GPIO Set 3 */
+       if (gpio->set3.level)
+               outl(*((u32 *)gpio->set3.level), gpiobase + GP_LVL3);
+       if (gpio->set3.mode)
+               outl(*((u32 *)gpio->set3.mode), gpiobase + GPIO_USE_SEL3);
+       if (gpio->set3.direction)
+               outl(*((u32 *)gpio->set3.direction), gpiobase + GP_IO_SEL3);
+       if (gpio->set3.reset)
+               outl(*((u32 *)gpio->set3.reset), gpiobase + GP_RST_SEL3);
+}
+
+/* TODO: Move this to device tree, or platform data */
+void ich_gpio_set_gpio_map(const struct pch_gpio_map *map)
+{
+       gd->arch.gpio_map = map;
+}
+#endif /* SUPPORT_GPIO_SETUP */
+
 static int gpio_ich6_ofdata_to_platdata(struct udevice *dev)
 {
        struct ich6_bank_platdata *plat = dev_get_platdata(dev);
@@ -60,13 +112,13 @@ static int gpio_ich6_ofdata_to_platdata(struct udevice *dev)
        pci_dev = PCI_BDF(0, 0x1f, 0);
 
        /* Is the device present? */
-       pci_read_config_word(pci_dev, PCI_VENDOR_ID, &tmpword);
+       tmpword = pci_read_config16(pci_dev, PCI_VENDOR_ID);
        if (tmpword != PCI_VENDOR_ID_INTEL) {
                debug("%s: wrong VendorID\n", __func__);
                return -ENODEV;
        }
 
-       pci_read_config_word(pci_dev, PCI_DEVICE_ID, &tmpword);
+       tmpword = pci_read_config16(pci_dev, PCI_DEVICE_ID);
        debug("Found %04x:%04x\n", PCI_VENDOR_ID_INTEL, tmpword);
        /*
         * We'd like to validate the Device ID too, but pretty much any
@@ -76,34 +128,34 @@ static int gpio_ich6_ofdata_to_platdata(struct udevice *dev)
         */
 
        /* I/O should already be enabled (it's a RO bit). */
-       pci_read_config_word(pci_dev, PCI_COMMAND, &tmpword);
+       tmpword = pci_read_config16(pci_dev, PCI_COMMAND);
        if (!(tmpword & PCI_COMMAND_IO)) {
                debug("%s: device IO not enabled\n", __func__);
                return -ENODEV;
        }
 
        /* Header Type must be normal (bits 6-0 only; see spec.) */
-       pci_read_config_byte(pci_dev, PCI_HEADER_TYPE, &tmpbyte);
+       tmpbyte = pci_read_config8(pci_dev, PCI_HEADER_TYPE);
        if ((tmpbyte & 0x7f) != PCI_HEADER_TYPE_NORMAL) {
                debug("%s: invalid Header type\n", __func__);
                return -ENODEV;
        }
 
        /* Base Class must be a bridge device */
-       pci_read_config_byte(pci_dev, PCI_CLASS_CODE, &tmpbyte);
+       tmpbyte = pci_read_config8(pci_dev, PCI_CLASS_CODE);
        if (tmpbyte != PCI_CLASS_CODE_BRIDGE) {
                debug("%s: invalid class\n", __func__);
                return -ENODEV;
        }
        /* Sub Class must be ISA */
-       pci_read_config_byte(pci_dev, PCI_CLASS_SUB_CODE, &tmpbyte);
+       tmpbyte = pci_read_config8(pci_dev, PCI_CLASS_SUB_CODE);
        if (tmpbyte != PCI_CLASS_SUB_CODE_BRIDGE_ISA) {
                debug("%s: invalid subclass\n", __func__);
                return -ENODEV;
        }
 
        /* Programming Interface must be 0x00 (no others exist) */
-       pci_read_config_byte(pci_dev, PCI_CLASS_PROG, &tmpbyte);
+       tmpbyte = pci_read_config8(pci_dev, PCI_CLASS_PROG);
        if (tmpbyte != 0x00) {
                debug("%s: invalid interface type\n", __func__);
                return -ENODEV;
@@ -114,7 +166,7 @@ static int gpio_ich6_ofdata_to_platdata(struct udevice *dev)
         * that it was unused (or undocumented). Check that it looks
         * okay: not all ones or zeros, and mapped to I/O space (bit 0).
         */
-       pci_read_config_dword(pci_dev, PCI_CFG_GPIOBASE, &tmplong);
+       tmplong = pci_read_config32(pci_dev, PCI_CFG_GPIOBASE);
        if (tmplong == 0x00000000 || tmplong == 0xffffffff ||
            !(tmplong & 0x00000001)) {
                debug("%s: unexpected GPIOBASE value\n", __func__);
@@ -140,12 +192,18 @@ static int gpio_ich6_ofdata_to_platdata(struct udevice *dev)
        return 0;
 }
 
-int ich6_gpio_probe(struct udevice *dev)
+static int ich6_gpio_probe(struct udevice *dev)
 {
        struct ich6_bank_platdata *plat = dev_get_platdata(dev);
        struct gpio_dev_priv *uc_priv = dev->uclass_priv;
        struct ich6_bank_priv *bank = dev_get_priv(dev);
 
+#ifdef SUPPORT_GPIO_SETUP
+       if (gd->arch.gpio_map) {
+               setup_pch_gpios(gd->arch.gpio_map);
+               gd->arch.gpio_map = NULL;
+       }
+#endif
        uc_priv->gpio_count = GPIO_PER_BANK;
        uc_priv->bank_name = plat->bank_name;
        bank->use_sel = plat->base_addr;
@@ -155,7 +213,8 @@ int ich6_gpio_probe(struct udevice *dev)
        return 0;
 }
 
-int ich6_gpio_request(struct udevice *dev, unsigned offset, const char *label)
+static int ich6_gpio_request(struct udevice *dev, unsigned offset,
+                            const char *label)
 {
        struct ich6_bank_priv *bank = dev_get_priv(dev);
        u32 tmplong;
index 7bb1702bba283aa5b58000e12a4a3187a909137e..ff7f25a0ef7cdf2ce46cecc7954e654bc0d0d853 100644 (file)
@@ -127,7 +127,7 @@ static const struct {
 static unsigned int set_i2c_bus_speed(const struct fsl_i2c *dev,
        unsigned int i2c_clk, unsigned int speed)
 {
-       unsigned short divider = min(i2c_clk / speed, (unsigned short) -1);
+       unsigned short divider = min(i2c_clk / speed, (unsigned int)USHRT_MAX);
 
        /*
         * We want to choose an FDR/DFSR that generates an I2C bus speed that
index e403664bb561755184c60e9020e028b84169d40f..e6dba298b1e9f2a37b31b4511cf9c8902c9ff227 100644 (file)
@@ -143,7 +143,7 @@ int cros_ec_spi_command(struct cros_ec_dev *dev, uint8_t cmd, int cmd_version,
                return -1;
        }
 
-       len = min(p[1], din_len);
+       len = min((int)p[1], din_len);
        cros_ec_dump_data("in", -1, p, len + 3);
 
        /* Response code is first byte of message */
index 3de1245699626aa4429dba9462ef398ef77bd63c..89737af9b73c417c61d55b5712d8c46f8b1ead4c 100644 (file)
@@ -122,8 +122,8 @@ static void set_timing(struct ocotp_regs *regs)
        relax = DIV_ROUND_UP(ipg_clk * BV_TIMING_RELAX_NS, 1000000000) - 1;
        strobe_read = DIV_ROUND_UP(ipg_clk * BV_TIMING_STROBE_READ_NS,
                                        1000000000) + 2 * (relax + 1) - 1;
-       strobe_prog = DIV_ROUND(ipg_clk * BV_TIMING_STROBE_PROG_US, 1000000) +
-                       2 * (relax + 1) - 1;
+       strobe_prog = DIV_ROUND_CLOSEST(ipg_clk * BV_TIMING_STROBE_PROG_US,
+                                               1000000) + 2 * (relax + 1) - 1;
 
        timing = BF(strobe_read, TIMING_STROBE_READ) |
                        BF(relax, TIMING_RELAX) |
index 26406072482f202a8ca6e2fa6cd8a54c87fbea4c..90b8ed01ccb033aba79a0a5cd1357a1fa2a40884 100644 (file)
@@ -610,7 +610,7 @@ int fsl_esdhc_initialize(bd_t *bis, struct fsl_esdhc_cfg *cfg)
 #endif
 
        cfg->cfg.f_min = 400000;
-       cfg->cfg.f_max = min(gd->arch.sdhc_clk, 52000000);
+       cfg->cfg.f_max = min(gd->arch.sdhc_clk, (u32)52000000);
 
        cfg->cfg.b_max = CONFIG_SYS_MMC_MAX_BLK_COUNT;
 
index 1f297571e563c7c69bf653f574c890ea916ac69b..25ab0b1fc8e19b5d8213b835e3cb438f6042d2dd 100644 (file)
@@ -197,7 +197,7 @@ static int pxa_mmc_do_read_xfer(struct mmc *mmc, struct mmc_data *data)
        while (len) {
                /* The controller has data ready */
                if (readl(&regs->i_reg) & MMC_I_REG_RXFIFO_RD_REQ) {
-                       size = min(len, PXAMMC_FIFO_SIZE);
+                       size = min(len, (uint32_t)PXAMMC_FIFO_SIZE);
                        len -= size;
                        size /= 4;
 
@@ -233,14 +233,14 @@ static int pxa_mmc_do_write_xfer(struct mmc *mmc, struct mmc_data *data)
        while (len) {
                /* The controller is ready to receive data */
                if (readl(&regs->i_reg) & MMC_I_REG_TXFIFO_WR_REQ) {
-                       size = min(len, PXAMMC_FIFO_SIZE);
+                       size = min(len, (uint32_t)PXAMMC_FIFO_SIZE);
                        len -= size;
                        size /= 4;
 
                        while (size--)
                                writel(*buf++, &regs->txfifo);
 
-                       if (min(len, PXAMMC_FIFO_SIZE) < 32)
+                       if (min(len, (uint32_t)PXAMMC_FIFO_SIZE) < 32)
                                writel(MMC_PRTBUF_BUF_PART_FULL, &regs->prtbuf);
                }
 
index 65fdde8a65290eeb062f479a10ae26449d55703a..e98f537c2c36fa1d8035b4cfbc91ed2c6c0a98ee 100644 (file)
@@ -203,7 +203,7 @@ int nand_spl_load_image(uint32_t offs, unsigned int size, void *dst)
                        if (ret < 0)
                                return ret;
 
-                       readlen = min(page_size - column, size);
+                       readlen = min(page_size - column, (int)size);
                        memcpy(dst, page_buffer, readlen);
 
                        column = 0;
index c6a5c4b0de53e1fa5cbf3e08cb8249089fbd1f5e..3024b988fef904884f4d6e4920d98859714f115c 100644 (file)
@@ -315,7 +315,7 @@ int sandbox_erase_part(struct sandbox_spi_flash *sbsf, int size)
        int ret;
 
        while (size > 0) {
-               todo = min(size, sizeof(sandbox_sf_0xff));
+               todo = min(size, (int)sizeof(sandbox_sf_0xff));
                ret = os_write(sbsf->fd, sandbox_sf_0xff, todo);
                if (ret != todo)
                        return ret;
index 85cf22d42ecd08761a149639ddbc2dda47ea590a..759231f2e34b6d66f55ac38e25a85c179cd50732 100644 (file)
@@ -313,10 +313,11 @@ int spi_flash_cmd_write_ops(struct spi_flash *flash, u32 offset,
                        return ret;
 #endif
                byte_addr = offset % page_size;
-               chunk_len = min(len - actual, page_size - byte_addr);
+               chunk_len = min(len - actual, (size_t)(page_size - byte_addr));
 
                if (flash->spi->max_write_size)
-                       chunk_len = min(chunk_len, flash->spi->max_write_size);
+                       chunk_len = min(chunk_len,
+                                       (size_t)flash->spi->max_write_size);
 
                spi_flash_addr(write_addr, cmd);
 
index 623f7492c753652a8f0736658965756bd2e82438..677c89f0486f2a19f334db02b45a58a443b3e2da 100644 (file)
@@ -256,7 +256,7 @@ static void nc_puts(struct stdio_dev *dev, const char *s)
 
        len = strlen(s);
        while (len) {
-               int send_len = min(len, sizeof(input_buffer));
+               int send_len = min(len, (int)sizeof(input_buffer));
                nc_send_packet(s, send_len);
                len -= send_len;
                s += send_len;
index 60c333e2c0191d5ef8753075669a7edc3af95532..7ee21d1c1d1d039c734a64f635e0c8236569b422 100644 (file)
@@ -195,6 +195,9 @@ pci_dev_t pci_find_devices(struct pci_device_id *ids, int index)
                             bdf < PCI_BDF(bus + 1, 0, 0);
 #endif
                             bdf += PCI_BDF(0, 0, 1)) {
+                               if (pci_skip_dev(hose, bdf))
+                                       continue;
+
                                if (!PCI_FUNC(bdf)) {
                                        pci_read_config_byte(bdf,
                                                             PCI_HEADER_TYPE,
@@ -662,13 +665,15 @@ int pci_hose_scan_bus(struct pci_controller *hose, int bus)
 #endif
 
 #ifdef CONFIG_PCI_PNP
-               sub_bus = max(pciauto_config_device(hose, dev), sub_bus);
+               sub_bus = max((unsigned int)pciauto_config_device(hose, dev),
+                             sub_bus);
 #else
                cfg = pci_find_config(hose, class, vendor, device,
                                      PCI_BUS(dev), PCI_DEV(dev), PCI_FUNC(dev));
                if (cfg) {
                        cfg->config_device(hose, dev, cfg);
-                       sub_bus = max(sub_bus, hose->current_busno);
+                       sub_bus = max(sub_bus,
+                                     (unsigned int)hose->current_busno);
                }
 #endif
 
index 86ba6b523c11da2f7eb5ed47fe31b7798d1f59d1..44470fa812b0ed42ca475bb27262d1b7be0fb733 100644 (file)
@@ -387,7 +387,7 @@ int pciauto_config_device(struct pci_controller *hose, pci_dev_t dev)
                n = pci_hose_scan_bus(hose, hose->current_busno);
 
                /* figure out the deepest we've gone for this leg */
-               sub_bus = max(n, sub_bus);
+               sub_bus = max((unsigned int)n, sub_bus);
                pciauto_postscan_setup_bridge(hose, dev, sub_bus);
 
                sub_bus = hose->current_busno;
index cd5324cfa3b398b4fe3d6ccf4d8984d900777d56..b09053f1402bdf55aa3c89abea593ab0bd82d2dd 100644 (file)
@@ -20,9 +20,6 @@
 
 DECLARE_GLOBAL_DATA_PTR;
 
-/* The currently-selected console serial device */
-struct udevice *cur_dev __attribute__ ((section(".data")));
-
 /*
  * Table with supported baudrates (defined in config_xyz.h)
  */
@@ -34,6 +31,8 @@ static const unsigned long baudrate_table[] = CONFIG_SYS_BAUDRATE_TABLE;
 
 static void serial_find_console_or_panic(void)
 {
+       struct udevice *dev;
+
 #ifdef CONFIG_OF_CONTROL
        int node;
 
@@ -41,18 +40,21 @@ static void serial_find_console_or_panic(void)
        node = fdtdec_get_chosen_node(gd->fdt_blob, "stdout-path");
        if (node < 0)
                node = fdtdec_get_alias_node(gd->fdt_blob, "console");
-       if (!uclass_get_device_by_of_offset(UCLASS_SERIAL, node, &cur_dev))
+       if (!uclass_get_device_by_of_offset(UCLASS_SERIAL, node, &dev)) {
+               gd->cur_serial_dev = dev;
                return;
+       }
 
        /*
         * If the console is not marked to be bound before relocation, bind
         * it anyway.
         */
        if (node > 0 &&
-           !lists_bind_fdt(gd->dm_root, gd->fdt_blob, node, &cur_dev)) {
-               if (!device_probe(cur_dev))
+           !lists_bind_fdt(gd->dm_root, gd->fdt_blob, node, &dev)) {
+               if (!device_probe(dev)) {
+                       gd->cur_serial_dev = dev;
                        return;
-               cur_dev = NULL;
+               }
        }
 #endif
        /*
@@ -67,11 +69,12 @@ static void serial_find_console_or_panic(void)
 #else
 #define INDEX 0
 #endif
-       if (uclass_get_device_by_seq(UCLASS_SERIAL, INDEX, &cur_dev) &&
-           uclass_get_device(UCLASS_SERIAL, INDEX, &cur_dev) &&
-           (uclass_first_device(UCLASS_SERIAL, &cur_dev) || !cur_dev))
+       if (uclass_get_device_by_seq(UCLASS_SERIAL, INDEX, &dev) &&
+           uclass_get_device(UCLASS_SERIAL, INDEX, &dev) &&
+           (uclass_first_device(UCLASS_SERIAL, &dev) || !dev))
                panic("No serial driver found");
 #undef INDEX
+       gd->cur_serial_dev = dev;
 }
 
 /* Called prior to relocation */
@@ -133,30 +136,30 @@ static int _serial_tstc(struct udevice *dev)
 
 void serial_putc(char ch)
 {
-       _serial_putc(cur_dev, ch);
+       _serial_putc(gd->cur_serial_dev, ch);
 }
 
 void serial_puts(const char *str)
 {
-       _serial_puts(cur_dev, str);
+       _serial_puts(gd->cur_serial_dev, str);
 }
 
 int serial_getc(void)
 {
-       return _serial_getc(cur_dev);
+       return _serial_getc(gd->cur_serial_dev);
 }
 
 int serial_tstc(void)
 {
-       return _serial_tstc(cur_dev);
+       return _serial_tstc(gd->cur_serial_dev);
 }
 
 void serial_setbrg(void)
 {
-       struct dm_serial_ops *ops = serial_get_ops(cur_dev);
+       struct dm_serial_ops *ops = serial_get_ops(gd->cur_serial_dev);
 
        if (ops->setbrg)
-               ops->setbrg(cur_dev, gd->baudrate);
+               ops->setbrg(gd->cur_serial_dev, gd->baudrate);
 }
 
 void serial_stdio_init(void)
index 7fb0b92078d327782e18f2004ea12b6808f35f91..75f0ec31bbfb9a6faedeaf9cf137ea1212ceefd5 100644 (file)
@@ -882,7 +882,7 @@ static int write_buffer (circbuf_t * buf)
                        space_avail =
                                current_urb->buffer_length -
                                current_urb->actual_length;
-                       popnum = min(space_avail, buf->size);
+                       popnum = min(space_avail, (int)buf->size);
                        if (popnum == 0)
                                break;
 
index ae0fe58f2c06400e2cebfbd3b9bc680354ae99be..375dc07f5f47f521d51544dd337a058873809a59 100644 (file)
@@ -273,7 +273,7 @@ int spi_xfer(struct spi_slave *slave, unsigned int bitlen, const void *data_out,
                        spi_cs_deactivate(slave);
                        return 0;
                }
-               buf_len = 2 * cmd_len + min(data_len, max_tran_len);
+               buf_len = 2 * cmd_len + min(data_len, (size_t)max_tran_len);
                len = cmd_len + data_len;
                rx_offset = cmd_len;
                buffer = (unsigned char *)malloc(buf_len);
@@ -306,7 +306,7 @@ int spi_xfer(struct spi_slave *slave, unsigned int bitlen, const void *data_out,
                if (data_in)
                        din = buffer + rx_offset;
                dout = buffer;
-               tran_len = min(data_len , max_tran_len);
+               tran_len = min(data_len, (size_t)max_tran_len);
                num_blks = DIV_ROUND_UP(tran_len + cmd_len, 4);
                num_bytes = (tran_len + cmd_len) % 4;
                fsl->data_len = tran_len + cmd_len;
index 23f2ba6223dce6d089ac6af3ac153b19d4e79844..08815994fe5d21d0effd00394cea05ce6698508c 100644 (file)
@@ -315,7 +315,7 @@ int spi_xchg_single(struct spi_slave *slave, unsigned int bitlen,
                tmp = reg_read(&regs->rxdata);
                data = cpu_to_be32(tmp);
                debug("SPI Rx: 0x%x 0x%x\n", tmp, data);
-               cnt = min(nbytes, sizeof(data));
+               cnt = min_t(u32, nbytes, sizeof(data));
                if (din) {
                        memcpy(din, &data, cnt);
                        din += cnt;
index 64eb1f6b36980f76829675f520d923ea0d2d8b44..7a57bceb260f1c3e79fc9ed4d735f1b27c45160b 100644 (file)
@@ -57,7 +57,7 @@ int spi_claim_bus(struct spi_slave *slave)
        speed = slave->max_hz;
        if (spi->max_hz) {
                if (speed)
-                       speed = min(speed, spi->max_hz);
+                       speed = min(speed, (int)spi->max_hz);
                else
                        speed = spi->max_hz;
        }
index eecf18cbf920ebe7721bea11178b5dbf5068b095..d09f8cee05b0940ea32c7707e5aeb4a1e6d2e90e 100644 (file)
@@ -274,7 +274,7 @@ static u32 tis_senddata(const u8 * const data, u32 len)
                 * changes to zero exactly after the last byte is fed into the
                 * FIFO.
                 */
-               count = min(burst, len - offset - 1);
+               count = min((u32)burst, len - offset - 1);
                while (count--)
                        tpm_write_byte(data[offset++],
                                  &lpc_tpm_dev[locality].data);
index 7bd25629c8ca5124b009df2b06dd423334ed7898..a4c5606527a824bca5f53a5c7514d38e2d530f8b 100644 (file)
@@ -743,8 +743,8 @@ composite_setup(struct usb_gadget *gadget, const struct usb_ctrlrequest *ctrl)
                        if (!gadget_is_dualspeed(gadget))
                                break;
                        device_qual(cdev);
-                       value = min(w_length,
-                               sizeof(struct usb_qualifier_descriptor));
+                       value = min_t(int, w_length,
+                                     sizeof(struct usb_qualifier_descriptor));
                        break;
                case USB_DT_OTHER_SPEED_CONFIG:
                        if (!gadget_is_dualspeed(gadget))
index 3559400b284778d838f20cedc9043a29767e26c6..0db7a3b6c15566b65b4d7260603a30c59284b43f 100644 (file)
@@ -269,8 +269,8 @@ static void dw_write_noniso_tx_fifo(struct usb_endpoint_instance
                UDCDBGA("urb->buffer %p, buffer_length %d, actual_length %d",
                        urb->buffer, urb->buffer_length, urb->actual_length);
 
-               last = min(urb->actual_length - endpoint->sent,
-                          endpoint->tx_packetSize);
+               last = min_t(u32, urb->actual_length - endpoint->sent,
+                            endpoint->tx_packetSize);
 
                if (last) {
                        u8 *cp = urb->buffer + endpoint->sent;
index efd5c7fda146177cb521dd819fcae332679a60bb..942355528084b0022c475b5e35d3b136f6957e2c 100644 (file)
@@ -65,7 +65,8 @@ static int udc_write_urb(struct usb_endpoint_instance *endpoint)
        if (!urb || !urb->actual_length)
                return -1;
 
-       n = min(urb->actual_length - endpoint->sent, endpoint->tx_packetSize);
+       n = min_t(unsigned int, urb->actual_length - endpoint->sent,
+                 endpoint->tx_packetSize);
        if (n <= 0)
                return -1;
 
index 9c54b462c4ee5bb681832796c11395732df28500..7e7a2c2d906d73ec7f9a4753e9731955c191c2f9 100644 (file)
@@ -97,8 +97,8 @@ static int setdma_rx(struct s3c_ep *ep, struct s3c_request *req)
        u32 ep_num = ep_index(ep);
 
        buf = req->req.buf + req->req.actual;
-       length = min(req->req.length - req->req.actual,
-                    ep_num ? DMA_BUFFER_SIZE : ep->ep.maxpacket);
+       length = min_t(u32, req->req.length - req->req.actual,
+                      ep_num ? DMA_BUFFER_SIZE : ep->ep.maxpacket);
 
        ep->len = length;
        ep->dma_buf = buf;
index 2a5bbf5ac0e9be839f19a7cb7149927e0e9a1f30..e8142ac0922f1974c2b36c00de24eaa223d11215 100644 (file)
@@ -503,23 +503,23 @@ static int dwc_otg_submit_rh_msg_in_descriptor(struct usb_device *dev,
        case 0:
                switch (wValue & 0xff00) {
                case 0x0100:    /* device descriptor */
-                       len = min3(txlen, sizeof(root_hub_dev_des), wLength);
+                       len = min3(txlen, (int)sizeof(root_hub_dev_des), (int)wLength);
                        memcpy(buffer, root_hub_dev_des, len);
                        break;
                case 0x0200:    /* configuration descriptor */
-                       len = min3(txlen, sizeof(root_hub_config_des), wLength);
+                       len = min3(txlen, (int)sizeof(root_hub_config_des), (int)wLength);
                        memcpy(buffer, root_hub_config_des, len);
                        break;
                case 0x0300:    /* string descriptors */
                        switch (wValue & 0xff) {
                        case 0x00:
-                               len = min3(txlen, sizeof(root_hub_str_index0),
-                                          wLength);
+                               len = min3(txlen, (int)sizeof(root_hub_str_index0),
+                                          (int)wLength);
                                memcpy(buffer, root_hub_str_index0, len);
                                break;
                        case 0x01:
-                               len = min3(txlen, sizeof(root_hub_str_index1),
-                                          wLength);
+                               len = min3(txlen, (int)sizeof(root_hub_str_index1),
+                                          (int)wLength);
                                memcpy(buffer, root_hub_str_index1, len);
                                break;
                        }
@@ -556,7 +556,7 @@ static int dwc_otg_submit_rh_msg_in_descriptor(struct usb_device *dev,
                        data[10] = data[9];
                }
 
-               len = min3(txlen, data[0], wLength);
+               len = min3(txlen, (int)data[0], (int)wLength);
                memcpy(buffer, data, len);
                break;
        default:
index c671c72cb1cfc014a00b47b8b7ad38c1a52e5b0f..5520805af37a1c99b84843535d10b7e78496b452 100644 (file)
@@ -910,7 +910,7 @@ ehci_submit_root(struct usb_device *dev, unsigned long pipe, void *buffer,
        }
 
        mdelay(1);
-       len = min3(srclen, le16_to_cpu(req->length), length);
+       len = min3(srclen, (int)le16_to_cpu(req->length), length);
        if (srcptr != NULL && len > 0)
                memcpy(buffer, srcptr, len);
        else
index 46e4cee1d04c9dd3af28bdaa09b121f11e056719..0556f328e459b7d23b95b20a260b56c0a74ad33a 100644 (file)
@@ -103,12 +103,6 @@ static int rh_devnum;              /* address of Root Hub endpoint */
 
 /* ------------------------------------------------------------------------- */
 
-#define ALIGN(x,a)     (((x)+(a)-1UL)&~((a)-1UL))
-#define min_t(type,x,y)        \
-       ({ type __x = (x); type __y = (y); __x < __y ? __x : __y; })
-
-/* ------------------------------------------------------------------------- */
-
 static int isp116x_reset(struct isp116x *isp116x);
 
 /* --- Debugging functions ------------------------------------------------- */
index dc0a4e31796356d818aa959acf52bf49ee002eae..97a7edeb53998713985a626faac565779d89b985 100644 (file)
@@ -47,7 +47,7 @@
 #include <asm/arch/hardware.h> /* needed for AT91_USB_HOST_BASE */
 #endif
 
-#if defined(CONFIG_ARM920T) || \
+#if defined(CONFIG_CPU_ARM920T) || \
     defined(CONFIG_S3C24X0) || \
     defined(CONFIG_440EP) || \
     defined(CONFIG_PCI_OHCI) || \
@@ -65,9 +65,6 @@
 #define OHCI_CONTROL_INIT \
        (OHCI_CTRL_CBSR & 0x3) | OHCI_CTRL_IE | OHCI_CTRL_PLE
 
-#define min_t(type, x, y) \
-                   ({ type __x = (x); type __y = (y); __x < __y ? __x: __y; })
-
 #ifdef CONFIG_PCI_OHCI
 static struct pci_device_id ohci_pci_ids[] = {
        {0x10b9, 0x5237},       /* ULI1575 PCI OHCI module ids */
index 3c659c60c97a5893309c3861ff75a06d1aefa2a8..8bb2275c09473a6e9a8e15486ea44e9849d05633 100644 (file)
@@ -35,9 +35,6 @@
 #define        OHCI_CONTROL_INIT \
        (OHCI_CTRL_CBSR & 0x3) | OHCI_CTRL_IE | OHCI_CTRL_PLE
 
-#define min_t(type, x, y) \
-       ({ type __x = (x); type __y = (y); __x < __y ? __x : __y; })
-
 #undef DEBUG
 #ifdef DEBUG
 #define dbg(format, arg...) printf("DEBUG: " format "\n", ## arg)
index 511454479b109d3f303116e910b6d6722582d0bf..6f33456c90d0130fe6be40e2265bf21954a6e050 100644 (file)
@@ -550,9 +550,6 @@ static int check_usb_device_connecting(struct r8a66597 *r8a66597)
        return -1;      /* fail */
 }
 
-/* based on usb_ohci.c */
-#define min_t(type, x, y) \
-               ({ type __x = (x); type __y = (y); __x < __y ? __x : __y; })
 /*-------------------------------------------------------------------------*
  * Virtual Root Hub
  *-------------------------------------------------------------------------*/
index 19c3ec62118d95c77957679de5cca93368ab24a3..b5aade988d484691d61065de2af4040e8739ed53 100644 (file)
@@ -511,7 +511,7 @@ static void record_transfer_result(struct usb_device *udev,
                                   union xhci_trb *event, int length)
 {
        udev->act_len = min(length, length -
-               EVENT_TRB_LEN(le32_to_cpu(event->trans_event.transfer_len)));
+               (int)EVENT_TRB_LEN(le32_to_cpu(event->trans_event.transfer_len)));
 
        switch (GET_COMP_CODE(le32_to_cpu(event->trans_event.transfer_len))) {
        case COMP_SUCCESS:
index 59dc096b0c3200c14c6cc39e9465c9af8e4b7578..87f2972cb266593fd6001c6be8aa9aefa37cfd97 100644 (file)
@@ -829,7 +829,7 @@ static int xhci_submit_root(struct usb_device *udev, unsigned long pipe,
        debug("scrlen = %d\n req->length = %d\n",
                srclen, le16_to_cpu(req->length));
 
-       len = min(srclen, le16_to_cpu(req->length));
+       len = min(srclen, (int)le16_to_cpu(req->length));
 
        if (srcptr != NULL && len > 0)
                memcpy(buffer, srcptr, len);
index 02b9adcbe4efb8d813654741de318b4bc7c31e0d..0c8e75d46c1e0b1a493eefe2807ac9173b874dcc 100644 (file)
@@ -37,9 +37,6 @@ extern unsigned char new[];
        ((readb(&musbr->power) & MUSB_POWER_HSMODE) \
                >> MUSB_POWER_HSMODE_SHIFT)
 
-#define min_t(type, x, y)      \
-       ({ type __x = (x); type __y = (y); __x < __y ? __x : __y; })
-
 /* USB HUB CONSTANTS (not OHCI-specific; see hub.h) */
 
 /* destination of request */
index 38d2eb107ecd15c2d245968da5b920e551842492..618f5d93b6d1df89d090579a02973f317e34f8cf 100644 (file)
 #define DPRINT(x...) do{}while(0)
 #endif
 
-#ifndef min_t
-#define min_t(type,x,y) \
-       ({ type __x = (x); type __y = (y); __x < __y ? __x: __y; })
-#endif
-
 #define MAX_MAPPED_VRAM        (2048*2048*4)
 #define MIN_MAPPED_VRAM        (1024*768*1)
 
index a347e13d7de8fa5fc360524a76afdd85c70cb26e..a653bb4168551b78272f8f4f6ee087d63c7fec4b 100644 (file)
@@ -1541,14 +1541,14 @@ int video_display_bitmap(ulong bmp_image, int x, int y)
 
 #ifdef CONFIG_SPLASH_SCREEN_ALIGN
        if (x == BMP_ALIGN_CENTER)
-               x = max(0, (VIDEO_VISIBLE_COLS - width) / 2);
+               x = max(0, (int)(VIDEO_VISIBLE_COLS - width) / 2);
        else if (x < 0)
-               x = max(0, VIDEO_VISIBLE_COLS - width + x + 1);
+               x = max(0, (int)(VIDEO_VISIBLE_COLS - width + x + 1));
 
        if (y == BMP_ALIGN_CENTER)
-               y = max(0, (VIDEO_VISIBLE_ROWS - height) / 2);
+               y = max(0, (int)(VIDEO_VISIBLE_ROWS - height) / 2);
        else if (y < 0)
-               y = max(0, VIDEO_VISIBLE_ROWS - height + y + 1);
+               y = max(0, (int)(VIDEO_VISIBLE_ROWS - height + y + 1));
 #endif /* CONFIG_SPLASH_SCREEN_ALIGN */
 
        /*
@@ -1874,14 +1874,14 @@ static void plot_logo_or_black(void *screen, int width, int x, int y, int black)
 
 #ifdef CONFIG_SPLASH_SCREEN_ALIGN
        if (x == BMP_ALIGN_CENTER)
-               x = max(0, (VIDEO_VISIBLE_COLS - VIDEO_LOGO_WIDTH) / 2);
+               x = max(0, (int)(VIDEO_VISIBLE_COLS - VIDEO_LOGO_WIDTH) / 2);
        else if (x < 0)
-               x = max(0, VIDEO_VISIBLE_COLS - VIDEO_LOGO_WIDTH + x + 1);
+               x = max(0, (int)(VIDEO_VISIBLE_COLS - VIDEO_LOGO_WIDTH + x + 1));
 
        if (y == BMP_ALIGN_CENTER)
-               y = max(0, (VIDEO_VISIBLE_ROWS - VIDEO_LOGO_HEIGHT) / 2);
+               y = max(0, (int)(VIDEO_VISIBLE_ROWS - VIDEO_LOGO_HEIGHT) / 2);
        else if (y < 0)
-               y = max(0, VIDEO_VISIBLE_ROWS - VIDEO_LOGO_HEIGHT + y + 1);
+               y = max(0, (int)(VIDEO_VISIBLE_ROWS - VIDEO_LOGO_HEIGHT + y + 1));
 #endif /* CONFIG_SPLASH_SCREEN_ALIGN */
 
        dest = (unsigned char *)screen + (y * width  + x) * VIDEO_PIXEL_SIZE;
@@ -2028,7 +2028,7 @@ static void *video_logo(void)
                 * we need to adjust the logo height
                 */
                if (video_logo_ypos == BMP_ALIGN_CENTER)
-                       video_logo_height += max(0, (VIDEO_VISIBLE_ROWS - \
+                       video_logo_height += max(0, (int)(VIDEO_VISIBLE_ROWS -
                                                     VIDEO_LOGO_HEIGHT) / 2);
                else if (video_logo_ypos > 0)
                        video_logo_height += video_logo_ypos;
index e0b513a4efb9f595ccec817bd5cce5c2c7b9ff6b..c77c02cdfce262cdb6910a4746b149f2b9f0d07f 100644 (file)
@@ -73,6 +73,7 @@ int ext4fs_devread(lbaint_t sector, int byte_offset, int byte_len, char *buf)
        debug(" <" LBAFU ", %d, %d>\n", sector, byte_offset, byte_len);
 
        if (byte_offset != 0) {
+               int readlen;
                /* read first part which isn't aligned with start of sector */
                if (ext4fs_block_dev_desc->
                    block_read(ext4fs_block_dev_desc->dev,
@@ -81,13 +82,11 @@ int ext4fs_devread(lbaint_t sector, int byte_offset, int byte_len, char *buf)
                        printf(" ** ext2fs_devread() read error **\n");
                        return 0;
                }
-               memcpy(buf, sec_buf + byte_offset,
-                       min(ext4fs_block_dev_desc->blksz
-                           - byte_offset, byte_len));
-               buf += min(ext4fs_block_dev_desc->blksz
-                          - byte_offset, byte_len);
-               byte_len -= min(ext4fs_block_dev_desc->blksz
-                               - byte_offset, byte_len);
+               readlen = min((int)ext4fs_block_dev_desc->blksz - byte_offset,
+                             byte_len);
+               memcpy(buf, sec_buf + byte_offset, readlen);
+               buf += readlen;
+               byte_len -= readlen;
                sector++;
        }
 
index cccc06a8889c59b780c7378340497d6815151ab2..cab5465b9d4f9e99158dbdc8cd2f704e090c9b4b 100644 (file)
@@ -1892,6 +1892,7 @@ int ext4fs_iterate_dir(struct ext2fs_node *dir, char *name,
 {
        unsigned int fpos = 0;
        int status;
+       loff_t actread;
        struct ext2fs_node *diro = (struct ext2fs_node *) dir;
 
 #ifdef DEBUG
@@ -1909,8 +1910,8 @@ int ext4fs_iterate_dir(struct ext2fs_node *dir, char *name,
 
                status = ext4fs_read_file(diro, fpos,
                                           sizeof(struct ext2_dirent),
-                                          (char *) &dirent);
-               if (status < 1)
+                                          (char *)&dirent, &actread);
+               if (status < 0)
                        return 0;
 
                if (dirent.namelen != 0) {
@@ -1921,8 +1922,9 @@ int ext4fs_iterate_dir(struct ext2fs_node *dir, char *name,
                        status = ext4fs_read_file(diro,
                                                  fpos +
                                                  sizeof(struct ext2_dirent),
-                                                 dirent.namelen, filename);
-                       if (status < 1)
+                                                 dirent.namelen, filename,
+                                                 &actread);
+                       if (status < 0)
                                return 0;
 
                        fdiro = zalloc(sizeof(struct ext2fs_node));
@@ -2004,8 +2006,8 @@ int ext4fs_iterate_dir(struct ext2fs_node *dir, char *name,
                                        printf("< ? > ");
                                        break;
                                }
-                               printf("%10d %s\n",
-                                       __le32_to_cpu(fdiro->inode.size),
+                               printf("%10u %s\n",
+                                      __le32_to_cpu(fdiro->inode.size),
                                        filename);
                        }
                        free(fdiro);
@@ -2020,6 +2022,7 @@ static char *ext4fs_read_symlink(struct ext2fs_node *node)
        char *symlink;
        struct ext2fs_node *diro = node;
        int status;
+       loff_t actread;
 
        if (!diro->inode_read) {
                status = ext4fs_read_inode(diro->data, diro->ino, &diro->inode);
@@ -2036,7 +2039,7 @@ static char *ext4fs_read_symlink(struct ext2fs_node *node)
        } else {
                status = ext4fs_read_file(diro, 0,
                                           __le32_to_cpu(diro->inode.size),
-                                          symlink);
+                                          symlink, &actread);
                if (status == 0) {
                        free(symlink);
                        return 0;
@@ -2170,11 +2173,10 @@ int ext4fs_find_file(const char *path, struct ext2fs_node *rootnode,
        return 1;
 }
 
-int ext4fs_open(const char *filename)
+int ext4fs_open(const char *filename, loff_t *len)
 {
        struct ext2fs_node *fdiro = NULL;
        int status;
-       int len;
 
        if (ext4fs_root == NULL)
                return -1;
@@ -2191,10 +2193,10 @@ int ext4fs_open(const char *filename)
                if (status == 0)
                        goto fail;
        }
-       len = __le32_to_cpu(fdiro->inode.size);
+       *len = __le32_to_cpu(fdiro->inode.size);
        ext4fs_file = fdiro;
 
-       return len;
+       return 0;
 fail:
        ext4fs_free_node(fdiro, &ext4fs_root->diropen);
 
index 5fa1719f2eebdcaf5107690040d909ee56e1e566..48fd2ac51dbb2761f233122ba7c801e946c94ef2 100644 (file)
@@ -50,8 +50,8 @@ static inline void *zalloc(size_t size)
 
 int ext4fs_read_inode(struct ext2_data *data, int ino,
                      struct ext2_inode *inode);
-int ext4fs_read_file(struct ext2fs_node *node, int pos,
-               unsigned int len, char *buf);
+int ext4fs_read_file(struct ext2fs_node *node, loff_t pos, loff_t len,
+                    char *buf, loff_t *actread);
 int ext4fs_find_file(const char *path, struct ext2fs_node *rootnode,
                        struct ext2fs_node **foundnode, int expecttype);
 int ext4fs_iterate_dir(struct ext2fs_node *dir, char *name,
index 648a59672c31eec1fcd0b409a185eb079670004a..f7c52cc4cc1493c81d4a2467a67196a3df6eaf07 100644 (file)
@@ -975,3 +975,35 @@ fail:
 
        return -1;
 }
+
+int ext4_write_file(const char *filename, void *buf, loff_t offset,
+                   loff_t len, loff_t *actwrite)
+{
+       int ret;
+
+       if (offset != 0) {
+               printf("** Cannot support non-zero offset **\n");
+               return -1;
+       }
+
+       /* mount the filesystem */
+       if (!ext4fs_mount(0)) {
+               printf("** Error Bad ext4 partition **\n");
+               goto fail;
+       }
+
+       ret = ext4fs_write(filename, buf, len);
+
+       if (ret) {
+               printf("** Error ext4fs_write() **\n");
+               goto fail;
+       }
+       ext4fs_close();
+
+       return 0;
+
+fail:
+       ext4fs_close();
+
+       return -1;
+}
index cbdc22026deb63a24968cbd3c0078407940bc5a2..943b5bcf35e903382dbc7f928d6577b6874c51c4 100644 (file)
@@ -45,8 +45,8 @@ void ext4fs_free_node(struct ext2fs_node *node, struct ext2fs_node *currroot)
  * Optimized read file API : collects and defers contiguous sector
  * reads into one potentially more efficient larger sequential read action
  */
-int ext4fs_read_file(struct ext2fs_node *node, int pos,
-               unsigned int len, char *buf)
+int ext4fs_read_file(struct ext2fs_node *node, loff_t pos,
+               loff_t len, char *buf, loff_t *actread)
 {
        struct ext_filesystem *fs = get_fs();
        int i;
@@ -150,7 +150,8 @@ int ext4fs_read_file(struct ext2fs_node *node, int pos,
                previous_block_number = -1;
        }
 
-       return len;
+       *actread  = len;
+       return 0;
 }
 
 int ext4fs_ls(const char *dirname)
@@ -176,23 +177,24 @@ int ext4fs_ls(const char *dirname)
 
 int ext4fs_exists(const char *filename)
 {
-       int file_len;
+       loff_t file_len;
+       int ret;
 
-       file_len = ext4fs_open(filename);
-       return file_len >= 0;
+       ret = ext4fs_open(filename, &file_len);
+       return ret == 0;
 }
 
-int ext4fs_size(const char *filename)
+int ext4fs_size(const char *filename, loff_t *size)
 {
-       return ext4fs_open(filename);
+       return ext4fs_open(filename, size);
 }
 
-int ext4fs_read(char *buf, unsigned len)
+int ext4fs_read(char *buf, loff_t len, loff_t *actread)
 {
        if (ext4fs_root == NULL || ext4fs_file == NULL)
                return 0;
 
-       return ext4fs_read_file(ext4fs_file, 0, len, buf);
+       return ext4fs_read_file(ext4fs_file, 0, len, buf, actread);
 }
 
 int ext4fs_probe(block_dev_desc_t *fs_dev_desc,
@@ -208,18 +210,19 @@ int ext4fs_probe(block_dev_desc_t *fs_dev_desc,
        return 0;
 }
 
-int ext4_read_file(const char *filename, void *buf, int offset, int len)
+int ext4_read_file(const char *filename, void *buf, loff_t offset, loff_t len,
+                  loff_t *len_read)
 {
-       int file_len;
-       int len_read;
+       loff_t file_len;
+       int ret;
 
        if (offset != 0) {
                printf("** Cannot support non-zero offset **\n");
                return -1;
        }
 
-       file_len = ext4fs_open(filename);
-       if (file_len < 0) {
+       ret = ext4fs_open(filename, &file_len);
+       if (ret < 0) {
                printf("** File not found %s **\n", filename);
                return -1;
        }
@@ -227,7 +230,20 @@ int ext4_read_file(const char *filename, void *buf, int offset, int len)
        if (len == 0)
                len = file_len;
 
-       len_read = ext4fs_read(buf, len);
+       return ext4fs_read(buf, len, len_read);
+}
 
-       return len_read;
+int ext4fs_uuid(char *uuid_str)
+{
+       if (ext4fs_root == NULL)
+               return -1;
+
+#ifdef CONFIG_LIB_UUID
+       uuid_bin_to_str((unsigned char *)ext4fs_root->sblock.unique_id,
+                       uuid_str, UUID_STR_FORMAT_STD);
+
+       return 0;
+#else
+       return -ENOSYS;
+#endif
 }
index 561921fa2d364e548629fe8152cb953861699b3f..04a51db6d4cd9e278cdf09959af2f86408864278 100644 (file)
@@ -317,32 +317,32 @@ get_cluster(fsdata *mydata, __u32 clustnum, __u8 *buffer, unsigned long size)
 /*
  * Read at most 'maxsize' bytes from 'pos' in the file associated with 'dentptr'
  * into 'buffer'.
- * Return the number of bytes read or -1 on fatal errors.
+ * Update the number of bytes read in *gotsize or return -1 on fatal errors.
  */
 __u8 get_contents_vfatname_block[MAX_CLUSTSIZE]
        __aligned(ARCH_DMA_MINALIGN);
 
-static long
-get_contents(fsdata *mydata, dir_entry *dentptr, unsigned long pos,
-            __u8 *buffer, unsigned long maxsize)
+static int get_contents(fsdata *mydata, dir_entry *dentptr, loff_t pos,
+                       __u8 *buffer, loff_t maxsize, loff_t *gotsize)
 {
-       unsigned long filesize = FAT2CPU32(dentptr->size), gotsize = 0;
+       loff_t filesize = FAT2CPU32(dentptr->size);
        unsigned int bytesperclust = mydata->clust_size * mydata->sect_size;
        __u32 curclust = START(dentptr);
        __u32 endclust, newclust;
-       unsigned long actsize;
+       loff_t actsize;
 
-       debug("Filesize: %ld bytes\n", filesize);
+       *gotsize = 0;
+       debug("Filesize: %llu bytes\n", filesize);
 
        if (pos >= filesize) {
-               debug("Read position past EOF: %lu\n", pos);
-               return gotsize;
+               debug("Read position past EOF: %llu\n", pos);
+               return 0;
        }
 
        if (maxsize > 0 && filesize > pos + maxsize)
                filesize = pos + maxsize;
 
-       debug("%ld bytes\n", filesize);
+       debug("%llu bytes\n", filesize);
 
        actsize = bytesperclust;
 
@@ -352,7 +352,7 @@ get_contents(fsdata *mydata, dir_entry *dentptr, unsigned long pos,
                if (CHECK_CLUST(curclust, mydata->fatsize)) {
                        debug("curclust: 0x%x\n", curclust);
                        debug("Invalid FAT entry\n");
-                       return gotsize;
+                       return 0;
                }
                actsize += bytesperclust;
        }
@@ -364,7 +364,7 @@ get_contents(fsdata *mydata, dir_entry *dentptr, unsigned long pos,
 
        /* align to beginning of next cluster if any */
        if (pos) {
-               actsize = min(filesize, bytesperclust);
+               actsize = min(filesize, (loff_t)bytesperclust);
                if (get_cluster(mydata, curclust, get_contents_vfatname_block,
                                (int)actsize) != 0) {
                        printf("Error reading cluster\n");
@@ -373,16 +373,16 @@ get_contents(fsdata *mydata, dir_entry *dentptr, unsigned long pos,
                filesize -= actsize;
                actsize -= pos;
                memcpy(buffer, get_contents_vfatname_block + pos, actsize);
-               gotsize += actsize;
+               *gotsize += actsize;
                if (!filesize)
-                       return gotsize;
+                       return 0;
                buffer += actsize;
 
                curclust = get_fatent(mydata, curclust);
                if (CHECK_CLUST(curclust, mydata->fatsize)) {
                        debug("curclust: 0x%x\n", curclust);
                        debug("Invalid FAT entry\n");
-                       return gotsize;
+                       return 0;
                }
        }
 
@@ -398,7 +398,7 @@ get_contents(fsdata *mydata, dir_entry *dentptr, unsigned long pos,
                        if (CHECK_CLUST(newclust, mydata->fatsize)) {
                                debug("curclust: 0x%x\n", newclust);
                                debug("Invalid FAT entry\n");
-                               return gotsize;
+                               return 0;
                        }
                        endclust = newclust;
                        actsize += bytesperclust;
@@ -410,14 +410,14 @@ get_contents(fsdata *mydata, dir_entry *dentptr, unsigned long pos,
                        printf("Error reading cluster\n");
                        return -1;
                }
-               gotsize += actsize;
-               return gotsize;
+               *gotsize += actsize;
+               return 0;
 getit:
                if (get_cluster(mydata, curclust, buffer, (int)actsize) != 0) {
                        printf("Error reading cluster\n");
                        return -1;
                }
-               gotsize += (int)actsize;
+               *gotsize += (int)actsize;
                filesize -= actsize;
                buffer += actsize;
 
@@ -425,7 +425,7 @@ getit:
                if (CHECK_CLUST(curclust, mydata->fatsize)) {
                        debug("curclust: 0x%x\n", curclust);
                        printf("Invalid FAT entry\n");
-                       return gotsize;
+                       return 0;
                }
                actsize = bytesperclust;
                endclust = curclust;
@@ -633,8 +633,8 @@ static dir_entry *get_dentfromdir(fsdata *mydata, int startsect,
                                                }
                                                if (doit) {
                                                        if (dirc == ' ') {
-                                                               printf(" %8ld   %s%c\n",
-                                                                       (long)FAT2CPU32(dentptr->size),
+                                                               printf(" %8u   %s%c\n",
+                                                                      FAT2CPU32(dentptr->size),
                                                                        l_name,
                                                                        dirc);
                                                        } else {
@@ -690,8 +690,8 @@ static dir_entry *get_dentfromdir(fsdata *mydata, int startsect,
 
                                if (doit) {
                                        if (dirc == ' ') {
-                                               printf(" %8ld   %s%c\n",
-                                                       (long)FAT2CPU32(dentptr->size),
+                                               printf(" %8u   %s%c\n",
+                                                      FAT2CPU32(dentptr->size),
                                                        s_name, dirc);
                                        } else {
                                                printf("            %s%c\n",
@@ -806,9 +806,8 @@ exit:
 __u8 do_fat_read_at_block[MAX_CLUSTSIZE]
        __aligned(ARCH_DMA_MINALIGN);
 
-long
-do_fat_read_at(const char *filename, unsigned long pos, void *buffer,
-              unsigned long maxsize, int dols, int dogetsize)
+int do_fat_read_at(const char *filename, loff_t pos, void *buffer,
+                  loff_t maxsize, int dols, int dogetsize, loff_t *size)
 {
        char fnamecopy[2048];
        boot_sector bs;
@@ -821,7 +820,7 @@ do_fat_read_at(const char *filename, unsigned long pos, void *buffer,
        __u32 cursect;
        int idx, isdir = 0;
        int files = 0, dirs = 0;
-       long ret = -1;
+       int ret = -1;
        int firsttime;
        __u32 root_cluster = 0;
        int rootdir_size = 0;
@@ -974,8 +973,8 @@ do_fat_read_at(const char *filename, unsigned long pos, void *buffer,
                                                }
                                                if (doit) {
                                                        if (dirc == ' ') {
-                                                               printf(" %8ld   %s%c\n",
-                                                                       (long)FAT2CPU32(dentptr->size),
+                                                               printf(" %8u   %s%c\n",
+                                                                      FAT2CPU32(dentptr->size),
                                                                        l_name,
                                                                        dirc);
                                                        } else {
@@ -1032,8 +1031,8 @@ do_fat_read_at(const char *filename, unsigned long pos, void *buffer,
                                }
                                if (doit) {
                                        if (dirc == ' ') {
-                                               printf(" %8ld   %s%c\n",
-                                                       (long)FAT2CPU32(dentptr->size),
+                                               printf(" %8u   %s%c\n",
+                                                      FAT2CPU32(dentptr->size),
                                                        s_name, dirc);
                                        } else {
                                                printf("            %s%c\n",
@@ -1102,7 +1101,7 @@ do_fat_read_at(const char *filename, unsigned long pos, void *buffer,
                        if (dols == LS_ROOT) {
                                printf("\n%d file(s), %d dir(s)\n\n",
                                       files, dirs);
-                               ret = 0;
+                               *size = 0;
                        }
                        goto exit;
                }
@@ -1141,7 +1140,7 @@ rootdir_done:
                if (get_dentfromdir(mydata, startsect, subname, dentptr,
                                     isdir ? 0 : dols) == NULL) {
                        if (dols && !isdir)
-                               ret = 0;
+                               *size = 0;
                        goto exit;
                }
 
@@ -1152,21 +1151,23 @@ rootdir_done:
                        subname = nextname;
        }
 
-       if (dogetsize)
-               ret = FAT2CPU32(dentptr->size);
-       else
-               ret = get_contents(mydata, dentptr, pos, buffer, maxsize);
-       debug("Size: %d, got: %ld\n", FAT2CPU32(dentptr->size), ret);
+       if (dogetsize) {
+               *size = FAT2CPU32(dentptr->size);
+               ret = 0;
+       } else {
+               ret = get_contents(mydata, dentptr, pos, buffer, maxsize, size);
+       }
+       debug("Size: %u, got: %llu\n", FAT2CPU32(dentptr->size), *size);
 
 exit:
        free(mydata->fatbuf);
        return ret;
 }
 
-long
-do_fat_read(const char *filename, void *buffer, unsigned long maxsize, int dols)
+int do_fat_read(const char *filename, void *buffer, loff_t maxsize, int dols,
+               loff_t *actread)
 {
-       return do_fat_read_at(filename, 0, buffer, maxsize, dols, 0);
+       return do_fat_read_at(filename, 0, buffer, maxsize, dols, 0, actread);
 }
 
 int file_fat_detectfs(void)
@@ -1233,44 +1234,55 @@ int file_fat_detectfs(void)
 
 int file_fat_ls(const char *dir)
 {
-       return do_fat_read(dir, NULL, 0, LS_YES);
+       loff_t size;
+
+       return do_fat_read(dir, NULL, 0, LS_YES, &size);
 }
 
 int fat_exists(const char *filename)
 {
-       int sz;
-       sz = do_fat_read_at(filename, 0, NULL, 0, LS_NO, 1);
-       return sz >= 0;
+       int ret;
+       loff_t size;
+
+       ret = do_fat_read_at(filename, 0, NULL, 0, LS_NO, 1, &size);
+       return ret == 0;
 }
 
-int fat_size(const char *filename)
+int fat_size(const char *filename, loff_t *size)
 {
-       return do_fat_read_at(filename, 0, NULL, 0, LS_NO, 1);
+       return do_fat_read_at(filename, 0, NULL, 0, LS_NO, 1, size);
 }
 
-long file_fat_read_at(const char *filename, unsigned long pos, void *buffer,
-                     unsigned long maxsize)
+int file_fat_read_at(const char *filename, loff_t pos, void *buffer,
+                    loff_t maxsize, loff_t *actread)
 {
        printf("reading %s\n", filename);
-       return do_fat_read_at(filename, pos, buffer, maxsize, LS_NO, 0);
+       return do_fat_read_at(filename, pos, buffer, maxsize, LS_NO, 0,
+                             actread);
 }
 
-long file_fat_read(const char *filename, void *buffer, unsigned long maxsize)
+int file_fat_read(const char *filename, void *buffer, int maxsize)
 {
-       return file_fat_read_at(filename, 0, buffer, maxsize);
+       loff_t actread;
+       int ret;
+
+       ret =  file_fat_read_at(filename, 0, buffer, maxsize, &actread);
+       if (ret)
+               return ret;
+       else
+               return actread;
 }
 
-int fat_read_file(const char *filename, void *buf, int offset, int len)
+int fat_read_file(const char *filename, void *buf, loff_t offset, loff_t len,
+                 loff_t *actread)
 {
-       int len_read;
+       int ret;
 
-       len_read = file_fat_read_at(filename, offset, buf, len);
-       if (len_read == -1) {
+       ret = file_fat_read_at(filename, offset, buf, len, actread);
+       if (ret)
                printf("** Unable to read file %s **\n", filename);
-               return -1;
-       }
 
-       return len_read;
+       return ret;
 }
 
 void fat_close(void)
index 24ed5d371502e651f2c5a3a41b0cb90e1ffc11b2..88dd4959ccde28f0e541dfc31f5fb924988685c1 100644 (file)
@@ -660,24 +660,26 @@ static int clear_fatent(fsdata *mydata, __u32 entry)
 /*
  * Write at most 'maxsize' bytes from 'buffer' into
  * the file associated with 'dentptr'
- * Return the number of bytes read or -1 on fatal errors.
+ * Update the number of bytes written in *gotsize and return 0
+ * or return -1 on fatal errors.
  */
 static int
 set_contents(fsdata *mydata, dir_entry *dentptr, __u8 *buffer,
-             unsigned long maxsize)
+             loff_t maxsize, loff_t *gotsize)
 {
-       unsigned long filesize = FAT2CPU32(dentptr->size), gotsize = 0;
+       loff_t filesize = FAT2CPU32(dentptr->size);
        unsigned int bytesperclust = mydata->clust_size * mydata->sect_size;
        __u32 curclust = START(dentptr);
        __u32 endclust = 0, newclust = 0;
-       unsigned long actsize;
+       loff_t actsize;
 
-       debug("Filesize: %ld bytes\n", filesize);
+       *gotsize = 0;
+       debug("Filesize: %llu bytes\n", filesize);
 
        if (maxsize > 0 && filesize > maxsize)
                filesize = maxsize;
 
-       debug("%ld bytes\n", filesize);
+       debug("%llu bytes\n", filesize);
 
        actsize = bytesperclust;
        endclust = curclust;
@@ -692,7 +694,7 @@ set_contents(fsdata *mydata, dir_entry *dentptr, __u8 *buffer,
                        if (CHECK_CLUST(newclust, mydata->fatsize)) {
                                debug("curclust: 0x%x\n", newclust);
                                debug("Invalid FAT entry\n");
-                               return gotsize;
+                               return 0;
                        }
                        endclust = newclust;
                        actsize += bytesperclust;
@@ -706,7 +708,7 @@ set_contents(fsdata *mydata, dir_entry *dentptr, __u8 *buffer,
                }
 
                /* set remaining bytes */
-               gotsize += (int)actsize;
+               *gotsize += actsize;
                filesize -= actsize;
                buffer += actsize;
                actsize = filesize;
@@ -715,7 +717,7 @@ set_contents(fsdata *mydata, dir_entry *dentptr, __u8 *buffer,
                        debug("error: writing cluster\n");
                        return -1;
                }
-               gotsize += actsize;
+               *gotsize += actsize;
 
                /* Mark end of file in FAT */
                if (mydata->fatsize == 16)
@@ -724,20 +726,20 @@ set_contents(fsdata *mydata, dir_entry *dentptr, __u8 *buffer,
                        newclust = 0xfffffff;
                set_fatent_value(mydata, endclust, newclust);
 
-               return gotsize;
+               return 0;
 getit:
                if (set_cluster(mydata, curclust, buffer, (int)actsize) != 0) {
                        debug("error: writing cluster\n");
                        return -1;
                }
-               gotsize += (int)actsize;
+               *gotsize += actsize;
                filesize -= actsize;
                buffer += actsize;
 
                if (CHECK_CLUST(curclust, mydata->fatsize)) {
                        debug("curclust: 0x%x\n", curclust);
                        debug("Invalid FAT entry\n");
-                       return gotsize;
+                       return 0;
                }
                actsize = bytesperclust;
                curclust = endclust = newclust;
@@ -766,7 +768,7 @@ static void fill_dentry(fsdata *mydata, dir_entry *dentptr,
  * exceed the size of the block device
  * Return -1 when overflow occurs, otherwise return 0
  */
-static int check_overflow(fsdata *mydata, __u32 clustnum, unsigned long size)
+static int check_overflow(fsdata *mydata, __u32 clustnum, loff_t size)
 {
        __u32 startsect, sect_num;
 
@@ -923,8 +925,8 @@ static dir_entry *find_directory_entry(fsdata *mydata, int startsect,
        return NULL;
 }
 
-static int do_fat_write(const char *filename, void *buffer,
-       unsigned long size)
+static int do_fat_write(const char *filename, void *buffer, loff_t size,
+                       loff_t *actwrite)
 {
        dir_entry *dentptr, *retdent;
        __u32 startsect;
@@ -936,8 +938,8 @@ static int do_fat_write(const char *filename, void *buffer,
        int cursect;
        int ret = -1, name_len;
        char l_filename[VFAT_MAXLEN_BYTES];
-       int write_size = size;
 
+       *actwrite = size;
        dir_curclust = 0;
 
        if (read_bootsectandvi(&bs, &volinfo, &mydata->fatsize)) {
@@ -1015,7 +1017,7 @@ static int do_fat_write(const char *filename, void *buffer,
 
                ret = check_overflow(mydata, start_cluster, size);
                if (ret) {
-                       printf("Error: %ld overflow\n", size);
+                       printf("Error: %llu overflow\n", size);
                        goto exit;
                }
 
@@ -1025,13 +1027,12 @@ static int do_fat_write(const char *filename, void *buffer,
                        goto exit;
                }
 
-               ret = set_contents(mydata, retdent, buffer, size);
+               ret = set_contents(mydata, retdent, buffer, size, actwrite);
                if (ret < 0) {
                        printf("Error: writing contents\n");
                        goto exit;
                }
-               write_size = ret;
-               debug("attempt to write 0x%x bytes\n", write_size);
+               debug("attempt to write 0x%llx bytes\n", *actwrite);
 
                /* Flush fat buffer */
                ret = flush_fat_buffer(mydata);
@@ -1061,7 +1062,7 @@ static int do_fat_write(const char *filename, void *buffer,
 
                ret = check_overflow(mydata, start_cluster, size);
                if (ret) {
-                       printf("Error: %ld overflow\n", size);
+                       printf("Error: %llu overflow\n", size);
                        goto exit;
                }
 
@@ -1069,13 +1070,13 @@ static int do_fat_write(const char *filename, void *buffer,
                fill_dentry(mydata, empty_dentptr, filename,
                        start_cluster, size, 0x20);
 
-               ret = set_contents(mydata, empty_dentptr, buffer, size);
+               ret = set_contents(mydata, empty_dentptr, buffer, size,
+                                  actwrite);
                if (ret < 0) {
                        printf("Error: writing contents\n");
                        goto exit;
                }
-               write_size = ret;
-               debug("attempt to write 0x%x bytes\n", write_size);
+               debug("attempt to write 0x%llx bytes\n", *actwrite);
 
                /* Flush fat buffer */
                ret = flush_fat_buffer(mydata);
@@ -1096,11 +1097,17 @@ static int do_fat_write(const char *filename, void *buffer,
 
 exit:
        free(mydata->fatbuf);
-       return ret < 0 ? ret : write_size;
+       return ret;
 }
 
-int file_fat_write(const char *filename, void *buffer, unsigned long maxsize)
+int file_fat_write(const char *filename, void *buffer, loff_t offset,
+                  loff_t maxsize, loff_t *actwrite)
 {
+       if (offset != 0) {
+               printf("Error: non zero offset is currently not suported.\n");
+               return -1;
+       }
+
        printf("writing %s\n", filename);
-       return do_fat_write(filename, buffer, maxsize);
+       return do_fat_write(filename, buffer, maxsize, actwrite);
 }
index d910c46ddb159d5cf43a009f0d9248b5cd9768b2..89706117b9410c1be7363f268881e75640b36b2a 100644 (file)
@@ -162,8 +162,7 @@ file_ls(const char *dir)
        return filesystems[current_filesystem].ls(arg);
 }
 
-long
-file_read(const char *filename, void *buffer, unsigned long maxsize)
+int file_read(const char *filename, void *buffer, int maxsize)
 {
        char fullpath[1024];
        const char *arg;
diff --git a/fs/fs.c b/fs/fs.c
index dd680f39c9ca60472ea91f37a7a325f95da3b672..3da78606d1281f93ebe3108b9a7bd8f6e5f31edc 100644 (file)
--- a/fs/fs.c
+++ b/fs/fs.c
@@ -15,6 +15,7 @@
  */
 
 #include <config.h>
+#include <errno.h>
 #include <common.h>
 #include <part.h>
 #include <ext4fs.h>
@@ -46,19 +47,21 @@ static inline int fs_exists_unsupported(const char *filename)
        return 0;
 }
 
-static inline int fs_size_unsupported(const char *filename)
+static inline int fs_size_unsupported(const char *filename, loff_t *size)
 {
        return -1;
 }
 
 static inline int fs_read_unsupported(const char *filename, void *buf,
-                                     int offset, int len)
+                                     loff_t offset, loff_t len,
+                                     loff_t *actread)
 {
        return -1;
 }
 
 static inline int fs_write_unsupported(const char *filename, void *buf,
-                                     int offset, int len)
+                                     loff_t offset, loff_t len,
+                                     loff_t *actwrite)
 {
        return -1;
 }
@@ -67,6 +70,11 @@ static inline void fs_close_unsupported(void)
 {
 }
 
+static inline int fs_uuid_unsupported(char *uuid_str)
+{
+       return -1;
+}
+
 struct fstype_info {
        int fstype;
        /*
@@ -82,10 +90,13 @@ struct fstype_info {
                     disk_partition_t *fs_partition);
        int (*ls)(const char *dirname);
        int (*exists)(const char *filename);
-       int (*size)(const char *filename);
-       int (*read)(const char *filename, void *buf, int offset, int len);
-       int (*write)(const char *filename, void *buf, int offset, int len);
+       int (*size)(const char *filename, loff_t *size);
+       int (*read)(const char *filename, void *buf, loff_t offset,
+                   loff_t len, loff_t *actread);
+       int (*write)(const char *filename, void *buf, loff_t offset,
+                    loff_t len, loff_t *actwrite);
        void (*close)(void);
+       int (*uuid)(char *uuid_str);
 };
 
 static struct fstype_info fstypes[] = {
@@ -99,7 +110,12 @@ static struct fstype_info fstypes[] = {
                .exists = fat_exists,
                .size = fat_size,
                .read = fat_read_file,
+#ifdef CONFIG_FAT_WRITE
+               .write = file_fat_write,
+#else
                .write = fs_write_unsupported,
+#endif
+               .uuid = fs_uuid_unsupported,
        },
 #endif
 #ifdef CONFIG_FS_EXT4
@@ -112,7 +128,12 @@ static struct fstype_info fstypes[] = {
                .exists = ext4fs_exists,
                .size = ext4fs_size,
                .read = ext4_read_file,
+#ifdef CONFIG_CMD_EXT4_WRITE
+               .write = ext4_write_file,
+#else
                .write = fs_write_unsupported,
+#endif
+               .uuid = ext4fs_uuid,
        },
 #endif
 #ifdef CONFIG_SANDBOX
@@ -126,6 +147,7 @@ static struct fstype_info fstypes[] = {
                .size = sandbox_fs_size,
                .read = fs_read_sandbox,
                .write = fs_write_sandbox,
+               .uuid = fs_uuid_unsupported,
        },
 #endif
        {
@@ -138,6 +160,7 @@ static struct fstype_info fstypes[] = {
                .size = fs_size_unsupported,
                .read = fs_read_unsupported,
                .write = fs_write_unsupported,
+               .uuid = fs_uuid_unsupported,
        },
 };
 
@@ -206,6 +229,13 @@ static void fs_close(void)
        fs_type = FS_TYPE_ANY;
 }
 
+int fs_uuid(char *uuid_str)
+{
+       struct fstype_info *info = fs_get_info(fs_type);
+
+       return info->uuid(uuid_str);
+}
+
 int fs_ls(const char *dirname)
 {
        int ret;
@@ -233,20 +263,21 @@ int fs_exists(const char *filename)
        return ret;
 }
 
-int fs_size(const char *filename)
+int fs_size(const char *filename, loff_t *size)
 {
        int ret;
 
        struct fstype_info *info = fs_get_info(fs_type);
 
-       ret = info->size(filename);
+       ret = info->size(filename, size);
 
        fs_close();
 
        return ret;
 }
 
-int fs_read(const char *filename, ulong addr, int offset, int len)
+int fs_read(const char *filename, ulong addr, loff_t offset, loff_t len,
+           loff_t *actread)
 {
        struct fstype_info *info = fs_get_info(fs_type);
        void *buf;
@@ -257,11 +288,11 @@ int fs_read(const char *filename, ulong addr, int offset, int len)
         * means read the whole file.
         */
        buf = map_sysmem(addr, len);
-       ret = info->read(filename, buf, offset, len);
+       ret = info->read(filename, buf, offset, len, actread);
        unmap_sysmem(buf);
 
        /* If we requested a specific number of bytes, check we got it */
-       if (ret >= 0 && len && ret != len) {
+       if (ret == 0 && len && *actread != len) {
                printf("** Unable to read file %s **\n", filename);
                ret = -1;
        }
@@ -270,17 +301,18 @@ int fs_read(const char *filename, ulong addr, int offset, int len)
        return ret;
 }
 
-int fs_write(const char *filename, ulong addr, int offset, int len)
+int fs_write(const char *filename, ulong addr, loff_t offset, loff_t len,
+            loff_t *actwrite)
 {
        struct fstype_info *info = fs_get_info(fs_type);
        void *buf;
        int ret;
 
        buf = map_sysmem(addr, len);
-       ret = info->write(filename, buf, offset, len);
+       ret = info->write(filename, buf, offset, len, actwrite);
        unmap_sysmem(buf);
 
-       if (ret >= 0 && ret != len) {
+       if (ret < 0 && len != *actwrite) {
                printf("** Unable to write file %s **\n", filename);
                ret = -1;
        }
@@ -292,7 +324,7 @@ int fs_write(const char *filename, ulong addr, int offset, int len)
 int do_size(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[],
                int fstype)
 {
-       int size;
+       loff_t size;
 
        if (argc != 4)
                return CMD_RET_USAGE;
@@ -300,8 +332,7 @@ int do_size(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[],
        if (fs_set_blk_dev(argv[1], argv[2], fstype))
                return 1;
 
-       size = fs_size(argv[3]);
-       if (size < 0)
+       if (fs_size(argv[3], &size) < 0)
                return CMD_RET_FAILURE;
 
        setenv_hex("filesize", size);
@@ -315,9 +346,10 @@ int do_load(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[],
        unsigned long addr;
        const char *addr_str;
        const char *filename;
-       unsigned long bytes;
-       unsigned long pos;
-       int len_read;
+       loff_t bytes;
+       loff_t pos;
+       loff_t len_read;
+       int ret;
        unsigned long time;
        char *ep;
 
@@ -359,12 +391,12 @@ int do_load(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[],
                pos = 0;
 
        time = get_timer(0);
-       len_read = fs_read(filename, addr, pos, bytes);
+       ret = fs_read(filename, addr, pos, bytes, &len_read);
        time = get_timer(time);
-       if (len_read <= 0)
+       if (ret < 0)
                return 1;
 
-       printf("%d bytes read in %lu ms", len_read, time);
+       printf("%llu bytes read in %lu ms", len_read, time);
        if (time > 0) {
                puts(" (");
                print_size(len_read / time * 1000, "/s");
@@ -408,9 +440,10 @@ int do_save(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[],
 {
        unsigned long addr;
        const char *filename;
-       unsigned long bytes;
-       unsigned long pos;
-       int len;
+       loff_t bytes;
+       loff_t pos;
+       loff_t len;
+       int ret;
        unsigned long time;
 
        if (argc < 6 || argc > 7)
@@ -419,8 +452,8 @@ int do_save(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[],
        if (fs_set_blk_dev(argv[1], argv[2], fstype))
                return 1;
 
-       filename = argv[3];
-       addr = simple_strtoul(argv[4], NULL, 16);
+       addr = simple_strtoul(argv[3], NULL, 16);
+       filename = argv[4];
        bytes = simple_strtoul(argv[5], NULL, 16);
        if (argc >= 7)
                pos = simple_strtoul(argv[6], NULL, 16);
@@ -428,12 +461,12 @@ int do_save(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[],
                pos = 0;
 
        time = get_timer(0);
-       len = fs_write(filename, addr, pos, bytes);
+       ret = fs_write(filename, addr, pos, bytes, &len);
        time = get_timer(time);
-       if (len <= 0)
+       if (ret < 0)
                return 1;
 
-       printf("%d bytes written in %lu ms", len, time);
+       printf("%llu bytes written in %lu ms", len, time);
        if (time > 0) {
                puts(" (");
                print_size(len / time * 1000, "/s");
@@ -443,3 +476,28 @@ int do_save(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[],
 
        return 0;
 }
+
+int do_fs_uuid(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[],
+               int fstype)
+{
+       int ret;
+       char uuid[37];
+       memset(uuid, 0, sizeof(uuid));
+
+       if (argc < 3 || argc > 4)
+               return CMD_RET_USAGE;
+
+       if (fs_set_blk_dev(argv[1], argv[2], fstype))
+               return 1;
+
+       ret = fs_uuid(uuid);
+       if (ret)
+               return CMD_RET_FAILURE;
+
+       if (argc == 4)
+               setenv(argv[3], uuid);
+       else
+               printf("%s\n", uuid);
+
+       return CMD_RET_SUCCESS;
+}
index ba6402c81c0a5a16ac10838cf0c5981331e9031c..a920bc087712ff289c65eec948f0f234229f9f5c 100644 (file)
@@ -13,10 +13,10 @@ int sandbox_fs_set_blk_dev(block_dev_desc_t *rbdd, disk_partition_t *info)
        return 0;
 }
 
-long sandbox_fs_read_at(const char *filename, unsigned long pos,
-                            void *buffer, unsigned long maxsize)
+int sandbox_fs_read_at(const char *filename, loff_t pos, void *buffer,
+                      loff_t maxsize, loff_t *actread)
 {
-       ssize_t size;
+       loff_t size;
        int fd, ret;
 
        fd = os_open(filename, OS_O_RDONLY);
@@ -27,16 +27,31 @@ long sandbox_fs_read_at(const char *filename, unsigned long pos,
                os_close(fd);
                return ret;
        }
-       if (!maxsize)
-               maxsize = os_get_filesize(filename);
+       if (!maxsize) {
+               ret = os_get_filesize(filename, &size);
+               if (ret) {
+                       os_close(fd);
+                       return ret;
+               }
+
+               maxsize = size;
+       }
+
        size = os_read(fd, buffer, maxsize);
        os_close(fd);
 
-       return size;
+       if (size < 0) {
+               ret = -1;
+       } else {
+               ret = 0;
+               *actread = size;
+       }
+
+       return ret;
 }
 
-long sandbox_fs_write_at(const char *filename, unsigned long pos,
-                        void *buffer, unsigned long towrite)
+int sandbox_fs_write_at(const char *filename, loff_t pos, void *buffer,
+                       loff_t towrite, loff_t *actwrite)
 {
        ssize_t size;
        int fd, ret;
@@ -52,7 +67,14 @@ long sandbox_fs_write_at(const char *filename, unsigned long pos,
        size = os_write(fd, buffer, towrite);
        os_close(fd);
 
-       return size;
+       if (size == -1) {
+               ret = -1;
+       } else {
+               ret = 0;
+               *actwrite = size;
+       }
+
+       return ret;
 }
 
 int sandbox_fs_ls(const char *dirname)
@@ -74,43 +96,42 @@ int sandbox_fs_ls(const char *dirname)
 
 int sandbox_fs_exists(const char *filename)
 {
-       ssize_t sz;
+       loff_t size;
+       int ret;
 
-       sz = os_get_filesize(filename);
-       return sz >= 0;
+       ret = os_get_filesize(filename, &size);
+       return ret == 0;
 }
 
-int sandbox_fs_size(const char *filename)
+int sandbox_fs_size(const char *filename, loff_t *size)
 {
-       return os_get_filesize(filename);
+       return os_get_filesize(filename, size);
 }
 
 void sandbox_fs_close(void)
 {
 }
 
-int fs_read_sandbox(const char *filename, void *buf, int offset, int len)
+int fs_read_sandbox(const char *filename, void *buf, loff_t offset, loff_t len,
+                   loff_t *actread)
 {
-       int len_read;
+       int ret;
 
-       len_read = sandbox_fs_read_at(filename, offset, buf, len);
-       if (len_read == -1) {
+       ret = sandbox_fs_read_at(filename, offset, buf, len, actread);
+       if (ret)
                printf("** Unable to read file %s **\n", filename);
-               return -1;
-       }
 
-       return len_read;
+       return ret;
 }
 
-int fs_write_sandbox(const char *filename, void *buf, int offset, int len)
+int fs_write_sandbox(const char *filename, void *buf, loff_t offset,
+                    loff_t len, loff_t *actwrite)
 {
-       int len_written;
+       int ret;
 
-       len_written = sandbox_fs_write_at(filename, offset, buf, len);
-       if (len_written == -1) {
+       ret = sandbox_fs_write_at(filename, offset, buf, len, actwrite);
+       if (ret)
                printf("** Unable to write file %s **\n", filename);
-               return -1;
-       }
 
-       return len_written;
+       return ret;
 }
index 0ce2475e0b8e9a9c95650837d20fef9adbc5415b..c12026147fc5635512482a8814abc43e17448d78 100644 (file)
@@ -476,10 +476,6 @@ struct file {
 #define MAX_LFS_FILESIZE       0x7fffffffffffffffUL
 #endif
 
-#define INT_MAX                ((int)(~0U>>1))
-#define INT_MIN                (-INT_MAX - 1)
-#define LLONG_MAX      ((long long)(~0ULL>>1))
-
 /*
  * These are the fs-independent mount-flags: up to 32 flags are supported
  */
index 5e5dc3725a5495c2000396abec32d0e358035683..9c5a1e166f9acf428e709c74f07c6102664b8898 100644 (file)
@@ -91,6 +91,7 @@ typedef struct global_data {
        unsigned long malloc_limit;     /* limit address */
        unsigned long malloc_ptr;       /* current address */
 #endif
+       struct udevice *cur_serial_dev; /* current serial device */
        struct arch_global_data arch;   /* architecture-specific data */
 } gd_t;
 #endif
index f81b51aa301feec3f13dc787c95626c2f84012a8..36a36c64b8a6a19879e5236eb85af2fd5960a43d 100644 (file)
@@ -257,6 +257,15 @@ const char *gpio_get_bank_info(struct udevice *dev, int *offset_count);
 int gpio_lookup_name(const char *name, struct udevice **devp,
                     unsigned int *offsetp, unsigned int *gpiop);
 
-int name_to_gpio(const char *name);
+/**
+ * get_gpios() - Turn the values of a list of GPIOs into an integer
+ *
+ * This puts the value of the first GPIO into bit 0, the second into bit 1,
+ * etc. then returns the resulting integer.
+ *
+ * @gpio_list: List of GPIOs to collect
+ * @return resulting integer value
+ */
+unsigned gpio_get_values_as_int(const int *gpio_list);
 
 #endif /* _ASM_GENERIC_GPIO_H_ */
index ecf7fcaf7b65f2cb98be8ae822474e21628e454e..f1ab2cf5f469a354d1f808212987fa72dc1699a0 100644 (file)
@@ -23,6 +23,7 @@ typedef volatile unsigned char        vu_char;
 #include <linux/stringify.h>
 #include <asm/ptrace.h>
 #include <stdarg.h>
+#include <linux/kernel.h>
 #if defined(CONFIG_PCI) && defined(CONFIG_4xx)
 #include <pci.h>
 #endif
@@ -96,15 +97,19 @@ typedef volatile unsigned char      vu_char;
 #define _DEBUG 0
 #endif
 
+#ifndef pr_fmt
+#define pr_fmt(fmt) fmt
+#endif
+
 /*
  * Output a debug text when condition "cond" is met. The "cond" should be
  * computed by a preprocessor in the best case, allowing for the best
  * optimization.
  */
-#define debug_cond(cond, fmt, args...)         \
-       do {                                    \
-               if (cond)                       \
-                       printf(fmt, ##args);    \
+#define debug_cond(cond, fmt, args...)                 \
+       do {                                            \
+               if (cond)                               \
+                       printf(pr_fmt(fmt), ##args);    \
        } while (0)
 
 #define debug(fmt, args...)                    \
@@ -126,7 +131,7 @@ void __assert_fail(const char *assertion, const char *file, unsigned line,
                __assert_fail(#x, __FILE__, __LINE__, __func__); })
 
 #define error(fmt, args...) do {                                       \
-               printf("ERROR: " fmt "\nat %s:%d/%s()\n",               \
+               printf("ERROR: " pr_fmt(fmt) "\nat %s:%d/%s()\n",       \
                        ##args, __FILE__, __LINE__, __func__);          \
 } while (0)
 
@@ -168,58 +173,6 @@ typedef void (interrupt_handler_t)(void *);
 # endif
 #endif
 
-/*
- * General Purpose Utilities
- */
-#define min(X, Y)                              \
-       ({ typeof(X) __x = (X);                 \
-               typeof(Y) __y = (Y);            \
-               (__x < __y) ? __x : __y; })
-
-#define max(X, Y)                              \
-       ({ typeof(X) __x = (X);                 \
-               typeof(Y) __y = (Y);            \
-               (__x > __y) ? __x : __y; })
-
-#define min3(X, Y, Z)                          \
-       ({ typeof(X) __x = (X);                 \
-               typeof(Y) __y = (Y);            \
-               typeof(Z) __z = (Z);            \
-               __x < __y ? (__x < __z ? __x : __z) :   \
-               (__y < __z ? __y : __z); })
-
-#define max3(X, Y, Z)                          \
-       ({ typeof(X) __x = (X);                 \
-               typeof(Y) __y = (Y);            \
-               typeof(Z) __z = (Z);            \
-               __x > __y ? (__x > __z ? __x : __z) :   \
-               (__y > __z ? __y : __z); })
-
-/*
- * Return the absolute value of a number.
- *
- * This handles unsigned and signed longs, ints, shorts and chars.  For all
- * input types abs() returns a signed long.
- *
- * For 64-bit types, use abs64()
- */
-#define abs(x) ({                                              \
-               long ret;                                       \
-               if (sizeof(x) == sizeof(long)) {                \
-                       long __x = (x);                         \
-                       ret = (__x < 0) ? -__x : __x;           \
-               } else {                                        \
-                       int __x = (x);                          \
-                       ret = (__x < 0) ? -__x : __x;           \
-               }                                               \
-               ret;                                            \
-       })
-
-#define abs64(x) ({                            \
-               s64 __x = (x);                  \
-               (__x < 0) ? -__x : __x;         \
-       })
-
 #if defined(CONFIG_ENV_IS_EMBEDDED)
 #define TOTAL_MALLOC_LEN       CONFIG_SYS_MALLOC_LEN
 #elif ( ((CONFIG_ENV_ADDR+CONFIG_ENV_SIZE) < CONFIG_SYS_MONITOR_BASE) || \
@@ -230,17 +183,6 @@ typedef void (interrupt_handler_t)(void *);
 #define        TOTAL_MALLOC_LEN        CONFIG_SYS_MALLOC_LEN
 #endif
 
-/**
- * container_of - cast a member of a structure out to the containing structure
- * @ptr:       the pointer to the member.
- * @type:      the type of the container struct this is embedded in.
- * @member:    the name of the member within the struct.
- *
- */
-#define container_of(ptr, type, member) ({                     \
-       const typeof( ((type *)0)->member ) *__mptr = (ptr);    \
-       (type *)( (char *)__mptr - offsetof(type,member) );})
-
 /*
  * Function Prototypes
  */
@@ -947,31 +889,7 @@ static inline phys_addr_t map_to_sysmem(const void *ptr)
 #error Read section CONFIG_SKIP_LOWLEVEL_INIT in README.
 #endif
 
-#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
-
 #define ROUND(a,b)             (((a) + (b) - 1) & ~((b) - 1))
-#define DIV_ROUND(n,d)         (((n) + ((d)/2)) / (d))
-#define DIV_ROUND_UP(n,d)      (((n) + (d) - 1) / (d))
-#define roundup(x, y)          ((((x) + ((y) - 1)) / (y)) * (y))
-
-/*
- * Divide positive or negative dividend by positive divisor and round
- * to closest integer. Result is undefined for negative divisors and
- * for negative dividends if the divisor variable type is unsigned.
- */
-#define DIV_ROUND_CLOSEST(x, divisor)(                 \
-{                                                      \
-       typeof(x) __x = x;                              \
-       typeof(divisor) __d = divisor;                  \
-       (((typeof(x))-1) > 0 ||                         \
-        ((typeof(divisor))-1) > 0 || (__x) > 0) ?      \
-               (((__x) + ((__d) / 2)) / (__d)) :       \
-               (((__x) - ((__d) / 2)) / (__d));        \
-}                                                      \
-)
-
-#define ALIGN(x,a)             __ALIGN_MASK((x),(typeof(x))(a)-1)
-#define __ALIGN_MASK(x,mask)   (((x)+(mask))&~(mask))
 
 /*
  * ARCH_DMA_MINALIGN is defined in asm/cache.h for each architecture.  It
@@ -1053,7 +971,7 @@ static inline phys_addr_t map_to_sysmem(const void *ptr)
  * Usage of this macro shall be avoided or used with extreme care!
  */
 #define DEFINE_ALIGN_BUFFER(type, name, size, align)                   \
-       static char __##name[roundup(size * sizeof(type), align)]       \
+       static char __##name[ALIGN(size * sizeof(type), align)] \
                        __aligned(align);                               \
                                                                        \
        static type *name = (type *)__##name
index 1d0664ddf6e828b01a2801a96f73becd06d34036..2178f9d1fd6cf3b086b50490d16e9e9ae6df0074 100644 (file)
@@ -730,7 +730,6 @@ unsigned long get_board_ddr_clk(void);
 #define CONFIG_CMDLINE_EDITING                 /* Command-line editing */
 #define CONFIG_AUTO_COMPLETE                   /* add autocompletion support */
 #define CONFIG_SYS_LOAD_ADDR   0x2000000       /* default load address */
-#define CONFIG_SYS_PROMPT      "=> "           /* Monitor Command Prompt */
 #ifdef CONFIG_CMD_KGDB
 #define CONFIG_SYS_CBSIZE      1024            /* Console I/O Buffer Size */
 #else
index 2bb86e40caf97b742f8ad39fe152a8b3b7c9dd08..216f34f75b3b0491c8d7580c1c3d1ae62e99f924 100644 (file)
 #define CONFIG_CMDLINE_EDITING                 /* Command-line editing */
 #define CONFIG_AUTO_COMPLETE                   /* add autocompletion support */
 #define CONFIG_SYS_LOAD_ADDR   0x2000000       /* default load address */
-#define CONFIG_SYS_PROMPT      "=> "           /* Monitor Command Prompt */
 #ifdef CONFIG_CMD_KGDB
 #define CONFIG_SYS_CBSIZE      1024            /* Console I/O Buffer Size */
 #else
index 27333589afe4f092214acd94ef6e93e3d696058a..2f381e7b49ea88445f54110bf2602612f0118024 100644 (file)
@@ -791,7 +791,6 @@ unsigned long get_board_ddr_clk(void);
 #define CONFIG_CMDLINE_EDITING         /* Command-line editing */
 #define CONFIG_AUTO_COMPLETE           /* add autocompletion support */
 #define CONFIG_SYS_LOAD_ADDR   0x2000000 /* default load address */
-#define CONFIG_SYS_PROMPT      "=> "     /* Monitor Command Prompt */
 #ifdef CONFIG_CMD_KGDB
 #define CONFIG_SYS_CBSIZE      1024      /* Console I/O Buffer Size */
 #else
index 400d979643caaf7cdaddc8ddfdae5dbf87a6169a..47b3bd55166bfdf31decf8ac766d0efbad512608 100644 (file)
@@ -750,7 +750,6 @@ unsigned long get_board_ddr_clk(void);
 #define CONFIG_CMDLINE_EDITING         /* Command-line editing */
 #define CONFIG_AUTO_COMPLETE           /* add autocompletion support */
 #define CONFIG_SYS_LOAD_ADDR   0x2000000 /* default load address */
-#define CONFIG_SYS_PROMPT      "=> "     /* Monitor Command Prompt */
 #ifdef CONFIG_CMD_KGDB
 #define CONFIG_SYS_CBSIZE      1024      /* Console I/O Buffer Size */
 #else
index a97f5faae4a47a8ed5ca210d5c722859858ce6e7..94078f548196a1075ebc0658910506fa1b45d631 100644 (file)
@@ -20,8 +20,7 @@
  * High Level Configuration Options
  * (easy to change)
  */
-#define CONFIG_ARM920T         /* This is an ARM920T Core */
-#define CONFIG_S3C24X0         /* in a SAMSUNG S3C24x0-type SoC */
+#define CONFIG_S3C24X0         /* This is a SAMSUNG S3C24x0-type SoC */
 #define CONFIG_S3C2410         /* specifically a SAMSUNG S3C2410 SoC */
 #define CONFIG_VCMA9           /* on a MPL VCMA9 Board  */
 #define CONFIG_MACH_TYPE       MACH_TYPE_MPL_VCMA9 /* Machine type */
index 4424c3044195ddb444891efd6e87a5e441569742..403692d51702f5be822a4e495bedf1ae18d29d77 100644 (file)
@@ -18,8 +18,7 @@
 /*
  * SoC configurations
  */
-#define CONFIG_ARM926EJS               /* this is an ARM926EJS CPU */
-#define CONFIG_MX27                    /* in a Freescale i.MX27 Chip */
+#define CONFIG_MX27                    /* This is a Freescale i.MX27 Chip */
 #define CONFIG_MACH_TYPE       1698    /* APF27 */
 #define CONFIG_SYS_GENERIC_BOARD
 
index b073b97bae5e0ee2d5876877572abb11c4e967c0..72469f35b2d9edc6eadf28eb85df4c067ea3efe6 100644 (file)
@@ -10,7 +10,6 @@
 #define __ARMADILLO_800EVA_H
 
 #undef DEBUG
-#define CONFIG_ARMV7
 #define CONFIG_R8A7740
 #define CONFIG_RMOBILE_BOARD_STRING "Armadillo-800EVA Board\n"
 #define CONFIG_SH_GPIO_PFC
index bf09939c8174ffc17c5a9d03b173948676e66a53..104577995e5f2c683cd0b58d50508871e93edc6f 100644 (file)
@@ -10,8 +10,7 @@
 #include <linux/sizes.h>
 #include <asm/arch/sysmap.h>
 
-/* Architecture, CPU, chip, mach, etc */
-#define CONFIG_ARMV7
+/* CPU, chip, mach, etc */
 #define CONFIG_KONA
 #define CONFIG_SKIP_LOWLEVEL_INIT
 #define CONFIG_SYS_GENERIC_BOARD
index 827844e9d9449c7499fb07411f3c3fb8ed06ad8c..fb85c7263b19103d405ace79b92bb9e0b4940977 100644 (file)
@@ -9,8 +9,6 @@
 
 #include <asm/arch/configs.h>
 
-/* Architecture, CPU, chip, etc */
-#define CONFIG_ARMV7
 #define CONFIG_SKIP_LOWLEVEL_INIT
 
 #define CONFIG_SYS_GENERIC_BOARD
index b27f973896decb8040f99ec2779175c5aa35e30b..44c947f61869a0df9541df69263f760826a4ec49 100644 (file)
@@ -24,7 +24,6 @@
  * SoC Configuration
  */
 #define CONFIG_MACH_DAVINCI_CALIMAIN
-#define CONFIG_ARM926EJS               /* arm926ejs CPU core */
 #define CONFIG_SOC_DA8XX               /* TI DA8xx SoC */
 #define CONFIG_SOC_DA850               /* TI DA850 SoC */
 #define CONFIG_SYS_EXCEPTION_VECTORS_HIGH
index 5f30279fe66c50b89ec683c1ff43de640f2bca77..f8785dbafcf9f968460df4fba471b3658279db54 100644 (file)
@@ -14,7 +14,6 @@
 #define CONFIG_SYS_CONSOLE_INFO_QUIET
 
 /* SoC Configuration */
-#define CONFIG_ARM926EJS                               /* arm926ejs CPU */
 #define CONFIG_SYS_TIMERBASE           0x01c21400      /* use timer 0 */
 #define CONFIG_SYS_HZ_CLOCK            24000000        /* timer0 freq */
 #define CONFIG_SOC_DM365
diff --git a/include/configs/chromebook_link.h b/include/configs/chromebook_link.h
new file mode 100644 (file)
index 0000000..8caeca6
--- /dev/null
@@ -0,0 +1,74 @@
+/*
+ * Copyright (c) 2011 The Chromium OS Authors.
+ * (C) Copyright 2008
+ * Graeme Russ, graeme.russ@gmail.com.
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+/*
+ * board/config.h - configuration options, board specific
+ */
+
+#ifndef __CONFIG_H
+#define __CONFIG_H
+
+#include <configs/x86-common.h>
+
+#define CONFIG_SYS_CAR_ADDR                    0xff7e0000
+#define CONFIG_SYS_CAR_SIZE                    (128 * 1024)
+#define CONFIG_SYS_MONITOR_LEN                 (1 << 20)
+#define CONFIG_DCACHE_RAM_MRC_VAR_SIZE         0x4000
+#define CONFIG_SYS_X86_START16                 0xfffff800
+#define CONFIG_BOARD_EARLY_INIT_F
+#define CONFIG_BOARD_EARLY_INIT_R
+#define CONFIG_DISPLAY_CPUINFO
+
+#define CONFIG_X86_RESET_VECTOR
+#define CONFIG_NR_DRAM_BANKS                   8
+#define CONFIG_X86_MRC_START                   0xfffa0000
+#define CONFIG_CACHE_MRC_SIZE_KB               512
+
+#define CONFIG_COREBOOT_SERIAL
+
+#define CONFIG_SCSI_DEV_LIST           {PCI_VENDOR_ID_INTEL, \
+                       PCI_DEVICE_ID_INTEL_NM10_AHCI},       \
+       {PCI_VENDOR_ID_INTEL,           \
+                       PCI_DEVICE_ID_INTEL_COUGARPOINT_AHCI_MOBILE}, \
+       {PCI_VENDOR_ID_INTEL, \
+                       PCI_DEVICE_ID_INTEL_COUGARPOINT_AHCI_SERIES6}, \
+       {PCI_VENDOR_ID_INTEL,           \
+                       PCI_DEVICE_ID_INTEL_PANTHERPOINT_AHCI_MOBILE}
+
+/*
+ * These common x86 features are not yet supported, but are added in
+ * follow-on patches in this series. Add undefs here to avoid every patch
+ * having to put things back into x86-common.h
+ */
+#undef CONFIG_VIDEO
+#undef CONFIG_CFB_CONSOLE
+#undef CONFIG_ICH_SPI
+#undef CONFIG_SPI
+#undef CONFIG_CMD_SPI
+#undef CONFIG_CMD_SF
+#undef CONFIG_USB_EHCI
+#undef CONFIG_CMD_USB
+#undef CONFIG_CMD_SCSI
+
+#define CONFIG_PCI_MEM_BUS     0xe0000000
+#define CONFIG_PCI_MEM_PHYS    CONFIG_PCI_MEM_BUS
+#define CONFIG_PCI_MEM_SIZE    0x10000000
+
+#define CONFIG_PCI_PREF_BUS    0xd0000000
+#define CONFIG_PCI_PREF_PHYS   CONFIG_PCI_PREF_BUS
+#define CONFIG_PCI_PREF_SIZE   0x10000000
+
+#define CONFIG_PCI_IO_BUS      0x1000
+#define CONFIG_PCI_IO_PHYS     CONFIG_PCI_IO_BUS
+#define CONFIG_PCI_IO_SIZE     0xefff
+
+#define CONFIG_STD_DEVICES_SETTINGS     "stdin=usbkbd,vga,serial\0" \
+                                       "stdout=vga,serial\0" \
+                                       "stderr=vga,serial\0"
+
+#endif /* __CONFIG_H */
index fef267f70b22e8c9dd62061cb2aaf0f0adc29be3..25813804834088219d2f376a2ec68e8f9c9b10a4 100644 (file)
@@ -6,7 +6,6 @@
  * SPDX-License-Identifier:    GPL-2.0+
  */
 
-#include <asm/ibmpc.h>
 /*
  * board/config.h - configuration options, board specific
  */
 #ifndef __CONFIG_H
 #define __CONFIG_H
 
+#include <configs/x86-common.h>
+
 /*
  * High Level Configuration Options
  * (easy to change)
  */
 #define CONFIG_SYS_COREBOOT
-#define CONFIG_SHOW_BOOT_PROGRESS
 #define CONFIG_LAST_STAGE_INIT
-#define CONFIG_SYS_VSNPRINTF
-#define CONFIG_ZBOOT_32
-#define CONFIG_PHYSMEM
 #define CONFIG_SYS_EARLY_PCI_INIT
-#define CONFIG_DISPLAY_BOARDINFO_LATE
-#define CONFIG_DISPLAY_CPUINFO
 
-#define CONFIG_DM
-#define CONFIG_CMD_DM
-#define CONFIG_DM_GPIO
-#define CONFIG_DM_SERIAL
+#define CONFIG_SYS_CAR_ADDR                    0x19200000
+#define CONFIG_SYS_CAR_SIZE                    (16 * 1024)
+#define CONFIG_SYS_MONITOR_LEN                 (256 * 1024)
 
-#define CONFIG_LMB
-#define CONFIG_OF_LIBFDT
+#define CONFIG_TRACE_EARLY_SIZE                (8 << 20)
+#define CONFIG_TRACE_EARLY
+#define CONFIG_TRACE_EARLY_ADDR                0x01400000
 
 #define CONFIG_BOOTSTAGE
 #define CONFIG_BOOTSTAGE_REPORT
 #define CONFIG_BOOTSTAGE_STASH_SIZE    0x7fc
 #define CONFIG_BOOTSTAGE_USER_COUNT    60
 
-#define CONFIG_LZO
-#define CONFIG_FIT
-#undef CONFIG_ZLIB
-#undef CONFIG_GZIP
-#define CONFIG_SYS_BOOTM_LEN           (16 << 20)
-
-/*-----------------------------------------------------------------------
- * Watchdog Configuration
- */
-#undef CONFIG_WATCHDOG
-#undef CONFIG_HW_WATCHDOG
-
-/* SATA AHCI storage */
-
-#define CONFIG_SCSI_AHCI
-
-#ifdef CONFIG_SCSI_AHCI
-#define CONFIG_LIBATA
-#define CONFIG_SYS_64BIT_LBA
-#define CONFIG_SATA_INTEL              1
 #define CONFIG_SCSI_DEV_LIST           {PCI_VENDOR_ID_INTEL, \
                        PCI_DEVICE_ID_INTEL_NM10_AHCI},       \
        {PCI_VENDOR_ID_INTEL,           \
        {PCI_VENDOR_ID_INTEL,           \
                        PCI_DEVICE_ID_INTEL_PANTHERPOINT_AHCI_MOBILE}
 
-#define CONFIG_SYS_SCSI_MAX_SCSI_ID    2
-#define CONFIG_SYS_SCSI_MAX_LUN                1
-#define CONFIG_SYS_SCSI_MAX_DEVICE     (CONFIG_SYS_SCSI_MAX_SCSI_ID * \
-                                        CONFIG_SYS_SCSI_MAX_LUN)
-#endif
-
-/* Generic TPM interfaced through LPC bus */
-#define CONFIG_TPM
-#define CONFIG_TPM_TIS_LPC
-#define CONFIG_TPM_TIS_BASE_ADDRESS        0xfed40000
-
-/*-----------------------------------------------------------------------
- * Real Time Clock Configuration
- */
-#define CONFIG_RTC_MC146818
-#define CONFIG_SYS_ISA_IO_BASE_ADDRESS 0
-#define CONFIG_SYS_ISA_IO      CONFIG_SYS_ISA_IO_BASE_ADDRESS
-
-/*-----------------------------------------------------------------------
- * Serial Configuration
- */
 #define CONFIG_COREBOOT_SERIAL
-#define CONFIG_SYS_NS16550
-#define CONFIG_BAUDRATE                        115200
-#define CONFIG_SYS_BAUDRATE_TABLE      {300, 600, 1200, 2400, 4800, \
-                                        9600, 19200, 38400, 115200}
-#define CONFIG_SYS_NS16550_PORT_MAPPED
 
 #define CONFIG_STD_DEVICES_SETTINGS     "stdin=usbkbd,vga,serial\0" \
                                        "stdout=vga,serial,cbmem\0" \
                                        "stderr=vga,serial,cbmem\0"
 
-#define CONFIG_CONSOLE_MUX
-#define CONFIG_SYS_CONSOLE_IS_IN_ENV
-#define CONFIG_SYS_STDIO_DEREGISTER
 #define CONFIG_CBMEM_CONSOLE
 
-#define CONFIG_CMDLINE_EDITING
-#define CONFIG_COMMAND_HISTORY
-#define CONFIG_AUTO_COMPLETE
-#define CONFIG_SYS_HUSH_PARSER
-
-#define CONFIG_SUPPORT_VFAT
-/************************************************************
- * ATAPI support (experimental)
- ************************************************************/
-#define CONFIG_ATAPI
-
-/************************************************************
- * DISK Partition support
- ************************************************************/
-#define CONFIG_EFI_PARTITION
-#define CONFIG_DOS_PARTITION
-#define CONFIG_MAC_PARTITION
-#define CONFIG_ISO_PARTITION           /* Experimental */
-
-#define CONFIG_CMD_PART
-#define CONFIG_CMD_CBFS
-#define CONFIG_CMD_EXT4
-#define CONFIG_CMD_EXT4_WRITE
-#define CONFIG_PARTITION_UUIDS
-
-/*-----------------------------------------------------------------------
- * Video Configuration
- */
-#define CONFIG_VIDEO
 #define CONFIG_VIDEO_COREBOOT
-#define CONFIG_VIDEO_SW_CURSOR
-#define VIDEO_FB_16BPP_WORD_SWAP
-#define CONFIG_I8042_KBD
-#define CONFIG_CFB_CONSOLE
-#define CONFIG_SYS_CONSOLE_INFO_QUIET
 
-/* x86 GPIOs are accessed through a PCI device */
-#define CONFIG_INTEL_ICH6_GPIO
-
-/*-----------------------------------------------------------------------
- * Command line configuration.
- */
-#include <config_cmd_default.h>
+#define CONFIG_NR_DRAM_BANKS                   4
 
 #define CONFIG_TRACE
 #define CONFIG_CMD_TRACE
 #define CONFIG_TRACE_BUFFER_SIZE       (16 << 20)
-#define CONFIG_TRACE_EARLY_SIZE                (8 << 20)
-#define CONFIG_TRACE_EARLY
-#define CONFIG_TRACE_EARLY_ADDR                0x01400000
-
-#define CONFIG_CMD_BDI
-#define CONFIG_CMD_BOOTD
-#define CONFIG_CMD_CONSOLE
-#define CONFIG_CMD_DATE
-#define CONFIG_CMD_ECHO
-#undef CONFIG_CMD_FLASH
-#define CONFIG_CMD_FPGA
-#define CONFIG_CMD_FPGA_LOADMK
-#define CONFIG_CMD_GPIO
-#define CONFIG_CMD_IMI
-#undef CONFIG_CMD_IMLS
-#define CONFIG_CMD_IO
-#define CONFIG_CMD_IRQ
-#define CONFIG_CMD_ITEST
-#define CONFIG_CMD_LOADB
-#define CONFIG_CMD_LOADS
-#define CONFIG_CMD_MEMORY
-#define CONFIG_CMD_MISC
-#define CONFIG_CMD_NET
-#undef CONFIG_CMD_NFS
-#define CONFIG_CMD_PCI
-#define CONFIG_CMD_PING
-#define CONFIG_CMD_RUN
-#define CONFIG_CMD_SAVEENV
-#define CONFIG_CMD_SETGETDCR
-#define CONFIG_CMD_SOURCE
-#define CONFIG_CMD_TIME
-#define CONFIG_CMD_GETTIME
-#define CONFIG_CMD_XIMG
-#define CONFIG_CMD_SCSI
-
-#define CONFIG_CMD_FAT
-#define CONFIG_CMD_EXT2
-
-#define CONFIG_CMD_ZBOOT
-#define CONFIG_CMD_ELF
 
 #define CONFIG_BOOTDELAY       2
-#define CONFIG_BOOTARGS                \
-       "root=/dev/sdb3 init=/sbin/init rootwait ro"
-#define CONFIG_BOOTCOMMAND     \
-       "ext2load scsi 0:3 01000000 /boot/vmlinuz; zboot 01000000"
-
-
-#if defined(CONFIG_CMD_KGDB)
-#define CONFIG_KGDB_BAUDRATE                   115200
-#endif
-
-/*
- * Miscellaneous configurable options
- */
-#define CONFIG_SYS_LONGHELP
-#define CONFIG_SYS_CBSIZE                      512
-#define CONFIG_SYS_PBSIZE                      (CONFIG_SYS_CBSIZE + \
-                                                sizeof(CONFIG_SYS_PROMPT) + \
-                                                16)
-#define CONFIG_SYS_MAXARGS                     16
-#define CONFIG_SYS_BARGSIZE                    CONFIG_SYS_CBSIZE
-
-#define CONFIG_SYS_MEMTEST_START               0x00100000
-#define CONFIG_SYS_MEMTEST_END                 0x01000000
-#define CONFIG_SYS_LOAD_ADDR                   0x20000000
-
-/*-----------------------------------------------------------------------
- * SDRAM Configuration
- */
-#define CONFIG_NR_DRAM_BANKS                   4
-
-/* CONFIG_SYS_SDRAM_DRCTMCTL Overrides the following*/
-#undef CONFIG_SYS_SDRAM_PRECHARGE_DELAY
-#undef CONFIG_SYS_SDRAM_RAS_CAS_DELAY
-#undef CONFIG_SYS_SDRAM_CAS_LATENCY_2T
-#undef CONFIG_SYS_SDRAM_CAS_LATENCY_3T
-
-/*-----------------------------------------------------------------------
- * CPU Features
- */
-
-#define CONFIG_SYS_X86_TSC_TIMER
-#define CONFIG_SYS_PCAT_INTERRUPTS
-#define CONFIG_SYS_PCAT_TIMER
-#define CONFIG_SYS_NUM_IRQS                    16
-
-/*-----------------------------------------------------------------------
- * Memory organization:
- * 32kB Stack
- * 16kB Cache-As-RAM @ 0x19200000
- * 256kB Monitor
- * (128kB + Environment Sector Size) malloc pool
- */
-#define CONFIG_SYS_STACK_SIZE                  (32 * 1024)
-#define CONFIG_SYS_CAR_ADDR                    0x19200000
-#define CONFIG_SYS_CAR_SIZE                    (16 * 1024)
-#define CONFIG_SYS_MONITOR_BASE                CONFIG_SYS_TEXT_BASE
-#define CONFIG_SYS_MONITOR_LEN                 (256 * 1024)
-#define CONFIG_SYS_MALLOC_LEN                  (0x20000 + 128 * 1024)
-#define CONFIG_SYS_MALLOC_F_LEN                        (1 << 10)
-
-/* allow to overwrite serial and ethaddr */
-#define CONFIG_ENV_OVERWRITE
-
-/*-----------------------------------------------------------------------
- * FLASH configuration
- */
-#define CONFIG_ICH_SPI
-#define CONFIG_SPI_FLASH
-#define CONFIG_SPI_FLASH_MACRONIX
-#define CONFIG_SPI_FLASH_WINBOND
-#define CONFIG_SPI_FLASH_GIGADEVICE
-#define CONFIG_SYS_NO_FLASH
-#define CONFIG_CMD_SF
-#define CONFIG_CMD_SF_TEST
-#define CONFIG_CMD_SPI
-#define CONFIG_SPI
-
-/*-----------------------------------------------------------------------
- * Environment configuration
- */
-#define CONFIG_ENV_IS_NOWHERE
-#define CONFIG_ENV_SIZE                        0x01000
-
-/*-----------------------------------------------------------------------
- * PCI configuration
- */
-#define CONFIG_PCI
 
 #define CONFIG_CROS_EC
 #define CONFIG_CROS_EC_LPC
 #define CONFIG_CMD_CROS_EC
 #define CONFIG_ARCH_EARLY_INIT_R
 
-/*-----------------------------------------------------------------------
- * USB configuration
- */
-#define CONFIG_USB_EHCI
-#define CONFIG_USB_EHCI_PCI
-#define CONFIG_SYS_USB_EHCI_MAX_ROOT_PORTS     12
-#define CONFIG_USB_MAX_CONTROLLER_COUNT        2
-#define CONFIG_USB_STORAGE
-#define CONFIG_USB_KEYBOARD
-#define CONFIG_SYS_USB_EVENT_POLL
-
-#define CONFIG_USB_HOST_ETHER
-#define CONFIG_USB_ETHER_ASIX
-#define CONFIG_USB_ETHER_SMSC95XX
-#define CONFIG_TFTP_TSIZE
-#define CONFIG_CMD_DHCP
-#define CONFIG_BOOTP_BOOTFILESIZE
-#define CONFIG_BOOTP_BOOTPATH
-#define CONFIG_BOOTP_GATEWAY
-#define CONFIG_BOOTP_HOSTNAME
-
-#define CONFIG_CMD_USB
-
-#define CONFIG_EXTRA_ENV_SETTINGS \
-       CONFIG_STD_DEVICES_SETTINGS
-
 #endif /* __CONFIG_H */
index ce521012f220d3105599f974b465ae33b0c3abb0..8c7d97a18e35ce06601029ba6427f24765ec38dc 100644 (file)
@@ -26,7 +26,6 @@
 #define AT91C_MASTER_CLOCK             (AT91C_MAIN_CLOCK / 3)
 #define CONFIG_SYS_HZ_CLOCK            (AT91C_MASTER_CLOCK / 2)
 
-#define CONFIG_ARM920T
 #define CONFIG_AT91RM9200
 #define CONFIG_CPUAT91
 #define USE_920T_MMU
index 27171950a6c0e5673193e966a4981166d2475a7a..0bdcef7006dfb87c760b3bfd8969be1dbb0cc70d 100644 (file)
@@ -21,7 +21,6 @@
  * SoC Configuration
  */
 #define CONFIG_MACH_DAVINCI_DA830_EVM
-#define CONFIG_ARM926EJS               /* arm926ejs CPU core */
 #define CONFIG_SOC_DA8XX               /* TI DA8xx SoC */
 #define CONFIG_SOC_DA830               /* TI DA830 SoC */
 #define CONFIG_SYS_CLK_FREQ            clk_get(DAVINCI_ARM_CLKID)
index 5f857557375232948f9c4b26e23a08013483cb1c..e5f8afef1e9216b961339d281d45ab7aa9462eb9 100644 (file)
@@ -25,7 +25,6 @@
  * SoC Configuration
  */
 #define CONFIG_MACH_DAVINCI_DA850_EVM
-#define CONFIG_ARM926EJS               /* arm926ejs CPU core */
 #define CONFIG_SOC_DA8XX               /* TI DA8xx SoC */
 #define CONFIG_SOC_DA850               /* TI DA850 SoC */
 #define CONFIG_SYS_EXCEPTION_VECTORS_HIGH
index c2e187e3de2826f4cdf0cf8aa67fa9d8a53282eb..16b901b01b758c303c2227cef5fcb58b538a2eec 100644 (file)
@@ -15,7 +15,6 @@
 #define CONFIG_SYS_CONSOLE_INFO_QUIET
 
 /* SoC Configuration */
-#define CONFIG_ARM926EJS                               /* arm926ejs CPU */
 #define CONFIG_SYS_TIMERBASE           0x01c21400      /* use timer 0 */
 #define CONFIG_SYS_HZ_CLOCK            24000000        /* timer0 freq */
 #define CONFIG_SOC_DM355
index 5188fdf8785b91efcc5489126753c8dff119ebda..4eed72292dfab33feb7618da0eebad272480f343 100644 (file)
@@ -14,7 +14,6 @@
 #define CONFIG_SYS_CONSOLE_INFO_QUIET
 
 /* SoC Configuration */
-#define CONFIG_ARM926EJS                               /* arm926ejs CPU */
 #define CONFIG_SYS_TIMERBASE           0x01c21400      /* use timer 0 */
 #define CONFIG_SYS_HZ_CLOCK            24000000        /* timer0 freq */
 #define CONFIG_SOC_DM355                               /* DM355 based board */
index c4fccfd39a4593a4a58b5ea484df0e77d3e8ecf5..c50c059f65140eb7afe6385ad83c8de75a99617a 100644 (file)
@@ -15,7 +15,6 @@
 #define CONFIG_SYS_CONSOLE_INFO_QUIET
 
 /* SoC Configuration */
-#define CONFIG_ARM926EJS                               /* arm926ejs CPU */
 #define CONFIG_SYS_TIMERBASE           0x01c21400      /* use timer 0 */
 #define CONFIG_SYS_HZ_CLOCK            24000000        /* timer0 freq */
 #define CONFIG_SOC_DM365
index b1b18ad04127463a2886f5d9a2df9f4f263a0dce..2c5a837f6665c97240cb4a47a6dbbd404b112d83 100644 (file)
@@ -15,7 +15,6 @@
 #define CONFIG_SKIP_LOWLEVEL_INIT
 
 /* SoC Configuration */
-#define CONFIG_ARM926EJS                               /* arm926ejs CPU */
 
 /* Clock rates detection */
 #ifndef __ASSEMBLY__
index 9b3d0febc01eea814d0d815cd350da1abad4e275..2467f70522bed0a920f7351ed7dabe798949310d 100644 (file)
@@ -41,7 +41,6 @@
 /*===================*/
 /* SoC Configuration */
 /*===================*/
-#define CONFIG_ARM926EJS                       /* arm926ejs CPU core */
 #define CONFIG_SYS_TIMERBASE           0x01c21400      /* use timer 0 */
 #define CONFIG_SYS_HZ_CLOCK            27000000        /* Timer Input clock freq */
 #define CONFIG_SOC_DM644X
index 96c8fe2a4d419c240640c1117fbfadaa5f388734..2505465242128abdbc609805e2cab91a8beeeb2b 100644 (file)
@@ -19,7 +19,6 @@
 /*===================*/
 /* SoC Configuration */
 /*===================*/
-#define CONFIG_ARM926EJS                       /* arm926ejs CPU core */
 #define CONFIG_SYS_TIMERBASE           0x01c21400      /* use timer 0 */
 #define CONFIG_SYS_HZ_CLOCK            27000000        /* Timer Input clock freq */
 #define CONFIG_SOC_DM644X
index 6e07cce766e28ce3c63df02243c062e795bed399..e773835dd97fdaa51052b6f901d50e359d5bcaa4 100644 (file)
@@ -16,7 +16,6 @@
 #define CONFIG_SYS_USE_NAND
 #define CONFIG_SYS_USE_DSPLINK         /* don't power up the DSP. */
 /* SoC Configuration */
-#define CONFIG_ARM926EJS                       /* arm926ejs CPU core */
 #define CONFIG_SYS_TIMERBASE           0x01c21400      /* use timer 0 */
 #define CONFIG_SYS_HZ_CLOCK            27000000        /* Timer Input clock freq */
 #define CONFIG_SOC_DM644X
index cd23aaca209b7589e210f22fb9f75f6d3e8964f1..dae37cdaf639bdb749203199b566d84267b7afbe 100644 (file)
@@ -43,7 +43,6 @@
 /*===================*/
 /* SoC Configuration */
 /*===================*/
-#define CONFIG_ARM926EJS                       /* arm926ejs CPU core */
 #define CONFIG_SYS_TIMERBASE           0x01c21400      /* use timer 0 */
 #define CONFIG_SYS_HZ_CLOCK            27000000        /* Timer Input clock freq */
 #define CONFIG_SOC_DM644X
index 1d50a37d2fc8be63be197af9a8aebb8defc715f2..ae89368bfba18b9738976e74fd85401b4b328e43 100644 (file)
@@ -28,7 +28,6 @@
  * SoC Configuration
  */
 #define CONFIG_MACH_DAVINCI_DA850_EVM
-#define CONFIG_ARM926EJS               /* arm926ejs CPU core */
 #define CONFIG_SOC_DA8XX               /* TI DA8xx SoC */
 #define CONFIG_SOC_DA850               /* TI DA850 SoC */
 #define CONFIG_SYS_CLK_FREQ            clk_get(DAVINCI_ARM_CLKID)
index 47a8420f42d37cf8a9d9d4614a25b255254e1c82..a82e8bcadc034f3a1e5b54b0631101e051f32096 100644 (file)
@@ -85,8 +85,7 @@
 #endif
 
 /* High-level configuration options */
-#define CONFIG_ARM920T         1               /* This is an ARM920T core... */
-#define CONFIG_EP93XX          1               /* in a Cirrus Logic 93xx SoC */
+#define CONFIG_EP93XX          1               /* This is a Cirrus Logic 93xx SoC */
 
 #define CONFIG_SYS_CLK_FREQ    14745600        /* EP93xx has a 14.7456 clock */
 #undef CONFIG_USE_IRQ                          /* Don't need IRQ/FIQ */
index 1df4fc198624e41cbc128279019dfd231ebf1f2b..70a698ab328e6392f73cac47a00a4ed3981de3a0 100644 (file)
@@ -23,7 +23,6 @@
  */
 
 #define CONFIG_MARVELL         1
-#define CONFIG_ARM926EJS       1       /* Basic Architecture */
 #define CONFIG_FEROCEON                1       /* CPU Core subversion */
 #define CONFIG_88F5182         1       /* SOC Name */
 #define CONFIG_MACH_EDMINIV2   1       /* Machine type */
index 30ca95f02d5c9a4cf2bf29a840d82899eb54a8c1..cdea4a854656aeabf1c70e6cf67306d66b86942d 100644 (file)
@@ -25,7 +25,6 @@
 /*
  * SoC Configuration
  */
-#define CONFIG_ARM926EJS               /* arm926ejs CPU core */
 #define CONFIG_SOC_DA8XX               /* TI DA8xx SoC */
 #define CONFIG_SOC_DA850               /* TI DA850 SoC */
 #define CONFIG_SYS_EXCEPTION_VECTORS_HIGH
index 84175676c25505b3d4db84507ca5c785bfc98f25..bf02829cde58f856efcf01647989fe3cdc9f603f 100644 (file)
@@ -16,7 +16,6 @@
 #include <asm/arch/imx-regs.h>
 
  /* High Level Configuration Options */
-#define CONFIG_ARM1136 /* This is an arm1136 CPU core */
 #define CONFIG_MX35
 
 #define CONFIG_SYS_DCACHE_OFF
index 8188c7b788237fbcba017138bb4a29202909cc0e..1d78e725e3cf407aabca1eb34c166e066035b0db 100644 (file)
@@ -20,7 +20,6 @@
  * SoC Configuration
  */
 #define CONFIG_MACH_DAVINCI_HAWK
-#define CONFIG_ARM926EJS               /* arm926ejs CPU core */
 #define CONFIG_SOC_DA8XX               /* TI DA8xx SoC */
 #define CONFIG_SOC_DA850               /* TI DA850 SoC */
 #define CONFIG_SYS_EXCEPTION_VECTORS_HIGH
index 3e55247465f718338f242e9896348ab24590d941..f08483487d9fc7dc7533076cfa6527127d7d8570 100644 (file)
  * Miscellaneous configurable options
  */
 #define CONFIG_SYS_LONGHELP
-#define CONFIG_SYS_PROMPT              "=> "
 #define CONFIG_SYS_CBSIZE              1024
 #define CONFIG_SYS_PBSIZE              (CONFIG_SYS_CBSIZE \
                                         + sizeof(CONFIG_SYS_PROMPT)+16)
index 9c25efe851e6ccdda9b406137282f09caa8d3b23..386dbd8895cdf34db16210f59b52c5594701afe3 100644 (file)
@@ -13,7 +13,6 @@
 /*
  * SoC Configuration
  */
-#define CONFIG_ARM926EJS                       /* arm926ejs CPU core */
 #define CONFIG_MX27
 #define CONFIG_MX27_CLK32      32768           /* OSC32K frequency */
 
index 8428d84496ca4f3e40ddb41be0e0c67e58fad2e7..0f2203254545af97739c0adaba8b1d4069de07e5 100644 (file)
@@ -15,8 +15,7 @@
 #include <asm/arch/imx-regs.h>
 
  /* High Level Configuration Options */
-#define CONFIG_ARM1136         1    /* This is an arm1136 CPU core */
-#define CONFIG_MX31            1    /* in a mx31 */
+#define CONFIG_MX31            1    /* This is a mx31 */
 #define CONFIG_MX31_CLK32      32000
 
 #define CONFIG_DISPLAY_CPUINFO
index ffb67c2ebe1f681b21d87cec682b5ee5bffd9f7a..4195fa35330981d97e4831dfb6a8c19b21a7298a 100644 (file)
@@ -15,8 +15,7 @@
 #include <asm/arch/imx-regs.h>
 
 /* High Level Configuration Options */
-#define CONFIG_ARM1136                 /* This is an arm1136 CPU core */
-#define CONFIG_MX31                    /* in a mx31 */
+#define CONFIG_MX31                    /* This is a mx31 */
 #define CONFIG_MX31_CLK32      32000
 
 #define CONFIG_DISPLAY_CPUINFO
index 98e819bb189e31085086831f282407ecf0efba06..310d5e2106aca2f921fe580143e979e78c98142e 100644 (file)
@@ -25,7 +25,6 @@
  * SoC Configuration
  */
 #define CONFIG_MACH_DAVINCI_DA850_EVM
-#define CONFIG_ARM926EJS               /* arm926ejs CPU core */
 #define CONFIG_SOC_DA8XX               /* TI DA8xx SoC */
 #define CONFIG_SOC_DA850               /* TI DA850 SoC */
 #define CONFIG_SYS_EXCEPTION_VECTORS_HIGH
index 759e1129c2814aa6a4cce2cb6ea4c37cbfc61f05..8175621338fd95ea722afcd2a3dcb82691176505 100644 (file)
@@ -14,7 +14,6 @@
 #define CONFIG_MB86R0x_IOCLK   get_bus_freq(0)
 #define CONFIG_SYS_TEXT_BASE   0x10000000
 
-#define CONFIG_ARM926EJS       1       /* This is an ARM926EJS Core    */
 
 #define CONFIG_USE_ARCH_MEMCPY
 #define CONFIG_USE_ARCH_MEMSET
index dd5050fbe93b00ba65f5d4078623bcd4d8493ec1..42280ca0a505834d8e61e2e2c8c28f25802c65f9 100644 (file)
@@ -20,7 +20,6 @@
 #define CONFIG_SYS_THUMB_BUILD
 
 /* SoC Configuration */
-#define CONFIG_ARMV7
 #define CONFIG_ARCH_CPU_INIT
 #define CONFIG_SYS_ARCH_TIMER
 #define CONFIG_SYS_TEXT_BASE           0x0c001000
index d1f6ea7e7b0e6d5f1efcda54eca34af3cd3d3b3c..b19a60f2bd0213ab09595183352ac3e12dcb06b5 100644 (file)
@@ -344,7 +344,6 @@ unsigned long get_board_ddr_clk(void);
 #define CONFIG_SYS_LONGHELP            /* undef to save memory */
 #define CONFIG_SYS_HUSH_PARSER         /* use "hush" command parser */
 #define CONFIG_SYS_PROMPT_HUSH_PS2     "> "
-#define CONFIG_SYS_PROMPT              "=> "
 #define CONFIG_AUTO_COMPLETE
 #define CONFIG_SYS_CBSIZE              256     /* Console I/O Buffer Size */
 #define CONFIG_SYS_PBSIZE              \
index 3c73af8ac39dc6663fa0db3ed5d91eb9c3601618..e98e102e424727a739dbf68ead6df3983cf420c5 100644 (file)
 #define CONFIG_SYS_LONGHELP            /* undef to save memory */
 #define CONFIG_SYS_HUSH_PARSER         /* use "hush" command parser */
 #define CONFIG_SYS_PROMPT_HUSH_PS2     "> "
-#define CONFIG_SYS_PROMPT              "=> "
 #define CONFIG_AUTO_COMPLETE
 #define CONFIG_SYS_CBSIZE              256     /* Console I/O Buffer Size */
 #define CONFIG_SYS_PBSIZE              \
index 51b1a141eb225d7d9bf67a6205820cec88d8fc74..0f4bd91c645d0be4177fa7cf5855710b1e46cce1 100644 (file)
@@ -12,8 +12,7 @@
 #include <asm/arch/imx-regs.h>
 
  /* High Level Configuration Options */
-#define CONFIG_ARM1136         1               /* This is an arm1136 CPU core */
-#define CONFIG_MX31            1               /* in a mx31 */
+#define CONFIG_MX31            1               /* This is a mx31 */
 
 #define CONFIG_DISPLAY_CPUINFO
 #define CONFIG_DISPLAY_BOARDINFO
index bc4583baee6227e555ae203823dc8c3ffce962c6..2a3e53c7928ca8d32950df854307330026dce538 100644 (file)
@@ -17,8 +17,7 @@
 #include <asm/arch/imx-regs.h>
 
 /* High Level Configuration Options */
-#define CONFIG_ARM1136                 /* This is an arm1136 CPU core */
-#define CONFIG_MX31                    /* in a mx31 */
+#define CONFIG_MX31                    /* This is a mx31 */
 
 #define CONFIG_SYS_GENERIC_BOARD
 
index ab481441b296d45a60509e5bd6cc68fa0476a8ef..a145f0812f39803a5572fcdb62427a4963961743 100644 (file)
@@ -16,7 +16,6 @@
 #include <asm/arch/imx-regs.h>
 
  /* High Level Configuration Options */
-#define CONFIG_ARM1136 /* This is an arm1136 CPU core */
 #define CONFIG_MX35
 
 #define CONFIG_DISPLAY_CPUINFO
index 5419f551d316f3c23141bf5009eda1b3c0491a32..52cde4110c1c1125e0c4f32c1ca63c9221436fc2 100644 (file)
@@ -12,7 +12,6 @@
 
 #include <nomadik.h>
 
-#define CONFIG_ARM926EJS
 #define CONFIG_NOMADIK_8815    /* cpu variant */
 
 #define CONFIG_SKIP_LOWLEVEL_INIT /* we have already been loaded to RAM */
index f3c21c4580aa5c067d0de68b3cdb0a302bdc3876..bf1d34dedb4dd475db9d04431dc627330e12400a 100644 (file)
@@ -18,7 +18,6 @@
 /*
  * High Level Configuration Options
  */
-#define CONFIG_ARMV7           1       /* This is an ARM V7 CPU core */
 #define CONFIG_OMAP            1       /* in a TI OMAP core */
 #define CONFIG_MVBLX           1       /* working with mvBlueLYNX-X */
 #define CONFIG_MACH_TYPE       MACH_TYPE_MVBLX
index f9d6642cc49998217588132b4897eadf44865e29..d383fe878f547ecc58a206ba7b60e6037ca206ef 100644 (file)
@@ -12,8 +12,7 @@
 #include <asm/arch/imx-regs.h>
 
 /* High Level Configuration Options */
-#define CONFIG_ARM1136                 /* This is an arm1136 CPU core */
-#define CONFIG_MX31                    /* in a mx31 */
+#define CONFIG_MX31                    /* This is a mx31 */
 #define CONFIG_QONG
 
 #define CONFIG_DISPLAY_CPUINFO
index ca27f9ad787008c507241464aadbbf191286a83f..41e975fbcc0f292bb75da19e4cffaff86cddd89f 100644 (file)
@@ -21,7 +21,6 @@
 
 /* Architecture, CPU, etc.*/
 #define CONFIG_SYS_GENERIC_BOARD
-#define CONFIG_ARM1176
 #define CONFIG_BCM2835
 #define CONFIG_ARCH_CPU_INIT
 #define CONFIG_SYS_DCACHE_OFF
index ee4b24473cd27b37f803f10a4b3efccd0a000d8c..2b03841d9d5ae3cc7bf5a801879976d94640b86d 100644 (file)
@@ -48,6 +48,7 @@
 #define CONFIG_ANDROID_BOOT_IMAGE
 
 #define CONFIG_FS_FAT
+#define CONFIG_FAT_WRITE
 #define CONFIG_FS_EXT4
 #define CONFIG_EXT4_WRITE
 #define CONFIG_CMD_FAT
@@ -57,6 +58,7 @@
 #define CONFIG_DOS_PARTITION
 #define CONFIG_HOST_MAX_DEVICES 4
 #define CONFIG_CMD_FS_GENERIC
+#define CONFIG_CMD_MD5SUM
 
 #define CONFIG_SYS_VSNPRINTF
 
index e6d272dd1f53c4d7b1b71e006c0cc8b1f2a64ac1..f4a40bb9324717e8b83501b09bb3183a976f587a 100644 (file)
@@ -10,8 +10,7 @@
 #ifndef __CONFIG_H
 #define __CONFIG_H
 
-#define CONFIG_ARM920T         1     /* this is an ARM920T CPU     */
-#define CONFIG_IMX             1     /* in a Motorola MC9328MXL Chip */
+#define CONFIG_IMX             1     /* This is a Motorola MC9328MXL Chip */
 #define CONFIG_SCB9328         1     /* on a scb9328tronix board */
 
 #define CONFIG_IMX_SERIAL
index d4ae19f96cec077c4c92e176cbd8eeafc07ffe39..b83c15f01fcdb415c05eb6cd57c57b4c1e13cee0 100644 (file)
@@ -17,8 +17,7 @@
  * High Level Configuration Options
  * (easy to change)
  */
-#define CONFIG_ARM920T         /* This is an ARM920T Core */
-#define CONFIG_S3C24X0         /* in a SAMSUNG S3C24x0-type SoC */
+#define CONFIG_S3C24X0         /* This is a SAMSUNG S3C24x0-type SoC */
 #define CONFIG_S3C2410         /* specifically a SAMSUNG S3C2410 SoC */
 #define CONFIG_SMDK2410                /* on a SAMSUNG SMDK2410 Board */
 
index c436fdaf526d52f258d82dfab37bbb0a571dc16e..c4ac94d0eb302ec6c64193fc99f109f069b00de8 100644 (file)
@@ -11,7 +11,6 @@
 /* Virtual target or real hardware */
 #undef CONFIG_SOCFPGA_VIRTUAL_TARGET
 
-#define CONFIG_ARMV7
 #define CONFIG_SYS_THUMB_BUILD
 
 #define CONFIG_SOCFPGA
index d687717dfb8823323713ba2fe79d275ebb198f03..a160329c1d71d39c797e44af03fb46c20ee0c728 100644 (file)
@@ -16,7 +16,6 @@
 /*
  * High Level Configuration Options
  */
-#define CONFIG_ARMV7                   /* This is an ARM V7 CPU core */
 #define CONFIG_OMAP                    /* in a TI OMAP core */
 
 #define CONFIG_OMAP_GPIO
index 162826f7d354ec423c7f0d41c64cdb0ff400a86c..00a1a9e00269a8bc711c72d4b3f34ae848ddf6d8 100644 (file)
@@ -16,7 +16,6 @@
 #include <asm/arch/clock.h>
 
 /* Architecture, CPU, etc */
-#define CONFIG_ARM1176
 #define CONFIG_TNETV107X
 #define CONFIG_TNETV107X_EVM
 #define CONFIG_TNETV107X_WATCHDOG
index 0937653fc239a9a04d6cba5c900f6e5b305cf0c9..cf169a4c893ab77d2c1452d134862bab3511f65e 100644 (file)
@@ -13,7 +13,6 @@
 #include <asm/arch/imx-regs.h>
 
 /* High Level Configuration Options */
-#define CONFIG_ARM1136
 #define CONFIG_MX31
 
 #define CONFIG_DISPLAY_CPUINFO
index 700e9c1b23c85de05ff73a510da31cd65a309d72..b4a62453625bbffd1a5ebc50a681497e943d08ed 100644 (file)
 /* Miscellaneous configurable options */
 #define CONFIG_SYS_LONGHELP
 #define CONFIG_SYS_HUSH_PARSER
-#define CONFIG_SYS_PROMPT             "=> "
 #define CONFIG_AUTO_COMPLETE
 #define CONFIG_SYS_CBSIZE              256
 
index 29c32fee5178060965cd87992c178ec7ccaad7b2..900b89c997807a70968f9b0d1d7fa61c2bf1cd51 100644 (file)
@@ -19,8 +19,7 @@
  * High Level Configuration Options
  * (easy to change)
  */
-#define CONFIG_ARM926EJS       1       /* This is an arm926ejs CPU core */
-#define CONFIG_VERSATILE       1       /* in Versatile Platform Board  */
+#define CONFIG_VERSATILE       1       /* This is Versatile Platform Board     */
 #define CONFIG_ARCH_VERSATILE  1       /* Specifically, a Versatile    */
 
 #define CONFIG_SYS_MEMTEST_START       0x100000
index d3d3e694cdaa3c71f20f29fb6693f75cd8bddd77..c7a17f7a49d3809693e047f4975125f34f1886fe 100644 (file)
@@ -14,7 +14,6 @@
 #include <asm/arch/imx-regs.h>
 
  /* High Level Configuration Options */
-#define CONFIG_ARM1136 /* This is an arm1136 CPU core */
 #define CONFIG_MX35
 #define CONFIG_MX35_HCLK_FREQ  24000000
 
diff --git a/include/configs/x86-common.h b/include/configs/x86-common.h
new file mode 100644 (file)
index 0000000..f16ae32
--- /dev/null
@@ -0,0 +1,251 @@
+/*
+ * Copyright (c) 2011 The Chromium OS Authors.
+ * (C) Copyright 2008
+ * Graeme Russ, graeme.russ@gmail.com.
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#include <asm/ibmpc.h>
+
+#ifndef __CONFIG_X86_COMMON_H
+#define __CONFIG_X86_COMMON_H
+
+/*
+ * High Level Configuration Options
+ * (easy to change)
+ */
+#define CONFIG_SHOW_BOOT_PROGRESS
+#define CONFIG_SYS_VSNPRINTF
+#define CONFIG_ZBOOT_32
+#define CONFIG_PHYSMEM
+#define CONFIG_DISPLAY_BOARDINFO_LATE
+#define CONFIG_DISPLAY_CPUINFO
+
+#define CONFIG_DM
+#define CONFIG_CMD_DM
+#define CONFIG_DM_GPIO
+#define CONFIG_DM_SERIAL
+
+#define CONFIG_LMB
+#define CONFIG_OF_LIBFDT
+
+#define CONFIG_LZO
+#define CONFIG_FIT
+#undef CONFIG_ZLIB
+#undef CONFIG_GZIP
+#define CONFIG_SYS_BOOTM_LEN           (16 << 20)
+
+/* SATA AHCI storage */
+
+#define CONFIG_SCSI_AHCI
+#define CONFIG_SATA_INTEL
+#ifdef CONFIG_SCSI_AHCI
+#define CONFIG_LIBATA
+#define CONFIG_SYS_64BIT_LBA
+
+#define CONFIG_SYS_SCSI_MAX_SCSI_ID    2
+#define CONFIG_SYS_SCSI_MAX_LUN                1
+#define CONFIG_SYS_SCSI_MAX_DEVICE     (CONFIG_SYS_SCSI_MAX_SCSI_ID * \
+                                        CONFIG_SYS_SCSI_MAX_LUN)
+#endif
+
+/* Generic TPM interfaced through LPC bus */
+#define CONFIG_TPM
+#define CONFIG_TPM_TIS_LPC
+#define CONFIG_TPM_TIS_BASE_ADDRESS        0xfed40000
+
+/*-----------------------------------------------------------------------
+ * Real Time Clock Configuration
+ */
+#define CONFIG_RTC_MC146818
+#define CONFIG_SYS_ISA_IO_BASE_ADDRESS 0
+#define CONFIG_SYS_ISA_IO      CONFIG_SYS_ISA_IO_BASE_ADDRESS
+
+/*-----------------------------------------------------------------------
+ * Serial Configuration
+ */
+#define CONFIG_SYS_NS16550
+#define CONFIG_BAUDRATE                        115200
+#define CONFIG_SYS_BAUDRATE_TABLE      {300, 600, 1200, 2400, 4800, \
+                                        9600, 19200, 38400, 115200}
+#define CONFIG_SYS_NS16550_PORT_MAPPED
+
+#define CONFIG_CONSOLE_MUX
+#define CONFIG_SYS_CONSOLE_IS_IN_ENV
+#define CONFIG_SYS_STDIO_DEREGISTER
+
+#define CONFIG_CMDLINE_EDITING
+#define CONFIG_COMMAND_HISTORY
+#define CONFIG_AUTO_COMPLETE
+#define CONFIG_SYS_HUSH_PARSER
+
+#define CONFIG_SUPPORT_VFAT
+/************************************************************
+ * ATAPI support (experimental)
+ ************************************************************/
+#define CONFIG_ATAPI
+
+/************************************************************
+ * DISK Partition support
+ ************************************************************/
+#define CONFIG_EFI_PARTITION
+#define CONFIG_DOS_PARTITION
+#define CONFIG_MAC_PARTITION
+#define CONFIG_ISO_PARTITION           /* Experimental */
+
+#define CONFIG_CMD_PART
+#define CONFIG_CMD_CBFS
+#define CONFIG_CMD_EXT4
+#define CONFIG_CMD_EXT4_WRITE
+#define CONFIG_PARTITION_UUIDS
+
+#define CONFIG_SYS_CONSOLE_INFO_QUIET
+
+/* x86 GPIOs are accessed through a PCI device */
+#define CONFIG_INTEL_ICH6_GPIO
+
+/*-----------------------------------------------------------------------
+ * Command line configuration.
+ */
+#include <config_cmd_default.h>
+
+#define CONFIG_CMD_BDI
+#define CONFIG_CMD_BOOTD
+#define CONFIG_CMD_CONSOLE
+#define CONFIG_CMD_DATE
+#define CONFIG_CMD_ECHO
+#undef CONFIG_CMD_FLASH
+#define CONFIG_CMD_FPGA
+#define CONFIG_CMD_FPGA_LOADMK
+#define CONFIG_CMD_GPIO
+#define CONFIG_CMD_IMI
+#undef CONFIG_CMD_IMLS
+#define CONFIG_CMD_IO
+#define CONFIG_CMD_IRQ
+#define CONFIG_CMD_ITEST
+#define CONFIG_CMD_LOADB
+#define CONFIG_CMD_LOADS
+#define CONFIG_CMD_MEMORY
+#define CONFIG_CMD_MISC
+#define CONFIG_CMD_NET
+#undef CONFIG_CMD_NFS
+#define CONFIG_CMD_PCI
+#define CONFIG_CMD_PING
+#define CONFIG_CMD_RUN
+#define CONFIG_CMD_SAVEENV
+#define CONFIG_CMD_SETGETDCR
+#define CONFIG_CMD_SOURCE
+#define CONFIG_CMD_TIME
+#define CONFIG_CMD_GETTIME
+#define CONFIG_CMD_XIMG
+#define CONFIG_CMD_SCSI
+
+#define CONFIG_CMD_FAT
+#define CONFIG_CMD_EXT2
+
+#define CONFIG_CMD_ZBOOT
+#define CONFIG_CMD_ELF
+
+#define CONFIG_BOOTARGS                \
+       "root=/dev/sdb3 init=/sbin/init rootwait ro"
+#define CONFIG_BOOTCOMMAND     \
+       "ext2load scsi 0:3 01000000 /boot/vmlinuz; zboot 01000000"
+
+#if defined(CONFIG_CMD_KGDB)
+#define CONFIG_KGDB_BAUDRATE                   115200
+#endif
+
+/*
+ * Miscellaneous configurable options
+ */
+#define CONFIG_SYS_LONGHELP
+#define CONFIG_SYS_CBSIZE                      512
+#define CONFIG_SYS_PBSIZE                      (CONFIG_SYS_CBSIZE + \
+                                                sizeof(CONFIG_SYS_PROMPT) + \
+                                                16)
+#define CONFIG_SYS_MAXARGS                     16
+#define CONFIG_SYS_BARGSIZE                    CONFIG_SYS_CBSIZE
+
+#define CONFIG_SYS_MEMTEST_START               0x00100000
+#define CONFIG_SYS_MEMTEST_END                 0x01000000
+#define CONFIG_SYS_LOAD_ADDR                   0x20000000
+
+/*-----------------------------------------------------------------------
+ * Video Configuration
+ */
+#define CONFIG_VIDEO
+#define CONFIG_VIDEO_SW_CURSOR
+#define VIDEO_FB_16BPP_WORD_SWAP
+#define CONFIG_I8042_KBD
+#define CONFIG_CFB_CONSOLE
+
+/*-----------------------------------------------------------------------
+ * CPU Features
+ */
+
+#define CONFIG_SYS_X86_TSC_TIMER
+#define CONFIG_SYS_PCAT_INTERRUPTS
+#define CONFIG_SYS_PCAT_TIMER
+#define CONFIG_SYS_NUM_IRQS                    16
+
+#define CONFIG_SYS_STACK_SIZE                  (32 * 1024)
+#define CONFIG_SYS_MONITOR_BASE                CONFIG_SYS_TEXT_BASE
+#define CONFIG_SYS_MALLOC_LEN                  0x200000
+#define CONFIG_SYS_MALLOC_F_LEN                        (2 << 10)
+
+/* allow to overwrite serial and ethaddr */
+#define CONFIG_ENV_OVERWRITE
+
+/*-----------------------------------------------------------------------
+ * FLASH configuration
+ */
+#define CONFIG_ICH_SPI
+#define CONFIG_SPI_FLASH
+#define CONFIG_SPI_FLASH_MACRONIX
+#define CONFIG_SPI_FLASH_WINBOND
+#define CONFIG_SPI_FLASH_GIGADEVICE
+#define CONFIG_SYS_NO_FLASH
+#define CONFIG_CMD_SF
+#define CONFIG_CMD_SF_TEST
+#define CONFIG_CMD_SPI
+#define CONFIG_SPI
+
+/*-----------------------------------------------------------------------
+ * Environment configuration
+ */
+#define CONFIG_ENV_IS_NOWHERE
+#define CONFIG_ENV_SIZE                        0x01000
+
+/*-----------------------------------------------------------------------
+ * PCI configuration
+ */
+#define CONFIG_PCI
+
+/*-----------------------------------------------------------------------
+ * USB configuration
+ */
+#define CONFIG_USB_EHCI
+#define CONFIG_USB_EHCI_PCI
+#define CONFIG_SYS_USB_EHCI_MAX_ROOT_PORTS     12
+#define CONFIG_USB_MAX_CONTROLLER_COUNT        2
+#define CONFIG_USB_STORAGE
+#define CONFIG_USB_KEYBOARD
+#define CONFIG_SYS_USB_EVENT_POLL
+
+#define CONFIG_USB_HOST_ETHER
+#define CONFIG_USB_ETHER_ASIX
+#define CONFIG_USB_ETHER_SMSC95XX
+#define CONFIG_TFTP_TSIZE
+#define CONFIG_CMD_DHCP
+#define CONFIG_BOOTP_BOOTFILESIZE
+#define CONFIG_BOOTP_BOOTPATH
+#define CONFIG_BOOTP_GATEWAY
+#define CONFIG_BOOTP_HOSTNAME
+
+#define CONFIG_CMD_USB
+
+#define CONFIG_EXTRA_ENV_SETTINGS \
+       CONFIG_STD_DEVICES_SETTINGS
+
+#endif /* __CONFIG_H */
index 8ffe6f1e0878c3fd0efe752413e4bcc687e4102e..356ac886f26051d4be4f59ed43b9d9ff045769a3 100644 (file)
@@ -12,7 +12,6 @@
 
 #include <asm/arch/imx-regs.h>
 
-#define CONFIG_ARM926EJS                       /* arm926ejs CPU core */
 #define CONFIG_MX25
 #define CONFIG_SYS_TEXT_BASE           0xA0000000
 
index 2bc1562cecdb130b1fed40f99e5618bffcc9326a..c39c568ff88435fd9b1c30549707d6ce6fc86417 100644 (file)
@@ -10,9 +10,6 @@
 #ifndef __CONFIG_ZYNQ_COMMON_H
 #define __CONFIG_ZYNQ_COMMON_H
 
-/* High Level configuration Options */
-#define CONFIG_ARMV7
-
 /* CPU clock */
 #ifndef CONFIG_CPU_FREQ_HZ
 # define CONFIG_CPU_FREQ_HZ    800000000
index 6c419f3a233759c7e0998a1e5a25d7792a00bcfe..6888adc56f406d1c40049e240f8dc727e4e97009 100644 (file)
@@ -125,24 +125,28 @@ int ext4fs_init(void);
 void ext4fs_deinit(void);
 int ext4fs_filename_check(char *filename);
 int ext4fs_write(const char *fname, unsigned char *buffer,
-                               unsigned long sizebytes);
+                unsigned long sizebytes);
+int ext4_write_file(const char *filename, void *buf, loff_t offset, loff_t len,
+                   loff_t *actwrite);
 #endif
 
 struct ext_filesystem *get_fs(void);
-int ext4fs_open(const char *filename);
-int ext4fs_read(char *buf, unsigned len);
+int ext4fs_open(const char *filename, loff_t *len);
+int ext4fs_read(char *buf, loff_t len, loff_t *actread);
 int ext4fs_mount(unsigned part_length);
 void ext4fs_close(void);
 void ext4fs_reinit_global(void);
 int ext4fs_ls(const char *dirname);
 int ext4fs_exists(const char *filename);
-int ext4fs_size(const char *filename);
+int ext4fs_size(const char *filename, loff_t *size);
 void ext4fs_free_node(struct ext2fs_node *node, struct ext2fs_node *currroot);
 int ext4fs_devread(lbaint_t sector, int byte_offset, int byte_len, char *buf);
 void ext4fs_set_blk_dev(block_dev_desc_t *rbdd, disk_partition_t *info);
 long int read_allocated_block(struct ext2_inode *inode, int fileblock);
 int ext4fs_probe(block_dev_desc_t *fs_dev_desc,
                 disk_partition_t *fs_partition);
-int ext4_read_file(const char *filename, void *buf, int offset, int len);
+int ext4_read_file(const char *filename, void *buf, loff_t offset, loff_t len,
+                  loff_t *actread);
 int ext4_read_superblock(char *buffer);
+int ext4fs_uuid(char *uuid_str);
 #endif
index 20ca3f3dca7df4476c5e94b9925815ba08bb6378..3038bd7e4f6e7133af0c5149395438a810dc719a 100644 (file)
@@ -178,8 +178,8 @@ typedef struct {
 
 typedef int    (file_detectfs_func)(void);
 typedef int    (file_ls_func)(const char *dir);
-typedef long   (file_read_func)(const char *filename, void *buffer,
-                                unsigned long maxsize);
+typedef int    (file_read_func)(const char *filename, void *buffer,
+                                int maxsize);
 
 struct filesystem {
        file_detectfs_func      *detect;
@@ -198,15 +198,17 @@ int file_cd(const char *path);
 int file_fat_detectfs(void);
 int file_fat_ls(const char *dir);
 int fat_exists(const char *filename);
-int fat_size(const char *filename);
-long file_fat_read_at(const char *filename, unsigned long pos, void *buffer,
-                     unsigned long maxsize);
-long file_fat_read(const char *filename, void *buffer, unsigned long maxsize);
+int fat_size(const char *filename, loff_t *size);
+int file_fat_read_at(const char *filename, loff_t pos, void *buffer,
+                    loff_t maxsize, loff_t *actread);
+int file_fat_read(const char *filename, void *buffer, int maxsize);
 const char *file_getfsname(int idx);
 int fat_set_blk_dev(block_dev_desc_t *rbdd, disk_partition_t *info);
 int fat_register_device(block_dev_desc_t *dev_desc, int part_no);
 
-int file_fat_write(const char *filename, void *buffer, unsigned long maxsize);
-int fat_read_file(const char *filename, void *buf, int offset, int len);
+int file_fat_write(const char *filename, void *buf, loff_t offset, loff_t len,
+                  loff_t *actwrite);
+int fat_read_file(const char *filename, void *buf, loff_t offset, loff_t len,
+                 loff_t *actread);
 void fat_close(void);
 #endif /* _FAT_H_ */
index 4ae77be9ba7c8bf09860606645db711db0911fb2..abfd678424b5521d7cf941f1542b4dacef163cbd 100644 (file)
@@ -118,6 +118,8 @@ enum fdt_compat_id {
        COMPAT_SAMSUNG_EXYNOS_SYSMMU,   /* Exynos sysmmu */
        COMPAT_PARADE_PS8625,           /* Parade PS8622 EDP->LVDS bridge */
        COMPAT_INTEL_LPC,               /* Intel Low Pin Count I/F */
+       COMPAT_INTEL_MICROCODE,         /* Intel microcode update */
+       COMPAT_MEMORY_SPD,              /* Memory SPD information */
 
        COMPAT_COUNT,
 };
@@ -444,6 +446,22 @@ int fdtdec_lookup_phandle(const void *blob, int node, const char *prop_name);
 int fdtdec_get_int_array(const void *blob, int node, const char *prop_name,
                u32 *array, int count);
 
+/**
+ * Look up a property in a node and return its contents in an integer
+ * array of given length. The property must exist but may have less data that
+ * expected (4*count bytes). It may have more, but this will be ignored.
+ *
+ * @param blob         FDT blob
+ * @param node         node to examine
+ * @param prop_name    name of property to find
+ * @param array                array to fill with data
+ * @param count                number of array elements
+ * @return number of array elements if ok, or -FDT_ERR_NOTFOUND if the
+ *             property is not found
+ */
+int fdtdec_get_int_array_count(const void *blob, int node,
+                              const char *prop_name, u32 *array, int count);
+
 /**
  * Look up a property in a node and return a pointer to its contents as a
  * unsigned int array of given length. The property must have at least enough
index 06a45f2788323b5d0fef4debf677bcf942cebe4d..ffb6ce7ada64f0498b46eac89d6a335bea83c488 100644 (file)
@@ -51,32 +51,41 @@ int fs_ls(const char *dirname);
 int fs_exists(const char *filename);
 
 /*
- * Determine a file's size
+ * fs_size - Determine a file's size
  *
- * Returns the file's size in bytes, or a negative value if it doesn't exist.
+ * @filename: Name of the file
+ * @size: Size of file
+ * @return 0 if ok with valid *size, negative on error
  */
-int fs_size(const char *filename);
+int fs_size(const char *filename, loff_t *size);
 
 /*
- * Read file "filename" from the partition previously set by fs_set_blk_dev(),
- * to address "addr", starting at byte offset "offset", and reading "len"
- * bytes. "offset" may be 0 to read from the start of the file. "len" may be
- * 0 to read the entire file. Note that not all filesystem types support
- * either/both offset!=0 or len!=0.
+ * fs_read - Read file from the partition previously set by fs_set_blk_dev()
+ * Note that not all filesystem types support either/both offset!=0 or len!=0.
  *
- * Returns number of bytes read on success. Returns <= 0 on error.
+ * @filename: Name of file to read from
+ * @addr: The address to read into
+ * @offset: The offset in file to read from
+ * @len: The number of bytes to read. Maybe 0 to read entire file
+ * @actread: Returns the actual number of bytes read
+ * @return 0 if ok with valid *actread, -1 on error conditions
  */
-int fs_read(const char *filename, ulong addr, int offset, int len);
+int fs_read(const char *filename, ulong addr, loff_t offset, loff_t len,
+           loff_t *actread);
 
 /*
- * Write file "filename" to the partition previously set by fs_set_blk_dev(),
- * from address "addr", starting at byte offset "offset", and writing "len"
- * bytes. "offset" may be 0 to write to the start of the file. Note that not
- * all filesystem types support offset!=0.
+ * fs_write - Write file to the partition previously set by fs_set_blk_dev()
+ * Note that not all filesystem types support offset!=0.
  *
- * Returns number of bytes read on success. Returns <= 0 on error.
+ * @filename: Name of file to read from
+ * @addr: The address to read into
+ * @offset: The offset in file to read from. Maybe 0 to write to start of file
+ * @len: The number of bytes to write
+ * @actwrite: Returns the actual number of bytes written
+ * @return 0 if ok with valid *actwrite, -1 on error conditions
  */
-int fs_write(const char *filename, ulong addr, int offset, int len);
+int fs_write(const char *filename, ulong addr, loff_t offset, loff_t len,
+            loff_t *actwrite);
 
 /*
  * Common implementation for various filesystem commands, optionally limited
@@ -93,4 +102,11 @@ int file_exists(const char *dev_type, const char *dev_part, const char *file,
 int do_save(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[],
                int fstype);
 
+/*
+ * Determine the UUID of the specified filesystem and print it. Optionally it is
+ * possible to store the UUID directly in env.
+ */
+int do_fs_uuid(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[],
+               int fstype);
+
 #endif /* _FS_H */
index 7ff6064b187b7b914f27ac8f5e7004a014037130..47b088973944404ba9e432308f1bcdb14d7a82b9 100644 (file)
@@ -57,17 +57,6 @@ void *kmem_cache_alloc(struct kmem_cache *obj, int flag);
 
 #define KERNEL_VERSION(a,b,c)  (((a) << 16) + ((b) << 8) + (c))
 
-/*
- * ..and if you can't take the strict
- * types, you can specify one yourself.
- *
- * Or not use min/max at all, of course.
- */
-#define min_t(type,x,y) \
-       ({ type __x = (x); type __y = (y); __x < __y ? __x: __y; })
-#define max_t(type,x,y) \
-       ({ type __x = (x); type __y = (y); __x > __y ? __x: __y; })
-
 #ifndef BUG
 #define BUG() do { \
        printf("U-Boot BUG at %s:%d!\n", __FILE__, __LINE__); \
@@ -81,24 +70,6 @@ void *kmem_cache_alloc(struct kmem_cache *obj, int flag);
 
 #define PAGE_SIZE      4096
 
-/**
- * upper_32_bits - return MSB bits 32-63 of a number if little endian, or
- * return MSB bits 0-31 of a number if big endian.
- * @n: the number we're accessing
- *
- * A basic shift-right of a 64- or 32-bit quantity.  Use this to suppress
- * the "right shift count >= width of type" warning when that quantity is
- * 32-bits.
- */
-#define upper_32_bits(n) ((u32)(((n) >> 16) >> 16))
-
-/**
- * lower_32_bits - return LSB bits 0-31 of a number if little endian, or
- * return LSB bits 32-63 of a number if big endian.
- * @n: the number we're accessing
- */
-#define lower_32_bits(n) ((u32)(n))
-
 /* drivers/char/random.c */
 #define get_random_bytes(...)
 
@@ -152,17 +123,6 @@ typedef unsigned long blkcnt_t;
 
 #define ENOTSUPP       524     /* Operation is not supported */
 
-/* from include/linux/kernel.h */
-/*
- * This looks more complex than it should be. But we need to
- * get the type for the ~ right in round_down (it needs to be
- * as wide as the result!), and we want to evaluate the macro
- * arguments just once each.
- */
-#define __round_mask(x, y) ((__typeof__(x))((y)-1))
-#define round_up(x, y) ((((x)-1) | __round_mask(x, y))+1)
-#define round_down(x, y) ((x) & ~__round_mask(x, y))
-
 /* module */
 #define THIS_MODULE            0
 #define try_module_get(...)    1
@@ -198,18 +158,6 @@ typedef unsigned long blkcnt_t;
 
 #define blocking_notifier_call_chain(...) 0
 
-/*
- * Multiplies an integer by a fraction, while avoiding unnecessary
- * overflow or loss of precision.
- */
-#define mult_frac(x, numer, denom)(                    \
-{                                                      \
-       typeof(x) quot = (x) / (denom);                 \
-       typeof(x) rem  = (x) % (denom);                 \
-       (quot * (numer)) + ((rem * (numer)) / (denom)); \
-}                                                      \
-)
-
 #define __initdata
 #define late_initcall(...)
 
@@ -267,8 +215,6 @@ typedef int wait_queue_head_t;
 #define cond_resched()                 do { } while (0)
 #define yield()                                do { } while (0)
 
-#define INT_MAX                                ((int)(~0U>>1))
-
 #define __user
 #define __init
 #define __exit
diff --git a/include/linux/kernel.h b/include/linux/kernel.h
new file mode 100644 (file)
index 0000000..89fcae0
--- /dev/null
@@ -0,0 +1,245 @@
+#ifndef _LINUX_KERNEL_H
+#define _LINUX_KERNEL_H
+
+
+#include <linux/types.h>
+
+#define USHRT_MAX      ((u16)(~0U))
+#define SHRT_MAX       ((s16)(USHRT_MAX>>1))
+#define SHRT_MIN       ((s16)(-SHRT_MAX - 1))
+#define INT_MAX                ((int)(~0U>>1))
+#define INT_MIN                (-INT_MAX - 1)
+#define UINT_MAX       (~0U)
+#define LONG_MAX       ((long)(~0UL>>1))
+#define LONG_MIN       (-LONG_MAX - 1)
+#define ULONG_MAX      (~0UL)
+#define LLONG_MAX      ((long long)(~0ULL>>1))
+#define LLONG_MIN      (-LLONG_MAX - 1)
+#define ULLONG_MAX     (~0ULL)
+#define SIZE_MAX       (~(size_t)0)
+
+#define U8_MAX         ((u8)~0U)
+#define S8_MAX         ((s8)(U8_MAX>>1))
+#define S8_MIN         ((s8)(-S8_MAX - 1))
+#define U16_MAX                ((u16)~0U)
+#define S16_MAX                ((s16)(U16_MAX>>1))
+#define S16_MIN                ((s16)(-S16_MAX - 1))
+#define U32_MAX                ((u32)~0U)
+#define S32_MAX                ((s32)(U32_MAX>>1))
+#define S32_MIN                ((s32)(-S32_MAX - 1))
+#define U64_MAX                ((u64)~0ULL)
+#define S64_MAX                ((s64)(U64_MAX>>1))
+#define S64_MIN                ((s64)(-S64_MAX - 1))
+
+#define STACK_MAGIC    0xdeadbeef
+
+#define REPEAT_BYTE(x) ((~0ul / 0xff) * (x))
+
+#define ALIGN(x,a)             __ALIGN_MASK((x),(typeof(x))(a)-1)
+#define __ALIGN_MASK(x,mask)   (((x)+(mask))&~(mask))
+#define PTR_ALIGN(p, a)                ((typeof(p))ALIGN((unsigned long)(p), (a)))
+#define IS_ALIGNED(x, a)               (((x) & ((typeof(x))(a) - 1)) == 0)
+
+#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
+
+/*
+ * This looks more complex than it should be. But we need to
+ * get the type for the ~ right in round_down (it needs to be
+ * as wide as the result!), and we want to evaluate the macro
+ * arguments just once each.
+ */
+#define __round_mask(x, y) ((__typeof__(x))((y)-1))
+#define round_up(x, y) ((((x)-1) | __round_mask(x, y))+1)
+#define round_down(x, y) ((x) & ~__round_mask(x, y))
+
+#define FIELD_SIZEOF(t, f) (sizeof(((t*)0)->f))
+#define DIV_ROUND_UP(n,d) (((n) + (d) - 1) / (d))
+
+#if BITS_PER_LONG == 32
+# define DIV_ROUND_UP_SECTOR_T(ll,d) DIV_ROUND_UP_ULL(ll, d)
+#else
+# define DIV_ROUND_UP_SECTOR_T(ll,d) DIV_ROUND_UP(ll,d)
+#endif
+
+/* The `const' in roundup() prevents gcc-3.3 from calling __divdi3 */
+#define roundup(x, y) (                                        \
+{                                                      \
+       const typeof(y) __y = y;                        \
+       (((x) + (__y - 1)) / __y) * __y;                \
+}                                                      \
+)
+#define rounddown(x, y) (                              \
+{                                                      \
+       typeof(x) __x = (x);                            \
+       __x - (__x % (y));                              \
+}                                                      \
+)
+
+/*
+ * Divide positive or negative dividend by positive divisor and round
+ * to closest integer. Result is undefined for negative divisors and
+ * for negative dividends if the divisor variable type is unsigned.
+ */
+#define DIV_ROUND_CLOSEST(x, divisor)(                 \
+{                                                      \
+       typeof(x) __x = x;                              \
+       typeof(divisor) __d = divisor;                  \
+       (((typeof(x))-1) > 0 ||                         \
+        ((typeof(divisor))-1) > 0 || (__x) > 0) ?      \
+               (((__x) + ((__d) / 2)) / (__d)) :       \
+               (((__x) - ((__d) / 2)) / (__d));        \
+}                                                      \
+)
+
+/*
+ * Multiplies an integer by a fraction, while avoiding unnecessary
+ * overflow or loss of precision.
+ */
+#define mult_frac(x, numer, denom)(                    \
+{                                                      \
+       typeof(x) quot = (x) / (denom);                 \
+       typeof(x) rem  = (x) % (denom);                 \
+       (quot * (numer)) + ((rem * (numer)) / (denom)); \
+}                                                      \
+)
+
+/**
+ * upper_32_bits - return bits 32-63 of a number
+ * @n: the number we're accessing
+ *
+ * A basic shift-right of a 64- or 32-bit quantity.  Use this to suppress
+ * the "right shift count >= width of type" warning when that quantity is
+ * 32-bits.
+ */
+#define upper_32_bits(n) ((u32)(((n) >> 16) >> 16))
+
+/**
+ * lower_32_bits - return bits 0-31 of a number
+ * @n: the number we're accessing
+ */
+#define lower_32_bits(n) ((u32)(n))
+
+/*
+ * abs() handles unsigned and signed longs, ints, shorts and chars.  For all
+ * input types abs() returns a signed long.
+ * abs() should not be used for 64-bit types (s64, u64, long long) - use abs64()
+ * for those.
+ */
+#define abs(x) ({                                              \
+               long ret;                                       \
+               if (sizeof(x) == sizeof(long)) {                \
+                       long __x = (x);                         \
+                       ret = (__x < 0) ? -__x : __x;           \
+               } else {                                        \
+                       int __x = (x);                          \
+                       ret = (__x < 0) ? -__x : __x;           \
+               }                                               \
+               ret;                                            \
+       })
+
+#define abs64(x) ({                            \
+               s64 __x = (x);                  \
+               (__x < 0) ? -__x : __x;         \
+       })
+
+/*
+ * min()/max()/clamp() macros that also do
+ * strict type-checking.. See the
+ * "unnecessary" pointer comparison.
+ */
+#define min(x, y) ({                           \
+       typeof(x) _min1 = (x);                  \
+       typeof(y) _min2 = (y);                  \
+       (void) (&_min1 == &_min2);              \
+       _min1 < _min2 ? _min1 : _min2; })
+
+#define max(x, y) ({                           \
+       typeof(x) _max1 = (x);                  \
+       typeof(y) _max2 = (y);                  \
+       (void) (&_max1 == &_max2);              \
+       _max1 > _max2 ? _max1 : _max2; })
+
+#define min3(x, y, z) min((typeof(x))min(x, y), z)
+#define max3(x, y, z) max((typeof(x))max(x, y), z)
+
+/**
+ * min_not_zero - return the minimum that is _not_ zero, unless both are zero
+ * @x: value1
+ * @y: value2
+ */
+#define min_not_zero(x, y) ({                  \
+       typeof(x) __x = (x);                    \
+       typeof(y) __y = (y);                    \
+       __x == 0 ? __y : ((__y == 0) ? __x : min(__x, __y)); })
+
+/**
+ * clamp - return a value clamped to a given range with strict typechecking
+ * @val: current value
+ * @lo: lowest allowable value
+ * @hi: highest allowable value
+ *
+ * This macro does strict typechecking of lo/hi to make sure they are of the
+ * same type as val.  See the unnecessary pointer comparisons.
+ */
+#define clamp(val, lo, hi) min((typeof(val))max(val, lo), hi)
+
+/*
+ * ..and if you can't take the strict
+ * types, you can specify one yourself.
+ *
+ * Or not use min/max/clamp at all, of course.
+ */
+#define min_t(type, x, y) ({                   \
+       type __min1 = (x);                      \
+       type __min2 = (y);                      \
+       __min1 < __min2 ? __min1: __min2; })
+
+#define max_t(type, x, y) ({                   \
+       type __max1 = (x);                      \
+       type __max2 = (y);                      \
+       __max1 > __max2 ? __max1: __max2; })
+
+/**
+ * clamp_t - return a value clamped to a given range using a given type
+ * @type: the type of variable to use
+ * @val: current value
+ * @lo: minimum allowable value
+ * @hi: maximum allowable value
+ *
+ * This macro does no typechecking and uses temporary variables of type
+ * 'type' to make all the comparisons.
+ */
+#define clamp_t(type, val, lo, hi) min_t(type, max_t(type, val, lo), hi)
+
+/**
+ * clamp_val - return a value clamped to a given range using val's type
+ * @val: current value
+ * @lo: minimum allowable value
+ * @hi: maximum allowable value
+ *
+ * This macro does no typechecking and uses temporary variables of whatever
+ * type the input argument 'val' is.  This is useful when val is an unsigned
+ * type and min and max are literals that will otherwise be assigned a signed
+ * integer type.
+ */
+#define clamp_val(val, lo, hi) clamp_t(typeof(val), val, lo, hi)
+
+
+/*
+ * swap - swap value of @a and @b
+ */
+#define swap(a, b) \
+       do { typeof(a) __tmp = (a); (a) = (b); (b) = __tmp; } while (0)
+
+/**
+ * container_of - cast a member of a structure out to the containing structure
+ * @ptr:       the pointer to the member.
+ * @type:      the type of the container struct this is embedded in.
+ * @member:    the name of the member within the struct.
+ *
+ */
+#define container_of(ptr, type, member) ({                     \
+       const typeof( ((type *)0)->member ) *__mptr = (ptr);    \
+       (type *)( (char *)__mptr - offsetof(type,member) );})
+
+#endif
index 0230a7f40da07893ff2d9d92f1929e7b9cabc1d2..e3645e01169b4a84ae7802ecf95a16298041499a 100644 (file)
@@ -217,9 +217,10 @@ const char *os_dirent_get_typename(enum os_dirent_t type);
  * Get the size of a file
  *
  * @param fname                Filename to check
- * @return size of file, or -1 if an error ocurred
+ * @param size         size of file is returned if no error
+ * @return 0 on success or -1 if an error ocurred
  */
-ssize_t os_get_filesize(const char *fname);
+int os_get_filesize(const char *fname, loff_t *size);
 
 /**
  * Write a character to the controlling OS terminal
index 2ff73653c5c2382ae654a22c047e743c67b55df1..d211351e44becf9b4c70e4f5cda357cce12f5a7e 100644 (file)
@@ -623,6 +623,7 @@ extern void pci_register_hose(struct pci_controller* hose);
 extern struct pci_controller* pci_bus_to_hose(int bus);
 extern struct pci_controller *find_hose_by_cfg_addr(void *cfg_addr);
 
+extern int pci_skip_dev(struct pci_controller *hose, pci_dev_t dev);
 extern int pci_hose_scan(struct pci_controller *hose);
 extern int pci_hose_scan_bus(struct pci_controller *hose, int bus);
 
index e7c32623e101e31dde107d94468090dc3f041d4d..4c7745de91002d503640631f234d470c00ada0ee 100644 (file)
 
 int sandbox_fs_set_blk_dev(block_dev_desc_t *rbdd, disk_partition_t *info);
 
-long sandbox_fs_read_at(const char *filename, unsigned long pos,
-                            void *buffer, unsigned long maxsize);
+int sandbox_fs_read_at(const char *filename, loff_t pos, void *buffer,
+                      loff_t maxsize, loff_t *actread);
+int sandbox_fs_write_at(const char *filename, loff_t pos, void *buffer,
+                       loff_t maxsize, loff_t *actwrite);
 
 void sandbox_fs_close(void);
 int sandbox_fs_ls(const char *dirname);
 int sandbox_fs_exists(const char *filename);
-int sandbox_fs_size(const char *filename);
-int fs_read_sandbox(const char *filename, void *buf, int offset, int len);
-int fs_write_sandbox(const char *filename, void *buf, int offset, int len);
+int sandbox_fs_size(const char *filename, loff_t *size);
+int fs_read_sandbox(const char *filename, void *buf, loff_t offset, loff_t len,
+                   loff_t *actread);
+int fs_write_sandbox(const char *filename, void *buf, loff_t offset,
+                    loff_t len, loff_t *actwrite);
 
 #endif
index 129bc3e2aff7eb18d80a4a10afe9cb5688f33384..580f763da67bfcc396bdbe7beb10de0e9939d3bf 100644 (file)
@@ -31,6 +31,9 @@ int main(void)
 #ifdef CONFIG_SYS_MALLOC_F_LEN
        DEFINE(GD_MALLOC_BASE, offsetof(struct global_data, malloc_base));
 #endif
+#ifdef CONFIG_X86
+       DEFINE(GD_BIST, offsetof(struct global_data, arch.bist));
+#endif
 
 #if defined(CONFIG_ARM)
 
index da6ef6b58bdd84734adb7bd7e1ea172e34aae83a..e8775df5d00b135972799040d03cc76932af759d 100644 (file)
@@ -73,6 +73,8 @@ static const char * const compat_names[COMPAT_COUNT] = {
        COMPAT(SAMSUNG_EXYNOS_SYSMMU, "samsung,sysmmu-v3.3"),
        COMPAT(PARADE_PS8625, "parade,ps8625"),
        COMPAT(COMPAT_INTEL_LPC, "intel,lpc"),
+       COMPAT(INTEL_MICROCODE, "intel,microcode"),
+       COMPAT(MEMORY_SPD, "memory-spd"),
 };
 
 const char *fdtdec_get_compatible(enum fdt_compat_id id)
@@ -485,6 +487,26 @@ int fdtdec_get_int_array(const void *blob, int node, const char *prop_name,
        return err;
 }
 
+int fdtdec_get_int_array_count(const void *blob, int node,
+                              const char *prop_name, u32 *array, int count)
+{
+       const u32 *cell;
+       int len, elems;
+       int i;
+
+       debug("%s: %s\n", __func__, prop_name);
+       cell = fdt_getprop(blob, node, prop_name, &len);
+       if (!cell)
+               return -FDT_ERR_NOTFOUND;
+       elems = len / sizeof(u32);
+       if (count > elems)
+               count = elems;
+       for (i = 0; i < count; i++)
+               array[i] = fdt32_to_cpu(cell[i]);
+
+       return count;
+}
+
 const u32 *fdtdec_locate_array(const void *blob, int node,
                               const char *prop_name, int count)
 {
index f9a17727f53b898e307a7b65853c00623f135909..5c16cc4fc7566dcfb7ff0eb6ccaed9074f5ecb4b 100644 (file)
@@ -11,11 +11,11 @@ char *strmhz (char *buf, unsigned long hz)
        long l, n;
        long m;
 
-       n = DIV_ROUND(hz, 1000) / 1000L;
+       n = DIV_ROUND_CLOSEST(hz, 1000) / 1000L;
        l = sprintf (buf, "%ld", n);
 
        hz -= n * 1000000L;
-       m = DIV_ROUND(hz, 1000L);
+       m = DIV_ROUND_CLOSEST(hz, 1000L);
        if (m != 0)
                sprintf (buf + l, ".%03ld", m);
        return (buf);
index b585713b7c55c78a598b165e547352ba7719c182..e0f264850f7fa75bc6cbeaad2537d3fffc4a318d 100644 (file)
@@ -25,9 +25,6 @@
 #include <div64.h>
 #define noinline __attribute__((noinline))
 
-/* some reluctance to put this into a new limits.h, so it is here */
-#define INT_MAX                ((int)(~0U>>1))
-
 unsigned long simple_strtoul(const char *cp, char **endp,
                                unsigned int base)
 {
@@ -518,6 +515,8 @@ static char *ip4_addr_string(char *buf, char *end, u8 *addr, int field_width,
 static char *pointer(const char *fmt, char *buf, char *end, void *ptr,
                int field_width, int precision, int flags)
 {
+       u64 num = (uintptr_t)ptr;
+
        /*
         * Being a boot loader, we explicitly allow pointers to
         * (physical) address null.
@@ -530,6 +529,17 @@ static char *pointer(const char *fmt, char *buf, char *end, void *ptr,
 
 #ifdef CONFIG_CMD_NET
        switch (*fmt) {
+       case 'a':
+               flags |= SPECIAL | ZEROPAD;
+
+               switch (fmt[1]) {
+               case 'p':
+               default:
+                       field_width = sizeof(phys_addr_t) * 2 + 2;
+                       num = *(phys_addr_t *)ptr;
+                       break;
+               }
+               break;
        case 'm':
                flags |= SPECIAL;
                /* Fallthrough */
@@ -555,8 +565,7 @@ static char *pointer(const char *fmt, char *buf, char *end, void *ptr,
                field_width = 2*sizeof(void *);
                flags |= ZEROPAD;
        }
-       return number(buf, end, (unsigned long)ptr, 16, field_width,
-                     precision, flags);
+       return number(buf, end, num, 16, field_width, precision, flags);
 }
 
 static int vsnprintf_internal(char *buf, size_t size, const char *fmt,
index 6e13f68d99554c88e68eb52c263748a3ecd3ab3e..190544688016c7f856826896098986526f3b53b4 100644 (file)
@@ -60,9 +60,6 @@ libs-y += arch/$(ARCH)/lib/
 
 libs-y += $(CPUDIR)/
 
-ifdef SOC
-libs-y += $(CPUDIR)/$(SOC)/
-endif
 libs-y += $(if $(BOARDDIR),board/$(BOARDDIR)/)
 libs-$(HAVE_VENDOR_COMMON_LIB) += board/$(VENDOR)/common/
 
@@ -81,7 +78,7 @@ libs-y += fs/
 libs-$(CONFIG_SPL_LIBGENERIC_SUPPORT) += lib/
 libs-$(CONFIG_SPL_POWER_SUPPORT) += drivers/power/ drivers/power/pmic/
 libs-$(CONFIG_SPL_MTD_SUPPORT) += drivers/mtd/
-libs-$(if $(CONFIG_CMD_NAND),$(CONFIG_SPL_NAND_SUPPORT)) += drivers/mtd/nand/
+libs-$(CONFIG_SPL_NAND_SUPPORT) += drivers/mtd/nand/
 libs-$(CONFIG_SPL_DRIVERS_MISC_SUPPORT) += drivers/misc/
 libs-$(CONFIG_SPL_ONENAND_SUPPORT) += drivers/mtd/onenand/
 libs-$(CONFIG_SPL_DMA_SUPPORT) += drivers/dma/
diff --git a/test/fs/fs-test.sh b/test/fs/fs-test.sh
new file mode 100755 (executable)
index 0000000..a4fb055
--- /dev/null
@@ -0,0 +1,561 @@
+#!/bin/bash
+#
+# (C) Copyright 2014 Suriyan Ramasami
+#
+#  SPDX-License-Identifier:    GPL-2.0+
+#
+
+# Invoke this test script from U-Boot base directory as ./test/fs/fs-test.sh
+# It currently tests the fs/sb and native commands for ext4 and fat partitions
+# Expected results are as follows:
+# EXT4 tests:
+# fs-test.sb.ext4.out: Summary: PASS: 17 FAIL: 2
+# fs-test.ext4.out: Summary: PASS: 11 FAIL: 8
+# fs-test.fs.ext4.out: Summary: PASS: 11 FAIL: 8
+# FAT tests:
+# fs-test.sb.fat.out: Summary: PASS: 17 FAIL: 2
+# fs-test.fat.out: Summary: PASS: 19 FAIL: 0
+# fs-test.fs.fat.out: Summary: PASS: 19 FAIL: 0
+# Total Summary: TOTAL PASS: 94 TOTAL FAIL: 20
+
+# pre-requisite binaries list.
+PREREQ_BINS="md5sum mkfs mount umount dd fallocate mkdir"
+
+# All generated output files from this test will be in $OUT_DIR
+# Hence everything is sandboxed.
+OUT_DIR="sandbox/test/fs"
+
+# Location of generated sandbox u-boot
+UBOOT="./sandbox/u-boot"
+
+# Our mount directory will be in the sandbox
+MOUNT_DIR="${OUT_DIR}/mnt"
+
+# The file system image we create will have the $IMG prefix.
+IMG="${OUT_DIR}/3GB"
+
+# $SMALL_FILE is the name of the 1MB file in the file system image
+SMALL_FILE="1MB.file"
+
+# $BIG_FILE is the name of the 2.5GB file in the file system image
+BIG_FILE="2.5GB.file"
+
+# $MD5_FILE will have the expected md5s when we do the test
+# They shall have a suffix which represents their file system (ext4/fat)
+MD5_FILE="${OUT_DIR}/md5s.list"
+
+# $OUT shall be the prefix of the test output. Their suffix will be .out
+OUT="${OUT_DIR}/fs-test"
+
+# Full Path of the 1 MB file that shall be created in the fs image.
+MB1="${MOUNT_DIR}/${SMALL_FILE}"
+GB2p5="${MOUNT_DIR}/${BIG_FILE}"
+
+# ************************
+# * Functions start here *
+# ************************
+
+# Check if the prereq binaries exist, or exit
+function check_prereq() {
+       for prereq in $PREREQ_BINS; do
+               if [ ! -x `which $prereq` ]; then
+                       echo "Missing $prereq binary. Exiting!"
+                       exit
+               fi
+       done
+
+       # We use /dev/urandom to create files. Check if it exists.
+       if [ ! -c /dev/urandom ]; then
+               echo "Missing character special /dev/urandom. Exiting!"
+               exit
+       fi
+}
+
+# If 1st param is "clean", then clean out the generated files and exit
+function check_clean() {
+       if [ "$1" = "clean" ]; then
+               rm -rf "$OUT_DIR"
+               echo "Cleaned up generated files. Exiting"
+               exit
+       fi
+}
+
+# Generate sandbox U-Boot - gleaned from /test/dm/test-dm.sh
+function compile_sandbox() {
+       unset CROSS_COMPILE
+       NUM_CPUS=$(cat /proc/cpuinfo |grep -c processor)
+       make O=sandbox sandbox_config
+       make O=sandbox -s -j${NUM_CPUS}
+
+       # Check if U-Boot exists
+       if [ ! -x "$UBOOT" ]; then
+               echo "$UBOOT does not exist or is not executable"
+               echo "Build error?"
+               echo "Please run this script as ./test/fs/`basename $0`"
+               exit
+       fi
+}
+
+# Clean out all generated files other than the file system images
+# We save time by not deleting and recreating the file system images
+function prepare_env() {
+       rm -f ${MD5_FILE}.* ${OUT}.*
+       mkdir ${OUT_DIR}
+}
+
+# 1st parameter is the name of the image file to be created
+# 2nd parameter is the filesystem - fat ext4 etc
+# -F cant be used with fat as it means something else.
+function create_image() {
+       # Create image if not already present - saves time, while debugging
+       if [ "$2" = "ext4" ]; then
+               MKFS_OPTION="-F"
+       else
+               MKFS_OPTION=""
+       fi
+       if [ ! -f "$1" ]; then
+               fallocate -l 3G "$1" &> /dev/null
+               mkfs -t "$2" $MKFS_OPTION "$1" &> /dev/null
+               if [ $? -ne 0 -a "$2" = "fat" ]; then
+                       # If we fail and we did fat, try vfat.
+                       mkfs -t vfat $MKFS_OPTION "$1" &> /dev/null
+               fi
+       fi
+}
+
+# 1st parameter is the FS type: fat/ext4
+# 2nd parameter is the name of small file
+# Returns filename which can be used for fat or ext4 for writing
+function fname_for_write() {
+       case $1 in
+               ext4)
+                       # ext4 needs absolute path name of file
+                       echo /${2}.w
+                       ;;
+
+               *)
+                       echo ${2}.w
+                       ;;
+       esac
+}
+
+# 1st parameter is image file
+# 2nd parameter is file system type - fat/ext4
+# 3rd parameter is name of small file
+# 4th parameter is name of big file
+# 5th parameter is fs/nonfs/sb - to dictate generic fs commands or
+# otherwise or sb hostfs
+# 6th parameter is the directory path for the files. Its "" for generic
+# fs and ext4/fat and full patch for sb hostfs
+# UBOOT is set in env
+function test_image() {
+       addr="0x01000008"
+       length="0x00100000"
+
+       case "$2" in
+               fat)
+               PREFIX="fat"
+               WRITE="write"
+               ;;
+
+               ext4)
+               PREFIX="ext4"
+               WRITE="write"
+               ;;
+
+               *)
+               echo "Unhandled filesystem $2. Exiting!"
+               exit
+               ;;
+       esac
+
+       case "$5" in
+               fs)
+               PREFIX=""
+               WRITE="save"
+               SUFFIX=" 0:0"
+               ;;
+
+               nonfs)
+               SUFFIX=" 0:0"
+               ;;
+
+               sb)
+               PREFIX="sb "
+               WRITE="save"
+               SUFFIX="fs -"
+               ;;
+
+               *)
+               echo "Unhandled mode $5. Exiting!"
+               exit
+               ;;
+
+       esac
+
+       if [ -z "$6" ]; then
+               FILE_WRITE=`fname_for_write $2 $3`
+               FILE_SMALL=$3
+               FILE_BIG=$4
+       else
+               FILE_WRITE=$6/`fname_for_write $2 $3`
+               FILE_SMALL=$6/$3
+               FILE_BIG=$6/$4
+       fi
+
+       # In u-boot commands, <interface> stands for host or hostfs
+       # hostfs maps to the host fs.
+       # host maps to the "sb bind" that we do
+
+       $UBOOT << EOF
+sb=$5
+setenv bind 'if test "\$sb" != sb; then sb bind 0 "$1"; fi'
+run bind
+# Test Case 1 - ls
+${PREFIX}ls host${SUFFIX} $6
+#
+# We want ${PREFIX}size host 0:0 $3 for host commands and
+# sb size hostfs - $3 for hostfs commands.
+# 1MB is 0x0010 0000
+# Test Case 2 - size of small file
+${PREFIX}size host${SUFFIX} $FILE_SMALL
+printenv filesize
+setenv filesize
+
+# 2.5GB (1024*1024*2500) is 0x9C40 0000
+# Test Case 3 - size of big file
+${PREFIX}size host${SUFFIX} $FILE_BIG
+printenv filesize
+setenv filesize
+
+# Notes about load operation
+# If I use 0x01000000 I get DMA misaligned error message
+# Last two parameters are size and offset.
+
+# Test Case 4a - Read full 1MB of small file
+${PREFIX}load host${SUFFIX} $addr $FILE_SMALL
+printenv filesize
+# Test Case 4b - Read full 1MB of small file
+md5sum $addr \$filesize
+setenv filesize
+
+# Test Case 5a - First 1MB of big file
+${PREFIX}load host${SUFFIX} $addr $FILE_BIG $length 0x0
+printenv filesize
+# Test Case 5b - First 1MB of big file
+md5sum $addr \$filesize
+setenv filesize
+
+# fails for ext as no offset support
+# Test Case 6a - Last 1MB of big file
+${PREFIX}load host${SUFFIX} $addr $FILE_BIG $length 0x9C300000
+printenv filesize
+# Test Case 6b - Last 1MB of big file
+md5sum $addr \$filesize
+setenv filesize
+
+# fails for ext as no offset support
+# Test Case 7a - One from the last 1MB chunk of 2GB
+${PREFIX}load host${SUFFIX} $addr $FILE_BIG $length 0x7FF00000
+printenv filesize
+# Test Case 7b - One from the last 1MB chunk of 2GB
+md5sum $addr \$filesize
+setenv filesize
+
+# fails for ext as no offset support
+# Test Case 8a - One from the start 1MB chunk from 2GB
+${PREFIX}load host${SUFFIX} $addr $FILE_BIG $length 0x80000000
+printenv filesize
+# Test Case 8b - One from the start 1MB chunk from 2GB
+md5sum $addr \$filesize
+setenv filesize
+
+# fails for ext as no offset support
+# Test Case 9a - One 1MB chunk crossing the 2GB boundary
+${PREFIX}load host${SUFFIX} $addr $FILE_BIG $length 0x7FF80000
+printenv filesize
+# Test Case 9b - One 1MB chunk crossing the 2GB boundary
+md5sum $addr \$filesize
+setenv filesize
+
+# Generic failure case
+# Test Case 10 - 2MB chunk from the last 1MB of big file
+${PREFIX}load host${SUFFIX} $addr $FILE_BIG 0x00200000 0x9C300000
+printenv filesize
+#
+
+# Read 1MB from small file
+${PREFIX}load host${SUFFIX} $addr $FILE_SMALL
+# Write it back to test the writes
+# Test Case 11a - Check that the write succeeded
+${PREFIX}${WRITE} host${SUFFIX} $addr $FILE_WRITE \$filesize
+mw.b $addr 00 100
+${PREFIX}load host${SUFFIX} $addr $FILE_WRITE
+# Test Case 11b - Check md5 of written to is same as the one read from
+md5sum $addr \$filesize
+setenv filesize
+#
+reset
+
+EOF
+}
+
+# 1st argument is the name of the image file.
+# 2nd argument is the file where we generate the md5s of the files
+# generated with the appropriate start and length that we use to test.
+# It creates the necessary files in the image to test.
+# $GB2p5 is the path of the big file (2.5 GB)
+# $MB1 is the path of the small file (1 MB)
+# $MOUNT_DIR is the path we can use to mount the image file.
+function create_files() {
+       # Mount the image so we can populate it.
+       mkdir -p "$MOUNT_DIR"
+       sudo mount -o loop,rw "$1" "$MOUNT_DIR"
+
+       # Create big file in this image.
+       # Note that we work only on the start 1MB, couple MBs in the 2GB range
+       # and the last 1 MB of the huge 2.5GB file.
+       # So, just put random values only in those areas.
+       if [ ! -f "${GB2p5}" ]; then
+               sudo dd if=/dev/urandom of="${GB2p5}" bs=1M count=1 \
+                       &> /dev/null
+               sudo dd if=/dev/urandom of="${GB2p5}" bs=1M count=2 seek=2047 \
+                       &> /dev/null
+               sudo dd if=/dev/urandom of="${GB2p5}" bs=1M count=1 seek=2499 \
+                       &> /dev/null
+       fi
+
+       # Create a small file in this image.
+       if [ ! -f "${MB1}" ]; then
+               sudo dd if=/dev/urandom of="${MB1}" bs=1M count=1 \
+                       &> /dev/null
+       fi
+
+       # Delete the small file which possibly is written as part of a
+       # previous test.
+       sudo rm -f "${MB1}.w"
+
+       # Generate the md5sums of reads that we will test against small file
+       dd if="${MB1}" bs=1M skip=0 count=1 2> /dev/null | md5sum > "$2"
+
+       # Generate the md5sums of reads that we will test against big file
+       # One from beginning of file.
+       dd if="${GB2p5}" bs=1M skip=0 count=1 \
+               2> /dev/null | md5sum >> "$2"
+
+       # One from end of file.
+       dd if="${GB2p5}" bs=1M skip=2499 count=1 \
+               2> /dev/null | md5sum >> "$2"
+
+       # One from the last 1MB chunk of 2GB
+       dd if="${GB2p5}" bs=1M skip=2047 count=1 \
+               2> /dev/null | md5sum >> "$2"
+
+       # One from the start 1MB chunk from 2GB
+       dd if="${GB2p5}" bs=1M skip=2048 count=1 \
+               2> /dev/null | md5sum >> "$2"
+
+       # One 1MB chunk crossing the 2GB boundary
+       dd if="${GB2p5}" bs=512K skip=4095 count=2 \
+               2> /dev/null | md5sum >> "$2"
+
+       sync
+       sudo umount "$MOUNT_DIR"
+       rmdir "$MOUNT_DIR"
+}
+
+# 1st parameter is the text to print
+# if $? is 0 its a pass, else a fail
+# As a side effect it shall update env variable PASS and FAIL
+function pass_fail() {
+       if [ $? -eq 0 ]; then
+               echo pass - "$1"
+               PASS=$((PASS + 1))
+       else
+               echo FAIL - "$1"
+               FAIL=$((FAIL + 1))
+       fi
+}
+
+# 1st parameter is the string which leads to an md5 generation
+# 2nd parameter is the file we grep, for that string
+# 3rd parameter is the name of the file which has md5s in it
+# 4th parameter is the line # in the md5 file that we match it against
+# This function checks if the md5 of the file in the sandbox matches
+# that calculated while generating the file
+# 5th parameter is the string to print with the result
+check_md5() {
+       # md5sum in u-boot has output of form:
+       # md5 for 01000008 ... 01100007 ==> <md5>
+       # the 7th field is the actual md5
+       md5_src=`grep -A3 "$1" "$2" | grep "md5 for"`
+       md5_src=($md5_src)
+       md5_src=${md5_src[6]}
+
+       # The md5 list, each line is of the form:
+       # - <md5>
+       # the 2nd field is the actual md5
+       md5_dst=`sed -n $4p $3`
+       md5_dst=($md5_dst)
+       md5_dst=${md5_dst[0]}
+
+       # For a pass they should match.
+       [ "$md5_src" = "$md5_dst" ]
+       pass_fail "$5"
+}
+
+# 1st parameter is the name of the output file to check
+# 2nd parameter is the name of the file containing the md5 expected
+# 3rd parameter is the name of the small file
+# 4th parameter is the name of the big file
+# 5th paramter is the name of the written file
+# This function checks the output file for correct results.
+function check_results() {
+       echo "** Start $1"
+
+       PASS=0
+       FAIL=0
+
+       # Check if the ls is showing correct results for 2.5 gb file
+       grep -A6 "Test Case 1 " "$1" | egrep -iq "2621440000 *$4"
+       pass_fail "TC1: ls of $4"
+
+       # Check if the ls is showing correct results for 1 mb file
+       grep -A6 "Test Case 1 " "$1" | egrep -iq "1048576 *$3"
+       pass_fail "TC1: ls of $3"
+
+       # Check size command on 1MB.file
+       egrep -A3 "Test Case 2 " "$1" | grep -q "filesize=100000"
+       pass_fail "TC2: size of $3"
+
+       # Check size command on 2.5GB.file
+       egrep -A3 "Test Case 3 " "$1" | grep -q "filesize=9c400000"
+       pass_fail "TC3: size of $4"
+
+       # Check read full mb of 1MB.file
+       grep -A6 "Test Case 4a " "$1" | grep -q "filesize=100000"
+       pass_fail "TC4: load of $3 size"
+       check_md5 "Test Case 4b " "$1" "$2" 1 "TC4: load from $3"
+
+       # Check first mb of 2.5GB.file
+       grep -A6 "Test Case 5a " "$1" | grep -q "filesize=100000"
+       pass_fail "TC5: load of 1st MB from $4 size"
+       check_md5 "Test Case 5b " "$1" "$2" 2 "TC5: load of 1st MB from $4"
+
+       # Check last mb of 2.5GB.file
+       grep -A6 "Test Case 6a " "$1" | grep -q "filesize=100000"
+       pass_fail "TC6: load of last MB from $4 size"
+       check_md5 "Test Case 6b " "$1" "$2" 3 "TC6: load of last MB from $4"
+
+       # Check last 1mb chunk of 2gb from 2.5GB file
+       grep -A6 "Test Case 7a " "$1" | grep -q "filesize=100000"
+       pass_fail "TC7: load of last 1mb chunk of 2GB from $4 size"
+       check_md5 "Test Case 7b " "$1" "$2" 4 \
+               "TC7: load of last 1mb chunk of 2GB from $4"
+
+       # Check first 1mb chunk after 2gb from 2.5GB file
+       grep -A6 "Test Case 8a " "$1" | grep -q "filesize=100000"
+       pass_fail "TC8: load 1st MB chunk after 2GB from $4 size"
+       check_md5 "Test Case 8b " "$1" "$2" 5 \
+               "TC8: load 1st MB chunk after 2GB from $4"
+
+       # Check 1mb chunk crossing the 2gb boundary from 2.5GB file
+       grep -A6 "Test Case 9a " "$1" | grep -q "filesize=100000"
+       pass_fail "TC9: load 1MB chunk crossing 2GB boundary from $4 size"
+       check_md5 "Test Case 9b " "$1" "$2" 6 \
+               "TC9: load 1MB chunk crossing 2GB boundary from $4"
+
+       # Check 2mb chunk from the last 1MB of 2.5GB file - generic failure case
+       grep -A6 "Test Case 10 " "$1" | grep -q 'Error: "filesize" not defined'
+       pass_fail "TC10: load 2MB from the last 1MB of $4 - generic fail case"
+
+       # Check 1mb chunk write
+       grep -A3 "Test Case 11a " "$1" | \
+               egrep -q '1048576 bytes written|update journal'
+       pass_fail "TC11: 1MB write to $5 - write succeeded"
+       check_md5 "Test Case 11b " "$1" "$2" 1 \
+               "TC11: 1MB write to $5 - content verified"
+       echo "** End $1"
+}
+
+# Takes in one parameter which is "fs" or "nonfs", which then dictates
+# if a fs test (size/load/save) or a nonfs test (fatread/extread) needs to
+# be performed.
+function test_fs_nonfs() {
+       echo "Creating files in $fs image if not already present."
+       create_files $IMAGE $MD5_FILE_FS
+
+       OUT_FILE="${OUT}.fs.${fs}.out"
+       test_image $IMAGE $fs $SMALL_FILE $BIG_FILE $1 "" \
+               > ${OUT_FILE}
+       check_results $OUT_FILE $MD5_FILE_FS $SMALL_FILE $BIG_FILE \
+               $WRITE_FILE
+       TOTAL_FAIL=$((TOTAL_FAIL + FAIL))
+       TOTAL_PASS=$((TOTAL_PASS + PASS))
+       echo "Summary: PASS: $PASS FAIL: $FAIL"
+       echo "--------------------------------------------"
+}
+
+# ********************
+# * End of functions *
+# ********************
+
+check_clean "$1"
+check_prereq
+compile_sandbox
+prepare_env
+
+# Track TOTAL_FAIL and TOTAL_PASS
+TOTAL_FAIL=0
+TOTAL_PASS=0
+
+# In each loop, for a given file system image, we test both the
+# fs command, like load/size/write, the file system specific command
+# like: ext4load/ext4size/ext4write and the sb load/ls/save commands.
+for fs in ext4 fat; do
+
+       echo "Creating $fs image if not already present."
+       IMAGE=${IMG}.${fs}.img
+       MD5_FILE_FS="${MD5_FILE}.${fs}"
+       create_image $IMAGE $fs
+
+       # sb commands test
+       echo "Creating files in $fs image if not already present."
+       create_files $IMAGE $MD5_FILE_FS
+
+       # Lets mount the image and test sb hostfs commands
+       mkdir -p "$MOUNT_DIR"
+       if [ "$fs" = "fat" ]; then
+               uid="uid=`id -u`"
+       else
+               uid=""
+       fi
+       sudo mount -o loop,rw,$uid "$IMAGE" "$MOUNT_DIR"
+       sudo chmod 777 "$MOUNT_DIR"
+
+       OUT_FILE="${OUT}.sb.${fs}.out"
+       test_image $IMAGE $fs $SMALL_FILE $BIG_FILE sb `pwd`/$MOUNT_DIR \
+               > ${OUT_FILE}
+       sudo umount "$MOUNT_DIR"
+       rmdir "$MOUNT_DIR"
+
+       check_results $OUT_FILE $MD5_FILE_FS $SMALL_FILE $BIG_FILE \
+               $WRITE_FILE
+       TOTAL_FAIL=$((TOTAL_FAIL + FAIL))
+       TOTAL_PASS=$((TOTAL_PASS + PASS))
+       echo "Summary: PASS: $PASS FAIL: $FAIL"
+       echo "--------------------------------------------"
+
+       test_fs_nonfs nonfs
+       test_fs_nonfs fs
+done
+
+echo "Total Summary: TOTAL PASS: $TOTAL_PASS TOTAL FAIL: $TOTAL_FAIL"
+echo "--------------------------------------------"
+if [ $TOTAL_FAIL -eq 0 ]; then
+       echo "PASSED"
+       exit 0
+else
+       echo "FAILED"
+       exit 1
+fi
index c422b76054922f53cb0e9a2438ca8d97f2d79afb..a4216a1de7e73a30532683dccc524f2eff8143ac 100644 (file)
@@ -126,6 +126,8 @@ hostprogs-$(CONFIG_EXYNOS5250) += mkexynosspl
 hostprogs-$(CONFIG_EXYNOS5420) += mkexynosspl
 HOSTCFLAGS_mkexynosspl.o := -pedantic
 
+hostprogs-$(CONFIG_X86) += ifdtool
+
 hostprogs-$(CONFIG_MX23) += mxsboot
 hostprogs-$(CONFIG_MX28) += mxsboot
 HOSTCFLAGS_mxsboot.o := -pedantic
diff --git a/tools/ifdtool.c b/tools/ifdtool.c
new file mode 100644 (file)
index 0000000..a4b481f
--- /dev/null
@@ -0,0 +1,1039 @@
+/*
+ * ifdtool - Manage Intel Firmware Descriptor information
+ *
+ * Copyright 2014 Google, Inc
+ *
+ * SPDX-License-Identifier:    GPL-2.0
+ *
+ * From Coreboot project, but it got a serious code clean-up
+ * and a few new features
+ */
+
+#include <assert.h>
+#include <fcntl.h>
+#include <getopt.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include "ifdtool.h"
+
+#undef DEBUG
+
+#ifdef DEBUG
+#define debug(fmt, args...)    printf(fmt, ##args)
+#else
+#define debug(fmt, args...)
+#endif
+
+#define FD_SIGNATURE           0x0FF0A55A
+#define FLREG_BASE(reg)                ((reg & 0x00000fff) << 12);
+#define FLREG_LIMIT(reg)       (((reg & 0x0fff0000) >> 4) | 0xfff);
+
+/**
+ * find_fd() - Find the flash description in the ROM image
+ *
+ * @image:     Pointer to image
+ * @size:      Size of image in bytes
+ * @return pointer to structure, or NULL if not found
+ */
+static struct fdbar_t *find_fd(char *image, int size)
+{
+       uint32_t *ptr, *end;
+
+       /* Scan for FD signature */
+       for (ptr = (uint32_t *)image, end = ptr + size / 4; ptr < end; ptr++) {
+               if (*ptr == FD_SIGNATURE)
+                       break;
+       }
+
+       if (ptr == end) {
+               printf("No Flash Descriptor found in this image\n");
+               return NULL;
+       }
+
+       debug("Found Flash Descriptor signature at 0x%08x\n", i);
+
+       return (struct fdbar_t *)ptr;
+}
+
+/**
+ * get_region() - Get information about the selected region
+ *
+ * @frba:              Flash region list
+ * @region_type:       Type of region (0..MAX_REGIONS-1)
+ * @region:            Region information is written here
+ * @return 0 if OK, else -ve
+ */
+static int get_region(struct frba_t *frba, int region_type,
+                     struct region_t *region)
+{
+       if (region_type >= MAX_REGIONS) {
+               fprintf(stderr, "Invalid region type.\n");
+               return -1;
+       }
+
+       region->base = FLREG_BASE(frba->flreg[region_type]);
+       region->limit = FLREG_LIMIT(frba->flreg[region_type]);
+       region->size = region->limit - region->base + 1;
+
+       return 0;
+}
+
+static const char *region_name(int region_type)
+{
+       static const char *const regions[] = {
+               "Flash Descriptor",
+               "BIOS",
+               "Intel ME",
+               "GbE",
+               "Platform Data"
+       };
+
+       assert(region_type < MAX_REGIONS);
+
+       return regions[region_type];
+}
+
+static const char *region_filename(int region_type)
+{
+       static const char *const region_filenames[] = {
+               "flashregion_0_flashdescriptor.bin",
+               "flashregion_1_bios.bin",
+               "flashregion_2_intel_me.bin",
+               "flashregion_3_gbe.bin",
+               "flashregion_4_platform_data.bin"
+       };
+
+       assert(region_type < MAX_REGIONS);
+
+       return region_filenames[region_type];
+}
+
+static int dump_region(int num, struct frba_t *frba)
+{
+       struct region_t region;
+       int ret;
+
+       ret = get_region(frba, num, &region);
+       if (ret)
+               return ret;
+
+       printf("  Flash Region %d (%s): %08x - %08x %s\n",
+              num, region_name(num), region.base, region.limit,
+              region.size < 1 ? "(unused)" : "");
+
+       return ret;
+}
+
+static void dump_frba(struct frba_t *frba)
+{
+       int i;
+
+       printf("Found Region Section\n");
+       for (i = 0; i < MAX_REGIONS; i++) {
+               printf("FLREG%d:    0x%08x\n", i, frba->flreg[i]);
+               dump_region(i, frba);
+       }
+}
+
+static void decode_spi_frequency(unsigned int freq)
+{
+       switch (freq) {
+       case SPI_FREQUENCY_20MHZ:
+               printf("20MHz");
+               break;
+       case SPI_FREQUENCY_33MHZ:
+               printf("33MHz");
+               break;
+       case SPI_FREQUENCY_50MHZ:
+               printf("50MHz");
+               break;
+       default:
+               printf("unknown<%x>MHz", freq);
+       }
+}
+
+static void decode_component_density(unsigned int density)
+{
+       switch (density) {
+       case COMPONENT_DENSITY_512KB:
+               printf("512KiB");
+               break;
+       case COMPONENT_DENSITY_1MB:
+               printf("1MiB");
+               break;
+       case COMPONENT_DENSITY_2MB:
+               printf("2MiB");
+               break;
+       case COMPONENT_DENSITY_4MB:
+               printf("4MiB");
+               break;
+       case COMPONENT_DENSITY_8MB:
+               printf("8MiB");
+               break;
+       case COMPONENT_DENSITY_16MB:
+               printf("16MiB");
+               break;
+       default:
+               printf("unknown<%x>MiB", density);
+       }
+}
+
+static void dump_fcba(struct fcba_t *fcba)
+{
+       printf("\nFound Component Section\n");
+       printf("FLCOMP     0x%08x\n", fcba->flcomp);
+       printf("  Dual Output Fast Read Support:       %ssupported\n",
+              (fcba->flcomp & (1 << 30)) ? "" : "not ");
+       printf("  Read ID/Read Status Clock Frequency: ");
+       decode_spi_frequency((fcba->flcomp >> 27) & 7);
+       printf("\n  Write/Erase Clock Frequency:         ");
+       decode_spi_frequency((fcba->flcomp >> 24) & 7);
+       printf("\n  Fast Read Clock Frequency:           ");
+       decode_spi_frequency((fcba->flcomp >> 21) & 7);
+       printf("\n  Fast Read Support:                   %ssupported",
+              (fcba->flcomp & (1 << 20)) ? "" : "not ");
+       printf("\n  Read Clock Frequency:                ");
+       decode_spi_frequency((fcba->flcomp >> 17) & 7);
+       printf("\n  Component 2 Density:                 ");
+       decode_component_density((fcba->flcomp >> 3) & 7);
+       printf("\n  Component 1 Density:                 ");
+       decode_component_density(fcba->flcomp & 7);
+       printf("\n");
+       printf("FLILL      0x%08x\n", fcba->flill);
+       printf("  Invalid Instruction 3: 0x%02x\n",
+              (fcba->flill >> 24) & 0xff);
+       printf("  Invalid Instruction 2: 0x%02x\n",
+              (fcba->flill >> 16) & 0xff);
+       printf("  Invalid Instruction 1: 0x%02x\n",
+              (fcba->flill >> 8) & 0xff);
+       printf("  Invalid Instruction 0: 0x%02x\n",
+              fcba->flill & 0xff);
+       printf("FLPB       0x%08x\n", fcba->flpb);
+       printf("  Flash Partition Boundary Address: 0x%06x\n\n",
+              (fcba->flpb & 0xfff) << 12);
+}
+
+static void dump_fpsba(struct fpsba_t *fpsba)
+{
+       int i;
+
+       printf("Found PCH Strap Section\n");
+       for (i = 0; i < MAX_STRAPS; i++)
+               printf("PCHSTRP%-2d:  0x%08x\n", i, fpsba->pchstrp[i]);
+}
+
+static const char *get_enabled(int flag)
+{
+       return flag ? "enabled" : "disabled";
+}
+
+static void decode_flmstr(uint32_t flmstr)
+{
+       printf("  Platform Data Region Write Access: %s\n",
+              get_enabled(flmstr & (1 << 28)));
+       printf("  GbE Region Write Access:           %s\n",
+              get_enabled(flmstr & (1 << 27)));
+       printf("  Intel ME Region Write Access:      %s\n",
+              get_enabled(flmstr & (1 << 26)));
+       printf("  Host CPU/BIOS Region Write Access: %s\n",
+              get_enabled(flmstr & (1 << 25)));
+       printf("  Flash Descriptor Write Access:     %s\n",
+              get_enabled(flmstr & (1 << 24)));
+
+       printf("  Platform Data Region Read Access:  %s\n",
+              get_enabled(flmstr & (1 << 20)));
+       printf("  GbE Region Read Access:            %s\n",
+              get_enabled(flmstr & (1 << 19)));
+       printf("  Intel ME Region Read Access:       %s\n",
+              get_enabled(flmstr & (1 << 18)));
+       printf("  Host CPU/BIOS Region Read Access:  %s\n",
+              get_enabled(flmstr & (1 << 17)));
+       printf("  Flash Descriptor Read Access:      %s\n",
+              get_enabled(flmstr & (1 << 16)));
+
+       printf("  Requester ID:                      0x%04x\n\n",
+              flmstr & 0xffff);
+}
+
+static void dump_fmba(struct fmba_t *fmba)
+{
+       printf("Found Master Section\n");
+       printf("FLMSTR1:   0x%08x (Host CPU/BIOS)\n", fmba->flmstr1);
+       decode_flmstr(fmba->flmstr1);
+       printf("FLMSTR2:   0x%08x (Intel ME)\n", fmba->flmstr2);
+       decode_flmstr(fmba->flmstr2);
+       printf("FLMSTR3:   0x%08x (GbE)\n", fmba->flmstr3);
+       decode_flmstr(fmba->flmstr3);
+}
+
+static void dump_fmsba(struct fmsba_t *fmsba)
+{
+       int i;
+
+       printf("Found Processor Strap Section\n");
+       for (i = 0; i < 4; i++)
+               printf("????:      0x%08x\n", fmsba->data[0]);
+}
+
+static void dump_jid(uint32_t jid)
+{
+       printf("    SPI Component Device ID 1:          0x%02x\n",
+              (jid >> 16) & 0xff);
+       printf("    SPI Component Device ID 0:          0x%02x\n",
+              (jid >> 8) & 0xff);
+       printf("    SPI Component Vendor ID:            0x%02x\n",
+              jid & 0xff);
+}
+
+static void dump_vscc(uint32_t vscc)
+{
+       printf("    Lower Erase Opcode:                 0x%02x\n",
+              vscc >> 24);
+       printf("    Lower Write Enable on Write Status: 0x%02x\n",
+              vscc & (1 << 20) ? 0x06 : 0x50);
+       printf("    Lower Write Status Required:        %s\n",
+              vscc & (1 << 19) ? "Yes" : "No");
+       printf("    Lower Write Granularity:            %d bytes\n",
+              vscc & (1 << 18) ? 64 : 1);
+       printf("    Lower Block / Sector Erase Size:    ");
+       switch ((vscc >> 16) & 0x3) {
+       case 0:
+               printf("256 Byte\n");
+               break;
+       case 1:
+               printf("4KB\n");
+               break;
+       case 2:
+               printf("8KB\n");
+               break;
+       case 3:
+               printf("64KB\n");
+               break;
+       }
+
+       printf("    Upper Erase Opcode:                 0x%02x\n",
+              (vscc >> 8) & 0xff);
+       printf("    Upper Write Enable on Write Status: 0x%02x\n",
+              vscc & (1 << 4) ? 0x06 : 0x50);
+       printf("    Upper Write Status Required:        %s\n",
+              vscc & (1 << 3) ? "Yes" : "No");
+       printf("    Upper Write Granularity:            %d bytes\n",
+              vscc & (1 << 2) ? 64 : 1);
+       printf("    Upper Block / Sector Erase Size:    ");
+       switch (vscc & 0x3) {
+       case 0:
+               printf("256 Byte\n");
+               break;
+       case 1:
+               printf("4KB\n");
+               break;
+       case 2:
+               printf("8KB\n");
+               break;
+       case 3:
+               printf("64KB\n");
+               break;
+       }
+}
+
+static void dump_vtba(struct vtba_t *vtba, int vtl)
+{
+       int i;
+       int num = (vtl >> 1) < 8 ? (vtl >> 1) : 8;
+
+       printf("ME VSCC table:\n");
+       for (i = 0; i < num; i++) {
+               printf("  JID%d:  0x%08x\n", i, vtba->entry[i].jid);
+               dump_jid(vtba->entry[i].jid);
+               printf("  VSCC%d: 0x%08x\n", i, vtba->entry[i].vscc);
+               dump_vscc(vtba->entry[i].vscc);
+       }
+       printf("\n");
+}
+
+static void dump_oem(uint8_t *oem)
+{
+       int i, j;
+       printf("OEM Section:\n");
+       for (i = 0; i < 4; i++) {
+               printf("%02x:", i << 4);
+               for (j = 0; j < 16; j++)
+                       printf(" %02x", oem[(i<<4)+j]);
+               printf("\n");
+       }
+       printf("\n");
+}
+
+/**
+ * dump_fd() - Display a dump of the full flash description
+ *
+ * @image:     Pointer to image
+ * @size:      Size of image in bytes
+ * @return 0 if OK, -1 on error
+ */
+static int dump_fd(char *image, int size)
+{
+       struct fdbar_t *fdb = find_fd(image, size);
+
+       if (!fdb)
+               return -1;
+
+       printf("FLMAP0:    0x%08x\n", fdb->flmap0);
+       printf("  NR:      %d\n", (fdb->flmap0 >> 24) & 7);
+       printf("  FRBA:    0x%x\n", ((fdb->flmap0 >> 16) & 0xff) << 4);
+       printf("  NC:      %d\n", ((fdb->flmap0 >> 8) & 3) + 1);
+       printf("  FCBA:    0x%x\n", ((fdb->flmap0) & 0xff) << 4);
+
+       printf("FLMAP1:    0x%08x\n", fdb->flmap1);
+       printf("  ISL:     0x%02x\n", (fdb->flmap1 >> 24) & 0xff);
+       printf("  FPSBA:   0x%x\n", ((fdb->flmap1 >> 16) & 0xff) << 4);
+       printf("  NM:      %d\n", (fdb->flmap1 >> 8) & 3);
+       printf("  FMBA:    0x%x\n", ((fdb->flmap1) & 0xff) << 4);
+
+       printf("FLMAP2:    0x%08x\n", fdb->flmap2);
+       printf("  PSL:     0x%04x\n", (fdb->flmap2 >> 8) & 0xffff);
+       printf("  FMSBA:   0x%x\n", ((fdb->flmap2) & 0xff) << 4);
+
+       printf("FLUMAP1:   0x%08x\n", fdb->flumap1);
+       printf("  Intel ME VSCC Table Length (VTL):        %d\n",
+              (fdb->flumap1 >> 8) & 0xff);
+       printf("  Intel ME VSCC Table Base Address (VTBA): 0x%06x\n\n",
+              (fdb->flumap1 & 0xff) << 4);
+       dump_vtba((struct vtba_t *)
+                       (image + ((fdb->flumap1 & 0xff) << 4)),
+                       (fdb->flumap1 >> 8) & 0xff);
+       dump_oem((uint8_t *)image + 0xf00);
+       dump_frba((struct frba_t *)(image + (((fdb->flmap0 >> 16) & 0xff)
+                       << 4)));
+       dump_fcba((struct fcba_t *)(image + (((fdb->flmap0) & 0xff) << 4)));
+       dump_fpsba((struct fpsba_t *)
+                       (image + (((fdb->flmap1 >> 16) & 0xff) << 4)));
+       dump_fmba((struct fmba_t *)(image + (((fdb->flmap1) & 0xff) << 4)));
+       dump_fmsba((struct fmsba_t *)(image + (((fdb->flmap2) & 0xff) << 4)));
+
+       return 0;
+}
+
+/**
+ * write_regions() - Write each region from an image to its own file
+ *
+ * The filename to use in each case is fixed - see region_filename()
+ *
+ * @image:     Pointer to image
+ * @size:      Size of image in bytes
+ * @return 0 if OK, -ve on error
+ */
+static int write_regions(char *image, int size)
+{
+       struct fdbar_t *fdb;
+       struct frba_t *frba;
+       int ret = 0;
+       int i;
+
+       fdb =  find_fd(image, size);
+       if (!fdb)
+               return -1;
+
+       frba = (struct frba_t *)(image + (((fdb->flmap0 >> 16) & 0xff) << 4));
+
+       for (i = 0; i < MAX_REGIONS; i++) {
+               struct region_t region;
+               int region_fd;
+
+               ret = get_region(frba, i, &region);
+               if (ret)
+                       return ret;
+               dump_region(i, frba);
+               if (region.size == 0)
+                       continue;
+               region_fd = open(region_filename(i),
+                                O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR |
+                                S_IWUSR | S_IRGRP | S_IROTH);
+               if (write(region_fd, image + region.base, region.size) !=
+                               region.size) {
+                       perror("Error while writing");
+                       ret = -1;
+               }
+               close(region_fd);
+       }
+
+       return ret;
+}
+
+/**
+ * write_image() - Write the image to a file
+ *
+ * @filename:  Filename to use for the image
+ * @image:     Pointer to image
+ * @size:      Size of image in bytes
+ * @return 0 if OK, -ve on error
+ */
+static int write_image(char *filename, char *image, int size)
+{
+       int new_fd;
+
+       debug("Writing new image to %s\n", filename);
+
+       new_fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR |
+                     S_IWUSR | S_IRGRP | S_IROTH);
+       if (write(new_fd, image, size) != size) {
+               perror("Error while writing");
+               return -1;
+       }
+       close(new_fd);
+
+       return 0;
+}
+
+/**
+ * set_spi_frequency() - Set the SPI frequency to use when booting
+ *
+ * Several frequencies are supported, some of which work with fast devices.
+ * For SPI emulators, the slowest (SPI_FREQUENCY_20MHZ) is often used. The
+ * Intel boot system uses this information somehow on boot.
+ *
+ * The image is updated with the supplied value
+ *
+ * @image:     Pointer to image
+ * @size:      Size of image in bytes
+ * @freq:      SPI frequency to use
+ */
+static void set_spi_frequency(char *image, int size, enum spi_frequency freq)
+{
+       struct fdbar_t *fdb = find_fd(image, size);
+       struct fcba_t *fcba;
+
+       fcba = (struct fcba_t *)(image + (((fdb->flmap0) & 0xff) << 4));
+
+       /* clear bits 21-29 */
+       fcba->flcomp &= ~0x3fe00000;
+       /* Read ID and Read Status Clock Frequency */
+       fcba->flcomp |= freq << 27;
+       /* Write and Erase Clock Frequency */
+       fcba->flcomp |= freq << 24;
+       /* Fast Read Clock Frequency */
+       fcba->flcomp |= freq << 21;
+}
+
+/**
+ * set_em100_mode() - Set a SPI frequency that will work with Dediprog EM100
+ *
+ * @image:     Pointer to image
+ * @size:      Size of image in bytes
+ */
+static void set_em100_mode(char *image, int size)
+{
+       struct fdbar_t *fdb = find_fd(image, size);
+       struct fcba_t *fcba;
+
+       fcba = (struct fcba_t *)(image + (((fdb->flmap0) & 0xff) << 4));
+       fcba->flcomp &= ~(1 << 30);
+       set_spi_frequency(image, size, SPI_FREQUENCY_20MHZ);
+}
+
+/**
+ * lock_descriptor() - Lock the NE descriptor so it cannot be updated
+ *
+ * @image:     Pointer to image
+ * @size:      Size of image in bytes
+ */
+static void lock_descriptor(char *image, int size)
+{
+       struct fdbar_t *fdb = find_fd(image, size);
+       struct fmba_t *fmba;
+
+       /*
+        * TODO: Dynamically take Platform Data Region and GbE Region into
+        * account.
+        */
+       fmba = (struct fmba_t *)(image + (((fdb->flmap1) & 0xff) << 4));
+       fmba->flmstr1 = 0x0a0b0000;
+       fmba->flmstr2 = 0x0c0d0000;
+       fmba->flmstr3 = 0x08080118;
+}
+
+/**
+ * unlock_descriptor() - Lock the NE descriptor so it can be updated
+ *
+ * @image:     Pointer to image
+ * @size:      Size of image in bytes
+ */
+static void unlock_descriptor(char *image, int size)
+{
+       struct fdbar_t *fdb = find_fd(image, size);
+       struct fmba_t *fmba;
+
+       fmba = (struct fmba_t *)(image + (((fdb->flmap1) & 0xff) << 4));
+       fmba->flmstr1 = 0xffff0000;
+       fmba->flmstr2 = 0xffff0000;
+       fmba->flmstr3 = 0x08080118;
+}
+
+/**
+ * open_for_read() - Open a file for reading
+ *
+ * @fname:     Filename to open
+ * @sizep:     Returns file size in bytes
+ * @return 0 if OK, -1 on error
+ */
+int open_for_read(const char *fname, int *sizep)
+{
+       int fd = open(fname, O_RDONLY);
+       struct stat buf;
+
+       if (fd == -1) {
+               perror("Could not open file");
+               return -1;
+       }
+       if (fstat(fd, &buf) == -1) {
+               perror("Could not stat file");
+               return -1;
+       }
+       *sizep = buf.st_size;
+       debug("File %s is %d bytes\n", fname, *sizep);
+
+       return fd;
+}
+
+/**
+ * inject_region() - Add a file to an image region
+ *
+ * This puts a file into a particular region of the flash. Several pre-defined
+ * regions are used.
+ *
+ * @image:             Pointer to image
+ * @size:              Size of image in bytes
+ * @region_type:       Region where the file should be added
+ * @region_fname:      Filename to add to the image
+ * @return 0 if OK, -ve on error
+ */
+int inject_region(char *image, int size, int region_type, char *region_fname)
+{
+       struct fdbar_t *fdb = find_fd(image, size);
+       struct region_t region;
+       struct frba_t *frba;
+       int region_size;
+       int offset = 0;
+       int region_fd;
+       int ret;
+
+       if (!fdb)
+               exit(EXIT_FAILURE);
+       frba = (struct frba_t *)(image + (((fdb->flmap0 >> 16) & 0xff) << 4));
+
+       ret = get_region(frba, region_type, &region);
+       if (ret)
+               return -1;
+       if (region.size <= 0xfff) {
+               fprintf(stderr, "Region %s is disabled in target. Not injecting.\n",
+                       region_name(region_type));
+               return -1;
+       }
+
+       region_fd = open_for_read(region_fname, &region_size);
+       if (region_fd < 0)
+               return region_fd;
+
+       if ((region_size > region.size) ||
+           ((region_type != 1) && (region_size > region.size))) {
+               fprintf(stderr, "Region %s is %d(0x%x) bytes. File is %d(0x%x)  bytes. Not injecting.\n",
+                       region_name(region_type), region.size,
+                       region.size, region_size, region_size);
+               return -1;
+       }
+
+       if ((region_type == 1) && (region_size < region.size)) {
+               fprintf(stderr, "Region %s is %d(0x%x) bytes. File is %d(0x%x) bytes. Padding before injecting.\n",
+                       region_name(region_type), region.size,
+                       region.size, region_size, region_size);
+               offset = region.size - region_size;
+               memset(image + region.base, 0xff, offset);
+       }
+
+       if (size < region.base + offset + region_size) {
+               fprintf(stderr, "Output file is too small. (%d < %d)\n",
+                       size, region.base + offset + region_size);
+               return -1;
+       }
+
+       if (read(region_fd, image + region.base + offset, region_size)
+                                                       != region_size) {
+               perror("Could not read file");
+               return -1;
+       }
+
+       close(region_fd);
+
+       debug("Adding %s as the %s section\n", region_fname,
+             region_name(region_type));
+
+       return 0;
+}
+
+/**
+ * write_data() - Write some raw data into a region
+ *
+ * This puts a file into a particular place in the flash, ignoring the
+ * regions. Be careful not to overwrite something important.
+ *
+ * @image:             Pointer to image
+ * @size:              Size of image in bytes
+ * @addr:              x86 ROM address to put file. The ROM ends at
+ *                     0xffffffff so use an address relative to that. For an
+ *                     8MB ROM the start address is 0xfff80000.
+ * @write_fname:       Filename to add to the image
+ * @return 0 if OK, -ve on error
+ */
+static int write_data(char *image, int size, unsigned int addr,
+                     const char *write_fname)
+{
+       int write_fd, write_size;
+       int offset;
+
+       write_fd = open_for_read(write_fname, &write_size);
+       if (write_fd < 0)
+               return write_fd;
+
+       offset = addr + size;
+       debug("Writing %s to offset %#x\n", write_fname, offset);
+
+       if (offset < 0 || offset + write_size > size) {
+               fprintf(stderr, "Output file is too small. (%d < %d)\n",
+                       size, offset + write_size);
+               return -1;
+       }
+
+       if (read(write_fd, image + offset, write_size) != write_size) {
+               perror("Could not read file");
+               return -1;
+       }
+
+       close(write_fd);
+
+       return 0;
+}
+
+static void print_version(void)
+{
+       printf("ifdtool v%s -- ", IFDTOOL_VERSION);
+       printf("Copyright (C) 2014 Google Inc.\n\n");
+       printf("SPDX-License-Identifier:        GPL-2.0+\n");
+}
+
+static void print_usage(const char *name)
+{
+       printf("usage: %s [-vhdix?] <filename> [<outfile>]\n", name);
+       printf("\n"
+              "   -d | --dump:                      dump intel firmware descriptor\n"
+              "   -x | --extract:                   extract intel fd modules\n"
+              "   -i | --inject <region>:<module>   inject file <module> into region <region>\n"
+              "   -w | --write <addr>:<file>        write file to appear at memory address <addr>\n"
+              "   -s | --spifreq <20|33|50>         set the SPI frequency\n"
+              "   -e | --em100                      set SPI frequency to 20MHz and disable\n"
+              "                                     Dual Output Fast Read Support\n"
+              "   -l | --lock                       Lock firmware descriptor and ME region\n"
+              "   -u | --unlock                     Unlock firmware descriptor and ME region\n"
+              "   -r | --romsize                    Specify ROM size\n"
+              "   -D | --write-descriptor <file>    Write descriptor at base\n"
+              "   -c | --create                     Create a new empty image\n"
+              "   -v | --version:                   print the version\n"
+              "   -h | --help:                      print this help\n\n"
+              "<region> is one of Descriptor, BIOS, ME, GbE, Platform\n"
+              "\n");
+}
+
+/**
+ * get_two_words() - Convert a string into two words separated by :
+ *
+ * The supplied string is split at ':', two substrings are allocated and
+ * returned.
+ *
+ * @str:       String to split
+ * @firstp:    Returns first string
+ * @secondp:   Returns second string
+ * @return 0 if OK, -ve if @str does not have a :
+ */
+static int get_two_words(const char *str, char **firstp, char **secondp)
+{
+       const char *p;
+
+       p = strchr(str, ':');
+       if (!p)
+               return -1;
+       *firstp = strdup(str);
+       (*firstp)[p - str] = '\0';
+       *secondp = strdup(p + 1);
+
+       return 0;
+}
+
+int main(int argc, char *argv[])
+{
+       int opt, option_index = 0;
+       int mode_dump = 0, mode_extract = 0, mode_inject = 0;
+       int mode_spifreq = 0, mode_em100 = 0, mode_locked = 0;
+       int mode_unlocked = 0, mode_write = 0, mode_write_descriptor = 0;
+       int create = 0;
+       char *region_type_string = NULL, *src_fname = NULL;
+       char *addr_str = NULL;
+       int region_type = -1, inputfreq = 0;
+       enum spi_frequency spifreq = SPI_FREQUENCY_20MHZ;
+       unsigned int addr = 0;
+       int rom_size = -1;
+       bool write_it;
+       char *filename;
+       char *outfile = NULL;
+       struct stat buf;
+       int size = 0;
+       int bios_fd;
+       char *image;
+       int ret;
+       static struct option long_options[] = {
+               {"create", 0, NULL, 'c'},
+               {"dump", 0, NULL, 'd'},
+               {"descriptor", 1, NULL, 'D'},
+               {"em100", 0, NULL, 'e'},
+               {"extract", 0, NULL, 'x'},
+               {"inject", 1, NULL, 'i'},
+               {"lock", 0, NULL, 'l'},
+               {"romsize", 1, NULL, 'r'},
+               {"spifreq", 1, NULL, 's'},
+               {"unlock", 0, NULL, 'u'},
+               {"write", 1, NULL, 'w'},
+               {"version", 0, NULL, 'v'},
+               {"help", 0, NULL, 'h'},
+               {0, 0, 0, 0}
+       };
+
+       while ((opt = getopt_long(argc, argv, "cdD:ehi:lr:s:uvw:x?",
+                                 long_options, &option_index)) != EOF) {
+               switch (opt) {
+               case 'c':
+                       create = 1;
+                       break;
+               case 'd':
+                       mode_dump = 1;
+                       break;
+               case 'D':
+                       mode_write_descriptor = 1;
+                       src_fname = optarg;
+                       break;
+               case 'e':
+                       mode_em100 = 1;
+                       break;
+               case 'i':
+                       if (get_two_words(optarg, &region_type_string,
+                                         &src_fname)) {
+                               print_usage(argv[0]);
+                               exit(EXIT_FAILURE);
+                       }
+                       if (!strcasecmp("Descriptor", region_type_string))
+                               region_type = 0;
+                       else if (!strcasecmp("BIOS", region_type_string))
+                               region_type = 1;
+                       else if (!strcasecmp("ME", region_type_string))
+                               region_type = 2;
+                       else if (!strcasecmp("GbE", region_type_string))
+                               region_type = 3;
+                       else if (!strcasecmp("Platform", region_type_string))
+                               region_type = 4;
+                       if (region_type == -1) {
+                               fprintf(stderr, "No such region type: '%s'\n\n",
+                                       region_type_string);
+                               print_usage(argv[0]);
+                               exit(EXIT_FAILURE);
+                       }
+                       mode_inject = 1;
+                       break;
+               case 'l':
+                       mode_locked = 1;
+                       break;
+               case 'r':
+                       rom_size = strtol(optarg, NULL, 0);
+                       debug("ROM size %d\n", rom_size);
+                       break;
+               case 's':
+                       /* Parse the requested SPI frequency */
+                       inputfreq = strtol(optarg, NULL, 0);
+                       switch (inputfreq) {
+                       case 20:
+                               spifreq = SPI_FREQUENCY_20MHZ;
+                               break;
+                       case 33:
+                               spifreq = SPI_FREQUENCY_33MHZ;
+                               break;
+                       case 50:
+                               spifreq = SPI_FREQUENCY_50MHZ;
+                               break;
+                       default:
+                               fprintf(stderr, "Invalid SPI Frequency: %d\n",
+                                       inputfreq);
+                               print_usage(argv[0]);
+                               exit(EXIT_FAILURE);
+                       }
+                       mode_spifreq = 1;
+                       break;
+               case 'u':
+                       mode_unlocked = 1;
+                       break;
+               case 'v':
+                       print_version();
+                       exit(EXIT_SUCCESS);
+                       break;
+               case 'w':
+                       mode_write = 1;
+                       if (get_two_words(optarg, &addr_str, &src_fname)) {
+                               print_usage(argv[0]);
+                               exit(EXIT_FAILURE);
+                       }
+                       addr = strtol(optarg, NULL, 0);
+                       break;
+               case 'x':
+                       mode_extract = 1;
+                       break;
+               case 'h':
+               case '?':
+               default:
+                       print_usage(argv[0]);
+                       exit(EXIT_SUCCESS);
+                       break;
+               }
+       }
+
+       if (mode_locked == 1 && mode_unlocked == 1) {
+               fprintf(stderr, "Locking/Unlocking FD and ME are mutually exclusive\n");
+               exit(EXIT_FAILURE);
+       }
+
+       if (mode_inject == 1 && mode_write == 1) {
+               fprintf(stderr, "Inject/Write are mutually exclusive\n");
+               exit(EXIT_FAILURE);
+       }
+
+       if ((mode_dump + mode_extract + mode_inject +
+               (mode_spifreq | mode_em100 | mode_unlocked |
+                mode_locked)) > 1) {
+               fprintf(stderr, "You may not specify more than one mode.\n\n");
+               print_usage(argv[0]);
+               exit(EXIT_FAILURE);
+       }
+
+       if ((mode_dump + mode_extract + mode_inject + mode_spifreq +
+            mode_em100 + mode_locked + mode_unlocked + mode_write +
+            mode_write_descriptor) == 0 && !create) {
+               fprintf(stderr, "You need to specify a mode.\n\n");
+               print_usage(argv[0]);
+               exit(EXIT_FAILURE);
+       }
+
+       if (create && rom_size == -1) {
+               fprintf(stderr, "You need to specify a rom size when creating.\n\n");
+               exit(EXIT_FAILURE);
+       }
+
+       if (optind + 1 != argc) {
+               fprintf(stderr, "You need to specify a file.\n\n");
+               print_usage(argv[0]);
+               exit(EXIT_FAILURE);
+       }
+
+       filename = argv[optind];
+       if (optind + 2 != argc)
+               outfile = argv[optind + 1];
+
+       if (create)
+               bios_fd = open(filename, O_WRONLY | O_CREAT, 0666);
+       else
+               bios_fd = open(filename, outfile ? O_RDONLY : O_RDWR);
+
+       if (bios_fd == -1) {
+               perror("Could not open file");
+               exit(EXIT_FAILURE);
+       }
+
+       if (!create) {
+               if (fstat(bios_fd, &buf) == -1) {
+                       perror("Could not stat file");
+                       exit(EXIT_FAILURE);
+               }
+               size = buf.st_size;
+       }
+
+       debug("File %s is %d bytes\n", filename, size);
+
+       if (rom_size == -1)
+               rom_size = size;
+
+       image = malloc(rom_size);
+       if (!image) {
+               printf("Out of memory.\n");
+               exit(EXIT_FAILURE);
+       }
+
+       memset(image, '\xff', rom_size);
+       if (!create && read(bios_fd, image, size) != size) {
+               perror("Could not read file");
+               exit(EXIT_FAILURE);
+       }
+       if (size != rom_size) {
+               debug("ROM size changed to %d bytes\n", rom_size);
+               size = rom_size;
+       }
+
+       write_it = true;
+       ret = 0;
+       if (mode_dump) {
+               ret = dump_fd(image, size);
+               write_it = false;
+       }
+
+       if (mode_extract) {
+               ret = write_regions(image, size);
+               write_it = false;
+       }
+
+       if (mode_write_descriptor)
+               ret = write_data(image, size, -size, src_fname);
+
+       if (mode_inject)
+               ret = inject_region(image, size, region_type, src_fname);
+
+       if (mode_write)
+               ret = write_data(image, size, addr, src_fname);
+
+       if (mode_spifreq)
+               set_spi_frequency(image, size, spifreq);
+
+       if (mode_em100)
+               set_em100_mode(image, size);
+
+       if (mode_locked)
+               lock_descriptor(image, size);
+
+       if (mode_unlocked)
+               unlock_descriptor(image, size);
+
+       if (write_it) {
+               if (outfile) {
+                       ret = write_image(outfile, image, size);
+               } else {
+                       if (lseek(bios_fd, 0, SEEK_SET)) {
+                               perror("Error while seeking");
+                               ret = -1;
+                       }
+                       if (write(bios_fd, image, size) != size) {
+                               perror("Error while writing");
+                               ret = -1;
+                       }
+               }
+       }
+
+       free(image);
+       close(bios_fd);
+
+       return ret ? 1 : 0;
+}
diff --git a/tools/ifdtool.h b/tools/ifdtool.h
new file mode 100644 (file)
index 0000000..fbec421
--- /dev/null
@@ -0,0 +1,88 @@
+/*
+ * ifdtool - Manage Intel Firmware Descriptor information
+ *
+ * Copyright (C) 2011 The ChromiumOS Authors.
+ *
+ * SPDX-License-Identifier:    GPL-2.0
+ *
+ * From Coreboot project
+ */
+
+#include <stdint.h>
+
+#define __packed       __attribute__((packed))
+
+#define IFDTOOL_VERSION "1.1-U-Boot"
+
+enum spi_frequency {
+       SPI_FREQUENCY_20MHZ = 0,
+       SPI_FREQUENCY_33MHZ = 1,
+       SPI_FREQUENCY_50MHZ = 4,
+};
+
+enum component_density {
+       COMPONENT_DENSITY_512KB = 0,
+       COMPONENT_DENSITY_1MB   = 1,
+       COMPONENT_DENSITY_2MB   = 2,
+       COMPONENT_DENSITY_4MB   = 3,
+       COMPONENT_DENSITY_8MB   = 4,
+       COMPONENT_DENSITY_16MB  = 5,
+};
+
+/* flash descriptor */
+struct __packed fdbar_t {
+       uint32_t flvalsig;
+       uint32_t flmap0;
+       uint32_t flmap1;
+       uint32_t flmap2;
+       uint8_t  reserved[0xefc - 0x20];
+       uint32_t flumap1;
+};
+
+#define MAX_REGIONS    5
+
+/* regions */
+struct __packed frba_t {
+       uint32_t flreg[MAX_REGIONS];
+};
+
+/* component section */
+struct __packed fcba_t {
+       uint32_t flcomp;
+       uint32_t flill;
+       uint32_t flpb;
+};
+
+#define MAX_STRAPS     18
+
+/* pch strap */
+struct __packed fpsba_t {
+       uint32_t pchstrp[MAX_STRAPS];
+};
+
+/* master */
+struct __packed fmba_t {
+       uint32_t flmstr1;
+       uint32_t flmstr2;
+       uint32_t flmstr3;
+};
+
+/* processor strap */
+struct __packed fmsba_t {
+       uint32_t data[8];
+};
+
+/* ME VSCC */
+struct vscc_t {
+       uint32_t jid;
+       uint32_t vscc;
+};
+
+struct vtba_t {
+       /* Actual number of entries specified in vtl */
+       struct vscc_t entry[8];
+};
+
+struct region_t {
+       int base, limit, size;
+};