]> git.ipfire.org Git - people/ms/u-boot.git/commitdiff
Merge branch 'master' of git://www.denx.de/git/u-boot-socfpga
authorTom Rini <trini@konsulko.com>
Wed, 29 Apr 2015 00:48:43 +0000 (20:48 -0400)
committerTom Rini <trini@konsulko.com>
Wed, 29 Apr 2015 00:48:43 +0000 (20:48 -0400)
408 files changed:
Licenses/README
Licenses/x11.txt [new file with mode: 0644]
MAINTAINERS
README
arch/arm/Kconfig
arch/arm/cpu/arm720t/start.S
arch/arm/cpu/arm926ejs/mxs/spl_boot.c
arch/arm/cpu/arm946es/cpu.c
arch/arm/cpu/armv7/ls102xa/clock.c
arch/arm/cpu/armv7/mx6/ddr.c
arch/arm/cpu/armv7/omap-common/boot-common.c
arch/arm/cpu/armv7/omap-common/utils.c
arch/arm/cpu/armv7/omap5/prcm-regs.c
arch/arm/cpu/armv7/vf610/generic.c
arch/arm/cpu/armv7m/Makefile [new file with mode: 0644]
arch/arm/cpu/armv7m/config.mk [new file with mode: 0644]
arch/arm/cpu/armv7m/cpu.c [new file with mode: 0644]
arch/arm/cpu/armv7m/start.S [new file with mode: 0644]
arch/arm/cpu/armv7m/stm32f4/Makefile [new file with mode: 0644]
arch/arm/cpu/armv7m/stm32f4/clock.c [new file with mode: 0644]
arch/arm/cpu/armv7m/stm32f4/flash.c [new file with mode: 0644]
arch/arm/cpu/armv7m/stm32f4/soc.c [new file with mode: 0644]
arch/arm/cpu/armv7m/stm32f4/timer.c [new file with mode: 0644]
arch/arm/cpu/armv8/fsl-lsch3/Makefile
arch/arm/cpu/armv8/fsl-lsch3/README
arch/arm/cpu/armv8/fsl-lsch3/cpu.c
arch/arm/cpu/armv8/fsl-lsch3/fdt.c
arch/arm/cpu/armv8/fsl-lsch3/fsl_lsch3_serdes.c [new file with mode: 0644]
arch/arm/cpu/armv8/fsl-lsch3/lowlevel.S
arch/arm/cpu/armv8/fsl-lsch3/ls2085a_serdes.c [new file with mode: 0644]
arch/arm/cpu/armv8/fsl-lsch3/mp.c
arch/arm/cpu/armv8/fsl-lsch3/mp.h
arch/arm/cpu/armv8/fsl-lsch3/soc.c [new file with mode: 0644]
arch/arm/cpu/armv8/fsl-lsch3/speed.c
arch/arm/cpu/armv8/generic_timer.c
arch/arm/cpu/armv8/u-boot-spl.lds [new file with mode: 0644]
arch/arm/dts/exynos4210-pinctrl-uboot.dtsi
arch/arm/dts/exynos4x12-pinctrl-uboot.dtsi
arch/arm/dts/exynos5250-pinctrl-uboot.dtsi
arch/arm/dts/exynos54xx-pinctrl-uboot.dtsi
arch/arm/dts/s5pc100-pinctrl.dtsi
arch/arm/dts/s5pc110-pinctrl.dtsi
arch/arm/imx-common/Makefile
arch/arm/imx-common/ddrmc-vf610.c [new file with mode: 0644]
arch/arm/include/asm/arch-am33xx/mux_am43xx.h
arch/arm/include/asm/arch-arm720t/hardware.h [deleted file]
arch/arm/include/asm/arch-fsl-lsch3/config.h
arch/arm/include/asm/arch-fsl-lsch3/fsl_serdes.h [new file with mode: 0644]
arch/arm/include/asm/arch-fsl-lsch3/immap_lsch3.h
arch/arm/include/asm/arch-fsl-lsch3/soc.h [new file with mode: 0644]
arch/arm/include/asm/arch-ls102xa/config.h
arch/arm/include/asm/arch-ls102xa/immap_ls102xa.h
arch/arm/include/asm/arch-mx6/mx6-ddr.h
arch/arm/include/asm/arch-stm32f4/fmc.h [new file with mode: 0644]
arch/arm/include/asm/arch-stm32f4/gpio.h [new file with mode: 0644]
arch/arm/include/asm/arch-stm32f4/stm32.h [new file with mode: 0644]
arch/arm/include/asm/arch-tegra114/hardware.h [deleted file]
arch/arm/include/asm/arch-tegra124/hardware.h [deleted file]
arch/arm/include/asm/arch-tegra20/hardware.h [deleted file]
arch/arm/include/asm/arch-tegra30/hardware.h [deleted file]
arch/arm/include/asm/arch-vf610/crm_regs.h
arch/arm/include/asm/arch-vf610/ddrmc-vf610.h [new file with mode: 0644]
arch/arm/include/asm/arch-vf610/imx-regs.h
arch/arm/include/asm/armv7m.h [new file with mode: 0644]
arch/arm/include/asm/fsl_secure_boot.h [new file with mode: 0644]
arch/arm/include/asm/imx-common/regs-usbphy.h [new file with mode: 0644]
arch/arm/include/asm/mach-types.h
arch/arm/include/asm/omap_common.h
arch/arm/include/asm/pcie_layerscape.h [deleted file]
arch/arm/lib/Makefile
arch/arm/lib/crt0.S
arch/arm/lib/crt0_64.S
arch/arm/lib/interrupts_m.c [new file with mode: 0644]
arch/arm/lib/relocate.S
arch/arm/lib/vectors_m.S [new file with mode: 0644]
arch/arm/mach-davinci/Kconfig
arch/arm/mach-integrator/Kconfig [new file with mode: 0644]
arch/m68k/cpu/u-boot.lds [new file with mode: 0644]
arch/mips/Kconfig
arch/mips/lib/bootm.c
arch/powerpc/cpu/mpc85xx/cpu_init_early.c
arch/powerpc/cpu/mpc85xx/speed.c
arch/powerpc/cpu/mpc85xx/start.S
arch/powerpc/include/asm/fsl_errata.h
arch/powerpc/include/asm/fsl_secure_boot.h
arch/sandbox/cpu/cpu.c
arch/sandbox/include/asm/bitops.h
arch/sandbox/include/asm/u-boot-sandbox.h
board/BuR/common/common.c
board/BuR/tseries/board.c
board/BuR/tseries/mux.c
board/BuS/eb_cpu5282/u-boot.lds [deleted file]
board/armltd/integrator/Kconfig [deleted file]
board/armltd/integrator/integrator.c
board/armltd/vexpress64/vexpress64.c
board/astro/mcf5373l/u-boot.lds [deleted file]
board/cobra5272/u-boot.lds [deleted file]
board/davinci/da8xxevm/Kconfig
board/davinci/da8xxevm/MAINTAINERS
board/davinci/da8xxevm/Makefile
board/davinci/da8xxevm/README.omapl138-lcdk [new file with mode: 0644]
board/davinci/da8xxevm/omapl138_lcdk.c [new file with mode: 0644]
board/freescale/bsc9132qds/bsc9132qds.c
board/freescale/c29xpcie/c29xpcie.c
board/freescale/common/Makefile
board/freescale/common/arm_sleep.c
board/freescale/common/cmd_esbc_validate.c
board/freescale/common/mpc85xx_sleep.c
board/freescale/common/qixis.c
board/freescale/ls1021aqds/MAINTAINERS
board/freescale/ls1021aqds/ls1021aqds.c
board/freescale/ls1021atwr/ls1021atwr.c
board/freescale/ls2085a/ls2085a.c
board/freescale/ls2085aqds/Kconfig [new file with mode: 0644]
board/freescale/ls2085aqds/MAINTAINERS [new file with mode: 0644]
board/freescale/ls2085aqds/Makefile [new file with mode: 0644]
board/freescale/ls2085aqds/README [new file with mode: 0644]
board/freescale/ls2085aqds/ddr.c [new file with mode: 0644]
board/freescale/ls2085aqds/ddr.h [new file with mode: 0644]
board/freescale/ls2085aqds/eth.c [new file with mode: 0644]
board/freescale/ls2085aqds/ls2085aqds.c [new file with mode: 0644]
board/freescale/ls2085aqds/ls2085aqds_qixis.h [new file with mode: 0644]
board/freescale/ls2085ardb/Kconfig [new file with mode: 0644]
board/freescale/ls2085ardb/MAINTAINERS [new file with mode: 0644]
board/freescale/ls2085ardb/Makefile [new file with mode: 0644]
board/freescale/ls2085ardb/README [new file with mode: 0644]
board/freescale/ls2085ardb/ddr.c [new file with mode: 0644]
board/freescale/ls2085ardb/ddr.h [new file with mode: 0644]
board/freescale/ls2085ardb/ls2085ardb.c [new file with mode: 0644]
board/freescale/ls2085ardb/ls2085ardb_qixis.h [new file with mode: 0644]
board/freescale/m5208evbe/u-boot.lds [deleted file]
board/freescale/m52277evb/u-boot.lds [deleted file]
board/freescale/m5235evb/u-boot.lds [deleted file]
board/freescale/m5249evb/u-boot.lds [deleted file]
board/freescale/m5253demo/u-boot.lds [deleted file]
board/freescale/m5253evbe/u-boot.lds [deleted file]
board/freescale/m5272c3/u-boot.lds [deleted file]
board/freescale/m5275evb/u-boot.lds [deleted file]
board/freescale/m5282evb/u-boot.lds [deleted file]
board/freescale/m53017evb/u-boot.lds [deleted file]
board/freescale/m5329evb/u-boot.lds [deleted file]
board/freescale/m5373evb/u-boot.lds [deleted file]
board/freescale/m54418twr/u-boot.lds [deleted file]
board/freescale/m54451evb/u-boot.lds [deleted file]
board/freescale/m54455evb/u-boot.lds [deleted file]
board/freescale/m547xevb/u-boot.lds [deleted file]
board/freescale/m548xevb/u-boot.lds [deleted file]
board/freescale/mx6sabresd/mx6sabresd.c
board/freescale/p1010rdb/p1010rdb.c
board/freescale/p1010rdb/spl.c
board/freescale/t208xrdb/ddr.h
board/freescale/t208xrdb/t208xrdb.c
board/freescale/vf610twr/vf610twr.c
board/gateworks/gw_ventana/eeprom.c
board/gateworks/gw_ventana/gsc.c
board/gateworks/gw_ventana/gsc.h
board/gateworks/gw_ventana/gw_ventana.c
board/gateworks/gw_ventana/gw_ventana_spl.c
board/gateworks/gw_ventana/ventana_eeprom.h
board/solidrun/mx6cuboxi/Kconfig [new file with mode: 0644]
board/solidrun/mx6cuboxi/MAINTAINERS [new file with mode: 0644]
board/solidrun/mx6cuboxi/Makefile [new file with mode: 0644]
board/solidrun/mx6cuboxi/README [new file with mode: 0644]
board/solidrun/mx6cuboxi/mx6cuboxi.c [new file with mode: 0644]
board/st/stm32f429-discovery/Kconfig [new file with mode: 0644]
board/st/stm32f429-discovery/MAINTAINERS [new file with mode: 0644]
board/st/stm32f429-discovery/Makefile [new file with mode: 0644]
board/st/stm32f429-discovery/led.c [new file with mode: 0644]
board/st/stm32f429-discovery/stm32f429-discovery.c [new file with mode: 0644]
board/sysam/amcore/u-boot.lds [deleted file]
board/ti/dra7xx/evm.c
board/toradex/colibri_vf/Kconfig [new file with mode: 0644]
board/toradex/colibri_vf/MAINTAINERS [new file with mode: 0644]
board/toradex/colibri_vf/Makefile [new file with mode: 0644]
board/toradex/colibri_vf/colibri_vf.c [new file with mode: 0644]
board/toradex/colibri_vf/imximage.cfg [new file with mode: 0644]
common/Kconfig
common/board_f.c
common/board_r.c
common/cmd_date.c
common/cmd_led.c
common/cmd_mem.c
common/cmd_mii.c
common/cmd_nand.c
common/cmd_scsi.c
common/cmd_sf.c
common/cmd_unzip.c
common/dlmalloc.c
common/fdt_support.c
common/spl/spl.c
common/spl/spl_nand.c
configs/colibri_vf_defconfig [new file with mode: 0644]
configs/integratorap_cm720t_defconfig
configs/integratorap_cm920t_defconfig
configs/integratorap_cm926ejs_defconfig
configs/integratorap_cm946es_defconfig
configs/integratorcp_cm1136_defconfig
configs/integratorcp_cm920t_defconfig
configs/integratorcp_cm926ejs_defconfig
configs/integratorcp_cm946es_defconfig
configs/ls1021aqds_ddr4_nor_lpuart_defconfig [new file with mode: 0644]
configs/ls2085aqds_defconfig [new file with mode: 0644]
configs/ls2085aqds_nand_defconfig [new file with mode: 0644]
configs/ls2085ardb_defconfig [new file with mode: 0644]
configs/ls2085ardb_nand_defconfig [new file with mode: 0644]
configs/mx6cuboxi_defconfig [new file with mode: 0644]
configs/omapl138_lcdk_defconfig [new file with mode: 0644]
configs/stm32f429-discovery_defconfig [new file with mode: 0644]
doc/driver-model/README.txt
doc/git-mailrc
drivers/core/Kconfig
drivers/core/device-remove.c
drivers/core/device.c
drivers/core/root.c
drivers/core/uclass.c
drivers/ddr/fsl/ctrl_regs.c
drivers/ddr/fsl/ddr4_dimm_params.c
drivers/ddr/fsl/fsl_ddr_gen4.c
drivers/ddr/fsl/interactive.c
drivers/ddr/fsl/lc_common_dimm_params.c
drivers/ddr/fsl/main.c
drivers/ddr/fsl/options.c
drivers/ddr/fsl/util.c
drivers/gpio/Makefile
drivers/gpio/mvgpio.h
drivers/gpio/mvmfp.c
drivers/gpio/stm32_gpio.c [new file with mode: 0644]
drivers/i2c/mxc_i2c.c
drivers/misc/Makefile
drivers/misc/fsl_debug_server.c [new file with mode: 0644]
drivers/misc/fsl_ifc.c
drivers/misc/status_led.c
drivers/mmc/fsl_esdhc.c
drivers/mtd/nand/fsl_ifc_nand.c
drivers/mtd/nand/fsl_ifc_spl.c
drivers/mtd/spi/sf_internal.h
drivers/mtd/spi/sf_ops.c
drivers/mtd/spi/sf_probe.c
drivers/net/Makefile
drivers/net/e1000.c
drivers/net/fm/eth.c
drivers/net/fm/memac.c
drivers/net/fm/memac_phy.c
drivers/net/fsl-mc/Makefile
drivers/net/fsl-mc/dpbp.c [new file with mode: 0644]
drivers/net/fsl-mc/dpio/Makefile [new file with mode: 0644]
drivers/net/fsl-mc/dpio/dpio.c [new file with mode: 0644]
drivers/net/fsl-mc/dpio/qbman_portal.c [new file with mode: 0644]
drivers/net/fsl-mc/dpio/qbman_portal.h [new file with mode: 0644]
drivers/net/fsl-mc/dpio/qbman_private.h [new file with mode: 0644]
drivers/net/fsl-mc/dpio/qbman_sys.h [new file with mode: 0644]
drivers/net/fsl-mc/dpmng.c
drivers/net/fsl-mc/dpni.c [new file with mode: 0644]
drivers/net/fsl-mc/dprc.c [new file with mode: 0644]
drivers/net/fsl-mc/fsl_dpmng_cmd.h
drivers/net/fsl-mc/mc.c
drivers/net/fsl-mc/mc_sys.c
drivers/net/ldpaa_eth/Makefile [new file with mode: 0644]
drivers/net/ldpaa_eth/ldpaa_eth.c [new file with mode: 0644]
drivers/net/ldpaa_eth/ldpaa_eth.h [new file with mode: 0644]
drivers/net/ldpaa_eth/ldpaa_wriop.c [new file with mode: 0644]
drivers/net/ldpaa_eth/ls2085a.c [new file with mode: 0644]
drivers/net/pch_gbe.c
drivers/net/phy/cortina.c
drivers/net/phy/micrel.c
drivers/net/phy/phy.c
drivers/net/phy/realtek.c
drivers/net/rtl8169.c
drivers/net/vsc9953.c
drivers/net/zynq_gem.c
drivers/pci/pcie_layerscape.c
drivers/qe/qe.c
drivers/qe/qe.h
drivers/serial/Kconfig
drivers/serial/Makefile
drivers/serial/ns16550.c
drivers/serial/serial-uclass.c
drivers/serial/serial.c
drivers/serial/serial_pl01x.c
drivers/serial/serial_stm32.c [new file with mode: 0644]
drivers/spi/exynos_spi.c
drivers/spi/omap3_spi.c
drivers/spi/spi-uclass.c
drivers/spi/tegra114_spi.c
drivers/spi/tegra20_sflash.c
drivers/spi/tegra20_slink.c
drivers/spi/zynq_spi.c
drivers/usb/emul/sandbox_hub.c
drivers/usb/host/Makefile
drivers/usb/host/ehci-fsl.c
drivers/usb/host/ehci-vf.c [new file with mode: 0644]
dts/Kconfig
include/common.h
include/config_fsl_secboot.h [new file with mode: 0644]
include/config_uncmd_spl.h
include/configs/M5208EVBE.h
include/configs/M52277EVB.h
include/configs/M5235EVB.h
include/configs/M5249EVB.h
include/configs/M5253DEMO.h
include/configs/M5253EVBE.h
include/configs/M5272C3.h
include/configs/M5275EVB.h
include/configs/M5282EVB.h
include/configs/M53017EVB.h
include/configs/M5329EVB.h
include/configs/M5373EVB.h
include/configs/MPC8641HPCN.h
include/configs/T208xRDB.h
include/configs/T4240RDB.h
include/configs/amcore.h
include/configs/aristainetos.h
include/configs/astro_mcf5373l.h
include/configs/cm_fx6.h
include/configs/cobra5272.h
include/configs/colibri_vf.h [new file with mode: 0644]
include/configs/dra7xx_evm.h
include/configs/embestmx6boards.h
include/configs/flea3.h
include/configs/gw_ventana.h
include/configs/imx31_phycore.h
include/configs/integrator-common.h
include/configs/integratorap.h
include/configs/integratorcp.h
include/configs/ls1021aqds.h
include/configs/ls1021atwr.h
include/configs/ls2085a_common.h
include/configs/ls2085a_emu.h
include/configs/ls2085a_simu.h
include/configs/ls2085aqds.h [new file with mode: 0644]
include/configs/ls2085ardb.h [new file with mode: 0644]
include/configs/m53evk.h
include/configs/mx35pdk.h
include/configs/mx53ard.h
include/configs/mx53evk.h
include/configs/mx53loco.h
include/configs/mx53smd.h
include/configs/mx6cuboxi.h [new file with mode: 0644]
include/configs/mx6qsabreauto.h
include/configs/mx6sabresd.h
include/configs/mx6slevk.h
include/configs/mx6sxsabresd.h
include/configs/nitrogen6x.h
include/configs/novena.h
include/configs/omapl138_lcdk.h [new file with mode: 0644]
include/configs/ot1200.h
include/configs/platinum.h
include/configs/qemu-ppce500.h
include/configs/stm32f429-discovery.h [new file with mode: 0644]
include/configs/tbs2910.h
include/configs/ti_omap5_common.h
include/configs/titanium.h
include/configs/tqma6.h
include/configs/tqma6_mba6.h [new file with mode: 0644]
include/configs/tseries.h
include/configs/vexpress_aemv8a.h
include/configs/wandboard.h
include/configs/woodburn_common.h
include/dm/device.h
include/dm/test.h
include/dm/uclass-internal.h
include/dm/uclass.h
include/fdt_support.h
include/fdtdec.h
include/flash.h
include/fsl-mc/fsl_dpaa_fd.h [new file with mode: 0644]
include/fsl-mc/fsl_dpbp.h [new file with mode: 0644]
include/fsl-mc/fsl_dpio.h [new file with mode: 0644]
include/fsl-mc/fsl_dpmng.h
include/fsl-mc/fsl_dpni.h [new file with mode: 0644]
include/fsl-mc/fsl_dprc.h [new file with mode: 0644]
include/fsl-mc/fsl_mc.h
include/fsl-mc/fsl_mc_cmd.h
include/fsl-mc/fsl_mc_private.h [new file with mode: 0644]
include/fsl-mc/fsl_qbman_base.h [new file with mode: 0644]
include/fsl-mc/fsl_qbman_portal.h [new file with mode: 0644]
include/fsl-mc/ldpaa_wriop.h [new file with mode: 0644]
include/fsl_ddr.h
include/fsl_ddr_sdram.h
include/fsl_debug_server.h [new file with mode: 0644]
include/fsl_esdhc.h
include/fsl_ifc.h
include/fsl_memac.h [moved from arch/powerpc/include/asm/fsl_memac.h with 100% similarity]
include/fsl_usb.h
include/linux/immap_qe.h
include/malloc.h
include/mpc85xx.h
include/mvmfp.h
include/phy.h
include/power/pfuze100_pmic.h
include/ppc_asm.tmpl
include/spi.h
include/spi_flash.h
include/status_led.h
include/vsprintf.h
lib/Makefile
lib/fdtdec.c
lib/gunzip.c
lib/libfdt/fdt_ro.c
lib/vsprintf.c
test/dm/core.c
test/dm/test-uclass.c
tools/buildman/README
tools/buildman/test.py
tools/buildman/toolchain.py
tools/patman/README
tools/patman/gitutil.py
tools/patman/series.py

index fe6dadcc7d8642a2f9a1925975d66275c93427e5..731d45c190535a5eaee6ec7723ffc334d665cf11 100644 (file)
@@ -47,7 +47,7 @@ used under the terms of either of these licenses, i. e. with
 
        SPDX-License-Identifier:        GPL-2.0+        BSD-3-Clause
 
-you can chose between GPL-2.0+ and BSD-3-Clause licensing.
+you can choose between GPL-2.0+ and BSD-3-Clause licensing.
 
 We use the SPDX Unique License Identifiers here; these are available
 at [2].
@@ -67,3 +67,4 @@ BSD 3-clause "New" or "Revised" License               BSD-3-Clause    Y               bsd-3-clause.txt        http:/
 IBM PIBS (PowerPC Initialization and           IBM-pibs                        ibm-pibs.txt
        Boot Software) license
 ISC License                                    ISC             Y               isc.txt                 https://spdx.org/licenses/ISC
+X11 License                                    X11                             x11.txt                 https://spdx.org/licenses/X11.html
diff --git a/Licenses/x11.txt b/Licenses/x11.txt
new file mode 100644 (file)
index 0000000..23a3c63
--- /dev/null
@@ -0,0 +1,25 @@
+X11 License
+Copyright (C) 1996 X Consortium
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+of the Software, and to permit persons to whom the Software is furnished to do
+so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE X
+CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of the X Consortium shall not be
+used in advertising or otherwise to promote the sale, use or other dealings in
+this Software without prior written authorization from the X Consortium.
+
+X Window System is a trademark of X Consortium, Inc.
index 26d0d2747996a80368d4cb52294834be7a5e2397..067fb220136f8f94aee1df1d5d64acd33361465f 100644 (file)
@@ -328,10 +328,11 @@ T:        git git://git.denx.de/u-boot-ppc4xx.git
 F:     arch/powerpc/cpu/ppc4xx/
 
 NETWORK
-M:     Joe Hershberger <joe.hershberger@gmail.com>
+M:     Joe Hershberger <joe.hershberger@ni.com>
 S:     Maintained
 T:     git git://git.denx.de/u-boot-net.git
 F:     drivers/net/
+F:     net/
 
 NAND FLASH
 M:     Scott Wood <scottwood@freescale.com>
diff --git a/README b/README
index fc1fd52f53053268fe3bdb4d7040dffc855a53f4..ee65fdb4c6666c5fef1fed2d4abc9e8a740ea471 100644 (file)
--- a/README
+++ b/README
@@ -690,6 +690,14 @@ The following options need to be configured:
                exists, unlike the similar options in the Linux kernel. Do not
                set these options unless they apply!
 
+               COUNTER_FREQUENCY
+               Generic timer clock source frequency.
+
+               COUNTER_FREQUENCY_REAL
+               Generic timer clock source frequency if the real clock is
+               different from COUNTER_FREQUENCY, and can only be determined
+               at run time.
+
                NOTE: The following can be machine specific errata. These
                do have ability to provide rudimentary version and machine
                specific checks, but expect no product checks.
@@ -2395,6 +2403,8 @@ CBFS (Coreboot Filesystem) support
                  - define slave for bus 3 with CONFIG_SYS_MXC_I2C3_SLAVE
                If those defines are not set, default value is 100000
                for speed, and 0 for slave.
+                 - enable bus 3 with CONFIG_SYS_I2C_MXC_I2C3
+                 - enable bus 4 with CONFIG_SYS_I2C_MXC_I2C4
 
                - drivers/i2c/rcar_i2c.c:
                  - activate this driver with CONFIG_SYS_I2C_RCAR
@@ -3086,17 +3096,6 @@ CBFS (Coreboot Filesystem) support
                memories can be connected with a given cs line.
                Currently Xilinx Zynq qspi supports these type of connections.
 
-               CONFIG_SYS_SPI_ST_ENABLE_WP_PIN
-               enable the W#/Vpp signal to disable writing to the status
-               register on ST MICRON flashes like the N25Q128.
-               The status register write enable/disable bit, combined with
-               the W#/VPP signal provides hardware data protection for the
-               device as follows: When the enable/disable bit is set to 1,
-               and the W#/VPP signal is driven LOW, the status register
-               nonvolatile bits become read-only and the WRITE STATUS REGISTER
-               operation will not execute. The only way to exit this
-               hardware-protected mode is to drive W#/VPP HIGH.
-
 - SystemACE Support:
                CONFIG_SYSTEMACE
 
@@ -4882,6 +4881,9 @@ Low Level (hardware related) configuration options:
 - CONFIG_FSL_DDR_SYNC_REFRESH
                Enable sync of refresh for multiple controllers.
 
+- CONFIG_FSL_DDR_BIST
+               Enable built-in memory test for Freescale DDR controllers.
+
 - CONFIG_SYS_83XX_DDR_USES_CS0
                Only for 83xx systems. If specified, then DDR should
                be configured using CS0 and CS1 instead of CS2 and CS3.
index 3702bb084f84414bb7327dc9b75e30d2bd8facc6..2167e29f6aba525f61f92635f1017e8699232668 100644 (file)
@@ -33,6 +33,9 @@ config CPU_V7
         bool
         select HAS_VBAR
 
+config CPU_V7M
+       bool
+
 config CPU_PXA
         bool
 
@@ -47,6 +50,7 @@ config SYS_CPU
         default "arm1136" if CPU_ARM1136
         default "arm1176" if CPU_ARM1176
         default "armv7" if CPU_V7
+        default "armv7m" if CPU_V7M
         default "pxa" if CPU_PXA
         default "sa1100" if CPU_SA1100
        default "armv8" if ARM64
@@ -61,18 +65,6 @@ config SEMIHOSTING
 choice
        prompt "Target select"
 
-config TARGET_INTEGRATORAP_CM720T
-       bool "Support integratorap_cm720t"
-       select CPU_ARM720T
-
-config TARGET_INTEGRATORAP_CM920T
-       bool "Support integratorap_cm920t"
-       select CPU_ARM920T
-
-config TARGET_INTEGRATORCP_CM920T
-       bool "Support integratorcp_cm920t"
-       select CPU_ARM920T
-
 config ARCH_AT91
        bool "Atmel AT91"
 
@@ -92,14 +84,6 @@ config TARGET_SMDK2410
        bool "Support smdk2410"
        select CPU_ARM920T
 
-config TARGET_INTEGRATORAP_CM926EJS
-       bool "Support integratorap_cm926ejs"
-       select CPU_ARM926EJS
-
-config TARGET_INTEGRATORCP_CM926EJS
-       bool "Support integratorcp_cm926ejs"
-       select CPU_ARM926EJS
-
 config TARGET_ASPENITE
        bool "Support aspenite"
        select CPU_ARM926EJS
@@ -247,10 +231,6 @@ config ARCH_VERSATILE
        bool "ARM Ltd. Versatile family"
        select CPU_ARM926EJS
 
-config TARGET_INTEGRATORCP_CM1136
-       bool "Support integratorcp_cm1136"
-       select CPU_ARM1136
-
 config TARGET_IMX31_PHYCORE
        bool "Support imx31_phycore"
        select CPU_ARM1136
@@ -299,14 +279,6 @@ config ARCH_BCM283X
        select DM_SERIAL
        select DM_GPIO
 
-config TARGET_INTEGRATORAP_CM946ES
-       bool "Support integratorap_cm946es"
-       select CPU_ARM946ES
-
-config TARGET_INTEGRATORCP_CM946ES
-       bool "Support integratorcp_cm946es"
-       select CPU_ARM946ES
-
 config TARGET_VEXPRESS_CA15_TC2
        bool "Support vexpress_ca15_tc2"
        select CPU_V7
@@ -461,6 +433,9 @@ config ARCH_HIGHBANK
        bool "Calxeda Highbank"
        select CPU_V7
 
+config ARCH_INTEGRATOR
+       bool "ARM Ltd. Integrator family"
+
 config ARCH_KEYSTONE
        bool "TI Keystone"
        select CPU_V7
@@ -560,6 +535,11 @@ config TARGET_MX6SABRESD
        select DM
        select DM_THERMAL
 
+config TARGET_MX6CUBOXI
+       bool "Support Solid-run mx6 boards"
+       select CPU_V7
+       select SUPPORT_SPL
+
 config TARGET_MX6SLEVK
        bool "Support mx6slevk"
        select CPU_V7
@@ -665,6 +645,10 @@ config TARGET_VF610TWR
        bool "Support vf610twr"
        select CPU_V7
 
+config TARGET_COLIBRI_VF
+       bool "Support Colibri VF50/61"
+       select CPU_V7
+
 config ZYNQ
        bool "Xilinx Zynq Platform"
        select CPU_V7
@@ -711,6 +695,28 @@ config TARGET_LS2085A_SIMU
        select ARM64
        select ARMV8_MULTIENTRY
 
+config TARGET_LS2085AQDS
+       bool "Support ls2085aqds"
+       select ARM64
+       select ARMV8_MULTIENTRY
+       select SUPPORT_SPL
+       help
+         Support for Freescale LS2085AQDS platform
+         The LS2085A Development System (QDS) is a high-performance
+         development platform that supports the QorIQ LS2085A
+         Layerscape Architecture processor.
+
+config TARGET_LS2085ARDB
+       bool "Support ls2085ardb"
+       select ARM64
+       select ARMV8_MULTIENTRY
+       select SUPPORT_SPL
+       help
+         Support for Freescale LS2085ARDB platform.
+         The LS2085A Reference design board (RDB) is a high-performance
+         development platform that supports the QorIQ LS2085A
+         Layerscape Architecture processor.
+
 config TARGET_LS1021AQDS
        bool "Support ls1021aqds"
        select CPU_V7
@@ -785,6 +791,10 @@ config ARCH_UNIPHIER
        select DM_SERIAL
        select DM_I2C
 
+config TARGET_STM32F429_DISCOVERY
+       bool "Support STM32F429 Discovery"
+       select CPU_V7M
+
 endchoice
 
 source "arch/arm/mach-at91/Kconfig"
@@ -797,6 +807,8 @@ source "arch/arm/cpu/armv7/exynos/Kconfig"
 
 source "arch/arm/mach-highbank/Kconfig"
 
+source "arch/arm/mach-integrator/Kconfig"
+
 source "arch/arm/mach-keystone/Kconfig"
 
 source "arch/arm/mach-kirkwood/Kconfig"
@@ -842,7 +854,6 @@ source "board/Marvell/db-mv784mp-gp/Kconfig"
 source "board/Marvell/gplugd/Kconfig"
 source "board/altera/socfpga/Kconfig"
 source "board/armadeus/apf27/Kconfig"
-source "board/armltd/integrator/Kconfig"
 source "board/armltd/vexpress/Kconfig"
 source "board/armltd/vexpress64/Kconfig"
 source "board/bachmann/ot1200/Kconfig"
@@ -865,6 +876,8 @@ source "board/denx/m53evk/Kconfig"
 source "board/embest/mx6boards/Kconfig"
 source "board/esg/ima3-mx53/Kconfig"
 source "board/freescale/ls2085a/Kconfig"
+source "board/freescale/ls2085aqds/Kconfig"
+source "board/freescale/ls2085ardb/Kconfig"
 source "board/freescale/ls1021aqds/Kconfig"
 source "board/freescale/ls1021atwr/Kconfig"
 source "board/freescale/mx23evk/Kconfig"
@@ -914,6 +927,7 @@ source "board/siemens/draco/Kconfig"
 source "board/siemens/pxm2/Kconfig"
 source "board/siemens/rut/Kconfig"
 source "board/silica/pengwyn/Kconfig"
+source "board/solidrun/mx6cuboxi/Kconfig"
 source "board/solidrun/hummingboard/Kconfig"
 source "board/spear/spear300/Kconfig"
 source "board/spear/spear310/Kconfig"
@@ -922,6 +936,7 @@ source "board/spear/spear600/Kconfig"
 source "board/spear/x600/Kconfig"
 source "board/st-ericsson/snowball/Kconfig"
 source "board/st-ericsson/u8500/Kconfig"
+source "board/st/stm32f429-discovery/Kconfig"
 source "board/st/stv0991/Kconfig"
 source "board/sunxi/Kconfig"
 source "board/syteco/zmx25/Kconfig"
@@ -933,6 +948,7 @@ source "board/ti/ti814x/Kconfig"
 source "board/ti/ti816x/Kconfig"
 source "board/timll/devkit3250/Kconfig"
 source "board/toradex/colibri_pxa270/Kconfig"
+source "board/toradex/colibri_vf/Kconfig"
 source "board/tqc/tqma6/Kconfig"
 source "board/trizepsiv/Kconfig"
 source "board/ttcontrol/vision2/Kconfig"
index ec8e88d4b38b93692247a1f732b54415687f32a0..0bb3441fb8f9196c2eb192570b42c80f4e2934c3 100644 (file)
@@ -9,7 +9,6 @@
 
 #include <asm-offsets.h>
 #include <config.h>
-#include <asm/hardware.h>
 
 /*
  *************************************************************************
index d7956e57de213819ff313b10045c66e5370bbee9..eb8669bb2e7c787046fa0cf1f7fd5d4a6067785c 100644 (file)
@@ -49,13 +49,6 @@ static const iomux_cfg_t iomux_boot[] = {
        MX23_PAD_LCD_D03__GPIO_1_3 | MUX_CONFIG_BOOTMODE_PAD,
        MX23_PAD_LCD_D04__GPIO_1_4 | MUX_CONFIG_BOOTMODE_PAD,
        MX23_PAD_LCD_D05__GPIO_1_5 | MUX_CONFIG_BOOTMODE_PAD,
-#elif defined(CONFIG_MX28)
-       MX28_PAD_LCD_D00__GPIO_1_0 | MUX_CONFIG_BOOTMODE_PAD,
-       MX28_PAD_LCD_D01__GPIO_1_1 | MUX_CONFIG_BOOTMODE_PAD,
-       MX28_PAD_LCD_D02__GPIO_1_2 | MUX_CONFIG_BOOTMODE_PAD,
-       MX28_PAD_LCD_D03__GPIO_1_3 | MUX_CONFIG_BOOTMODE_PAD,
-       MX28_PAD_LCD_D04__GPIO_1_4 | MUX_CONFIG_BOOTMODE_PAD,
-       MX28_PAD_LCD_D05__GPIO_1_5 | MUX_CONFIG_BOOTMODE_PAD,
 #endif
 };
 
@@ -65,10 +58,10 @@ static uint8_t mxs_get_bootmode_index(void)
        int i;
        uint8_t masked;
 
+#if defined(CONFIG_MX23)
        /* Setup IOMUX of bootmode pads to GPIO */
        mxs_iomux_setup_multiple_pads(iomux_boot, ARRAY_SIZE(iomux_boot));
 
-#if defined(CONFIG_MX23)
        /* Setup bootmode pins as GPIO input */
        gpio_direction_input(MX23_PAD_LCD_D00__GPIO_1_0);
        gpio_direction_input(MX23_PAD_LCD_D01__GPIO_1_1);
@@ -83,21 +76,11 @@ static uint8_t mxs_get_bootmode_index(void)
        bootmode |= (gpio_get_value(MX23_PAD_LCD_D03__GPIO_1_3) ? 1 : 0) << 3;
        bootmode |= (gpio_get_value(MX23_PAD_LCD_D05__GPIO_1_5) ? 1 : 0) << 5;
 #elif defined(CONFIG_MX28)
-       /* Setup bootmode pins as GPIO input */
-       gpio_direction_input(MX28_PAD_LCD_D00__GPIO_1_0);
-       gpio_direction_input(MX28_PAD_LCD_D01__GPIO_1_1);
-       gpio_direction_input(MX28_PAD_LCD_D02__GPIO_1_2);
-       gpio_direction_input(MX28_PAD_LCD_D03__GPIO_1_3);
-       gpio_direction_input(MX28_PAD_LCD_D04__GPIO_1_4);
-       gpio_direction_input(MX28_PAD_LCD_D05__GPIO_1_5);
-
-       /* Read bootmode pads */
-       bootmode |= (gpio_get_value(MX28_PAD_LCD_D00__GPIO_1_0) ? 1 : 0) << 0;
-       bootmode |= (gpio_get_value(MX28_PAD_LCD_D01__GPIO_1_1) ? 1 : 0) << 1;
-       bootmode |= (gpio_get_value(MX28_PAD_LCD_D02__GPIO_1_2) ? 1 : 0) << 2;
-       bootmode |= (gpio_get_value(MX28_PAD_LCD_D03__GPIO_1_3) ? 1 : 0) << 3;
-       bootmode |= (gpio_get_value(MX28_PAD_LCD_D04__GPIO_1_4) ? 1 : 0) << 4;
-       bootmode |= (gpio_get_value(MX28_PAD_LCD_D05__GPIO_1_5) ? 1 : 0) << 5;
+       /* The global boot mode will be detected by ROM code and its value
+        * is stored at the fixed address 0x00019BF0 in OCRAM.
+        */
+#define GLOBAL_BOOT_MODE_ADDR 0x00019BF0
+       bootmode = __raw_readl(GLOBAL_BOOT_MODE_ADDR);
 #endif
 
        for (i = 0; i < ARRAY_SIZE(mxs_boot_modes); i++) {
index e20e5a89aa407d01282d307fa8a27f720cc983f6..5d864b901298e3b76da335676521f3846bf88002 100644 (file)
@@ -53,7 +53,7 @@ static void cache_flush (void)
        asm ("mcr p15, 0, %0, c7, c6, 0": :"r" (i));
 }
 
-#ifndef CONFIG_INTEGRATOR
+#ifndef CONFIG_ARCH_INTEGRATOR
 
 __attribute__((noreturn)) void reset_cpu(ulong addr __attribute__((unused)))
 {
@@ -63,4 +63,4 @@ __attribute__((noreturn)) void reset_cpu(ulong addr __attribute__((unused)))
                ;
 }
 
-#endif /* #ifdef CONFIG_INTEGRATOR */
+#endif /* #ifdef CONFIG_ARCH_INTEGRATOR */
index 8f80c6175f6a3472bb705a28f4adc30fe7b6e508..7a337e1c5bc434c86ed8ff2dff7a0d935b397d5b 100644 (file)
@@ -20,7 +20,7 @@ void get_sys_info(struct sys_info *sys_info)
 {
        struct ccsr_gur __iomem *gur = (void *)(CONFIG_SYS_FSL_GUTS_ADDR);
 #ifdef CONFIG_FSL_IFC
-       struct fsl_ifc *ifc_regs = (void *)CONFIG_SYS_IFC_ADDR;
+       struct fsl_ifc ifc_regs = {(void *)CONFIG_SYS_IFC_ADDR, (void *)NULL};
        u32 ccr;
 #endif
        struct ccsr_clk *clk = (void *)(CONFIG_SYS_FSL_LS1_CLK_ADDR);
@@ -74,7 +74,7 @@ void get_sys_info(struct sys_info *sys_info)
        }
 
 #if defined(CONFIG_FSL_IFC)
-       ccr = in_be32(&ifc_regs->ifc_ccr);
+       ccr = in_be32(&ifc_regs.gregs->ifc_ccr);
        ccr = ((ccr & IFC_CCR_CLK_DIV_MASK) >> IFC_CCR_CLK_DIV_SHIFT) + 1;
 
        sys_info->freq_localbus = sys_info->freq_systembus / ccr;
index fef2231a390ff651682f50d49625d319213042e8..653d58ef243c083c6fb1e53ed4b4f130e8d0bd3c 100644 (file)
@@ -514,17 +514,21 @@ void mx6_dram_cfg(const struct mx6_ddr_sysinfo *sysinfo,
                /* MR2 */
                val = (sysinfo->rtt_wr & 3) << 9 | (ddr3_cfg->SRT & 1) << 7 |
                      ((tcwl - 3) & 3) << 3;
+               debug("MR2 CS%d: 0x%08x\n", cs, (u32)MR(val, 2, 3, cs));
                mmdc0->mdscr = MR(val, 2, 3, cs);
                /* MR3 */
+               debug("MR3 CS%d: 0x%08x\n", cs, (u32)MR(0, 3, 3, cs));
                mmdc0->mdscr = MR(0, 3, 3, cs);
                /* MR1 */
                val = ((sysinfo->rtt_nom & 1) ? 1 : 0) << 2 |
                      ((sysinfo->rtt_nom & 2) ? 1 : 0) << 6;
+               debug("MR1 CS%d: 0x%08x\n", cs, (u32)MR(val, 1, 3, cs));
                mmdc0->mdscr = MR(val, 1, 3, cs);
                /* MR0 */
                val = ((tcl - 1) << 4) |        /* CAS */
                      (1 << 8)   |              /* DLL Reset */
                      ((twr - 3) << 9);         /* Write Recovery */
+               debug("MR0 CS%d: 0x%08x\n", cs, (u32)MR(val, 0, 3, cs));
                mmdc0->mdscr = MR(val, 0, 3, cs);
                /* ZQ calibration */
                val = (1 << 10);
@@ -535,10 +539,11 @@ void mx6_dram_cfg(const struct mx6_ddr_sysinfo *sysinfo,
        mmdc0->mdpdc = (tcke & 0x7) << 16 |
                        5            << 12 |  /* PWDT_1: 256 cycles */
                        5            <<  8 |  /* PWDT_0: 256 cycles */
-                       1            <<  7 |  /* SLOW_PD */
                        1            <<  6 |  /* BOTH_CS_PD */
                        (tcksrx & 0x7) << 3 |
                        (tcksre & 0x7);
+       if (!sysinfo->pd_fast_exit)
+               mmdc0->mdpdc |= (1 << 7); /* SLOW_PD */
        mmdc0->mapsr = 0x00001006; /* ADOPT power down enabled */
 
        /* Step 11: Configure ZQ calibration: one-time and periodic 1ms */
index f2f6897eb646dfaf2cefc982bcb9231ebf657e2c..bbc6bed7cac9bc765553093d3d6655afffbc15c7 100644 (file)
@@ -162,3 +162,13 @@ void arch_preboot_os(void)
        ahci_reset((void __iomem *)DWC_AHSATA_BASE);
 }
 #endif
+
+#if defined(CONFIG_CMD_FASTBOOT) && !defined(CONFIG_ENV_IS_NOWHERE)
+int fb_set_reboot_flag(void)
+{
+       printf("Setting reboot to fastboot flag ...\n");
+       setenv("dofastboot", "1");
+       saveenv();
+       return 0;
+}
+#endif
index 1696c2dbda6cda6a321ce503bbb4ad6008ba1155..df5f817baaaf7cb98d6371ced679b58082039f50 100644 (file)
@@ -60,3 +60,16 @@ void __weak usb_fake_mac_from_die_id(u32 *id)
                eth_setenv_enetaddr("usbethaddr", device_mac);
        }
 }
+
+void __weak usb_set_serial_num_from_die_id(u32 *id)
+{
+       char serialno[72];
+       uint32_t serialno_lo, serialno_hi;
+
+       if (!getenv("serial#")) {
+               serialno_hi = id[0];
+               serialno_lo = id[1];
+               sprintf(serialno, "%08x%08x", serialno_hi, serialno_lo);
+               setenv("serial#", serialno);
+       }
+}
index 440bb40a14c05ed345d8ff42c5553271fc465151..f80d36dc3cf161512687aa4bb396e303f9a9b902 100644 (file)
@@ -440,6 +440,10 @@ struct omap_sys_ctrl_regs const dra7xx_ctrl = {
        .control_emif1_sdram_config_ext         = 0x4AE0C144,
        .control_emif2_sdram_config_ext         = 0x4AE0C148,
        .control_wkup_ldovbb_mpu_voltage_ctrl   = 0x4AE0C158,
+       .control_std_fuse_die_id_0              = 0x4AE0C200,
+       .control_std_fuse_die_id_1              = 0x4AE0C208,
+       .control_std_fuse_die_id_2              = 0x4AE0C20C,
+       .control_std_fuse_die_id_3              = 0x4AE0C210,
        .control_padconf_mode                   = 0x4AE0C5A0,
        .control_xtal_oscillator                = 0x4AE0C5A4,
        .control_i2c_2                          = 0x4AE0C5A8,
index 92aaad941548391fbf5ae76bbcab4fb581661d86..1bb9b8ed1d0ae7fb0409b516b146441812be177f 100644 (file)
@@ -18,6 +18,8 @@
 DECLARE_GLOBAL_DATA_PTR;
 #endif
 
+static char soc_type[] = "xx0";
+
 #ifdef CONFIG_MXC_OCOTP
 void enable_ocotp_clk(unsigned char enable)
 {
@@ -284,14 +286,37 @@ static char *get_reset_cause(void)
 
 int print_cpuinfo(void)
 {
-       printf("CPU:   Freescale Vybrid VF610 at %d MHz\n",
-               mxc_get_clock(MXC_ARM_CLK) / 1000000);
+       printf("CPU: Freescale Vybrid VF%s at %d MHz\n",
+              soc_type, mxc_get_clock(MXC_ARM_CLK) / 1000000);
        printf("Reset cause: %s\n", get_reset_cause());
 
        return 0;
 }
 #endif
 
+int arch_cpu_init(void)
+{
+       struct mscm *mscm = (struct mscm *)MSCM_BASE_ADDR;
+
+       soc_type[0] = mscm->cpxcount ? '6' : '5'; /*Dual Core => VF6x0 */
+       soc_type[1] = mscm->cpxcfg1 ? '1' : '0'; /* L2 Cache => VFx10 */
+
+       return 0;
+}
+
+#ifdef CONFIG_ARCH_MISC_INIT
+int arch_misc_init(void)
+{
+       char soc[6];
+
+       strcat(soc, "vf");
+       strcat(soc, soc_type);
+       setenv("soc", soc);
+
+       return 0;
+}
+#endif
+
 int cpu_eth_init(bd_t *bis)
 {
        int rc = -ENODEV;
@@ -317,3 +342,19 @@ int get_clocks(void)
 #endif
        return 0;
 }
+
+#ifndef CONFIG_SYS_DCACHE_OFF
+void enable_caches(void)
+{
+#if defined(CONFIG_SYS_ARM_CACHE_WRITETHROUGH)
+       enum dcache_option option = DCACHE_WRITETHROUGH;
+#else
+       enum dcache_option option = DCACHE_WRITEBACK;
+#endif
+       dcache_enable();
+       icache_enable();
+
+    /* Enable caching on OCRAM */
+       mmu_set_region_dcache_behaviour(IRAM_BASE_ADDR, IRAM_SIZE, option);
+}
+#endif
diff --git a/arch/arm/cpu/armv7m/Makefile b/arch/arm/cpu/armv7m/Makefile
new file mode 100644 (file)
index 0000000..b662e03
--- /dev/null
@@ -0,0 +1,11 @@
+#
+# (C) Copyright 2000-2006
+# Wolfgang Denk, DENX Software Engineering, wd@denx.de.
+#
+# SPDX-License-Identifier:     GPL-2.0+
+#
+
+extra-y := start.o
+obj-y += cpu.o
+
+obj-$(CONFIG_STM32F4) += stm32f4/
diff --git a/arch/arm/cpu/armv7m/config.mk b/arch/arm/cpu/armv7m/config.mk
new file mode 100644 (file)
index 0000000..0b31e44
--- /dev/null
@@ -0,0 +1,8 @@
+#
+# (C) Copyright 2015
+# Kamil Lulko, <rev13@wp.pl>
+#
+# SPDX-License-Identifier:     GPL-2.0+
+#
+
+PLATFORM_CPPFLAGS += -march=armv7-m -mthumb
diff --git a/arch/arm/cpu/armv7m/cpu.c b/arch/arm/cpu/armv7m/cpu.c
new file mode 100644 (file)
index 0000000..d3ab862
--- /dev/null
@@ -0,0 +1,35 @@
+/*
+ * (C) Copyright 2010,2011
+ * Vladimir Khusainov, Emcraft Systems, vlad@emcraft.com
+ *
+ * (C) Copyright 2015
+ * Kamil Lulko, <rev13@wp.pl>
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#include <common.h>
+#include <asm/io.h>
+#include <asm/armv7m.h>
+
+/*
+ * This is called right before passing control to
+ * the Linux kernel point.
+ */
+int cleanup_before_linux(void)
+{
+       return 0;
+}
+
+/*
+ * Perform the low-level reset.
+ */
+void reset_cpu(ulong addr)
+{
+       /*
+        * Perform reset but keep priority group unchanged.
+        */
+       writel((V7M_AIRCR_VECTKEY << V7M_AIRCR_VECTKEY_SHIFT)
+               | (V7M_SCB->aircr & V7M_AIRCR_PRIGROUP_MSK)
+               | V7M_AIRCR_SYSRESET, &V7M_SCB->aircr);
+}
diff --git a/arch/arm/cpu/armv7m/start.S b/arch/arm/cpu/armv7m/start.S
new file mode 100644 (file)
index 0000000..e05e984
--- /dev/null
@@ -0,0 +1,15 @@
+/*
+ * (C) Copyright 2015
+ * Kamil Lulko, <rev13@wp.pl>
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+.globl reset
+.type reset, %function
+reset:
+       b       _main
+
+.globl c_runtime_cpu_setup
+c_runtime_cpu_setup:
+       mov     pc, lr
diff --git a/arch/arm/cpu/armv7m/stm32f4/Makefile b/arch/arm/cpu/armv7m/stm32f4/Makefile
new file mode 100644 (file)
index 0000000..e982830
--- /dev/null
@@ -0,0 +1,11 @@
+#
+# (C) Copyright 2000-2006
+# Wolfgang Denk, DENX Software Engineering, wd@denx.de.
+#
+# (C) Copyright 2015
+# Kamil Lulko, <rev13@wp.pl>
+#
+# SPDX-License-Identifier:     GPL-2.0+
+#
+
+obj-y += soc.o clock.o timer.o flash.o
diff --git a/arch/arm/cpu/armv7m/stm32f4/clock.c b/arch/arm/cpu/armv7m/stm32f4/clock.c
new file mode 100644 (file)
index 0000000..2eded1f
--- /dev/null
@@ -0,0 +1,209 @@
+/*
+ * (C) Copyright 2015
+ * Kamil Lulko, <rev13@wp.pl>
+ *
+ * (C) Copyright 2014
+ * STMicroelectronics
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#include <common.h>
+#include <asm/io.h>
+#include <asm/arch/stm32.h>
+
+#define RCC_CR_HSION           (1 << 0)
+#define RCC_CR_HSEON           (1 << 16)
+#define RCC_CR_HSERDY          (1 << 17)
+#define RCC_CR_HSEBYP          (1 << 18)
+#define RCC_CR_CSSON           (1 << 19)
+#define RCC_CR_PLLON           (1 << 24)
+#define RCC_CR_PLLRDY          (1 << 25)
+
+#define RCC_PLLCFGR_PLLM_MASK  0x3F
+#define RCC_PLLCFGR_PLLN_MASK  0x7FC0
+#define RCC_PLLCFGR_PLLP_MASK  0x30000
+#define RCC_PLLCFGR_PLLQ_MASK  0xF000000
+#define RCC_PLLCFGR_PLLSRC     (1 << 22)
+#define RCC_PLLCFGR_PLLN_SHIFT 6
+#define RCC_PLLCFGR_PLLP_SHIFT 16
+#define RCC_PLLCFGR_PLLQ_SHIFT 24
+
+#define RCC_CFGR_AHB_PSC_MASK  0xF0
+#define RCC_CFGR_APB1_PSC_MASK 0x1C00
+#define RCC_CFGR_APB2_PSC_MASK 0xE000
+#define RCC_CFGR_SW0           (1 << 0)
+#define RCC_CFGR_SW1           (1 << 1)
+#define RCC_CFGR_SW_MASK       0x3
+#define RCC_CFGR_SW_HSI                0
+#define RCC_CFGR_SW_HSE                RCC_CFGR_SW0
+#define RCC_CFGR_SW_PLL                RCC_CFGR_SW1
+#define RCC_CFGR_SWS0          (1 << 2)
+#define RCC_CFGR_SWS1          (1 << 3)
+#define RCC_CFGR_SWS_MASK      0xC
+#define RCC_CFGR_SWS_HSI       0
+#define RCC_CFGR_SWS_HSE       RCC_CFGR_SWS0
+#define RCC_CFGR_SWS_PLL       RCC_CFGR_SWS1
+#define RCC_CFGR_HPRE_SHIFT    4
+#define RCC_CFGR_PPRE1_SHIFT   10
+#define RCC_CFGR_PPRE2_SHIFT   13
+
+#define RCC_APB1ENR_PWREN      (1 << 28)
+
+#define PWR_CR_VOS0            (1 << 14)
+#define PWR_CR_VOS1            (1 << 15)
+#define PWR_CR_VOS_MASK                0xC000
+#define PWR_CR_VOS_SCALE_MODE_1        (PWR_CR_VOS0 | PWR_CR_VOS1)
+#define PWR_CR_VOS_SCALE_MODE_2        (PWR_CR_VOS1)
+#define PWR_CR_VOS_SCALE_MODE_3        (PWR_CR_VOS0)
+
+#define FLASH_ACR_WS(n)                n
+#define FLASH_ACR_PRFTEN       (1 << 8)
+#define FLASH_ACR_ICEN         (1 << 9)
+#define FLASH_ACR_DCEN         (1 << 10)
+
+struct pll_psc {
+       u8      pll_m;
+       u16     pll_n;
+       u8      pll_p;
+       u8      pll_q;
+       u8      ahb_psc;
+       u8      apb1_psc;
+       u8      apb2_psc;
+};
+
+#define AHB_PSC_1              0
+#define AHB_PSC_2              0x8
+#define AHB_PSC_4              0x9
+#define AHB_PSC_8              0xA
+#define AHB_PSC_16             0xB
+#define AHB_PSC_64             0xC
+#define AHB_PSC_128            0xD
+#define AHB_PSC_256            0xE
+#define AHB_PSC_512            0xF
+
+#define APB_PSC_1              0
+#define APB_PSC_2              0x4
+#define APB_PSC_4              0x5
+#define APB_PSC_8              0x6
+#define APB_PSC_16             0x7
+
+#if !defined(CONFIG_STM32_HSE_HZ)
+#error "CONFIG_STM32_HSE_HZ not defined!"
+#else
+#if (CONFIG_STM32_HSE_HZ == 8000000)
+struct pll_psc pll_psc_168 = {
+       .pll_m = 8,
+       .pll_n = 336,
+       .pll_p = 2,
+       .pll_q = 7,
+       .ahb_psc = AHB_PSC_1,
+       .apb1_psc = APB_PSC_4,
+       .apb2_psc = APB_PSC_2
+};
+#else
+#error "No PLL/Prescaler configuration for given CONFIG_STM32_HSE_HZ exists"
+#endif
+#endif
+
+int configure_clocks(void)
+{
+       /* Reset RCC configuration */
+       setbits_le32(&STM32_RCC->cr, RCC_CR_HSION);
+       writel(0, &STM32_RCC->cfgr); /* Reset CFGR */
+       clrbits_le32(&STM32_RCC->cr, (RCC_CR_HSEON | RCC_CR_CSSON
+               | RCC_CR_PLLON));
+       writel(0x24003010, &STM32_RCC->pllcfgr); /* Reset value from RM */
+       clrbits_le32(&STM32_RCC->cr, RCC_CR_HSEBYP);
+       writel(0, &STM32_RCC->cir); /* Disable all interrupts */
+
+       /* Configure for HSE+PLL operation */
+       setbits_le32(&STM32_RCC->cr, RCC_CR_HSEON);
+       while (!(readl(&STM32_RCC->cr) & RCC_CR_HSERDY))
+               ;
+
+       /* Enable high performance mode, System frequency up to 168 MHz */
+       setbits_le32(&STM32_RCC->apb1enr, RCC_APB1ENR_PWREN);
+       writel(PWR_CR_VOS_SCALE_MODE_1, &STM32_PWR->cr);
+
+       setbits_le32(&STM32_RCC->cfgr, ((
+               pll_psc_168.ahb_psc << RCC_CFGR_HPRE_SHIFT)
+               | (pll_psc_168.apb1_psc << RCC_CFGR_PPRE1_SHIFT)
+               | (pll_psc_168.apb2_psc << RCC_CFGR_PPRE2_SHIFT)));
+
+       writel(pll_psc_168.pll_m
+               | (pll_psc_168.pll_n << RCC_PLLCFGR_PLLN_SHIFT)
+               | (((pll_psc_168.pll_p >> 1) - 1) << RCC_PLLCFGR_PLLP_SHIFT)
+               | (pll_psc_168.pll_q << RCC_PLLCFGR_PLLQ_SHIFT),
+               &STM32_RCC->pllcfgr);
+       setbits_le32(&STM32_RCC->pllcfgr, RCC_PLLCFGR_PLLSRC);
+
+       setbits_le32(&STM32_RCC->cr, RCC_CR_PLLON);
+
+       while (!(readl(&STM32_RCC->cr) & RCC_CR_PLLRDY))
+               ;
+
+       /* 5 wait states, Prefetch enabled, D-Cache enabled, I-Cache enabled */
+       writel(FLASH_ACR_WS(5) | FLASH_ACR_PRFTEN | FLASH_ACR_ICEN
+               | FLASH_ACR_DCEN, &STM32_FLASH->acr);
+
+       clrbits_le32(&STM32_RCC->cfgr, (RCC_CFGR_SW0 | RCC_CFGR_SW1));
+       setbits_le32(&STM32_RCC->cfgr, RCC_CFGR_SW_PLL);
+
+       while ((readl(&STM32_RCC->cfgr) & RCC_CFGR_SWS_MASK) !=
+                       RCC_CFGR_SWS_PLL)
+               ;
+
+       return 0;
+}
+
+unsigned long clock_get(enum clock clck)
+{
+       u32 sysclk = 0;
+       u32 shift = 0;
+       /* Prescaler table lookups for clock computation */
+       u8 ahb_psc_table[16] = {
+               0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 6, 7, 8, 9
+       };
+       u8 apb_psc_table[8] = {
+               0, 0, 0, 0, 1, 2, 3, 4
+       };
+
+       if ((readl(&STM32_RCC->cfgr) & RCC_CFGR_SWS_MASK) ==
+                       RCC_CFGR_SWS_PLL) {
+               u16 pllm, plln, pllp;
+               pllm = (readl(&STM32_RCC->pllcfgr) & RCC_PLLCFGR_PLLM_MASK);
+               plln = ((readl(&STM32_RCC->pllcfgr) & RCC_PLLCFGR_PLLN_MASK)
+                       >> RCC_PLLCFGR_PLLN_SHIFT);
+               pllp = ((((readl(&STM32_RCC->pllcfgr) & RCC_PLLCFGR_PLLP_MASK)
+                       >> RCC_PLLCFGR_PLLP_SHIFT) + 1) << 1);
+               sysclk = ((CONFIG_STM32_HSE_HZ / pllm) * plln) / pllp;
+       }
+
+       switch (clck) {
+       case CLOCK_CORE:
+               return sysclk;
+               break;
+       case CLOCK_AHB:
+               shift = ahb_psc_table[(
+                       (readl(&STM32_RCC->cfgr) & RCC_CFGR_AHB_PSC_MASK)
+                       >> RCC_CFGR_HPRE_SHIFT)];
+               return sysclk >>= shift;
+               break;
+       case CLOCK_APB1:
+               shift = apb_psc_table[(
+                       (readl(&STM32_RCC->cfgr) & RCC_CFGR_APB1_PSC_MASK)
+                       >> RCC_CFGR_PPRE1_SHIFT)];
+               return sysclk >>= shift;
+               break;
+       case CLOCK_APB2:
+               shift = apb_psc_table[(
+                       (readl(&STM32_RCC->cfgr) & RCC_CFGR_APB2_PSC_MASK)
+                       >> RCC_CFGR_PPRE2_SHIFT)];
+               return sysclk >>= shift;
+               break;
+       default:
+               return 0;
+               break;
+       }
+}
diff --git a/arch/arm/cpu/armv7m/stm32f4/flash.c b/arch/arm/cpu/armv7m/stm32f4/flash.c
new file mode 100644 (file)
index 0000000..e5c6111
--- /dev/null
@@ -0,0 +1,143 @@
+/*
+ * (C) Copyright 2015
+ * Kamil Lulko, <rev13@wp.pl>
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#include <common.h>
+#include <asm/io.h>
+#include <asm/arch/stm32.h>
+
+#define STM32_FLASH_KEY1       0x45670123
+#define STM32_FLASH_KEY2       0xCDEF89AB
+
+flash_info_t flash_info[CONFIG_SYS_MAX_FLASH_BANKS];
+
+const u32 sect_sz_kb[CONFIG_SYS_MAX_FLASH_SECT] = {
+       [0 ... 3] =     16 * 1024,
+       [4] =           64 * 1024,
+       [5 ... 11] =    128 * 1024
+};
+
+static void stm32f4_flash_lock(u8 lock)
+{
+       if (lock) {
+               setbits_le32(&STM32_FLASH->cr, STM32_FLASH_CR_LOCK);
+       } else {
+               writel(STM32_FLASH_KEY1, &STM32_FLASH->key);
+               writel(STM32_FLASH_KEY2, &STM32_FLASH->key);
+       }
+}
+
+unsigned long flash_init(void)
+{
+       unsigned long total_size = 0;
+       u8 i, j;
+
+       for (i = 0; i < CONFIG_SYS_MAX_FLASH_BANKS; i++) {
+               flash_info[i].flash_id = FLASH_STM32F4;
+               flash_info[i].sector_count = CONFIG_SYS_MAX_FLASH_SECT;
+               flash_info[i].start[0] = CONFIG_SYS_FLASH_BASE + (i << 20);
+               flash_info[i].size = sect_sz_kb[0];
+               for (j = 1; j < CONFIG_SYS_MAX_FLASH_SECT; j++) {
+                       flash_info[i].start[j] = flash_info[i].start[j - 1]
+                               + (sect_sz_kb[j - 1]);
+                       flash_info[i].size += sect_sz_kb[j];
+               }
+               total_size += flash_info[i].size;
+       }
+
+       return total_size;
+}
+
+void flash_print_info(flash_info_t *info)
+{
+       int i;
+
+       if (info->flash_id == FLASH_UNKNOWN) {
+               printf("missing or unknown FLASH type\n");
+               return;
+       } else if (info->flash_id == FLASH_STM32F4) {
+               printf("STM32F4 Embedded Flash\n");
+       }
+
+       printf("  Size: %ld MB in %d Sectors\n",
+              info->size >> 20, info->sector_count);
+
+       printf("  Sector Start Addresses:");
+       for (i = 0; i < info->sector_count; ++i) {
+               if ((i % 5) == 0)
+                       printf("\n   ");
+               printf(" %08lX%s",
+                      info->start[i],
+                       info->protect[i] ? " (RO)" : "     ");
+       }
+       printf("\n");
+       return;
+}
+
+int flash_erase(flash_info_t *info, int first, int last)
+{
+       u8 bank = 0xFF;
+       int i;
+
+       for (i = 0; i < CONFIG_SYS_MAX_FLASH_BANKS; i++) {
+               if (info == &flash_info[i]) {
+                       bank = i;
+                       break;
+               }
+       }
+       if (bank == 0xFF)
+               return -1;
+
+       stm32f4_flash_lock(0);
+
+       for (i = first; i <= last; i++) {
+               while (readl(&STM32_FLASH->sr) & STM32_FLASH_SR_BSY)
+                       ;
+
+               if (bank == 0) {
+                       setbits_le32(&STM32_FLASH->cr,
+                                    (i << STM32_FLASH_CR_SNB_OFFSET));
+               } else if (bank == 1) {
+                       setbits_le32(&STM32_FLASH->cr,
+                                    ((0x10 | i) << STM32_FLASH_CR_SNB_OFFSET));
+               } else {
+                       stm32f4_flash_lock(1);
+                       return -1;
+               }
+               setbits_le32(&STM32_FLASH->cr, STM32_FLASH_CR_SER);
+               setbits_le32(&STM32_FLASH->cr, STM32_FLASH_CR_STRT);
+
+               while (readl(&STM32_FLASH->sr) & STM32_FLASH_SR_BSY)
+                       ;
+
+               clrbits_le32(&STM32_FLASH->cr, STM32_FLASH_CR_SER);
+               stm32f4_flash_lock(1);
+       }
+
+       return 0;
+}
+
+int write_buff(flash_info_t *info, uchar *src, ulong addr, ulong cnt)
+{
+       ulong i;
+
+       while (readl(&STM32_FLASH->sr) & STM32_FLASH_SR_BSY)
+               ;
+
+       stm32f4_flash_lock(0);
+
+       setbits_le32(&STM32_FLASH->cr, STM32_FLASH_CR_PG);
+       /* To make things simple use byte writes only */
+       for (i = 0; i < cnt; i++) {
+               *(uchar *)(addr + i) = src[i];
+               while (readl(&STM32_FLASH->sr) & STM32_FLASH_SR_BSY)
+                       ;
+       }
+       clrbits_le32(&STM32_FLASH->cr, STM32_FLASH_CR_PG);
+       stm32f4_flash_lock(1);
+
+       return 0;
+}
diff --git a/arch/arm/cpu/armv7m/stm32f4/soc.c b/arch/arm/cpu/armv7m/stm32f4/soc.c
new file mode 100644 (file)
index 0000000..202a126
--- /dev/null
@@ -0,0 +1,37 @@
+/*
+ * (C) Copyright 2015
+ * Kamil Lulko, <rev13@wp.pl>
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#include <common.h>
+#include <asm/io.h>
+#include <asm/armv7m.h>
+#include <asm/arch/stm32.h>
+
+u32 get_cpu_rev(void)
+{
+       return 0;
+}
+
+int arch_cpu_init(void)
+{
+       configure_clocks();
+
+       /*
+        * Configure the memory protection unit (MPU) to allow full access to
+        * the whole 4GB address space.
+        */
+       writel(0, &V7M_MPU->rnr);
+       writel(0, &V7M_MPU->rbar);
+       writel((V7M_MPU_RASR_AP_RW_RW | V7M_MPU_RASR_SIZE_4GB
+               | V7M_MPU_RASR_EN), &V7M_MPU->rasr);
+       writel(V7M_MPU_CTRL_ENABLE | V7M_MPU_CTRL_HFNMIENA, &V7M_MPU->ctrl);
+
+       return 0;
+}
+
+void s_init(void)
+{
+}
diff --git a/arch/arm/cpu/armv7m/stm32f4/timer.c b/arch/arm/cpu/armv7m/stm32f4/timer.c
new file mode 100644 (file)
index 0000000..102ae6d
--- /dev/null
@@ -0,0 +1,118 @@
+/*
+ * (C) Copyright 2015
+ * Kamil Lulko, <rev13@wp.pl>
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#include <common.h>
+#include <asm/io.h>
+#include <asm/armv7m.h>
+#include <asm/arch/stm32.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+#define STM32_TIM2_BASE        (STM32_APB1PERIPH_BASE + 0x0000)
+
+#define RCC_APB1ENR_TIM2EN     (1 << 0)
+
+struct stm32_tim2_5 {
+       u32 cr1;
+       u32 cr2;
+       u32 smcr;
+       u32 dier;
+       u32 sr;
+       u32 egr;
+       u32 ccmr1;
+       u32 ccmr2;
+       u32 ccer;
+       u32 cnt;
+       u32 psc;
+       u32 arr;
+       u32 reserved1;
+       u32 ccr1;
+       u32 ccr2;
+       u32 ccr3;
+       u32 ccr4;
+       u32 reserved2;
+       u32 dcr;
+       u32 dmar;
+       u32 or;
+};
+
+#define TIM_CR1_CEN    (1 << 0)
+
+#define TIM_EGR_UG     (1 << 0)
+
+int timer_init(void)
+{
+       struct stm32_tim2_5 *tim = (struct stm32_tim2_5 *)STM32_TIM2_BASE;
+
+       setbits_le32(&STM32_RCC->apb1enr, RCC_APB1ENR_TIM2EN);
+
+       if (clock_get(CLOCK_AHB) == clock_get(CLOCK_APB1))
+               writel((clock_get(CLOCK_APB1) / CONFIG_SYS_HZ_CLOCK) - 1,
+                      &tim->psc);
+       else
+               writel(((clock_get(CLOCK_APB1) * 2) / CONFIG_SYS_HZ_CLOCK) - 1,
+                      &tim->psc);
+
+       writel(0xFFFFFFFF, &tim->arr);
+       writel(TIM_CR1_CEN, &tim->cr1);
+       setbits_le32(&tim->egr, TIM_EGR_UG);
+
+       gd->arch.tbl = 0;
+       gd->arch.tbu = 0;
+       gd->arch.lastinc = 0;
+
+       return 0;
+}
+
+ulong get_timer(ulong base)
+{
+       return (get_ticks() / (CONFIG_SYS_HZ_CLOCK / CONFIG_SYS_HZ)) - base;
+}
+
+unsigned long long get_ticks(void)
+{
+       struct stm32_tim2_5 *tim = (struct stm32_tim2_5 *)STM32_TIM2_BASE;
+       u32 now;
+
+       now = readl(&tim->cnt);
+
+       if (now >= gd->arch.lastinc)
+               gd->arch.tbl += (now - gd->arch.lastinc);
+       else
+               gd->arch.tbl += (0xFFFFFFFF - gd->arch.lastinc) + now;
+
+       gd->arch.lastinc = now;
+
+       return gd->arch.tbl;
+}
+
+void reset_timer(void)
+{
+       struct stm32_tim2_5 *tim = (struct stm32_tim2_5 *)STM32_TIM2_BASE;
+
+       gd->arch.lastinc = readl(&tim->cnt);
+       gd->arch.tbl = 0;
+}
+
+/* delay x useconds */
+void __udelay(ulong usec)
+{
+       unsigned long long start;
+
+       start = get_ticks();            /* get current timestamp */
+       while ((get_ticks() - start) < usec)
+               ;                       /* loop till time has passed */
+}
+
+/*
+ * This function is derived from PowerPC code (timebase clock frequency).
+ * On ARM it returns the number of timer ticks per second.
+ */
+ulong get_tbclk(void)
+{
+       return CONFIG_SYS_HZ_CLOCK;
+}
index f920eebc56b8eddb77c3bf8fb0c9b4b07a7cfdd2..9f7815bd523bdc266423b4ff32a8d8d57e7b1b5a 100644 (file)
@@ -6,6 +6,8 @@
 
 obj-y += cpu.o
 obj-y += lowlevel.o
+obj-y += soc.o
 obj-y += speed.o
+obj-$(CONFIG_SYS_HAS_SERDES) += fsl_lsch3_serdes.o ls2085a_serdes.o
 obj-$(CONFIG_MP) += mp.o
 obj-$(CONFIG_OF_LIBFDT) += fdt.o
index cc47466112b6ff4e0dfaf1b284eda4b2d1665706..37f07fbb76e78549cd633cab5a7b1b0b1a8dd562 100644 (file)
@@ -8,3 +8,141 @@ Freescale LayerScape with Chassis Generation 3
 
 This architecture supports Freescale ARMv8 SoCs with Chassis generation 3,
 for example LS2085A.
+
+Flash Layout
+============
+
+(1) A typical layout of various images (including Linux and other firmware images)
+   is shown below considering a 32MB NOR flash device present on most
+   pre-silicon platforms (simulator and emulator):
+
+       -------------------------
+       |       FIT Image       |
+       | (linux + DTB + RFS)   |
+       ------------------------- ----> 0x0120_0000
+       |       Debug Server FW |
+       ------------------------- ----> 0x00C0_0000
+       |       AIOP FW         |
+       ------------------------- ----> 0x0070_0000
+       |       MC FW           |
+       ------------------------- ----> 0x006C_0000
+       |       MC DPL Blob     |
+       ------------------------- ----> 0x0020_0000
+       |       BootLoader + Env|
+       ------------------------- ----> 0x0000_1000
+       |       PBI             |
+       ------------------------- ----> 0x0000_0080
+       |       RCW             |
+       ------------------------- ----> 0x0000_0000
+
+       32-MB NOR flash layout for pre-silicon platforms (simulator and emulator)
+
+(2) A typical layout of various images (including Linux and other firmware images)
+    is shown below considering a 128MB NOR flash device present on QDS and RDB
+    boards:
+       ----------------------------------------- ----> 0x5_8800_0000 ---
+       |       .. Unused .. (7M)               |                       |
+       ----------------------------------------- ----> 0x5_8790_0000   |
+       | FIT Image (linux + DTB + RFS) (40M)   |                       |
+       ----------------------------------------- ----> 0x5_8510_0000   |
+       |       PHY firmware (2M)               |                       |
+       ----------------------------------------- ----> 0x5_84F0_0000   | 64K
+       |       Debug Server FW (2M)            |                       | Alt
+       ----------------------------------------- ----> 0x5_84D0_0000   | Bank
+       |       AIOP FW (4M)                    |                       |
+       ----------------------------------------- ----> 0x5_8490_0000 (vbank4)
+       |       MC DPC Blob (1M)                |                       |
+       ----------------------------------------- ----> 0x5_8480_0000   |
+       |       MC DPL Blob (1M)                |                       |
+       ----------------------------------------- ----> 0x5_8470_0000   |
+       |       MC FW (4M)                      |                       |
+       ----------------------------------------- ----> 0x5_8430_0000   |
+       |       BootLoader Environment (1M)     |                       |
+       ----------------------------------------- ----> 0x5_8420_0000   |
+       |       BootLoader (1M)                 |                       |
+       ----------------------------------------- ----> 0x5_8410_0000   |
+       |       RCW and PBI (1M)                |                       |
+       ----------------------------------------- ----> 0x5_8400_0000 ---
+       |       .. Unused .. (7M)               |                       |
+       ----------------------------------------- ----> 0x5_8390_0000   |
+       | FIT Image (linux + DTB + RFS) (40M)   |                       |
+       ----------------------------------------- ----> 0x5_8110_0000   |
+       |       PHY firmware (2M)               |                       |
+       ----------------------------------------- ----> 0x5_80F0_0000   | 64K
+       |       Debug Server FW (2M)            |                       | Bank
+       ----------------------------------------- ----> 0x5_80D0_0000   |
+       |       AIOP FW (4M)                    |                       |
+       ----------------------------------------- ----> 0x5_8090_0000 (vbank0)
+       |       MC DPC Blob (1M)                |                       |
+       ----------------------------------------- ----> 0x5_8080_0000   |
+       |       MC DPL Blob (1M)                |                       |
+       ----------------------------------------- ----> 0x5_8070_0000   |
+       |       MC FW (4M)                      |                       |
+       ----------------------------------------- ----> 0x5_8030_0000   |
+       |       BootLoader Environment (1M)     |                       |
+       ----------------------------------------- ----> 0x5_8020_0000   |
+       |       BootLoader (1M)                 |                       |
+       ----------------------------------------- ----> 0x5_8010_0000   |
+       |       RCW and PBI (1M)                |                       |
+       ----------------------------------------- ----> 0x5_8000_0000 ---
+
+       128-MB NOR flash layout for QDS and RDB boards
+
+Environment Variables
+=====================
+mcboottimeout: MC boot timeout in milliseconds. If this variable is not defined
+               the value CONFIG_SYS_LS_MC_BOOT_TIMEOUT_MS will be assumed.
+
+mcmemsize:     MC DRAM block size. If this variable is not defined, the value
+               CONFIG_SYS_LS_MC_DRAM_BLOCK_MIN_SIZE will be assumed.
+
+Booting from NAND
+-------------------
+Booting from NAND requires two images, RCW and u-boot-with-spl.bin.
+The difference between NAND boot RCW image and NOR boot image is the PBI
+command sequence. Below is one example for PBI commands for QDS which uses
+NAND device with 2KB/page, block size 128KB.
+
+1) CCSR 4-byte write to 0x00e00404, data=0x00000000
+2) CCSR 4-byte write to 0x00e00400, data=0x1800a000
+The above two commands set bootloc register to 0x00000000_1800a000 where
+the u-boot code will be running in OCRAM.
+
+3) Block Copy: SRC=0x0107, SRC_ADDR=0x00020000, DEST_ADDR=0x1800a000,
+BLOCK_SIZE=0x00014000
+This command copies u-boot image from NAND device into OCRAM. The values need
+to adjust accordingly.
+
+SRC            should match the cfg_rcw_src, the reset config pins. It depends
+               on the NAND device. See reference manual for cfg_rcw_src.
+SRC_ADDR       is the offset of u-boot-with-spl.bin image in NAND device. In
+               the example above, 128KB. For easy maintenance, we put it at
+               the beginning of next block from RCW.
+DEST_ADDR      is fixed at 0x1800a000, matching bootloc set above.
+BLOCK_SIZE     is the size to be copied by PBI.
+
+RCW image should be written to the beginning of NAND device. Example of using
+u-boot command
+
+nand write <rcw image in memory> 0 <size of rcw image>
+
+To form the NAND image, build u-boot with NAND config, for example,
+ls2085aqds_nand_defconfig. The image needed is u-boot-with-spl.bin.
+The u-boot image should be written to match SRC_ADDR, in above example 0x20000.
+
+nand write <u-boot image in memory> 200000 <size of u-boot image>
+
+With these two images in NAND device, the board can boot from NAND.
+
+Another example for RDB boards,
+
+1) CCSR 4-byte write to 0x00e00404, data=0x00000000
+2) CCSR 4-byte write to 0x00e00400, data=0x1800a000
+3) Block Copy: SRC=0x0119, SRC_ADDR=0x00080000, DEST_ADDR=0x1800a000,
+BLOCK_SIZE=0x00014000
+
+nand write <rcw image in memory> 0 <size of rcw image>
+nand write <u-boot image in memory> 80000 <size of u-boot image>
+
+Notice the difference from QDS is SRC, SRC_ADDR and the offset of u-boot image
+to match board NAND device with 4KB/page, block size 512KB.
index 49974878b9c774a66cedaafd0edde801438c525f..67145778b97fba9e2aba03b3328b0bee397c2068 100644 (file)
 #include <asm/armv8/mmu.h>
 #include <asm/io.h>
 #include <asm/arch-fsl-lsch3/immap_lsch3.h>
+#include <fsl_debug_server.h>
 #include <fsl-mc/fsl_mc.h>
+#include <asm/arch/fsl_serdes.h>
+#ifdef CONFIG_FSL_ESDHC
+#include <fsl_esdhc.h>
+#endif
 #include "cpu.h"
 #include "mp.h"
 #include "speed.h"
@@ -24,8 +29,9 @@ DECLARE_GLOBAL_DATA_PTR;
  * levels of translation tables here to cover 40-bit address space.
  * We use 4KB granule size, with 40 bits physical address, T0SZ=24
  * Level 0 IA[39], table address @0
- * Level 1 IA[31:30], table address @01000, 0x2000
- * Level 2 IA[29:21], table address @0x3000
+ * Level 1 IA[31:30], table address @0x1000, 0x2000
+ * Level 2 IA[29:21], table address @0x3000, 0x4000
+ * Address above 0x5000 is free for other purpose.
  */
 
 #define SECTION_SHIFT_L0       39UL
@@ -60,12 +66,12 @@ static inline void early_mmu_setup(void)
 {
        int el;
        u64 i;
-       u64 section_l1t0, section_l1t1, section_l2;
+       u64 section_l1t0, section_l1t1, section_l2t0, section_l2t1;
        u64 *level0_table = (u64 *)CONFIG_SYS_FSL_OCRAM_BASE;
        u64 *level1_table_0 = (u64 *)(CONFIG_SYS_FSL_OCRAM_BASE + 0x1000);
        u64 *level1_table_1 = (u64 *)(CONFIG_SYS_FSL_OCRAM_BASE + 0x2000);
-       u64 *level2_table = (u64 *)(CONFIG_SYS_FSL_OCRAM_BASE + 0x3000);
-
+       u64 *level2_table_0 = (u64 *)(CONFIG_SYS_FSL_OCRAM_BASE + 0x3000);
+       u64 *level2_table_1 = (u64 *)(CONFIG_SYS_FSL_OCRAM_BASE + 0x4000);
 
        level0_table[0] =
                (u64)level1_table_0 | PMD_TYPE_TABLE;
@@ -79,21 +85,25 @@ static inline void early_mmu_setup(void)
         */
        section_l1t0 = 0;
        section_l1t1 = BLOCK_SIZE_L0;
-       section_l2 = 0;
+       section_l2t0 = 0;
+       section_l2t1 = CONFIG_SYS_FLASH_BASE;
        for (i = 0; i < 512; i++) {
                set_pgtable_section(level1_table_0, i, section_l1t0,
                                    MT_DEVICE_NGNRNE);
                set_pgtable_section(level1_table_1, i, section_l1t1,
                                    MT_NORMAL);
-               set_pgtable_section(level2_table, i, section_l2,
+               set_pgtable_section(level2_table_0, i, section_l2t0,
+                                   MT_DEVICE_NGNRNE);
+               set_pgtable_section(level2_table_1, i, section_l2t1,
                                    MT_DEVICE_NGNRNE);
                section_l1t0 += BLOCK_SIZE_L1;
                section_l1t1 += BLOCK_SIZE_L1;
-               section_l2 += BLOCK_SIZE_L2;
+               section_l2t0 += BLOCK_SIZE_L2;
+               section_l2t1 += BLOCK_SIZE_L2;
        }
 
        level1_table_0[0] =
-               (u64)level2_table | PMD_TYPE_TABLE;
+               (u64)level2_table_0 | PMD_TYPE_TABLE;
        level1_table_0[1] =
                0x40000000 | PMD_SECT_AF | PMD_TYPE_SECT |
                PMD_ATTRINDX(MT_DEVICE_NGNRNE);
@@ -104,17 +114,34 @@ static inline void early_mmu_setup(void)
                0xc0000000 | PMD_SECT_AF | PMD_TYPE_SECT |
                PMD_ATTRINDX(MT_NORMAL);
 
-       /* Rewrite table to enable cache */
-       set_pgtable_section(level2_table,
+       /* Rewerite table to enable cache for OCRAM */
+       set_pgtable_section(level2_table_0,
                            CONFIG_SYS_FSL_OCRAM_BASE >> SECTION_SHIFT_L2,
                            CONFIG_SYS_FSL_OCRAM_BASE,
                            MT_NORMAL);
-       for (i = CONFIG_SYS_IFC_BASE >> SECTION_SHIFT_L2;
-            i < (CONFIG_SYS_IFC_BASE + CONFIG_SYS_IFC_SIZE)
-            >> SECTION_SHIFT_L2; i++) {
-               section_l2 = i << SECTION_SHIFT_L2;
-               set_pgtable_section(level2_table, i,
-                                   section_l2, MT_NORMAL);
+
+#if defined(CONFIG_SYS_NOR0_CSPR_EARLY) && defined(CONFIG_SYS_NOR_AMASK_EARLY)
+       /* Rewrite table to enable cache for two entries (4MB) */
+       section_l2t1 = CONFIG_SYS_IFC_BASE;
+       set_pgtable_section(level2_table_0,
+                           section_l2t1 >> SECTION_SHIFT_L2,
+                           section_l2t1,
+                           MT_NORMAL);
+       section_l2t1 += BLOCK_SIZE_L2;
+       set_pgtable_section(level2_table_0,
+                           section_l2t1 >> SECTION_SHIFT_L2,
+                           section_l2t1,
+                           MT_NORMAL);
+#endif
+
+       /* Create a mapping for 256MB IFC region to final flash location */
+       level1_table_0[CONFIG_SYS_FLASH_BASE >> SECTION_SHIFT_L1] =
+               (u64)level2_table_1 | PMD_TYPE_TABLE;
+       section_l2t1 = CONFIG_SYS_IFC_BASE;
+       for (i = 0; i < 0x10000000 >> SECTION_SHIFT_L2; i++) {
+               set_pgtable_section(level2_table_1, i,
+                                   section_l2t1, MT_DEVICE_NGNRNE);
+               section_l2t1 += BLOCK_SIZE_L2;
        }
 
        el = current_el();
@@ -347,6 +374,7 @@ u32 fsl_qoriq_core_to_type(unsigned int core)
 #ifdef CONFIG_DISPLAY_CPUINFO
 int print_cpuinfo(void)
 {
+       struct ccsr_gur __iomem *gur = (void *)(CONFIG_SYS_FSL_GUTS_ADDR);
        struct sys_info sysinfo;
        char buf[32];
        unsigned int i, core;
@@ -370,21 +398,40 @@ int print_cpuinfo(void)
        printf("     DP-DDR:   %-4s MHz", strmhz(buf, sysinfo.freq_ddrbus2));
        puts("\n");
 
+       /* Display the RCW, so that no one gets confused as to what RCW
+        * we're actually using for this boot.
+        */
+       puts("Reset Configuration Word (RCW):");
+       for (i = 0; i < ARRAY_SIZE(gur->rcwsr); i++) {
+               u32 rcw = in_le32(&gur->rcwsr[i]);
+
+               if ((i % 4) == 0)
+                       printf("\n       %02x:", i * 4);
+               printf(" %08x", rcw);
+       }
+       puts("\n");
+
        return 0;
 }
 #endif
 
+#ifdef CONFIG_FSL_ESDHC
+int cpu_mmc_init(bd_t *bis)
+{
+       return fsl_esdhc_mmc_init(bis);
+}
+#endif
+
 int cpu_eth_init(bd_t *bis)
 {
        int error = 0;
 
 #ifdef CONFIG_FSL_MC_ENET
-       error = mc_init(bis);
+       error = fsl_mc_ldpaa_init(bis);
 #endif
        return error;
 }
 
-
 int arch_early_init_r(void)
 {
        int rv;
@@ -393,5 +440,43 @@ int arch_early_init_r(void)
        if (rv)
                printf("Did not wake secondary cores\n");
 
+#ifdef CONFIG_SYS_HAS_SERDES
+       fsl_serdes_init();
+#endif
+       return 0;
+}
+
+int timer_init(void)
+{
+       u32 __iomem *cntcr = (u32 *)CONFIG_SYS_FSL_TIMER_ADDR;
+       u32 __iomem *cltbenr = (u32 *)CONFIG_SYS_FSL_PMU_CLTBENR;
+#ifdef COUNTER_FREQUENCY_REAL
+       unsigned long cntfrq = COUNTER_FREQUENCY_REAL;
+
+       /* Update with accurate clock frequency */
+       asm volatile("msr cntfrq_el0, %0" : : "r" (cntfrq) : "memory");
+#endif
+
+       /* Enable timebase for all clusters.
+        * It is safe to do so even some clusters are not enabled.
+        */
+       out_le32(cltbenr, 0xf);
+
+       /* Enable clock for timer
+        * This is a global setting.
+        */
+       out_le32(cntcr, 0x1);
+
        return 0;
 }
+
+void reset_cpu(ulong addr)
+{
+       u32 __iomem *rstcr = (u32 *)CONFIG_SYS_FSL_RST_ADDR;
+       u32 val;
+
+       /* Raise RESET_REQ_B */
+       val = in_le32(rstcr);
+       val |= 0x02;
+       out_le32(rstcr, val);
+}
index 7eb9b6aa4bb8c2a952ccddc433c9cec50d54a35c..d37002333c92d441b39e875d1bacfc6292eabaed 100644 (file)
@@ -7,6 +7,9 @@
 #include <common.h>
 #include <libfdt.h>
 #include <fdt_support.h>
+#ifdef CONFIG_FSL_ESDHC
+#include <fsl_esdhc.h>
+#endif
 #include "mp.h"
 
 #ifdef CONFIG_MP
@@ -62,7 +65,11 @@ void ft_cpu_setup(void *blob, bd_t *bd)
 #endif
 
 #ifdef CONFIG_SYS_NS16550
-       do_fixup_by_compat_u32(blob, "ns16550",
+       do_fixup_by_compat_u32(blob, "fsl,ns16550",
                               "clock-frequency", CONFIG_SYS_NS16550_CLK, 1);
 #endif
+
+#if defined(CONFIG_FSL_ESDHC)
+       fdt_fixup_esdhc(blob, bd);
+#endif
 }
diff --git a/arch/arm/cpu/armv8/fsl-lsch3/fsl_lsch3_serdes.c b/arch/arm/cpu/armv8/fsl-lsch3/fsl_lsch3_serdes.c
new file mode 100644 (file)
index 0000000..02ca126
--- /dev/null
@@ -0,0 +1,115 @@
+/*
+ * Copyright 2015 Freescale Semiconductor, Inc.
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#include <common.h>
+#include <asm/io.h>
+#include <asm/errno.h>
+#include <asm/arch/fsl_serdes.h>
+#include <asm/arch-fsl-lsch3/immap_lsch3.h>
+#include <fsl-mc/ldpaa_wriop.h>
+
+#ifdef CONFIG_SYS_FSL_SRDS_1
+static u8 serdes1_prtcl_map[SERDES_PRCTL_COUNT];
+#endif
+#ifdef CONFIG_SYS_FSL_SRDS_2
+static u8 serdes2_prtcl_map[SERDES_PRCTL_COUNT];
+#endif
+
+int is_serdes_configured(enum srds_prtcl device)
+{
+       int ret = 0;
+
+#ifdef CONFIG_SYS_FSL_SRDS_1
+       ret |= serdes1_prtcl_map[device];
+#endif
+#ifdef CONFIG_SYS_FSL_SRDS_2
+       ret |= serdes2_prtcl_map[device];
+#endif
+
+       return !!ret;
+}
+
+int serdes_get_first_lane(u32 sd, enum srds_prtcl device)
+{
+       struct ccsr_gur __iomem *gur = (void *)(CONFIG_SYS_FSL_GUTS_ADDR);
+       u32 cfg = in_le32(&gur->rcwsr[28]);
+       int i;
+
+       switch (sd) {
+#ifdef CONFIG_SYS_FSL_SRDS_1
+       case FSL_SRDS_1:
+               cfg &= FSL_CHASSIS3_RCWSR28_SRDS1_PRTCL_MASK;
+               cfg >>= FSL_CHASSIS3_RCWSR28_SRDS1_PRTCL_SHIFT;
+               break;
+#endif
+#ifdef CONFIG_SYS_FSL_SRDS_2
+       case FSL_SRDS_2:
+               cfg &= FSL_CHASSIS3_RCWSR28_SRDS2_PRTCL_MASK;
+               cfg >>= FSL_CHASSIS3_RCWSR28_SRDS2_PRTCL_SHIFT;
+               break;
+#endif
+       default:
+               printf("invalid SerDes%d\n", sd);
+               break;
+       }
+       /* Is serdes enabled at all? */
+       if (cfg == 0)
+               return -ENODEV;
+
+       for (i = 0; i < SRDS_MAX_LANES; i++) {
+               if (serdes_get_prtcl(sd, cfg, i) == device)
+                       return i;
+       }
+
+       return -ENODEV;
+}
+
+void serdes_init(u32 sd, u32 sd_addr, u32 sd_prctl_mask, u32 sd_prctl_shift,
+               u8 serdes_prtcl_map[SERDES_PRCTL_COUNT])
+{
+       struct ccsr_gur __iomem *gur = (void *)(CONFIG_SYS_FSL_GUTS_ADDR);
+       u32 cfg;
+       int lane;
+
+       memset(serdes_prtcl_map, 0, sizeof(serdes_prtcl_map));
+
+       cfg = in_le32(&gur->rcwsr[28]) & sd_prctl_mask;
+       cfg >>= sd_prctl_shift;
+       printf("Using SERDES%d Protocol: %d (0x%x)\n", sd + 1, cfg, cfg);
+
+       if (!is_serdes_prtcl_valid(sd, cfg))
+               printf("SERDES%d[PRTCL] = 0x%x is not valid\n", sd + 1, cfg);
+
+       for (lane = 0; lane < SRDS_MAX_LANES; lane++) {
+               enum srds_prtcl lane_prtcl = serdes_get_prtcl(sd, cfg, lane);
+               if (unlikely(lane_prtcl >= SERDES_PRCTL_COUNT))
+                       debug("Unknown SerDes lane protocol %d\n", lane_prtcl);
+               else {
+                       serdes_prtcl_map[lane_prtcl] = 1;
+#ifdef CONFIG_FSL_MC_ENET
+                       wriop_init_dpmac(sd, lane + 1, (int)lane_prtcl);
+#endif
+               }
+       }
+}
+
+void fsl_serdes_init(void)
+{
+#ifdef CONFIG_SYS_FSL_SRDS_1
+       serdes_init(FSL_SRDS_1,
+                   CONFIG_SYS_FSL_LSCH3_SERDES_ADDR,
+                   FSL_CHASSIS3_RCWSR28_SRDS1_PRTCL_MASK,
+                   FSL_CHASSIS3_RCWSR28_SRDS1_PRTCL_SHIFT,
+                   serdes1_prtcl_map);
+#endif
+#ifdef CONFIG_SYS_FSL_SRDS_2
+       serdes_init(FSL_SRDS_2,
+                   CONFIG_SYS_FSL_LSCH3_SERDES_ADDR + FSL_SRDS_2 * 0x10000,
+                   FSL_CHASSIS3_RCWSR28_SRDS2_PRTCL_MASK,
+                   FSL_CHASSIS3_RCWSR28_SRDS2_PRTCL_SHIFT,
+                   serdes2_prtcl_map);
+#endif
+}
index 886576ef99486034ec7594cc47c607f0e3358c37..018c61742ee8fd4a3b1e3ade9ac7cccc338a022e 100644 (file)
 ENTRY(lowlevel_init)
        mov     x29, lr                 /* Save LR */
 
+       /* Add fully-coherent masters to DVM domain */
+       ldr     x1, =CCI_MN_BASE
+       ldr     x2, [x1, #CCI_MN_RNF_NODEID_LIST]
+       str     x2, [x1, #CCI_MN_DVM_DOMAIN_CTL_SET]
+1:     ldr     x3, [x1, #CCI_MN_DVM_DOMAIN_CTL_SET]
+       mvn     x0, x3
+       tst     x0, x3          /* Wait for domain addition to complete */
+       b.ne    1b
+
        /* Set the SMMU page size in the sACR register */
        ldr     x1, =SMMU_BASE
        ldr     w0, [x1, #0x10]
@@ -224,6 +233,9 @@ ENTRY(secondary_boot_func)
        /* physical address of this cpus spin table element */
        add     x11, x1, x0
 
+       ldr     x0, =__real_cntfrq
+       ldr     x0, [x0]
+       msr     cntfrq_el0, x0  /* set with real frequency */
        str     x9, [x11, #16]  /* LPID */
        mov     x4, #1
        str     x4, [x11, #8]   /* STATUS */
@@ -275,6 +287,9 @@ ENDPROC(secondary_switch_to_el1)
 
        /* 64 bit alignment for elements accessed as data */
        .align 4
+       .global __real_cntfrq
+__real_cntfrq:
+       .quad COUNTER_FREQUENCY
        .globl __secondary_boot_code_size
        .type __secondary_boot_code_size, %object
        /* Secondary Boot Code ends here */
diff --git a/arch/arm/cpu/armv8/fsl-lsch3/ls2085a_serdes.c b/arch/arm/cpu/armv8/fsl-lsch3/ls2085a_serdes.c
new file mode 100644 (file)
index 0000000..098745b
--- /dev/null
@@ -0,0 +1,117 @@
+/*
+ * Copyright 2015 Freescale Semiconductor, Inc.
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#include <common.h>
+#include <asm/arch/fsl_serdes.h>
+#include <asm/arch-fsl-lsch3/immap_lsch3.h>
+
+struct serdes_config {
+       u8 protocol;
+       u8 lanes[SRDS_MAX_LANES];
+};
+
+static struct serdes_config serdes1_cfg_tbl[] = {
+       /* SerDes 1 */
+       {0x03, {PCIE1, PCIE1, PCIE1, PCIE1, PCIE2, PCIE2, PCIE2, PCIE2 } },
+       {0x05, {PCIE2, PCIE2, PCIE2, PCIE2, SGMII4, SGMII3, SGMII2, SGMII1 } },
+       {0x07, {SGMII8, SGMII7, SGMII6, SGMII5, SGMII4, SGMII3, SGMII2,
+               SGMII1 } },
+       {0x09, {SGMII8, SGMII7, SGMII6, SGMII5, SGMII4, SGMII3, SGMII2,
+               SGMII1 } },
+       {0x0A, {SGMII8, SGMII7, SGMII6, SGMII5, SGMII4, SGMII3, SGMII2,
+               SGMII1 } },
+       {0x0C, {SGMII8, SGMII7, SGMII6, SGMII5, SGMII4, SGMII3, SGMII2,
+               SGMII1 } },
+       {0x0E, {SGMII8, SGMII7, SGMII6, SGMII5, SGMII4, SGMII3, SGMII2,
+               SGMII1 } },
+       {0x26, {SGMII8, SGMII7, SGMII6, SGMII5, SGMII4, SGMII3, XFI2, XFI1 } },
+       {0x28, {SGMII8, SGMII7, SGMII6, SGMII5, XFI4, XFI3, XFI2, XFI1 } },
+       {0x2A, {XFI8, XFI7, XFI6, XFI5, XFI4, XFI3, XFI2, XFI1 } },
+       {0x2B, {SGMII8, SGMII7, SGMII6, SGMII5, XAUI1, XAUI1, XAUI1, XAUI1  } },
+       {0x32, {XAUI2, XAUI2, XAUI2, XAUI2, XAUI1, XAUI1, XAUI1, XAUI1  } },
+       {0x33, {PCIE2, PCIE2, PCIE2, PCIE2, QSGMII_D, QSGMII_C, QSGMII_B,
+               QSGMII_A} },
+       {0x35, {QSGMII_D, QSGMII_C, QSGMII_B, PCIE2, XFI4, XFI3, XFI2, XFI1 } },
+               {}
+};
+static struct serdes_config serdes2_cfg_tbl[] = {
+       /* SerDes 2 */
+       {0x07, {SGMII9, SGMII10, SGMII11, SGMII12, SGMII13, SGMII14, SGMII15,
+               SGMII16 } },
+       {0x09, {SGMII9, SGMII10, SGMII11, SGMII12, SGMII13, SGMII14, SGMII15,
+               SGMII16 } },
+       {0x0A, {SGMII9, SGMII10, SGMII11, SGMII12, SGMII13, SGMII14, SGMII15,
+               SGMII16 } },
+       {0x0C, {SGMII9, SGMII10, SGMII11, SGMII12, SGMII13, SGMII14, SGMII15,
+               SGMII16 } },
+       {0x0E, {SGMII9, SGMII10, SGMII11, SGMII12, SGMII13, SGMII14, SGMII15,
+               SGMII16 } },
+       {0x3D, {PCIE3, PCIE3, PCIE3, PCIE3, PCIE3, PCIE3, PCIE3, PCIE3 } },
+       {0x3E, {PCIE3, PCIE3, PCIE3, PCIE3, PCIE3, PCIE3, PCIE3, PCIE3 } },
+       {0x3F, {PCIE3, PCIE3, PCIE3, PCIE3, PCIE4, PCIE4, PCIE4, PCIE4 } },
+       {0x40, {PCIE3, PCIE3, PCIE3, PCIE3, PCIE4, PCIE4, PCIE4, PCIE4 } },
+       {0x41, {PCIE3, PCIE3, PCIE3, PCIE3, PCIE4, PCIE4, SATA1, SATA2 } },
+       {0x42, {PCIE3, PCIE3, PCIE3, PCIE3, PCIE4, PCIE4, SATA1, SATA2 } },
+       {0x43, {PCIE3, PCIE3, PCIE3, PCIE3, NONE, NONE, SATA1, SATA2 } },
+       {0x44, {PCIE3, PCIE3, PCIE3, PCIE3, NONE, NONE, SATA1, SATA2 } },
+       {0x45, {PCIE3, SGMII10, SGMII11, SGMII12, PCIE4, SGMII14, SGMII15,
+               SGMII16 } },
+       {0x47, {SGMII9, SGMII10, SGMII11, SGMII12, PCIE4, PCIE4, PCIE4,
+               PCIE4 } },
+       {0x49, {SGMII9, SGMII10, SGMII11, SGMII12, PCIE4, PCIE4, SATA1,
+               SATA2 } },
+       {0x4A, {SGMII9, SGMII10, SGMII11, SGMII12, PCIE4, PCIE4, SATA1,
+               SATA2 } },
+       {}
+};
+
+static struct serdes_config *serdes_cfg_tbl[] = {
+       serdes1_cfg_tbl,
+       serdes2_cfg_tbl,
+};
+
+enum srds_prtcl serdes_get_prtcl(int serdes, int cfg, int lane)
+{
+       struct serdes_config *ptr;
+
+       if (serdes >= ARRAY_SIZE(serdes_cfg_tbl))
+               return 0;
+
+       ptr = serdes_cfg_tbl[serdes];
+       while (ptr->protocol) {
+               if (ptr->protocol == cfg)
+                       return ptr->lanes[lane];
+               ptr++;
+       }
+
+       return 0;
+}
+
+int is_serdes_prtcl_valid(int serdes, u32 prtcl)
+{
+       int i;
+       struct serdes_config *ptr;
+
+       if (serdes >= ARRAY_SIZE(serdes_cfg_tbl))
+               return 0;
+
+       ptr = serdes_cfg_tbl[serdes];
+       while (ptr->protocol) {
+               if (ptr->protocol == prtcl)
+                       break;
+               ptr++;
+       }
+
+       if (!ptr->protocol)
+               return 0;
+
+       for (i = 0; i < SRDS_MAX_LANES; i++) {
+               if (ptr->lanes[i] != NONE)
+                       return 1;
+       }
+
+       return 0;
+}
index ce9c0c1bdbeb7746b3a456a9a9c2925754e4e607..da7853a5af4043068624c1876009e58e614a62fd 100644 (file)
@@ -31,6 +31,13 @@ int fsl_lsch3_wake_seconday_cores(void)
        int i, timeout = 10;
        u64 *table = get_spin_tbl_addr();
 
+#ifdef COUNTER_FREQUENCY_REAL
+       /* update for secondary cores */
+       __real_cntfrq = COUNTER_FREQUENCY_REAL;
+       flush_dcache_range((unsigned long)&__real_cntfrq,
+                          (unsigned long)&__real_cntfrq + 8);
+#endif
+
        cores = cpu_mask();
        /* Clear spin table so that secondary processors
         * observe the correct value after waking up from wfe.
index 66144d6101d504ca67235c175210cca97ada1c07..c985d6a6bad6ebce0d38b649000e4abffdaaf87a 100644 (file)
@@ -26,6 +26,7 @@
 #define id_to_core(x)  ((x & 3) | (x >> 6))
 #ifndef __ASSEMBLY__
 extern u64 __spin_table[];
+extern u64 __real_cntfrq;
 extern u64 *secondary_boot_code;
 extern size_t __secondary_boot_code_size;
 int fsl_lsch3_wake_seconday_cores(void);
diff --git a/arch/arm/cpu/armv8/fsl-lsch3/soc.c b/arch/arm/cpu/armv8/fsl-lsch3/soc.c
new file mode 100644 (file)
index 0000000..2538001
--- /dev/null
@@ -0,0 +1,107 @@
+/*
+ * Copyright 2015 Freescale Semiconductor
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#include <common.h>
+#include <fsl_ifc.h>
+#include <nand.h>
+#include <spl.h>
+#include <asm/arch-fsl-lsch3/soc.h>
+#include <asm/io.h>
+#include <asm/global_data.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+static void erratum_a008751(void)
+{
+#ifdef CONFIG_SYS_FSL_ERRATUM_A008751
+       u32 __iomem *scfg = (u32 __iomem *)SCFG_BASE;
+
+       writel(0x27672b2a, scfg + SCFG_USB3PRM1CR / 4);
+#endif
+}
+
+static void erratum_rcw_src(void)
+{
+#if defined(CONFIG_SPL)
+       u32 __iomem *dcfg_ccsr = (u32 __iomem *)DCFG_BASE;
+       u32 __iomem *dcfg_dcsr = (u32 __iomem *)DCFG_DCSR_BASE;
+       u32 val;
+
+       val = in_le32(dcfg_ccsr + DCFG_PORSR1 / 4);
+       val &= ~DCFG_PORSR1_RCW_SRC;
+       val |= DCFG_PORSR1_RCW_SRC_NOR;
+       out_le32(dcfg_dcsr + DCFG_DCSR_PORCR1 / 4, val);
+#endif
+}
+
+#define I2C_DEBUG_REG 0x6
+#define I2C_GLITCH_EN 0x8
+/*
+ * This erratum requires setting glitch_en bit to enable
+ * digital glitch filter to improve clock stability.
+ */
+static void erratum_a009203(void)
+{
+       u8 __iomem *ptr;
+#ifdef CONFIG_SYS_I2C
+#ifdef I2C1_BASE_ADDR
+       ptr = (u8 __iomem *)(I2C1_BASE_ADDR + I2C_DEBUG_REG);
+
+       writeb(I2C_GLITCH_EN, ptr);
+#endif
+#ifdef I2C2_BASE_ADDR
+       ptr = (u8 __iomem *)(I2C2_BASE_ADDR + I2C_DEBUG_REG);
+
+       writeb(I2C_GLITCH_EN, ptr);
+#endif
+#ifdef I2C3_BASE_ADDR
+       ptr = (u8 __iomem *)(I2C3_BASE_ADDR + I2C_DEBUG_REG);
+
+       writeb(I2C_GLITCH_EN, ptr);
+#endif
+#ifdef I2C4_BASE_ADDR
+       ptr = (u8 __iomem *)(I2C4_BASE_ADDR + I2C_DEBUG_REG);
+
+       writeb(I2C_GLITCH_EN, ptr);
+#endif
+#endif
+}
+
+void fsl_lsch3_early_init_f(void)
+{
+       erratum_a008751();
+       erratum_rcw_src();
+       init_early_memctl_regs();       /* tighten IFC timing */
+       erratum_a009203();
+}
+
+#ifdef CONFIG_SPL_BUILD
+void board_init_f(ulong dummy)
+{
+       /* Clear global data */
+       memset((void *)gd, 0, sizeof(gd_t));
+
+       arch_cpu_init();
+       board_early_init_f();
+       timer_init();
+       env_init();
+       gd->baudrate = getenv_ulong("baudrate", 10, CONFIG_BAUDRATE);
+
+       serial_init();
+       console_init_f();
+       dram_init();
+
+       /* Clear the BSS. */
+       memset(__bss_start, 0, __bss_end - __bss_start);
+
+       board_init_r(NULL, 0);
+}
+
+u32 spl_boot_device(void)
+{
+       return BOOT_DEVICE_NAND;
+}
+#endif
index 72cd999c5fd0e2e35594eef7a5f33e3d4729e311..cac4f925a4ec9386f3e230f381f8d9a4769976ae 100644 (file)
@@ -26,7 +26,7 @@ void get_sys_info(struct sys_info *sys_info)
 {
        struct ccsr_gur __iomem *gur = (void *)(CONFIG_SYS_FSL_GUTS_ADDR);
 #ifdef CONFIG_FSL_IFC
-       struct fsl_ifc *ifc_regs = (void *)CONFIG_SYS_IFC_ADDR;
+       struct fsl_ifc ifc_regs = {(void *)CONFIG_SYS_IFC_ADDR, (void *)NULL};
        u32 ccr;
 #endif
        struct ccsr_clk_cluster_group __iomem *clk_grp[2] = {
@@ -86,6 +86,8 @@ void get_sys_info(struct sys_info *sys_info)
        sys_info->freq_systembus *= (in_le32(&gur->rcwsr[0]) >>
                        FSL_CHASSIS3_RCWSR0_SYS_PLL_RAT_SHIFT) &
                        FSL_CHASSIS3_RCWSR0_SYS_PLL_RAT_MASK;
+       /* Platform clock is half of platform PLL */
+       sys_info->freq_systembus /= 2;
        sys_info->freq_ddrbus *= (in_le32(&gur->rcwsr[0]) >>
                        FSL_CHASSIS3_RCWSR0_MEM_PLL_RAT_SHIFT) &
                        FSL_CHASSIS3_RCWSR0_MEM_PLL_RAT_MASK;
@@ -102,10 +104,7 @@ void get_sys_info(struct sys_info *sys_info)
                         offsetof(struct ccsr_clk_cluster_group,
                                  pllngsr[i%3].gsr));
                ratio[i] = (in_le32(offset) >> 1) & 0x3f;
-               if (ratio[i] > 4)
-                       freq_c_pll[i] = sysclk * ratio[i];
-               else
-                       freq_c_pll[i] = sys_info->freq_systembus * ratio[i];
+               freq_c_pll[i] = sysclk * ratio[i];
        }
 
        for_each_cpu(i, cpu, cpu_numcores(), cpu_mask()) {
@@ -119,7 +118,7 @@ void get_sys_info(struct sys_info *sys_info)
        }
 
 #if defined(CONFIG_FSL_IFC)
-       ccr = in_le32(&ifc_regs->ifc_ccr);
+       ccr = in_le32(&ifc_regs.gregs->ifc_ccr);
        ccr = ((ccr & IFC_CCR_CLK_DIV_MASK) >> IFC_CCR_CLK_DIV_SHIFT) + 1;
 
        sys_info->freq_localbus = sys_info->freq_systembus / ccr;
index 223b95e210edd7146c6a8549bbf7f43b362d105b..8e60baebc53487d17556facc322003e23dfbd15f 100644 (file)
@@ -25,7 +25,18 @@ unsigned long get_tbclk(void)
 unsigned long timer_read_counter(void)
 {
        unsigned long cntpct;
+#ifdef CONFIG_SYS_FSL_ERRATUM_A008585
+       /* This erratum number needs to be confirmed to match ARM document */
+       unsigned long temp;
+#endif
        isb();
        asm volatile("mrs %0, cntpct_el0" : "=r" (cntpct));
+#ifdef CONFIG_SYS_FSL_ERRATUM_A008585
+       asm volatile("mrs %0, cntpct_el0" : "=r" (temp));
+       while (temp != cntpct) {
+               asm volatile("mrs %0, cntpct_el0" : "=r" (cntpct));
+               asm volatile("mrs %0, cntpct_el0" : "=r" (temp));
+       }
+#endif
        return cntpct;
 }
diff --git a/arch/arm/cpu/armv8/u-boot-spl.lds b/arch/arm/cpu/armv8/u-boot-spl.lds
new file mode 100644 (file)
index 0000000..4df339c
--- /dev/null
@@ -0,0 +1,77 @@
+/*
+ * (C) Copyright 2013
+ * David Feng <fenghua@phytium.com.cn>
+ *
+ * (C) Copyright 2002
+ * Gary Jennejohn, DENX Software Engineering, <garyj@denx.de>
+ *
+ * (C) Copyright 2010
+ * Texas Instruments, <www.ti.com>
+ *     Aneesh V <aneesh@ti.com>
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+MEMORY { .sram : ORIGIN = CONFIG_SPL_TEXT_BASE,
+               LENGTH = CONFIG_SPL_MAX_SIZE }
+MEMORY { .sdram : ORIGIN = CONFIG_SPL_BSS_START_ADDR,
+               LENGTH = CONFIG_SPL_BSS_MAX_SIZE }
+
+OUTPUT_FORMAT("elf64-littleaarch64", "elf64-littleaarch64", "elf64-littleaarch64")
+OUTPUT_ARCH(aarch64)
+ENTRY(_start)
+SECTIONS
+{
+       .text : {
+               . = ALIGN(8);
+               *(.__image_copy_start)
+               CPUDIR/start.o (.text*)
+               *(.text*)
+       } >.sram
+
+       .rodata : {
+               . = ALIGN(8);
+               *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*)))
+       } >.sram
+
+       .data : {
+               . = ALIGN(8);
+               *(.data*)
+       } >.sram
+
+       .u_boot_list : {
+               . = ALIGN(8);
+               KEEP(*(SORT(.u_boot_list*)));
+       } >.sram
+
+       .image_copy_end : {
+               . = ALIGN(8);
+               *(.__image_copy_end)
+       } >.sram
+
+       .end : {
+               . = ALIGN(8);
+               *(.__end)
+       } >.sram
+
+       .bss_start : {
+               . = ALIGN(8);
+               KEEP(*(.__bss_start));
+       } >.sdram
+
+       .bss : {
+               *(.bss*)
+                . = ALIGN(8);
+       } >.sdram
+
+       .bss_end : {
+               KEEP(*(.__bss_end));
+       } >.sdram
+
+       /DISCARD/ : { *(.dynsym) }
+       /DISCARD/ : { *(.dynstr*) }
+       /DISCARD/ : { *(.dynamic*) }
+       /DISCARD/ : { *(.plt*) }
+       /DISCARD/ : { *(.interp*) }
+       /DISCARD/ : { *(.gnu*) }
+}
index f9b61ba8e8fe525e57e4ca985afd9b540390d04d..0ff41d00287d2d23702f39bdf7a411831c0ceab6 100644 (file)
@@ -2,6 +2,8 @@
  * U-Boot additions to enable a generic Exynos GPIO driver
  *
  * Copyright (c) 2014 Google, Inc
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
  */
 
 /{
index c41d07b65fc56abd07b890a369951713d94c5a33..8e5a6c61180a758adc33f1fccd32e8cc78de73b6 100644 (file)
@@ -2,6 +2,8 @@
  * U-Boot additions to enable a generic Exynos GPIO driver
  *
  * Copyright (c) 2014 Google, Inc
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
  */
 
 /{
index 7edb0ca29003294750a1c9c9fa88b5150a8ff53b..068c5f696fed5e1e1e09a346efacbbcfaa50a04c 100644 (file)
@@ -2,6 +2,8 @@
  * U-Boot additions to enable a generic Exynos GPIO driver
  *
  * Copyright (c) 2014 Google, Inc
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
  */
 
 /{
index 5a86211d4a01516c991e90ff4d7943a900d4c5c7..635a1b0d3a50157bc94e81e01712c6dd6f1e5ffe 100644 (file)
@@ -2,6 +2,8 @@
  * U-Boot additions to enable a generic Exynos GPIO driver
  *
  * Copyright (c) 2014 Google, Inc
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
  */
 
 /{
index bd9f97c97ba8a12ad87f6b6cb3e0abfad93c0b94..975386969e16ec3c0342da39e3e289fcf9fc4872 100644 (file)
@@ -2,6 +2,8 @@
  * U-Boot additions to enable a generic Exynos GPIO driver
  *
  * Copyright (c) 2014 Google, Inc
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
  */
 
 / {
index d21b6ab756a91a9b8e9e26f43a750d76980d3969..2e9d552daaf5fe088b51e6aafc4f00d4a624e40c 100644 (file)
@@ -2,6 +2,8 @@
  * U-Boot additions to enable a generic Exynos GPIO driver
  *
  * Copyright (c) 2014 Google, Inc
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
  */
 
 / {
index 606482f7a38fc138f1b0bd88d9cbc7141dc75545..b9f1ca4da98828fded63bd3a0b60f9b61162bba0 100644 (file)
@@ -22,6 +22,9 @@ ifeq ($(SOC),$(filter $(SOC),mx6))
 obj-$(CONFIG_CMD_SATA) += sata.o
 obj-$(CONFIG_IMX_VIDEO_SKIP) += video.o
 endif
+ifeq ($(SOC),$(filter $(SOC),vf610))
+obj-y += ddrmc-vf610.o
+endif
 obj-$(CONFIG_CMD_BMODE) += cmd_bmode.o
 obj-$(CONFIG_CMD_HDMIDETECT) += cmd_hdmidet.o
 obj-$(CONFIG_CMD_DEKBLOB) += cmd_dek.o
diff --git a/arch/arm/imx-common/ddrmc-vf610.c b/arch/arm/imx-common/ddrmc-vf610.c
new file mode 100644 (file)
index 0000000..e462631
--- /dev/null
@@ -0,0 +1,278 @@
+/*
+ * Copyright 2015 Toradex, Inc.
+ *
+ * Based on vf610twr:
+ * Copyright 2013 Freescale Semiconductor, Inc.
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#include <asm/io.h>
+#include <asm/arch/imx-regs.h>
+#include <asm/arch/iomux-vf610.h>
+#include <asm/arch/ddrmc-vf610.h>
+
+void ddrmc_setup_iomux(void)
+{
+       static const iomux_v3_cfg_t ddr_pads[] = {
+               VF610_PAD_DDR_A15__DDR_A_15,
+               VF610_PAD_DDR_A14__DDR_A_14,
+               VF610_PAD_DDR_A13__DDR_A_13,
+               VF610_PAD_DDR_A12__DDR_A_12,
+               VF610_PAD_DDR_A11__DDR_A_11,
+               VF610_PAD_DDR_A10__DDR_A_10,
+               VF610_PAD_DDR_A9__DDR_A_9,
+               VF610_PAD_DDR_A8__DDR_A_8,
+               VF610_PAD_DDR_A7__DDR_A_7,
+               VF610_PAD_DDR_A6__DDR_A_6,
+               VF610_PAD_DDR_A5__DDR_A_5,
+               VF610_PAD_DDR_A4__DDR_A_4,
+               VF610_PAD_DDR_A3__DDR_A_3,
+               VF610_PAD_DDR_A2__DDR_A_2,
+               VF610_PAD_DDR_A1__DDR_A_1,
+               VF610_PAD_DDR_A0__DDR_A_0,
+               VF610_PAD_DDR_BA2__DDR_BA_2,
+               VF610_PAD_DDR_BA1__DDR_BA_1,
+               VF610_PAD_DDR_BA0__DDR_BA_0,
+               VF610_PAD_DDR_CAS__DDR_CAS_B,
+               VF610_PAD_DDR_CKE__DDR_CKE_0,
+               VF610_PAD_DDR_CLK__DDR_CLK_0,
+               VF610_PAD_DDR_CS__DDR_CS_B_0,
+               VF610_PAD_DDR_D15__DDR_D_15,
+               VF610_PAD_DDR_D14__DDR_D_14,
+               VF610_PAD_DDR_D13__DDR_D_13,
+               VF610_PAD_DDR_D12__DDR_D_12,
+               VF610_PAD_DDR_D11__DDR_D_11,
+               VF610_PAD_DDR_D10__DDR_D_10,
+               VF610_PAD_DDR_D9__DDR_D_9,
+               VF610_PAD_DDR_D8__DDR_D_8,
+               VF610_PAD_DDR_D7__DDR_D_7,
+               VF610_PAD_DDR_D6__DDR_D_6,
+               VF610_PAD_DDR_D5__DDR_D_5,
+               VF610_PAD_DDR_D4__DDR_D_4,
+               VF610_PAD_DDR_D3__DDR_D_3,
+               VF610_PAD_DDR_D2__DDR_D_2,
+               VF610_PAD_DDR_D1__DDR_D_1,
+               VF610_PAD_DDR_D0__DDR_D_0,
+               VF610_PAD_DDR_DQM1__DDR_DQM_1,
+               VF610_PAD_DDR_DQM0__DDR_DQM_0,
+               VF610_PAD_DDR_DQS1__DDR_DQS_1,
+               VF610_PAD_DDR_DQS0__DDR_DQS_0,
+               VF610_PAD_DDR_RAS__DDR_RAS_B,
+               VF610_PAD_DDR_WE__DDR_WE_B,
+               VF610_PAD_DDR_ODT1__DDR_ODT_0,
+               VF610_PAD_DDR_ODT0__DDR_ODT_1,
+               VF610_PAD_DDR_RESETB,
+       };
+
+       imx_iomux_v3_setup_multiple_pads(ddr_pads, ARRAY_SIZE(ddr_pads));
+}
+
+void ddrmc_phy_init(void)
+{
+       struct ddrmr_regs *ddrmr = (struct ddrmr_regs *)DDR_BASE_ADDR;
+
+       writel(DDRMC_PHY_DQ_TIMING, &ddrmr->phy[0]);
+       writel(DDRMC_PHY_DQ_TIMING, &ddrmr->phy[16]);
+       writel(DDRMC_PHY_DQ_TIMING, &ddrmr->phy[32]);
+
+       writel(DDRMC_PHY_DQS_TIMING, &ddrmr->phy[1]);
+       writel(DDRMC_PHY_DQS_TIMING, &ddrmr->phy[17]);
+
+       writel(DDRMC_PHY_CTRL, &ddrmr->phy[2]);
+       writel(DDRMC_PHY_CTRL, &ddrmr->phy[18]);
+       writel(DDRMC_PHY_CTRL, &ddrmr->phy[34]);
+
+       writel(DDRMC_PHY_MASTER_CTRL, &ddrmr->phy[3]);
+       writel(DDRMC_PHY_MASTER_CTRL, &ddrmr->phy[19]);
+       writel(DDRMC_PHY_MASTER_CTRL, &ddrmr->phy[35]);
+
+       writel(DDRMC_PHY_SLAVE_CTRL, &ddrmr->phy[4]);
+       writel(DDRMC_PHY_SLAVE_CTRL, &ddrmr->phy[20]);
+       writel(DDRMC_PHY_SLAVE_CTRL, &ddrmr->phy[36]);
+
+       /* LPDDR2 only parameter */
+       writel(DDRMC_PHY_OFF, &ddrmr->phy[49]);
+
+       writel(DDRMC_PHY50_DDR3_MODE |
+                  DDRMC_PHY50_EN_SW_HALF_CYCLE, &ddrmr->phy[50]);
+
+       /* Processor Pad ODT settings */
+       writel(DDRMC_PHY_PROC_PAD_ODT, &ddrmr->phy[52]);
+}
+
+static void ddrmc_ctrl_lvl_init(struct ddrmc_lvl_info *lvl)
+{
+       struct ddrmr_regs *ddrmr = (struct ddrmr_regs *)DDR_BASE_ADDR;
+       u32 cr102 = 0, cr105 = 0, cr106 = 0, cr110 = 0;
+
+       if (lvl->wrlvl_reg_en) {
+               writel(DDRMC_CR97_WRLVL_EN, &ddrmr->cr[97]);
+               writel(DDRMC_CR98_WRLVL_DL_0(lvl->wrlvl_dl_0), &ddrmr->cr[98]);
+               writel(DDRMC_CR99_WRLVL_DL_1(lvl->wrlvl_dl_1), &ddrmr->cr[99]);
+       }
+
+       if (lvl->rdlvl_reg_en) {
+               cr102 |= DDRMC_CR102_RDLVL_REG_EN;
+               cr105 |= DDRMC_CR105_RDLVL_DL_0(lvl->rdlvl_dl_0);
+               cr110 |= DDRMC_CR110_RDLVL_DL_1(lvl->rdlvl_dl_1);
+       }
+
+       if (lvl->rdlvl_gt_reg_en) {
+               cr102 |= DDRMC_CR102_RDLVL_GT_REGEN;
+               cr106 |= DDRMC_CR106_RDLVL_GTDL_0(lvl->rdlvl_gt_dl_0);
+               cr110 |= DDRMC_CR110_RDLVL_GTDL_1(lvl->rdlvl_gt_dl_1);
+       }
+
+       writel(cr102, &ddrmr->cr[102]);
+       writel(cr105, &ddrmr->cr[105]);
+       writel(cr106, &ddrmr->cr[106]);
+       writel(cr110, &ddrmr->cr[110]);
+}
+
+void ddrmc_ctrl_init_ddr3(struct ddr3_jedec_timings const *timings,
+                                                 struct ddrmc_lvl_info *lvl,
+                                                 int col_diff, int row_diff)
+{
+       struct ddrmr_regs *ddrmr = (struct ddrmr_regs *)DDR_BASE_ADDR;
+
+       writel(DDRMC_CR00_DRAM_CLASS_DDR3, &ddrmr->cr[0]);
+       writel(DDRMC_CR02_DRAM_TINIT(timings->tinit), &ddrmr->cr[2]);
+       writel(DDRMC_CR10_TRST_PWRON(timings->trst_pwron), &ddrmr->cr[10]);
+
+       writel(DDRMC_CR11_CKE_INACTIVE(timings->cke_inactive), &ddrmr->cr[11]);
+       writel(DDRMC_CR12_WRLAT(timings->wrlat) |
+                  DDRMC_CR12_CASLAT_LIN(timings->caslat_lin), &ddrmr->cr[12]);
+       writel(DDRMC_CR13_TRC(timings->trc) | DDRMC_CR13_TRRD(timings->trrd) |
+                  DDRMC_CR13_TCCD(timings->tccd), &ddrmr->cr[13]);
+       writel(DDRMC_CR14_TFAW(timings->tfaw) | DDRMC_CR14_TRP(timings->trp) |
+                  DDRMC_CR14_TWTR(timings->twtr) |
+                  DDRMC_CR14_TRAS_MIN(timings->tras_min), &ddrmr->cr[14]);
+       writel(DDRMC_CR16_TMRD(timings->tmrd) |
+                  DDRMC_CR16_TRTP(timings->trtp), &ddrmr->cr[16]);
+       writel(DDRMC_CR17_TRAS_MAX(timings->tras_max) |
+                  DDRMC_CR17_TMOD(timings->tmod), &ddrmr->cr[17]);
+       writel(DDRMC_CR18_TCKESR(timings->tckesr) |
+                  DDRMC_CR18_TCKE(timings->tcke), &ddrmr->cr[18]);
+
+       writel(DDRMC_CR20_AP_EN, &ddrmr->cr[20]);
+       writel(DDRMC_CR21_TRCD_INT(timings->trcd_int) |
+                  DDRMC_CR21_CCMAP_EN, &ddrmr->cr[21]);
+
+       writel(DDRMC_CR22_TDAL(timings->tdal), &ddrmr->cr[22]);
+       writel(DDRMC_CR23_BSTLEN(3) |
+                  DDRMC_CR23_TDLL(timings->tdll), &ddrmr->cr[23]);
+       writel(DDRMC_CR24_TRP_AB(timings->trp_ab), &ddrmr->cr[24]);
+
+       writel(DDRMC_CR25_TREF_EN, &ddrmr->cr[25]);
+       writel(DDRMC_CR26_TREF(timings->tref) |
+                  DDRMC_CR26_TRFC(timings->trfc), &ddrmr->cr[26]);
+       writel(DDRMC_CR28_TREF_INT(0), &ddrmr->cr[28]);
+       writel(DDRMC_CR29_TPDEX(timings->tpdex), &ddrmr->cr[29]);
+
+       writel(DDRMC_CR30_TXPDLL(timings->txpdll), &ddrmr->cr[30]);
+       writel(DDRMC_CR31_TXSNR(timings->txsnr) |
+                  DDRMC_CR31_TXSR(timings->txsr), &ddrmr->cr[31]);
+       writel(DDRMC_CR33_EN_QK_SREF, &ddrmr->cr[33]);
+       writel(DDRMC_CR34_CKSRX(timings->cksrx) |
+                  DDRMC_CR34_CKSRE(timings->cksre), &ddrmr->cr[34]);
+
+       writel(DDRMC_CR38_FREQ_CHG_EN(0), &ddrmr->cr[38]);
+       writel(DDRMC_CR39_PHY_INI_COM(1024) | DDRMC_CR39_PHY_INI_STA(16) |
+                  DDRMC_CR39_FRQ_CH_DLLOFF(2), &ddrmr->cr[39]);
+
+       writel(DDRMC_CR41_PHY_INI_STRT_INI_DIS, &ddrmr->cr[41]);
+       writel(DDRMC_CR48_MR1_DA_0(70) |
+                  DDRMC_CR48_MR0_DA_0(1056), &ddrmr->cr[48]);
+
+       writel(DDRMC_CR66_ZQCL(timings->zqcl) |
+                  DDRMC_CR66_ZQINIT(timings->zqinit), &ddrmr->cr[66]);
+       writel(DDRMC_CR67_ZQCS(timings->zqcs), &ddrmr->cr[67]);
+       writel(DDRMC_CR69_ZQ_ON_SREF_EX(2), &ddrmr->cr[69]);
+
+       writel(DDRMC_CR70_REF_PER_ZQ(timings->ref_per_zq), &ddrmr->cr[70]);
+       writel(DDRMC_CR72_ZQCS_ROTATE(0), &ddrmr->cr[72]);
+
+       writel(DDRMC_CR73_APREBIT(timings->aprebit) |
+                  DDRMC_CR73_COL_DIFF(col_diff) |
+                  DDRMC_CR73_ROW_DIFF(row_diff), &ddrmr->cr[73]);
+       writel(DDRMC_CR74_BANKSPLT_EN | DDRMC_CR74_ADDR_CMP_EN |
+                  DDRMC_CR74_CMD_AGE_CNT(64) | DDRMC_CR74_AGE_CNT(64),
+                  &ddrmr->cr[74]);
+       writel(DDRMC_CR75_RW_PG_EN | DDRMC_CR75_RW_EN | DDRMC_CR75_PRI_EN |
+                  DDRMC_CR75_PLEN, &ddrmr->cr[75]);
+       writel(DDRMC_CR76_NQENT_ACTDIS(3) | DDRMC_CR76_D_RW_G_BKCN(3) |
+                  DDRMC_CR76_W2R_SPLT_EN, &ddrmr->cr[76]);
+       writel(DDRMC_CR77_CS_MAP | DDRMC_CR77_DI_RD_INTLEAVE |
+                  DDRMC_CR77_SWAP_EN, &ddrmr->cr[77]);
+       writel(DDRMC_CR78_Q_FULLNESS(7) |
+                  DDRMC_CR78_BUR_ON_FLY_BIT(12), &ddrmr->cr[78]);
+       writel(DDRMC_CR79_CTLUPD_AREF(0), &ddrmr->cr[79]);
+
+       writel(DDRMC_CR82_INT_MASK, &ddrmr->cr[82]);
+
+       writel(DDRMC_CR87_ODT_WR_MAPCS0, &ddrmr->cr[87]);
+       writel(DDRMC_CR88_TODTL_CMD(4), &ddrmr->cr[88]);
+       writel(DDRMC_CR89_AODT_RWSMCS(2), &ddrmr->cr[89]);
+
+       writel(DDRMC_CR91_R2W_SMCSDL(2), &ddrmr->cr[91]);
+       writel(DDRMC_CR96_WLMRD(timings->wlmrd) |
+                  DDRMC_CR96_WLDQSEN(timings->wldqsen), &ddrmr->cr[96]);
+
+       if (lvl != NULL)
+               ddrmc_ctrl_lvl_init(lvl);
+
+       writel(DDRMC_CR117_AXI0_W_PRI(0) |
+                  DDRMC_CR117_AXI0_R_PRI(0), &ddrmr->cr[117]);
+       writel(DDRMC_CR118_AXI1_W_PRI(1) |
+                  DDRMC_CR118_AXI1_R_PRI(1), &ddrmr->cr[118]);
+
+       writel(DDRMC_CR120_AXI0_PRI1_RPRI(2) |
+                  DDRMC_CR120_AXI0_PRI0_RPRI(2), &ddrmr->cr[120]);
+       writel(DDRMC_CR121_AXI0_PRI3_RPRI(2) |
+                  DDRMC_CR121_AXI0_PRI2_RPRI(2), &ddrmr->cr[121]);
+       writel(DDRMC_CR122_AXI1_PRI1_RPRI(1) | DDRMC_CR122_AXI1_PRI0_RPRI(1) |
+                  DDRMC_CR122_AXI0_PRIRLX(100), &ddrmr->cr[122]);
+       writel(DDRMC_CR123_AXI1_P_ODR_EN | DDRMC_CR123_AXI1_PRI3_RPRI(1) |
+                  DDRMC_CR123_AXI1_PRI2_RPRI(1), &ddrmr->cr[123]);
+       writel(DDRMC_CR124_AXI1_PRIRLX(100), &ddrmr->cr[124]);
+
+       writel(DDRMC_CR126_PHY_RDLAT(8), &ddrmr->cr[126]);
+       writel(DDRMC_CR132_WRLAT_ADJ(5) |
+                  DDRMC_CR132_RDLAT_ADJ(6), &ddrmr->cr[132]);
+       writel(DDRMC_CR137_PHYCTL_DL(2), &ddrmr->cr[137]);
+       writel(DDRMC_CR138_PHY_WRLV_MXDL(256) |
+                  DDRMC_CR138_PHYDRAM_CK_EN(1), &ddrmr->cr[138]);
+       writel(DDRMC_CR139_PHY_WRLV_RESPLAT(4) | DDRMC_CR139_PHY_WRLV_LOAD(7) |
+                  DDRMC_CR139_PHY_WRLV_DLL(3) |
+                  DDRMC_CR139_PHY_WRLV_EN(3), &ddrmr->cr[139]);
+       writel(DDRMC_CR140_PHY_WRLV_WW(64), &ddrmr->cr[140]);
+       writel(DDRMC_CR143_RDLV_GAT_MXDL(1536) |
+                  DDRMC_CR143_RDLV_MXDL(128), &ddrmr->cr[143]);
+       writel(DDRMC_CR144_PHY_RDLVL_RES(4) | DDRMC_CR144_PHY_RDLV_LOAD(7) |
+                  DDRMC_CR144_PHY_RDLV_DLL(3) |
+                  DDRMC_CR144_PHY_RDLV_EN(3), &ddrmr->cr[144]);
+       writel(DDRMC_CR145_PHY_RDLV_RR(64), &ddrmr->cr[145]);
+       writel(DDRMC_CR146_PHY_RDLVL_RESP(64), &ddrmr->cr[146]);
+       writel(DDRMC_CR147_RDLV_RESP_MASK(983040), &ddrmr->cr[147]);
+       writel(DDRMC_CR148_RDLV_GATE_RESP_MASK(983040), &ddrmr->cr[148]);
+       writel(DDRMC_CR151_RDLV_GAT_DQ_ZERO_CNT(1) |
+                  DDRMC_CR151_RDLVL_DQ_ZERO_CNT(1), &ddrmr->cr[151]);
+
+       writel(DDRMC_CR154_PAD_ZQ_EARLY_CMP_EN_TIMER(13) |
+                  DDRMC_CR154_PAD_ZQ_MODE(1) |
+                  DDRMC_CR154_DDR_SEL_PAD_CONTR(3) |
+                  DDRMC_CR154_PAD_ZQ_HW_FOR(1), &ddrmr->cr[154]);
+       writel(DDRMC_CR155_PAD_ODT_BYTE1(2) |
+                  DDRMC_CR155_PAD_ODT_BYTE0(2), &ddrmr->cr[155]);
+       writel(DDRMC_CR158_TWR(6), &ddrmr->cr[158]);
+       writel(DDRMC_CR161_ODT_EN(1) | DDRMC_CR161_TODTH_RD(2) |
+                  DDRMC_CR161_TODTH_WR(2), &ddrmr->cr[161]);
+
+       ddrmc_phy_init();
+
+       writel(DDRMC_CR00_DRAM_CLASS_DDR3 | DDRMC_CR00_START, &ddrmr->cr[0]);
+
+       while (!(readl(&ddrmr->cr[80]) && 0x100))
+               udelay(10);
+}
index 98fc2b50daeae17f2618e2a3f4a2d1c767f76e61..2f4a3d1cf399ca5e3081525b9c040b5d6df6f704 100644 (file)
@@ -137,14 +137,62 @@ struct pad_signals {
        int mcasp0_fsr;
        int mcasp0_axr1;
        int mcasp0_ahclkx;
-       int xdma_event_intr0;
-       int xdma_event_intr1;
+       int cam0_hd;
+       int cam0_vd;
+       int cam0_field;
+       int cam0_wen;
+       int cam0_pclk;
+       int cam0_data8;
+       int cam0_data9;
+       int cam1_data9;
+       int cam1_data8;
+       int cam1_hd;
+       int cam1_vd;
+       int cam1_pclk;
+       int cam1_field;
+       int cam1_wen;
+       int cam1_data0;
+       int cam1_data1;
+       int cam1_data2;
+       int cam1_data3;
+       int cam1_data4;
+       int cam1_data5;
+       int cam1_data6;
+       int cam1_data7;
+       int cam0_data0;
+       int cam0_data1;
+       int cam0_data2;
+       int cam0_data3;
+       int cam0_data4;
+       int cam0_data5;
+       int cam0_data6;
+       int cam0_data7;
+       int uart3_rxd;
+       int uart3_txd;
+       int uart3_ctsn;
+       int uart3_rtsn;
+       int gpio5_8;
+       int gpio5_9;
+       int gpio5_10;
+       int gpio5_11;
+       int gpio5_12;
+       int gpio5_13;
+       int spi4_sclk;
+       int spi4_d0;
+       int spi4_d1;
+       int spi4_cs0;
+       int spi2_sclk;
+       int spi2_d0;
+       int spi2_d1;
+       int spi2_cs0;
+       int xdma_evt_intr0;
+       int xdma_evt_intr1;
+       int clkreq;
        int nresetin_out;
-       int porz;
-       int nnmi;
-       int osc0_in;
-       int osc0_out;
        int rsvd1;
+       int nnmi;
+       int rsvd2;
+       int rsvd3;
        int tms;
        int tdi;
        int tdo;
@@ -154,34 +202,11 @@ struct pad_signals {
        int emu1;
        int osc1_in;
        int osc1_out;
-       int pmic_power_en;
        int rtc_porz;
-       int rsvd2;
-       int ext_wakeup;
-       int enz_kaldo_1p8v;
-       int usb0_dm;
-       int usb0_dp;
-       int usb0_ce;
-       int usb0_id;
-       int usb0_vbus;
+       int ext_wakeup0;
+       int pmic_power_en0;
        int usb0_drvvbus;
-       int usb1_dm;
-       int usb1_dp;
-       int usb1_ce;
-       int usb1_id;
-       int usb1_vbus;
        int usb1_drvvbus;
-       int ddr_resetn;
-       int ddr_csn0;
-       int ddr_cke;
-       int ddr_ck;
-       int ddr_nck;
-       int ddr_casn;
-       int ddr_rasn;
-       int ddr_wen;
-       int ddr_ba0;
-       int ddr_ba1;
-       int ddr_ba2;
 };
 
 #endif /* _MUX_AM43XX_H_ */
diff --git a/arch/arm/include/asm/arch-arm720t/hardware.h b/arch/arm/include/asm/arch-arm720t/hardware.h
deleted file mode 100644 (file)
index 8ca42d9..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-#ifndef __ARM7_HW_H
-#define __ARM7_HW_H
-
-/*
- * Copyright (c) 2004  Cucy Systems (http://www.cucy.com)
- * Curt Brune <curt@cucy.com>
- *
- * SPDX-License-Identifier:    GPL-2.0+
- */
-
-#if defined(CONFIG_INTEGRATOR) && defined(CONFIG_ARCH_INTEGRATOR)
-/* include IntegratorCP/CM720T specific hardware file if there was one */
-#else
-#error No hardware file defined for this configuration
-#endif
-
-#endif /* __ARM7_HW_H */
index b140c1fac2c2d51fb43ea2157ddec7f3a4b60c20..ca8d38cf78b720b02f04996a57c2ace698a5fc58 100644 (file)
@@ -8,6 +8,14 @@
 #define _ASM_ARMV8_FSL_LSCH3_CONFIG_
 
 #include <fsl_ddrc_version.h>
+
+#define CONFIG_SYS_PAGE_SIZE           0x10000
+
+#ifndef L1_CACHE_BYTES
+#define L1_CACHE_SHIFT         6
+#define L1_CACHE_BYTES         (1 << L1_CACHE_SHIFT)
+#endif
+
 #define CONFIG_MP
 #define CONFIG_SYS_FSL_OCRAM_BASE      0x18000000      /* initial RAM */
 /* Link Definitions */
@@ -23,6 +31,7 @@
 #define CONFIG_SYS_FSL_CH3_CLK_GRPA_ADDR       (CONFIG_SYS_IMMR + 0x00300000)
 #define CONFIG_SYS_FSL_CH3_CLK_GRPB_ADDR       (CONFIG_SYS_IMMR + 0x00310000)
 #define CONFIG_SYS_FSL_CH3_CLK_CTRL_ADDR       (CONFIG_SYS_IMMR + 0x00370000)
+#define CONFIG_SYS_FSL_ESDHC_ADDR              (CONFIG_SYS_IMMR + 0x01140000)
 #define CONFIG_SYS_IFC_ADDR                    (CONFIG_SYS_IMMR + 0x01240000)
 #define CONFIG_SYS_NS16550_COM1                        (CONFIG_SYS_IMMR + 0x011C0500)
 #define CONFIG_SYS_NS16550_COM2                        (CONFIG_SYS_IMMR + 0x011C0600)
 #define CONFIG_SYS_FSL_PMU_CLTBENR             (CONFIG_SYS_FSL_PMU_ADDR + \
                                                 0x18A0)
 
+#define CONFIG_SYS_FSL_WRIOP1_ADDR             (CONFIG_SYS_IMMR + 0x7B80000)
+#define CONFIG_SYS_FSL_WRIOP1_MDIO1    (CONFIG_SYS_FSL_WRIOP1_ADDR + 0x16000)
+#define CONFIG_SYS_FSL_WRIOP1_MDIO2    (CONFIG_SYS_FSL_WRIOP1_ADDR + 0x17000)
+#define CONFIG_SYS_FSL_LSCH3_SERDES_ADDR       (CONFIG_SYS_IMMR + 0xEA0000)
+
+/* SP (Cortex-A5) related */
+#define CONFIG_SYS_FSL_SP_ADDR                 (CONFIG_SYS_IMMR + 0x00F00000)
+#define CONFIG_SYS_FSL_SP_VSG_GIC_ADDR         (CONFIG_SYS_FSL_SP_ADDR)
+#define CONFIG_SYS_FSL_SP_VSG_GIC_VIGR1                (CONFIG_SYS_FSL_SP_ADDR)
+#define CONFIG_SYS_FSL_SP_VSG_GIC_VIGR2                \
+                                       (CONFIG_SYS_FSL_SP_ADDR + 0x0008)
+#define CONFIG_SYS_FSL_SP_LOOPBACK_DUART       \
+                                       (CONFIG_SYS_FSL_SP_ADDR + 0x1000)
+
 #define CONFIG_SYS_FSL_DCSR_DDR_ADDR           0x70012c000ULL
 #define CONFIG_SYS_FSL_DCSR_DDR2_ADDR          0x70012d000ULL
 #define CONFIG_SYS_FSL_DCSR_DDR3_ADDR          0x700132000ULL
 #define CONFIG_MAX_MEM_MAPPED          CONFIG_SYS_LS2_DDR_BLOCK1_SIZE
 #define CONFIG_SYS_FSL_DDR_VER         FSL_DDR_VER_5_0
 
-
+#define CONFIG_SYS_FSL_ESDHC_LE
 /* IFC */
 #define CONFIG_SYS_FSL_IFC_LE
+#define CONFIG_SYS_MEMAC_LITTLE_ENDIAN
+
+/* PCIe */
+#define CONFIG_SYS_PCIE1_ADDR                  (CONFIG_SYS_IMMR + 0x2400000)
+#define CONFIG_SYS_PCIE2_ADDR                  (CONFIG_SYS_IMMR + 0x2500000)
+#define CONFIG_SYS_PCIE3_ADDR                  (CONFIG_SYS_IMMR + 0x2600000)
+#define CONFIG_SYS_PCIE4_ADDR                  (CONFIG_SYS_IMMR + 0x2700000)
+#define CONFIG_SYS_PCIE1_PHYS_ADDR             0x1000000000ULL
+#define CONFIG_SYS_PCIE2_PHYS_ADDR             0x1200000000ULL
+#define CONFIG_SYS_PCIE3_PHYS_ADDR             0x1400000000ULL
+#define CONFIG_SYS_PCIE4_PHYS_ADDR             0x1600000000ULL
+
+/* Cache Coherent Interconnect */
+#define CCI_MN_BASE            0x04000000
+#define CCI_MN_RNF_NODEID_LIST         0x180
+#define CCI_MN_DVM_DOMAIN_CTL          0x200
+#define CCI_MN_DVM_DOMAIN_CTL_SET      0x210
+
+/* Device Configuration */
+#define DCFG_BASE              0x01e00000
+#define DCFG_PORSR1                    0x000
+#define DCFG_PORSR1_RCW_SRC            0xff800000
+#define DCFG_PORSR1_RCW_SRC_NOR                0x12f00000
+
+#define DCFG_DCSR_BASE         0X700100000ULL
+#define DCFG_DCSR_PORCR1               0x000
+
+/* Supplemental Configuration */
+#define SCFG_BASE              0x01fc0000
+#define SCFG_USB3PRM1CR                        0x000
 
 #ifdef CONFIG_LS2085A
 #define CONFIG_MAX_CPUS                                16
 #define CONFIG_SYS_FSL_IFC_BANK_COUNT          8
 #define CONFIG_NUM_DDR_CONTROLLERS             3
 #define CONFIG_SYS_FSL_CLUSTER_CLOCKS          { 1, 1, 4, 4 }
+#define CONFIG_SYS_FSL_SRDS_1
+#define CONFIG_SYS_FSL_SRDS_2
 #else
 #error SoC not defined
 #endif
 
 #ifdef CONFIG_LS2085A
 #define CONFIG_SYS_FSL_ERRATUM_A008336
+#define CONFIG_SYS_FSL_ERRATUM_A008511
 #define CONFIG_SYS_FSL_ERRATUM_A008514
+#define CONFIG_SYS_FSL_ERRATUM_A008585
+#define CONFIG_SYS_FSL_ERRATUM_A008751
 #endif
 
 #endif /* _ASM_ARMV8_FSL_LSCH3_CONFIG_ */
diff --git a/arch/arm/include/asm/arch-fsl-lsch3/fsl_serdes.h b/arch/arm/include/asm/arch-fsl-lsch3/fsl_serdes.h
new file mode 100644 (file)
index 0000000..2810f3f
--- /dev/null
@@ -0,0 +1,67 @@
+/*
+ * Copyright 2015 Freescale Semiconductor, Inc.
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#ifndef __FSL_SERDES_H
+#define __FSL_SERDES_H
+
+#include <config.h>
+
+#define        SRDS_MAX_LANES  8
+
+enum srds_prtcl {
+       NONE = 0,
+       PCIE1,
+       PCIE2,
+       PCIE3,
+       PCIE4,
+       SATA1,
+       SATA2,
+       XAUI1,
+       XAUI2,
+       XFI1,
+       XFI2,
+       XFI3,
+       XFI4,
+       XFI5,
+       XFI6,
+       XFI7,
+       XFI8,
+       SGMII1,
+       SGMII2,
+       SGMII3,
+       SGMII4,
+       SGMII5,
+       SGMII6,
+       SGMII7,
+       SGMII8,
+       SGMII9,
+       SGMII10,
+       SGMII11,
+       SGMII12,
+       SGMII13,
+       SGMII14,
+       SGMII15,
+       SGMII16,
+       QSGMII_A, /* A indicates MACs 1-4 */
+       QSGMII_B, /* B indicates MACs 5-8 */
+       QSGMII_C, /* C indicates MACs 9-12 */
+       QSGMII_D, /* D indicates MACs 12-16 */
+       SERDES_PRCTL_COUNT
+};
+
+enum srds {
+       FSL_SRDS_1  = 0,
+       FSL_SRDS_2  = 1,
+};
+
+int is_serdes_configured(enum srds_prtcl device);
+void fsl_serdes_init(void);
+
+int serdes_get_first_lane(u32 sd, enum srds_prtcl device);
+enum srds_prtcl serdes_get_prtcl(int serdes, int cfg, int lane);
+int is_serdes_prtcl_valid(int serdes, u32 prtcl);
+
+#endif /* __FSL_SERDES_H */
index dd11ef79c8c2f2f97a38f35d98b9f4d9f07050a1..d6bee60385f04d8dee260dbb7a699a6ec38ffb8b 100644 (file)
@@ -47,6 +47,30 @@ struct ccsr_gur {
        u32     devdisr5;       /* Device disable control 5 */
        u32     devdisr6;       /* Device disable control 6 */
        u32     devdisr7;       /* Device disable control 7 */
+#define FSL_CHASSIS3_DEVDISR2_DPMAC1   0x00000001
+#define FSL_CHASSIS3_DEVDISR2_DPMAC2   0x00000002
+#define FSL_CHASSIS3_DEVDISR2_DPMAC3   0x00000004
+#define FSL_CHASSIS3_DEVDISR2_DPMAC4   0x00000008
+#define FSL_CHASSIS3_DEVDISR2_DPMAC5   0x00000010
+#define FSL_CHASSIS3_DEVDISR2_DPMAC6   0x00000020
+#define FSL_CHASSIS3_DEVDISR2_DPMAC7   0x00000040
+#define FSL_CHASSIS3_DEVDISR2_DPMAC8   0x00000080
+#define FSL_CHASSIS3_DEVDISR2_DPMAC9   0x00000100
+#define FSL_CHASSIS3_DEVDISR2_DPMAC10  0x00000200
+#define FSL_CHASSIS3_DEVDISR2_DPMAC11  0x00000400
+#define FSL_CHASSIS3_DEVDISR2_DPMAC12  0x00000800
+#define FSL_CHASSIS3_DEVDISR2_DPMAC13  0x00001000
+#define FSL_CHASSIS3_DEVDISR2_DPMAC14  0x00002000
+#define FSL_CHASSIS3_DEVDISR2_DPMAC15  0x00004000
+#define FSL_CHASSIS3_DEVDISR2_DPMAC16  0x00008000
+#define FSL_CHASSIS3_DEVDISR2_DPMAC17  0x00010000
+#define FSL_CHASSIS3_DEVDISR2_DPMAC18  0x00020000
+#define FSL_CHASSIS3_DEVDISR2_DPMAC19  0x00040000
+#define FSL_CHASSIS3_DEVDISR2_DPMAC20  0x00080000
+#define FSL_CHASSIS3_DEVDISR2_DPMAC21  0x00100000
+#define FSL_CHASSIS3_DEVDISR2_DPMAC22  0x00200000
+#define FSL_CHASSIS3_DEVDISR2_DPMAC23  0x00400000
+#define FSL_CHASSIS3_DEVDISR2_DPMAC24  0x00800000
        u8      res_08c[0x90-0x8c];
        u32     coredisru;      /* uppper portion for support of 64 cores */
        u32     coredisrl;      /* lower portion for support of 64 cores */
@@ -63,6 +87,11 @@ struct ccsr_gur {
 #define FSL_CHASSIS3_RCWSR0_MEM_PLL_RAT_MASK   0x3f
 #define FSL_CHASSIS3_RCWSR0_MEM2_PLL_RAT_SHIFT 18
 #define FSL_CHASSIS3_RCWSR0_MEM2_PLL_RAT_MASK  0x3f
+#define        FSL_CHASSIS3_RCWSR28_SRDS1_PRTCL_MASK   0x00FF0000
+#define        FSL_CHASSIS3_RCWSR28_SRDS1_PRTCL_SHIFT  16
+#define        FSL_CHASSIS3_RCWSR28_SRDS2_PRTCL_MASK   0xFF000000
+#define        FSL_CHASSIS3_RCWSR28_SRDS2_PRTCL_SHIFT  24
+
        u8      res_180[0x200-0x180];
        u32     scratchrw[32];  /* Scratch Read/Write */
        u8      res_280[0x300-0x280];
diff --git a/arch/arm/include/asm/arch-fsl-lsch3/soc.h b/arch/arm/include/asm/arch-fsl-lsch3/soc.h
new file mode 100644 (file)
index 0000000..16b723d
--- /dev/null
@@ -0,0 +1,8 @@
+/*
+ * Copyright 2015 Freescale Semiconductor
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+void fsl_lsch3_early_init_f(void);
+
index 6561ce644e72e63f2c624256c4f710ab5b26b8db..4dc528bc810974be4f19f2612ebb1a4ae82ff3dd 100644 (file)
 
 #define DCU_LAYER_MAX_NUM                      16
 
-#define QE_MURAM_SIZE          0x6000UL
-#define MAX_QE_RISC            1
-#define QE_NUM_OF_SNUM         28
-
 #define CONFIG_SYS_FSL_SRDS_1
 
 #ifdef CONFIG_LS102XA
index 3a64afce4659b538c94ff7fd1d9bbaffaf9e53bd..a8122c1a678d399f2fed091ae797a278a1d37d62 100644 (file)
@@ -17,6 +17,9 @@
 #define SOC_VER_LS1021         0x11
 #define SOC_VER_LS1022         0x12
 
+#define SOC_MAJOR_VER_1_0      0x1
+#define SOC_MAJOR_VER_2_0      0x2
+
 #define CCSR_BRR_OFFSET                0xe4
 #define CCSR_SCRATCHRW1_OFFSET 0x200
 
index 8e0d7d15c17a87becd9fafb296e6b2522222276a..c49aa6290c6a6b0d28ddd70f0b0c5b90cd019353 100644 (file)
@@ -250,6 +250,7 @@ struct mx6_ddr_sysinfo {
        u8 mif3_mode;   /* Command prediction working mode */
        u8 rst_to_cke;  /* Time from SDE enable to CKE rise */
        u8 sde_to_rst;  /* Time from SDE enable until DDR reset# is high */
+       u8 pd_fast_exit;/* enable precharge powerdown fast-exit */
 };
 
 /*
diff --git a/arch/arm/include/asm/arch-stm32f4/fmc.h b/arch/arm/include/asm/arch-stm32f4/fmc.h
new file mode 100644 (file)
index 0000000..4ab3031
--- /dev/null
@@ -0,0 +1,75 @@
+/*
+ * (C) Copyright 2013
+ * Pavel Boldin, Emcraft Systems, paboldin@emcraft.com
+ *
+ * (C) Copyright 2015
+ * Kamil Lulko, <rev13@wp.pl>
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#ifndef _MACH_FMC_H_
+#define _MACH_FMC_H_
+
+struct stm32_fmc_regs {
+       u32 sdcr1;      /* Control register 1 */
+       u32 sdcr2;      /* Control register 2 */
+       u32 sdtr1;      /* Timing register 1 */
+       u32 sdtr2;      /* Timing register 2 */
+       u32 sdcmr;      /* Mode register */
+       u32 sdrtr;      /* Refresh timing register */
+       u32 sdsr;       /* Status register */
+};
+
+/*
+ * FMC registers base
+ */
+#define STM32_SDRAM_FMC_BASE   0xA0000140
+#define STM32_SDRAM_FMC                ((struct stm32_fmc_regs *)STM32_SDRAM_FMC_BASE)
+
+/* Control register SDCR */
+#define FMC_SDCR_RPIPE_SHIFT   13      /* RPIPE bit shift */
+#define FMC_SDCR_RBURST_SHIFT  12      /* RBURST bit shift */
+#define FMC_SDCR_SDCLK_SHIFT   10      /* SDRAM clock divisor shift */
+#define FMC_SDCR_WP_SHIFT      9       /* Write protection shift */
+#define FMC_SDCR_CAS_SHIFT     7       /* CAS latency shift */
+#define FMC_SDCR_NB_SHIFT      6       /* Number of banks shift */
+#define FMC_SDCR_MWID_SHIFT    4       /* Memory width shift */
+#define FMC_SDCR_NR_SHIFT      2       /* Number of row address bits shift */
+#define FMC_SDCR_NC_SHIFT      0       /* Number of col address bits shift */
+
+/* Timings register SDTR */
+#define FMC_SDTR_TMRD_SHIFT    0       /* Load mode register to active */
+#define FMC_SDTR_TXSR_SHIFT    4       /* Exit self-refresh time */
+#define FMC_SDTR_TRAS_SHIFT    8       /* Self-refresh time */
+#define FMC_SDTR_TRC_SHIFT     12      /* Row cycle delay */
+#define FMC_SDTR_TWR_SHIFT     16      /* Recovery delay */
+#define FMC_SDTR_TRP_SHIFT     20      /* Row precharge delay */
+#define FMC_SDTR_TRCD_SHIFT    24      /* Row-to-column delay */
+
+
+#define FMC_SDCMR_NRFS_SHIFT   5
+
+#define FMC_SDCMR_MODE_NORMAL          0
+#define FMC_SDCMR_MODE_START_CLOCK     1
+#define FMC_SDCMR_MODE_PRECHARGE       2
+#define FMC_SDCMR_MODE_AUTOREFRESH     3
+#define FMC_SDCMR_MODE_WRITE_MODE      4
+#define FMC_SDCMR_MODE_SELFREFRESH     5
+#define FMC_SDCMR_MODE_POWERDOWN       6
+
+#define FMC_SDCMR_BANK_1               (1 << 4)
+#define FMC_SDCMR_BANK_2               (1 << 3)
+
+#define FMC_SDCMR_MODE_REGISTER_SHIFT  9
+
+#define FMC_SDSR_BUSY                  (1 << 5)
+
+#define FMC_BUSY_WAIT()                do { \
+               __asm__ __volatile__ ("dsb" : : : "memory"); \
+               while (STM32_SDRAM_FMC->sdsr & FMC_SDSR_BUSY) \
+                       ; \
+       } while (0)
+
+
+#endif /* _MACH_FMC_H_ */
diff --git a/arch/arm/include/asm/arch-stm32f4/gpio.h b/arch/arm/include/asm/arch-stm32f4/gpio.h
new file mode 100644 (file)
index 0000000..7cd866e
--- /dev/null
@@ -0,0 +1,116 @@
+/*
+ * (C) Copyright 2011
+ * Yuri Tikhonov, Emcraft Systems, yur@emcraft.com
+ *
+ * (C) Copyright 2015
+ * Kamil Lulko, <rev13@wp.pl>
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#ifndef _STM32_GPIO_H_
+#define _STM32_GPIO_H_
+
+enum stm32_gpio_port {
+       STM32_GPIO_PORT_A = 0,
+       STM32_GPIO_PORT_B,
+       STM32_GPIO_PORT_C,
+       STM32_GPIO_PORT_D,
+       STM32_GPIO_PORT_E,
+       STM32_GPIO_PORT_F,
+       STM32_GPIO_PORT_G,
+       STM32_GPIO_PORT_H,
+       STM32_GPIO_PORT_I
+};
+
+enum stm32_gpio_pin {
+       STM32_GPIO_PIN_0 = 0,
+       STM32_GPIO_PIN_1,
+       STM32_GPIO_PIN_2,
+       STM32_GPIO_PIN_3,
+       STM32_GPIO_PIN_4,
+       STM32_GPIO_PIN_5,
+       STM32_GPIO_PIN_6,
+       STM32_GPIO_PIN_7,
+       STM32_GPIO_PIN_8,
+       STM32_GPIO_PIN_9,
+       STM32_GPIO_PIN_10,
+       STM32_GPIO_PIN_11,
+       STM32_GPIO_PIN_12,
+       STM32_GPIO_PIN_13,
+       STM32_GPIO_PIN_14,
+       STM32_GPIO_PIN_15
+};
+
+enum stm32_gpio_mode {
+       STM32_GPIO_MODE_IN = 0,
+       STM32_GPIO_MODE_OUT,
+       STM32_GPIO_MODE_AF,
+       STM32_GPIO_MODE_AN
+};
+
+enum stm32_gpio_otype {
+       STM32_GPIO_OTYPE_PP = 0,
+       STM32_GPIO_OTYPE_OD
+};
+
+enum stm32_gpio_speed {
+       STM32_GPIO_SPEED_2M = 0,
+       STM32_GPIO_SPEED_25M,
+       STM32_GPIO_SPEED_50M,
+       STM32_GPIO_SPEED_100M
+};
+
+enum stm32_gpio_pupd {
+       STM32_GPIO_PUPD_NO = 0,
+       STM32_GPIO_PUPD_UP,
+       STM32_GPIO_PUPD_DOWN
+};
+
+enum stm32_gpio_af {
+       STM32_GPIO_AF0 = 0,
+       STM32_GPIO_AF1,
+       STM32_GPIO_AF2,
+       STM32_GPIO_AF3,
+       STM32_GPIO_AF4,
+       STM32_GPIO_AF5,
+       STM32_GPIO_AF6,
+       STM32_GPIO_AF7,
+       STM32_GPIO_AF8,
+       STM32_GPIO_AF9,
+       STM32_GPIO_AF10,
+       STM32_GPIO_AF11,
+       STM32_GPIO_AF12,
+       STM32_GPIO_AF13,
+       STM32_GPIO_AF14,
+       STM32_GPIO_AF15
+};
+
+struct stm32_gpio_dsc {
+       enum stm32_gpio_port    port;
+       enum stm32_gpio_pin     pin;
+};
+
+struct stm32_gpio_ctl {
+       enum stm32_gpio_mode    mode;
+       enum stm32_gpio_otype   otype;
+       enum stm32_gpio_speed   speed;
+       enum stm32_gpio_pupd    pupd;
+       enum stm32_gpio_af      af;
+};
+
+static inline unsigned stm32_gpio_to_port(unsigned gpio)
+{
+       return gpio / 16;
+}
+
+static inline unsigned stm32_gpio_to_pin(unsigned gpio)
+{
+       return gpio % 16;
+}
+
+int stm32_gpio_config(const struct stm32_gpio_dsc *gpio_dsc,
+               const struct stm32_gpio_ctl *gpio_ctl);
+int stm32_gpout_set(const struct stm32_gpio_dsc *gpio_dsc, int state);
+
+#endif /* _STM32_GPIO_H_ */
diff --git a/arch/arm/include/asm/arch-stm32f4/stm32.h b/arch/arm/include/asm/arch-stm32f4/stm32.h
new file mode 100644 (file)
index 0000000..a9f88db
--- /dev/null
@@ -0,0 +1,108 @@
+/*
+ * (C) Copyright 2011
+ * Yuri Tikhonov, Emcraft Systems, yur@emcraft.com
+ *
+ * (C) Copyright 2015
+ * Kamil Lulko, <rev13@wp.pl>
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#ifndef _MACH_STM32_H_
+#define _MACH_STM32_H_
+
+/*
+ * Peripheral memory map
+ */
+#define STM32_PERIPH_BASE      0x40000000
+#define STM32_APB1PERIPH_BASE  (STM32_PERIPH_BASE + 0x00000000)
+#define STM32_APB2PERIPH_BASE  (STM32_PERIPH_BASE + 0x00010000)
+#define STM32_AHB1PERIPH_BASE  (STM32_PERIPH_BASE + 0x00020000)
+#define STM32_AHB2PERIPH_BASE  (STM32_PERIPH_BASE + 0x10000000)
+
+#define STM32_BUS_MASK         0xFFFF0000
+
+/*
+ * Register maps
+ */
+struct stm32_rcc_regs {
+       u32 cr;         /* RCC clock control */
+       u32 pllcfgr;    /* RCC PLL configuration */
+       u32 cfgr;       /* RCC clock configuration */
+       u32 cir;        /* RCC clock interrupt */
+       u32 ahb1rstr;   /* RCC AHB1 peripheral reset */
+       u32 ahb2rstr;   /* RCC AHB2 peripheral reset */
+       u32 ahb3rstr;   /* RCC AHB3 peripheral reset */
+       u32 rsv0;
+       u32 apb1rstr;   /* RCC APB1 peripheral reset */
+       u32 apb2rstr;   /* RCC APB2 peripheral reset */
+       u32 rsv1[2];
+       u32 ahb1enr;    /* RCC AHB1 peripheral clock enable */
+       u32 ahb2enr;    /* RCC AHB2 peripheral clock enable */
+       u32 ahb3enr;    /* RCC AHB3 peripheral clock enable */
+       u32 rsv2;
+       u32 apb1enr;    /* RCC APB1 peripheral clock enable */
+       u32 apb2enr;    /* RCC APB2 peripheral clock enable */
+       u32 rsv3[2];
+       u32 ahb1lpenr;  /* RCC AHB1 periph clk enable in low pwr mode */
+       u32 ahb2lpenr;  /* RCC AHB2 periph clk enable in low pwr mode */
+       u32 ahb3lpenr;  /* RCC AHB3 periph clk enable in low pwr mode */
+       u32 rsv4;
+       u32 apb1lpenr;  /* RCC APB1 periph clk enable in low pwr mode */
+       u32 apb2lpenr;  /* RCC APB2 periph clk enable in low pwr mode */
+       u32 rsv5[2];
+       u32 bdcr;       /* RCC Backup domain control */
+       u32 csr;        /* RCC clock control & status */
+       u32 rsv6[2];
+       u32 sscgr;      /* RCC spread spectrum clock generation */
+       u32 plli2scfgr; /* RCC PLLI2S configuration */
+       u32 pllsaicfgr;
+       u32 dckcfgr;
+};
+
+struct stm32_pwr_regs {
+       u32 cr;
+       u32 csr;
+};
+
+struct stm32_flash_regs {
+       u32 acr;
+       u32 key;
+       u32 optkeyr;
+       u32 sr;
+       u32 cr;
+       u32 optcr;
+       u32 optcr1;
+};
+
+/*
+ * Registers access macros
+ */
+#define STM32_RCC_BASE         (STM32_AHB1PERIPH_BASE + 0x3800)
+#define STM32_RCC              ((struct stm32_rcc_regs *)STM32_RCC_BASE)
+
+#define STM32_PWR_BASE         (STM32_APB1PERIPH_BASE + 0x7000)
+#define STM32_PWR              ((struct stm32_pwr_regs *)STM32_PWR_BASE)
+
+#define STM32_FLASH_BASE       (STM32_AHB1PERIPH_BASE + 0x3C00)
+#define STM32_FLASH            ((struct stm32_flash_regs *)STM32_FLASH_BASE)
+
+#define STM32_FLASH_SR_BSY             (1 << 16)
+
+#define STM32_FLASH_CR_PG              (1 << 0)
+#define STM32_FLASH_CR_SER             (1 << 1)
+#define STM32_FLASH_CR_STRT            (1 << 16)
+#define STM32_FLASH_CR_LOCK            (1 << 31)
+#define STM32_FLASH_CR_SNB_OFFSET      3
+
+enum clock {
+       CLOCK_CORE,
+       CLOCK_AHB,
+       CLOCK_APB1,
+       CLOCK_APB2
+};
+
+int configure_clocks(void);
+unsigned long clock_get(enum clock clck);
+
+#endif /* _MACH_STM32_H_ */
diff --git a/arch/arm/include/asm/arch-tegra114/hardware.h b/arch/arm/include/asm/arch-tegra114/hardware.h
deleted file mode 100644 (file)
index c21fbb6..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Copyright (c) 2010-2013, NVIDIA CORPORATION.  All rights reserved.
- *
- * 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/>.
- */
-
-#ifndef _TEGRA114_HARDWARE_H_
-#define _TEGRA114_HARDWARE_H_
-
-/* include tegra specific hardware definitions */
-
-#endif /* _TEGRA114_HARDWARE_H_ */
diff --git a/arch/arm/include/asm/arch-tegra124/hardware.h b/arch/arm/include/asm/arch-tegra124/hardware.h
deleted file mode 100644 (file)
index 114fce8..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-/*
- * (C) Copyright 2013
- * NVIDIA Corporation <www.nvidia.com>
- *
- * SPDX-License-Identifier:     GPL-2.0+
- */
-
-#ifndef _TEGRA124_HARDWARE_H_
-#define _TEGRA124_HARDWARE_H_
-
-/*
- * Include Tegra-specific hardware definitions
- * Nothing needed currently for Tegra124
- */
-
-#endif /* _TEGRA124_HARDWARE_H_ */
diff --git a/arch/arm/include/asm/arch-tegra20/hardware.h b/arch/arm/include/asm/arch-tegra20/hardware.h
deleted file mode 100644 (file)
index a295894..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-/*
-* (C) Copyright 2010-2011
-* NVIDIA Corporation <www.nvidia.com>
-*
- * SPDX-License-Identifier:    GPL-2.0+
-*/
-
-#ifndef __TEGRA2_HW_H
-#define __TEGRA2_HW_H
-
-/* include tegra specific hardware definitions */
-
-#endif /* __TEGRA2_HW_H */
diff --git a/arch/arm/include/asm/arch-tegra30/hardware.h b/arch/arm/include/asm/arch-tegra30/hardware.h
deleted file mode 100644 (file)
index b1a5aa9..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Copyright (c) 2010-2012, NVIDIA CORPORATION.  All rights reserved.
- *
- * 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/>.
- */
-
-#ifndef _TEGRA30_HARDWARE_H_
-#define _TEGRA30_HARDWARE_H_
-
-/* include tegra specific hardware definitions */
-
-#endif /* _TEGRA30-HARDWARE_H_ */
index 724682c683c70d1f94b0d6c43e005bd63215a12a..bc6db2a5a55d5de37cc283be4972148611aa1827 100644 (file)
@@ -189,6 +189,7 @@ struct anadig_reg {
 #define CCM_REG_CTRL_MASK                      0xffffffff
 #define CCM_CCGR0_UART0_CTRL_MASK               (0x3 << 14)
 #define CCM_CCGR0_UART1_CTRL_MASK              (0x3 << 16)
+#define CCM_CCGR1_USBC0_CTRL_MASK       (0x3 << 8)
 #define CCM_CCGR1_PIT_CTRL_MASK                        (0x3 << 14)
 #define CCM_CCGR1_WDOGA5_CTRL_MASK             (0x3 << 28)
 #define CCM_CCGR2_QSPI0_CTRL_MASK              (0x3 << 8)
@@ -199,6 +200,7 @@ struct anadig_reg {
 #define CCM_CCGR2_PORTD_CTRL_MASK              (0x3 << 24)
 #define CCM_CCGR2_PORTE_CTRL_MASK              (0x3 << 26)
 #define CCM_CCGR3_ANADIG_CTRL_MASK             0x3
+#define CCM_CCGR3_SCSC_CTRL_MASK        (0x3 << 4)
 #define CCM_CCGR4_WKUP_CTRL_MASK               (0x3 << 20)
 #define CCM_CCGR4_CCM_CTRL_MASK                        (0x3 << 22)
 #define CCM_CCGR4_GPC_CTRL_MASK                        (0x3 << 24)
@@ -206,14 +208,23 @@ struct anadig_reg {
 #define CCM_CCGR6_OCOTP_CTRL_MASK              (0x3 << 10)
 #define CCM_CCGR6_DDRMC_CTRL_MASK              (0x3 << 28)
 #define CCM_CCGR7_SDHC1_CTRL_MASK              (0x3 << 4)
+#define CCM_CCGR7_USBC1_CTRL_MASK       (0x3 << 8)
 #define CCM_CCGR9_FEC0_CTRL_MASK               0x3
 #define CCM_CCGR9_FEC1_CTRL_MASK               (0x3 << 2)
 #define CCM_CCGR10_NFC_CTRL_MASK               0x3
 
+#define ANADIG_PLL7_CTRL_BYPASS         (1 << 16)
+#define ANADIG_PLL7_CTRL_ENABLE         (1 << 13)
+#define ANADIG_PLL7_CTRL_POWERDOWN      (1 << 12)
+#define ANADIG_PLL7_CTRL_DIV_SELECT     (1 << 1)
 #define ANADIG_PLL5_CTRL_BYPASS                 (1 << 16)
 #define ANADIG_PLL5_CTRL_ENABLE                 (1 << 13)
 #define ANADIG_PLL5_CTRL_POWERDOWN              (1 << 12)
 #define ANADIG_PLL5_CTRL_DIV_SELECT            1
+#define ANADIG_PLL3_CTRL_BYPASS         (1 << 16)
+#define ANADIG_PLL3_CTRL_ENABLE         (1 << 13)
+#define ANADIG_PLL3_CTRL_POWERDOWN      (1 << 12)
+#define ANADIG_PLL3_CTRL_DIV_SELECT     (1 << 1)
 #define ANADIG_PLL2_CTRL_ENABLE                        (1 << 13)
 #define ANADIG_PLL2_CTRL_POWERDOWN             (1 << 12)
 #define ANADIG_PLL2_CTRL_DIV_SELECT            1
diff --git a/arch/arm/include/asm/arch-vf610/ddrmc-vf610.h b/arch/arm/include/asm/arch-vf610/ddrmc-vf610.h
new file mode 100644 (file)
index 0000000..6730cde
--- /dev/null
@@ -0,0 +1,72 @@
+/*
+ * Copyright (C) 2015
+ * Toradex, Inc.
+ *
+ * Authors: Stefan Agner
+ *          Sanchayan Maity
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#ifndef __ASM_ARCH_VF610_DDRMC_H
+#define __ASM_ARCH_VF610_DDRMC_H
+
+struct ddrmc_lvl_info {
+       u16 wrlvl_reg_en;
+       u16 wrlvl_dl_0;
+       u16 wrlvl_dl_1;
+       u16 rdlvl_gt_reg_en;
+       u16 rdlvl_gt_dl_0;
+       u16 rdlvl_gt_dl_1;
+       u16 rdlvl_reg_en;
+       u16 rdlvl_dl_0;
+       u16 rdlvl_dl_1;
+};
+
+struct ddr3_jedec_timings {
+       u8 tinit;
+       u32 trst_pwron;
+       u32 cke_inactive;
+       u8 wrlat;
+       u8 caslat_lin;
+       u8 trc;
+       u8 trrd;
+       u8 tccd;
+       u8 tfaw;
+       u8 trp;
+       u8 twtr;
+       u8 tras_min;
+       u8 tmrd;
+       u8 trtp;
+       u32 tras_max;
+       u8 tmod;
+       u8 tckesr;
+       u8 tcke;
+       u8 trcd_int;
+       u8 tdal;
+       u16 tdll;
+       u8 trp_ab;
+       u16 tref;
+       u8 trfc;
+       u8 tpdex;
+       u8 txpdll;
+       u8 txsnr;
+       u16 txsr;
+       u8 cksrx;
+       u8 cksre;
+       u16 zqcl;
+       u16 zqinit;
+       u8 zqcs;
+       u8 ref_per_zq;
+       u8 aprebit;
+       u8 wlmrd;
+       u8 wldqsen;
+};
+
+void ddrmc_setup_iomux(void);
+void ddrmc_phy_init(void);
+void ddrmc_ctrl_init_ddr3(struct ddr3_jedec_timings const *timings,
+                                                 struct ddrmc_lvl_info *lvl,
+                                                 int col_diff, int row_diff);
+
+#endif
index 6b10bdf961c695ca5d2826931659c09c799982ec..a7d765af359d168a22f7c62cb38890c4a848b980 100644 (file)
@@ -52,6 +52,7 @@
 #define SAI2_BASE_ADDR         (AIPS0_BASE_ADDR + 0x00031000)
 #define SAI3_BASE_ADDR         (AIPS0_BASE_ADDR + 0x00032000)
 #define CRC_BASE_ADDR          (AIPS0_BASE_ADDR + 0x00033000)
+#define USBC0_BASE_ADDR     (AIPS0_BASE_ADDR + 0x00034000)
 #define PDB_BASE_ADDR          (AIPS0_BASE_ADDR + 0x00036000)
 #define PIT_BASE_ADDR          (AIPS0_BASE_ADDR + 0x00037000)
 #define FTM0_BASE_ADDR         (AIPS0_BASE_ADDR + 0x00038000)
@@ -65,7 +66,9 @@
 #define QSPI0_BASE_ADDR                (AIPS0_BASE_ADDR + 0x00044000)
 #define IOMUXC_BASE_ADDR       (AIPS0_BASE_ADDR + 0x00048000)
 #define ANADIG_BASE_ADDR       (AIPS0_BASE_ADDR + 0x00050000)
-#define SCSCM_BASE_ADDR                (AIPS0_BASE_ADDR + 0x00052000)
+#define USB_PHY0_BASE_ADDR  (AIPS0_BASE_ADDR + 0x00050800)
+#define USB_PHY1_BASE_ADDR  (AIPS0_BASE_ADDR + 0x00050C00)
+#define SCSC_BASE_ADDR         (AIPS0_BASE_ADDR + 0x00052000)
 #define ASRC_BASE_ADDR         (AIPS0_BASE_ADDR + 0x00060000)
 #define SPDIF_BASE_ADDR                (AIPS0_BASE_ADDR + 0x00061000)
 #define ESAI_BASE_ADDR         (AIPS0_BASE_ADDR + 0x00062000)
@@ -84,6 +87,7 @@
 #define DDR_BASE_ADDR          (AIPS1_BASE_ADDR + 0x0002E000)
 #define ESDHC0_BASE_ADDR       (AIPS1_BASE_ADDR + 0x00031000)
 #define ESDHC1_BASE_ADDR       (AIPS1_BASE_ADDR + 0x00032000)
+#define USBC1_BASE_ADDR     (AIPS1_BASE_ADDR + 0x00034000)
 #define ENET_BASE_ADDR         (AIPS1_BASE_ADDR + 0x00050000)
 #define ENET1_BASE_ADDR                (AIPS1_BASE_ADDR + 0x00051000)
 #define NFC_BASE_ADDR          (AIPS1_BASE_ADDR + 0x00060000)
 #define DDRMC_CR96_WLMRD(v)                            (((v) & 0x3f) << 8)
 #define DDRMC_CR96_WLDQSEN(v)                          ((v) & 0x3f)
 #define DDRMC_CR97_WRLVL_EN                            (1 << 24)
-#define DDRMC_CR98_WRLVL_DL_0                          (0)
-#define DDRMC_CR99_WRLVL_DL_1                          (0)
+#define DDRMC_CR98_WRLVL_DL_0(v)                       ((v) & 0xffff)
+#define DDRMC_CR99_WRLVL_DL_1(v)                       ((v) & 0xffff)
 #define DDRMC_CR102_RDLVL_GT_REGEN                     (1 << 16)
 #define DDRMC_CR102_RDLVL_REG_EN                       (1 << 8)
 #define DDRMC_CR105_RDLVL_DL_0(v)                      (((v) & 0xff) << 8)
 #define SRC_SRSR_WDOG_M4                               (0x1 << 4)
 #define SRC_SRSR_WDOG_A5                               (0x1 << 3)
 #define SRC_SRSR_POR_RST                               (0x1 << 0)
+#define SRC_SBMR2_BMOD_MASK             (0x3 << 24)
+#define SRC_SBMR2_BMOD_SHIFT            24
+#define SRC_SBMR2_BMOD_FUSES            0x0
+#define SRC_SBMR2_BMOD_SERIAL           0x1
+#define SRC_SBMR2_BMOD_RCON             0x2
+
+/* Slow Clock Source Controller Module (SCSC) */
+#define SCSC_SOSC_CTR_SOSC_EN            0x1
 
 #if !(defined(__KERNEL_STRICT_NAMES) || defined(__ASSEMBLY__))
 #include <asm/types.h>
@@ -448,6 +460,24 @@ struct mscm_ir {
        u16 rsvd3[848];
 };
 
+/* SCSC */
+struct scsc_reg {
+       u32 sirc_ctr;
+       u32 sosc_ctr;
+};
+
+/* MSCM */
+struct mscm {
+       u32 cpxtype;
+       u32 cpxnum;
+       u32 cpxmaster;
+       u32 cpxcount;
+       u32 cpxcfg0;
+       u32 cpxcfg1;
+       u32 cpxcfg2;
+       u32 cpxcfg3;
+};
+
 #endif /* __ASSEMBLER__*/
 
 #endif /* __ASM_ARCH_IMX_REGS_H__ */
diff --git a/arch/arm/include/asm/armv7m.h b/arch/arm/include/asm/armv7m.h
new file mode 100644 (file)
index 0000000..d2aa1c4
--- /dev/null
@@ -0,0 +1,60 @@
+/*
+ * (C) Copyright 2010,2011
+ * Vladimir Khusainov, Emcraft Systems, vlad@emcraft.com
+ *
+ * (C) Copyright 2015
+ * Kamil Lulko, <rev13@wp.pl>
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#ifndef ARMV7M_H
+#define ARMV7M_H
+
+#if defined(__ASSEMBLY__)
+.syntax unified
+.thumb
+#endif
+
+#define V7M_SCB_BASE           0xE000ED00
+#define V7M_MPU_BASE           0xE000ED90
+
+#define V7M_SCB_VTOR           0x08
+
+#if !defined(__ASSEMBLY__)
+struct v7m_scb {
+       uint32_t cpuid;         /* CPUID Base Register */
+       uint32_t icsr;          /* Interrupt Control and State Register */
+       uint32_t vtor;          /* Vector Table Offset Register */
+       uint32_t aircr;         /* App Interrupt and Reset Control Register */
+};
+#define V7M_SCB                                ((struct v7m_scb *)V7M_SCB_BASE)
+
+#define V7M_AIRCR_VECTKEY              0x5fa
+#define V7M_AIRCR_VECTKEY_SHIFT                16
+#define V7M_AIRCR_ENDIAN               (1 << 15)
+#define V7M_AIRCR_PRIGROUP_SHIFT       8
+#define V7M_AIRCR_PRIGROUP_MSK         (0x7 << V7M_AIRCR_PRIGROUP_SHIFT)
+#define V7M_AIRCR_SYSRESET             (1 << 2)
+
+#define V7M_ICSR_VECTACT_MSK           0xFF
+
+struct v7m_mpu {
+       uint32_t type;          /* Type Register */
+       uint32_t ctrl;          /* Control Register */
+       uint32_t rnr;           /* Region Number Register */
+       uint32_t rbar;          /* Region Base Address Register */
+       uint32_t rasr;          /* Region Attribute and Size Register */
+};
+#define V7M_MPU                                ((struct v7m_mpu *)V7M_MPU_BASE)
+
+#define V7M_MPU_CTRL_ENABLE            (1 << 0)
+#define V7M_MPU_CTRL_HFNMIENA          (1 << 1)
+
+#define V7M_MPU_RASR_EN                        (1 << 0)
+#define V7M_MPU_RASR_SIZE_BITS         1
+#define V7M_MPU_RASR_SIZE_4GB          (31 << V7M_MPU_RASR_SIZE_BITS)
+#define V7M_MPU_RASR_AP_RW_RW          (3 << 24)
+
+#endif /* !defined(__ASSEMBLY__) */
+#endif /* ARMV7M_H */
diff --git a/arch/arm/include/asm/fsl_secure_boot.h b/arch/arm/include/asm/fsl_secure_boot.h
new file mode 100644 (file)
index 0000000..f097c81
--- /dev/null
@@ -0,0 +1,25 @@
+/*
+ * Copyright 2015 Freescale Semiconductor, Inc.
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#ifndef __FSL_SECURE_BOOT_H
+#define __FSL_SECURE_BOOT_H
+
+#ifdef CONFIG_SECURE_BOOT
+#ifndef CONFIG_FIT_SIGNATURE
+
+#define CONFIG_EXTRA_ENV \
+       "setenv fdt_high 0xcfffffff;"   \
+       "setenv initrd_high 0xcfffffff;"        \
+       "setenv hwconfig \'fsl_ddr:ctlr_intlv=null,bank_intlv=null\';"
+
+/* The address needs to be modified according to NOR memory map */
+#define CONFIG_BOOTSCRIPT_HDR_ADDR     0x600a0000
+
+#include <config_fsl_secboot.h>
+#endif
+#endif
+
+#endif
diff --git a/arch/arm/include/asm/imx-common/regs-usbphy.h b/arch/arm/include/asm/imx-common/regs-usbphy.h
new file mode 100644 (file)
index 0000000..220e45f
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Freescale USB PHY Register Definitions
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ *
+ */
+
+#ifndef __REGS_USBPHY_H__
+#define __REGS_USBPHY_H__
+
+#define USBPHY_CTRL                                            0x00000030
+#define USBPHY_CTRL_SET                                        0x00000034
+#define USBPHY_CTRL_CLR                                        0x00000038
+#define USBPHY_CTRL_TOG                                        0x0000003C
+#define USBPHY_PWD                                             0x00000000
+#define USBPHY_TX                                              0x00000010
+#define USBPHY_RX                                              0x00000020
+#define USBPHY_DEBUG                                   0x00000050
+
+#define USBPHY_CTRL_ENUTMILEVEL2               (1 << 14)
+#define USBPHY_CTRL_ENUTMILEVEL3               (1 << 15)
+#define USBPHY_CTRL_OTG_ID                             (1 << 27)
+#define USBPHY_CTRL_CLKGATE                            (1 << 30)
+#define USBPHY_CTRL_SFTRST                             (1 << 31)
+
+#endif /* __REGS_USBPHY_H__ */
index c424a224427ef69b5c2c9b89ecf89bb7adc540a3..5afe791761f38eeb3b714138c52b8a60cd45bf69 100644 (file)
@@ -1108,6 +1108,7 @@ extern unsigned int __machine_arch_type;
 #define MACH_TYPE_KZM9G                4140
 #define MACH_TYPE_COLIBRI_T30          4493
 #define MACH_TYPE_APALIS_T30           4513
+#define MACH_TYPE_OMAPL138_LCDK        2495
 
 #ifdef CONFIG_ARCH_EBSA110
 # ifdef machine_arch_type
index c8c3e71b55395b587e343b715eddc4fce28c3f7e..b0296fbae60d05fdcecbf15c9629fc63f163ec6a 100644 (file)
@@ -362,6 +362,10 @@ struct omap_sys_ctrl_regs {
        u32 control_core_control_io1;
        u32 control_core_control_io2;
        u32 control_id_code;
+       u32 control_std_fuse_die_id_0;
+       u32 control_std_fuse_die_id_1;
+       u32 control_std_fuse_die_id_2;
+       u32 control_std_fuse_die_id_3;
        u32 control_std_fuse_opp_bgap;
        u32 control_ldosram_iva_voltage_ctrl;
        u32 control_ldosram_mpu_voltage_ctrl;
@@ -578,6 +582,7 @@ void abb_setup(u32 fuse, u32 ldovbb, u32 setup, u32 control,
 s8 abb_setup_ldovbb(u32 fuse, u32 ldovbb);
 
 void usb_fake_mac_from_die_id(u32 *id);
+void usb_set_serial_num_from_die_id(u32 *id);
 
 void omap_smc1(u32 service, u32 val);
 
diff --git a/arch/arm/include/asm/pcie_layerscape.h b/arch/arm/include/asm/pcie_layerscape.h
deleted file mode 100644 (file)
index fb08578..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-/*
- * Copyright 2014 Freescale Semiconductor, Inc.
- *
- * SPDX-License-Identifier:    GPL-2.0+
- */
-
-#ifndef __PCIE_LAYERSCAPE_H_
-#define __PCIE_LAYERSCAPE_H_
-
-void pci_init_board(void);
-void ft_pcie_setup(void *blob, bd_t *bd);
-
-#endif
index da8ed72a11e52e350ec3031a37c4755760cb589a..0e1ad0e3ddf134e59ef8888833e2e28259275433 100644 (file)
@@ -8,7 +8,9 @@
 lib-$(CONFIG_USE_PRIVATE_LIBGCC) += _ashldi3.o _ashrdi3.o _divsi3.o \
                        _lshrdi3.o _modsi3.o _udivsi3.o _umodsi3.o div0.o
 
-ifdef CONFIG_ARM64
+ifdef CONFIG_CPU_V7M
+obj-y  += vectors_m.o crt0.o
+else ifdef CONFIG_ARM64
 obj-y  += crt0_64.o
 else
 obj-y  += vectors.o crt0.o
@@ -36,7 +38,9 @@ obj-$(CONFIG_SEMIHOSTING) += semihosting.o
 
 obj-y  += sections.o
 obj-y  += stack.o
-ifdef CONFIG_ARM64
+ifdef CONFIG_CPU_V7M
+obj-y  += interrupts_m.o
+else ifdef CONFIG_ARM64
 obj-y  += gic_64.o
 obj-y  += interrupts_64.o
 else
index 92d37324d337a49b206f7bdaecfb0337138d67a1..afd4f102dc87d4c0bcc5d9f2198f121d66f9f62f 100644 (file)
@@ -9,6 +9,9 @@
 #include <config.h>
 #include <asm-offsets.h>
 #include <linux/linkage.h>
+#ifdef CONFIG_CPU_V7M
+#include <asm/armv7m.h>
+#endif
 
 /*
  * This file handles the target-independent stages of the U-Boot
@@ -66,15 +69,30 @@ ENTRY(_main)
 #else
        ldr     sp, =(CONFIG_SYS_INIT_SP_ADDR)
 #endif
+#if defined(CONFIG_CPU_V7M)    /* v7M forbids using SP as BIC destination */
+       mov     r3, sp
+       bic     r3, r3, #7
+       mov     sp, r3
+#else
        bic     sp, sp, #7      /* 8-byte alignment for ABI compliance */
+#endif
        mov     r2, sp
        sub     sp, sp, #GD_SIZE        /* allocate one GD above SP */
+#if defined(CONFIG_CPU_V7M)    /* v7M forbids using SP as BIC destination */
+       mov     r3, sp
+       bic     r3, r3, #7
+       mov     sp, r3
+#else
        bic     sp, sp, #7      /* 8-byte alignment for ABI compliance */
+#endif
        mov     r9, sp          /* GD is above SP */
        mov     r1, sp
        mov     r0, #0
 clr_gd:
        cmp     r1, r2                  /* while not at end of GD */
+#if defined(CONFIG_CPU_V7M)
+       itt     lo
+#endif
        strlo   r0, [r1]                /* clear 32-bit GD word */
        addlo   r1, r1, #4              /* move to next */
        blo     clr_gd
@@ -94,13 +112,22 @@ clr_gd:
  */
 
        ldr     sp, [r9, #GD_START_ADDR_SP]     /* sp = gd->start_addr_sp */
+#if defined(CONFIG_CPU_V7M)    /* v7M forbids using SP as BIC destination */
+       mov     r3, sp
+       bic     r3, r3, #7
+       mov     sp, r3
+#else
        bic     sp, sp, #7      /* 8-byte alignment for ABI compliance */
+#endif
        ldr     r9, [r9, #GD_BD]                /* r9 = gd->bd */
        sub     r9, r9, #GD_SIZE                /* new GD is below bd */
 
        adr     lr, here
        ldr     r0, [r9, #GD_RELOC_OFF]         /* r0 = gd->reloc_off */
        add     lr, lr, r0
+#if defined(CONFIG_CPU_V7M)
+       orr     lr, #1                          /* As required by Thumb-only */
+#endif
        ldr     r0, [r9, #GD_RELOCADDR]         /* r0 = gd->relocaddr */
        b       relocate_code
 here:
@@ -134,6 +161,9 @@ here:
        mov     r2, #0x00000000         /* prepare zero to clear BSS */
 
 clbss_l:cmp    r0, r1                  /* while not at end of BSS */
+#if defined(CONFIG_CPU_V7M)
+       itt     lo
+#endif
        strlo   r2, [r0]                /* clear 32-bit BSS word */
        addlo   r0, r0, #4              /* move to next */
        blo     clbss_l
index 16540114323418895fb95f5afcf0176cc2c9b1b2..bc9c53c308debaf82965dcbf912836c91ff33ab6 100644 (file)
@@ -61,7 +61,11 @@ ENTRY(_main)
 /*
  * Set up initial C runtime environment and call board_init_f(0).
  */
+#if defined(CONFIG_SPL_BUILD) && defined(CONFIG_SPL_STACK)
+       ldr     x0, =(CONFIG_SPL_STACK)
+#else
        ldr     x0, =(CONFIG_SYS_INIT_SP_ADDR)
+#endif
        sub     x18, x0, #GD_SIZE       /* allocate one GD above SP */
        bic     x18, x18, #0x7          /* 8-byte alignment for GD */
 zero_gd:
@@ -77,6 +81,7 @@ zero_gd:
        mov     x0, #0
        bl      board_init_f
 
+#if !defined(CONFIG_SPL_BUILD)
 /*
  * Set up intermediate environment (new sp and gd) and call
  * relocate_code(addr_moni). Trick here is that we'll return
@@ -119,4 +124,6 @@ clear_loop:
 
        /* NOTREACHED - board_init_r() does not return */
 
+#endif /* !CONFIG_SPL_BUILD */
+
 ENDPROC(_main)
diff --git a/arch/arm/lib/interrupts_m.c b/arch/arm/lib/interrupts_m.c
new file mode 100644 (file)
index 0000000..89ce493
--- /dev/null
@@ -0,0 +1,95 @@
+/*
+ * (C) Copyright 2015
+ * Kamil Lulko, <rev13@wp.pl>
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#include <common.h>
+
+/*
+ * Upon exception entry ARMv7-M processors automatically save stack
+ * frames containing some registers. For simplicity initial
+ * implementation uses only this auto-saved stack frame.
+ * This does not contain complete register set dump,
+ * only R0-R3, R12, LR, PC and xPSR are saved.
+ */
+
+struct autosave_regs {
+       long uregs[8];
+};
+
+#define ARM_XPSR       uregs[7]
+#define ARM_PC         uregs[6]
+#define ARM_LR         uregs[5]
+#define ARM_R12                uregs[4]
+#define ARM_R3         uregs[3]
+#define ARM_R2         uregs[2]
+#define ARM_R1         uregs[1]
+#define ARM_R0         uregs[0]
+
+int interrupt_init(void)
+{
+       return 0;
+}
+
+void enable_interrupts(void)
+{
+       return;
+}
+
+int disable_interrupts(void)
+{
+       return 0;
+}
+
+void dump_regs(struct autosave_regs *regs)
+{
+       printf("pc : %08lx    lr : %08lx    xPSR : %08lx\n",
+              regs->ARM_PC, regs->ARM_LR, regs->ARM_XPSR);
+       printf("r12 : %08lx   r3 : %08lx    r2 : %08lx\n"
+               "r1 : %08lx    r0 : %08lx\n",
+               regs->ARM_R12, regs->ARM_R3, regs->ARM_R2,
+               regs->ARM_R1, regs->ARM_R0);
+}
+
+void bad_mode(void)
+{
+       panic("Resetting CPU ...\n");
+       reset_cpu(0);
+}
+
+void do_hard_fault(struct autosave_regs *autosave_regs)
+{
+       printf("Hard fault\n");
+       dump_regs(autosave_regs);
+       bad_mode();
+}
+
+void do_mm_fault(struct autosave_regs *autosave_regs)
+{
+       printf("Memory management fault\n");
+       dump_regs(autosave_regs);
+       bad_mode();
+}
+
+void do_bus_fault(struct autosave_regs *autosave_regs)
+{
+       printf("Bus fault\n");
+       dump_regs(autosave_regs);
+       bad_mode();
+}
+
+void do_usage_fault(struct autosave_regs *autosave_regs)
+{
+       printf("Usage fault\n");
+       dump_regs(autosave_regs);
+       bad_mode();
+}
+
+void do_invalid_entry(struct autosave_regs *autosave_regs)
+{
+       printf("Exception\n");
+       dump_regs(autosave_regs);
+       bad_mode();
+}
index 92f531452d5435c1adbfce9d4bc80a0e572cdb3f..475d503dd9df63fda046d225c47205a1bc9c80af 100644 (file)
@@ -9,6 +9,9 @@
 #include <asm-offsets.h>
 #include <config.h>
 #include <linux/linkage.h>
+#ifdef CONFIG_CPU_V7M
+#include <asm/armv7m.h>
+#endif
 
 /*
  * Default/weak exception vectors relocation routine
 
 ENTRY(relocate_vectors)
 
+#ifdef CONFIG_CPU_V7M
+       /*
+        * On ARMv7-M we only have to write the new vector address
+        * to VTOR register.
+        */
+       ldr     r0, [r9, #GD_RELOCADDR] /* r0 = gd->relocaddr */
+       ldr     r1, =V7M_SCB_BASE
+       str     r0, [r1, V7M_SCB_VTOR]
+#else
 #ifdef CONFIG_HAS_VBAR
        /*
         * If the ARM processor has the security extensions,
@@ -46,6 +58,7 @@ ENTRY(relocate_vectors)
        stmia   r1!, {r2-r8,r10}
        ldmia   r0!, {r2-r8,r10}
        stmia   r1!, {r2-r8,r10}
+#endif
 #endif
        bx      lr
 
diff --git a/arch/arm/lib/vectors_m.S b/arch/arm/lib/vectors_m.S
new file mode 100644 (file)
index 0000000..abc7f88
--- /dev/null
@@ -0,0 +1,57 @@
+/*
+ * (C) Copyright 2015
+ * Kamil Lulko, <rev13@wp.pl>
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#include <config.h>
+#include <asm/armv7m.h>
+#include <linux/linkage.h>
+
+.type __hard_fault_entry, %function
+__hard_fault_entry:
+       mov     r0, sp  @ pass auto-saved registers as argument
+       b       do_hard_fault
+
+.type __mm_fault_entry, %function
+__mm_fault_entry:
+       mov     r0, sp  @ pass auto-saved registers as argument
+       b       do_mm_fault
+
+.type __bus_fault_entry, %function
+__bus_fault_entry:
+       mov     r0, sp  @ pass auto-saved registers as argument
+       b       do_bus_fault
+
+.type __usage_fault_entry, %function
+__usage_fault_entry:
+       mov     r0, sp  @ pass auto-saved registers as argument
+       b       do_usage_fault
+
+.type __invalid_entry, %function
+__invalid_entry:
+       mov     r0, sp  @ pass auto-saved registers as argument
+       b       do_invalid_entry
+
+   .section  .vectors
+ENTRY(_start)
+       .long   CONFIG_SYS_INIT_SP_ADDR         @ 0 - Reset stack pointer
+       .long   reset                           @ 1 - Reset
+       .long   __invalid_entry                 @ 2 - NMI
+       .long   __hard_fault_entry              @ 3 - HardFault
+       .long   __mm_fault_entry                @ 4 - MemManage
+       .long   __bus_fault_entry               @ 5 - BusFault
+       .long   __usage_fault_entry             @ 6 - UsageFault
+       .long   __invalid_entry                 @ 7 - Reserved
+       .long   __invalid_entry                 @ 8 - Reserved
+       .long   __invalid_entry                 @ 9 - Reserved
+       .long   __invalid_entry                 @ 10 - Reserved
+       .long   __invalid_entry                 @ 11 - SVCall
+       .long   __invalid_entry                 @ 12 - Debug Monitor
+       .long   __invalid_entry                 @ 13 - Reserved
+       .long   __invalid_entry                 @ 14 - PendSV
+       .long   __invalid_entry                 @ 15 - SysTick
+       .rept   255 - 16
+       .long   __invalid_entry                 @ 16..255 - External Interrupts
+       .endr
index 68277217bfc61eec7f464995b0ef42b84f851407..3ef55d3eaf53bc620d6e42e200b7891483a35b62 100644 (file)
@@ -21,6 +21,10 @@ config TARGET_CAM_ENC_4XX
        bool "CAM ENC 4xx board"
        select SUPPORT_SPL
 
+config TARGET_OMAPL138_LCDK
+       bool "OMAPL138 LCDK"
+       select SUPPORT_SPL
+
 config TARGET_DAVINCI_DM355EVM
        bool "DM355 EVM board"
 
diff --git a/arch/arm/mach-integrator/Kconfig b/arch/arm/mach-integrator/Kconfig
new file mode 100644 (file)
index 0000000..8ffc544
--- /dev/null
@@ -0,0 +1,54 @@
+menu "Integrator Options"
+       depends on ARCH_INTEGRATOR
+
+choice
+       prompt "Integrator platform select"
+
+config ARCH_INTEGRATOR_AP
+       bool "Support Integrator/AP platform"
+
+config ARCH_INTEGRATOR_CP
+       bool "Support Integrator/CP platform"
+       select ARCH_CINTEGRATOR
+
+endchoice
+
+config ARCH_CINTEGRATOR
+       bool
+
+choice
+       prompt "Integrator core module select"
+
+config CM720T
+       bool "Core Module for ARM720T"
+       select CPU_ARM720T
+
+config CM920T
+       bool "Core Module for ARM920T"
+       select CPU_ARM920T
+
+config CM926EJ_S
+       bool "Core Module for ARM926EJ-STM"
+       select CPU_ARM926EJS
+
+config CM946ES
+       bool "Core Module for ARM946E-STM"
+       select CPU_ARM946ES
+
+config CM1136
+       bool "Core Module for ARM1136JF-STM"
+       select CPU_ARM1136
+
+endchoice
+
+config SYS_BOARD
+       default "integrator"
+
+config SYS_VENDOR
+       default "armltd"
+
+config SYS_CONFIG_NAME
+       default "integratorap" if ARCH_INTEGRATOR_AP
+       default "integratorcp" if ARCH_INTEGRATOR_CP
+
+endmenu
diff --git a/arch/m68k/cpu/u-boot.lds b/arch/m68k/cpu/u-boot.lds
new file mode 100644 (file)
index 0000000..d8dc715
--- /dev/null
@@ -0,0 +1,91 @@
+/*
+ * (C) Copyright 2000
+ * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
+ * (C) Copyright 2015
+ * Angelo Dureghello, Sysam Firmware, angelo@sysam.it
+ *
+ * SPDX-License-Identifier:     GPL-2.0+
+ */
+
+#include <config.h>
+
+OUTPUT_ARCH(m68k)
+
+#ifndef LDS_BOARD_TEXT
+#define LDS_BOARD_TEXT
+#endif
+
+SECTIONS
+{
+       .text :
+       {
+               CPUDIR/start.o (.text*)
+               LDS_BOARD_TEXT
+
+               *(.text*)
+       }
+       _etext = .;
+       PROVIDE (etext = .);
+       .rodata :
+       {
+               *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*)))
+       }
+
+       /* Read-write section, merged into data segment: */
+       . = (. + 0x00FF) & 0xFFFFFF00;
+       _erotext = .;
+       PROVIDE (erotext = .);
+
+       .reloc :
+       {
+               __got_start = .;
+               KEEP(*(.got))
+               __got_end = .;
+               _GOT2_TABLE_ = .;
+               KEEP(*(.got2))
+               _FIXUP_TABLE_ = .;
+               KEEP(*(.fixup))
+       }
+       __got2_entries = (_FIXUP_TABLE_ - _GOT2_TABLE_) >>2;
+       __fixup_entries = (. - _FIXUP_TABLE_)>>2;
+
+       .data :
+       {
+               *(.data*)
+               *(.sdata*)
+       }
+       _edata = .;
+       PROVIDE (edata = .);
+
+       . = .;
+
+       . = ALIGN(4);
+       .u_boot_list : {
+               KEEP(*(SORT(.u_boot_list*)));
+       }
+
+       . = .;
+       __start___ex_table = .;
+       __ex_table : { *(__ex_table) }
+       __stop___ex_table = .;
+
+       . = ALIGN(256);
+       __init_begin = .;
+       .text.init : { *(.text.init) }
+       .data.init : { *(.data.init) }
+       . = ALIGN(256);
+       __init_end = .;
+
+       __bss_start = .;
+       .bss (NOLOAD)       :
+       {
+               _sbss = .;
+               *(.bss*)
+               *(.sbss*)
+               *(COMMON)
+               . = ALIGN(4);
+               _ebss = .;
+       }
+       __bss_end = . ;
+       PROVIDE (end = .);
+}
index bc4283d2f13b551cb747d796794286eabbd83027..b0a8a4357a4bf3bdaba9df4099300b2f34b3ad53 100644 (file)
@@ -141,15 +141,12 @@ config MIPS_BOOT_ENV_LEGACY
          The address of the enviroment is stored in register $a2.
 
 config MIPS_BOOT_FDT
-       bool "Hand over a flattened device tree to Linux kernel (INCOMPLETE)"
+       bool "Hand over a flattened device tree to Linux kernel"
        default n
        help
          Enable this option if you want U-Boot to hand over a flattened
-         device tree to the kernel.
-
-         Note: the final hand over to the kernel is not yet implemented. After
-               the community agreed on the MIPS boot interface for device trees,
-               the corresponding code will be added.
+         device tree to the kernel. According to UHI register $a0 will be set
+         to -2 and the FDT address is stored in $a1.
 
 endmenu
 
index d9d8396e63b24b90838970c3256408a3c633f56b..e289799c1ee3c42247f308465494a356eb087691 100644 (file)
@@ -317,7 +317,11 @@ static void boot_jump_linux(bootm_headers_t *images)
        bootstage_report();
 #endif
 
-       kernel(linux_argc, (ulong)linux_argv, (ulong)linux_env, linux_extra);
+       if (images->ft_len)
+               kernel(-2, (ulong)images->ft_addr, 0, 0);
+       else
+               kernel(linux_argc, (ulong)linux_argv, (ulong)linux_env,
+                       linux_extra);
 }
 
 int do_bootm_linux(int flag, int argc, char * const argv[],
index 5ca9bf5ff98f53adac99d04c7a6c26fa57fb679f..235a635c22f9d42456523e6f42780c15428353b2 100644 (file)
@@ -15,7 +15,7 @@ DECLARE_GLOBAL_DATA_PTR;
 #ifdef CONFIG_A003399_NOR_WORKAROUND
 void setup_ifc(void)
 {
-       struct fsl_ifc *ifc_regs = (void *)CONFIG_SYS_IFC_ADDR;
+       struct fsl_ifc ifc_regs = {(void *)CONFIG_SYS_IFC_ADDR, (void *)NULL};
        u32 _mas0, _mas1, _mas2, _mas3, _mas7;
        phys_addr_t flash_phys = CONFIG_SYS_FLASH_BASE_PHYS;
 
@@ -70,9 +70,9 @@ void setup_ifc(void)
 #endif
 
        /* Change flash's physical address */
-       ifc_out32(&(ifc_regs->cspr_cs[0].cspr), CONFIG_SYS_CSPR0);
-       ifc_out32(&(ifc_regs->csor_cs[0].csor), CONFIG_SYS_CSOR0);
-       ifc_out32(&(ifc_regs->amask_cs[0].amask), CONFIG_SYS_AMASK0);
+       ifc_out32(&(ifc_regs.gregs->cspr_cs[0].cspr), CONFIG_SYS_CSPR0);
+       ifc_out32(&(ifc_regs.gregs->csor_cs[0].csor), CONFIG_SYS_CSOR0);
+       ifc_out32(&(ifc_regs.gregs->amask_cs[0].amask), CONFIG_SYS_AMASK0);
 
        return ;
 }
index e24b857672d7703958f6084bb93e2f21b85977cf..321ade24fe7d639f1723f2bcb8672167202167c4 100644 (file)
@@ -28,7 +28,7 @@ void get_sys_info(sys_info_t *sys_info)
 {
        volatile ccsr_gur_t *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR);
 #ifdef CONFIG_FSL_IFC
-       struct fsl_ifc *ifc_regs = (void *)CONFIG_SYS_IFC_ADDR;
+       struct fsl_ifc ifc_regs = {(void *)CONFIG_SYS_IFC_ADDR, (void *)NULL};
        u32 ccr;
 #endif
 #ifdef CONFIG_FSL_CORENET
@@ -597,7 +597,7 @@ void get_sys_info(sys_info_t *sys_info)
 #endif
 
 #if defined(CONFIG_FSL_IFC)
-       ccr = ifc_in32(&ifc_regs->ifc_ccr);
+       ccr = ifc_in32(&ifc_regs.gregs->ifc_ccr);
        ccr = ((ccr & IFC_CCR_CLK_DIV_MASK) >> IFC_CCR_CLK_DIV_SHIFT) + 1;
 
        sys_info->freq_localbus = sys_info->freq_systembus / ccr;
index d8c9fb6b2875c7d514bdca389066fb3a8aa6a7b5..28f04eefabb86e959e7ec113d9f10587446ab2e8 100644 (file)
@@ -252,39 +252,36 @@ l2_disabled:
        lis     r1,CONFIG_SYS_MONITOR_BASE@h
        mtspr   IVPR,r1
 
-       lis     r3,(CONFIG_SYS_MONITOR_BASE & 0xffff)@h
-       ori     r3,r3,(CONFIG_SYS_MONITOR_BASE & 0xffff)@l
-
-       addi    r4,r3,CriticalInput - _start + _START_OFFSET
+       li      r4,CriticalInput@l
        mtspr   IVOR0,r4        /* 0: Critical input */
-       addi    r4,r3,MachineCheck - _start + _START_OFFSET
+       li      r4,MachineCheck@l
        mtspr   IVOR1,r4        /* 1: Machine check */
-       addi    r4,r3,DataStorage - _start + _START_OFFSET
+       li      r4,DataStorage@l
        mtspr   IVOR2,r4        /* 2: Data storage */
-       addi    r4,r3,InstStorage - _start + _START_OFFSET
+       li      r4,InstStorage@l
        mtspr   IVOR3,r4        /* 3: Instruction storage */
-       addi    r4,r3,ExtInterrupt - _start + _START_OFFSET
+       li      r4,ExtInterrupt@l
        mtspr   IVOR4,r4        /* 4: External interrupt */
-       addi    r4,r3,Alignment - _start + _START_OFFSET
+       li      r4,Alignment@l
        mtspr   IVOR5,r4        /* 5: Alignment */
-       addi    r4,r3,ProgramCheck - _start + _START_OFFSET
+       li      r4,ProgramCheck@l
        mtspr   IVOR6,r4        /* 6: Program check */
-       addi    r4,r3,FPUnavailable - _start + _START_OFFSET
+       li      r4,FPUnavailable@l
        mtspr   IVOR7,r4        /* 7: floating point unavailable */
-       addi    r4,r3,SystemCall - _start + _START_OFFSET
+       li      r4,SystemCall@l
        mtspr   IVOR8,r4        /* 8: System call */
        /* 9: Auxiliary processor unavailable(unsupported) */
-       addi    r4,r3,Decrementer - _start + _START_OFFSET
+       li      r4,Decrementer@l
        mtspr   IVOR10,r4       /* 10: Decrementer */
-       addi    r4,r3,IntervalTimer - _start + _START_OFFSET
+       li      r4,IntervalTimer@l
        mtspr   IVOR11,r4       /* 11: Interval timer */
-       addi    r4,r3,WatchdogTimer - _start + _START_OFFSET
+       li      r4,WatchdogTimer@l
        mtspr   IVOR12,r4       /* 12: Watchdog timer */
-       addi    r4,r3,DataTLBError - _start + _START_OFFSET
+       li      r4,DataTLBError@l
        mtspr   IVOR13,r4       /* 13: Data TLB error */
-       addi    r4,r3,InstructionTLBError - _start + _START_OFFSET
+       li      r4,InstructionTLBError@l
        mtspr   IVOR14,r4       /* 14: Instruction TLB error */
-       addi    r4,r3,DebugBreakpoint - _start + _START_OFFSET
+       li      r4,DebugBreakpoint@l
        mtspr   IVOR15,r4       /* 15: Debug */
 #endif
 
@@ -1121,7 +1118,7 @@ switch_as:
        /*--------------------------------------------------------------*/
        lis     r3,CONFIG_SYS_MONITOR_BASE@h
        ori     r3,r3,CONFIG_SYS_MONITOR_BASE@l
-       addi    r3,r3,_start_cont - _start + _START_OFFSET
+       addi    r3,r3,_start_cont - _start
        mtlr    r3
        blr
 #endif
@@ -1165,7 +1162,6 @@ _start_cont:
        /* NOTREACHED - board_init_f() does not return */
 
 #ifndef MINIMAL_SPL
-       . = EXC_OFF_SYS_RESET
        .globl  _start_of_vectors
 _start_of_vectors:
 
@@ -1185,7 +1181,6 @@ _start_of_vectors:
        STD_EXCEPTION(0x0500, ExtInterrupt, ExtIntException)
 
 /* Alignment exception. */
-       . = 0x0600
 Alignment:
        EXCEPTION_PROLOG(SRR0, SRR1)
        mfspr   r4,DAR
@@ -1193,87 +1188,20 @@ Alignment:
        mfspr   r5,DSISR
        stw     r5,_DSISR(r21)
        addi    r3,r1,STACK_FRAME_OVERHEAD
-       EXC_XFER_TEMPLATE(Alignment, AlignmentException, MSR_KERNEL, COPY_EE)
+       EXC_XFER_TEMPLATE(0x600, Alignment, AlignmentException,
+               MSR_KERNEL, COPY_EE)
 
 /* Program check exception */
-       . = 0x0700
 ProgramCheck:
        EXCEPTION_PROLOG(SRR0, SRR1)
        addi    r3,r1,STACK_FRAME_OVERHEAD
-       EXC_XFER_TEMPLATE(ProgramCheck, ProgramCheckException,
+       EXC_XFER_TEMPLATE(0x700, ProgramCheck, ProgramCheckException,
                MSR_KERNEL, COPY_EE)
 
        /* No FPU on MPC85xx.  This exception is not supposed to happen.
        */
        STD_EXCEPTION(0x0800, FPUnavailable, UnknownException)
-
-       . = 0x0900
-/*
- * r0 - SYSCALL number
- * r3-... arguments
- */
-SystemCall:
-       addis   r11,r0,0        /* get functions table addr */
-       ori     r11,r11,0       /* Note: this code is patched in trap_init */
-       addis   r12,r0,0        /* get number of functions */
-       ori     r12,r12,0
-
-       cmplw   0,r0,r12
-       bge     1f
-
-       rlwinm  r0,r0,2,0,31    /* fn_addr = fn_tbl[r0] */
-       add     r11,r11,r0
-       lwz     r11,0(r11)
-
-       li      r20,0xd00-4     /* Get stack pointer */
-       lwz     r12,0(r20)
-       subi    r12,r12,12      /* Adjust stack pointer */
-       li      r0,0xc00+_end_back-SystemCall
-       cmplw   0,r0,r12        /* Check stack overflow */
-       bgt     1f
-       stw     r12,0(r20)
-
-       mflr    r0
-       stw     r0,0(r12)
-       mfspr   r0,SRR0
-       stw     r0,4(r12)
-       mfspr   r0,SRR1
-       stw     r0,8(r12)
-
-       li      r12,0xc00+_back-SystemCall
-       mtlr    r12
-       mtspr   SRR0,r11
-
-1:     SYNC
-       rfi
-_back:
-
-       mfmsr   r11                     /* Disable interrupts */
-       li      r12,0
-       ori     r12,r12,MSR_EE
-       andc    r11,r11,r12
-       SYNC                            /* Some chip revs need this... */
-       mtmsr   r11
-       SYNC
-
-       li      r12,0xd00-4             /* restore regs */
-       lwz     r12,0(r12)
-
-       lwz     r11,0(r12)
-       mtlr    r11
-       lwz     r11,4(r12)
-       mtspr   SRR0,r11
-       lwz     r11,8(r12)
-       mtspr   SRR1,r11
-
-       addi    r12,r12,12              /* Adjust stack pointer */
-       li      r20,0xd00-4
-       stw     r12,0(r20)
-
-       SYNC
-       rfi
-_end_back:
-
+       STD_EXCEPTION(0x0900, SystemCall, UnknownException)
        STD_EXCEPTION(0x0a00, Decrementer, timer_interrupt)
        STD_EXCEPTION(0x0b00, IntervalTimer, UnknownException)
        STD_EXCEPTION(0x0c00, WatchdogTimer, UnknownException)
@@ -1293,32 +1221,22 @@ _end_of_vectors:
  * This code finishes saving the registers to the exception frame
  * and jumps to the appropriate handler for the exception.
  * Register r21 is pointer into trap frame, r1 has new stack pointer.
+ * r23 is the address of the handler.
  */
        .globl  transfer_to_handler
 transfer_to_handler:
-       stw     r22,_NIP(r21)
-       lis     r22,MSR_POW@h
-       andc    r23,r23,r22
-       stw     r23,_MSR(r21)
        SAVE_GPR(7, r21)
        SAVE_4GPRS(8, r21)
        SAVE_8GPRS(12, r21)
        SAVE_8GPRS(24, r21)
 
-       mflr    r23
-       andi.   r24,r23,0x3f00          /* get vector offset */
-       stw     r24,TRAP(r21)
        li      r22,0
        stw     r22,RESULT(r21)
        mtspr   SPRG2,r22               /* r1 is now kernel sp */
 
-       lwz     r24,0(r23)              /* virtual address of handler */
-       lwz     r23,4(r23)              /* where to go when done */
-       mtspr   SRR0,r24
-       mtspr   SRR1,r20
-       mtlr    r23
-       SYNC
-       rfi                             /* jump to handler, enable MMU */
+       mtctr   r23                     /* virtual address of handler */
+       mtmsr   r20
+       bctrl
 
 int_return:
        mfmsr   r28             /* Disable interrupts */
@@ -1350,66 +1268,6 @@ int_return:
        SYNC
        rfi
 
-crit_return:
-       mfmsr   r28             /* Disable interrupts */
-       li      r4,0
-       ori     r4,r4,MSR_EE
-       andc    r28,r28,r4
-       SYNC                    /* Some chip revs need this... */
-       mtmsr   r28
-       SYNC
-       lwz     r2,_CTR(r1)
-       lwz     r0,_LINK(r1)
-       mtctr   r2
-       mtlr    r0
-       lwz     r2,_XER(r1)
-       lwz     r0,_CCR(r1)
-       mtspr   XER,r2
-       mtcrf   0xFF,r0
-       REST_10GPRS(3, r1)
-       REST_10GPRS(13, r1)
-       REST_8GPRS(23, r1)
-       REST_GPR(31, r1)
-       lwz     r2,_NIP(r1)     /* Restore environment */
-       lwz     r0,_MSR(r1)
-       mtspr   SPRN_CSRR0,r2
-       mtspr   SPRN_CSRR1,r0
-       lwz     r0,GPR0(r1)
-       lwz     r2,GPR2(r1)
-       lwz     r1,GPR1(r1)
-       SYNC
-       rfci
-
-mck_return:
-       mfmsr   r28             /* Disable interrupts */
-       li      r4,0
-       ori     r4,r4,MSR_EE
-       andc    r28,r28,r4
-       SYNC                    /* Some chip revs need this... */
-       mtmsr   r28
-       SYNC
-       lwz     r2,_CTR(r1)
-       lwz     r0,_LINK(r1)
-       mtctr   r2
-       mtlr    r0
-       lwz     r2,_XER(r1)
-       lwz     r0,_CCR(r1)
-       mtspr   XER,r2
-       mtcrf   0xFF,r0
-       REST_10GPRS(3, r1)
-       REST_10GPRS(13, r1)
-       REST_8GPRS(23, r1)
-       REST_GPR(31, r1)
-       lwz     r2,_NIP(r1)     /* Restore environment */
-       lwz     r0,_MSR(r1)
-       mtspr   SPRN_MCSRR0,r2
-       mtspr   SPRN_MCSRR1,r0
-       lwz     r0,GPR0(r1)
-       lwz     r2,GPR2(r1)
-       lwz     r1,GPR1(r1)
-       SYNC
-       rfmci
-
 /* Cache functions.
 */
 .globl flush_icache
@@ -1494,11 +1352,6 @@ dcache_status:
        andi.   r3,r3,L1CSR0_DCE
        blr
 
-       .globl get_pir
-get_pir:
-       mfspr   r3,PIR
-       blr
-
        .globl get_pvr
 get_pvr:
        mfspr   r3,PVR
@@ -1509,11 +1362,6 @@ get_svr:
        mfspr   r3,SVR
        blr
 
-       .globl wr_tcr
-wr_tcr:
-       mtspr   TCR,r3
-       blr
-
 /*------------------------------------------------------------------------------- */
 /* Function:    in8 */
 /* Description:         Input 8 bits */
@@ -1728,7 +1576,7 @@ relocate_code:
  * initialization, now running from RAM.
  */
 
-       addi    r0,r10,in_ram - _start + _START_OFFSET
+       addi    r0,r10,in_ram - _start
 
        /*
         * As IVPR is going to point RAM address,
@@ -1816,89 +1664,41 @@ clear_bss:
         */
        .globl  trap_init
 trap_init:
-       mflr    r4                      /* save link register           */
-       GET_GOT
-       lwz     r7,GOT(_start_of_vectors)
-       lwz     r8,GOT(_end_of_vectors)
-
-       li      r9,0x100                /* reset vector always at 0x100 */
-
-       cmplw   0,r7,r8
-       bgelr                           /* return if r7>=r8 - just in case */
-1:
-       lwz     r0,0(r7)
-       stw     r0,0(r9)
-       addi    r7,r7,4
-       addi    r9,r9,4
-       cmplw   0,r7,r8
-       bne     1b
+       /* Update IVORs as per relocation */
+       mtspr   IVPR,r3
 
-       /*
-        * relocate `hdlr' and `int_return' entries
-        */
-       li      r7,.L_CriticalInput - _start + _START_OFFSET
-       bl      trap_reloc
-       li      r7,.L_MachineCheck - _start + _START_OFFSET
-       bl      trap_reloc
-       li      r7,.L_DataStorage - _start + _START_OFFSET
-       bl      trap_reloc
-       li      r7,.L_InstStorage - _start + _START_OFFSET
-       bl      trap_reloc
-       li      r7,.L_ExtInterrupt - _start + _START_OFFSET
-       bl      trap_reloc
-       li      r7,.L_Alignment - _start + _START_OFFSET
-       bl      trap_reloc
-       li      r7,.L_ProgramCheck - _start + _START_OFFSET
-       bl      trap_reloc
-       li      r7,.L_FPUnavailable - _start + _START_OFFSET
-       bl      trap_reloc
-       li      r7,.L_Decrementer - _start + _START_OFFSET
-       bl      trap_reloc
-       li      r7,.L_IntervalTimer - _start + _START_OFFSET
-       li      r8,_end_of_vectors - _start + _START_OFFSET
-2:
-       bl      trap_reloc
-       addi    r7,r7,0x100             /* next exception vector        */
-       cmplw   0,r7,r8
-       blt     2b
-
-       /* Update IVORs as per relocated vector table address */
-       li      r7,0x0100
-       mtspr   IVOR0,r7        /* 0: Critical input */
-       li      r7,0x0200
-       mtspr   IVOR1,r7        /* 1: Machine check */
-       li      r7,0x0300
-       mtspr   IVOR2,r7        /* 2: Data storage */
-       li      r7,0x0400
-       mtspr   IVOR3,r7        /* 3: Instruction storage */
-       li      r7,0x0500
-       mtspr   IVOR4,r7        /* 4: External interrupt */
-       li      r7,0x0600
-       mtspr   IVOR5,r7        /* 5: Alignment */
-       li      r7,0x0700
-       mtspr   IVOR6,r7        /* 6: Program check */
-       li      r7,0x0800
-       mtspr   IVOR7,r7        /* 7: floating point unavailable */
-       li      r7,0x0900
-       mtspr   IVOR8,r7        /* 8: System call */
+       li      r4,CriticalInput@l
+       mtspr   IVOR0,r4        /* 0: Critical input */
+       li      r4,MachineCheck@l
+       mtspr   IVOR1,r4        /* 1: Machine check */
+       li      r4,DataStorage@l
+       mtspr   IVOR2,r4        /* 2: Data storage */
+       li      r4,InstStorage@l
+       mtspr   IVOR3,r4        /* 3: Instruction storage */
+       li      r4,ExtInterrupt@l
+       mtspr   IVOR4,r4        /* 4: External interrupt */
+       li      r4,Alignment@l
+       mtspr   IVOR5,r4        /* 5: Alignment */
+       li      r4,ProgramCheck@l
+       mtspr   IVOR6,r4        /* 6: Program check */
+       li      r4,FPUnavailable@l
+       mtspr   IVOR7,r4        /* 7: floating point unavailable */
+       li      r4,SystemCall@l
+       mtspr   IVOR8,r4        /* 8: System call */
        /* 9: Auxiliary processor unavailable(unsupported) */
-       li      r7,0x0a00
-       mtspr   IVOR10,r7       /* 10: Decrementer */
-       li      r7,0x0b00
-       mtspr   IVOR11,r7       /* 11: Interval timer */
-       li      r7,0x0c00
-       mtspr   IVOR12,r7       /* 12: Watchdog timer */
-       li      r7,0x0d00
-       mtspr   IVOR13,r7       /* 13: Data TLB error */
-       li      r7,0x0e00
-       mtspr   IVOR14,r7       /* 14: Instruction TLB error */
-       li      r7,0x0f00
-       mtspr   IVOR15,r7       /* 15: Debug */
-
-       lis     r7,0x0
-       mtspr   IVPR,r7
-
-       mtlr    r4                      /* restore link register        */
+       li      r4,Decrementer@l
+       mtspr   IVOR10,r4       /* 10: Decrementer */
+       li      r4,IntervalTimer@l
+       mtspr   IVOR11,r4       /* 11: Interval timer */
+       li      r4,WatchdogTimer@l
+       mtspr   IVOR12,r4       /* 12: Watchdog timer */
+       li      r4,DataTLBError@l
+       mtspr   IVOR13,r4       /* 13: Data TLB error */
+       li      r4,InstructionTLBError@l
+       mtspr   IVOR14,r4       /* 14: Instruction TLB error */
+       li      r4,DebugBreakpoint@l
+       mtspr   IVOR15,r4       /* 15: Debug */
+
        blr
 
 .globl unlock_ram_in_cache
index 61c6d70c4b71556a188048266a22e82c399d12be..4861e3bf8d74e45b76ad916052f4da7ce4857c46 100644 (file)
@@ -45,7 +45,7 @@ static inline bool has_erratum_a007186(void)
                return IS_SVR_REV(svr, 2, 0);
        case SVR_T2081:
        case SVR_T2080:
-               return IS_SVR_REV(svr, 1, 0);
+               return IS_SVR_REV(svr, 1, 0) || IS_SVR_REV(svr, 1, 1);
        }
 
        return false;
index 49f6814383f1757d48db8935eb05c9e427bfa1cf..8f794ef381253c6efee1bd96fe85c8083e30b93c 100644 (file)
 #define CONFIG_FSL_ISBC_KEY_EXT
 #endif
 
+#ifndef CONFIG_FIT_SIGNATURE
+/* The bootscript header address is different for B4860 because the NOR
+ * mapping is different on B4 due to reduced NOR size.
+ */
+#if defined(CONFIG_B4860QDS)
+#define CONFIG_BOOTSCRIPT_HDR_ADDR     0xecc00000
+#elif defined(CONFIG_FSL_CORENET)
+#define CONFIG_BOOTSCRIPT_HDR_ADDR     0xe8e00000
+#elif defined(CONFIG_BSC9132QDS)
+#define CONFIG_BOOTSCRIPT_HDR_ADDR     0x88020000
+#elif defined(CONFIG_C29XPCIE)
+#define CONFIG_BOOTSCRIPT_HDR_ADDR     0xec020000
+#else
+#define CONFIG_BOOTSCRIPT_HDR_ADDR     0xee020000
+#endif
+
+#include <config_fsl_secboot.h>
+#endif
+
 #endif
 #endif
index f0dafedc254fb5d0ca3973946539babf7a75d267..168f2efa33e5fe4f5eaab52503dbb724fd2f5528 100644 (file)
@@ -6,6 +6,7 @@
 #include <common.h>
 #include <dm/root.h>
 #include <os.h>
+#include <asm/io.h>
 #include <asm/state.h>
 
 DECLARE_GLOBAL_DATA_PTR;
@@ -97,3 +98,43 @@ phys_addr_t map_to_sysmem(const void *ptr)
 void flush_dcache_range(unsigned long start, unsigned long stop)
 {
 }
+
+int sandbox_read_fdt_from_file(void)
+{
+       struct sandbox_state *state = state_get_current();
+       const char *fname = state->fdt_fname;
+       void *blob;
+       loff_t size;
+       int err;
+       int fd;
+
+       blob = map_sysmem(CONFIG_SYS_FDT_LOAD_ADDR, 0);
+       if (!state->fdt_fname) {
+               err = fdt_create_empty_tree(blob, 256);
+               if (!err)
+                       goto done;
+               printf("Unable to create empty FDT: %s\n", fdt_strerror(err));
+               return -EINVAL;
+       }
+
+       err = os_get_filesize(fname, &size);
+       if (err < 0) {
+               printf("Failed to file FDT file '%s'\n", fname);
+               return err;
+       }
+       fd = os_open(fname, OS_O_RDONLY);
+       if (fd < 0) {
+               printf("Failed to open FDT file '%s'\n", fname);
+               return -EACCES;
+       }
+       if (os_read(fd, blob, size) != size) {
+               os_close(fd);
+               return -EIO;
+       }
+       os_close(fd);
+
+done:
+       gd->fdt_blob = blob;
+
+       return 0;
+}
index e807c4ef34bda06b5f1d555bb248ea02fccf4390..f1a7aeee938f75e5e14dd1173f9453cae641a094 100644 (file)
@@ -1,6 +1,8 @@
 /*
  * Copyright (c) 2011 The Chromium OS Authors.
  *
+ * Modified from Linux arch/arm/include/asm/bitops.h
+ *
  * Copyright 1995, Russell King.
  * Various bits and pieces copyrights include:
  *  Linus Torvalds (test_bit).
index d5b93616839d7e0def937090f334e90b6517fe13..da87cc304067f85ac4e829ef3111901d49de1999 100644 (file)
@@ -75,4 +75,12 @@ int pci_unmap_physmem(const void *addr, unsigned long len,
  */
 void sandbox_set_enable_pci_map(int enable);
 
+/**
+ * sandbox_read_fdt_from_file() - Read a device tree from a file
+ *
+ * Read a device tree file from a host file and set it up for use as the
+ * control FDT.
+ */
+int sandbox_read_fdt_from_file(void);
+
 #endif /* _U_BOOT_SANDBOX_H_ */
index 13f23fd7cec2c9c1da25f0c9c0ae0ec23760eacc..23a98e4fdff9cc3b4a80c3939157735f4adc0793 100644 (file)
 #endif
 #include "bur_common.h"
 #include "../../../drivers/video/am335x-fb.h"
+#include <nand.h>
 
 static struct ctrl_dev *cdev = (struct ctrl_dev *)CTRL_DEVICE_BASE;
 
 DECLARE_GLOBAL_DATA_PTR;
 
 #ifdef CONFIG_USE_FDT
-  #define FDTPROP(a, b, c) fdt_getprop_u32_default((void *)a, b, c, ~0UL)
+  #define FDTPROP(b, c) fdt_getprop_u32_default(gd->fdt_blob, b, c, ~0UL)
   #define PATHTIM "/panel/display-timings/default"
   #define PATHINF "/panel/panel-info"
 #endif
@@ -50,51 +51,50 @@ int load_lcdtiming(struct am335x_lcdpanel *panel)
 {
        struct am335x_lcdpanel pnltmp;
 #ifdef CONFIG_USE_FDT
-       u32 dtbaddr = getenv_ulong("dtbaddr", 16, ~0UL);
        u32 dtbprop;
 
-       if (dtbaddr == ~0UL) {
-               puts("load_lcdtiming: failed to get 'dtbaddr' from env!\n");
+       if (gd->fdt_blob == NULL) {
+               printf("%s: don't have a valid gd->fdt_blob!\n", __func__);
                return -1;
        }
        memcpy(&pnltmp, (void *)panel, sizeof(struct am335x_lcdpanel));
 
-       pnltmp.hactive = FDTPROP(dtbaddr, PATHTIM, "hactive");
-       pnltmp.vactive = FDTPROP(dtbaddr, PATHTIM, "vactive");
-       pnltmp.bpp = FDTPROP(dtbaddr, PATHINF, "bpp");
-       pnltmp.hfp = FDTPROP(dtbaddr, PATHTIM, "hfront-porch");
-       pnltmp.hbp = FDTPROP(dtbaddr, PATHTIM, "hback-porch");
-       pnltmp.hsw = FDTPROP(dtbaddr, PATHTIM, "hsync-len");
-       pnltmp.vfp = FDTPROP(dtbaddr, PATHTIM, "vfront-porch");
-       pnltmp.vbp = FDTPROP(dtbaddr, PATHTIM, "vback-porch");
-       pnltmp.vsw = FDTPROP(dtbaddr, PATHTIM, "vsync-len");
-       pnltmp.pup_delay = FDTPROP(dtbaddr, PATHTIM, "pupdelay");
-       pnltmp.pon_delay = FDTPROP(dtbaddr, PATHTIM, "pondelay");
+       pnltmp.hactive = FDTPROP(PATHTIM, "hactive");
+       pnltmp.vactive = FDTPROP(PATHTIM, "vactive");
+       pnltmp.bpp = FDTPROP(PATHINF, "bpp");
+       pnltmp.hfp = FDTPROP(PATHTIM, "hfront-porch");
+       pnltmp.hbp = FDTPROP(PATHTIM, "hback-porch");
+       pnltmp.hsw = FDTPROP(PATHTIM, "hsync-len");
+       pnltmp.vfp = FDTPROP(PATHTIM, "vfront-porch");
+       pnltmp.vbp = FDTPROP(PATHTIM, "vback-porch");
+       pnltmp.vsw = FDTPROP(PATHTIM, "vsync-len");
+       pnltmp.pup_delay = FDTPROP(PATHTIM, "pupdelay");
+       pnltmp.pon_delay = FDTPROP(PATHTIM, "pondelay");
 
        /* calc. proper clk-divisor */
-       dtbprop = FDTPROP(dtbaddr, PATHTIM, "clock-frequency");
+       dtbprop = FDTPROP(PATHTIM, "clock-frequency");
        if (dtbprop != ~0UL)
                pnltmp.pxl_clk_div = 192000000 / dtbprop;
        else
                pnltmp.pxl_clk_div = ~0UL;
 
        /* check polarity of control-signals */
-       dtbprop = FDTPROP(dtbaddr, PATHTIM, "hsync-active");
+       dtbprop = FDTPROP(PATHTIM, "hsync-active");
        if (dtbprop == 0)
                pnltmp.pol |= HSYNC_INVERT;
-       dtbprop = FDTPROP(dtbaddr, PATHTIM, "vsync-active");
+       dtbprop = FDTPROP(PATHTIM, "vsync-active");
        if (dtbprop == 0)
                pnltmp.pol |= VSYNC_INVERT;
-       dtbprop = FDTPROP(dtbaddr, PATHINF, "sync-ctrl");
+       dtbprop = FDTPROP(PATHINF, "sync-ctrl");
        if (dtbprop == 1)
                pnltmp.pol |= HSVS_CONTROL;
-       dtbprop = FDTPROP(dtbaddr, PATHINF, "sync-edge");
+       dtbprop = FDTPROP(PATHINF, "sync-edge");
        if (dtbprop == 1)
                pnltmp.pol |= HSVS_RISEFALL;
-       dtbprop = FDTPROP(dtbaddr, PATHTIM, "pixelclk-active");
+       dtbprop = FDTPROP(PATHTIM, "pixelclk-active");
        if (dtbprop == 0)
                pnltmp.pol |= PXCLK_INVERT;
-       dtbprop = FDTPROP(dtbaddr, PATHTIM, "de-active");
+       dtbprop = FDTPROP(PATHTIM, "de-active");
        if (dtbprop == 0)
                pnltmp.pol |= DE_INVERT;
 #else
@@ -160,14 +160,24 @@ int load_lcdtiming(struct am335x_lcdpanel *panel)
 #ifdef CONFIG_USE_FDT
 static int load_devicetree(void)
 {
+       int rc;
+       loff_t dtbsize;
+       u32 dtbaddr = getenv_ulong("dtbaddr", 16, 0UL);
+
+       if (dtbaddr == 0) {
+               printf("%s: don't have a valid <dtbaddr> in env!\n", __func__);
+               return -1;
+       }
+#ifdef CONFIG_NAND
+       dtbsize = 0x20000;
+       rc = nand_read_skip_bad(&nand_info[0], 0x40000, (size_t *)&dtbsize,
+                               NULL, 0x20000, (u_char *)dtbaddr);
+#else
        char *dtbname = getenv("dtb");
        char *dtbdev = getenv("dtbdev");
        char *dtppart = getenv("dtbpart");
-       u32 dtbaddr = getenv_ulong("dtbaddr", 16, ~0UL);
-       loff_t dtbsize;
-
-       if (!dtbdev || !dtbdev) {
-               puts("load_devicetree: <dtbdev>/<dtbpart> missing.\n");
+       if (!dtbdev || !dtbdev || !dtbname) {
+               printf("%s: <dtbdev>/<dtbpart>/<dtb> missing.\n", __func__);
                return -1;
        }
 
@@ -175,18 +185,17 @@ static int load_devicetree(void)
                puts("load_devicetree: set_blk_dev failed.\n");
                return -1;
        }
-       if (dtbname && dtbaddr != ~0UL) {
-               if (fs_read(dtbname, dtbaddr, 0, 0, &dtbsize) == 0) {
-                       gd->fdt_blob = (void *)dtbaddr;
-                       gd->fdt_size = dtbsize;
-                       debug("loaded %d bytes of dtb onto 0x%08x\n",
-                             (u32)dtbsize, dtbaddr);
-                       return dtbsize;
-               }
-               puts("load_devicetree: load dtb failed,file does not exist!\n");
+       rc = fs_read(dtbname, (u32)dtbaddr, 0, 0, &dtbsize);
+#endif
+       if (rc == 0) {
+               gd->fdt_blob = (void *)dtbaddr;
+               gd->fdt_size = dtbsize;
+               debug("loaded %d bytes of dtb onto 0x%08x\n",
+                     (u32)dtbsize, (u32)gd->fdt_blob);
+               return dtbsize;
        }
 
-       puts("load_devicetree: <dtb>/<dtbaddr> missing!\n");
+       printf("%s: load dtb failed!\n", __func__);
        return -1;
 }
 
@@ -196,26 +205,25 @@ static const char *dtbmacaddr(u32 ifno)
        char enet[16];
        const char *mac;
        const char *path;
-       u32 dtbaddr = getenv_ulong("dtbaddr", 16, ~0UL);
 
-       if (dtbaddr == ~0UL) {
-               puts("dtbmacaddr: failed to get 'dtbaddr' from env!\n");
+       if (gd->fdt_blob == NULL) {
+               printf("%s: don't have a valid gd->fdt_blob!\n", __func__);
                return NULL;
        }
 
-       node = fdt_path_offset((void *)dtbaddr, "/aliases");
+       node = fdt_path_offset(gd->fdt_blob, "/aliases");
        if (node < 0)
                return NULL;
 
        sprintf(enet, "ethernet%d", ifno);
-       path = fdt_getprop((void *)dtbaddr, node, enet, NULL);
+       path = fdt_getprop(gd->fdt_blob, node, enet, NULL);
        if (!path) {
                printf("no alias for %s\n", enet);
                return NULL;
        }
 
-       node = fdt_path_offset((void *)dtbaddr, path);
-       mac = fdt_getprop((void *)dtbaddr, node, "mac-address", &len);
+       node = fdt_path_offset(gd->fdt_blob, path);
+       mac = fdt_getprop(gd->fdt_blob, node, "mac-address", &len);
        if (mac && is_valid_ethaddr((u8 *)mac))
                return mac;
 
@@ -226,15 +234,14 @@ static void br_summaryscreen_printdtb(char *prefix,
                                       char *name,
                                       char *suffix)
 {
-       u32 dtbaddr = getenv_ulong("dtbaddr", 16, ~0UL);
        char buf[32] = { 0 };
        const char *nodep = buf;
        char *mac = 0;
        int nodeoffset;
        int len;
 
-       if (dtbaddr == ~0UL) {
-               puts("br_summaryscreen: failed to get 'dtbaddr' from env!\n");
+       if (gd->fdt_blob == NULL) {
+               printf("%s: don't have a valid gd->fdt_blob!\n", __func__);
                return;
        }
 
@@ -247,13 +254,13 @@ static void br_summaryscreen_printdtb(char *prefix,
                if (mac)
                        sprintf(buf, "%pM", mac);
        } else {
-               nodeoffset = fdt_path_offset((void *)dtbaddr,
+               nodeoffset = fdt_path_offset(gd->fdt_blob,
                                             "/factory-settings");
                if (nodeoffset < 0) {
                        puts("no 'factory-settings' in dtb!\n");
                        return;
                }
-               nodep = fdt_getprop((void *)dtbaddr, nodeoffset, name, &len);
+               nodep = fdt_getprop(gd->fdt_blob, nodeoffset, name, &len);
        }
        if (nodep && strlen(nodep) > 1)
                lcd_printf("%s %s %s", prefix, nodep, suffix);
@@ -318,13 +325,11 @@ void lcdpower(int on)
 {
        u32 pin, swval, i;
 #ifdef CONFIG_USE_FDT
-       u32 dtbaddr = getenv_ulong("dtbaddr", 16, ~0UL);
-
-       if (dtbaddr == ~0UL) {
-               puts("lcdpower: failed to get 'dtbaddr' from env!\n");
+       if (gd->fdt_blob == NULL) {
+               printf("%s: don't have a valid gd->fdt_blob!\n", __func__);
                return;
        }
-       pin = FDTPROP(dtbaddr, PATHINF, "pwrpin");
+       pin = FDTPROP(PATHINF, "pwrpin");
 #else
        pin = getenv_ulong("ds1_pwr", 16, ~0UL);
 #endif
@@ -385,15 +390,13 @@ void lcd_ctrl_init(void *lcdbase)
 void lcd_enable(void)
 {
 #ifdef CONFIG_USE_FDT
-       u32 dtbaddr = getenv_ulong("dtbaddr", 16, ~0UL);
-
-       if (dtbaddr == ~0UL) {
-               puts("lcdpower: failed to get 'dtbaddr' from env!\n");
+       if (gd->fdt_blob == NULL) {
+               printf("%s: don't have a valid gd->fdt_blob!\n", __func__);
                return;
        }
-       unsigned int driver = FDTPROP(dtbaddr, PATHINF, "brightdrv");
-       unsigned int bright = FDTPROP(dtbaddr, PATHINF, "brightdef");
-       unsigned int pwmfrq = FDTPROP(dtbaddr, PATHINF, "brightfdim");
+       unsigned int driver = FDTPROP(PATHINF, "brightdrv");
+       unsigned int bright = FDTPROP(PATHINF, "brightdef");
+       unsigned int pwmfrq = FDTPROP(PATHINF, "brightfdim");
 #else
        unsigned int driver = getenv_ulong("ds1_bright_drv", 16, 0UL);
        unsigned int bright = getenv_ulong("ds1_bright_def", 10, 50);
index 89e989f2467411341f34d3f437ee5f3d595f319a..d1d698e7d2489603d079037d77fc8d51a44b81b4 100644 (file)
@@ -128,6 +128,9 @@ void am33xx_spl_board_init(void)
        i2c_set_bus_num(0);
        i2c_init(CONFIG_SYS_OMAP24_I2C_SPEED, CONFIG_SYS_OMAP24_I2C_SLAVE);
        pmicsetup(0);
+
+       gpio_direction_output(64+29, 1); /* switch NAND_RnB to GPMC_WAIT1 */
+       gpio_direction_output(64+28, 1); /* switch MII2_CRS to GPMC_WAIT0 */
 }
 
 const struct dpll_params *get_dpll_ddr_params(void)
index ac7e885f61589391a8569cd71f4b970bb9a0e9ea..c5dc4b762524122d2f579f8d505d36f77128408d 100644 (file)
 #include <i2c.h>
 
 static struct module_pin_mux uart0_pin_mux[] = {
+       /* UART0_RTS */
+       {OFFSET(uart0_rtsn), (MODE(0) | PULLUDEN)},
        /* UART0_CTS */
-       {OFFSET(uart0_ctsn), (MODE(7) | PULLUDEN | PULLUP_EN | RXACTIVE)},
+       {OFFSET(uart0_ctsn), (MODE(0) | PULLUDEN | PULLUP_EN | RXACTIVE)},
        /* UART0_RXD */
        {OFFSET(uart0_rxd), (MODE(0) | PULLUDEN | PULLUP_EN | RXACTIVE)},
        /* UART0_TXD */
@@ -26,9 +28,13 @@ static struct module_pin_mux uart0_pin_mux[] = {
        {-1},
 };
 static struct module_pin_mux uart1_pin_mux[] = {
-       /* UART0_RXD */
+       /* UART1_RTS as I2C2-SCL */
+       {OFFSET(uart1_rtsn), (MODE(3) | PULLUDEN | PULLUP_EN | RXACTIVE)},
+       /* UART1_CTS as I2C2-SDA */
+       {OFFSET(uart1_ctsn), (MODE(3) | PULLUDEN | PULLUP_EN | RXACTIVE)},
+       /* UART1_RXD */
        {OFFSET(uart1_rxd), (MODE(0) | PULLUDEN | PULLUP_EN | RXACTIVE)},
-       /* UART0_TXD */
+       /* UART1_TXD */
        {OFFSET(uart1_txd), (MODE(0) | PULLUDEN)},
        {-1},
 };
@@ -123,7 +129,7 @@ static struct module_pin_mux nand_pin_mux[] = {
        {OFFSET(gpmc_ad5), (MODE(0) | PULLUP_EN | RXACTIVE)},   /* NAND AD5 */
        {OFFSET(gpmc_ad6), (MODE(0) | PULLUP_EN | RXACTIVE)},   /* NAND AD6 */
        {OFFSET(gpmc_ad7), (MODE(0) | PULLUP_EN | RXACTIVE)},   /* NAND AD7 */
-       {OFFSET(gpmc_wait0), (MODE(0) | RXACTIVE | PULLUP_EN)}, /* NAND WAIT */
+       {OFFSET(gpmc_clk), (MODE(2) | RXACTIVE | PULLUP_EN)},   /* NAND WAIT */
        {OFFSET(gpmc_wpn), (MODE(7) | PULLUP_EN | RXACTIVE)},   /* NAND_WPN */
        {OFFSET(gpmc_csn0), (MODE(0) | PULLUDEN)},      /* NAND_CS0 */
        {OFFSET(gpmc_advn_ale), (MODE(0) | PULLUDEN)},  /* NAND_ADV_ALE */
diff --git a/board/BuS/eb_cpu5282/u-boot.lds b/board/BuS/eb_cpu5282/u-boot.lds
deleted file mode 100644 (file)
index 0df2a0a..0000000
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * (C) Copyright 2000-2003
- * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
- *
- * SPDX-License-Identifier:    GPL-2.0+
- */
-
-OUTPUT_ARCH(m68k)
-
-SECTIONS
-{
-  .text      :
-  {
-    arch/m68k/cpu/mcf52x2/start.o      (.text*)
-
-    *(.text*)
-  }
-  _etext = .;
-  PROVIDE (etext = .);
-  .rodata    :
-  {
-    *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*)))
-  }
-
-  /* Read-write section, merged into data segment: */
-  . = (. + 0x00FF) & 0xFFFFFF00;
-  _erotext = .;
-  PROVIDE (erotext = .);
-
-  .reloc   :
-  {
-    __got_start = .;
-    KEEP(*(.got))
-    __got_end = .;
-    _GOT2_TABLE_ = .;
-    KEEP(*(.got2))
-    _FIXUP_TABLE_ = .;
-    KEEP(*(.fixup))
-  }
-  __got2_entries = (_FIXUP_TABLE_ - _GOT2_TABLE_) >>2;
-  __fixup_entries = (. - _FIXUP_TABLE_)>>2;
-
-  .data    :
-  {
-    *(.data*)
-    *(.sdata*)
-  }
-  _edata  =  .;
-  PROVIDE (edata = .);
-
-  . = .;
-
-  . = ALIGN(4);
-  .u_boot_list : {
-       KEEP(*(SORT(.u_boot_list*)));
-  }
-
-  . = .;
-  __start___ex_table = .;
-  __ex_table : { *(__ex_table) }
-  __stop___ex_table = .;
-
-  . = ALIGN(256);
-  __init_begin = .;
-  .text.init : { *(.text.init) }
-  .data.init : { *(.data.init) }
-  . = ALIGN(256);
-  __init_end = .;
-
-  __bss_start = .;
-  .bss (NOLOAD)      :
-  {
-   _sbss = .;
-   *(.bss*)
-   *(.sbss*)
-   *(COMMON)
-   . = ALIGN(4);
-   _ebss = .;
-  }
-  __bss_end = . ;
-  PROVIDE (end = .);
-}
diff --git a/board/armltd/integrator/Kconfig b/board/armltd/integrator/Kconfig
deleted file mode 100644 (file)
index 6153b5d..0000000
+++ /dev/null
@@ -1,103 +0,0 @@
-if TARGET_INTEGRATORAP_CM720T
-
-config SYS_BOARD
-       default "integrator"
-
-config SYS_VENDOR
-       default "armltd"
-
-config SYS_CONFIG_NAME
-       default "integratorap"
-
-endif
-
-if TARGET_INTEGRATORAP_CM920T
-
-config SYS_BOARD
-       default "integrator"
-
-config SYS_VENDOR
-       default "armltd"
-
-config SYS_CONFIG_NAME
-       default "integratorap"
-
-endif
-
-if TARGET_INTEGRATORCP_CM920T
-
-config SYS_BOARD
-       default "integrator"
-
-config SYS_VENDOR
-       default "armltd"
-
-config SYS_CONFIG_NAME
-       default "integratorcp"
-
-endif
-
-if TARGET_INTEGRATORAP_CM926EJS
-
-config SYS_BOARD
-       default "integrator"
-
-config SYS_VENDOR
-       default "armltd"
-
-config SYS_CONFIG_NAME
-       default "integratorap"
-
-endif
-
-if TARGET_INTEGRATORCP_CM926EJS
-
-config SYS_BOARD
-       default "integrator"
-
-config SYS_VENDOR
-       default "armltd"
-
-config SYS_CONFIG_NAME
-       default "integratorcp"
-
-endif
-
-if TARGET_INTEGRATORCP_CM1136
-
-config SYS_BOARD
-       default "integrator"
-
-config SYS_VENDOR
-       default "armltd"
-
-config SYS_CONFIG_NAME
-       default "integratorcp"
-
-endif
-
-if TARGET_INTEGRATORAP_CM946ES
-
-config SYS_BOARD
-       default "integrator"
-
-config SYS_VENDOR
-       default "armltd"
-
-config SYS_CONFIG_NAME
-       default "integratorap"
-
-endif
-
-if TARGET_INTEGRATORCP_CM946ES
-
-config SYS_BOARD
-       default "integrator"
-
-config SYS_VENDOR
-       default "armltd"
-
-config SYS_CONFIG_NAME
-       default "integratorcp"
-
-endif
index f0fe0fd3aabe66ba0f096221eb8de985211e61ba..e94ac850c7515b66948a1f428cdab79619b2322c 100644 (file)
@@ -54,8 +54,6 @@ int board_init (void)
        /* adress of boot parameters */
        gd->bd->bi_boot_params = 0x00000100;
 
-       gd->flags = 0;
-
 #ifdef CONFIG_CM_REMAP
 extern void cm_remap(void);
        cm_remap();     /* remaps writeable memory to 0x00000000 */
index 13dd6674363cc2194a37af58f9b66a901ae426f7..7cb4e0021f66099c4c2b4a3c51c846863f0dec8a 100644 (file)
@@ -19,7 +19,7 @@ DECLARE_GLOBAL_DATA_PTR;
 static const struct pl01x_serial_platdata serial_platdata = {
        .base = V2M_UART0,
        .type = TYPE_PL011,
-       .clock = 2400 * 1000,
+       .clock = CONFIG_PL011_CLOCK,
 };
 
 U_BOOT_DEVICE(vexpress_serials) = {
diff --git a/board/astro/mcf5373l/u-boot.lds b/board/astro/mcf5373l/u-boot.lds
deleted file mode 100644 (file)
index 8ef0620..0000000
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * (C) Copyright 2000
- * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
- *
- * SPDX-License-Identifier:    GPL-2.0+
- */
-
-OUTPUT_ARCH(m68k)
-
-SECTIONS
-{
-  /* Read-only sections, merged into text segment: */
-  .text      :
-  {
-    arch/m68k/cpu/mcf532x/start.o              (.text*)
-
-    . = DEFINED(env_offset) ? env_offset : .;
-    common/env_embedded.o      (.text*)
-
-    *(.text*)
-  }
-  _etext = .;
-  PROVIDE (etext = .);
-  .rodata    :
-  {
-    *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*)))
-  }
-
-  /* Read-write section, merged into data segment: */
-  . = (. + 0x00FF) & 0xFFFFFF00;
-  _erotext = .;
-  PROVIDE (erotext = .);
-
-  .reloc   :
-  {
-    __got_start = .;
-    KEEP(*(.got))
-    __got_end = .;
-    _GOT2_TABLE_ = .;
-    KEEP(*(.got2))
-    _FIXUP_TABLE_ = .;
-    KEEP(*(.fixup))
-  }
-  __got2_entries = (_FIXUP_TABLE_ - _GOT2_TABLE_) >>2;
-  __fixup_entries = (. - _FIXUP_TABLE_)>>2;
-
-  .data    :
-  {
-    *(.data*)
-    *(.sdata*)
-  }
-  _edata  =  .;
-  PROVIDE (edata = .);
-
-  . = .;
-
-  . = ALIGN(4);
-  .u_boot_list : {
-       KEEP(*(SORT(.u_boot_list*)));
-  }
-
-  . = .;
-  __start___ex_table = .;
-  __ex_table : { *(__ex_table) }
-  __stop___ex_table = .;
-
-  . = ALIGN(256);
-  __init_begin = .;
-  .text.init : { *(.text.init) }
-  .data.init : { *(.data.init) }
-  . = ALIGN(256);
-  __init_end = .;
-
-  __bss_start = .;
-  .bss       :
-  {
-   _sbss = .;
-   *(.sbss*)
-   *(.bss*)
-   *(COMMON)
-   . = ALIGN(4);
-   _ebss = .;
-  }
-  __bss_end = . ;
-  PROVIDE (end = .);
-}
diff --git a/board/cobra5272/u-boot.lds b/board/cobra5272/u-boot.lds
deleted file mode 100644 (file)
index e91b7e1..0000000
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * (C) Copyright 2000
- * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
- *
- * SPDX-License-Identifier:    GPL-2.0+
- */
-
-OUTPUT_ARCH(m68k)
-
-SECTIONS
-{
-  .text      :
-  {
-    arch/m68k/cpu/mcf52x2/start.o      (.text*)
-
-    . = DEFINED(env_offset) ? env_offset : .;
-    common/env_embedded.o      (.text)
-
-    *(.text*)
-  }
-  _etext = .;
-  PROVIDE (etext = .);
-  .rodata    :
-  {
-    *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*)))
-  }
-
-  /* Read-write section, merged into data segment: */
-  . = (. + 0x00FF) & 0xFFFFFF00;
-  _erotext = .;
-  PROVIDE (erotext = .);
-
-  .reloc   :
-  {
-    __got_start = .;
-    KEEP(*(.got))
-    __got_end = .;
-    _GOT2_TABLE_ = .;
-    KEEP(*(.got2))
-    _FIXUP_TABLE_ = .;
-    KEEP(*(.fixup))
-  }
-  __got2_entries = (_FIXUP_TABLE_ - _GOT2_TABLE_) >>2;
-  __fixup_entries = (. - _FIXUP_TABLE_)>>2;
-
-  .data    :
-  {
-    *(.data*)
-    *(.sdata*)
-  }
-  _edata  =  .;
-  PROVIDE (edata = .);
-
-  . = .;
-
-  . = ALIGN(4);
-  .u_boot_list : {
-       KEEP(*(SORT(.u_boot_list*)));
-  }
-
-  . = .;
-  __start___ex_table = .;
-  __ex_table : { *(__ex_table) }
-  __stop___ex_table = .;
-
-  . = ALIGN(256);
-  __init_begin = .;
-  .text.init : { *(.text.init) }
-  .data.init : { *(.data.init) }
-  . = ALIGN(256);
-  __init_end = .;
-
-  __bss_start = .;
-  .bss (NOLOAD)      :
-  {
-   _sbss = .;
-   *(.bss*)
-   *(.sbss*)
-   *(COMMON)
-   . = ALIGN(4);
-   _ebss = .;
-  }
-  __bss_end = . ;
-  PROVIDE (end = .);
-}
index 1108e4b164fea77b0c0e0704fc4449a455ecbef1..33bfcc3558ef33f0472e076b78a3ca40445bbee5 100644 (file)
@@ -23,3 +23,16 @@ config SYS_CONFIG_NAME
        default "da850evm"
 
 endif
+
+if TARGET_OMAPL138_LCDK
+
+config SYS_BOARD
+       default "da8xxevm"
+
+config SYS_VENDOR
+       default "davinci"
+
+config SYS_CONFIG_NAME
+       default "omapl138_lcdk"
+
+endif
index 10c4e2ffc0b09cd390dec9563947abbb934571fc..f32ce6633ad9e15dbce7969efd25dd25276e5e71 100644 (file)
@@ -12,3 +12,9 @@ F:    include/configs/da850evm.h
 F:     configs/da850_am18xxevm_defconfig
 F:     configs/da850evm_defconfig
 F:     configs/da850evm_direct_nor_defconfig
+
+OMAPL138_LCDK BOARD
+M:     Peter Howard <phoward@gme.net.au>
+S:     Maintained
+F:     include/configs/omap1l38_lcdk.h
+F:     configs/omapl138_lcdk_defconfig
index 4da509b5e19a4c4674cecf9195edb1100e2008fb..93e1f1d0708377e6d47311f54f1a9d66cf12ce14 100644 (file)
@@ -9,3 +9,4 @@
 
 obj-$(CONFIG_MACH_DAVINCI_DA830_EVM)   += da830evm.o
 obj-$(CONFIG_MACH_DAVINCI_DA850_EVM)   += da850evm.o
+obj-$(CONFIG_MACH_OMAPL138_LCDK) += omapl138_lcdk.o
diff --git a/board/davinci/da8xxevm/README.omapl138-lcdk b/board/davinci/da8xxevm/README.omapl138-lcdk
new file mode 100644 (file)
index 0000000..ea0c53d
--- /dev/null
@@ -0,0 +1,28 @@
+Summary
+=======
+This README assumes you have read README.da850.  It contains some additional
+information specific to building the omapl138-lcdk.  The AIS file as generated
+by the build is, currently, not useable due to differences in the flash
+available on this board, as compared to the da850evm boards.
+
+Flash Differences
+=================
+Refer to the discussion in [1] for more detail - basically the da850evm uses
+SPI flash whereas the lcdk uses NAND flash to store the bootloader, and
+the support isn't there in the SPL code.
+
+It should be possible to add the support in the SPL code should someone be
+sufficiently motivated.
+
+Using the built image
+=====================
+The output image to use is u-boot.bin.  This needs to be converted to an
+AIS file as described in [1] and then flashed using the utitilty linked to
+there and also described in README.da850.  You _may_ be able to write using
+u-boot itself, but the commands in README.da850 won't work as they write to
+SPI rather than NAND.
+
+Links
+=====
+[1]
+ http://e2e.ti.com/support/dsp/omap_applications_processors/f/42/t/386829
\ No newline at end of file
diff --git a/board/davinci/da8xxevm/omapl138_lcdk.c b/board/davinci/da8xxevm/omapl138_lcdk.c
new file mode 100644 (file)
index 0000000..bef2570
--- /dev/null
@@ -0,0 +1,383 @@
+/*
+ * Copyright (C) 2012 Texas Instruments Incorporated - http://www.ti.com/
+ *
+ * Based on da850evm.c. Original Copyrights follow:
+ *
+ * Copyright (C) 2009 Nick Thompson, GE Fanuc, Ltd. <nick.thompson@gefanuc.com>
+ * Copyright (C) 2007 Sergey Kubushyn <ksi@koi8.net>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <common.h>
+#include <i2c.h>
+#include <net.h>
+#include <netdev.h>
+#include <spi.h>
+#include <spi_flash.h>
+#include <asm/arch/hardware.h>
+#include <asm/ti-common/davinci_nand.h>
+#include <asm/io.h>
+#include <asm/errno.h>
+#include <asm/arch/davinci_misc.h>
+#ifdef CONFIG_DAVINCI_MMC
+#include <mmc.h>
+#include <asm/arch/sdmmc_defs.h>
+#endif
+
+DECLARE_GLOBAL_DATA_PTR;
+
+#define pinmux(x)      (&davinci_syscfg_regs->pinmux[x])
+
+#ifdef CONFIG_DAVINCI_MMC
+/* MMC0 pin muxer settings */
+const struct pinmux_config mmc0_pins[] = {
+       /* GP0[11] is required for SD to work on Rev 3 EVMs */
+       { pinmux(0),  8, 4 },   /* GP0[11] */
+       { pinmux(10), 2, 0 },   /* MMCSD0_CLK */
+       { pinmux(10), 2, 1 },   /* MMCSD0_CMD */
+       { pinmux(10), 2, 2 },   /* MMCSD0_DAT_0 */
+       { pinmux(10), 2, 3 },   /* MMCSD0_DAT_1 */
+       { pinmux(10), 2, 4 },   /* MMCSD0_DAT_2 */
+       { pinmux(10), 2, 5 },   /* MMCSD0_DAT_3 */
+       /* LCDK supports only 4-bit mode, remaining pins are not configured */
+};
+#endif
+
+/* UART pin muxer settings */
+static const struct pinmux_config uart_pins[] = {
+       { pinmux(0), 4, 6 },
+       { pinmux(0), 4, 7 },
+       { pinmux(4), 2, 4 },
+       { pinmux(4), 2, 5 }
+};
+
+#ifdef CONFIG_DRIVER_TI_EMAC
+static const struct pinmux_config emac_pins[] = {
+       { pinmux(2), 8, 1 },
+       { pinmux(2), 8, 2 },
+       { pinmux(2), 8, 3 },
+       { pinmux(2), 8, 4 },
+       { pinmux(2), 8, 5 },
+       { pinmux(2), 8, 6 },
+       { pinmux(2), 8, 7 },
+       { pinmux(3), 8, 0 },
+       { pinmux(3), 8, 1 },
+       { pinmux(3), 8, 2 },
+       { pinmux(3), 8, 3 },
+       { pinmux(3), 8, 4 },
+       { pinmux(3), 8, 5 },
+       { pinmux(3), 8, 6 },
+       { pinmux(3), 8, 7 },
+       { pinmux(4), 8, 0 },
+       { pinmux(4), 8, 1 }
+};
+#endif /* CONFIG_DRIVER_TI_EMAC */
+
+/* I2C pin muxer settings */
+static const struct pinmux_config i2c_pins[] = {
+       { pinmux(4), 2, 2 },
+       { pinmux(4), 2, 3 }
+};
+
+#ifdef CONFIG_NAND_DAVINCI
+const struct pinmux_config nand_pins[] = {
+       { pinmux(7), 1, 1 },
+       { pinmux(7), 1, 2 },
+       { pinmux(7), 1, 4 },
+       { pinmux(7), 1, 5 },
+       { pinmux(8), 1, 0 },
+       { pinmux(8), 1, 1 },
+       { pinmux(8), 1, 2 },
+       { pinmux(8), 1, 3 },
+       { pinmux(8), 1, 4 },
+       { pinmux(8), 1, 5 },
+       { pinmux(8), 1, 6 },
+       { pinmux(8), 1, 7 },
+       { pinmux(9), 1, 0 },
+       { pinmux(9), 1, 1 },
+       { pinmux(9), 1, 2 },
+       { pinmux(9), 1, 3 },
+       { pinmux(9), 1, 4 },
+       { pinmux(9), 1, 5 },
+       { pinmux(9), 1, 6 },
+       { pinmux(9), 1, 7 },
+       { pinmux(12), 1, 5 },
+       { pinmux(12), 1, 6 }
+};
+
+#endif
+
+#ifdef CONFIG_DRIVER_TI_EMAC_USE_RMII
+#define HAS_RMII 1
+#else
+#define HAS_RMII 0
+#endif
+
+const struct pinmux_resource pinmuxes[] = {
+       PINMUX_ITEM(uart_pins),
+       PINMUX_ITEM(i2c_pins),
+#ifdef CONFIG_NAND_DAVINCI
+       PINMUX_ITEM(nand_pins),
+#endif
+};
+
+const int pinmuxes_size = ARRAY_SIZE(pinmuxes);
+
+const struct lpsc_resource lpsc[] = {
+       { DAVINCI_LPSC_AEMIF }, /* NAND, NOR */
+       { DAVINCI_LPSC_SPI1 },  /* Serial Flash */
+       { DAVINCI_LPSC_EMAC },  /* image download */
+       { DAVINCI_LPSC_UART2 }, /* console */
+       { DAVINCI_LPSC_GPIO },
+#ifdef CONFIG_DAVINCI_MMC
+       { DAVINCI_LPSC_MMC_SD },
+#endif
+};
+
+const int lpsc_size = ARRAY_SIZE(lpsc);
+
+#ifndef CONFIG_DA850_EVM_MAX_CPU_CLK
+#define CONFIG_DA850_EVM_MAX_CPU_CLK   456000000
+#endif
+
+/*
+ * get_board_rev() - setup to pass kernel board revision information
+ * Returns:
+ * bit[0-3]    Maximum cpu clock rate supported by onboard SoC
+ *             0000b - 300 MHz
+ *             0001b - 372 MHz
+ *             0010b - 408 MHz
+ *             0011b - 456 MHz
+ */
+u32 get_board_rev(void)
+{
+       return 0;
+}
+
+int board_early_init_f(void)
+{
+       /*
+        * Power on required peripherals
+        * ARM does not have access by default to PSC0 and PSC1
+        * assuming here that the DSP bootloader has set the IOPU
+        * such that PSC access is available to ARM
+        */
+       if (da8xx_configure_lpsc_items(lpsc, ARRAY_SIZE(lpsc)))
+               return 1;
+
+       return 0;
+}
+
+int board_init(void)
+{
+#ifndef CONFIG_USE_IRQ
+       irq_init();
+#endif
+
+       /* arch number of the board */
+       gd->bd->bi_arch_number = MACH_TYPE_OMAPL138_LCDK;
+
+       /* address of boot parameters */
+       gd->bd->bi_boot_params = LINUX_BOOT_PARAM_ADDR;
+
+
+       /* setup the SUSPSRC for ARM to control emulation suspend */
+       writel(readl(&davinci_syscfg_regs->suspsrc) &
+              ~(DAVINCI_SYSCFG_SUSPSRC_EMAC | DAVINCI_SYSCFG_SUSPSRC_I2C |
+                DAVINCI_SYSCFG_SUSPSRC_SPI1 | DAVINCI_SYSCFG_SUSPSRC_TIMER0 |
+                DAVINCI_SYSCFG_SUSPSRC_UART2),
+              &davinci_syscfg_regs->suspsrc);
+
+       /* configure pinmux settings */
+       if (davinci_configure_pin_mux_items(pinmuxes, ARRAY_SIZE(pinmuxes)))
+               return 1;
+
+#ifdef CONFIG_NAND_DAVINCI
+       /*
+        * NAND CS setup - cycle counts based on da850evm NAND timings in the
+        * Linux kernel @ 25MHz EMIFA
+        */
+       writel((DAVINCI_ABCR_WSETUP(15) |
+               DAVINCI_ABCR_WSTROBE(63) |
+               DAVINCI_ABCR_WHOLD(7) |
+               DAVINCI_ABCR_RSETUP(15) |
+               DAVINCI_ABCR_RSTROBE(63) |
+               DAVINCI_ABCR_RHOLD(7) |
+               DAVINCI_ABCR_TA(3) |
+               DAVINCI_ABCR_ASIZE_16BIT),
+              &davinci_emif_regs->ab2cr); /* CS3 */
+#endif
+
+
+#ifdef CONFIG_DAVINCI_MMC
+       if (davinci_configure_pin_mux(mmc0_pins, ARRAY_SIZE(mmc0_pins)) != 0)
+               return 1;
+#endif
+
+#ifdef CONFIG_DRIVER_TI_EMAC
+       if (davinci_configure_pin_mux(emac_pins, ARRAY_SIZE(emac_pins)) != 0)
+               return 1;
+       davinci_emac_mii_mode_sel(HAS_RMII);
+#endif /* CONFIG_DRIVER_TI_EMAC */
+
+       /* enable the console UART */
+       writel((DAVINCI_UART_PWREMU_MGMT_FREE | DAVINCI_UART_PWREMU_MGMT_URRST |
+               DAVINCI_UART_PWREMU_MGMT_UTRST),
+              &davinci_uart2_ctrl_regs->pwremu_mgmt);
+
+       return 0;
+}
+
+#ifdef CONFIG_DRIVER_TI_EMAC
+
+/*
+ * Initializes on-board ethernet controllers.
+ */
+int board_eth_init(bd_t *bis)
+{
+       if (!davinci_emac_initialize()) {
+               printf("Error: Ethernet init failed!\n");
+               return -1;
+       }
+
+       return 0;
+}
+
+#endif /* CONFIG_DRIVER_TI_EMAC */
+
+#define CFG_MAC_ADDR_SPI_BUS   0
+#define CFG_MAC_ADDR_SPI_CS    0
+#define CFG_MAC_ADDR_SPI_MAX_HZ        CONFIG_SF_DEFAULT_SPEED
+#define CFG_MAC_ADDR_SPI_MODE  SPI_MODE_3
+
+#define CFG_MAC_ADDR_OFFSET    (flash->size - SZ_64K)
+
+static int  get_mac_addr(u8 *addr)
+{
+       /* Need to find a way to get MAC ADDRESS */
+       return 0;
+}
+
+void dsp_lpsc_on(unsigned domain, unsigned int id)
+{
+       dv_reg_p mdstat, mdctl, ptstat, ptcmd;
+       struct davinci_psc_regs *psc_regs;
+
+       psc_regs = davinci_psc0_regs;
+       mdstat = &psc_regs->psc0.mdstat[id];
+       mdctl = &psc_regs->psc0.mdctl[id];
+       ptstat = &psc_regs->ptstat;
+       ptcmd = &psc_regs->ptcmd;
+
+       while (*ptstat & (0x1 << domain))
+               ;
+
+       if ((*mdstat & 0x1f) == 0x03)
+               return;                 /* Already on and enabled */
+
+       *mdctl |= 0x03;
+
+       *ptcmd = 0x1 << domain;
+
+       while (*ptstat & (0x1 << domain))
+               ;
+       while ((*mdstat & 0x1f) != 0x03)
+               ;               /* Probably an overkill... */
+}
+
+static void dspwake(void)
+{
+       unsigned *resetvect = (unsigned *)DAVINCI_L3CBARAM_BASE;
+
+       /* if the device is ARM only, return */
+       if ((REG(CHIP_REV_ID_REG) & 0x3f) == 0x10)
+               return;
+
+       if (!strcmp(getenv("dspwake"), "no"))
+               return;
+
+       *resetvect++ = 0x1E000; /* DSP Idle */
+       /* clear out the next 10 words as NOP */
+       memset(resetvect, 0, sizeof(unsigned) * 10);
+
+       /* setup the DSP reset vector */
+       REG(HOST1CFG) = DAVINCI_L3CBARAM_BASE;
+
+       dsp_lpsc_on(1, DAVINCI_LPSC_GEM);
+       REG(PSC0_MDCTL + (15 * 4)) |= 0x100;
+}
+
+#ifdef CONFIG_DRIVER_TI_EMAC_USE_RMII
+/**
+ * rmii_hw_init
+ *
+ */
+int rmii_hw_init(void)
+{
+       return 0;
+}
+#endif /* CONFIG_DRIVER_TI_EMAC_USE_RMII */
+
+int misc_init_r(void)
+{
+       uint8_t tmp[20], addr[10];
+
+
+       if (getenv("ethaddr") == NULL) {
+               /* Read Ethernet MAC address from EEPROM */
+               if (dvevm_read_mac_address(addr)) {
+                       /* Set Ethernet MAC address from EEPROM */
+                       davinci_sync_env_enetaddr(addr);
+               } else {
+                       get_mac_addr(addr);
+               }
+
+               if (is_multicast_ethaddr(addr) || is_zero_ethaddr(addr)) {
+                       printf("Invalid MAC address read.\n");
+                       return -EINVAL;
+               }
+               sprintf((char *)tmp, "%02x:%02x:%02x:%02x:%02x:%02x", addr[0],
+                               addr[1], addr[2], addr[3], addr[4], addr[5]);
+
+               setenv("ethaddr", (char *)tmp);
+       }
+#ifdef CONFIG_DRIVER_TI_EMAC_USE_RMII
+       /* Select RMII fucntion through the expander */
+       if (rmii_hw_init())
+               printf("RMII hardware init failed!!!\n");
+#endif
+
+       dspwake();
+
+       return 0;
+}
+
+#ifdef CONFIG_DAVINCI_MMC
+static struct davinci_mmc mmc_sd0 = {
+       .reg_base = (struct davinci_mmc_regs *)DAVINCI_MMC_SD0_BASE,
+       .host_caps = MMC_MODE_4BIT,     /* DA850 supports only 4-bit SD/MMC */
+       .voltages = MMC_VDD_32_33 | MMC_VDD_33_34,
+       .version = MMC_CTLR_VERSION_2,
+};
+
+int board_mmc_init(bd_t *bis)
+{
+       mmc_sd0.input_clk = clk_get(DAVINCI_MMCSD_CLKID);
+
+       /* Add slot-0 to mmc subsystem */
+       return davinci_mmc_init(bis, &mmc_sd0);
+}
+#endif
index 36a68dbc4dba95ae0990c9f3a900a4b487f5ee85..586daccb4a0ba16c5a7b04fae1876d90328b5d66 100644 (file)
@@ -36,9 +36,9 @@ DECLARE_GLOBAL_DATA_PTR;
 
 int board_early_init_f(void)
 {
-       struct fsl_ifc *ifc = (void *)CONFIG_SYS_IFC_ADDR;
+       struct fsl_ifc ifc = {(void *)CONFIG_SYS_IFC_ADDR, (void *)NULL};
 
-       setbits_be32(&ifc->ifc_gcr, 1 << IFC_GCR_TBCTL_TRN_TIME_SHIFT);
+       setbits_be32(&ifc.gregs->ifc_gcr, 1 << IFC_GCR_TBCTL_TRN_TIME_SHIFT);
 
        return 0;
 }
index d75770969b1891f56dea3b077a5e77377999b037..f42d373dafbbb5f6fbb57239bec8a073e204c0e4 100644 (file)
@@ -38,10 +38,10 @@ int checkboard(void)
 
 int board_early_init_f(void)
 {
-       struct fsl_ifc *ifc = (void *)CONFIG_SYS_IFC_ADDR;
+       struct fsl_ifc ifc = {(void *)CONFIG_SYS_IFC_ADDR, (void *)NULL};
 
        /* Clock configuration to access CPLD using IFC(GPCM) */
-       setbits_be32(&ifc->ifc_gcr, 1 << IFC_GCR_TBCTL_TRN_TIME_SHIFT);
+       setbits_be32(&ifc.gregs->ifc_gcr, 1 << IFC_GCR_TBCTL_TRN_TIME_SHIFT);
 
        return 0;
 }
index 7181cac291d3e44e35514f33c1502d2359899708..87d05780fe08701d6a36fa0f6b146b791c0fc35c 100644 (file)
@@ -74,8 +74,7 @@ obj-$(CONFIG_P5040DS) += p_corenet/
 obj-$(CONFIG_LS102XA_NS_ACCESS)        += ns_access.o
 
 ifdef CONFIG_SECURE_BOOT
-obj-y += fsl_validate.o
-obj-$(CONFIG_CMD_ESBC_VALIDATE) += cmd_esbc_validate.o
+obj-$(CONFIG_CMD_ESBC_VALIDATE) += fsl_validate.o cmd_esbc_validate.o
 endif
 
 endif
index 8edf8788edc1dcc69b774f77acd54dff758d4f4b..c06b86291a3958cabbfcee83f27b58be9f058811 100644 (file)
@@ -19,6 +19,9 @@
 #endif
 
 #include "sleep.h"
+#ifdef CONFIG_U_QE
+#include "../../../drivers/qe/qe.h"
+#endif
 
 DECLARE_GLOBAL_DATA_PTR;
 
@@ -72,6 +75,9 @@ static void dp_resume_prepare(void)
        board_sleep_prepare();
        armv7_init_nonsec();
        cleanup_before_linux();
+#ifdef CONFIG_U_QE
+       u_qe_resume();
+#endif
 }
 
 int fsl_dp_resume(void)
index 8500ba583838f5a46c6a3f7d45913a0fee800696..8bbe85bb3ba616574881da7d13b311c1d61ed105 100644 (file)
@@ -8,6 +8,16 @@
 #include <command.h>
 #include <fsl_validate.h>
 
+static int do_esbc_halt(cmd_tbl_t *cmdtp, int flag, int argc,
+                               char * const argv[])
+{
+       printf("Core is entering spin loop.\n");
+loop:
+       goto loop;
+
+       return 0;
+}
+
 static int do_esbc_validate(cmd_tbl_t *cmdtp, int flag, int argc,
                                char * const argv[])
 {
@@ -32,3 +42,9 @@ U_BOOT_CMD(
        "Validates signature on a given image using RSA verification",
        esbc_validate_help_text
 );
+
+U_BOOT_CMD(
+       esbc_halt,      1,      0,      do_esbc_halt,
+       "Put the core in spin loop ",
+       ""
+);
index f924e7f482dc329d0dce0a9ffd5229dfc5ab294a..9e4132c64edc21437f59056b7c2ca4b8ba606071 100644 (file)
@@ -7,6 +7,9 @@
 #include <common.h>
 #include <asm/immap_85xx.h>
 #include "sleep.h"
+#ifdef CONFIG_U_QE
+#include "../../../drivers/qe/qe.h"
+#endif
 
 DECLARE_GLOBAL_DATA_PTR;
 
@@ -65,6 +68,11 @@ static void dp_resume_prepare(void)
        disable_cpc_sram();
 #endif
        enable_cpc();
+
+#ifdef CONFIG_U_QE
+       u_qe_resume();
+#endif
+
 }
 
 int fsl_dp_resume(void)
index a49e3006d9d7897358cfa4d6d7baecf401df99e5..9f6b0e7f31ed36e0be7844cd11de555f6d56ba00 100644 (file)
@@ -138,24 +138,23 @@ void qixis_bank_reset(void)
        QIXIS_WRITE(rcfg_ctl, QIXIS_RCFG_CTL_RECONFIG_START);
 }
 
-/* Set the boot bank to the power-on default bank */
-void clear_altbank(void)
+static void __maybe_unused set_lbmap(int lbmap)
 {
        u8 reg;
 
        reg = QIXIS_READ(brdcfg[0]);
-       reg = (reg & ~QIXIS_LBMAP_MASK) | QIXIS_LBMAP_DFLTBANK;
+       reg = (reg & ~QIXIS_LBMAP_MASK) | lbmap;
        QIXIS_WRITE(brdcfg[0], reg);
 }
 
-/* Set the boot bank to the alternate bank */
-void set_altbank(void)
+static void __maybe_unused set_rcw_src(int rcw_src)
 {
        u8 reg;
 
-       reg = QIXIS_READ(brdcfg[0]);
-       reg = (reg & ~QIXIS_LBMAP_MASK) | QIXIS_LBMAP_ALTBANK;
-       QIXIS_WRITE(brdcfg[0], reg);
+       reg = QIXIS_READ(dutcfg[1]);
+       reg = (reg & ~1) | (rcw_src & 1);
+       QIXIS_WRITE(dutcfg[1], reg);
+       QIXIS_WRITE(dutcfg[0], (rcw_src >> 1) & 0xff);
 }
 
 static void qixis_dump_regs(void)
@@ -201,11 +200,22 @@ int qixis_reset_cmd(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
        int i;
 
        if (argc <= 1) {
-               clear_altbank();
+               set_lbmap(QIXIS_LBMAP_DFLTBANK);
                qixis_reset();
        } else if (strcmp(argv[1], "altbank") == 0) {
-               set_altbank();
+               set_lbmap(QIXIS_LBMAP_ALTBANK);
                qixis_bank_reset();
+       } else if (strcmp(argv[1], "nand") == 0) {
+#ifdef QIXIS_LBMAP_NAND
+               QIXIS_WRITE(rst_ctl, 0x30);
+               QIXIS_WRITE(rcfg_ctl, 0);
+               set_lbmap(QIXIS_LBMAP_NAND);
+               set_rcw_src(QIXIS_RCW_SRC_NAND);
+               QIXIS_WRITE(rcfg_ctl, 0x20);
+               QIXIS_WRITE(rcfg_ctl, 0x21);
+#else
+               printf("Not implemented\n");
+#endif
        } else if (strcmp(argv[1], "watchdog") == 0) {
                static char *period[9] = {"2s", "4s", "8s", "16s", "32s",
                                          "1min", "2min", "4min", "8min"};
@@ -244,6 +254,7 @@ U_BOOT_CMD(
        "Reset the board using the FPGA sequencer",
        "- hard reset to default bank\n"
        "qixis_reset altbank - reset to alternate bank\n"
+       "qixis_reset nand - reset to nand\n"
        "qixis watchdog <watchdog_period> - set the watchdog period\n"
        "       period: 1s 2s 4s 8s 16s 32s 1min 2min 4min 8min\n"
        "qixis_reset dump - display the QIXIS registers\n"
index 661526b99330ecb5093ae2b0bcd55b6d3d40ca47..820d3223c230be2c94435c5620445d9936ab16a1 100644 (file)
@@ -5,6 +5,7 @@ F:      board/freescale/ls1021aqds/
 F:     include/configs/ls1021aqds.h
 F:     configs/ls1021aqds_nor_defconfig
 F:     configs/ls1021aqds_ddr4_nor_defconfig
+F:     configs/ls1021aqds_ddr4_nor_lpuart_defconfig
 F:     configs/ls1021aqds_nor_SECURE_BOOT_defconfig
 F:     configs/ls1021aqds_nor_lpuart_defconfig
 F:     configs/ls1021aqds_sdcard_defconfig
index 722b88f1e9f2bc22615dda54ff33d051c39e735d..92f613ad2419304527a358288045e4784a107ae2 100644 (file)
@@ -12,7 +12,6 @@
 #include <asm/arch/clock.h>
 #include <asm/arch/fsl_serdes.h>
 #include <asm/arch/ls102xa_stream_id.h>
-#include <asm/pcie_layerscape.h>
 #include <hwconfig.h>
 #include <mmc.h>
 #include <fsl_esdhc.h>
@@ -138,6 +137,17 @@ unsigned long get_board_ddr_clk(void)
        return 66666666;
 }
 
+unsigned int get_soc_major_rev(void)
+{
+       struct ccsr_gur __iomem *gur = (void *)(CONFIG_SYS_FSL_GUTS_ADDR);
+       unsigned int svr, major;
+
+       svr = in_be32(&gur->svr);
+       major = SVR_MAJ(svr);
+
+       return major;
+}
+
 int select_i2c_ch_pca9547(u8 ch)
 {
        int ret;
@@ -181,6 +191,7 @@ int board_early_init_f(void)
 {
        struct ccsr_scfg *scfg = (struct ccsr_scfg *)CONFIG_SYS_FSL_SCFG_ADDR;
        struct ccsr_cci400 *cci = (struct ccsr_cci400 *)CONFIG_SYS_CCI400_ADDR;
+       unsigned int major;
 
 #ifdef CONFIG_TSEC_ENET
        out_be32(&scfg->etsecdmamcr, SCFG_ETSECDMAMCR_LE_BD_FR);
@@ -205,19 +216,22 @@ int board_early_init_f(void)
        out_le32(&cci->slave[4].snoop_ctrl,
                 CCI400_DVM_MESSAGE_REQ_EN | CCI400_SNOOP_REQ_EN);
 
-       /*
-        * Set CCI-400 Slave interface S1, S2 Shareable Override Register
-        * All transactions are treated as non-shareable
-        */
-       out_le32(&cci->slave[1].sha_ord, CCI400_SHAORD_NON_SHAREABLE);
-       out_le32(&cci->slave[2].sha_ord, CCI400_SHAORD_NON_SHAREABLE);
-
-       /* Workaround for the issue that DDR could not respond to
-        * barrier transaction which is generated by executing DSB/ISB
-        * instruction. Set CCI-400 control override register to
-        * terminate the barrier transaction. After DDR is initialized,
-        * allow barrier transaction to DDR again */
-       out_le32(&cci->ctrl_ord, CCI400_CTRLORD_TERM_BARRIER);
+       major = get_soc_major_rev();
+       if (major == SOC_MAJOR_VER_1_0) {
+               /*
+                * Set CCI-400 Slave interface S1, S2 Shareable Override
+                * Register All transactions are treated as non-shareable
+                */
+               out_le32(&cci->slave[1].sha_ord, CCI400_SHAORD_NON_SHAREABLE);
+               out_le32(&cci->slave[2].sha_ord, CCI400_SHAORD_NON_SHAREABLE);
+
+               /* Workaround for the issue that DDR could not respond to
+                * barrier transaction which is generated by executing DSB/ISB
+                * instruction. Set CCI-400 control override register to
+                * terminate the barrier transaction. After DDR is initialized,
+                * allow barrier transaction to DDR again */
+               out_le32(&cci->ctrl_ord, CCI400_CTRLORD_TERM_BARRIER);
+       }
 
 #if defined(CONFIG_DEEP_SLEEP)
        if (is_warm_boot())
@@ -231,6 +245,7 @@ int board_early_init_f(void)
 void board_init_f(ulong dummy)
 {
        struct ccsr_cci400 *cci = (struct ccsr_cci400 *)CONFIG_SYS_CCI400_ADDR;
+       unsigned int major;
 
 #ifdef CONFIG_NAND_BOOT
        struct ccsr_gur __iomem *gur = (void *)CONFIG_SYS_FSL_GUTS_ADDR;
@@ -267,7 +282,10 @@ void board_init_f(ulong dummy)
 #ifdef CONFIG_SPL_I2C_SUPPORT
        i2c_init_all();
 #endif
-       out_le32(&cci->ctrl_ord, CCI400_CTRLORD_TERM_BARRIER);
+
+       major = get_soc_major_rev();
+       if (major == SOC_MAJOR_VER_1_0)
+               out_le32(&cci->ctrl_ord, CCI400_CTRLORD_TERM_BARRIER);
 
        dram_init();
 
@@ -548,10 +566,14 @@ struct smmu_stream_id dev_stream_id[] = {
 int board_init(void)
 {
        struct ccsr_cci400 *cci = (struct ccsr_cci400 *)CONFIG_SYS_CCI400_ADDR;
+       unsigned int major;
 
-       /* Set CCI-400 control override register to
-        * enable barrier transaction */
-       out_le32(&cci->ctrl_ord, CCI400_CTRLORD_EN_BARRIER);
+       major = get_soc_major_rev();
+       if (major == SOC_MAJOR_VER_1_0) {
+               /* Set CCI-400 control override register to
+                * enable barrier transaction */
+               out_le32(&cci->ctrl_ord, CCI400_CTRLORD_EN_BARRIER);
+       }
 
        select_i2c_ch_pca9547(I2C_MUX_CH_DEFAULT);
 
@@ -580,10 +602,15 @@ int board_init(void)
 void board_sleep_prepare(void)
 {
        struct ccsr_cci400 __iomem *cci = (void *)CONFIG_SYS_CCI400_ADDR;
+       unsigned int major;
+
+       major = get_soc_major_rev();
+       if (major == SOC_MAJOR_VER_1_0) {
+               /* Set CCI-400 control override register to
+                * enable barrier transaction */
+               out_le32(&cci->ctrl_ord, CCI400_CTRLORD_EN_BARRIER);
+       }
 
-       /* Set CCI-400 control override register to
-        * enable barrier transaction */
-       out_le32(&cci->ctrl_ord, CCI400_CTRLORD_EN_BARRIER);
 
 #ifdef CONFIG_LS102XA_NS_ACCESS
        enable_devices_ns_access(ns_dev, ARRAY_SIZE(ns_dev));
@@ -595,8 +622,8 @@ int ft_board_setup(void *blob, bd_t *bd)
 {
        ft_cpu_setup(blob, bd);
 
-#ifdef CONFIG_PCIE_LAYERSCAPE
-       ft_pcie_setup(blob, bd);
+#ifdef CONFIG_PCI
+       ft_pci_setup(blob, bd);
 #endif
 
        return 0;
index fb8525fe59fcbd47dc6c84588356e86218328a84..ed5bd27ec0fbc0b28923b03495d99766160cb36e 100644 (file)
@@ -12,7 +12,7 @@
 #include <asm/arch/clock.h>
 #include <asm/arch/fsl_serdes.h>
 #include <asm/arch/ls102xa_stream_id.h>
-#include <asm/pcie_layerscape.h>
+#include <hwconfig.h>
 #include <mmc.h>
 #include <fsl_esdhc.h>
 #include <fsl_ifc.h>
@@ -54,6 +54,17 @@ DECLARE_GLOBAL_DATA_PTR;
 #define KEEP_STATUS            0x0
 #define NEED_RESET             0x1
 
+#define SOFT_MUX_ON_I2C3_IFC   0x2
+#define SOFT_MUX_ON_CAN3_USB2  0x8
+#define SOFT_MUX_ON_QE_LCD     0x10
+
+#define PIN_I2C3_IFC_MUX_I2C3  0x0
+#define PIN_I2C3_IFC_MUX_IFC   0x1
+#define PIN_CAN3_USB2_MUX_USB2 0x0
+#define PIN_CAN3_USB2_MUX_CAN3 0x1
+#define PIN_QE_LCD_MUX_LCD     0x0
+#define PIN_QE_LCD_MUX_QE      0x1
+
 struct cpld_data {
        u8 cpld_ver;            /* cpld revision */
        u8 cpld_ver_sub;        /* cpld sub revision */
@@ -122,6 +133,17 @@ int checkboard(void)
        return 0;
 }
 
+unsigned int get_soc_major_rev(void)
+{
+       struct ccsr_gur __iomem *gur = (void *)(CONFIG_SYS_FSL_GUTS_ADDR);
+       unsigned int svr, major;
+
+       svr = in_be32(&gur->svr);
+       major = SVR_MAJ(svr);
+
+       return major;
+}
+
 void ddrmc_init(void)
 {
        struct ccsr_ddr *ddr = (struct ccsr_ddr *)CONFIG_SYS_FSL_DDR_ADDR;
@@ -260,10 +282,73 @@ int config_serdes_mux(void)
 }
 #endif
 
+#ifndef CONFIG_QSPI_BOOT
+int config_board_mux(void)
+{
+       struct cpld_data *cpld_data = (void *)(CONFIG_SYS_CPLD_BASE);
+       int conflict_flag;
+
+       conflict_flag = 0;
+       if (hwconfig("i2c3")) {
+               conflict_flag++;
+               cpld_data->soft_mux_on |= SOFT_MUX_ON_I2C3_IFC;
+               cpld_data->i2c3_ifc_mux = PIN_I2C3_IFC_MUX_I2C3;
+       }
+
+       if (hwconfig("ifc")) {
+               conflict_flag++;
+               /* some signals can not enable simultaneous*/
+               if (conflict_flag > 1)
+                       goto conflict;
+               cpld_data->soft_mux_on |= SOFT_MUX_ON_I2C3_IFC;
+               cpld_data->i2c3_ifc_mux = PIN_I2C3_IFC_MUX_IFC;
+       }
+
+       conflict_flag = 0;
+       if (hwconfig("usb2")) {
+               conflict_flag++;
+               cpld_data->soft_mux_on |= SOFT_MUX_ON_CAN3_USB2;
+               cpld_data->can3_usb2_mux = PIN_CAN3_USB2_MUX_USB2;
+       }
+
+       if (hwconfig("can3")) {
+               conflict_flag++;
+               /* some signals can not enable simultaneous*/
+               if (conflict_flag > 1)
+                       goto conflict;
+               cpld_data->soft_mux_on |= SOFT_MUX_ON_CAN3_USB2;
+               cpld_data->can3_usb2_mux = PIN_CAN3_USB2_MUX_CAN3;
+       }
+
+       conflict_flag = 0;
+       if (hwconfig("lcd")) {
+               conflict_flag++;
+               cpld_data->soft_mux_on |= SOFT_MUX_ON_QE_LCD;
+               cpld_data->qe_lcd_mux = PIN_QE_LCD_MUX_LCD;
+       }
+
+       if (hwconfig("qe")) {
+               conflict_flag++;
+               /* some signals can not enable simultaneous*/
+               if (conflict_flag > 1)
+                       goto conflict;
+               cpld_data->soft_mux_on |= SOFT_MUX_ON_QE_LCD;
+               cpld_data->qe_lcd_mux = PIN_QE_LCD_MUX_QE;
+       }
+
+       return 0;
+
+conflict:
+       printf("WARNING: pin conflict! MUX setting may failed!\n");
+       return 0;
+}
+#endif
+
 int board_early_init_f(void)
 {
        struct ccsr_scfg *scfg = (struct ccsr_scfg *)CONFIG_SYS_FSL_SCFG_ADDR;
        struct ccsr_cci400 *cci = (struct ccsr_cci400 *)CONFIG_SYS_CCI400_ADDR;
+       unsigned int major;
 
 #ifdef CONFIG_TSEC_ENET
        out_be32(&scfg->etsecdmamcr, SCFG_ETSECDMAMCR_LE_BD_FR);
@@ -289,12 +374,15 @@ int board_early_init_f(void)
        out_le32(&cci->slave[4].snoop_ctrl,
                 CCI400_DVM_MESSAGE_REQ_EN | CCI400_SNOOP_REQ_EN);
 
-       /*
-        * Set CCI-400 Slave interface S1, S2 Shareable Override Register
-        * All transactions are treated as non-shareable
-        */
-       out_le32(&cci->slave[1].sha_ord, CCI400_SHAORD_NON_SHAREABLE);
-       out_le32(&cci->slave[2].sha_ord, CCI400_SHAORD_NON_SHAREABLE);
+       major = get_soc_major_rev();
+       if (major == SOC_MAJOR_VER_1_0) {
+               /*
+                * Set CCI-400 Slave interface S1, S2 Shareable Override
+                * Register All transactions are treated as non-shareable
+                */
+               out_le32(&cci->slave[1].sha_ord, CCI400_SHAORD_NON_SHAREABLE);
+               out_le32(&cci->slave[2].sha_ord, CCI400_SHAORD_NON_SHAREABLE);
+       }
 
        return 0;
 }
@@ -465,6 +553,10 @@ int board_init(void)
 #if defined(CONFIG_MISC_INIT_R)
 int misc_init_r(void)
 {
+#ifndef CONFIG_QSPI_BOOT
+       config_board_mux();
+#endif
+
 #ifdef CONFIG_FSL_CAAM
        return sec_init();
 #endif
@@ -475,8 +567,8 @@ int ft_board_setup(void *blob, bd_t *bd)
 {
        ft_cpu_setup(blob, bd);
 
-#ifdef CONFIG_PCIE_LAYERSCAPE
-       ft_pcie_setup(blob, bd);
+#ifdef CONFIG_PCI
+       ft_pci_setup(blob, bd);
 #endif
 
        return 0;
index 519d61cb1e8539fba78990c4c0001767021f2676..dd0acf23b23a9d42138a71d266a5ad4a9e44b169 100644 (file)
 #include <asm/io.h>
 #include <fdt_support.h>
 #include <libfdt.h>
+#include <fsl_debug_server.h>
 #include <fsl-mc/fsl_mc.h>
 #include <environment.h>
+#include <asm/arch-fsl-lsch3/soc.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
@@ -30,8 +32,7 @@ int board_init(void)
 
 int board_early_init_f(void)
 {
-       init_early_memctl_regs();       /* tighten IFC timing */
-
+       fsl_lsch3_early_init_f();
        return 0;
 }
 
@@ -54,29 +55,32 @@ int dram_init(void)
        return 0;
 }
 
-int timer_init(void)
+#if defined(CONFIG_ARCH_MISC_INIT)
+int arch_misc_init(void)
 {
-       u32 __iomem *cntcr = (u32 *)CONFIG_SYS_FSL_TIMER_ADDR;
-       u32 __iomem *cltbenr = (u32 *)CONFIG_SYS_FSL_PMU_CLTBENR;
-
-       /* Enable timebase for all clusters.
-        * It is safe to do so even some clusters are not enabled.
-        */
-       out_le32(cltbenr, 0xf);
-
-       /* Enable clock for timer
-        * This is a global setting.
-        */
-       out_le32(cntcr, 0x1);
+#ifdef CONFIG_FSL_DEBUG_SERVER
+       debug_server_init();
+#endif
 
        return 0;
 }
+#endif
 
-/*
- * Board specific reset that is system reset.
- */
-void reset_cpu(ulong addr)
+unsigned long get_dram_size_to_hide(void)
 {
+       unsigned long dram_to_hide = 0;
+
+/* Carve the Debug Server private DRAM block from the end of DRAM */
+#ifdef CONFIG_FSL_DEBUG_SERVER
+       dram_to_hide += debug_server_get_dram_block_size();
+#endif
+
+/* Carve the MC private DRAM block from the end of DRAM */
+#ifdef CONFIG_FSL_MC_ENET
+       dram_to_hide += mc_get_dram_block_size();
+#endif
+
+       return dram_to_hide;
 }
 
 int board_eth_init(bd_t *bis)
@@ -135,6 +139,7 @@ int ft_board_setup(void *blob, bd_t *bd)
 
 #ifdef CONFIG_FSL_MC_ENET
        fdt_fixup_board_enet(blob);
+       fsl_mc_ldpaa_exit(bd);
 #endif
 
        return 0;
diff --git a/board/freescale/ls2085aqds/Kconfig b/board/freescale/ls2085aqds/Kconfig
new file mode 100644 (file)
index 0000000..deb640d
--- /dev/null
@@ -0,0 +1,16 @@
+
+if TARGET_LS2085AQDS
+
+config SYS_BOARD
+       default "ls2085aqds"
+
+config SYS_VENDOR
+       default "freescale"
+
+config SYS_SOC
+       default "fsl-lsch3"
+
+config SYS_CONFIG_NAME
+       default "ls2085aqds"
+
+endif
diff --git a/board/freescale/ls2085aqds/MAINTAINERS b/board/freescale/ls2085aqds/MAINTAINERS
new file mode 100644 (file)
index 0000000..fbed672
--- /dev/null
@@ -0,0 +1,8 @@
+LS2085A BOARD
+M:     Prabhakar Kushwaha <prabhakar@freescale.com>
+S:     Maintained
+F:     board/freescale/ls2085aqds/
+F:     board/freescale/ls2085a/ls2085aqds.c
+F:     include/configs/ls2085aqds.h
+F:     configs/ls2085aqds_defconfig
+F:     configs/ls2085aqds_nand_defconfig
diff --git a/board/freescale/ls2085aqds/Makefile b/board/freescale/ls2085aqds/Makefile
new file mode 100644 (file)
index 0000000..da69a7d
--- /dev/null
@@ -0,0 +1,9 @@
+#
+# Copyright 2015 Freescale Semiconductor
+#
+# SPDX-License-Identifier:     GPL-2.0+
+#
+
+obj-y += ls2085aqds.o
+obj-y += ddr.o
+obj-y += eth.o
diff --git a/board/freescale/ls2085aqds/README b/board/freescale/ls2085aqds/README
new file mode 100644 (file)
index 0000000..fb3938e
--- /dev/null
@@ -0,0 +1,129 @@
+Overview
+--------
+The LS2085A Development System (QDS) is a high-performance computing,
+evaluation, and development platform that supports the QorIQ LS2085A
+Layerscape Architecture processor. The LS2085AQDS provides validation and
+SW development platform for the Freescale LS2085A processor series, with
+a complete debugging environment.
+
+LS2085A SoC Overview
+------------------
+The LS2085A integrated multicore processor combines eight ARM Cortex-A57
+processor cores with high-performance data path acceleration logic and network
+and peripheral bus interfaces required for networking, telecom/datacom,
+wireless infrastructure, and mil/aerospace applications.
+
+The LS2085A SoC includes the following function and features:
+
+ - Eight 64-bit ARM Cortex-A57 CPUs
+ - 1 MB platform cache with ECC
+ - Two 64-bit DDR4 SDRAM memory controllers with ECC and interleaving support
+ - One secondary 32-bit DDR4 SDRAM memory controller, intended for use by
+  the AIOP
+ - Data path acceleration architecture (DPAA2) incorporating acceleration for
+ the following functions:
+   - Packet parsing, classification, and distribution (WRIOP)
+   - Queue and Hardware buffer management for scheduling, packet sequencing, and
+     congestion management, buffer allocation and de-allocation (QBMan)
+   - Cryptography acceleration (SEC) at up to 10 Gbps
+   - RegEx pattern matching acceleration (PME) at up to 10 Gbps
+   - Decompression/compression acceleration (DCE) at up to 20 Gbps
+   - Accelerated I/O processing (AIOP) at up to 20 Gbps
+   - QDMA engine
+ - 16 SerDes lanes at up to 10.3125 GHz
+ - Ethernet interfaces
+   - Up to eight 10 Gbps Ethernet MACs
+   - Up to eight 1 / 2.5 Gbps Ethernet MACs
+ - High-speed peripheral interfaces
+   - Four PCIe 3.0 controllers, one supporting SR-IOV
+ - Additional peripheral interfaces
+   - Two serial ATA (SATA 3.0) controllers
+   - Two high-speed USB 3.0 controllers with integrated PHY
+   - Enhanced secure digital host controller (eSDXC/eMMC)
+   - Serial peripheral interface (SPI) controller
+   - Quad Serial Peripheral Interface (QSPI) Controller
+   - Four I2C controllers
+   - Two DUARTs
+   - Integrated flash controller (IFC 2.0) supporting NAND and NOR flash
+ - Support for hardware virtualization and partitioning enforcement
+ - QorIQ platform's trust architecture 3.0
+ - Service processor (SP) provides pre-boot initialization and secure-boot
+  capabilities
+
+ LS2085AQDS board Overview
+ -----------------------
+ - SERDES Connections, 16 lanes supporting:
+      - PCI Express - 3.0
+      - SGMII, SGMII 2.5
+      - QSGMII
+      - SATA 3.0
+      - XAUI
+      - XFI
+ - DDR Controller
+     - Two ports of 72-bits (8-bits ECC) DDR4. Each port supports four
+       chip-selects and two DIMM connectors. Support is up to 2133MT/s.
+     - One port of 40-bits (8-bits ECC) DDR4 which supports four chip-selects
+       and two DIMM connectors. Support is up to 1600MT/s.
+ -IFC/Local Bus
+    - IFC rev. 2.0 implementation supporting Little Endian connection scheme.
+    - One in-socket 128 MB NOR flash 16-bit data bus
+    - One 512 MB NAND flash with ECC support
+    - IFC Test Port
+    - PromJet Port
+    - FPGA connection
+ - USB 3.0
+    - Two high speed USB 3.0 ports
+    - First USB 3.0 port configured as Host with Type-A connector
+    - Second USB 3.0 port configured as OTG with micro-AB connector
+ - SDHC: PCIe x1 Right Angle connector for supporting following cards
+    - 1/4-/8-bit SD/MMC Legacy CARD supporting 3.3V devices only
+    - 1-/4-/8-bit SD/MMC Card supporting 1.8V devices only
+    - 4-bit eMMC Card Rev 4.4 (1.8V only)
+    - 8-bit eMMC Card Rev 4.5 (1.8V only)
+    - SD Card Rev 2.0 and Rev 3.0
+ - DSPI: 3 high-speed flash Memory for storage
+    - 16 MB high-speed flash Memory for boot code and storage (up to 108MHz)
+    - 8 MB high-speed flash Memory (up to 104 MHz)
+    - 512 MB low-speed flash Memory (up to 40 MHz)
+ - QSPI: via NAND/QSPI Card
+ - 4 I2C controllers
+ - Two SATA onboard connectors
+ - UART
+   - Two 4-pin (HW control) or four 2-pin (SW control) serial ports at up to 115.2 Kbit/s
+   - Two DB9 D-Type connectors supporting one Serial port each
+ - ARM JTAG support
+
+Memory map from core's view
+----------------------------
+0x00_0000_0000 .. 0x00_000F_FFFF       Boot Rom
+0x00_0100_0000 .. 0x00_0FFF_FFFF       CCSR
+0x00_1800_0000 .. 0x00_181F_FFFF       OCRAM
+0x00_3000_0000 .. 0x00_3FFF_FFFF       IFC region #1
+0x00_8000_0000 .. 0x00_FFFF_FFFF       DDR region #1
+0x05_1000_0000 .. 0x05_FFFF_FFFF       IFC region #2
+0x80_8000_0000 .. 0xFF_FFFF_FFFF       DDR region #2
+
+Other addresses are either reserved, or not used directly by u-boot.
+This list should be updated when more addresses are used.
+
+IFC region map from core's view
+-------------------------------
+During boot i.e. IFC Region #1:-
+  0x30000000 - 0x37ffffff : 128MB : NOR flash
+  0x38000000 - 0x3BFFFFFF : 64MB  : Promjet
+  0x3C000000 - 0x40000000 : 64MB  : FPGA etc
+
+After relocate to DDR i.e. IFC Region #2:-
+  0x5_1000_0000..0x5_1fff_ffff Memory Hole
+  0x5_2000_0000..0x5_3fff_ffff IFC CSx (FPGA, NAND and others 512MB)
+  0x5_4000_0000..0x5_7fff_ffff ASIC or others 1GB
+  0x5_8000_0000..0x5_bfff_ffff IFC CS0 1GB (NOR/Promjet)
+  0x5_C000_0000..0x5_ffff_ffff IFC CS1 1GB (NOR/Promjet)
+
+Booting Options
+---------------
+a) Promjet Boot
+b) NOR boot
+c) NAND boot
+d) SD boot
+e) QSPI boot
diff --git a/board/freescale/ls2085aqds/ddr.c b/board/freescale/ls2085aqds/ddr.c
new file mode 100644 (file)
index 0000000..8d71ae1
--- /dev/null
@@ -0,0 +1,196 @@
+/*
+ * Copyright 2015 Freescale Semiconductor, Inc.
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#include <common.h>
+#include <fsl_ddr_sdram.h>
+#include <fsl_ddr_dimm_params.h>
+#include "ddr.h"
+
+DECLARE_GLOBAL_DATA_PTR;
+
+void fsl_ddr_board_options(memctl_options_t *popts,
+                               dimm_params_t *pdimm,
+                               unsigned int ctrl_num)
+{
+       u8 dq_mapping_0, dq_mapping_2, dq_mapping_3;
+       const struct board_specific_parameters *pbsp, *pbsp_highest = NULL;
+       ulong ddr_freq;
+       int slot;
+
+       if (ctrl_num > 2) {
+               printf("Not supported controller number %d\n", ctrl_num);
+               return;
+       }
+
+       for (slot = 0; slot < CONFIG_DIMM_SLOTS_PER_CTLR; slot++) {
+               if (pdimm[slot].n_ranks)
+                       break;
+       }
+
+       if (slot >= CONFIG_DIMM_SLOTS_PER_CTLR)
+               return;
+
+       /*
+        * we use identical timing for all slots. If needed, change the code
+        * to  pbsp = rdimms[ctrl_num] or pbsp = udimms[ctrl_num];
+        */
+       if (popts->registered_dimm_en)
+               pbsp = rdimms[ctrl_num];
+       else
+               pbsp = udimms[ctrl_num];
+
+
+       /* Get clk_adjust, wrlvl_start, wrlvl_ctl, according to the board ddr
+        * freqency and n_banks specified in board_specific_parameters table.
+        */
+       ddr_freq = get_ddr_freq(ctrl_num) / 1000000;
+       while (pbsp->datarate_mhz_high) {
+               if (pbsp->n_ranks == pdimm[slot].n_ranks &&
+                   (pdimm[slot].rank_density >> 30) >= pbsp->rank_gb) {
+                       if (ddr_freq <= pbsp->datarate_mhz_high) {
+                               popts->clk_adjust = pbsp->clk_adjust;
+                               popts->wrlvl_start = pbsp->wrlvl_start;
+                               popts->wrlvl_ctl_2 = pbsp->wrlvl_ctl_2;
+                               popts->wrlvl_ctl_3 = pbsp->wrlvl_ctl_3;
+                               goto found;
+                       }
+                       pbsp_highest = pbsp;
+               }
+               pbsp++;
+       }
+
+       if (pbsp_highest) {
+               printf("Error: board specific timing not found for data rate %lu MT/s\n"
+                       "Trying to use the highest speed (%u) parameters\n",
+                       ddr_freq, pbsp_highest->datarate_mhz_high);
+               popts->clk_adjust = pbsp_highest->clk_adjust;
+               popts->wrlvl_start = pbsp_highest->wrlvl_start;
+               popts->wrlvl_ctl_2 = pbsp->wrlvl_ctl_2;
+               popts->wrlvl_ctl_3 = pbsp->wrlvl_ctl_3;
+       } else {
+               panic("DIMM is not supported by this board");
+       }
+found:
+       debug("Found timing match: n_ranks %d, data rate %d, rank_gb %d\n"
+               "\tclk_adjust %d, wrlvl_start %d, wrlvl_ctrl_2 0x%x, wrlvl_ctrl_3 0x%x\n",
+               pbsp->n_ranks, pbsp->datarate_mhz_high, pbsp->rank_gb,
+               pbsp->clk_adjust, pbsp->wrlvl_start, pbsp->wrlvl_ctl_2,
+               pbsp->wrlvl_ctl_3);
+
+       if (ctrl_num == CONFIG_DP_DDR_CTRL) {
+               /* force DDR bus width to 32 bits */
+               popts->data_bus_width = 1;
+               popts->otf_burst_chop_en = 0;
+               popts->burst_length = DDR_BL8;
+               popts->bstopre = 0;     /* enable auto precharge */
+               /*
+                * Layout optimization results byte mapping
+                * Byte 0 -> Byte ECC
+                * Byte 1 -> Byte 3
+                * Byte 2 -> Byte 2
+                * Byte 3 -> Byte 1
+                * Byte ECC -> Byte 0
+                */
+               dq_mapping_0 = pdimm[slot].dq_mapping[0];
+               dq_mapping_2 = pdimm[slot].dq_mapping[2];
+               dq_mapping_3 = pdimm[slot].dq_mapping[3];
+               pdimm[slot].dq_mapping[0] = pdimm[slot].dq_mapping[8];
+               pdimm[slot].dq_mapping[1] = pdimm[slot].dq_mapping[9];
+               pdimm[slot].dq_mapping[2] = pdimm[slot].dq_mapping[6];
+               pdimm[slot].dq_mapping[3] = pdimm[slot].dq_mapping[7];
+               pdimm[slot].dq_mapping[6] = dq_mapping_2;
+               pdimm[slot].dq_mapping[7] = dq_mapping_3;
+               pdimm[slot].dq_mapping[8] = dq_mapping_0;
+               pdimm[slot].dq_mapping[9] = 0;
+               pdimm[slot].dq_mapping[10] = 0;
+               pdimm[slot].dq_mapping[11] = 0;
+               pdimm[slot].dq_mapping[12] = 0;
+               pdimm[slot].dq_mapping[13] = 0;
+               pdimm[slot].dq_mapping[14] = 0;
+               pdimm[slot].dq_mapping[15] = 0;
+               pdimm[slot].dq_mapping[16] = 0;
+               pdimm[slot].dq_mapping[17] = 0;
+       }
+       /* To work at higher than 1333MT/s */
+       popts->half_strength_driver_enable = 0;
+       /*
+        * Write leveling override
+        */
+       popts->wrlvl_override = 1;
+       popts->wrlvl_sample = 0x0;      /* 32 clocks */
+
+       /*
+        * Rtt and Rtt_WR override
+        */
+       popts->rtt_override = 0;
+
+       /* Enable ZQ calibration */
+       popts->zq_en = 1;
+
+       if (ddr_freq < 2350) {
+               popts->ddr_cdr1 = DDR_CDR1_DHC_EN |
+                                 DDR_CDR1_ODT(DDR_CDR_ODT_60ohm);
+               popts->ddr_cdr2 = DDR_CDR2_ODT(DDR_CDR_ODT_60ohm) |
+                                 DDR_CDR2_VREF_RANGE_2;
+       } else {
+               popts->ddr_cdr1 = DDR_CDR1_DHC_EN |
+                                 DDR_CDR1_ODT(DDR_CDR_ODT_100ohm);
+               popts->ddr_cdr2 = DDR_CDR2_ODT(DDR_CDR_ODT_100ohm) |
+                                 DDR_CDR2_VREF_RANGE_2;
+       }
+}
+
+phys_size_t initdram(int board_type)
+{
+       phys_size_t dram_size;
+
+#if defined(CONFIG_SPL) && !defined(CONFIG_SPL_BUILD)
+       return fsl_ddr_sdram_size();
+#else
+       puts("Initializing DDR....using SPD\n");
+
+       dram_size = fsl_ddr_sdram();
+#endif
+
+       return dram_size;
+}
+
+void dram_init_banksize(void)
+{
+#ifdef CONFIG_SYS_DP_DDR_BASE_PHY
+       phys_size_t dp_ddr_size;
+#endif
+
+       gd->bd->bi_dram[0].start = CONFIG_SYS_SDRAM_BASE;
+       if (gd->ram_size > CONFIG_SYS_LS2_DDR_BLOCK1_SIZE) {
+               gd->bd->bi_dram[0].size = CONFIG_SYS_LS2_DDR_BLOCK1_SIZE;
+               gd->bd->bi_dram[1].start = CONFIG_SYS_DDR_BLOCK2_BASE;
+               gd->bd->bi_dram[1].size = gd->ram_size -
+                                         CONFIG_SYS_LS2_DDR_BLOCK1_SIZE;
+       } else {
+               gd->bd->bi_dram[0].size = gd->ram_size;
+       }
+
+#ifdef CONFIG_SYS_DP_DDR_BASE_PHY
+       /* initialize DP-DDR here */
+       puts("DP-DDR:  ");
+       /*
+        * DDR controller use 0 as the base address for binding.
+        * It is mapped to CONFIG_SYS_DP_DDR_BASE for core to access.
+        */
+       dp_ddr_size = fsl_other_ddr_sdram(CONFIG_SYS_DP_DDR_BASE_PHY,
+                                         CONFIG_DP_DDR_CTRL,
+                                         CONFIG_DP_DDR_NUM_CTRLS,
+                                         CONFIG_DP_DDR_DIMM_SLOTS_PER_CTLR,
+                                         NULL, NULL, NULL);
+       if (dp_ddr_size) {
+               gd->bd->bi_dram[2].start = CONFIG_SYS_DP_DDR_BASE;
+               gd->bd->bi_dram[2].size = dp_ddr_size;
+       } else {
+               puts("Not detected");
+       }
+#endif
+}
diff --git a/board/freescale/ls2085aqds/ddr.h b/board/freescale/ls2085aqds/ddr.h
new file mode 100644 (file)
index 0000000..b76ea61
--- /dev/null
@@ -0,0 +1,92 @@
+/*
+ * Copyright 2015 Freescale Semiconductor, Inc.
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#ifndef __DDR_H__
+#define __DDR_H__
+struct board_specific_parameters {
+       u32 n_ranks;
+       u32 datarate_mhz_high;
+       u32 rank_gb;
+       u32 clk_adjust;
+       u32 wrlvl_start;
+       u32 wrlvl_ctl_2;
+       u32 wrlvl_ctl_3;
+};
+
+/*
+ * These tables contain all valid speeds we want to override with board
+ * specific parameters. datarate_mhz_high values need to be in ascending order
+ * for each n_ranks group.
+ */
+
+static const struct board_specific_parameters udimm0[] = {
+       /*
+        * memory controller 0
+        *   num|  hi| rank|  clk| wrlvl |   wrlvl   |  wrlvl
+        * ranks| mhz| GB  |adjst| start |   ctl2    |  ctl3
+        */
+       {2,  1350, 0, 4,     6, 0x0708090B, 0x0C0D0E09,},
+       {2,  1666, 0, 4,     7, 0x08090A0C, 0x0D0F100B,},
+       {2,  1900, 0, 4,     7, 0x09090B0D, 0x0E10120B,},
+       {2,  2300, 0, 4,     8, 0x090A0C0F, 0x1012130C,},
+       {}
+};
+
+/* DP-DDR DIMM */
+static const struct board_specific_parameters udimm2[] = {
+       /*
+        * memory controller 2
+        *   num|  hi| rank|  clk| wrlvl |   wrlvl   |  wrlvl
+        * ranks| mhz| GB  |adjst| start |   ctl2    |  ctl3
+        */
+       {2,  1350, 0, 4,   0xd, 0x0C0A0A00, 0x00000009,},
+       {2,  1666, 0, 4,   0xd, 0x0C0A0A00, 0x00000009,},
+       {2,  1900, 0, 4,   0xe, 0x0D0C0B00, 0x0000000A,},
+       {2,  2200, 0, 4,   0xe, 0x0D0C0B00, 0x0000000A,},
+       {}
+};
+
+static const struct board_specific_parameters rdimm0[] = {
+       /*
+        * memory controller 0
+        *   num|  hi| rank|  clk| wrlvl |   wrlvl   |  wrlvl
+        * ranks| mhz| GB  |adjst| start |   ctl2    |  ctl3
+        */
+       {2,  1350, 0, 4,     6, 0x0708090B, 0x0C0D0E09,},
+       {2,  1666, 0, 4,     7, 0x08090A0C, 0x0D0F100B,},
+       {2,  1900, 0, 4,     7, 0x09090B0D, 0x0E10120B,},
+       {2,  2200, 0, 4,     8, 0x090A0C0F, 0x1012130C,},
+       {}
+};
+
+/* DP-DDR DIMM */
+static const struct board_specific_parameters rdimm2[] = {
+       /*
+        * memory controller 2
+        *   num|  hi| rank|  clk| wrlvl |   wrlvl   |  wrlvl
+        * ranks| mhz| GB  |adjst| start |   ctl2    |  ctl3
+        */
+       {2,  1350, 0, 4,     6, 0x0708090B, 0x0C0D0E09,},
+       {2,  1666, 0, 4,     7, 0x0B0A090C, 0x0D0F100B,},
+       {2,  1900, 0, 4,     7, 0x09090B0D, 0x0E10120B,},
+       {2,  2200, 0, 4,     8, 0x090A0C0F, 0x1012130C,},
+       {}
+};
+
+static const struct board_specific_parameters *udimms[] = {
+       udimm0,
+       udimm0,
+       udimm2,
+};
+
+static const struct board_specific_parameters *rdimms[] = {
+       rdimm0,
+       rdimm0,
+       rdimm2,
+};
+
+
+#endif
diff --git a/board/freescale/ls2085aqds/eth.c b/board/freescale/ls2085aqds/eth.c
new file mode 100644 (file)
index 0000000..5ba4770
--- /dev/null
@@ -0,0 +1,380 @@
+/*
+ * Copyright 2015 Freescale Semiconductor, Inc.
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#include <common.h>
+#include <netdev.h>
+#include <asm/io.h>
+#include <asm/arch/fsl_serdes.h>
+#include <asm/arch-fsl-lsch3/immap_lsch3.h>
+#include <fsl_mdio.h>
+#include <malloc.h>
+#include <fm_eth.h>
+#include <fsl-mc/ldpaa_wriop.h>
+
+#include "../common/qixis.h"
+
+#include "ls2085aqds_qixis.h"
+
+
+#ifdef CONFIG_FSL_MC_ENET
+ /* - In LS2085A there are only 16 SERDES lanes, spread across 2 SERDES banks.
+ *   Bank 1 -> Lanes A, B, C, D, E, F, G, H
+ *   Bank 2 -> Lanes A,B, C, D, E, F, G, H
+ */
+
+ /* Mapping of 16 SERDES lanes to LS2085A QDS board slots. A value of '0' here
+  * means that the mapping must be determined dynamically, or that the lane
+  * maps to something other than a board slot.
+  */
+
+static u8 lane_to_slot_fsm2[] = {
+       0, 0, 0, 0, 0, 0, 0, 0
+};
+
+/* On the Vitesse VSC8234XHG SGMII riser card there are 4 SGMII PHYs
+ * housed.
+ */
+static int riser_phy_addr[] = {
+       SGMII_CARD_PORT1_PHY_ADDR,
+       SGMII_CARD_PORT2_PHY_ADDR,
+       SGMII_CARD_PORT3_PHY_ADDR,
+       SGMII_CARD_PORT4_PHY_ADDR,
+};
+
+/* Slot2 does not have EMI connections */
+#define EMI_NONE       0xFFFFFFFF
+#define EMI1_SLOT1     0
+#define EMI1_SLOT2     1
+#define EMI1_SLOT3     2
+#define EMI1_SLOT4     3
+#define EMI1_SLOT5     4
+#define EMI1_SLOT6     5
+#define EMI2           6
+#define SFP_TX         1
+
+static const char * const mdio_names[] = {
+       "LS2085A_QDS_MDIO0",
+       "LS2085A_QDS_MDIO1",
+       "LS2085A_QDS_MDIO2",
+       "LS2085A_QDS_MDIO3",
+       "LS2085A_QDS_MDIO4",
+       "LS2085A_QDS_MDIO5",
+       DEFAULT_WRIOP_MDIO2_NAME,
+};
+
+struct ls2085a_qds_mdio {
+       u8 muxval;
+       struct mii_dev *realbus;
+};
+
+static const char *ls2085a_qds_mdio_name_for_muxval(u8 muxval)
+{
+       return mdio_names[muxval];
+}
+
+struct mii_dev *mii_dev_for_muxval(u8 muxval)
+{
+       struct mii_dev *bus;
+       const char *name = ls2085a_qds_mdio_name_for_muxval(muxval);
+
+       if (!name) {
+               printf("No bus for muxval %x\n", muxval);
+               return NULL;
+       }
+
+       bus = miiphy_get_dev_by_name(name);
+
+       if (!bus) {
+               printf("No bus by name %s\n", name);
+               return NULL;
+       }
+
+       return bus;
+}
+
+static void ls2085a_qds_enable_SFP_TX(u8 muxval)
+{
+       u8 brdcfg9;
+
+       brdcfg9 = QIXIS_READ(brdcfg[9]);
+       brdcfg9 &= ~BRDCFG9_SFPTX_MASK;
+       brdcfg9 |= (muxval << BRDCFG9_SFPTX_SHIFT);
+       QIXIS_WRITE(brdcfg[9], brdcfg9);
+}
+
+static void ls2085a_qds_mux_mdio(u8 muxval)
+{
+       u8 brdcfg4;
+
+       if (muxval <= 5) {
+               brdcfg4 = QIXIS_READ(brdcfg[4]);
+               brdcfg4 &= ~BRDCFG4_EMISEL_MASK;
+               brdcfg4 |= (muxval << BRDCFG4_EMISEL_SHIFT);
+               QIXIS_WRITE(brdcfg[4], brdcfg4);
+       }
+}
+
+static int ls2085a_qds_mdio_read(struct mii_dev *bus, int addr,
+                                int devad, int regnum)
+{
+       struct ls2085a_qds_mdio *priv = bus->priv;
+
+       ls2085a_qds_mux_mdio(priv->muxval);
+
+       return priv->realbus->read(priv->realbus, addr, devad, regnum);
+}
+
+static int ls2085a_qds_mdio_write(struct mii_dev *bus, int addr, int devad,
+                                 int regnum, u16 value)
+{
+       struct ls2085a_qds_mdio *priv = bus->priv;
+
+       ls2085a_qds_mux_mdio(priv->muxval);
+
+       return priv->realbus->write(priv->realbus, addr, devad, regnum, value);
+}
+
+static int ls2085a_qds_mdio_reset(struct mii_dev *bus)
+{
+       struct ls2085a_qds_mdio *priv = bus->priv;
+
+       return priv->realbus->reset(priv->realbus);
+}
+
+static int ls2085a_qds_mdio_init(char *realbusname, u8 muxval)
+{
+       struct ls2085a_qds_mdio *pmdio;
+       struct mii_dev *bus = mdio_alloc();
+
+       if (!bus) {
+               printf("Failed to allocate ls2085a_qds MDIO bus\n");
+               return -1;
+       }
+
+       pmdio = malloc(sizeof(*pmdio));
+       if (!pmdio) {
+               printf("Failed to allocate ls2085a_qds private data\n");
+               free(bus);
+               return -1;
+       }
+
+       bus->read = ls2085a_qds_mdio_read;
+       bus->write = ls2085a_qds_mdio_write;
+       bus->reset = ls2085a_qds_mdio_reset;
+       sprintf(bus->name, ls2085a_qds_mdio_name_for_muxval(muxval));
+
+       pmdio->realbus = miiphy_get_dev_by_name(realbusname);
+
+       if (!pmdio->realbus) {
+               printf("No bus with name %s\n", realbusname);
+               free(bus);
+               free(pmdio);
+               return -1;
+       }
+
+       pmdio->muxval = muxval;
+       bus->priv = pmdio;
+
+       return mdio_register(bus);
+}
+
+/*
+ * Initialize the dpmac_info array.
+ *
+ */
+static void initialize_dpmac_to_slot(void)
+{
+       struct ccsr_gur __iomem *gur = (void *)CONFIG_SYS_FSL_GUTS_ADDR;
+       int serdes1_prtcl = (in_le32(&gur->rcwsr[28]) &
+                               FSL_CHASSIS3_RCWSR28_SRDS1_PRTCL_MASK)
+               >> FSL_CHASSIS3_RCWSR28_SRDS1_PRTCL_SHIFT;
+       int serdes2_prtcl = (in_le32(&gur->rcwsr[28]) &
+                               FSL_CHASSIS3_RCWSR28_SRDS2_PRTCL_MASK)
+               >> FSL_CHASSIS3_RCWSR28_SRDS2_PRTCL_SHIFT;
+
+
+       switch (serdes1_prtcl) {
+       case 0x2A:
+               printf("qds: WRIOP: Supported SerDes Protocol 0x%02x\n",
+                      serdes1_prtcl);
+               break;
+       default:
+               printf("qds: WRIOP: Unsupported SerDes Protocol 0x%02x\n",
+                      serdes1_prtcl);
+               break;
+       }
+
+       switch (serdes2_prtcl) {
+       case 0x07:
+       case 0x08:
+               printf("qds: WRIOP: Supported SerDes Protocol 0x%02x\n",
+                      serdes2_prtcl);
+               lane_to_slot_fsm2[0] = EMI1_SLOT4;
+               lane_to_slot_fsm2[1] = EMI1_SLOT4;
+               lane_to_slot_fsm2[2] = EMI1_SLOT4;
+               lane_to_slot_fsm2[3] = EMI1_SLOT4;
+               /* No MDIO physical connection */
+               lane_to_slot_fsm2[4] = EMI1_SLOT6;
+               lane_to_slot_fsm2[5] = EMI1_SLOT6;
+               lane_to_slot_fsm2[6] = EMI1_SLOT6;
+               lane_to_slot_fsm2[7] = EMI1_SLOT6;
+               break;
+       default:
+               printf("qds: WRIOP: Unsupported SerDes Protocol 0x%02x\n",
+                      serdes2_prtcl);
+               break;
+       }
+}
+
+void ls2085a_handle_phy_interface_sgmii(int dpmac_id)
+{
+       int lane, slot;
+       struct mii_dev *bus;
+       struct ccsr_gur __iomem *gur = (void *)CONFIG_SYS_FSL_GUTS_ADDR;
+       int serdes1_prtcl = (in_le32(&gur->rcwsr[28]) &
+                               FSL_CHASSIS3_RCWSR28_SRDS1_PRTCL_MASK)
+               >> FSL_CHASSIS3_RCWSR28_SRDS1_PRTCL_SHIFT;
+       int serdes2_prtcl = (in_le32(&gur->rcwsr[28]) &
+                               FSL_CHASSIS3_RCWSR28_SRDS2_PRTCL_MASK)
+               >> FSL_CHASSIS3_RCWSR28_SRDS2_PRTCL_SHIFT;
+
+       switch (serdes1_prtcl) {
+       }
+
+       switch (serdes2_prtcl) {
+       case 0x07:
+       case 0x08:
+               lane = serdes_get_first_lane(FSL_SRDS_2, SGMII9 +
+                                                       (dpmac_id - 9));
+               slot = lane_to_slot_fsm2[lane];
+
+               switch (++slot) {
+               case 1:
+                       break;
+               case 3:
+                       break;
+               case 4:
+                       /* Slot housing a SGMII riser card? */
+                       wriop_set_phy_address(dpmac_id,
+                                             riser_phy_addr[dpmac_id - 9]);
+                       dpmac_info[dpmac_id].board_mux = EMI1_SLOT4;
+                       bus = mii_dev_for_muxval(EMI1_SLOT4);
+                       wriop_set_mdio(dpmac_id, bus);
+                       dpmac_info[dpmac_id].phydev = phy_connect(
+                                               dpmac_info[dpmac_id].bus,
+                                               dpmac_info[dpmac_id].phy_addr,
+                                               NULL,
+                                               dpmac_info[dpmac_id].enet_if);
+                       phy_config(dpmac_info[dpmac_id].phydev);
+               break;
+               case 5:
+               break;
+               case 6:
+                       /* Slot housing a SGMII riser card? */
+                       wriop_set_phy_address(dpmac_id,
+                                             riser_phy_addr[dpmac_id - 13]);
+                       dpmac_info[dpmac_id].board_mux = EMI1_SLOT6;
+                       bus = mii_dev_for_muxval(EMI1_SLOT6);
+                       wriop_set_mdio(dpmac_id, bus);
+               break;
+       }
+       break;
+       default:
+               printf("qds: WRIOP: Unsupported SerDes Protocol 0x%02x\n",
+                      serdes2_prtcl);
+       break;
+       }
+}
+void ls2085a_handle_phy_interface_xsgmii(int i)
+{
+       struct ccsr_gur __iomem *gur = (void *)CONFIG_SYS_FSL_GUTS_ADDR;
+       int serdes1_prtcl = (in_le32(&gur->rcwsr[28]) &
+                               FSL_CHASSIS3_RCWSR28_SRDS1_PRTCL_MASK)
+               >> FSL_CHASSIS3_RCWSR28_SRDS1_PRTCL_SHIFT;
+
+       switch (serdes1_prtcl) {
+       case 0x2A:
+               /*
+                * XFI does not need a PHY to work, but to avoid U-boot use
+                * default PHY address which is zero to a MAC when it found
+                * a MAC has no PHY address, we give a PHY address to XFI
+                * MAC, and should not use a real XAUI PHY address, since
+                * MDIO can access it successfully, and then MDIO thinks
+                * the XAUI card is used for the XFI MAC, which will cause
+                * error.
+                */
+               wriop_set_phy_address(i, i + 4);
+               ls2085a_qds_enable_SFP_TX(SFP_TX);
+
+               break;
+       default:
+               printf("qds: WRIOP: Unsupported SerDes Protocol 0x%02x\n",
+                      serdes1_prtcl);
+               break;
+       }
+}
+#endif
+
+int board_eth_init(bd_t *bis)
+{
+       int error;
+#ifdef CONFIG_FSL_MC_ENET
+       struct memac_mdio_info *memac_mdio0_info;
+       struct memac_mdio_info *memac_mdio1_info;
+       unsigned int i;
+
+       initialize_dpmac_to_slot();
+
+       memac_mdio0_info = (struct memac_mdio_info *)malloc(
+                                       sizeof(struct memac_mdio_info));
+       memac_mdio0_info->regs =
+               (struct memac_mdio_controller *)
+                                       CONFIG_SYS_FSL_WRIOP1_MDIO1;
+       memac_mdio0_info->name = DEFAULT_WRIOP_MDIO1_NAME;
+
+       /* Register the real MDIO1 bus */
+       fm_memac_mdio_init(bis, memac_mdio0_info);
+
+       memac_mdio1_info = (struct memac_mdio_info *)malloc(
+                                       sizeof(struct memac_mdio_info));
+       memac_mdio1_info->regs =
+               (struct memac_mdio_controller *)
+                                       CONFIG_SYS_FSL_WRIOP1_MDIO2;
+       memac_mdio1_info->name = DEFAULT_WRIOP_MDIO2_NAME;
+
+       /* Register the real MDIO2 bus */
+       fm_memac_mdio_init(bis, memac_mdio1_info);
+
+       /* Register the muxing front-ends to the MDIO buses */
+       ls2085a_qds_mdio_init(DEFAULT_WRIOP_MDIO1_NAME, EMI1_SLOT1);
+       ls2085a_qds_mdio_init(DEFAULT_WRIOP_MDIO1_NAME, EMI1_SLOT2);
+       ls2085a_qds_mdio_init(DEFAULT_WRIOP_MDIO1_NAME, EMI1_SLOT3);
+       ls2085a_qds_mdio_init(DEFAULT_WRIOP_MDIO1_NAME, EMI1_SLOT4);
+       ls2085a_qds_mdio_init(DEFAULT_WRIOP_MDIO1_NAME, EMI1_SLOT5);
+       ls2085a_qds_mdio_init(DEFAULT_WRIOP_MDIO1_NAME, EMI1_SLOT6);
+
+       ls2085a_qds_mdio_init(DEFAULT_WRIOP_MDIO2_NAME, EMI2);
+
+       for (i = WRIOP1_DPMAC1; i < NUM_WRIOP_PORTS; i++) {
+               switch (wriop_get_enet_if(i)) {
+               case PHY_INTERFACE_MODE_QSGMII:
+                       break;
+               case PHY_INTERFACE_MODE_SGMII:
+                       ls2085a_handle_phy_interface_sgmii(i);
+                       break;
+               case PHY_INTERFACE_MODE_XGMII:
+                       ls2085a_handle_phy_interface_xsgmii(i);
+                       break;
+               default:
+                       break;
+               }
+       }
+
+       error = cpu_eth_init(bis);
+#endif
+       error = pci_eth_init(bis);
+       return error;
+}
diff --git a/board/freescale/ls2085aqds/ls2085aqds.c b/board/freescale/ls2085aqds/ls2085aqds.c
new file mode 100644 (file)
index 0000000..6a22122
--- /dev/null
@@ -0,0 +1,274 @@
+/*
+ * Copyright 2015 Freescale Semiconductor
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+#include <common.h>
+#include <malloc.h>
+#include <errno.h>
+#include <netdev.h>
+#include <fsl_ifc.h>
+#include <fsl_ddr.h>
+#include <asm/io.h>
+#include <fdt_support.h>
+#include <libfdt.h>
+#include <fsl_debug_server.h>
+#include <fsl-mc/fsl_mc.h>
+#include <environment.h>
+#include <i2c.h>
+#include <asm/arch-fsl-lsch3/soc.h>
+
+#include "../common/qixis.h"
+#include "ls2085aqds_qixis.h"
+
+DECLARE_GLOBAL_DATA_PTR;
+
+unsigned long long get_qixis_addr(void)
+{
+       unsigned long long addr;
+
+       if (gd->flags & GD_FLG_RELOC)
+               addr = QIXIS_BASE_PHYS;
+       else
+               addr = QIXIS_BASE_PHYS_EARLY;
+
+       /*
+        * IFC address under 256MB is mapped to 0x30000000, any address above
+        * is mapped to 0x5_10000000 up to 4GB.
+        */
+       addr = addr  > 0x10000000 ? addr + 0x500000000ULL : addr + 0x30000000;
+
+       return addr;
+}
+
+int checkboard(void)
+{
+       char buf[64];
+       u8 sw;
+       static const char *const freq[] = {"100", "125", "156.25",
+                                           "100 separate SSCG"};
+       int clock;
+
+       sw = QIXIS_READ(arch);
+       printf("Board: %s, ", CONFIG_IDENT_STRING);
+       printf("Board Arch: V%d, ", sw >> 4);
+       printf("Board version: %c, boot from ", (sw & 0xf) + 'A' - 1);
+
+       sw = QIXIS_READ(brdcfg[0]);
+       sw = (sw & QIXIS_LBMAP_MASK) >> QIXIS_LBMAP_SHIFT;
+
+       if (sw < 0x8)
+               printf("vBank: %d\n", sw);
+       else if (sw == 0x8)
+               puts("PromJet\n");
+       else if (sw == 0x9)
+               puts("NAND\n");
+       else if (sw == 0x15)
+               printf("IFCCard\n");
+       else
+               printf("invalid setting of SW%u\n", QIXIS_LBMAP_SWITCH);
+
+       printf("FPGA: v%d (%s), build %d",
+              (int)QIXIS_READ(scver), qixis_read_tag(buf),
+              (int)qixis_read_minor());
+       /* the timestamp string contains "\n" at the end */
+       printf(" on %s", qixis_read_time(buf));
+
+       /*
+        * Display the actual SERDES reference clocks as configured by the
+        * dip switches on the board.  Note that the SWx registers could
+        * technically be set to force the reference clocks to match the
+        * values that the SERDES expects (or vice versa).  For now, however,
+        * we just display both values and hope the user notices when they
+        * don't match.
+        */
+       puts("SERDES1 Reference : ");
+       sw = QIXIS_READ(brdcfg[2]);
+       clock = (sw >> 6) & 3;
+       printf("Clock1 = %sMHz ", freq[clock]);
+       clock = (sw >> 4) & 3;
+       printf("Clock2 = %sMHz", freq[clock]);
+
+       puts("\nSERDES2 Reference : ");
+       clock = (sw >> 2) & 3;
+       printf("Clock1 = %sMHz ", freq[clock]);
+       clock = (sw >> 0) & 3;
+       printf("Clock2 = %sMHz\n", freq[clock]);
+
+       return 0;
+}
+
+unsigned long get_board_sys_clk(void)
+{
+       u8 sysclk_conf = QIXIS_READ(brdcfg[1]);
+
+       switch (sysclk_conf & 0x0F) {
+       case QIXIS_SYSCLK_83:
+               return 83333333;
+       case QIXIS_SYSCLK_100:
+               return 100000000;
+       case QIXIS_SYSCLK_125:
+               return 125000000;
+       case QIXIS_SYSCLK_133:
+               return 133333333;
+       case QIXIS_SYSCLK_150:
+               return 150000000;
+       case QIXIS_SYSCLK_160:
+               return 160000000;
+       case QIXIS_SYSCLK_166:
+               return 166666666;
+       }
+       return 66666666;
+}
+
+unsigned long get_board_ddr_clk(void)
+{
+       u8 ddrclk_conf = QIXIS_READ(brdcfg[1]);
+
+       switch ((ddrclk_conf & 0x30) >> 4) {
+       case QIXIS_DDRCLK_100:
+               return 100000000;
+       case QIXIS_DDRCLK_125:
+               return 125000000;
+       case QIXIS_DDRCLK_133:
+               return 133333333;
+       }
+       return 66666666;
+}
+
+int select_i2c_ch_pca9547(u8 ch)
+{
+       int ret;
+
+       ret = i2c_write(I2C_MUX_PCA_ADDR_PRI, 0, 1, &ch, 1);
+       if (ret) {
+               puts("PCA: failed to select proper channel\n");
+               return ret;
+       }
+
+       return 0;
+}
+
+int board_init(void)
+{
+       init_final_memctl_regs();
+
+#ifdef CONFIG_ENV_IS_NOWHERE
+       gd->env_addr = (ulong)&default_environment[0];
+#endif
+       select_i2c_ch_pca9547(I2C_MUX_CH_DEFAULT);
+
+       return 0;
+}
+
+int board_early_init_f(void)
+{
+       fsl_lsch3_early_init_f();
+       return 0;
+}
+
+void detail_board_ddr_info(void)
+{
+       puts("\nDDR    ");
+       print_size(gd->bd->bi_dram[0].size + gd->bd->bi_dram[1].size, "");
+       print_ddr_info(0);
+       if (gd->bd->bi_dram[2].size) {
+               puts("\nDP-DDR ");
+               print_size(gd->bd->bi_dram[2].size, "");
+               print_ddr_info(CONFIG_DP_DDR_CTRL);
+       }
+}
+
+int dram_init(void)
+{
+       gd->ram_size = initdram(0);
+
+       return 0;
+}
+
+#if defined(CONFIG_ARCH_MISC_INIT)
+int arch_misc_init(void)
+{
+#ifdef CONFIG_FSL_DEBUG_SERVER
+       debug_server_init();
+#endif
+
+       return 0;
+}
+#endif
+
+unsigned long get_dram_size_to_hide(void)
+{
+       unsigned long dram_to_hide = 0;
+
+/* Carve the Debug Server private DRAM block from the end of DRAM */
+#ifdef CONFIG_FSL_DEBUG_SERVER
+       dram_to_hide += debug_server_get_dram_block_size();
+#endif
+
+/* Carve the MC private DRAM block from the end of DRAM */
+#ifdef CONFIG_FSL_MC_ENET
+       dram_to_hide += mc_get_dram_block_size();
+#endif
+
+       return dram_to_hide;
+}
+
+#ifdef CONFIG_FSL_MC_ENET
+void fdt_fixup_board_enet(void *fdt)
+{
+       int offset;
+
+       offset = fdt_path_offset(fdt, "/fsl-mc");
+
+       if (offset < 0)
+               offset = fdt_path_offset(fdt, "/fsl,dprc@0");
+
+       if (offset < 0) {
+               printf("%s: ERROR: fsl-mc node not found in device tree (error %d)\n",
+                      __func__, offset);
+               return;
+       }
+
+       if (get_mc_boot_status() == 0)
+               fdt_status_okay(fdt, offset);
+       else
+               fdt_status_fail(fdt, offset);
+}
+#endif
+
+#ifdef CONFIG_OF_BOARD_SETUP
+int ft_board_setup(void *blob, bd_t *bd)
+{
+       phys_addr_t base;
+       phys_size_t size;
+
+       ft_cpu_setup(blob, bd);
+
+       /* limit the memory size to bank 1 until Linux can handle 40-bit PA */
+       base = getenv_bootm_low();
+       size = getenv_bootm_size();
+       fdt_fixup_memory(blob, (u64)base, (u64)size);
+
+#ifdef CONFIG_FSL_MC_ENET
+       fdt_fixup_board_enet(blob);
+       fsl_mc_ldpaa_exit(bd);
+#endif
+
+       return 0;
+}
+#endif
+
+void qixis_dump_switch(void)
+{
+       int i, nr_of_cfgsw;
+
+       QIXIS_WRITE(cms[0], 0x00);
+       nr_of_cfgsw = QIXIS_READ(cms[1]);
+
+       puts("DIP switch settings dump:\n");
+       for (i = 1; i <= nr_of_cfgsw; i++) {
+               QIXIS_WRITE(cms[0], i);
+               printf("SW%d = (0x%02x)\n", i, QIXIS_READ(cms[1]));
+       }
+}
diff --git a/board/freescale/ls2085aqds/ls2085aqds_qixis.h b/board/freescale/ls2085aqds/ls2085aqds_qixis.h
new file mode 100644 (file)
index 0000000..e281e5f
--- /dev/null
@@ -0,0 +1,30 @@
+/*
+ * Copyright 2015 Freescale Semiconductor, Inc.
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#ifndef __LS2_QDS_QIXIS_H__
+#define __LS2_QDS_QIXIS_H__
+
+/* SYSCLK */
+#define QIXIS_SYSCLK_66                        0x0
+#define QIXIS_SYSCLK_83                        0x1
+#define QIXIS_SYSCLK_100               0x2
+#define QIXIS_SYSCLK_125               0x3
+#define QIXIS_SYSCLK_133               0x4
+#define QIXIS_SYSCLK_150               0x5
+#define QIXIS_SYSCLK_160               0x6
+#define QIXIS_SYSCLK_166               0x7
+
+/* DDRCLK */
+#define QIXIS_DDRCLK_66                        0x0
+#define QIXIS_DDRCLK_100               0x1
+#define QIXIS_DDRCLK_125               0x2
+#define QIXIS_DDRCLK_133               0x3
+
+#define BRDCFG4_EMISEL_MASK            0xE0
+#define BRDCFG4_EMISEL_SHIFT           5
+#define BRDCFG9_SFPTX_MASK             0x10
+#define BRDCFG9_SFPTX_SHIFT            4
+#endif /*__LS2_QDS_QIXIS_H__*/
diff --git a/board/freescale/ls2085ardb/Kconfig b/board/freescale/ls2085ardb/Kconfig
new file mode 100644 (file)
index 0000000..85a3dcd
--- /dev/null
@@ -0,0 +1,16 @@
+
+if TARGET_LS2085ARDB
+
+config SYS_BOARD
+       default "ls2085ardb"
+
+config SYS_VENDOR
+       default "freescale"
+
+config SYS_SOC
+       default "fsl-lsch3"
+
+config SYS_CONFIG_NAME
+       default "ls2085ardb"
+
+endif
diff --git a/board/freescale/ls2085ardb/MAINTAINERS b/board/freescale/ls2085ardb/MAINTAINERS
new file mode 100644 (file)
index 0000000..d5cce40
--- /dev/null
@@ -0,0 +1,8 @@
+LS2085A BOARD
+M:     Prabhakar Kushwaha <prabhakar@freescale.com>
+S:     Maintained
+F:     board/freescale/ls2085ardb/
+F:     board/freescale/ls2085a/ls2085ardb.c
+F:     include/configs/ls2085ardb.h
+F:     configs/ls2085ardb_defconfig
+F:     configs/ls2085ardb_nand_defconfig
diff --git a/board/freescale/ls2085ardb/Makefile b/board/freescale/ls2085ardb/Makefile
new file mode 100644 (file)
index 0000000..0bfe21c
--- /dev/null
@@ -0,0 +1,8 @@
+#
+# Copyright 2015 Freescale Semiconductor
+#
+# SPDX-License-Identifier:     GPL-2.0+
+#
+
+obj-y += ls2085ardb.o
+obj-y += ddr.o
diff --git a/board/freescale/ls2085ardb/README b/board/freescale/ls2085ardb/README
new file mode 100644 (file)
index 0000000..cfd5185
--- /dev/null
@@ -0,0 +1,109 @@
+Overview
+--------
+The LS2085A Reference Design (RDB) is a high-performance computing,
+evaluation, and development platform that supports the QorIQ LS2085A
+Layerscape Architecture processor.
+
+LS2085A SoC Overview
+------------------
+The LS2085A integrated multicore processor combines eight ARM Cortex-A57
+processor cores with high-performance data path acceleration logic and network
+and peripheral bus interfaces required for networking, telecom/datacom,
+wireless infrastructure, and mil/aerospace applications.
+
+The LS2085A SoC includes the following function and features:
+
+ - Eight 64-bit ARM Cortex-A57 CPUs
+ - 1 MB platform cache with ECC
+ - Two 64-bit DDR4 SDRAM memory controllers with ECC and interleaving support
+ - One secondary 32-bit DDR4 SDRAM memory controller, intended for use by
+  the AIOP
+ - Data path acceleration architecture (DPAA2) incorporating acceleration for
+ the following functions:
+   - Packet parsing, classification, and distribution (WRIOP)
+   - Queue and Hardware buffer management for scheduling, packet sequencing, and
+     congestion management, buffer allocation and de-allocation (QBMan)
+   - Cryptography acceleration (SEC) at up to 10 Gbps
+   - RegEx pattern matching acceleration (PME) at up to 10 Gbps
+   - Decompression/compression acceleration (DCE) at up to 20 Gbps
+   - Accelerated I/O processing (AIOP) at up to 20 Gbps
+   - QDMA engine
+ - 16 SerDes lanes at up to 10.3125 GHz
+ - Ethernet interfaces
+   - Up to eight 10 Gbps Ethernet MACs
+   - Up to eight 1 / 2.5 Gbps Ethernet MACs
+ - High-speed peripheral interfaces
+   - Four PCIe 3.0 controllers, one supporting SR-IOV
+ - Additional peripheral interfaces
+   - Two serial ATA (SATA 3.0) controllers
+   - Two high-speed USB 3.0 controllers with integrated PHY
+   - Enhanced secure digital host controller (eSDXC/eMMC)
+   - Serial peripheral interface (SPI) controller
+   - Quad Serial Peripheral Interface (QSPI) Controller
+   - Four I2C controllers
+   - Two DUARTs
+   - Integrated flash controller (IFC 2.0) supporting NAND and NOR flash
+ - Support for hardware virtualization and partitioning enforcement
+ - QorIQ platform's trust architecture 3.0
+ - Service processor (SP) provides pre-boot initialization and secure-boot
+  capabilities
+
+ LS2085ARDB board Overview
+ -----------------------
+ - SERDES Connections, 16 lanes supporting:
+      - PCI Express - 3.0
+      - SATA 3.0
+      - XFI
+ - DDR Controller
+     - Two ports of 72-bits (8-bits ECC) DDR4. Each port supports four
+       chip-selects and two DIMM connectors. Support is up to 2133MT/s.
+     - One port of 40-bits (8-bits ECC) DDR4 which supports four chip-selects
+       and two DIMM connectors. Support is up to 1600MT/s.
+ -IFC/Local Bus
+    - IFC rev. 2.0 implementation supporting Little Endian connection scheme.
+    - 128 MB NOR flash 16-bit data bus
+    - One 2 GB NAND flash with ECC support
+    - CPLD connection
+ - USB 3.0
+    - Two high speed USB 3.0 ports
+    - First USB 3.0 port configured as Host with Type-A connector
+    - Second USB 3.0 port configured as OTG with micro-AB connector
+ - SDHC adapter
+    - SD Card Rev 2.0 and Rev 3.0
+ - DSPI
+    - 128 MB high-speed flash Memory for boot code and storage (up to 108MHz)
+ - 4 I2C controllers
+ - Two SATA onboard connectors
+ - UART
+ - ARM JTAG support
+
+Memory map from core's view
+----------------------------
+0x00_0000_0000 .. 0x00_000F_FFFF       Boot Rom
+0x00_0100_0000 .. 0x00_0FFF_FFFF       CCSR
+0x00_1800_0000 .. 0x00_181F_FFFF       OCRAM
+0x00_3000_0000 .. 0x00_3FFF_FFFF       IFC region #1
+0x00_8000_0000 .. 0x00_FFFF_FFFF       DDR region #1
+0x05_1000_0000 .. 0x05_FFFF_FFFF       IFC region #2
+0x80_8000_0000 .. 0xFF_FFFF_FFFF       DDR region #2
+
+Other addresses are either reserved, or not used directly by u-boot.
+This list should be updated when more addresses are used.
+
+IFC region map from core's view
+-------------------------------
+During boot i.e. IFC Region #1:-
+  0x30000000 - 0x37ffffff : 128MB : NOR flash
+  0x3C000000 - 0x40000000 : 64MB  : CPLD
+
+After relocate to DDR i.e. IFC Region #2:-
+  0x5_1000_0000..0x5_1fff_ffff Memory Hole
+  0x5_2000_0000..0x5_3fff_ffff IFC CSx (CPLD, NAND and others 512MB)
+  0x5_4000_0000..0x5_7fff_ffff ASIC or others 1GB
+  0x5_8000_0000..0x5_bfff_ffff IFC CS0 1GB (NOR/Promjet)
+  0x5_C000_0000..0x5_ffff_ffff IFC CS1 1GB (NOR/Promjet)
+
+Booting Options
+---------------
+a) NOR boot
+b) NAND boot
diff --git a/board/freescale/ls2085ardb/ddr.c b/board/freescale/ls2085ardb/ddr.c
new file mode 100644 (file)
index 0000000..8d71ae1
--- /dev/null
@@ -0,0 +1,196 @@
+/*
+ * Copyright 2015 Freescale Semiconductor, Inc.
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#include <common.h>
+#include <fsl_ddr_sdram.h>
+#include <fsl_ddr_dimm_params.h>
+#include "ddr.h"
+
+DECLARE_GLOBAL_DATA_PTR;
+
+void fsl_ddr_board_options(memctl_options_t *popts,
+                               dimm_params_t *pdimm,
+                               unsigned int ctrl_num)
+{
+       u8 dq_mapping_0, dq_mapping_2, dq_mapping_3;
+       const struct board_specific_parameters *pbsp, *pbsp_highest = NULL;
+       ulong ddr_freq;
+       int slot;
+
+       if (ctrl_num > 2) {
+               printf("Not supported controller number %d\n", ctrl_num);
+               return;
+       }
+
+       for (slot = 0; slot < CONFIG_DIMM_SLOTS_PER_CTLR; slot++) {
+               if (pdimm[slot].n_ranks)
+                       break;
+       }
+
+       if (slot >= CONFIG_DIMM_SLOTS_PER_CTLR)
+               return;
+
+       /*
+        * we use identical timing for all slots. If needed, change the code
+        * to  pbsp = rdimms[ctrl_num] or pbsp = udimms[ctrl_num];
+        */
+       if (popts->registered_dimm_en)
+               pbsp = rdimms[ctrl_num];
+       else
+               pbsp = udimms[ctrl_num];
+
+
+       /* Get clk_adjust, wrlvl_start, wrlvl_ctl, according to the board ddr
+        * freqency and n_banks specified in board_specific_parameters table.
+        */
+       ddr_freq = get_ddr_freq(ctrl_num) / 1000000;
+       while (pbsp->datarate_mhz_high) {
+               if (pbsp->n_ranks == pdimm[slot].n_ranks &&
+                   (pdimm[slot].rank_density >> 30) >= pbsp->rank_gb) {
+                       if (ddr_freq <= pbsp->datarate_mhz_high) {
+                               popts->clk_adjust = pbsp->clk_adjust;
+                               popts->wrlvl_start = pbsp->wrlvl_start;
+                               popts->wrlvl_ctl_2 = pbsp->wrlvl_ctl_2;
+                               popts->wrlvl_ctl_3 = pbsp->wrlvl_ctl_3;
+                               goto found;
+                       }
+                       pbsp_highest = pbsp;
+               }
+               pbsp++;
+       }
+
+       if (pbsp_highest) {
+               printf("Error: board specific timing not found for data rate %lu MT/s\n"
+                       "Trying to use the highest speed (%u) parameters\n",
+                       ddr_freq, pbsp_highest->datarate_mhz_high);
+               popts->clk_adjust = pbsp_highest->clk_adjust;
+               popts->wrlvl_start = pbsp_highest->wrlvl_start;
+               popts->wrlvl_ctl_2 = pbsp->wrlvl_ctl_2;
+               popts->wrlvl_ctl_3 = pbsp->wrlvl_ctl_3;
+       } else {
+               panic("DIMM is not supported by this board");
+       }
+found:
+       debug("Found timing match: n_ranks %d, data rate %d, rank_gb %d\n"
+               "\tclk_adjust %d, wrlvl_start %d, wrlvl_ctrl_2 0x%x, wrlvl_ctrl_3 0x%x\n",
+               pbsp->n_ranks, pbsp->datarate_mhz_high, pbsp->rank_gb,
+               pbsp->clk_adjust, pbsp->wrlvl_start, pbsp->wrlvl_ctl_2,
+               pbsp->wrlvl_ctl_3);
+
+       if (ctrl_num == CONFIG_DP_DDR_CTRL) {
+               /* force DDR bus width to 32 bits */
+               popts->data_bus_width = 1;
+               popts->otf_burst_chop_en = 0;
+               popts->burst_length = DDR_BL8;
+               popts->bstopre = 0;     /* enable auto precharge */
+               /*
+                * Layout optimization results byte mapping
+                * Byte 0 -> Byte ECC
+                * Byte 1 -> Byte 3
+                * Byte 2 -> Byte 2
+                * Byte 3 -> Byte 1
+                * Byte ECC -> Byte 0
+                */
+               dq_mapping_0 = pdimm[slot].dq_mapping[0];
+               dq_mapping_2 = pdimm[slot].dq_mapping[2];
+               dq_mapping_3 = pdimm[slot].dq_mapping[3];
+               pdimm[slot].dq_mapping[0] = pdimm[slot].dq_mapping[8];
+               pdimm[slot].dq_mapping[1] = pdimm[slot].dq_mapping[9];
+               pdimm[slot].dq_mapping[2] = pdimm[slot].dq_mapping[6];
+               pdimm[slot].dq_mapping[3] = pdimm[slot].dq_mapping[7];
+               pdimm[slot].dq_mapping[6] = dq_mapping_2;
+               pdimm[slot].dq_mapping[7] = dq_mapping_3;
+               pdimm[slot].dq_mapping[8] = dq_mapping_0;
+               pdimm[slot].dq_mapping[9] = 0;
+               pdimm[slot].dq_mapping[10] = 0;
+               pdimm[slot].dq_mapping[11] = 0;
+               pdimm[slot].dq_mapping[12] = 0;
+               pdimm[slot].dq_mapping[13] = 0;
+               pdimm[slot].dq_mapping[14] = 0;
+               pdimm[slot].dq_mapping[15] = 0;
+               pdimm[slot].dq_mapping[16] = 0;
+               pdimm[slot].dq_mapping[17] = 0;
+       }
+       /* To work at higher than 1333MT/s */
+       popts->half_strength_driver_enable = 0;
+       /*
+        * Write leveling override
+        */
+       popts->wrlvl_override = 1;
+       popts->wrlvl_sample = 0x0;      /* 32 clocks */
+
+       /*
+        * Rtt and Rtt_WR override
+        */
+       popts->rtt_override = 0;
+
+       /* Enable ZQ calibration */
+       popts->zq_en = 1;
+
+       if (ddr_freq < 2350) {
+               popts->ddr_cdr1 = DDR_CDR1_DHC_EN |
+                                 DDR_CDR1_ODT(DDR_CDR_ODT_60ohm);
+               popts->ddr_cdr2 = DDR_CDR2_ODT(DDR_CDR_ODT_60ohm) |
+                                 DDR_CDR2_VREF_RANGE_2;
+       } else {
+               popts->ddr_cdr1 = DDR_CDR1_DHC_EN |
+                                 DDR_CDR1_ODT(DDR_CDR_ODT_100ohm);
+               popts->ddr_cdr2 = DDR_CDR2_ODT(DDR_CDR_ODT_100ohm) |
+                                 DDR_CDR2_VREF_RANGE_2;
+       }
+}
+
+phys_size_t initdram(int board_type)
+{
+       phys_size_t dram_size;
+
+#if defined(CONFIG_SPL) && !defined(CONFIG_SPL_BUILD)
+       return fsl_ddr_sdram_size();
+#else
+       puts("Initializing DDR....using SPD\n");
+
+       dram_size = fsl_ddr_sdram();
+#endif
+
+       return dram_size;
+}
+
+void dram_init_banksize(void)
+{
+#ifdef CONFIG_SYS_DP_DDR_BASE_PHY
+       phys_size_t dp_ddr_size;
+#endif
+
+       gd->bd->bi_dram[0].start = CONFIG_SYS_SDRAM_BASE;
+       if (gd->ram_size > CONFIG_SYS_LS2_DDR_BLOCK1_SIZE) {
+               gd->bd->bi_dram[0].size = CONFIG_SYS_LS2_DDR_BLOCK1_SIZE;
+               gd->bd->bi_dram[1].start = CONFIG_SYS_DDR_BLOCK2_BASE;
+               gd->bd->bi_dram[1].size = gd->ram_size -
+                                         CONFIG_SYS_LS2_DDR_BLOCK1_SIZE;
+       } else {
+               gd->bd->bi_dram[0].size = gd->ram_size;
+       }
+
+#ifdef CONFIG_SYS_DP_DDR_BASE_PHY
+       /* initialize DP-DDR here */
+       puts("DP-DDR:  ");
+       /*
+        * DDR controller use 0 as the base address for binding.
+        * It is mapped to CONFIG_SYS_DP_DDR_BASE for core to access.
+        */
+       dp_ddr_size = fsl_other_ddr_sdram(CONFIG_SYS_DP_DDR_BASE_PHY,
+                                         CONFIG_DP_DDR_CTRL,
+                                         CONFIG_DP_DDR_NUM_CTRLS,
+                                         CONFIG_DP_DDR_DIMM_SLOTS_PER_CTLR,
+                                         NULL, NULL, NULL);
+       if (dp_ddr_size) {
+               gd->bd->bi_dram[2].start = CONFIG_SYS_DP_DDR_BASE;
+               gd->bd->bi_dram[2].size = dp_ddr_size;
+       } else {
+               puts("Not detected");
+       }
+#endif
+}
diff --git a/board/freescale/ls2085ardb/ddr.h b/board/freescale/ls2085ardb/ddr.h
new file mode 100644 (file)
index 0000000..bda9d4a
--- /dev/null
@@ -0,0 +1,92 @@
+/*
+ * Copyright 2015 Freescale Semiconductor, Inc.
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#ifndef __DDR_H__
+#define __DDR_H__
+struct board_specific_parameters {
+       u32 n_ranks;
+       u32 datarate_mhz_high;
+       u32 rank_gb;
+       u32 clk_adjust;
+       u32 wrlvl_start;
+       u32 wrlvl_ctl_2;
+       u32 wrlvl_ctl_3;
+};
+
+/*
+ * These tables contain all valid speeds we want to override with board
+ * specific parameters. datarate_mhz_high values need to be in ascending order
+ * for each n_ranks group.
+ */
+
+static const struct board_specific_parameters udimm0[] = {
+       /*
+        * memory controller 0
+        *   num|  hi| rank|  clk| wrlvl |   wrlvl   |  wrlvl
+        * ranks| mhz| GB  |adjst| start |   ctl2    |  ctl3
+        */
+       {2,  1350, 0, 4,     6, 0x0708090B, 0x0C0D0E09,},
+       {2,  1666, 0, 4,     8, 0x08090B0D, 0x0E10100C,},
+       {2,  1900, 0, 4,     8, 0x090A0C0E, 0x1012120D,},
+       {2,  2300, 0, 4,     9, 0x0A0B0C10, 0x1114140E,},
+       {}
+};
+
+/* DP-DDR DIMM */
+static const struct board_specific_parameters udimm2[] = {
+       /*
+        * memory controller 2
+        *   num|  hi| rank|  clk| wrlvl |   wrlvl   |  wrlvl
+        * ranks| mhz| GB  |adjst| start |   ctl2    |  ctl3
+        */
+       {2,  1350, 0, 4,   0xd, 0x0C0A0A00, 0x00000009,},
+       {2,  1666, 0, 4,   0xd, 0x0C0A0A00, 0x00000009,},
+       {2,  1900, 0, 4,   0xe, 0x0D0C0B00, 0x0000000A,},
+       {2,  2200, 0, 4,   0xe, 0x0D0C0B00, 0x0000000A,},
+       {}
+};
+
+static const struct board_specific_parameters rdimm0[] = {
+       /*
+        * memory controller 0
+        *   num|  hi| rank|  clk| wrlvl |   wrlvl   |  wrlvl
+        * ranks| mhz| GB  |adjst| start |   ctl2    |  ctl3
+        */
+       {2,  1350, 0, 4,     6, 0x0708090B, 0x0C0D0E09,},
+       {2,  1666, 0, 4,     7, 0x08090A0C, 0x0D0F100B,},
+       {2,  1900, 0, 4,     7, 0x09090B0D, 0x0E10120B,},
+       {2,  2200, 0, 4,     8, 0x090A0C0F, 0x1012130C,},
+       {}
+};
+
+/* DP-DDR DIMM */
+static const struct board_specific_parameters rdimm2[] = {
+       /*
+        * memory controller 2
+        *   num|  hi| rank|  clk| wrlvl |   wrlvl   |  wrlvl
+        * ranks| mhz| GB  |adjst| start |   ctl2    |  ctl3
+        */
+       {2,  1350, 0, 4,     6, 0x0708090B, 0x0C0D0E09,},
+       {2,  1666, 0, 4,     7, 0x0B0A090C, 0x0D0F100B,},
+       {2,  1900, 0, 4,     7, 0x09090B0D, 0x0E10120B,},
+       {2,  2200, 0, 4,     8, 0x090A0C0F, 0x1012130C,},
+       {}
+};
+
+static const struct board_specific_parameters *udimms[] = {
+       udimm0,
+       udimm0,
+       udimm2,
+};
+
+static const struct board_specific_parameters *rdimms[] = {
+       rdimm0,
+       rdimm0,
+       rdimm2,
+};
+
+
+#endif
diff --git a/board/freescale/ls2085ardb/ls2085ardb.c b/board/freescale/ls2085ardb/ls2085ardb.c
new file mode 100644 (file)
index 0000000..d05f2bc
--- /dev/null
@@ -0,0 +1,249 @@
+/*
+ * Copyright 2015 Freescale Semiconductor
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+#include <common.h>
+#include <malloc.h>
+#include <errno.h>
+#include <netdev.h>
+#include <fsl_ifc.h>
+#include <fsl_ddr.h>
+#include <asm/io.h>
+#include <fdt_support.h>
+#include <libfdt.h>
+#include <fsl_debug_server.h>
+#include <fsl-mc/fsl_mc.h>
+#include <environment.h>
+#include <i2c.h>
+#include <asm/arch-fsl-lsch3/soc.h>
+
+#include "../common/qixis.h"
+#include "ls2085ardb_qixis.h"
+
+DECLARE_GLOBAL_DATA_PTR;
+
+unsigned long long get_qixis_addr(void)
+{
+       unsigned long long addr;
+
+       if (gd->flags & GD_FLG_RELOC)
+               addr = QIXIS_BASE_PHYS;
+       else
+               addr = QIXIS_BASE_PHYS_EARLY;
+
+       /*
+        * IFC address under 256MB is mapped to 0x30000000, any address above
+        * is mapped to 0x5_10000000 up to 4GB.
+        */
+       addr = addr  > 0x10000000 ? addr + 0x500000000ULL : addr + 0x30000000;
+
+       return addr;
+}
+
+int checkboard(void)
+{
+       u8 sw;
+
+       sw = QIXIS_READ(arch);
+       printf("Board: %s, ", CONFIG_IDENT_STRING);
+       printf("Board Arch: V%d, ", sw >> 4);
+       printf("Board version: %c, boot from ", (sw & 0xf) + 'A' - 1);
+
+       sw = QIXIS_READ(brdcfg[0]);
+       sw = (sw & QIXIS_LBMAP_MASK) >> QIXIS_LBMAP_SHIFT;
+
+       if (sw < 0x8)
+               printf("vBank: %d\n", sw);
+       else if (sw == 0x9)
+               puts("NAND\n");
+       else
+               printf("invalid setting of SW%u\n", QIXIS_LBMAP_SWITCH);
+
+       printf("FPGA: v%d.%d\n", QIXIS_READ(scver), QIXIS_READ(tagdata));
+
+       puts("SERDES1 Reference : ");
+       printf("Clock1 = 156.25MHz ");
+       printf("Clock2 = 156.25MHz");
+
+       puts("\nSERDES2 Reference : ");
+       printf("Clock1 = 100MHz ");
+       printf("Clock2 = 100MHz\n");
+
+       return 0;
+}
+
+unsigned long get_board_sys_clk(void)
+{
+       u8 sysclk_conf = QIXIS_READ(brdcfg[1]);
+
+       switch (sysclk_conf & 0x0F) {
+       case QIXIS_SYSCLK_83:
+               return 83333333;
+       case QIXIS_SYSCLK_100:
+               return 100000000;
+       case QIXIS_SYSCLK_125:
+               return 125000000;
+       case QIXIS_SYSCLK_133:
+               return 133333333;
+       case QIXIS_SYSCLK_150:
+               return 150000000;
+       case QIXIS_SYSCLK_160:
+               return 160000000;
+       case QIXIS_SYSCLK_166:
+               return 166666666;
+       }
+       return 66666666;
+}
+
+int select_i2c_ch_pca9547(u8 ch)
+{
+       int ret;
+
+       ret = i2c_write(I2C_MUX_PCA_ADDR_PRI, 0, 1, &ch, 1);
+       if (ret) {
+               puts("PCA: failed to select proper channel\n");
+               return ret;
+       }
+
+       return 0;
+}
+
+int board_init(void)
+{
+       init_final_memctl_regs();
+
+#ifdef CONFIG_ENV_IS_NOWHERE
+       gd->env_addr = (ulong)&default_environment[0];
+#endif
+       select_i2c_ch_pca9547(I2C_MUX_CH_DEFAULT);
+
+       QIXIS_WRITE(rst_ctl, QIXIS_RST_CTL_RESET_EN);
+
+       return 0;
+}
+
+int board_early_init_f(void)
+{
+       fsl_lsch3_early_init_f();
+       return 0;
+}
+
+void detail_board_ddr_info(void)
+{
+       puts("\nDDR    ");
+       print_size(gd->bd->bi_dram[0].size + gd->bd->bi_dram[1].size, "");
+       print_ddr_info(0);
+       if (gd->bd->bi_dram[2].size) {
+               puts("\nDP-DDR ");
+               print_size(gd->bd->bi_dram[2].size, "");
+               print_ddr_info(CONFIG_DP_DDR_CTRL);
+       }
+}
+
+int dram_init(void)
+{
+       gd->ram_size = initdram(0);
+
+       return 0;
+}
+
+#if defined(CONFIG_ARCH_MISC_INIT)
+int arch_misc_init(void)
+{
+#ifdef CONFIG_FSL_DEBUG_SERVER
+       debug_server_init();
+#endif
+
+       return 0;
+}
+#endif
+
+unsigned long get_dram_size_to_hide(void)
+{
+       unsigned long dram_to_hide = 0;
+
+/* Carve the Debug Server private DRAM block from the end of DRAM */
+#ifdef CONFIG_FSL_DEBUG_SERVER
+       dram_to_hide += debug_server_get_dram_block_size();
+#endif
+
+/* Carve the MC private DRAM block from the end of DRAM */
+#ifdef CONFIG_FSL_MC_ENET
+       dram_to_hide += mc_get_dram_block_size();
+#endif
+
+       return dram_to_hide;
+}
+
+int board_eth_init(bd_t *bis)
+{
+       int error = 0;
+
+#ifdef CONFIG_FSL_MC_ENET
+       error = cpu_eth_init(bis);
+#endif
+
+       error = pci_eth_init(bis);
+
+       return error;
+}
+
+#ifdef CONFIG_FSL_MC_ENET
+void fdt_fixup_board_enet(void *fdt)
+{
+       int offset;
+
+       offset = fdt_path_offset(fdt, "/fsl-mc");
+
+       if (offset < 0)
+               offset = fdt_path_offset(fdt, "/fsl,dprc@0");
+
+       if (offset < 0) {
+               printf("%s: ERROR: fsl-mc node not found in device tree (error %d)\n",
+                      __func__, offset);
+               return;
+       }
+
+       if (get_mc_boot_status() == 0)
+               fdt_status_okay(fdt, offset);
+       else
+               fdt_status_fail(fdt, offset);
+}
+#endif
+
+#ifdef CONFIG_OF_BOARD_SETUP
+int ft_board_setup(void *blob, bd_t *bd)
+{
+       phys_addr_t base;
+       phys_size_t size;
+
+       ft_cpu_setup(blob, bd);
+
+       /* limit the memory size to bank 1 until Linux can handle 40-bit PA */
+       base = getenv_bootm_low();
+       size = getenv_bootm_size();
+       fdt_fixup_memory(blob, (u64)base, (u64)size);
+
+#ifdef CONFIG_FSL_MC_ENET
+       fdt_fixup_board_enet(blob);
+       fsl_mc_ldpaa_exit(bd);
+#endif
+
+       return 0;
+}
+#endif
+
+void qixis_dump_switch(void)
+{
+       int i, nr_of_cfgsw;
+
+       QIXIS_WRITE(cms[0], 0x00);
+       nr_of_cfgsw = QIXIS_READ(cms[1]);
+
+       puts("DIP switch settings dump:\n");
+       for (i = 1; i <= nr_of_cfgsw; i++) {
+               QIXIS_WRITE(cms[0], i);
+               printf("SW%d = (0x%02x)\n", i, QIXIS_READ(cms[1]));
+       }
+}
diff --git a/board/freescale/ls2085ardb/ls2085ardb_qixis.h b/board/freescale/ls2085ardb/ls2085ardb_qixis.h
new file mode 100644 (file)
index 0000000..cb60c00
--- /dev/null
@@ -0,0 +1,20 @@
+/*
+ * Copyright 2015 Freescale Semiconductor, Inc.
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#ifndef __LS2_RDB_QIXIS_H__
+#define __LS2_RDB_QIXIS_H__
+
+/* SYSCLK */
+#define QIXIS_SYSCLK_66                        0x0
+#define QIXIS_SYSCLK_83                        0x1
+#define QIXIS_SYSCLK_100               0x2
+#define QIXIS_SYSCLK_125               0x3
+#define QIXIS_SYSCLK_133               0x4
+#define QIXIS_SYSCLK_150               0x5
+#define QIXIS_SYSCLK_160               0x6
+#define QIXIS_SYSCLK_166               0x7
+
+#endif /*__LS2_RDB_QIXIS_H__*/
diff --git a/board/freescale/m5208evbe/u-boot.lds b/board/freescale/m5208evbe/u-boot.lds
deleted file mode 100644 (file)
index 8b1a59d..0000000
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * (C) Copyright 2000
- * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
- *
- * SPDX-License-Identifier:    GPL-2.0+
- */
-
-OUTPUT_ARCH(m68k)
-
-SECTIONS
-{
-  /* Read-only sections, merged into text segment: */
-  .text      :
-  {
-    arch/m68k/cpu/mcf52x2/start.o              (.text*)
-
-    . = DEFINED(env_offset) ? env_offset : .;
-    common/env_embedded.o      (.text*)
-
-    *(.text*)
-  }
-  _etext = .;
-  PROVIDE (etext = .);
-  .rodata    :
-  {
-    *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*)))
-  }
-
-  /* Read-write section, merged into data segment: */
-  . = (. + 0x00FF) & 0xFFFFFF00;
-  _erotext = .;
-  PROVIDE (erotext = .);
-
-  .reloc   :
-  {
-    __got_start = .;
-    KEEP(*(.got))
-    __got_end = .;
-    _GOT2_TABLE_ = .;
-    KEEP(*(.got2))
-    _FIXUP_TABLE_ = .;
-    KEEP(*(.fixup))
-  }
-  __got2_entries = (_FIXUP_TABLE_ - _GOT2_TABLE_) >>2;
-  __fixup_entries = (. - _FIXUP_TABLE_)>>2;
-
-  .data    :
-  {
-    *(.data*)
-    *(.sdata*)
-  }
-  _edata  =  .;
-  PROVIDE (edata = .);
-
-  . = .;
-
-  . = ALIGN(4);
-  .u_boot_list : {
-       KEEP(*(SORT(.u_boot_list*)));
-  }
-
-  . = .;
-  __start___ex_table = .;
-  __ex_table : { *(__ex_table) }
-  __stop___ex_table = .;
-
-  . = ALIGN(256);
-  __init_begin = .;
-  .text.init : { *(.text.init) }
-  .data.init : { *(.data.init) }
-  . = ALIGN(256);
-  __init_end = .;
-
-  __bss_start = .;
-  .bss (NOLOAD)       :
-  {
-   _sbss = .;
-   *(.sbss*)
-   *(.bss*)
-   *(COMMON)
-   . = ALIGN(4);
-   _ebss = .;
-  }
-  __bss_end = . ;
-  PROVIDE (end = .);
-}
diff --git a/board/freescale/m52277evb/u-boot.lds b/board/freescale/m52277evb/u-boot.lds
deleted file mode 100644 (file)
index 70121d9..0000000
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * (C) Copyright 2000
- * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
- *
- * SPDX-License-Identifier:    GPL-2.0+
- */
-
-OUTPUT_ARCH(m68k)
-
-SECTIONS
-{
-  /* Read-only sections, merged into text segment: */
-  .text      :
-  {
-    arch/m68k/cpu/mcf5227x/start.o     (.text*)
-    arch/m68k/cpu/mcf5227x/built-in.o  (.text*)
-    arch/m68k/lib/built-in.o           (.text*)
-
-    *(.text*)
-  }
-  _etext = .;
-  PROVIDE (etext = .);
-  .rodata    :
-  {
-    *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*)))
-  }
-
-  /* Read-write section, merged into data segment: */
-  . = (. + 0x00FF) & 0xFFFFFF00;
-  _erotext = .;
-  PROVIDE (erotext = .);
-
-  .reloc   :
-  {
-    __got_start = .;
-    KEEP(*(.got))
-    __got_end = .;
-    _GOT2_TABLE_ = .;
-    KEEP(*(.got2))
-    _FIXUP_TABLE_ = .;
-    KEEP(*(.fixup))
-  }
-  __got2_entries = (_FIXUP_TABLE_ - _GOT2_TABLE_) >>2;
-  __fixup_entries = (. - _FIXUP_TABLE_)>>2;
-
-  .data    :
-  {
-    *(.data*)
-    *(.sdata*)
-  }
-  _edata  =  .;
-  PROVIDE (edata = .);
-
-  . = .;
-
-  . = ALIGN(4);
-  .u_boot_list : {
-       KEEP(*(SORT(.u_boot_list*)));
-  }
-
-  . = .;
-  __start___ex_table = .;
-  __ex_table : { *(__ex_table) }
-  __stop___ex_table = .;
-
-  . = ALIGN(256);
-  __init_begin = .;
-  .text.init : { *(.text.init) }
-  .data.init : { *(.data.init) }
-  . = ALIGN(256);
-  __init_end = .;
-
-  __bss_start = .;
-  .bss (NOLOAD)      :
-  {
-   _sbss = .;
-   *(.sbss*)
-   *(.bss*)
-   *(COMMON)
-   . = ALIGN(4);
-   _ebss = .;
-  }
-  __bss_end = . ;
-  PROVIDE (end = .);
-}
diff --git a/board/freescale/m5235evb/u-boot.lds b/board/freescale/m5235evb/u-boot.lds
deleted file mode 100644 (file)
index ccfb5d6..0000000
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * (C) Copyright 2000
- * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
- *
- * SPDX-License-Identifier:    GPL-2.0+
- */
-
-OUTPUT_ARCH(m68k)
-
-SECTIONS
-{
-  .text      :
-  {
-    arch/m68k/cpu/mcf523x/start.o              (.text*)
-
-    . = DEFINED(env_offset) ? env_offset : .;
-    common/env_embedded.o      (.text)
-
-    *(.text*)
-  }
-  _etext = .;
-  PROVIDE (etext = .);
-  .rodata    :
-  {
-    *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*)))
-  }
-
-  /* Read-write section, merged into data segment: */
-  . = (. + 0x00FF) & 0xFFFFFF00;
-  _erotext = .;
-  PROVIDE (erotext = .);
-
-  .reloc   :
-  {
-    __got_start = .;
-    KEEP(*(.got))
-    __got_end = .;
-    _GOT2_TABLE_ = .;
-    KEEP(*(.got2))
-    _FIXUP_TABLE_ = .;
-    KEEP(*(.fixup))
-  }
-  __got2_entries = (_FIXUP_TABLE_ - _GOT2_TABLE_) >>2;
-  __fixup_entries = (. - _FIXUP_TABLE_)>>2;
-
-  .data    :
-  {
-    *(.data*)
-    *(.sdata*)
-  }
-  _edata  =  .;
-  PROVIDE (edata = .);
-
-  . = .;
-
-  . = ALIGN(4);
-  .u_boot_list : {
-       KEEP(*(SORT(.u_boot_list*)));
-  }
-
-  . = .;
-  __start___ex_table = .;
-  __ex_table : { *(__ex_table) }
-  __stop___ex_table = .;
-
-  . = ALIGN(256);
-  __init_begin = .;
-  .text.init : { *(.text.init) }
-  .data.init : { *(.data.init) }
-  . = ALIGN(256);
-  __init_end = .;
-
-  __bss_start = .;
-  .bss (NOLOAD)      :
-  {
-   _sbss = .;
-   *(.bss*)
-   *(.sbss*)
-   *(COMMON)
-   . = ALIGN(4);
-   _ebss = .;
-  }
-  __bss_end = . ;
-  PROVIDE (end = .);
-}
diff --git a/board/freescale/m5249evb/u-boot.lds b/board/freescale/m5249evb/u-boot.lds
deleted file mode 100644 (file)
index e91b7e1..0000000
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * (C) Copyright 2000
- * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
- *
- * SPDX-License-Identifier:    GPL-2.0+
- */
-
-OUTPUT_ARCH(m68k)
-
-SECTIONS
-{
-  .text      :
-  {
-    arch/m68k/cpu/mcf52x2/start.o      (.text*)
-
-    . = DEFINED(env_offset) ? env_offset : .;
-    common/env_embedded.o      (.text)
-
-    *(.text*)
-  }
-  _etext = .;
-  PROVIDE (etext = .);
-  .rodata    :
-  {
-    *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*)))
-  }
-
-  /* Read-write section, merged into data segment: */
-  . = (. + 0x00FF) & 0xFFFFFF00;
-  _erotext = .;
-  PROVIDE (erotext = .);
-
-  .reloc   :
-  {
-    __got_start = .;
-    KEEP(*(.got))
-    __got_end = .;
-    _GOT2_TABLE_ = .;
-    KEEP(*(.got2))
-    _FIXUP_TABLE_ = .;
-    KEEP(*(.fixup))
-  }
-  __got2_entries = (_FIXUP_TABLE_ - _GOT2_TABLE_) >>2;
-  __fixup_entries = (. - _FIXUP_TABLE_)>>2;
-
-  .data    :
-  {
-    *(.data*)
-    *(.sdata*)
-  }
-  _edata  =  .;
-  PROVIDE (edata = .);
-
-  . = .;
-
-  . = ALIGN(4);
-  .u_boot_list : {
-       KEEP(*(SORT(.u_boot_list*)));
-  }
-
-  . = .;
-  __start___ex_table = .;
-  __ex_table : { *(__ex_table) }
-  __stop___ex_table = .;
-
-  . = ALIGN(256);
-  __init_begin = .;
-  .text.init : { *(.text.init) }
-  .data.init : { *(.data.init) }
-  . = ALIGN(256);
-  __init_end = .;
-
-  __bss_start = .;
-  .bss (NOLOAD)      :
-  {
-   _sbss = .;
-   *(.bss*)
-   *(.sbss*)
-   *(COMMON)
-   . = ALIGN(4);
-   _ebss = .;
-  }
-  __bss_end = . ;
-  PROVIDE (end = .);
-}
diff --git a/board/freescale/m5253demo/u-boot.lds b/board/freescale/m5253demo/u-boot.lds
deleted file mode 100644 (file)
index cd3d70a..0000000
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * (C) Copyright 2000
- * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
- *
- * SPDX-License-Identifier:    GPL-2.0+
- */
-
-OUTPUT_ARCH(m68k)
-
-SECTIONS
-{
-  /* Read-only sections, merged into text segment: */
-  .text      :
-  {
-    arch/m68k/cpu/mcf52x2/start.o              (.text*)
-
-    . = DEFINED(env_offset) ? env_offset : .;
-    common/env_embedded.o      (.text*)
-
-    *(.text*)
-  }
-  _etext = .;
-  PROVIDE (etext = .);
-  .rodata    :
-  {
-    *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*)))
-  }
-
-  /* Read-write section, merged into data segment: */
-  . = (. + 0x00FF) & 0xFFFFFF00;
-  _erotext = .;
-  PROVIDE (erotext = .);
-
-  .reloc   :
-  {
-    __got_start = .;
-    KEEP(*(.got))
-    __got_end = .;
-    _GOT2_TABLE_ = .;
-    KEEP(*(.got2))
-    _FIXUP_TABLE_ = .;
-    KEEP(*(.fixup))
-  }
-  __got2_entries = (_FIXUP_TABLE_ - _GOT2_TABLE_) >>2;
-  __fixup_entries = (. - _FIXUP_TABLE_)>>2;
-
-  .data    :
-  {
-    *(.data*)
-    *(.sdata*)
-  }
-  _edata  =  .;
-  PROVIDE (edata = .);
-
-  . = .;
-
-  . = ALIGN(4);
-  .u_boot_list : {
-       KEEP(*(SORT(.u_boot_list*)));
-  }
-
-  . = .;
-  __start___ex_table = .;
-  __ex_table : { *(__ex_table) }
-  __stop___ex_table = .;
-
-  . = ALIGN(256);
-  __init_begin = .;
-  .text.init : { *(.text.init) }
-  .data.init : { *(.data.init) }
-  . = ALIGN(256);
-  __init_end = .;
-
-  __bss_start = .;
-  .bss       :
-  {
-   _sbss = .;
-   *(.sbss*)
-   *(.bss*)
-   *(COMMON)
-   . = ALIGN(4);
-   _ebss = .;
-  }
-  __bss_end = . ;
-  PROVIDE (end = .);
-}
diff --git a/board/freescale/m5253evbe/u-boot.lds b/board/freescale/m5253evbe/u-boot.lds
deleted file mode 100644 (file)
index e91b7e1..0000000
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * (C) Copyright 2000
- * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
- *
- * SPDX-License-Identifier:    GPL-2.0+
- */
-
-OUTPUT_ARCH(m68k)
-
-SECTIONS
-{
-  .text      :
-  {
-    arch/m68k/cpu/mcf52x2/start.o      (.text*)
-
-    . = DEFINED(env_offset) ? env_offset : .;
-    common/env_embedded.o      (.text)
-
-    *(.text*)
-  }
-  _etext = .;
-  PROVIDE (etext = .);
-  .rodata    :
-  {
-    *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*)))
-  }
-
-  /* Read-write section, merged into data segment: */
-  . = (. + 0x00FF) & 0xFFFFFF00;
-  _erotext = .;
-  PROVIDE (erotext = .);
-
-  .reloc   :
-  {
-    __got_start = .;
-    KEEP(*(.got))
-    __got_end = .;
-    _GOT2_TABLE_ = .;
-    KEEP(*(.got2))
-    _FIXUP_TABLE_ = .;
-    KEEP(*(.fixup))
-  }
-  __got2_entries = (_FIXUP_TABLE_ - _GOT2_TABLE_) >>2;
-  __fixup_entries = (. - _FIXUP_TABLE_)>>2;
-
-  .data    :
-  {
-    *(.data*)
-    *(.sdata*)
-  }
-  _edata  =  .;
-  PROVIDE (edata = .);
-
-  . = .;
-
-  . = ALIGN(4);
-  .u_boot_list : {
-       KEEP(*(SORT(.u_boot_list*)));
-  }
-
-  . = .;
-  __start___ex_table = .;
-  __ex_table : { *(__ex_table) }
-  __stop___ex_table = .;
-
-  . = ALIGN(256);
-  __init_begin = .;
-  .text.init : { *(.text.init) }
-  .data.init : { *(.data.init) }
-  . = ALIGN(256);
-  __init_end = .;
-
-  __bss_start = .;
-  .bss (NOLOAD)      :
-  {
-   _sbss = .;
-   *(.bss*)
-   *(.sbss*)
-   *(COMMON)
-   . = ALIGN(4);
-   _ebss = .;
-  }
-  __bss_end = . ;
-  PROVIDE (end = .);
-}
diff --git a/board/freescale/m5272c3/u-boot.lds b/board/freescale/m5272c3/u-boot.lds
deleted file mode 100644 (file)
index e91b7e1..0000000
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * (C) Copyright 2000
- * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
- *
- * SPDX-License-Identifier:    GPL-2.0+
- */
-
-OUTPUT_ARCH(m68k)
-
-SECTIONS
-{
-  .text      :
-  {
-    arch/m68k/cpu/mcf52x2/start.o      (.text*)
-
-    . = DEFINED(env_offset) ? env_offset : .;
-    common/env_embedded.o      (.text)
-
-    *(.text*)
-  }
-  _etext = .;
-  PROVIDE (etext = .);
-  .rodata    :
-  {
-    *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*)))
-  }
-
-  /* Read-write section, merged into data segment: */
-  . = (. + 0x00FF) & 0xFFFFFF00;
-  _erotext = .;
-  PROVIDE (erotext = .);
-
-  .reloc   :
-  {
-    __got_start = .;
-    KEEP(*(.got))
-    __got_end = .;
-    _GOT2_TABLE_ = .;
-    KEEP(*(.got2))
-    _FIXUP_TABLE_ = .;
-    KEEP(*(.fixup))
-  }
-  __got2_entries = (_FIXUP_TABLE_ - _GOT2_TABLE_) >>2;
-  __fixup_entries = (. - _FIXUP_TABLE_)>>2;
-
-  .data    :
-  {
-    *(.data*)
-    *(.sdata*)
-  }
-  _edata  =  .;
-  PROVIDE (edata = .);
-
-  . = .;
-
-  . = ALIGN(4);
-  .u_boot_list : {
-       KEEP(*(SORT(.u_boot_list*)));
-  }
-
-  . = .;
-  __start___ex_table = .;
-  __ex_table : { *(__ex_table) }
-  __stop___ex_table = .;
-
-  . = ALIGN(256);
-  __init_begin = .;
-  .text.init : { *(.text.init) }
-  .data.init : { *(.data.init) }
-  . = ALIGN(256);
-  __init_end = .;
-
-  __bss_start = .;
-  .bss (NOLOAD)      :
-  {
-   _sbss = .;
-   *(.bss*)
-   *(.sbss*)
-   *(COMMON)
-   . = ALIGN(4);
-   _ebss = .;
-  }
-  __bss_end = . ;
-  PROVIDE (end = .);
-}
diff --git a/board/freescale/m5275evb/u-boot.lds b/board/freescale/m5275evb/u-boot.lds
deleted file mode 100644 (file)
index 3112cbe..0000000
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * (C) Copyright 2000-2003
- * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
- *
- * SPDX-License-Identifier:    GPL-2.0+
- */
-
-OUTPUT_ARCH(m68k)
-
-SECTIONS
-{
-  .text      :
-  {
-    arch/m68k/cpu/mcf52x2/start.o      (.text*)
-
-    . = DEFINED(env_offset) ? env_offset : .;
-    common/env_embedded.o      (.text)
-
-    *(.text*)
-  }
-  _etext = .;
-  PROVIDE (etext = .);
-  .rodata    :
-  {
-    *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*)))
-  }
-
-  /* Read-write section, merged into data segment: */
-  . = (. + 0x00FF) & 0xFFFFFF00;
-  _erotext = .;
-  PROVIDE (erotext = .);
-
-  .reloc   :
-  {
-    __got_start = .;
-    KEEP(*(.got))
-    __got_end = .;
-    _GOT2_TABLE_ = .;
-    KEEP(*(.got2))
-    _FIXUP_TABLE_ = .;
-    KEEP(*(.fixup))
-  }
-  __got2_entries = (_FIXUP_TABLE_ - _GOT2_TABLE_) >>2;
-  __fixup_entries = (. - _FIXUP_TABLE_)>>2;
-
-  .data    :
-  {
-    *(.data*)
-    *(.sdata*)
-  }
-  _edata  =  .;
-  PROVIDE (edata = .);
-
-  . = .;
-
-  . = ALIGN(4);
-  .u_boot_list : {
-       KEEP(*(SORT(.u_boot_list*)));
-  }
-
-  . = .;
-  __start___ex_table = .;
-  __ex_table : { *(__ex_table) }
-  __stop___ex_table = .;
-
-  . = ALIGN(256);
-  __init_begin = .;
-  .text.init : { *(.text.init) }
-  .data.init : { *(.data.init) }
-  . = ALIGN(256);
-  __init_end = .;
-
-  __bss_start = .;
-  .bss (NOLOAD)      :
-  {
-   _sbss = .;
-   *(.bss*)
-   *(.sbss*)
-   *(COMMON)
-   . = ALIGN(4);
-   _ebss = .;
-  }
-  __bss_end = . ;
-  PROVIDE (end = .);
-}
diff --git a/board/freescale/m5282evb/u-boot.lds b/board/freescale/m5282evb/u-boot.lds
deleted file mode 100644 (file)
index ce62ee9..0000000
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * (C) Copyright 2000-2003
- * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
- *
- * SPDX-License-Identifier:    GPL-2.0+
- */
-
-OUTPUT_ARCH(m68k)
-
-SECTIONS
-{
-  .text      :
-  {
-    arch/m68k/cpu/mcf52x2/start.o      (.text*)
-
-    . = DEFINED(env_offset) ? env_offset : .;
-    common/env_embedded.o      (.text*)
-
-    *(.text*)
-  }
-  _etext = .;
-  PROVIDE (etext = .);
-  .rodata    :
-  {
-    *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*)))
-  }
-
-  /* Read-write section, merged into data segment: */
-  . = (. + 0x00FF) & 0xFFFFFF00;
-  _erotext = .;
-  PROVIDE (erotext = .);
-
-  .reloc   :
-  {
-    __got_start = .;
-    KEEP(*(.got))
-    __got_end = .;
-    _GOT2_TABLE_ = .;
-    KEEP(*(.got2))
-    _FIXUP_TABLE_ = .;
-    KEEP(*(.fixup))
-  }
-  __got2_entries = (_FIXUP_TABLE_ - _GOT2_TABLE_) >>2;
-  __fixup_entries = (. - _FIXUP_TABLE_)>>2;
-
-  .data    :
-  {
-    *(.data*)
-    *(.sdata*)
-  }
-  _edata  =  .;
-  PROVIDE (edata = .);
-
-  . = .;
-
-  . = ALIGN(4);
-  .u_boot_list : {
-       KEEP(*(SORT(.u_boot_list*)));
-  }
-
-  . = .;
-  __start___ex_table = .;
-  __ex_table : { *(__ex_table) }
-  __stop___ex_table = .;
-
-  . = ALIGN(256);
-  __init_begin = .;
-  .text.init : { *(.text.init) }
-  .data.init : { *(.data.init) }
-  . = ALIGN(256);
-  __init_end = .;
-
-  __bss_start = .;
-  .bss (NOLOAD)      :
-  {
-   _sbss = .;
-   *(.bss*)
-   *(.sbss*)
-   *(COMMON)
-   . = ALIGN(4);
-   _ebss = .;
-  }
-  __bss_end = . ;
-  PROVIDE (end = .);
-}
diff --git a/board/freescale/m53017evb/u-boot.lds b/board/freescale/m53017evb/u-boot.lds
deleted file mode 100644 (file)
index b1cae59..0000000
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * (C) Copyright 2000
- * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
- *
- * SPDX-License-Identifier:    GPL-2.0+
- */
-
-OUTPUT_ARCH(m68k)
-
-SECTIONS
-{
-  /* Read-only sections, merged into text segment: */
-  .text      :
-  {
-    arch/m68k/cpu/mcf532x/start.o      (.text*)
-
-    . = DEFINED(env_offset) ? env_offset : .;
-    common/env_embedded.o      (.text*)
-
-    *(.text*)
-  }
-  _etext = .;
-  PROVIDE (etext = .);
-  .rodata    :
-  {
-    *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*)))
-  }
-
-  /* Read-write section, merged into data segment: */
-  . = (. + 0x00FF) & 0xFFFFFF00;
-  _erotext = .;
-  PROVIDE (erotext = .);
-
-  .reloc   :
-  {
-    __got_start = .;
-    KEEP(*(.got))
-    __got_end = .;
-    _GOT2_TABLE_ = .;
-    KEEP(*(.got2))
-    _FIXUP_TABLE_ = .;
-    KEEP(*(.fixup))
-  }
-  __got2_entries = (_FIXUP_TABLE_ - _GOT2_TABLE_) >>2;
-  __fixup_entries = (. - _FIXUP_TABLE_)>>2;
-
-  .data    :
-  {
-    *(.data*)
-    *(.sdata*)
-  }
-  _edata  =  .;
-  PROVIDE (edata = .);
-
-  . = .;
-
-  . = ALIGN(4);
-  .u_boot_list : {
-       KEEP(*(SORT(.u_boot_list*)));
-  }
-
-  . = .;
-  __start___ex_table = .;
-  __ex_table : { *(__ex_table) }
-  __stop___ex_table = .;
-
-  . = ALIGN(256);
-  __init_begin = .;
-  .text.init : { *(.text.init) }
-  .data.init : { *(.data.init) }
-  . = ALIGN(256);
-  __init_end = .;
-
-  __bss_start = .;
-  .bss (NOLOAD)       :
-  {
-   _sbss = .;
-   *(.sbss*)
-   *(.bss*)
-   *(COMMON)
-   . = ALIGN(4);
-   _ebss = .;
-  }
-  __bss_end = . ;
-  PROVIDE (end = .);
-}
diff --git a/board/freescale/m5329evb/u-boot.lds b/board/freescale/m5329evb/u-boot.lds
deleted file mode 100644 (file)
index 097ac2e..0000000
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * (C) Copyright 2000
- * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
- *
- * SPDX-License-Identifier:    GPL-2.0+
- */
-
-OUTPUT_ARCH(m68k)
-
-SECTIONS
-{
-  /* Read-only sections, merged into text segment: */
-  .text      :
-  {
-    arch/m68k/cpu/mcf532x/start.o              (.text*)
-
-    . = DEFINED(env_offset) ? env_offset : .;
-    common/env_embedded.o      (.text*)
-
-    *(.text*)
-  }
-  _etext = .;
-  PROVIDE (etext = .);
-  .rodata    :
-  {
-    *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*)))
-  }
-
-  /* Read-write section, merged into data segment: */
-  . = (. + 0x00FF) & 0xFFFFFF00;
-  _erotext = .;
-  PROVIDE (erotext = .);
-
-  .reloc   :
-  {
-    __got_start = .;
-    KEEP(*(.got))
-    __got_end = .;
-    _GOT2_TABLE_ = .;
-    KEEP(*(.got2))
-    _FIXUP_TABLE_ = .;
-    KEEP(*(.fixup))
-  }
-  __got2_entries = (_FIXUP_TABLE_ - _GOT2_TABLE_) >>2;
-  __fixup_entries = (. - _FIXUP_TABLE_)>>2;
-
-  .data    :
-  {
-    *(.data*)
-    *(.sdata*)
-  }
-  _edata  =  .;
-  PROVIDE (edata = .);
-
-  . = .;
-
-  . = ALIGN(4);
-  .u_boot_list : {
-       KEEP(*(SORT(.u_boot_list*)));
-  }
-
-  . = .;
-  __start___ex_table = .;
-  __ex_table : { *(__ex_table) }
-  __stop___ex_table = .;
-
-  . = ALIGN(256);
-  __init_begin = .;
-  .text.init : { *(.text.init) }
-  .data.init : { *(.data.init) }
-  . = ALIGN(256);
-  __init_end = .;
-
-  __bss_start = .;
-  .bss (NOLOAD)       :
-  {
-   _sbss = .;
-   *(.sbss*)
-   *(.bss*)
-   *(COMMON)
-   . = ALIGN(4);
-   _ebss = .;
-  }
-  __bss_end = . ;
-  PROVIDE (end = .);
-}
diff --git a/board/freescale/m5373evb/u-boot.lds b/board/freescale/m5373evb/u-boot.lds
deleted file mode 100644 (file)
index 8ef0620..0000000
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * (C) Copyright 2000
- * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
- *
- * SPDX-License-Identifier:    GPL-2.0+
- */
-
-OUTPUT_ARCH(m68k)
-
-SECTIONS
-{
-  /* Read-only sections, merged into text segment: */
-  .text      :
-  {
-    arch/m68k/cpu/mcf532x/start.o              (.text*)
-
-    . = DEFINED(env_offset) ? env_offset : .;
-    common/env_embedded.o      (.text*)
-
-    *(.text*)
-  }
-  _etext = .;
-  PROVIDE (etext = .);
-  .rodata    :
-  {
-    *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*)))
-  }
-
-  /* Read-write section, merged into data segment: */
-  . = (. + 0x00FF) & 0xFFFFFF00;
-  _erotext = .;
-  PROVIDE (erotext = .);
-
-  .reloc   :
-  {
-    __got_start = .;
-    KEEP(*(.got))
-    __got_end = .;
-    _GOT2_TABLE_ = .;
-    KEEP(*(.got2))
-    _FIXUP_TABLE_ = .;
-    KEEP(*(.fixup))
-  }
-  __got2_entries = (_FIXUP_TABLE_ - _GOT2_TABLE_) >>2;
-  __fixup_entries = (. - _FIXUP_TABLE_)>>2;
-
-  .data    :
-  {
-    *(.data*)
-    *(.sdata*)
-  }
-  _edata  =  .;
-  PROVIDE (edata = .);
-
-  . = .;
-
-  . = ALIGN(4);
-  .u_boot_list : {
-       KEEP(*(SORT(.u_boot_list*)));
-  }
-
-  . = .;
-  __start___ex_table = .;
-  __ex_table : { *(__ex_table) }
-  __stop___ex_table = .;
-
-  . = ALIGN(256);
-  __init_begin = .;
-  .text.init : { *(.text.init) }
-  .data.init : { *(.data.init) }
-  . = ALIGN(256);
-  __init_end = .;
-
-  __bss_start = .;
-  .bss       :
-  {
-   _sbss = .;
-   *(.sbss*)
-   *(.bss*)
-   *(COMMON)
-   . = ALIGN(4);
-   _ebss = .;
-  }
-  __bss_end = . ;
-  PROVIDE (end = .);
-}
diff --git a/board/freescale/m54418twr/u-boot.lds b/board/freescale/m54418twr/u-boot.lds
deleted file mode 100644 (file)
index 5679d49..0000000
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * (C) Copyright 2000
- * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
- *
- * SPDX-License-Identifier:    GPL-2.0+
- */
-
-OUTPUT_ARCH(m68k)
-
-SECTIONS
-{
-  /* Read-only sections, merged into text segment: */
-  .text      :
-  {
-    arch/m68k/cpu/mcf5445x/start.o             (.text*)
-
-    *(.text*)
-  }
-  _etext = .;
-  PROVIDE (etext = .);
-  .rodata    :
-  {
-    *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*)))
-  }
-
-  /* Read-write section, merged into data segment: */
-  . = (. + 0x00FF) & 0xFFFFFF00;
-  _erotext = .;
-  PROVIDE (erotext = .);
-
-  .reloc   :
-  {
-    __got_start = .;
-    KEEP(*(.got))
-    __got_end = .;
-    _GOT2_TABLE_ = .;
-    KEEP(*(.got2))
-    _FIXUP_TABLE_ = .;
-    KEEP(*(.fixup))
-  }
-  __got2_entries = (_FIXUP_TABLE_ - _GOT2_TABLE_) >>2;
-  __fixup_entries = (. - _FIXUP_TABLE_)>>2;
-
-  .data    :
-  {
-    *(.data*)
-    *(.sdata*)
-  }
-  _edata  =  .;
-  PROVIDE (edata = .);
-
-  . = .;
-
-  . = ALIGN(4);
-  .u_boot_list : {
-       KEEP(*(SORT(.u_boot_list*)));
-  }
-
-  . = .;
-  __start___ex_table = .;
-  __ex_table : { *(__ex_table) }
-  __stop___ex_table = .;
-
-  . = ALIGN(256);
-  __init_begin = .;
-  .text.init : { *(.text.init) }
-  .data.init : { *(.data.init) }
-  . = ALIGN(256);
-  __init_end = .;
-
-  __bss_start = .;
-  .bss  (NOLOAD)     :
-  {
-   _sbss = .;
-   *(.bss*)
-   *(.sbss*)
-   *(COMMON)
-   . = ALIGN(4);
-   _ebss = .;
-  }
-  __bss_end = . ;
-  PROVIDE (end = .);
-}
diff --git a/board/freescale/m54451evb/u-boot.lds b/board/freescale/m54451evb/u-boot.lds
deleted file mode 100644 (file)
index 413ca53..0000000
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * (C) Copyright 2000
- * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
- *
- * SPDX-License-Identifier:    GPL-2.0+
- */
-
-OUTPUT_ARCH(m68k)
-
-SECTIONS
-{
-  /* Read-only sections, merged into text segment: */
-  .text      :
-  {
-    arch/m68k/cpu/mcf5445x/start.o             (.text*)
-
-    *(.text*)
-  }
-  _etext = .;
-  PROVIDE (etext = .);
-  .rodata    :
-  {
-     *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*)))
-  }
-
-  /* Read-write section, merged into data segment: */
-  . = (. + 0x00FF) & 0xFFFFFF00;
-  _erotext = .;
-  PROVIDE (erotext = .);
-
-  .reloc   :
-  {
-    __got_start = .;
-    KEEP(*(.got))
-    __got_end = .;
-    _GOT2_TABLE_ = .;
-    KEEP(*(.got2))
-    _FIXUP_TABLE_ = .;
-    KEEP(*(.fixup))
-  }
-  __got2_entries = (_FIXUP_TABLE_ - _GOT2_TABLE_) >>2;
-  __fixup_entries = (. - _FIXUP_TABLE_)>>2;
-
-  .data    :
-  {
-    *(.data*)
-    *(.sdata*)
-  }
-  _edata  =  .;
-  PROVIDE (edata = .);
-
-  . = .;
-
-  . = ALIGN(4);
-  .u_boot_list : {
-       KEEP(*(SORT(.u_boot_list*)));
-  }
-
-  . = .;
-  __start___ex_table = .;
-  __ex_table : { *(__ex_table) }
-  __stop___ex_table = .;
-
-  . = ALIGN(256);
-  __init_begin = .;
-  .text.init : { *(.text.init) }
-  .data.init : { *(.data.init) }
-  . = ALIGN(256);
-  __init_end = .;
-
-  __bss_start = .;
-  .bss   (NOLOAD)    :
-  {
-   _sbss = .;
-   *(.bss*)
-   *(.sbss*)
-   *(COMMON)
-   . = ALIGN(4);
-   _ebss = .;
-  }
-  __bss_end = . ;
-  PROVIDE (end = .);
-}
diff --git a/board/freescale/m54455evb/u-boot.lds b/board/freescale/m54455evb/u-boot.lds
deleted file mode 100644 (file)
index 5679d49..0000000
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * (C) Copyright 2000
- * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
- *
- * SPDX-License-Identifier:    GPL-2.0+
- */
-
-OUTPUT_ARCH(m68k)
-
-SECTIONS
-{
-  /* Read-only sections, merged into text segment: */
-  .text      :
-  {
-    arch/m68k/cpu/mcf5445x/start.o             (.text*)
-
-    *(.text*)
-  }
-  _etext = .;
-  PROVIDE (etext = .);
-  .rodata    :
-  {
-    *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*)))
-  }
-
-  /* Read-write section, merged into data segment: */
-  . = (. + 0x00FF) & 0xFFFFFF00;
-  _erotext = .;
-  PROVIDE (erotext = .);
-
-  .reloc   :
-  {
-    __got_start = .;
-    KEEP(*(.got))
-    __got_end = .;
-    _GOT2_TABLE_ = .;
-    KEEP(*(.got2))
-    _FIXUP_TABLE_ = .;
-    KEEP(*(.fixup))
-  }
-  __got2_entries = (_FIXUP_TABLE_ - _GOT2_TABLE_) >>2;
-  __fixup_entries = (. - _FIXUP_TABLE_)>>2;
-
-  .data    :
-  {
-    *(.data*)
-    *(.sdata*)
-  }
-  _edata  =  .;
-  PROVIDE (edata = .);
-
-  . = .;
-
-  . = ALIGN(4);
-  .u_boot_list : {
-       KEEP(*(SORT(.u_boot_list*)));
-  }
-
-  . = .;
-  __start___ex_table = .;
-  __ex_table : { *(__ex_table) }
-  __stop___ex_table = .;
-
-  . = ALIGN(256);
-  __init_begin = .;
-  .text.init : { *(.text.init) }
-  .data.init : { *(.data.init) }
-  . = ALIGN(256);
-  __init_end = .;
-
-  __bss_start = .;
-  .bss  (NOLOAD)     :
-  {
-   _sbss = .;
-   *(.bss*)
-   *(.sbss*)
-   *(COMMON)
-   . = ALIGN(4);
-   _ebss = .;
-  }
-  __bss_end = . ;
-  PROVIDE (end = .);
-}
diff --git a/board/freescale/m547xevb/u-boot.lds b/board/freescale/m547xevb/u-boot.lds
deleted file mode 100644 (file)
index e2ffae4..0000000
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * (C) Copyright 2000
- * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
- *
- * SPDX-License-Identifier:    GPL-2.0+
- */
-
-OUTPUT_ARCH(m68k)
-
-SECTIONS
-{
-  /* Read-only sections, merged into text segment: */
-  .text      :
-  {
-    arch/m68k/cpu/mcf547x_8x/start.o           (.text*)
-
-    *(.text*)
-  }
-  _etext = .;
-  PROVIDE (etext = .);
-  .rodata    :
-  {
-    *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*)))
-  }
-
-  /* Read-write section, merged into data segment: */
-  . = (. + 0x00FF) & 0xFFFFFF00;
-  _erotext = .;
-  PROVIDE (erotext = .);
-
-  .reloc   :
-  {
-    __got_start = .;
-    KEEP(*(.got))
-    __got_end = .;
-    _GOT2_TABLE_ = .;
-    KEEP(*(.got2))
-    _FIXUP_TABLE_ = .;
-    KEEP(*(.fixup))
-  }
-  __got2_entries = (_FIXUP_TABLE_ - _GOT2_TABLE_) >>2;
-  __fixup_entries = (. - _FIXUP_TABLE_)>>2;
-
-  .data    :
-  {
-    *(.data*)
-    *(.sdata*)
-  }
-  _edata  =  .;
-  PROVIDE (edata = .);
-
-  . = .;
-
-  . = ALIGN(4);
-  .u_boot_list : {
-       KEEP(*(SORT(.u_boot_list*)));
-  }
-
-  . = .;
-  __start___ex_table = .;
-  __ex_table : { *(__ex_table) }
-  __stop___ex_table = .;
-
-  . = ALIGN(256);
-  __init_begin = .;
-  .text.init : { *(.text.init) }
-  .data.init : { *(.data.init) }
-  . = ALIGN(256);
-  __init_end = .;
-
-  __bss_start = .;
-  .bss (NOLOAD)      :
-  {
-   _sbss = .;
-   *(.bss*)
-   *(.sbss*)
-   *(COMMON)
-   . = ALIGN(4);
-   _ebss = .;
-  }
-  __bss_end = . ;
-  PROVIDE (end = .);
-}
diff --git a/board/freescale/m548xevb/u-boot.lds b/board/freescale/m548xevb/u-boot.lds
deleted file mode 100644 (file)
index cd6aed6..0000000
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * (C) Copyright 2000
- * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
- *
- * SPDX-License-Identifier:    GPL-2.0+
- */
-
-OUTPUT_ARCH(m68k)
-
-SECTIONS
-{
-  /* Read-only sections, merged into text segment: */
-   .text      :
-  {
-    arch/m68k/cpu/mcf547x_8x/start.o           (.text*)
-
-    *(.text*)
-  }
-  _etext = .;
-  PROVIDE (etext = .);
-  .rodata    :
-  {
-    *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*)))
-  }
-
-  /* Read-write section, merged into data segment: */
-  . = (. + 0x00FF) & 0xFFFFFF00;
-  _erotext = .;
-  PROVIDE (erotext = .);
-
-  .reloc   :
-  {
-    __got_start = .;
-    KEEP(*(.got))
-    __got_end = .;
-    _GOT2_TABLE_ = .;
-    KEEP(*(.got2))
-    _FIXUP_TABLE_ = .;
-    KEEP(*(.fixup))
-  }
-  __got2_entries = (_FIXUP_TABLE_ - _GOT2_TABLE_) >>2;
-  __fixup_entries = (. - _FIXUP_TABLE_)>>2;
-
-  .data    :
-  {
-    *(.data*)
-    *(.sdata*)
-  }
-  _edata  =  .;
-  PROVIDE (edata = .);
-
-  . = .;
-
-  . = ALIGN(4);
-  .u_boot_list : {
-       KEEP(*(SORT(.u_boot_list*)));
-  }
-
-  . = .;
-  __start___ex_table = .;
-  __ex_table : { *(__ex_table) }
-  __stop___ex_table = .;
-
-  . = ALIGN(256);
-  __init_begin = .;
-  .text.init : { *(.text.init) }
-  .data.init : { *(.data.init) }
-  . = ALIGN(256);
-  __init_end = .;
-
-  __bss_start = .;
-  .bss (NOLOAD)      :
-  {
-   _sbss = .;
-   *(.bss*)
-   *(.sbss*)
-   *(COMMON)
-   . = ALIGN(4);
-   _ebss = .;
-  }
-  __bss_end = . ;
-  PROVIDE (end = .);
-}
index bb2dd9624ba162042da4320d5a37d5c237187524..23f8f6b76fdab9f55fef17e23b2aca825e3f025e 100644 (file)
@@ -753,10 +753,11 @@ const struct mx6_mmdc_calibration mx6_mmcd_calib = {
        .p1_mpwrdlctl =  0x48254A36,
 };
 
+/* MT41K128M16JT-125 */
 static struct mx6_ddr3_cfg mem_ddr = {
        .mem_speed = 1600,
-       .density = 4,
-       .width = 64,
+       .density = 2,
+       .width = 16,
        .banks = 8,
        .rowaddr = 14,
        .coladdr = 10,
@@ -798,18 +799,14 @@ static void spl_dram_init(void)
 {
        struct mx6_ddr_sysinfo sysinfo = {
                /* width of data bus:0=16,1=32,2=64 */
-               .dsize = mem_ddr.width/32,
+               .dsize = 2,
                /* config for full 4GB range so that get_mem_size() works */
                .cs_density = 32, /* 32Gb per CS */
                /* single chip select */
                .ncs = 1,
                .cs1_mirror = 0,
                .rtt_wr = 1 /*DDR3_RTT_60_OHM*/,        /* RTT_Wr = RZQ/4 */
-#ifdef RTT_NOM_120OHM
-               .rtt_nom = 2 /*DDR3_RTT_120_OHM*/,      /* RTT_Nom = RZQ/2 */
-#else
                .rtt_nom = 1 /*DDR3_RTT_60_OHM*/,       /* RTT_Nom = RZQ/4 */
-#endif
                .walat = 1,     /* Write additional latency */
                .ralat = 5,     /* Read additional latency */
                .mif3_mode = 3, /* Command prediction working mode */
@@ -818,7 +815,7 @@ static void spl_dram_init(void)
                .rst_to_cke = 0x23,     /* 33 cycles, 500us (JEDEC default) */
        };
 
-       mx6dq_dram_iocfg(mem_ddr.width, &mx6_ddr_ioregs, &mx6_grp_ioregs);
+       mx6dq_dram_iocfg(64, &mx6_ddr_ioregs, &mx6_grp_ioregs);
        mx6_dram_cfg(&sysinfo, &mx6_mmcd_calib, &mem_ddr);
 }
 
index 1cf0ab78b71fe992ab454b65d3531f0a3a92a43f..ebffe9a58abca92ec8b0f145130792bbb5abd05e 100644 (file)
@@ -77,10 +77,9 @@ struct cpld_data {
 int board_early_init_f(void)
 {
        ccsr_gpio_t *pgpio = (void *)(CONFIG_SYS_MPC85xx_GPIO_ADDR);
-       struct fsl_ifc *ifc = (void *)CONFIG_SYS_IFC_ADDR;
-
+       struct fsl_ifc ifc = {(void *)CONFIG_SYS_IFC_ADDR, (void *)NULL};
        /* Clock configuration to access CPLD using IFC(GPCM) */
-       setbits_be32(&ifc->ifc_gcr, 1 << IFC_GCR_TBCTL_TRN_TIME_SHIFT);
+       setbits_be32(&ifc.gregs->ifc_gcr, 1 << IFC_GCR_TBCTL_TRN_TIME_SHIFT);
        /*
        * Reset PCIe slots via GPIO4
        */
index 11bd9cfccce6273fdc16abcee79bafe6b003a1d4..ee873b09141c1f02fc75c5131af18be927b61cbb 100644 (file)
@@ -23,12 +23,12 @@ void board_init_f(ulong bootflag)
 {
        u32 plat_ratio;
        ccsr_gur_t *gur = (void *)CONFIG_SYS_MPC85xx_GUTS_ADDR;
-       struct fsl_ifc *ifc = (void *)CONFIG_SYS_IFC_ADDR;
+       struct fsl_ifc ifc = {(void *)CONFIG_SYS_IFC_ADDR, (void *)NULL};
 
        console_init_f();
 
        /* Clock configuration to access CPLD using IFC(GPCM) */
-       setbits_be32(&ifc->ifc_gcr, 1 << IFC_GCR_TBCTL_TRN_TIME_SHIFT);
+       setbits_be32(&ifc.gregs->ifc_gcr, 1 << IFC_GCR_TBCTL_TRN_TIME_SHIFT);
 
 #ifdef CONFIG_P1010RDB_PB
        setbits_be32(&gur->pmuxcr2, MPC85xx_PMUXCR2_GPIO01_DRVVBUS);
index b6d406219e48417dc5a10921974be394ddb7a176..08cbb606d5e8055cb91d5f574f6ebf20380d736d 100644 (file)
@@ -32,12 +32,12 @@ static const struct board_specific_parameters udimm0[] = {
        {2,  1500, 2, 5,     6, 0x07070809, 0x0a0b0b09},
        {2,  1600, 2, 5,     8, 0x0808070b, 0x0c0d0e0a},
        {2,  1700, 2, 4,     7, 0x080a0a0c, 0x0c0d0e0a},
-       {2,  1900, 2, 5,     9, 0x0a0b0c0e, 0x0f10120c},
+       {2,  1900, 0, 5,     7, 0x0808080c, 0x0b0c0c09},
        {1,  1200, 2, 5,     7, 0x0808090a, 0x0b0c0c0a},
        {1,  1500, 2, 5,     6, 0x07070809, 0x0a0b0b09},
        {1,  1600, 2, 5,     8, 0x0808070b, 0x0c0d0e0a},
        {1,  1700, 2, 4,     7, 0x080a0a0c, 0x0c0d0e0a},
-       {1,  1900, 2, 5,     9, 0x0a0b0c0e, 0x0f10120c},
+       {1,  1900, 0, 5,     7, 0x0808080c, 0x0b0c0c09},
        {}
 };
 
index 341453bc74e8c6b9d434fd264edccd4b9e1e5ab6..ad393dfc5c250ddc71999997596886ab8356443f 100644 (file)
@@ -19,6 +19,7 @@
 #include <fm_eth.h>
 #include "t208xrdb.h"
 #include "cpld.h"
+#include "../common/vid.h"
 
 DECLARE_GLOBAL_DATA_PTR;
 
@@ -85,6 +86,12 @@ int board_early_init_r(void)
        setup_portals();
 #endif
 
+       /*
+        * Adjust core voltage according to voltage ID
+        * This function changes I2C mux to channel 2.
+        */
+       if (adjust_vdd(0))
+               printf("Warning: Adjusting core voltage failed.\n");
        return 0;
 }
 
index b634965ad2ac399aebf8de25d69326c41503da62..4160acdcc99cb5942466fa45f73b1bd8aa756059 100644 (file)
@@ -8,6 +8,7 @@
 #include <asm/io.h>
 #include <asm/arch/imx-regs.h>
 #include <asm/arch/iomux-vf610.h>
+#include <asm/arch/ddrmc-vf610.h>
 #include <asm/arch/crm_regs.h>
 #include <asm/arch/clock.h>
 #include <mmc.h>
@@ -27,240 +28,63 @@ DECLARE_GLOBAL_DATA_PTR;
 #define ENET_PAD_CTRL  (PAD_CTL_PUS_47K_UP | PAD_CTL_SPEED_HIGH | \
                        PAD_CTL_DSE_50ohm | PAD_CTL_OBE_IBE_ENABLE)
 
-void setup_iomux_ddr(void)
+int dram_init(void)
 {
-       static const iomux_v3_cfg_t ddr_pads[] = {
-               VF610_PAD_DDR_A15__DDR_A_15,
-               VF610_PAD_DDR_A14__DDR_A_14,
-               VF610_PAD_DDR_A13__DDR_A_13,
-               VF610_PAD_DDR_A12__DDR_A_12,
-               VF610_PAD_DDR_A11__DDR_A_11,
-               VF610_PAD_DDR_A10__DDR_A_10,
-               VF610_PAD_DDR_A9__DDR_A_9,
-               VF610_PAD_DDR_A8__DDR_A_8,
-               VF610_PAD_DDR_A7__DDR_A_7,
-               VF610_PAD_DDR_A6__DDR_A_6,
-               VF610_PAD_DDR_A5__DDR_A_5,
-               VF610_PAD_DDR_A4__DDR_A_4,
-               VF610_PAD_DDR_A3__DDR_A_3,
-               VF610_PAD_DDR_A2__DDR_A_2,
-               VF610_PAD_DDR_A1__DDR_A_1,
-               VF610_PAD_DDR_A0__DDR_A_0,
-               VF610_PAD_DDR_BA2__DDR_BA_2,
-               VF610_PAD_DDR_BA1__DDR_BA_1,
-               VF610_PAD_DDR_BA0__DDR_BA_0,
-               VF610_PAD_DDR_CAS__DDR_CAS_B,
-               VF610_PAD_DDR_CKE__DDR_CKE_0,
-               VF610_PAD_DDR_CLK__DDR_CLK_0,
-               VF610_PAD_DDR_CS__DDR_CS_B_0,
-               VF610_PAD_DDR_D15__DDR_D_15,
-               VF610_PAD_DDR_D14__DDR_D_14,
-               VF610_PAD_DDR_D13__DDR_D_13,
-               VF610_PAD_DDR_D12__DDR_D_12,
-               VF610_PAD_DDR_D11__DDR_D_11,
-               VF610_PAD_DDR_D10__DDR_D_10,
-               VF610_PAD_DDR_D9__DDR_D_9,
-               VF610_PAD_DDR_D8__DDR_D_8,
-               VF610_PAD_DDR_D7__DDR_D_7,
-               VF610_PAD_DDR_D6__DDR_D_6,
-               VF610_PAD_DDR_D5__DDR_D_5,
-               VF610_PAD_DDR_D4__DDR_D_4,
-               VF610_PAD_DDR_D3__DDR_D_3,
-               VF610_PAD_DDR_D2__DDR_D_2,
-               VF610_PAD_DDR_D1__DDR_D_1,
-               VF610_PAD_DDR_D0__DDR_D_0,
-               VF610_PAD_DDR_DQM1__DDR_DQM_1,
-               VF610_PAD_DDR_DQM0__DDR_DQM_0,
-               VF610_PAD_DDR_DQS1__DDR_DQS_1,
-               VF610_PAD_DDR_DQS0__DDR_DQS_0,
-               VF610_PAD_DDR_RAS__DDR_RAS_B,
-               VF610_PAD_DDR_WE__DDR_WE_B,
-               VF610_PAD_DDR_ODT1__DDR_ODT_0,
-               VF610_PAD_DDR_ODT0__DDR_ODT_1,
-               VF610_PAD_DDR_RESETB,
+       struct ddrmc_lvl_info lvl = {
+               .wrlvl_reg_en = 1,
+               .wrlvl_dl_0 = 0,
+               .wrlvl_dl_1 = 0,
+               .rdlvl_gt_reg_en = 1,
+               .rdlvl_gt_dl_0 = 4,
+               .rdlvl_gt_dl_1 = 4,
+               .rdlvl_reg_en = 1,
+               .rdlvl_dl_0 = 0,
+               .rdlvl_dl_1 = 0,
        };
 
-       imx_iomux_v3_setup_multiple_pads(ddr_pads, ARRAY_SIZE(ddr_pads));
-}
-
-void ddr_phy_init(void)
-{
-       struct ddrmr_regs *ddrmr = (struct ddrmr_regs *)DDR_BASE_ADDR;
-
-       writel(DDRMC_PHY_DQ_TIMING, &ddrmr->phy[0]);
-       writel(DDRMC_PHY_DQ_TIMING, &ddrmr->phy[16]);
-       writel(DDRMC_PHY_DQ_TIMING, &ddrmr->phy[32]);
-
-       writel(DDRMC_PHY_DQS_TIMING, &ddrmr->phy[1]);
-       writel(DDRMC_PHY_DQS_TIMING, &ddrmr->phy[17]);
-
-       writel(DDRMC_PHY_CTRL, &ddrmr->phy[2]);
-       writel(DDRMC_PHY_CTRL, &ddrmr->phy[18]);
-       writel(DDRMC_PHY_CTRL, &ddrmr->phy[34]);
-
-       writel(DDRMC_PHY_MASTER_CTRL, &ddrmr->phy[3]);
-       writel(DDRMC_PHY_MASTER_CTRL, &ddrmr->phy[19]);
-       writel(DDRMC_PHY_MASTER_CTRL, &ddrmr->phy[35]);
-
-       writel(DDRMC_PHY_SLAVE_CTRL, &ddrmr->phy[4]);
-       writel(DDRMC_PHY_SLAVE_CTRL, &ddrmr->phy[20]);
-       writel(DDRMC_PHY_SLAVE_CTRL, &ddrmr->phy[36]);
-
-       /* LPDDR2 only parameter */
-       writel(DDRMC_PHY_OFF, &ddrmr->phy[49]);
-
-       writel(DDRMC_PHY50_DDR3_MODE | DDRMC_PHY50_EN_SW_HALF_CYCLE,
-               &ddrmr->phy[50]);
-
-       /* Processor Pad ODT settings */
-       writel(DDRMC_PHY_PROC_PAD_ODT, &ddrmr->phy[52]);
-}
-
-void ddr_ctrl_init(void)
-{
-       struct ddrmr_regs *ddrmr = (struct ddrmr_regs *)DDR_BASE_ADDR;
-
-       writel(DDRMC_CR00_DRAM_CLASS_DDR3, &ddrmr->cr[0]);
-       writel(DDRMC_CR02_DRAM_TINIT(32), &ddrmr->cr[2]);
-       writel(DDRMC_CR10_TRST_PWRON(80000), &ddrmr->cr[10]);
-
-       writel(DDRMC_CR11_CKE_INACTIVE(200000), &ddrmr->cr[11]);
-       writel(DDRMC_CR12_WRLAT(5) | DDRMC_CR12_CASLAT_LIN(12), &ddrmr->cr[12]);
-       writel(DDRMC_CR13_TRC(21) | DDRMC_CR13_TRRD(4) | DDRMC_CR13_TCCD(4),
-               &ddrmr->cr[13]);
-       writel(DDRMC_CR14_TFAW(20) | DDRMC_CR14_TRP(6) | DDRMC_CR14_TWTR(4) |
-               DDRMC_CR14_TRAS_MIN(15), &ddrmr->cr[14]);
-       writel(DDRMC_CR16_TMRD(4) | DDRMC_CR16_TRTP(4), &ddrmr->cr[16]);
-       writel(DDRMC_CR17_TRAS_MAX(28080) | DDRMC_CR17_TMOD(12),
-               &ddrmr->cr[17]);
-       writel(DDRMC_CR18_TCKESR(4) | DDRMC_CR18_TCKE(3), &ddrmr->cr[18]);
-
-       writel(DDRMC_CR20_AP_EN, &ddrmr->cr[20]);
-       writel(DDRMC_CR21_TRCD_INT(6) | DDRMC_CR21_CCMAP_EN, &ddrmr->cr[21]);
-
-       writel(DDRMC_CR22_TDAL(12), &ddrmr->cr[22]);
-       writel(DDRMC_CR23_BSTLEN(3) | DDRMC_CR23_TDLL(512), &ddrmr->cr[23]);
-       writel(DDRMC_CR24_TRP_AB(6), &ddrmr->cr[24]);
-
-       writel(DDRMC_CR25_TREF_EN, &ddrmr->cr[25]);
-       writel(DDRMC_CR26_TREF(3120) | DDRMC_CR26_TRFC(44), &ddrmr->cr[26]);
-       writel(DDRMC_CR28_TREF_INT(0), &ddrmr->cr[28]);
-       writel(DDRMC_CR29_TPDEX(3), &ddrmr->cr[29]);
-
-       writel(DDRMC_CR30_TXPDLL(10), &ddrmr->cr[30]);
-       writel(DDRMC_CR31_TXSNR(48) | DDRMC_CR31_TXSR(468), &ddrmr->cr[31]);
-       writel(DDRMC_CR33_EN_QK_SREF, &ddrmr->cr[33]);
-       writel(DDRMC_CR34_CKSRX(5) | DDRMC_CR34_CKSRE(5), &ddrmr->cr[34]);
-
-       writel(DDRMC_CR38_FREQ_CHG_EN(0), &ddrmr->cr[38]);
-       writel(DDRMC_CR39_PHY_INI_COM(1024) | DDRMC_CR39_PHY_INI_STA(16) |
-               DDRMC_CR39_FRQ_CH_DLLOFF(2), &ddrmr->cr[39]);
-
-       writel(DDRMC_CR41_PHY_INI_STRT_INI_DIS, &ddrmr->cr[41]);
-       writel(DDRMC_CR48_MR1_DA_0(70) | DDRMC_CR48_MR0_DA_0(1056),
-               &ddrmr->cr[48]);
-
-       writel(DDRMC_CR66_ZQCL(256) | DDRMC_CR66_ZQINIT(512), &ddrmr->cr[66]);
-       writel(DDRMC_CR67_ZQCS(64), &ddrmr->cr[67]);
-       writel(DDRMC_CR69_ZQ_ON_SREF_EX(2), &ddrmr->cr[69]);
-
-       writel(DDRMC_CR70_REF_PER_ZQ(64), &ddrmr->cr[70]);
-       writel(DDRMC_CR72_ZQCS_ROTATE(0), &ddrmr->cr[72]);
-
-       writel(DDRMC_CR73_APREBIT(10) | DDRMC_CR73_COL_DIFF(1) |
-               DDRMC_CR73_ROW_DIFF(3), &ddrmr->cr[73]);
-       writel(DDRMC_CR74_BANKSPLT_EN | DDRMC_CR74_ADDR_CMP_EN |
-               DDRMC_CR74_CMD_AGE_CNT(64) | DDRMC_CR74_AGE_CNT(64),
-               &ddrmr->cr[74]);
-       writel(DDRMC_CR75_RW_PG_EN | DDRMC_CR75_RW_EN | DDRMC_CR75_PRI_EN |
-               DDRMC_CR75_PLEN, &ddrmr->cr[75]);
-       writel(DDRMC_CR76_NQENT_ACTDIS(3) | DDRMC_CR76_D_RW_G_BKCN(3) |
-               DDRMC_CR76_W2R_SPLT_EN, &ddrmr->cr[76]);
-       writel(DDRMC_CR77_CS_MAP | DDRMC_CR77_DI_RD_INTLEAVE |
-               DDRMC_CR77_SWAP_EN, &ddrmr->cr[77]);
-       writel(DDRMC_CR78_Q_FULLNESS(7) | DDRMC_CR78_BUR_ON_FLY_BIT(12),
-               &ddrmr->cr[78]);
-       writel(DDRMC_CR79_CTLUPD_AREF(0), &ddrmr->cr[79]);
-
-       writel(DDRMC_CR82_INT_MASK, &ddrmr->cr[82]);
-
-       writel(DDRMC_CR87_ODT_WR_MAPCS0, &ddrmr->cr[87]);
-       writel(DDRMC_CR88_TODTL_CMD(4), &ddrmr->cr[88]);
-       writel(DDRMC_CR89_AODT_RWSMCS(2), &ddrmr->cr[89]);
-
-       writel(DDRMC_CR91_R2W_SMCSDL(2), &ddrmr->cr[91]);
-       writel(DDRMC_CR96_WLMRD(40) | DDRMC_CR96_WLDQSEN(25), &ddrmr->cr[96]);
-       writel(DDRMC_CR97_WRLVL_EN, &ddrmr->cr[97]);
-       writel(DDRMC_CR98_WRLVL_DL_0, &ddrmr->cr[98]);
-       writel(DDRMC_CR99_WRLVL_DL_1, &ddrmr->cr[99]);
-
-       writel(DDRMC_CR102_RDLVL_GT_REGEN | DDRMC_CR102_RDLVL_REG_EN,
-               &ddrmr->cr[102]);
-
-       writel(DDRMC_CR105_RDLVL_DL_0(0), &ddrmr->cr[105]);
-       writel(DDRMC_CR106_RDLVL_GTDL_0(4), &ddrmr->cr[106]);
-       writel(DDRMC_CR110_RDLVL_GTDL_1(4), &ddrmr->cr[110]);
-       writel(DDRMC_CR114_RDLVL_GTDL_2(0), &ddrmr->cr[114]);
-       writel(DDRMC_CR115_RDLVL_GTDL_2(0), &ddrmr->cr[115]);
-
-       writel(DDRMC_CR117_AXI0_W_PRI(0) | DDRMC_CR117_AXI0_R_PRI(0),
-               &ddrmr->cr[117]);
-       writel(DDRMC_CR118_AXI1_W_PRI(1) | DDRMC_CR118_AXI1_R_PRI(1),
-               &ddrmr->cr[118]);
-
-       writel(DDRMC_CR120_AXI0_PRI1_RPRI(2) | DDRMC_CR120_AXI0_PRI0_RPRI(2),
-               &ddrmr->cr[120]);
-       writel(DDRMC_CR121_AXI0_PRI3_RPRI(2) | DDRMC_CR121_AXI0_PRI2_RPRI(2),
-               &ddrmr->cr[121]);
-       writel(DDRMC_CR122_AXI1_PRI1_RPRI(1) | DDRMC_CR122_AXI1_PRI0_RPRI(1) |
-               DDRMC_CR122_AXI0_PRIRLX(100), &ddrmr->cr[122]);
-       writel(DDRMC_CR123_AXI1_P_ODR_EN | DDRMC_CR123_AXI1_PRI3_RPRI(1) |
-               DDRMC_CR123_AXI1_PRI2_RPRI(1), &ddrmr->cr[123]);
-       writel(DDRMC_CR124_AXI1_PRIRLX(100), &ddrmr->cr[124]);
-
-       writel(DDRMC_CR126_PHY_RDLAT(8), &ddrmr->cr[126]);
-       writel(DDRMC_CR132_WRLAT_ADJ(5) | DDRMC_CR132_RDLAT_ADJ(6),
-               &ddrmr->cr[132]);
-       writel(DDRMC_CR137_PHYCTL_DL(2), &ddrmr->cr[137]);
-       writel(DDRMC_CR138_PHY_WRLV_MXDL(256) | DDRMC_CR138_PHYDRAM_CK_EN(1),
-               &ddrmr->cr[138]);
-       writel(DDRMC_CR139_PHY_WRLV_RESPLAT(4) | DDRMC_CR139_PHY_WRLV_LOAD(7) |
-               DDRMC_CR139_PHY_WRLV_DLL(3) | DDRMC_CR139_PHY_WRLV_EN(3),
-               &ddrmr->cr[139]);
-       writel(DDRMC_CR140_PHY_WRLV_WW(64), &ddrmr->cr[140]);
-       writel(DDRMC_CR143_RDLV_GAT_MXDL(1536) | DDRMC_CR143_RDLV_MXDL(128),
-               &ddrmr->cr[143]);
-       writel(DDRMC_CR144_PHY_RDLVL_RES(4) | DDRMC_CR144_PHY_RDLV_LOAD(7) |
-               DDRMC_CR144_PHY_RDLV_DLL(3) | DDRMC_CR144_PHY_RDLV_EN(3),
-               &ddrmr->cr[144]);
-       writel(DDRMC_CR145_PHY_RDLV_RR(64), &ddrmr->cr[145]);
-       writel(DDRMC_CR146_PHY_RDLVL_RESP(64), &ddrmr->cr[146]);
-       writel(DDRMC_CR147_RDLV_RESP_MASK(983040), &ddrmr->cr[147]);
-       writel(DDRMC_CR148_RDLV_GATE_RESP_MASK(983040), &ddrmr->cr[148]);
-       writel(DDRMC_CR151_RDLV_GAT_DQ_ZERO_CNT(1) |
-               DDRMC_CR151_RDLVL_DQ_ZERO_CNT(1), &ddrmr->cr[151]);
-
-       writel(DDRMC_CR154_PAD_ZQ_EARLY_CMP_EN_TIMER(13) |
-               DDRMC_CR154_PAD_ZQ_MODE(1) | DDRMC_CR154_DDR_SEL_PAD_CONTR(3) |
-               DDRMC_CR154_PAD_ZQ_HW_FOR(1), &ddrmr->cr[154]);
-       writel(DDRMC_CR155_PAD_ODT_BYTE1(2) | DDRMC_CR155_PAD_ODT_BYTE0(2),
-               &ddrmr->cr[155]);
-       writel(DDRMC_CR158_TWR(6), &ddrmr->cr[158]);
-       writel(DDRMC_CR161_ODT_EN(1) | DDRMC_CR161_TODTH_RD(2) |
-               DDRMC_CR161_TODTH_WR(2), &ddrmr->cr[161]);
-
-       ddr_phy_init();
-
-       writel(DDRMC_CR00_DRAM_CLASS_DDR3 | DDRMC_CR00_START, &ddrmr->cr[0]);
-
-       udelay(200);
-}
+       static const struct ddr3_jedec_timings timings = {
+               .tinit           = 5,
+               .trst_pwron      = 80000,
+               .cke_inactive    = 200000,
+               .wrlat           = 5,
+               .caslat_lin      = 12,
+               .trc             = 21,
+               .trrd            = 4,
+               .tccd            = 4,
+               .tfaw            = 20,
+               .trp             = 6,
+               .twtr            = 4,
+               .tras_min        = 15,
+               .tmrd            = 4,
+               .trtp            = 4,
+               .tras_max        = 28080,
+               .tmod            = 12,
+               .tckesr          = 4,
+               .tcke            = 3,
+               .trcd_int        = 6,
+               .tdal            = 12,
+               .tdll            = 512,
+               .trp_ab          = 6,
+               .tref            = 3120,
+               .trfc            = 44,
+               .tpdex           = 3,
+               .txpdll          = 10,
+               .txsnr           = 48,
+               .txsr            = 468,
+               .cksrx           = 5,
+               .cksre           = 5,
+               .zqcl            = 256,
+               .zqinit          = 512,
+               .zqcs            = 64,
+               .ref_per_zq      = 64,
+               .aprebit         = 10,
+               .wlmrd           = 40,
+               .wldqsen         = 25,
+       };
 
-int dram_init(void)
-{
-       setup_iomux_ddr();
+       ddrmc_setup_iomux();
 
-       ddr_ctrl_init();
+       ddrmc_ctrl_init_ddr3(&timings, &lvl, 1, 3);
        gd->ram_size = get_ram_size((void *)PHYS_SDRAM, PHYS_SDRAM_SIZE);
 
        return 0;
@@ -403,7 +227,7 @@ static void clock_init(void)
                CCM_CCGR2_PORTD_CTRL_MASK | CCM_CCGR2_PORTE_CTRL_MASK |
                CCM_CCGR2_QSPI0_CTRL_MASK);
        clrsetbits_le32(&ccm->ccgr3, CCM_REG_CTRL_MASK,
-               CCM_CCGR3_ANADIG_CTRL_MASK);
+               CCM_CCGR3_ANADIG_CTRL_MASK | CCM_CCGR3_SCSC_CTRL_MASK);
        clrsetbits_le32(&ccm->ccgr4, CCM_REG_CTRL_MASK,
                CCM_CCGR4_WKUP_CTRL_MASK | CCM_CCGR4_CCM_CTRL_MASK |
                CCM_CCGR4_GPC_CTRL_MASK | CCM_CCGR4_I2C0_CTRL_MASK);
@@ -484,9 +308,20 @@ int board_early_init_f(void)
 
 int board_init(void)
 {
+       struct scsc_reg *scsc = (struct scsc_reg *)SCSC_BASE_ADDR;
+
        /* address of boot parameters */
        gd->bd->bi_boot_params = PHYS_SDRAM + 0x100;
 
+       /*
+        * Enable external 32K Oscillator
+        *
+        * The internal clock experiences significant drift
+        * so we must use the external oscillator in order
+        * to maintain correct time in the hwclock
+        */
+       setbits_le32(&scsc->sosc_ctr, SCSC_SOSC_CTR_SOSC_EN);
+
        return 0;
 }
 
index ab3bab847a52d4c92094db7e7d6beb8daf8cc9f9..ba159696b43cf51e85bdd71414eb1faa61fc2753 100644 (file)
@@ -81,8 +81,14 @@ read_eeprom(int bus, struct ventana_board_info *info)
                type = GW54xx;
                break;
        case '5':
-               type = GW552x;
-               break;
+               if (info->model[4] == '1') {
+                       type = GW551x;
+                       break;
+               } else if (info->model[4] == '2') {
+                       type = GW552x;
+                       break;
+               }
+               /* fall through */
        default:
                printf("EEPROM: Unknown model in EEPROM: %s\n", info->model);
                type = GW_UNKNOWN;
index a34a9a84c8f211f39bd9d776d83e6b390eaf7d83..718e1651d0f652f609bedb42351cfe2a29a6877c 100644 (file)
@@ -13,8 +13,6 @@
 
 #include "gsc.h"
 
-#define MINMAX(n, percent)     ((n)*(100-percent)/100), ((n)*(100+percent)/100)
-
 /*
  * The Gateworks System Controller will fail to ACK a master transaction if
  * it is busy, which can occur during its 1HZ timer tick while reading ADC's.
@@ -61,9 +59,7 @@ int gsc_i2c_write(uchar chip, uint addr, int alen, uchar *buf, int len)
        return ret;
 }
 
-#ifdef CONFIG_CMD_GSC
-static void read_hwmon(const char *name, uint reg, uint size, uint low,
-                      uint high)
+static void read_hwmon(const char *name, uint reg, uint size)
 {
        unsigned char buf[3];
        uint ui;
@@ -75,59 +71,121 @@ static void read_hwmon(const char *name, uint reg, uint size, uint low,
        } else {
                ui = buf[0] | (buf[1]<<8) | (buf[2]<<16);
                if (ui == 0xffffff)
-                       printf("invalid");
-               else if (ui < low)
-                       printf("%d Failed - Low", ui);
-               else if (ui > high)
-                       printf("%d Failed - High", ui);
+                       puts("invalid\n");
                else
-                       printf("%d", ui);
+                       printf("%d\n", ui);
        }
-       puts("\n");
 }
 
-int do_gsc(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
+int gsc_info(int verbose)
 {
        const char *model = getenv("model");
+       unsigned char buf[16];
 
        i2c_set_bus_num(0);
-       read_hwmon("Temp",     GSC_HWMON_TEMP, 2, 0, 9000);
-       read_hwmon("VIN",      GSC_HWMON_VIN, 3, 8000, 60000);
-       read_hwmon("VBATT",    GSC_HWMON_VBATT, 3, 1800, 3500);
-       read_hwmon("VDD_3P3",  GSC_HWMON_VDD_3P3, 3, MINMAX(3300, 10));
-       read_hwmon("VDD_HIGH", GSC_HWMON_VDD_HIGH, 3, MINMAX(3000, 10));
-       read_hwmon("VDD_DDR",  GSC_HWMON_VDD_DDR, 3, MINMAX(1500, 10));
-       read_hwmon("VDD_5P0",  GSC_HWMON_VDD_5P0, 3, MINMAX(5000, 10));
-       read_hwmon("VDD_2P5",  GSC_HWMON_VDD_2P5, 3, MINMAX(2500, 10));
-       read_hwmon("VDD_1P8",  GSC_HWMON_VDD_1P8, 3, MINMAX(1800, 10));
+       if (gsc_i2c_read(GSC_SC_ADDR, 0, 1, buf, 16))
+               return CMD_RET_FAILURE;
+
+       printf("GSC:   v%d", buf[GSC_SC_FWVER]);
+       printf(" 0x%04x", buf[GSC_SC_FWCRC] | buf[GSC_SC_FWCRC+1]<<8);
+       printf(" WDT:%sabled", (buf[GSC_SC_CTRL1] & (1<<GSC_SC_CTRL1_WDEN))
+               ? "en" : "dis");
+       if (buf[GSC_SC_STATUS] & (1 << GSC_SC_IRQ_WATCHDOG)) {
+               buf[GSC_SC_STATUS] &= ~(1 << GSC_SC_IRQ_WATCHDOG);
+               puts(" WDT_RESET");
+               gsc_i2c_write(GSC_SC_ADDR, GSC_SC_STATUS, 1,
+                             &buf[GSC_SC_STATUS], 1);
+       }
+       puts("\n");
+       if (!verbose)
+               return CMD_RET_SUCCESS;
 
+       read_hwmon("Temp",     GSC_HWMON_TEMP, 2);
+       read_hwmon("VIN",      GSC_HWMON_VIN, 3);
+       read_hwmon("VBATT",    GSC_HWMON_VBATT, 3);
+       read_hwmon("VDD_3P3",  GSC_HWMON_VDD_3P3, 3);
+       read_hwmon("VDD_ARM",  GSC_HWMON_VDD_CORE, 3);
+       read_hwmon("VDD_SOC",  GSC_HWMON_VDD_SOC, 3);
+       read_hwmon("VDD_HIGH", GSC_HWMON_VDD_HIGH, 3);
+       read_hwmon("VDD_DDR",  GSC_HWMON_VDD_DDR, 3);
+       read_hwmon("VDD_5P0",  GSC_HWMON_VDD_5P0, 3);
+       read_hwmon("VDD_2P5",  GSC_HWMON_VDD_2P5, 3);
+       read_hwmon("VDD_1P8",  GSC_HWMON_VDD_1P8, 3);
+       read_hwmon("VDD_IO2",  GSC_HWMON_VDD_IO2, 3);
        switch (model[3]) {
        case '1': /* GW51xx */
-               read_hwmon("VDD_CORE", GSC_HWMON_VDD_CORE, 3, MINMAX(1175, 10));
-               read_hwmon("VDD_SOC",  GSC_HWMON_VDD_SOC, 3, MINMAX(1175, 10));
+               read_hwmon("VDD_IO3",  GSC_HWMON_VDD_IO4, 3); /* -C rev */
                break;
        case '2': /* GW52xx */
+               break;
        case '3': /* GW53xx */
-               read_hwmon("VDD_CORE", GSC_HWMON_VDD_CORE, 3, MINMAX(1175, 10));
-               read_hwmon("VDD_SOC",  GSC_HWMON_VDD_SOC, 3, MINMAX(1175, 10));
-               read_hwmon("VDD_1P0",  GSC_HWMON_VDD_1P0, 3, MINMAX(1000, 10));
+               read_hwmon("VDD_IO4",  GSC_HWMON_VDD_IO4, 3); /* -C rev */
+               read_hwmon("VDD_GPS",  GSC_HWMON_VDD_IO3, 3);
                break;
        case '4': /* GW54xx */
-               read_hwmon("VDD_CORE", GSC_HWMON_VDD_CORE, 3, MINMAX(1375, 10));
-               read_hwmon("VDD_SOC",  GSC_HWMON_VDD_SOC, 3, MINMAX(1375, 10));
-               read_hwmon("VDD_1P0",  GSC_HWMON_VDD_1P0, 3, MINMAX(1000, 10));
+               read_hwmon("VDD_IO3",  GSC_HWMON_VDD_IO4, 3); /* -C rev */
+               read_hwmon("VDD_GPS",  GSC_HWMON_VDD_IO3, 3);
                break;
        case '5': /* GW55xx */
-               read_hwmon("VDD_CORE", GSC_HWMON_VDD_CORE, 3, MINMAX(1175, 10));
-               read_hwmon("VDD_SOC",  GSC_HWMON_VDD_SOC, 3, MINMAX(1175, 10));
                break;
        }
        return 0;
 }
 
-U_BOOT_CMD(gsc, 1, 1, do_gsc,
-          "GSC test",
-          ""
-);
+#ifdef CONFIG_CMD_GSC
+static int do_gsc_wd(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
+{
+       unsigned char reg;
+
+       if (argc < 2)
+               return CMD_RET_USAGE;
+
+       if (strcasecmp(argv[1], "enable") == 0) {
+               int timeout = 0;
+
+               if (argc > 2)
+                       timeout = simple_strtoul(argv[2], NULL, 10);
+               i2c_set_bus_num(0);
+               if (gsc_i2c_read(GSC_SC_ADDR, GSC_SC_CTRL1, 1, &reg, 1))
+                       return CMD_RET_FAILURE;
+               reg &= ~((1 << GSC_SC_CTRL1_WDEN) | (1 << GSC_SC_CTRL1_WDTIME));
+               if (timeout == 60)
+                       reg |= (1 << GSC_SC_CTRL1_WDTIME);
+               else
+                       timeout = 30;
+               reg |= (1 << GSC_SC_CTRL1_WDEN);
+               if (gsc_i2c_write(GSC_SC_ADDR, GSC_SC_CTRL1, 1, &reg, 1))
+                       return CMD_RET_FAILURE;
+               printf("GSC Watchdog enabled with timeout=%d seconds\n",
+                      timeout);
+       } else if (strcasecmp(argv[1], "disable") == 0) {
+               i2c_set_bus_num(0);
+               if (gsc_i2c_read(GSC_SC_ADDR, GSC_SC_CTRL1, 1, &reg, 1))
+                       return CMD_RET_FAILURE;
+               reg &= ~((1 << GSC_SC_CTRL1_WDEN) | (1 << GSC_SC_CTRL1_WDTIME));
+               if (gsc_i2c_write(GSC_SC_ADDR, GSC_SC_CTRL1, 1, &reg, 1))
+                       return CMD_RET_FAILURE;
+               printf("GSC Watchdog disabled\n");
+       } else {
+               return CMD_RET_USAGE;
+       }
+       return CMD_RET_SUCCESS;
+}
+
+static int do_gsc(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
+{
+       if (argc < 2)
+               return gsc_info(1);
+
+       if (strcasecmp(argv[1], "wd") == 0)
+               return do_gsc_wd(cmdtp, flag, --argc, ++argv);
+
+       return CMD_RET_USAGE;
+}
+
+U_BOOT_CMD(
+       gsc, 4, 1, do_gsc, "GSC configuration",
+       "[wd enable [30|60]]|[wd disable]\n"
+       );
 
 #endif /* CONFIG_CMD_GSC */
index da970c39d6a061d64697a6e65e7471c5cf22b413..2d4969ecdd3e5bb95be54f319c6f348f733e01ec 100644 (file)
@@ -19,12 +19,15 @@ enum {
        GSC_SC_CTRL0            = 0x00,
        GSC_SC_CTRL1            = 0x01,
        GSC_SC_STATUS           = 0x0a,
+       GSC_SC_FWCRC            = 0x0c,
        GSC_SC_FWVER            = 0x0e,
 };
 
 /* System Controller Control1 bits */
 enum {
-       GSC_SC_CTRL1_WDDIS      = 7, /* 1 = disable watchdog */
+       GSC_SC_CTRL1_WDTIME     = 4, /* 1 = 60s timeout, 0 = 30s timeout */
+       GSC_SC_CTRL1_WDEN       = 5, /* 1 = enable, 0 = disable */
+       GSC_SC_CTRL1_WDDIS      = 7, /* 1 = disable boot watchdog */
 };
 
 /* System Controller Interrupt bits */
@@ -50,8 +53,10 @@ enum {
        GSC_HWMON_VDD_DDR       = 0x17,
        GSC_HWMON_VDD_SOC       = 0x11,
        GSC_HWMON_VDD_1P8       = 0x1d,
+       GSC_HWMON_VDD_IO2       = 0x20,
        GSC_HWMON_VDD_2P5       = 0x23,
-       GSC_HWMON_VDD_1P0       = 0x20,
+       GSC_HWMON_VDD_IO3       = 0x26,
+       GSC_HWMON_VDD_IO4       = 0x29,
 };
 
 /*
@@ -60,5 +65,6 @@ enum {
  */
 int gsc_i2c_read(uchar chip, uint addr, int alen, uchar *buf, int len);
 int gsc_i2c_write(uchar chip, uint addr, int alen, uchar *buf, int len);
+int gsc_info(int verbose);
 #endif
 
index bb08cd272ef28b439326c3c63499f87a58788e8e..1e54912a0180961194cbbb921dbbacad9a659bf4 100644 (file)
@@ -89,16 +89,16 @@ DECLARE_GLOBAL_DATA_PTR;
  */
 struct ventana_board_info ventana_info;
 
-int board_type;
+static int board_type;
 
 /* UART1: Function varies per baseboard */
-iomux_v3_cfg_t const uart1_pads[] = {
+static iomux_v3_cfg_t const uart1_pads[] = {
        IOMUX_PADS(PAD_SD3_DAT6__UART1_RX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL)),
        IOMUX_PADS(PAD_SD3_DAT7__UART1_TX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL)),
 };
 
 /* UART2: Serial Console */
-iomux_v3_cfg_t const uart2_pads[] = {
+static iomux_v3_cfg_t const uart2_pads[] = {
        IOMUX_PADS(PAD_SD4_DAT7__UART2_TX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL)),
        IOMUX_PADS(PAD_SD4_DAT4__UART2_RX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL)),
 };
@@ -106,7 +106,7 @@ iomux_v3_cfg_t const uart2_pads[] = {
 #define PC MUX_PAD_CTRL(I2C_PAD_CTRL)
 
 /* I2C1: GSC */
-struct i2c_pads_info mx6q_i2c_pad_info0 = {
+static struct i2c_pads_info mx6q_i2c_pad_info0 = {
        .scl = {
                .i2c_mode = MX6Q_PAD_EIM_D21__I2C1_SCL | PC,
                .gpio_mode = MX6Q_PAD_EIM_D21__GPIO3_IO21 | PC,
@@ -118,7 +118,7 @@ struct i2c_pads_info mx6q_i2c_pad_info0 = {
                .gp = IMX_GPIO_NR(3, 28)
        }
 };
-struct i2c_pads_info mx6dl_i2c_pad_info0 = {
+static struct i2c_pads_info mx6dl_i2c_pad_info0 = {
        .scl = {
                .i2c_mode = MX6DL_PAD_EIM_D21__I2C1_SCL | PC,
                .gpio_mode = MX6DL_PAD_EIM_D21__GPIO3_IO21 | PC,
@@ -132,7 +132,7 @@ struct i2c_pads_info mx6dl_i2c_pad_info0 = {
 };
 
 /* I2C2: PMIC/PCIe Switch/PCIe Clock/Mezz */
-struct i2c_pads_info mx6q_i2c_pad_info1 = {
+static struct i2c_pads_info mx6q_i2c_pad_info1 = {
        .scl = {
                .i2c_mode = MX6Q_PAD_KEY_COL3__I2C2_SCL | PC,
                .gpio_mode = MX6Q_PAD_KEY_COL3__GPIO4_IO12 | PC,
@@ -144,7 +144,7 @@ struct i2c_pads_info mx6q_i2c_pad_info1 = {
                .gp = IMX_GPIO_NR(4, 13)
        }
 };
-struct i2c_pads_info mx6dl_i2c_pad_info1 = {
+static struct i2c_pads_info mx6dl_i2c_pad_info1 = {
        .scl = {
                .i2c_mode = MX6DL_PAD_KEY_COL3__I2C2_SCL | PC,
                .gpio_mode = MX6DL_PAD_KEY_COL3__GPIO4_IO12 | PC,
@@ -158,7 +158,7 @@ struct i2c_pads_info mx6dl_i2c_pad_info1 = {
 };
 
 /* I2C3: Misc/Expansion */
-struct i2c_pads_info mx6q_i2c_pad_info2 = {
+static struct i2c_pads_info mx6q_i2c_pad_info2 = {
        .scl = {
                .i2c_mode = MX6Q_PAD_GPIO_3__I2C3_SCL | PC,
                .gpio_mode = MX6Q_PAD_GPIO_3__GPIO1_IO03 | PC,
@@ -170,7 +170,7 @@ struct i2c_pads_info mx6q_i2c_pad_info2 = {
                .gp = IMX_GPIO_NR(1, 6)
        }
 };
-struct i2c_pads_info mx6dl_i2c_pad_info2 = {
+static struct i2c_pads_info mx6dl_i2c_pad_info2 = {
        .scl = {
                .i2c_mode = MX6DL_PAD_GPIO_3__I2C3_SCL | PC,
                .gpio_mode = MX6DL_PAD_GPIO_3__GPIO1_IO03 | PC,
@@ -184,7 +184,7 @@ struct i2c_pads_info mx6dl_i2c_pad_info2 = {
 };
 
 /* MMC */
-iomux_v3_cfg_t const usdhc3_pads[] = {
+static iomux_v3_cfg_t const usdhc3_pads[] = {
        IOMUX_PADS(PAD_SD3_CLK__SD3_CLK    | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
        IOMUX_PADS(PAD_SD3_CMD__SD3_CMD    | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
        IOMUX_PADS(PAD_SD3_DAT0__SD3_DATA0 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
@@ -196,7 +196,7 @@ iomux_v3_cfg_t const usdhc3_pads[] = {
 };
 
 /* ENET */
-iomux_v3_cfg_t const enet_pads[] = {
+static iomux_v3_cfg_t const enet_pads[] = {
        IOMUX_PADS(PAD_ENET_MDIO__ENET_MDIO  | MUX_PAD_CTRL(ENET_PAD_CTRL)),
        IOMUX_PADS(PAD_ENET_MDC__ENET_MDC    | MUX_PAD_CTRL(ENET_PAD_CTRL)),
        IOMUX_PADS(PAD_RGMII_TXC__RGMII_TXC  | MUX_PAD_CTRL(ENET_PAD_CTRL)),
@@ -220,7 +220,7 @@ iomux_v3_cfg_t const enet_pads[] = {
 };
 
 /* NAND */
-iomux_v3_cfg_t const nfc_pads[] = {
+static iomux_v3_cfg_t const nfc_pads[] = {
        IOMUX_PADS(PAD_NANDF_CLE__NAND_CLE     | MUX_PAD_CTRL(NO_PAD_CTRL)),
        IOMUX_PADS(PAD_NANDF_ALE__NAND_ALE     | MUX_PAD_CTRL(NO_PAD_CTRL)),
        IOMUX_PADS(PAD_NANDF_WP_B__NAND_WP_B   | MUX_PAD_CTRL(NO_PAD_CTRL)),
@@ -285,7 +285,7 @@ static void setup_iomux_uart(void)
 }
 
 #ifdef CONFIG_USB_EHCI_MX6
-iomux_v3_cfg_t const usb_pads[] = {
+static iomux_v3_cfg_t const usb_pads[] = {
        IOMUX_PADS(PAD_GPIO_1__USB_OTG_ID   | DIO_PAD_CFG),
        IOMUX_PADS(PAD_KEY_COL4__USB_OTG_OC | DIO_PAD_CFG),
        /* OTG PWR */
@@ -328,7 +328,7 @@ int board_ehci_power(int port, int on)
 #endif /* CONFIG_USB_EHCI_MX6 */
 
 #ifdef CONFIG_FSL_ESDHC
-struct fsl_esdhc_cfg usdhc_cfg = { USDHC3_BASE_ADDR };
+static struct fsl_esdhc_cfg usdhc_cfg = { USDHC3_BASE_ADDR };
 
 int board_mmc_getcd(struct mmc *mmc)
 {
@@ -397,11 +397,15 @@ int board_phy_config(struct phy_device *phydev)
 
 int board_eth_init(bd_t *bis)
 {
-       setup_iomux_enet();
-
 #ifdef CONFIG_FEC_MXC
-       if (board_type != GW552x)
+       if (board_type != GW551x && board_type != GW552x) {
+               setup_iomux_enet();
                cpu_eth_init(bis);
+       }
+#endif
+
+#ifdef CONFIG_E1000
+       e1000_initialize(bis);
 #endif
 
 #ifdef CONFIG_CI_UDC
@@ -409,6 +413,15 @@ int board_eth_init(bd_t *bis)
        usb_eth_initialize(bis);
 #endif
 
+       /* default to the first detected enet dev */
+       if (!getenv("ethprime")) {
+               struct eth_device *dev = eth_get_dev_by_index(0);
+               if (dev) {
+                       setenv("ethprime", dev->name);
+                       printf("set ethprime to %s\n", getenv("ethprime"));
+               }
+       }
+
        return 0;
 }
 
@@ -482,6 +495,48 @@ struct display_info_t const displays[] = {{
                .vsync_len      = 10,
                .sync           = FB_SYNC_EXT,
                .vmode          = FB_VMODE_NONINTERLACED
+} }, {
+       /* DLC700JMG-T-4 */
+       .bus    = 0,
+       .addr   = 0,
+       .detect = NULL,
+       .enable = enable_lvds,
+       .pixfmt = IPU_PIX_FMT_LVDS666,
+       .mode   = {
+               .name           = "DLC700JMGT4",
+               .refresh        = 60,
+               .xres           = 1024,         /* 1024x600active pixels */
+               .yres           = 600,
+               .pixclock       = 15385,        /* 64MHz */
+               .left_margin    = 220,
+               .right_margin   = 40,
+               .upper_margin   = 21,
+               .lower_margin   = 7,
+               .hsync_len      = 60,
+               .vsync_len      = 10,
+               .sync           = FB_SYNC_EXT,
+               .vmode          = FB_VMODE_NONINTERLACED
+} }, {
+       /* DLC800FIG-T-3 */
+       .bus    = 0,
+       .addr   = 0,
+       .detect = NULL,
+       .enable = enable_lvds,
+       .pixfmt = IPU_PIX_FMT_LVDS666,
+       .mode   = {
+               .name           = "DLC800FIGT3",
+               .refresh        = 60,
+               .xres           = 1024,         /* 1024x768 active pixels */
+               .yres           = 768,
+               .pixclock       = 15385,        /* 64MHz */
+               .left_margin    = 220,
+               .right_margin   = 40,
+               .upper_margin   = 21,
+               .lower_margin   = 7,
+               .hsync_len      = 60,
+               .vsync_len      = 10,
+               .sync           = FB_SYNC_EXT,
+               .vmode          = FB_VMODE_NONINTERLACED
 } } };
 size_t display_count = ARRAY_SIZE(displays);
 
@@ -614,6 +669,8 @@ static iomux_v3_cfg_t const gw52xx_gpio_pads[] = {
        IOMUX_PADS(PAD_EIM_D31__GPIO3_IO31 | DIO_PAD_CFG),
        /* PCI_RST# */
        IOMUX_PADS(PAD_ENET_TXD1__GPIO1_IO29 | DIO_PAD_CFG),
+       /* PCI_RST# (GW522x) */
+       IOMUX_PADS(PAD_EIM_D23__GPIO3_IO23 | DIO_PAD_CFG),
        /* PCIESKT_WDIS# */
        IOMUX_PADS(PAD_GPIO_17__GPIO7_IO12 | DIO_PAD_CFG),
 };
@@ -658,8 +715,6 @@ static iomux_v3_cfg_t const gw54xx_gpio_pads[] = {
        IOMUX_PADS(PAD_KEY_ROW1__GPIO4_IO09 | MUX_PAD_CTRL(IRQ_PAD_CTRL)),
        /* DIOI2C_DIS# */
        IOMUX_PADS(PAD_GPIO_19__GPIO4_IO05 | DIO_PAD_CFG),
-       /* PCICK_SSON */
-       IOMUX_PADS(PAD_SD1_CLK__GPIO1_IO20 | DIO_PAD_CFG),
        /* PCI_RST# */
        IOMUX_PADS(PAD_ENET_TXD1__GPIO1_IO29 | DIO_PAD_CFG),
        /* VID_EN */
@@ -668,6 +723,15 @@ static iomux_v3_cfg_t const gw54xx_gpio_pads[] = {
        IOMUX_PADS(PAD_DISP0_DAT23__GPIO5_IO17 | DIO_PAD_CFG),
 };
 
+static iomux_v3_cfg_t const gw551x_gpio_pads[] = {
+       /* PANLED# */
+       IOMUX_PADS(PAD_KEY_ROW0__GPIO4_IO07 | DIO_PAD_CFG),
+       /* PCI_RST# */
+       IOMUX_PADS(PAD_GPIO_0__GPIO1_IO00 | DIO_PAD_CFG),
+       /* PCIESKT_WDIS# */
+       IOMUX_PADS(PAD_GPIO_17__GPIO7_IO12 | DIO_PAD_CFG),
+};
+
 static iomux_v3_cfg_t const gw552x_gpio_pads[] = {
        /* PANLEDG# */
        IOMUX_PADS(PAD_KEY_COL0__GPIO4_IO06 | DIO_PAD_CFG),
@@ -709,6 +773,7 @@ struct ventana {
        int num_pads;
        /* DIO pinmux/val */
        struct dio_cfg dio_cfg[4];
+       int num_gpios;
        /* various gpios (0 if non-existent) */
        int leds[3];
        int pcie_rst;
@@ -723,7 +788,7 @@ struct ventana {
        int wdis;
 };
 
-struct ventana gpio_cfg[] = {
+static struct ventana gpio_cfg[] = {
        /* GW5400proto */
        {
                .gpio_pads = gw54xx_gpio_pads,
@@ -754,6 +819,7 @@ struct ventana gpio_cfg[] = {
                                4
                        },
                },
+               .num_gpios = 4,
                .leds = {
                        IMX_GPIO_NR(4, 6),
                        IMX_GPIO_NR(4, 10),
@@ -797,6 +863,7 @@ struct ventana gpio_cfg[] = {
                                4
                        },
                },
+               .num_gpios = 4,
                .leds = {
                        IMX_GPIO_NR(4, 6),
                        IMX_GPIO_NR(4, 10),
@@ -839,6 +906,7 @@ struct ventana gpio_cfg[] = {
                                0
                        },
                },
+               .num_gpios = 4,
                .leds = {
                        IMX_GPIO_NR(4, 6),
                        IMX_GPIO_NR(4, 7),
@@ -883,6 +951,7 @@ struct ventana gpio_cfg[] = {
                                0
                        },
                },
+               .num_gpios = 4,
                .leds = {
                        IMX_GPIO_NR(4, 6),
                        IMX_GPIO_NR(4, 7),
@@ -926,6 +995,7 @@ struct ventana gpio_cfg[] = {
                                4
                        },
                },
+               .num_gpios = 4,
                .leds = {
                        IMX_GPIO_NR(4, 6),
                        IMX_GPIO_NR(4, 7),
@@ -941,10 +1011,10 @@ struct ventana gpio_cfg[] = {
                .wdis = IMX_GPIO_NR(5, 17),
        },
 
-       /* GW552x */
+       /* GW551x */
        {
-               .gpio_pads = gw552x_gpio_pads,
-               .num_pads = ARRAY_SIZE(gw552x_gpio_pads)/2,
+               .gpio_pads = gw551x_gpio_pads,
+               .num_pads = ARRAY_SIZE(gw551x_gpio_pads)/2,
                .dio_cfg = {
                        {
                                { IOMUX_PADS(PAD_SD1_DAT0__GPIO1_IO16) },
@@ -965,18 +1035,46 @@ struct ventana gpio_cfg[] = {
                                3
                        },
                        {
-                               { IOMUX_PADS(PAD_SD1_CLK__GPIO1_IO20) },
-                               IMX_GPIO_NR(2, 10),
-                               { 0, 0 },
-                               0
+                               { IOMUX_PADS(PAD_SD1_CMD__GPIO1_IO18) },
+                               IMX_GPIO_NR(1, 18),
+                               { IOMUX_PADS(PAD_SD1_CMD__PWM4_OUT) },
+                               4
+                       },
+               },
+               .num_gpios = 2,
+               .leds = {
+                       IMX_GPIO_NR(4, 7),
+               },
+               .pcie_rst = IMX_GPIO_NR(1, 0),
+               .wdis = IMX_GPIO_NR(7, 12),
+       },
+
+       /* GW552x */
+       {
+               .gpio_pads = gw552x_gpio_pads,
+               .num_pads = ARRAY_SIZE(gw552x_gpio_pads)/2,
+               .dio_cfg = {
+                       {
+                               { IOMUX_PADS(PAD_SD1_DAT2__GPIO1_IO19) },
+                               IMX_GPIO_NR(1, 19),
+                               { IOMUX_PADS(PAD_SD1_DAT2__PWM2_OUT) },
+                               2
+                       },
+                       {
+                               { IOMUX_PADS(PAD_SD1_DAT1__GPIO1_IO17) },
+                               IMX_GPIO_NR(1, 17),
+                               { IOMUX_PADS(PAD_SD1_DAT1__PWM3_OUT) },
+                               3
                        },
                },
+               .num_gpios = 4,
                .leds = {
                        IMX_GPIO_NR(4, 6),
                        IMX_GPIO_NR(4, 7),
                        IMX_GPIO_NR(4, 15),
                },
                .pcie_rst = IMX_GPIO_NR(1, 29),
+               .wdis = IMX_GPIO_NR(7, 12),
        },
 };
 
@@ -1014,22 +1112,32 @@ int power_init_board(void)
                p = pmic_get("LTC3676_PMIC");
                if (p && !pmic_probe(p)) {
                        puts("PMIC:  LTC3676\n");
-                       /* set board-specific scalar to 1225mV for IMX6Q@1GHz */
-                       if (is_cpu_type(MXC_CPU_MX6Q)) {
-                               /* mask PGOOD during SW1 transition */
-                               reg = 0x1d | LTC3676_PGOOD_MASK;
-                               pmic_reg_write(p, LTC3676_DVB1B, reg);
-                               /* set SW1 (VDD_SOC) to 1259mV */
-                               reg = 0x1d;
-                               pmic_reg_write(p, LTC3676_DVB1A, reg);
-
-                               /* mask PGOOD during SW3 transition */
-                               reg = 0x1d | LTC3676_PGOOD_MASK;
-                               pmic_reg_write(p, LTC3676_DVB3B, reg);
-                               /*set SW3 (VDD_ARM) to 1259mV */
-                               reg = 0x1d;
-                               pmic_reg_write(p, LTC3676_DVB3A, reg);
-                       }
+                       /*
+                        * set board-specific scalar for max CPU frequency
+                        * per CPU based on the LDO enabled Operating Ranges
+                        * defined in the respective IMX6DQ and IMX6SDL
+                        * datasheets. The voltage resulting from the R1/R2
+                        * feedback inputs on Ventana is 1308mV. Note that this
+                        * is a bit shy of the Vmin of 1350mV in the datasheet
+                        * for LDO enabled mode but is as high as we can go.
+                        *
+                        * We will rely on an OS kernel driver to properly
+                        * regulate these per CPU operating point and use LDO
+                        * bypass mode when using the higher frequency
+                        * operating points to compensate as LDO bypass mode
+                        * allows the rails be 125mV lower.
+                        */
+                       /* mask PGOOD during SW1 transition */
+                       pmic_reg_write(p, LTC3676_DVB1B,
+                                      0x1f | LTC3676_PGOOD_MASK);
+                       /* set SW1 (VDD_SOC) */
+                       pmic_reg_write(p, LTC3676_DVB1A, 0x1f);
+
+                       /* mask PGOOD during SW3 transition */
+                       pmic_reg_write(p, LTC3676_DVB3B,
+                                      0x1f | LTC3676_PGOOD_MASK);
+                       /* set SW3 (VDD_ARM) */
+                       pmic_reg_write(p, LTC3676_DVB3A, 0x1f);
                }
        }
 
@@ -1062,6 +1170,10 @@ static void setup_board_gpio(int board)
        }
 
 #if !defined(CONFIG_CMD_PCI)
+       /* GW522x Uses GPIO3_IO23 for PCIE_RST# */
+       if (board_type == GW52xx && info->model[4] == '2')
+               gpio_cfg[board].pcie_rst = IMX_GPIO_NR(3, 23);
+
        /* assert PCI_RST# (released by OS when clock is valid) */
        gpio_direction_output(gpio_cfg[board].pcie_rst, 0);
 #endif
@@ -1100,7 +1212,9 @@ static void setup_board_gpio(int board)
 
        /* USBOTG Select (PCISKT or FrontPanel) */
        if (gpio_cfg[board].usb_sel)
-               gpio_direction_output(gpio_cfg[board].usb_sel, 0);
+               gpio_direction_output(gpio_cfg[board].usb_sel,
+                                     (hwconfig("usb_pcisel")) ? 1 : 0);
+
 
        /* PCISKT_WDIS# (Wireless disable GPIO to miniPCIe sockets) */
        if (gpio_cfg[board].wdis)
@@ -1115,6 +1229,8 @@ static void setup_board_gpio(int board)
                iomux_v3_cfg_t ctrl = DIO_PAD_CFG;
                unsigned cputype = is_cpu_type(MXC_CPU_MX6Q) ? 0 : 1;
 
+               if (!cfg->gpio_padmux[0] && !cfg->gpio_padmux[1])
+                       continue;
                sprintf(arg, "dio%d", i);
                if (!hwconfig(arg))
                        continue;
@@ -1320,15 +1436,8 @@ int checkboard(void)
                return 0;
 
        /* Display GSC firmware revision/CRC/status */
-       i2c_set_bus_num(CONFIG_I2C_GSC);
-       if (!gsc_i2c_read(GSC_SC_ADDR, GSC_SC_FWVER, 1, buf, 1)) {
-               printf("GSC:   v%d", buf[0]);
-               if (!gsc_i2c_read(GSC_SC_ADDR, GSC_SC_STATUS, 1, buf, 4)) {
-                       printf(" 0x%04x", buf[2] | buf[3]<<8); /* CRC */
-                       printf(" 0x%02x", buf[0]); /* irq status */
-               }
-               puts("\n");
-       }
+       gsc_info(0);
+
        /* Display RTC */
        if (!gsc_i2c_read(GSC_RTC_ADDR, 0x00, 1, buf, 4)) {
                printf("RTC:   %d\n",
@@ -1407,7 +1516,7 @@ int misc_init_r(void)
                                sprintf(fdt, "%s-%s.dtb", cputype, str);
                                setenv("fdt_file1", fdt);
                        }
-                       if (board_type != GW552x)
+                       if (board_type != GW551x && board_type != GW552x)
                                str[4] = 'x';
                        str[5] = 'x';
                        str[6] = 0;
@@ -1430,6 +1539,10 @@ int misc_init_r(void)
                /* board serial-number */
                sprintf(str, "%6d", info->serial);
                setenv("serial#", str);
+
+               /* memory MB */
+               sprintf(str, "%d", (int) (gd->ram_size >> 20));
+               setenv("mem_mb", str);
        }
 
 
@@ -1461,19 +1574,48 @@ int misc_init_r(void)
        } else {
                puts("Error: could not disable GSC Watchdog\n");
        }
-       if (!gsc_i2c_read(GSC_SC_ADDR, GSC_SC_STATUS, 1, &reg, 1)) {
-               if (reg & (1 << GSC_SC_IRQ_WATCHDOG)) { /* watchdog timeout */
-                       puts("GSC boot watchdog timeout detected\n");
-                       reg &= ~(1 << GSC_SC_IRQ_WATCHDOG); /* clear flag */
-                       gsc_i2c_write(GSC_SC_ADDR, GSC_SC_STATUS, 1, &reg, 1);
-               }
-       }
 
        return 0;
 }
 
 #if defined(CONFIG_OF_LIBFDT) && defined(CONFIG_OF_BOARD_SETUP)
 
+static int ft_sethdmiinfmt(void *blob, char *mode)
+{
+       int off;
+
+       if (!mode)
+               return -EINVAL;
+
+       off = fdt_node_offset_by_compatible(blob, -1, "nxp,tda1997x");
+       if (off < 0)
+               return off;
+
+       if (0 == strcasecmp(mode, "yuv422bt656")) {
+               u8 cfg[] = { 0x00, 0x00, 0x00, 0x82, 0x81, 0x00,
+                            0x00, 0x00, 0x00 };
+               mode = "422_ccir";
+               fdt_setprop(blob, off, "vidout_fmt", mode, strlen(mode) + 1);
+               fdt_setprop_u32(blob, off, "vidout_trc", 1);
+               fdt_setprop_u32(blob, off, "vidout_blc", 1);
+               fdt_setprop(blob, off, "vidout_portcfg", cfg, sizeof(cfg));
+               printf("   set HDMI input mode to %s\n", mode);
+       } else if (0 == strcasecmp(mode, "yuv422smp")) {
+               u8 cfg[] = { 0x00, 0x00, 0x00, 0x88, 0x87, 0x00,
+                            0x82, 0x81, 0x00 };
+               mode = "422_smp";
+               fdt_setprop(blob, off, "vidout_fmt", mode, strlen(mode) + 1);
+               fdt_setprop_u32(blob, off, "vidout_trc", 0);
+               fdt_setprop_u32(blob, off, "vidout_blc", 0);
+               fdt_setprop(blob, off, "vidout_portcfg", cfg, sizeof(cfg));
+               printf("   set HDMI input mode to %s\n", mode);
+       } else {
+               return -EINVAL;
+       }
+
+       return 0;
+}
+
 /*
  * called prior to booting kernel or by 'fdt boardsetup' command
  *
@@ -1492,6 +1634,17 @@ int ft_board_setup(void *blob, bd_t *bd)
                { "fsl,imx6q-gpmi-nand",  MTD_DEV_TYPE_NAND, }, /* NAND flash */
        };
        const char *model = getenv("model");
+       const char *display = getenv("display");
+       int i;
+       char rev = 0;
+
+       /* determine board revision */
+       for (i = sizeof(ventana_info.model) - 1; i > 0; i--) {
+               if (ventana_info.model[i] >= 'A') {
+                       rev = ventana_info.model[i];
+                       break;
+               }
+       }
 
        if (getenv("fdt_noauto")) {
                puts("   Skiping ft_board_setup (fdt_noauto defined)\n");
@@ -1502,6 +1655,13 @@ int ft_board_setup(void *blob, bd_t *bd)
        puts("   Updating MTD partitions...\n");
        fdt_fixup_mtdparts(blob, nodes, ARRAY_SIZE(nodes));
 
+       /* Update display timings from display env var */
+       if (display) {
+               if (fdt_fixup_display(blob, fdt_get_alias(blob, "lvds0"),
+                                     display) >= 0)
+                       printf("   Set display timings for %s...\n", display);
+       }
+
        if (!model) {
                puts("invalid board info: Leaving FDT fully enabled\n");
                return 0;
@@ -1516,6 +1676,91 @@ int ft_board_setup(void *blob, bd_t *bd)
        fdt_setprop(blob, 0, "board", info->model,
                    strlen((const char *)info->model) + 1);
 
+       /* set desired digital video capture format */
+       ft_sethdmiinfmt(blob, getenv("hdmiinfmt"));
+
+       /*
+        * disable serial2 node for GW54xx for compatibility with older
+        * 3.10.x kernel that improperly had this node enabled in the DT
+        */
+       if (board_type == GW54xx) {
+               i = fdt_path_offset(blob,
+                                   "/soc/aips-bus@02100000/serial@021ec000");
+               if (i)
+                       fdt_del_node(blob, i);
+       }
+
+       /*
+        * disable wdog1/wdog2 nodes for GW51xx below revC to work around
+        * errata causing wdog timer to be unreliable.
+        */
+       if (board_type == GW51xx && rev >= 'A' && rev < 'C') {
+               i = fdt_path_offset(blob,
+                                   "/soc/aips-bus@02000000/wdog@020bc000");
+               if (i)
+                       fdt_status_disabled(blob, i);
+       }
+
+       /* GW522x Uses GPIO3_IO23 instead of GPIO1_IO29 */
+       else if (board_type == GW52xx && info->model[4] == '2') {
+               u32 handle = 0;
+               u32 *range = NULL;
+
+               i = fdt_node_offset_by_compatible(blob, -1, "fsl,imx6q-pcie");
+               if (i)
+                       range = (u32 *)fdt_getprop(blob, i, "reset-gpio",
+                                                  NULL);
+
+               if (range) {
+                       i = fdt_path_offset(blob,
+                                           "/soc/aips-bus@02000000/gpio@020a4000");
+                       if (i)
+                               handle = fdt_get_phandle(blob, i);
+                       if (handle) {
+                               range[0] = cpu_to_fdt32(handle);
+                               range[1] = cpu_to_fdt32(23);
+                       }
+               }
+       }
+
+       /*
+        * isolate CSI0_DATA_EN for GW551x below revB to work around
+        * errata causing non functional digital video in (it is not hooked up)
+        */
+       else if (board_type == GW551x && rev == 'A') {
+               u32 *range = NULL;
+               int len;
+               const u32 *handle = NULL;
+
+               i = fdt_node_offset_by_compatible(blob, -1,
+                                                 "fsl,imx-tda1997x-video");
+               if (i)
+                       handle = fdt_getprop(blob, i, "pinctrl-0", NULL);
+               if (handle)
+                       i = fdt_node_offset_by_phandle(blob,
+                                                      fdt32_to_cpu(*handle));
+               if (i)
+                       range = (u32 *)fdt_getprop(blob, i, "fsl,pins", &len);
+               if (range) {
+                       len /= sizeof(u32);
+                       for (i = 0; i < len; i += 6) {
+                               u32 mux_reg = fdt32_to_cpu(range[i+0]);
+                               u32 conf_reg = fdt32_to_cpu(range[i+1]);
+                               /* mux PAD_CSI0_DATA_EN to GPIO */
+                               if (is_cpu_type(MXC_CPU_MX6Q) &&
+                                   mux_reg == 0x260 && conf_reg == 0x630)
+                                       range[i+3] = cpu_to_fdt32(0x5);
+                               else if (!is_cpu_type(MXC_CPU_MX6Q) &&
+                                   mux_reg == 0x08c && conf_reg == 0x3a0)
+                                       range[i+3] = cpu_to_fdt32(0x5);
+                       }
+                       fdt_setprop_inplace(blob, i, "fsl,pins", range, len);
+               }
+
+               /* set BT656 video format */
+               ft_sethdmiinfmt(blob, "yuv422bt656");
+       }
+
        /*
         * Peripheral Config:
         *  remove nodes by alias path if EEPROM config tells us the
index 97128127fbe741f2393faeba06d1c4ff40a23238..0c0fee3196250607db56a16821e7c9c90c44b48d 100644 (file)
@@ -188,7 +188,21 @@ struct mx6sdl_iomux_grp_regs mx6sdl_grp_ioregs = {
        .grp_b7ds = 0x00000030,
 };
 
-/* MT41K128M16JT-125 */
+/* MT41K64M16JT-125 (1Gb density) */
+static struct mx6_ddr3_cfg mt41k64m16jt_125 = {
+       .mem_speed = 1600,
+       .density = 1,
+       .width = 16,
+       .banks = 8,
+       .rowaddr = 13,
+       .coladdr = 10,
+       .pagesz = 2,
+       .trcd = 1375,
+       .trcmin = 4875,
+       .trasmin = 3500,
+};
+
+/* MT41K128M16JT-125 (2Gb density) */
 static struct mx6_ddr3_cfg mt41k128m16jt_125 = {
        .mem_speed = 1600,
        .density = 2,
@@ -202,7 +216,7 @@ static struct mx6_ddr3_cfg mt41k128m16jt_125 = {
        .trasmin = 3500,
 };
 
-/* MT41K256M16HA-125 */
+/* MT41K256M16HA-125 (4Gb density) */
 static struct mx6_ddr3_cfg mt41k256m16ha_125 = {
        .mem_speed = 1600,
        .density = 4,
@@ -219,6 +233,44 @@ static struct mx6_ddr3_cfg mt41k256m16ha_125 = {
 /*
  * calibration - these are the various CPU/DDR3 combinations we support
  */
+static struct mx6_mmdc_calibration mx6sdl_64x16_mmdc_calib = {
+       /* write leveling calibration determine */
+       .p0_mpwldectrl0 = 0x004C004E,
+       .p0_mpwldectrl1 = 0x00440044,
+       /* Read DQS Gating calibration */
+       .p0_mpdgctrl0 = 0x42440247,
+       .p0_mpdgctrl1 = 0x02310232,
+       /* Read Calibration: DQS delay relative to DQ read access */
+       .p0_mprddlctl = 0x45424746,
+       /* Write Calibration: DQ/DM delay relative to DQS write access */
+       .p0_mpwrdlctl = 0x33382C31,
+};
+
+static struct mx6_mmdc_calibration mx6dq_256x16_mmdc_calib = {
+       /* write leveling calibration determine */
+       .p0_mpwldectrl0 = 0x001B0016,
+       .p0_mpwldectrl1 = 0x000C000E,
+       /* Read DQS Gating calibration */
+       .p0_mpdgctrl0 = 0x4324033A,
+       .p0_mpdgctrl1 = 0x00000000,
+       /* Read Calibration: DQS delay relative to DQ read access */
+       .p0_mprddlctl = 0x40403438,
+       /* Write Calibration: DQ/DM delay relative to DQS write access */
+       .p0_mpwrdlctl = 0x40403D36,
+};
+
+static struct mx6_mmdc_calibration mx6sdl_256x16_mmdc_calib = {
+       /* write leveling calibration determine */
+       .p0_mpwldectrl0 = 0x00420043,
+       .p0_mpwldectrl1 = 0x0016001A,
+       /* Read DQS Gating calibration */
+       .p0_mpdgctrl0 = 0x4238023B,
+       .p0_mpdgctrl1 = 0x00000000,
+       /* Read Calibration: DQS delay relative to DQ read access */
+       .p0_mprddlctl = 0x40404849,
+       /* Write Calibration: DQ/DM delay relative to DQS write access */
+       .p0_mpwrdlctl = 0x40402E2F,
+};
 
 static struct mx6_mmdc_calibration mx6dq_128x32_mmdc_calib = {
        /* write leveling calibration determine */
@@ -297,6 +349,19 @@ static struct mx6_mmdc_calibration mx6dq_256x32_mmdc_calib = {
        .p0_mpwrdlctl = 0x32363934,
 };
 
+static struct mx6_mmdc_calibration mx6sdl_256x32_mmdc_calib = {
+       /* write leveling calibration determine */
+       .p0_mpwldectrl0 = 0X00480047,
+       .p0_mpwldectrl1 = 0X003D003F,
+       /* Read DQS Gating calibration */
+       .p0_mpdgctrl0 = 0X423E0241,
+       .p0_mpdgctrl1 = 0X022B022C,
+       /* Read Calibration: DQS delay relative to DQ read access */
+       .p0_mprddlctl = 0X49454A4A,
+       /* Write Calibration: DQ/DM delay relative to DQS write access */
+       .p0_mpwrdlctl = 0X2E372C32,
+};
+
 static struct mx6_mmdc_calibration mx6dq_256x64_mmdc_calib = {
        /* write leveling calibration determine */
        .p0_mpwldectrl0 = 0X00220021,
@@ -340,6 +405,7 @@ static void spl_dram_init(int width, int size_mb, int board_model)
                .bi_on = 1,     /* Bank interleaving enabled */
                .sde_to_rst = 0x10,     /* 14 cycles, 200us (JEDEC default) */
                .rst_to_cke = 0x23,     /* 33 cycles, 500us (JEDEC default) */
+               .pd_fast_exit = 1, /* enable precharge power-down fast exit */
        };
 
        /*
@@ -349,25 +415,60 @@ static void spl_dram_init(int width, int size_mb, int board_model)
         *   mx6_ddr_sysinfo - board-specific memory architecture (width/cs/etc)
         *   mx6_ddr_cfg - chip specific timing/layout details
         */
-       if (width == 32 && size_mb == 512) {
+       if (width == 16 && size_mb == 128) {
+               mem = &mt41k64m16jt_125;
+               if (is_cpu_type(MXC_CPU_MX6Q))
+                       ;
+               else
+                       calib = &mx6sdl_64x16_mmdc_calib;
+               debug("1gB density\n");
+       } else if (width == 16 && size_mb == 256) {
+               /* 1x 2Gb density chip - same calib as 2x 2Gb */
                mem = &mt41k128m16jt_125;
                if (is_cpu_type(MXC_CPU_MX6Q))
                        calib = &mx6dq_128x32_mmdc_calib;
                else
                        calib = &mx6sdl_128x32_mmdc_calib;
                debug("2gB density\n");
-       } else if (width == 64 && size_mb == 1024) {
+       } else if (width == 16 && size_mb == 512) {
+               mem = &mt41k256m16ha_125;
+               if (is_cpu_type(MXC_CPU_MX6Q))
+                       calib = &mx6dq_256x16_mmdc_calib;
+               else
+                       calib = &mx6sdl_256x16_mmdc_calib;
+               debug("4gB density\n");
+       } else if (width == 32 && size_mb == 256) {
+               /* Same calib as width==16, size==128 */
+               mem = &mt41k64m16jt_125;
+               if (is_cpu_type(MXC_CPU_MX6Q))
+                       ;
+               else
+                       calib = &mx6sdl_64x16_mmdc_calib;
+               debug("1gB density\n");
+       } else if (width == 32 && size_mb == 512) {
                mem = &mt41k128m16jt_125;
                if (is_cpu_type(MXC_CPU_MX6Q))
-                       calib = &mx6dq_128x64_mmdc_calib;
+                       calib = &mx6dq_128x32_mmdc_calib;
                else
-                       calib = &mx6sdl_128x64_mmdc_calib;
+                       calib = &mx6sdl_128x32_mmdc_calib;
                debug("2gB density\n");
-       } else if (width == 32 && size_mb == 1024) {
+       }  else if (width == 32 && size_mb == 1024) {
                mem = &mt41k256m16ha_125;
                if (is_cpu_type(MXC_CPU_MX6Q))
                        calib = &mx6dq_256x32_mmdc_calib;
+               else
+                       calib = &mx6sdl_256x32_mmdc_calib;
                debug("4gB density\n");
+       } else if (width == 64 && size_mb == 512) {
+               mem = &mt41k64m16jt_125;
+               debug("1gB density\n");
+       } else if (width == 64 && size_mb == 1024) {
+               mem = &mt41k128m16jt_125;
+               if (is_cpu_type(MXC_CPU_MX6Q))
+                       calib = &mx6dq_128x64_mmdc_calib;
+               else
+                       calib = &mx6sdl_128x64_mmdc_calib;
+               debug("2gB density\n");
        } else if (width == 64 && size_mb == 2048) {
                mem = &mt41k256m16ha_125;
                if (is_cpu_type(MXC_CPU_MX6Q))
@@ -375,12 +476,14 @@ static void spl_dram_init(int width, int size_mb, int board_model)
                debug("4gB density\n");
        }
 
-       if (!mem) {
-               puts("Error: Invalid Memory Configuration\n");
-               hang();
-       }
-       if (!calib) {
-               puts("Error: Invalid Board Calibration Configuration\n");
+       if (!(mem && calib)) {
+               puts("Error: Invalid Calibration/Board Configuration\n");
+               printf("MEM    : %s\n", mem ? "OKAY" : "NULL");
+               printf("CALIB  : %s\n", calib ? "OKAY" : "NULL");
+               printf("CPUTYPE: %s\n",
+                      is_cpu_type(MXC_CPU_MX6Q) ? "IMX6Q" : "IMX6DL");
+               printf("SIZE_MB: %d\n", size_mb);
+               printf("WIDTH  : %d\n", width);
                hang();
        }
 
index af12711ac26eaf7f8a1b70a9f7b733599dfb99bb..daff375e40b0a70fa0513fd3ad36023511a3b3ad 100644 (file)
@@ -109,6 +109,7 @@ enum {
        GW52xx,
        GW53xx,
        GW54xx,
+       GW551x,
        GW552x,
        GW_UNKNOWN,
        GW_BADCRC,
diff --git a/board/solidrun/mx6cuboxi/Kconfig b/board/solidrun/mx6cuboxi/Kconfig
new file mode 100644 (file)
index 0000000..31d88b2
--- /dev/null
@@ -0,0 +1,15 @@
+if TARGET_MX6CUBOXI
+
+config SYS_BOARD
+       default "mx6cuboxi"
+
+config SYS_VENDOR
+       default "solidrun"
+
+config SYS_SOC
+       default "mx6"
+
+config SYS_CONFIG_NAME
+       default "mx6cuboxi"
+
+endif
diff --git a/board/solidrun/mx6cuboxi/MAINTAINERS b/board/solidrun/mx6cuboxi/MAINTAINERS
new file mode 100644 (file)
index 0000000..a3506c2
--- /dev/null
@@ -0,0 +1,6 @@
+MX6CUBOXI BOARD
+M:     Fabio Estevam <fabio.estevam@freescale.com>
+S:     Maintained
+F:     board/solidrun/mx6cuboxi/
+F:     include/configs/mx6cuboxi.h
+F:     configs/mx6cuboxi_defconfig
diff --git a/board/solidrun/mx6cuboxi/Makefile b/board/solidrun/mx6cuboxi/Makefile
new file mode 100644 (file)
index 0000000..df425ac
--- /dev/null
@@ -0,0 +1,9 @@
+#
+# Copyright (C) 2007, Guennadi Liakhovetski <lg@denx.de>
+#
+# (C) Copyright 2011 Freescale Semiconductor, Inc.
+#
+# SPDX-License-Identifier:     GPL-2.0+
+#
+
+obj-y  := mx6cuboxi.o
diff --git a/board/solidrun/mx6cuboxi/README b/board/solidrun/mx6cuboxi/README
new file mode 100644 (file)
index 0000000..3050c48
--- /dev/null
@@ -0,0 +1,21 @@
+How to use U-boot on Solid-run mx6 hummingboard
+-----------------------------------------------
+
+- Build U-boot for hummingboard:
+
+$ make mrproper
+$ make mx6cuboxi_defconfig
+$ make
+
+This will generate the SPL image called SPL and the u-boot.img.
+
+- Flash the SPL image into the SD card:
+
+sudo dd if=SPL of=/dev/mmcblk0 bs=1k seek=1; sync
+
+- Flash the u-boot.img image into the SD card:
+
+sudo dd if=u-boot.img of=/dev/mmcblk0 bs=1k seek=69; sync
+
+- Insert the SD card in the hummingboard, power it up and U-boot messages
+should come up.
diff --git a/board/solidrun/mx6cuboxi/mx6cuboxi.c b/board/solidrun/mx6cuboxi/mx6cuboxi.c
new file mode 100644 (file)
index 0000000..d3a32c1
--- /dev/null
@@ -0,0 +1,510 @@
+/*
+ * Copyright (C) 2015 Freescale Semiconductor, Inc.
+ *
+ * Author: Fabio Estevam <fabio.estevam@freescale.com>
+ *
+ * Copyright (C) 2013 Jon Nettleton <jon.nettleton@gmail.com>
+ *
+ * Based on SPL code from Solidrun tree, which is:
+ * Author: Tungyi Lin <tungyilin1127@gmail.com>
+ *
+ * Derived from EDM_CF_IMX6 code by TechNexion,Inc
+ * Ported to SolidRun microSOM by Rabeeh Khoury <rabeeh@solid-run.com>
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#include <asm/arch/clock.h>
+#include <asm/arch/imx-regs.h>
+#include <asm/arch/iomux.h>
+#include <asm/arch/mx6-pins.h>
+#include <asm/errno.h>
+#include <asm/gpio.h>
+#include <asm/imx-common/iomux-v3.h>
+#include <mmc.h>
+#include <fsl_esdhc.h>
+#include <miiphy.h>
+#include <netdev.h>
+#include <asm/arch/crm_regs.h>
+#include <asm/io.h>
+#include <asm/arch/sys_proto.h>
+#include <spl.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+#define UART_PAD_CTRL  (PAD_CTL_PUS_100K_UP |                  \
+       PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm |                 \
+       PAD_CTL_SRE_FAST  | PAD_CTL_HYS)
+
+#define USDHC_PAD_CTRL (PAD_CTL_PUS_47K_UP |                   \
+       PAD_CTL_SPEED_LOW | PAD_CTL_DSE_80ohm |                 \
+       PAD_CTL_SRE_FAST  | PAD_CTL_HYS)
+
+#define ENET_PAD_CTRL  (PAD_CTL_PUS_100K_UP |                  \
+       PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm | PAD_CTL_HYS)
+
+#define ENET_PAD_CTRL_PD  (PAD_CTL_PUS_100K_DOWN |             \
+       PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm | PAD_CTL_HYS)
+
+#define ENET_PAD_CTRL_CLK  ((PAD_CTL_PUS_100K_UP & ~PAD_CTL_PKE) | \
+       PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm | PAD_CTL_SRE_FAST)
+
+#define ETH_PHY_RESET  IMX_GPIO_NR(4, 15)
+
+int dram_init(void)
+{
+       gd->ram_size = imx_ddr_size();
+       return 0;
+}
+
+static iomux_v3_cfg_t const uart1_pads[] = {
+       IOMUX_PADS(PAD_CSI0_DAT10__UART1_TX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL)),
+       IOMUX_PADS(PAD_CSI0_DAT11__UART1_RX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL)),
+};
+
+static iomux_v3_cfg_t const usdhc2_pads[] = {
+       IOMUX_PADS(PAD_SD2_CLK__SD2_CLK | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
+       IOMUX_PADS(PAD_SD2_CMD__SD2_CMD | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
+       IOMUX_PADS(PAD_SD2_DAT0__SD2_DATA0 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
+       IOMUX_PADS(PAD_SD2_DAT1__SD2_DATA1      | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
+       IOMUX_PADS(PAD_SD2_DAT2__SD2_DATA2      | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
+       IOMUX_PADS(PAD_SD2_DAT3__SD2_DATA3      | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
+};
+
+static iomux_v3_cfg_t const hb_cbi_sense[] = {
+       /* These pins are for sensing if it is a CuBox-i or a HummingBoard */
+       IOMUX_PADS(PAD_KEY_ROW1__GPIO4_IO09  | MUX_PAD_CTRL(UART_PAD_CTRL)),
+       IOMUX_PADS(PAD_EIM_DA4__GPIO3_IO04   | MUX_PAD_CTRL(UART_PAD_CTRL)),
+};
+
+static void setup_iomux_uart(void)
+{
+       SETUP_IOMUX_PADS(uart1_pads);
+}
+
+static struct fsl_esdhc_cfg usdhc_cfg[1] = {
+       {USDHC2_BASE_ADDR},
+};
+
+int board_mmc_getcd(struct mmc *mmc)
+{
+       return 1; /* uSDHC2 is always present */
+}
+
+int board_mmc_init(bd_t *bis)
+{
+       SETUP_IOMUX_PADS(usdhc2_pads);
+       usdhc_cfg[0].esdhc_base = USDHC2_BASE_ADDR;
+       usdhc_cfg[0].sdhc_clk = mxc_get_clock(MXC_ESDHC2_CLK);
+       gd->arch.sdhc_clk = usdhc_cfg[0].sdhc_clk;
+
+       return fsl_esdhc_initialize(bis, &usdhc_cfg[0]);
+}
+
+static iomux_v3_cfg_t const enet_pads[] = {
+       IOMUX_PADS(PAD_ENET_MDIO__ENET_MDIO | MUX_PAD_CTRL(ENET_PAD_CTRL)),
+       IOMUX_PADS(PAD_ENET_MDC__ENET_MDC | MUX_PAD_CTRL(ENET_PAD_CTRL)),
+       /* AR8035 reset */
+       IOMUX_PADS(PAD_KEY_ROW4__GPIO4_IO15 | MUX_PAD_CTRL(ENET_PAD_CTRL_PD)),
+       /* AR8035 interrupt */
+       IOMUX_PADS(PAD_DI0_PIN2__GPIO4_IO18 | MUX_PAD_CTRL(NO_PAD_CTRL)),
+       /* GPIO16 -> AR8035 25MHz */
+       IOMUX_PADS(PAD_GPIO_16__ENET_REF_CLK      | MUX_PAD_CTRL(NO_PAD_CTRL)),
+       IOMUX_PADS(PAD_RGMII_TXC__RGMII_TXC       | MUX_PAD_CTRL(NO_PAD_CTRL)),
+       IOMUX_PADS(PAD_RGMII_TD0__RGMII_TD0 | MUX_PAD_CTRL(ENET_PAD_CTRL)),
+       IOMUX_PADS(PAD_RGMII_TD1__RGMII_TD1 | MUX_PAD_CTRL(ENET_PAD_CTRL)),
+       IOMUX_PADS(PAD_RGMII_TD2__RGMII_TD2 | MUX_PAD_CTRL(ENET_PAD_CTRL)),
+       IOMUX_PADS(PAD_RGMII_TD3__RGMII_TD3 | MUX_PAD_CTRL(ENET_PAD_CTRL)),
+       IOMUX_PADS(PAD_RGMII_TX_CTL__RGMII_TX_CTL | MUX_PAD_CTRL(ENET_PAD_CTRL)),
+       /* AR8035 CLK_25M --> ENET_REF_CLK (V22) */
+       IOMUX_PADS(PAD_ENET_REF_CLK__ENET_TX_CLK | MUX_PAD_CTRL(ENET_PAD_CTRL_CLK)),
+       IOMUX_PADS(PAD_RGMII_RXC__RGMII_RXC | MUX_PAD_CTRL(ENET_PAD_CTRL)),
+       IOMUX_PADS(PAD_RGMII_RD0__RGMII_RD0 | MUX_PAD_CTRL(ENET_PAD_CTRL_PD)),
+       IOMUX_PADS(PAD_RGMII_RD1__RGMII_RD1 | MUX_PAD_CTRL(ENET_PAD_CTRL_PD)),
+       IOMUX_PADS(PAD_RGMII_RD2__RGMII_RD2 | MUX_PAD_CTRL(ENET_PAD_CTRL)),
+       IOMUX_PADS(PAD_RGMII_RD3__RGMII_RD3 | MUX_PAD_CTRL(ENET_PAD_CTRL)),
+       IOMUX_PADS(PAD_RGMII_RX_CTL__RGMII_RX_CTL | MUX_PAD_CTRL(ENET_PAD_CTRL_PD)),
+};
+
+static void setup_iomux_enet(void)
+{
+       SETUP_IOMUX_PADS(enet_pads);
+
+       gpio_direction_output(ETH_PHY_RESET, 0);
+       mdelay(2);
+       gpio_set_value(ETH_PHY_RESET, 1);
+}
+
+int board_phy_config(struct phy_device *phydev)
+{
+       if (phydev->drv->config)
+               phydev->drv->config(phydev);
+
+       return 0;
+}
+
+int board_eth_init(bd_t *bis)
+{
+       struct iomuxc *const iomuxc_regs = (struct iomuxc *)IOMUXC_BASE_ADDR;
+
+       int ret = enable_fec_anatop_clock(ENET_25MHZ);
+       if (ret)
+               return ret;
+
+       /* set gpr1[ENET_CLK_SEL] */
+       setbits_le32(&iomuxc_regs->gpr[1], IOMUXC_GPR1_ENET_CLK_SEL_MASK);
+
+       setup_iomux_enet();
+
+       return cpu_eth_init(bis);
+}
+
+int board_early_init_f(void)
+{
+       setup_iomux_uart();
+       return 0;
+}
+
+int board_init(void)
+{
+       /* address of boot parameters */
+       gd->bd->bi_boot_params = CONFIG_SYS_SDRAM_BASE + 0x100;
+
+       return 0;
+}
+
+static bool is_hummingboard(void)
+{
+       int val1, val2;
+
+       SETUP_IOMUX_PADS(hb_cbi_sense);
+
+       gpio_direction_input(IMX_GPIO_NR(4, 9));
+       gpio_direction_input(IMX_GPIO_NR(3, 4));
+
+       val1 = gpio_get_value(IMX_GPIO_NR(4, 9));
+       val2 = gpio_get_value(IMX_GPIO_NR(3, 4));
+
+       /*
+        * Machine selection -
+        * Machine        val1, val2
+        * -------------------------
+        * HB rev 3.x     x     0
+        * CBi            0     1
+        * HB             1     1
+        */
+
+       if (val2 == 0)
+               return true;
+       else if (val1 == 0)
+               return false;
+       else
+               return true;
+}
+
+int checkboard(void)
+{
+       if (is_hummingboard())
+               puts("Board: MX6 Hummingboard\n");
+       else
+               puts("Board: MX6 Cubox-i\n");
+
+       return 0;
+}
+
+static bool is_mx6q(void)
+{
+       if (is_cpu_type(MXC_CPU_MX6Q) || is_cpu_type(MXC_CPU_MX6D))
+               return true;
+       else
+               return false;
+}
+
+int board_late_init(void)
+{
+#ifdef CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG
+       if (is_hummingboard())
+               setenv("board_name", "HUMMINGBOARD");
+       else
+               setenv("board_name", "CUBOXI");
+
+       if (is_mx6q())
+               setenv("board_rev", "MX6Q");
+       else
+               setenv("board_rev", "MX6DL");
+#endif
+
+       return 0;
+}
+
+#ifdef CONFIG_SPL_BUILD
+#include <asm/arch/mx6-ddr.h>
+static const struct mx6dq_iomux_ddr_regs mx6q_ddr_ioregs = {
+       .dram_sdclk_0 =  0x00020030,
+       .dram_sdclk_1 =  0x00020030,
+       .dram_cas =  0x00020030,
+       .dram_ras =  0x00020030,
+       .dram_reset =  0x00020030,
+       .dram_sdcke0 =  0x00003000,
+       .dram_sdcke1 =  0x00003000,
+       .dram_sdba2 =  0x00000000,
+       .dram_sdodt0 =  0x00003030,
+       .dram_sdodt1 =  0x00003030,
+       .dram_sdqs0 =  0x00000030,
+       .dram_sdqs1 =  0x00000030,
+       .dram_sdqs2 =  0x00000030,
+       .dram_sdqs3 =  0x00000030,
+       .dram_sdqs4 =  0x00000030,
+       .dram_sdqs5 =  0x00000030,
+       .dram_sdqs6 =  0x00000030,
+       .dram_sdqs7 =  0x00000030,
+       .dram_dqm0 =  0x00020030,
+       .dram_dqm1 =  0x00020030,
+       .dram_dqm2 =  0x00020030,
+       .dram_dqm3 =  0x00020030,
+       .dram_dqm4 =  0x00020030,
+       .dram_dqm5 =  0x00020030,
+       .dram_dqm6 =  0x00020030,
+       .dram_dqm7 =  0x00020030,
+};
+
+static const struct mx6sdl_iomux_ddr_regs mx6dl_ddr_ioregs = {
+       .dram_sdclk_0 = 0x00000028,
+       .dram_sdclk_1 = 0x00000028,
+       .dram_cas =     0x00000028,
+       .dram_ras =     0x00000028,
+       .dram_reset =   0x000c0028,
+       .dram_sdcke0 =  0x00003000,
+       .dram_sdcke1 =  0x00003000,
+       .dram_sdba2 =   0x00000000,
+       .dram_sdodt0 =  0x00003030,
+       .dram_sdodt1 =  0x00003030,
+       .dram_sdqs0 =   0x00000028,
+       .dram_sdqs1 =   0x00000028,
+       .dram_sdqs2 =   0x00000028,
+       .dram_sdqs3 =   0x00000028,
+       .dram_sdqs4 =   0x00000028,
+       .dram_sdqs5 =   0x00000028,
+       .dram_sdqs6 =   0x00000028,
+       .dram_sdqs7 =   0x00000028,
+       .dram_dqm0 =    0x00000028,
+       .dram_dqm1 =    0x00000028,
+       .dram_dqm2 =    0x00000028,
+       .dram_dqm3 =    0x00000028,
+       .dram_dqm4 =    0x00000028,
+       .dram_dqm5 =    0x00000028,
+       .dram_dqm6 =    0x00000028,
+       .dram_dqm7 =    0x00000028,
+};
+
+static const struct mx6dq_iomux_grp_regs mx6q_grp_ioregs = {
+       .grp_ddr_type =  0x000C0000,
+       .grp_ddrmode_ctl =  0x00020000,
+       .grp_ddrpke =  0x00000000,
+       .grp_addds =  0x00000030,
+       .grp_ctlds =  0x00000030,
+       .grp_ddrmode =  0x00020000,
+       .grp_b0ds =  0x00000030,
+       .grp_b1ds =  0x00000030,
+       .grp_b2ds =  0x00000030,
+       .grp_b3ds =  0x00000030,
+       .grp_b4ds =  0x00000030,
+       .grp_b5ds =  0x00000030,
+       .grp_b6ds =  0x00000030,
+       .grp_b7ds =  0x00000030,
+};
+
+static const struct mx6sdl_iomux_grp_regs mx6sdl_grp_ioregs = {
+       .grp_ddr_type = 0x000c0000,
+       .grp_ddrmode_ctl = 0x00020000,
+       .grp_ddrpke = 0x00000000,
+       .grp_addds = 0x00000028,
+       .grp_ctlds = 0x00000028,
+       .grp_ddrmode = 0x00020000,
+       .grp_b0ds = 0x00000028,
+       .grp_b1ds = 0x00000028,
+       .grp_b2ds = 0x00000028,
+       .grp_b3ds = 0x00000028,
+       .grp_b4ds = 0x00000028,
+       .grp_b5ds = 0x00000028,
+       .grp_b6ds = 0x00000028,
+       .grp_b7ds = 0x00000028,
+};
+
+/* microSOM with Dual processor and 1GB memory */
+static const struct mx6_mmdc_calibration mx6q_1g_mmcd_calib = {
+       .p0_mpwldectrl0 =  0x00000000,
+       .p0_mpwldectrl1 =  0x00000000,
+       .p1_mpwldectrl0 =  0x00000000,
+       .p1_mpwldectrl1 =  0x00000000,
+       .p0_mpdgctrl0 =    0x0314031c,
+       .p0_mpdgctrl1 =    0x023e0304,
+       .p1_mpdgctrl0 =    0x03240330,
+       .p1_mpdgctrl1 =    0x03180260,
+       .p0_mprddlctl =    0x3630323c,
+       .p1_mprddlctl =    0x3436283a,
+       .p0_mpwrdlctl =    0x36344038,
+       .p1_mpwrdlctl =    0x422a423c,
+};
+
+/* microSOM with Quad processor and 2GB memory */
+static const struct mx6_mmdc_calibration mx6q_2g_mmcd_calib = {
+       .p0_mpwldectrl0 =  0x00000000,
+       .p0_mpwldectrl1 =  0x00000000,
+       .p1_mpwldectrl0 =  0x00000000,
+       .p1_mpwldectrl1 =  0x00000000,
+       .p0_mpdgctrl0 =    0x0314031c,
+       .p0_mpdgctrl1 =    0x023e0304,
+       .p1_mpdgctrl0 =    0x03240330,
+       .p1_mpdgctrl1 =    0x03180260,
+       .p0_mprddlctl =    0x3630323c,
+       .p1_mprddlctl =    0x3436283a,
+       .p0_mpwrdlctl =    0x36344038,
+       .p1_mpwrdlctl =    0x422a423c,
+};
+
+/* microSOM with Solo processor and 512MB memory */
+static const struct mx6_mmdc_calibration mx6dl_512m_mmcd_calib = {
+       .p0_mpwldectrl0 = 0x0045004D,
+       .p0_mpwldectrl1 = 0x003A0047,
+       .p0_mpdgctrl0 =   0x023C0224,
+       .p0_mpdgctrl1 =   0x02000220,
+       .p0_mprddlctl =   0x44444846,
+       .p0_mpwrdlctl =   0x32343032,
+};
+
+/* microSOM with Dual lite processor and 1GB memory */
+static const struct mx6_mmdc_calibration mx6dl_1g_mmcd_calib = {
+       .p0_mpwldectrl0 =  0x0045004D,
+       .p0_mpwldectrl1 =  0x003A0047,
+       .p1_mpwldectrl0 =  0x001F001F,
+       .p1_mpwldectrl1 =  0x00210035,
+       .p0_mpdgctrl0 =    0x023C0224,
+       .p0_mpdgctrl1 =    0x02000220,
+       .p1_mpdgctrl0 =    0x02200220,
+       .p1_mpdgctrl1 =    0x02000220,
+       .p0_mprddlctl =    0x44444846,
+       .p1_mprddlctl =    0x4042463C,
+       .p0_mpwrdlctl =    0x32343032,
+       .p1_mpwrdlctl =    0x36363430,
+};
+
+static struct mx6_ddr3_cfg mem_ddr_2g = {
+       .mem_speed = 1600,
+       .density   = 2,
+       .width     = 16,
+       .banks     = 8,
+       .rowaddr   = 14,
+       .coladdr   = 10,
+       .pagesz    = 2,
+       .trcd      = 1375,
+       .trcmin    = 4875,
+       .trasmin   = 3500,
+       .SRT       = 1,
+};
+
+static struct mx6_ddr3_cfg mem_ddr_4g = {
+       .mem_speed = 1600,
+       .density = 4,
+       .width = 16,
+       .banks = 8,
+       .rowaddr = 15,
+       .coladdr = 10,
+       .pagesz = 2,
+       .trcd = 1375,
+       .trcmin = 4875,
+       .trasmin = 3500,
+};
+
+static void ccgr_init(void)
+{
+       struct mxc_ccm_reg *ccm = (struct mxc_ccm_reg *)CCM_BASE_ADDR;
+
+       writel(0x00C03F3F, &ccm->CCGR0);
+       writel(0x0030FC03, &ccm->CCGR1);
+       writel(0x0FFFC000, &ccm->CCGR2);
+       writel(0x3FF00000, &ccm->CCGR3);
+       writel(0x00FFF300, &ccm->CCGR4);
+       writel(0x0F0000C3, &ccm->CCGR5);
+       writel(0x000003FF, &ccm->CCGR6);
+}
+
+static void gpr_init(void)
+{
+       struct iomuxc *iomux = (struct iomuxc *)IOMUXC_BASE_ADDR;
+
+       /* enable AXI cache for VDOA/VPU/IPU */
+       writel(0xF00000CF, &iomux->gpr[4]);
+       /* set IPU AXI-id0 Qos=0xf(bypass) AXI-id1 Qos=0x7 */
+       writel(0x007F007F, &iomux->gpr[6]);
+       writel(0x007F007F, &iomux->gpr[7]);
+}
+
+/*
+ * This section requires the differentiation between Solidrun mx6 boards, but
+ * for now, it will configure only for the mx6dual hummingboard version.
+ */
+static void spl_dram_init(int width)
+{
+       struct mx6_ddr_sysinfo sysinfo = {
+               /* width of data bus: 0=16, 1=32, 2=64 */
+               .dsize = width / 32,
+               /* config for full 4GB range so that get_mem_size() works */
+               .cs_density = 32,       /* 32Gb per CS */
+               .ncs = 1,               /* single chip select */
+               .cs1_mirror = 0,
+               .rtt_wr = 1 /*DDR3_RTT_60_OHM*/,        /* RTT_Wr = RZQ/4 */
+               .rtt_nom = 1 /*DDR3_RTT_60_OHM*/,       /* RTT_Nom = RZQ/4 */
+               .walat = 1,     /* Write additional latency */
+               .ralat = 5,     /* Read additional latency */
+               .mif3_mode = 3, /* Command prediction working mode */
+               .bi_on = 1,     /* Bank interleaving enabled */
+               .sde_to_rst = 0x10,     /* 14 cycles, 200us (JEDEC default) */
+               .rst_to_cke = 0x23,     /* 33 cycles, 500us (JEDEC default) */
+       };
+
+       if (is_cpu_type(MXC_CPU_MX6D) || is_cpu_type(MXC_CPU_MX6Q))
+               mx6dq_dram_iocfg(width, &mx6q_ddr_ioregs, &mx6q_grp_ioregs);
+       else
+               mx6sdl_dram_iocfg(width, &mx6dl_ddr_ioregs, &mx6sdl_grp_ioregs);
+
+       if (is_cpu_type(MXC_CPU_MX6D))
+               mx6_dram_cfg(&sysinfo, &mx6q_1g_mmcd_calib, &mem_ddr_2g);
+       else if (is_cpu_type(MXC_CPU_MX6Q))
+               mx6_dram_cfg(&sysinfo, &mx6q_2g_mmcd_calib, &mem_ddr_4g);
+       else if (is_cpu_type(MXC_CPU_MX6DL))
+               mx6_dram_cfg(&sysinfo, &mx6q_1g_mmcd_calib, &mem_ddr_2g);
+       else if (is_cpu_type(MXC_CPU_MX6SOLO))
+               mx6_dram_cfg(&sysinfo, &mx6dl_512m_mmcd_calib, &mem_ddr_2g);
+}
+
+void board_init_f(ulong dummy)
+{
+       /* setup AIPS and disable watchdog */
+       arch_cpu_init();
+
+       ccgr_init();
+       gpr_init();
+
+       /* iomux and setup of i2c */
+       board_early_init_f();
+
+       /* setup GP timer */
+       timer_init();
+
+       /* UART clocks enabled and gd valid - init serial console */
+       preloader_console_init();
+
+       /* DDR initialization */
+       if (is_cpu_type(MXC_CPU_MX6SOLO))
+               spl_dram_init(32);
+       else
+               spl_dram_init(64);
+
+       /* Clear the BSS. */
+       memset(__bss_start, 0, __bss_end - __bss_start);
+
+       /* load/boot image from boot device */
+       board_init_r(NULL, 0);
+}
+#endif
diff --git a/board/st/stm32f429-discovery/Kconfig b/board/st/stm32f429-discovery/Kconfig
new file mode 100644 (file)
index 0000000..e73d11b
--- /dev/null
@@ -0,0 +1,19 @@
+if TARGET_STM32F429_DISCOVERY
+
+config SYS_BOARD
+       string
+       default "stm32f429-discovery"
+
+config SYS_VENDOR
+       string
+       default "st"
+
+config SYS_SOC
+       string
+       default "stm32f4"
+
+config SYS_CONFIG_NAME
+       string
+       default "stm32f429-discovery"
+
+endif
diff --git a/board/st/stm32f429-discovery/MAINTAINERS b/board/st/stm32f429-discovery/MAINTAINERS
new file mode 100644 (file)
index 0000000..78b0d28
--- /dev/null
@@ -0,0 +1,5 @@
+M:     Kamil Lulko <rev13@wp.pl>
+S:     Maintained
+F:     board/st/stm32f429-discovery/
+F:     include/configs/stm32f429-discovery.h
+F:     configs/stm32f429-discovery_defconfig
diff --git a/board/st/stm32f429-discovery/Makefile b/board/st/stm32f429-discovery/Makefile
new file mode 100644 (file)
index 0000000..7e764e3
--- /dev/null
@@ -0,0 +1,12 @@
+#
+# (C) Copyright 2000-2004
+# Wolfgang Denk, DENX Software Engineering, wd@denx.de.
+#
+# (C) Copyright 2015
+# Kamil Lulko, <rev13@wp.pl>
+#
+# SPDX-License-Identifier:     GPL-2.0+
+#
+
+obj-y  := stm32f429-discovery.o
+obj-y  += led.o
diff --git a/board/st/stm32f429-discovery/led.c b/board/st/stm32f429-discovery/led.c
new file mode 100644 (file)
index 0000000..306e550
--- /dev/null
@@ -0,0 +1,35 @@
+/*
+ * (C) Copyright 2015
+ * Kamil Lulko, <rev13@wp.pl>
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#include <common.h>
+#include <asm-generic/gpio.h>
+
+void coloured_LED_init(void)
+{
+       gpio_direction_output(CONFIG_RED_LED, 0);
+       gpio_direction_output(CONFIG_GREEN_LED, 0);
+}
+
+void red_led_off(void)
+{
+       gpio_set_value(CONFIG_RED_LED, 0);
+}
+
+void green_led_off(void)
+{
+       gpio_set_value(CONFIG_GREEN_LED, 0);
+}
+
+void red_led_on(void)
+{
+       gpio_set_value(CONFIG_RED_LED, 1);
+}
+
+void green_led_on(void)
+{
+       gpio_set_value(CONFIG_GREEN_LED, 1);
+}
diff --git a/board/st/stm32f429-discovery/stm32f429-discovery.c b/board/st/stm32f429-discovery/stm32f429-discovery.c
new file mode 100644 (file)
index 0000000..2c4830f
--- /dev/null
@@ -0,0 +1,287 @@
+/*
+ * (C) Copyright 2011, 2012, 2013
+ * Yuri Tikhonov, Emcraft Systems, yur@emcraft.com
+ * Alexander Potashev, Emcraft Systems, aspotashev@emcraft.com
+ * Vladimir Khusainov, Emcraft Systems, vlad@emcraft.com
+ * Pavel Boldin, Emcraft Systems, paboldin@emcraft.com
+ *
+ * (C) Copyright 2015
+ * Kamil Lulko, <rev13@wp.pl>
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#include <common.h>
+#include <asm/io.h>
+#include <asm/armv7m.h>
+#include <asm/arch/stm32.h>
+#include <asm/arch/gpio.h>
+#include <asm/arch/fmc.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+const struct stm32_gpio_ctl gpio_ctl_gpout = {
+       .mode = STM32_GPIO_MODE_OUT,
+       .otype = STM32_GPIO_OTYPE_PP,
+       .speed = STM32_GPIO_SPEED_50M,
+       .pupd = STM32_GPIO_PUPD_NO,
+       .af = STM32_GPIO_AF0
+};
+
+const struct stm32_gpio_ctl gpio_ctl_usart = {
+       .mode = STM32_GPIO_MODE_AF,
+       .otype = STM32_GPIO_OTYPE_PP,
+       .speed = STM32_GPIO_SPEED_50M,
+       .pupd = STM32_GPIO_PUPD_UP,
+       .af = STM32_GPIO_AF7
+};
+
+static const struct stm32_gpio_dsc usart1_gpio[] = {
+       {STM32_GPIO_PORT_A, STM32_GPIO_PIN_9},  /* TX */
+       {STM32_GPIO_PORT_A, STM32_GPIO_PIN_10}, /* RX */
+};
+
+int uart1_setup_gpio(void)
+{
+       int i;
+       int rv = 0;
+
+       for (i = 0; i < ARRAY_SIZE(usart1_gpio); i++) {
+               rv = stm32_gpio_config(&usart1_gpio[i], &gpio_ctl_usart);
+               if (rv)
+                       goto out;
+       }
+
+out:
+       return rv;
+}
+
+const struct stm32_gpio_ctl gpio_ctl_fmc = {
+       .mode = STM32_GPIO_MODE_AF,
+       .otype = STM32_GPIO_OTYPE_PP,
+       .speed = STM32_GPIO_SPEED_100M,
+       .pupd = STM32_GPIO_PUPD_NO,
+       .af = STM32_GPIO_AF12
+};
+
+static const struct stm32_gpio_dsc ext_ram_fmc_gpio[] = {
+       /* Chip is LQFP144, see DM00077036.pdf for details */
+       {STM32_GPIO_PORT_D, STM32_GPIO_PIN_10}, /* 79, FMC_D15 */
+       {STM32_GPIO_PORT_D, STM32_GPIO_PIN_9},  /* 78, FMC_D14 */
+       {STM32_GPIO_PORT_D, STM32_GPIO_PIN_8},  /* 77, FMC_D13 */
+       {STM32_GPIO_PORT_E, STM32_GPIO_PIN_15}, /* 68, FMC_D12 */
+       {STM32_GPIO_PORT_E, STM32_GPIO_PIN_14}, /* 67, FMC_D11 */
+       {STM32_GPIO_PORT_E, STM32_GPIO_PIN_13}, /* 66, FMC_D10 */
+       {STM32_GPIO_PORT_E, STM32_GPIO_PIN_12}, /* 65, FMC_D9 */
+       {STM32_GPIO_PORT_E, STM32_GPIO_PIN_11}, /* 64, FMC_D8 */
+       {STM32_GPIO_PORT_E, STM32_GPIO_PIN_10}, /* 63, FMC_D7 */
+       {STM32_GPIO_PORT_E, STM32_GPIO_PIN_9},  /* 60, FMC_D6 */
+       {STM32_GPIO_PORT_E, STM32_GPIO_PIN_8},  /* 59, FMC_D5 */
+       {STM32_GPIO_PORT_E, STM32_GPIO_PIN_7},  /* 58, FMC_D4 */
+       {STM32_GPIO_PORT_D, STM32_GPIO_PIN_1},  /* 115, FMC_D3 */
+       {STM32_GPIO_PORT_D, STM32_GPIO_PIN_0},  /* 114, FMC_D2 */
+       {STM32_GPIO_PORT_D, STM32_GPIO_PIN_15}, /* 86, FMC_D1 */
+       {STM32_GPIO_PORT_D, STM32_GPIO_PIN_14}, /* 85, FMC_D0 */
+       {STM32_GPIO_PORT_E, STM32_GPIO_PIN_1},  /* 142, FMC_NBL1 */
+       {STM32_GPIO_PORT_E, STM32_GPIO_PIN_0},  /* 141, FMC_NBL0 */
+       {STM32_GPIO_PORT_G, STM32_GPIO_PIN_5},  /* 90, FMC_A15, BA1 */
+       {STM32_GPIO_PORT_G, STM32_GPIO_PIN_4},  /* 89, FMC_A14, BA0 */
+       {STM32_GPIO_PORT_G, STM32_GPIO_PIN_1},  /* 57, FMC_A11 */
+       {STM32_GPIO_PORT_G, STM32_GPIO_PIN_0},  /* 56, FMC_A10 */
+       {STM32_GPIO_PORT_F, STM32_GPIO_PIN_15}, /* 55, FMC_A9 */
+       {STM32_GPIO_PORT_F, STM32_GPIO_PIN_14}, /* 54, FMC_A8 */
+       {STM32_GPIO_PORT_F, STM32_GPIO_PIN_13}, /* 53, FMC_A7 */
+       {STM32_GPIO_PORT_F, STM32_GPIO_PIN_12}, /* 50, FMC_A6 */
+       {STM32_GPIO_PORT_F, STM32_GPIO_PIN_5},  /* 15, FMC_A5 */
+       {STM32_GPIO_PORT_F, STM32_GPIO_PIN_4},  /* 14, FMC_A4 */
+       {STM32_GPIO_PORT_F, STM32_GPIO_PIN_3},  /* 13, FMC_A3 */
+       {STM32_GPIO_PORT_F, STM32_GPIO_PIN_2},  /* 12, FMC_A2 */
+       {STM32_GPIO_PORT_F, STM32_GPIO_PIN_1},  /* 11, FMC_A1 */
+       {STM32_GPIO_PORT_F, STM32_GPIO_PIN_0},  /* 10, FMC_A0 */
+       {STM32_GPIO_PORT_B, STM32_GPIO_PIN_6},  /* 136, SDRAM_NE */
+       {STM32_GPIO_PORT_F, STM32_GPIO_PIN_11}, /* 49, SDRAM_NRAS */
+       {STM32_GPIO_PORT_G, STM32_GPIO_PIN_15}, /* 132, SDRAM_NCAS */
+       {STM32_GPIO_PORT_C, STM32_GPIO_PIN_0},  /* 26, SDRAM_NWE */
+       {STM32_GPIO_PORT_B, STM32_GPIO_PIN_5},  /* 135, SDRAM_CKE */
+       {STM32_GPIO_PORT_G, STM32_GPIO_PIN_8},  /* 93, SDRAM_CLK */
+};
+
+static int fmc_setup_gpio(void)
+{
+       int rv = 0;
+       int i;
+
+       for (i = 0; i < ARRAY_SIZE(ext_ram_fmc_gpio); i++) {
+               rv = stm32_gpio_config(&ext_ram_fmc_gpio[i],
+                               &gpio_ctl_fmc);
+               if (rv)
+                       goto out;
+       }
+
+out:
+       return rv;
+}
+
+/*
+ * STM32 RCC FMC specific definitions
+ */
+#define STM32_RCC_ENR_FMC      (1 << 0)        /* FMC module clock  */
+
+static inline u32 _ns2clk(u32 ns, u32 freq)
+{
+       u32 tmp = freq/1000000;
+       return (tmp * ns) / 1000;
+}
+
+#define NS2CLK(ns) (_ns2clk(ns, freq))
+
+/*
+ * Following are timings for IS42S16400J, from corresponding datasheet
+ */
+#define SDRAM_CAS      3       /* 3 cycles */
+#define SDRAM_NB       1       /* Number of banks */
+#define SDRAM_MWID     1       /* 16 bit memory */
+
+#define SDRAM_NR       0x1     /* 12-bit row */
+#define SDRAM_NC       0x0     /* 8-bit col */
+#define SDRAM_RBURST   0x1     /* Single read requests always as bursts */
+#define SDRAM_RPIPE    0x0     /* No HCLK clock cycle delay */
+
+#define SDRAM_TRRD     (NS2CLK(14) - 1)
+#define SDRAM_TRCD     (NS2CLK(15) - 1)
+#define SDRAM_TRP      (NS2CLK(15) - 1)
+#define SDRAM_TRAS     (NS2CLK(42) - 1)
+#define SDRAM_TRC      (NS2CLK(63) - 1)
+#define SDRAM_TRFC     (NS2CLK(63) - 1)
+#define SDRAM_TCDL     (1 - 1)
+#define SDRAM_TRDL     (2 - 1)
+#define SDRAM_TBDL     (1 - 1)
+#define SDRAM_TREF     1386
+#define SDRAM_TCCD     (1 - 1)
+
+#define SDRAM_TXSR     (NS2CLK(70) - 1)/* Row cycle time after precharge */
+#define SDRAM_TMRD     (3 - 1)         /* Page 10, Mode Register Set */
+
+/* Last data-in to row precharge, need also comply ineq from RM 37.7.5 */
+#define SDRAM_TWR      max(\
+       (int)max((int)SDRAM_TRDL, (int)(SDRAM_TRAS - SDRAM_TRCD - 1)), \
+       (int)(SDRAM_TRC - SDRAM_TRCD - SDRAM_TRP - 2)\
+)
+
+#define SDRAM_MODE_BL_SHIFT    0
+#define SDRAM_MODE_CAS_SHIFT   4
+#define SDRAM_MODE_BL          0
+#define SDRAM_MODE_CAS         SDRAM_CAS
+
+int dram_init(void)
+{
+       u32 freq;
+       int rv;
+
+       rv = fmc_setup_gpio();
+       if (rv)
+               return rv;
+
+       setbits_le32(&STM32_RCC->ahb3enr, STM32_RCC_ENR_FMC);
+
+       /*
+        * Get frequency for NS2CLK calculation.
+        */
+       freq = clock_get(CLOCK_AHB) / CONFIG_SYS_RAM_FREQ_DIV;
+
+       writel(CONFIG_SYS_RAM_FREQ_DIV << FMC_SDCR_SDCLK_SHIFT
+               | SDRAM_RPIPE << FMC_SDCR_RPIPE_SHIFT
+               | SDRAM_RBURST << FMC_SDCR_RBURST_SHIFT,
+               &STM32_SDRAM_FMC->sdcr1);
+
+       writel(CONFIG_SYS_RAM_FREQ_DIV << FMC_SDCR_SDCLK_SHIFT
+               | SDRAM_CAS << FMC_SDCR_CAS_SHIFT
+               | SDRAM_NB << FMC_SDCR_NB_SHIFT
+               | SDRAM_MWID << FMC_SDCR_MWID_SHIFT
+               | SDRAM_NR << FMC_SDCR_NR_SHIFT
+               | SDRAM_NC << FMC_SDCR_NC_SHIFT
+               | SDRAM_RPIPE << FMC_SDCR_RPIPE_SHIFT
+               | SDRAM_RBURST << FMC_SDCR_RBURST_SHIFT,
+               &STM32_SDRAM_FMC->sdcr2);
+
+       writel(SDRAM_TRP << FMC_SDTR_TRP_SHIFT
+               | SDRAM_TRC << FMC_SDTR_TRC_SHIFT,
+               &STM32_SDRAM_FMC->sdtr1);
+
+       writel(SDRAM_TRCD << FMC_SDTR_TRCD_SHIFT
+               | SDRAM_TRP << FMC_SDTR_TRP_SHIFT
+               | SDRAM_TWR << FMC_SDTR_TWR_SHIFT
+               | SDRAM_TRC << FMC_SDTR_TRC_SHIFT
+               | SDRAM_TRAS << FMC_SDTR_TRAS_SHIFT
+               | SDRAM_TXSR << FMC_SDTR_TXSR_SHIFT
+               | SDRAM_TMRD << FMC_SDTR_TMRD_SHIFT,
+               &STM32_SDRAM_FMC->sdtr2);
+
+       writel(FMC_SDCMR_BANK_2 | FMC_SDCMR_MODE_START_CLOCK,
+              &STM32_SDRAM_FMC->sdcmr);
+
+       udelay(200);    /* 200 us delay, page 10, "Power-Up" */
+       FMC_BUSY_WAIT();
+
+       writel(FMC_SDCMR_BANK_2 | FMC_SDCMR_MODE_PRECHARGE,
+              &STM32_SDRAM_FMC->sdcmr);
+
+       udelay(100);
+       FMC_BUSY_WAIT();
+
+       writel((FMC_SDCMR_BANK_2 | FMC_SDCMR_MODE_AUTOREFRESH
+               | 7 << FMC_SDCMR_NRFS_SHIFT), &STM32_SDRAM_FMC->sdcmr);
+
+       udelay(100);
+       FMC_BUSY_WAIT();
+
+       writel(FMC_SDCMR_BANK_2 | (SDRAM_MODE_BL << SDRAM_MODE_BL_SHIFT
+               | SDRAM_MODE_CAS << SDRAM_MODE_CAS_SHIFT)
+               << FMC_SDCMR_MODE_REGISTER_SHIFT | FMC_SDCMR_MODE_WRITE_MODE,
+               &STM32_SDRAM_FMC->sdcmr);
+
+       udelay(100);
+
+       FMC_BUSY_WAIT();
+
+       writel(FMC_SDCMR_BANK_2 | FMC_SDCMR_MODE_NORMAL,
+              &STM32_SDRAM_FMC->sdcmr);
+
+       FMC_BUSY_WAIT();
+
+       /* Refresh timer */
+       writel(SDRAM_TREF, &STM32_SDRAM_FMC->sdrtr);
+
+       /*
+        * Fill in global info with description of SRAM configuration
+        */
+       gd->bd->bi_dram[0].start = CONFIG_SYS_RAM_BASE;
+       gd->bd->bi_dram[0].size  = CONFIG_SYS_RAM_SIZE;
+
+       gd->ram_size = CONFIG_SYS_RAM_SIZE;
+
+       return rv;
+}
+
+u32 get_board_rev(void)
+{
+       return 0;
+}
+
+int board_early_init_f(void)
+{
+       int res;
+
+       res = uart1_setup_gpio();
+       if (res)
+               return res;
+
+       return 0;
+}
+
+int board_init(void)
+{
+       gd->bd->bi_boot_params = CONFIG_SYS_SDRAM_BASE + 0x100;
+
+       return 0;
+}
diff --git a/board/sysam/amcore/u-boot.lds b/board/sysam/amcore/u-boot.lds
deleted file mode 100644 (file)
index 2f7a241..0000000
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * Linker script for Sysam AMCORE board
- *
- * (C) Copyright 2014  Angelo Dureghello <angelo@sysam.it>
- *
- * SPDX-License-Identifier:     GPL-2.0+
- */
-
-OUTPUT_ARCH(m68k)
-
-SECTIONS
-{
-  /* Read-only sections, merged into text segment: */
-  .text      :
-  {
-    arch/m68k/cpu/mcf530x/start.o              (.text)
-
-    . = DEFINED(env_offset) ? env_offset : .;
-    common/env_embedded.o      (.text)
-
-    *(.text)
-  }
-  _etext = .;
-  PROVIDE (etext = .);
-  .rodata    :
-  {
-    *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*)))
-  }
-
-  /* Read-write section, merged into data segment: */
-  . = (. + 0x00FF) & 0xFFFFFF00;
-  _erotext = .;
-  PROVIDE (erotext = .);
-
-  .reloc   :
-  {
-    __got_start = .;
-    KEEP(*(.got))
-    __got_end = .;
-    _GOT2_TABLE_ = .;
-    KEEP(*(.got2))
-    _FIXUP_TABLE_ = .;
-    KEEP(*(.fixup))
-  }
-  __got2_entries = (_FIXUP_TABLE_ - _GOT2_TABLE_) >>2;
-  __fixup_entries = (. - _FIXUP_TABLE_)>>2;
-
-  .data    :
-  {
-    *(.data)
-    *(.sdata)
-  }
-  _edata  =  .;
-  PROVIDE (edata = .);
-
-  . = .;
-
-  . = ALIGN(4);
-  .u_boot_list : {
-       KEEP(*(SORT(.u_boot_list*)));
-  }
-
-  . = .;
-  __start___ex_table = .;
-  __ex_table : { *(__ex_table) }
-  __stop___ex_table = .;
-
-  . = ALIGN(256);
-  __init_begin = .;
-  .text.init : { *(.text.init) }
-  .data.init : { *(.data.init) }
-  . = ALIGN(256);
-  __init_end = .;
-
-  __bss_start = .;
-  .bss (NOLOAD)       :
-  {
-   _sbss = .;
-   *(.sbss*)
-   *(.bss*)
-   *(COMMON)
-   . = ALIGN(4);
-   _ebss = .;
-  }
-  __bss_end = . ;
-  PROVIDE (end = .);
-}
index c1019289ba9dce27279c1cda8a63621733555a3d..d4648558ec375abbd201f2627a3d76b40bc342e5 100644 (file)
@@ -93,10 +93,16 @@ int board_init(void)
 int board_late_init(void)
 {
 #ifdef CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG
+       u32 id[4];
+
        if (omap_revision() == DRA722_ES1_0)
                setenv("board_name", "dra72x");
        else
                setenv("board_name", "dra7xx");
+
+       id[0] = readl((*ctrl)->control_std_fuse_die_id_0);
+       id[1] = readl((*ctrl)->control_std_fuse_die_id_1);
+       usb_set_serial_num_from_die_id(id);
 #endif
        return 0;
 }
diff --git a/board/toradex/colibri_vf/Kconfig b/board/toradex/colibri_vf/Kconfig
new file mode 100644 (file)
index 0000000..2c3cb30
--- /dev/null
@@ -0,0 +1,18 @@
+if TARGET_COLIBRI_VF
+
+config SYS_CPU
+       default "armv7"
+
+config SYS_BOARD
+       default "colibri_vf"
+
+config SYS_VENDOR
+       default "toradex"
+
+config SYS_SOC
+       default "vf610"
+
+config SYS_CONFIG_NAME
+       default "colibri_vf"
+
+endif
diff --git a/board/toradex/colibri_vf/MAINTAINERS b/board/toradex/colibri_vf/MAINTAINERS
new file mode 100644 (file)
index 0000000..551c575
--- /dev/null
@@ -0,0 +1,6 @@
+Colibri VFxx
+M:     Stefan Agner <stefan.agner@toradex.com>
+S:     Maintained
+F:     board/toradex/colibri_vf/
+F:     include/configs/colibri_vf.h
+F:     configs/colibri_vf_defconfig
diff --git a/board/toradex/colibri_vf/Makefile b/board/toradex/colibri_vf/Makefile
new file mode 100644 (file)
index 0000000..c7e5134
--- /dev/null
@@ -0,0 +1,7 @@
+#
+# Copyright 2013 Freescale Semiconductor, Inc.
+#
+# SPDX-License-Identifier:     GPL-2.0+
+#
+
+obj-y  := colibri_vf.o
diff --git a/board/toradex/colibri_vf/colibri_vf.c b/board/toradex/colibri_vf/colibri_vf.c
new file mode 100644 (file)
index 0000000..31ebb19
--- /dev/null
@@ -0,0 +1,385 @@
+/*
+ * Copyright 2015 Toradex, Inc.
+ *
+ * Based on vf610twr.c:
+ * Copyright 2013 Freescale Semiconductor, Inc.
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#include <common.h>
+#include <asm/io.h>
+#include <asm/arch/imx-regs.h>
+#include <asm/arch/iomux-vf610.h>
+#include <asm/arch/ddrmc-vf610.h>
+#include <asm/arch/crm_regs.h>
+#include <asm/arch/clock.h>
+#include <mmc.h>
+#include <fsl_esdhc.h>
+#include <miiphy.h>
+#include <netdev.h>
+#include <i2c.h>
+#include <g_dnl.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+#define UART_PAD_CTRL  (PAD_CTL_PUS_100K_UP | PAD_CTL_SPEED_MED | \
+                       PAD_CTL_DSE_25ohm | PAD_CTL_OBE_IBE_ENABLE)
+
+#define ESDHC_PAD_CTRL (PAD_CTL_PUS_100K_UP | PAD_CTL_SPEED_HIGH | \
+                       PAD_CTL_DSE_20ohm | PAD_CTL_OBE_IBE_ENABLE)
+
+#define ENET_PAD_CTRL  (PAD_CTL_PUS_47K_UP | PAD_CTL_SPEED_HIGH | \
+                       PAD_CTL_DSE_50ohm | PAD_CTL_OBE_IBE_ENABLE)
+
+int dram_init(void)
+{
+       static const struct ddr3_jedec_timings timings = {
+               .tinit           = 5,
+               .trst_pwron      = 80000,
+               .cke_inactive    = 200000,
+               .wrlat           = 5,
+               .caslat_lin      = 12,
+               .trc             = 21,
+               .trrd            = 4,
+               .tccd            = 4,
+               .tfaw            = 20,
+               .trp             = 6,
+               .twtr            = 4,
+               .tras_min        = 15,
+               .tmrd            = 4,
+               .trtp            = 4,
+               .tras_max        = 28080,
+               .tmod            = 12,
+               .tckesr          = 4,
+               .tcke            = 3,
+               .trcd_int        = 6,
+               .tdal            = 12,
+               .tdll            = 512,
+               .trp_ab          = 6,
+               .tref            = 3120,
+               .trfc            = 64,
+               .tpdex           = 3,
+               .txpdll          = 10,
+               .txsnr           = 48,
+               .txsr            = 468,
+               .cksrx           = 5,
+               .cksre           = 5,
+               .zqcl            = 256,
+               .zqinit          = 512,
+               .zqcs            = 64,
+               .ref_per_zq      = 64,
+               .aprebit         = 10,
+               .wlmrd           = 40,
+               .wldqsen         = 25,
+       };
+
+       ddrmc_setup_iomux();
+
+       ddrmc_ctrl_init_ddr3(&timings, NULL, 1, 2);
+       gd->ram_size = get_ram_size((void *)PHYS_SDRAM, PHYS_SDRAM_SIZE);
+
+       return 0;
+}
+
+static void setup_iomux_uart(void)
+{
+       static const iomux_v3_cfg_t uart_pads[] = {
+               NEW_PAD_CTRL(VF610_PAD_PTB4__UART1_TX, UART_PAD_CTRL),
+               NEW_PAD_CTRL(VF610_PAD_PTB5__UART1_RX, UART_PAD_CTRL),
+               NEW_PAD_CTRL(VF610_PAD_PTB10__UART0_TX, UART_PAD_CTRL),
+               NEW_PAD_CTRL(VF610_PAD_PTB11__UART0_RX, UART_PAD_CTRL),
+       };
+
+       imx_iomux_v3_setup_multiple_pads(uart_pads, ARRAY_SIZE(uart_pads));
+}
+
+static void setup_iomux_enet(void)
+{
+       static const iomux_v3_cfg_t enet0_pads[] = {
+               NEW_PAD_CTRL(VF610_PAD_PTA6__RMII0_CLKOUT, ENET_PAD_CTRL),
+               NEW_PAD_CTRL(VF610_PAD_PTC10__RMII1_MDIO, ENET_PAD_CTRL),
+               NEW_PAD_CTRL(VF610_PAD_PTC9__RMII1_MDC, ENET_PAD_CTRL),
+               NEW_PAD_CTRL(VF610_PAD_PTC11__RMII1_CRS_DV, ENET_PAD_CTRL),
+               NEW_PAD_CTRL(VF610_PAD_PTC12__RMII1_RD1, ENET_PAD_CTRL),
+               NEW_PAD_CTRL(VF610_PAD_PTC13__RMII1_RD0, ENET_PAD_CTRL),
+               NEW_PAD_CTRL(VF610_PAD_PTC14__RMII1_RXER, ENET_PAD_CTRL),
+               NEW_PAD_CTRL(VF610_PAD_PTC15__RMII1_TD1, ENET_PAD_CTRL),
+               NEW_PAD_CTRL(VF610_PAD_PTC16__RMII1_TD0, ENET_PAD_CTRL),
+               NEW_PAD_CTRL(VF610_PAD_PTC17__RMII1_TXEN, ENET_PAD_CTRL),
+       };
+
+       imx_iomux_v3_setup_multiple_pads(enet0_pads, ARRAY_SIZE(enet0_pads));
+}
+
+static void setup_iomux_i2c(void)
+{
+       static const iomux_v3_cfg_t i2c0_pads[] = {
+               VF610_PAD_PTB14__I2C0_SCL,
+               VF610_PAD_PTB15__I2C0_SDA,
+       };
+
+       imx_iomux_v3_setup_multiple_pads(i2c0_pads, ARRAY_SIZE(i2c0_pads));
+}
+
+#ifdef CONFIG_NAND_VF610_NFC
+static void setup_iomux_nfc(void)
+{
+       static const iomux_v3_cfg_t nfc_pads[] = {
+               VF610_PAD_PTD23__NF_IO7,
+               VF610_PAD_PTD22__NF_IO6,
+               VF610_PAD_PTD21__NF_IO5,
+               VF610_PAD_PTD20__NF_IO4,
+               VF610_PAD_PTD19__NF_IO3,
+               VF610_PAD_PTD18__NF_IO2,
+               VF610_PAD_PTD17__NF_IO1,
+               VF610_PAD_PTD16__NF_IO0,
+               VF610_PAD_PTB24__NF_WE_B,
+               VF610_PAD_PTB25__NF_CE0_B,
+               VF610_PAD_PTB27__NF_RE_B,
+               VF610_PAD_PTC26__NF_RB_B,
+               VF610_PAD_PTC27__NF_ALE,
+               VF610_PAD_PTC28__NF_CLE
+       };
+
+       imx_iomux_v3_setup_multiple_pads(nfc_pads, ARRAY_SIZE(nfc_pads));
+}
+#endif
+
+#ifdef CONFIG_FSL_ESDHC
+struct fsl_esdhc_cfg esdhc_cfg[1] = {
+       {ESDHC1_BASE_ADDR},
+};
+
+int board_mmc_getcd(struct mmc *mmc)
+{
+       /* eSDHC1 is always present */
+       return 1;
+}
+
+int board_mmc_init(bd_t *bis)
+{
+       static const iomux_v3_cfg_t esdhc1_pads[] = {
+               NEW_PAD_CTRL(VF610_PAD_PTA24__ESDHC1_CLK, ESDHC_PAD_CTRL),
+               NEW_PAD_CTRL(VF610_PAD_PTA25__ESDHC1_CMD, ESDHC_PAD_CTRL),
+               NEW_PAD_CTRL(VF610_PAD_PTA26__ESDHC1_DAT0, ESDHC_PAD_CTRL),
+               NEW_PAD_CTRL(VF610_PAD_PTA27__ESDHC1_DAT1, ESDHC_PAD_CTRL),
+               NEW_PAD_CTRL(VF610_PAD_PTA28__ESDHC1_DAT2, ESDHC_PAD_CTRL),
+               NEW_PAD_CTRL(VF610_PAD_PTA29__ESDHC1_DAT3, ESDHC_PAD_CTRL),
+       };
+
+       esdhc_cfg[0].sdhc_clk = mxc_get_clock(MXC_ESDHC_CLK);
+
+       imx_iomux_v3_setup_multiple_pads(
+               esdhc1_pads, ARRAY_SIZE(esdhc1_pads));
+
+       return fsl_esdhc_initialize(bis, &esdhc_cfg[0]);
+}
+#endif
+
+static inline int is_colibri_vf61(void)
+{
+       struct mscm *mscm = (struct mscm *)MSCM_BASE_ADDR;
+
+       /*
+        * Detect board type by Level 2 Cache: VF50 don't have any
+        * Level 2 Cache.
+        */
+       return !!mscm->cpxcfg1;
+}
+
+static void clock_init(void)
+{
+       struct ccm_reg *ccm = (struct ccm_reg *)CCM_BASE_ADDR;
+       struct anadig_reg *anadig = (struct anadig_reg *)ANADIG_BASE_ADDR;
+       u32 pfd_clk_sel, ddr_clk_sel;
+
+       clrsetbits_le32(&ccm->ccgr0, CCM_REG_CTRL_MASK,
+                       CCM_CCGR0_UART0_CTRL_MASK);
+       clrsetbits_le32(&ccm->ccgr1, CCM_REG_CTRL_MASK,
+                       CCM_CCGR1_PIT_CTRL_MASK | CCM_CCGR1_WDOGA5_CTRL_MASK);
+       clrsetbits_le32(&ccm->ccgr2, CCM_REG_CTRL_MASK,
+                       CCM_CCGR2_IOMUXC_CTRL_MASK | CCM_CCGR2_PORTA_CTRL_MASK |
+                       CCM_CCGR2_PORTB_CTRL_MASK | CCM_CCGR2_PORTC_CTRL_MASK |
+                       CCM_CCGR2_PORTD_CTRL_MASK | CCM_CCGR2_PORTE_CTRL_MASK);
+       clrsetbits_le32(&ccm->ccgr3, CCM_REG_CTRL_MASK,
+                       CCM_CCGR3_ANADIG_CTRL_MASK | CCM_CCGR3_SCSC_CTRL_MASK);
+       clrsetbits_le32(&ccm->ccgr4, CCM_REG_CTRL_MASK,
+                       CCM_CCGR4_WKUP_CTRL_MASK | CCM_CCGR4_CCM_CTRL_MASK |
+                       CCM_CCGR4_GPC_CTRL_MASK | CCM_CCGR4_I2C0_CTRL_MASK);
+       clrsetbits_le32(&ccm->ccgr6, CCM_REG_CTRL_MASK,
+                       CCM_CCGR6_OCOTP_CTRL_MASK | CCM_CCGR6_DDRMC_CTRL_MASK);
+       clrsetbits_le32(&ccm->ccgr7, CCM_REG_CTRL_MASK,
+                       CCM_CCGR7_SDHC1_CTRL_MASK);
+       clrsetbits_le32(&ccm->ccgr9, CCM_REG_CTRL_MASK,
+                       CCM_CCGR9_FEC0_CTRL_MASK | CCM_CCGR9_FEC1_CTRL_MASK);
+       clrsetbits_le32(&ccm->ccgr10, CCM_REG_CTRL_MASK,
+                       CCM_CCGR10_NFC_CTRL_MASK);
+
+#ifdef CONFIG_CI_UDC
+       setbits_le32(&ccm->ccgr1, CCM_CCGR1_USBC0_CTRL_MASK);
+#endif
+
+#ifdef CONFIG_USB_EHCI
+       setbits_le32(&ccm->ccgr7, CCM_CCGR7_USBC1_CTRL_MASK);
+#endif
+
+       clrsetbits_le32(&anadig->pll5_ctrl, ANADIG_PLL5_CTRL_BYPASS |
+                       ANADIG_PLL5_CTRL_POWERDOWN, ANADIG_PLL5_CTRL_ENABLE |
+                       ANADIG_PLL5_CTRL_DIV_SELECT);
+
+       if (is_colibri_vf61()) {
+               clrsetbits_le32(&anadig->pll2_ctrl, ANADIG_PLL5_CTRL_BYPASS |
+                               ANADIG_PLL2_CTRL_POWERDOWN,
+                               ANADIG_PLL2_CTRL_ENABLE |
+                               ANADIG_PLL2_CTRL_DIV_SELECT);
+       }
+
+       clrsetbits_le32(&anadig->pll1_ctrl, ANADIG_PLL1_CTRL_POWERDOWN,
+                       ANADIG_PLL1_CTRL_ENABLE | ANADIG_PLL1_CTRL_DIV_SELECT);
+
+       clrsetbits_le32(&ccm->ccr, CCM_CCR_OSCNT_MASK,
+                       CCM_CCR_FIRC_EN | CCM_CCR_OSCNT(5));
+
+       /* See "Typical PLL Configuration" */
+       if (is_colibri_vf61()) {
+               pfd_clk_sel = CCM_CCSR_PLL1_PFD_CLK_SEL(1);
+               ddr_clk_sel = CCM_CCSR_DDRC_CLK_SEL(0);
+       } else {
+               pfd_clk_sel = CCM_CCSR_PLL1_PFD_CLK_SEL(3);
+               ddr_clk_sel = CCM_CCSR_DDRC_CLK_SEL(1);
+       }
+
+       clrsetbits_le32(&ccm->ccsr, CCM_REG_CTRL_MASK, pfd_clk_sel |
+                       CCM_CCSR_PLL2_PFD4_EN | CCM_CCSR_PLL2_PFD3_EN |
+                       CCM_CCSR_PLL2_PFD2_EN | CCM_CCSR_PLL2_PFD1_EN |
+                       CCM_CCSR_PLL1_PFD4_EN | CCM_CCSR_PLL1_PFD3_EN |
+                       CCM_CCSR_PLL1_PFD2_EN | CCM_CCSR_PLL1_PFD1_EN |
+                       ddr_clk_sel | CCM_CCSR_FAST_CLK_SEL(1) |
+                       CCM_CCSR_SYS_CLK_SEL(4));
+
+       clrsetbits_le32(&ccm->cacrr, CCM_REG_CTRL_MASK,
+                       CCM_CACRR_IPG_CLK_DIV(1) | CCM_CACRR_BUS_CLK_DIV(2) |
+                       CCM_CACRR_ARM_CLK_DIV(0));
+       clrsetbits_le32(&ccm->cscmr1, CCM_REG_CTRL_MASK,
+                       CCM_CSCMR1_ESDHC1_CLK_SEL(3) |
+                       CCM_CSCMR1_NFC_CLK_SEL(0));
+       clrsetbits_le32(&ccm->cscdr1, CCM_REG_CTRL_MASK,
+                       CCM_CSCDR1_RMII_CLK_EN);
+       clrsetbits_le32(&ccm->cscdr2, CCM_REG_CTRL_MASK,
+                       CCM_CSCDR2_ESDHC1_EN | CCM_CSCDR2_ESDHC1_CLK_DIV(0) |
+                       CCM_CSCDR2_NFC_EN);
+       clrsetbits_le32(&ccm->cscdr3, CCM_REG_CTRL_MASK,
+                       CCM_CSCDR3_NFC_PRE_DIV(5));
+       clrsetbits_le32(&ccm->cscmr2, CCM_REG_CTRL_MASK,
+                       CCM_CSCMR2_RMII_CLK_SEL(2));
+}
+
+static void mscm_init(void)
+{
+       struct mscm_ir *mscmir = (struct mscm_ir *)MSCM_IR_BASE_ADDR;
+       int i;
+
+       for (i = 0; i < MSCM_IRSPRC_NUM; i++)
+               writew(MSCM_IRSPRC_CP0_EN, &mscmir->irsprc[i]);
+}
+
+int board_phy_config(struct phy_device *phydev)
+{
+       if (phydev->drv->config)
+               phydev->drv->config(phydev);
+
+       return 0;
+}
+
+int board_early_init_f(void)
+{
+       clock_init();
+       mscm_init();
+
+       setup_iomux_uart();
+       setup_iomux_enet();
+       setup_iomux_i2c();
+#ifdef CONFIG_NAND_VF610_NFC
+       setup_iomux_nfc();
+#endif
+
+       return 0;
+}
+
+#ifdef CONFIG_BOARD_LATE_INIT
+int board_late_init(void)
+{
+       struct src *src = (struct src *)SRC_BASE_ADDR;
+
+       /* Default memory arguments */
+       if (!getenv("memargs")) {
+               switch (gd->ram_size) {
+               case 0x08000000:
+                       /* 128 MB */
+                       setenv("memargs", "mem=128M");
+                       break;
+               case 0x10000000:
+                       /* 256 MB */
+                       setenv("memargs", "mem=256M");
+                       break;
+               default:
+                       printf("Failed detecting RAM size.\n");
+               }
+       }
+
+       if (((src->sbmr2 & SRC_SBMR2_BMOD_MASK) >> SRC_SBMR2_BMOD_SHIFT)
+                       == SRC_SBMR2_BMOD_SERIAL) {
+               printf("Serial Downloader recovery mode, disable autoboot\n");
+               setenv("bootdelay", "-1");
+       }
+
+       return 0;
+}
+#endif /* CONFIG_BOARD_LATE_INIT */
+
+int board_init(void)
+{
+       struct scsc_reg *scsc = (struct scsc_reg *)SCSC_BASE_ADDR;
+
+       /* address of boot parameters */
+       gd->bd->bi_boot_params = PHYS_SDRAM + 0x100;
+
+       /*
+        * Enable external 32K Oscillator
+        *
+        * The internal clock experiences significant drift
+        * so we must use the external oscillator in order
+        * to maintain correct time in the hwclock
+        */
+
+       setbits_le32(&scsc->sosc_ctr, SCSC_SOSC_CTR_SOSC_EN);
+
+       return 0;
+}
+
+int checkboard(void)
+{
+       if (is_colibri_vf61())
+               puts("Board: Colibri VF61\n");
+       else
+               puts("Board: Colibri VF50\n");
+
+       return 0;
+}
+
+int g_dnl_bind_fixup(struct usb_device_descriptor *dev, const char *name)
+{
+       unsigned short usb_pid;
+
+       put_unaligned(CONFIG_TRDX_VID, &dev->idVendor);
+
+       if (is_colibri_vf61())
+               usb_pid = CONFIG_TRDX_PID_COLIBRI_VF61IT;
+       else
+               usb_pid = CONFIG_TRDX_PID_COLIBRI_VF50IT;
+
+       put_unaligned(usb_pid, &dev->idProduct);
+
+       return 0;
+}
diff --git a/board/toradex/colibri_vf/imximage.cfg b/board/toradex/colibri_vf/imximage.cfg
new file mode 100644 (file)
index 0000000..8c52886
--- /dev/null
@@ -0,0 +1,17 @@
+/*
+ * Copyright 2014 Toradex, Inc.
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ *
+ * Refer docs/README.imxmage for more details about how-to configure
+ * and create imximage boot image
+ *
+ * The syntax is taken as close as possible with the kwbimage
+ */
+#include <asm/imx-common/imximage.cfg>
+
+/* image version */
+IMAGE_VERSION  2
+
+/* Boot Offset 0x400, valid for both SD and NAND boot */
+BOOT_OFFSET    FLASH_OFFSET_STANDARD
index 17930a4ff3e70de42759f0a123593ade2f4c54d5..5d7e48a5b633e89a913fe7b0eda424db153b7e08 100644 (file)
@@ -300,11 +300,6 @@ config CMD_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
index 775df1419e6c990b66213c148bef7d2a96c7af9d..322e0700d7384eee1ff1a23845054e13c3ea0a7b 100644 (file)
@@ -23,6 +23,7 @@
 #include <i2c.h>
 #include <initcall.h>
 #include <logbuff.h>
+#include <malloc.h>
 #include <mapmem.h>
 
 /* TODO: Can we move these into arch/ headers? */
@@ -282,49 +283,6 @@ __weak int arch_cpu_init(void)
        return 0;
 }
 
-#ifdef CONFIG_OF_HOSTFILE
-
-static int read_fdt_from_file(void)
-{
-       struct sandbox_state *state = state_get_current();
-       const char *fname = state->fdt_fname;
-       void *blob;
-       loff_t size;
-       int err;
-       int fd;
-
-       blob = map_sysmem(CONFIG_SYS_FDT_LOAD_ADDR, 0);
-       if (!state->fdt_fname) {
-               err = fdt_create_empty_tree(blob, 256);
-               if (!err)
-                       goto done;
-               printf("Unable to create empty FDT: %s\n", fdt_strerror(err));
-               return -EINVAL;
-       }
-
-       err = os_get_filesize(fname, &size);
-       if (err < 0) {
-               printf("Failed to file FDT file '%s'\n", fname);
-               return err;
-       }
-       fd = os_open(fname, OS_O_RDONLY);
-       if (fd < 0) {
-               printf("Failed to open FDT file '%s'\n", fname);
-               return -EACCES;
-       }
-       if (os_read(fd, blob, size) != size) {
-               os_close(fd);
-               return -EIO;
-       }
-       os_close(fd);
-
-done:
-       gd->fdt_blob = blob;
-
-       return 0;
-}
-#endif
-
 #ifdef CONFIG_SANDBOX
 static int setup_ram_buf(void)
 {
@@ -337,28 +295,6 @@ static int setup_ram_buf(void)
 }
 #endif
 
-static int setup_fdt(void)
-{
-#ifdef CONFIG_OF_CONTROL
-# 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;
-# elif defined(CONFIG_OF_HOSTFILE)
-       if (read_fdt_from_file()) {
-               puts("Failed to read control FDT\n");
-               return -1;
-       }
-# endif
-       /* Allow the early environment to override the fdt address */
-       gd->fdt_blob = (void *)getenv_ulong("fdtcontroladdr", 16,
-                                               (uintptr_t)gd->fdt_blob);
-#endif
-       return 0;
-}
-
 /* Get the top of usable RAM */
 __weak ulong board_get_usable_ram_top(ulong total_size)
 {
@@ -786,17 +722,6 @@ static int mark_bootstage(void)
        return 0;
 }
 
-static int initf_malloc(void)
-{
-#ifdef CONFIG_SYS_MALLOC_F_LEN
-       assert(gd->malloc_base);        /* Set up by crt0.S */
-       gd->malloc_limit = gd->malloc_base + CONFIG_SYS_MALLOC_F_LEN;
-       gd->malloc_ptr = 0;
-#endif
-
-       return 0;
-}
-
 static int initf_dm(void)
 {
 #if defined(CONFIG_DM) && defined(CONFIG_SYS_MALLOC_F_LEN)
@@ -826,7 +751,9 @@ static init_fnc_t init_sequence_f[] = {
        setup_ram_buf,
 #endif
        setup_mon_len,
-       setup_fdt,
+#ifdef CONFIG_OF_CONTROL
+       fdtdec_setup,
+#endif
 #ifdef CONFIG_TRACE
        trace_early_init,
 #endif
@@ -837,9 +764,6 @@ static init_fnc_t init_sequence_f[] = {
 #endif
        arch_cpu_init,          /* basic arch cpu dependent setup */
        mark_bootstage,
-#ifdef CONFIG_OF_CONTROL
-       fdtdec_check_fdt,
-#endif
        initf_dm,
        arch_cpu_init_dm,
 #if defined(CONFIG_BOARD_EARLY_INIT_F)
index 42ff18c219030d8478d0e921f5d576d2ddac746b..307124ed8049a0c574042b8b34548e8551373e88 100644 (file)
@@ -702,6 +702,12 @@ init_fnc_t init_sequence_r[] = {
        /* TODO: could x86/PPC have this also perhaps? */
 #ifdef CONFIG_ARM
        initr_caches,
+       /* Note: For Freescale LS2 SoCs, new MMU table is created in DDR.
+        *       A temporary mapping of IFC high region is since removed,
+        *       so environmental variables in NOR flash is not availble
+        *       until board_init() is called below to remap IFC to high
+        *       region.
+        */
 #endif
        initr_reloc_global_data,
 #if defined(CONFIG_SYS_INIT_RAM_LOCK) && defined(CONFIG_E500)
index e3491662bc5819bc837545d9ed953ff21937ad0c..4a653e5bcfab8e24c35608aa256c8c8161b2b291 100644 (file)
@@ -27,6 +27,8 @@ static const char * const weekdays[] = {
 
 int mk_date (const char *, struct rtc_time *);
 
+static struct rtc_time default_tm = { 0, 0, 0, 1, 1, 2000, 6, 0, 0 };
+
 static int do_date(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
 {
        struct rtc_time tm;
@@ -47,6 +49,9 @@ static int do_date(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
                if (strcmp(argv[1],"reset") == 0) {
                        puts ("Reset RTC...\n");
                        rtc_reset ();
+                       rcode = rtc_set(&default_tm);
+                       if (rcode)
+                               puts("## Failed to set date after RTC reset\n");
                } else {
                        /* initialize tm with current time */
                        rcode = rtc_get (&tm);
index 172bc30bd6fc9b272ef60b33f7777c31e9497794..b0f1a61b1bb02cb813452b8ba696619645691f61 100644 (file)
@@ -39,6 +39,12 @@ static const led_tbl_t led_commands[] = {
 #ifdef STATUS_LED_BIT3
        { "3", STATUS_LED_BIT3, NULL, NULL, NULL },
 #endif
+#ifdef STATUS_LED_BIT4
+       { "4", STATUS_LED_BIT4, NULL, NULL, NULL },
+#endif
+#ifdef STATUS_LED_BIT5
+       { "5", STATUS_LED_BIT5, NULL, NULL, NULL },
+#endif
 #endif
 #ifdef STATUS_LED_GREEN
        { "green", STATUS_LED_GREEN, green_led_off, green_led_on, NULL },
@@ -55,30 +61,39 @@ static const led_tbl_t led_commands[] = {
        { NULL, 0, NULL, NULL, NULL }
 };
 
-enum led_cmd { LED_ON, LED_OFF, LED_TOGGLE };
+enum led_cmd { LED_ON, LED_OFF, LED_TOGGLE, LED_BLINK };
 
 enum led_cmd get_led_cmd(char *var)
 {
-       if (strcmp(var, "off") == 0) {
+       if (strcmp(var, "off") == 0)
                return LED_OFF;
-       }
-       if (strcmp(var, "on") == 0) {
+       if (strcmp(var, "on") == 0)
                return LED_ON;
-       }
        if (strcmp(var, "toggle") == 0)
                return LED_TOGGLE;
+       if (strcmp(var, "blink") == 0)
+               return LED_BLINK;
+
        return -1;
 }
 
+/*
+ * LED drivers providing a blinking LED functionality, like the
+ * PCA9551, can override this empty weak function
+ */
+void __weak __led_blink(led_id_t mask, int freq)
+{
+}
+
 int do_led (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
 {
        int i, match = 0;
        enum led_cmd cmd;
+       int freq;
 
        /* Validate arguments */
-       if ((argc != 3)) {
+       if ((argc < 3) || (argc > 4))
                return CMD_RET_USAGE;
-       }
 
        cmd = get_led_cmd(argv[2]);
        if (cmd < 0) {
@@ -109,6 +124,13 @@ int do_led (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
                                        led_commands[i].toggle();
                                else
                                        __led_toggle(led_commands[i].mask);
+                               break;
+                       case LED_BLINK:
+                               if (argc != 4)
+                                       return CMD_RET_USAGE;
+
+                               freq = simple_strtoul(argv[3], NULL, 10);
+                               __led_blink(led_commands[i].mask, freq);
                        }
                        /* Need to set only 1 led if led_name wasn't 'all' */
                        if (strcmp("all", argv[1]) != 0)
@@ -125,7 +147,7 @@ int do_led (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
 }
 
 U_BOOT_CMD(
-       led, 3, 1, do_led,
+       led, 4, 1, do_led,
        "["
 #ifdef CONFIG_BOARD_SPECIFIC_LED
 #ifdef STATUS_LED_BIT
@@ -140,6 +162,12 @@ U_BOOT_CMD(
 #ifdef STATUS_LED_BIT3
        "3|"
 #endif
+#ifdef STATUS_LED_BIT4
+       "4|"
+#endif
+#ifdef STATUS_LED_BIT5
+       "5|"
+#endif
 #endif
 #ifdef STATUS_LED_GREEN
        "green|"
@@ -153,6 +181,6 @@ U_BOOT_CMD(
 #ifdef STATUS_LED_BLUE
        "blue|"
 #endif
-       "all] [on|off|toggle]",
-       "[led_name] [on|off|toggle] sets or clears led(s)"
+       "all] [on|off|toggle|blink] [blink-freq in ms]",
+       "[led_name] [on|off|toggle|blink] sets or clears led(s)"
 );
index 45e471ca82bae8efd9fe49e050bcd5a20a86cb6c..5d8c9e6c061c31dcf7fb2f50374d02e5dd72ceb1 100644 (file)
@@ -36,9 +36,9 @@ static int mod_mem(cmd_tbl_t *, int, int, int, char * const []);
 /* Display values from last command.
  * Memory modify remembered values are different from display memory.
  */
-static uint    dp_last_addr, dp_last_size;
-static uint    dp_last_length = 0x40;
-static uint    mm_last_addr, mm_last_size;
+static ulong   dp_last_addr, dp_last_size;
+static ulong   dp_last_length = 0x40;
+static ulong   mm_last_addr, mm_last_size;
 
 static ulong   base_address = 0;
 
index 7c4a57aa569fd9d0a7ba7da4769ec02190a02ca0..5e9079da048784c1b01897c9e42f2e14a1a73232 100644 (file)
@@ -249,6 +249,7 @@ static uint last_addr_lo;
 static uint last_addr_hi;
 static uint last_reg_lo;
 static uint last_reg_hi;
+static uint last_mask;
 
 static void extract_range(
        char * input,
@@ -272,7 +273,7 @@ static int do_mii(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
        char            op[2];
        unsigned char   addrlo, addrhi, reglo, reghi;
        unsigned char   addr, reg;
-       unsigned short  data;
+       unsigned short  data, mask;
        int             rcode = 0;
        const char      *devname;
 
@@ -294,6 +295,7 @@ static int do_mii(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
        reglo  = last_reg_lo;
        reghi  = last_reg_hi;
        data   = last_data;
+       mask   = last_mask;
 
        if ((flag & CMD_FLAG_REPEAT) == 0) {
                op[0] = argv[1][0];
@@ -307,7 +309,9 @@ static int do_mii(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
                if (argc >= 4)
                        extract_range(argv[3], &reglo, &reghi);
                if (argc >= 5)
-                       data = simple_strtoul (argv[4], NULL, 16);
+                       data = simple_strtoul(argv[4], NULL, 16);
+               if (argc >= 6)
+                       mask = simple_strtoul(argv[5], NULL, 16);
        }
 
        /* use current device */
@@ -375,6 +379,28 @@ static int do_mii(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
                                }
                        }
                }
+       } else if (op[0] == 'm') {
+               for (addr = addrlo; addr <= addrhi; addr++) {
+                       for (reg = reglo; reg <= reghi; reg++) {
+                               unsigned short val = 0;
+                               if (miiphy_read(devname, addr,
+                                               reg, &val)) {
+                                       printf("Error reading from the PHY");
+                                       printf(" addr=%02x", addr);
+                                       printf(" reg=%02x\n", reg);
+                                       rcode = 1;
+                               } else {
+                                       val = (val & ~mask) | (data & mask);
+                                       if (miiphy_write(devname, addr,
+                                                        reg, val)) {
+                                               printf("Error writing to the PHY");
+                                               printf(" addr=%02x", addr);
+                                               printf(" reg=%02x\n", reg);
+                                               rcode = 1;
+                                       }
+                               }
+                       }
+               }
        } else if (strncmp(op, "du", 2) == 0) {
                ushort regs[6];
                int ok = 1;
@@ -417,6 +443,7 @@ static int do_mii(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
        last_reg_lo  = reglo;
        last_reg_hi  = reghi;
        last_data    = data;
+       last_mask    = mask;
 
        return rcode;
 }
@@ -424,13 +451,15 @@ static int do_mii(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
 /***************************************************/
 
 U_BOOT_CMD(
-       mii,    5,      1,      do_mii,
+       mii, 6, 1, do_mii,
        "MII utility commands",
-       "device                     - list available devices\n"
-       "mii device <devname>           - set current device\n"
-       "mii info   <addr>              - display MII PHY info\n"
-       "mii read   <addr> <reg>        - read  MII PHY <addr> register <reg>\n"
-       "mii write  <addr> <reg> <data> - write MII PHY <addr> register <reg>\n"
-       "mii dump   <addr> <reg>        - pretty-print <addr> <reg> (0-5 only)\n"
+       "device                            - list available devices\n"
+       "mii device <devname>                  - set current device\n"
+       "mii info   <addr>                     - display MII PHY info\n"
+       "mii read   <addr> <reg>               - read  MII PHY <addr> register <reg>\n"
+       "mii write  <addr> <reg> <data>        - write MII PHY <addr> register <reg>\n"
+       "mii modify <addr> <reg> <data> <mask> - modify MII PHY <addr> register <reg>\n"
+       "                                        updating bits identified in <mask>\n"
+       "mii dump   <addr> <reg>               - pretty-print <addr> <reg> (0-5 only)\n"
        "Addr and/or reg may be ranges, e.g. 2-7."
 );
index 17fa7ea6bd05a4c3f32a0c29ebe23ba013d0557c..9433c80a04a42f65491874b94c6b92edc6efe7d4 100644 (file)
@@ -394,9 +394,12 @@ static void nand_print_and_set_info(int idx)
                printf("%dx ", chip->numchips);
        printf("%s, sector size %u KiB\n",
               nand->name, nand->erasesize >> 10);
-       printf("  Page size  %8d b\n", nand->writesize);
-       printf("  OOB size   %8d b\n", nand->oobsize);
-       printf("  Erase size %8d b\n", nand->erasesize);
+       printf("  Page size   %8d b\n", nand->writesize);
+       printf("  OOB size    %8d b\n", nand->oobsize);
+       printf("  Erase size  %8d b\n", nand->erasesize);
+       printf("  subpagesize %8d b\n", chip->subpagesize);
+       printf("  options     0x%8x\n", chip->options);
+       printf("  bbt options 0x%8x\n", chip->bbt_options);
 
        /* Set geometry info */
        setenv_hex("nand_writesize", nand->writesize);
index a0a62ebdca8e8d18e36ecfa7fac6aea6328d2df5..f80f549d4e19c862fb70dd071088fee61e17726e 100644 (file)
@@ -37,7 +37,7 @@
 #define SCSI_DEV_LIST {SCSI_VEND_ID, SCSI_DEV_ID}
 #endif
 
-#ifdef CONFIG_PCI
+#if defined(CONFIG_PCI) && !defined(CONFIG_SCSI_AHCI_PLAT)
 const struct pci_device_id scsi_device_list[] = { SCSI_DEV_LIST };
 #endif
 static ccb tempccb;    /* temporary scsi command buffer */
@@ -179,7 +179,7 @@ int scsi_get_disk_count(void)
        return scsi_max_devs;
 }
 
-#ifdef CONFIG_PCI
+#if defined(CONFIG_PCI) && !defined(CONFIG_SCSI_AHCI_PLAT)
 void scsi_init(void)
 {
        int busdevfunc;
index 6aabf39302ce5e9000d19777a1622b27d1d52189..342021df97e79195aacaba4c756bb3737dcd98be 100644 (file)
@@ -164,6 +164,8 @@ static int do_spi_flash_probe(int argc, char * const argv[])
 static const char *spi_flash_update_block(struct spi_flash *flash, u32 offset,
                size_t len, const char *buf, char *cmp_buf, size_t *skipped)
 {
+       char *ptr = (char *)buf;
+
        debug("offset=%#x, sector_size=%#x, len=%#zx\n",
              offset, flash->sector_size, len);
        /* Read the entire sector so to allow for rewriting */
@@ -179,16 +181,14 @@ static const char *spi_flash_update_block(struct spi_flash *flash, u32 offset,
        /* Erase the entire sector */
        if (spi_flash_erase(flash, offset, flash->sector_size))
                return "erase";
-       /* Write the initial part of the block from the source */
-       if (spi_flash_write(flash, offset, len, buf))
-               return "write";
-       /* If it's a partial sector, rewrite the existing part */
+       /* If it's a partial sector, copy the data into the temp-buffer */
        if (len != flash->sector_size) {
-               /* Rewrite the original data to the end of the sector */
-               if (spi_flash_write(flash, offset + len,
-                                   flash->sector_size - len, &cmp_buf[len]))
-                       return "write";
+               memcpy(cmp_buf, buf, len);
+               ptr = cmp_buf;
        }
+       /* Write one complete sector */
+       if (spi_flash_write(flash, offset, flash->sector_size, ptr))
+               return "write";
 
        return NULL;
 }
index b02c69e586283672ba0c4bf38f2202099d0fe477..0686be68ce0a857ead08ff840a23c444284f30fb 100644 (file)
@@ -39,3 +39,50 @@ U_BOOT_CMD(
        "unzip a memory region",
        "srcaddr dstaddr [dstsize]"
 );
+
+static int do_gzwrite(cmd_tbl_t *cmdtp, int flag,
+                     int argc, char * const argv[])
+{
+       block_dev_desc_t *bdev;
+       int ret;
+       unsigned char *addr;
+       unsigned long length;
+       unsigned long writebuf = 1<<20;
+       u64 startoffs = 0;
+       u64 szexpected = 0;
+
+       if (argc < 5)
+               return CMD_RET_USAGE;
+       ret = get_device(argv[1], argv[2], &bdev);
+       if (ret < 0)
+               return CMD_RET_FAILURE;
+
+       addr = (unsigned char *)simple_strtoul(argv[3], NULL, 16);
+       length = simple_strtoul(argv[4], NULL, 16);
+
+       if (5 < argc) {
+               writebuf = simple_strtoul(argv[5], NULL, 16);
+               if (6 < argc) {
+                       startoffs = simple_strtoull(argv[6], NULL, 16);
+                       if (7 < argc)
+                               szexpected = simple_strtoull(argv[7],
+                                                            NULL, 16);
+               }
+       }
+
+       ret = gzwrite(addr, length, bdev, writebuf, startoffs, szexpected);
+
+       return ret ? CMD_RET_FAILURE : CMD_RET_SUCCESS;
+}
+
+U_BOOT_CMD(
+       gzwrite, 8, 0, do_gzwrite,
+       "unzip and write memory to block device",
+       "<interface> <dev> <addr> length [wbuf=1M [offs=0 [outsize=0]]]\n"
+       "\twbuf is the size in bytes (hex) of write buffer\n"
+       "\t\tand should be padded to erase size for SSDs\n"
+       "\toffs is the output start offset in bytes (hex)\n"
+       "\toutsize is the size of the expected output (hex bytes)\n"
+       "\t\tand is required for files with uncompressed lengths\n"
+       "\t\t4 GiB or larger\n"
+);
index b2ce063c5f40cff0d8b64b90011a375a3a01205a..b5bb05191c240a46d0fb944356418c45f3f8ea4e 100644 (file)
@@ -3261,6 +3261,17 @@ int mALLOPt(param_number, value) int param_number; int value;
   }
 }
 
+int initf_malloc(void)
+{
+#ifdef CONFIG_SYS_MALLOC_F_LEN
+       assert(gd->malloc_base);        /* Set up by crt0.S */
+       gd->malloc_limit = CONFIG_SYS_MALLOC_F_LEN;
+       gd->malloc_ptr = 0;
+#endif
+
+       return 0;
+}
+
 /*
 
 History:
index 8266bca7d6489a2ca8fb6f1015064184b137d2dd..c5ed5ad89eec13d0f6b1b04cbaf3a2631f25a060 100644 (file)
@@ -1560,3 +1560,32 @@ int fdt_setup_simplefb_node(void *fdt, int node, u64 base_address, u32 width,
 
        return 0;
 }
+
+/*
+ * Update native-mode in display-timings from display environment variable.
+ * The node to update are specified by path.
+ */
+int fdt_fixup_display(void *blob, const char *path, const char *display)
+{
+       int off, toff;
+
+       if (!display || !path)
+               return -FDT_ERR_NOTFOUND;
+
+       toff = fdt_path_offset(blob, path);
+       if (toff >= 0)
+               toff = fdt_subnode_offset(blob, toff, "display-timings");
+       if (toff < 0)
+               return toff;
+
+       for (off = fdt_first_subnode(blob, toff);
+            off >= 0;
+            off = fdt_next_subnode(blob, off)) {
+               uint32_t h = fdt_get_phandle(blob, off);
+               debug("%s:0x%x\n", fdt_get_name(blob, off, NULL),
+                     fdt32_to_cpu(h));
+               if (strcasecmp(fdt_get_name(blob, off, NULL), display) == 0)
+                       return fdt_setprop_u32(blob, toff, "native-mode", h);
+       }
+       return toff;
+}
index 8e1fb40c47f12990c58bb36ab13e7e1596a80fb9..690c9b04ff2e16ac06d498aaf56e71e50c8251ed 100644 (file)
@@ -125,7 +125,7 @@ __weak void __noreturn jump_to_image_no_args(struct spl_image_info *spl_image)
        typedef void __noreturn (*image_entry_noargs_t)(void);
 
        image_entry_noargs_t image_entry =
-                       (image_entry_noargs_t) spl_image->entry_point;
+               (image_entry_noargs_t)(unsigned long)spl_image->entry_point;
 
        debug("image entry point: 0x%X\n", spl_image->entry_point);
        image_entry();
@@ -151,6 +151,8 @@ static void spl_ram_load_image(void)
 void board_init_r(gd_t *dummy1, ulong dummy2)
 {
        u32 boot_device;
+       int ret;
+
        debug(">>spl:board_init_r()\n");
 
 #if defined(CONFIG_SYS_SPL_MALLOC_START)
@@ -158,12 +160,24 @@ void board_init_r(gd_t *dummy1, ulong dummy2)
                        CONFIG_SYS_SPL_MALLOC_SIZE);
        gd->flags |= GD_FLG_FULL_MALLOC_INIT;
 #elif defined(CONFIG_SYS_MALLOC_F_LEN)
-       gd->malloc_limit = gd->malloc_base + CONFIG_SYS_MALLOC_F_LEN;
+       gd->malloc_limit = CONFIG_SYS_MALLOC_F_LEN;
        gd->malloc_ptr = 0;
 #endif
-#ifdef CONFIG_SPL_DM
-       dm_init_and_scan(true);
-#endif
+       if (IS_ENABLED(CONFIG_OF_CONTROL) &&
+                       !IS_ENABLED(CONFIG_SPL_DISABLE_OF_CONTROL)) {
+               ret = fdtdec_setup();
+               if (ret) {
+                       debug("fdtdec_setup() returned error %d\n", ret);
+                       hang();
+               }
+       }
+       if (IS_ENABLED(CONFIG_SPL_DM)) {
+               ret = dm_init_and_scan(true);
+               if (ret) {
+                       debug("dm_init_and_scan() returned error %d\n", ret);
+                       hang();
+               }
+       }
 
 #ifndef CONFIG_PPC
        /*
index b7801cb4605f16c54c99f65e3e8ed93db5d3e564..b8c369d984d05e856b725788b0a369e5e00fe5fd 100644 (file)
@@ -91,7 +91,7 @@ void spl_nand_load_image(void)
                sizeof(*header), (void *)header);
        spl_parse_image_header(header);
        nand_spl_load_image(CONFIG_SYS_NAND_U_BOOT_OFFS,
-               spl_image.size, (void *)spl_image.load_addr);
+               spl_image.size, (void *)(unsigned long)spl_image.load_addr);
        nand_deselect();
 }
 #endif
diff --git a/configs/colibri_vf_defconfig b/configs/colibri_vf_defconfig
new file mode 100644 (file)
index 0000000..cef5a9e
--- /dev/null
@@ -0,0 +1,3 @@
+CONFIG_SYS_EXTRA_OPTIONS="IMX_CONFIG=board/toradex/colibri_vf/imximage.cfg,ENV_IS_IN_NAND,IMX_NAND"
+CONFIG_ARM=y
+CONFIG_TARGET_COLIBRI_VF=y
index 0bb7b085cee2b98b07ccd0217c4baecb92db2a81..fc0dc6746b42a99358c810c7cbc259c7ff153edf 100644 (file)
@@ -1,3 +1,4 @@
-CONFIG_SYS_EXTRA_OPTIONS="CM720T"
 CONFIG_ARM=y
-CONFIG_TARGET_INTEGRATORAP_CM720T=y
+CONFIG_ARCH_INTEGRATOR=y
+CONFIG_ARCH_INTEGRATOR_AP=y
+CONFIG_CM720T=y
index fb925d50b1ec4f2bca1320020bc60332a99b5fce..eb6afb9f79bda61504fcb413e5fd1fc8e48fd5e7 100644 (file)
@@ -1,3 +1,4 @@
-CONFIG_SYS_EXTRA_OPTIONS="CM920T"
 CONFIG_ARM=y
-CONFIG_TARGET_INTEGRATORAP_CM920T=y
+CONFIG_ARCH_INTEGRATOR=y
+CONFIG_ARCH_INTEGRATOR_AP=y
+CONFIG_CM920T=y
index 308a1e6162a5ad4e9c3ea0cf0c451d8745c2a7a7..8667fcb10ad20b1e196a7c35928d8d1bf85a8962 100644 (file)
@@ -1,3 +1,4 @@
-CONFIG_SYS_EXTRA_OPTIONS="CM926EJ_S"
 CONFIG_ARM=y
-CONFIG_TARGET_INTEGRATORAP_CM926EJS=y
+CONFIG_ARCH_INTEGRATOR=y
+CONFIG_ARCH_INTEGRATOR_AP=y
+CONFIG_CM926EJ_S=y
index d1b9db5d6af57d4879a04370cbff799a5d8041b4..1e8c15796da6abf567778d69e17079fd0c3f3d5d 100644 (file)
@@ -1,3 +1,4 @@
-CONFIG_SYS_EXTRA_OPTIONS="CM946ES"
 CONFIG_ARM=y
-CONFIG_TARGET_INTEGRATORAP_CM946ES=y
+CONFIG_ARCH_INTEGRATOR=y
+CONFIG_ARCH_INTEGRATOR_AP=y
+CONFIG_CM946ES=y
index 3feb6563f6f0afe2f85e7b4f7a272d8e9194638e..f039470c5c8c9beea86b63d032b7929952548c4c 100644 (file)
@@ -1,3 +1,4 @@
-CONFIG_SYS_EXTRA_OPTIONS="CM1136"
 CONFIG_ARM=y
-CONFIG_TARGET_INTEGRATORCP_CM1136=y
+CONFIG_ARCH_INTEGRATOR=y
+CONFIG_ARCH_INTEGRATOR_CP=y
+CONFIG_CM1136=y
index f304bbe8eb46bd29b5e711c3bd1121e7f64650b5..cb364a11c128c48a1c5d939253873aadcf647079 100644 (file)
@@ -1,3 +1,4 @@
-CONFIG_SYS_EXTRA_OPTIONS="CM920T"
 CONFIG_ARM=y
-CONFIG_TARGET_INTEGRATORCP_CM920T=y
+CONFIG_ARCH_INTEGRATOR=y
+CONFIG_ARCH_INTEGRATOR_CP=y
+CONFIG_CM920T=y
index a8d762b0047c066a0caddf0b2efe68399b42afb7..32ea7b97e7a7a7956e935920d7ca5d32a746b115 100644 (file)
@@ -1,3 +1,4 @@
-CONFIG_SYS_EXTRA_OPTIONS="CM924EJ_S"
 CONFIG_ARM=y
-CONFIG_TARGET_INTEGRATORCP_CM926EJS=y
+CONFIG_ARCH_INTEGRATOR=y
+CONFIG_ARCH_INTEGRATOR_CP=y
+CONFIG_CM926EJ_S=y
index 2e67dbc70a37160a28b38cf8374e32f82b9a63b8..e7fc706615aee1626f067d206b2be9ced1fb257d 100644 (file)
@@ -1,3 +1,4 @@
-CONFIG_SYS_EXTRA_OPTIONS="CM946ES"
 CONFIG_ARM=y
-CONFIG_TARGET_INTEGRATORCP_CM946ES=y
+CONFIG_ARCH_INTEGRATOR=y
+CONFIG_ARCH_INTEGRATOR_CP=y
+CONFIG_CM946ES=y
diff --git a/configs/ls1021aqds_ddr4_nor_lpuart_defconfig b/configs/ls1021aqds_ddr4_nor_lpuart_defconfig
new file mode 100644 (file)
index 0000000..4d2714b
--- /dev/null
@@ -0,0 +1,3 @@
+CONFIG_SYS_EXTRA_OPTIONS="SYS_FSL_DDR4,LPUART"
+CONFIG_ARM=y
+CONFIG_TARGET_LS1021AQDS=y
diff --git a/configs/ls2085aqds_defconfig b/configs/ls2085aqds_defconfig
new file mode 100644 (file)
index 0000000..e3a17a3
--- /dev/null
@@ -0,0 +1,3 @@
+CONFIG_SYS_EXTRA_OPTIONS="SYS_FSL_DDR4"
+CONFIG_ARM=y
+CONFIG_TARGET_LS2085AQDS=y
diff --git a/configs/ls2085aqds_nand_defconfig b/configs/ls2085aqds_nand_defconfig
new file mode 100644 (file)
index 0000000..f84a426
--- /dev/null
@@ -0,0 +1,4 @@
+CONFIG_SYS_EXTRA_OPTIONS="SYS_FSL_DDR4,NAND"
+CONFIG_SPL=y
+CONFIG_ARM=y
+CONFIG_TARGET_LS2085AQDS=y
diff --git a/configs/ls2085ardb_defconfig b/configs/ls2085ardb_defconfig
new file mode 100644 (file)
index 0000000..6b64f71
--- /dev/null
@@ -0,0 +1,3 @@
+CONFIG_SYS_EXTRA_OPTIONS="SYS_FSL_DDR4"
+CONFIG_ARM=y
+CONFIG_TARGET_LS2085ARDB=y
diff --git a/configs/ls2085ardb_nand_defconfig b/configs/ls2085ardb_nand_defconfig
new file mode 100644 (file)
index 0000000..74812f7
--- /dev/null
@@ -0,0 +1,4 @@
+CONFIG_SYS_EXTRA_OPTIONS="SYS_FSL_DDR4,NAND"
+CONFIG_SPL=y
+CONFIG_ARM=y
+CONFIG_TARGET_LS2085ARDB=y
diff --git a/configs/mx6cuboxi_defconfig b/configs/mx6cuboxi_defconfig
new file mode 100644 (file)
index 0000000..4c2f0e0
--- /dev/null
@@ -0,0 +1,6 @@
+CONFIG_SPL=y
+CONFIG_SYS_EXTRA_OPTIONS="IMX_CONFIG=arch/arm/imx-common/spl_sd.cfg,MX6QDL"
+CONFIG_ARM=y
+CONFIG_TARGET_MX6CUBOXI=y
+CONFIG_DM=y
+CONFIG_DM_THERMAL=y
diff --git a/configs/omapl138_lcdk_defconfig b/configs/omapl138_lcdk_defconfig
new file mode 100644 (file)
index 0000000..8f19721
--- /dev/null
@@ -0,0 +1,3 @@
+CONFIG_ARM=y
+CONFIG_ARCH_DAVINCI=y
+CONFIG_TARGET_OMAPL138_LCDK=y
diff --git a/configs/stm32f429-discovery_defconfig b/configs/stm32f429-discovery_defconfig
new file mode 100644 (file)
index 0000000..6d74d73
--- /dev/null
@@ -0,0 +1,2 @@
+CONFIG_ARM=y
+CONFIG_TARGET_STM32F429_DISCOVERY=y
index f83264d615da5390d34ed52b0a2394f6d2a6fcf6..f0276b1b46fe6135f549cf37f7fe5e28c4efd4fe 100644 (file)
@@ -95,43 +95,82 @@ are provided in test/dm. To run them, try:
 You should see something like this:
 
     <...U-Boot banner...>
-    Running 29 driver model tests
+    Running 53 driver model tests
     Test: dm_test_autobind
     Test: dm_test_autoprobe
+    Test: dm_test_bus_child_post_bind
+    Test: dm_test_bus_child_post_bind_uclass
+    Test: dm_test_bus_child_pre_probe_uclass
     Test: dm_test_bus_children
-    Device 'd-test': seq 3 is in use by 'b-test'
-    Device 'c-test@0': seq 0 is in use by 'a-test'
-    Device 'c-test@1': seq 1 is in use by 'd-test'
+    Device 'c-test@0': seq 0 is in use by 'd-test'
+    Device 'c-test@1': seq 1 is in use by 'f-test'
     Test: dm_test_bus_children_funcs
     Test: dm_test_bus_children_iterators
     Test: dm_test_bus_parent_data
+    Test: dm_test_bus_parent_data_uclass
     Test: dm_test_bus_parent_ops
+    Test: dm_test_bus_parent_platdata
+    Test: dm_test_bus_parent_platdata_uclass
     Test: dm_test_children
+    Test: dm_test_device_get_uclass_id
+    Test: dm_test_eth
+    Using eth@10002000 device
+    Using eth@10003000 device
+    Using eth@10004000 device
+    Test: dm_test_eth_alias
+    Using eth@10002000 device
+    Using eth@10004000 device
+    Using eth@10002000 device
+    Using eth@10003000 device
+    Test: dm_test_eth_prime
+    Using eth@10003000 device
+    Using eth@10002000 device
+    Test: dm_test_eth_rotate
+
+    Error: eth@10004000 address not set.
+
+    Error: eth@10004000 address not set.
+    Using eth@10002000 device
+
+    Error: eth@10004000 address not set.
+
+    Error: eth@10004000 address not set.
+    Using eth@10004000 device
     Test: dm_test_fdt
-    Device 'd-test': seq 3 is in use by 'b-test'
     Test: dm_test_fdt_offset
     Test: dm_test_fdt_pre_reloc
     Test: dm_test_fdt_uclass_seq
-    Device 'd-test': seq 3 is in use by 'b-test'
-    Device 'a-test': seq 0 is in use by 'd-test'
     Test: dm_test_gpio
     extra-gpios: get_value: error: gpio b5 not reserved
     Test: dm_test_gpio_anon
     Test: dm_test_gpio_copy
     Test: dm_test_gpio_leak
     extra-gpios: get_value: error: gpio b5 not reserved
+    Test: dm_test_gpio_phandles
     Test: dm_test_gpio_requestf
+    Test: dm_test_i2c_bytewise
+    Test: dm_test_i2c_find
+    Test: dm_test_i2c_offset
+    Test: dm_test_i2c_offset_len
+    Test: dm_test_i2c_probe_empty
+    Test: dm_test_i2c_read_write
+    Test: dm_test_i2c_speed
     Test: dm_test_leak
     Test: dm_test_lifecycle
+    Test: dm_test_net_retry
+    Using eth@10004000 device
+    Using eth@10002000 device
+    Using eth@10004000 device
     Test: dm_test_operations
     Test: dm_test_ordering
+    Test: dm_test_pci_base
+    Test: dm_test_pci_swapcase
     Test: dm_test_platdata
     Test: dm_test_pre_reloc
     Test: dm_test_remove
     Test: dm_test_spi_find
     Invalid chip select 0:0 (err=-19)
     SF: Failed to get idcodes
-    Device 'name-emul': seq 0 is in use by 'name-emul'
     SF: Detected M25P16 with page size 256 Bytes, erase size 64 KiB, total 2 MiB
     Test: dm_test_spi_flash
     2097152 bytes written in 0 ms
@@ -150,6 +189,9 @@ You should see something like this:
     SF: Detected M25P16 with page size 256 Bytes, erase size 64 KiB, total 2 MiB
     Test: dm_test_uclass
     Test: dm_test_uclass_before_ready
+    Test: dm_test_usb_base
+    Test: dm_test_usb_flash
+    USB-1:   scanning bus 1 for devices... 2 USB Device(s) found
     Failures: 0
 
 
index 5f8438e891126acf1ee2839d76931ff951e83a04..174109ff8b800656c52a81087835187dc73c7477 100644 (file)
@@ -24,7 +24,7 @@ alias ijc            Ian Campbell <ijc+uboot@hellion.org.uk>
 alias iwamatsu       Nobuhiro Iwamatsu <iwamatsu@nigauri.org>
 alias jagan          Jagannadha Sutradharudu Teki <jagannadh.teki@gmail.com>
 alias jasonjin       Jason Jin <jason.jin@freescale.com>
-alias jhersh         Joe Hershberger <joe.hershberger@gmail.com>
+alias jhersh         Joe Hershberger <joe.hershberger@ni.com>
 alias jwrdegoede     Hans de Goede <hdegoede@redhat.com>
 alias kimphill       Kim Phillips <kim.phillips@freescale.com>
 alias luka           Luka Perkov <luka.perkov@sartura.hr>
@@ -113,6 +113,7 @@ alias x86            uboot, sjg, gruss
 alias dm             uboot, sjg
 alias cfi            uboot, stroese
 alias dfu            uboot, lukma
+alias eth            uboot, jhersh
 alias kerneldoc      uboot, marex
 alias fdt            uboot, sjg
 alias i2c            uboot, hs
@@ -120,6 +121,7 @@ alias kconfig        uboot, masahiro
 alias mmc            uboot, panto
 alias nand           uboot, scottwood
 alias net            uboot, jhersh
+alias phy            uboot, jhersh
 alias spi            uboot, jagan
 alias ubi            uboot, hs
 alias usb            uboot, marex
index 75d182d27f7e14bf41a962337d70cf9df5f03dee..2861b4307955854ef1b0b5f51b7beedffd7e4fa9 100644 (file)
@@ -46,3 +46,12 @@ config DM_STDIO
          Normally serial drivers register with stdio so that they can be used
          as normal output devices. In SPL we don't normally use stdio, so
          we can omit this feature.
+
+config DM_SEQ_ALIAS
+       bool "Support numbered aliases in device tree"
+       depends on DM
+       default y
+       help
+         Most boards will have a '/aliases' node containing the path to
+         numbered devices (e.g. serial0 = &serial0). This feature can be
+         disabled if it is not required, to save code space in SPL.
index 7fee1c001e4310d8b84355a518a69f93118b4d4d..6a16b4f690fd9392eb7637799ac777b3befc2e1f 100644 (file)
@@ -92,6 +92,10 @@ int device_unbind(struct udevice *dev)
                free(dev->platdata);
                dev->platdata = NULL;
        }
+       if (dev->flags & DM_FLAG_ALLOC_UCLASS_PDATA) {
+               free(dev->uclass_platdata);
+               dev->uclass_platdata = NULL;
+       }
        if (dev->flags & DM_FLAG_ALLOC_PARENT_PDATA) {
                free(dev->parent_platdata);
                dev->parent_platdata = NULL;
index ccaa99ca63fa8176ab2601f4902310c95fd03a87..85fd1fc7350331d48721539cbb42ca5ae33f8206 100644 (file)
@@ -30,7 +30,7 @@ int device_bind(struct udevice *parent, const struct driver *drv,
 {
        struct udevice *dev;
        struct uclass *uc;
-       int ret = 0;
+       int size, ret = 0;
 
        *devp = NULL;
        if (!name)
@@ -56,21 +56,23 @@ int device_bind(struct udevice *parent, const struct driver *drv,
 
        dev->seq = -1;
        dev->req_seq = -1;
-#ifdef CONFIG_OF_CONTROL
-       /*
-        * Some devices, such as a SPI bus, I2C bus and serial ports are
-        * numbered using aliases.
-        *
-        * This is just a 'requested' sequence, and will be
-        * resolved (and ->seq updated) when the device is probed.
-        */
-       if (uc->uc_drv->flags & DM_UC_FLAG_SEQ_ALIAS) {
-               if (uc->uc_drv->name && of_offset != -1) {
-                       fdtdec_get_alias_seq(gd->fdt_blob, uc->uc_drv->name,
-                                            of_offset, &dev->req_seq);
+       if (IS_ENABLED(CONFIG_OF_CONTROL) && IS_ENABLED(CONFIG_DM_SEQ_ALIAS)) {
+               /*
+               * Some devices, such as a SPI bus, I2C bus and serial ports
+               * are numbered using aliases.
+               *
+               * This is just a 'requested' sequence, and will be
+               * resolved (and ->seq updated) when the device is probed.
+               */
+               if (uc->uc_drv->flags & DM_UC_FLAG_SEQ_ALIAS) {
+                       if (uc->uc_drv->name && of_offset != -1) {
+                               fdtdec_get_alias_seq(gd->fdt_blob,
+                                               uc->uc_drv->name, of_offset,
+                                               &dev->req_seq);
+                       }
                }
        }
-#endif
+
        if (!dev->platdata && drv->platdata_auto_alloc_size) {
                dev->flags |= DM_FLAG_ALLOC_PDATA;
                dev->platdata = calloc(1, drv->platdata_auto_alloc_size);
@@ -79,9 +81,19 @@ int device_bind(struct udevice *parent, const struct driver *drv,
                        goto fail_alloc1;
                }
        }
-       if (parent) {
-               int size = parent->driver->per_child_platdata_auto_alloc_size;
 
+       size = uc->uc_drv->per_device_platdata_auto_alloc_size;
+       if (size) {
+               dev->flags |= DM_FLAG_ALLOC_UCLASS_PDATA;
+               dev->uclass_platdata = calloc(1, size);
+               if (!dev->uclass_platdata) {
+                       ret = -ENOMEM;
+                       goto fail_alloc2;
+               }
+       }
+
+       if (parent) {
+               size = parent->driver->per_child_platdata_auto_alloc_size;
                if (!size) {
                        size = parent->uclass->uc_drv->
                                        per_child_platdata_auto_alloc_size;
@@ -91,7 +103,7 @@ int device_bind(struct udevice *parent, const struct driver *drv,
                        dev->parent_platdata = calloc(1, size);
                        if (!dev->parent_platdata) {
                                ret = -ENOMEM;
-                               goto fail_alloc2;
+                               goto fail_alloc3;
                        }
                }
        }
@@ -123,21 +135,32 @@ int device_bind(struct udevice *parent, const struct driver *drv,
        return 0;
 
 fail_child_post_bind:
-       if (drv->unbind && drv->unbind(dev)) {
-               dm_warn("unbind() method failed on dev '%s' on error path\n",
-                       dev->name);
+       if (IS_ENABLED(CONFIG_DM_DEVICE_REMOVE)) {
+               if (drv->unbind && drv->unbind(dev)) {
+                       dm_warn("unbind() method failed on dev '%s' on error path\n",
+                               dev->name);
+               }
        }
 
 fail_bind:
-       if (uclass_unbind_device(dev)) {
-               dm_warn("Failed to unbind dev '%s' on error path\n",
-                       dev->name);
+       if (IS_ENABLED(CONFIG_DM_DEVICE_REMOVE)) {
+               if (uclass_unbind_device(dev)) {
+                       dm_warn("Failed to unbind dev '%s' on error path\n",
+                               dev->name);
+               }
        }
 fail_uclass_bind:
-       list_del(&dev->sibling_node);
-       if (dev->flags & DM_FLAG_ALLOC_PARENT_PDATA) {
-               free(dev->parent_platdata);
-               dev->parent_platdata = NULL;
+       if (IS_ENABLED(CONFIG_DM_DEVICE_REMOVE)) {
+               list_del(&dev->sibling_node);
+               if (dev->flags & DM_FLAG_ALLOC_PARENT_PDATA) {
+                       free(dev->parent_platdata);
+                       dev->parent_platdata = NULL;
+               }
+       }
+fail_alloc3:
+       if (dev->flags & DM_FLAG_ALLOC_UCLASS_PDATA) {
+               free(dev->uclass_platdata);
+               dev->uclass_platdata = NULL;
        }
 fail_alloc2:
        if (dev->flags & DM_FLAG_ALLOC_PDATA) {
@@ -314,6 +337,16 @@ void *dev_get_parent_platdata(struct udevice *dev)
        return dev->parent_platdata;
 }
 
+void *dev_get_uclass_platdata(struct udevice *dev)
+{
+       if (!dev) {
+               dm_warn("%s: null device", __func__);
+               return NULL;
+       }
+
+       return dev->uclass_platdata;
+}
+
 void *dev_get_priv(struct udevice *dev)
 {
        if (!dev) {
@@ -474,11 +507,27 @@ ulong dev_get_driver_data(struct udevice *dev)
        return dev->driver_data;
 }
 
+const void *dev_get_driver_ops(struct udevice *dev)
+{
+       if (!dev || !dev->driver->ops)
+               return NULL;
+
+       return dev->driver->ops;
+}
+
 enum uclass_id device_get_uclass_id(struct udevice *dev)
 {
        return dev->uclass->uc_drv->id;
 }
 
+const char *dev_get_uclass_name(struct udevice *dev)
+{
+       if (!dev)
+               return NULL;
+
+       return dev->uclass->uc_drv->name;
+}
+
 #ifdef CONFIG_OF_CONTROL
 fdt_addr_t dev_get_addr(struct udevice *dev)
 {
index 9b5c6bb10cb13d1648c344970838d967494e26a4..12d046051fdb3af8065adcd18d5bc017d6dc25b9 100644 (file)
@@ -197,13 +197,15 @@ int dm_init_and_scan(bool pre_reloc_only)
                debug("dm_scan_platdata() failed: %d\n", ret);
                return ret;
        }
-#ifdef CONFIG_OF_CONTROL
-       ret = dm_scan_fdt(gd->fdt_blob, pre_reloc_only);
-       if (ret) {
-               debug("dm_scan_fdt() failed: %d\n", ret);
-               return ret;
+
+       if (OF_CONTROL) {
+               ret = dm_scan_fdt(gd->fdt_blob, pre_reloc_only);
+               if (ret) {
+                       debug("dm_scan_fdt() failed: %d\n", ret);
+                       return ret;
+               }
        }
-#endif
+
        ret = dm_scan_other(pre_reloc_only);
        if (ret)
                return ret;
index 98c15e585dfa81d36313899ffacdcaee9ea57ca6..7de817324b90fe22e99a2948f34a11926eaee2f7 100644 (file)
@@ -99,10 +99,18 @@ fail_mem:
 int uclass_destroy(struct uclass *uc)
 {
        struct uclass_driver *uc_drv;
-       struct udevice *dev, *tmp;
+       struct udevice *dev;
        int ret;
 
-       list_for_each_entry_safe(dev, tmp, &uc->dev_head, uclass_node) {
+       /*
+        * We cannot use list_for_each_entry_safe() here. If a device in this
+        * uclass has a child device also in this uclass, it will be also be
+        * unbound (by the recursion in the call to device_unbind() below).
+        * We can loop until the list is empty.
+        */
+       while (!list_empty(&uc->dev_head)) {
+               dev = list_first_entry(&uc->dev_head, struct udevice,
+                                      uclass_node);
                ret = device_remove(dev);
                if (ret)
                        return ret;
@@ -156,6 +164,60 @@ int uclass_find_device(enum uclass_id id, int index, struct udevice **devp)
        return -ENODEV;
 }
 
+int uclass_find_first_device(enum uclass_id id, struct udevice **devp)
+{
+       struct uclass *uc;
+       int ret;
+
+       *devp = NULL;
+       ret = uclass_get(id, &uc);
+       if (ret)
+               return ret;
+       if (list_empty(&uc->dev_head))
+               return 0;
+
+       *devp = list_first_entry(&uc->dev_head, struct udevice, uclass_node);
+
+       return 0;
+}
+
+int uclass_find_next_device(struct udevice **devp)
+{
+       struct udevice *dev = *devp;
+
+       *devp = NULL;
+       if (list_is_last(&dev->uclass_node, &dev->uclass->dev_head))
+               return 0;
+
+       *devp = list_entry(dev->uclass_node.next, struct udevice, uclass_node);
+
+       return 0;
+}
+
+int uclass_find_device_by_name(enum uclass_id id, const char *name,
+                              struct udevice **devp)
+{
+       struct uclass *uc;
+       struct udevice *dev;
+       int ret;
+
+       *devp = NULL;
+       if (!name)
+               return -EINVAL;
+       ret = uclass_get(id, &uc);
+       if (ret)
+               return ret;
+
+       list_for_each_entry(dev, &uc->dev_head, uclass_node) {
+               if (!strncmp(dev->name, name, strlen(name))) {
+                       *devp = dev;
+                       return 0;
+               }
+       }
+
+       return -ENODEV;
+}
+
 int uclass_find_device_by_seq(enum uclass_id id, int seq_or_req_seq,
                              bool find_req_seq, struct udevice **devp)
 {
@@ -209,22 +271,13 @@ static int uclass_find_device_by_of_offset(enum uclass_id id, int node,
        return -ENODEV;
 }
 
-/**
- * uclass_get_device_tail() - handle the end of a get_device call
- *
- * This handles returning an error or probing a device as needed.
- *
- * @dev: Device that needs to be probed
- * @ret: Error to return. If non-zero then the device is not probed
- * @devp: Returns the value of 'dev' if there is no error
- * @return ret, if non-zero, else the result of the device_probe() call
- */
-static int uclass_get_device_tail(struct udevice *dev, int ret,
+int uclass_get_device_tail(struct udevice *dev, int ret,
                                  struct udevice **devp)
 {
        if (ret)
                return ret;
 
+       assert(dev);
        ret = device_probe(dev);
        if (ret)
                return ret;
@@ -244,6 +297,17 @@ int uclass_get_device(enum uclass_id id, int index, struct udevice **devp)
        return uclass_get_device_tail(dev, ret, devp);
 }
 
+int uclass_get_device_by_name(enum uclass_id id, const char *name,
+                             struct udevice **devp)
+{
+       struct udevice *dev;
+       int ret;
+
+       *devp = NULL;
+       ret = uclass_find_device_by_name(id, name, &dev);
+       return uclass_get_device_tail(dev, ret, devp);
+}
+
 int uclass_get_device_by_seq(enum uclass_id id, int seq, struct udevice **devp)
 {
        struct udevice *dev;
@@ -274,24 +338,14 @@ int uclass_get_device_by_of_offset(enum uclass_id id, int node,
 
 int uclass_first_device(enum uclass_id id, struct udevice **devp)
 {
-       struct uclass *uc;
        struct udevice *dev;
        int ret;
 
        *devp = NULL;
-       ret = uclass_get(id, &uc);
-       if (ret)
-               return ret;
-       if (list_empty(&uc->dev_head))
+       ret = uclass_find_first_device(id, &dev);
+       if (!dev)
                return 0;
-
-       dev = list_first_entry(&uc->dev_head, struct udevice, uclass_node);
-       ret = device_probe(dev);
-       if (ret)
-               return ret;
-       *devp = dev;
-
-       return 0;
+       return uclass_get_device_tail(dev, ret, devp);
 }
 
 int uclass_next_device(struct udevice **devp)
@@ -300,17 +354,10 @@ int uclass_next_device(struct udevice **devp)
        int ret;
 
        *devp = NULL;
-       if (list_is_last(&dev->uclass_node, &dev->uclass->dev_head))
+       ret = uclass_find_next_device(&dev);
+       if (!dev)
                return 0;
-
-       dev = list_entry(dev->uclass_node.next, struct udevice,
-                        uclass_node);
-       ret = device_probe(dev);
-       if (ret)
-               return ret;
-       *devp = dev;
-
-       return 0;
+       return uclass_get_device_tail(dev, ret, devp);
 }
 
 int uclass_bind_device(struct udevice *dev)
@@ -344,6 +391,7 @@ err:
        return ret;
 }
 
+#ifdef CONFIG_DM_DEVICE_REMOVE
 int uclass_unbind_device(struct udevice *dev)
 {
        struct uclass *uc;
@@ -359,6 +407,7 @@ int uclass_unbind_device(struct udevice *dev)
        list_del(&dev->uclass_node);
        return 0;
 }
+#endif
 
 int uclass_resolve_seq(struct udevice *dev)
 {
@@ -422,6 +471,7 @@ int uclass_post_probe_device(struct udevice *dev)
        return 0;
 }
 
+#ifdef CONFIG_DM_DEVICE_REMOVE
 int uclass_pre_remove_device(struct udevice *dev)
 {
        struct uclass_driver *uc_drv;
@@ -443,3 +493,4 @@ int uclass_pre_remove_device(struct udevice *dev)
 
        return 0;
 }
+#endif
index 690e73dacf6bea41af718be7bbcd680801e863bd..8367c95cf82ba9e9fb0d268afbb17d717c99d0ef 100644 (file)
@@ -313,7 +313,10 @@ static void set_timing_cfg_0(const unsigned int ctrl_num,
 #ifdef CONFIG_SYS_FSL_DDR4
        /* tXP=max(4nCK, 6ns) */
        int txp = max((int)mclk_ps * 4, 6000); /* unit=ps */
-       trwt_mclk = 2;
+       unsigned int data_rate = get_ddr_freq(ctrl_num);
+
+       /* for faster clock, need more time for data setup */
+       trwt_mclk = (data_rate/1000000 > 1900) ? 3 : 2;
        twrt_mclk = 1;
        act_pd_exit_mclk = picos_to_mclk(ctrl_num, txp);
        pre_pd_exit_mclk = act_pd_exit_mclk;
@@ -338,7 +341,7 @@ static void set_timing_cfg_0(const unsigned int ctrl_num,
         */
        txp = max((int)mclk_ps * 3, (mclk_ps > 1540 ? 7500 : 6000));
 
-       ip_rev = fsl_ddr_get_version();
+       ip_rev = fsl_ddr_get_version(ctrl_num);
        if (ip_rev >= 0x40700) {
                /*
                 * MRS_CYC = max(tMRD, tMOD)
@@ -544,7 +547,7 @@ static void set_timing_cfg_1(const unsigned int ctrl_num,
         * we need set extend bit for it at
         * TIMING_CFG_3[EXT_CASLAT]
         */
-       if (fsl_ddr_get_version() <= 0x40400)
+       if (fsl_ddr_get_version(ctrl_num) <= 0x40400)
                caslat_ctrl = 2 * cas_latency - 1;
        else
                caslat_ctrl = (cas_latency - 1) << 1;
@@ -1113,16 +1116,32 @@ static void set_ddr_sdram_mode_9(fsl_ddr_cfg_regs_t *ddr,
        int i;
        unsigned short esdmode4 = 0;    /* Extended SDRAM mode 4 */
        unsigned short esdmode5;        /* Extended SDRAM mode 5 */
+       int rtt_park = 0;
 
-       esdmode5 = 0x00000400;          /* Data mask enabled */
+       if (ddr->cs[0].config & SDRAM_CS_CONFIG_EN) {
+               esdmode5 = 0x00000500;  /* Data mask enable, RTT_PARK CS0 */
+               rtt_park = 1;
+       } else {
+               esdmode5 = 0x00000400;  /* Data mask enabled */
+       }
 
        ddr->ddr_sdram_mode_9 = (0
                                 | ((esdmode4 & 0xffff) << 16)
                                 | ((esdmode5 & 0xffff) << 0)
                                );
+
+       /* only mode_9 use 0x500, others use 0x400 */
+
        debug("FSLDDR: ddr_sdram_mode_9) = 0x%08x\n", ddr->ddr_sdram_mode_9);
        if (unq_mrs_en) {       /* unique mode registers are supported */
                for (i = 1; i < CONFIG_CHIP_SELECTS_PER_CTRL; i++) {
+                       if (!rtt_park &&
+                           (ddr->cs[i].config & SDRAM_CS_CONFIG_EN)) {
+                               esdmode5 |= 0x00000500; /* RTT_PARK */
+                               rtt_park = 1;
+                       } else {
+                               esdmode5 = 0x00000400;
+                       }
                        switch (i) {
                        case 1:
                                ddr->ddr_sdram_mode_11 = (0
@@ -1747,9 +1766,17 @@ static void set_ddr_sdram_clk_cntl(fsl_ddr_cfg_regs_t *ddr,
                                         const memctl_options_t *popts)
 {
        unsigned int clk_adjust;        /* Clock adjust */
+       unsigned int ss_en = 0;         /* Source synchronous enable */
 
+#if defined(CONFIG_MPC8541) || defined(CONFIG_MPC8555)
+       /* Per FSL Application Note: AN2805 */
+       ss_en = 1;
+#endif
        clk_adjust = popts->clk_adjust;
-       ddr->ddr_sdram_clk_cntl = (clk_adjust & 0xF) << 23;
+       ddr->ddr_sdram_clk_cntl = (0
+                                  | ((ss_en & 0x1) << 31)
+                                  | ((clk_adjust & 0xF) << 23)
+                                  );
        debug("FSLDDR: clk_cntl = 0x%08x\n", ddr->ddr_sdram_clk_cntl);
 }
 
@@ -1962,31 +1989,41 @@ static void set_ddr_dq_mapping(fsl_ddr_cfg_regs_t *ddr,
                               const dimm_params_t *dimm_params)
 {
        unsigned int acc_ecc_en = (ddr->ddr_sdram_cfg >> 2) & 0x1;
+       int i;
+
+       for (i = 0; i < CONFIG_DIMM_SLOTS_PER_CTLR; i++) {
+               if (dimm_params[i].n_ranks)
+                       break;
+       }
+       if (i >= CONFIG_DIMM_SLOTS_PER_CTLR) {
+               puts("DDR error: no DIMM found!\n");
+               return;
+       }
 
-       ddr->dq_map_0 = ((dimm_params->dq_mapping[0] & 0x3F) << 26) |
-                       ((dimm_params->dq_mapping[1] & 0x3F) << 20) |
-                       ((dimm_params->dq_mapping[2] & 0x3F) << 14) |
-                       ((dimm_params->dq_mapping[3] & 0x3F) << 8) |
-                       ((dimm_params->dq_mapping[4] & 0x3F) << 2);
+       ddr->dq_map_0 = ((dimm_params[i].dq_mapping[0] & 0x3F) << 26) |
+                       ((dimm_params[i].dq_mapping[1] & 0x3F) << 20) |
+                       ((dimm_params[i].dq_mapping[2] & 0x3F) << 14) |
+                       ((dimm_params[i].dq_mapping[3] & 0x3F) << 8) |
+                       ((dimm_params[i].dq_mapping[4] & 0x3F) << 2);
 
-       ddr->dq_map_1 = ((dimm_params->dq_mapping[5] & 0x3F) << 26) |
-                       ((dimm_params->dq_mapping[6] & 0x3F) << 20) |
-                       ((dimm_params->dq_mapping[7] & 0x3F) << 14) |
-                       ((dimm_params->dq_mapping[10] & 0x3F) << 8) |
-                       ((dimm_params->dq_mapping[11] & 0x3F) << 2);
+       ddr->dq_map_1 = ((dimm_params[i].dq_mapping[5] & 0x3F) << 26) |
+                       ((dimm_params[i].dq_mapping[6] & 0x3F) << 20) |
+                       ((dimm_params[i].dq_mapping[7] & 0x3F) << 14) |
+                       ((dimm_params[i].dq_mapping[10] & 0x3F) << 8) |
+                       ((dimm_params[i].dq_mapping[11] & 0x3F) << 2);
 
-       ddr->dq_map_2 = ((dimm_params->dq_mapping[12] & 0x3F) << 26) |
-                       ((dimm_params->dq_mapping[13] & 0x3F) << 20) |
-                       ((dimm_params->dq_mapping[14] & 0x3F) << 14) |
-                       ((dimm_params->dq_mapping[15] & 0x3F) << 8) |
-                       ((dimm_params->dq_mapping[16] & 0x3F) << 2);
+       ddr->dq_map_2 = ((dimm_params[i].dq_mapping[12] & 0x3F) << 26) |
+                       ((dimm_params[i].dq_mapping[13] & 0x3F) << 20) |
+                       ((dimm_params[i].dq_mapping[14] & 0x3F) << 14) |
+                       ((dimm_params[i].dq_mapping[15] & 0x3F) << 8) |
+                       ((dimm_params[i].dq_mapping[16] & 0x3F) << 2);
 
        /* dq_map for ECC[4:7] is set to 0 if accumulated ECC is enabled */
-       ddr->dq_map_3 = ((dimm_params->dq_mapping[17] & 0x3F) << 26) |
-                       ((dimm_params->dq_mapping[8] & 0x3F) << 20) |
+       ddr->dq_map_3 = ((dimm_params[i].dq_mapping[17] & 0x3F) << 26) |
+                       ((dimm_params[i].dq_mapping[8] & 0x3F) << 20) |
                        (acc_ecc_en ? 0 :
-                        (dimm_params->dq_mapping[9] & 0x3F) << 14) |
-                       dimm_params->dq_mapping_ors;
+                        (dimm_params[i].dq_mapping[9] & 0x3F) << 14) |
+                       dimm_params[i].dq_mapping_ors;
 
        debug("FSLDDR: dq_map_0 = 0x%08x\n", ddr->dq_map_0);
        debug("FSLDDR: dq_map_1 = 0x%08x\n", ddr->dq_map_1);
@@ -2349,7 +2386,7 @@ compute_fsl_memctl_config_regs(const unsigned int ctrl_num,
        set_ddr_cdr1(ddr, popts);
        set_ddr_cdr2(ddr, popts);
        set_ddr_sdram_cfg(ddr, popts, common_dimm);
-       ip_rev = fsl_ddr_get_version();
+       ip_rev = fsl_ddr_get_version(ctrl_num);
        if (ip_rev > 0x40400)
                unq_mrs_en = 1;
 
index bbfb4ee4179fe5b3cf159479afec76b770d0026c..42834ca7b21ed507f4b373bb4b714cff5cc46773 100644 (file)
@@ -135,7 +135,8 @@ unsigned int ddr_compute_dimm_parameters(const unsigned int ctrl_num,
 
        if (spd->mem_type) {
                if (spd->mem_type != SPD_MEMTYPE_DDR4) {
-                       printf("DIMM %u: is not a DDR4 SPD.\n", dimm_number);
+                       printf("Ctrl %u DIMM %u: is not a DDR4 SPD.\n",
+                              ctrl_num, dimm_number);
                        return 1;
                }
        } else {
index d9fce7d2f34b9308fd98de77d5e3a457e253ddd3..49e4688351e224a651bc1b6eaeabc259d34b0a66 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright 2014 Freescale Semiconductor, Inc.
+ * Copyright 2014-2015 Freescale Semiconductor, Inc.
  *
  * SPDX-License-Identifier:    GPL-2.0+
  */
 #include <fsl_immap.h>
 #include <fsl_ddr.h>
 
+#ifdef CONFIG_SYS_FSL_ERRATUM_A008511
+static void set_wait_for_bits_clear(void *ptr, u32 value, u32 bits)
+{
+       int timeout = 1000;
+
+       ddr_out32(ptr, value);
+
+       while (ddr_in32(ptr) & bits) {
+               udelay(100);
+               timeout--;
+       }
+       if (timeout <= 0)
+               puts("Error: A007865 wait for clear timeout.\n");
+}
+#endif /* CONFIG_SYS_FSL_ERRATUM_A008511 */
+
 #if (CONFIG_CHIP_SELECTS_PER_CTRL > 4)
 #error Invalid setting for CONFIG_CHIP_SELECTS_PER_CTRL
 #endif
@@ -36,6 +52,16 @@ void fsl_ddr_set_memctl_regs(const fsl_ddr_cfg_regs_t *regs,
        defined(CONFIG_SYS_FSL_ERRATUM_A008514)
        u32 *eddrtqcr1;
 #endif
+#ifdef CONFIG_SYS_FSL_ERRATUM_A008511
+       u32 temp32, mr6;
+#endif
+#ifdef CONFIG_FSL_DDR_BIST
+       u32 mtcr, err_detect, err_sbe;
+       u32 cs0_bnds, cs1_bnds, cs2_bnds, cs3_bnds, cs0_config;
+#endif
+#ifdef CONFIG_FSL_DDR_BIST
+       char buffer[CONFIG_SYS_CBSIZE];
+#endif
 
        switch (ctrl_num) {
        case 0:
@@ -214,6 +240,21 @@ void fsl_ddr_set_memctl_regs(const fsl_ddr_cfg_regs_t *regs,
                ddr_setbits32(ddr->debug[28], 0x9 << 20);
 #endif
 
+#ifdef CONFIG_SYS_FSL_ERRATUM_A008511
+       /* Part 1 of 2 */
+       /* This erraum only applies to verion 5.2.0 */
+       if (fsl_ddr_get_version(ctrl_num) == 0x50200) {
+               /* Disable DRAM VRef training */
+               ddr_out32(&ddr->ddr_cdr2,
+                         regs->ddr_cdr2 & ~DDR_CDR2_VREF_TRAIN_EN);
+               /* Disable deskew */
+               ddr_out32(&ddr->debug[28], 0x400);
+               /* Disable D_INIT */
+               ddr_out32(&ddr->sdram_cfg_2,
+                         regs->ddr_sdram_cfg_2 & ~SDRAM_CFG2_D_INIT);
+               ddr_out32(&ddr->debug[25], 0x9000);
+       }
+#endif
        /*
         * For RDIMMs, JEDEC spec requires clocks to be stable before reset is
         * deasserted. Clocks start when any chip select is enabled and clock
@@ -261,6 +302,66 @@ step2:
        mb();
        isb();
 
+#ifdef CONFIG_SYS_FSL_ERRATUM_A008511
+       /* Part 2 of 2 */
+       /* This erraum only applies to verion 5.2.0 */
+       if (fsl_ddr_get_version(ctrl_num) == 0x50200) {
+               /* Wait for idle */
+               timeout = 200;
+               while (!(ddr_in32(&ddr->debug[1]) & 0x2) &&
+                      (timeout > 0)) {
+                       udelay(100);
+                       timeout--;
+               }
+               if (timeout <= 0) {
+                       printf("Controler %d timeout, debug_2 = %x\n",
+                              ctrl_num, ddr_in32(&ddr->debug[1]));
+               }
+               /* Set VREF */
+               for (i = 0; i < CONFIG_CHIP_SELECTS_PER_CTRL; i++) {
+                       if (!(regs->cs[i].config & SDRAM_CS_CONFIG_EN))
+                               continue;
+
+                       mr6 = (regs->ddr_sdram_mode_10 >> 16)           |
+                                MD_CNTL_MD_EN                          |
+                                MD_CNTL_CS_SEL(i)                      |
+                                MD_CNTL_MD_SEL(6)                      |
+                                0x00200000;
+                       temp32 = mr6 | 0xc0;
+                       set_wait_for_bits_clear(&ddr->sdram_md_cntl,
+                                               temp32, MD_CNTL_MD_EN);
+                       udelay(1);
+                       debug("MR6 = 0x%08x\n", temp32);
+                       temp32 = mr6 | 0xf0;
+                       set_wait_for_bits_clear(&ddr->sdram_md_cntl,
+                                               temp32, MD_CNTL_MD_EN);
+                       udelay(1);
+                       debug("MR6 = 0x%08x\n", temp32);
+                       temp32 = mr6 | 0x70;
+                       set_wait_for_bits_clear(&ddr->sdram_md_cntl,
+                                               temp32, MD_CNTL_MD_EN);
+                       udelay(1);
+                       debug("MR6 = 0x%08x\n", temp32);
+               }
+               ddr_out32(&ddr->sdram_md_cntl, 0);
+               ddr_out32(&ddr->debug[28], 0);          /* Enable deskew */
+               ddr_out32(&ddr->debug[1], 0x400);       /* restart deskew */
+               /* wait for idle */
+               timeout = 200;
+               while (!(ddr_in32(&ddr->debug[1]) & 0x2) &&
+                      (timeout > 0)) {
+                       udelay(100);
+                       timeout--;
+               }
+               if (timeout <= 0) {
+                       printf("Controler %d timeout, debug_2 = %x\n",
+                              ctrl_num, ddr_in32(&ddr->debug[1]));
+               }
+               /* Restore D_INIT */
+               ddr_out32(&ddr->sdram_cfg_2, regs->ddr_sdram_cfg_2);
+       }
+#endif /* CONFIG_SYS_FSL_ERRATUM_A008511 */
+
        total_gb_size_per_controller = 0;
        for (i = 0; i < CONFIG_CHIP_SELECTS_PER_CTRL; i++) {
                if (!(regs->cs[i].config & 0x80000000))
@@ -309,4 +410,70 @@ step2:
                ddr_out32(&ddr->sdram_cfg_2, temp_sdram_cfg);
        }
 #endif
+
+#ifdef CONFIG_FSL_DDR_BIST
+#define BIST_PATTERN1  0xFFFFFFFF
+#define BIST_PATTERN2  0x0
+#define BIST_CR                0x80010000
+#define BIST_CR_EN     0x80000000
+#define BIST_CR_STAT   0x00000001
+#define CTLR_INTLV_MASK        0x20000000
+       /* Perform build-in test on memory. Three-way interleaving is not yet
+        * supported by this code. */
+       if (getenv_f("ddr_bist", buffer, CONFIG_SYS_CBSIZE) >= 0) {
+               puts("Running BIST test. This will take a while...");
+               cs0_config = ddr_in32(&ddr->cs0_config);
+               if (cs0_config & CTLR_INTLV_MASK) {
+                       cs0_bnds = ddr_in32(&cs0_bnds);
+                       cs1_bnds = ddr_in32(&cs1_bnds);
+                       cs2_bnds = ddr_in32(&cs2_bnds);
+                       cs3_bnds = ddr_in32(&cs3_bnds);
+                       /* set bnds to non-interleaving */
+                       ddr_out32(&cs0_bnds, (cs0_bnds & 0xfffefffe) >> 1);
+                       ddr_out32(&cs1_bnds, (cs1_bnds & 0xfffefffe) >> 1);
+                       ddr_out32(&cs2_bnds, (cs2_bnds & 0xfffefffe) >> 1);
+                       ddr_out32(&cs3_bnds, (cs3_bnds & 0xfffefffe) >> 1);
+               }
+               ddr_out32(&ddr->mtp1, BIST_PATTERN1);
+               ddr_out32(&ddr->mtp2, BIST_PATTERN1);
+               ddr_out32(&ddr->mtp3, BIST_PATTERN2);
+               ddr_out32(&ddr->mtp4, BIST_PATTERN2);
+               ddr_out32(&ddr->mtp5, BIST_PATTERN1);
+               ddr_out32(&ddr->mtp6, BIST_PATTERN1);
+               ddr_out32(&ddr->mtp7, BIST_PATTERN2);
+               ddr_out32(&ddr->mtp8, BIST_PATTERN2);
+               ddr_out32(&ddr->mtp9, BIST_PATTERN1);
+               ddr_out32(&ddr->mtp10, BIST_PATTERN2);
+               mtcr = BIST_CR;
+               ddr_out32(&ddr->mtcr, mtcr);
+               timeout = 100;
+               while (timeout > 0 && (mtcr & BIST_CR_EN)) {
+                       mdelay(1000);
+                       timeout--;
+                       mtcr = ddr_in32(&ddr->mtcr);
+               }
+               if (timeout <= 0)
+                       puts("Timeout\n");
+               else
+                       puts("Done\n");
+               err_detect = ddr_in32(&ddr->err_detect);
+               err_sbe = ddr_in32(&ddr->err_sbe);
+               if (mtcr & BIST_CR_STAT) {
+                       printf("BIST test failed on controller %d.\n",
+                              ctrl_num);
+               }
+               if (err_detect || (err_sbe & 0xffff)) {
+                       printf("ECC error detected on controller %d.\n",
+                              ctrl_num);
+               }
+
+               if (cs0_config & CTLR_INTLV_MASK) {
+                       /* restore bnds registers */
+                       ddr_out32(&cs0_bnds, cs0_bnds);
+                       ddr_out32(&cs1_bnds, cs1_bnds);
+                       ddr_out32(&cs2_bnds, cs2_bnds);
+                       ddr_out32(&cs3_bnds, cs3_bnds);
+               }
+       }
+#endif
 }
index 32ba6d820b6c207578de19a6ca157469169e6c3a..d23e6e5b977e9cc25d74203f5b9fe91a02a2000a 100644 (file)
@@ -205,6 +205,8 @@ static void lowest_common_dimm_parameters_edit(fsl_ddr_info_t *pinfo,
 
 #define DIMM_PARM(x) {#x, offsetof(dimm_params_t, x), \
        sizeof((dimm_params_t *)0)->x, 0}
+#define DIMM_PARM_HEX(x) {#x, offsetof(dimm_params_t, x), \
+       sizeof((dimm_params_t *)0)->x, 1}
 
 static void fsl_ddr_dimm_parameters_edit(fsl_ddr_info_t *pinfo,
                                   unsigned int ctrl_num,
@@ -220,6 +222,7 @@ static void fsl_ddr_dimm_parameters_edit(fsl_ddr_info_t *pinfo,
                DIMM_PARM(primary_sdram_width),
                DIMM_PARM(ec_sdram_width),
                DIMM_PARM(registered_dimm),
+               DIMM_PARM(mirrored_dimm),
                DIMM_PARM(device_width),
 
                DIMM_PARM(n_row_addr),
@@ -274,7 +277,27 @@ static void fsl_ddr_dimm_parameters_edit(fsl_ddr_info_t *pinfo,
                DIMM_PARM(tdqsq_max_ps),
                DIMM_PARM(tqhs_ps),
 #endif
-
+#ifdef CONFIG_SYS_FSL_DDR4
+               DIMM_PARM_HEX(dq_mapping[0]),
+               DIMM_PARM_HEX(dq_mapping[1]),
+               DIMM_PARM_HEX(dq_mapping[2]),
+               DIMM_PARM_HEX(dq_mapping[3]),
+               DIMM_PARM_HEX(dq_mapping[4]),
+               DIMM_PARM_HEX(dq_mapping[5]),
+               DIMM_PARM_HEX(dq_mapping[6]),
+               DIMM_PARM_HEX(dq_mapping[7]),
+               DIMM_PARM_HEX(dq_mapping[8]),
+               DIMM_PARM_HEX(dq_mapping[9]),
+               DIMM_PARM_HEX(dq_mapping[10]),
+               DIMM_PARM_HEX(dq_mapping[11]),
+               DIMM_PARM_HEX(dq_mapping[12]),
+               DIMM_PARM_HEX(dq_mapping[13]),
+               DIMM_PARM_HEX(dq_mapping[14]),
+               DIMM_PARM_HEX(dq_mapping[15]),
+               DIMM_PARM_HEX(dq_mapping[16]),
+               DIMM_PARM_HEX(dq_mapping[17]),
+               DIMM_PARM(dq_mapping_ors),
+#endif
                DIMM_PARM(rank_density),
                DIMM_PARM(capacity),
                DIMM_PARM(base_address),
@@ -296,6 +319,7 @@ static void print_dimm_parameters(const dimm_params_t *pdimm)
                DIMM_PARM(primary_sdram_width),
                DIMM_PARM(ec_sdram_width),
                DIMM_PARM(registered_dimm),
+               DIMM_PARM(mirrored_dimm),
                DIMM_PARM(device_width),
 
                DIMM_PARM(n_row_addr),
@@ -314,6 +338,7 @@ static void print_dimm_parameters(const dimm_params_t *pdimm)
                DIMM_PARM(tckmax_ps),
 
                DIMM_PARM(caslat_x),
+               DIMM_PARM_HEX(caslat_x),
                DIMM_PARM(taa_ps),
                DIMM_PARM(caslat_x_minus_1),
                DIMM_PARM(caslat_x_minus_2),
@@ -322,6 +347,9 @@ static void print_dimm_parameters(const dimm_params_t *pdimm)
                DIMM_PARM(trcd_ps),
                DIMM_PARM(trp_ps),
                DIMM_PARM(tras_ps),
+#if defined(CONFIG_SYS_FSL_DDR4) || defined(CONFIG_SYS_FSL_DDR3)
+               DIMM_PARM(tfaw_ps),
+#endif
 #ifdef CONFIG_SYS_FSL_DDR4
                DIMM_PARM(trfc1_ps),
                DIMM_PARM(trfc2_ps),
@@ -346,6 +374,27 @@ static void print_dimm_parameters(const dimm_params_t *pdimm)
                DIMM_PARM(tdh_ps),
                DIMM_PARM(tdqsq_max_ps),
                DIMM_PARM(tqhs_ps),
+#endif
+#ifdef CONFIG_SYS_FSL_DDR4
+               DIMM_PARM_HEX(dq_mapping[0]),
+               DIMM_PARM_HEX(dq_mapping[1]),
+               DIMM_PARM_HEX(dq_mapping[2]),
+               DIMM_PARM_HEX(dq_mapping[3]),
+               DIMM_PARM_HEX(dq_mapping[4]),
+               DIMM_PARM_HEX(dq_mapping[5]),
+               DIMM_PARM_HEX(dq_mapping[6]),
+               DIMM_PARM_HEX(dq_mapping[7]),
+               DIMM_PARM_HEX(dq_mapping[8]),
+               DIMM_PARM_HEX(dq_mapping[9]),
+               DIMM_PARM_HEX(dq_mapping[10]),
+               DIMM_PARM_HEX(dq_mapping[11]),
+               DIMM_PARM_HEX(dq_mapping[12]),
+               DIMM_PARM_HEX(dq_mapping[13]),
+               DIMM_PARM_HEX(dq_mapping[14]),
+               DIMM_PARM_HEX(dq_mapping[15]),
+               DIMM_PARM_HEX(dq_mapping[16]),
+               DIMM_PARM_HEX(dq_mapping[17]),
+               DIMM_PARM(dq_mapping_ors),
 #endif
        };
        static const unsigned int n_opts = ARRAY_SIZE(options);
@@ -463,7 +512,7 @@ static void fsl_ddr_options_edit(fsl_ddr_info_t *pinfo,
                CTRL_OPTIONS_CS(3, odt_rd_cfg),
                CTRL_OPTIONS_CS(3, odt_wr_cfg),
 #endif
-#if defined(CONFIG_SYS_FSL_DDR3)
+#if defined(CONFIG_SYS_FSL_DDR3) || defined(CONFIG_SYS_FSL_DDR4)
                CTRL_OPTIONS_CS(0, odt_rtt_norm),
                CTRL_OPTIONS_CS(0, odt_rtt_wr),
 #if (CONFIG_CHIP_SELECTS_PER_CTRL > 1)
@@ -753,7 +802,7 @@ static void print_memctl_options(const memctl_options_t *popts)
                CTRL_OPTIONS_CS(3, odt_rd_cfg),
                CTRL_OPTIONS_CS(3, odt_wr_cfg),
 #endif
-#if defined(CONFIG_SYS_FSL_DDR3)
+#if defined(CONFIG_SYS_FSL_DDR3) || defined(CONFIG_SYS_FSL_DDR4)
                CTRL_OPTIONS_CS(0, odt_rtt_norm),
                CTRL_OPTIONS_CS(0, odt_rtt_wr),
 #if (CONFIG_CHIP_SELECTS_PER_CTRL > 1)
@@ -795,6 +844,7 @@ static void print_memctl_options(const memctl_options_t *popts)
                CTRL_OPTIONS(twot_en),
                CTRL_OPTIONS(threet_en),
                CTRL_OPTIONS(registered_dimm_en),
+               CTRL_OPTIONS(mirrored_dimm),
                CTRL_OPTIONS(ap_en),
                CTRL_OPTIONS(x4_en),
                CTRL_OPTIONS(bstopre),
index b295344c4dedeb6de2ea8ae7c3513cc60b51e55c..b12eeb9f01cc19081ead2d2c162099f8e3e49ff9 100644 (file)
@@ -22,7 +22,7 @@ compute_cas_latency(const unsigned int ctrl_num,
        unsigned int common_caslat;
        unsigned int caslat_actual;
        unsigned int retry = 16;
-       unsigned int tmp;
+       unsigned int tmp = ~0;
        const unsigned int mclk_ps = get_memory_clk_period_ps(ctrl_num);
 #ifdef CONFIG_SYS_FSL_DDR3
        const unsigned int taamax = 20000;
@@ -31,8 +31,7 @@ compute_cas_latency(const unsigned int ctrl_num,
 #endif
 
        /* compute the common CAS latency supported between slots */
-       tmp = dimm_params[0].caslat_x;
-       for (i = 1; i < number_of_dimms; i++) {
+       for (i = 0; i < number_of_dimms; i++) {
                if (dimm_params[i].n_ranks)
                        tmp &= dimm_params[i].caslat_x;
        }
index b72b24290ec911acadfa9186062fbd08c72c7eac..fa223834f28d79e9c5518ee6682359066f3205c4 100644 (file)
@@ -453,7 +453,7 @@ fsl_ddr_compute(fsl_ddr_info_t *pinfo, unsigned int start_step,
                                retval = compute_dimm_parameters(
                                                        i, spd, pdimm, j);
 #ifdef CONFIG_SYS_DDR_RAW_TIMING
-                               if (!i && !j && retval) {
+                               if (!j && retval) {
                                        printf("SPD error on controller %d! "
                                        "Trying fallback to raw timing "
                                        "calculation\n", i);
index 5beb11b02b429a8d3f69a23355991ab9ccc813b5..3b30fa284c49fc2a2194d5f0a19fc7565bcc4bdb 100644 (file)
@@ -728,7 +728,12 @@ unsigned int populate_memctl_options(int all_dimms_registered,
 
        /* Choose ddr controller address mirror mode */
 #if defined(CONFIG_SYS_FSL_DDR3) || defined(CONFIG_SYS_FSL_DDR4)
-       popts->mirrored_dimm = pdimm[0].mirrored_dimm;
+       for (i = 0; i < CONFIG_DIMM_SLOTS_PER_CTLR; i++) {
+               if (pdimm[i].n_ranks) {
+                       popts->mirrored_dimm = pdimm[i].mirrored_dimm;
+                       break;
+               }
+       }
 #endif
 
        /* Global Timing Parameters. */
index 664081b1b8369ae57fb7e32634ee2a839711c9d1..ce55aea1b48e51084e8499c356cc4eb457a23a20 100644 (file)
 
 #define ULL_8FS 0xFFFFFFFFULL
 
-u32 fsl_ddr_get_version(void)
+u32 fsl_ddr_get_version(unsigned int ctrl_num)
 {
        struct ccsr_ddr __iomem *ddr;
        u32 ver_major_minor_errata;
 
-       ddr = (void *)_DDR_ADDR;
+       switch (ctrl_num) {
+       case 0:
+               ddr = (void *)CONFIG_SYS_FSL_DDR_ADDR;
+               break;
+#if defined(CONFIG_SYS_FSL_DDR2_ADDR) && (CONFIG_NUM_DDR_CONTROLLERS > 1)
+       case 1:
+               ddr = (void *)CONFIG_SYS_FSL_DDR2_ADDR;
+               break;
+#endif
+#if defined(CONFIG_SYS_FSL_DDR3_ADDR) && (CONFIG_NUM_DDR_CONTROLLERS > 2)
+       case 2:
+               ddr = (void *)CONFIG_SYS_FSL_DDR3_ADDR;
+               break;
+#endif
+#if defined(CONFIG_SYS_FSL_DDR4_ADDR) && (CONFIG_NUM_DDR_CONTROLLERS > 3)
+       case 3:
+               ddr = (void *)CONFIG_SYS_FSL_DDR4_ADDR;
+               break;
+#endif
+       default:
+               printf("%s unexpected ctrl_num = %u\n", __func__, ctrl_num);
+               return 0;
+       }
        ver_major_minor_errata = (ddr_in32(&ddr->ip_rev1) & 0xFFFF) << 8;
        ver_major_minor_errata |= (ddr_in32(&ddr->ip_rev2) & 0xFF00) >> 8;
 
@@ -212,7 +234,7 @@ void print_ddr_info(unsigned int start_ctrl)
 
        /* Calculate CAS latency based on timing cfg values */
        cas_lat = ((ddr_in32(&ddr->timing_cfg_1) >> 16) & 0xf);
-       if (fsl_ddr_get_version() <= 0x40400)
+       if (fsl_ddr_get_version(0) <= 0x40400)
                cas_lat += 1;
        else
                cas_lat += 2;
index 85f71c5d4a773172ece61eecc3f9af6640231925..8ca8b05ebff8c26aef5ec356f1a455137377f29b 100644 (file)
@@ -42,3 +42,4 @@ obj-$(CONFIG_TCA642X)         += tca642x.o
 oby-$(CONFIG_SX151X)           += sx151x.o
 obj-$(CONFIG_SUNXI_GPIO)       += sunxi_gpio.o
 obj-$(CONFIG_LPC32XX_GPIO)     += lpc32xx_gpio.o
+obj-$(CONFIG_STM32_GPIO)       += stm32_gpio.o
index a3f17a0c311fff547b418ee9f84e929258a33ef2..1de739568ab896f547aa912d83b4c4f0ddfad387 100644 (file)
@@ -14,9 +14,8 @@
 
 #include <common.h>
 
-#ifdef CONFIG_SHEEVA_88SV331xV5
 /*
- * GPIO Register map for SHEEVA 88SV331xV5
+ * GPIO Register map for Marvell SOCs
  */
 struct gpio_reg {
        u32 gplr;       /* Pin Level Register - 0x0000 */
@@ -51,8 +50,5 @@ struct gpio_reg {
        u32 pad12[2];
        u32 apmask;     /* Bitwise Mask of Edge Detect Register - 0x009C */
 };
-#else
-#error "CPU core subversion not defined"
-#endif
 
 #endif /* __MVGPIO_H__ */
index 97bbe996f790dafd4374ce59c00090b72b8351f4..43ecf6610ce66baf8524faebf64b18ae7aad1121 100644 (file)
@@ -43,18 +43,8 @@ void mfp_config(u32 *mfp_cfgs)
 
                /* Write a mfg register as per configuration */
                val = 0;
-               if (cfg_val & MFP_AF_FLAG)
-                       /* Abstract and program Afternate-Func Selection */
-                       val |= cfg_val & MFP_AF_MASK;
-               if (cfg_val & MFP_EDGE_FLAG)
-                       /* Abstract and program Edge configuration */
-                       val |= cfg_val & MFP_LPM_EDGE_MASK;
-               if (cfg_val & MFP_DRIVE_FLAG)
-                       /* Abstract and program Drive configuration */
-                       val |= cfg_val & MFP_DRIVE_MASK;
-               if (cfg_val & MFP_PULL_FLAG)
-                       /* Abstract and program Pullup/down configuration */
-                       val |= cfg_val & MFP_PULL_MASK;
+               if (cfg_val & MFP_VALUE_MASK)
+                       val |= cfg_val & MFP_VALUE_MASK;
 
                writel(val, p_mfpr);
        } while (1);
diff --git a/drivers/gpio/stm32_gpio.c b/drivers/gpio/stm32_gpio.c
new file mode 100644 (file)
index 0000000..d3497e9
--- /dev/null
@@ -0,0 +1,199 @@
+/*
+ * (C) Copyright 2011
+ * Yuri Tikhonov, Emcraft Systems, yur@emcraft.com
+ *
+ * (C) Copyright 2015
+ * Kamil Lulko, <rev13@wp.pl>
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#include <common.h>
+#include <asm/io.h>
+#include <asm/errno.h>
+#include <asm/arch/stm32.h>
+#include <asm/arch/gpio.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+#define STM32_GPIOA_BASE       (STM32_AHB1PERIPH_BASE + 0x0000)
+#define STM32_GPIOB_BASE       (STM32_AHB1PERIPH_BASE + 0x0400)
+#define STM32_GPIOC_BASE       (STM32_AHB1PERIPH_BASE + 0x0800)
+#define STM32_GPIOD_BASE       (STM32_AHB1PERIPH_BASE + 0x0C00)
+#define STM32_GPIOE_BASE       (STM32_AHB1PERIPH_BASE + 0x1000)
+#define STM32_GPIOF_BASE       (STM32_AHB1PERIPH_BASE + 0x1400)
+#define STM32_GPIOG_BASE       (STM32_AHB1PERIPH_BASE + 0x1800)
+#define STM32_GPIOH_BASE       (STM32_AHB1PERIPH_BASE + 0x1C00)
+#define STM32_GPIOI_BASE       (STM32_AHB1PERIPH_BASE + 0x2000)
+
+static const unsigned long io_base[] = {
+       STM32_GPIOA_BASE, STM32_GPIOB_BASE, STM32_GPIOC_BASE,
+       STM32_GPIOD_BASE, STM32_GPIOE_BASE, STM32_GPIOF_BASE,
+       STM32_GPIOG_BASE, STM32_GPIOH_BASE, STM32_GPIOI_BASE
+};
+
+struct stm32_gpio_regs {
+       u32 moder;      /* GPIO port mode */
+       u32 otyper;     /* GPIO port output type */
+       u32 ospeedr;    /* GPIO port output speed */
+       u32 pupdr;      /* GPIO port pull-up/pull-down */
+       u32 idr;        /* GPIO port input data */
+       u32 odr;        /* GPIO port output data */
+       u32 bsrr;       /* GPIO port bit set/reset */
+       u32 lckr;       /* GPIO port configuration lock */
+       u32 afr[2];     /* GPIO alternate function */
+};
+
+#define CHECK_DSC(x)   (!x || x->port > 8 || x->pin > 15)
+#define CHECK_CTL(x)   (!x || x->af > 15 || x->mode > 3 || x->otype > 1 || \
+                       x->pupd > 2 || x->speed > 3)
+
+int stm32_gpio_config(const struct stm32_gpio_dsc *dsc,
+               const struct stm32_gpio_ctl *ctl)
+{
+       struct stm32_gpio_regs *gpio_regs;
+       u32 i;
+       int rv;
+
+       if (CHECK_DSC(dsc)) {
+               rv = -EINVAL;
+               goto out;
+       }
+       if (CHECK_CTL(ctl)) {
+               rv = -EINVAL;
+               goto out;
+       }
+
+       gpio_regs = (struct stm32_gpio_regs *)io_base[dsc->port];
+
+       setbits_le32(&STM32_RCC->ahb1enr, 1 << dsc->port);
+
+       i = (dsc->pin & 0x07) * 4;
+       clrbits_le32(&gpio_regs->afr[dsc->pin >> 3], (0xF << i));
+       setbits_le32(&gpio_regs->afr[dsc->pin >> 3], ctl->af << i);
+
+       i = dsc->pin * 2;
+
+       clrbits_le32(&gpio_regs->moder, (0x3 << i));
+       setbits_le32(&gpio_regs->moder, ctl->mode << i);
+
+       clrbits_le32(&gpio_regs->otyper, (0x3 << i));
+       setbits_le32(&gpio_regs->otyper, ctl->otype << i);
+
+       clrbits_le32(&gpio_regs->ospeedr, (0x3 << i));
+       setbits_le32(&gpio_regs->ospeedr, ctl->speed << i);
+
+       clrbits_le32(&gpio_regs->pupdr, (0x3 << i));
+       setbits_le32(&gpio_regs->pupdr, ctl->pupd << i);
+
+       rv = 0;
+out:
+       return rv;
+}
+
+int stm32_gpout_set(const struct stm32_gpio_dsc *dsc, int state)
+{
+       struct stm32_gpio_regs  *gpio_regs;
+       int rv;
+
+       if (CHECK_DSC(dsc)) {
+               rv = -EINVAL;
+               goto out;
+       }
+
+       gpio_regs = (struct stm32_gpio_regs *)io_base[dsc->port];
+
+       if (state)
+               writel(1 << dsc->pin, &gpio_regs->bsrr);
+       else
+               writel(1 << (dsc->pin + 16), &gpio_regs->bsrr);
+
+       rv = 0;
+out:
+       return rv;
+}
+
+int stm32_gpin_get(const struct stm32_gpio_dsc *dsc)
+{
+       struct stm32_gpio_regs  *gpio_regs;
+       int rv;
+
+       if (CHECK_DSC(dsc)) {
+               rv = -EINVAL;
+               goto out;
+       }
+
+       gpio_regs = (struct stm32_gpio_regs *)io_base[dsc->port];
+       rv = readl(&gpio_regs->idr) & (1 << dsc->pin);
+out:
+       return rv;
+}
+
+/* Common GPIO API */
+
+int gpio_request(unsigned gpio, const char *label)
+{
+       return 0;
+}
+
+int gpio_free(unsigned gpio)
+{
+       return 0;
+}
+
+int gpio_direction_input(unsigned gpio)
+{
+       struct stm32_gpio_dsc dsc;
+       struct stm32_gpio_ctl ctl;
+
+       dsc.port = stm32_gpio_to_port(gpio);
+       dsc.pin = stm32_gpio_to_pin(gpio);
+       ctl.af = STM32_GPIO_AF0;
+       ctl.mode = STM32_GPIO_MODE_IN;
+       ctl.pupd = STM32_GPIO_PUPD_NO;
+       ctl.speed = STM32_GPIO_SPEED_50M;
+
+       return stm32_gpio_config(&dsc, &ctl);
+}
+
+int gpio_direction_output(unsigned gpio, int value)
+{
+       struct stm32_gpio_dsc dsc;
+       struct stm32_gpio_ctl ctl;
+       int res;
+
+       dsc.port = stm32_gpio_to_port(gpio);
+       dsc.pin = stm32_gpio_to_pin(gpio);
+       ctl.af = STM32_GPIO_AF0;
+       ctl.mode = STM32_GPIO_MODE_OUT;
+       ctl.otype = STM32_GPIO_OTYPE_PP;
+       ctl.pupd = STM32_GPIO_PUPD_NO;
+       ctl.speed = STM32_GPIO_SPEED_50M;
+
+       res = stm32_gpio_config(&dsc, &ctl);
+       if (res < 0)
+               goto out;
+       res = stm32_gpout_set(&dsc, value);
+out:
+       return res;
+}
+
+int gpio_get_value(unsigned gpio)
+{
+       struct stm32_gpio_dsc dsc;
+
+       dsc.port = stm32_gpio_to_port(gpio);
+       dsc.pin = stm32_gpio_to_pin(gpio);
+
+       return stm32_gpin_get(&dsc);
+}
+
+int gpio_set_value(unsigned gpio, int value)
+{
+       struct stm32_gpio_dsc dsc;
+
+       dsc.port = stm32_gpio_to_port(gpio);
+       dsc.pin = stm32_gpio_to_pin(gpio);
+
+       return stm32_gpout_set(&dsc, value);
+}
index fc5ee35a1ad9ec421de06ae6ba854289eac0bc52..42782cb1ace611779cd745ee3077af0165ed1d09 100644 (file)
@@ -114,6 +114,9 @@ static u16 i2c_clk_div[50][2] = {
 #ifndef CONFIG_SYS_MXC_I2C3_SPEED
 #define CONFIG_SYS_MXC_I2C3_SPEED 100000
 #endif
+#ifndef CONFIG_SYS_MXC_I2C4_SPEED
+#define CONFIG_SYS_MXC_I2C4_SPEED 100000
+#endif
 
 #ifndef CONFIG_SYS_MXC_I2C1_SLAVE
 #define CONFIG_SYS_MXC_I2C1_SLAVE 0
@@ -124,6 +127,9 @@ static u16 i2c_clk_div[50][2] = {
 #ifndef CONFIG_SYS_MXC_I2C3_SLAVE
 #define CONFIG_SYS_MXC_I2C3_SLAVE 0
 #endif
+#ifndef CONFIG_SYS_MXC_I2C4_SLAVE
+#define CONFIG_SYS_MXC_I2C4_SLAVE 0
+#endif
 
 
 /*
@@ -543,12 +549,17 @@ U_BOOT_I2C_ADAP_COMPLETE(mxc1, mxc_i2c_init, mxc_i2c_probe,
                         mxc_i2c_set_bus_speed,
                         CONFIG_SYS_MXC_I2C2_SPEED,
                         CONFIG_SYS_MXC_I2C2_SLAVE, 1)
-#if defined(CONFIG_MX31) || defined(CONFIG_MX35) ||\
-       defined(CONFIG_MX51) || defined(CONFIG_MX53) ||\
-       defined(CONFIG_MX6) || defined(CONFIG_LS102XA)
+#ifdef CONFIG_SYS_I2C_MXC_I2C3
 U_BOOT_I2C_ADAP_COMPLETE(mxc2, mxc_i2c_init, mxc_i2c_probe,
                         mxc_i2c_read, mxc_i2c_write,
                         mxc_i2c_set_bus_speed,
                         CONFIG_SYS_MXC_I2C3_SPEED,
                         CONFIG_SYS_MXC_I2C3_SLAVE, 2)
 #endif
+#ifdef CONFIG_SYS_I2C_MXC_I2C4
+U_BOOT_I2C_ADAP_COMPLETE(mxc3, mxc_i2c_init, mxc_i2c_probe,
+                        mxc_i2c_read, mxc_i2c_write,
+                        mxc_i2c_set_bus_speed,
+                        CONFIG_SYS_MXC_I2C4_SPEED,
+                        CONFIG_SYS_MXC_I2C4_SLAVE, 3)
+#endif
index 842209a2eca8a4275b58c98120b6eca3b2979201..25630c3f2b42cbd30508fa171ad8cd4f11928a96 100644 (file)
@@ -13,6 +13,7 @@ obj-$(CONFIG_CROS_EC_LPC) += cros_ec_lpc.o
 obj-$(CONFIG_CROS_EC_I2C) += cros_ec_i2c.o
 obj-$(CONFIG_CROS_EC_SANDBOX) += cros_ec_sandbox.o
 obj-$(CONFIG_CROS_EC_SPI) += cros_ec_spi.o
+obj-$(CONFIG_FSL_DEBUG_SERVER) += fsl_debug_server.o
 obj-$(CONFIG_FSL_IIM) += fsl_iim.o
 obj-$(CONFIG_GPIO_LED) += gpio_led.o
 obj-$(CONFIG_I2C_EEPROM) += i2c_eeprom.o
diff --git a/drivers/misc/fsl_debug_server.c b/drivers/misc/fsl_debug_server.c
new file mode 100644 (file)
index 0000000..e080fe6
--- /dev/null
@@ -0,0 +1,246 @@
+/*
+ * Copyright (C) 2014 Freescale Semiconductor
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#include <common.h>
+#include <errno.h>
+#include <asm/io.h>
+#include <asm/system.h>
+#include <asm/arch-fsl-lsch3/immap_lsch3.h>
+
+#include <fsl_debug_server.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+static int debug_server_ver_info_maj, debug_server_ver_info_min;
+
+/**
+ * Copying Debug Server firmware to DDR
+ */
+static int debug_server_copy_image(const char *title, u64 image_addr,
+                                  u32 image_size, u64 debug_server_ram_addr)
+{
+       debug("%s copied to address %p\n", title,
+             (void *)debug_server_ram_addr);
+       memcpy((void *)debug_server_ram_addr, (void *)image_addr, image_size);
+
+       return 0;
+}
+
+/**
+ * Debug Server FIT image parser checks if the image is in FIT
+ * format, verifies integrity of the image and calculates
+ * raw image address and size values.
+ *
+ * Returns 0 if success and -1 if any of the above mentioned
+ * task fail.
+ **/
+int debug_server_parse_firmware_fit_image(const void **raw_image_addr,
+                                         size_t *raw_image_size)
+{
+       int format;
+       void *fit_hdr;
+       int node_offset;
+       const void *data;
+       size_t size;
+       const char *uname = "firmware";
+       char *desc;
+       char *debug_server_ver_info;
+       char *debug_server_ver_info_major, *debug_server_ver_info_minor;
+
+       /* Check if the image is in NOR flash */
+#ifdef CONFIG_SYS_DEBUG_SERVER_FW_IN_NOR
+       fit_hdr = (void *)CONFIG_SYS_DEBUG_SERVER_FW_ADDR;
+#else
+#error "CONFIG_SYS_DEBUG_SERVER_FW_IN_NOR not defined"
+#endif
+
+       /* Check if Image is in FIT format */
+       format = genimg_get_format(fit_hdr);
+       if (format != IMAGE_FORMAT_FIT) {
+               printf("Error! Not a FIT image\n");
+               goto out_error;
+       }
+
+       if (!fit_check_format(fit_hdr)) {
+               printf("Error! Bad FIT image format\n");
+               goto out_error;
+       }
+
+       node_offset = fit_image_get_node(fit_hdr, uname);
+       if (node_offset < 0) {
+               printf("Error! Can not find %s subimage\n", uname);
+               goto out_error;
+       }
+
+       /* Verify Debug Server firmware image */
+       if (!fit_image_verify(fit_hdr, node_offset)) {
+               printf("Error! Bad Debug Server firmware hash");
+               goto out_error;
+       }
+
+       if (fit_get_desc(fit_hdr, node_offset, &desc) < 0) {
+               printf("Error! Failed to get Debug Server fw description");
+               goto out_error;
+       }
+
+       debug_server_ver_info = strstr(desc, "Version");
+       debug_server_ver_info_major = strtok(debug_server_ver_info, ".");
+       debug_server_ver_info_minor = strtok(NULL, ".");
+
+       debug_server_ver_info_maj =
+                       simple_strtoul(debug_server_ver_info_major, NULL, 10);
+       debug_server_ver_info_min =
+                       simple_strtoul(debug_server_ver_info_minor, NULL, 10);
+
+       /* Debug server version checking */
+       if ((debug_server_ver_info_maj < DEBUG_SERVER_VER_MAJOR) ||
+           (debug_server_ver_info_min < DEBUG_SERVER_VER_MINOR)) {
+               printf("Debug server FW mismatches the min version required\n");
+               printf("Expected:%d.%d, Got %d.%d\n",
+                      DEBUG_SERVER_VER_MAJOR, DEBUG_SERVER_VER_MINOR,
+                      debug_server_ver_info_maj,
+                      debug_server_ver_info_min);
+               goto out_error;
+       }
+
+       /* Get address and size of raw image */
+       fit_image_get_data(fit_hdr, node_offset, &data, &size);
+
+       *raw_image_addr = data;
+       *raw_image_size = size;
+
+       return 0;
+
+out_error:
+       return -1;
+}
+
+/**
+ * Return the actual size of the Debug Server private DRAM block.
+ *
+ * NOTE: For now this function always returns the minimum required size,
+ * However, in the future, the actual size may be obtained from an environment
+ * variable.
+ */
+unsigned long debug_server_get_dram_block_size(void)
+{
+       return CONFIG_SYS_DEBUG_SERVER_DRAM_BLOCK_MIN_SIZE;
+}
+
+int debug_server_init(void)
+{
+       struct ccsr_gur __iomem *gur = (void *)(CONFIG_SYS_FSL_GUTS_ADDR);
+       int error, timeout = CONFIG_SYS_DEBUG_SERVER_TIMEOUT;
+       int debug_server_boot_status;
+       u64 debug_server_ram_addr, debug_server_ram_size;
+       const void *raw_image_addr;
+       size_t raw_image_size = 0;
+
+       debug("debug_server_init called\n");
+       /*
+        * The Debug Server private DRAM block was already carved at the end of
+        * DRAM by board_init_f() using CONFIG_SYS_MEM_TOP_HIDE:
+        */
+       debug_server_ram_size = debug_server_get_dram_block_size();
+       if (gd->bd->bi_dram[1].start)
+               debug_server_ram_addr =
+                       gd->bd->bi_dram[1].start + gd->bd->bi_dram[1].size;
+       else
+               debug_server_ram_addr =
+                       gd->bd->bi_dram[0].start + gd->bd->bi_dram[0].size;
+
+       error = debug_server_parse_firmware_fit_image(&raw_image_addr,
+                                                       &raw_image_size);
+       if (error != 0)
+               goto out;
+
+       debug("debug server (ram addr = 0x%llx, ram size = 0x%llx)\n",
+             debug_server_ram_addr, debug_server_ram_size);
+       /*
+        * Load the Debug Server FW at the beginning of the Debug Server
+        * private DRAM block:
+        */
+       debug_server_copy_image("Debug Server Firmware",
+                               (u64)raw_image_addr, raw_image_size,
+                               debug_server_ram_addr);
+
+       /* flush dcache */
+       flush_dcache_range((unsigned long)debug_server_ram_addr,
+                          (unsigned long)debug_server_ram_addr +
+                          (unsigned long)debug_server_ram_size);
+
+       /*
+        * Tell SP that the Debug Server FW is about to be launched. Before that
+        * populate the following:
+        * 1. Write the size allocated to SP Memory region into Bits {31:16} of
+        *    SCRATCHRW5.
+        * 2. Write the start address of the SP memory regions into
+        *    SCRATCHRW5 (Bits {15:0}, contain most significant bits, Bits
+        *    {47:32} of the SP Memory Region physical start address
+        *    (SoC address)) and SCRATCHRW6 (Bits {31:0}).
+        * 3. To know the Debug Server FW boot status, set bit 0 of SCRATCHRW11
+        *    to 1. The Debug Server sets this to 0 to indicate a
+        *    successul boot.
+        * 4. Wakeup SP by writing 0x1F to VSG GIC reg VIGR2.
+        */
+
+       /* 512 MB */
+       out_le32(&gur->scratchrw[5 - 1],
+                (u32)((u64)debug_server_ram_addr >> 32) | (0x000D << 16));
+       out_le32(&gur->scratchrw[6 - 1],
+                ((u32)debug_server_ram_addr) & 0xFFFFFFFF);
+
+       out_le32(&gur->scratchrw[11 - 1], DEBUG_SERVER_INIT_STATUS);
+       /* Allow the changes to reflect in GUR block */
+       mb();
+
+       /*
+        * Program VGIC to raise an interrupt to SP
+        */
+       out_le32(CONFIG_SYS_FSL_SP_VSG_GIC_VIGR2, 0x1F);
+       /* Allow the changes to reflect in VIGR2 */
+       mb();
+
+       dmb();
+       debug("Polling for Debug server to launch ...\n");
+
+       while (1) {
+               debug_server_boot_status = in_le32(&gur->scratchrw[11 - 1]);
+               if (!(debug_server_boot_status & DEBUG_SERVER_INIT_STATUS_MASK))
+                       break;
+
+               udelay(1);      /* throttle polling */
+               if (timeout-- <= 0)
+                       break;
+       }
+
+       if (timeout <= 0) {
+               printf("Debug Server FW timed out (boot status: 0x%x)\n",
+                      debug_server_boot_status);
+               error = -ETIMEDOUT;
+               goto out;
+       }
+
+       if (debug_server_boot_status & DEBUG_SERVER_INIT_STATUS_MASK) {
+               printf("Debug server FW error'ed out (boot status: 0x%x)\n",
+                      debug_server_boot_status);
+               error = -ENODEV;
+               goto out;
+       }
+
+       printf("Debug server booted\n");
+       printf("Detected firmware %d.%d, (boot status: 0x0%x)\n",
+              debug_server_ver_info_maj, debug_server_ver_info_min,
+              debug_server_boot_status);
+
+out:
+       if (error != 0)
+               debug_server_boot_status = -error;
+       else
+               debug_server_boot_status = 0;
+
+       return debug_server_boot_status;
+}
+
index 3902e9ff53dc86e77b2ec42dcf8fc97af29423e3..a33efdb3b34cae2112bfc0ac55c523aa02dbfc8e 100644 (file)
@@ -168,4 +168,25 @@ void init_final_memctl_regs(void)
 #ifdef CONFIG_SYS_CSPR0_FINAL
        set_ifc_cspr(IFC_CS0, CONFIG_SYS_CSPR0_FINAL);
 #endif
+#ifdef CONFIG_SYS_AMASK0_FINAL
+       set_ifc_amask(IFC_CS0, CONFIG_SYS_AMASK0);
+#endif
+#ifdef CONFIG_SYS_CSPR1_FINAL
+       set_ifc_cspr(IFC_CS1, CONFIG_SYS_CSPR1_FINAL);
+#endif
+#ifdef CONFIG_SYS_AMASK1_FINAL
+       set_ifc_amask(IFC_CS1, CONFIG_SYS_AMASK1_FINAL);
+#endif
+#ifdef CONFIG_SYS_CSPR2_FINAL
+       set_ifc_cspr(IFC_CS2, CONFIG_SYS_CSPR2_FINAL);
+#endif
+#ifdef CONFIG_SYS_AMASK2_FINAL
+       set_ifc_amask(IFC_CS2, CONFIG_SYS_AMASK2);
+#endif
+#ifdef CONFIG_SYS_CSPR3_FINAL
+       set_ifc_cspr(IFC_CS3, CONFIG_SYS_CSPR3_FINAL);
+#endif
+#ifdef CONFIG_SYS_AMASK3_FINAL
+       set_ifc_amask(IFC_CS3, CONFIG_SYS_AMASK3);
+#endif
 }
index ed9adb21d6ad6b643f8b81e5461f579020f258a1..9869d98c10c073f51238bd21c8fc35683e969609 100644 (file)
@@ -53,6 +53,20 @@ led_dev_t led_dev[] = {
        0,
     },
 #endif
+#if defined(STATUS_LED_BIT4)
+    {  STATUS_LED_BIT4,
+       STATUS_LED_STATE4,
+       STATUS_LED_PERIOD4,
+       0,
+    },
+#endif
+#if defined(STATUS_LED_BIT5)
+    {  STATUS_LED_BIT5,
+       STATUS_LED_STATE5,
+       STATUS_LED_PERIOD5,
+       0,
+    },
+#endif
 };
 
 #define MAX_LED_DEV    (sizeof(led_dev)/sizeof(led_dev_t))
index db4d25192383742263fe722050a3b747b556c8eb..10ec216d2c5a9c844955c324089839221068ba84 100644 (file)
@@ -105,7 +105,8 @@ static uint esdhc_xfertyp(struct mmc_cmd *cmd, struct mmc_data *data)
        else if (cmd->resp_type & MMC_RSP_PRESENT)
                xfertyp |= XFERTYP_RSPTYP_48;
 
-#if defined(CONFIG_MX53) || defined(CONFIG_PPC_T4240) || defined(CONFIG_LS102XA)
+#if defined(CONFIG_MX53) || defined(CONFIG_PPC_T4240) || \
+       defined(CONFIG_LS102XA) || defined(CONFIG_LS2085A)
        if (cmd->cmdidx == MMC_CMD_STOP_TRANSMISSION)
                xfertyp |= XFERTYP_CMDTYP_ABORT;
 #endif
@@ -183,7 +184,9 @@ static int esdhc_setup_data(struct mmc *mmc, struct mmc_data *data)
        int timeout;
        struct fsl_esdhc_cfg *cfg = mmc->priv;
        struct fsl_esdhc *regs = (struct fsl_esdhc *)cfg->esdhc_base;
-
+#ifdef CONFIG_LS2085A
+       dma_addr_t addr;
+#endif
        uint wml_value;
 
        wml_value = data->blocksize/4;
@@ -194,7 +197,15 @@ static int esdhc_setup_data(struct mmc *mmc, struct mmc_data *data)
 
                esdhc_clrsetbits32(&regs->wml, WML_RD_WML_MASK, wml_value);
 #ifndef CONFIG_SYS_FSL_ESDHC_USE_PIO
+#ifdef CONFIG_LS2085A
+               addr = virt_to_phys((void *)(data->dest));
+               if (upper_32_bits(addr))
+                       printf("Error found for upper 32 bits\n");
+               else
+                       esdhc_write32(&regs->dsaddr, lower_32_bits(addr));
+#else
                esdhc_write32(&regs->dsaddr, (u32)data->dest);
+#endif
 #endif
        } else {
 #ifndef CONFIG_SYS_FSL_ESDHC_USE_PIO
@@ -212,7 +223,15 @@ static int esdhc_setup_data(struct mmc *mmc, struct mmc_data *data)
                esdhc_clrsetbits32(&regs->wml, WML_WR_WML_MASK,
                                        wml_value << 16);
 #ifndef CONFIG_SYS_FSL_ESDHC_USE_PIO
+#ifdef CONFIG_LS2085A
+               addr = virt_to_phys((void *)(data->src));
+               if (upper_32_bits(addr))
+                       printf("Error found for upper 32 bits\n");
+               else
+                       esdhc_write32(&regs->dsaddr, lower_32_bits(addr));
+#else
                esdhc_write32(&regs->dsaddr, (u32)data->src);
+#endif
 #endif
        }
 
@@ -259,10 +278,23 @@ static int esdhc_setup_data(struct mmc *mmc, struct mmc_data *data)
 static void check_and_invalidate_dcache_range
        (struct mmc_cmd *cmd,
         struct mmc_data *data) {
+#ifdef CONFIG_LS2085A
+       unsigned start = 0;
+#else
        unsigned start = (unsigned)data->dest ;
+#endif
        unsigned size = roundup(ARCH_DMA_MINALIGN,
                                data->blocks*data->blocksize);
        unsigned end = start+size ;
+#ifdef CONFIG_LS2085A
+       dma_addr_t addr;
+
+       addr = virt_to_phys((void *)(data->dest));
+       if (upper_32_bits(addr))
+               printf("Error found for upper 32 bits\n");
+       else
+               start = lower_32_bits(addr);
+#endif
        invalidate_dcache_range(start, end);
 }
 #endif
index 7903eebd537c595eb9b6af01459983d94cf9ea79..79fa88b22f975082bf6edd09cedfec71f4c8ca38 100644 (file)
@@ -46,7 +46,7 @@ struct fsl_ifc_ctrl {
        struct fsl_ifc_mtd *chips[MAX_BANKS];
 
        /* device info */
-       struct fsl_ifc *regs;
+       struct fsl_ifc regs;
        uint8_t __iomem *addr;   /* Address of assigned IFC buffer        */
        unsigned int cs_nand;    /* On which chipsel NAND is connected    */
        unsigned int page;       /* Last page written to / read from      */
@@ -225,7 +225,7 @@ static void set_addr(struct mtd_info *mtd, int column, int page_addr, int oob)
        struct nand_chip *chip = mtd->priv;
        struct fsl_ifc_mtd *priv = chip->priv;
        struct fsl_ifc_ctrl *ctrl = priv->ctrl;
-       struct fsl_ifc *ifc = ctrl->regs;
+       struct fsl_ifc_runtime *ifc = ctrl->regs.rregs;
        int buf_num;
 
        ctrl->page = page_addr;
@@ -289,10 +289,10 @@ static int fsl_ifc_run_command(struct mtd_info *mtd)
        struct nand_chip *chip = mtd->priv;
        struct fsl_ifc_mtd *priv = chip->priv;
        struct fsl_ifc_ctrl *ctrl = priv->ctrl;
-       struct fsl_ifc *ifc = ctrl->regs;
+       struct fsl_ifc_runtime *ifc = ctrl->regs.rregs;
        u32 timeo = (CONFIG_SYS_HZ * 10) / 1000;
        u32 time_start;
-       u32 eccstat[4] = {0};
+       u32 eccstat[8] = {0};
        int i;
 
        /* set the chip select for NAND Transaction */
@@ -325,8 +325,15 @@ static int fsl_ifc_run_command(struct mtd_info *mtd)
                int sector = bufnum * chip->ecc.steps;
                int sector_end = sector + chip->ecc.steps - 1;
 
-               for (i = sector / 4; i <= sector_end / 4; i++)
+               for (i = sector / 4; i <= sector_end / 4; i++) {
+                       if (i >= ARRAY_SIZE(eccstat)) {
+                               printf("%s: eccstat too small for %d\n",
+                                      __func__, i);
+                               return -EIO;
+                       }
+
                        eccstat[i] = ifc_in32(&ifc->ifc_nand.nand_eccstat[i]);
+               }
 
                for (i = sector; i <= sector_end; i++) {
                        errors = check_read_ecc(mtd, ctrl, eccstat, i);
@@ -362,7 +369,7 @@ static void fsl_ifc_do_read(struct nand_chip *chip,
 {
        struct fsl_ifc_mtd *priv = chip->priv;
        struct fsl_ifc_ctrl *ctrl = priv->ctrl;
-       struct fsl_ifc *ifc = ctrl->regs;
+       struct fsl_ifc_runtime *ifc = ctrl->regs.rregs;
 
        /* Program FIR/IFC_NAND_FCR0 for Small/Large page */
        if (mtd->writesize > 512) {
@@ -400,7 +407,7 @@ static void fsl_ifc_cmdfunc(struct mtd_info *mtd, unsigned int command,
        struct nand_chip *chip = mtd->priv;
        struct fsl_ifc_mtd *priv = chip->priv;
        struct fsl_ifc_ctrl *ctrl = priv->ctrl;
-       struct fsl_ifc *ifc = ctrl->regs;
+       struct fsl_ifc_runtime *ifc = ctrl->regs.rregs;
 
        /* clear the read buffer */
        ctrl->read_bytes = 0;
@@ -690,7 +697,7 @@ static int fsl_ifc_wait(struct mtd_info *mtd, struct nand_chip *chip)
 {
        struct fsl_ifc_mtd *priv = chip->priv;
        struct fsl_ifc_ctrl *ctrl = priv->ctrl;
-       struct fsl_ifc *ifc = ctrl->regs;
+       struct fsl_ifc_runtime *ifc = ctrl->regs.rregs;
        u32 nand_fsr;
 
        if (ctrl->status != IFC_NAND_EVTER_STAT_OPC)
@@ -747,24 +754,33 @@ static int fsl_ifc_write_page(struct mtd_info *mtd, struct nand_chip *chip,
 
 static void fsl_ifc_ctrl_init(void)
 {
+       uint32_t ver = 0;
        ifc_ctrl = kzalloc(sizeof(*ifc_ctrl), GFP_KERNEL);
        if (!ifc_ctrl)
                return;
 
-       ifc_ctrl->regs = IFC_BASE_ADDR;
+       ifc_ctrl->regs.gregs = IFC_FCM_BASE_ADDR;
+
+       ver = ifc_in32(&ifc_ctrl->regs.gregs->ifc_rev);
+       if (ver >= FSL_IFC_V2_0_0)
+               ifc_ctrl->regs.rregs =
+                       (void *)CONFIG_SYS_IFC_ADDR + IFC_RREGS_64KOFFSET;
+       else
+               ifc_ctrl->regs.rregs =
+                       (void *)CONFIG_SYS_IFC_ADDR + IFC_RREGS_4KOFFSET;
 
        /* clear event registers */
-       ifc_out32(&ifc_ctrl->regs->ifc_nand.nand_evter_stat, ~0U);
-       ifc_out32(&ifc_ctrl->regs->ifc_nand.pgrdcmpl_evt_stat, ~0U);
+       ifc_out32(&ifc_ctrl->regs.rregs->ifc_nand.nand_evter_stat, ~0U);
+       ifc_out32(&ifc_ctrl->regs.rregs->ifc_nand.pgrdcmpl_evt_stat, ~0U);
 
        /* Enable error and event for any detected errors */
-       ifc_out32(&ifc_ctrl->regs->ifc_nand.nand_evter_en,
+       ifc_out32(&ifc_ctrl->regs.rregs->ifc_nand.nand_evter_en,
                  IFC_NAND_EVTER_EN_OPC_EN |
                  IFC_NAND_EVTER_EN_PGRDCMPL_EN |
                  IFC_NAND_EVTER_EN_FTOER_EN |
                  IFC_NAND_EVTER_EN_WPER_EN);
 
-       ifc_out32(&ifc_ctrl->regs->ifc_nand.ncfgr, 0x0);
+       ifc_out32(&ifc_ctrl->regs.rregs->ifc_nand.ncfgr, 0x0);
 }
 
 static void fsl_ifc_select_chip(struct mtd_info *mtd, int chip)
@@ -773,7 +789,7 @@ static void fsl_ifc_select_chip(struct mtd_info *mtd, int chip)
 
 static int fsl_ifc_sram_init(uint32_t ver)
 {
-       struct fsl_ifc *ifc = ifc_ctrl->regs;
+       struct fsl_ifc_runtime *ifc = ifc_ctrl->regs.rregs;
        uint32_t cs = 0, csor = 0, csor_8k = 0, csor_ext = 0;
        uint32_t ncfgr = 0;
        u32 timeo = (CONFIG_SYS_HZ * 10) / 1000;
@@ -799,13 +815,13 @@ static int fsl_ifc_sram_init(uint32_t ver)
        cs = ifc_ctrl->cs_nand >> IFC_NAND_CSEL_SHIFT;
 
        /* Save CSOR and CSOR_ext */
-       csor = ifc_in32(&ifc_ctrl->regs->csor_cs[cs].csor);
-       csor_ext = ifc_in32(&ifc_ctrl->regs->csor_cs[cs].csor_ext);
+       csor = ifc_in32(&ifc_ctrl->regs.gregs->csor_cs[cs].csor);
+       csor_ext = ifc_in32(&ifc_ctrl->regs.gregs->csor_cs[cs].csor_ext);
 
        /* chage PageSize 8K and SpareSize 1K*/
        csor_8k = (csor & ~(CSOR_NAND_PGS_MASK)) | 0x0018C000;
-       ifc_out32(&ifc_ctrl->regs->csor_cs[cs].csor, csor_8k);
-       ifc_out32(&ifc_ctrl->regs->csor_cs[cs].csor_ext, 0x0000400);
+       ifc_out32(&ifc_ctrl->regs.gregs->csor_cs[cs].csor, csor_8k);
+       ifc_out32(&ifc_ctrl->regs.gregs->csor_cs[cs].csor_ext, 0x0000400);
 
        /* READID */
        ifc_out32(&ifc->ifc_nand.nand_fir0,
@@ -845,8 +861,8 @@ static int fsl_ifc_sram_init(uint32_t ver)
        ifc_out32(&ifc->ifc_nand.nand_evter_stat, ifc_ctrl->status);
 
        /* Restore CSOR and CSOR_ext */
-       ifc_out32(&ifc_ctrl->regs->csor_cs[cs].csor, csor);
-       ifc_out32(&ifc_ctrl->regs->csor_cs[cs].csor_ext, csor_ext);
+       ifc_out32(&ifc_ctrl->regs.gregs->csor_cs[cs].csor, csor);
+       ifc_out32(&ifc_ctrl->regs.gregs->csor_cs[cs].csor_ext, csor_ext);
 
        return 0;
 }
@@ -857,6 +873,7 @@ static int fsl_ifc_chip_init(int devnum, u8 *addr)
        struct nand_chip *nand;
        struct fsl_ifc_mtd *priv;
        struct nand_ecclayout *layout;
+       struct fsl_ifc_fcm *gregs = NULL;
        uint32_t cspr = 0, csor = 0, ver = 0;
        int ret = 0;
 
@@ -872,14 +889,15 @@ static int fsl_ifc_chip_init(int devnum, u8 *addr)
 
        priv->ctrl = ifc_ctrl;
        priv->vbase = addr;
+       gregs = ifc_ctrl->regs.gregs;
 
        /* Find which chip select it is connected to.
         */
        for (priv->bank = 0; priv->bank < MAX_BANKS; priv->bank++) {
                phys_addr_t phys_addr = virt_to_phys(addr);
 
-               cspr = ifc_in32(&ifc_ctrl->regs->cspr_cs[priv->bank].cspr);
-               csor = ifc_in32(&ifc_ctrl->regs->csor_cs[priv->bank].csor);
+               cspr = ifc_in32(&gregs->cspr_cs[priv->bank].cspr);
+               csor = ifc_in32(&gregs->csor_cs[priv->bank].csor);
 
                if ((cspr & CSPR_V) && (cspr & CSPR_MSEL) == CSPR_MSEL_NAND &&
                    (cspr & CSPR_BA) == CSPR_PHYS_ADDR(phys_addr)) {
@@ -998,7 +1016,7 @@ static int fsl_ifc_chip_init(int devnum, u8 *addr)
                nand->ecc.mode = NAND_ECC_SOFT;
        }
 
-       ver = ifc_in32(&ifc_ctrl->regs->ifc_rev);
+       ver = ifc_in32(&gregs->ifc_rev);
        if (ver >= FSL_IFC_V1_1_0)
                ret = fsl_ifc_sram_init(ver);
        if (ret)
index fb827c5e74e096a37f71dcbdade8a5a350be6aaf..fccbfb5129d788f5df0b3cc5cc16dad0143d68e0 100644 (file)
@@ -48,11 +48,25 @@ static inline int check_read_ecc(uchar *buf, u32 *eccstat,
        return 0;
 }
 
+static inline struct fsl_ifc_runtime *runtime_regs_address(void)
+{
+       struct fsl_ifc regs = {(void *)CONFIG_SYS_IFC_ADDR, NULL};
+       int ver = 0;
+
+       ver = ifc_in32(&regs.gregs->ifc_rev);
+       if (ver >= FSL_IFC_V2_0_0)
+               regs.rregs = (void *)CONFIG_SYS_IFC_ADDR + IFC_RREGS_64KOFFSET;
+       else
+               regs.rregs = (void *)CONFIG_SYS_IFC_ADDR + IFC_RREGS_4KOFFSET;
+
+       return regs.rregs;
+}
+
 static inline void nand_wait(uchar *buf, int bufnum, int page_size)
 {
-       struct fsl_ifc *ifc = IFC_BASE_ADDR;
+       struct fsl_ifc_runtime *ifc = runtime_regs_address();
        u32 status;
-       u32 eccstat[4];
+       u32 eccstat[8];
        int bufperpage = page_size / 512;
        int bufnum_end, i;
 
@@ -90,7 +104,8 @@ static inline int bad_block(uchar *marker, int port_size)
 
 int nand_spl_load_image(uint32_t offs, unsigned int uboot_size, void *vdst)
 {
-       struct fsl_ifc *ifc = IFC_BASE_ADDR;
+       struct fsl_ifc_fcm *gregs = (void *)CONFIG_SYS_IFC_ADDR;
+       struct fsl_ifc_runtime *ifc = NULL;
        uchar *buf = (uchar *)CONFIG_SYS_NAND_BASE;
        int page_size;
        int port_size;
@@ -107,6 +122,8 @@ int nand_spl_load_image(uint32_t offs, unsigned int uboot_size, void *vdst)
        int pg_no;
        uchar *dst = vdst;
 
+       ifc = runtime_regs_address();
+
        /* Get NAND Flash configuration */
        csor = CONFIG_SYS_NAND_CSOR;
        cspr = CONFIG_SYS_NAND_CSPR;
@@ -130,7 +147,7 @@ int nand_spl_load_image(uint32_t offs, unsigned int uboot_size, void *vdst)
                        bad_marker = 5;
        }
 
-       ver = ifc_in32(&ifc->ifc_rev);
+       ver = ifc_in32(&gregs->ifc_rev);
        if (ver >= FSL_IFC_V2_0_0)
                bufnum_mask = (bufnum_mask * 2) + 1;
 
index 785f7a96fed28d8d7cb8297fa009705e183c9290..4158e1332286325eaca1306a1c7eaee1b75303a8 100644 (file)
@@ -97,10 +97,6 @@ enum {
 #define STATUS_QEB_MXIC                (1 << 6)
 #define STATUS_PEC                     (1 << 7)
 
-#ifdef CONFIG_SYS_SPI_ST_ENABLE_WP_PIN
-#define STATUS_SRWD                    (1 << 7) /* SR write protect */
-#endif
-
 /* Flash timeout values */
 #define SPI_FLASH_PROG_TIMEOUT         (2 * CONFIG_SYS_HZ)
 #define SPI_FLASH_PAGE_ERASE_TIMEOUT           (5 * CONFIG_SYS_HZ)
@@ -123,7 +119,8 @@ int sst_write_bp(struct spi_flash *flash, u32 offset, size_t len,
  * @name:              Device name ([MANUFLETTER][DEVTYPE][DENSITY][EXTRAINFO])
  * @jedec:             Device jedec ID (0x[1byte_manuf_id][2byte_dev_id])
  * @ext_jedec:         Device ext_jedec ID
- * @sector_size:       Sector size of this device
+ * @sector_size:       Isn't necessarily a sector size from vendor,
+ *                     the size listed here is what works with CMD_ERASE_64K
  * @nr_sectors:        No.of sectors on this device
  * @e_rd_cmd:          Enum list for read commands
  * @flags:             Important param, for flash specific behaviour
index 34bc54e73e1f7b74d58d1d47fe87b56471371081..38592f518b72c7f4a7966fb2ad61d1c12242a84a 100644 (file)
@@ -154,21 +154,17 @@ static void spi_flash_dual_flash(struct spi_flash *flash, u32 *addr)
 }
 #endif
 
-int spi_flash_cmd_wait_ready(struct spi_flash *flash, unsigned long timeout)
+static int spi_flash_poll_status(struct spi_slave *spi, unsigned long timeout,
+                                u8 cmd, u8 poll_bit)
 {
-       struct spi_slave *spi = flash->spi;
        unsigned long timebase;
        unsigned long flags = SPI_XFER_BEGIN;
        int ret;
        u8 status;
        u8 check_status = 0x0;
-       u8 poll_bit = STATUS_WIP;
-       u8 cmd = flash->poll_cmd;
 
-       if (cmd == CMD_FLAG_STATUS) {
-               poll_bit = STATUS_PEC;
+       if (cmd == CMD_FLAG_STATUS)
                check_status = poll_bit;
-       }
 
 #ifdef CONFIG_SF_DUAL_FLASH
        if (spi->flags & SPI_XFER_U_PAGE)
@@ -204,6 +200,28 @@ int spi_flash_cmd_wait_ready(struct spi_flash *flash, unsigned long timeout)
        return -1;
 }
 
+int spi_flash_cmd_wait_ready(struct spi_flash *flash, unsigned long timeout)
+{
+       struct spi_slave *spi = flash->spi;
+       int ret;
+       u8 poll_bit = STATUS_WIP;
+       u8 cmd = CMD_READ_STATUS;
+
+       ret = spi_flash_poll_status(spi, timeout, cmd, poll_bit);
+       if (ret < 0)
+               return ret;
+
+       if (flash->poll_cmd == CMD_FLAG_STATUS) {
+               poll_bit = STATUS_PEC;
+               cmd = CMD_FLAG_STATUS;
+               ret = spi_flash_poll_status(spi, timeout, cmd, poll_bit);
+               if (ret < 0)
+                       return ret;
+       }
+
+       return 0;
+}
+
 int spi_flash_write_common(struct spi_flash *flash, const u8 *cmd,
                size_t cmd_len, const void *buf, size_t buf_len)
 {
index d19138d9071d1365b080610bac46e649691aa84c..201471c392c60897afc403d098898851e5bf5e38 100644 (file)
@@ -132,6 +132,9 @@ static int spi_flash_validate_params(struct spi_slave *spi, u8 *idcode,
        flash->name = params->name;
        flash->memory_map = spi->memory_map;
        flash->dual_flash = flash->spi->option;
+#ifdef CONFIG_DM_SPI_FLASH
+       flash->flags = params->flags;
+#endif
 
        /* Assign spi_flash ops */
 #ifndef CONFIG_DM_SPI_FLASH
@@ -184,6 +187,9 @@ static int spi_flash_validate_params(struct spi_slave *spi, u8 *idcode,
                flash->erase_size = flash->sector_size;
        }
 
+       /* Now erase size becomes valid sector size */
+       flash->sector_size = flash->erase_size;
+
        /* Look for the fastest read cmd */
        cmd = fls(params->e_rd_cmd & flash->spi->op_mode_rx);
        if (cmd) {
@@ -288,34 +294,6 @@ int spi_flash_decode_fdt(const void *blob, struct spi_flash *flash)
 }
 #endif /* CONFIG_OF_CONTROL */
 
-#ifdef CONFIG_SYS_SPI_ST_ENABLE_WP_PIN
-/* enable the W#/Vpp signal to disable writing to the status register */
-static int spi_enable_wp_pin(struct spi_flash *flash)
-{
-       u8 status;
-       int ret;
-
-       ret = spi_flash_cmd_read_status(flash, &status);
-       if (ret < 0)
-               return ret;
-
-       ret = spi_flash_cmd_write_status(flash, STATUS_SRWD);
-       if (ret < 0)
-               return ret;
-
-       ret = spi_flash_cmd_write_disable(flash);
-       if (ret < 0)
-               return ret;
-
-       return 0;
-}
-#else
-static int spi_enable_wp_pin(struct spi_flash *flash)
-{
-       return 0;
-}
-#endif
-
 /**
  * spi_flash_probe_slave() - Probe for a SPI flash device on a bus
  *
@@ -394,8 +372,6 @@ int spi_flash_probe_slave(struct spi_slave *spi, struct spi_flash *flash)
                puts(" Full access #define CONFIG_SPI_FLASH_BAR\n");
        }
 #endif
-       if (spi_enable_wp_pin(flash))
-               puts("Enable WP pin failed\n");
 
        /* Release spi bus */
        spi_release_bus(spi);
@@ -434,6 +410,8 @@ struct spi_flash *spi_flash_probe(unsigned int busnum, unsigned int cs,
        struct spi_slave *bus;
 
        bus = spi_setup_slave(busnum, cs, max_hz, spi_mode);
+       if (!bus)
+               return NULL;
        return spi_flash_probe_tail(bus);
 }
 
@@ -444,6 +422,8 @@ struct spi_flash *spi_flash_probe_fdt(const void *blob, int slave_node,
        struct spi_slave *bus;
 
        bus = spi_setup_slave_fdt(blob, slave_node, spi_node);
+       if (!bus)
+               return NULL;
        return spi_flash_probe_tail(bus);
 }
 #endif
@@ -469,6 +449,15 @@ int spi_flash_std_write(struct udevice *dev, u32 offset, size_t len,
 {
        struct spi_flash *flash = dev_get_uclass_priv(dev);
 
+#if defined(CONFIG_SPI_FLASH_SST)
+       if (flash->flags & SST_WR) {
+               if (flash->spi->op_mode_tx & SPI_OPM_TX_BP)
+                       return sst_write_bp(flash, offset, len, buf);
+               else
+                       return sst_write_wp(flash, offset, len, buf);
+       }
+#endif
+
        return spi_flash_cmd_write_ops(flash, offset, len, buf);
 }
 
index f24443df71064b29593b3c33893b2a8aee71c1f8..150470c24b05b5ae01214e830d4d0683f4719fbd 100644 (file)
@@ -69,4 +69,6 @@ obj-$(CONFIG_XILINX_LL_TEMAC) += xilinx_ll_temac.o xilinx_ll_temac_mdio.o \
                xilinx_ll_temac_fifo.o xilinx_ll_temac_sdma.o
 obj-$(CONFIG_ZYNQ_GEM) += zynq_gem.o
 obj-$(CONFIG_FSL_MC_ENET) += fsl-mc/
+obj-$(CONFIG_FSL_MC_ENET) += ldpaa_eth/
+obj-$(CONFIG_FSL_MEMAC) += fm/memac_phy.o
 obj-$(CONFIG_VSC9953) += vsc9953.o
index 2d66690226763c4bd6af38752ca09a0866960882..96e6bb08246df6d27657137b8a649e1605368cda 100644 (file)
@@ -2174,7 +2174,7 @@ e1000_copper_link_preconfig(struct e1000_hw *hw)
                DEBUGOUT("Error, did not detect valid phy.\n");
                return ret_val;
        }
-       DEBUGOUT("Phy ID = %x \n", hw->phy_id);
+       DEBUGOUT("Phy ID = %x\n", hw->phy_id);
 
        /* Set PHY to class A mode (if necessary) */
        ret_val = e1000_set_phy_mode(hw);
@@ -3485,11 +3485,11 @@ e1000_config_fc_after_link_up(struct e1000_hw *hw)
                 * some "sticky" (latched) bits.
                 */
                if (e1000_read_phy_reg(hw, PHY_STATUS, &mii_status_reg) < 0) {
-                       DEBUGOUT("PHY Read Error \n");
+                       DEBUGOUT("PHY Read Error\n");
                        return -E1000_ERR_PHY;
                }
                if (e1000_read_phy_reg(hw, PHY_STATUS, &mii_status_reg) < 0) {
-                       DEBUGOUT("PHY Read Error \n");
+                       DEBUGOUT("PHY Read Error\n");
                        return -E1000_ERR_PHY;
                }
 
@@ -5152,7 +5152,7 @@ e1000_poll(struct eth_device *nic)
 
        if (!(le32_to_cpu(rd->status)) & E1000_RXD_STAT_DD)
                return 0;
-       /*DEBUGOUT("recv: packet len=%d \n", rd->length); */
+       /* DEBUGOUT("recv: packet len=%d\n", rd->length); */
        /* Packet received, make sure the data are re-loaded from RAM. */
        len = le32_to_cpu(rd->length);
        invalidate_dcache_range((unsigned long)packet,
index 55e76a7d88644b79afd1077245eee5bd72a309bd..d7a37f39a8e3e23b24735d10a152ebff494504c8 100644 (file)
@@ -15,7 +15,7 @@
 #include <phy.h>
 #include <asm/fsl_dtsec.h>
 #include <asm/fsl_tgec.h>
-#include <asm/fsl_memac.h>
+#include <fsl_memac.h>
 
 #include "fm.h"
 
index 60e898cd7c34f0f4e29c09159be1bc292cf8e27b..81a64bf656a2a21e35f024e4295667c95ecfa5fa 100644 (file)
@@ -12,7 +12,7 @@
 #include <phy.h>
 #include <asm/types.h>
 #include <asm/io.h>
-#include <asm/fsl_memac.h>
+#include <fsl_memac.h>
 
 #include "fm.h"
 
index a155d8930b38761969b7dff7c12f7b1376193eea..4ab78e6c253e0e1a8665711b5f0899f01768e66f 100644 (file)
 #include <miiphy.h>
 #include <phy.h>
 #include <asm/io.h>
-#include <asm/fsl_memac.h>
+#include <fsl_memac.h>
 #include <fm_eth.h>
 
+#ifdef CONFIG_SYS_MEMAC_LITTLE_ENDIAN
+#define memac_out_32(a, v)     out_le32(a, v)
+#define memac_clrbits_32(a, v) clrbits_le32(a, v)
+#define memac_setbits_32(a, v) setbits_le32(a, v)
+#else
+#define memac_out_32(a, v)     out_be32(a, v)
+#define memac_clrbits_32(a, v) clrbits_be32(a, v)
+#define memac_setbits_32(a, v) setbits_be32(a, v)
+#endif
+
+static u32 memac_in_32(u32 *reg)
+{
+#ifdef CONFIG_SYS_MEMAC_LITTLE_ENDIAN
+       return in_le32(reg);
+#else
+       return in_be32(reg);
+#endif
+}
+
 /*
  * Write value to the PHY for this device to the register at regnum, waiting
  * until the write is done before it returns.  All PHY configuration has to be
@@ -28,31 +47,31 @@ int memac_mdio_write(struct mii_dev *bus, int port_addr, int dev_addr,
        if (dev_addr == MDIO_DEVAD_NONE) {
                c45 = 0; /* clause 22 */
                dev_addr = regnum & 0x1f;
-               clrbits_be32(&regs->mdio_stat, MDIO_STAT_ENC);
+               memac_clrbits_32(&regs->mdio_stat, MDIO_STAT_ENC);
        } else
-               setbits_be32(&regs->mdio_stat, MDIO_STAT_ENC);
+               memac_setbits_32(&regs->mdio_stat, MDIO_STAT_ENC);
 
        /* Wait till the bus is free */
-       while ((in_be32(&regs->mdio_stat)) & MDIO_STAT_BSY)
+       while ((memac_in_32(&regs->mdio_stat)) & MDIO_STAT_BSY)
                ;
 
        /* Set the port and dev addr */
        mdio_ctl = MDIO_CTL_PORT_ADDR(port_addr) | MDIO_CTL_DEV_ADDR(dev_addr);
-       out_be32(&regs->mdio_ctl, mdio_ctl);
+       memac_out_32(&regs->mdio_ctl, mdio_ctl);
 
        /* Set the register address */
        if (c45)
-               out_be32(&regs->mdio_addr, regnum & 0xffff);
+               memac_out_32(&regs->mdio_addr, regnum & 0xffff);
 
        /* Wait till the bus is free */
-       while ((in_be32(&regs->mdio_stat)) & MDIO_STAT_BSY)
+       while ((memac_in_32(&regs->mdio_stat)) & MDIO_STAT_BSY)
                ;
 
        /* Write the value to the register */
-       out_be32(&regs->mdio_data, MDIO_DATA(value));
+       memac_out_32(&regs->mdio_data, MDIO_DATA(value));
 
        /* Wait till the MDIO write is complete */
-       while ((in_be32(&regs->mdio_data)) & MDIO_DATA_BSY)
+       while ((memac_in_32(&regs->mdio_data)) & MDIO_DATA_BSY)
                ;
 
        return 0;
@@ -75,39 +94,39 @@ int memac_mdio_read(struct mii_dev *bus, int port_addr, int dev_addr,
                        return 0xffff;
                c45 = 0; /* clause 22 */
                dev_addr = regnum & 0x1f;
-               clrbits_be32(&regs->mdio_stat, MDIO_STAT_ENC);
+               memac_clrbits_32(&regs->mdio_stat, MDIO_STAT_ENC);
        } else
-               setbits_be32(&regs->mdio_stat, MDIO_STAT_ENC);
+               memac_setbits_32(&regs->mdio_stat, MDIO_STAT_ENC);
 
        /* Wait till the bus is free */
-       while ((in_be32(&regs->mdio_stat)) & MDIO_STAT_BSY)
+       while ((memac_in_32(&regs->mdio_stat)) & MDIO_STAT_BSY)
                ;
 
        /* Set the Port and Device Addrs */
        mdio_ctl = MDIO_CTL_PORT_ADDR(port_addr) | MDIO_CTL_DEV_ADDR(dev_addr);
-       out_be32(&regs->mdio_ctl, mdio_ctl);
+       memac_out_32(&regs->mdio_ctl, mdio_ctl);
 
        /* Set the register address */
        if (c45)
-               out_be32(&regs->mdio_addr, regnum & 0xffff);
+               memac_out_32(&regs->mdio_addr, regnum & 0xffff);
 
        /* Wait till the bus is free */
-       while ((in_be32(&regs->mdio_stat)) & MDIO_STAT_BSY)
+       while ((memac_in_32(&regs->mdio_stat)) & MDIO_STAT_BSY)
                ;
 
        /* Initiate the read */
        mdio_ctl |= MDIO_CTL_READ;
-       out_be32(&regs->mdio_ctl, mdio_ctl);
+       memac_out_32(&regs->mdio_ctl, mdio_ctl);
 
        /* Wait till the MDIO write is complete */
-       while ((in_be32(&regs->mdio_data)) & MDIO_DATA_BSY)
+       while ((memac_in_32(&regs->mdio_data)) & MDIO_DATA_BSY)
                ;
 
        /* Return all Fs if nothing was there */
-       if (in_be32(&regs->mdio_stat) & MDIO_STAT_RD_ER)
+       if (memac_in_32(&regs->mdio_stat) & MDIO_STAT_RD_ER)
                return 0xffff;
 
-       return in_be32(&regs->mdio_data) & 0xffff;
+       return memac_in_32(&regs->mdio_data) & 0xffff;
 }
 
 int memac_mdio_reset(struct mii_dev *bus)
@@ -143,8 +162,9 @@ int fm_memac_mdio_init(bd_t *bis, struct memac_mdio_info *info)
         * like T2080QDS, this bit default is '0', which leads to MDIO failure
         * on XAUI PHY, so set this bit definitely.
         */
-       setbits_be32(&((struct memac_mdio_controller *)info->regs)->mdio_stat,
-                    MDIO_STAT_CLKDIV(258) | MDIO_STAT_NEG);
+       memac_setbits_32(
+               &((struct memac_mdio_controller *)info->regs)->mdio_stat,
+               MDIO_STAT_CLKDIV(258) | MDIO_STAT_NEG);
 
        return mdio_register(bus);
 }
index 206ac6be07aeb8653dc19c179c39f790f423d20e..7563a5fdd3ba2ab761072c89d51e86e08f07014c 100644 (file)
@@ -7,4 +7,8 @@
 # Layerscape MC driver
 obj-y += mc.o \
        mc_sys.o \
-       dpmng.o
+       dpmng.o \
+       dprc.o  \
+       dpbp.o  \
+       dpni.o
+obj-y += dpio/
diff --git a/drivers/net/fsl-mc/dpbp.c b/drivers/net/fsl-mc/dpbp.c
new file mode 100644 (file)
index 0000000..3853e58
--- /dev/null
@@ -0,0 +1,102 @@
+/*
+ * Freescale Layerscape MC I/O wrapper
+ *
+ * Copyright (C) 2013-2015 Freescale Semiconductor, Inc.
+ * Author: German Rivera <German.Rivera@freescale.com>
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+#include <fsl-mc/fsl_mc_sys.h>
+#include <fsl-mc/fsl_mc_cmd.h>
+#include <fsl-mc/fsl_dpbp.h>
+
+int dpbp_open(struct fsl_mc_io *mc_io, int dpbp_id, uint16_t *token)
+{
+       struct mc_command cmd = { 0 };
+       int err;
+
+       /* prepare command */
+       cmd.header = mc_encode_cmd_header(DPBP_CMDID_OPEN,
+                                         MC_CMD_PRI_LOW, 0);
+       DPBP_CMD_OPEN(cmd, dpbp_id);
+
+       /* send command to mc*/
+       err = mc_send_command(mc_io, &cmd);
+       if (err)
+               return err;
+
+       /* retrieve response parameters */
+       *token = MC_CMD_HDR_READ_TOKEN(cmd.header);
+
+       return err;
+}
+
+int dpbp_close(struct fsl_mc_io *mc_io, uint16_t token)
+{
+       struct mc_command cmd = { 0 };
+
+       /* prepare command */
+       cmd.header = mc_encode_cmd_header(DPBP_CMDID_CLOSE, MC_CMD_PRI_HIGH,
+                                         token);
+
+       /* send command to mc*/
+       return mc_send_command(mc_io, &cmd);
+}
+
+int dpbp_enable(struct fsl_mc_io *mc_io, uint16_t token)
+{
+       struct mc_command cmd = { 0 };
+
+       /* prepare command */
+       cmd.header = mc_encode_cmd_header(DPBP_CMDID_ENABLE, MC_CMD_PRI_LOW,
+                                         token);
+
+       /* send command to mc*/
+       return mc_send_command(mc_io, &cmd);
+}
+
+int dpbp_disable(struct fsl_mc_io *mc_io, uint16_t token)
+{
+       struct mc_command cmd = { 0 };
+
+       /* prepare command */
+       cmd.header = mc_encode_cmd_header(DPBP_CMDID_DISABLE,
+                                         MC_CMD_PRI_LOW, token);
+
+       /* send command to mc*/
+       return mc_send_command(mc_io, &cmd);
+}
+
+int dpbp_reset(struct fsl_mc_io *mc_io, uint16_t token)
+{
+       struct mc_command cmd = { 0 };
+
+       /* prepare command */
+       cmd.header = mc_encode_cmd_header(DPBP_CMDID_RESET,
+                                         MC_CMD_PRI_LOW, token);
+
+       /* send command to mc*/
+       return mc_send_command(mc_io, &cmd);
+}
+
+int dpbp_get_attributes(struct fsl_mc_io *mc_io,
+                       uint16_t token,
+                       struct dpbp_attr *attr)
+{
+       struct mc_command cmd = { 0 };
+       int err;
+
+       /* prepare command */
+       cmd.header = mc_encode_cmd_header(DPBP_CMDID_GET_ATTR,
+                                         MC_CMD_PRI_LOW, token);
+
+       /* send command to mc*/
+       err = mc_send_command(mc_io, &cmd);
+       if (err)
+               return err;
+
+       /* retrieve response parameters */
+       DPBP_RSP_GET_ATTRIBUTES(cmd, attr);
+
+       return 0;
+}
diff --git a/drivers/net/fsl-mc/dpio/Makefile b/drivers/net/fsl-mc/dpio/Makefile
new file mode 100644 (file)
index 0000000..1ccefc0
--- /dev/null
@@ -0,0 +1,9 @@
+#
+# Copyright 2014 Freescale Semiconductor, Inc.
+#
+# SPDX-License-Identifier:     GPL-2.0+
+#
+
+# Layerscape MC DPIO driver
+obj-y += dpio.o        \
+       qbman_portal.o
diff --git a/drivers/net/fsl-mc/dpio/dpio.c b/drivers/net/fsl-mc/dpio/dpio.c
new file mode 100644 (file)
index 0000000..b07eff7
--- /dev/null
@@ -0,0 +1,102 @@
+/*
+ * Copyright (C) 2013-2015 Freescale Semiconductor
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#include <fsl-mc/fsl_mc_sys.h>
+#include <fsl-mc/fsl_mc_cmd.h>
+#include <fsl-mc/fsl_dpio.h>
+
+int dpio_open(struct fsl_mc_io *mc_io, int dpio_id, uint16_t *token)
+{
+       struct mc_command cmd = { 0 };
+       int err;
+
+       /* prepare command */
+       cmd.header = mc_encode_cmd_header(DPIO_CMDID_OPEN,
+                                         MC_CMD_PRI_LOW, 0);
+       DPIO_CMD_OPEN(cmd, dpio_id);
+
+       /* send command to mc*/
+       err = mc_send_command(mc_io, &cmd);
+       if (err)
+               return err;
+
+       /* retrieve response parameters */
+       *token = MC_CMD_HDR_READ_TOKEN(cmd.header);
+
+       return 0;
+}
+
+int dpio_close(struct fsl_mc_io *mc_io, uint16_t token)
+{
+       struct mc_command cmd = { 0 };
+
+       /* prepare command */
+       cmd.header = mc_encode_cmd_header(DPIO_CMDID_CLOSE,
+                                         MC_CMD_PRI_HIGH, token);
+
+       /* send command to mc*/
+       return mc_send_command(mc_io, &cmd);
+}
+
+int dpio_enable(struct fsl_mc_io *mc_io, uint16_t token)
+{
+       struct mc_command cmd = { 0 };
+
+       /* prepare command */
+       cmd.header = mc_encode_cmd_header(DPIO_CMDID_ENABLE,
+                                         MC_CMD_PRI_LOW, token);
+
+       /* send command to mc*/
+       return mc_send_command(mc_io, &cmd);
+}
+
+int dpio_disable(struct fsl_mc_io *mc_io, uint16_t token)
+{
+       struct mc_command cmd = { 0 };
+
+       /* prepare command */
+       cmd.header = mc_encode_cmd_header(DPIO_CMDID_DISABLE,
+                                         MC_CMD_PRI_LOW,
+                                         token);
+
+       /* send command to mc*/
+       return mc_send_command(mc_io, &cmd);
+}
+
+int dpio_reset(struct fsl_mc_io *mc_io, uint16_t token)
+{
+       struct mc_command cmd = { 0 };
+
+       /* prepare command */
+       cmd.header = mc_encode_cmd_header(DPIO_CMDID_RESET,
+                                         MC_CMD_PRI_LOW, token);
+
+       /* send command to mc*/
+       return mc_send_command(mc_io, &cmd);
+}
+
+int dpio_get_attributes(struct fsl_mc_io *mc_io,
+                       uint16_t token,
+                       struct dpio_attr *attr)
+{
+       struct mc_command cmd = { 0 };
+       int err;
+
+       /* prepare command */
+       cmd.header = mc_encode_cmd_header(DPIO_CMDID_GET_ATTR,
+                                         MC_CMD_PRI_LOW,
+                                         token);
+
+       /* send command to mc*/
+       err = mc_send_command(mc_io, &cmd);
+       if (err)
+               return err;
+
+       /* retrieve response parameters */
+       DPIO_RSP_GET_ATTR(cmd, attr);
+
+       return 0;
+}
diff --git a/drivers/net/fsl-mc/dpio/qbman_portal.c b/drivers/net/fsl-mc/dpio/qbman_portal.c
new file mode 100644 (file)
index 0000000..dd2a7de
--- /dev/null
@@ -0,0 +1,593 @@
+/*
+ * Copyright (C) 2014 Freescale Semiconductor
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#include "qbman_portal.h"
+
+/* QBMan portal management command codes */
+#define QBMAN_MC_ACQUIRE       0x30
+#define QBMAN_WQCHAN_CONFIGURE 0x46
+
+/* CINH register offsets */
+#define QBMAN_CINH_SWP_EQAR    0x8c0
+#define QBMAN_CINH_SWP_DCAP    0xac0
+#define QBMAN_CINH_SWP_SDQCR   0xb00
+#define QBMAN_CINH_SWP_RAR     0xcc0
+
+/* CENA register offsets */
+#define QBMAN_CENA_SWP_EQCR(n) (0x000 + ((uint32_t)(n) << 6))
+#define QBMAN_CENA_SWP_DQRR(n) (0x200 + ((uint32_t)(n) << 6))
+#define QBMAN_CENA_SWP_RCR(n)  (0x400 + ((uint32_t)(n) << 6))
+#define QBMAN_CENA_SWP_CR      0x600
+#define QBMAN_CENA_SWP_RR(vb)  (0x700 + ((uint32_t)(vb) >> 1))
+#define QBMAN_CENA_SWP_VDQCR   0x780
+
+/* Reverse mapping of QBMAN_CENA_SWP_DQRR() */
+#define QBMAN_IDX_FROM_DQRR(p) (((unsigned long)p & 0xff) >> 6)
+
+/*******************************/
+/* Pre-defined attribute codes */
+/*******************************/
+
+struct qb_attr_code code_generic_verb = QB_CODE(0, 0, 7);
+struct qb_attr_code code_generic_rslt = QB_CODE(0, 8, 8);
+
+/*************************/
+/* SDQCR attribute codes */
+/*************************/
+
+/* we put these here because at least some of them are required by
+ * qbman_swp_init() */
+struct qb_attr_code code_sdqcr_dct = QB_CODE(0, 24, 2);
+struct qb_attr_code code_sdqcr_fc = QB_CODE(0, 29, 1);
+struct qb_attr_code code_sdqcr_tok = QB_CODE(0, 16, 8);
+#define CODE_SDQCR_DQSRC(n) QB_CODE(0, n, 1)
+enum qbman_sdqcr_dct {
+       qbman_sdqcr_dct_null = 0,
+       qbman_sdqcr_dct_prio_ics,
+       qbman_sdqcr_dct_active_ics,
+       qbman_sdqcr_dct_active
+};
+enum qbman_sdqcr_fc {
+       qbman_sdqcr_fc_one = 0,
+       qbman_sdqcr_fc_up_to_3 = 1
+};
+
+/*********************************/
+/* Portal constructor/destructor */
+/*********************************/
+
+/* Software portals should always be in the power-on state when we initialise,
+ * due to the CCSR-based portal reset functionality that MC has. */
+struct qbman_swp *qbman_swp_init(const struct qbman_swp_desc *d)
+{
+       int ret;
+       struct qbman_swp *p = kmalloc(sizeof(*p), GFP_KERNEL);
+
+       if (!p)
+               return NULL;
+       p->desc = d;
+#ifdef QBMAN_CHECKING
+       p->mc.check = swp_mc_can_start;
+#endif
+       p->mc.valid_bit = QB_VALID_BIT;
+       p->sdq = 0;
+       qb_attr_code_encode(&code_sdqcr_dct, &p->sdq, qbman_sdqcr_dct_prio_ics);
+       qb_attr_code_encode(&code_sdqcr_fc, &p->sdq, qbman_sdqcr_fc_up_to_3);
+       qb_attr_code_encode(&code_sdqcr_tok, &p->sdq, 0xbb);
+       p->vdq.busy = 0; /* TODO: convert to atomic_t */
+       p->vdq.valid_bit = QB_VALID_BIT;
+       p->dqrr.next_idx = 0;
+       p->dqrr.valid_bit = QB_VALID_BIT;
+       ret = qbman_swp_sys_init(&p->sys, d);
+       if (ret) {
+               free(p);
+               printf("qbman_swp_sys_init() failed %d\n", ret);
+               return NULL;
+       }
+       qbman_cinh_write(&p->sys, QBMAN_CINH_SWP_SDQCR, p->sdq);
+       return p;
+}
+
+/***********************/
+/* Management commands */
+/***********************/
+
+/*
+ * Internal code common to all types of management commands.
+ */
+
+void *qbman_swp_mc_start(struct qbman_swp *p)
+{
+       void *ret;
+#ifdef QBMAN_CHECKING
+       BUG_ON(p->mc.check != swp_mc_can_start);
+#endif
+       ret = qbman_cena_write_start(&p->sys, QBMAN_CENA_SWP_CR);
+#ifdef QBMAN_CHECKING
+       if (!ret)
+               p->mc.check = swp_mc_can_submit;
+#endif
+       return ret;
+}
+
+void qbman_swp_mc_submit(struct qbman_swp *p, void *cmd, uint32_t cmd_verb)
+{
+       uint32_t *v = cmd;
+#ifdef QBMAN_CHECKING
+       BUG_ON(!p->mc.check != swp_mc_can_submit);
+#endif
+       lwsync();
+       /* TBD: "|=" is going to hurt performance. Need to move as many fields
+        * out of word zero, and for those that remain, the "OR" needs to occur
+        * at the caller side. This debug check helps to catch cases where the
+        * caller wants to OR but has forgotten to do so. */
+       BUG_ON((*v & cmd_verb) != *v);
+       *v = cmd_verb | p->mc.valid_bit;
+       qbman_cena_write_complete(&p->sys, QBMAN_CENA_SWP_CR, cmd);
+       /* TODO: add prefetch support for GPP */
+#ifdef QBMAN_CHECKING
+       p->mc.check = swp_mc_can_poll;
+#endif
+}
+
+void *qbman_swp_mc_result(struct qbman_swp *p)
+{
+       uint32_t *ret, verb;
+#ifdef QBMAN_CHECKING
+       BUG_ON(p->mc.check != swp_mc_can_poll);
+#endif
+       ret = qbman_cena_read(&p->sys, QBMAN_CENA_SWP_RR(p->mc.valid_bit));
+       /* Remove the valid-bit - command completed iff the rest is non-zero */
+       verb = ret[0] & ~QB_VALID_BIT;
+       if (!verb)
+               return NULL;
+#ifdef QBMAN_CHECKING
+       p->mc.check = swp_mc_can_start;
+#endif
+       p->mc.valid_bit ^= QB_VALID_BIT;
+       return ret;
+}
+
+/***********/
+/* Enqueue */
+/***********/
+
+/* These should be const, eventually */
+static struct qb_attr_code code_eq_cmd = QB_CODE(0, 0, 2);
+static struct qb_attr_code code_eq_orp_en = QB_CODE(0, 2, 1);
+static struct qb_attr_code code_eq_tgt_id = QB_CODE(2, 0, 24);
+/* static struct qb_attr_code code_eq_tag = QB_CODE(3, 0, 32); */
+static struct qb_attr_code code_eq_qd_en = QB_CODE(0, 4, 1);
+static struct qb_attr_code code_eq_qd_bin = QB_CODE(4, 0, 16);
+static struct qb_attr_code code_eq_qd_pri = QB_CODE(4, 16, 4);
+static struct qb_attr_code code_eq_rsp_stash = QB_CODE(5, 16, 1);
+static struct qb_attr_code code_eq_rsp_lo = QB_CODE(6, 0, 32);
+static struct qb_attr_code code_eq_rsp_hi = QB_CODE(7, 0, 32);
+
+enum qbman_eq_cmd_e {
+       /* No enqueue, primarily for plugging ORP gaps for dropped frames */
+       qbman_eq_cmd_empty,
+       /* DMA an enqueue response once complete */
+       qbman_eq_cmd_respond,
+       /* DMA an enqueue response only if the enqueue fails */
+       qbman_eq_cmd_respond_reject
+};
+
+void qbman_eq_desc_clear(struct qbman_eq_desc *d)
+{
+       memset(d, 0, sizeof(*d));
+}
+
+void qbman_eq_desc_set_no_orp(struct qbman_eq_desc *d, int respond_success)
+{
+       uint32_t *cl = qb_cl(d);
+
+       qb_attr_code_encode(&code_eq_orp_en, cl, 0);
+       qb_attr_code_encode(&code_eq_cmd, cl,
+                           respond_success ? qbman_eq_cmd_respond :
+                                             qbman_eq_cmd_respond_reject);
+}
+
+void qbman_eq_desc_set_response(struct qbman_eq_desc *d,
+                               dma_addr_t storage_phys,
+                               int stash)
+{
+       uint32_t *cl = qb_cl(d);
+
+       qb_attr_code_encode(&code_eq_rsp_lo, cl, lower32(storage_phys));
+       qb_attr_code_encode(&code_eq_rsp_hi, cl, upper32(storage_phys));
+       qb_attr_code_encode(&code_eq_rsp_stash, cl, !!stash);
+}
+
+
+void qbman_eq_desc_set_qd(struct qbman_eq_desc *d, uint32_t qdid,
+                         uint32_t qd_bin, uint32_t qd_prio)
+{
+       uint32_t *cl = qb_cl(d);
+
+       qb_attr_code_encode(&code_eq_qd_en, cl, 1);
+       qb_attr_code_encode(&code_eq_tgt_id, cl, qdid);
+       qb_attr_code_encode(&code_eq_qd_bin, cl, qd_bin);
+       qb_attr_code_encode(&code_eq_qd_pri, cl, qd_prio);
+}
+
+#define EQAR_IDX(eqar)     ((eqar) & 0x7)
+#define EQAR_VB(eqar)      ((eqar) & 0x80)
+#define EQAR_SUCCESS(eqar) ((eqar) & 0x100)
+
+int qbman_swp_enqueue(struct qbman_swp *s, const struct qbman_eq_desc *d,
+                     const struct qbman_fd *fd)
+{
+       uint32_t *p;
+       const uint32_t *cl = qb_cl(d);
+       uint32_t eqar = qbman_cinh_read(&s->sys, QBMAN_CINH_SWP_EQAR);
+       debug("EQAR=%08x\n", eqar);
+       if (!EQAR_SUCCESS(eqar))
+               return -EBUSY;
+       p = qbman_cena_write_start(&s->sys,
+                                  QBMAN_CENA_SWP_EQCR(EQAR_IDX(eqar)));
+       word_copy(&p[1], &cl[1], 7);
+       word_copy(&p[8], fd, sizeof(*fd) >> 2);
+       lwsync();
+       /* Set the verb byte, have to substitute in the valid-bit */
+       p[0] = cl[0] | EQAR_VB(eqar);
+       qbman_cena_write_complete(&s->sys,
+                                 QBMAN_CENA_SWP_EQCR(EQAR_IDX(eqar)),
+                                 p);
+       return 0;
+}
+
+/***************************/
+/* Volatile (pull) dequeue */
+/***************************/
+
+/* These should be const, eventually */
+static struct qb_attr_code code_pull_dct = QB_CODE(0, 0, 2);
+static struct qb_attr_code code_pull_dt = QB_CODE(0, 2, 2);
+static struct qb_attr_code code_pull_rls = QB_CODE(0, 4, 1);
+static struct qb_attr_code code_pull_stash = QB_CODE(0, 5, 1);
+static struct qb_attr_code code_pull_numframes = QB_CODE(0, 8, 4);
+static struct qb_attr_code code_pull_token = QB_CODE(0, 16, 8);
+static struct qb_attr_code code_pull_dqsource = QB_CODE(1, 0, 24);
+static struct qb_attr_code code_pull_rsp_lo = QB_CODE(2, 0, 32);
+static struct qb_attr_code code_pull_rsp_hi = QB_CODE(3, 0, 32);
+
+enum qb_pull_dt_e {
+       qb_pull_dt_channel,
+       qb_pull_dt_workqueue,
+       qb_pull_dt_framequeue
+};
+
+void qbman_pull_desc_clear(struct qbman_pull_desc *d)
+{
+       memset(d, 0, sizeof(*d));
+}
+
+void qbman_pull_desc_set_storage(struct qbman_pull_desc *d,
+                                struct ldpaa_dq *storage,
+                                dma_addr_t storage_phys,
+                                int stash)
+{
+       uint32_t *cl = qb_cl(d);
+
+       /* Squiggle the pointer 'storage' into the extra 2 words of the
+        * descriptor (which aren't copied to the hw command) */
+       *(void **)&cl[4] = storage;
+       if (!storage) {
+               qb_attr_code_encode(&code_pull_rls, cl, 0);
+               return;
+       }
+       qb_attr_code_encode(&code_pull_rls, cl, 1);
+       qb_attr_code_encode(&code_pull_stash, cl, !!stash);
+       qb_attr_code_encode(&code_pull_rsp_lo, cl, lower32(storage_phys));
+       qb_attr_code_encode(&code_pull_rsp_hi, cl, upper32(storage_phys));
+}
+
+void qbman_pull_desc_set_numframes(struct qbman_pull_desc *d, uint8_t numframes)
+{
+       uint32_t *cl = qb_cl(d);
+
+       BUG_ON(!numframes || (numframes > 16));
+       qb_attr_code_encode(&code_pull_numframes, cl,
+                           (uint32_t)(numframes - 1));
+}
+
+void qbman_pull_desc_set_token(struct qbman_pull_desc *d, uint8_t token)
+{
+       uint32_t *cl = qb_cl(d);
+
+       qb_attr_code_encode(&code_pull_token, cl, token);
+}
+
+void qbman_pull_desc_set_fq(struct qbman_pull_desc *d, uint32_t fqid)
+{
+       uint32_t *cl = qb_cl(d);
+
+       qb_attr_code_encode(&code_pull_dct, cl, 1);
+       qb_attr_code_encode(&code_pull_dt, cl, qb_pull_dt_framequeue);
+       qb_attr_code_encode(&code_pull_dqsource, cl, fqid);
+}
+
+int qbman_swp_pull(struct qbman_swp *s, struct qbman_pull_desc *d)
+{
+       uint32_t *p;
+       uint32_t *cl = qb_cl(d);
+
+       /* TODO: convert to atomic_t */
+       if (s->vdq.busy)
+               return -EBUSY;
+       s->vdq.busy = 1;
+       s->vdq.storage = *(void **)&cl[4];
+       s->vdq.token = qb_attr_code_decode(&code_pull_token, cl);
+       p = qbman_cena_write_start(&s->sys, QBMAN_CENA_SWP_VDQCR);
+       word_copy(&p[1], &cl[1], 3);
+       lwsync();
+       /* Set the verb byte, have to substitute in the valid-bit */
+       p[0] = cl[0] | s->vdq.valid_bit;
+       s->vdq.valid_bit ^= QB_VALID_BIT;
+       qbman_cena_write_complete(&s->sys, QBMAN_CENA_SWP_VDQCR, p);
+       return 0;
+}
+
+/****************/
+/* Polling DQRR */
+/****************/
+
+static struct qb_attr_code code_dqrr_verb = QB_CODE(0, 0, 8);
+static struct qb_attr_code code_dqrr_response = QB_CODE(0, 0, 7);
+static struct qb_attr_code code_dqrr_stat = QB_CODE(0, 8, 8);
+
+#define QBMAN_DQRR_RESPONSE_DQ        0x60
+#define QBMAN_DQRR_RESPONSE_FQRN      0x21
+#define QBMAN_DQRR_RESPONSE_FQRNI     0x22
+#define QBMAN_DQRR_RESPONSE_FQPN      0x24
+#define QBMAN_DQRR_RESPONSE_FQDAN     0x25
+#define QBMAN_DQRR_RESPONSE_CDAN      0x26
+#define QBMAN_DQRR_RESPONSE_CSCN_MEM  0x27
+#define QBMAN_DQRR_RESPONSE_CGCU      0x28
+#define QBMAN_DQRR_RESPONSE_BPSCN     0x29
+#define QBMAN_DQRR_RESPONSE_CSCN_WQ   0x2a
+
+
+/* NULL return if there are no unconsumed DQRR entries. Returns a DQRR entry
+ * only once, so repeated calls can return a sequence of DQRR entries, without
+ * requiring they be consumed immediately or in any particular order. */
+const struct ldpaa_dq *qbman_swp_dqrr_next(struct qbman_swp *s)
+{
+       uint32_t verb;
+       uint32_t response_verb;
+       const struct ldpaa_dq *dq = qbman_cena_read(&s->sys,
+                                       QBMAN_CENA_SWP_DQRR(s->dqrr.next_idx));
+       const uint32_t *p = qb_cl(dq);
+
+       verb = qb_attr_code_decode(&code_dqrr_verb, p);
+       /* If the valid-bit isn't of the expected polarity, nothing there */
+       if ((verb & QB_VALID_BIT) != s->dqrr.valid_bit) {
+               qbman_cena_invalidate_prefetch(&s->sys,
+                                              QBMAN_CENA_SWP_DQRR(
+                                              s->dqrr.next_idx));
+               return NULL;
+       }
+       /* There's something there. Move "next_idx" attention to the next ring
+        * entry (and prefetch it) before returning what we found. */
+       s->dqrr.next_idx++;
+       s->dqrr.next_idx &= 3; /* Wrap around at 4 */
+       /* TODO: it's possible to do all this without conditionals, optimise it
+        * later. */
+       if (!s->dqrr.next_idx)
+               s->dqrr.valid_bit ^= QB_VALID_BIT;
+       /* VDQCR "no longer busy" hook - if VDQCR shows "busy" and this is a
+        * VDQCR result, mark it as non-busy. */
+       if (s->vdq.busy) {
+               uint32_t flags = ldpaa_dq_flags(dq);
+
+               response_verb = qb_attr_code_decode(&code_dqrr_response, &verb);
+               if ((response_verb == QBMAN_DQRR_RESPONSE_DQ) &&
+                   (flags & LDPAA_DQ_STAT_VOLATILE))
+                       s->vdq.busy = 0;
+       }
+       qbman_cena_invalidate_prefetch(&s->sys,
+                                      QBMAN_CENA_SWP_DQRR(s->dqrr.next_idx));
+       return dq;
+}
+
+/* Consume DQRR entries previously returned from qbman_swp_dqrr_next(). */
+void qbman_swp_dqrr_consume(struct qbman_swp *s, const struct ldpaa_dq *dq)
+{
+       qbman_cinh_write(&s->sys, QBMAN_CINH_SWP_DCAP, QBMAN_IDX_FROM_DQRR(dq));
+}
+
+/*********************************/
+/* Polling user-provided storage */
+/*********************************/
+
+void qbman_dq_entry_set_oldtoken(struct ldpaa_dq *dq,
+                                unsigned int num_entries,
+                                uint8_t oldtoken)
+{
+       memset(dq, oldtoken, num_entries * sizeof(*dq));
+}
+
+int qbman_dq_entry_has_newtoken(struct qbman_swp *s,
+                               const struct ldpaa_dq *dq,
+                               uint8_t newtoken)
+{
+       /* To avoid converting the little-endian DQ entry to host-endian prior
+        * to us knowing whether there is a valid entry or not (and run the
+        * risk of corrupting the incoming hardware LE write), we detect in
+        * hardware endianness rather than host. This means we need a different
+        * "code" depending on whether we are BE or LE in software, which is
+        * where DQRR_TOK_OFFSET comes in... */
+       static struct qb_attr_code code_dqrr_tok_detect =
+                                       QB_CODE(0, DQRR_TOK_OFFSET, 8);
+       /* The user trying to poll for a result treats "dq" as const. It is
+        * however the same address that was provided to us non-const in the
+        * first place, for directing hardware DMA to. So we can cast away the
+        * const because it is mutable from our perspective. */
+       uint32_t *p = qb_cl((struct ldpaa_dq *)dq);
+       uint32_t token;
+
+       token = qb_attr_code_decode(&code_dqrr_tok_detect, &p[1]);
+       if (token != newtoken)
+               return 0;
+
+       /* Only now do we convert from hardware to host endianness. Also, as we
+        * are returning success, the user has promised not to call us again, so
+        * there's no risk of us converting the endianness twice... */
+       make_le32_n(p, 16);
+
+       /* VDQCR "no longer busy" hook - not quite the same as DQRR, because the
+        * fact "VDQCR" shows busy doesn't mean that the result we're looking at
+        * is from the same command. Eg. we may be looking at our 10th dequeue
+        * result from our first VDQCR command, yet the second dequeue command
+        * could have been kicked off already, after seeing the 1st result. Ie.
+        * the result we're looking at is not necessarily proof that we can
+        * reset "busy".  We instead base the decision on whether the current
+        * result is sitting at the first 'storage' location of the busy
+        * command. */
+       if (s->vdq.busy && (s->vdq.storage == dq))
+               s->vdq.busy = 0;
+       return 1;
+}
+
+/********************************/
+/* Categorising dequeue entries */
+/********************************/
+
+static inline int __qbman_dq_entry_is_x(const struct ldpaa_dq *dq, uint32_t x)
+{
+       const uint32_t *p = qb_cl(dq);
+       uint32_t response_verb = qb_attr_code_decode(&code_dqrr_response, p);
+
+       return response_verb == x;
+}
+
+int qbman_dq_entry_is_DQ(const struct ldpaa_dq *dq)
+{
+       return __qbman_dq_entry_is_x(dq, QBMAN_DQRR_RESPONSE_DQ);
+}
+
+/*********************************/
+/* Parsing frame dequeue results */
+/*********************************/
+
+/* These APIs assume qbman_dq_entry_is_DQ() is TRUE */
+
+uint32_t ldpaa_dq_flags(const struct ldpaa_dq *dq)
+{
+       const uint32_t *p = qb_cl(dq);
+
+       return qb_attr_code_decode(&code_dqrr_stat, p);
+}
+
+const struct dpaa_fd *ldpaa_dq_fd(const struct ldpaa_dq *dq)
+{
+       const uint32_t *p = qb_cl(dq);
+
+       return (const struct dpaa_fd *)&p[8];
+}
+
+/******************/
+/* Buffer release */
+/******************/
+
+/* These should be const, eventually */
+/* static struct qb_attr_code code_release_num = QB_CODE(0, 0, 3); */
+static struct qb_attr_code code_release_set_me = QB_CODE(0, 5, 1);
+static struct qb_attr_code code_release_bpid = QB_CODE(0, 16, 16);
+
+void qbman_release_desc_clear(struct qbman_release_desc *d)
+{
+       uint32_t *cl;
+
+       memset(d, 0, sizeof(*d));
+       cl = qb_cl(d);
+       qb_attr_code_encode(&code_release_set_me, cl, 1);
+}
+
+void qbman_release_desc_set_bpid(struct qbman_release_desc *d, uint32_t bpid)
+{
+       uint32_t *cl = qb_cl(d);
+
+       qb_attr_code_encode(&code_release_bpid, cl, bpid);
+}
+
+#define RAR_IDX(rar)     ((rar) & 0x7)
+#define RAR_VB(rar)      ((rar) & 0x80)
+#define RAR_SUCCESS(rar) ((rar) & 0x100)
+
+int qbman_swp_release(struct qbman_swp *s, const struct qbman_release_desc *d,
+                     const uint64_t *buffers, unsigned int num_buffers)
+{
+       uint32_t *p;
+       const uint32_t *cl = qb_cl(d);
+       uint32_t rar = qbman_cinh_read(&s->sys, QBMAN_CINH_SWP_RAR);
+       debug("RAR=%08x\n", rar);
+       if (!RAR_SUCCESS(rar))
+               return -EBUSY;
+       BUG_ON(!num_buffers || (num_buffers > 7));
+       /* Start the release command */
+       p = qbman_cena_write_start(&s->sys,
+                                  QBMAN_CENA_SWP_RCR(RAR_IDX(rar)));
+       /* Copy the caller's buffer pointers to the command */
+       u64_to_le32_copy(&p[2], buffers, num_buffers);
+       lwsync();
+       /* Set the verb byte, have to substitute in the valid-bit and the number
+        * of buffers. */
+       p[0] = cl[0] | RAR_VB(rar) | num_buffers;
+       qbman_cena_write_complete(&s->sys,
+                                 QBMAN_CENA_SWP_RCR(RAR_IDX(rar)),
+                                 p);
+       return 0;
+}
+
+/*******************/
+/* Buffer acquires */
+/*******************/
+
+/* These should be const, eventually */
+static struct qb_attr_code code_acquire_bpid = QB_CODE(0, 16, 16);
+static struct qb_attr_code code_acquire_num = QB_CODE(1, 0, 3);
+static struct qb_attr_code code_acquire_r_num = QB_CODE(1, 0, 3);
+
+int qbman_swp_acquire(struct qbman_swp *s, uint32_t bpid, uint64_t *buffers,
+                     unsigned int num_buffers)
+{
+       uint32_t *p;
+       uint32_t verb, rslt, num;
+
+       BUG_ON(!num_buffers || (num_buffers > 7));
+
+       /* Start the management command */
+       p = qbman_swp_mc_start(s);
+
+       if (!p)
+               return -EBUSY;
+
+       /* Encode the caller-provided attributes */
+       qb_attr_code_encode(&code_acquire_bpid, p, bpid);
+       qb_attr_code_encode(&code_acquire_num, p, num_buffers);
+
+       /* Complete the management command */
+       p = qbman_swp_mc_complete(s, p, p[0] | QBMAN_MC_ACQUIRE);
+
+       /* Decode the outcome */
+       verb = qb_attr_code_decode(&code_generic_verb, p);
+       rslt = qb_attr_code_decode(&code_generic_rslt, p);
+       num = qb_attr_code_decode(&code_acquire_r_num, p);
+       BUG_ON(verb != QBMAN_MC_ACQUIRE);
+
+       /* Determine success or failure */
+       if (unlikely(rslt != QBMAN_MC_RSLT_OK)) {
+               printf("Acquire buffers from BPID 0x%x failed, code=0x%02x\n",
+                      bpid, rslt);
+               return -EIO;
+       }
+       BUG_ON(num > num_buffers);
+       /* Copy the acquired buffers to the caller's array */
+       u64_from_le32_copy(buffers, &p[2], num);
+       return (int)num;
+}
diff --git a/drivers/net/fsl-mc/dpio/qbman_portal.h b/drivers/net/fsl-mc/dpio/qbman_portal.h
new file mode 100644 (file)
index 0000000..bb67c3b
--- /dev/null
@@ -0,0 +1,157 @@
+/*
+ * Copyright (C) 2014 Freescale Semiconductor
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#include "qbman_private.h"
+#include <fsl-mc/fsl_qbman_portal.h>
+#include <fsl-mc/fsl_dpaa_fd.h>
+
+/* All QBMan command and result structures use this "valid bit" encoding */
+#define QB_VALID_BIT ((uint32_t)0x80)
+
+/* Management command result codes */
+#define QBMAN_MC_RSLT_OK      0xf0
+
+/* --------------------- */
+/* portal data structure */
+/* --------------------- */
+
+struct qbman_swp {
+       const struct qbman_swp_desc *desc;
+       /* The qbman_sys (ie. arch/OS-specific) support code can put anything it
+        * needs in here. */
+       struct qbman_swp_sys sys;
+       /* Management commands */
+       struct {
+#ifdef QBMAN_CHECKING
+               enum swp_mc_check {
+                       swp_mc_can_start, /* call __qbman_swp_mc_start() */
+                       swp_mc_can_submit, /* call __qbman_swp_mc_submit() */
+                       swp_mc_can_poll, /* call __qbman_swp_mc_result() */
+               } check;
+#endif
+               uint32_t valid_bit; /* 0x00 or 0x80 */
+       } mc;
+       /* Push dequeues */
+       uint32_t sdq;
+       /* Volatile dequeues */
+       struct {
+               /* VDQCR supports a "1 deep pipeline", meaning that if you know
+                * the last-submitted command is already executing in the
+                * hardware (as evidenced by at least 1 valid dequeue result),
+                * you can write another dequeue command to the register, the
+                * hardware will start executing it as soon as the
+                * already-executing command terminates. (This minimises latency
+                * and stalls.) With that in mind, this "busy" variable refers
+                * to whether or not a command can be submitted, not whether or
+                * not a previously-submitted command is still executing. In
+                * other words, once proof is seen that the previously-submitted
+                * command is executing, "vdq" is no longer "busy". TODO:
+                * convert this to "atomic_t" so that it is thread-safe (without
+                * locking). */
+               int busy;
+               uint32_t valid_bit; /* 0x00 or 0x80 */
+               /* We need to determine when vdq is no longer busy. This depends
+                * on whether the "busy" (last-submitted) dequeue command is
+                * targetting DQRR or main-memory, and detected is based on the
+                * presence of the dequeue command's "token" showing up in
+                * dequeue entries in DQRR or main-memory (respectively). Debug
+                * builds will, when submitting vdq commands, verify that the
+                * dequeue result location is not already equal to the command's
+                * token value. */
+               struct ldpaa_dq *storage; /* NULL if DQRR */
+               uint32_t token;
+       } vdq;
+       /* DQRR */
+       struct {
+               uint32_t next_idx;
+               uint32_t valid_bit;
+       } dqrr;
+};
+
+/* -------------------------- */
+/* portal management commands */
+/* -------------------------- */
+
+/* Different management commands all use this common base layer of code to issue
+ * commands and poll for results. The first function returns a pointer to where
+ * the caller should fill in their MC command (though they should ignore the
+ * verb byte), the second function commits merges in the caller-supplied command
+ * verb (which should not include the valid-bit) and submits the command to
+ * hardware, and the third function checks for a completed response (returns
+ * non-NULL if only if the response is complete). */
+void *qbman_swp_mc_start(struct qbman_swp *p);
+void qbman_swp_mc_submit(struct qbman_swp *p, void *cmd, uint32_t cmd_verb);
+void *qbman_swp_mc_result(struct qbman_swp *p);
+
+/* Wraps up submit + poll-for-result */
+static inline void *qbman_swp_mc_complete(struct qbman_swp *swp, void *cmd,
+                                         uint32_t cmd_verb)
+{
+       int loopvar;
+
+       qbman_swp_mc_submit(swp, cmd, cmd_verb);
+       DBG_POLL_START(loopvar);
+       do {
+               DBG_POLL_CHECK(loopvar);
+               cmd = qbman_swp_mc_result(swp);
+       } while (!cmd);
+       return cmd;
+}
+
+/* ------------ */
+/* qb_attr_code */
+/* ------------ */
+
+/* This struct locates a sub-field within a QBMan portal (CENA) cacheline which
+ * is either serving as a configuration command or a query result. The
+ * representation is inherently little-endian, as the indexing of the words is
+ * itself little-endian in nature and layerscape is little endian for anything
+ * that crosses a word boundary too (64-bit fields are the obvious examples).
+ */
+struct qb_attr_code {
+       unsigned int word; /* which uint32_t[] array member encodes the field */
+       unsigned int lsoffset; /* encoding offset from ls-bit */
+       unsigned int width; /* encoding width. (bool must be 1.) */
+};
+
+/* Macros to define codes */
+#define QB_CODE(a, b, c) { a, b, c}
+
+/* decode a field from a cacheline */
+static inline uint32_t qb_attr_code_decode(const struct qb_attr_code *code,
+                                     const uint32_t *cacheline)
+{
+       return d32_uint32_t(code->lsoffset, code->width, cacheline[code->word]);
+}
+
+/* encode a field to a cacheline */
+static inline void qb_attr_code_encode(const struct qb_attr_code *code,
+                                      uint32_t *cacheline, uint32_t val)
+{
+       cacheline[code->word] =
+               r32_uint32_t(code->lsoffset, code->width, cacheline[code->word])
+               | e32_uint32_t(code->lsoffset, code->width, val);
+}
+
+/* ---------------------- */
+/* Descriptors/cachelines */
+/* ---------------------- */
+
+/* To avoid needless dynamic allocation, the driver API often gives the caller
+ * a "descriptor" type that the caller can instantiate however they like.
+ * Ultimately though, it is just a cacheline of binary storage (or something
+ * smaller when it is known that the descriptor doesn't need all 64 bytes) for
+ * holding pre-formatted pieces of harware commands. The performance-critical
+ * code can then copy these descriptors directly into hardware command
+ * registers more efficiently than trying to construct/format commands
+ * on-the-fly. The API user sees the descriptor as an array of 32-bit words in
+ * order for the compiler to know its size, but the internal details are not
+ * exposed. The following macro is used within the driver for converting *any*
+ * descriptor pointer to a usable array pointer. The use of a macro (instead of
+ * an inline) is necessary to work with different descriptor types and to work
+ * correctly with const and non-const inputs (and similarly-qualified outputs).
+ */
+#define qb_cl(d) (&(d)->dont_manipulate_directly[0])
diff --git a/drivers/net/fsl-mc/dpio/qbman_private.h b/drivers/net/fsl-mc/dpio/qbman_private.h
new file mode 100644 (file)
index 0000000..2d2556b
--- /dev/null
@@ -0,0 +1,169 @@
+/*
+ * Copyright (C) 2014 Freescale Semiconductor
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+/* Perform extra checking */
+#include <common.h>
+#include <errno.h>
+#include <asm/io.h>
+#include <linux/types.h>
+#include <linux/compat.h>
+#include <malloc.h>
+#include <fsl-mc/fsl_qbman_base.h>
+
+#define QBMAN_CHECKING
+
+/* Any time there is a register interface which we poll on, this provides a
+ * "break after x iterations" scheme for it. It's handy for debugging, eg.
+ * where you don't want millions of lines of log output from a polling loop
+ * that won't, because such things tend to drown out the earlier log output
+ * that might explain what caused the problem. (NB: put ";" after each macro!)
+ * TODO: we should probably remove this once we're done sanitising the
+ * simulator...
+ */
+#define DBG_POLL_START(loopvar) (loopvar = 10)
+#define DBG_POLL_CHECK(loopvar) \
+       do {if (!(loopvar--)) BUG_ON(NULL == "DBG_POLL_CHECK"); } while (0)
+
+/* For CCSR or portal-CINH registers that contain fields at arbitrary offsets
+ * and widths, these macro-generated encode/decode/isolate/remove inlines can
+ * be used.
+ *
+ * Eg. to "d"ecode a 14-bit field out of a register (into a "uint16_t" type),
+ * where the field is located 3 bits "up" from the least-significant bit of the
+ * register (ie. the field location within the 32-bit register corresponds to a
+ * mask of 0x0001fff8), you would do;
+ *                uint16_t field = d32_uint16_t(3, 14, reg_value);
+ *
+ * Or to "e"ncode a 1-bit boolean value (input type is "int", zero is FALSE,
+ * non-zero is TRUE, so must convert all non-zero inputs to 1, hence the "!!"
+ * operator) into a register at bit location 0x00080000 (19 bits "in" from the
+ * LS bit), do;
+ *                reg_value |= e32_int(19, 1, !!field);
+ *
+ * If you wish to read-modify-write a register, such that you leave the 14-bit
+ * field as-is but have all other fields set to zero, then "i"solate the 14-bit
+ * value using;
+ *                reg_value = i32_uint16_t(3, 14, reg_value);
+ *
+ * Alternatively, you could "r"emove the 1-bit boolean field (setting it to
+ * zero) but leaving all other fields as-is;
+ *                reg_val = r32_int(19, 1, reg_value);
+ *
+ */
+#define MAKE_MASK32(width) (width == 32 ? 0xffffffff : \
+                                (uint32_t)((1 << width) - 1))
+#define DECLARE_CODEC32(t) \
+static inline uint32_t e32_##t(uint32_t lsoffset, uint32_t width, t val) \
+{ \
+       BUG_ON(width > (sizeof(t) * 8)); \
+       return ((uint32_t)val & MAKE_MASK32(width)) << lsoffset; \
+} \
+static inline t d32_##t(uint32_t lsoffset, uint32_t width, uint32_t val) \
+{ \
+       BUG_ON(width > (sizeof(t) * 8)); \
+       return (t)((val >> lsoffset) & MAKE_MASK32(width)); \
+} \
+static inline uint32_t i32_##t(uint32_t lsoffset, uint32_t width, \
+                               uint32_t val) \
+{ \
+       BUG_ON(width > (sizeof(t) * 8)); \
+       return e32_##t(lsoffset, width, d32_##t(lsoffset, width, val)); \
+} \
+static inline uint32_t r32_##t(uint32_t lsoffset, uint32_t width, \
+                               uint32_t val) \
+{ \
+       BUG_ON(width > (sizeof(t) * 8)); \
+       return ~(MAKE_MASK32(width) << lsoffset) & val; \
+}
+DECLARE_CODEC32(uint32_t)
+DECLARE_CODEC32(uint16_t)
+DECLARE_CODEC32(uint8_t)
+DECLARE_CODEC32(int)
+
+       /*********************/
+       /* Debugging assists */
+       /*********************/
+
+static inline void __hexdump(unsigned long start, unsigned long end,
+                       unsigned long p, size_t sz, const unsigned char *c)
+{
+       while (start < end) {
+               unsigned int pos = 0;
+               char buf[64];
+               int nl = 0;
+
+               pos += sprintf(buf + pos, "%08lx: ", start);
+               do {
+                       if ((start < p) || (start >= (p + sz)))
+                               pos += sprintf(buf + pos, "..");
+                       else
+                               pos += sprintf(buf + pos, "%02x", *(c++));
+                       if (!(++start & 15)) {
+                               buf[pos++] = '\n';
+                               nl = 1;
+                       } else {
+                               nl = 0;
+                               if (!(start & 1))
+                                       buf[pos++] = ' ';
+                               if (!(start & 3))
+                                       buf[pos++] = ' ';
+                       }
+               } while (start & 15);
+               if (!nl)
+                       buf[pos++] = '\n';
+               buf[pos] = '\0';
+               debug("%s", buf);
+       }
+}
+static inline void hexdump(const void *ptr, size_t sz)
+{
+       unsigned long p = (unsigned long)ptr;
+       unsigned long start = p & ~(unsigned long)15;
+       unsigned long end = (p + sz + 15) & ~(unsigned long)15;
+       const unsigned char *c = ptr;
+
+       __hexdump(start, end, p, sz, c);
+}
+
+#if defined(__BIG_ENDIAN)
+#define DQRR_TOK_OFFSET 0
+#else
+#define DQRR_TOK_OFFSET 24
+#endif
+
+/* Similarly-named functions */
+#define upper32(a) upper_32_bits(a)
+#define lower32(a) lower_32_bits(a)
+
+       /****************/
+       /* arch assists */
+       /****************/
+
+static inline void dcbz(void *ptr)
+{
+       uint32_t *p = ptr;
+       BUG_ON((unsigned long)ptr & 63);
+       p[0] = 0;
+       p[1] = 0;
+       p[2] = 0;
+       p[3] = 0;
+       p[4] = 0;
+       p[5] = 0;
+       p[6] = 0;
+       p[7] = 0;
+       p[8] = 0;
+       p[9] = 0;
+       p[10] = 0;
+       p[11] = 0;
+       p[12] = 0;
+       p[13] = 0;
+       p[14] = 0;
+       p[15] = 0;
+}
+
+#define lwsync()
+
+#include "qbman_sys.h"
diff --git a/drivers/net/fsl-mc/dpio/qbman_sys.h b/drivers/net/fsl-mc/dpio/qbman_sys.h
new file mode 100644 (file)
index 0000000..235d641
--- /dev/null
@@ -0,0 +1,290 @@
+/*
+ * Copyright (C) 2014 Freescale Semiconductor
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+/* qbman_sys_decl.h and qbman_sys.h are the two platform-specific files in the
+ * driver. They are only included via qbman_private.h, which is itself a
+ * platform-independent file and is included by all the other driver source.
+ *
+ * qbman_sys_decl.h is included prior to all other declarations and logic, and
+ * it exists to provide compatibility with any linux interfaces our
+ * single-source driver code is dependent on (eg. kmalloc). Ie. this file
+ * provides linux compatibility.
+ *
+ * This qbman_sys.h header, on the other hand, is included *after* any common
+ * and platform-neutral declarations and logic in qbman_private.h, and exists to
+ * implement any platform-specific logic of the qbman driver itself. Ie. it is
+ * *not* to provide linux compatibility.
+ */
+
+/* Trace the 3 different classes of read/write access to QBMan. #undef as
+ * required. */
+#undef QBMAN_CCSR_TRACE
+#undef QBMAN_CINH_TRACE
+#undef QBMAN_CENA_TRACE
+
+/* Temporarily define this to get around the fact that cache enabled mapping is
+ * not working right now. Will remove this after uboot could map the cache
+ * enabled portal memory.
+ */
+#define QBMAN_CINH_ONLY
+
+static inline void word_copy(void *d, const void *s, unsigned int cnt)
+{
+       uint32_t *dd = d;
+       const uint32_t *ss = s;
+
+       while (cnt--)
+               *(dd++) = *(ss++);
+}
+
+/* Currently, the CENA support code expects each 32-bit word to be written in
+ * host order, and these are converted to hardware (little-endian) order on
+ * command submission. However, 64-bit quantities are must be written (and read)
+ * as two 32-bit words with the least-significant word first, irrespective of
+ * host endianness. */
+static inline void u64_to_le32_copy(void *d, const uint64_t *s,
+                                       unsigned int cnt)
+{
+       uint32_t *dd = d;
+       const uint32_t *ss = (const uint32_t *)s;
+
+       while (cnt--) {
+               /* TBD: the toolchain was choking on the use of 64-bit types up
+                * until recently so this works entirely with 32-bit variables.
+                * When 64-bit types become usable again, investigate better
+                * ways of doing this. */
+#if defined(__BIG_ENDIAN)
+               *(dd++) = ss[1];
+               *(dd++) = ss[0];
+               ss += 2;
+#else
+               *(dd++) = *(ss++);
+               *(dd++) = *(ss++);
+#endif
+       }
+}
+static inline void u64_from_le32_copy(uint64_t *d, const void *s,
+                                       unsigned int cnt)
+{
+       const uint32_t *ss = s;
+       uint32_t *dd = (uint32_t *)d;
+
+       while (cnt--) {
+#if defined(__BIG_ENDIAN)
+               dd[1] = *(ss++);
+               dd[0] = *(ss++);
+               dd += 2;
+#else
+               *(dd++) = *(ss++);
+               *(dd++) = *(ss++);
+#endif
+       }
+}
+
+/* Convert a host-native 32bit value into little endian */
+#if defined(__BIG_ENDIAN)
+static inline uint32_t make_le32(uint32_t val)
+{
+       return ((val & 0xff) << 24) | ((val & 0xff00) << 8) |
+               ((val & 0xff0000) >> 8) | ((val & 0xff000000) >> 24);
+}
+#else
+#define make_le32(val) (val)
+#endif
+static inline void make_le32_n(uint32_t *val, unsigned int num)
+{
+       while (num--) {
+               *val = make_le32(*val);
+               val++;
+       }
+}
+
+       /******************/
+       /* Portal access  */
+       /******************/
+struct qbman_swp_sys {
+       /* On GPP, the sys support for qbman_swp is here. The CENA region isi
+        * not an mmap() of the real portal registers, but an allocated
+        * place-holder, because the actual writes/reads to/from the portal are
+        * marshalled from these allocated areas using QBMan's "MC access
+        * registers". CINH accesses are atomic so there's no need for a
+        * place-holder. */
+       void *cena;
+       void __iomem *addr_cena;
+       void __iomem *addr_cinh;
+};
+
+/* P_OFFSET is (ACCESS_CMD,0,12) - offset within the portal
+ * C is (ACCESS_CMD,12,1) - is inhibited? (0==CENA, 1==CINH)
+ * SWP_IDX is (ACCESS_CMD,16,10) - Software portal index
+ * P is (ACCESS_CMD,28,1) - (0==special portal, 1==any portal)
+ * T is (ACCESS_CMD,29,1) - Command type (0==READ, 1==WRITE)
+ * E is (ACCESS_CMD,31,1) - Command execute (1 to issue, poll for 0==complete)
+ */
+
+static inline void qbman_cinh_write(struct qbman_swp_sys *s, uint32_t offset,
+                                   uint32_t val)
+{
+       __raw_writel(val, s->addr_cinh + offset);
+#ifdef QBMAN_CINH_TRACE
+       pr_info("qbman_cinh_write(%p:0x%03x) 0x%08x\n",
+               s->addr_cinh, offset, val);
+#endif
+}
+
+static inline uint32_t qbman_cinh_read(struct qbman_swp_sys *s, uint32_t offset)
+{
+       uint32_t reg = __raw_readl(s->addr_cinh + offset);
+
+#ifdef QBMAN_CINH_TRACE
+       pr_info("qbman_cinh_read(%p:0x%03x) 0x%08x\n",
+               s->addr_cinh, offset, reg);
+#endif
+       return reg;
+}
+
+static inline void *qbman_cena_write_start(struct qbman_swp_sys *s,
+                                               uint32_t offset)
+{
+       void *shadow = s->cena + offset;
+
+#ifdef QBMAN_CENA_TRACE
+       pr_info("qbman_cena_write_start(%p:0x%03x) %p\n",
+               s->addr_cena, offset, shadow);
+#endif
+       BUG_ON(offset & 63);
+       dcbz(shadow);
+       return shadow;
+}
+
+static inline void qbman_cena_write_complete(struct qbman_swp_sys *s,
+                                               uint32_t offset, void *cmd)
+{
+       const uint32_t *shadow = cmd;
+       int loop;
+
+#ifdef QBMAN_CENA_TRACE
+       pr_info("qbman_cena_write_complete(%p:0x%03x) %p\n",
+               s->addr_cena, offset, shadow);
+       hexdump(cmd, 64);
+#endif
+       for (loop = 15; loop >= 0; loop--)
+#ifdef QBMAN_CINH_ONLY
+               __raw_writel(shadow[loop], s->addr_cinh +
+                                        offset + loop * 4);
+#else
+               __raw_writel(shadow[loop], s->addr_cena +
+                                        offset + loop * 4);
+#endif
+}
+
+static inline void *qbman_cena_read(struct qbman_swp_sys *s, uint32_t offset)
+{
+       uint32_t *shadow = s->cena + offset;
+       unsigned int loop;
+
+#ifdef QBMAN_CENA_TRACE
+       pr_info("qbman_cena_read(%p:0x%03x) %p\n",
+               s->addr_cena, offset, shadow);
+#endif
+
+       for (loop = 0; loop < 16; loop++)
+#ifdef QBMAN_CINH_ONLY
+               shadow[loop] = __raw_readl(s->addr_cinh + offset
+                                       + loop * 4);
+#else
+               shadow[loop] = __raw_readl(s->addr_cena + offset
+                                       + loop * 4);
+#endif
+#ifdef QBMAN_CENA_TRACE
+       hexdump(shadow, 64);
+#endif
+       return shadow;
+}
+
+static inline void qbman_cena_invalidate_prefetch(struct qbman_swp_sys *s,
+                                                 uint32_t offset)
+{
+}
+
+       /******************/
+       /* Portal support */
+       /******************/
+
+/* The SWP_CFG portal register is special, in that it is used by the
+ * platform-specific code rather than the platform-independent code in
+ * qbman_portal.c. So use of it is declared locally here. */
+#define QBMAN_CINH_SWP_CFG   0xd00
+
+/* For MC portal use, we always configure with
+ * DQRR_MF is (SWP_CFG,20,3) - DQRR max fill (<- 0x4)
+ * EST is (SWP_CFG,16,3) - EQCR_CI stashing threshold (<- 0x0)
+ * RPM is (SWP_CFG,12,2) - RCR production notification mode (<- 0x3)
+ * DCM is (SWP_CFG,10,2) - DQRR consumption notification mode (<- 0x2)
+ * EPM is (SWP_CFG,8,2) - EQCR production notification mode (<- 0x3)
+ * SD is (SWP_CFG,5,1) - memory stashing drop enable (<- FALSE)
+ * SP is (SWP_CFG,4,1) - memory stashing priority (<- TRUE)
+ * SE is (SWP_CFG,3,1) - memory stashing enable (<- 0x0)
+ * DP is (SWP_CFG,2,1) - dequeue stashing priority (<- TRUE)
+ * DE is (SWP_CFG,1,1) - dequeue stashing enable (<- 0x0)
+ * EP is (SWP_CFG,0,1) - EQCR_CI stashing priority (<- FALSE)
+ */
+static inline uint32_t qbman_set_swp_cfg(uint8_t max_fill, uint8_t wn,
+                                       uint8_t est, uint8_t rpm, uint8_t dcm,
+                                       uint8_t epm, int sd, int sp, int se,
+                                       int dp, int de, int ep)
+{
+       uint32_t reg;
+
+       reg = e32_uint8_t(20, 3, max_fill) | e32_uint8_t(16, 3, est) |
+               e32_uint8_t(12, 2, rpm) | e32_uint8_t(10, 2, dcm) |
+               e32_uint8_t(8, 2, epm) | e32_int(5, 1, sd) |
+               e32_int(4, 1, sp) | e32_int(3, 1, se) | e32_int(2, 1, dp) |
+               e32_int(1, 1, de) | e32_int(0, 1, ep) | e32_uint8_t(14, 1, wn);
+       return reg;
+}
+
+static inline int qbman_swp_sys_init(struct qbman_swp_sys *s,
+                                    const struct qbman_swp_desc *d)
+{
+       uint32_t reg;
+
+       s->addr_cena = d->cena_bar;
+       s->addr_cinh = d->cinh_bar;
+       s->cena = (void *)valloc(CONFIG_SYS_PAGE_SIZE);
+       memset((void *)s->cena, 0x00, CONFIG_SYS_PAGE_SIZE);
+       if (!s->cena) {
+               printf("Could not allocate page for cena shadow\n");
+               return -1;
+       }
+
+#ifdef QBMAN_CHECKING
+       /* We should never be asked to initialise for a portal that isn't in
+        * the power-on state. (Ie. don't forget to reset portals when they are
+        * decommissioned!)
+        */
+       reg = qbman_cinh_read(s, QBMAN_CINH_SWP_CFG);
+       BUG_ON(reg);
+#endif
+#ifdef QBMAN_CINH_ONLY
+       reg = qbman_set_swp_cfg(4, 1, 0, 3, 2, 3, 0, 1, 0, 1, 0, 0);
+#else
+       reg = qbman_set_swp_cfg(4, 0, 0, 3, 2, 3, 0, 1, 0, 1, 0, 0);
+#endif
+       qbman_cinh_write(s, QBMAN_CINH_SWP_CFG, reg);
+       reg = qbman_cinh_read(s, QBMAN_CINH_SWP_CFG);
+       if (!reg) {
+               printf("The portal is not enabled!\n");
+               free(s->cena);
+               return -1;
+       }
+       return 0;
+}
+
+static inline void qbman_swp_sys_finish(struct qbman_swp_sys *s)
+{
+       free((void *)s->cena);
+}
index cc14c7b7559c97ecf50f17a58bdd0886d0c1c459..01ee1126a97e4308f30267af9936d2c710ed42de 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright 2014 Freescale Semiconductor Inc.
+/* Copyright 2013-2015 Freescale Semiconductor Inc.
  *
  * SPDX-License-Identifier:    GPL-2.0+
  */
@@ -26,66 +26,3 @@ int mc_get_version(struct fsl_mc_io *mc_io, struct mc_version *mc_ver_info)
 
        return 0;
 }
-
-int dpmng_reset_aiop(struct fsl_mc_io *mc_io, int container_id,
-                    int aiop_tile_id)
-{
-       struct mc_command cmd = { 0 };
-
-       /* prepare command */
-       cmd.header = mc_encode_cmd_header(DPMNG_CMDID_RESET_AIOP,
-                                         MC_CMD_PRI_LOW, 0);
-       DPMNG_CMD_RESET_AIOP(cmd, container_id, aiop_tile_id);
-
-       /* send command to mc*/
-       return mc_send_command(mc_io, &cmd);
-}
-
-int dpmng_load_aiop(struct fsl_mc_io *mc_io,
-                   int container_id,
-                   int aiop_tile_id,
-                   uint64_t img_iova,
-                   uint32_t img_size)
-{
-       struct mc_command cmd = { 0 };
-
-       /* prepare command */
-       cmd.header = mc_encode_cmd_header(DPMNG_CMDID_LOAD_AIOP,
-                                         MC_CMD_PRI_LOW,
-                                         0);
-       DPMNG_CMD_LOAD_AIOP(cmd, container_id, aiop_tile_id, img_size,
-                           img_iova);
-
-       /* send command to mc*/
-       return mc_send_command(mc_io, &cmd);
-}
-
-int dpmng_run_aiop(struct fsl_mc_io *mc_io,
-                  int container_id,
-                  int aiop_tile_id,
-                  const struct dpmng_aiop_run_cfg *cfg)
-{
-       struct mc_command cmd = { 0 };
-
-       /* prepare command */
-       cmd.header = mc_encode_cmd_header(DPMNG_CMDID_RUN_AIOP,
-                                         MC_CMD_PRI_LOW,
-                                         0);
-       DPMNG_CMD_RUN_AIOP(cmd, container_id, aiop_tile_id, cfg);
-
-       /* send command to mc*/
-       return mc_send_command(mc_io, &cmd);
-}
-
-int dpmng_reset_mc_portal(struct fsl_mc_io *mc_io)
-{
-       struct mc_command cmd = { 0 };
-
-       /* prepare command */
-       cmd.header = mc_encode_cmd_header(DPMNG_CMDID_RESET_MC_PORTAL,
-                                         MC_CMD_PRI_LOW,
-                                         0);
-
-       /* send command to mc*/
-       return mc_send_command(mc_io, &cmd);
-}
diff --git a/drivers/net/fsl-mc/dpni.c b/drivers/net/fsl-mc/dpni.c
new file mode 100644 (file)
index 0000000..b384401
--- /dev/null
@@ -0,0 +1,506 @@
+/*
+ * Copyright (C) 2013-2015 Freescale Semiconductor
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#include <fsl-mc/fsl_mc_sys.h>
+#include <fsl-mc/fsl_mc_cmd.h>
+#include <fsl-mc/fsl_dpni.h>
+
+int dpni_open(struct fsl_mc_io *mc_io, int dpni_id, uint16_t *token)
+{
+       struct mc_command cmd = { 0 };
+       int err;
+
+       /* prepare command */
+       cmd.header = mc_encode_cmd_header(DPNI_CMDID_OPEN,
+                                         MC_CMD_PRI_LOW, 0);
+       DPNI_CMD_OPEN(cmd, dpni_id);
+
+       /* send command to mc*/
+       err = mc_send_command(mc_io, &cmd);
+       if (err)
+               return err;
+
+       /* retrieve response parameters */
+       *token = MC_CMD_HDR_READ_TOKEN(cmd.header);
+
+       return 0;
+}
+
+int dpni_close(struct fsl_mc_io *mc_io, uint16_t token)
+{
+       struct mc_command cmd = { 0 };
+
+       /* prepare command */
+       cmd.header = mc_encode_cmd_header(DPNI_CMDID_CLOSE,
+                                         MC_CMD_PRI_HIGH, token);
+
+       /* send command to mc*/
+       return mc_send_command(mc_io, &cmd);
+}
+
+int dpni_set_pools(struct fsl_mc_io *mc_io,
+                  uint16_t token,
+                  const struct dpni_pools_cfg *cfg)
+{
+       struct mc_command cmd = { 0 };
+
+       /* prepare command */
+       cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_POOLS,
+                                         MC_CMD_PRI_LOW,
+                                         token);
+       DPNI_CMD_SET_POOLS(cmd, cfg);
+
+       /* send command to mc*/
+       return mc_send_command(mc_io, &cmd);
+}
+
+int dpni_enable(struct fsl_mc_io *mc_io, uint16_t token)
+{
+       struct mc_command cmd = { 0 };
+
+       /* prepare command */
+       cmd.header = mc_encode_cmd_header(DPNI_CMDID_ENABLE,
+                                         MC_CMD_PRI_LOW, token);
+
+       /* send command to mc*/
+       return mc_send_command(mc_io, &cmd);
+}
+
+int dpni_disable(struct fsl_mc_io *mc_io, uint16_t token)
+{
+       struct mc_command cmd = { 0 };
+
+       /* prepare command */
+       cmd.header = mc_encode_cmd_header(DPNI_CMDID_DISABLE,
+                                         MC_CMD_PRI_LOW,
+                                         token);
+
+       /* send command to mc*/
+       return mc_send_command(mc_io, &cmd);
+}
+
+int dpni_reset(struct fsl_mc_io *mc_io, uint16_t token)
+{
+       struct mc_command cmd = { 0 };
+
+       /* prepare command */
+       cmd.header = mc_encode_cmd_header(DPNI_CMDID_RESET,
+                                         MC_CMD_PRI_LOW, token);
+
+       /* send command to mc*/
+       return mc_send_command(mc_io, &cmd);
+}
+
+int dpni_get_attributes(struct fsl_mc_io *mc_io,
+                       uint16_t token,
+                       struct dpni_attr *attr)
+{
+       struct mc_command cmd = { 0 };
+       int err;
+
+       /* prepare command */
+       cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_ATTR,
+                                         MC_CMD_PRI_LOW,
+                                         token);
+
+       /* send command to mc*/
+       err = mc_send_command(mc_io, &cmd);
+       if (err)
+               return err;
+
+       /* retrieve response parameters */
+       DPNI_RSP_GET_ATTR(cmd, attr);
+
+       return 0;
+}
+
+int dpni_get_rx_buffer_layout(struct fsl_mc_io *mc_io,
+                             uint16_t token,
+                             struct dpni_buffer_layout *layout)
+{
+       struct mc_command cmd = { 0 };
+       int err;
+
+       /* prepare command */
+       cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_RX_BUFFER_LAYOUT,
+                                         MC_CMD_PRI_LOW, token);
+
+       /* send command to mc*/
+       err = mc_send_command(mc_io, &cmd);
+       if (err)
+               return err;
+
+       /* retrieve response parameters */
+       DPNI_RSP_GET_RX_BUFFER_LAYOUT(cmd, layout);
+
+       return 0;
+}
+
+int dpni_set_rx_buffer_layout(struct fsl_mc_io *mc_io,
+                             uint16_t token,
+                             const struct dpni_buffer_layout *layout)
+{
+       struct mc_command cmd = { 0 };
+
+       /* prepare command */
+       cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_RX_BUFFER_LAYOUT,
+                                         MC_CMD_PRI_LOW, token);
+       DPNI_CMD_SET_RX_BUFFER_LAYOUT(cmd, layout);
+
+       /* send command to mc*/
+       return mc_send_command(mc_io, &cmd);
+}
+
+int dpni_get_tx_buffer_layout(struct fsl_mc_io *mc_io,
+                             uint16_t token,
+                             struct dpni_buffer_layout *layout)
+{
+       struct mc_command cmd = { 0 };
+       int err;
+
+       /* prepare command */
+       cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_TX_BUFFER_LAYOUT,
+                                         MC_CMD_PRI_LOW, token);
+
+       /* send command to mc*/
+       err = mc_send_command(mc_io, &cmd);
+       if (err)
+               return err;
+
+       /* retrieve response parameters */
+       DPNI_RSP_GET_TX_BUFFER_LAYOUT(cmd, layout);
+
+       return 0;
+}
+
+int dpni_set_tx_buffer_layout(struct fsl_mc_io *mc_io,
+                             uint16_t token,
+                             const struct dpni_buffer_layout *layout)
+{
+       struct mc_command cmd = { 0 };
+
+       /* prepare command */
+       cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_TX_BUFFER_LAYOUT,
+                                         MC_CMD_PRI_LOW, token);
+       DPNI_CMD_SET_TX_BUFFER_LAYOUT(cmd, layout);
+
+       /* send command to mc*/
+       return mc_send_command(mc_io, &cmd);
+}
+
+int dpni_get_tx_conf_buffer_layout(struct fsl_mc_io *mc_io,
+                                  uint16_t token,
+                                  struct dpni_buffer_layout *layout)
+{
+       struct mc_command cmd = { 0 };
+       int err;
+
+       /* prepare command */
+       cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_TX_CONF_BUFFER_LAYOUT,
+                                         MC_CMD_PRI_LOW, token);
+
+       /* send command to mc*/
+       err = mc_send_command(mc_io, &cmd);
+       if (err)
+               return err;
+
+       /* retrieve response parameters */
+       DPNI_RSP_GET_TX_CONF_BUFFER_LAYOUT(cmd, layout);
+
+       return 0;
+}
+
+int dpni_set_tx_conf_buffer_layout(struct fsl_mc_io *mc_io,
+                                  uint16_t token,
+                                  const struct dpni_buffer_layout *layout)
+{
+       struct mc_command cmd = { 0 };
+
+       /* prepare command */
+       cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_TX_CONF_BUFFER_LAYOUT,
+                                         MC_CMD_PRI_LOW, token);
+       DPNI_CMD_SET_TX_CONF_BUFFER_LAYOUT(cmd, layout);
+
+       /* send command to mc*/
+       return mc_send_command(mc_io, &cmd);
+}
+
+int dpni_get_qdid(struct fsl_mc_io *mc_io, uint16_t token, uint16_t *qdid)
+{
+       struct mc_command cmd = { 0 };
+       int err;
+
+       /* prepare command */
+       cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_QDID,
+                                         MC_CMD_PRI_LOW,
+                                         token);
+
+       /* send command to mc*/
+       err = mc_send_command(mc_io, &cmd);
+       if (err)
+               return err;
+
+       /* retrieve response parameters */
+       DPNI_RSP_GET_QDID(cmd, *qdid);
+
+       return 0;
+}
+
+int dpni_get_tx_data_offset(struct fsl_mc_io *mc_io,
+                           uint16_t token,
+                           uint16_t *data_offset)
+{
+       struct mc_command cmd = { 0 };
+       int err;
+
+       /* prepare command */
+       cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_TX_DATA_OFFSET,
+                                         MC_CMD_PRI_LOW, token);
+
+       /* send command to mc*/
+       err = mc_send_command(mc_io, &cmd);
+       if (err)
+               return err;
+
+       /* retrieve response parameters */
+       DPNI_RSP_GET_TX_DATA_OFFSET(cmd, *data_offset);
+
+       return 0;
+}
+
+int dpni_get_counter(struct fsl_mc_io *mc_io,
+                    uint16_t token,
+                    enum dpni_counter counter,
+                    uint64_t *value)
+{
+       struct mc_command cmd = { 0 };
+       int err;
+
+       /* prepare command */
+       cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_COUNTER,
+                                         MC_CMD_PRI_LOW, token);
+       DPNI_CMD_GET_COUNTER(cmd, counter);
+
+       /* send command to mc*/
+       err = mc_send_command(mc_io, &cmd);
+       if (err)
+               return err;
+
+       /* retrieve response parameters */
+       DPNI_RSP_GET_COUNTER(cmd, *value);
+
+       return 0;
+}
+
+int dpni_set_counter(struct fsl_mc_io *mc_io,
+                    uint16_t token,
+                    enum dpni_counter counter,
+                    uint64_t value)
+{
+       struct mc_command cmd = { 0 };
+
+       /* prepare command */
+       cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_COUNTER,
+                                         MC_CMD_PRI_LOW, token);
+       DPNI_CMD_SET_COUNTER(cmd, counter, value);
+
+       /* send command to mc*/
+       return mc_send_command(mc_io, &cmd);
+}
+
+int dpni_set_link_cfg(struct fsl_mc_io *mc_io,
+                     uint16_t token,
+                    struct dpni_link_cfg *cfg)
+{
+       struct mc_command cmd = { 0 };
+
+       /* prepare command */
+       cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_LINK_CFG,
+                                         MC_CMD_PRI_LOW, token);
+       DPNI_CMD_SET_LINK_CFG(cmd, cfg);
+
+       /* send command to mc*/
+       return mc_send_command(mc_io, &cmd);
+}
+
+int dpni_get_link_state(struct fsl_mc_io *mc_io,
+                       uint16_t token,
+                       struct dpni_link_state *state)
+{
+       struct mc_command cmd = { 0 };
+       int err;
+
+       /* prepare command */
+       cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_LINK_STATE,
+                                         MC_CMD_PRI_LOW, token);
+
+       /* send command to mc*/
+       err = mc_send_command(mc_io, &cmd);
+       if (err)
+               return err;
+
+       /* retrieve response parameters */
+       DPNI_RSP_GET_LINK_STATE(cmd, state);
+
+       return 0;
+}
+
+
+int dpni_set_primary_mac_addr(struct fsl_mc_io *mc_io,
+                             uint16_t token,
+                             const uint8_t mac_addr[6])
+{
+       struct mc_command cmd = { 0 };
+
+       /* prepare command */
+       cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_PRIM_MAC,
+                                         MC_CMD_PRI_LOW, token);
+       DPNI_CMD_SET_PRIMARY_MAC_ADDR(cmd, mac_addr);
+
+       /* send command to mc*/
+       return mc_send_command(mc_io, &cmd);
+}
+
+int dpni_get_primary_mac_addr(struct fsl_mc_io *mc_io,
+                             uint16_t token,
+                             uint8_t mac_addr[6])
+{
+       struct mc_command cmd = { 0 };
+       int err;
+
+       /* prepare command */
+       cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_PRIM_MAC,
+                                         MC_CMD_PRI_LOW, token);
+
+       /* send command to mc*/
+       err = mc_send_command(mc_io, &cmd);
+       if (err)
+               return err;
+
+       /* retrieve response parameters */
+       DPNI_RSP_GET_PRIMARY_MAC_ADDR(cmd, mac_addr);
+
+       return 0;
+}
+
+int dpni_add_mac_addr(struct fsl_mc_io *mc_io,
+                     uint16_t token,
+                     const uint8_t mac_addr[6])
+{
+       struct mc_command cmd = { 0 };
+
+       /* prepare command */
+       cmd.header = mc_encode_cmd_header(DPNI_CMDID_ADD_MAC_ADDR,
+                                         MC_CMD_PRI_LOW, token);
+       DPNI_CMD_ADD_MAC_ADDR(cmd, mac_addr);
+
+       /* send command to mc*/
+       return mc_send_command(mc_io, &cmd);
+}
+
+int dpni_remove_mac_addr(struct fsl_mc_io *mc_io,
+                        uint16_t token,
+                        const uint8_t mac_addr[6])
+{
+       struct mc_command cmd = { 0 };
+
+       /* prepare command */
+       cmd.header = mc_encode_cmd_header(DPNI_CMDID_REMOVE_MAC_ADDR,
+                                         MC_CMD_PRI_LOW, token);
+       DPNI_CMD_REMOVE_MAC_ADDR(cmd, mac_addr);
+
+       /* send command to mc*/
+       return mc_send_command(mc_io, &cmd);
+}
+
+int dpni_set_tx_flow(struct fsl_mc_io *mc_io,
+                    uint16_t token,
+                    uint16_t *flow_id,
+                    const struct dpni_tx_flow_cfg *cfg)
+{
+       struct mc_command cmd = { 0 };
+       int err;
+
+       /* prepare command */
+       cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_TX_FLOW,
+                                         MC_CMD_PRI_LOW, token);
+       DPNI_CMD_SET_TX_FLOW(cmd, *flow_id, cfg);
+
+       /* send command to mc*/
+       err = mc_send_command(mc_io, &cmd);
+       if (err)
+               return err;
+
+       /* retrieve response parameters */
+       DPNI_RSP_SET_TX_FLOW(cmd, *flow_id);
+
+       return 0;
+}
+
+int dpni_get_tx_flow(struct fsl_mc_io *mc_io,
+                    uint16_t token,
+                    uint16_t flow_id,
+                    struct dpni_tx_flow_attr *attr)
+{
+       struct mc_command cmd = { 0 };
+       int err;
+
+       /* prepare command */
+       cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_TX_FLOW,
+                                         MC_CMD_PRI_LOW, token);
+       DPNI_CMD_GET_TX_FLOW(cmd, flow_id);
+
+       /* send command to mc*/
+       err = mc_send_command(mc_io, &cmd);
+       if (err)
+               return err;
+
+       /* retrieve response parameters */
+       DPNI_RSP_GET_TX_FLOW(cmd, attr);
+
+       return 0;
+}
+
+int dpni_set_rx_flow(struct fsl_mc_io *mc_io,
+                    uint16_t token,
+                    uint8_t tc_id,
+                    uint16_t flow_id,
+                    const struct dpni_queue_cfg *cfg)
+{
+       struct mc_command cmd = { 0 };
+
+       /* prepare command */
+       cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_RX_FLOW,
+                                         MC_CMD_PRI_LOW, token);
+       DPNI_CMD_SET_RX_FLOW(cmd, tc_id, flow_id, cfg);
+
+       /* send command to mc*/
+       return mc_send_command(mc_io, &cmd);
+}
+
+int dpni_get_rx_flow(struct fsl_mc_io *mc_io,
+                    uint16_t token,
+                    uint8_t tc_id,
+                    uint16_t flow_id,
+                    struct dpni_queue_attr *attr)
+{
+       struct mc_command cmd = { 0 };
+       int err;
+       /* prepare command */
+       cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_RX_FLOW,
+                                         MC_CMD_PRI_LOW, token);
+       DPNI_CMD_GET_RX_FLOW(cmd, tc_id, flow_id);
+
+       /* send command to mc*/
+       err = mc_send_command(mc_io, &cmd);
+       if (err)
+               return err;
+
+       /* retrieve response parameters */
+       DPNI_RSP_GET_RX_FLOW(cmd, attr);
+
+       return 0;
+}
diff --git a/drivers/net/fsl-mc/dprc.c b/drivers/net/fsl-mc/dprc.c
new file mode 100644 (file)
index 0000000..d481200
--- /dev/null
@@ -0,0 +1,283 @@
+/*
+ * Freescale Layerscape MC I/O wrapper
+ *
+ * Copyright (C) 2013-2015 Freescale Semiconductor, Inc.
+ * Author: German Rivera <German.Rivera@freescale.com>
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#include <fsl-mc/fsl_mc_sys.h>
+#include <fsl-mc/fsl_mc_cmd.h>
+#include <fsl-mc/fsl_dprc.h>
+
+int dprc_get_container_id(struct fsl_mc_io *mc_io, int *container_id)
+{
+       struct mc_command cmd = { 0 };
+       int err;
+
+       /* prepare command */
+       cmd.header = mc_encode_cmd_header(DPRC_CMDID_GET_CONT_ID,
+                                         MC_CMD_PRI_LOW, 0);
+
+       /* send command to mc*/
+       err = mc_send_command(mc_io, &cmd);
+       if (err)
+               return err;
+
+       /* retrieve response parameters */
+       DPRC_RSP_GET_CONTAINER_ID(cmd, *container_id);
+
+       return 0;
+}
+
+int dprc_open(struct fsl_mc_io *mc_io, int container_id, uint16_t *token)
+{
+       struct mc_command cmd = { 0 };
+       int err;
+
+       /* prepare command */
+       cmd.header = mc_encode_cmd_header(DPRC_CMDID_OPEN, MC_CMD_PRI_LOW,
+                                         0);
+       DPRC_CMD_OPEN(cmd, container_id);
+
+       /* send command to mc*/
+       err = mc_send_command(mc_io, &cmd);
+       if (err)
+               return err;
+
+       /* retrieve response parameters */
+       *token = MC_CMD_HDR_READ_TOKEN(cmd.header);
+
+       return 0;
+}
+
+int dprc_close(struct fsl_mc_io *mc_io, uint16_t token)
+{
+       struct mc_command cmd = { 0 };
+
+       /* prepare command */
+       cmd.header = mc_encode_cmd_header(DPRC_CMDID_CLOSE, MC_CMD_PRI_HIGH,
+                                         token);
+
+       /* send command to mc*/
+       return mc_send_command(mc_io, &cmd);
+}
+
+int dprc_reset_container(struct fsl_mc_io *mc_io,
+                        uint16_t token,
+                        int child_container_id)
+{
+       struct mc_command cmd = { 0 };
+
+       /* prepare command */
+       cmd.header = mc_encode_cmd_header(DPRC_CMDID_RESET_CONT,
+                                         MC_CMD_PRI_LOW, token);
+       DPRC_CMD_RESET_CONTAINER(cmd, child_container_id);
+
+       /* send command to mc*/
+       return mc_send_command(mc_io, &cmd);
+}
+
+int dprc_get_attributes(struct fsl_mc_io *mc_io,
+                       uint16_t token,
+                       struct dprc_attributes *attr)
+{
+       struct mc_command cmd = { 0 };
+       int err;
+
+       /* prepare command */
+       cmd.header = mc_encode_cmd_header(DPRC_CMDID_GET_ATTR,
+                                         MC_CMD_PRI_LOW,
+                                         token);
+
+       /* send command to mc*/
+       err = mc_send_command(mc_io, &cmd);
+       if (err)
+               return err;
+
+       /* retrieve response parameters */
+       DPRC_RSP_GET_ATTRIBUTES(cmd, attr);
+
+       return 0;
+}
+
+int dprc_get_obj_count(struct fsl_mc_io *mc_io, uint16_t token, int *obj_count)
+{
+       struct mc_command cmd = { 0 };
+       int err;
+
+       /* prepare command */
+       cmd.header = mc_encode_cmd_header(DPRC_CMDID_GET_OBJ_COUNT,
+                                         MC_CMD_PRI_LOW, token);
+
+       /* send command to mc*/
+       err = mc_send_command(mc_io, &cmd);
+       if (err)
+               return err;
+
+       /* retrieve response parameters */
+       DPRC_RSP_GET_OBJ_COUNT(cmd, *obj_count);
+
+       return 0;
+}
+
+int dprc_get_obj(struct fsl_mc_io *mc_io,
+                uint16_t token,
+                int obj_index,
+                struct dprc_obj_desc *obj_desc)
+{
+       struct mc_command cmd = { 0 };
+       int err;
+
+       /* prepare command */
+       cmd.header = mc_encode_cmd_header(DPRC_CMDID_GET_OBJ,
+                                         MC_CMD_PRI_LOW,
+                                         token);
+       DPRC_CMD_GET_OBJ(cmd, obj_index);
+
+       /* send command to mc*/
+       err = mc_send_command(mc_io, &cmd);
+       if (err)
+               return err;
+
+       /* retrieve response parameters */
+       DPRC_RSP_GET_OBJ(cmd, obj_desc);
+
+       return 0;
+}
+
+int dprc_get_res_count(struct fsl_mc_io *mc_io,
+                      uint16_t token,
+                      char *type,
+                      int *res_count)
+{
+       struct mc_command cmd = { 0 };
+       int err;
+
+       *res_count = 0;
+
+       /* prepare command */
+       cmd.header = mc_encode_cmd_header(DPRC_CMDID_GET_RES_COUNT,
+                                         MC_CMD_PRI_LOW, token);
+       DPRC_CMD_GET_RES_COUNT(cmd, type);
+
+       /* send command to mc*/
+       err = mc_send_command(mc_io, &cmd);
+       if (err)
+               return err;
+
+       /* retrieve response parameters */
+       DPRC_RSP_GET_RES_COUNT(cmd, *res_count);
+
+       return 0;
+}
+
+int dprc_get_res_ids(struct fsl_mc_io *mc_io,
+                    uint16_t token,
+                    char *type,
+                    struct dprc_res_ids_range_desc *range_desc)
+{
+       struct mc_command cmd = { 0 };
+       int err;
+
+       /* prepare command */
+       cmd.header = mc_encode_cmd_header(DPRC_CMDID_GET_RES_IDS,
+                                         MC_CMD_PRI_LOW, token);
+       DPRC_CMD_GET_RES_IDS(cmd, range_desc, type);
+
+       /* send command to mc*/
+       err = mc_send_command(mc_io, &cmd);
+       if (err)
+               return err;
+
+       /* retrieve response parameters */
+       DPRC_RSP_GET_RES_IDS(cmd, range_desc);
+
+       return 0;
+}
+
+int dprc_get_obj_region(struct fsl_mc_io *mc_io,
+                       uint16_t token,
+                       char *obj_type,
+                       int obj_id,
+                       uint8_t region_index,
+                       struct dprc_region_desc *region_desc)
+{
+       struct mc_command cmd = { 0 };
+       int err;
+
+       /* prepare command */
+       cmd.header = mc_encode_cmd_header(DPRC_CMDID_GET_OBJ_REG,
+                                         MC_CMD_PRI_LOW, token);
+       DPRC_CMD_GET_OBJ_REGION(cmd, obj_type, obj_id, region_index);
+
+       /* send command to mc*/
+       err = mc_send_command(mc_io, &cmd);
+       if (err)
+               return err;
+
+       /* retrieve response parameters */
+       DPRC_RSP_GET_OBJ_REGION(cmd, region_desc);
+
+       return 0;
+}
+
+int dprc_connect(struct fsl_mc_io *mc_io,
+                uint16_t token,
+                const struct dprc_endpoint *endpoint1,
+                const struct dprc_endpoint *endpoint2)
+{
+       struct mc_command cmd = { 0 };
+
+       /* prepare command */
+       cmd.header = mc_encode_cmd_header(DPRC_CMDID_CONNECT,
+                                         MC_CMD_PRI_LOW,
+                                         token);
+       DPRC_CMD_CONNECT(cmd, endpoint1, endpoint2);
+
+       /* send command to mc*/
+       return mc_send_command(mc_io, &cmd);
+}
+
+int dprc_disconnect(struct fsl_mc_io *mc_io,
+                   uint16_t token,
+                   const struct dprc_endpoint *endpoint)
+{
+       struct mc_command cmd = { 0 };
+
+       /* prepare command */
+       cmd.header = mc_encode_cmd_header(DPRC_CMDID_DISCONNECT,
+                                         MC_CMD_PRI_LOW,
+                                         token);
+       DPRC_CMD_DISCONNECT(cmd, endpoint);
+
+       /* send command to mc*/
+       return mc_send_command(mc_io, &cmd);
+}
+
+int dprc_get_connection(struct fsl_mc_io *mc_io,
+                       uint16_t token,
+                                       const struct dprc_endpoint *endpoint1,
+                                       struct dprc_endpoint *endpoint2,
+                                       int *state)
+{
+       struct mc_command cmd = { 0 };
+       int err;
+
+       /* prepare command */
+       cmd.header = mc_encode_cmd_header(DPRC_CMDID_GET_CONNECTION,
+                                         MC_CMD_PRI_LOW,
+                                         token);
+       DPRC_CMD_GET_CONNECTION(cmd, endpoint1);
+
+       /* send command to mc*/
+       err = mc_send_command(mc_io, &cmd);
+       if (err)
+               return err;
+
+       /* retrieve response parameters */
+       DPRC_RSP_GET_CONNECTION(cmd, endpoint2, *state);
+
+       return 0;
+}
index c9fe021f4558bb091c9c4cc94a9535a8442ec88d..33f84f39bb94cc788b261c2c2956861560def85d 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright 2014 Freescale Semiconductor Inc.
+/* Copyright 2013-2015 Freescale Semiconductor Inc.
  *
  * SPDX-License-Identifier:    GPL-2.0+
  */
@@ -7,10 +7,6 @@
 
 /* Command IDs */
 #define DPMNG_CMDID_GET_VERSION                        0x831
-#define DPMNG_CMDID_RESET_AIOP                 0x832
-#define DPMNG_CMDID_LOAD_AIOP                  0x833
-#define DPMNG_CMDID_RUN_AIOP                   0x834
-#define DPMNG_CMDID_RESET_MC_PORTAL            0x835
 
 /*                cmd, param, offset, width, type, arg_name */
 #define DPMNG_RSP_GET_VERSION(cmd, mc_ver_info) \
@@ -20,30 +16,4 @@ do { \
        MC_RSP_OP(cmd, 1, 0,  32, uint32_t, mc_ver_info->minor); \
 } while (0)
 
-/*                cmd, param, offset, width, type, arg_name */
-#define DPMNG_CMD_RESET_AIOP(cmd, container_id, aiop_tile_id) \
-do { \
-       MC_CMD_OP(cmd, 0, 0,  32, int,      aiop_tile_id); \
-       MC_CMD_OP(cmd, 0, 32, 32, int,      container_id); \
-} while (0)
-
-/*                cmd, param, offset, width, type, arg_name */
-#define DPMNG_CMD_LOAD_AIOP(cmd, container_id, aiop_tile_id, img_size, \
-                           img_iova) \
-do { \
-       MC_CMD_OP(cmd, 0, 0,  32, int,      aiop_tile_id); \
-       MC_CMD_OP(cmd, 0, 32, 32, int,      container_id); \
-       MC_CMD_OP(cmd, 1, 0,  32, uint32_t, img_size); \
-       MC_CMD_OP(cmd, 2, 0,  64, uint64_t, img_iova); \
-} while (0)
-
-/*                cmd, param, offset, width, type, arg_name */
-#define DPMNG_CMD_RUN_AIOP(cmd, container_id, aiop_tile_id, cfg) \
-do { \
-       MC_CMD_OP(cmd, 0, 0,  32, int,      aiop_tile_id); \
-       MC_CMD_OP(cmd, 0, 32, 32, int,      container_id); \
-       MC_CMD_OP(cmd, 1, 0,  32, uint32_t, cfg->cores_mask); \
-       MC_CMD_OP(cmd, 2, 0,  64, uint64_t, cfg->options); \
-} while (0)
-
 #endif /* __FSL_DPMNG_CMD_H */
index 74b0085301c5ac407089971399ba49ec8c713355..c5c44bcab044edc20128e48396b8b6dce4383fee 100644 (file)
@@ -3,16 +3,75 @@
  *
  * SPDX-License-Identifier:    GPL-2.0+
  */
-
 #include <errno.h>
 #include <asm/io.h>
 #include <fsl-mc/fsl_mc.h>
 #include <fsl-mc/fsl_mc_sys.h>
+#include <fsl-mc/fsl_mc_private.h>
 #include <fsl-mc/fsl_dpmng.h>
+#include <fsl_debug_server.h>
+#include <fsl-mc/fsl_dprc.h>
+#include <fsl-mc/fsl_dpio.h>
+#include <fsl-mc/fsl_qbman_portal.h>
+
+#define MC_RAM_BASE_ADDR_ALIGNMENT  (512UL * 1024 * 1024)
+#define MC_RAM_BASE_ADDR_ALIGNMENT_MASK        (~(MC_RAM_BASE_ADDR_ALIGNMENT - 1))
+#define MC_RAM_SIZE_ALIGNMENT      (256UL * 1024 * 1024)
+
+#define MC_MEM_SIZE_ENV_VAR    "mcmemsize"
+#define MC_BOOT_TIMEOUT_ENV_VAR        "mcboottimeout"
 
 DECLARE_GLOBAL_DATA_PTR;
 static int mc_boot_status;
+struct fsl_mc_io *dflt_mc_io = NULL;
+uint16_t dflt_dprc_handle = 0;
+struct fsl_dpbp_obj *dflt_dpbp = NULL;
+struct fsl_dpio_obj *dflt_dpio = NULL;
+uint16_t dflt_dpio_handle = 0;
+
+#ifdef DEBUG
+void dump_ram_words(const char *title, void *addr)
+{
+       int i;
+       uint32_t *words = addr;
+
+       printf("Dumping beginning of %s (%p):\n", title, addr);
+       for (i = 0; i < 16; i++)
+               printf("%#x ", words[i]);
 
+       printf("\n");
+}
+
+void dump_mc_ccsr_regs(struct mc_ccsr_registers __iomem *mc_ccsr_regs)
+{
+       printf("MC CCSR registers:\n"
+               "reg_gcr1 %#x\n"
+               "reg_gsr %#x\n"
+               "reg_sicbalr %#x\n"
+               "reg_sicbahr %#x\n"
+               "reg_sicapr %#x\n"
+               "reg_mcfbalr %#x\n"
+               "reg_mcfbahr %#x\n"
+               "reg_mcfapr %#x\n"
+               "reg_psr %#x\n",
+               mc_ccsr_regs->reg_gcr1,
+               mc_ccsr_regs->reg_gsr,
+               mc_ccsr_regs->reg_sicbalr,
+               mc_ccsr_regs->reg_sicbahr,
+               mc_ccsr_regs->reg_sicapr,
+               mc_ccsr_regs->reg_mcfbalr,
+               mc_ccsr_regs->reg_mcfbahr,
+               mc_ccsr_regs->reg_mcfapr,
+               mc_ccsr_regs->reg_psr);
+}
+#else
+
+#define dump_ram_words(title, addr)
+#define dump_mc_ccsr_regs(mc_ccsr_regs)
+
+#endif /* DEBUG */
+
+#ifndef CONFIG_SYS_LS_MC_FW_IN_DDR
 /**
  * Copying MC firmware or DPL image to DDR
  */
@@ -21,6 +80,7 @@ static int mc_copy_image(const char *title,
 {
        debug("%s copied to address %p\n", title, (void *)mc_ram_addr);
        memcpy((void *)mc_ram_addr, (void *)image_addr, image_size);
+       flush_dcache_range(mc_ram_addr, mc_ram_addr + image_size);
        return 0;
 }
 
@@ -82,23 +142,254 @@ int parse_mc_firmware_fit_image(const void **raw_image_addr,
 
        return 0;
 }
+#endif
+
+/*
+ * Calculates the values to be used to specify the address range
+ * for the MC private DRAM block, in the MCFBALR/MCFBAHR registers.
+ * It returns the highest 512MB-aligned address within the given
+ * address range, in '*aligned_base_addr', and the number of 256 MiB
+ * blocks in it, in 'num_256mb_blocks'.
+ */
+static int calculate_mc_private_ram_params(u64 mc_private_ram_start_addr,
+                                          size_t mc_ram_size,
+                                          u64 *aligned_base_addr,
+                                          u8 *num_256mb_blocks)
+{
+       u64 addr;
+       u16 num_blocks;
+
+       if (mc_ram_size % MC_RAM_SIZE_ALIGNMENT != 0) {
+               printf("fsl-mc: ERROR: invalid MC private RAM size (%lu)\n",
+                      mc_ram_size);
+               return -EINVAL;
+       }
+
+       num_blocks = mc_ram_size / MC_RAM_SIZE_ALIGNMENT;
+       if (num_blocks < 1 || num_blocks > 0xff) {
+               printf("fsl-mc: ERROR: invalid MC private RAM size (%lu)\n",
+                      mc_ram_size);
+               return -EINVAL;
+       }
+
+       addr = (mc_private_ram_start_addr + mc_ram_size - 1) &
+               MC_RAM_BASE_ADDR_ALIGNMENT_MASK;
+
+       if (addr < mc_private_ram_start_addr) {
+               printf("fsl-mc: ERROR: bad start address %#llx\n",
+                      mc_private_ram_start_addr);
+               return -EFAULT;
+       }
+
+       *aligned_base_addr = addr;
+       *num_256mb_blocks = num_blocks;
+       return 0;
+}
+
+static int load_mc_dpc(u64 mc_ram_addr, size_t mc_ram_size)
+{
+       u64 mc_dpc_offset;
+#ifndef CONFIG_SYS_LS_MC_DPC_IN_DDR
+       int error;
+       void *dpc_fdt_hdr;
+       int dpc_size;
+#endif
+
+#ifdef CONFIG_SYS_LS_MC_DRAM_DPC_OFFSET
+       BUILD_BUG_ON((CONFIG_SYS_LS_MC_DRAM_DPC_OFFSET & 0x3) != 0 ||
+                    CONFIG_SYS_LS_MC_DRAM_DPC_OFFSET > 0xffffffff);
+
+       mc_dpc_offset = CONFIG_SYS_LS_MC_DRAM_DPC_OFFSET;
+#else
+#error "CONFIG_SYS_LS_MC_DRAM_DPC_OFFSET not defined"
+#endif
+
+       /*
+        * Load the MC DPC blob in the MC private DRAM block:
+        */
+#ifdef CONFIG_SYS_LS_MC_DPC_IN_DDR
+       printf("MC DPC is preloaded to %#llx\n", mc_ram_addr + mc_dpc_offset);
+#else
+       /*
+        * Get address and size of the DPC blob stored in flash:
+        */
+#ifdef CONFIG_SYS_LS_MC_DPC_IN_NOR
+       dpc_fdt_hdr = (void *)CONFIG_SYS_LS_MC_DPC_ADDR;
+#else
+#error "No CONFIG_SYS_LS_MC_DPC_IN_xxx defined"
+#endif
+
+       error = fdt_check_header(dpc_fdt_hdr);
+       if (error != 0) {
+               /*
+                * Don't return with error here, since the MC firmware can
+                * still boot without a DPC
+                */
+               printf("fsl-mc: WARNING: No DPC image found\n");
+               return 0;
+       }
+
+       dpc_size = fdt_totalsize(dpc_fdt_hdr);
+       if (dpc_size > CONFIG_SYS_LS_MC_DPC_MAX_LENGTH) {
+               printf("fsl-mc: ERROR: Bad DPC image (too large: %d)\n",
+                      dpc_size);
+               return -EINVAL;
+       }
+
+       mc_copy_image("MC DPC blob",
+                     (u64)dpc_fdt_hdr, dpc_size, mc_ram_addr + mc_dpc_offset);
+#endif /* not defined CONFIG_SYS_LS_MC_DPC_IN_DDR */
+
+       dump_ram_words("DPC", (void *)(mc_ram_addr + mc_dpc_offset));
+       return 0;
+}
 
-int mc_init(bd_t *bis)
+static int load_mc_dpl(u64 mc_ram_addr, size_t mc_ram_size)
+{
+       u64 mc_dpl_offset;
+#ifndef CONFIG_SYS_LS_MC_DPL_IN_DDR
+       int error;
+       void *dpl_fdt_hdr;
+       int dpl_size;
+#endif
+
+#ifdef CONFIG_SYS_LS_MC_DRAM_DPL_OFFSET
+       BUILD_BUG_ON((CONFIG_SYS_LS_MC_DRAM_DPL_OFFSET & 0x3) != 0 ||
+                    CONFIG_SYS_LS_MC_DRAM_DPL_OFFSET > 0xffffffff);
+
+       mc_dpl_offset = CONFIG_SYS_LS_MC_DRAM_DPL_OFFSET;
+#else
+#error "CONFIG_SYS_LS_MC_DRAM_DPL_OFFSET not defined"
+#endif
+
+       /*
+        * Load the MC DPL blob in the MC private DRAM block:
+        */
+#ifdef CONFIG_SYS_LS_MC_DPL_IN_DDR
+       printf("MC DPL is preloaded to %#llx\n", mc_ram_addr + mc_dpl_offset);
+#else
+       /*
+        * Get address and size of the DPL blob stored in flash:
+        */
+#ifdef CONFIG_SYS_LS_MC_DPL_IN_NOR
+       dpl_fdt_hdr = (void *)CONFIG_SYS_LS_MC_DPL_ADDR;
+#else
+#error "No CONFIG_SYS_LS_MC_DPL_IN_xxx defined"
+#endif
+
+       error = fdt_check_header(dpl_fdt_hdr);
+       if (error != 0) {
+               printf("fsl-mc: ERROR: Bad DPL image (bad header)\n");
+               return error;
+       }
+
+       dpl_size = fdt_totalsize(dpl_fdt_hdr);
+       if (dpl_size > CONFIG_SYS_LS_MC_DPL_MAX_LENGTH) {
+               printf("fsl-mc: ERROR: Bad DPL image (too large: %d)\n",
+                      dpl_size);
+               return -EINVAL;
+       }
+
+       mc_copy_image("MC DPL blob",
+                     (u64)dpl_fdt_hdr, dpl_size, mc_ram_addr + mc_dpl_offset);
+#endif /* not defined CONFIG_SYS_LS_MC_DPL_IN_DDR */
+
+       dump_ram_words("DPL", (void *)(mc_ram_addr + mc_dpl_offset));
+       return 0;
+}
+
+/**
+ * Return the MC boot timeout value in milliseconds
+ */
+static unsigned long get_mc_boot_timeout_ms(void)
+{
+       unsigned long timeout_ms = CONFIG_SYS_LS_MC_BOOT_TIMEOUT_MS;
+
+       char *timeout_ms_env_var = getenv(MC_BOOT_TIMEOUT_ENV_VAR);
+
+       if (timeout_ms_env_var) {
+               timeout_ms = simple_strtoul(timeout_ms_env_var, NULL, 10);
+               if (timeout_ms == 0) {
+                       printf("fsl-mc: WARNING: Invalid value for \'"
+                              MC_BOOT_TIMEOUT_ENV_VAR
+                              "\' environment variable: %lu\n",
+                              timeout_ms);
+
+                       timeout_ms = CONFIG_SYS_LS_MC_BOOT_TIMEOUT_MS;
+               }
+       }
+
+       return timeout_ms;
+}
+
+static int wait_for_mc(bool booting_mc, u32 *final_reg_gsr)
+{
+       u32 reg_gsr;
+       u32 mc_fw_boot_status;
+       unsigned long timeout_ms = get_mc_boot_timeout_ms();
+       struct mc_ccsr_registers __iomem *mc_ccsr_regs = MC_CCSR_BASE_ADDR;
+
+       dmb();
+       debug("Polling mc_ccsr_regs->reg_gsr ...\n");
+       assert(timeout_ms > 0);
+       for (;;) {
+               udelay(1000);   /* throttle polling */
+               reg_gsr = in_le32(&mc_ccsr_regs->reg_gsr);
+               mc_fw_boot_status = (reg_gsr & GSR_FS_MASK);
+               if (mc_fw_boot_status & 0x1)
+                       break;
+
+               timeout_ms--;
+               if (timeout_ms == 0)
+                       break;
+       }
+
+       if (timeout_ms == 0) {
+               if (booting_mc)
+                       printf("fsl-mc: timeout booting management complex firmware\n");
+               else
+                       printf("fsl-mc: timeout deploying data path layout\n");
+
+               /* TODO: Get an error status from an MC CCSR register */
+               return -ETIMEDOUT;
+       }
+
+       if (mc_fw_boot_status != 0x1) {
+               /*
+                * TODO: Identify critical errors from the GSR register's FS
+                * field and for those errors, set error to -ENODEV or other
+                * appropriate errno, so that the status property is set to
+                * failure in the fsl,dprc device tree node.
+                */
+               if (booting_mc) {
+                       printf("fsl-mc: WARNING: Firmware booted with error (GSR: %#x)\n",
+                              reg_gsr);
+               } else {
+                       printf("fsl-mc: WARNING: Data path layout deployed with error (GSR: %#x)\n",
+                              reg_gsr);
+               }
+       }
+
+       *final_reg_gsr = reg_gsr;
+       return 0;
+}
+
+int mc_init(void)
 {
        int error = 0;
-       int timeout = 200000;
+       int portal_id = 0;
        struct mc_ccsr_registers __iomem *mc_ccsr_regs = MC_CCSR_BASE_ADDR;
        u64 mc_ram_addr;
-       u64 mc_dpl_offset;
        u32 reg_gsr;
-       u32 mc_fw_boot_status;
-       void *dpl_fdt_hdr;
-       int dpl_size;
+       u32 reg_mcfbalr;
+#ifndef CONFIG_SYS_LS_MC_FW_IN_DDR
        const void *raw_image_addr;
        size_t raw_image_size = 0;
-       struct fsl_mc_io mc_io;
-       int portal_id;
+#endif
        struct mc_version mc_ver_info;
+       u64 mc_ram_aligned_base_addr;
+       u8 mc_ram_num_256mb_blocks;
+       size_t mc_ram_size = mc_get_dram_block_size();
 
        /*
         * The MC private DRAM block was already carved at the end of DRAM
@@ -112,6 +403,20 @@ int mc_init(bd_t *bis)
                        gd->bd->bi_dram[0].start + gd->bd->bi_dram[0].size;
        }
 
+#ifdef CONFIG_FSL_DEBUG_SERVER
+       /*
+        * FIXME: I don't think this is right. See get_dram_size_to_hide()
+        */
+               mc_ram_addr -= debug_server_get_dram_block_size();
+#endif
+
+       error = calculate_mc_private_ram_params(mc_ram_addr,
+                                               mc_ram_size,
+                                               &mc_ram_aligned_base_addr,
+                                               &mc_ram_num_256mb_blocks);
+       if (error != 0)
+               goto out;
+
        /*
         * Management Complex cores should be held at reset out of POR.
         * U-boot should be the first software to touch MC. To be safe,
@@ -127,6 +432,9 @@ int mc_init(bd_t *bis)
        out_le32(&mc_ccsr_regs->reg_gcr1, 0);
        dmb();
 
+#ifdef CONFIG_SYS_LS_MC_FW_IN_DDR
+       printf("MC firmware is preloaded to %#llx\n", mc_ram_addr);
+#else
        error = parse_mc_firmware_fit_image(&raw_image_addr, &raw_image_size);
        if (error != 0)
                goto out;
@@ -135,83 +443,34 @@ int mc_init(bd_t *bis)
         */
        mc_copy_image("MC Firmware",
                      (u64)raw_image_addr, raw_image_size, mc_ram_addr);
-
-       /*
-        * Get address and size of the DPL blob stored in flash:
-        */
-#ifdef CONFIG_SYS_LS_MC_DPL_IN_NOR
-       dpl_fdt_hdr = (void *)CONFIG_SYS_LS_MC_DPL_ADDR;
-#else
-#error "No CONFIG_SYS_LS_MC_DPL_IN_xxx defined"
 #endif
+       dump_ram_words("firmware", (void *)mc_ram_addr);
 
-       error = fdt_check_header(dpl_fdt_hdr);
-       if (error != 0) {
-               printf("fsl-mc: ERROR: Bad DPL image (bad header)\n");
-               goto out;
-       }
-
-       dpl_size = fdt_totalsize(dpl_fdt_hdr);
-       if (dpl_size > CONFIG_SYS_LS_MC_DPL_MAX_LENGTH) {
-               printf("fsl-mc: ERROR: Bad DPL image (too large: %d)\n",
-                      dpl_size);
-               error = -EINVAL;
+       error = load_mc_dpc(mc_ram_addr, mc_ram_size);
+       if (error != 0)
                goto out;
-       }
 
-       /*
-        * Calculate offset in the MC private DRAM block at which the MC DPL
-        * blob is to be placed:
-        */
-#ifdef CONFIG_SYS_LS_MC_DRAM_DPL_OFFSET
-       BUILD_BUG_ON((CONFIG_SYS_LS_MC_DRAM_DPL_OFFSET & 0x3) != 0 ||
-                    CONFIG_SYS_LS_MC_DRAM_DPL_OFFSET > 0xffffffff);
-
-       mc_dpl_offset = CONFIG_SYS_LS_MC_DRAM_DPL_OFFSET;
-#else
-       mc_dpl_offset = mc_get_dram_block_size() -
-                       roundup(CONFIG_SYS_LS_MC_DPL_MAX_LENGTH, 4096);
-
-       if ((mc_dpl_offset & 0x3) != 0 || mc_dpl_offset > 0xffffffff) {
-               printf("%s: Invalid MC DPL offset: %llu\n",
-                      __func__, mc_dpl_offset);
-               error = -EINVAL;
+       error = load_mc_dpl(mc_ram_addr, mc_ram_size);
+       if (error != 0)
                goto out;
-       }
-#endif
-
-       /*
-        * Load the MC DPL blob at the far end of the MC private DRAM block:
-        *
-        * TODO: Should we place the DPL at a different location to match
-        * assumptions of MC firmware about its memory layout?
-        */
-       mc_copy_image("MC DPL blob",
-                     (u64)dpl_fdt_hdr, dpl_size, mc_ram_addr + mc_dpl_offset);
 
        debug("mc_ccsr_regs %p\n", mc_ccsr_regs);
+       dump_mc_ccsr_regs(mc_ccsr_regs);
 
        /*
-        * Tell MC where the MC Firmware image was loaded in DDR:
+        * Tell MC what is the address range of the DRAM block assigned to it:
         */
-       out_le32(&mc_ccsr_regs->reg_mcfbalr, (u32)mc_ram_addr);
-       out_le32(&mc_ccsr_regs->reg_mcfbahr, (u32)((u64)mc_ram_addr >> 32));
+       reg_mcfbalr = (u32)mc_ram_aligned_base_addr |
+                     (mc_ram_num_256mb_blocks - 1);
+       out_le32(&mc_ccsr_regs->reg_mcfbalr, reg_mcfbalr);
+       out_le32(&mc_ccsr_regs->reg_mcfbahr,
+                (u32)(mc_ram_aligned_base_addr >> 32));
        out_le32(&mc_ccsr_regs->reg_mcfapr, MCFAPR_BYPASS_ICID_MASK);
 
        /*
-        * Tell MC where the DPL blob was loaded in DDR, by indicating
-        * its offset relative to the beginning of the DDR block
-        * allocated to the MC firmware. The MC firmware is responsible
-        * for checking that there is no overlap between the DPL blob
-        * and the runtime heap and stack of the MC firmware itself.
-        *
-        * NOTE: bits [31:2] of this offset need to be stored in bits [29:0] of
-        * the GSR MC CCSR register. So, this offset is assumed to be 4-byte
-        * aligned.
-        * Care must be taken not to write 1s into bits 31 and 30 of the GSR in
-        * this case as the SoC COP or PIC will be signaled.
+        * Tell the MC that we want delayed DPL deployment.
         */
-       out_le32(&mc_ccsr_regs->reg_gsr, (u32)(mc_dpl_offset >> 2));
+       out_le32(&mc_ccsr_regs->reg_gsr, 0xDD00);
 
        printf("\nfsl-mc: Booting Management Complex ...\n");
 
@@ -219,38 +478,9 @@ int mc_init(bd_t *bis)
         * Deassert reset and release MC core 0 to run
         */
        out_le32(&mc_ccsr_regs->reg_gcr1, GCR1_P1_DE_RST | GCR1_M_ALL_DE_RST);
-       dmb();
-       debug("Polling mc_ccsr_regs->reg_gsr ...\n");
-
-       for (;;) {
-               reg_gsr = in_le32(&mc_ccsr_regs->reg_gsr);
-               mc_fw_boot_status = (reg_gsr & GSR_FS_MASK);
-               if (mc_fw_boot_status & 0x1)
-                       break;
-
-               udelay(1000);   /* throttle polling */
-               if (timeout-- <= 0)
-                       break;
-       }
-
-       if (timeout <= 0) {
-               printf("fsl-mc: timeout booting management complex firmware\n");
-
-               /* TODO: Get an error status from an MC CCSR register */
-               error = -ETIMEDOUT;
+       error = wait_for_mc(true, &reg_gsr);
+       if (error != 0)
                goto out;
-       }
-
-       if (mc_fw_boot_status != 0x1) {
-               /*
-                * TODO: Identify critical errors from the GSR register's FS
-                * field and for those errors, set error to -ENODEV or other
-                * appropriate errno, so that the status property is set to
-                * failure in the fsl,dprc device tree node.
-                */
-               printf("fsl-mc: WARNING: Firmware booted with error (GSR: %#x)\n",
-                      reg_gsr);
-       }
 
        /*
         * TODO: need to obtain the portal_id for the root container from the
@@ -259,13 +489,20 @@ int mc_init(bd_t *bis)
        portal_id = 0;
 
        /*
-        * Check that the MC firmware is responding portal commands:
+        * Initialize the global default MC portal
+        * And check that the MC firmware is responding portal commands:
         */
-       mc_io.mmio_regs = SOC_MC_PORTAL_ADDR(portal_id);
+       dflt_mc_io = (struct fsl_mc_io *)malloc(sizeof(struct fsl_mc_io));
+       if (!dflt_mc_io) {
+               printf(" No memory: malloc() failed\n");
+               return -ENOMEM;
+       }
+
+       dflt_mc_io->mmio_regs = SOC_MC_PORTAL_ADDR(portal_id);
        debug("Checking access to MC portal of root DPRC container (portal_id %d, portal physical addr %p)\n",
-             portal_id, mc_io.mmio_regs);
+             portal_id, dflt_mc_io->mmio_regs);
 
-       error = mc_get_version(&mc_io, &mc_ver_info);
+       error = mc_get_version(dflt_mc_io, &mc_ver_info);
        if (error != 0) {
                printf("fsl-mc: ERROR: Firmware version check failed (error: %d)\n",
                       error);
@@ -282,7 +519,16 @@ int mc_init(bd_t *bis)
 
        printf("fsl-mc: Management Complex booted (version: %d.%d.%d, boot status: %#x)\n",
               mc_ver_info.major, mc_ver_info.minor, mc_ver_info.revision,
-              mc_fw_boot_status);
+              reg_gsr & GSR_FS_MASK);
+
+       /*
+        * Tell the MC to deploy the DPL:
+        */
+       out_le32(&mc_ccsr_regs->reg_gsr, 0x0);
+       printf("\nfsl-mc: Deploying data path layout ...\n");
+       error = wait_for_mc(false, &reg_gsr);
+       if (error != 0)
+               goto out;
 out:
        if (error != 0)
                mc_boot_status = -error;
@@ -299,12 +545,242 @@ int get_mc_boot_status(void)
 
 /**
  * Return the actual size of the MC private DRAM block.
- *
- * NOTE: For now this function always returns the minimum required size,
- * However, in the future, the actual size may be obtained from an environment
- * variable.
  */
 unsigned long mc_get_dram_block_size(void)
 {
-       return CONFIG_SYS_LS_MC_DRAM_BLOCK_MIN_SIZE;
+       unsigned long dram_block_size = CONFIG_SYS_LS_MC_DRAM_BLOCK_MIN_SIZE;
+
+       char *dram_block_size_env_var = getenv(MC_MEM_SIZE_ENV_VAR);
+
+       if (dram_block_size_env_var) {
+               dram_block_size = simple_strtoul(dram_block_size_env_var, NULL,
+                                                10);
+
+               if (dram_block_size < CONFIG_SYS_LS_MC_DRAM_BLOCK_MIN_SIZE) {
+                       printf("fsl-mc: WARNING: Invalid value for \'"
+                              MC_MEM_SIZE_ENV_VAR
+                              "\' environment variable: %lu\n",
+                              dram_block_size);
+
+                       dram_block_size = CONFIG_SYS_LS_MC_DRAM_BLOCK_MIN_SIZE;
+               }
+       }
+
+       return dram_block_size;
+}
+
+int dpio_init(struct dprc_obj_desc obj_desc)
+{
+       struct qbman_swp_desc p_des;
+       struct dpio_attr attr;
+       int err = 0;
+
+       dflt_dpio = (struct fsl_dpio_obj *)malloc(sizeof(struct fsl_dpio_obj));
+       if (!dflt_dpio) {
+               printf(" No memory: malloc() failed\n");
+               return -ENOMEM;
+       }
+
+       dflt_dpio->dpio_id = obj_desc.id;
+
+       err = dpio_open(dflt_mc_io, obj_desc.id, &dflt_dpio_handle);
+       if (err) {
+               printf("dpio_open() failed\n");
+               goto err_open;
+       }
+
+       err = dpio_get_attributes(dflt_mc_io, dflt_dpio_handle, &attr);
+       if (err) {
+               printf("dpio_get_attributes() failed %d\n", err);
+               goto err_get_attr;
+       }
+
+       err = dpio_enable(dflt_mc_io, dflt_dpio_handle);
+       if (err) {
+               printf("dpio_enable() failed %d\n", err);
+               goto err_get_enable;
+       }
+       debug("ce_paddr=0x%llx, ci_paddr=0x%llx, portalid=%d, prios=%d\n",
+             attr.qbman_portal_ce_paddr,
+             attr.qbman_portal_ci_paddr,
+             attr.qbman_portal_id,
+             attr.num_priorities);
+
+       p_des.cena_bar = (void *)attr.qbman_portal_ce_paddr;
+       p_des.cinh_bar = (void *)attr.qbman_portal_ci_paddr;
+
+       dflt_dpio->sw_portal = qbman_swp_init(&p_des);
+       if (dflt_dpio->sw_portal == NULL) {
+               printf("qbman_swp_init() failed\n");
+               goto err_get_swp_init;
+       }
+       return 0;
+
+err_get_swp_init:
+err_get_enable:
+       dpio_disable(dflt_mc_io, dflt_dpio_handle);
+err_get_attr:
+       dpio_close(dflt_mc_io, dflt_dpio_handle);
+err_open:
+       free(dflt_dpio);
+       return err;
+}
+
+int dpbp_init(struct dprc_obj_desc obj_desc)
+{
+       dflt_dpbp = (struct fsl_dpbp_obj *)malloc(sizeof(struct fsl_dpbp_obj));
+       if (!dflt_dpbp) {
+               printf(" No memory: malloc() failed\n");
+               return -ENOMEM;
+       }
+       dflt_dpbp->dpbp_attr.id = obj_desc.id;
+
+       return 0;
+}
+
+int dprc_init_container_obj(struct dprc_obj_desc obj_desc, uint16_t dprc_handle)
+{
+       int error = 0, state = 0;
+       struct dprc_endpoint dpni_endpoint, dpmac_endpoint;
+       if (!strcmp(obj_desc.type, "dpbp")) {
+               if (!dflt_dpbp) {
+                       error = dpbp_init(obj_desc);
+                       if (error < 0)
+                               printf("dpbp_init failed\n");
+               }
+       } else if (!strcmp(obj_desc.type, "dpio")) {
+               if (!dflt_dpio) {
+                       error = dpio_init(obj_desc);
+                       if (error < 0)
+                               printf("dpio_init failed\n");
+               }
+       } else if (!strcmp(obj_desc.type, "dpni")) {
+               strcpy(dpni_endpoint.type, obj_desc.type);
+               dpni_endpoint.id = obj_desc.id;
+               error = dprc_get_connection(dflt_mc_io, dprc_handle,
+                                    &dpni_endpoint, &dpmac_endpoint, &state);
+               if (!strcmp(dpmac_endpoint.type, "dpmac"))
+                       error = ldpaa_eth_init(obj_desc);
+               if (error < 0)
+                       printf("ldpaa_eth_init failed\n");
+       }
+
+       return error;
+}
+
+int dprc_scan_container_obj(uint16_t dprc_handle, char *obj_type, int i)
+{
+       int error = 0;
+       struct dprc_obj_desc obj_desc;
+
+       memset((void *)&obj_desc, 0x00, sizeof(struct dprc_obj_desc));
+
+       error = dprc_get_obj(dflt_mc_io, dprc_handle,
+                            i, &obj_desc);
+       if (error < 0) {
+               printf("dprc_get_obj(i=%d) failed: %d\n",
+                      i, error);
+               return error;
+       }
+
+       if (!strcmp(obj_desc.type, obj_type)) {
+               debug("Discovered object: type %s, id %d, req %s\n",
+                     obj_desc.type, obj_desc.id, obj_type);
+
+               error = dprc_init_container_obj(obj_desc, dprc_handle);
+               if (error < 0) {
+                       printf("dprc_init_container_obj(i=%d) failed: %d\n",
+                              i, error);
+                       return error;
+               }
+       }
+
+       return error;
+}
+
+int fsl_mc_ldpaa_init(bd_t *bis)
+{
+       int i, error = 0;
+       int dprc_opened = 0, container_id;
+       int num_child_objects = 0;
+
+       error = mc_init();
+       if (error < 0)
+               goto error;
+
+       error = dprc_get_container_id(dflt_mc_io, &container_id);
+       if (error < 0) {
+               printf("dprc_get_container_id() failed: %d\n", error);
+               goto error;
+       }
+
+       debug("fsl-mc: Container id=0x%x\n", container_id);
+
+       error = dprc_open(dflt_mc_io, container_id, &dflt_dprc_handle);
+       if (error < 0) {
+               printf("dprc_open() failed: %d\n", error);
+               goto error;
+       }
+       dprc_opened = true;
+
+       error = dprc_get_obj_count(dflt_mc_io,
+                                  dflt_dprc_handle,
+                                  &num_child_objects);
+       if (error < 0) {
+               printf("dprc_get_obj_count() failed: %d\n", error);
+               goto error;
+       }
+       debug("Total child in container %d = %d\n", container_id,
+             num_child_objects);
+
+       if (num_child_objects != 0) {
+               /*
+                * Discover objects currently in the DPRC container in the MC:
+                */
+               for (i = 0; i < num_child_objects; i++)
+                       error = dprc_scan_container_obj(dflt_dprc_handle,
+                                                       "dpbp", i);
+
+               for (i = 0; i < num_child_objects; i++)
+                       error = dprc_scan_container_obj(dflt_dprc_handle,
+                                                       "dpio", i);
+
+               for (i = 0; i < num_child_objects; i++)
+                       error = dprc_scan_container_obj(dflt_dprc_handle,
+                                                       "dpni", i);
+       }
+error:
+       if (dprc_opened)
+               dprc_close(dflt_mc_io, dflt_dprc_handle);
+
+       return error;
+}
+
+void fsl_mc_ldpaa_exit(bd_t *bis)
+{
+       int err;
+
+       if (get_mc_boot_status() == 0) {
+               err = dpio_disable(dflt_mc_io, dflt_dpio_handle);
+               if (err < 0) {
+                       printf("dpio_disable() failed: %d\n", err);
+                       return;
+               }
+               err = dpio_reset(dflt_mc_io, dflt_dpio_handle);
+               if (err < 0) {
+                       printf("dpio_reset() failed: %d\n", err);
+                       return;
+               }
+               err = dpio_close(dflt_mc_io, dflt_dpio_handle);
+               if (err < 0) {
+                       printf("dpio_close() failed: %d\n", err);
+                       return;
+               }
+
+               free(dflt_dpio);
+               free(dflt_dpbp);
+       }
+
+       if (dflt_mc_io)
+               free(dflt_mc_io);
 }
index 7c8e003ad0015c08eed3778cf34f0a61ca966ad5..3fc1f98341568595c4616670091e40a028dec562 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * Freescale Layerscape MC I/O wrapper
  *
- * Copyright (C) 2014 Freescale Semiconductor, Inc.
+ * Copyright (C) 2013-2015 Freescale Semiconductor, Inc.
  * Author: German Rivera <German.Rivera@freescale.com>
  *
  * SPDX-License-Identifier:    GPL-2.0+
@@ -32,7 +32,7 @@ int mc_send_command(struct fsl_mc_io *mc_io,
                    struct mc_command *cmd)
 {
        enum mc_cmd_status status;
-       int timeout = 2000;
+       int timeout = 6000;
 
        mc_write_command(mc_io->mmio_regs, cmd);
 
@@ -52,7 +52,7 @@ int mc_send_command(struct fsl_mc_io *mc_io,
        if (status != MC_CMD_STATUS_OK) {
                printf("Error: MC command failed (portal: %p, obj handle: %#x, command: %#x, status: %#x)\n",
                       mc_io->mmio_regs,
-                      (unsigned int)MC_CMD_HDR_READ_AUTHID(cmd->header),
+                       (unsigned int)MC_CMD_HDR_READ_TOKEN(cmd->header),
                       (unsigned int)MC_CMD_HDR_READ_CMDID(cmd->header),
                       (unsigned int)status);
 
diff --git a/drivers/net/ldpaa_eth/Makefile b/drivers/net/ldpaa_eth/Makefile
new file mode 100644 (file)
index 0000000..c37633f
--- /dev/null
@@ -0,0 +1,9 @@
+#
+# Copyright 2014 Freescale Semiconductor, Inc.
+#
+# SPDX-License-Identifier:     GPL-2.0+
+#
+
+obj-y += ldpaa_wriop.o
+obj-y += ldpaa_eth.o
+obj-$(CONFIG_LS2085A) += ls2085a.o
diff --git a/drivers/net/ldpaa_eth/ldpaa_eth.c b/drivers/net/ldpaa_eth/ldpaa_eth.c
new file mode 100644 (file)
index 0000000..d4be1ba
--- /dev/null
@@ -0,0 +1,710 @@
+/*
+ * Copyright (C) 2014 Freescale Semiconductor
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#include <common.h>
+#include <asm/io.h>
+#include <asm/types.h>
+#include <malloc.h>
+#include <net.h>
+#include <hwconfig.h>
+#include <phy.h>
+#include <linux/compat.h>
+
+#include "ldpaa_eth.h"
+
+#undef CONFIG_PHYLIB
+static int init_phy(struct eth_device *dev)
+{
+       /*TODO for external PHY */
+
+       return 0;
+}
+
+static void ldpaa_eth_rx(struct ldpaa_eth_priv *priv,
+                        const struct dpaa_fd *fd)
+{
+       u64 fd_addr;
+       uint16_t fd_offset;
+       uint32_t fd_length;
+       struct ldpaa_fas *fas;
+       uint32_t status, err;
+       struct qbman_release_desc releasedesc;
+       struct qbman_swp *swp = dflt_dpio->sw_portal;
+
+       fd_addr = ldpaa_fd_get_addr(fd);
+       fd_offset = ldpaa_fd_get_offset(fd);
+       fd_length = ldpaa_fd_get_len(fd);
+
+       debug("Rx frame:data addr=0x%p size=0x%x\n", (u64 *)fd_addr, fd_length);
+
+       if (fd->simple.frc & LDPAA_FD_FRC_FASV) {
+               /* Read the frame annotation status word and check for errors */
+               fas = (struct ldpaa_fas *)
+                               ((uint8_t *)(fd_addr) +
+                               priv->buf_layout.private_data_size);
+               status = le32_to_cpu(fas->status);
+               if (status & LDPAA_ETH_RX_ERR_MASK) {
+                       printf("Rx frame error(s): 0x%08x\n",
+                              status & LDPAA_ETH_RX_ERR_MASK);
+                       goto error;
+               } else if (status & LDPAA_ETH_RX_UNSUPP_MASK) {
+                       printf("Unsupported feature in bitmask: 0x%08x\n",
+                              status & LDPAA_ETH_RX_UNSUPP_MASK);
+                       goto error;
+               }
+       }
+
+       debug("Rx frame: To Upper layer\n");
+       net_process_received_packet((uint8_t *)(fd_addr) + fd_offset,
+                                   fd_length);
+
+error:
+       flush_dcache_range(fd_addr, fd_addr + LDPAA_ETH_RX_BUFFER_SIZE);
+       qbman_release_desc_clear(&releasedesc);
+       qbman_release_desc_set_bpid(&releasedesc, dflt_dpbp->dpbp_attr.bpid);
+       do {
+               /* Release buffer into the QBMAN */
+               err = qbman_swp_release(swp, &releasedesc, &fd_addr, 1);
+       } while (err == -EBUSY);
+       return;
+}
+
+static int ldpaa_eth_pull_dequeue_rx(struct eth_device *dev)
+{
+       struct ldpaa_eth_priv *priv = (struct ldpaa_eth_priv *)dev->priv;
+       const struct ldpaa_dq *dq;
+       const struct dpaa_fd *fd;
+       int i = 5, err = 0, status, loop = 20;
+       static struct qbman_pull_desc pulldesc;
+       struct qbman_swp *swp = dflt_dpio->sw_portal;
+
+       while (--i) {
+               qbman_pull_desc_clear(&pulldesc);
+               qbman_pull_desc_set_numframes(&pulldesc, 1);
+               qbman_pull_desc_set_fq(&pulldesc, priv->rx_dflt_fqid);
+
+               err = qbman_swp_pull(swp, &pulldesc);
+               if (err < 0) {
+                       printf("Dequeue frames error:0x%08x\n", err);
+                       continue;
+               }
+
+               do {
+                       loop--;
+                       dq = qbman_swp_dqrr_next(swp);
+
+                       if (!loop)
+                               break;
+               } while (!dq);
+
+               if (dq) {
+                       /* Check for valid frame. If not sent a consume
+                        * confirmation to QBMAN otherwise give it to NADK
+                        * application and then send consume confirmation to
+                        * QBMAN.
+                        */
+                       status = (uint8_t)ldpaa_dq_flags(dq);
+                       if ((status & LDPAA_DQ_STAT_VALIDFRAME) == 0) {
+                               debug("Dequeue RX frames:");
+                               debug("No frame delivered\n");
+
+                               qbman_swp_dqrr_consume(swp, dq);
+                               break;
+                       }
+
+                       fd = ldpaa_dq_fd(dq);
+
+                       /* Obtain FD and process it */
+                       ldpaa_eth_rx(priv, fd);
+                       qbman_swp_dqrr_consume(swp, dq);
+                       break;
+               }
+       }
+
+       return err;
+}
+
+static void ldpaa_eth_tx_conf(struct ldpaa_eth_priv *priv,
+                             const struct dpaa_fd *fd)
+{
+       uint64_t fd_addr;
+       struct ldpaa_fas *fas;
+       uint32_t status, err;
+       struct qbman_release_desc releasedesc;
+       struct qbman_swp *swp = dflt_dpio->sw_portal;
+
+       fd_addr = ldpaa_fd_get_addr(fd);
+
+
+       debug("TX Conf frame:data addr=0x%p\n", (u64 *)fd_addr);
+
+       /* Check the status from the Frame Annotation */
+       if (fd->simple.frc & LDPAA_FD_FRC_FASV) {
+               fas = (struct ldpaa_fas *)
+                               ((uint8_t *)(fd_addr) +
+                               priv->buf_layout.private_data_size);
+               status = le32_to_cpu(fas->status);
+               if (status & LDPAA_ETH_TXCONF_ERR_MASK) {
+                       printf("TxConf frame error(s): 0x%08x\n",
+                              status & LDPAA_ETH_TXCONF_ERR_MASK);
+               }
+       }
+
+       qbman_release_desc_clear(&releasedesc);
+       qbman_release_desc_set_bpid(&releasedesc, dflt_dpbp->dpbp_attr.bpid);
+       do {
+               /* Release buffer into the QBMAN */
+               err = qbman_swp_release(swp, &releasedesc, &fd_addr, 1);
+       } while (err == -EBUSY);
+}
+
+static int ldpaa_eth_pull_dequeue_tx_conf(struct ldpaa_eth_priv *priv)
+{
+       const struct ldpaa_dq *dq;
+       const struct dpaa_fd *fd;
+       int err = 0;
+       int i = 5, status, loop = 20;
+       static struct qbman_pull_desc pulldesc;
+       struct qbman_swp *swp = dflt_dpio->sw_portal;
+
+       while (--i) {
+               qbman_pull_desc_clear(&pulldesc);
+               qbman_pull_desc_set_numframes(&pulldesc, 1);
+               qbman_pull_desc_set_fq(&pulldesc, priv->tx_conf_fqid);
+
+               err =  qbman_swp_pull(swp, &pulldesc);
+               if (err < 0) {
+                       printf("Dequeue TX conf frames error:0x%08x\n", err);
+                       continue;
+               }
+
+               do {
+                       loop--;
+                       dq = qbman_swp_dqrr_next(swp);
+
+                       if (!loop)
+                               break;
+               } while (!dq);
+
+               if (dq) {
+                       /* Check for valid frame. If not sent a consume
+                        * confirmation to QBMAN otherwise give it to NADK
+                        * application and then send consume confirmation to
+                        * QBMAN.
+                        */
+                       status = (uint8_t)ldpaa_dq_flags(dq);
+                       if ((status & LDPAA_DQ_STAT_VALIDFRAME) == 0) {
+                               debug("Dequeue TX conf frames:");
+                               debug("No frame is delivered\n");
+
+                               qbman_swp_dqrr_consume(swp, dq);
+                               break;
+                       }
+                       fd = ldpaa_dq_fd(dq);
+
+                       ldpaa_eth_tx_conf(priv, fd);
+                       qbman_swp_dqrr_consume(swp, dq);
+                       break;
+               }
+       }
+
+       return err;
+}
+
+static int ldpaa_eth_tx(struct eth_device *net_dev, void *buf, int len)
+{
+       struct ldpaa_eth_priv *priv = (struct ldpaa_eth_priv *)net_dev->priv;
+       struct dpaa_fd fd;
+       u64 buffer_start;
+       int data_offset, err;
+       struct qbman_swp *swp = dflt_dpio->sw_portal;
+       struct qbman_eq_desc ed;
+
+       /* Setup the FD fields */
+       memset(&fd, 0, sizeof(fd));
+
+       data_offset = priv->tx_data_offset;
+
+       do {
+               err = qbman_swp_acquire(dflt_dpio->sw_portal,
+                                       dflt_dpbp->dpbp_attr.bpid,
+                                       &buffer_start, 1);
+       } while (err == -EBUSY);
+
+       if (err < 0) {
+               printf("qbman_swp_acquire() failed\n");
+               return -ENOMEM;
+       }
+
+       debug("TX data: malloc buffer start=0x%p\n", (u64 *)buffer_start);
+
+       memcpy(((uint8_t *)(buffer_start) + data_offset), buf, len);
+
+       flush_dcache_range(buffer_start, buffer_start +
+                                       LDPAA_ETH_RX_BUFFER_SIZE);
+
+       ldpaa_fd_set_addr(&fd, (u64)buffer_start);
+       ldpaa_fd_set_offset(&fd, (uint16_t)(data_offset));
+       ldpaa_fd_set_bpid(&fd, dflt_dpbp->dpbp_attr.bpid);
+       ldpaa_fd_set_len(&fd, len);
+
+       fd.simple.ctrl = LDPAA_FD_CTRL_ASAL | LDPAA_FD_CTRL_PTA |
+                               LDPAA_FD_CTRL_PTV1;
+
+       qbman_eq_desc_clear(&ed);
+       qbman_eq_desc_set_no_orp(&ed, 0);
+       qbman_eq_desc_set_qd(&ed, priv->tx_qdid, priv->tx_flow_id, 0);
+       err = qbman_swp_enqueue(swp, &ed, (const struct qbman_fd *)(&fd));
+       if (err < 0)
+               printf("error enqueueing Tx frame\n");
+
+       mdelay(1);
+
+       err = ldpaa_eth_pull_dequeue_tx_conf(priv);
+       if (err < 0)
+               printf("error Tx Conf frame\n");
+
+       return err;
+}
+
+static int ldpaa_eth_open(struct eth_device *net_dev, bd_t *bd)
+{
+       struct ldpaa_eth_priv *priv = (struct ldpaa_eth_priv *)net_dev->priv;
+       struct dpni_queue_attr rx_queue_attr;
+       struct dpni_tx_flow_attr tx_flow_attr;
+       uint8_t mac_addr[6];
+       int err;
+
+       if (net_dev->state == ETH_STATE_ACTIVE)
+               return 0;
+
+       /* DPNI initialization */
+       err = ldpaa_dpni_setup(priv);
+       if (err < 0)
+               goto err_dpni_setup;
+
+       err = ldpaa_dpbp_setup();
+       if (err < 0)
+               goto err_dpbp_setup;
+
+       /* DPNI binding DPBP */
+       err = ldpaa_dpni_bind(priv);
+       if (err)
+               goto err_bind;
+
+       err = dpni_get_primary_mac_addr(dflt_mc_io, priv->dpni_handle,
+                                       mac_addr);
+       if (err) {
+               printf("dpni_get_primary_mac_addr() failed\n");
+               return err;
+       }
+
+       memcpy(net_dev->enetaddr, mac_addr, 0x6);
+
+       /* setup the MAC address */
+       if (net_dev->enetaddr[0] & 0x01) {
+               printf("%s: MacAddress is multcast address\n",  __func__);
+               return 1;
+       }
+
+#ifdef CONFIG_PHYLIB
+       /* TODO Check this path */
+       err = phy_startup(priv->phydev);
+       if (err) {
+               printf("%s: Could not initialize\n", priv->phydev->dev->name);
+               return err;
+       }
+#else
+       priv->phydev->speed = SPEED_1000;
+       priv->phydev->link = 1;
+       priv->phydev->duplex = DUPLEX_FULL;
+#endif
+
+       err = dpni_enable(dflt_mc_io, priv->dpni_handle);
+       if (err < 0) {
+               printf("dpni_enable() failed\n");
+               return err;
+       }
+
+       /* TODO: support multiple Rx flows */
+       err = dpni_get_rx_flow(dflt_mc_io, priv->dpni_handle, 0, 0,
+                              &rx_queue_attr);
+       if (err) {
+               printf("dpni_get_rx_flow() failed\n");
+               goto err_rx_flow;
+       }
+
+       priv->rx_dflt_fqid = rx_queue_attr.fqid;
+
+       err = dpni_get_qdid(dflt_mc_io, priv->dpni_handle, &priv->tx_qdid);
+       if (err) {
+               printf("dpni_get_qdid() failed\n");
+               goto err_qdid;
+       }
+
+       err = dpni_get_tx_flow(dflt_mc_io, priv->dpni_handle, priv->tx_flow_id,
+                              &tx_flow_attr);
+       if (err) {
+               printf("dpni_get_tx_flow() failed\n");
+               goto err_tx_flow;
+       }
+
+       priv->tx_conf_fqid = tx_flow_attr.conf_err_attr.queue_attr.fqid;
+
+       if (!priv->phydev->link)
+               printf("%s: No link.\n", priv->phydev->dev->name);
+
+       return priv->phydev->link ? 0 : -1;
+
+err_tx_flow:
+err_qdid:
+err_rx_flow:
+       dpni_disable(dflt_mc_io, priv->dpni_handle);
+err_bind:
+       ldpaa_dpbp_free();
+err_dpbp_setup:
+       dpni_close(dflt_mc_io, priv->dpni_handle);
+err_dpni_setup:
+       return err;
+}
+
+static void ldpaa_eth_stop(struct eth_device *net_dev)
+{
+       struct ldpaa_eth_priv *priv = (struct ldpaa_eth_priv *)net_dev->priv;
+       int err = 0;
+
+       if ((net_dev->state == ETH_STATE_PASSIVE) ||
+           (net_dev->state == ETH_STATE_INIT))
+               return;
+       /* Stop Tx and Rx traffic */
+       err = dpni_disable(dflt_mc_io, priv->dpni_handle);
+       if (err < 0)
+               printf("dpni_disable() failed\n");
+
+#ifdef CONFIG_PHYLIB
+       phy_shutdown(priv->phydev);
+#endif
+
+       ldpaa_dpbp_free();
+       dpni_reset(dflt_mc_io, priv->dpni_handle);
+       dpni_close(dflt_mc_io, priv->dpni_handle);
+}
+
+static void ldpaa_dpbp_drain_cnt(int count)
+{
+       uint64_t buf_array[7];
+       void *addr;
+       int ret, i;
+
+       BUG_ON(count > 7);
+
+       do {
+               ret = qbman_swp_acquire(dflt_dpio->sw_portal,
+                                       dflt_dpbp->dpbp_attr.bpid,
+                                       buf_array, count);
+               if (ret < 0) {
+                       printf("qbman_swp_acquire() failed\n");
+                       return;
+               }
+               for (i = 0; i < ret; i++) {
+                       addr = (void *)buf_array[i];
+                       debug("Free: buffer addr =0x%p\n", addr);
+                       free(addr);
+               }
+       } while (ret);
+}
+
+static void ldpaa_dpbp_drain(void)
+{
+       int i;
+       for (i = 0; i < LDPAA_ETH_NUM_BUFS; i += 7)
+               ldpaa_dpbp_drain_cnt(7);
+}
+
+static int ldpaa_bp_add_7(uint16_t bpid)
+{
+       uint64_t buf_array[7];
+       u8 *addr;
+       int i;
+       struct qbman_release_desc rd;
+
+       for (i = 0; i < 7; i++) {
+               addr = memalign(L1_CACHE_BYTES, LDPAA_ETH_RX_BUFFER_SIZE);
+               if (!addr) {
+                       printf("addr allocation failed\n");
+                       goto err_alloc;
+               }
+               memset(addr, 0x00, LDPAA_ETH_RX_BUFFER_SIZE);
+               flush_dcache_range((u64)addr,
+                                  (u64)(addr + LDPAA_ETH_RX_BUFFER_SIZE));
+
+               buf_array[i] = (uint64_t)addr;
+               debug("Release: buffer addr =0x%p\n", addr);
+       }
+
+release_bufs:
+       /* In case the portal is busy, retry until successful.
+        * This function is guaranteed to succeed in a reasonable amount
+        * of time.
+        */
+
+       do {
+               mdelay(1);
+               qbman_release_desc_clear(&rd);
+               qbman_release_desc_set_bpid(&rd, bpid);
+       } while (qbman_swp_release(dflt_dpio->sw_portal, &rd, buf_array, i));
+
+       return i;
+
+err_alloc:
+       if (i)
+               goto release_bufs;
+
+       return 0;
+}
+
+static int ldpaa_dpbp_seed(uint16_t bpid)
+{
+       int i;
+       int count;
+
+       for (i = 0; i < LDPAA_ETH_NUM_BUFS; i += 7) {
+               count = ldpaa_bp_add_7(bpid);
+               if (count < 7)
+                       printf("Buffer Seed= %d\n", count);
+       }
+
+       return 0;
+}
+
+static int ldpaa_dpbp_setup(void)
+{
+       int err;
+
+       err = dpbp_open(dflt_mc_io, dflt_dpbp->dpbp_attr.id,
+                       &dflt_dpbp->dpbp_handle);
+       if (err) {
+               printf("dpbp_open() failed\n");
+               goto err_open;
+       }
+
+       err = dpbp_enable(dflt_mc_io, dflt_dpbp->dpbp_handle);
+       if (err) {
+               printf("dpbp_enable() failed\n");
+               goto err_enable;
+       }
+
+       err = dpbp_get_attributes(dflt_mc_io, dflt_dpbp->dpbp_handle,
+                                 &dflt_dpbp->dpbp_attr);
+       if (err) {
+               printf("dpbp_get_attributes() failed\n");
+               goto err_get_attr;
+       }
+
+       err = ldpaa_dpbp_seed(dflt_dpbp->dpbp_attr.bpid);
+       if (err) {
+               printf("Buffer seeding failed for DPBP %d (bpid=%d)\n",
+                      dflt_dpbp->dpbp_attr.id, dflt_dpbp->dpbp_attr.bpid);
+               goto err_seed;
+       }
+
+       return 0;
+
+err_seed:
+err_get_attr:
+       dpbp_disable(dflt_mc_io, dflt_dpbp->dpbp_handle);
+err_enable:
+       dpbp_close(dflt_mc_io, dflt_dpbp->dpbp_handle);
+err_open:
+       return err;
+}
+
+static void ldpaa_dpbp_free(void)
+{
+       ldpaa_dpbp_drain();
+       dpbp_disable(dflt_mc_io, dflt_dpbp->dpbp_handle);
+       dpbp_reset(dflt_mc_io, dflt_dpbp->dpbp_handle);
+       dpbp_close(dflt_mc_io, dflt_dpbp->dpbp_handle);
+}
+
+static int ldpaa_dpni_setup(struct ldpaa_eth_priv *priv)
+{
+       int err;
+
+       /* and get a handle for the DPNI this interface is associate with */
+       err = dpni_open(dflt_mc_io, priv->dpni_id, &priv->dpni_handle);
+       if (err) {
+               printf("dpni_open() failed\n");
+               goto err_open;
+       }
+
+       err = dpni_get_attributes(dflt_mc_io, priv->dpni_handle,
+                                 &priv->dpni_attrs);
+       if (err) {
+               printf("dpni_get_attributes() failed (err=%d)\n", err);
+               goto err_get_attr;
+       }
+
+       /* Configure our buffers' layout */
+       priv->buf_layout.options = DPNI_BUF_LAYOUT_OPT_PARSER_RESULT |
+                                  DPNI_BUF_LAYOUT_OPT_FRAME_STATUS |
+                                  DPNI_BUF_LAYOUT_OPT_PRIVATE_DATA_SIZE;
+       priv->buf_layout.pass_parser_result = true;
+       priv->buf_layout.pass_frame_status = true;
+       priv->buf_layout.private_data_size = LDPAA_ETH_SWA_SIZE;
+       /* ...rx, ... */
+       err = dpni_set_rx_buffer_layout(dflt_mc_io, priv->dpni_handle,
+                                       &priv->buf_layout);
+       if (err) {
+               printf("dpni_set_rx_buffer_layout() failed");
+               goto err_buf_layout;
+       }
+
+       /* ... tx, ... */
+       priv->buf_layout.options &= ~DPNI_BUF_LAYOUT_OPT_PARSER_RESULT;
+       err = dpni_set_tx_buffer_layout(dflt_mc_io, priv->dpni_handle,
+                                       &priv->buf_layout);
+       if (err) {
+               printf("dpni_set_tx_buffer_layout() failed");
+               goto err_buf_layout;
+       }
+
+       /* ... tx-confirm. */
+       priv->buf_layout.options &= ~DPNI_BUF_LAYOUT_OPT_PRIVATE_DATA_SIZE;
+       err = dpni_set_tx_conf_buffer_layout(dflt_mc_io, priv->dpni_handle,
+                                            &priv->buf_layout);
+       if (err) {
+               printf("dpni_set_tx_conf_buffer_layout() failed");
+               goto err_buf_layout;
+       }
+
+       /* Now that we've set our tx buffer layout, retrieve the minimum
+        * required tx data offset.
+        */
+       err = dpni_get_tx_data_offset(dflt_mc_io, priv->dpni_handle,
+                                     &priv->tx_data_offset);
+       if (err) {
+               printf("dpni_get_tx_data_offset() failed\n");
+               goto err_data_offset;
+       }
+
+       /* Warn in case TX data offset is not multiple of 64 bytes. */
+       WARN_ON(priv->tx_data_offset % 64);
+
+       /* Accomodate SWA space. */
+       priv->tx_data_offset += LDPAA_ETH_SWA_SIZE;
+       debug("priv->tx_data_offset=%d\n", priv->tx_data_offset);
+
+       return 0;
+
+err_data_offset:
+err_buf_layout:
+err_get_attr:
+       dpni_close(dflt_mc_io, priv->dpni_handle);
+err_open:
+       return err;
+}
+
+static int ldpaa_dpni_bind(struct ldpaa_eth_priv *priv)
+{
+       struct dpni_pools_cfg pools_params;
+       struct dpni_tx_flow_cfg dflt_tx_flow;
+       int err = 0;
+
+       pools_params.num_dpbp = 1;
+       pools_params.pools[0].dpbp_id = (uint16_t)dflt_dpbp->dpbp_attr.id;
+       pools_params.pools[0].buffer_size = LDPAA_ETH_RX_BUFFER_SIZE;
+       err = dpni_set_pools(dflt_mc_io, priv->dpni_handle, &pools_params);
+       if (err) {
+               printf("dpni_set_pools() failed\n");
+               return err;
+       }
+
+       priv->tx_flow_id = DPNI_NEW_FLOW_ID;
+       memset(&dflt_tx_flow, 0, sizeof(dflt_tx_flow));
+
+       err = dpni_set_tx_flow(dflt_mc_io, priv->dpni_handle,
+                              &priv->tx_flow_id, &dflt_tx_flow);
+       if (err) {
+               printf("dpni_set_tx_flow() failed\n");
+               return err;
+       }
+
+       return 0;
+}
+
+static int ldpaa_eth_netdev_init(struct eth_device *net_dev)
+{
+       int err;
+       struct ldpaa_eth_priv *priv = (struct ldpaa_eth_priv *)net_dev->priv;
+
+       sprintf(net_dev->name, "DPNI%d", priv->dpni_id);
+
+       net_dev->iobase = 0;
+       net_dev->init = ldpaa_eth_open;
+       net_dev->halt = ldpaa_eth_stop;
+       net_dev->send = ldpaa_eth_tx;
+       net_dev->recv = ldpaa_eth_pull_dequeue_rx;
+/*
+       TODO: PHY MDIO information
+       priv->bus = info->bus;
+       priv->phyaddr = info->phy_addr;
+       priv->enet_if = info->enet_if;
+*/
+
+       if (init_phy(net_dev))
+               return 0;
+
+       err = eth_register(net_dev);
+       if (err < 0) {
+               printf("eth_register() = %d\n", err);
+               return err;
+       }
+
+       return 0;
+}
+
+int ldpaa_eth_init(struct dprc_obj_desc obj_desc)
+{
+       struct eth_device               *net_dev = NULL;
+       struct ldpaa_eth_priv           *priv = NULL;
+       int                             err = 0;
+
+
+       /* Net device */
+       net_dev = (struct eth_device *)malloc(sizeof(struct eth_device));
+       if (!net_dev) {
+               printf("eth_device malloc() failed\n");
+               return -ENOMEM;
+       }
+       memset(net_dev, 0, sizeof(struct eth_device));
+
+       /* alloc the ldpaa ethernet private struct */
+       priv = (struct ldpaa_eth_priv *)malloc(sizeof(struct ldpaa_eth_priv));
+       if (!priv) {
+               printf("ldpaa_eth_priv malloc() failed\n");
+               return -ENOMEM;
+       }
+       memset(priv, 0, sizeof(struct ldpaa_eth_priv));
+
+       net_dev->priv = (void *)priv;
+       priv->net_dev = (struct eth_device *)net_dev;
+       priv->dpni_id = obj_desc.id;
+
+       err = ldpaa_eth_netdev_init(net_dev);
+       if (err)
+               goto err_netdev_init;
+
+       debug("ldpaa ethernet: Probed interface %s\n", net_dev->name);
+       return 0;
+
+err_netdev_init:
+       free(priv);
+       net_dev->priv = NULL;
+       free(net_dev);
+
+       return err;
+}
diff --git a/drivers/net/ldpaa_eth/ldpaa_eth.h b/drivers/net/ldpaa_eth/ldpaa_eth.h
new file mode 100644 (file)
index 0000000..3107ab6
--- /dev/null
@@ -0,0 +1,149 @@
+/*
+ * Copyright (C) 2014 Freescale Semiconductor
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#ifndef __LDPAA_ETH_H
+#define __LDPAA_ETH_H
+
+#include <linux/netdevice.h>
+#include <fsl-mc/fsl_mc.h>
+#include <fsl-mc/fsl_dpaa_fd.h>
+#include <fsl-mc/fsl_dprc.h>
+#include <fsl-mc/fsl_dpni.h>
+#include <fsl-mc/fsl_dpbp.h>
+#include <fsl-mc/fsl_dpio.h>
+#include <fsl-mc/fsl_qbman_portal.h>
+#include <fsl-mc/fsl_mc_private.h>
+
+
+enum ldpaa_eth_type {
+       LDPAA_ETH_1G_E,
+       LDPAA_ETH_10G_E,
+};
+
+/* Arbitrary values for now, but we'll need to tune */
+#define LDPAA_ETH_NUM_BUFS             (2 * 7)
+#define LDPAA_ETH_REFILL_THRESH                (LDPAA_ETH_NUM_BUFS/2)
+#define LDPAA_ETH_RX_BUFFER_SIZE       2048
+
+/* Hardware requires alignment for ingress/egress buffer addresses
+ * and ingress buffer lengths.
+ */
+#define LDPAA_ETH_BUF_ALIGN            64
+
+/* So far we're only accomodating a skb backpointer in the frame's
+ * software annotation, but the hardware options are either 0 or 64.
+ */
+#define LDPAA_ETH_SWA_SIZE             64
+
+/* Annotation valid bits in FD FRC */
+#define LDPAA_FD_FRC_FASV              0x8000
+#define LDPAA_FD_FRC_FAEADV            0x4000
+#define LDPAA_FD_FRC_FAPRV             0x2000
+#define LDPAA_FD_FRC_FAIADV            0x1000
+#define LDPAA_FD_FRC_FASWOV            0x0800
+#define LDPAA_FD_FRC_FAICFDV           0x0400
+
+/* Annotation bits in FD CTRL */
+#define LDPAA_FD_CTRL_ASAL             0x00020000      /* ASAL = 128 */
+#define LDPAA_FD_CTRL_PTA              0x00800000
+#define LDPAA_FD_CTRL_PTV1             0x00400000
+
+/* TODO: we may want to move this and other WRIOP related defines
+ * to a separate header
+ */
+/* Frame annotation status */
+struct ldpaa_fas {
+       u8 reserved;
+       u8 ppid;
+       __le16 ifpid;
+       __le32 status;
+} __packed;
+
+/* Debug frame, otherwise supposed to be discarded */
+#define LDPAA_ETH_FAS_DISC             0x80000000
+/* MACSEC frame */
+#define LDPAA_ETH_FAS_MS               0x40000000
+#define LDPAA_ETH_FAS_PTP              0x08000000
+/* Ethernet multicast frame */
+#define LDPAA_ETH_FAS_MC               0x04000000
+/* Ethernet broadcast frame */
+#define LDPAA_ETH_FAS_BC               0x02000000
+#define LDPAA_ETH_FAS_KSE              0x00040000
+#define LDPAA_ETH_FAS_EOFHE            0x00020000
+#define LDPAA_ETH_FAS_MNLE             0x00010000
+#define LDPAA_ETH_FAS_TIDE             0x00008000
+#define LDPAA_ETH_FAS_PIEE             0x00004000
+/* Frame length error */
+#define LDPAA_ETH_FAS_FLE              0x00002000
+/* Frame physical error; our favourite pastime */
+#define LDPAA_ETH_FAS_FPE              0x00001000
+#define LDPAA_ETH_FAS_PTE              0x00000080
+#define LDPAA_ETH_FAS_ISP              0x00000040
+#define LDPAA_ETH_FAS_PHE              0x00000020
+#define LDPAA_ETH_FAS_BLE              0x00000010
+/* L3 csum validation performed */
+#define LDPAA_ETH_FAS_L3CV             0x00000008
+/* L3 csum error */
+#define LDPAA_ETH_FAS_L3CE             0x00000004
+/* L4 csum validation performed */
+#define LDPAA_ETH_FAS_L4CV             0x00000002
+/* L4 csum error */
+#define LDPAA_ETH_FAS_L4CE             0x00000001
+/* These bits always signal errors */
+#define LDPAA_ETH_RX_ERR_MASK          (LDPAA_ETH_FAS_DISC     | \
+                                        LDPAA_ETH_FAS_KSE      | \
+                                        LDPAA_ETH_FAS_EOFHE    | \
+                                        LDPAA_ETH_FAS_MNLE     | \
+                                        LDPAA_ETH_FAS_TIDE     | \
+                                        LDPAA_ETH_FAS_PIEE     | \
+                                        LDPAA_ETH_FAS_FLE      | \
+                                        LDPAA_ETH_FAS_FPE      | \
+                                        LDPAA_ETH_FAS_PTE      | \
+                                        LDPAA_ETH_FAS_ISP      | \
+                                        LDPAA_ETH_FAS_PHE      | \
+                                        LDPAA_ETH_FAS_BLE      | \
+                                        LDPAA_ETH_FAS_L3CE     | \
+                                        LDPAA_ETH_FAS_L4CE)
+/* Unsupported features in the ingress */
+#define LDPAA_ETH_RX_UNSUPP_MASK       LDPAA_ETH_FAS_MS
+/* TODO trim down the bitmask; not all of them apply to Tx-confirm */
+#define LDPAA_ETH_TXCONF_ERR_MASK      (LDPAA_ETH_FAS_KSE      | \
+                                        LDPAA_ETH_FAS_EOFHE    | \
+                                        LDPAA_ETH_FAS_MNLE     | \
+                                        LDPAA_ETH_FAS_TIDE)
+
+struct ldpaa_eth_priv {
+       struct eth_device *net_dev;
+       int dpni_id;
+       uint16_t dpni_handle;
+       struct dpni_attr dpni_attrs;
+       /* Insofar as the MC is concerned, we're using one layout on all 3 types
+        * of buffers (Rx, Tx, Tx-Conf).
+        */
+       struct dpni_buffer_layout buf_layout;
+       uint16_t tx_data_offset;
+
+       uint32_t rx_dflt_fqid;
+       uint16_t tx_qdid;
+       uint32_t tx_conf_fqid;
+       uint16_t tx_flow_id;
+
+       enum ldpaa_eth_type type;       /* 1G or 10G ethernet */
+       struct phy_device *phydev;
+};
+
+extern struct fsl_mc_io *dflt_mc_io;
+extern struct fsl_dpbp_obj *dflt_dpbp;
+extern struct fsl_dpio_obj *dflt_dpio;
+
+static void ldpaa_dpbp_drain_cnt(int count);
+static void ldpaa_dpbp_drain(void);
+static int ldpaa_dpbp_seed(uint16_t bpid);
+static void ldpaa_dpbp_free(void);
+static int ldpaa_dpni_setup(struct ldpaa_eth_priv *priv);
+static int ldpaa_dpbp_setup(void);
+static int ldpaa_dpni_bind(struct ldpaa_eth_priv *priv);
+#endif /* __LDPAA_H */
diff --git a/drivers/net/ldpaa_eth/ldpaa_wriop.c b/drivers/net/ldpaa_eth/ldpaa_wriop.c
new file mode 100644 (file)
index 0000000..926057a
--- /dev/null
@@ -0,0 +1,146 @@
+/*
+ * Copyright (C) 2015 Freescale Semiconductor
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#include <common.h>
+#include <asm/io.h>
+#include <asm/types.h>
+#include <malloc.h>
+#include <net.h>
+#include <linux/compat.h>
+#include <asm/arch/fsl_serdes.h>
+#include <fsl-mc/ldpaa_wriop.h>
+
+struct wriop_dpmac_info dpmac_info[NUM_WRIOP_PORTS];
+
+__weak phy_interface_t wriop_dpmac_enet_if(int dpmac_id, int lane_prtc)
+{
+       return PHY_INTERFACE_MODE_NONE;
+}
+
+void wriop_init_dpmac(int sd, int dpmac_id, int lane_prtcl)
+{
+       phy_interface_t enet_if;
+       int index = dpmac_id + sd * 8;
+
+       dpmac_info[index].enabled = 0;
+       dpmac_info[index].id = 0;
+       dpmac_info[index].enet_if = PHY_INTERFACE_MODE_NONE;
+
+       enet_if = wriop_dpmac_enet_if(index, lane_prtcl);
+       if (enet_if != PHY_INTERFACE_MODE_NONE) {
+               dpmac_info[index].enabled = 1;
+               dpmac_info[index].id = index;
+               dpmac_info[index].enet_if = enet_if;
+       }
+}
+
+/*TODO what it do */
+static int wriop_dpmac_to_index(int dpmac_id)
+{
+       int i;
+
+       for (i = WRIOP1_DPMAC1; i < NUM_WRIOP_PORTS; i++) {
+               if (dpmac_info[i].id == dpmac_id)
+                       return i;
+       }
+
+       return -1;
+}
+
+void wriop_disable_dpmac(int dpmac_id)
+{
+       int i = wriop_dpmac_to_index(dpmac_id);
+
+       if (i == -1)
+               return;
+
+       dpmac_info[i].enabled = 0;
+       wriop_dpmac_disable(dpmac_id);
+}
+
+void wriop_enable_dpmac(int dpmac_id)
+{
+       int i = wriop_dpmac_to_index(dpmac_id);
+
+       if (i == -1)
+               return;
+
+       dpmac_info[i].enabled = 1;
+       wriop_dpmac_enable(dpmac_id);
+}
+
+void wriop_set_mdio(int dpmac_id, struct mii_dev *bus)
+{
+       int i = wriop_dpmac_to_index(dpmac_id);
+
+       if (i == -1)
+               return;
+
+       dpmac_info[i].bus = bus;
+}
+
+struct mii_dev *wriop_get_mdio(int dpmac_id)
+{
+       int i = wriop_dpmac_to_index(dpmac_id);
+
+       if (i == -1)
+               return NULL;
+
+       return dpmac_info[i].bus;
+}
+
+void wriop_set_phy_address(int dpmac_id, int address)
+{
+       int i = wriop_dpmac_to_index(dpmac_id);
+
+       if (i == -1)
+               return;
+
+       dpmac_info[i].phy_addr = address;
+}
+
+int wriop_get_phy_address(int dpmac_id)
+{
+       int i = wriop_dpmac_to_index(dpmac_id);
+
+       if (i == -1)
+               return -1;
+
+       return dpmac_info[i].phy_addr;
+}
+
+void wriop_set_phy_dev(int dpmac_id, struct phy_device *phydev)
+{
+       int i = wriop_dpmac_to_index(dpmac_id);
+
+       if (i == -1)
+               return;
+
+       dpmac_info[i].phydev = phydev;
+}
+
+struct phy_device *wriop_get_phy_dev(int dpmac_id)
+{
+       int i = wriop_dpmac_to_index(dpmac_id);
+
+       if (i == -1)
+               return NULL;
+
+       return dpmac_info[i].phydev;
+}
+
+phy_interface_t wriop_get_enet_if(int dpmac_id)
+{
+       int i = wriop_dpmac_to_index(dpmac_id);
+
+       if (i == -1)
+               return PHY_INTERFACE_MODE_NONE;
+
+       if (dpmac_info[i].enabled)
+               return dpmac_info[i].enet_if;
+
+       return PHY_INTERFACE_MODE_NONE;
+}
diff --git a/drivers/net/ldpaa_eth/ls2085a.c b/drivers/net/ldpaa_eth/ls2085a.c
new file mode 100644 (file)
index 0000000..6b7960a
--- /dev/null
@@ -0,0 +1,83 @@
+/*
+ * Copyright 2015 Freescale Semiconductor, Inc.
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+#include <common.h>
+#include <phy.h>
+#include <fsl-mc/ldpaa_wriop.h>
+#include <asm/io.h>
+#include <asm/arch-fsl-lsch3/immap_lsch3.h>
+#include <asm/arch/fsl_serdes.h>
+#include <fsl-mc/ldpaa_wriop.h>
+
+u32 dpmac_to_devdisr[] = {
+       [WRIOP1_DPMAC1] = FSL_CHASSIS3_DEVDISR2_DPMAC1,
+       [WRIOP1_DPMAC2] = FSL_CHASSIS3_DEVDISR2_DPMAC2,
+       [WRIOP1_DPMAC3] = FSL_CHASSIS3_DEVDISR2_DPMAC3,
+       [WRIOP1_DPMAC4] = FSL_CHASSIS3_DEVDISR2_DPMAC4,
+       [WRIOP1_DPMAC5] = FSL_CHASSIS3_DEVDISR2_DPMAC5,
+       [WRIOP1_DPMAC6] = FSL_CHASSIS3_DEVDISR2_DPMAC6,
+       [WRIOP1_DPMAC7] = FSL_CHASSIS3_DEVDISR2_DPMAC7,
+       [WRIOP1_DPMAC8] = FSL_CHASSIS3_DEVDISR2_DPMAC8,
+       [WRIOP1_DPMAC9] = FSL_CHASSIS3_DEVDISR2_DPMAC9,
+       [WRIOP1_DPMAC10] = FSL_CHASSIS3_DEVDISR2_DPMAC10,
+       [WRIOP1_DPMAC11] = FSL_CHASSIS3_DEVDISR2_DPMAC11,
+       [WRIOP1_DPMAC12] = FSL_CHASSIS3_DEVDISR2_DPMAC12,
+       [WRIOP1_DPMAC13] = FSL_CHASSIS3_DEVDISR2_DPMAC13,
+       [WRIOP1_DPMAC14] = FSL_CHASSIS3_DEVDISR2_DPMAC14,
+       [WRIOP1_DPMAC15] = FSL_CHASSIS3_DEVDISR2_DPMAC15,
+       [WRIOP1_DPMAC16] = FSL_CHASSIS3_DEVDISR2_DPMAC16,
+       [WRIOP1_DPMAC17] = FSL_CHASSIS3_DEVDISR2_DPMAC17,
+       [WRIOP1_DPMAC18] = FSL_CHASSIS3_DEVDISR2_DPMAC18,
+       [WRIOP1_DPMAC19] = FSL_CHASSIS3_DEVDISR2_DPMAC19,
+       [WRIOP1_DPMAC20] = FSL_CHASSIS3_DEVDISR2_DPMAC20,
+       [WRIOP1_DPMAC21] = FSL_CHASSIS3_DEVDISR2_DPMAC21,
+       [WRIOP1_DPMAC22] = FSL_CHASSIS3_DEVDISR2_DPMAC22,
+       [WRIOP1_DPMAC23] = FSL_CHASSIS3_DEVDISR2_DPMAC23,
+       [WRIOP1_DPMAC24] = FSL_CHASSIS3_DEVDISR2_DPMAC24,
+};
+
+static int is_device_disabled(int dpmac_id)
+{
+       struct ccsr_gur __iomem *gur = (void *)CONFIG_SYS_FSL_GUTS_ADDR;
+       u32 devdisr2 = in_le32(&gur->devdisr2);
+
+       return dpmac_to_devdisr[dpmac_id] & devdisr2;
+}
+
+void wriop_dpmac_disable(int dpmac_id)
+{
+       struct ccsr_gur __iomem *gur = (void *)CONFIG_SYS_FSL_GUTS_ADDR;
+
+       setbits_le32(&gur->devdisr2, dpmac_to_devdisr[dpmac_id]);
+}
+
+void wriop_dpmac_enable(int dpmac_id)
+{
+       struct ccsr_gur __iomem *gur = (void *)CONFIG_SYS_FSL_GUTS_ADDR;
+
+       clrbits_le32(&gur->devdisr2, dpmac_to_devdisr[dpmac_id]);
+}
+
+phy_interface_t wriop_dpmac_enet_if(int dpmac_id, int lane_prtcl)
+{
+       enum srds_prtcl;
+
+       if (is_device_disabled(dpmac_id + 1))
+               return PHY_INTERFACE_MODE_NONE;
+
+       if (lane_prtcl >= SGMII1 && lane_prtcl <= SGMII16)
+               return PHY_INTERFACE_MODE_SGMII;
+
+       if (lane_prtcl >= XFI1 && lane_prtcl <= XFI8)
+               return PHY_INTERFACE_MODE_XGMII;
+
+       if (lane_prtcl >= XAUI1 && lane_prtcl <= XAUI2)
+               return PHY_INTERFACE_MODE_XGMII;
+
+       if (lane_prtcl >= QSGMII_A && lane_prtcl <= QSGMII_D)
+               return PHY_INTERFACE_MODE_QSGMII;
+
+       return PHY_INTERFACE_MODE_NONE;
+}
index 15c9cdcc3a0aafc32656b31b83f2903cdf3b84a2..a03bdc06300fde51293a30baa930c0697306f28b 100644 (file)
@@ -446,7 +446,7 @@ int pch_gbe_register(bd_t *bis)
        dev->iobase = iobase;
        priv->mac_regs = (struct pch_gbe_regs *)iobase;
 
-       sprintf(dev->name, "pch_gbe.%x", iobase);
+       sprintf(dev->name, "pch_gbe");
 
        /* Read MAC address from SROM and initialize dev->enetaddr with it */
        pch_gbe_mac_read(priv->mac_regs, dev->enetaddr);
index 254f056df42266b80e5dc2bf4bebe43bdd60c67e..3a2b3bba995282ebd8a96fb61d9ad742df5c246b 100644 (file)
@@ -186,8 +186,8 @@ void cs4340_upload_firmware(struct phy_device *phydev)
                while (*addr != 0x0a) {
                        line_temp[i++] = *addr++;
                        if (0x50 < i) {
-                               printf("Not found Cortina PHY ucode at 0x%x\n",
-                                      CONFIG_CORTINA_FW_ADDR);
+                               printf("Not found Cortina PHY ucode at 0x%p\n",
+                                      (char *)CONFIG_CORTINA_FW_ADDR);
                                return;
                        }
                }
index 1815b2900ddb2ad1ec80cb9d521bda1ddaa323de..49f444ac4c12c57993cb8139ce2fe946978e6d3e 100644 (file)
@@ -22,6 +22,16 @@ static struct phy_driver KSZ804_driver = {
        .shutdown = &genphy_shutdown,
 };
 
+static struct phy_driver KSZ8081_driver = {
+       .name = "Micrel KSZ8081",
+       .uid = 0x221560,
+       .mask = 0xfffff0,
+       .features = PHY_BASIC_FEATURES,
+       .config = &genphy_config,
+       .startup = &genphy_startup,
+       .shutdown = &genphy_shutdown,
+};
+
 /**
  * KSZ8895
  */
@@ -272,6 +282,7 @@ static struct phy_driver ksz9031_driver = {
 int phy_micrel_init(void)
 {
        phy_register(&KSZ804_driver);
+       phy_register(&KSZ8081_driver);
 #ifdef CONFIG_PHY_MICREL_KSZ9021
        phy_register(&ksz9021_driver);
 #else
index 9d88afe8fc8dab8f57bb65e545dc3bc66cddcfed..f5221a3833febc88bbc099ec0bba57928f6513be 100644 (file)
@@ -582,7 +582,7 @@ static struct phy_device *phy_device_create(struct mii_dev *bus, int addr,
  * Description: Reads the ID registers of the PHY at @addr on the
  *   @bus, stores it in @phy_id and returns zero on success.
  */
-static int get_phy_id(struct mii_dev *bus, int addr, int devad, u32 *phy_id)
+int __weak get_phy_id(struct mii_dev *bus, int addr, int devad, u32 *phy_id)
 {
        int phy_reg;
 
index a3ace685262441219c400b69fa5db765643041c0..ee9707950a87f6028a1e162779227ab9422b58c1 100644 (file)
@@ -3,7 +3,7 @@
  *
  * SPDX-License-Identifier:    GPL-2.0+
  *
- * Copyright 2010-2011 Freescale Semiconductor, Inc.
+ * Copyright 2010-2011, 2015 Freescale Semiconductor, Inc.
  * author Andy Fleming
  */
 #include <config.h>
 #define MIIM_RTL8211x_PHYSTAT_SPDDONE  0x0800
 #define MIIM_RTL8211x_PHYSTAT_LINK     0x0400
 
+/* RTL8211x PHY Interrupt Enable Register */
+#define MIIM_RTL8211x_PHY_INER         0x12
+#define MIIM_RTL8211x_PHY_INTR_ENA     0x9f01
+#define MIIM_RTL8211x_PHY_INTR_DIS     0x0000
+
+/* RTL8211x PHY Interrupt Status Register */
+#define MIIM_RTL8211x_PHY_INSR         0x13
 
 /* RealTek RTL8211x */
 static int rtl8211x_config(struct phy_device *phydev)
 {
        phy_write(phydev, MDIO_DEVAD_NONE, MII_BMCR, BMCR_RESET);
 
+       /* mask interrupt at init; if the interrupt is
+        * needed indeed, it should be explicitly enabled
+        */
+       phy_write(phydev, MDIO_DEVAD_NONE, MIIM_RTL8211x_PHY_INER,
+                 MIIM_RTL8211x_PHY_INTR_DIS);
+
+       /* read interrupt status just to clear it */
+       phy_read(phydev, MDIO_DEVAD_NONE, MIIM_RTL8211x_PHY_INER);
+
        genphy_config_aneg(phydev);
 
        return 0;
index 4a5371051b29506751c54b52f63a174ce0fbe9af..958488c19a1c56d7a2f5353a544ca3e1a2d8b561 100644 (file)
@@ -55,7 +55,7 @@
 #define drv_version "v1.5"
 #define drv_date "01-17-2004"
 
-static u32 ioaddr;
+static unsigned long ioaddr;
 
 /* Condensed operations for readability. */
 #define currticks()    get_timer(0)
@@ -92,19 +92,21 @@ static int media[MAX_UNITS] = { -1, -1, -1, -1, -1, -1, -1, -1 };
 #define TX_TIMEOUT  (6*HZ)
 
 /* write/read MMIO register. Notice: {read,write}[wl] do the necessary swapping */
-#define RTL_W8(reg, val8)      writeb ((val8), ioaddr + (reg))
-#define RTL_W16(reg, val16)    writew ((val16), ioaddr + (reg))
-#define RTL_W32(reg, val32)    writel ((val32), ioaddr + (reg))
-#define RTL_R8(reg)            readb (ioaddr + (reg))
-#define RTL_R16(reg)           readw (ioaddr + (reg))
-#define RTL_R32(reg)           ((unsigned long) readl (ioaddr + (reg)))
+#define RTL_W8(reg, val8)      writeb((val8), ioaddr + (reg))
+#define RTL_W16(reg, val16)    writew((val16), ioaddr + (reg))
+#define RTL_W32(reg, val32)    writel((val32), ioaddr + (reg))
+#define RTL_R8(reg)            readb(ioaddr + (reg))
+#define RTL_R16(reg)           readw(ioaddr + (reg))
+#define RTL_R32(reg)           readl(ioaddr + (reg))
 
 #define ETH_FRAME_LEN  MAX_ETH_FRAME_SIZE
 #define ETH_ALEN       MAC_ADDR_LEN
 #define ETH_ZLEN       60
 
-#define bus_to_phys(a) pci_mem_to_phys((pci_dev_t)dev->priv, (pci_addr_t)a)
-#define phys_to_bus(a) pci_phys_to_mem((pci_dev_t)dev->priv, (phys_addr_t)a)
+#define bus_to_phys(a) pci_mem_to_phys((pci_dev_t)(unsigned long)dev->priv, \
+       (pci_addr_t)(unsigned long)a)
+#define phys_to_bus(a) pci_phys_to_mem((pci_dev_t)(unsigned long)dev->priv, \
+       (phys_addr_t)a)
 
 enum RTL8169_registers {
        MAC0 = 0,               /* Ethernet hardware address. */
@@ -852,7 +854,7 @@ static int rtl_init(struct eth_device *dev, bd_t *bis)
 
 #ifdef DEBUG_RTL8169
        /* Print out some hardware info */
-       printf("%s: at ioaddr 0x%x\n", dev->name, ioaddr);
+       printf("%s: at ioaddr 0x%lx\n", dev->name, ioaddr);
 #endif
 
        /* if TBI is not endbled */
@@ -1004,7 +1006,7 @@ int rtl8169_initialize(bd_t *bis)
                memset(dev, 0, sizeof(*dev));
                sprintf (dev->name, "RTL8169#%d", card_number);
 
-               dev->priv = (void *) devno;
+               dev->priv = (void *)(unsigned long)devno;
                dev->iobase = (int)pci_mem_to_phys(devno, iobase);
 
                dev->init = rtl_reset;
index 9fc3c18ba21ddc1022d595274767a4d1a636eb9f..fed7358448f216abd99ce67b38003c794492d6df 100644 (file)
@@ -9,7 +9,7 @@
 #include <asm/io.h>
 #include <asm/fsl_serdes.h>
 #include <fm_eth.h>
-#include <asm/fsl_memac.h>
+#include <fsl_memac.h>
 #include <vsc9953.h>
 
 static struct vsc9953_info vsc9953_l2sw = {
index 74fda70abe00ad6df5d6c0bed82fa4aedbccc633..c723dbb0a6947221790eadfc14b0776645f40902 100644 (file)
@@ -513,7 +513,8 @@ int zynq_gem_initialize(bd_t *bis, phys_addr_t base_addr,
 
        /* Align bd_space to 1MB */
        bd_space = memalign(1 << MMU_SECTION_SHIFT, BD_SPACE);
-       mmu_set_region_dcache_behaviour((u32)bd_space, BD_SPACE, DCACHE_OFF);
+       mmu_set_region_dcache_behaviour((phys_addr_t)bd_space,
+                                       BD_SPACE, DCACHE_OFF);
 
        /* Initialize the bd spaces for tx and rx bd's */
        priv->tx_bd = (struct emac_bd *)bd_space;
index bcad8f2aec0cfb992fb08724aa89dcf83b5cc281..402c5193e0fc2d4f5267a0c996adc2d8439ebdb6 100644 (file)
@@ -11,7 +11,6 @@
 #include <asm/io.h>
 #include <errno.h>
 #include <malloc.h>
-#include <asm/pcie_layerscape.h>
 
 #ifndef CONFIG_SYS_PCI_MEMORY_BUS
 #define CONFIG_SYS_PCI_MEMORY_BUS CONFIG_SYS_SDRAM_BASE
 #define PCIE_ATU_FUNC(x)               (((x) & 0x7) << 16)
 #define PCIE_ATU_UPPER_TARGET          0x91C
 
+/* LUT registers */
+#define PCIE_LUT_BASE          0x80000
+#define PCIE_LUT_DBG           0x7FC
+
+#define PCIE_DBI_RO_WR_EN      0x8bc
+
 #define PCIE_LINK_CAP          0x7c
 #define PCIE_LINK_SPEED_MASK   0xf
 #define PCIE_LINK_STA          0x82
 
-#define PCIE_DBI_SIZE          (4 * 1024) /* 4K */
+#define LTSSM_STATE_MASK       0x3f
+#define LTSSM_PCIE_L0          0x11 /* L0 state */
+
+#define PCIE_DBI_SIZE          0x100000 /* 1M */
 
 struct ls_pcie {
        int idx;
@@ -104,8 +112,6 @@ struct ls_pcie_info {
 
 /* PEX1/2 Misc Ports Status Register */
 #define LTSSM_STATE_SHIFT      20
-#define LTSSM_STATE_MASK       0x3f
-#define LTSSM_PCIE_L0          0x11 /* L0 state */
 
 static int ls_pcie_link_state(struct ls_pcie *pcie)
 {
@@ -122,18 +128,18 @@ static int ls_pcie_link_state(struct ls_pcie *pcie)
        return 1;
 }
 #else
-#define PCIE_LDBG 0x7FC
-
 static int ls_pcie_link_state(struct ls_pcie *pcie)
 {
        u32 state;
 
-       state = readl(pcie->dbi + PCIE_LDBG);
-       if (state)
-               return 1;
+       state = readl(pcie->dbi + PCIE_LUT_BASE + PCIE_LUT_DBG) &
+               LTSSM_STATE_MASK;
+       if (state < LTSSM_PCIE_L0) {
+               debug("....PCIe link error. LTSSM=0x%02x.\n", state);
+               return 0;
+       }
 
-       debug("....PCIe link error.\n");
-       return 0;
+       return 1;
 }
 #endif
 
@@ -149,7 +155,11 @@ static int ls_pcie_link_up(struct ls_pcie *pcie)
        /* Try to download speed to gen1 */
        cap = readl(pcie->dbi + PCIE_LINK_CAP);
        writel((cap & (~PCIE_LINK_SPEED_MASK)) | 1, pcie->dbi + PCIE_LINK_CAP);
-       udelay(2000);
+       /*
+        * Notice: the following delay has critical impact on link training
+        * if too short (<30ms) the link doesn't get up.
+        */
+       mdelay(100);
        state = ls_pcie_link_state(pcie);
        if (state)
                return state;
@@ -251,6 +261,10 @@ static int ls_pcie_addr_valid(struct pci_controller *hose, pci_dev_t d)
        if (PCI_DEV(d) > 0)
                return -EINVAL;
 
+       /* Controller does not support multi-function in RC mode */
+       if ((PCI_BUS(d) == hose->first_busno) && (PCI_FUNC(d) > 0))
+               return -EINVAL;
+
        return 0;
 }
 
@@ -327,8 +341,12 @@ static void ls_pcie_setup_ctrl(struct ls_pcie *pcie,
        pci_hose_write_config_dword(hose, dev, PCI_BASE_ADDRESS_0, 0);
 
        /* program correct class for RC */
+       writel(1, pcie->dbi + PCIE_DBI_RO_WR_EN);
        pci_hose_write_config_word(hose, dev, PCI_CLASS_DEVICE,
                                   PCI_CLASS_BRIDGE_PCI);
+#ifndef CONFIG_LS102XA
+       writel(0, pcie->dbi + PCIE_DBI_RO_WR_EN);
+#endif
 }
 
 int ls_pcie_init_ctrl(int busno, enum srds_prtcl dev, struct ls_pcie_info *info)
@@ -417,9 +435,9 @@ int ls_pcie_init_ctrl(int busno, enum srds_prtcl dev, struct ls_pcie_info *info)
        }
 
        /* Print the negotiated PCIe link width */
-       pci_hose_read_config_word(hose, dev, PCIE_LINK_STA, &temp16);
-               printf("x%d gen%d, regs @ 0x%lx\n", (temp16 & 0x3f0) >> 4,
-                      (temp16 & 0xf), info->regs);
+       pci_hose_read_config_word(hose, pdev, PCIE_LINK_STA, &temp16);
+       printf("x%d gen%d, regs @ 0x%lx\n", (temp16 & 0x3f0) >> 4,
+              (temp16 & 0xf), info->regs);
 
        if (ep_mode)
                return busno;
@@ -486,7 +504,7 @@ static void ft_pcie_ls_setup(void *blob, const char *pci_compat,
                fdt_set_node_status(blob, off, FDT_STATUS_DISABLED, 0);
 }
 
-void ft_pcie_setup(void *blob, bd_t *bd)
+void ft_pci_setup(void *blob, bd_t *bd)
 {
        #ifdef CONFIG_PCIE1
        ft_pcie_ls_setup(blob, FSL_PCIE_COMPAT, CONFIG_SYS_PCIE1_ADDR, PCIE1);
@@ -506,7 +524,7 @@ void ft_pcie_setup(void *blob, bd_t *bd)
 }
 
 #else
-void ft_pcie_setup(void *blob, bd_t *bd)
+void ft_pci_setup(void *blob, bd_t *bd)
 {
 }
 #endif
index d24651b5ba2b786e2a050cb3d98204d130365d6c..84e1433d9ee746e847fd11d2c283652364952f5b 100644 (file)
@@ -196,6 +196,18 @@ void u_qe_init(void)
 }
 #endif
 
+#ifdef CONFIG_U_QE
+void u_qe_resume(void)
+{
+       qe_map_t *qe_immrr;
+       uint qe_base = CONFIG_SYS_IMMR + QE_IMMR_OFFSET; /* QE immr base */
+       qe_immrr = (qe_map_t *)qe_base;
+
+       u_qe_firmware_resume((const void *)CONFIG_SYS_QE_FW_ADDR, qe_immrr);
+       out_be32(&qe_immrr->iram.iready, QE_IRAM_READY);
+}
+#endif
+
 void qe_reset(void)
 {
        qe_issue_cmd(QE_RESET, QE_CR_SUBBLOCK_INVALID,
@@ -580,6 +592,76 @@ int u_qe_upload_firmware(const struct qe_firmware *firmware)
 }
 #endif
 
+#ifdef CONFIG_U_QE
+int u_qe_firmware_resume(const struct qe_firmware *firmware, qe_map_t *qe_immrr)
+{
+       unsigned int i;
+       unsigned int j;
+       const struct qe_header *hdr;
+       const u32 *code;
+#ifdef CONFIG_DEEP_SLEEP
+#ifdef CONFIG_PPC
+       ccsr_gur_t __iomem *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR);
+#else
+       struct ccsr_gur __iomem *gur = (void *)CONFIG_SYS_FSL_GUTS_ADDR;
+#endif
+#endif
+
+       if (!firmware)
+               return -EINVAL;
+
+       hdr = &firmware->header;
+
+       /* Check the magic */
+       if ((hdr->magic[0] != 'Q') || (hdr->magic[1] != 'E') ||
+           (hdr->magic[2] != 'F')) {
+#ifdef CONFIG_DEEP_SLEEP
+               setbits_be32(&gur->devdisr, MPC85xx_DEVDISR_QE_DISABLE);
+#endif
+               return -EPERM;
+       }
+
+       /*
+        * If the microcode calls for it, split the I-RAM.
+        */
+       if (!firmware->split) {
+               out_be16(&qe_immrr->cp.cercr,
+                        in_be16(&qe_immrr->cp.cercr) | QE_CP_CERCR_CIR);
+       }
+
+       /* Loop through each microcode. */
+       for (i = 0; i < firmware->count; i++) {
+               const struct qe_microcode *ucode = &firmware->microcode[i];
+
+               /* Upload a microcode if it's present */
+               if (!ucode->code_offset)
+                       return 0;
+
+               code = (const void *)firmware + be32_to_cpu(ucode->code_offset);
+
+               /* Use auto-increment */
+               out_be32(&qe_immrr->iram.iadd, be32_to_cpu(ucode->iram_offset) |
+                       QE_IRAM_IADD_AIE | QE_IRAM_IADD_BADDR);
+
+               for (i = 0; i < be32_to_cpu(ucode->count); i++)
+                       out_be32(&qe_immrr->iram.idata, be32_to_cpu(code[i]));
+
+               /* Program the traps for this processor */
+               for (j = 0; j < 16; j++) {
+                       u32 trap = be32_to_cpu(ucode->traps[j]);
+
+                       if (trap)
+                               out_be32(&qe_immrr->rsp[i].tibcr[j], trap);
+               }
+
+               /* Enable traps */
+               out_be32(&qe_immrr->rsp[i].eccr, be32_to_cpu(ucode->eccr));
+       }
+
+       return 0;
+}
+#endif
+
 struct qe_firmware_info *qe_get_firmware_info(void)
 {
        return qe_firmware_uploaded ? &qe_firmware_info : NULL;
index 33878f897b0177d87578092af1edceb08883e674..77b18e928ff04bc67e19b0f16cfe6cc250017a19 100644 (file)
@@ -11,6 +11,9 @@
 #define __QE_H__
 
 #include "common.h"
+#ifdef CONFIG_U_QE
+#include <linux/immap_qe.h>
+#endif
 
 #define QE_NUM_OF_BRGS 16
 #define UCC_MAX_NUM    8
@@ -288,6 +291,9 @@ void qe_reset(void);
 #ifdef CONFIG_U_QE
 void u_qe_init(void);
 int u_qe_upload_firmware(const struct qe_firmware *firmware);
+void u_qe_resume(void);
+int u_qe_firmware_resume(const struct qe_firmware *firmware,
+                        qe_map_t *qe_immrr);
 #endif
 
 #endif /* __QE_H__ */
index 1686a1f951e860757bbc656678fbfdf6088b39b9..54e6f26d38d00a9a5b6781148f9fc1cd2d03b4b2 100644 (file)
@@ -66,6 +66,16 @@ config DEBUG_UART_CLOCK
          A default should be provided by your board, but if not you will need
          to use the correct value here.
 
+config DEBUG_UART_SHIFT
+       int "UART register shift"
+       depends on DEBUG_UART
+       default 0 if DEBUG_UART
+       help
+         Some UARTs (notably ns16550) support different register layouts
+         where the registers are spaced either as bytes, words or some other
+         value. Use this value to specify the shift to use, where 0=byte
+         registers, 2=32-bit word registers, etc.
+
 config UNIPHIER_SERIAL
        bool "UniPhier on-chip UART support"
        depends on ARCH_UNIPHIER && DM_SERIAL
index b385852eee4d94d19a6163570f4b45bc2f6c819a..d183eedbcb3f8598c82968092c6bf493208b1f23 100644 (file)
@@ -44,6 +44,7 @@ obj-$(CONFIG_TEGRA_SERIAL) += serial_tegra.o
 obj-$(CONFIG_UNIPHIER_SERIAL) += serial_uniphier.o
 obj-$(CONFIG_OMAP_SERIAL) += serial_omap.o
 obj-$(CONFIG_X86_SERIAL) += serial_x86.o
+obj-$(CONFIG_STM32_SERIAL) += serial_stm32.o
 
 ifndef CONFIG_SPL_BUILD
 obj-$(CONFIG_USB_TTY) += usbtty.o
index 67b1d60171abcaa0418dbde582d28a702a285db6..3d376d758085b4389a15b888638449311c5f9391 100644 (file)
@@ -57,7 +57,7 @@ DECLARE_GLOBAL_DATA_PTR;
 
 #ifdef CONFIG_DM_SERIAL
 
-static inline void serial_out_shift(unsigned char *addr, int shift, int value)
+static inline void serial_out_shift(void *addr, int shift, int value)
 {
 #ifdef CONFIG_SYS_NS16550_PORT_MAPPED
        outb(value, (ulong)addr);
@@ -72,7 +72,7 @@ static inline void serial_out_shift(unsigned char *addr, int shift, int value)
 #endif
 }
 
-static inline int serial_in_shift(unsigned char *addr, int shift)
+static inline int serial_in_shift(void *addr, int shift)
 {
 #ifdef CONFIG_SYS_NS16550_PORT_MAPPED
        return inb((ulong)addr);
@@ -114,9 +114,11 @@ static int ns16550_readb(NS16550_t port, int offset)
 
 /* We can clean these up once everything is moved to driver model */
 #define serial_out(value, addr)        \
-       ns16550_writeb(com_port, addr - (unsigned char *)com_port, value)
+       ns16550_writeb(com_port, \
+               (unsigned char *)addr - (unsigned char *)com_port, value)
 #define serial_in(addr) \
-       ns16550_readb(com_port, addr - (unsigned char *)com_port)
+       ns16550_readb(com_port, \
+               (unsigned char *)addr - (unsigned char *)com_port)
 #endif
 
 static inline int calc_divisor(NS16550_t port, int clock, int baudrate)
@@ -173,7 +175,6 @@ void NS16550_init(NS16550_t com_port, int baud_divisor)
                        defined(CONFIG_TI81XX) || defined(CONFIG_AM43XX)
        serial_out(0x7, &com_port->mdr1);       /* mode select reset TL16C750*/
 #endif
-       NS16550_setbrg(com_port, 0);
        serial_out(UART_MCRVAL, &com_port->mcr);
        serial_out(UART_FCRVAL, &com_port->fcr);
        if (baud_divisor != -1)
@@ -254,15 +255,19 @@ void debug_uart_init(void)
         */
        baud_divisor = calc_divisor(com_port, CONFIG_DEBUG_UART_CLOCK,
                                    CONFIG_BAUDRATE);
-
-       serial_out_shift(&com_port->ier, 0, CONFIG_SYS_NS16550_IER);
-       serial_out_shift(&com_port->mcr, 0, UART_MCRVAL);
-       serial_out_shift(&com_port->fcr, 0, UART_FCRVAL);
-
-       serial_out_shift(&com_port->lcr, 0, UART_LCR_BKSE | UART_LCRVAL);
-       serial_out_shift(&com_port->dll, 0, baud_divisor & 0xff);
-       serial_out_shift(&com_port->dlm, 0, (baud_divisor >> 8) & 0xff);
-       serial_out_shift(&com_port->lcr, 0, UART_LCRVAL);
+       serial_out_shift(&com_port->ier, CONFIG_DEBUG_UART_SHIFT,
+                        CONFIG_SYS_NS16550_IER);
+       serial_out_shift(&com_port->mcr, CONFIG_DEBUG_UART_SHIFT, UART_MCRVAL);
+       serial_out_shift(&com_port->fcr, CONFIG_DEBUG_UART_SHIFT, UART_FCRVAL);
+
+       serial_out_shift(&com_port->lcr, CONFIG_DEBUG_UART_SHIFT,
+                        UART_LCR_BKSE | UART_LCRVAL);
+       serial_out_shift(&com_port->dll, CONFIG_DEBUG_UART_SHIFT,
+                        baud_divisor & 0xff);
+       serial_out_shift(&com_port->dlm, CONFIG_DEBUG_UART_SHIFT,
+                        (baud_divisor >> 8) & 0xff);
+       serial_out_shift(&com_port->lcr, CONFIG_DEBUG_UART_SHIFT,
+                        UART_LCRVAL);
 }
 
 static inline void _debug_uart_putc(int ch)
@@ -271,7 +276,7 @@ static inline void _debug_uart_putc(int ch)
 
        while (!(serial_in_shift(&com_port->lsr, 0) & UART_LSR_THRE))
                ;
-       serial_out_shift(&com_port->thr, 0, ch);
+       serial_out_shift(&com_port->thr, CONFIG_DEBUG_UART_SHIFT, ch);
 }
 
 DEBUG_UART_FUNCS
index b239691efe945ba77d02429243a81186ded32454..b8c2f482288913475af367869b0ab086e6fd5943 100644 (file)
@@ -70,7 +70,7 @@ static void serial_find_console_or_panic(void)
        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");
+               panic_str("No serial driver found");
 #undef INDEX
        gd->cur_serial_dev = dev;
 }
index 9f78492298df2612157ea515eb10ca62ccf2dda8..699c410d6635bf0c8e1f49a8fc614c34c34bb3c6 100644 (file)
@@ -154,6 +154,7 @@ serial_initfunc(sa1100_serial_initialize);
 serial_initfunc(sandbox_serial_initialize);
 serial_initfunc(sconsole_serial_initialize);
 serial_initfunc(sh_serial_initialize);
+serial_initfunc(stm32_serial_initialize);
 serial_initfunc(uartlite_serial_initialize);
 serial_initfunc(zynq_serial_initialize);
 
@@ -246,6 +247,7 @@ void serial_initialize(void)
        sandbox_serial_initialize();
        sconsole_serial_initialize();
        sh_serial_initialize();
+       stm32_serial_initialize();
        uartlite_serial_initialize();
        zynq_serial_initialize();
 
index 75eb6bd729e1614033f1bd110fb602358cfb5e46..2124161734c0a40f4baf1a86de933be307e4e467 100644 (file)
@@ -95,7 +95,7 @@ static int pl01x_generic_serial_init(struct pl01x_regs *regs,
        return 0;
 }
 
-static int set_line_control(struct pl01x_regs *regs)
+static int pl011_set_line_control(struct pl01x_regs *regs)
 {
        unsigned int lcr;
        /*
@@ -129,6 +129,9 @@ static int pl01x_generic_setbrg(struct pl01x_regs *regs, enum pl01x_type type,
        case TYPE_PL010: {
                unsigned int divisor;
 
+               /* disable everything */
+               writel(0, &regs->pl010_cr);
+
                switch (baudrate) {
                case 9600:
                        divisor = UART_PL010_BAUD_9600;
@@ -152,6 +155,12 @@ static int pl01x_generic_setbrg(struct pl01x_regs *regs, enum pl01x_type type,
                writel((divisor & 0xf00) >> 8, &regs->pl010_lcrm);
                writel(divisor & 0xff, &regs->pl010_lcrl);
 
+               /*
+                * Set line control for the PL010 to be 8 bits, 1 stop bit,
+                * no parity, fifo enabled
+                */
+               writel(UART_PL010_LCRH_WLEN_8 | UART_PL010_LCRH_FEN,
+                      &regs->pl010_lcrh);
                /* Finally, enable the UART */
                writel(UART_PL010_CR_UARTEN, &regs->pl010_cr);
                break;
@@ -178,7 +187,7 @@ static int pl01x_generic_setbrg(struct pl01x_regs *regs, enum pl01x_type type,
                writel(divider, &regs->pl011_ibrd);
                writel(fraction, &regs->pl011_fbrd);
 
-               set_line_control(regs);
+               pl011_set_line_control(regs);
                /* Finally, enable the UART */
                writel(UART_PL011_CR_UARTEN | UART_PL011_CR_TXE |
                       UART_PL011_CR_RXE | UART_PL011_CR_RTS, &regs->pl011_cr);
diff --git a/drivers/serial/serial_stm32.c b/drivers/serial/serial_stm32.c
new file mode 100644 (file)
index 0000000..3c80096
--- /dev/null
@@ -0,0 +1,117 @@
+/*
+ * (C) Copyright 2015
+ * Kamil Lulko, <rev13@wp.pl>
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#include <common.h>
+#include <asm/io.h>
+#include <serial.h>
+#include <asm/arch/stm32.h>
+
+#define STM32_USART1_BASE      (STM32_APB2PERIPH_BASE + 0x1000)
+#define RCC_APB2ENR_USART1EN   (1 << 4)
+
+#define USART_BASE             STM32_USART1_BASE
+#define RCC_USART_ENABLE       RCC_APB2ENR_USART1EN
+
+struct stm32_serial {
+       u32 sr;
+       u32 dr;
+       u32 brr;
+       u32 cr1;
+       u32 cr2;
+       u32 cr3;
+       u32 gtpr;
+};
+
+#define USART_CR1_RE           (1 << 2)
+#define USART_CR1_TE           (1 << 3)
+#define USART_CR1_UE           (1 << 13)
+
+#define USART_SR_FLAG_RXNE     (1 << 5)
+#define USART_SR_FLAG_TXE      (1 << 7)
+
+#define USART_BRR_F_MASK       0xF
+#define USART_BRR_M_SHIFT      4
+#define USART_BRR_M_MASK       0xFFF0
+
+DECLARE_GLOBAL_DATA_PTR;
+
+static void stm32_serial_setbrg(void)
+{
+       serial_init();
+}
+
+static int stm32_serial_init(void)
+{
+       struct stm32_serial *usart = (struct stm32_serial *)USART_BASE;
+       u32 clock, int_div, frac_div, tmp;
+
+       if ((USART_BASE & STM32_BUS_MASK) == STM32_APB1PERIPH_BASE) {
+               setbits_le32(&STM32_RCC->apb1enr, RCC_USART_ENABLE);
+               clock = clock_get(CLOCK_APB1);
+       } else if ((USART_BASE & STM32_BUS_MASK) == STM32_APB2PERIPH_BASE) {
+               setbits_le32(&STM32_RCC->apb2enr, RCC_USART_ENABLE);
+               clock = clock_get(CLOCK_APB2);
+       } else {
+               return -1;
+       }
+
+       int_div = (25 * clock) / (4 * gd->baudrate);
+       tmp = ((int_div / 100) << USART_BRR_M_SHIFT) & USART_BRR_M_MASK;
+       frac_div = int_div - (100 * (tmp >> USART_BRR_M_SHIFT));
+       tmp |= (((frac_div * 16) + 50) / 100) & USART_BRR_F_MASK;
+
+       writel(tmp, &usart->brr);
+       setbits_le32(&usart->cr1, USART_CR1_RE | USART_CR1_TE | USART_CR1_UE);
+
+       return 0;
+}
+
+static int stm32_serial_getc(void)
+{
+       struct stm32_serial *usart = (struct stm32_serial *)USART_BASE;
+       while ((readl(&usart->sr) & USART_SR_FLAG_RXNE) == 0)
+               ;
+       return readl(&usart->dr);
+}
+
+static void stm32_serial_putc(const char c)
+{
+       struct stm32_serial *usart = (struct stm32_serial *)USART_BASE;
+       while ((readl(&usart->sr) & USART_SR_FLAG_TXE) == 0)
+               ;
+       writel(c, &usart->dr);
+}
+
+static int stm32_serial_tstc(void)
+{
+       struct stm32_serial *usart = (struct stm32_serial *)USART_BASE;
+       u8 ret;
+
+       ret = readl(&usart->sr) & USART_SR_FLAG_RXNE;
+       return ret;
+}
+
+static struct serial_device stm32_serial_drv = {
+       .name   = "stm32_serial",
+       .start  = stm32_serial_init,
+       .stop   = NULL,
+       .setbrg = stm32_serial_setbrg,
+       .putc   = stm32_serial_putc,
+       .puts   = default_serial_puts,
+       .getc   = stm32_serial_getc,
+       .tstc   = stm32_serial_tstc,
+};
+
+void stm32_serial_initialize(void)
+{
+       serial_register(&stm32_serial_drv);
+}
+
+__weak struct serial_device *default_serial_console(void)
+{
+       return &stm32_serial_drv;
+}
index a46d8c187668cff8560eea31c7189c7dfa3b4161..67f6b2d7cdaa871b97f170d78476c658a622a94e 100644 (file)
@@ -296,8 +296,9 @@ static int exynos_spi_probe(struct udevice *bus)
        return 0;
 }
 
-static int exynos_spi_claim_bus(struct udevice *bus)
+static int exynos_spi_claim_bus(struct udevice *dev)
 {
+       struct udevice *bus = dev->parent;
        struct exynos_spi_priv *priv = dev_get_priv(bus);
 
        exynos_pinmux_config(priv->periph_id, PINMUX_FLAG_NONE);
@@ -308,8 +309,9 @@ static int exynos_spi_claim_bus(struct udevice *bus)
        return 0;
 }
 
-static int exynos_spi_release_bus(struct udevice *bus)
+static int exynos_spi_release_bus(struct udevice *dev)
 {
+       struct udevice *bus = dev->parent;
        struct exynos_spi_priv *priv = dev_get_priv(bus);
 
        spi_flush_fifo(priv->regs);
index 651e46e4bd20b345b83dcd9a87d89a5196c583bf..85f9e85fd4b92ff6af8d48bf8bb1d452ac68256e 100644 (file)
@@ -20,7 +20,7 @@
 #include <asm/io.h>
 #include "omap3_spi.h"
 
-#define SPI_WAIT_TIMEOUT 3000000
+#define SPI_WAIT_TIMEOUT 10
 
 static void spi_reset(struct omap3_spi_slave *ds)
 {
@@ -227,7 +227,7 @@ int omap3_spi_write(struct spi_slave *slave, unsigned int len, const void *txp,
 {
        struct omap3_spi_slave *ds = to_omap3_spi(slave);
        int i;
-       int timeout = SPI_WAIT_TIMEOUT;
+       ulong start;
        int chconf = readl(&ds->regs->channel[ds->slave.cs].chconf);
 
        /* Enable the channel */
@@ -241,9 +241,10 @@ int omap3_spi_write(struct spi_slave *slave, unsigned int len, const void *txp,
 
        for (i = 0; i < len; i++) {
                /* wait till TX register is empty (TXS == 1) */
+               start = get_timer(0);
                while (!(readl(&ds->regs->channel[ds->slave.cs].chstat) &
                         OMAP3_MCSPI_CHSTAT_TXS)) {
-                       if (--timeout <= 0) {
+                       if (get_timer(start) > SPI_WAIT_TIMEOUT) {
                                printf("SPI TXS timed out, status=0x%08x\n",
                                       readl(&ds->regs->channel[ds->slave.cs].chstat));
                                return -1;
@@ -280,7 +281,7 @@ int omap3_spi_read(struct spi_slave *slave, unsigned int len, void *rxp,
 {
        struct omap3_spi_slave *ds = to_omap3_spi(slave);
        int i;
-       int timeout = SPI_WAIT_TIMEOUT;
+       ulong start;
        int chconf = readl(&ds->regs->channel[ds->slave.cs].chconf);
 
        /* Enable the channel */
@@ -295,10 +296,11 @@ int omap3_spi_read(struct spi_slave *slave, unsigned int len, void *rxp,
        writel(0, &ds->regs->channel[ds->slave.cs].tx);
 
        for (i = 0; i < len; i++) {
+               start = get_timer(0);
                /* Wait till RX register contains data (RXS == 1) */
                while (!(readl(&ds->regs->channel[ds->slave.cs].chstat) &
                         OMAP3_MCSPI_CHSTAT_RXS)) {
-                       if (--timeout <= 0) {
+                       if (get_timer(start) > SPI_WAIT_TIMEOUT) {
                                printf("SPI RXS timed out, status=0x%08x\n",
                                       readl(&ds->regs->channel[ds->slave.cs].chstat));
                                return -1;
@@ -332,7 +334,7 @@ int omap3_spi_txrx(struct spi_slave *slave, unsigned int len,
                   const void *txp, void *rxp, unsigned long flags)
 {
        struct omap3_spi_slave *ds = to_omap3_spi(slave);
-       int timeout = SPI_WAIT_TIMEOUT;
+       ulong start;
        int chconf = readl(&ds->regs->channel[ds->slave.cs].chconf);
        int irqstatus = readl(&ds->regs->irqstatus);
        int i=0;
@@ -350,9 +352,10 @@ int omap3_spi_txrx(struct spi_slave *slave, unsigned int len,
        for (i=0; i < len; i++){
                /* Write: wait for TX empty (TXS == 1)*/
                irqstatus |= (1<< (4*(ds->slave.bus)));
+               start = get_timer(0);
                while (!(readl(&ds->regs->channel[ds->slave.cs].chstat) &
                         OMAP3_MCSPI_CHSTAT_TXS)) {
-                       if (--timeout <= 0) {
+                       if (get_timer(start) > SPI_WAIT_TIMEOUT) {
                                printf("SPI TXS timed out, status=0x%08x\n",
                                       readl(&ds->regs->channel[ds->slave.cs].chstat));
                                return -1;
@@ -368,9 +371,10 @@ int omap3_spi_txrx(struct spi_slave *slave, unsigned int len,
                        writel(((u8 *)txp)[i], tx);
 
                /*Read: wait for RX containing data (RXS == 1)*/
+               start = get_timer(0);
                while (!(readl(&ds->regs->channel[ds->slave.cs].chstat) &
                         OMAP3_MCSPI_CHSTAT_RXS)) {
-                       if (--timeout <= 0) {
+                       if (get_timer(start) > SPI_WAIT_TIMEOUT) {
                                printf("SPI RXS timed out, status=0x%08x\n",
                                       readl(&ds->regs->channel[ds->slave.cs].chstat));
                                return -1;
index 866c48f243929406ed6f12512be481603644cb86..83fe8e0d69ae9d8d6972f99a72e4294fa4aa0848 100644 (file)
@@ -67,7 +67,7 @@ int spi_claim_bus(struct spi_slave *slave)
        if (ret)
                return ret;
 
-       return ops->claim_bus ? ops->claim_bus(bus) : 0;
+       return ops->claim_bus ? ops->claim_bus(dev) : 0;
 }
 
 void spi_release_bus(struct spi_slave *slave)
@@ -77,7 +77,7 @@ void spi_release_bus(struct spi_slave *slave)
        struct dm_spi_ops *ops = spi_get_ops(bus);
 
        if (ops->release_bus)
-               ops->release_bus(bus);
+               ops->release_bus(dev);
 }
 
 int spi_xfer(struct spi_slave *slave, unsigned int bitlen,
index 53ff9ea22105353180159203def640905b5fecf8..4bec66309e9b6fbc54138dc7d3bc05458a3a3baf 100644 (file)
@@ -153,8 +153,9 @@ static int tegra114_spi_probe(struct udevice *bus)
        return 0;
 }
 
-static int tegra114_spi_claim_bus(struct udevice *bus)
+static int tegra114_spi_claim_bus(struct udevice *dev)
 {
+       struct udevice *bus = dev->parent;
        struct tegra114_spi_priv *priv = dev_get_priv(bus);
        struct spi_regs *regs = priv->regs;
 
index 78c74cdf37fe095d8efa34c26ab5df0093e305bd..82c1b84f3bd953ec50dfdb0b4197448da3043584 100644 (file)
@@ -125,8 +125,9 @@ static int tegra20_sflash_probe(struct udevice *bus)
        return 0;
 }
 
-static int tegra20_sflash_claim_bus(struct udevice *bus)
+static int tegra20_sflash_claim_bus(struct udevice *dev)
 {
+       struct udevice *bus = dev->parent;
        struct tegra20_sflash_priv *priv = dev_get_priv(bus);
        struct spi_regs *regs = priv->regs;
        u32 reg;
index 597d6ad5ccecb8e36818bb6d2d555c2f3b14294f..f6fb89b393f0881e624e006baf9f16cd056d2474 100644 (file)
@@ -141,8 +141,9 @@ static int tegra30_spi_probe(struct udevice *bus)
        return 0;
 }
 
-static int tegra30_spi_claim_bus(struct udevice *bus)
+static int tegra30_spi_claim_bus(struct udevice *dev)
 {
+       struct udevice *bus = dev->parent;
        struct tegra30_spi_priv *priv = dev_get_priv(bus);
        struct spi_regs *regs = priv->regs;
        u32 reg;
index 5da87591ceef3f530edf4bbc45b95263b53d28bf..e9129da79d99825b9d88c7bc893d3de0f9700feb 100644 (file)
@@ -227,9 +227,6 @@ int spi_xfer(struct spi_slave *slave, unsigned int bitlen, const void *dout,
        debug("spi_xfer: bus:%i cs:%i bitlen:%i len:%i flags:%lx\n",
              slave->bus, slave->cs, bitlen, len, flags);
 
-       if (bitlen == 0)
-               return -1;
-
        if (bitlen % 8) {
                debug("spi_xfer: Non byte aligned SPI transfer\n");
                return -1;
index 280c7080f2aecba6deb8b60c79ca3fc4dd8d8979..baf8bdc857b6452315af9c7efec983dd2a1bc06d 100644 (file)
@@ -32,6 +32,7 @@ static struct usb_string hub_strings[] = {
        {STRING_MANUFACTURER,   "sandbox"},
        {STRING_PRODUCT,        "hub"},
        {STRING_SERIAL,         "2345"},
+       {},
 };
 
 static struct usb_device_descriptor hub_device_desc = {
index 7658f873e0afe33ce27aba3bf46de8854f2158b4..3b57e5655334bd817be0953b6cb260411a78479a 100644 (file)
@@ -44,6 +44,7 @@ obj-$(CONFIG_USB_EHCI_SUNXI) += ehci-sunxi.o
 obj-$(CONFIG_USB_EHCI_TEGRA) += ehci-tegra.o
 obj-$(CONFIG_USB_EHCI_UNIPHIER) += ehci-uniphier.o
 obj-$(CONFIG_USB_EHCI_VCT) += ehci-vct.o
+obj-$(CONFIG_USB_EHCI_VF) += ehci-vf.o
 obj-$(CONFIG_USB_EHCI_RMOBILE) += ehci-rmobile.o
 obj-$(CONFIG_USB_EHCI_ZYNQ) += ehci-zynq.o
 
index 5d4288d38f086c7967f8388bde7bf8423afdcc47..2dca5244be9c15b87116b9e880c06e69d7c41927 100644 (file)
@@ -259,10 +259,11 @@ static int fdt_fixup_usb_erratum(void *blob, const char *prop_erratum,
 void fdt_fixup_dr_usb(void *blob, bd_t *bd)
 {
        static const char * const modes[] = { "host", "peripheral", "otg" };
-       static const char * const phys[] = { "ulpi", "utmi" };
+       static const char * const phys[] = { "ulpi", "utmi", "utmi_dual" };
        int usb_erratum_a006261_off = -1;
        int usb_erratum_a007075_off = -1;
        int usb_erratum_a007792_off = -1;
+       int usb_erratum_a005697_off = -1;
        int usb_mode_off = -1;
        int usb_phy_off = -1;
        char str[5];
@@ -303,6 +304,9 @@ void fdt_fixup_dr_usb(void *blob, bd_t *bd)
                                dr_phy_type = phys[phy_idx];
                }
 
+               if (has_dual_phy())
+                       dr_phy_type = phys[2];
+
                usb_mode_off = fdt_fixup_usb_mode_phy_type(blob,
                                                           dr_mode_type, NULL,
                                                           usb_mode_off);
@@ -325,6 +329,7 @@ void fdt_fixup_dr_usb(void *blob, bd_t *bd)
                        if (usb_erratum_a006261_off < 0)
                                return;
                }
+
                if (has_erratum_a007075()) {
                        usb_erratum_a007075_off =  fdt_fixup_usb_erratum
                                                   (blob,
@@ -333,6 +338,7 @@ void fdt_fixup_dr_usb(void *blob, bd_t *bd)
                        if (usb_erratum_a007075_off < 0)
                                return;
                }
+
                if (has_erratum_a007792()) {
                        usb_erratum_a007792_off =  fdt_fixup_usb_erratum
                                                   (blob,
@@ -341,6 +347,14 @@ void fdt_fixup_dr_usb(void *blob, bd_t *bd)
                        if (usb_erratum_a007792_off < 0)
                                return;
                }
+               if (has_erratum_a005697()) {
+                       usb_erratum_a005697_off =  fdt_fixup_usb_erratum
+                                                  (blob,
+                                                   "fsl,usb-erratum-a005697",
+                                                   usb_erratum_a005697_off);
+                       if (usb_erratum_a005697_off < 0)
+                               return;
+               }
        }
 }
 #endif
diff --git a/drivers/usb/host/ehci-vf.c b/drivers/usb/host/ehci-vf.c
new file mode 100644 (file)
index 0000000..5454855
--- /dev/null
@@ -0,0 +1,164 @@
+/*
+ * Copyright (c) 2015 Sanchayan Maity <sanchayan.maity@toradex.com>
+ * Copyright (C) 2015 Toradex AG
+ *
+ * Based on ehci-mx6 driver
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#include <common.h>
+#include <usb.h>
+#include <errno.h>
+#include <linux/compiler.h>
+#include <asm/io.h>
+#include <asm/arch/clock.h>
+#include <asm/arch/imx-regs.h>
+#include <asm/arch/crm_regs.h>
+#include <asm/imx-common/iomux-v3.h>
+#include <asm/imx-common/regs-usbphy.h>
+#include <usb/ehci-fsl.h>
+
+#include "ehci.h"
+
+#define USB_NC_REG_OFFSET                              0x00000800
+
+#define ANADIG_PLL_CTRL_EN_USB_CLKS            (1 << 6)
+
+#define UCTRL_OVER_CUR_POL     (1 << 8) /* OTG Polarity of Overcurrent */
+#define UCTRL_OVER_CUR_DIS     (1 << 7) /* Disable OTG Overcurrent Detection */
+
+/* USBCMD */
+#define UCMD_RUN_STOP          (1 << 0) /* controller run/stop */
+#define UCMD_RESET                     (1 << 1) /* controller reset */
+
+static const unsigned phy_bases[] = {
+       USB_PHY0_BASE_ADDR,
+       USB_PHY1_BASE_ADDR,
+};
+
+static const unsigned nc_reg_bases[] = {
+       USBC0_BASE_ADDR,
+       USBC1_BASE_ADDR,
+};
+
+static void usb_internal_phy_clock_gate(int index)
+{
+       void __iomem *phy_reg;
+
+       phy_reg = (void __iomem *)phy_bases[index];
+       clrbits_le32(phy_reg + USBPHY_CTRL, USBPHY_CTRL_CLKGATE);
+}
+
+static void usb_power_config(int index)
+{
+       struct anadig_reg __iomem *anadig =
+               (struct anadig_reg __iomem *)ANADIG_BASE_ADDR;
+       void __iomem *pll_ctrl;
+
+       switch (index) {
+       case 0:
+               pll_ctrl = &anadig->pll3_ctrl;
+               clrbits_le32(pll_ctrl, ANADIG_PLL3_CTRL_BYPASS);
+               setbits_le32(pll_ctrl, ANADIG_PLL3_CTRL_ENABLE
+                        | ANADIG_PLL3_CTRL_POWERDOWN
+                        | ANADIG_PLL_CTRL_EN_USB_CLKS);
+               break;
+       case 1:
+               pll_ctrl = &anadig->pll7_ctrl;
+               clrbits_le32(pll_ctrl, ANADIG_PLL7_CTRL_BYPASS);
+               setbits_le32(pll_ctrl, ANADIG_PLL7_CTRL_ENABLE
+                        | ANADIG_PLL7_CTRL_POWERDOWN
+                        | ANADIG_PLL_CTRL_EN_USB_CLKS);
+               break;
+       default:
+               return;
+       }
+}
+
+static void usb_phy_enable(int index, struct usb_ehci *ehci)
+{
+       void __iomem *phy_reg;
+       void __iomem *phy_ctrl;
+       void __iomem *usb_cmd;
+
+       phy_reg = (void __iomem *)phy_bases[index];
+       phy_ctrl = (void __iomem *)(phy_reg + USBPHY_CTRL);
+       usb_cmd = (void __iomem *)&ehci->usbcmd;
+
+       /* Stop then Reset */
+       clrbits_le32(usb_cmd, UCMD_RUN_STOP);
+       while (readl(usb_cmd) & UCMD_RUN_STOP)
+               ;
+
+       setbits_le32(usb_cmd, UCMD_RESET);
+       while (readl(usb_cmd) & UCMD_RESET)
+               ;
+
+       /* Reset USBPHY module */
+       setbits_le32(phy_ctrl, USBPHY_CTRL_SFTRST);
+       udelay(10);
+
+       /* Remove CLKGATE and SFTRST */
+       clrbits_le32(phy_ctrl, USBPHY_CTRL_CLKGATE | USBPHY_CTRL_SFTRST);
+       udelay(10);
+
+       /* Power up the PHY */
+       writel(0, phy_reg + USBPHY_PWD);
+
+       /* Enable FS/LS device */
+       setbits_le32(phy_ctrl, USBPHY_CTRL_ENUTMILEVEL2 |
+                USBPHY_CTRL_ENUTMILEVEL3);
+}
+
+static void usb_oc_config(int index)
+{
+       void __iomem *ctrl;
+
+       ctrl = (void __iomem *)(nc_reg_bases[index] + USB_NC_REG_OFFSET);
+
+       setbits_le32(ctrl, UCTRL_OVER_CUR_POL);
+       setbits_le32(ctrl, UCTRL_OVER_CUR_DIS);
+}
+
+int ehci_hcd_init(int index, enum usb_init_type init,
+               struct ehci_hccr **hccr, struct ehci_hcor **hcor)
+{
+       struct usb_ehci *ehci;
+
+       if (index >= ARRAY_SIZE(nc_reg_bases))
+               return -EINVAL;
+
+       if (init == USB_INIT_DEVICE && index == 1)
+               return -ENODEV;
+       if (init == USB_INIT_HOST && index == 0)
+               return -ENODEV;
+
+       ehci = (struct usb_ehci *)nc_reg_bases[index];
+
+       usb_power_config(index);
+       usb_oc_config(index);
+       usb_internal_phy_clock_gate(index);
+       usb_phy_enable(index, ehci);
+
+       *hccr = (struct ehci_hccr *)((uint32_t)&ehci->caplength);
+       *hcor = (struct ehci_hcor *)((uint32_t)*hccr +
+                       HC_LENGTH(ehci_readl(&(*hccr)->cr_capbase)));
+
+       if (init == USB_INIT_DEVICE) {
+               setbits_le32(&ehci->usbmode, CM_DEVICE);
+               writel((PORT_PTS_UTMI | PORT_PTS_PTW), &ehci->portsc);
+               setbits_le32(&ehci->portsc, USB_EN);
+       } else if (init == USB_INIT_HOST) {
+               setbits_le32(&ehci->usbmode, CM_HOST);
+               writel((PORT_PTS_UTMI | PORT_PTS_PTW), &ehci->portsc);
+               setbits_le32(&ehci->portsc, USB_EN);
+       }
+
+       return 0;
+}
+
+int ehci_hcd_stop(int index)
+{
+       return 0;
+}
index ca5bd6fb46626eafb7b0f15d023d243b79783f93..957f5c7ffad2a2ab6637024169f84bfdc6489f75 100644 (file)
@@ -1,9 +1,6 @@
 #
 # Device Tree Control
 #
-# TODO:
-#   This feature is not currently supported for SPL,
-#    but this restriction should be removed in the future.
 
 config SUPPORT_OF_CONTROL
        bool
@@ -17,6 +14,14 @@ config OF_CONTROL
          This feature provides for run-time configuration of U-Boot
          via a flattened device tree.
 
+config SPL_DISABLE_OF_CONTROL
+       bool "Disable run-time configuration via Device Tree in SPL"
+       depends on OF_CONTROL
+       help
+         Some boards use device tree in U-Boot but only have 4KB of SRAM
+         which is not enough to support device tree. Enable this option to
+         allow such boards to be supported by U-Boot SPL.
+
 choice
        prompt "Provider of DTB for DT control"
        depends on OF_CONTROL
index a079f13bdc1e55e31f3d0f68cb57cf1dc9de1423..cde3474b1870c8391de447f4f9126ac19081ccd3 100644 (file)
@@ -482,7 +482,6 @@ int testdram(void);
     defined(CONFIG_8xx)
 uint   get_immr      (uint);
 #endif
-uint   get_pir       (void);
 #if defined(CONFIG_MPC5xxx)
 uint   get_svr       (void);
 #endif
@@ -744,6 +743,45 @@ int gunzip(void *, int, unsigned char *, unsigned long *);
 int zunzip(void *dst, int dstlen, unsigned char *src, unsigned long *lenp,
                                                int stoponerr, int offset);
 
+/**
+ * gzwrite progress indicators: defined weak to allow board-specific
+ * overrides:
+ *
+ *     gzwrite_progress_init called on startup
+ *     gzwrite_progress called during decompress/write loop
+ *     gzwrite_progress_finish called at end of loop to
+ *             indicate success (retcode=0) or failure
+ */
+void gzwrite_progress_init(u64 expected_size);
+
+void gzwrite_progress(int iteration,
+                    u64 bytes_written,
+                    u64 total_bytes);
+
+void gzwrite_progress_finish(int retcode,
+                            u64 totalwritten,
+                            u64 totalsize,
+                            u32 expected_crc,
+                            u32 calculated_crc);
+
+/**
+ * decompress and write gzipped image from memory to block device
+ *
+ * @param      src             compressed image address
+ * @param      len             compressed image length in bytes
+ * @param      dev             block device descriptor
+ * @param      szwritebuf      bytes per write (pad to erase size)
+ * @param      startoffs       offset in bytes of first write
+ * @param      szexpected      expected uncompressed length
+ *                             may be zero to use gzip trailer
+ *                             for files under 4GiB
+ */
+int gzwrite(unsigned char *src, int len,
+           struct block_dev_desc *dev,
+           unsigned long szwritebuf,
+           u64 startoffs,
+           u64 szexpected);
+
 /* lib/qsort.c */
 void qsort(void *base, size_t nmemb, size_t size,
           int(*compar)(const void *, const void *));
diff --git a/include/config_fsl_secboot.h b/include/config_fsl_secboot.h
new file mode 100644 (file)
index 0000000..050b157
--- /dev/null
@@ -0,0 +1,89 @@
+/*
+ * Copyright 2015 Freescale Semiconductor, Inc.
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#ifndef __CONFIG_FSL_SECBOOT_H
+#define __CONFIG_FSL_SECBOOT_H
+
+#ifdef CONFIG_SECURE_BOOT
+
+#ifndef CONFIG_CMD_ESBC_VALIDATE
+#define CONFIG_CMD_ESBC_VALIDATE
+#endif
+
+#ifndef CONFIG_EXTRA_ENV
+#define CONFIG_EXTRA_ENV       ""
+#endif
+
+/*
+ * Control should not reach back to uboot after validation of images
+ * for secure boot flow and therefore bootscript should have
+ * the bootm command. If control reaches back to uboot anyhow
+ * after validating images, core should just spin.
+ */
+
+/*
+ * Define the key hash for boot script here if public/private key pair used to
+ * sign bootscript are different from the SRK hash put in the fuse
+ * Example of defining KEY_HASH is
+ * #define CONFIG_BOOTSCRIPT_KEY_HASH \
+ *      "41066b564c6ffcef40ccbc1e0a5d0d519604000c785d97bbefd25e4d288d1c8b"
+ */
+
+#ifdef CONFIG_BOOTSCRIPT_KEY_HASH
+#define CONFIG_SECBOOT \
+       "setenv bs_hdraddr " __stringify(CONFIG_BOOTSCRIPT_HDR_ADDR)";" \
+       "setenv bootargs \'root=/dev/ram rw console=ttyS0,115200 "      \
+       "ramdisk_size=600000\';"        \
+       CONFIG_EXTRA_ENV        \
+       "esbc_validate $bs_hdraddr " \
+         __stringify(CONFIG_BOOTSCRIPT_KEY_HASH)";" \
+       "source $img_addr;"     \
+       "esbc_halt\0"
+#else
+#define CONFIG_SECBOOT \
+       "setenv bs_hdraddr " __stringify(CONFIG_BOOTSCRIPT_HDR_ADDR)";" \
+       "setenv bootargs \'root=/dev/ram rw console=ttyS0,115200 "      \
+       "ramdisk_size=600000\';"        \
+       CONFIG_EXTRA_ENV        \
+       "esbc_validate $bs_hdraddr;" \
+       "source $img_addr;"     \
+       "esbc_halt\0"
+#endif
+
+/* For secure boot flow, default environment used will be used */
+#if defined(CONFIG_SYS_RAMBOOT)
+#if defined(CONFIG_RAMBOOT_SPIFLASH)
+#undef CONFIG_ENV_IS_IN_SPI_FLASH
+#elif defined(CONFIG_RAMBOOT_NAND)
+#undef CONFIG_ENV_IS_IN_NAND
+#elif defined(CONFIG_RAMBOOT_SDCARD)
+#undef CONFIG_ENV_IS_IN_MMC
+#endif
+#else /*CONFIG_SYS_RAMBOOT*/
+#undef CONFIG_ENV_IS_IN_FLASH
+#endif
+
+#define CONFIG_ENV_IS_NOWHERE
+
+/*
+ * We don't want boot delay for secure boot flow
+ * before autoboot starts
+ */
+#undef CONFIG_BOOTDELAY
+#define CONFIG_BOOTDELAY       0
+#undef CONFIG_BOOTCOMMAND
+#define CONFIG_BOOTCOMMAND             CONFIG_SECBOOT
+
+/*
+ * CONFIG_ZERO_BOOTDELAY_CHECK should not be defined for
+ * secure boot flow as defining this would enable a user to
+ * reach uboot prompt by pressing some key before start of
+ * autoboot
+ */
+#undef CONFIG_ZERO_BOOTDELAY_CHECK
+
+#endif
+#endif
index a9106f4f3b7eb072239dbf2545bd4ac2f057a03d..38cb0e8abac9378c375cb4162454b6cc6923b2c8 100644 (file)
@@ -31,6 +31,7 @@
 
 #undef CONFIG_DM_WARN
 #undef CONFIG_DM_DEVICE_REMOVE
+#undef CONFIG_DM_SEQ_ALIAS
 #undef CONFIG_DM_STDIO
 
 #endif /* CONFIG_SPL_BUILD */
index 9390464b10d214ab375be8bf585adc4d93d04193..7eac03baaf2dcbd75f2a04bc759b0880e9c41ca0 100644 (file)
 #define CONFIG_ENV_SECT_SIZE           0x2000
 #define CONFIG_ENV_IS_IN_FLASH         1
 
+#define LDS_BOARD_TEXT \
+        . = DEFINED(env_offset) ? env_offset : .; \
+        common/env_embedded.o (.text*);
+
 /* Cache Configuration */
 #define CONFIG_SYS_CACHELINE_SIZE      16
 
index e9424b4a07cf14d20da09aebe4b6970f77adc98e..ce33ba429fa55f5008dbba8663f416c51d6038a7 100644 (file)
 #      define CONFIG_SYS_FLASH_BANKS_LIST      { CONFIG_SYS_CS0_BASE }
 #endif
 
+#define LDS_BOARD_TEXT \
+        arch/m68k/cpu/mcf5227x/built-in.o   (.text*) \
+       arch/m68k/lib/built-in.o            (.text*)
+
 /*
  * This is setting for JFFS2 support in u-boot.
  * NOTE: Enable CONFIG_CMD_JFFS2 for JFFS2 support.
index 883347b0fd8b61d0248a2dda0f6c4823c05cf418..4bba81544fd67181ff6bfcb4a358b1f1defd77e9 100644 (file)
  * Environment is embedded in u-boot in the second sector of the flash
  */
 #define CONFIG_ENV_IS_IN_FLASH 1
+
+#define LDS_BOARD_TEXT \
+       . = DEFINED(env_offset) ? env_offset : .; \
+       common/env_embedded.o (.text);
+
 #ifdef NORFLASH_PS32BIT
 #      define CONFIG_ENV_OFFSET                (0x8000)
 #      define CONFIG_ENV_SIZE          0x4000
index 60e5b45942a0239b7120264e31617d79c702de53..6167ea1ed55f781aa8916ae15fa20d5be1f299ba 100644 (file)
 #define CONFIG_SYS_INIT_SP_OFFSET      CONFIG_SYS_GBL_DATA_OFFSET
 
 #define CONFIG_ENV_IS_IN_FLASH 1
+
+#define LDS_BOARD_TEXT \
+        . = DEFINED(env_offset) ? env_offset : .; \
+        common/env_embedded.o (.text);
+
 #define CONFIG_ENV_OFFSET              0x4000  /* Address of Environment Sector*/
 #define CONFIG_ENV_SIZE                0x2000  /* Total Size of Environment Sector     */
 #define CONFIG_ENV_SECT_SIZE   0x2000 /* see README - env sector total size    */
index 7421b57b0f0c3d850ab4ce7e10585253164d0945..5d978747fe8ae5fc8faac0261aa607563f0275ed 100644 (file)
 #      define CONFIG_ENV_IS_IN_FLASH   1
 #endif
 
+#define LDS_BOARD_TEXT \
+        . = DEFINED(env_offset) ? env_offset : .; \
+        common/env_embedded.o (.text*);
+
 /*
  * Command line configuration.
  */
index 8fd3907ad88db23d353547b4408279e81f700825..64dc64de2ba9f2ab91f9bd4a7299543e66d94455 100644 (file)
 #define CONFIG_ENV_IS_IN_FLASH 1
 #endif
 
+#define LDS_BOARD_TEXT \
+       . = DEFINED(env_offset) ? env_offset : .; \
+       common/env_embedded.o      (.text)
+
+
 /*
  * BOOTP options
  */
index 2c056b114b542c0de2b6ecd9468b606333159c8d..159d2f8ced3e2173517476db8eebeb2a758c77cf 100644 (file)
 #define CONFIG_ENV_IS_IN_FLASH 1
 #endif
 
+#define LDS_BOARD_TEXT \
+        . = DEFINED(env_offset) ? env_offset : .; \
+        common/env_embedded.o (.text);
+
 /*
  * BOOTP options
  */
index 7eb31722daf3cbd6a8cd8fd8e20e51cfb5659c6a..14ccddb28d9786f98898395901df222d94a8a707 100644 (file)
 #define CONFIG_ENV_IS_IN_FLASH 1
 #endif
 
+#define LDS_BOARD_TEXT \
+        . = DEFINED(env_offset) ? env_offset : .; \
+        common/env_embedded.o (.text);
+
 /*
  * BOOTP options
  */
index 569ad4201e16daf6c489c12db7f8e011ada5e63e..bc740ae9058b486a27346f9890b4defd11acfe9d 100644 (file)
 #define CONFIG_ENV_SIZE                0x2000
 #define CONFIG_ENV_IS_IN_FLASH 1
 
+#define LDS_BOARD_TEXT \
+       . = DEFINED(env_offset) ? env_offset : .; \
+       common/env_embedded.o (.text*);
+
 /*
  * BOOTP options
  */
index e3fa85655bb5527756cc7808ff538fc08369201f..082970841245b820ebf01e1ad1fab4853a2f01ed 100644 (file)
 #define CONFIG_ENV_SECT_SIZE           0x8000
 #define CONFIG_ENV_IS_IN_FLASH         1
 
+#define LDS_BOARD_TEXT \
+       . = DEFINED(env_offset) ? env_offset : .; \
+       common/env_embedded.o       (.text*)
+
 /*-----------------------------------------------------------------------
  * Cache Configuration
  */
index 795f3592b6dd4dd8f4440d669692844d36db717a..a42b5f6b475c0e706d6d2e4a8b60f3d83b511b22 100644 (file)
 #define CONFIG_ENV_SECT_SIZE   0x2000
 #define CONFIG_ENV_IS_IN_FLASH 1
 
+#define LDS_BOARD_TEXT \
+        . = DEFINED(env_offset) ? env_offset : .; \
+        common/env_embedded.o (.text*);
+
 /*-----------------------------------------------------------------------
  * Cache Configuration
  */
index d75b43cdd3343186fafc025c9de79e038335f1b0..c142dfbe238067544936befc6a66130adf73f4ff 100644 (file)
 #define CONFIG_ENV_SECT_SIZE   0x2000
 #define CONFIG_ENV_IS_IN_FLASH 1
 
+#define LDS_BOARD_TEXT \
+        . = DEFINED(env_offset) ? env_offset : .; \
+        common/env_embedded.o (.text*);
+
 /*-----------------------------------------------------------------------
  * Cache Configuration
  */
index a0d7d52627d0cb92064a5c45b79724a46a22bf52..9f755e50fcdaeeef4858f5ea3ab0d6fbda13d9a1 100644 (file)
@@ -255,7 +255,7 @@ extern unsigned long get_board_sys_clk(unsigned long dummy);
 #define CONFIG_SYS_GBL_DATA_OFFSET     (CONFIG_SYS_INIT_RAM_SIZE - GENERATED_GBL_DATA_SIZE)
 #define CONFIG_SYS_INIT_SP_OFFSET      CONFIG_SYS_GBL_DATA_OFFSET
 
-#define CONFIG_SYS_MONITOR_LEN         (256 * 1024)    /* Reserve 256 kB for Mon */
+#define CONFIG_SYS_MONITOR_LEN         (512 * 1024)    /* Reserve 512 kB for Mon */
 #define CONFIG_SYS_MALLOC_LEN          (1024 * 1024)    /* Reserved for malloc */
 
 /* Serial Port */
@@ -602,7 +602,8 @@ extern unsigned long get_board_sys_clk(unsigned long dummy);
  */
 #ifndef CONFIG_SYS_RAMBOOT
     #define CONFIG_ENV_IS_IN_FLASH     1
-    #define CONFIG_ENV_ADDR            (CONFIG_SYS_MONITOR_BASE + 0x60000)
+    #define CONFIG_ENV_ADDR            \
+                       (CONFIG_SYS_MONITOR_BASE + CONFIG_SYS_MONITOR_LEN)
     #define CONFIG_ENV_SECT_SIZE               0x10000 /* 64K(one sector) for env */
 #else
     #define CONFIG_ENV_IS_NOWHERE      1       /* Store ENV in memory only */
index faaf22c9bf379f577653c1f4296cfd21d60244c2..107efdc1f02168553aff5f88b5f480f6b8c3f682 100644 (file)
 #define CONFIG_MEM_INIT_VALUE          0xdeadbeef
 #endif
 
+#define CONFIG_CMD_MEMTEST
+#define CONFIG_SYS_MEMTEST_START       0x00200000 /* memtest works on */
+#define CONFIG_SYS_MEMTEST_END         0x00400000
+#define CONFIG_SYS_ALT_MEMTEST
+
 #ifndef CONFIG_SYS_NO_FLASH
 #define CONFIG_FLASH_CFI_DRIVER
 #define CONFIG_SYS_FLASH_CFI
@@ -448,6 +453,17 @@ unsigned long get_board_ddr_clk(void);
 #define I2C_MUX_PCA_ADDR_SEC2  0x76 /* I2C bus multiplexer,secondary 2 */
 #define I2C_MUX_CH_DEFAULT     0x8
 
+#define I2C_MUX_CH_VOL_MONITOR 0xa
+
+#define CONFIG_VID_FLS_ENV             "t208xrdb_vdd_mv"
+#ifndef CONFIG_SPL_BUILD
+#define CONFIG_VID
+#endif
+#define CONFIG_VOL_MONITOR_IR36021_SET
+#define CONFIG_VOL_MONITOR_IR36021_READ
+/* The lowest and highest voltage allowed for T208xRDB */
+#define VDD_MV_MIN                     819
+#define VDD_MV_MAX                     1212
 
 /*
  * RapidIO
@@ -646,8 +662,8 @@ unsigned long get_board_ddr_clk(void);
 #ifdef CONFIG_SYS_DPAA_FMAN
 #define CONFIG_FMAN_ENET
 #define CONFIG_PHYLIB_10G
+#define CONFIG_PHY_AQUANTIA
 #define CONFIG_PHY_CORTINA
-#define CONFIG_PHY_AQ1202
 #define CONFIG_PHY_REALTEK
 #define CONFIG_CORTINA_FW_LENGTH       0x40000
 #define RGMII_PHY1_ADDR                0x01  /* RealTek RTL8211E */
index c1ad35a018b7ca52ebe3e9a11edbaaccab1492eb..957a436374fbd3f790f412922003e8c28ad5ad9f 100644 (file)
@@ -638,6 +638,7 @@ unsigned long get_board_ddr_clk(void);
 #define CONFIG_PHYLIB_10G
 #define CONFIG_PHY_VITESSE
 #define CONFIG_PHY_CORTINA
+#define CONFIG_SYS_CORTINA_FW_IN_NOR
 #define CONFIG_CORTINA_FW_ADDR         0xefe00000
 #define CONFIG_CORTINA_FW_LENGTH       0x40000
 #define CONFIG_PHY_TERANETICS
index 229fa5a6c2d5a2f573615e57be31140bc80eb5e0..5a06311d604ff14219c659ff31e17ee8d698b399 100644 (file)
 #define CONFIG_ENV_SIZE                        0x1000
 #define CONFIG_ENV_SECT_SIZE           0x1000
 
+#define LDS_BOARD_TEXT \
+        . = DEFINED(env_offset) ? env_offset : .; \
+        common/env_embedded.o (.text*);
+
 /* memory map space for linux boot data */
 #define CONFIG_SYS_BOOTMAPSZ           (8 << 20)
 
index 3066fd030e4163e8798793a207515e1b2f5fe91b..cc2679077630dc1c7e72822b5ffbad8807a8da0c 100644 (file)
 #define CONFIG_CMD_I2C
 #define CONFIG_SYS_I2C
 #define CONFIG_SYS_I2C_MXC
+#define CONFIG_SYS_I2C_MXC_I2C3                /* enable I2C bus 3 */
 #define CONFIG_SYS_I2C_SPEED           100000
 #define CONFIG_SYS_I2C_SLAVE           0x7f
 #define CONFIG_SYS_I2C_NOPROBES                { {0, 0x00} }
index de837cfe08b9ba7e65783d854497f631d74fb9c8..7b9ff8fb23afbda6a367314e14ffbd7edc88d576 100644 (file)
 #define CONFIG_SYS_FLASH_USE_BUFFER_WRITE      1
 #define CONFIG_SYS_FLASH_CFI_NONBLOCK  1
 
+#define LDS_BOARD_TEXT \
+       . = DEFINED(env_offset) ? env_offset : .; \
+       common/env_embedded.o       (.text*)
+
 #if ENABLE_JFFS
 /* JFFS Partition offset set */
 #define CONFIG_SYS_JFFS2_FIRST_BANK    0
index 4207504464d0679a0425f1a7cddfc675e86c3189..d6e5a2b2435f71c00d09aef61597afb899545e8b 100644 (file)
 #define CONFIG_CMD_I2C
 #define CONFIG_SYS_I2C
 #define CONFIG_SYS_I2C_MXC
+#define CONFIG_SYS_I2C_MXC_I2C3                /* enable I2C bus 3 */
 #define CONFIG_SYS_I2C_SPEED           100000
 #define CONFIG_SYS_MXC_I2C3_SPEED      400000
 
index b9f0b0b123a26666f15fe3149ec7ecc10ab935d4..38fcc40d9fea39540e900f7544a5fe713d3e56b9 100644 (file)
 #define CONFIG_ENV_IS_IN_FLASH 1
 #endif
 
+#define LDS_BOARD_TEXT \
+        . = DEFINED(env_offset) ? env_offset : .; \
+        common/env_embedded.o (.text);
 
 /*
  * BOOTP options
diff --git a/include/configs/colibri_vf.h b/include/configs/colibri_vf.h
new file mode 100644 (file)
index 0000000..414600a
--- /dev/null
@@ -0,0 +1,271 @@
+/*
+ * Copyright 2015 Toradex, Inc.
+ *
+ * Configuration settings for the Toradex VF50/VF61 module.
+ *
+ * Based on vf610twr.h:
+ * Copyright 2013 Freescale Semiconductor, Inc.
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#ifndef __CONFIG_H
+#define __CONFIG_H
+
+#include <asm/arch/imx-regs.h>
+#include <config_cmd_default.h>
+
+#define CONFIG_VF610
+#define CONFIG_SYS_THUMB_BUILD
+#define CONFIG_USE_ARCH_MEMCPY
+#define CONFIG_USE_ARCH_MEMSET
+
+#define CONFIG_SYS_GENERIC_BOARD
+#define CONFIG_ARCH_MISC_INIT
+#define CONFIG_DISPLAY_CPUINFO
+#define CONFIG_DISPLAY_BOARDINFO
+
+#define CONFIG_SKIP_LOWLEVEL_INIT
+
+#define CONFIG_CMD_FUSE
+#ifdef CONFIG_CMD_FUSE
+#define CONFIG_MXC_OCOTP
+#endif
+
+/* Size of malloc() pool */
+#define CONFIG_SYS_MALLOC_LEN          (CONFIG_ENV_SIZE + 2 * 1024 * 1024)
+
+#define CONFIG_BOARD_EARLY_INIT_F
+
+#define CONFIG_FSL_LPUART
+#define LPUART_BASE                    UART0_BASE
+
+/* Allow to overwrite serial and ethaddr */
+#define CONFIG_ENV_OVERWRITE
+#define CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG
+#define CONFIG_VERSION_VARIABLE
+#define CONFIG_SYS_UART_PORT           (0)
+#define CONFIG_BAUDRATE                        115200
+#define CONFIG_CMD_ASKENV
+
+/* NAND support */
+#define CONFIG_CMD_NAND
+#define CONFIG_NAND_VF610_NFC
+#define CONFIG_SYS_NAND_SELF_INIT
+#define CONFIG_SYS_MAX_NAND_DEVICE     1
+#define CONFIG_SYS_NAND_BASE           NFC_BASE_ADDR
+
+/* Dynamic MTD partition support */
+#define CONFIG_CMD_MTDPARTS    /* Enable 'mtdparts' command line support */
+#define CONFIG_MTD_PARTITIONS
+#define CONFIG_MTD_DEVICE      /* needed for mtdparts commands */
+#define MTDIDS_DEFAULT         "nand0=vf610_nfc"
+#define MTDPARTS_DEFAULT       "mtdparts=vf610_nfc:"           \
+                               "128k(vf-bcb)ro,"               \
+                               "1408k(u-boot)ro,"              \
+                               "512k(u-boot-env),"             \
+                               "-(ubi)"
+
+#undef CONFIG_CMD_IMLS
+
+#define CONFIG_MMC
+#define CONFIG_FSL_ESDHC
+#define CONFIG_SYS_FSL_ESDHC_ADDR      0
+#define CONFIG_SYS_FSL_ESDHC_NUM       1
+
+#define CONFIG_SYS_FSL_ERRATUM_ESDHC111
+
+#define CONFIG_CMD_MMC
+#define CONFIG_GENERIC_MMC
+#define CONFIG_CMD_FAT
+#define CONFIG_CMD_EXT3
+#define CONFIG_CMD_EXT4
+#define CONFIG_DOS_PARTITION
+
+#define CONFIG_RBTREE
+#define CONFIG_LZO
+#define CONFIG_CMD_FS_GENERIC
+#define CONFIG_CMD_BOOTZ
+#define CONFIG_CMD_UBI
+#define CONFIG_MTD_UBI_FASTMAP
+#define CONFIG_CMD_UBIFS       /* increases size by almost 60 KB */
+
+#define CONFIG_CMD_PING
+#define CONFIG_CMD_DHCP
+#define CONFIG_CMD_MII
+#define CONFIG_CMD_NET
+#define CONFIG_FEC_MXC
+#define CONFIG_MII
+#define IMX_FEC_BASE                   ENET1_BASE_ADDR
+#define CONFIG_FEC_XCV_TYPE            RMII
+#define CONFIG_FEC_MXC_PHYADDR          0
+#define CONFIG_PHYLIB
+#define CONFIG_PHY_MICREL
+
+#define CONFIG_IPADDR          192.168.10.2
+#define CONFIG_NETMASK         255.255.255.0
+#define CONFIG_SERVERIP                192.168.10.1
+
+#define CONFIG_BOOTDELAY               1
+#define CONFIG_BOARD_LATE_INIT
+
+#define CONFIG_LOADADDR                        0x80008000
+#define CONFIG_FDTADDR                 0x84000000
+
+/* We boot from the gfxRAM area of the OCRAM. */
+#define CONFIG_SYS_TEXT_BASE           0x3f408000
+#define CONFIG_BOARD_SIZE_LIMIT                524288
+
+#define SD_BOOTCMD \
+       "sdargs=root=/dev/mmcblk0p2 rw rootwait\0"      \
+       "sdboot=run setup; setenv bootargs ${defargs} ${sdargs} ${mtdparts} " \
+       "${setupargs} ${vidargs}; echo Booting from MMC/SD card...; " \
+       "load mmc 0:2 ${kernel_addr_r} /boot/${kernel_file} && " \
+       "load mmc 0:2 ${fdt_addr_r} /boot/${soc}-colibri-${fdt_board}.dtb && " \
+       "bootz ${kernel_addr_r} - ${fdt_addr_r}\0" \
+
+#define NFS_BOOTCMD \
+       "nfsargs=ip=:::::eth0: root=/dev/nfs\0" \
+       "nfsboot=run setup; " \
+       "setenv bootargs ${defargs} ${nfsargs} ${mtdparts} " \
+       "${setupargs} ${vidargs}; echo Booting from NFS...;" \
+       "dhcp ${kernel_addr_r} && "     \
+       "tftp ${fdt_addr_r} ${soc}-colibri-${fdt_board}.dtb && " \
+       "bootz ${kernel_addr_r} - ${fdt_addr_r}\0" \
+
+#define UBI_BOOTCMD    \
+       "ubiargs=ubi.mtd=ubi root=ubi0:rootfs rootfstype=ubifs " \
+       "ubi.fm_autoconvert=1\0" \
+       "ubiboot=run setup; " \
+       "setenv bootargs ${defargs} ${ubiargs} ${mtdparts} "   \
+       "${setupargs} ${vidargs}; echo Booting from NAND...; " \
+       "ubi part ubi && ubifsmount ubi0:rootfs && " \
+       "ubifsload ${kernel_addr_r} /boot/${kernel_file} && " \
+       "ubifsload ${fdt_addr_r} /boot/${soc}-colibri-${fdt_board}.dtb && " \
+       "bootz ${kernel_addr_r} - ${fdt_addr_r}\0" \
+
+#define CONFIG_BOOTCOMMAND "run ubiboot; run sdboot; run nfsboot"
+
+#define DFU_ALT_NAND_INFO "vf-bcb part 0,1;u-boot part 0,2;ubi part 0,4"
+
+#define CONFIG_EXTRA_ENV_SETTINGS \
+       "kernel_addr_r=0x82000000\0" \
+       "fdt_addr_r=0x84000000\0" \
+       "kernel_file=zImage\0" \
+       "fdt_file=${soc}-colibri-${fdt_board}.dtb\0" \
+       "fdt_board=eval-v3\0" \
+       "defargs=\0" \
+       "console=ttyLP0\0" \
+       "setup=setenv setupargs " \
+       "console=tty1 console=${console}" \
+       ",${baudrate}n8 ${memargs}\0" \
+       "setsdupdate=mmc rescan && set interface mmc && " \
+       "fatload ${interface} 0:1 ${loadaddr} flash_blk.img && " \
+       "source ${loadaddr}\0" \
+       "setusbupdate=usb start && set interface usb && " \
+       "fatload ${interface} 0:1 ${loadaddr} flash_blk.img && " \
+       "source ${loadaddr}\0" \
+       "setupdate=run setsdupdate || run setusbupdate\0" \
+       "mtdparts=" MTDPARTS_DEFAULT "\0" \
+       "dfu_alt_info=" DFU_ALT_NAND_INFO "\0" \
+       SD_BOOTCMD \
+       NFS_BOOTCMD \
+       UBI_BOOTCMD
+
+/* Miscellaneous configurable options */
+#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              "Colibri VFxx # "
+#undef CONFIG_AUTO_COMPLETE
+#define CONFIG_SYS_CBSIZE              256     /* Console I/O Buffer Size */
+#define CONFIG_SYS_PBSIZE              \
+                       (CONFIG_SYS_CBSIZE + sizeof(CONFIG_SYS_PROMPT) + 16)
+#define CONFIG_SYS_MAXARGS             16      /* max number of command args */
+#define CONFIG_SYS_BARGSIZE            CONFIG_SYS_CBSIZE
+
+#define CONFIG_CMD_MEMTEST
+#define CONFIG_SYS_MEMTEST_START       0x80010000
+#define CONFIG_SYS_MEMTEST_END         0x87C00000
+
+#define CONFIG_SYS_LOAD_ADDR           CONFIG_LOADADDR
+#define CONFIG_SYS_HZ                  1000
+#define CONFIG_CMDLINE_EDITING
+
+/*
+ * Stack sizes
+ * The stack sizes are set up in start.S using the settings below
+ */
+#define CONFIG_STACKSIZE               (128 * 1024)    /* regular stack */
+
+/* Physical memory map */
+#define CONFIG_NR_DRAM_BANKS           1
+#define PHYS_SDRAM                     (0x80000000)
+#define PHYS_SDRAM_SIZE                        (256 * 1024 * 1024)
+
+#define CONFIG_SYS_SDRAM_BASE          PHYS_SDRAM
+#define CONFIG_SYS_INIT_RAM_ADDR       IRAM_BASE_ADDR
+#define CONFIG_SYS_INIT_RAM_SIZE       IRAM_SIZE
+
+#define CONFIG_SYS_INIT_SP_OFFSET \
+       (CONFIG_SYS_INIT_RAM_SIZE - GENERATED_GBL_DATA_SIZE)
+#define CONFIG_SYS_INIT_SP_ADDR \
+       (CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_INIT_SP_OFFSET)
+
+/* Environment organization */
+#define CONFIG_SYS_NO_FLASH
+
+#ifdef CONFIG_ENV_IS_IN_MMC
+#define CONFIG_SYS_MMC_ENV_DEV         0
+#define CONFIG_ENV_OFFSET              (12 * 64 * 1024)
+#define CONFIG_ENV_SIZE                        (8 * 1024)
+#endif
+
+#ifdef CONFIG_ENV_IS_IN_NAND
+#define CONFIG_ENV_SIZE                        (64 * 2048)
+#define CONFIG_ENV_RANGE               (4 * 64 * 2048)
+#define CONFIG_ENV_OFFSET              (12 * 64 * 2048)
+#endif
+
+#define CONFIG_OF_LIBFDT
+#define CONFIG_CMD_BOOTZ
+
+#define CONFIG_SYS_NO_FLASH
+
+#define CONFIG_SYS_CACHELINE_SIZE 32
+
+/* USB Host Support */
+#define CONFIG_CMD_USB
+#define CONFIG_USB_EHCI
+#define CONFIG_USB_EHCI_VF
+#define CONFIG_USB_MAX_CONTROLLER_COUNT 2
+#define CONFIG_EHCI_HCD_INIT_AFTER_RESET
+
+/* USB Client Support */
+#define CONFIG_USB_GADGET
+#define CONFIG_CI_UDC
+#define CONFIG_USB_GADGET_DUALSPEED
+#define CONFIG_USB_GADGET_VBUS_DRAW      2
+#define CONFIG_TRDX_VID                  0x1B67
+#define CONFIG_TRDX_PID_COLIBRI_VF50     0x0016
+#define CONFIG_TRDX_PID_COLIBRI_VF61     0x0017
+#define CONFIG_TRDX_PID_COLIBRI_VF61IT   0x0018
+#define CONFIG_TRDX_PID_COLIBRI_VF50IT   0x0019
+#define CONFIG_G_DNL_MANUFACTURER        "Toradex"
+#define CONFIG_G_DNL_VENDOR_NUM          CONFIG_TRDX_VID
+#define CONFIG_G_DNL_PRODUCT_NUM         CONFIG_TRDX_PID_COLIBRI_VF50
+
+/* USB DFU */
+#define CONFIG_USBDOWNLOAD_GADGET
+#define CONFIG_CMD_DFU
+#define CONFIG_DFU_FUNCTION
+#define CONFIG_DFU_NAND
+#define CONFIG_DFU_MMC
+#define CONFIG_SYS_DFU_DATA_BUF_SIZE (1024 * 1024)
+
+/* USB Storage */
+#define CONFIG_USB_STORAGE
+#define CONFIG_USB_GADGET_MASS_STORAGE
+#define CONFIG_CMD_USB_MASS_STORAGE
+
+#endif /* __CONFIG_H */
index e78cc69af60dcccad74df425e072251b0a4c7ee3..d79612b8bf18210b7af53f6096e7eef3bf641809 100644 (file)
        DFU_ALT_INFO_EMMC \
        DFU_ALT_INFO_RAM
 
+/* Fastboot */
+#define CONFIG_CMD_FASTBOOT
+#define CONFIG_ANDROID_BOOT_IMAGE
+#define CONFIG_USB_FASTBOOT_BUF_ADDR    CONFIG_SYS_LOAD_ADDR
+#define CONFIG_USB_FASTBOOT_BUF_SIZE    0x2F000000
+#define CONFIG_FASTBOOT_FLASH
+#define CONFIG_FASTBOOT_FLASH_MMC_DEV   1
+
 #include <configs/ti_omap5_common.h>
 
 /* Enhance our eMMC support / experience. */
 #define CONFIG_USBDOWNLOAD_GADGET
 #define CONFIG_USB_GADGET_VBUS_DRAW 2
 #define CONFIG_G_DNL_MANUFACTURER "Texas Instruments"
-#define CONFIG_G_DNL_VENDOR_NUM 0x0403
-#define CONFIG_G_DNL_PRODUCT_NUM 0xBD00
+#define CONFIG_G_DNL_VENDOR_NUM 0x0451
+#define CONFIG_G_DNL_PRODUCT_NUM 0xd022
 #define CONFIG_USB_GADGET_DUALSPEED
 
 /* USB Device Firmware Update support */
index b4b3ae842f75b6aa71b8e15781db7ebf5a8afc2c..e9f5bed9ffc27637ecd4b42454076e6a61330d31 100644 (file)
@@ -55,6 +55,7 @@
 #define CONFIG_CMD_I2C
 #define CONFIG_SYS_I2C
 #define CONFIG_SYS_I2C_MXC
+#define CONFIG_SYS_I2C_MXC_I2C3                /* enable I2C bus 3 */
 #define CONFIG_SYS_I2C_SPEED           100000
 
 /* USB Configs */
index 854ae90bd4a6edcb70e033d8f0544a5ae93379a9..5f7cad83463d870d2132aa919fd5c1b5d423bae8 100644 (file)
@@ -52,6 +52,7 @@
  */
 #define CONFIG_SYS_I2C
 #define CONFIG_SYS_I2C_MXC
+#define CONFIG_SYS_I2C_MXC_I2C3                /* enable I2C bus 3 */
 #define CONFIG_SYS_SPD_BUS_NUM         2 /* I2C3 */
 #define CONFIG_SYS_MXC_I2C3_SLAVE      0xfe
 #define CONFIG_MXC_SPI
index 620f9501d255741c921d699713fd779a3e9b4774..fcfc1b36039fd223cacec537cb7c9cf45076622f 100644 (file)
 #define CONFIG_CMD_I2C
 #define CONFIG_SYS_I2C
 #define CONFIG_SYS_I2C_MXC
+#define CONFIG_SYS_I2C_MXC_I2C3                /* enable I2C bus 3 */
 #define CONFIG_SYS_I2C_SPEED           100000
 #define CONFIG_I2C_GSC                 0
 #define CONFIG_I2C_PMIC                        1
+#define CONFIG_I2C_EDID
 
 /* MMC Configs */
 #define CONFIG_FSL_ESDHC
 
 /* Filesystem support */
 #define CONFIG_CMD_EXT2
+#define CONFIG_CMD_EXT4
+#define CONFIG_CMD_EXT4_WRITE
 #define CONFIG_CMD_FAT
 #define CONFIG_CMD_UBIFS
 #define CONFIG_DOS_PARTITION
 
-/* Network config - Allow larger/faster download for TFTP/NFS */
-#define CONFIG_IP_DEFRAG
-#define CONFIG_TFTP_BLOCKSIZE 4096
-#define CONFIG_NFS_READ_SIZE  4096
-
 /*
  * SATA Configs
  */
 
 /* Ethernet support */
 #define CONFIG_FEC_MXC
+#define CONFIG_E1000
 #define CONFIG_MII
 #define IMX_FEC_BASE             ENET_BASE_ADDR
 #define CONFIG_FEC_XCV_TYPE      RGMII
-#define CONFIG_ETHPRIME          "FEC"
 #define CONFIG_FEC_MXC_PHYADDR   0
 #define CONFIG_PHYLIB
 #define CONFIG_ARP_TIMEOUT       200UL
 #define CONFIG_NETCONSOLE
 #define CONFIG_SYS_USB_EVENT_POLL_VIA_CONTROL_EP
 
+/* USB Mass Storage Gadget */
+#define CONFIG_USB_GADGET
+#define CONFIG_CMD_USB_MASS_STORAGE
+#define CONFIG_USB_GADGET_MASS_STORAGE
+#define CONFIG_USBDOWNLOAD_GADGET
+#define CONFIG_USB_GADGET_VBUS_DRAW    2
+
+/* Netchip IDs */
+#define CONFIG_G_DNL_VENDOR_NUM 0x0525
+#define CONFIG_G_DNL_PRODUCT_NUM 0xa4a5
+#define CONFIG_G_DNL_MANUFACTURER "Gateworks"
+
 /* Framebuffer and LCD */
 #define CONFIG_VIDEO
 #define CONFIG_VIDEO_IPUV3
        "dio0:mode=gpio;dio1:mode=gpio;dio2:mode=gpio;dio3:mode=gpio\0" \
 
 #define CONFIG_EXTRA_ENV_SETTINGS_COMMON \
+       "usb_pgood_delay=2000\0" \
        "console=ttymxc1\0" \
        "bootdevs=usb mmc sata flash\0" \
        HWCONFIG_DEFAULT \
        \
        "fdt_high=0xffffffff\0" \
        "fdt_addr=0x18000000\0" \
+       "initrd_high=0xffffffff\0" \
+       "bootdir=boot\0" \
        "loadfdt=" \
-               "if ${fsload} ${fdt_addr} boot/${fdt_file}; then " \
-                       "echo Loaded DTB from boot/${fdt_file}; " \
-               "elif ${fsload} ${fdt_addr} boot/${fdt_file1}; then " \
-                       "echo Loaded DTB from boot/${fdt_file1}; " \
-               "elif ${fsload} ${fdt_addr} boot/${fdt_file2}; then " \
-                               "echo Loaded DTB from boot/${fdt_file2}; " \
+               "if ${fsload} ${fdt_addr} ${bootdir}/${fdt_file}; then " \
+                       "echo Loaded DTB from ${bootdir}/${fdt_file}; " \
+               "elif ${fsload} ${fdt_addr} ${bootdir}/${fdt_file1}; then " \
+                       "echo Loaded DTB from ${bootdir}/${fdt_file1}; " \
+               "elif ${fsload} ${fdt_addr} ${bootdir}/${fdt_file2}; then " \
+                       "echo Loaded DTB from ${bootdir}/${fdt_file2}; " \
                "fi\0" \
        \
-       "script=boot/6x_bootscript-ventana\0" \
+       "script=6x_bootscript-ventana\0" \
        "loadscript=" \
-               "if ${fsload} ${loadaddr} ${script}; then " \
+               "if ${fsload} ${loadaddr} ${bootdir}/${script}; then " \
                        "source; " \
                "fi\0" \
        \
-       "uimage=boot/uImage\0" \
+       "uimage=uImage\0" \
        "mmc_root=/dev/mmcblk0p1 rootfstype=ext4 rootwait rw\0" \
        "mmc_boot=" \
                "setenv fsload 'ext2load mmc 0:1'; " \
                "mmc dev 0 && mmc rescan && " \
                "run loadscript; " \
-               "if ${fsload} ${loadaddr} ${uimage}; then " \
+               "if ${fsload} ${loadaddr} ${bootdir}/${uimage}; then " \
                        "setenv bootargs console=${console},${baudrate} " \
                                "root=/dev/mmcblk0p1 rootfstype=ext4 " \
                                "rootwait rw ${video} ${extra}; " \
        "sata_boot=" \
                "setenv fsload 'ext2load sata 0:1'; sata init && " \
                "run loadscript; " \
-               "if ${fsload} ${loadaddr} ${uimage}; then " \
+               "if ${fsload} ${loadaddr} ${bootdir}/${uimage}; then " \
                        "setenv bootargs console=${console},${baudrate} " \
                                "root=/dev/sda1 rootfstype=ext4 " \
                                "rootwait rw ${video} ${extra}; " \
        "usb_boot=" \
                "setenv fsload 'ext2load usb 0:1'; usb start && usb dev 0 && " \
                "run loadscript; " \
-               "if ${fsload} ${loadaddr} ${uimage}; then " \
+               "if ${fsload} ${loadaddr} ${bootdir}/${uimage}; then " \
                        "setenv bootargs console=${console},${baudrate} " \
                                "root=/dev/sda1 rootfstype=ext4 " \
                                "rootwait rw ${video} ${extra}; " \
 #else
        #define CONFIG_EXTRA_ENV_SETTINGS \
        CONFIG_EXTRA_ENV_SETTINGS_COMMON \
-       "image_rootfs=openwrt-imx6-ventana-rootfs.ubi\0" \
        \
+       "image_rootfs=openwrt-imx6-ventana-rootfs.ubi\0" \
        "nand_update=echo Updating NAND from ${serverip}:${image_rootfs}...; " \
                "tftp ${loadaddr} ${image_rootfs} && " \
                "nand erase.part rootfs && " \
        \
        "flash_boot=" \
                "setenv fsload 'ubifsload'; " \
-               "ubi part rootfs && ubifsmount ubi0:rootfs; " \
+               "ubi part rootfs; " \
+               "if ubi check boot; then " \
+                       "ubifsmount ubi0:boot; " \
+                       "setenv root ubi0:rootfs ubi.mtd=2 " \
+                               "rootfstype=squashfs,ubifs; " \
+                       "setenv bootdir; " \
+               "elif ubi check rootfs; then " \
+                       "ubifsmount ubi0:rootfs; " \
+                       "setenv root ubi0:rootfs ubi.mtd=2 " \
+                               "rootfstype=ubifs; " \
+               "fi; " \
                "run loadscript; " \
-               "if ${fsload} ${loadaddr} ${uimage}; then " \
+               "if ${fsload} ${loadaddr} ${bootdir}/${uimage}; then " \
                        "setenv bootargs console=${console},${baudrate} " \
-                               "root=ubi0:rootfs ubi.mtd=2 " \
-                               "rootfstype=ubifs ${video} ${extra}; " \
+                               "root=${root} ${video} ${extra}; " \
                        "if run loadfdt && fdt addr ${fdt_addr}; then " \
                                "ubifsumount; " \
                                "bootm ${loadaddr} - ${fdt_addr}; " \
index 49039d6dfb8d6827382bb0201a57d7cc5b23a437..db197f340ce788914249ada312a61c47564b8492 100644 (file)
@@ -38,6 +38,7 @@
 
 #define CONFIG_SYS_I2C
 #define CONFIG_SYS_I2C_MXC
+#define CONFIG_SYS_I2C_MXC_I2C3                /* enable I2C bus 3 */
 #define CONFIG_SYS_I2C_CLK_OFFSET      I2C2_CLK_OFFSET
 
 #define CONFIG_MXC_UART
index 4362925ae1e11924563b620973e32f414eec275b..12c7382c17f57ab08c9da29a362fc8e39c9c4aed 100644 (file)
@@ -7,8 +7,6 @@
  * SPDX-License-Identifier:    GPL-2.0+
  */
 
-#define CONFIG_INTEGRATOR
-
 #define CONFIG_SYS_TEXT_BASE           0x01000000
 #define CONFIG_SYS_MEMTEST_START       0x100000
 #define CONFIG_SYS_MEMTEST_END         0x10000000
index e168c8c9ba57e35fd333f8d0ffb720cc5e12b1d6..8439db78187b77f35ede8816b58dee8641ed50ca 100644 (file)
@@ -18,7 +18,6 @@
 #include "integrator-common.h"
 
 /* Integrator/AP-specific configuration */
-#define CONFIG_ARCH_INTEGRATOR
 #define CONFIG_SYS_HZ_CLOCK            24000000        /* Timer 1 is clocked at 24Mhz */
 
 /*
index 7c1ef2483ea24da88bf9450314102efe80f894fb..7518b60fb2b1e75d653c62747b18994153d096aa 100644 (file)
@@ -18,7 +18,6 @@
 #include "integrator-common.h"
 
 /* Integrator CP-specific configuration */
-#define CONFIG_ARCH_CINTEGRATOR
 #define CONFIG_SYS_HZ_CLOCK            1000000 /* Timer 1 is clocked at 1Mhz */
 
 /*
index 5de416d117bfc9adbd21c608d927ae39d86ce8b6..9a8fd5007ee4fe40cb6fcadb95f5b5f4f68d22ec 100644 (file)
@@ -389,6 +389,7 @@ unsigned long get_board_ddr_clk(void);
 #define CONFIG_CMD_I2C
 #define CONFIG_SYS_I2C
 #define CONFIG_SYS_I2C_MXC
+#define CONFIG_SYS_I2C_MXC_I2C3                /* enable I2C bus 3 */
 
 /*
  * I2C bus multiplexer
@@ -655,6 +656,7 @@ unsigned long get_board_ddr_clk(void);
 
 #ifdef CONFIG_SECURE_BOOT
 #define CONFIG_CMD_BLOB
+#include <asm/fsl_secure_boot.h>
 #endif
 
 #endif
index a13876b5501fd2dd081deb441de875cda9b241a6..729205f7129573198f8ff259d36b40f83866465b 100644 (file)
 #define CONFIG_CMD_I2C
 #define CONFIG_SYS_I2C
 #define CONFIG_SYS_I2C_MXC
+#define CONFIG_SYS_I2C_MXC_I2C3                /* enable I2C bus 3 */
 
 /* EEPROM */
 #ifndef CONFIG_SD_BOOT
index e0435cc0a7a7429c88a394031c81de36868f3b13..e270fc8c195ab1f12890629f7081c3a4c34fdb4f 100644 (file)
 #define CONFIG_ARM_ERRATA_828024
 #define CONFIG_ARM_ERRATA_826974
 
+#include <asm/arch-fsl-lsch3/config.h>
+#if (defined(CONFIG_SYS_FSL_SRDS_1) || defined(CONFIG_SYS_FSL_SRDS_2))
+#define        CONFIG_SYS_HAS_SERDES
+#endif
+
+/* We need architecture specific misc initializations */
+#define CONFIG_ARCH_MISC_INIT
+
 /* Link Definitions */
-#define CONFIG_SYS_TEXT_BASE           0x30001000
+#ifdef CONFIG_SPL
+#define CONFIG_SYS_TEXT_BASE           0x80400000
+#else
+#define CONFIG_SYS_TEXT_BASE           0x30100000
+#endif
 
 #ifdef CONFIG_EMU
 #define CONFIG_SYS_NO_FLASH
 #define CONFIG_FIT
 #define CONFIG_FIT_VERBOSE     /* enable fit_format_{error,warning}() */
 
+#ifndef CONFIG_SPL
 #define CONFIG_FSL_DDR_INTERACTIVE     /* Interactive debugging */
+#endif
 #ifndef CONFIG_SYS_FSL_DDR4
 #define CONFIG_SYS_FSL_DDR3            /* Use DDR3 memory */
 #define CONFIG_SYS_DDR_RAW_TIMING
 #endif
-#define CONFIG_DIMM_SLOTS_PER_CTLR     1
-#define CONFIG_CHIP_SELECTS_PER_CTRL   4
 
 #define CONFIG_SYS_FSL_DDR_INTLV_256B  /* force 256 byte interleaving */
 
 #define CONFIG_SYS_DP_DDR_BASE_PHY     0
 #define CONFIG_DP_DDR_CTRL             2
 #define CONFIG_DP_DDR_NUM_CTRLS                1
-#define CONFIG_DP_DDR_DIMM_SLOTS_PER_CTLR      1
 
 /* Generic Timer Definitions */
-#define COUNTER_FREQUENCY              12000000        /* 12MHz */
+/*
+ * This is not an accurate number. It is used in start.S. The frequency
+ * will be udpated later when get_bus_freq(0) is available.
+ */
+#define COUNTER_FREQUENCY              25000000        /* 25MHz */
 
 /* Size of malloc() pool */
-#define CONFIG_SYS_MALLOC_LEN          (CONFIG_ENV_SIZE + 128 * 1024)
+#define CONFIG_SYS_MALLOC_LEN          (CONFIG_ENV_SIZE + 2048 * 1024)
 
 /* I2C */
 #define CONFIG_CMD_I2C
 #define CONFIG_SYS_I2C
 #define CONFIG_SYS_I2C_MXC
-#define CONFIG_SYS_MXC_I2C1_SPEED      40000000
-#define CONFIG_SYS_MXC_I2C2_SPEED      40000000
+#define CONFIG_SYS_I2C_MXC_I2C3                /* enable I2C bus 3 */
+#define CONFIG_SYS_I2C_MXC_I2C4                /* enable I2C bus 4 */
 
 /* Serial Port */
-#define CONFIG_CONS_INDEX       2
+#define CONFIG_CONS_INDEX       1
 #define CONFIG_SYS_NS16550
 #define CONFIG_SYS_NS16550_SERIAL
 #define CONFIG_SYS_NS16550_REG_SIZE     1
 
 /* IFC */
 #define CONFIG_FSL_IFC
-#define CONFIG_SYS_NOR0_CSPR_EXT       (0x0)
-#define CONFIG_SYS_NOR_AMASK   IFC_AMASK(128*1024*1024)
+
 /*
- * During booting, CS0 needs to be at the region of 0x30000000, i.e. the IFC
- * address 0. But this region is limited to 256MB. To accommodate bigger NOR
- * flash and other devices, we will map CS0 to 0x580000000 after relocation.
+ * During booting, IFC is mapped at the region of 0x30000000.
+ * But this region is limited to 256MB. To accommodate NOR, promjet
+ * and FPGA. This region is divided as below:
+ * 0x30000000 - 0x37ffffff : 128MB : NOR flash
+ * 0x38000000 - 0x3BFFFFFF : 64MB  : Promjet
+ * 0x3C000000 - 0x40000000 : 64MB  : FPGA etc
+ *
+ * To accommodate bigger NOR flash and other devices, we will map IFC
+ * chip selects to as below:
+ * 0x5_1000_0000..0x5_1fff_ffff        Memory Hole
+ * 0x5_2000_0000..0x5_3fff_ffff        IFC CSx (FPGA, NAND and others 512MB)
+ * 0x5_4000_0000..0x5_7fff_ffff        ASIC or others 1GB
+ * 0x5_8000_0000..0x5_bfff_ffff        IFC CS0 1GB (NOR/Promjet)
+ * 0x5_C000_0000..0x5_ffff_ffff        IFC CS1 1GB (NOR/Promjet)
+ *
+ * For e.g. NOR flash at CS0 will be mapped to 0x580000000 after relocation.
  * CONFIG_SYS_FLASH_BASE has the final address (core view)
  * CONFIG_SYS_FLASH_BASE_PHYS has the final address (IFC view)
  * CONFIG_SYS_FLASH_BASE_PHYS_EARLY has the temporary IFC address
  * CONFIG_SYS_TEXT_BASE is linked to 0x30000000 for booting
  */
+
 #define CONFIG_SYS_FLASH_BASE                  0x580000000ULL
 #define CONFIG_SYS_FLASH_BASE_PHYS             0x80000000
 #define CONFIG_SYS_FLASH_BASE_PHYS_EARLY       0x00000000
 
-/*
- * NOR Flash Timing Params
- */
-#define CONFIG_SYS_NOR0_CSPR                                   \
-       (CSPR_PHYS_ADDR(CONFIG_SYS_FLASH_BASE_PHYS)             | \
-       CSPR_PORT_SIZE_16                                       | \
-       CSPR_MSEL_NOR                                           | \
-       CSPR_V)
-#define CONFIG_SYS_NOR0_CSPR_EARLY                             \
-       (CSPR_PHYS_ADDR(CONFIG_SYS_FLASH_BASE_PHYS_EARLY)       | \
-       CSPR_PORT_SIZE_16                                       | \
-       CSPR_MSEL_NOR                                           | \
-       CSPR_V)
-#define CONFIG_SYS_NOR_CSOR    CSOR_NOR_ADM_SHIFT(12)
-#define CONFIG_SYS_NOR_FTIM0   (FTIM0_NOR_TACSE(0x1) | \
-                               FTIM0_NOR_TEADC(0x1) | \
-                               FTIM0_NOR_TEAHC(0x1))
-#define CONFIG_SYS_NOR_FTIM1   (FTIM1_NOR_TACO(0x1) | \
-                               FTIM1_NOR_TRAD_NOR(0x1))
-#define CONFIG_SYS_NOR_FTIM2   (FTIM2_NOR_TCS(0x0) | \
-                               FTIM2_NOR_TCH(0x0) | \
-                               FTIM2_NOR_TWP(0x1))
-#define CONFIG_SYS_NOR_FTIM3   0x04000000
-#define CONFIG_SYS_IFC_CCR     0x01000000
+#define CONFIG_SYS_FLASH1_BASE_PHYS            0xC0000000
+#define CONFIG_SYS_FLASH1_BASE_PHYS_EARLY      0x8000000
 
 #ifndef CONFIG_SYS_NO_FLASH
 #define CONFIG_FLASH_CFI_DRIVER
 #define CONFIG_SYS_FLASH_CFI
 #define CONFIG_SYS_FLASH_USE_BUFFER_WRITE
 #define CONFIG_SYS_FLASH_QUIET_TEST
-#define CONFIG_FLASH_SHOW_PROGRESS     45 /* count down from 45/5: 9..1 */
-
-#define CONFIG_SYS_MAX_FLASH_BANKS     1       /* number of banks */
-#define CONFIG_SYS_MAX_FLASH_SECT      1024    /* sectors per device */
-#define CONFIG_SYS_FLASH_ERASE_TOUT    60000   /* Flash Erase Timeout (ms) */
-#define CONFIG_SYS_FLASH_WRITE_TOUT    500     /* Flash Write Timeout (ms) */
+#endif
 
-#define CONFIG_SYS_FLASH_EMPTY_INFO
-#define CONFIG_SYS_FLASH_BANKS_LIST    { CONFIG_SYS_FLASH_BASE }
+#ifndef __ASSEMBLY__
+unsigned long long get_qixis_addr(void);
 #endif
+#define QIXIS_BASE                             get_qixis_addr()
+#define QIXIS_BASE_PHYS                                0x20000000
+#define QIXIS_BASE_PHYS_EARLY                  0xC000000
+#define QIXIS_STAT_PRES1                       0xb
+#define QIXIS_SDID_MASK                                0x07
+#define QIXIS_ESDHC_NO_ADAPTER                 0x7
+
+#define CONFIG_SYS_NAND_BASE                   0x530000000ULL
+#define CONFIG_SYS_NAND_BASE_PHYS              0x30000000
 
-#define CONFIG_NAND_FSL_IFC
-#define CONFIG_SYS_NAND_MAX_ECCPOS     256
-#define CONFIG_SYS_NAND_MAX_OOBFREE    2
-#define CONFIG_SYS_NAND_BASE           0x520000000
-#define CONFIG_SYS_NAND_BASE_PHYS      0x20000000
-
-#define CONFIG_SYS_NAND_CSPR_EXT       (0x0)
-#define CONFIG_SYS_NAND_CSPR   (CSPR_PHYS_ADDR(CONFIG_SYS_NAND_BASE_PHYS) \
-                               | CSPR_PORT_SIZE_8 /* Port Size = 8 bit */ \
-                               | CSPR_MSEL_NAND        /* MSEL = NAND */ \
-                               | CSPR_V)
-#define CONFIG_SYS_NAND_AMASK  IFC_AMASK(64 * 1024)
-
-#define CONFIG_SYS_NAND_CSOR    (CSOR_NAND_ECC_ENC_EN   /* ECC on encode */ \
-                               | CSOR_NAND_ECC_DEC_EN  /* ECC on decode */ \
-                               | CSOR_NAND_ECC_MODE_4  /* 4-bit ECC */ \
-                               | CSOR_NAND_RAL_3       /* RAL = 2Byes */ \
-                               | CSOR_NAND_PGS_2K      /* Page Size = 2K */ \
-                               | CSOR_NAND_SPRZ_64/* Spare size = 64 */ \
-                               | CSOR_NAND_PB(64))     /*Pages Per Block = 64*/
-
-#define CONFIG_SYS_NAND_ONFI_DETECTION
-
-/* ONFI NAND Flash mode0 Timing Params */
-#define CONFIG_SYS_NAND_FTIM0          (FTIM0_NAND_TCCST(0x07) | \
-                                       FTIM0_NAND_TWP(0x18)   | \
-                                       FTIM0_NAND_TWCHT(0x07) | \
-                                       FTIM0_NAND_TWH(0x0a))
-#define CONFIG_SYS_NAND_FTIM1          (FTIM1_NAND_TADLE(0x32) | \
-                                       FTIM1_NAND_TWBE(0x39)  | \
-                                       FTIM1_NAND_TRR(0x0e)   | \
-                                       FTIM1_NAND_TRP(0x18))
-#define CONFIG_SYS_NAND_FTIM2          (FTIM2_NAND_TRAD(0x0f) | \
-                                       FTIM2_NAND_TREH(0x0a) | \
-                                       FTIM2_NAND_TWHRE(0x1e))
-#define CONFIG_SYS_NAND_FTIM3          0x0
-
-#define CONFIG_SYS_NAND_BASE_LIST      { CONFIG_SYS_NAND_BASE }
-#define CONFIG_SYS_MAX_NAND_DEVICE     1
-#define CONFIG_CMD_NAND
-
-#define CONFIG_SYS_NAND_BLOCK_SIZE     (128 * 1024)
-
-#define CONFIG_SYS_CSPR0_EXT           CONFIG_SYS_NOR0_CSPR_EXT
-#define CONFIG_SYS_CSPR0               CONFIG_SYS_NOR0_CSPR_EARLY
-#define CONFIG_SYS_CSPR0_FINAL         CONFIG_SYS_NOR0_CSPR
-#define CONFIG_SYS_AMASK0              CONFIG_SYS_NOR_AMASK
-#define CONFIG_SYS_CSOR0               CONFIG_SYS_NOR_CSOR
-#define CONFIG_SYS_CS0_FTIM0           CONFIG_SYS_NOR_FTIM0
-#define CONFIG_SYS_CS0_FTIM1           CONFIG_SYS_NOR_FTIM1
-#define CONFIG_SYS_CS0_FTIM2           CONFIG_SYS_NOR_FTIM2
-#define CONFIG_SYS_CS0_FTIM3           CONFIG_SYS_NOR_FTIM3
+/* Debug Server firmware */
+#define CONFIG_SYS_DEBUG_SERVER_DRAM_BLOCK_MIN_SIZE    (512UL * 1024 * 1024)
+/* 2 sec timeout */
+#define CONFIG_SYS_DEBUG_SERVER_TIMEOUT                        (2 * 1000 * 1000)
 
 /* MC firmware */
 #define CONFIG_FSL_MC_ENET
 #define CONFIG_SYS_LS_MC_DRAM_BLOCK_MIN_SIZE   (512UL * 1024 * 1024)
-#define CONFIG_SYS_LS_MC_FW_IN_NOR
-#define CONFIG_SYS_LS_MC_FW_ADDR       0x580200000ULL
-#define CONFIG_SYS_LS_MC_DPL_IN_NOR
-#define CONFIG_SYS_LS_MC_DPL_ADDR      0x5806C0000ULL
 /* TODO Actual DPL max length needs to be confirmed with the MC FW team */
-#define CONFIG_SYS_LS_MC_DPL_MAX_LENGTH        (256 * 1024)
-#define CONFIG_SYS_LS_MC_DRAM_DPL_OFFSET    0xe00000
-
-/* Carve the MC private DRAM block from the end of DRAM */
-#ifdef CONFIG_FSL_MC_ENET
-#define CONFIG_SYS_MEM_TOP_HIDE                mc_get_dram_block_size()
+#define CONFIG_SYS_LS_MC_DPC_MAX_LENGTH            0x20000
+#define CONFIG_SYS_LS_MC_DRAM_DPC_OFFSET    0x00F00000
+#define CONFIG_SYS_LS_MC_DPL_MAX_LENGTH            0x20000
+#define CONFIG_SYS_LS_MC_DRAM_DPL_OFFSET    0x00F20000
+
+/* Carve out a DDR region which will not be used by u-boot/Linux */
+#if defined(CONFIG_FSL_MC_ENET) || defined(CONFIG_FSL_DEBUG_SERVER)
+#define CONFIG_SYS_MEM_TOP_HIDE                get_dram_size_to_hide()
 #endif
 
+/* PCIe */
+#define CONFIG_PCIE1           /* PCIE controler 1 */
+#define CONFIG_PCIE2           /* PCIE controler 2 */
+#define CONFIG_PCIE3           /* PCIE controler 3 */
+#define CONFIG_PCIE4           /* PCIE controler 4 */
+#define FSL_PCIE_COMPAT "fsl,20851a-pcie"
+
+#define CONFIG_SYS_PCI_64BIT
+
+#define CONFIG_SYS_PCIE_CFG0_PHYS_OFF  0x00000000
+#define CONFIG_SYS_PCIE_CFG0_SIZE      0x00001000      /* 4k */
+#define CONFIG_SYS_PCIE_CFG1_PHYS_OFF  0x00001000
+#define CONFIG_SYS_PCIE_CFG1_SIZE      0x00001000      /* 4k */
+
+#define CONFIG_SYS_PCIE_IO_BUS         0x00000000
+#define CONFIG_SYS_PCIE_IO_PHYS_OFF    0x00010000
+#define CONFIG_SYS_PCIE_IO_SIZE                0x00010000      /* 64k */
+
+#define CONFIG_SYS_PCIE_MEM_BUS                0x40000000
+#define CONFIG_SYS_PCIE_MEM_PHYS_OFF   0x40000000
+#define CONFIG_SYS_PCIE_MEM_SIZE       0x40000000      /* 1G */
+
 /* Command line configuration */
 #define CONFIG_CMD_CACHE
 #define CONFIG_CMD_BDI
 #define CONFIG_CMD_ENV
 #define CONFIG_CMD_FLASH
 #define CONFIG_CMD_IMI
+#define CONFIG_CMD_LOADB
 #define CONFIG_CMD_MEMORY
 #define CONFIG_CMD_MII
 #define CONFIG_CMD_NET
 #define CONFIG_CMD_BOOTD
 #define CONFIG_CMD_ECHO
 #define CONFIG_CMD_SOURCE
-#define CONFIG_CMD_FAT
-#define CONFIG_DOS_PARTITION
 
 /* Miscellaneous configurable options */
 #define CONFIG_SYS_LOAD_ADDR   (CONFIG_SYS_DDR_SDRAM_BASE + 0x10000000)
 /* Physical Memory Map */
 /* fixme: these need to be checked against the board */
 #define CONFIG_CHIP_SELECTS_PER_CTRL   4
-#define CONFIG_SYS_CLK_FREQ    100000000
-#define CONFIG_DDR_CLK_FREQ    133333333
-
 
 #define CONFIG_NR_DRAM_BANKS           3
 
        "kernel_addr=0x100000\0"                \
        "ramdisk_addr=0x800000\0"               \
        "ramdisk_size=0x2000000\0"              \
-       "fdt_high=0xffffffffffffffff\0"         \
+       "fdt_high=0xa0000000\0"                 \
        "initrd_high=0xffffffffffffffff\0"      \
        "kernel_start=0x581200000\0"            \
        "kernel_load=0xa0000000\0"              \
                                "hugepages=16"
 #define CONFIG_BOOTCOMMAND             "cp.b $kernel_start $kernel_load "     \
                                        "$kernel_size && bootm $kernel_load"
-#define CONFIG_BOOTDELAY               1
-
-/* Store environment at top of flash */
-#define CONFIG_ENV_IS_NOWHERE          1
-#define CONFIG_ENV_SIZE                        0x1000
+#define CONFIG_BOOTDELAY               10
 
 /* Monitor Command Prompt */
 #define CONFIG_SYS_CBSIZE              512     /* Console I/O Buffer Size */
-#define CONFIG_SYS_PROMPT              "> "
+#define CONFIG_SYS_PROMPT              "=> "
 #define CONFIG_SYS_PBSIZE              (CONFIG_SYS_CBSIZE + \
                                        sizeof(CONFIG_SYS_PROMPT) + 16)
 #define CONFIG_SYS_HUSH_PARSER
 #define CONFIG_SYS_BARGSIZE            CONFIG_SYS_CBSIZE /* Boot args buffer */
 #define CONFIG_SYS_LONGHELP
 #define CONFIG_CMDLINE_EDITING         1
+#define CONFIG_AUTO_COMPLETE
 #define CONFIG_SYS_MAXARGS             64      /* max command args */
 
 #ifndef __ASSEMBLY__
-unsigned long mc_get_dram_block_size(void);
+unsigned long get_dram_size_to_hide(void);
 #endif
 
+#define CONFIG_PANIC_HANG      /* do not reset board on panic */
+
+#define CONFIG_SPL_BSS_START_ADDR      0x80100000
+#define CONFIG_SPL_BSS_MAX_SIZE                0x00100000
+#define CONFIG_SPL_DRIVERS_MISC_SUPPORT
+#define CONFIG_SPL_ENV_SUPPORT
+#define CONFIG_SPL_FRAMEWORK
+#define CONFIG_SPL_I2C_SUPPORT
+#define CONFIG_SPL_LDSCRIPT "arch/arm/cpu/armv8/u-boot-spl.lds"
+#define CONFIG_SPL_LIBCOMMON_SUPPORT
+#define CONFIG_SPL_LIBGENERIC_SUPPORT
+#define CONFIG_SPL_MAX_SIZE            0x16000
+#define CONFIG_SPL_MPC8XXX_INIT_DDR_SUPPORT
+#define CONFIG_SPL_NAND_SUPPORT
+#define CONFIG_SPL_SERIAL_SUPPORT
+#define CONFIG_SPL_STACK               (CONFIG_SYS_FSL_OCRAM_BASE + 0x9ff0)
+#define CONFIG_SPL_TARGET              "u-boot-with-spl.bin"
+#define CONFIG_SPL_TEXT_BASE           0x1800a000
+
+#define CONFIG_SYS_NAND_U_BOOT_DST     0x80400000
+#define CONFIG_SYS_NAND_U_BOOT_START   CONFIG_SYS_NAND_U_BOOT_DST
+#define CONFIG_SYS_SPL_MALLOC_SIZE     0x00100000
+#define CONFIG_SYS_SPL_MALLOC_START    0x80200000
+#define CONFIG_SYS_MONITOR_LEN         (512 * 1024)
+
 #endif /* __LS2_COMMON_H */
index a02d69450b7d012deba6e68942a41b8f03ae4642..2d68e1bf7e59f77af4c2127550d7a0c6d9078dc6 100644 (file)
 #define CONFIG_IDENT_STRING            " LS2085A-EMU"
 #define CONFIG_BOOTP_VCI_STRING                "U-boot.LS2085A-EMU"
 
+#define CONFIG_SYS_CLK_FREQ    100000000
+#define CONFIG_DDR_CLK_FREQ    133333333
+
+#define CONFIG_SYS_MXC_I2C1_SPEED      40000000
+#define CONFIG_SYS_MXC_I2C2_SPEED      40000000
+
 #define CONFIG_DDR_SPD
 #define CONFIG_SYS_FSL_DDR_EMU         /* Support emulator */
 #define SPD_EEPROM_ADDRESS1    0x51
 #define SPD_EEPROM_ADDRESS3    0x53
 #define SPD_EEPROM_ADDRESS     SPD_EEPROM_ADDRESS1
 #define CONFIG_SYS_SPD_BUS_NUM 1       /* SPD on I2C bus 1 */
+#define CONFIG_DIMM_SLOTS_PER_CTLR             1
+#define CONFIG_CHIP_SELECTS_PER_CTRL           4
+#define CONFIG_DP_DDR_DIMM_SLOTS_PER_CTLR      1
 
 #define CONFIG_FSL_DDR_SYNC_REFRESH
+
+#define CONFIG_SYS_NOR0_CSPR_EXT       (0x0)
+#define CONFIG_SYS_NOR_AMASK   IFC_AMASK(128*1024*1024)
+/*
+ * NOR Flash Timing Params
+ */
+#define CONFIG_SYS_NOR0_CSPR                                   \
+       (CSPR_PHYS_ADDR(CONFIG_SYS_FLASH_BASE_PHYS)             | \
+       CSPR_PORT_SIZE_16                                       | \
+       CSPR_MSEL_NOR                                           | \
+       CSPR_V)
+#define CONFIG_SYS_NOR0_CSPR_EARLY                             \
+       (CSPR_PHYS_ADDR(CONFIG_SYS_FLASH_BASE_PHYS_EARLY)       | \
+       CSPR_PORT_SIZE_16                                       | \
+       CSPR_MSEL_NOR                                           | \
+       CSPR_V)
+#define CONFIG_SYS_NOR_CSOR    CSOR_NOR_ADM_SHIFT(12)
+#define CONFIG_SYS_NOR_FTIM0   (FTIM0_NOR_TACSE(0x1) | \
+                               FTIM0_NOR_TEADC(0x1) | \
+                               FTIM0_NOR_TEAHC(0x1))
+#define CONFIG_SYS_NOR_FTIM1   (FTIM1_NOR_TACO(0x1) | \
+                               FTIM1_NOR_TRAD_NOR(0x1))
+#define CONFIG_SYS_NOR_FTIM2   (FTIM2_NOR_TCS(0x0) | \
+                               FTIM2_NOR_TCH(0x0) | \
+                               FTIM2_NOR_TWP(0x1))
+#define CONFIG_SYS_NOR_FTIM3   0x04000000
+#define CONFIG_SYS_IFC_CCR     0x01000000
+
+#define CONFIG_SYS_CSPR0_EXT           CONFIG_SYS_NOR0_CSPR_EXT
+#define CONFIG_SYS_CSPR0               CONFIG_SYS_NOR0_CSPR_EARLY
+#define CONFIG_SYS_CSPR0_FINAL         CONFIG_SYS_NOR0_CSPR
+#define CONFIG_SYS_AMASK0              CONFIG_SYS_NOR_AMASK
+#define CONFIG_SYS_CSOR0               CONFIG_SYS_NOR_CSOR
+#define CONFIG_SYS_CS0_FTIM0           CONFIG_SYS_NOR_FTIM0
+#define CONFIG_SYS_CS0_FTIM1           CONFIG_SYS_NOR_FTIM1
+#define CONFIG_SYS_CS0_FTIM2           CONFIG_SYS_NOR_FTIM2
+#define CONFIG_SYS_CS0_FTIM3           CONFIG_SYS_NOR_FTIM3
+
+/* Debug Server firmware */
+#define CONFIG_SYS_DEBUG_SERVER_FW_IN_NOR
+#define CONFIG_SYS_DEBUG_SERVER_FW_ADDR        0x580C00000ULL
+
+/*
+ * This trick allows users to load MC images into DDR directly without
+ * copying from NOR flash. It dramatically improves speed.
+ */
+#define CONFIG_SYS_LS_MC_FW_IN_DDR
+#define CONFIG_SYS_LS_MC_DPL_IN_DDR
+#define CONFIG_SYS_LS_MC_DPC_IN_DDR
+
+#define CONFIG_SYS_LS_MC_BOOT_TIMEOUT_MS 200000
+
+/* Store environment at top of flash */
+#define CONFIG_ENV_IS_NOWHERE          1
+#define CONFIG_ENV_SIZE                        0x1000
+
 #endif /* __LS2_EMU_H */
index af34f3f95d6458ba934eec7af391b63088072f71..d0d2eedb6d7cc36e197e003967ed2eace543bdda 100644 (file)
 #define CONFIG_IDENT_STRING            " LS2085A-SIMU"
 #define CONFIG_BOOTP_VCI_STRING                "U-boot.LS2085A-SIMU"
 
+#define CONFIG_SYS_CLK_FREQ    100000000
+#define CONFIG_DDR_CLK_FREQ    133333333
+
+#define CONFIG_SYS_MXC_I2C1_SPEED      40000000
+#define CONFIG_SYS_MXC_I2C2_SPEED      40000000
+
+#define CONFIG_DIMM_SLOTS_PER_CTLR             1
+#define CONFIG_CHIP_SELECTS_PER_CTRL           4
+#define CONFIG_DP_DDR_DIMM_SLOTS_PER_CTLR      1
+
 /* SMSC 91C111 ethernet configuration */
 #define CONFIG_SMC91111
 #define CONFIG_SMC91111_BASE   (0x2210000)
 
+#define CONFIG_SYS_NOR0_CSPR_EXT       (0x0)
+#define CONFIG_SYS_NOR_AMASK   IFC_AMASK(128*1024*1024)
+
+/*
+ * NOR Flash Timing Params
+ */
+#define CONFIG_SYS_NOR0_CSPR                                   \
+       (CSPR_PHYS_ADDR(CONFIG_SYS_FLASH_BASE_PHYS)             | \
+       CSPR_PORT_SIZE_16                                       | \
+       CSPR_MSEL_NOR                                           | \
+       CSPR_V)
+#define CONFIG_SYS_NOR0_CSPR_EARLY                             \
+       (CSPR_PHYS_ADDR(CONFIG_SYS_FLASH_BASE_PHYS_EARLY)       | \
+       CSPR_PORT_SIZE_16                                       | \
+       CSPR_MSEL_NOR                                           | \
+       CSPR_V)
+#define CONFIG_SYS_NOR_CSOR    CSOR_NOR_ADM_SHIFT(12)
+#define CONFIG_SYS_NOR_FTIM0   (FTIM0_NOR_TACSE(0x1) | \
+                               FTIM0_NOR_TEADC(0x1) | \
+                               FTIM0_NOR_TEAHC(0x1))
+#define CONFIG_SYS_NOR_FTIM1   (FTIM1_NOR_TACO(0x1) | \
+                               FTIM1_NOR_TRAD_NOR(0x1))
+#define CONFIG_SYS_NOR_FTIM2   (FTIM2_NOR_TCS(0x0) | \
+                               FTIM2_NOR_TCH(0x0) | \
+                               FTIM2_NOR_TWP(0x1))
+#define CONFIG_SYS_NOR_FTIM3   0x04000000
+#define CONFIG_SYS_IFC_CCR     0x01000000
+
+#ifndef CONFIG_SYS_NO_FLASH
+#define CONFIG_FLASH_SHOW_PROGRESS     45 /* count down from 45/5: 9..1 */
+
+#define CONFIG_SYS_MAX_FLASH_BANKS     1       /* number of banks */
+#define CONFIG_SYS_MAX_FLASH_SECT      1024    /* sectors per device */
+#define CONFIG_SYS_FLASH_ERASE_TOUT    60000   /* Flash Erase Timeout (ms) */
+#define CONFIG_SYS_FLASH_WRITE_TOUT    500     /* Flash Write Timeout (ms) */
+
+#define CONFIG_SYS_FLASH_EMPTY_INFO
+#define CONFIG_SYS_FLASH_BANKS_LIST    { CONFIG_SYS_FLASH_BASE }
+#endif
+
+#define CONFIG_NAND_FSL_IFC
+#define CONFIG_SYS_NAND_MAX_ECCPOS     256
+#define CONFIG_SYS_NAND_MAX_OOBFREE    2
+
+
+#define CONFIG_SYS_NAND_CSPR_EXT       (0x0)
+#define CONFIG_SYS_NAND_CSPR   (CSPR_PHYS_ADDR(CONFIG_SYS_NAND_BASE_PHYS) \
+                               | CSPR_PORT_SIZE_8 /* Port Size = 8 bit */ \
+                               | CSPR_MSEL_NAND        /* MSEL = NAND */ \
+                               | CSPR_V)
+#define CONFIG_SYS_NAND_AMASK  IFC_AMASK(64 * 1024)
+
+#define CONFIG_SYS_NAND_CSOR    (CSOR_NAND_ECC_ENC_EN   /* ECC on encode */ \
+                               | CSOR_NAND_ECC_DEC_EN  /* ECC on decode */ \
+                               | CSOR_NAND_ECC_MODE_4  /* 4-bit ECC */ \
+                               | CSOR_NAND_RAL_3       /* RAL = 2Byes */ \
+                               | CSOR_NAND_PGS_2K      /* Page Size = 2K */ \
+                               | CSOR_NAND_SPRZ_64/* Spare size = 64 */ \
+                               | CSOR_NAND_PB(64))     /*Pages Per Block = 64*/
+
+#define CONFIG_SYS_NAND_ONFI_DETECTION
+
+/* ONFI NAND Flash mode0 Timing Params */
+#define CONFIG_SYS_NAND_FTIM0          (FTIM0_NAND_TCCST(0x07) | \
+                                       FTIM0_NAND_TWP(0x18)   | \
+                                       FTIM0_NAND_TWCHT(0x07) | \
+                                       FTIM0_NAND_TWH(0x0a))
+#define CONFIG_SYS_NAND_FTIM1          (FTIM1_NAND_TADLE(0x32) | \
+                                       FTIM1_NAND_TWBE(0x39)  | \
+                                       FTIM1_NAND_TRR(0x0e)   | \
+                                       FTIM1_NAND_TRP(0x18))
+#define CONFIG_SYS_NAND_FTIM2          (FTIM2_NAND_TRAD(0x0f) | \
+                                       FTIM2_NAND_TREH(0x0a) | \
+                                       FTIM2_NAND_TWHRE(0x1e))
+#define CONFIG_SYS_NAND_FTIM3          0x0
+
+#define CONFIG_SYS_NAND_BASE_LIST      { CONFIG_SYS_NAND_BASE }
+#define CONFIG_SYS_MAX_NAND_DEVICE     1
+#define CONFIG_MTD_NAND_VERIFY_WRITE
+#define CONFIG_CMD_NAND
+
+#define CONFIG_SYS_NAND_BLOCK_SIZE     (128 * 1024)
+
+#define CONFIG_SYS_CSPR0_EXT           CONFIG_SYS_NOR0_CSPR_EXT
+#define CONFIG_SYS_CSPR0               CONFIG_SYS_NOR0_CSPR_EARLY
+#define CONFIG_SYS_CSPR0_FINAL         CONFIG_SYS_NOR0_CSPR
+#define CONFIG_SYS_AMASK0              CONFIG_SYS_NOR_AMASK
+#define CONFIG_SYS_CSOR0               CONFIG_SYS_NOR_CSOR
+#define CONFIG_SYS_CS0_FTIM0           CONFIG_SYS_NOR_FTIM0
+#define CONFIG_SYS_CS0_FTIM1           CONFIG_SYS_NOR_FTIM1
+#define CONFIG_SYS_CS0_FTIM2           CONFIG_SYS_NOR_FTIM2
+#define CONFIG_SYS_CS0_FTIM3           CONFIG_SYS_NOR_FTIM3
 #define CONFIG_SYS_CSPR1_EXT           CONFIG_SYS_NAND_CSPR_EXT
 #define CONFIG_SYS_CSPR1               CONFIG_SYS_NAND_CSPR
 #define CONFIG_SYS_AMASK1              CONFIG_SYS_NAND_AMASK
 #define CONFIG_SYS_CS1_FTIM2           CONFIG_SYS_NAND_FTIM2
 #define CONFIG_SYS_CS1_FTIM3           CONFIG_SYS_NAND_FTIM3
 
+/* Debug Server firmware */
+#define CONFIG_SYS_DEBUG_SERVER_FW_IN_NOR
+#define CONFIG_SYS_DEBUG_SERVER_FW_ADDR        0x580C00000ULL
+
+/* MC firmware */
+#define CONFIG_SYS_LS_MC_FW_IN_NOR
+#define CONFIG_SYS_LS_MC_FW_ADDR       0x580200000ULL
+
+#define CONFIG_SYS_LS_MC_DPL_IN_NOR
+#define CONFIG_SYS_LS_MC_DPL_ADDR      0x5806C0000ULL
+
+#define CONFIG_SYS_LS_MC_DPC_IN_NOR
+#define CONFIG_SYS_LS_MC_DPC_ADDR      0x5806F8000ULL
+
+#define CONFIG_SYS_LS_MC_BOOT_TIMEOUT_MS 200000
+
+/* Store environment at top of flash */
+#define CONFIG_ENV_IS_NOWHERE          1
+#define CONFIG_ENV_SIZE                        0x1000
+
 #endif /* __LS2_SIMU_H */
diff --git a/include/configs/ls2085aqds.h b/include/configs/ls2085aqds.h
new file mode 100644 (file)
index 0000000..711d529
--- /dev/null
@@ -0,0 +1,359 @@
+/*
+ * Copyright 2015 Freescale Semiconductor
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#ifndef __LS2_QDS_H
+#define __LS2_QDS_H
+
+#include "ls2085a_common.h"
+#include <config_cmd_default.h>
+
+#define CONFIG_IDENT_STRING            " LS2085A-QDS"
+#define CONFIG_BOOTP_VCI_STRING                "U-boot.LS2085A-QDS"
+
+#define CONFIG_DISPLAY_BOARDINFO
+
+#ifndef __ASSEMBLY__
+unsigned long get_board_sys_clk(void);
+unsigned long get_board_ddr_clk(void);
+#endif
+
+#define CONFIG_SYS_CLK_FREQ            get_board_sys_clk()
+#define CONFIG_DDR_CLK_FREQ            get_board_ddr_clk()
+#define COUNTER_FREQUENCY_REAL         (CONFIG_SYS_CLK_FREQ/4)
+
+#define CONFIG_DDR_SPD
+#define CONFIG_DDR_ECC
+#define CONFIG_ECC_INIT_VIA_DDRCONTROLLER
+#define CONFIG_MEM_INIT_VALUE          0xdeadbeef
+#define SPD_EEPROM_ADDRESS1    0x51
+#define SPD_EEPROM_ADDRESS2    0x52
+#define SPD_EEPROM_ADDRESS3    0x53
+#define SPD_EEPROM_ADDRESS4    0x54
+#define SPD_EEPROM_ADDRESS5    0x55
+#define SPD_EEPROM_ADDRESS6    0x56    /* dummy address */
+#define SPD_EEPROM_ADDRESS     SPD_EEPROM_ADDRESS1
+#define CONFIG_SYS_SPD_BUS_NUM 0       /* SPD on I2C bus 0 */
+#define CONFIG_DIMM_SLOTS_PER_CTLR             2
+#define CONFIG_CHIP_SELECTS_PER_CTRL           4
+#define CONFIG_DP_DDR_DIMM_SLOTS_PER_CTLR      1
+#define CONFIG_FSL_DDR_BIST    /* enable built-in memory test */
+
+/* undefined CONFIG_FSL_DDR_SYNC_REFRESH for simulator */
+
+#define CONFIG_SYS_NOR0_CSPR_EXT       (0x0)
+#define CONFIG_SYS_NOR_AMASK           IFC_AMASK(128*1024*1024)
+#define CONFIG_SYS_NOR_AMASK_EARLY     IFC_AMASK(64*1024*1024)
+
+#define CONFIG_SYS_NOR0_CSPR                                   \
+       (CSPR_PHYS_ADDR(CONFIG_SYS_FLASH_BASE_PHYS)             | \
+       CSPR_PORT_SIZE_16                                       | \
+       CSPR_MSEL_NOR                                           | \
+       CSPR_V)
+#define CONFIG_SYS_NOR0_CSPR_EARLY                             \
+       (CSPR_PHYS_ADDR(CONFIG_SYS_FLASH_BASE_PHYS_EARLY)       | \
+       CSPR_PORT_SIZE_16                                       | \
+       CSPR_MSEL_NOR                                           | \
+       CSPR_V)
+#define CONFIG_SYS_NOR1_CSPR                                   \
+       (CSPR_PHYS_ADDR(CONFIG_SYS_FLASH1_BASE_PHYS)            | \
+       CSPR_PORT_SIZE_16                                       | \
+       CSPR_MSEL_NOR                                           | \
+       CSPR_V)
+#define CONFIG_SYS_NOR1_CSPR_EARLY                             \
+       (CSPR_PHYS_ADDR(CONFIG_SYS_FLASH1_BASE_PHYS_EARLY)      | \
+       CSPR_PORT_SIZE_16                                       | \
+       CSPR_MSEL_NOR                                           | \
+       CSPR_V)
+#define CONFIG_SYS_NOR_CSOR    CSOR_NOR_ADM_SHIFT(12)
+#define CONFIG_SYS_NOR_FTIM0   (FTIM0_NOR_TACSE(0x4) | \
+                               FTIM0_NOR_TEADC(0x5) | \
+                               FTIM0_NOR_TEAHC(0x5))
+#define CONFIG_SYS_NOR_FTIM1   (FTIM1_NOR_TACO(0x35) | \
+                               FTIM1_NOR_TRAD_NOR(0x1a) |\
+                               FTIM1_NOR_TSEQRAD_NOR(0x13))
+#define CONFIG_SYS_NOR_FTIM2   (FTIM2_NOR_TCS(0x4) | \
+                               FTIM2_NOR_TCH(0x4) | \
+                               FTIM2_NOR_TWPH(0x0E) | \
+                               FTIM2_NOR_TWP(0x1c))
+#define CONFIG_SYS_NOR_FTIM3   0x04000000
+#define CONFIG_SYS_IFC_CCR     0x01000000
+
+#ifndef CONFIG_SYS_NO_FLASH
+#define CONFIG_FLASH_CFI_DRIVER
+#define CONFIG_SYS_FLASH_CFI
+#define CONFIG_SYS_FLASH_USE_BUFFER_WRITE
+#define CONFIG_SYS_FLASH_QUIET_TEST
+#define CONFIG_FLASH_SHOW_PROGRESS     45 /* count down from 45/5: 9..1 */
+
+#define CONFIG_SYS_MAX_FLASH_BANKS     2       /* number of banks */
+#define CONFIG_SYS_MAX_FLASH_SECT      1024    /* sectors per device */
+#define CONFIG_SYS_FLASH_ERASE_TOUT    60000   /* Flash Erase Timeout (ms) */
+#define CONFIG_SYS_FLASH_WRITE_TOUT    500     /* Flash Write Timeout (ms) */
+
+#define CONFIG_SYS_FLASH_EMPTY_INFO
+#define CONFIG_SYS_FLASH_BANKS_LIST    { CONFIG_SYS_FLASH_BASE,\
+                                        CONFIG_SYS_FLASH_BASE + 0x40000000}
+#endif
+
+#define CONFIG_NAND_FSL_IFC
+#define CONFIG_SYS_NAND_MAX_ECCPOS     256
+#define CONFIG_SYS_NAND_MAX_OOBFREE    2
+
+
+#define CONFIG_SYS_NAND_CSPR_EXT       (0x0)
+#define CONFIG_SYS_NAND_CSPR   (CSPR_PHYS_ADDR(CONFIG_SYS_NAND_BASE_PHYS) \
+                               | CSPR_PORT_SIZE_8 /* Port Size = 8 bit */ \
+                               | CSPR_MSEL_NAND        /* MSEL = NAND */ \
+                               | CSPR_V)
+#define CONFIG_SYS_NAND_AMASK  IFC_AMASK(64 * 1024)
+
+#define CONFIG_SYS_NAND_CSOR    (CSOR_NAND_ECC_ENC_EN   /* ECC on encode */ \
+                               | CSOR_NAND_ECC_DEC_EN  /* ECC on decode */ \
+                               | CSOR_NAND_ECC_MODE_4  /* 4-bit ECC */ \
+                               | CSOR_NAND_RAL_3       /* RAL = 3Byes */ \
+                               | CSOR_NAND_PGS_2K      /* Page Size = 2K */ \
+                               | CSOR_NAND_SPRZ_64/* Spare size = 64 */ \
+                               | CSOR_NAND_PB(64))     /*Pages Per Block = 64*/
+
+#define CONFIG_SYS_NAND_ONFI_DETECTION
+
+/* ONFI NAND Flash mode0 Timing Params */
+#define CONFIG_SYS_NAND_FTIM0          (FTIM0_NAND_TCCST(0x07) | \
+                                       FTIM0_NAND_TWP(0x18)   | \
+                                       FTIM0_NAND_TWCHT(0x07) | \
+                                       FTIM0_NAND_TWH(0x0a))
+#define CONFIG_SYS_NAND_FTIM1          (FTIM1_NAND_TADLE(0x32) | \
+                                       FTIM1_NAND_TWBE(0x39)  | \
+                                       FTIM1_NAND_TRR(0x0e)   | \
+                                       FTIM1_NAND_TRP(0x18))
+#define CONFIG_SYS_NAND_FTIM2          (FTIM2_NAND_TRAD(0x0f) | \
+                                       FTIM2_NAND_TREH(0x0a) | \
+                                       FTIM2_NAND_TWHRE(0x1e))
+#define CONFIG_SYS_NAND_FTIM3          0x0
+
+#define CONFIG_SYS_NAND_BASE_LIST      { CONFIG_SYS_NAND_BASE }
+#define CONFIG_SYS_MAX_NAND_DEVICE     1
+#define CONFIG_MTD_NAND_VERIFY_WRITE
+#define CONFIG_CMD_NAND
+
+#define CONFIG_SYS_NAND_BLOCK_SIZE     (128 * 1024)
+
+#define CONFIG_FSL_QIXIS       /* use common QIXIS code */
+#define QIXIS_LBMAP_SWITCH             0x06
+#define QIXIS_LBMAP_MASK               0x0f
+#define QIXIS_LBMAP_SHIFT              0
+#define QIXIS_LBMAP_DFLTBANK           0x00
+#define QIXIS_LBMAP_ALTBANK            0x04
+#define QIXIS_LBMAP_NAND               0x09
+#define QIXIS_RST_CTL_RESET            0x31
+#define QIXIS_RCFG_CTL_RECONFIG_IDLE   0x20
+#define QIXIS_RCFG_CTL_RECONFIG_START  0x21
+#define QIXIS_RCFG_CTL_WATCHDOG_ENBLE  0x08
+#define QIXIS_RCW_SRC_NAND             0x107
+#define        QIXIS_RST_FORCE_MEM             0x01
+
+#define CONFIG_SYS_CSPR3_EXT   (0x0)
+#define CONFIG_SYS_CSPR3       (CSPR_PHYS_ADDR(QIXIS_BASE_PHYS_EARLY) \
+                               | CSPR_PORT_SIZE_8 \
+                               | CSPR_MSEL_GPCM \
+                               | CSPR_V)
+#define CONFIG_SYS_CSPR3_FINAL (CSPR_PHYS_ADDR(QIXIS_BASE_PHYS) \
+                               | CSPR_PORT_SIZE_8 \
+                               | CSPR_MSEL_GPCM \
+                               | CSPR_V)
+
+#define CONFIG_SYS_AMASK3      IFC_AMASK(64*1024)
+#define CONFIG_SYS_CSOR3       CSOR_GPCM_ADM_SHIFT(12)
+/* QIXIS Timing parameters for IFC CS3 */
+#define CONFIG_SYS_CS3_FTIM0           (FTIM0_GPCM_TACSE(0x0e) | \
+                                       FTIM0_GPCM_TEADC(0x0e) | \
+                                       FTIM0_GPCM_TEAHC(0x0e))
+#define CONFIG_SYS_CS3_FTIM1           (FTIM1_GPCM_TACO(0xff) | \
+                                       FTIM1_GPCM_TRAD(0x3f))
+#define CONFIG_SYS_CS3_FTIM2           (FTIM2_GPCM_TCS(0xf) | \
+                                       FTIM2_GPCM_TCH(0xf) | \
+                                       FTIM2_GPCM_TWP(0x3E))
+#define CONFIG_SYS_CS3_FTIM3           0x0
+
+#if defined(CONFIG_SPL) && defined(CONFIG_NAND)
+#define CONFIG_SYS_CSPR1_EXT           CONFIG_SYS_NOR0_CSPR_EXT
+#define CONFIG_SYS_CSPR1               CONFIG_SYS_NOR0_CSPR_EARLY
+#define CONFIG_SYS_CSPR1_FINAL         CONFIG_SYS_NOR0_CSPR
+#define CONFIG_SYS_AMASK1              CONFIG_SYS_NOR_AMASK
+#define CONFIG_SYS_CSOR1               CONFIG_SYS_NOR_CSOR
+#define CONFIG_SYS_CS1_FTIM0           CONFIG_SYS_NOR_FTIM0
+#define CONFIG_SYS_CS1_FTIM1           CONFIG_SYS_NOR_FTIM1
+#define CONFIG_SYS_CS1_FTIM2           CONFIG_SYS_NOR_FTIM2
+#define CONFIG_SYS_CS1_FTIM3           CONFIG_SYS_NOR_FTIM3
+#define CONFIG_SYS_CSPR2_EXT           CONFIG_SYS_NOR0_CSPR_EXT
+#define CONFIG_SYS_CSPR2               CONFIG_SYS_NOR1_CSPR_EARLY
+#define CONFIG_SYS_CSPR2_FINAL         CONFIG_SYS_NOR1_CSPR
+#define CONFIG_SYS_AMASK2              CONFIG_SYS_NOR_AMASK_EARLY
+#define CONFIG_SYS_AMASK2_FINAL                CONFIG_SYS_NOR_AMASK
+#define CONFIG_SYS_CSOR2               CONFIG_SYS_NOR_CSOR
+#define CONFIG_SYS_CS2_FTIM0           CONFIG_SYS_NOR_FTIM0
+#define CONFIG_SYS_CS2_FTIM1           CONFIG_SYS_NOR_FTIM1
+#define CONFIG_SYS_CS2_FTIM2           CONFIG_SYS_NOR_FTIM2
+#define CONFIG_SYS_CS2_FTIM3           CONFIG_SYS_NOR_FTIM3
+#define CONFIG_SYS_CSPR0_EXT           CONFIG_SYS_NAND_CSPR_EXT
+#define CONFIG_SYS_CSPR0               CONFIG_SYS_NAND_CSPR
+#define CONFIG_SYS_AMASK0              CONFIG_SYS_NAND_AMASK
+#define CONFIG_SYS_CSOR0               CONFIG_SYS_NAND_CSOR
+#define CONFIG_SYS_CS0_FTIM0           CONFIG_SYS_NAND_FTIM0
+#define CONFIG_SYS_CS0_FTIM1           CONFIG_SYS_NAND_FTIM1
+#define CONFIG_SYS_CS0_FTIM2           CONFIG_SYS_NAND_FTIM2
+#define CONFIG_SYS_CS0_FTIM3           CONFIG_SYS_NAND_FTIM3
+
+#define CONFIG_ENV_IS_IN_NAND
+#define CONFIG_ENV_OFFSET              (896 * 1024)
+#define CONFIG_ENV_SECT_SIZE           0x20000
+#define CONFIG_ENV_SIZE                        0x2000
+#define CONFIG_SPL_PAD_TO              0x20000
+#define CONFIG_SYS_NAND_U_BOOT_OFFS    (256 * 1024)
+#define CONFIG_SYS_NAND_U_BOOT_SIZE    (512 * 1024)
+#else
+#define CONFIG_SYS_CSPR0_EXT           CONFIG_SYS_NOR0_CSPR_EXT
+#define CONFIG_SYS_CSPR0               CONFIG_SYS_NOR0_CSPR_EARLY
+#define CONFIG_SYS_CSPR0_FINAL         CONFIG_SYS_NOR0_CSPR
+#define CONFIG_SYS_AMASK0              CONFIG_SYS_NOR_AMASK
+#define CONFIG_SYS_CSOR0               CONFIG_SYS_NOR_CSOR
+#define CONFIG_SYS_CS0_FTIM0           CONFIG_SYS_NOR_FTIM0
+#define CONFIG_SYS_CS0_FTIM1           CONFIG_SYS_NOR_FTIM1
+#define CONFIG_SYS_CS0_FTIM2           CONFIG_SYS_NOR_FTIM2
+#define CONFIG_SYS_CS0_FTIM3           CONFIG_SYS_NOR_FTIM3
+#define CONFIG_SYS_CSPR1_EXT           CONFIG_SYS_NOR0_CSPR_EXT
+#define CONFIG_SYS_CSPR1               CONFIG_SYS_NOR1_CSPR_EARLY
+#define CONFIG_SYS_CSPR1_FINAL         CONFIG_SYS_NOR1_CSPR
+#define CONFIG_SYS_AMASK1              CONFIG_SYS_NOR_AMASK_EARLY
+#define CONFIG_SYS_AMASK1_FINAL                CONFIG_SYS_NOR_AMASK
+#define CONFIG_SYS_CSOR1               CONFIG_SYS_NOR_CSOR
+#define CONFIG_SYS_CS1_FTIM0           CONFIG_SYS_NOR_FTIM0
+#define CONFIG_SYS_CS1_FTIM1           CONFIG_SYS_NOR_FTIM1
+#define CONFIG_SYS_CS1_FTIM2           CONFIG_SYS_NOR_FTIM2
+#define CONFIG_SYS_CS1_FTIM3           CONFIG_SYS_NOR_FTIM3
+#define CONFIG_SYS_CSPR2_EXT           CONFIG_SYS_NAND_CSPR_EXT
+#define CONFIG_SYS_CSPR2               CONFIG_SYS_NAND_CSPR
+#define CONFIG_SYS_AMASK2              CONFIG_SYS_NAND_AMASK
+#define CONFIG_SYS_CSOR2               CONFIG_SYS_NAND_CSOR
+#define CONFIG_SYS_CS2_FTIM0           CONFIG_SYS_NAND_FTIM0
+#define CONFIG_SYS_CS2_FTIM1           CONFIG_SYS_NAND_FTIM1
+#define CONFIG_SYS_CS2_FTIM2           CONFIG_SYS_NAND_FTIM2
+#define CONFIG_SYS_CS2_FTIM3           CONFIG_SYS_NAND_FTIM3
+
+#define CONFIG_ENV_IS_IN_FLASH
+#define CONFIG_ENV_ADDR                        (CONFIG_SYS_FLASH_BASE + 0x200000)
+#define CONFIG_ENV_SECT_SIZE           0x20000
+#define CONFIG_ENV_SIZE                        0x2000
+#endif
+
+/* Debug Server firmware */
+#define CONFIG_SYS_DEBUG_SERVER_FW_IN_NOR
+#define CONFIG_SYS_DEBUG_SERVER_FW_ADDR        0x580D00000ULL
+
+/* MC firmware */
+#define CONFIG_SYS_LS_MC_FW_IN_NOR
+#define CONFIG_SYS_LS_MC_FW_ADDR       0x580300000ULL
+
+#define CONFIG_SYS_LS_MC_DPL_IN_NOR
+#define CONFIG_SYS_LS_MC_DPL_ADDR      0x580700000ULL
+
+#define CONFIG_SYS_LS_MC_DPC_IN_NOR
+#define CONFIG_SYS_LS_MC_DPC_ADDR      0x580800000ULL
+
+#define CONFIG_SYS_LS_MC_BOOT_TIMEOUT_MS 5000
+
+/*
+ * I2C
+ */
+#define I2C_MUX_PCA_ADDR               0x77
+#define I2C_MUX_PCA_ADDR_PRI           0x77 /* Primary Mux*/
+
+/* I2C bus multiplexer */
+#define I2C_MUX_CH_DEFAULT      0x8
+
+/*
+ * MMC
+ */
+#ifdef CONFIG_MMC
+#define CONFIG_ESDHC_DETECT_QUIRK ((readb(QIXIS_BASE + QIXIS_STAT_PRES1) & \
+       QIXIS_SDID_MASK) != QIXIS_ESDHC_NO_ADAPTER)
+#endif
+
+/*
+ * RTC configuration
+ */
+#define RTC
+#define CONFIG_RTC_DS3231               1
+#define CONFIG_SYS_I2C_RTC_ADDR         0x68
+
+/* EEPROM */
+#define CONFIG_ID_EEPROM
+#define CONFIG_CMD_EEPROM
+#define CONFIG_SYS_I2C_EEPROM_NXID
+#define CONFIG_SYS_EEPROM_BUS_NUM      0
+#define CONFIG_SYS_I2C_EEPROM_ADDR     0x57
+#define CONFIG_SYS_I2C_EEPROM_ADDR_LEN 1
+#define CONFIG_SYS_EEPROM_PAGE_WRITE_BITS 3
+#define CONFIG_SYS_EEPROM_PAGE_WRITE_DELAY_MS 5
+
+#define CONFIG_FSL_MEMAC
+#define CONFIG_PCI             /* Enable PCIE */
+#define CONFIG_PCIE_LAYERSCAPE /* Use common FSL Layerscape PCIe code */
+
+#ifdef CONFIG_PCI
+#define CONFIG_NET_MULTI
+#define CONFIG_PCI_PNP
+#define CONFIG_E1000
+#define CONFIG_PCI_SCAN_SHOW
+#define CONFIG_CMD_PCI
+#define CONFIG_CMD_NET
+#endif
+
+/*  MMC  */
+#define CONFIG_MMC
+#ifdef CONFIG_MMC
+#define CONFIG_CMD_MMC
+#define CONFIG_FSL_ESDHC
+#define CONFIG_SYS_FSL_MMC_HAS_CAPBLT_VS33
+#define CONFIG_GENERIC_MMC
+#define CONFIG_CMD_FAT
+#define CONFIG_DOS_PARTITION
+#endif
+
+/* Initial environment variables */
+#undef CONFIG_EXTRA_ENV_SETTINGS
+#define CONFIG_EXTRA_ENV_SETTINGS              \
+       "hwconfig=fsl_ddr:bank_intlv=auto\0"    \
+       "loadaddr=0x80100000\0"                 \
+       "kernel_addr=0x100000\0"                \
+       "ramdisk_addr=0x800000\0"               \
+       "ramdisk_size=0x2000000\0"              \
+       "fdt_high=0xa0000000\0"                 \
+       "initrd_high=0xffffffffffffffff\0"      \
+       "kernel_start=0x581100000\0"            \
+       "kernel_load=0xa0000000\0"              \
+       "kernel_size=0x1000000\0"
+
+#ifdef CONFIG_FSL_MC_ENET
+#define CONFIG_FSL_MEMAC
+#define        CONFIG_PHYLIB
+#define CONFIG_PHYLIB_10G
+#define        CONFIG_CMD_MII
+#define CONFIG_PHY_VITESSE
+#define CONFIG_PHY_REALTEK
+#define CONFIG_PHY_TERANETICS
+#define SGMII_CARD_PORT1_PHY_ADDR 0x1C
+#define SGMII_CARD_PORT2_PHY_ADDR 0x1d
+#define SGMII_CARD_PORT3_PHY_ADDR 0x1E
+#define SGMII_CARD_PORT4_PHY_ADDR 0x1F
+
+#define CONFIG_MII             /* MII PHY management */
+#define CONFIG_ETHPRIME                "DPNI1"
+#define CONFIG_PHY_GIGE                /* Include GbE speed/duplex detection */
+
+#endif
+
+#endif /* __LS2_QDS_H */
diff --git a/include/configs/ls2085ardb.h b/include/configs/ls2085ardb.h
new file mode 100644 (file)
index 0000000..d1c2548
--- /dev/null
@@ -0,0 +1,305 @@
+/*
+ * Copyright 2015 Freescale Semiconductor
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#ifndef __LS2_RDB_H
+#define __LS2_RDB_H
+
+#include "ls2085a_common.h"
+#include <config_cmd_default.h>
+
+#define CONFIG_IDENT_STRING            " LS2085A-RDB"
+#define CONFIG_BOOTP_VCI_STRING                "U-boot.LS2085A-RDB"
+
+#undef CONFIG_CONS_INDEX
+#define CONFIG_CONS_INDEX       2
+
+#define CONFIG_DISPLAY_BOARDINFO
+
+#ifndef __ASSEMBLY__
+unsigned long get_board_sys_clk(void);
+#endif
+
+#define CONFIG_SYS_CLK_FREQ            get_board_sys_clk()
+#define CONFIG_DDR_CLK_FREQ            133333333
+#define COUNTER_FREQUENCY_REAL         (CONFIG_SYS_CLK_FREQ/4)
+
+#define CONFIG_DDR_SPD
+#define CONFIG_DDR_ECC
+#define CONFIG_ECC_INIT_VIA_DDRCONTROLLER
+#define CONFIG_MEM_INIT_VALUE          0xdeadbeef
+#define SPD_EEPROM_ADDRESS1    0x51
+#define SPD_EEPROM_ADDRESS2    0x52
+#define SPD_EEPROM_ADDRESS3    0x54
+#define SPD_EEPROM_ADDRESS4    0x53    /* Board error */
+#define SPD_EEPROM_ADDRESS5    0x55
+#define SPD_EEPROM_ADDRESS6    0x56    /* dummy address */
+#define SPD_EEPROM_ADDRESS     SPD_EEPROM_ADDRESS1
+#define CONFIG_SYS_SPD_BUS_NUM 0       /* SPD on I2C bus 0 */
+#define CONFIG_DIMM_SLOTS_PER_CTLR             2
+#define CONFIG_CHIP_SELECTS_PER_CTRL           4
+#define CONFIG_DP_DDR_DIMM_SLOTS_PER_CTLR      1
+#define CONFIG_FSL_DDR_BIST    /* enable built-in memory test */
+
+/* undefined CONFIG_FSL_DDR_SYNC_REFRESH for simulator */
+
+#define CONFIG_SYS_NOR0_CSPR_EXT       (0x0)
+#define CONFIG_SYS_NOR_AMASK           IFC_AMASK(128*1024*1024)
+#define CONFIG_SYS_NOR_AMASK_EARLY     IFC_AMASK(64*1024*1024)
+
+#define CONFIG_SYS_NOR0_CSPR                                   \
+       (CSPR_PHYS_ADDR(CONFIG_SYS_FLASH_BASE_PHYS)             | \
+       CSPR_PORT_SIZE_16                                       | \
+       CSPR_MSEL_NOR                                           | \
+       CSPR_V)
+#define CONFIG_SYS_NOR0_CSPR_EARLY                             \
+       (CSPR_PHYS_ADDR(CONFIG_SYS_FLASH_BASE_PHYS_EARLY)       | \
+       CSPR_PORT_SIZE_16                                       | \
+       CSPR_MSEL_NOR                                           | \
+       CSPR_V)
+#define CONFIG_SYS_NOR_CSOR    CSOR_NOR_ADM_SHIFT(12)
+#define CONFIG_SYS_NOR_FTIM0   (FTIM0_NOR_TACSE(0x4) | \
+                               FTIM0_NOR_TEADC(0x5) | \
+                               FTIM0_NOR_TEAHC(0x5))
+#define CONFIG_SYS_NOR_FTIM1   (FTIM1_NOR_TACO(0x35) | \
+                               FTIM1_NOR_TRAD_NOR(0x1a) |\
+                               FTIM1_NOR_TSEQRAD_NOR(0x13))
+#define CONFIG_SYS_NOR_FTIM2   (FTIM2_NOR_TCS(0x4) | \
+                               FTIM2_NOR_TCH(0x4) | \
+                               FTIM2_NOR_TWPH(0x0E) | \
+                               FTIM2_NOR_TWP(0x1c))
+#define CONFIG_SYS_NOR_FTIM3   0x04000000
+#define CONFIG_SYS_IFC_CCR     0x01000000
+
+#ifndef CONFIG_SYS_NO_FLASH
+#define CONFIG_FLASH_CFI_DRIVER
+#define CONFIG_SYS_FLASH_CFI
+#define CONFIG_SYS_FLASH_USE_BUFFER_WRITE
+#define CONFIG_SYS_FLASH_QUIET_TEST
+#define CONFIG_FLASH_SHOW_PROGRESS     45 /* count down from 45/5: 9..1 */
+
+#define CONFIG_SYS_MAX_FLASH_BANKS     1       /* number of banks */
+#define CONFIG_SYS_MAX_FLASH_SECT      1024    /* sectors per device */
+#define CONFIG_SYS_FLASH_ERASE_TOUT    60000   /* Flash Erase Timeout (ms) */
+#define CONFIG_SYS_FLASH_WRITE_TOUT    500     /* Flash Write Timeout (ms) */
+
+#define CONFIG_SYS_FLASH_EMPTY_INFO
+#define CONFIG_SYS_FLASH_BANKS_LIST    { CONFIG_SYS_FLASH_BASE,\
+                                        CONFIG_SYS_FLASH_BASE + 0x40000000}
+#endif
+
+#define CONFIG_NAND_FSL_IFC
+#define CONFIG_SYS_NAND_MAX_ECCPOS     256
+#define CONFIG_SYS_NAND_MAX_OOBFREE    2
+
+
+#define CONFIG_SYS_NAND_CSPR_EXT       (0x0)
+#define CONFIG_SYS_NAND_CSPR   (CSPR_PHYS_ADDR(CONFIG_SYS_NAND_BASE_PHYS) \
+                               | CSPR_PORT_SIZE_8 /* Port Size = 8 bit */ \
+                               | CSPR_MSEL_NAND        /* MSEL = NAND */ \
+                               | CSPR_V)
+#define CONFIG_SYS_NAND_AMASK  IFC_AMASK(64 * 1024)
+
+#define CONFIG_SYS_NAND_CSOR    (CSOR_NAND_ECC_ENC_EN   /* ECC on encode */ \
+                               | CSOR_NAND_ECC_DEC_EN  /* ECC on decode */ \
+                               | CSOR_NAND_ECC_MODE_4  /* 4-bit ECC */ \
+                               | CSOR_NAND_RAL_3       /* RAL = 3Byes */ \
+                               | CSOR_NAND_PGS_4K      /* Page Size = 4K */ \
+                               | CSOR_NAND_SPRZ_224    /* Spare size = 224 */ \
+                               | CSOR_NAND_PB(128))    /* Pages Per Block 128*/
+
+#define CONFIG_SYS_NAND_ONFI_DETECTION
+
+/* ONFI NAND Flash mode0 Timing Params */
+#define CONFIG_SYS_NAND_FTIM0          (FTIM0_NAND_TCCST(0x0e) | \
+                                       FTIM0_NAND_TWP(0x30)   | \
+                                       FTIM0_NAND_TWCHT(0x0e) | \
+                                       FTIM0_NAND_TWH(0x14))
+#define CONFIG_SYS_NAND_FTIM1          (FTIM1_NAND_TADLE(0x64) | \
+                                       FTIM1_NAND_TWBE(0xab)  | \
+                                       FTIM1_NAND_TRR(0x1c)   | \
+                                       FTIM1_NAND_TRP(0x30))
+#define CONFIG_SYS_NAND_FTIM2          (FTIM2_NAND_TRAD(0x1e) | \
+                                       FTIM2_NAND_TREH(0x14) | \
+                                       FTIM2_NAND_TWHRE(0x3c))
+#define CONFIG_SYS_NAND_FTIM3          0x0
+
+#define CONFIG_SYS_NAND_BASE_LIST      { CONFIG_SYS_NAND_BASE }
+#define CONFIG_SYS_MAX_NAND_DEVICE     1
+#define CONFIG_MTD_NAND_VERIFY_WRITE
+#define CONFIG_CMD_NAND
+
+#define CONFIG_SYS_NAND_BLOCK_SIZE     (512 * 1024)
+
+#define CONFIG_FSL_QIXIS       /* use common QIXIS code */
+#define QIXIS_LBMAP_SWITCH             0x06
+#define QIXIS_LBMAP_MASK               0x0f
+#define QIXIS_LBMAP_SHIFT              0
+#define QIXIS_LBMAP_DFLTBANK           0x00
+#define QIXIS_LBMAP_ALTBANK            0x04
+#define QIXIS_LBMAP_NAND               0x09
+#define QIXIS_RST_CTL_RESET            0x31
+#define QIXIS_RST_CTL_RESET_EN         0x30
+#define QIXIS_RCFG_CTL_RECONFIG_IDLE   0x20
+#define QIXIS_RCFG_CTL_RECONFIG_START  0x21
+#define QIXIS_RCFG_CTL_WATCHDOG_ENBLE  0x08
+#define QIXIS_RCW_SRC_NAND             0x119
+#define        QIXIS_RST_FORCE_MEM             0x01
+
+#define CONFIG_SYS_CSPR3_EXT   (0x0)
+#define CONFIG_SYS_CSPR3       (CSPR_PHYS_ADDR(QIXIS_BASE_PHYS_EARLY) \
+                               | CSPR_PORT_SIZE_8 \
+                               | CSPR_MSEL_GPCM \
+                               | CSPR_V)
+#define CONFIG_SYS_CSPR3_FINAL (CSPR_PHYS_ADDR(QIXIS_BASE_PHYS) \
+                               | CSPR_PORT_SIZE_8 \
+                               | CSPR_MSEL_GPCM \
+                               | CSPR_V)
+
+#define CONFIG_SYS_AMASK3      IFC_AMASK(64*1024)
+#define CONFIG_SYS_CSOR3       CSOR_GPCM_ADM_SHIFT(12)
+/* QIXIS Timing parameters for IFC CS3 */
+#define CONFIG_SYS_CS3_FTIM0           (FTIM0_GPCM_TACSE(0x0e) | \
+                                       FTIM0_GPCM_TEADC(0x0e) | \
+                                       FTIM0_GPCM_TEAHC(0x0e))
+#define CONFIG_SYS_CS3_FTIM1           (FTIM1_GPCM_TACO(0xff) | \
+                                       FTIM1_GPCM_TRAD(0x3f))
+#define CONFIG_SYS_CS3_FTIM2           (FTIM2_GPCM_TCS(0xf) | \
+                                       FTIM2_GPCM_TCH(0xf) | \
+                                       FTIM2_GPCM_TWP(0x3E))
+#define CONFIG_SYS_CS3_FTIM3           0x0
+
+#if defined(CONFIG_SPL) && defined(CONFIG_NAND)
+#define CONFIG_SYS_CSPR2_EXT           CONFIG_SYS_NOR0_CSPR_EXT
+#define CONFIG_SYS_CSPR2               CONFIG_SYS_NOR0_CSPR_EARLY
+#define CONFIG_SYS_CSPR2_FINAL         CONFIG_SYS_NOR0_CSPR
+#define CONFIG_SYS_AMASK2              CONFIG_SYS_NOR_AMASK
+#define CONFIG_SYS_CSOR2               CONFIG_SYS_NOR_CSOR
+#define CONFIG_SYS_CS2_FTIM0           CONFIG_SYS_NOR_FTIM0
+#define CONFIG_SYS_CS2_FTIM1           CONFIG_SYS_NOR_FTIM1
+#define CONFIG_SYS_CS2_FTIM2           CONFIG_SYS_NOR_FTIM2
+#define CONFIG_SYS_CS2_FTIM3           CONFIG_SYS_NOR_FTIM3
+#define CONFIG_SYS_CSPR0_EXT           CONFIG_SYS_NAND_CSPR_EXT
+#define CONFIG_SYS_CSPR0               CONFIG_SYS_NAND_CSPR
+#define CONFIG_SYS_AMASK0              CONFIG_SYS_NAND_AMASK
+#define CONFIG_SYS_CSOR0               CONFIG_SYS_NAND_CSOR
+#define CONFIG_SYS_CS0_FTIM0           CONFIG_SYS_NAND_FTIM0
+#define CONFIG_SYS_CS0_FTIM1           CONFIG_SYS_NAND_FTIM1
+#define CONFIG_SYS_CS0_FTIM2           CONFIG_SYS_NAND_FTIM2
+#define CONFIG_SYS_CS0_FTIM3           CONFIG_SYS_NAND_FTIM3
+
+#define CONFIG_ENV_IS_IN_NAND
+#define CONFIG_ENV_OFFSET              (2048 * 1024)
+#define CONFIG_ENV_SECT_SIZE           0x20000
+#define CONFIG_ENV_SIZE                        0x2000
+#define CONFIG_SPL_PAD_TO              0x80000
+#define CONFIG_SYS_NAND_U_BOOT_OFFS    (1024 * 1024)
+#define CONFIG_SYS_NAND_U_BOOT_SIZE    (512 * 1024)
+#else
+#define CONFIG_SYS_CSPR0_EXT           CONFIG_SYS_NOR0_CSPR_EXT
+#define CONFIG_SYS_CSPR0               CONFIG_SYS_NOR0_CSPR_EARLY
+#define CONFIG_SYS_CSPR0_FINAL         CONFIG_SYS_NOR0_CSPR
+#define CONFIG_SYS_AMASK0              CONFIG_SYS_NOR_AMASK
+#define CONFIG_SYS_CSOR0               CONFIG_SYS_NOR_CSOR
+#define CONFIG_SYS_CS0_FTIM0           CONFIG_SYS_NOR_FTIM0
+#define CONFIG_SYS_CS0_FTIM1           CONFIG_SYS_NOR_FTIM1
+#define CONFIG_SYS_CS0_FTIM2           CONFIG_SYS_NOR_FTIM2
+#define CONFIG_SYS_CS0_FTIM3           CONFIG_SYS_NOR_FTIM3
+#define CONFIG_SYS_CSPR2_EXT           CONFIG_SYS_NAND_CSPR_EXT
+#define CONFIG_SYS_CSPR2               CONFIG_SYS_NAND_CSPR
+#define CONFIG_SYS_AMASK2              CONFIG_SYS_NAND_AMASK
+#define CONFIG_SYS_CSOR2               CONFIG_SYS_NAND_CSOR
+#define CONFIG_SYS_CS2_FTIM0           CONFIG_SYS_NAND_FTIM0
+#define CONFIG_SYS_CS2_FTIM1           CONFIG_SYS_NAND_FTIM1
+#define CONFIG_SYS_CS2_FTIM2           CONFIG_SYS_NAND_FTIM2
+#define CONFIG_SYS_CS2_FTIM3           CONFIG_SYS_NAND_FTIM3
+
+#define CONFIG_ENV_IS_IN_FLASH
+#define CONFIG_ENV_ADDR                        (CONFIG_SYS_FLASH_BASE + 0x200000)
+#define CONFIG_ENV_SECT_SIZE           0x20000
+#define CONFIG_ENV_SIZE                        0x2000
+#endif
+
+/* Debug Server firmware */
+#define CONFIG_SYS_DEBUG_SERVER_FW_IN_NOR
+#define CONFIG_SYS_DEBUG_SERVER_FW_ADDR        0x580D00000ULL
+
+/* MC firmware */
+#define CONFIG_SYS_LS_MC_FW_IN_NOR
+#define CONFIG_SYS_LS_MC_FW_ADDR       0x580300000ULL
+
+#define CONFIG_SYS_LS_MC_DPL_IN_NOR
+#define CONFIG_SYS_LS_MC_DPL_ADDR      0x580700000ULL
+
+#define CONFIG_SYS_LS_MC_DPC_IN_NOR
+#define CONFIG_SYS_LS_MC_DPC_ADDR      0x580800000ULL
+
+#define CONFIG_SYS_LS_MC_BOOT_TIMEOUT_MS 5000
+
+/*
+ * I2C
+ */
+#define I2C_MUX_PCA_ADDR               0x77
+#define I2C_MUX_PCA_ADDR_PRI           0x77 /* Primary Mux*/
+
+/* I2C bus multiplexer */
+#define I2C_MUX_CH_DEFAULT      0x8
+
+/*
+ * RTC configuration
+ */
+#define RTC
+#define CONFIG_RTC_DS3231               1
+#define CONFIG_SYS_I2C_RTC_ADDR         0x68
+
+/* EEPROM */
+#define CONFIG_ID_EEPROM
+#define CONFIG_CMD_EEPROM
+#define CONFIG_SYS_I2C_EEPROM_NXID
+#define CONFIG_SYS_EEPROM_BUS_NUM      0
+#define CONFIG_SYS_I2C_EEPROM_ADDR     0x57
+#define CONFIG_SYS_I2C_EEPROM_ADDR_LEN 1
+#define CONFIG_SYS_EEPROM_PAGE_WRITE_BITS 3
+#define CONFIG_SYS_EEPROM_PAGE_WRITE_DELAY_MS 5
+
+#define CONFIG_FSL_MEMAC
+#define CONFIG_PCI             /* Enable PCIE */
+#define CONFIG_PCIE_LAYERSCAPE /* Use common FSL Layerscape PCIe code */
+
+#ifdef CONFIG_PCI
+#define CONFIG_NET_MULTI
+#define CONFIG_PCI_PNP
+#define CONFIG_E1000
+#define CONFIG_PCI_SCAN_SHOW
+#define CONFIG_CMD_PCI
+#define CONFIG_CMD_NET
+#endif
+
+/*  MMC  */
+#define CONFIG_MMC
+#ifdef CONFIG_MMC
+#define CONFIG_CMD_MMC
+#define CONFIG_FSL_ESDHC
+#define CONFIG_SYS_FSL_MMC_HAS_CAPBLT_VS33
+#define CONFIG_GENERIC_MMC
+#define CONFIG_CMD_FAT
+#define CONFIG_DOS_PARTITION
+#endif
+
+/* Initial environment variables */
+#undef CONFIG_EXTRA_ENV_SETTINGS
+#define CONFIG_EXTRA_ENV_SETTINGS              \
+       "hwconfig=fsl_ddr:bank_intlv=auto\0"    \
+       "loadaddr=0x80100000\0"                 \
+       "kernel_addr=0x100000\0"                \
+       "ramdisk_addr=0x800000\0"               \
+       "ramdisk_size=0x2000000\0"              \
+       "fdt_high=0xa0000000\0"                 \
+       "initrd_high=0xffffffffffffffff\0"      \
+       "kernel_start=0x581100000\0"            \
+       "kernel_load=0xa0000000\0"              \
+       "kernel_size=0x1000000\0"
+
+#endif /* __LS2_RDB_H */
index c133ba9d03f504eda7b7329abd1093fcb32388b5..c348d38c325ba309074a1e73e1348cf779bb1dd1 100644 (file)
 #ifdef CONFIG_CMD_I2C
 #define CONFIG_SYS_I2C
 #define CONFIG_SYS_I2C_MXC
+#define CONFIG_SYS_I2C_MXC_I2C3                /* enable I2C bus 3 */
 #define CONFIG_SYS_RTC_BUS_NUM         1 /* I2C2 */
 #endif
 
index f8cd39d74dd01b9af7ae962c3b69077faf228fc8..244a9ab56b94f0a861a8c5eac6e123436c1421b5 100644 (file)
@@ -42,6 +42,7 @@
  */
 #define CONFIG_SYS_I2C
 #define CONFIG_SYS_I2C_MXC
+#define CONFIG_SYS_I2C_MXC_I2C3                /* enable I2C bus 3 */
 #define CONFIG_MXC_SPI
 #define CONFIG_MXC_GPIO
 
index 9b003fc4e6d83dca69e043a857b7ae1197ba5e2f..7c3dc20bc3cfdc16a6f9c115a6763e1e7038cd2d 100644 (file)
@@ -48,6 +48,7 @@
 #define CONFIG_CMD_I2C
 #define CONFIG_SYS_I2C
 #define CONFIG_SYS_I2C_MXC
+#define CONFIG_SYS_I2C_MXC_I2C3                /* enable I2C bus 3 */
 
 /* MMC Configs */
 #define CONFIG_FSL_ESDHC
index fb2072d2f0f49b7fb2a7ee79e725a0dd20db0187..22a9fc4bab1ac5c30b6bced1414596e0f6c3b8d0 100644 (file)
@@ -41,6 +41,7 @@
 #define CONFIG_CMD_I2C
 #define CONFIG_SYS_I2C
 #define CONFIG_SYS_I2C_MXC
+#define CONFIG_SYS_I2C_MXC_I2C3                /* enable I2C bus 3 */
 
 /* PMIC Configs */
 #define CONFIG_POWER
index 3551e02276db9bb28800f0bfca18304a8470b900..a56e72e271150598ba40681c54972199bf00fd64 100644 (file)
@@ -76,6 +76,7 @@
 /* I2C Configs */
 #define CONFIG_SYS_I2C
 #define CONFIG_SYS_I2C_MXC
+#define CONFIG_SYS_I2C_MXC_I2C3                /* enable I2C bus 3 */
 
 /* PMIC Controller */
 #define CONFIG_POWER
index 3da0ef4bd0b9bc43d6e88fd6e8460ba3a653f8a8..0785491cf1e9f51283dc8cab5ba46776227f77a4 100644 (file)
@@ -38,6 +38,7 @@
 #define CONFIG_CMD_I2C
 #define CONFIG_SYS_I2C
 #define CONFIG_SYS_I2C_MXC
+#define CONFIG_SYS_I2C_MXC_I2C3                /* enable I2C bus 3 */
 
 /* MMC Configs */
 #define CONFIG_FSL_ESDHC
diff --git a/include/configs/mx6cuboxi.h b/include/configs/mx6cuboxi.h
new file mode 100644 (file)
index 0000000..b569f34
--- /dev/null
@@ -0,0 +1,218 @@
+/*
+ * Copyright (C) 2015 Freescale Semiconductor, Inc.
+ *
+ * Configuration settings for the SolidRun mx6 based boards
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+#ifndef __MX6CUBOXI_CONFIG_H
+#define __MX6CUBOXI_CONFIG_H
+
+#include <linux/sizes.h>
+#include <asm/arch/imx-regs.h>
+#include <asm/imx-common/gpio.h>
+#include "mx6_common.h"
+
+#define CONFIG_MX6
+#define CONFIG_SPL_LIBCOMMON_SUPPORT
+#define CONFIG_SPL_MMC_SUPPORT
+#include "imx6_spl.h"
+
+#define CONFIG_DISPLAY_CPUINFO
+#define CONFIG_DISPLAY_BOARDINFO
+#define CONFIG_CMDLINE_TAG
+#define CONFIG_SETUP_MEMORY_TAGS
+#define CONFIG_INITRD_TAG
+#define CONFIG_REVISION_TAG
+#define CONFIG_IMX6_THERMAL
+#define CONFIG_SYS_GENERIC_BOARD
+
+#define CONFIG_SYS_MALLOC_LEN          (2 * SZ_1M)
+#define CONFIG_BOARD_EARLY_INIT_F
+#define CONFIG_BOARD_LATE_INIT
+#define CONFIG_MXC_GPIO
+#define CONFIG_MXC_UART
+#define CONFIG_CMD_FUSE
+#define CONFIG_MXC_OCOTP
+
+/* MMC Configs */
+#define CONFIG_FSL_ESDHC
+#define CONFIG_FSL_USDHC
+#define CONFIG_SYS_FSL_ESDHC_ADDR      USDHC2_BASE_ADDR
+#define CONFIG_MMC
+#define CONFIG_CMD_MMC
+#define CONFIG_GENERIC_MMC
+#define CONFIG_BOUNCE_BUFFER
+#define CONFIG_CMD_EXT4
+#define CONFIG_CMD_EXT4_WRITE
+#define CONFIG_CMD_FAT
+#define CONFIG_DOS_PARTITION
+
+/* Ethernet Configuration */
+#define CONFIG_FEC_MXC
+#define CONFIG_CMD_PING
+#define CONFIG_CMD_DHCP
+#define CONFIG_CMD_MII
+#define CONFIG_CMD_NET
+#define CONFIG_MII
+#define IMX_FEC_BASE                   ENET_BASE_ADDR
+#define CONFIG_FEC_XCV_TYPE            RGMII
+#define CONFIG_FEC_MXC_PHYADDR         0
+#define CONFIG_PHYLIB
+#define CONFIG_PHY_ATHEROS
+
+/* allow to overwrite serial and ethaddr */
+#define CONFIG_ENV_OVERWRITE
+#define CONFIG_CONS_INDEX              1
+#define CONFIG_BAUDRATE                        115200
+
+#define CONFIG_SYS_NO_FLASH
+
+/* Command definition */
+#include <config_cmd_default.h>
+
+#define CONFIG_CMD_BOOTZ
+#define CONFIG_CMD_SETEXPR
+
+#define CONFIG_BOOTDELAY               1
+
+#define CONFIG_LOADADDR                        0x12000000
+#define CONFIG_SYS_TEXT_BASE           0x17800000
+
+#define CONFIG_MXC_UART_BASE   UART1_BASE
+#define CONFIG_CONSOLE_DEV     "ttymxc0"
+#define CONFIG_MMCROOT         "/dev/mmcblk0p2"
+#define CONFIG_SYS_FSL_USDHC_NUM       1
+#define CONFIG_SYS_MMC_ENV_DEV         0       /* SDHC2 */
+
+#define CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG
+#define CONFIG_EXTRA_ENV_SETTINGS \
+       "script=boot.scr\0" \
+       "image=zImage\0" \
+       "fdtfile=undefined\0" \
+       "fdt_addr_r=0x18000000\0" \
+       "boot_fdt=try\0" \
+       "ip_dyn=yes\0" \
+       "console=" CONFIG_CONSOLE_DEV "\0" \
+       "bootm_size=0x10000000\0" \
+       "mmcdev=" __stringify(CONFIG_SYS_MMC_ENV_DEV) "\0" \
+       "mmcpart=1\0" \
+       "mmcroot=" CONFIG_MMCROOT " rootwait rw\0" \
+       "update_sd_firmware=" \
+               "if test ${ip_dyn} = yes; then " \
+                       "setenv get_cmd dhcp; " \
+               "else " \
+                       "setenv get_cmd tftp; " \
+               "fi; " \
+               "if mmc dev ${mmcdev}; then "   \
+                       "if ${get_cmd} ${update_sd_firmware_filename}; then " \
+                               "setexpr fw_sz ${filesize} / 0x200; " \
+                               "setexpr fw_sz ${fw_sz} + 1; "  \
+                               "mmc write ${loadaddr} 0x2 ${fw_sz}; " \
+                       "fi; "  \
+               "fi\0" \
+       "mmcargs=setenv bootargs console=${console},${baudrate} " \
+               "root=${mmcroot}\0" \
+       "loadbootscript=" \
+               "fatload mmc ${mmcdev}:${mmcpart} ${loadaddr} ${script};\0" \
+       "bootscript=echo Running bootscript from mmc ...; " \
+               "source\0" \
+       "loadimage=fatload mmc ${mmcdev}:${mmcpart} ${loadaddr} ${image}\0" \
+       "loadfdt=fatload mmc ${mmcdev}:${mmcpart} ${fdt_addr_r} ${fdtfile}\0" \
+       "mmcboot=echo Booting from mmc ...; " \
+               "run mmcargs; " \
+               "if test ${boot_fdt} = yes || test ${boot_fdt} = try; then " \
+                       "if run loadfdt; then " \
+                               "bootz ${loadaddr} - ${fdt_addr_r}; " \
+                       "else " \
+                               "if test ${boot_fdt} = try; then " \
+                                       "bootz; " \
+                               "else " \
+                                       "echo WARN: Cannot load the DT; " \
+                               "fi; " \
+                       "fi; " \
+               "else " \
+                       "bootz; " \
+               "fi;\0" \
+       "netargs=setenv bootargs console=${console},${baudrate} " \
+               "root=/dev/nfs " \
+               "ip=dhcp nfsroot=${serverip}:${nfsroot},v3,tcp\0" \
+       "netboot=echo Booting from net ...; " \
+               "run netargs; " \
+               "if test ${ip_dyn} = yes; then " \
+                       "setenv get_cmd dhcp; " \
+               "else " \
+                       "setenv get_cmd tftp; " \
+               "fi; " \
+               "${get_cmd} ${image}; " \
+               "if test ${boot_fdt} = yes || test ${boot_fdt} = try; then " \
+                       "if ${get_cmd} ${fdt_addr_r} ${fdtfile}; then " \
+                               "bootz ${loadaddr} - ${fdt_addr_r}; " \
+                       "else " \
+                               "if test ${boot_fdt} = try; then " \
+                                       "bootz; " \
+                               "else " \
+                                       "echo WARN: Cannot load the DT; " \
+                               "fi; " \
+                       "fi; " \
+               "else " \
+                       "bootz; " \
+               "fi;\0" \
+       "findfdt="\
+               "if test $board_name = HUMMINGBOARD && test $board_rev = MX6Q ; then " \
+                       "setenv fdtfile imx6q-hummingboard.dtb; fi; " \
+               "if test $board_name = HUMMINGBOARD && test $board_rev = MX6DL ; then " \
+                       "setenv fdtfile imx6dl-hummingboard.dtb; fi; " \
+               "if test $board_name = CUBOXI && test $board_rev = MX6Q ; then " \
+                       "setenv fdtfile imx6q-cubox-i.dtb; fi; " \
+               "if test $board_name = CUBOXI && test $board_rev = MX6DL ; then " \
+                       "setenv fdtfile imx6dl-cubox-i.dtb; fi; " \
+               "if test $fdtfile = undefined; then " \
+                       "echo WARNING: Could not determine dtb to use; fi; \0" \
+
+#define CONFIG_BOOTCOMMAND \
+       "run findfdt; " \
+       "mmc dev ${mmcdev};" \
+       "if mmc rescan; then " \
+               "if run loadbootscript; then " \
+               "run bootscript; " \
+               "else " \
+                       "if run loadimage; then " \
+                               "run mmcboot; " \
+                       "else run netboot; " \
+                       "fi; " \
+               "fi; " \
+       "else run netboot; fi"
+
+/* Miscellaneous configurable options */
+#define CONFIG_SYS_LONGHELP
+#define CONFIG_SYS_HUSH_PARSER
+#define CONFIG_AUTO_COMPLETE
+#define CONFIG_SYS_CBSIZE              256
+#define CONFIG_SYS_MAXARGS             16
+#define CONFIG_SYS_BARGSIZE CONFIG_SYS_CBSIZE
+
+#define CONFIG_SYS_LOAD_ADDR           CONFIG_LOADADDR
+
+#define CONFIG_CMDLINE_EDITING
+
+/* Physical Memory Map */
+#define CONFIG_NR_DRAM_BANKS           1
+#define CONFIG_SYS_SDRAM_BASE          MMDC0_ARB_BASE_ADDR
+#define CONFIG_SYS_INIT_RAM_ADDR       IRAM_BASE_ADDR
+#define CONFIG_SYS_INIT_RAM_SIZE       IRAM_SIZE
+
+#define CONFIG_SYS_INIT_SP_OFFSET \
+       (CONFIG_SYS_INIT_RAM_SIZE - GENERATED_GBL_DATA_SIZE)
+#define CONFIG_SYS_INIT_SP_ADDR \
+       (CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_INIT_SP_OFFSET)
+
+/* Environment organization */
+#define CONFIG_ENV_SIZE                        (8 * 1024)
+#define CONFIG_ENV_IS_IN_MMC
+#define CONFIG_ENV_OFFSET              (8 * 64 * 1024)
+
+#define CONFIG_OF_LIBFDT
+#define CONFIG_CMD_CACHE
+
+#endif                         /* __MX6CUBOXI_CONFIG_H */
index 51042ca72e54b7b8e2e1084ac2e96ed9da9615ff..22603442d73f79903434584f7c68e7129585c3b1 100644 (file)
@@ -56,6 +56,7 @@
 #define CONFIG_CMD_I2C
 #define CONFIG_SYS_I2C
 #define CONFIG_SYS_I2C_MXC
+#define CONFIG_SYS_I2C_MXC_I2C3                /* enable I2C bus 3 */
 #define CONFIG_SYS_I2C_SPEED           100000
 
 /* NAND flash command */
index 99d9d4d7cfbf5a5c54de344f7fec4ec84c92fa89..dab2fd2ea2b399808580ebd2802cc38a9f383c06 100644 (file)
@@ -52,6 +52,7 @@
 #define CONFIG_CMD_I2C
 #define CONFIG_SYS_I2C
 #define CONFIG_SYS_I2C_MXC
+#define CONFIG_SYS_I2C_MXC_I2C3                /* enable I2C bus 3 */
 #define CONFIG_SYS_I2C_SPEED             100000
 
 /* PMIC */
index dad49f96df4cd75e9eac4eff55c1ec2607597b2a..cd023de287dfee998da09edcca20b2ac663c1e80 100644 (file)
@@ -52,6 +52,7 @@
 #define CONFIG_CMD_I2C
 #define CONFIG_SYS_I2C
 #define CONFIG_SYS_I2C_MXC
+#define CONFIG_SYS_I2C_MXC_I2C3                /* enable I2C bus 3 */
 #define CONFIG_SYS_I2C_SPEED             100000
 
 /* PMIC */
index a29d62f023a0ecd9ba4f4de9a1dc8b6a85058fc1..248303c3211f0bf78a714072280223d8e8f003d9 100644 (file)
 #define CONFIG_CMD_I2C
 #define CONFIG_SYS_I2C
 #define CONFIG_SYS_I2C_MXC
+#define CONFIG_SYS_I2C_MXC_I2C3                /* enable I2C bus 3 */
 #define CONFIG_SYS_I2C_SPEED             100000
 
 /* PMIC */
index 8ef4b733ca43e93fa67fea79d00c271cbff2984b..eaa2c2cd363d4ec4c5713187ad7b8ee0b4080f61 100644 (file)
@@ -63,6 +63,7 @@
 #define CONFIG_CMD_I2C
 #define CONFIG_SYS_I2C
 #define CONFIG_SYS_I2C_MXC
+#define CONFIG_SYS_I2C_MXC_I2C3                /* enable I2C bus 3 */
 #define CONFIG_SYS_I2C_SPEED           100000
 #define CONFIG_I2C_EDID
 
 #define CONFIG_SYS_CONSOLE_OVERWRITE_ROUTINE
 #define CONFIG_VIDEO_BMP_RLE8
 #define CONFIG_SPLASH_SCREEN
+#define CONFIG_SPLASH_SCREEN_ALIGN
+#define CONFIG_VIDEO_BMP_GZIP
+#define CONFIG_SYS_VIDEO_LOGO_MAX_SIZE (6 * 1024 * 1024)
 #define CONFIG_BMP_16BPP
 #define CONFIG_IPUV3_CLK 260000000
 #define CONFIG_CMD_HDMIDETECT
index 3809c6c59b39b3264920b52d633508ea827d54d9..5f834690f3bb0182b4d280a485e68318d3568534 100644 (file)
 /* I2C */
 #define CONFIG_SYS_I2C
 #define CONFIG_SYS_I2C_MXC
+#define CONFIG_SYS_I2C_MXC_I2C3                /* enable I2C bus 3 */
 #define CONFIG_I2C_MULTI_BUS
 #define CONFIG_I2C_MXC
 #define CONFIG_SYS_I2C_SPEED           100000
diff --git a/include/configs/omapl138_lcdk.h b/include/configs/omapl138_lcdk.h
new file mode 100644 (file)
index 0000000..68b4010
--- /dev/null
@@ -0,0 +1,330 @@
+/*
+ * Copyright (C) 2010 Texas Instruments Incorporated - http://www.ti.com/
+ *
+ * Based on davinci_dvevm.h. Original Copyrights follow:
+ *
+ * Copyright (C) 2007 Sergey Kubushyn <ksi@koi8.net>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#ifndef __CONFIG_H
+#define __CONFIG_H
+
+/*
+ * Board
+ */
+#define CONFIG_DRIVER_TI_EMAC
+#undef CONFIG_USE_SPIFLASH
+#undef CONFIG_SYS_USE_NOR
+#define        CONFIG_USE_NAND
+
+/*
+ * SoC Configuration
+ */
+#define CONFIG_MACH_OMAPL138_LCDK
+#define CONFIG_ARM926EJS               /* arm926ejs CPU core */
+#define CONFIG_SOC_DA8XX               /* TI DA8xx SoC */
+#define CONFIG_SYS_CLK_FREQ            clk_get(DAVINCI_ARM_CLKID)
+#define CONFIG_SYS_OSCIN_FREQ          24000000
+#define CONFIG_SYS_TIMERBASE           DAVINCI_TIMER0_BASE
+#define CONFIG_SYS_HZ_CLOCK            clk_get(DAVINCI_AUXCLK_CLKID)
+#define CONFIG_SYS_HZ                  1000
+#define CONFIG_SKIP_LOWLEVEL_INIT
+#define CONFIG_SYS_TEXT_BASE           0xc1080000
+
+/*
+ * Memory Info
+ */
+#define CONFIG_SYS_MALLOC_LEN  (0x10000 + 1*1024*1024) /* malloc() len */
+#define PHYS_SDRAM_1           DAVINCI_DDR_EMIF_DATA_BASE /* DDR Start */
+#define PHYS_SDRAM_1_SIZE      (128 << 20) /* SDRAM size 128MB */
+#define CONFIG_MAX_RAM_BANK_SIZE (512 << 20) /* max size from SPRS586*/
+
+/* memtest start addr */
+#define CONFIG_SYS_MEMTEST_START       (PHYS_SDRAM_1 + 0x2000000)
+
+/* memtest will be run on 16MB */
+#define CONFIG_SYS_MEMTEST_END         (PHYS_SDRAM_1 + 0x2000000 + 16*1024*1024)
+
+#define CONFIG_NR_DRAM_BANKS   1 /* we have 1 bank of DRAM */
+#define CONFIG_STACKSIZE       (256*1024) /* regular stack */
+
+#define CONFIG_SYS_DA850_SYSCFG_SUSPSRC (      \
+       DAVINCI_SYSCFG_SUSPSRC_TIMER0 |         \
+       DAVINCI_SYSCFG_SUSPSRC_SPI1 |           \
+       DAVINCI_SYSCFG_SUSPSRC_UART2 |          \
+       DAVINCI_SYSCFG_SUSPSRC_EMAC |           \
+       DAVINCI_SYSCFG_SUSPSRC_I2C)
+
+/*
+ * PLL configuration
+ */
+#define CONFIG_SYS_DV_CLKMODE          0
+#define CONFIG_SYS_DA850_PLL0_POSTDIV  1
+#define CONFIG_SYS_DA850_PLL0_PLLDIV1  0x8000
+#define CONFIG_SYS_DA850_PLL0_PLLDIV2  0x8001
+#define CONFIG_SYS_DA850_PLL0_PLLDIV3  0x8002
+#define CONFIG_SYS_DA850_PLL0_PLLDIV4  0x8003
+#define CONFIG_SYS_DA850_PLL0_PLLDIV5  0x8002
+#define CONFIG_SYS_DA850_PLL0_PLLDIV6  CONFIG_SYS_DA850_PLL0_PLLDIV1
+#define CONFIG_SYS_DA850_PLL0_PLLDIV7  0x8005
+
+#define CONFIG_SYS_DA850_PLL1_POSTDIV  1
+#define CONFIG_SYS_DA850_PLL1_PLLDIV1  0x8000
+#define CONFIG_SYS_DA850_PLL1_PLLDIV2  0x8001
+#define CONFIG_SYS_DA850_PLL1_PLLDIV3  0x8003
+
+#define CONFIG_SYS_DA850_PLL0_PLLM     24
+#define CONFIG_SYS_DA850_PLL1_PLLM     21
+
+/*
+ * Serial Driver info
+ */
+#define CONFIG_SYS_NS16550
+#define CONFIG_SYS_NS16550_SERIAL
+#define CONFIG_SYS_NS16550_REG_SIZE    -4      /* NS16550 register size */
+#define CONFIG_SYS_NS16550_COM1        DAVINCI_UART2_BASE /* Base address of UART2 */
+#define CONFIG_SYS_NS16550_CLK clk_get(DAVINCI_UART2_CLKID)
+#define CONFIG_CONS_INDEX      1               /* use UART0 for console */
+#define CONFIG_BAUDRATE                115200          /* Default baud rate */
+#define CONFIG_SYS_BAUDRATE_TABLE      { 9600, 19200, 38400, 57600, 115200 }
+
+#define CONFIG_SPI
+#define CONFIG_SPI_FLASH
+#define CONFIG_SPI_FLASH_STMICRO
+#define CONFIG_SPI_FLASH_WINBOND
+#define CONFIG_DAVINCI_SPI
+#define CONFIG_SYS_SPI_BASE            DAVINCI_SPI1_BASE
+#define CONFIG_SYS_SPI_CLK             clk_get(DAVINCI_SPI1_CLKID)
+#define CONFIG_SF_DEFAULT_SPEED                30000000
+#define CONFIG_ENV_SPI_MAX_HZ  CONFIG_SF_DEFAULT_SPEED
+
+#ifdef CONFIG_USE_SPIFLASH
+#define CONFIG_SPL_SPI_SUPPORT
+#define CONFIG_SPL_SPI_FLASH_SUPPORT
+#define CONFIG_SPL_SPI_LOAD
+#define CONFIG_SYS_SPI_U_BOOT_OFFS     0x8000
+#define CONFIG_SYS_SPI_U_BOOT_SIZE     0x30000
+#endif
+
+/*
+ * I2C Configuration
+ */
+#define CONFIG_SYS_I2C
+#define CONFIG_SYS_I2C_DAVINCI
+#define CONFIG_SYS_DAVINCI_I2C_SPEED   25000
+#define CONFIG_SYS_DAVINCI_I2C_SLAVE   10 /* Bogus, master-only in U-Boot */
+#define CONFIG_SYS_I2C_EXPANDER_ADDR   0x20
+
+/*
+ * Flash & Environment
+ */
+#ifdef CONFIG_USE_NAND
+#undef CONFIG_ENV_IS_IN_FLASH
+#define CONFIG_NAND_DAVINCI
+#define CONFIG_SYS_NO_FLASH
+#define CONFIG_ENV_IS_IN_NAND          /* U-Boot env in NAND Flash  */
+#define CONFIG_ENV_OFFSET              0x0 /* Block 0--not used by bootcode */
+#define CONFIG_ENV_SIZE                        (128 << 9)
+#define        CONFIG_SYS_NAND_USE_FLASH_BBT
+#define CONFIG_SYS_NAND_4BIT_HW_ECC_OOBFIRST
+#define        CONFIG_SYS_NAND_PAGE_2K
+#define        CONFIG_SYS_NAND_BUSWIDTH_16_BIT
+#define CONFIG_SYS_NAND_CS             3
+#define CONFIG_SYS_NAND_BASE           DAVINCI_ASYNC_EMIF_DATA_CE3_BASE
+#define CONFIG_SYS_CLE_MASK            0x10
+#define CONFIG_SYS_ALE_MASK            0x8
+#undef CONFIG_SYS_NAND_HW_ECC
+#define CONFIG_SYS_MAX_NAND_DEVICE     1 /* Max number of NAND devices */
+#define NAND_MAX_CHIPS                 1
+#endif
+
+#ifdef CONFIG_SYS_USE_NOR
+#define CONFIG_ENV_IS_IN_FLASH
+#undef CONFIG_SYS_NO_FLASH
+#define CONFIG_FLASH_CFI_DRIVER
+#define CONFIG_SYS_FLASH_CFI
+#define CONFIG_SYS_FLASH_PROTECTION
+#define CONFIG_SYS_MAX_FLASH_BANKS     1 /* max number of flash banks */
+#define CONFIG_SYS_FLASH_SECT_SZ       (128 << 10) /* 128KB */
+#define CONFIG_ENV_OFFSET              (CONFIG_SYS_FLASH_SECT_SZ * 3)
+#define CONFIG_ENV_SIZE                        (128 << 10)
+#define CONFIG_SYS_FLASH_BASE          DAVINCI_ASYNC_EMIF_DATA_CE2_BASE
+#define PHYS_FLASH_SIZE                        (8 << 20) /* Flash size 8MB */
+#define CONFIG_SYS_MAX_FLASH_SECT ((PHYS_FLASH_SIZE/CONFIG_SYS_FLASH_SECT_SZ)\
+              + 3)
+#define CONFIG_ENV_SECT_SIZE           CONFIG_SYS_FLASH_SECT_SZ
+#endif
+
+#ifdef CONFIG_USE_SPIFLASH
+#undef CONFIG_ENV_IS_IN_FLASH
+#undef CONFIG_ENV_IS_IN_NAND
+#define CONFIG_ENV_IS_IN_SPI_FLASH
+#define CONFIG_ENV_SIZE                        (64 << 10)
+#define CONFIG_ENV_OFFSET              (256 << 10)
+#define CONFIG_ENV_SECT_SIZE           (64 << 10)
+#define CONFIG_SYS_NO_FLASH
+#endif
+
+/*
+ * Network & Ethernet Configuration
+ */
+#ifdef CONFIG_DRIVER_TI_EMAC
+#define CONFIG_EMAC_MDIO_PHY_NUM       7
+#define CONFIG_MII
+#undef CONFIG_DRIVER_TI_EMAC_USE_RMII
+#define CONFIG_BOOTP_DEFAULT
+#define CONFIG_BOOTP_DNS
+#define CONFIG_BOOTP_DNS2
+#define CONFIG_BOOTP_SEND_HOSTNAME
+#define CONFIG_NET_RETRY_COUNT 10
+#define CONFIG_NET_MULTI
+#endif
+
+/*
+ * U-Boot general configuration
+ */
+#define CONFIG_SYS_GENERIC_BOARD
+#define CONFIG_MISC_INIT_R
+#define CONFIG_BOARD_EARLY_INIT_F
+#define CONFIG_BOOTFILE                "uImage" /* Boot file name */
+#define CONFIG_SYS_PROMPT      "U-Boot > " /* Command Prompt */
+#define CONFIG_SYS_CBSIZE      1024 /* Console I/O Buffer Size */
+#define CONFIG_SYS_PBSIZE      (CONFIG_SYS_CBSIZE+sizeof(CONFIG_SYS_PROMPT)+16)
+#define CONFIG_SYS_MAXARGS     16 /* max number of command args */
+#define CONFIG_SYS_BARGSIZE    CONFIG_SYS_CBSIZE /* Boot Args Buffer Size */
+#define CONFIG_SYS_LOAD_ADDR   (PHYS_SDRAM_1 + 0x700000)
+#define CONFIG_VERSION_VARIABLE
+#define CONFIG_AUTO_COMPLETE
+#define CONFIG_SYS_HUSH_PARSER
+#define CONFIG_SYS_PROMPT_HUSH_PS2     "> "
+#define CONFIG_CMDLINE_EDITING
+#define CONFIG_SYS_LONGHELP
+#define CONFIG_CRC32_VERIFY
+#define CONFIG_MX_CYCLIC
+#define CONFIG_OF_LIBFDT
+
+/*
+ * Linux Information
+ */
+#define LINUX_BOOT_PARAM_ADDR  (PHYS_SDRAM_1 + 0x100)
+#define CONFIG_CMDLINE_TAG
+#define CONFIG_REVISION_TAG
+#define CONFIG_SETUP_MEMORY_TAGS
+#define CONFIG_BOOTARGS                "console=ttyS2,115200n8 root=/dev/mmcblk0p2 rw rootwait ip=off"
+#define CONFIG_BOOTCOMMAND     "if mmc rescan 0; then if fatload mmc 0 0xc0600000 boot.scr; then source 0xc0600000; else fatload mmc 0 0xc0700000 uImage; bootm c0700000; fi; else sf probe 0; sf read 0xc0700000 0x80000 0x220000; bootm 0xc0700000; fi"
+#define CONFIG_BOOTDELAY       3
+
+/*
+ * U-Boot commands
+ */
+#include <config_cmd_default.h>
+#define CONFIG_CMD_ENV
+#define CONFIG_CMD_ASKENV
+#define CONFIG_CMD_DHCP
+#define CONFIG_CMD_DIAG
+#define CONFIG_CMD_MII
+#define CONFIG_CMD_PING
+#define CONFIG_CMD_SAVES
+#define CONFIG_CMD_MEMORY
+#ifdef CONFIG_CMD_BDI
+#define CONFIG_CLOCKS
+#endif
+
+#ifndef CONFIG_DRIVER_TI_EMAC
+#undef CONFIG_CMD_NET
+#undef CONFIG_CMD_DHCP
+#undef CONFIG_CMD_MII
+#undef CONFIG_CMD_PING
+#endif
+
+#ifdef CONFIG_USE_NAND
+#undef CONFIG_CMD_FLASH
+#undef CONFIG_CMD_IMLS
+#define CONFIG_CMD_NAND
+
+#define CONFIG_CMD_MTDPARTS
+#define CONFIG_MTD_DEVICE
+#define CONFIG_MTD_PARTITIONS
+#define CONFIG_LZO
+#define CONFIG_RBTREE
+#define CONFIG_CMD_UBI
+#define CONFIG_CMD_UBIFS
+#endif
+
+#ifdef CONFIG_USE_SPIFLASH
+#undef CONFIG_CMD_IMLS
+#undef CONFIG_CMD_FLASH
+#define CONFIG_CMD_SPI
+#define CONFIG_CMD_SF
+#define CONFIG_CMD_SAVEENV
+#endif
+
+#if !defined(CONFIG_USE_NAND) && \
+       !defined(CONFIG_SYS_USE_NOR) && \
+       !defined(CONFIG_USE_SPIFLASH)
+#define CONFIG_ENV_IS_NOWHERE
+#define CONFIG_SYS_NO_FLASH
+#define CONFIG_ENV_SIZE                (16 << 10)
+#undef CONFIG_CMD_IMLS
+#undef CONFIG_CMD_ENV
+#endif
+
+/* SD/MMC */
+#define CONFIG_MMC
+#define CONFIG_GENERIC_MMC
+#define CONFIG_DAVINCI_MMC
+
+#ifdef CONFIG_MMC
+#define CONFIG_DOS_PARTITION
+#define CONFIG_CMD_EXT2
+#define CONFIG_CMD_FAT
+#define CONFIG_CMD_MMC
+#undef CONFIG_ENV_IS_IN_MMC
+#endif
+
+#ifdef CONFIG_ENV_IS_IN_MMC
+#undef CONFIG_ENV_SIZE
+#undef CONFIG_ENV_OFFSET
+#define CONFIG_ENV_SIZE                (16 << 10)      /* 16 KiB */
+#define CONFIG_ENV_OFFSET      (51 << 9)       /* Sector 51 */
+#undef CONFIG_ENV_IS_IN_FLASH
+#undef CONFIG_ENV_IS_IN_NAND
+#undef CONFIG_ENV_IS_IN_SPI_FLASH
+#endif
+
+#ifndef CONFIG_DIRECT_NOR_BOOT
+/* defines for SPL */
+#define CONFIG_SPL_FRAMEWORK
+#define CONFIG_SPL_BOARD_INIT
+#define CONFIG_SYS_SPL_MALLOC_START    (CONFIG_SYS_TEXT_BASE - \
+                                               CONFIG_SYS_MALLOC_LEN)
+#define CONFIG_SYS_SPL_MALLOC_SIZE     CONFIG_SYS_MALLOC_LEN
+#define CONFIG_SPL_SERIAL_SUPPORT
+#define CONFIG_SPL_LIBCOMMON_SUPPORT
+#define CONFIG_SPL_LIBGENERIC_SUPPORT
+#define CONFIG_SPL_LDSCRIPT    "board/$(BOARDDIR)/u-boot-spl-da850evm.lds"
+#define CONFIG_SPL_STACK       0x8001ff00
+#define CONFIG_SPL_TEXT_BASE   0x80000000
+#define CONFIG_SPL_MAX_FOOTPRINT       32768
+#define CONFIG_SPL_PAD_TO      32768
+#endif
+
+/* additions for new relocation code, must added to all boards */
+#define CONFIG_SYS_SDRAM_BASE          0xc0000000
+#define CONFIG_SYS_INIT_SP_ADDR                (CONFIG_SYS_SDRAM_BASE + 0x1000 - /* Fix this */ \
+                                       GENERATED_GBL_DATA_SIZE)
+#endif /* __CONFIG_H */
index 3c60b4f12b9a0735f0d06496abb2e6b64b6dd97d..200f40af31b5348e63b88f440730bfa87d4273ce 100644 (file)
@@ -62,6 +62,7 @@
 #define CONFIG_CMD_I2C
 #define CONFIG_SYS_I2C
 #define CONFIG_SYS_I2C_MXC
+#define CONFIG_SYS_I2C_MXC_I2C3                /* enable I2C bus 3 */
 #define CONFIG_SYS_I2C_SPEED            100000
 
 /* OCOTP Configs */
index 134bb45887aba2f28df53c6cb8838e3abc017fc4..91ffc7c068b5d3f237c965a13396df4a39cee40c 100644 (file)
@@ -62,6 +62,7 @@
 /* I2C config */
 #define CONFIG_SYS_I2C
 #define CONFIG_SYS_I2C_MXC
+#define CONFIG_SYS_I2C_MXC_I2C3                /* enable I2C bus 3 */
 #define CONFIG_SYS_I2C_SPEED                   100000
 
 /* MMC config */
index 763a47ac3dc445566d214ddb69de70928818d5ea..70718497fb36f1a2c8062b40cbdae0d45dc0ca28 100644 (file)
 /* Physical address should be a function call */
 #ifndef __ASSEMBLY__
 extern unsigned long long get_phys_ccsrbar_addr_early(void);
+#define CONFIG_SYS_CCSRBAR_PHYS_HIGH (get_phys_ccsrbar_addr_early() >> 32)
+#define CONFIG_SYS_CCSRBAR_PHYS_LOW get_phys_ccsrbar_addr_early()
+#else
+#define CONFIG_SYS_CCSRBAR_PHYS_HIGH 0x0
+#define CONFIG_SYS_CCSRBAR_PHYS_LOW CONFIG_SYS_CCSRBAR
 #endif
-#define CONFIG_SYS_CCSR_DO_NOT_RELOCATE
+
+#define CONFIG_PHYS_64BIT
 
 /* Virtual address range for PCI region maps */
 #define CONFIG_SYS_PCI_MAP_START       0x80000000
diff --git a/include/configs/stm32f429-discovery.h b/include/configs/stm32f429-discovery.h
new file mode 100644 (file)
index 0000000..7f569fd
--- /dev/null
@@ -0,0 +1,106 @@
+/*
+ * (C) Copyright 2015
+ * Kamil Lulko, <rev13@wp.pl>
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#ifndef __CONFIG_H
+#define __CONFIG_H
+
+#define CONFIG_STM32F4
+#define CONFIG_STM32F4DISCOVERY
+#define CONFIG_SYS_GENERIC_BOARD
+
+#define CONFIG_OF_LIBFDT
+
+#define CONFIG_BOARD_EARLY_INIT_F
+
+#define CONFIG_SYS_FLASH_BASE          0x08000000
+
+#define CONFIG_SYS_INIT_SP_ADDR                0x10010000
+#define CONFIG_SYS_TEXT_BASE           0x08000000
+
+#define CONFIG_SYS_ICACHE_OFF
+#define CONFIG_SYS_DCACHE_OFF
+
+/*
+ * Configuration of the external SDRAM memory
+ */
+#define CONFIG_NR_DRAM_BANKS           1
+#define CONFIG_SYS_RAM_SIZE            (8 << 20)
+#define CONFIG_SYS_RAM_CS              1
+#define CONFIG_SYS_RAM_FREQ_DIV                2
+#define CONFIG_SYS_RAM_BASE            0xD0000000
+#define CONFIG_SYS_SDRAM_BASE          CONFIG_SYS_RAM_BASE
+#define CONFIG_SYS_LOAD_ADDR           0xD0400000
+#define CONFIG_LOADADDR                        0xD0400000
+
+#define CONFIG_SYS_MAX_FLASH_SECT      12
+#define CONFIG_SYS_MAX_FLASH_BANKS     2
+
+#define CONFIG_ENV_IS_IN_FLASH
+#define CONFIG_ENV_OFFSET              (256 << 10)
+#define CONFIG_ENV_SECT_SIZE           (128 << 10)
+#define CONFIG_ENV_SIZE                        (8 << 10)
+
+#define CONFIG_BOARD_SPECIFIC_LED
+#define CONFIG_RED_LED                 110
+#define CONFIG_GREEN_LED               109
+
+#define CONFIG_STM32_GPIO
+#define CONFIG_STM32_SERIAL
+
+#define CONFIG_STM32_USART1
+
+#define CONFIG_STM32_HSE_HZ            8000000
+
+#define CONFIG_SYS_HZ_CLOCK            1000000 /* Timer is clocked at 1MHz */
+
+#define CONFIG_CMDLINE_TAG
+#define CONFIG_SETUP_MEMORY_TAGS
+#define CONFIG_INITRD_TAG
+#define CONFIG_REVISION_TAG
+
+#define CONFIG_SYS_CBSIZE              1024
+#define CONFIG_SYS_PBSIZE              (CONFIG_SYS_CBSIZE \
+                                       + sizeof(CONFIG_SYS_PROMPT) + 16)
+
+#define CONFIG_SYS_MAXARGS             16
+
+#define CONFIG_SYS_MALLOC_LEN          (2 << 20)
+
+#define CONFIG_STACKSIZE               (64 << 10)
+
+#define CONFIG_BAUDRATE                        115200
+#define CONFIG_BOOTARGS                                                        \
+       "console=ttystm0,115200 earlyprintk consoleblank=0 ignore_loglevel"
+#define CONFIG_BOOTCOMMAND                                             \
+       "run bootcmd_romfs"
+
+#define CONFIG_EXTRA_ENV_SETTINGS \
+       "bootargs_romfs=uclinux.physaddr=0x08180000 root=/dev/mtdblock0\0" \
+       "bootcmd_romfs=setenv bootargs ${bootargs} ${bootargs_romfs};" \
+       "bootm 0x08044000 - 0x08042000\0"
+
+#define CONFIG_BOOTDELAY               3
+#define CONFIG_AUTOBOOT
+
+/*
+ * Command line configuration.
+ */
+#include <config_cmd_default.h>
+
+#define CONFIG_SYS_LONGHELP
+#define CONFIG_SYS_HUSH_PARSER
+#define CONFIG_SYS_PROMPT             "U-Boot > "
+#define CONFIG_AUTO_COMPLETE
+#define CONFIG_CMDLINE_EDITING
+
+#define CONFIG_CMD_FLASH
+#define CONFIG_CMD_SAVEENV
+#define CONFIG_CMD_MEM
+#define CONFIG_CMD_MISC
+#define CONFIG_CMD_TIMER
+
+#endif /* __CONFIG_H */
index 7089378c961061fa1db1e68fb9cae31d5f6a7e33..3a88f22bbf03d21e31660511344c7b3e6b7be1f9 100644 (file)
 #ifdef CONFIG_CMD_I2C
 #define CONFIG_SYS_I2C
 #define CONFIG_SYS_I2C_MXC
+#define CONFIG_SYS_I2C_MXC_I2C3                /* enable I2C bus 3 */
 #define CONFIG_SYS_I2C_SPEED           100000
 #define CONFIG_I2C_EDID
 #endif
index 7957a7338419cb75d6708c5027f21d0fd582cf47..f2be8d583ef6db2fa3c3244290ee60cb7121fe51 100644 (file)
        "loadfdt=load mmc ${bootpart} ${fdtaddr} ${bootdir}/${fdtfile};\0" \
        DFUARGS \
 
+
 #define CONFIG_BOOTCOMMAND \
+       "if test ${dofastboot} -eq 1; then " \
+               "echo Boot fastboot requested, resetting dofastboot ...;" \
+               "setenv dofastboot 0; saveenv;" \
+               "echo Booting into fastboot ...; fastboot;" \
+       "fi;" \
        "run findfdt; " \
        "run mmcboot;" \
        "setenv mmcdev 1; " \
        "setenv bootpart 1:2; " \
        "setenv mmcroot /dev/mmcblk0p2 rw; " \
        "run mmcboot;" \
+       ""
 
 
 /*
index f9e00c5b8b7019ed7803288b8306db74a90ba457..320d76cac607292e05e35ead46409101fb7ff5de 100644 (file)
@@ -44,6 +44,7 @@
 #define CONFIG_CMD_I2C
 #define CONFIG_SYS_I2C
 #define CONFIG_SYS_I2C_MXC
+#define CONFIG_SYS_I2C_MXC_I2C3                /* enable I2C bus 3 */
 #define CONFIG_SYS_I2C_SPEED           100000
 
 /* MMC Configs */
index a099687d4636ac4821da9213fe7c58eff8345827..012fa1c242bb5f6b3781c6394cce166e44512bc3 100644 (file)
 #define PHYS_SDRAM_SIZE                        (1024u * SZ_1M)
 #endif
 
-#if defined(CONFIG_MBA6)
-
-#if defined(CONFIG_MX6DL) || defined(CONFIG_MX6S)
-#define CONFIG_DEFAULT_FDT_FILE                "imx6dl-mba6x.dtb"
-#elif defined(CONFIG_MX6Q) || defined(CONFIG_MX6Q)
-#define CONFIG_DEFAULT_FDT_FILE                "imx6q-mba6x.dtb"
-#endif
-
-#endif
-
 #define CONFIG_DISPLAY_CPUINFO
 #define CONFIG_DISPLAY_BOARDINFO
 #define CONFIG_SYS_GENERIC_BOARD
 #define CONFIG_CMD_I2C
 #define CONFIG_SYS_I2C
 #define CONFIG_SYS_I2C_MXC
+#define CONFIG_SYS_I2C_MXC_I2C3                /* enable I2C bus 3 */
 #define CONFIG_I2C_MULTI_BUS
 #define CONFIG_SYS_I2C_SPEED           100000
 
 /* I2C SYSMON (LM75) */
 #define CONFIG_DTT_LM75
-#if defined(CONFIG_MBA6)
-#define CONFIG_DTT_SENSORS             { 0, 1 }
-#else
-#define CONFIG_DTT_SENSORS             { 0 }
-#endif
 #define CONFIG_DTT_MAX_TEMP            70
 #define CONFIG_DTT_MIN_TEMP            -30
 #define CONFIG_DTT_HYSTERESIS  3
 #define CONFIG_PHYLIB
 #define CONFIG_MII
 
-#if defined(CONFIG_MBA6)
-
-#define CONFIG_FEC_XCV_TYPE            RGMII
-#define CONFIG_ETHPRIME                        "FEC"
-
-#define CONFIG_FEC_MXC_PHYADDR         0x03
-#define CONFIG_PHY_MICREL
-#define CONFIG_PHY_KSZ9031
-
-#else
-
-#error "define PHY to use for your baseboard"
-
-#endif
-
 #define CONFIG_ARP_TIMEOUT             200UL
 /* Network config - Allow larger/faster download for TFTP/NFS */
 #define CONFIG_IP_DEFRAG
 #define CONFIG_TFTP_BLOCKSIZE  4096
 #define CONFIG_NFS_READ_SIZE   4096
 
-#if defined(CONFIG_MBA6)
-
-#define CONFIG_MXC_UART_BASE           UART2_BASE
-#define CONFIG_CONSOLE_DEV             "ttymxc1"
-
-#else
-
-#error "define baseboard specific things (uart, number of SD-card slots)"
-
-#endif
-
 /* allow to overwrite serial and ethaddr */
 #define CONFIG_ENV_OVERWRITE
 #define CONFIG_CONS_INDEX              1
 #define CONFIG_CMD_CACHE
 #endif
 
+/*
+ * All the defines above are for the TQMa6 SoM
+ *
+ * Now include the baseboard specific configuration
+ */
+#ifdef CONFIG_MBA6
+#include "tqma6_mba6.h"
+#else
+#error "No baseboard for the TQMa6 defined!"
+#endif
+
+/* Support at least the sensor on TQMa6 SOM */
+#if !defined(CONFIG_DTT_SENSORS)
+#define CONFIG_DTT_SENSORS             { 0 }
+#endif
+
 #endif /* __CONFIG_H */
diff --git a/include/configs/tqma6_mba6.h b/include/configs/tqma6_mba6.h
new file mode 100644 (file)
index 0000000..88c0067
--- /dev/null
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2013, 2014 Markus Niebel <Markus.Niebel@tq-group.com>
+ *
+ * Configuration settings for the TQ Systems TQMa6<Q,S> module.
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#ifndef __CONFIG_TQMA6_MBA6_H
+#define __CONFIG_TQMA6_MBA6_H
+
+#if defined(CONFIG_MX6DL) || defined(CONFIG_MX6S)
+#define CONFIG_DEFAULT_FDT_FILE                "imx6dl-mba6x.dtb"
+#elif defined(CONFIG_MX6Q) || defined(CONFIG_MX6Q)
+#define CONFIG_DEFAULT_FDT_FILE                "imx6q-mba6x.dtb"
+#endif
+
+#define CONFIG_DTT_SENSORS             { 0, 1 }
+
+#define CONFIG_FEC_XCV_TYPE            RGMII
+#define CONFIG_ETHPRIME                        "FEC"
+
+#define CONFIG_FEC_MXC_PHYADDR         0x03
+#define CONFIG_PHY_MICREL
+#define CONFIG_PHY_KSZ9031
+
+#define CONFIG_MXC_UART_BASE           UART2_BASE
+#define CONFIG_CONSOLE_DEV             "ttymxc1"
+
+#endif /* __CONFIG_TQMA6_MBA6_H */
index a6c7d5f136ffdbef71f72595d414d20e3e3ab9d0..1e41a12a6c86ddcae5b4e23b47a78495b20b88c3 100644 (file)
@@ -23,6 +23,8 @@
 #define CONFIG_HW_WATCHDOG
 #define CONFIG_OMAP_WATCHDOG
 #define CONFIG_SPL_WATCHDOG_SUPPORT
+
+#define CONFIG_SPL_GPIO_SUPPORT
 /* Bootcount using the RTC block */
 #define CONFIG_SYS_BOOTCOUNT_ADDR      0x44E3E000
 #define CONFIG_BOOTCOUNT_LIMIT
        "mtdparts=" MTDPARTS_DEFAULT "\0" \
        "nandargs=setenv bootargs console=${console} " \
                "${optargs} " \
-               "root=${nandroot} " \
-               "rootfstype=${nandrootfstype}\0" \
-       "nandroot=ubi0:rootfs rw ubi.mtd=8,2048\0" \
-       "nandrootfstype=ubifs rootwait=1\0" \
-       "nandimgsize=0x500000\0" \
-       "nandboot=echo Booting from nand ...; " \
+               "root=mtd6 " \
+               "rootfstype=jffs2\0" \
+       "kernelsize=0x400000\0" \
+       "nandboot=echo booting from nand ...; " \
                "run nandargs; " \
-               "nand read ${loadaddr} kernel ${nandimgsize}; " \
-               "bootz ${loadaddr}\0"
+               "nand read ${loadaddr} kernel ${kernelsize}; " \
+               "bootz ${loadaddr} - ${dtbaddr}\0" \
+       "defboot=run nandboot\0" \
+       "bootlimit=1\0" \
+       "altbootcmd=run usbscript\0"
 #else
 #define NANDARGS ""
 #endif /* CONFIG_NAND */
@@ -231,15 +234,15 @@ MMCARGS
 
 #define MTDIDS_DEFAULT                 "nand0=omap2-nand.0"
 #define MTDPARTS_DEFAULT               "mtdparts=omap2-nand.0:" \
-                                       "128k(SPL)," \
-                                       "128k(SPL.backup1)," \
-                                       "128k(SPL.backup2)," \
-                                       "128k(SPL.backup3)," \
-                                       "512k(u-boot)," \
-                                       "128k(u-boot-spl-os)," \
+                                       "128k(MLO)," \
+                                       "128k(MLO.backup)," \
+                                       "128k(dtb)," \
                                        "128k(u-boot-env)," \
-                                       "5m(kernel),"\
-                                       "-(rootfs)"
+                                       "512k(u-boot)," \
+                                       "4m(kernel),"\
+                                       "128m(rootfs),"\
+                                       "-(user)"
+#define CONFIG_NAND_OMAP_GPMC_WSCFG    1
 #endif /* CONFIG_NAND */
 
 /* USB configuration */
@@ -298,7 +301,7 @@ MMCARGS
 #else
 #define CONFIG_ENV_IS_IN_NAND
 #endif
-#define CONFIG_ENV_OFFSET              0x120000 /* TODO: Adresse definieren */
+#define CONFIG_ENV_OFFSET              0x60000
 #define CONFIG_SYS_ENV_SECT_SIZE       CONFIG_ENV_SIZE
 #else
 #error "no storage for Environment defined!"
index 3fda20a8f6c83077255a0fbf126cdfcc0465eade..032010bb9e024f1b5322145696f2c7b348424db0 100644 (file)
@@ -8,10 +8,9 @@
 #ifndef __VEXPRESS_AEMV8A_H
 #define __VEXPRESS_AEMV8A_H
 
-#define CONFIG_DM
-
-/* We use generic board for v8 Versatile Express */
+/* We use generic board and device manager for v8 Versatile Express */
 #define CONFIG_SYS_GENERIC_BOARD
+#define CONFIG_DM
 
 #ifdef CONFIG_TARGET_VEXPRESS64_BASE_FVP
 #ifndef CONFIG_SEMIHOSTING
 #endif
 
 /* PL011 Serial Configuration */
-#define CONFIG_BAUDRATE                        115200
-#ifdef CONFIG_DM
 #define CONFIG_DM_SERIAL
-#define CONFIG_PL01X_SERIAL
-#else
-#define CONFIG_SYS_SERIAL0             V2M_UART0
-#define CONFIG_SYS_SERIAL1             V2M_UART1
+#define CONFIG_BAUDRATE                        115200
 #define CONFIG_CONS_INDEX              0
+#define CONFIG_PL01X_SERIAL
 #define CONFIG_PL011_SERIAL
 #ifdef CONFIG_TARGET_VEXPRESS64_JUNO
 #define CONFIG_PL011_CLOCK             7273800
 #else
 #define CONFIG_PL011_CLOCK             24000000
 #endif
-#define CONFIG_PL01x_PORTS             {(void *)CONFIG_SYS_SERIAL0, \
-                                        (void *)CONFIG_SYS_SERIAL1}
-#endif
-
-#define CONFIG_BAUDRATE                        115200
-#define CONFIG_SYS_SERIAL0             V2M_UART0
-#define CONFIG_SYS_SERIAL1             V2M_UART1
 
 /* Command line configuration */
 #define CONFIG_MENU
index b586803916cdb563affd162630ec6786848ae1e3..b2c36148ba8c8071794281c97e073e2a73aa6cc4 100644 (file)
@@ -62,6 +62,7 @@
 #define CONFIG_CMD_I2C
 #define CONFIG_SYS_I2C
 #define CONFIG_SYS_I2C_MXC
+#define CONFIG_SYS_I2C_MXC_I2C3                /* enable I2C bus 3 */
 #define CONFIG_SYS_I2C_SPEED           100000
 
 /* MMC Configuration */
index 48b869268bb283f76bf2d1e31b8e2f8222cf6904..d0895cfdac7a910a9b28a7eeb259733885ddee07 100644 (file)
@@ -47,6 +47,7 @@
  */
 #define CONFIG_SYS_I2C
 #define CONFIG_SYS_I2C_MXC
+#define CONFIG_SYS_I2C_MXC_I2C3                /* enable I2C bus 3 */
 #define CONFIG_SYS_SPD_BUS_NUM         0
 #define CONFIG_MXC_SPI
 #define CONFIG_MXC_GPIO
index c11342c33b288f2a2033a9f2178caa26306122fc..18296bb68614b9aeae25c46b5ff3c8306e8a36d1 100644 (file)
@@ -30,8 +30,11 @@ struct driver_info;
 /* DM is responsible for allocating and freeing parent_platdata */
 #define DM_FLAG_ALLOC_PARENT_PDATA     (1 << 3)
 
+/* DM is responsible for allocating and freeing uclass_platdata */
+#define DM_FLAG_ALLOC_UCLASS_PDATA     (1 << 4)
+
 /* Allocate driver private data on a DMA boundary */
-#define DM_FLAG_ALLOC_PRIV_DMA (1 << 4)
+#define DM_FLAG_ALLOC_PRIV_DMA (1 << 5)
 
 /**
  * struct udevice - An instance of a driver
@@ -54,6 +57,7 @@ struct driver_info;
  * @name: Name of device, typically the FDT node name
  * @platdata: Configuration data for this device
  * @parent_platdata: The parent bus's configuration data for this device
+ * @uclass_platdata: The uclass's configuration data for this device
  * @of_offset: Device tree node offset for this device (- for none)
  * @driver_data: Driver data word for the entry that matched this device with
  *             its driver
@@ -75,6 +79,7 @@ struct udevice {
        const char *name;
        void *platdata;
        void *parent_platdata;
+       void *uclass_platdata;
        int of_offset;
        ulong driver_data;
        struct udevice *parent;
@@ -209,6 +214,16 @@ void *dev_get_platdata(struct udevice *dev);
  */
 void *dev_get_parent_platdata(struct udevice *dev);
 
+/**
+ * dev_get_uclass_platdata() - Get the uclass platform data for a device
+ *
+ * This checks that dev is not NULL, but no other checks for now
+ *
+ * @dev                Device to check
+ * @return uclass's platform data, or NULL if none
+ */
+void *dev_get_uclass_platdata(struct udevice *dev);
+
 /**
  * dev_get_parentdata() - Get the parent data for a device
  *
@@ -265,6 +280,17 @@ void *dev_get_uclass_priv(struct udevice *dev);
  */
 ulong dev_get_driver_data(struct udevice *dev);
 
+/**
+ * dev_get_driver_ops() - get the device's driver's operations
+ *
+ * This checks that dev is not NULL, and returns the pointer to device's
+ * driver's operations.
+ *
+ * @dev:       Device to check
+ * @return void pointer to driver's operations or NULL for NULL-dev or NULL-ops
+ */
+const void *dev_get_driver_ops(struct udevice *dev);
+
 /*
  * device_get_uclass_id() - return the uclass ID of a device
  *
@@ -273,6 +299,16 @@ ulong dev_get_driver_data(struct udevice *dev);
  */
 enum uclass_id device_get_uclass_id(struct udevice *dev);
 
+/*
+ * dev_get_uclass_name() - return the uclass name of a device
+ *
+ * This checks that dev is not NULL.
+ *
+ * @dev:       Device to check
+ * @return  pointer to the uclass name for the device
+ */
+const char *dev_get_uclass_name(struct udevice *dev);
+
 /**
  * device_get_child() - Get the child of a device by index
  *
index 9c4b8d3e5737ca9717f07559f360a5d821796a9e..f03fbcb1cdc0b1a1485fc2951ba1bad93dbdf5a0 100644 (file)
@@ -98,6 +98,26 @@ struct dm_test_parent_data {
        int flag;
 };
 
+/* Test values for test device's uclass platform data */
+enum {
+       TEST_UC_PDATA_INTVAL1 = 2,
+       TEST_UC_PDATA_INTVAL2 = 334,
+       TEST_UC_PDATA_INTVAL3 = 789452,
+};
+
+/**
+ * struct dm_test_uclass_platda - uclass's information on each device
+ *
+ * @intval1: set to TEST_UC_PDATA_INTVAL1 in .post_bind method of test uclass
+ * @intval2: set to TEST_UC_PDATA_INTVAL2 in .post_bind method of test uclass
+ * @intval3: set to TEST_UC_PDATA_INTVAL3 in .post_bind method of test uclass
+ */
+struct dm_test_perdev_uc_pdata {
+       int intval1;
+       int intval2;
+       int intval3;
+};
+
 /*
  * Operation counts for the test driver, used to check that each method is
  * called correctly
index ae2a93d7d4da7a806826843296d8c2d0d67ce20c..9b68508667123e0261691a1d4dbbf4ec7c91dffd 100644 (file)
 #ifndef _DM_UCLASS_INTERNAL_H
 #define _DM_UCLASS_INTERNAL_H
 
+/**
+ * uclass_get_device_tail() - handle the end of a get_device call
+ *
+ * This handles returning an error or probing a device as needed.
+ *
+ * @dev: Device that needs to be probed
+ * @ret: Error to return. If non-zero then the device is not probed
+ * @devp: Returns the value of 'dev' if there is no error
+ * @return ret, if non-zero, else the result of the device_probe() call
+ */
+int uclass_get_device_tail(struct udevice *dev, int ret, struct udevice **devp);
+
 /**
  * uclass_find_device() - Return n-th child of uclass
  * @id:                Id number of the uclass
  * @index:     Position of the child in uclass's list
  * #devp:      Returns pointer to device, or NULL on error
  *
- * The device is not prepared for use - this is an internal function
+ * The device is not prepared for use - this is an internal function.
+ * The function uclass_get_device_tail() can be used to probe the device.
  *
  * @return the uclass pointer of a child at the given index or
  * return NULL on error.
  */
 int uclass_find_device(enum uclass_id id, int index, struct udevice **devp);
 
+/**
+ * uclass_find_first_device() - Return the first device in a uclass
+ * @id:                Id number of the uclass
+ * #devp:      Returns pointer to device, or NULL on error
+ *
+ * The device is not prepared for use - this is an internal function.
+ * The function uclass_get_device_tail() can be used to probe the device.
+ *
+ * @return 0 if OK (found or not found), -1 on error
+ */
+int uclass_find_first_device(enum uclass_id id, struct udevice **devp);
+
+/**
+ * uclass_find_next_device() - Return the next device in a uclass
+ * @devp: On entry, pointer to device to lookup. On exit, returns pointer
+ * to the next device in the same uclass, or NULL if none
+ *
+ * The device is not prepared for use - this is an internal function.
+ * The function uclass_get_device_tail() can be used to probe the device.
+ *
+ * @return 0 if OK (found or not found), -1 on error
+ */
+int uclass_find_next_device(struct udevice **devp);
+
+/**
+ * uclass_find_device_by_name() - Find uclass device based on ID and name
+ *
+ * This searches for a device with the exactly given name.
+ *
+ * The device is NOT probed, it is merely returned.
+ *
+ * @id: ID to look up
+ * @name: name of a device to find
+ * @devp: Returns pointer to device (the first one with the name)
+ * @return 0 if OK, -ve on error
+ */
+int uclass_find_device_by_name(enum uclass_id id, const char *name,
+                              struct udevice **devp);
+
+/**
+ * uclass_find_device_by_seq() - Find uclass device based on ID and sequence
+ *
+ * This searches for a device with the given seq or req_seq.
+ *
+ * For seq, if an active device has this sequence it will be returned.
+ * If there is no such device then this will return -ENODEV.
+ *
+ * For req_seq, if a device (whether activated or not) has this req_seq
+ * value, that device will be returned. This is a strong indication that
+ * the device will receive that sequence when activated.
+ *
+ * The device is NOT probed, it is merely returned.
+ *
+ * @id: ID to look up
+ * @seq_or_req_seq: Sequence number to find (0=first)
+ * @find_req_seq: true to find req_seq, false to find seq
+ * @devp: Returns pointer to device (there is only one per for each seq)
+ * @return 0 if OK, -ve on error
+ */
+int uclass_find_device_by_seq(enum uclass_id id, int seq_or_req_seq,
+                             bool find_req_seq, struct udevice **devp);
+
 /**
  * uclass_bind_device() - Associate device with a uclass
  *
@@ -41,7 +116,11 @@ int uclass_bind_device(struct udevice *dev);
  * @dev:       Pointer to the device
  * #return 0 on success, -ve on error
  */
+#ifdef CONFIG_DM_DEVICE_REMOVE
 int uclass_unbind_device(struct udevice *dev);
+#else
+static inline int uclass_unbind_device(struct udevice *dev) { return 0; }
+#endif
 
 /**
  * uclass_pre_probe_device() - Deal with a device that is about to be probed
@@ -74,7 +153,11 @@ int uclass_post_probe_device(struct udevice *dev);
  * @dev:       Pointer to the device
  * #return 0 on success, -ve on error
  */
+#ifdef CONFIG_DM_DEVICE_REMOVE
 int uclass_pre_remove_device(struct udevice *dev);
+#else
+static inline int uclass_pre_remove_device(struct udevice *dev) { return 0; }
+#endif
 
 /**
  * uclass_find() - Find uclass by its id
@@ -94,27 +177,4 @@ struct uclass *uclass_find(enum uclass_id key);
  */
 int uclass_destroy(struct uclass *uc);
 
-/**
- * uclass_find_device_by_seq() - Find uclass device based on ID and sequence
- *
- * This searches for a device with the given seq or req_seq.
- *
- * For seq, if an active device has this sequence it will be returned.
- * If there is no such device then this will return -ENODEV.
- *
- * For req_seq, if a device (whether activated or not) has this req_seq
- * value, that device will be returned. This is a strong indication that
- * the device will receive that sequence when activated.
- *
- * The device is NOT probed, it is merely returned.
- *
- * @id: ID to look up
- * @seq_or_req_seq: Sequence number to find (0=first)
- * @find_req_seq: true to find req_seq, false to find seq
- * @devp: Returns pointer to device (there is only one per for each seq)
- * @return 0 if OK, -ve on error
- */
-int uclass_find_device_by_seq(enum uclass_id id, int seq_or_req_seq,
-                             bool find_req_seq, struct udevice **devp);
-
 #endif
index d57d80425986f3c993a42cc8a8cdf35e301b7bf6..4cfc0df84c21bac942c633279ea358e968527f53 100644 (file)
@@ -65,6 +65,9 @@ struct udevice;
  * @per_device_auto_alloc_size: Each device can hold private data owned
  * by the uclass. If required this will be automatically allocated if this
  * value is non-zero.
+ * @per_device_platdata_auto_alloc_size: Each device can hold platform data
+ * owned by the uclass as 'dev->uclass_platdata'. If the value is non-zero,
+ * then this will be automatically allocated.
  * @per_child_auto_alloc_size: Each child device (of a parent in this
  * uclass) can hold parent data for the device/uclass. This value is only
  * used as a falback if this member is 0 in the driver.
@@ -90,6 +93,7 @@ struct uclass_driver {
        int (*destroy)(struct uclass *class);
        int priv_auto_alloc_size;
        int per_device_auto_alloc_size;
+       int per_device_platdata_auto_alloc_size;
        int per_child_auto_alloc_size;
        int per_child_platdata_auto_alloc_size;
        const void *ops;
@@ -125,6 +129,21 @@ int uclass_get(enum uclass_id key, struct uclass **ucp);
  */
 int uclass_get_device(enum uclass_id id, int index, struct udevice **devp);
 
+/**
+ * uclass_get_device_by_name() - Get a uclass device by it's name
+ *
+ * This searches the devices in the uclass for one with the exactly given name.
+ *
+ * The device is probed to activate it ready for use.
+ *
+ * @id: ID to look up
+ * @name: name of a device to get
+ * @devp: Returns pointer to device (the first one with the name)
+ * @return 0 if OK, -ve on error
+ */
+int uclass_get_device_by_name(enum uclass_id id, const char *name,
+                             struct udevice **devp);
+
 /**
  * uclass_get_device_by_seq() - Get a uclass device based on an ID and sequence
  *
index ae5e8a3ef6366f2d5ad29b5a0a788170b5b668a9..5d4f28dc786e7b91e58b4b1b3190f4ad96e0d411 100644 (file)
@@ -47,6 +47,19 @@ int fdt_find_and_setprop(void *fdt, const char *node, const char *prop,
                         const void *val, int len, int create);
 void fdt_fixup_qe_firmware(void *fdt);
 
+/**
+ * Update native-mode property of display-timings node to the phandle
+ * of the timings matching a display by name (case insensitive).
+ *
+ * see kernel Documentation/devicetree/bindings/video/display-timing.txt
+ *
+ * @param blob         FDT blob to update
+ * @param path         path within dt
+ * @param display      name of display timing to match
+ * @return 0 if ok, or -FDT_ERR_... on error
+ */
+int fdt_fixup_display(void *blob, const char *path, const char *display);
+
 #if defined(CONFIG_HAS_FSL_DR_USB) || defined(CONFIG_HAS_FSL_MPH_USB)
 void fdt_fixup_dr_usb(void *blob, bd_t *bd);
 #else
index d14e06ababd543e2132c35f2414a9b037a47229c..659047097a1001ca5f007e55b16343ddc214ca78 100644 (file)
@@ -41,6 +41,16 @@ struct fdt_memory {
        fdt_addr_t end;
 };
 
+#ifdef CONFIG_OF_CONTROL
+# if defined(CONFIG_SPL_BUILD) && defined(SPL_DISABLE_OF_CONTROL)
+#  define OF_CONTROL 0
+# else
+#  define OF_CONTROL 1
+# endif
+#else
+# define OF_CONTROL 0
+#endif
+
 /*
  * Information about a resource. start is the first address of the resource
  * and end is the last address (inclusive). The length of the resource will
@@ -793,4 +803,10 @@ int fdt_get_named_resource(const void *fdt, int node, const char *property,
 int fdtdec_decode_memory_region(const void *blob, int node,
                                const char *mem_type, const char *suffix,
                                fdt_addr_t *basep, fdt_size_t *sizep);
+
+/**
+ * Set up the device tree ready for use
+ */
+int fdtdec_setup(void);
+
 #endif
index 30aa080b883eb0ec1febcb067965cea758491bfd..48aa3a5f8e387ebcc23cf0b008352da3f9dfbca2 100644 (file)
@@ -459,6 +459,8 @@ extern flash_info_t *flash_get_info(ulong base);
 #define FLASH_S29GL064M 0x00F0         /* Spansion S29GL064M-R6                */
 #define FLASH_S29GL128N 0x00F1         /* Spansion S29GL128N                   */
 
+#define FLASH_STM32F4  0x00F2          /* STM32F4 Embedded Flash */
+
 #define FLASH_UNKNOWN  0xFFFF          /* unknown flash type                   */
 
 
diff --git a/include/fsl-mc/fsl_dpaa_fd.h b/include/fsl-mc/fsl_dpaa_fd.h
new file mode 100644 (file)
index 0000000..6d0ffa8
--- /dev/null
@@ -0,0 +1,121 @@
+/*
+ * Copyright (C) 2014 Freescale Semiconductor
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+#ifndef __FSL_DPAA_FD_H
+#define __FSL_DPAA_FD_H
+
+/* Place-holder for FDs, we represent it via the simplest form that we need for
+ * now. Different overlays may be needed to support different options, etc. (It
+ * is impractical to define One True Struct, because the resulting encoding
+ * routines (lots of read-modify-writes) would be worst-case performance whether
+ * or not circumstances required them.) */
+struct dpaa_fd {
+       union {
+               u32 words[8];
+               struct dpaa_fd_simple {
+                       u32 addr_lo;
+                       u32 addr_hi;
+                       u32 len;
+                       /* offset in the MS 16 bits, BPID in the LS 16 bits */
+                       u32 bpid_offset;
+                       u32 frc; /* frame context */
+                       /* "err", "va", "cbmt", "asal", [...] */
+                       u32 ctrl;
+                       /* flow context */
+                       u32 flc_lo;
+                       u32 flc_hi;
+               } simple;
+       };
+};
+
+enum dpaa_fd_format {
+       dpaa_fd_single = 0,
+       dpaa_fd_list,
+       dpaa_fd_sg
+};
+
+static inline u64 ldpaa_fd_get_addr(const struct dpaa_fd *fd)
+{
+       return (u64)((((uint64_t)fd->simple.addr_hi) << 32)
+                               + fd->simple.addr_lo);
+}
+
+static inline void ldpaa_fd_set_addr(struct dpaa_fd *fd, u64 addr)
+{
+       fd->simple.addr_hi = upper_32_bits(addr);
+       fd->simple.addr_lo = lower_32_bits(addr);
+}
+
+static inline u32 ldpaa_fd_get_len(const struct dpaa_fd *fd)
+{
+       return fd->simple.len;
+}
+
+static inline void ldpaa_fd_set_len(struct dpaa_fd *fd, u32 len)
+{
+       fd->simple.len = len;
+}
+
+static inline uint16_t ldpaa_fd_get_offset(const struct dpaa_fd *fd)
+{
+       return (uint16_t)(fd->simple.bpid_offset >> 16) & 0x0FFF;
+}
+
+static inline void ldpaa_fd_set_offset(struct dpaa_fd *fd, uint16_t offset)
+{
+       fd->simple.bpid_offset &= 0xF000FFFF;
+       fd->simple.bpid_offset |= (u32)offset << 16;
+}
+
+static inline uint16_t ldpaa_fd_get_bpid(const struct dpaa_fd *fd)
+{
+       return (uint16_t)(fd->simple.bpid_offset & 0xFFFF);
+}
+
+static inline void ldpaa_fd_set_bpid(struct dpaa_fd *fd, uint16_t bpid)
+{
+       fd->simple.bpid_offset &= 0xFFFF0000;
+       fd->simple.bpid_offset |= (u32)bpid;
+}
+
+/* When frames are dequeued, the FDs show up inside "dequeue" result structures
+ * (if at all, not all dequeue results contain valid FDs). This structure type
+ * is intentionally defined without internal detail, and the only reason it
+ * isn't declared opaquely (without size) is to allow the user to provide
+ * suitably-sized (and aligned) memory for these entries. */
+struct ldpaa_dq {
+       uint32_t dont_manipulate_directly[16];
+};
+
+/* Parsing frame dequeue results */
+#define LDPAA_DQ_STAT_FQEMPTY       0x80
+#define LDPAA_DQ_STAT_HELDACTIVE    0x40
+#define LDPAA_DQ_STAT_FORCEELIGIBLE 0x20
+#define LDPAA_DQ_STAT_VALIDFRAME    0x10
+#define LDPAA_DQ_STAT_ODPVALID      0x04
+#define LDPAA_DQ_STAT_VOLATILE      0x02
+#define LDPAA_DQ_STAT_EXPIRED       0x01
+uint32_t ldpaa_dq_flags(const struct ldpaa_dq *);
+static inline int ldpaa_dq_is_pull(const struct ldpaa_dq *dq)
+{
+       return (int)(ldpaa_dq_flags(dq) & LDPAA_DQ_STAT_VOLATILE);
+}
+static inline int ldpaa_dq_is_pull_complete(
+                                       const struct ldpaa_dq *dq)
+{
+       return (int)(ldpaa_dq_flags(dq) & LDPAA_DQ_STAT_EXPIRED);
+}
+/* seqnum/odpid are valid only if VALIDFRAME and ODPVALID flags are TRUE */
+uint16_t ldpaa_dq_seqnum(const struct ldpaa_dq *);
+uint16_t ldpaa_dq_odpid(const struct ldpaa_dq *);
+uint32_t ldpaa_dq_fqid(const struct ldpaa_dq *);
+uint32_t ldpaa_dq_byte_count(const struct ldpaa_dq *);
+uint32_t ldpaa_dq_frame_count(const struct ldpaa_dq *);
+uint32_t ldpaa_dq_fqd_ctx_hi(const struct ldpaa_dq *);
+uint32_t ldpaa_dq_fqd_ctx_lo(const struct ldpaa_dq *);
+/* get the Frame Descriptor */
+const struct dpaa_fd *ldpaa_dq_fd(const struct ldpaa_dq *);
+
+#endif /* __FSL_DPAA_FD_H */
diff --git a/include/fsl-mc/fsl_dpbp.h b/include/fsl-mc/fsl_dpbp.h
new file mode 100644 (file)
index 0000000..7f0075c
--- /dev/null
@@ -0,0 +1,143 @@
+/*
+ * Freescale Layerscape MC I/O wrapper
+ *
+ * Copyright (C) 2013-2015 Freescale Semiconductor, Inc.
+ * Author: German Rivera <German.Rivera@freescale.com>
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+/*!
+ *  @file    fsl_dpbp.h
+ *  @brief   Data Path Buffer Pool API
+ */
+#ifndef __FSL_DPBP_H
+#define __FSL_DPBP_H
+
+/* DPBP Version */
+#define DPBP_VER_MAJOR                         2
+#define DPBP_VER_MINOR                         0
+
+/* Command IDs */
+#define DPBP_CMDID_CLOSE                               0x800
+#define DPBP_CMDID_OPEN                                        0x804
+
+#define DPBP_CMDID_ENABLE                              0x002
+#define DPBP_CMDID_DISABLE                             0x003
+#define DPBP_CMDID_GET_ATTR                            0x004
+#define DPBP_CMDID_RESET                               0x005
+
+/*                cmd, param, offset, width, type, arg_name */
+#define DPBP_CMD_OPEN(cmd, dpbp_id) \
+       MC_CMD_OP(cmd, 0, 0,  32, int,      dpbp_id)
+
+/*                cmd, param, offset, width, type,     arg_name */
+#define DPBP_RSP_GET_ATTRIBUTES(cmd, attr) \
+do { \
+       MC_RSP_OP(cmd, 0, 16, 16, uint16_t, attr->bpid); \
+       MC_RSP_OP(cmd, 0, 32, 32, int,      attr->id);\
+       MC_RSP_OP(cmd, 1, 0,  16, uint16_t, attr->version.major);\
+       MC_RSP_OP(cmd, 1, 16, 16, uint16_t, attr->version.minor);\
+} while (0)
+
+/* Data Path Buffer Pool API
+ * Contains initialization APIs and runtime control APIs for DPBP
+ */
+
+struct fsl_mc_io;
+
+/**
+ * dpbp_open() - Open a control session for the specified object.
+ * @mc_io:     Pointer to MC portal's I/O object
+ * @dpbp_id:   DPBP unique ID
+ * @token:     Returned token; use in subsequent API calls
+ *
+ * This function can be used to open a control session for an
+ * already created object; an object may have been declared in
+ * the DPL or by calling the dpbp_create function.
+ * This function returns a unique authentication token,
+ * associated with the specific object ID and the specific MC
+ * portal; this token must be used in all subsequent commands for
+ * this specific object
+ *
+ * Return:     '0' on Success; Error code otherwise.
+ */
+int dpbp_open(struct fsl_mc_io *mc_io, int dpbp_id, uint16_t *token);
+
+/**
+ * dpbp_close() - Close the control session of the object
+ * @mc_io:     Pointer to MC portal's I/O object
+ * @token:     Token of DPBP object
+ *
+ * After this function is called, no further operations are
+ * allowed on the object without opening a new control session.
+ *
+ * Return:     '0' on Success; Error code otherwise.
+ */
+int dpbp_close(struct fsl_mc_io *mc_io, uint16_t token);
+
+/**
+ * dpbp_enable() - Enable the DPBP.
+ * @mc_io:     Pointer to MC portal's I/O object
+ * @token:     Token of DPBP object
+ *
+ * Return:     '0' on Success; Error code otherwise.
+ */
+
+int dpbp_enable(struct fsl_mc_io *mc_io, uint16_t token);
+
+/**
+ * dpbp_disable() - Disable the DPBP.
+ * @mc_io:     Pointer to MC portal's I/O object
+ * @token:     Token of DPBP object
+ *
+ * Return:     '0' on Success; Error code otherwise.
+ */
+int dpbp_disable(struct fsl_mc_io *mc_io, uint16_t token);
+
+/**
+ * dpbp_reset() - Reset the DPBP, returns the object to initial state.
+ * @mc_io:     Pointer to MC portal's I/O object
+ * @token:     Token of DPBP object
+ *
+ * Return:     '0' on Success; Error code otherwise.
+ */
+int dpbp_reset(struct fsl_mc_io *mc_io, uint16_t token);
+
+/**
+ * struct dpbp_attr - Structure representing DPBP attributes
+ * @id:                DPBP object ID
+ * @version:   DPBP version
+ * @bpid:      Hardware buffer pool ID; should be used as an argument in
+ *             acquire/release operations on buffers
+ */
+struct dpbp_attr {
+       int id;
+       /**
+        * struct version - Structure representing DPBP version
+        * @major:      DPBP major version
+        * @minor:      DPBP minor version
+        */
+       struct {
+               uint16_t major;
+               uint16_t minor;
+       } version;
+       uint16_t bpid;
+};
+
+
+/**
+ * dpbp_get_attributes - Retrieve DPBP attributes.
+ *
+ * @mc_io:     Pointer to MC portal's I/O object
+ * @token:     Token of DPBP object
+ * @attr:      Returned object's attributes
+ *
+ * Return:     '0' on Success; Error code otherwise.
+ */
+int dpbp_get_attributes(struct fsl_mc_io       *mc_io,
+                       uint16_t                token,
+                       struct dpbp_attr        *attr);
+
+/** @} */
+
+#endif /* __FSL_DPBP_H */
diff --git a/include/fsl-mc/fsl_dpio.h b/include/fsl-mc/fsl_dpio.h
new file mode 100644 (file)
index 0000000..e84b419
--- /dev/null
@@ -0,0 +1,163 @@
+/*
+ * Copyright (C) 2013-2015 Freescale Semiconductor
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#ifndef _FSL_DPIO_H
+#define _FSL_DPIO_H
+
+/* DPIO Version */
+#define DPIO_VER_MAJOR                         2
+#define DPIO_VER_MINOR                         1
+
+/* Command IDs */
+#define DPIO_CMDID_CLOSE                                       0x800
+#define DPIO_CMDID_OPEN                                                0x803
+
+#define DPIO_CMDID_ENABLE                                      0x002
+#define DPIO_CMDID_DISABLE                                     0x003
+#define DPIO_CMDID_GET_ATTR                                    0x004
+#define DPIO_CMDID_RESET                                       0x005
+
+/*                cmd, param, offset, width, type, arg_name */
+#define DPIO_CMD_OPEN(cmd, dpio_id) \
+       MC_CMD_OP(cmd, 0, 0,  32, int,     dpio_id)
+
+/*                cmd, param, offset, width, type, arg_name */
+#define DPIO_RSP_GET_ATTR(cmd, attr) \
+do { \
+       MC_RSP_OP(cmd, 0, 0,  32, int,      attr->id);\
+       MC_RSP_OP(cmd, 0, 32, 16, uint16_t, attr->qbman_portal_id);\
+       MC_RSP_OP(cmd, 0, 48, 8,  uint8_t,  attr->num_priorities);\
+       MC_RSP_OP(cmd, 0, 56, 4,  enum dpio_channel_mode, attr->channel_mode);\
+       MC_RSP_OP(cmd, 1, 0,  64, uint64_t, attr->qbman_portal_ce_paddr);\
+       MC_RSP_OP(cmd, 2, 0,  64, uint64_t, attr->qbman_portal_ci_paddr);\
+       MC_RSP_OP(cmd, 3, 0,  16, uint16_t, attr->version.major);\
+       MC_RSP_OP(cmd, 3, 16, 16, uint16_t, attr->version.minor);\
+} while (0)
+
+/* Data Path I/O Portal API
+ * Contains initialization APIs and runtime control APIs for DPIO
+ */
+
+struct fsl_mc_io;
+/**
+ * dpio_open() - Open a control session for the specified object
+ * @mc_io:     Pointer to MC portal's I/O object
+ * @dpio_id:   DPIO unique ID
+ * @token:     Returned token; use in subsequent API calls
+ *
+ * This function can be used to open a control session for an
+ * already created object; an object may have been declared in
+ * the DPL or by calling the dpio_create() function.
+ * This function returns a unique authentication token,
+ * associated with the specific object ID and the specific MC
+ * portal; this token must be used in all subsequent commands for
+ * this specific object.
+ *
+ * Return:     '0' on Success; Error code otherwise.
+ */
+int dpio_open(struct fsl_mc_io *mc_io, int dpio_id, uint16_t *token);
+
+/**
+ * dpio_open() - Open a control session for the specified object
+ * @mc_io:     Pointer to MC portal's I/O object
+ * @dpio_id:   DPIO unique ID
+ * @token:     Returned token; use in subsequent API calls
+ *
+ * This function can be used to open a control session for an
+ * already created object; an object may have been declared in
+ * the DPL or by calling the dpio_create() function.
+ * This function returns a unique authentication token,
+ * associated with the specific object ID and the specific MC
+ * portal; this token must be used in all subsequent commands for
+ * this specific object.
+ *
+ * Return:     '0' on Success; Error code otherwise.
+ */
+int dpio_close(struct fsl_mc_io *mc_io, uint16_t token);
+
+/**
+ * enum dpio_channel_mode - DPIO notification channel mode
+ * @DPIO_NO_CHANNEL: No support for notification channel
+ * @DPIO_LOCAL_CHANNEL: Notifications on data availability can be received by a
+ *     dedicated channel in the DPIO; user should point the queue's
+ *     destination in the relevant interface to this DPIO
+ */
+enum dpio_channel_mode {
+       DPIO_NO_CHANNEL = 0,
+       DPIO_LOCAL_CHANNEL = 1,
+};
+
+/**
+ * dpio_enable() - Enable the DPIO, allow I/O portal operations.
+ * @mc_io:     Pointer to MC portal's I/O object
+ * @token:     Token of DPIO object
+ *
+ * Return:     '0' on Success; Error code otherwise
+ */
+int dpio_enable(struct fsl_mc_io *mc_io, uint16_t token);
+
+/**
+ * dpio_disable() - Disable the DPIO, stop any I/O portal operation.
+ * @mc_io:     Pointer to MC portal's I/O object
+ * @token:     Token of DPIO object
+ *
+ * Return:     '0' on Success; Error code otherwise
+ */
+int dpio_disable(struct fsl_mc_io *mc_io, uint16_t token);
+
+/**
+ * dpio_reset() - Reset the DPIO, returns the object to initial state.
+ * @mc_io:     Pointer to MC portal's I/O object
+ * @token:     Token of DPIO object
+ *
+ * Return:     '0' on Success; Error code otherwise.
+ */
+int dpio_reset(struct fsl_mc_io *mc_io, uint16_t token);
+
+/**
+ * struct dpio_attr - Structure representing DPIO attributes
+ * @id: DPIO object ID
+ * @version: DPIO version
+ * @qbman_portal_ce_paddr: Physical address of the software portal
+ *                             cache-enabled area
+ * @qbman_portal_ci_paddr: Physical address of the software portal
+ *                             cache-inhibited area
+ * @qbman_portal_id: Software portal ID
+ * @channel_mode: Notification channel mode
+ * @num_priorities: Number of priorities for the notification channel (1-8);
+ *                     relevant only if 'channel_mode = DPIO_LOCAL_CHANNEL'
+ */
+struct dpio_attr {
+       int id;
+       /**
+        * struct version - DPIO version
+        * @major: DPIO major version
+        * @minor: DPIO minor version
+        */
+       struct {
+               uint16_t major;
+               uint16_t minor;
+       } version;
+       uint64_t qbman_portal_ce_paddr;
+       uint64_t qbman_portal_ci_paddr;
+       uint16_t qbman_portal_id;
+       enum dpio_channel_mode channel_mode;
+       uint8_t num_priorities;
+};
+
+/**
+ * dpio_get_attributes() - Retrieve DPIO attributes
+ * @mc_io:     Pointer to MC portal's I/O object
+ * @token:     Token of DPIO object
+ * @attr:      Returned object's attributes
+ *
+ * Return:     '0' on Success; Error code otherwise
+ */
+int dpio_get_attributes(struct fsl_mc_io       *mc_io,
+                       uint16_t                token,
+                       struct dpio_attr        *attr);
+
+#endif /* _FSL_DPIO_H */
index c2e1ddd18b90aca9f24202bc8d3ce822b8cfdc73..986e7c83385035fdc2c1cd17ca5fd9d88ef9e2c7 100644 (file)
-/* Copyright 2014 Freescale Semiconductor Inc.
+/* Copyright 2013-2015 Freescale Semiconductor Inc.
  *
  * SPDX-License-Identifier:    GPL-2.0+
  */
-/*!
- *  @file    fsl_dpmng.h
- *  @brief   Management Complex General API
- */
-
 #ifndef __FSL_DPMNG_H
 #define __FSL_DPMNG_H
 
-/*!
- * @Group grp_dpmng    Management Complex General API
- *
- * @brief      Contains general API for the Management Complex firmware
- * @{
+/* Management Complex General API
+ * Contains general API for the Management Complex firmware
  */
 
 struct fsl_mc_io;
 
 /**
- * @brief      Management Complex firmware version information
+ * Management Complex firmware version information
  */
-#define MC_VER_MAJOR 4
+#define MC_VER_MAJOR 6
 #define MC_VER_MINOR 0
 
+/**
+ * struct mc_versoin
+ * @major: Major version number: incremented on API compatibility changes
+ * @minor: Minor version number: incremented on API additions (that are
+ *             backward compatible); reset when major version is incremented
+ * @revision: Internal revision number: incremented on implementation changes
+ *             and/or bug fixes that have no impact on API
+ */
 struct mc_version {
        uint32_t major;
-       /*!< Major version number: incremented on API compatibility changes */
        uint32_t minor;
-       /*!< Minor version number: incremented on API additions (that are
-        * backward compatible); reset when major version is incremented
-        */
        uint32_t revision;
-       /*!< Internal revision number: incremented on implementation changes
-        * and/or bug fixes that have no impact on API
-        */
 };
 
 /**
- * @brief      Retrieves the Management Complex firmware version information
- *
- * @param[in]  mc_io           Pointer to opaque I/O object
- * @param[out] mc_ver_info     Pointer to version information structure
+ * mc_get_version() - Retrieves the Management Complex firmware
+ *                     version information
+ * @mc_io:             Pointer to opaque I/O object
+ * @mc_ver_info:       Returned version information structure
  *
- * @returns    '0' on Success; Error code otherwise.
+ * Return:     '0' on Success; Error code otherwise.
  */
 int mc_get_version(struct fsl_mc_io *mc_io, struct mc_version *mc_ver_info);
 
-/**
- * @brief      Resets an AIOP tile
- *
- * @param[in]  mc_io           Pointer to opaque I/O object
- * @param[in]  container_id    AIOP container ID
- * @param[in]  aiop_tile_id    AIOP tile ID to reset
- *
- * @returns    '0' on Success; Error code otherwise.
- */
-int dpmng_reset_aiop(struct fsl_mc_io  *mc_io,
-                    int                container_id,
-                    int                aiop_tile_id);
-
-/**
- * @brief      Loads an image to AIOP tile
- *
- * @param[in]  mc_io           Pointer to opaque I/O object
- * @param[in]  container_id    AIOP container ID
- * @param[in]  aiop_tile_id    AIOP tile ID to reset
- * @param[in]  img_iova        I/O virtual address of AIOP ELF image
- * @param[in]  img_size        Size of AIOP ELF image in memory (in bytes)
- *
- * @returns    '0' on Success; Error code otherwise.
- */
-int dpmng_load_aiop(struct fsl_mc_io   *mc_io,
-                   int                 container_id,
-                   int                 aiop_tile_id,
-                   uint64_t            img_iova,
-                   uint32_t            img_size);
-
-/**
- * @brief      AIOP run configuration
- */
-struct dpmng_aiop_run_cfg {
-       uint32_t cores_mask;
-       /*!< Mask of AIOP cores to run (core 0 in most significant bit) */
-       uint64_t options;
-       /*!< Execution options (currently none defined) */
-};
-
-/**
- * @brief      Starts AIOP tile execution
- *
- * @param[in]  mc_io           Pointer to MC portal's I/O object
- * @param[in]  container_id    AIOP container ID
- * @param[in]  aiop_tile_id    AIOP tile ID to reset
- * @param[in]  cfg             AIOP run configuration
- *
- * @returns    '0' on Success; Error code otherwise.
- */
-int dpmng_run_aiop(struct fsl_mc_io                    *mc_io,
-                  int                                  container_id,
-                  int                                  aiop_tile_id,
-                  const struct dpmng_aiop_run_cfg      *cfg);
-
-/**
- * @brief      Resets MC portal
- *
- * This function closes all object handles (tokens) that are currently
- * open in the MC portal on which the command is submitted. This allows
- * cleanup of stale handles that belong to non-functional user processes.
- *
- * @param[in]  mc_io   Pointer to MC portal's I/O object
- *
- * @returns    '0' on Success; Error code otherwise.
- */
-int dpmng_reset_mc_portal(struct fsl_mc_io *mc_io);
-
-/** @} */
-
 #endif /* __FSL_DPMNG_H */
diff --git a/include/fsl-mc/fsl_dpni.h b/include/fsl-mc/fsl_dpni.h
new file mode 100644 (file)
index 0000000..67c087d
--- /dev/null
@@ -0,0 +1,1093 @@
+/*
+ * Copyright (C) 2013-2015 Freescale Semiconductor
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+#ifndef _FSL_DPNI_H
+#define _FSL_DPNI_H
+
+/* DPNI Version */
+#define DPNI_VER_MAJOR                         4
+#define DPNI_VER_MINOR                         0
+
+/* Command IDs */
+#define DPNI_CMDID_OPEN                                0x801
+#define DPNI_CMDID_CLOSE                       0x800
+
+#define DPNI_CMDID_ENABLE                      0x002
+#define DPNI_CMDID_DISABLE                     0x003
+#define DPNI_CMDID_GET_ATTR                    0x004
+#define DPNI_CMDID_RESET                       0x005
+
+#define DPNI_CMDID_SET_POOLS                   0x200
+#define DPNI_CMDID_GET_RX_BUFFER_LAYOUT                0x201
+#define DPNI_CMDID_SET_RX_BUFFER_LAYOUT                0x202
+#define DPNI_CMDID_GET_TX_BUFFER_LAYOUT                0x203
+#define DPNI_CMDID_SET_TX_BUFFER_LAYOUT                0x204
+#define DPNI_CMDID_SET_TX_CONF_BUFFER_LAYOUT   0x205
+#define DPNI_CMDID_GET_TX_CONF_BUFFER_LAYOUT   0x206
+
+#define DPNI_CMDID_GET_QDID                    0x210
+#define DPNI_CMDID_GET_TX_DATA_OFFSET          0x212
+#define DPNI_CMDID_GET_COUNTER                 0x213
+#define DPNI_CMDID_SET_COUNTER                 0x214
+#define DPNI_CMDID_GET_LINK_STATE              0x215
+#define DPNI_CMDID_SET_LINK_CFG                0x21A
+
+#define DPNI_CMDID_SET_PRIM_MAC                        0x224
+#define DPNI_CMDID_GET_PRIM_MAC                        0x225
+#define DPNI_CMDID_ADD_MAC_ADDR                        0x226
+#define DPNI_CMDID_REMOVE_MAC_ADDR             0x227
+
+#define DPNI_CMDID_SET_TX_FLOW                 0x236
+#define DPNI_CMDID_GET_TX_FLOW                 0x237
+#define DPNI_CMDID_SET_RX_FLOW                 0x238
+#define DPNI_CMDID_GET_RX_FLOW                 0x239
+
+/*                cmd, param, offset, width, type, arg_name */
+#define DPNI_CMD_OPEN(cmd, dpni_id) \
+       MC_CMD_OP(cmd,   0,     0,      32,     int,    dpni_id)
+
+
+/*                cmd, param, offset, width, type, arg_name */
+#define DPNI_CMD_SET_POOLS(cmd, cfg) \
+do { \
+       MC_CMD_OP(cmd, 0, 0,  8,  uint8_t,  cfg->num_dpbp); \
+       MC_CMD_OP(cmd, 0, 32, 32, int,      cfg->pools[0].dpbp_id); \
+       MC_CMD_OP(cmd, 4, 32, 16, uint16_t, cfg->pools[0].buffer_size);\
+       MC_CMD_OP(cmd, 1, 0,  32, int,      cfg->pools[1].dpbp_id); \
+       MC_CMD_OP(cmd, 4, 48, 16, uint16_t, cfg->pools[1].buffer_size);\
+       MC_CMD_OP(cmd, 1, 32, 32, int,      cfg->pools[2].dpbp_id); \
+       MC_CMD_OP(cmd, 5, 0,  16, uint16_t, cfg->pools[2].buffer_size);\
+       MC_CMD_OP(cmd, 2, 0,  32, int,      cfg->pools[3].dpbp_id); \
+       MC_CMD_OP(cmd, 5, 16, 16, uint16_t, cfg->pools[3].buffer_size);\
+       MC_CMD_OP(cmd, 2, 32, 32, int,      cfg->pools[4].dpbp_id); \
+       MC_CMD_OP(cmd, 5, 32, 16, uint16_t, cfg->pools[4].buffer_size);\
+       MC_CMD_OP(cmd, 3, 0,  32, int,      cfg->pools[5].dpbp_id); \
+       MC_CMD_OP(cmd, 5, 48, 16, uint16_t, cfg->pools[5].buffer_size);\
+       MC_CMD_OP(cmd, 3, 32, 32, int,      cfg->pools[6].dpbp_id); \
+       MC_CMD_OP(cmd, 6, 0,  16, uint16_t, cfg->pools[6].buffer_size);\
+       MC_CMD_OP(cmd, 4, 0,  32, int,      cfg->pools[7].dpbp_id); \
+       MC_CMD_OP(cmd, 6, 16, 16, uint16_t, cfg->pools[7].buffer_size);\
+} while (0)
+
+/*                cmd, param, offset, width, type, arg_name */
+#define DPNI_RSP_GET_ATTR(cmd, attr) \
+do { \
+       MC_RSP_OP(cmd, 0, 0,  32, int,      attr->id);\
+       MC_RSP_OP(cmd, 0, 32, 8,  uint8_t,  attr->max_tcs); \
+       MC_RSP_OP(cmd, 0, 40, 8,  uint8_t,  attr->max_senders); \
+       MC_RSP_OP(cmd, 0, 48, 8,  enum net_prot, attr->start_hdr); \
+       MC_RSP_OP(cmd, 1, 0,  64, uint64_t, attr->options); \
+       MC_RSP_OP(cmd, 2, 0,  8,  uint8_t,  attr->max_unicast_filters); \
+       MC_RSP_OP(cmd, 2, 8,  8,  uint8_t,  attr->max_multicast_filters);\
+       MC_RSP_OP(cmd, 2, 16, 8,  uint8_t,  attr->max_vlan_filters); \
+       MC_RSP_OP(cmd, 2, 24, 8,  uint8_t,  attr->max_qos_entries); \
+       MC_RSP_OP(cmd, 2, 32, 8,  uint8_t,  attr->max_qos_key_size); \
+       MC_RSP_OP(cmd, 2, 40, 8,  uint8_t,  attr->max_dist_key_size); \
+       MC_RSP_OP(cmd, 3, 0,  8,  uint8_t,  attr->max_dist_per_tc[0]); \
+       MC_RSP_OP(cmd, 3, 8,  8,  uint8_t,  attr->max_dist_per_tc[1]); \
+       MC_RSP_OP(cmd, 3, 16, 8,  uint8_t,  attr->max_dist_per_tc[2]); \
+       MC_RSP_OP(cmd, 3, 24, 8,  uint8_t,  attr->max_dist_per_tc[3]); \
+       MC_RSP_OP(cmd, 3, 32, 8,  uint8_t,  attr->max_dist_per_tc[4]); \
+       MC_RSP_OP(cmd, 3, 40, 8,  uint8_t,  attr->max_dist_per_tc[5]); \
+       MC_RSP_OP(cmd, 3, 48, 8,  uint8_t,  attr->max_dist_per_tc[6]); \
+       MC_RSP_OP(cmd, 3, 56, 8,  uint8_t,  attr->max_dist_per_tc[7]); \
+       MC_RSP_OP(cmd, 4, 0,    16, uint16_t, \
+                                   attr->ipr_cfg.max_reass_frm_size); \
+       MC_RSP_OP(cmd, 4, 16,   16, uint16_t, \
+                                   attr->ipr_cfg.min_frag_size_ipv4); \
+       MC_RSP_OP(cmd, 4, 32,   16, uint16_t, \
+                                   attr->ipr_cfg.min_frag_size_ipv6); \
+       MC_RSP_OP(cmd, 5, 0,    16, uint16_t, \
+                                 attr->ipr_cfg.max_open_frames_ipv4); \
+       MC_RSP_OP(cmd, 5, 16,   16, uint16_t, \
+                                 attr->ipr_cfg.max_open_frames_ipv6); \
+       MC_RSP_OP(cmd, 5, 32, 16, uint16_t, attr->version.major);\
+       MC_RSP_OP(cmd, 5, 48, 16, uint16_t, attr->version.minor);\
+} while (0)
+
+/*                cmd, param, offset, width, type, arg_name */
+#define DPNI_RSP_GET_RX_BUFFER_LAYOUT(cmd, layout) \
+do { \
+       MC_RSP_OP(cmd, 0, 0,  16, uint16_t, layout->private_data_size); \
+       MC_RSP_OP(cmd, 0, 16, 16, uint16_t, layout->data_align); \
+       MC_RSP_OP(cmd, 1, 0,  1,  int,      layout->pass_timestamp); \
+       MC_RSP_OP(cmd, 1, 1,  1,  int,      layout->pass_parser_result); \
+       MC_RSP_OP(cmd, 1, 2,  1,  int,      layout->pass_frame_status); \
+       MC_RSP_OP(cmd, 1, 16, 16, uint16_t, layout->data_head_room); \
+       MC_RSP_OP(cmd, 1, 32, 16, uint16_t, layout->data_tail_room); \
+} while (0)
+
+/*                cmd, param, offset, width, type, arg_name */
+#define DPNI_CMD_SET_RX_BUFFER_LAYOUT(cmd, layout) \
+do { \
+       MC_CMD_OP(cmd, 0, 0,  16, uint16_t, layout->private_data_size); \
+       MC_CMD_OP(cmd, 0, 16, 16, uint16_t, layout->data_align); \
+       MC_CMD_OP(cmd, 0, 32, 32, uint32_t, layout->options); \
+       MC_CMD_OP(cmd, 1, 0,  1,  int,      layout->pass_timestamp); \
+       MC_CMD_OP(cmd, 1, 1,  1,  int,      layout->pass_parser_result); \
+       MC_CMD_OP(cmd, 1, 2,  1,  int,      layout->pass_frame_status); \
+       MC_CMD_OP(cmd, 1, 16, 16, uint16_t, layout->data_head_room); \
+       MC_CMD_OP(cmd, 1, 32, 16, uint16_t, layout->data_tail_room); \
+} while (0)
+
+/*                cmd, param, offset, width, type, arg_name */
+#define DPNI_RSP_GET_TX_BUFFER_LAYOUT(cmd, layout) \
+do { \
+       MC_RSP_OP(cmd, 0, 0,  16, uint16_t, layout->private_data_size); \
+       MC_RSP_OP(cmd, 0, 16, 16, uint16_t, layout->data_align); \
+       MC_RSP_OP(cmd, 1, 0,  1,  int,      layout->pass_timestamp); \
+       MC_RSP_OP(cmd, 1, 1,  1,  int,      layout->pass_parser_result); \
+       MC_RSP_OP(cmd, 1, 2,  1,  int,      layout->pass_frame_status); \
+       MC_RSP_OP(cmd, 1, 16, 16, uint16_t, layout->data_head_room); \
+       MC_RSP_OP(cmd, 1, 32, 16, uint16_t, layout->data_tail_room); \
+} while (0)
+
+/*                cmd, param, offset, width, type, arg_name */
+#define DPNI_CMD_SET_TX_BUFFER_LAYOUT(cmd, layout) \
+do { \
+       MC_CMD_OP(cmd, 0, 0,  16, uint16_t, layout->private_data_size); \
+       MC_CMD_OP(cmd, 0, 16, 16, uint16_t, layout->data_align); \
+       MC_CMD_OP(cmd, 0, 32, 32, uint32_t, layout->options); \
+       MC_CMD_OP(cmd, 1, 0,  1,  int,      layout->pass_timestamp); \
+       MC_CMD_OP(cmd, 1, 1,  1,  int,      layout->pass_parser_result); \
+       MC_CMD_OP(cmd, 1, 2,  1,  int,      layout->pass_frame_status); \
+       MC_CMD_OP(cmd, 1, 16, 16, uint16_t, layout->data_head_room); \
+       MC_CMD_OP(cmd, 1, 32, 16, uint16_t, layout->data_tail_room); \
+} while (0)
+
+/*                cmd, param, offset, width, type, arg_name */
+#define DPNI_RSP_GET_TX_CONF_BUFFER_LAYOUT(cmd, layout) \
+do { \
+       MC_RSP_OP(cmd, 0, 0,  16, uint16_t, layout->private_data_size); \
+       MC_RSP_OP(cmd, 0, 16, 16, uint16_t, layout->data_align); \
+       MC_RSP_OP(cmd, 1, 0,  1,  int,      layout->pass_timestamp); \
+       MC_RSP_OP(cmd, 1, 1,  1,  int,      layout->pass_parser_result); \
+       MC_RSP_OP(cmd, 1, 2,  1,  int,      layout->pass_frame_status); \
+       MC_RSP_OP(cmd, 1, 16, 16, uint16_t, layout->data_head_room); \
+       MC_RSP_OP(cmd, 1, 32, 16, uint16_t, layout->data_tail_room); \
+} while (0)
+
+/*                cmd, param, offset, width, type, arg_name */
+#define DPNI_CMD_SET_TX_CONF_BUFFER_LAYOUT(cmd, layout) \
+do { \
+       MC_CMD_OP(cmd, 0, 0,  16, uint16_t, layout->private_data_size); \
+       MC_CMD_OP(cmd, 0, 16, 16, uint16_t, layout->data_align); \
+       MC_CMD_OP(cmd, 0, 32, 32, uint32_t, layout->options); \
+       MC_CMD_OP(cmd, 1, 0,  1,  int,      layout->pass_timestamp); \
+       MC_CMD_OP(cmd, 1, 1,  1,  int,      layout->pass_parser_result); \
+       MC_CMD_OP(cmd, 1, 2,  1,  int,      layout->pass_frame_status); \
+       MC_CMD_OP(cmd, 1, 16, 16, uint16_t, layout->data_head_room); \
+       MC_CMD_OP(cmd, 1, 32, 16, uint16_t, layout->data_tail_room); \
+} while (0)
+
+/*                cmd, param, offset, width, type, arg_name */
+#define DPNI_RSP_GET_QDID(cmd, qdid) \
+       MC_RSP_OP(cmd, 0, 0,  16, uint16_t, qdid)
+
+/*                cmd, param, offset, width, type, arg_name */
+#define DPNI_RSP_GET_TX_DATA_OFFSET(cmd, data_offset) \
+       MC_RSP_OP(cmd, 0, 0,  16, uint16_t, data_offset)
+
+/*                cmd, param, offset, width, type, arg_name */
+#define DPNI_CMD_GET_COUNTER(cmd, counter) \
+       MC_CMD_OP(cmd, 0, 0,  16, enum dpni_counter, counter)
+
+/*                cmd, param, offset, width, type, arg_name */
+#define DPNI_RSP_GET_COUNTER(cmd, value) \
+       MC_RSP_OP(cmd, 1, 0,  64, uint64_t, value)
+
+/*                cmd, param, offset, width, type, arg_name */
+#define DPNI_CMD_SET_COUNTER(cmd, counter, value) \
+do { \
+       MC_CMD_OP(cmd, 0, 0,  16, enum dpni_counter, counter); \
+       MC_CMD_OP(cmd, 1, 0,  64, uint64_t, value); \
+} while (0)
+
+/*                cmd, param, offset, width, type, arg_name */
+#define DPNI_CMD_SET_LINK_CFG(cmd, cfg) \
+do { \
+       MC_CMD_OP(cmd, 1, 0,  64, uint64_t, cfg->rate);\
+       MC_CMD_OP(cmd, 2, 0,  64, uint64_t, cfg->options);\
+} while (0)
+
+/*                cmd, param, offset, width, type, arg_name */
+#define DPNI_RSP_GET_LINK_STATE(cmd, state) \
+do { \
+       MC_RSP_OP(cmd, 0, 32,  1, int,      state->up);\
+       MC_RSP_OP(cmd, 1, 0,  64, uint64_t, state->rate);\
+       MC_RSP_OP(cmd, 2, 0,  64, uint64_t, state->options);\
+} while (0)
+
+
+
+/*                cmd, param, offset, width, type, arg_name */
+#define DPNI_CMD_SET_PRIMARY_MAC_ADDR(cmd, mac_addr) \
+do { \
+       MC_CMD_OP(cmd, 0, 16, 8,  uint8_t,  mac_addr[5]); \
+       MC_CMD_OP(cmd, 0, 24, 8,  uint8_t,  mac_addr[4]); \
+       MC_CMD_OP(cmd, 0, 32, 8,  uint8_t,  mac_addr[3]); \
+       MC_CMD_OP(cmd, 0, 40, 8,  uint8_t,  mac_addr[2]); \
+       MC_CMD_OP(cmd, 0, 48, 8,  uint8_t,  mac_addr[1]); \
+       MC_CMD_OP(cmd, 0, 56, 8,  uint8_t,  mac_addr[0]); \
+} while (0)
+
+/*                cmd, param, offset, width, type, arg_name */
+#define DPNI_RSP_GET_PRIMARY_MAC_ADDR(cmd, mac_addr) \
+do { \
+       MC_RSP_OP(cmd, 0, 16, 8,  uint8_t,  mac_addr[5]); \
+       MC_RSP_OP(cmd, 0, 24, 8,  uint8_t,  mac_addr[4]); \
+       MC_RSP_OP(cmd, 0, 32, 8,  uint8_t,  mac_addr[3]); \
+       MC_RSP_OP(cmd, 0, 40, 8,  uint8_t,  mac_addr[2]); \
+       MC_RSP_OP(cmd, 0, 48, 8,  uint8_t,  mac_addr[1]); \
+       MC_RSP_OP(cmd, 0, 56, 8,  uint8_t,  mac_addr[0]); \
+} while (0)
+
+/*                cmd, param, offset, width, type, arg_name */
+#define DPNI_CMD_ADD_MAC_ADDR(cmd, mac_addr) \
+do { \
+       MC_CMD_OP(cmd, 0, 16, 8,  uint8_t,  mac_addr[5]); \
+       MC_CMD_OP(cmd, 0, 24, 8,  uint8_t,  mac_addr[4]); \
+       MC_CMD_OP(cmd, 0, 32, 8,  uint8_t,  mac_addr[3]); \
+       MC_CMD_OP(cmd, 0, 40, 8,  uint8_t,  mac_addr[2]); \
+       MC_CMD_OP(cmd, 0, 48, 8,  uint8_t,  mac_addr[1]); \
+       MC_CMD_OP(cmd, 0, 56, 8,  uint8_t,  mac_addr[0]); \
+} while (0)
+
+/*                cmd, param, offset, width, type, arg_name */
+#define DPNI_CMD_REMOVE_MAC_ADDR(cmd, mac_addr) \
+do { \
+       MC_CMD_OP(cmd, 0, 16, 8,  uint8_t,  mac_addr[5]); \
+       MC_CMD_OP(cmd, 0, 24, 8,  uint8_t,  mac_addr[4]); \
+       MC_CMD_OP(cmd, 0, 32, 8,  uint8_t,  mac_addr[3]); \
+       MC_CMD_OP(cmd, 0, 40, 8,  uint8_t,  mac_addr[2]); \
+       MC_CMD_OP(cmd, 0, 48, 8,  uint8_t,  mac_addr[1]); \
+       MC_CMD_OP(cmd, 0, 56, 8,  uint8_t,  mac_addr[0]); \
+} while (0)
+
+/*                cmd, param, offset, width, type, arg_name */
+#define DPNI_CMD_SET_TX_FLOW(cmd, flow_id, cfg) \
+do { \
+       MC_CMD_OP(cmd, 0, 0,  32, int,     \
+                          cfg->conf_err_cfg.queue_cfg.dest_cfg.dest_id);\
+       MC_CMD_OP(cmd, 0, 32, 8,  uint8_t, \
+                          cfg->conf_err_cfg.queue_cfg.dest_cfg.priority);\
+       MC_CMD_OP(cmd, 0, 40, 2,  enum dpni_dest, \
+                          cfg->conf_err_cfg.queue_cfg.dest_cfg.dest_type);\
+       MC_CMD_OP(cmd, 0, 42, 1,  int,      cfg->conf_err_cfg.errors_only);\
+       MC_CMD_OP(cmd, 0, 43, 1,  int,      cfg->l3_chksum_gen);\
+       MC_CMD_OP(cmd, 0, 44, 1,  int,      cfg->l4_chksum_gen);\
+       MC_CMD_OP(cmd, 0, 45, 1,  int,      \
+                          cfg->conf_err_cfg.use_default_queue);\
+       MC_CMD_OP(cmd, 0, 48, 16, uint16_t, flow_id);\
+       MC_CMD_OP(cmd, 1, 0,  64, uint64_t, \
+                          cfg->conf_err_cfg.queue_cfg.user_ctx);\
+       MC_CMD_OP(cmd, 2, 0,  32, uint32_t, cfg->options);\
+       MC_CMD_OP(cmd, 2, 32,  32, uint32_t, \
+                          cfg->conf_err_cfg.queue_cfg.options);\
+} while (0)
+
+/*                cmd, param, offset, width, type, arg_name */
+#define DPNI_RSP_SET_TX_FLOW(cmd, flow_id) \
+       MC_RSP_OP(cmd, 0, 48, 16, uint16_t, flow_id)
+
+/*                cmd, param, offset, width, type, arg_name */
+#define DPNI_CMD_GET_TX_FLOW(cmd, flow_id) \
+       MC_CMD_OP(cmd, 0, 48, 16, uint16_t, flow_id)
+
+/*                cmd, param, offset, width, type, arg_name */
+#define DPNI_RSP_GET_TX_FLOW(cmd, attr) \
+do { \
+       MC_RSP_OP(cmd, 0, 0,  32, int,      \
+                       attr->conf_err_attr.queue_attr.dest_cfg.dest_id);\
+       MC_RSP_OP(cmd, 0, 32, 8,  uint8_t,  \
+                       attr->conf_err_attr.queue_attr.dest_cfg.priority);\
+       MC_RSP_OP(cmd, 0, 40, 2,  enum dpni_dest, \
+                       attr->conf_err_attr.queue_attr.dest_cfg.dest_type);\
+       MC_RSP_OP(cmd, 0, 42, 1,  int,      attr->conf_err_attr.errors_only);\
+       MC_RSP_OP(cmd, 0, 43, 1,  int,      attr->l3_chksum_gen);\
+       MC_RSP_OP(cmd, 0, 44, 1,  int,      attr->l4_chksum_gen);\
+       MC_RSP_OP(cmd, 0, 45, 1,  int,      \
+                       attr->conf_err_attr.use_default_queue);\
+       MC_RSP_OP(cmd, 1, 0,  64, uint64_t, \
+                       attr->conf_err_attr.queue_attr.user_ctx);\
+       MC_RSP_OP(cmd, 2, 32, 32, uint32_t, \
+                       attr->conf_err_attr.queue_attr.fqid);\
+} while (0)
+
+/*                cmd, param, offset, width, type, arg_name */
+#define DPNI_CMD_SET_RX_FLOW(cmd, tc_id, flow_id, cfg) \
+do { \
+       MC_CMD_OP(cmd, 0, 0,  32, int,      cfg->dest_cfg.dest_id); \
+       MC_CMD_OP(cmd, 0, 32, 8,  uint8_t,  cfg->dest_cfg.priority);\
+       MC_CMD_OP(cmd, 0, 40, 2,  enum dpni_dest, cfg->dest_cfg.dest_type);\
+       MC_CMD_OP(cmd, 0, 48, 16, uint16_t, flow_id); \
+       MC_CMD_OP(cmd, 1, 0,  64, uint64_t, cfg->user_ctx); \
+       MC_CMD_OP(cmd, 2, 16, 8,  uint8_t,  tc_id); \
+       MC_CMD_OP(cmd, 2, 32,  32, uint32_t, cfg->options); \
+} while (0)
+
+/*                cmd, param, offset, width, type, arg_name */
+#define DPNI_CMD_GET_RX_FLOW(cmd, tc_id, flow_id) \
+do { \
+       MC_CMD_OP(cmd, 0, 16, 8,  uint8_t,  tc_id); \
+       MC_CMD_OP(cmd, 0, 48, 16, uint16_t, flow_id); \
+} while (0)
+
+/*                cmd, param, offset, width, type, arg_name */
+#define DPNI_RSP_GET_RX_FLOW(cmd, attr) \
+do { \
+       MC_RSP_OP(cmd, 0, 0,  32, int,      attr->dest_cfg.dest_id); \
+       MC_RSP_OP(cmd, 0, 32, 8,  uint8_t,  attr->dest_cfg.priority);\
+       MC_RSP_OP(cmd, 0, 40, 2,  enum dpni_dest, attr->dest_cfg.dest_type); \
+       MC_RSP_OP(cmd, 1, 0,  64, uint64_t, attr->user_ctx); \
+       MC_RSP_OP(cmd, 2, 32, 32, uint32_t, attr->fqid); \
+} while (0)
+
+enum net_prot {
+       NET_PROT_NONE = 0,
+       NET_PROT_PAYLOAD,
+       NET_PROT_ETH,
+       NET_PROT_VLAN,
+       NET_PROT_IPV4,
+       NET_PROT_IPV6,
+       NET_PROT_IP,
+       NET_PROT_TCP,
+       NET_PROT_UDP,
+       NET_PROT_UDP_LITE,
+       NET_PROT_IPHC,
+       NET_PROT_SCTP,
+       NET_PROT_SCTP_CHUNK_DATA,
+       NET_PROT_PPPOE,
+       NET_PROT_PPP,
+       NET_PROT_PPPMUX,
+       NET_PROT_PPPMUX_SUBFRM,
+       NET_PROT_L2TPV2,
+       NET_PROT_L2TPV3_CTRL,
+       NET_PROT_L2TPV3_SESS,
+       NET_PROT_LLC,
+       NET_PROT_LLC_SNAP,
+       NET_PROT_NLPID,
+       NET_PROT_SNAP,
+       NET_PROT_MPLS,
+       NET_PROT_IPSEC_AH,
+       NET_PROT_IPSEC_ESP,
+       NET_PROT_UDP_ENC_ESP, /* RFC 3948 */
+       NET_PROT_MACSEC,
+       NET_PROT_GRE,
+       NET_PROT_MINENCAP,
+       NET_PROT_DCCP,
+       NET_PROT_ICMP,
+       NET_PROT_IGMP,
+       NET_PROT_ARP,
+       NET_PROT_CAPWAP_DATA,
+       NET_PROT_CAPWAP_CTRL,
+       NET_PROT_RFC2684,
+       NET_PROT_ICMPV6,
+       NET_PROT_FCOE,
+       NET_PROT_FIP,
+       NET_PROT_ISCSI,
+       NET_PROT_GTP,
+       NET_PROT_USER_DEFINED_L2,
+       NET_PROT_USER_DEFINED_L3,
+       NET_PROT_USER_DEFINED_L4,
+       NET_PROT_USER_DEFINED_L5,
+       NET_PROT_USER_DEFINED_SHIM1,
+       NET_PROT_USER_DEFINED_SHIM2,
+
+       NET_PROT_DUMMY_LAST
+};
+
+/* Data Path Network Interface API
+ * Contains initialization APIs and runtime control APIs for DPNI
+ */
+
+struct fsl_mc_io;
+
+/* General DPNI macros */
+
+/* Maximum number of traffic classes */
+#define DPNI_MAX_TC                            8
+/* Maximum number of buffer pools per DPNI */
+#define DPNI_MAX_DPBP                          8
+
+/* All traffic classes considered; see dpni_set_rx_flow() */
+#define DPNI_ALL_TCS                           (uint8_t)(-1)
+/* All flows within traffic class considered; see dpni_set_rx_flow() */
+#define DPNI_ALL_TC_FLOWS                      (uint16_t)(-1)
+/* Generate new flow ID; see dpni_set_tx_flow() */
+#define DPNI_NEW_FLOW_ID                       (uint16_t)(-1)
+
+/**
+ * dpni_open() - Open a control session for the specified object
+ * @mc_io:     Pointer to MC portal's I/O object
+ * @dpni_id:   DPNI unique ID
+ * @token:     Returned token; use in subsequent API calls
+ *
+ * This function can be used to open a control session for an
+ * already created object; an object may have been declared in
+ * the DPL or by calling the dpni_create() function.
+ * This function returns a unique authentication token,
+ * associated with the specific object ID and the specific MC
+ * portal; this token must be used in all subsequent commands for
+ * this specific object.
+ *
+ * Return:     '0' on Success; Error code otherwise.
+ */
+int dpni_open(struct fsl_mc_io *mc_io, int dpni_id, uint16_t *token);
+
+/**
+ * dpni_close() - Close the control session of the object
+ * @mc_io:     Pointer to MC portal's I/O object
+ * @token:     Token of DPNI object
+ *
+ * After this function is called, no further operations are
+ * allowed on the object without opening a new control session.
+ *
+ * Return:     '0' on Success; Error code otherwise.
+ */
+int dpni_close(struct fsl_mc_io *mc_io, uint16_t token);
+
+/**
+ * struct dpni_ipr_cfg - Structure representing IP reassembly configuration
+ * @max_reass_frm_size: Maximum size of the reassembled frame
+ * @min_frag_size_ipv4: Minimum fragment size of IPv4 fragments
+ * @min_frag_size_ipv6: Minimum fragment size of IPv6 fragments
+ * @max_open_frames_ipv4: Maximum concurrent IPv4 packets in reassembly process
+ * @max_open_frames_ipv6: Maximum concurrent IPv6 packets in reassembly process
+ */
+struct dpni_ipr_cfg {
+       uint16_t max_reass_frm_size;
+       uint16_t min_frag_size_ipv4;
+       uint16_t min_frag_size_ipv6;
+       uint16_t max_open_frames_ipv4;
+       uint16_t max_open_frames_ipv6;
+};
+
+/**
+ * struct dpni_pools_cfg - Structure representing buffer pools configuration
+ * @num_dpbp: Number of DPBPs
+ * @pools: Array of buffer pools parameters; The number of valid entries
+ *     must match 'num_dpbp' value
+ */
+struct dpni_pools_cfg {
+       uint8_t num_dpbp;
+       /**
+        * struct pools - Buffer pools parameters
+        * @dpbp_id: DPBP object ID
+        * @buffer_size: Buffer size
+        */
+       struct {
+               int dpbp_id;
+               uint16_t buffer_size;
+       } pools[DPNI_MAX_DPBP];
+};
+
+/**
+ * dpni_set_pools() - Set buffer pools configuration
+ * @mc_io:     Pointer to MC portal's I/O object
+ * @token:     Token of DPNI object
+ * @cfg:       Buffer pools configuration
+ *
+ * mandatory for DPNI operation
+ * warning:Allowed only when DPNI is disabled
+ *
+ * Return:     '0' on Success; Error code otherwise.
+ */
+int dpni_set_pools(struct fsl_mc_io            *mc_io,
+                  uint16_t                     token,
+                  const struct dpni_pools_cfg  *cfg);
+
+/**
+ * dpni_enable() - Enable the DPNI, allow sending and receiving frames.
+ * @mc_io:             Pointer to MC portal's I/O object
+ * @token:             Token of DPNI object
+ *
+ * Return:     '0' on Success; Error code otherwise.
+ */
+int dpni_enable(struct fsl_mc_io *mc_io, uint16_t token);
+
+/**
+ * dpni_disable() - Disable the DPNI, stop sending and receiving frames.
+ * @mc_io:     Pointer to MC portal's I/O object
+ * @token:     Token of DPNI object
+ *
+ * Return:     '0' on Success; Error code otherwise.
+ */
+int dpni_disable(struct fsl_mc_io *mc_io, uint16_t token);
+
+
+/**
+ * @dpni_reset() - Reset the DPNI, returns the object to initial state.
+ * @mc_io:     Pointer to MC portal's I/O object
+ * @token:     Token of DPNI object
+ *
+ * Return:     '0' on Success; Error code otherwise.
+ */
+int dpni_reset(struct fsl_mc_io *mc_io, uint16_t token);
+
+/**
+ * struct dpni_attr - Structure representing DPNI attributes
+ * @id: DPNI object ID
+ * @version: DPNI version
+ * @start_hdr: Indicates the packet starting header for parsing
+ * @options: Mask of available options; reflects the value as was given in
+ *             object's creation
+ * @max_senders: Maximum number of different senders; used as the number
+ *             of dedicated Tx flows;
+ * @max_tcs: Maximum number of traffic classes (for both Tx and Rx)
+ * @max_dist_per_tc: Maximum distribution size per Rx traffic class;
+ *                     Set to the required value minus 1
+ * @max_unicast_filters: Maximum number of unicast filters
+ * @max_multicast_filters: Maximum number of multicast filters
+ * @max_vlan_filters: Maximum number of VLAN filters
+ * @max_qos_entries: if 'max_tcs > 1', declares the maximum entries in QoS table
+ * @max_qos_key_size: Maximum key size for the QoS look-up
+ * @max_dist_key_size: Maximum key size for the distribution look-up
+ * @ipr_cfg: IP reassembly configuration
+ */
+struct dpni_attr {
+       int id;
+       /**
+        * struct version - DPNI version
+        * @major: DPNI major version
+        * @minor: DPNI minor version
+        */
+       struct {
+               uint16_t major;
+               uint16_t minor;
+       } version;
+       enum net_prot start_hdr;
+       uint64_t options;
+       uint8_t max_senders;
+       uint8_t max_tcs;
+       uint8_t max_dist_per_tc[DPNI_MAX_TC];
+       uint8_t max_unicast_filters;
+       uint8_t max_multicast_filters;
+       uint8_t max_vlan_filters;
+       uint8_t max_qos_entries;
+       uint8_t max_qos_key_size;
+       uint8_t max_dist_key_size;
+       struct dpni_ipr_cfg ipr_cfg;
+};
+/**
+ * dpni_get_attributes() - Retrieve DPNI attributes.
+ * @mc_io:     Pointer to MC portal's I/O objec
+ * @token:     Token of DPNI object
+ * @attr:      Returned object's attributes
+ *
+ * Return:     '0' on Success; Error code otherwise.
+ */
+int dpni_get_attributes(struct fsl_mc_io       *mc_io,
+                       uint16_t                token,
+                       struct dpni_attr        *attr);
+
+/* DPNI buffer layout modification options */
+
+/* Select to modify the time-stamp setting */
+#define DPNI_BUF_LAYOUT_OPT_TIMESTAMP          0x00000001
+/* Select to modify the parser-result setting; not applicable for Tx */
+#define DPNI_BUF_LAYOUT_OPT_PARSER_RESULT      0x00000002
+/* Select to modify the frame-status setting */
+#define DPNI_BUF_LAYOUT_OPT_FRAME_STATUS       0x00000004
+/* Select to modify the private-data-size setting */
+#define DPNI_BUF_LAYOUT_OPT_PRIVATE_DATA_SIZE  0x00000008
+/* Select to modify the data-alignment setting */
+#define DPNI_BUF_LAYOUT_OPT_DATA_ALIGN         0x00000010
+/* Select to modify the data-head-room setting */
+#define DPNI_BUF_LAYOUT_OPT_DATA_HEAD_ROOM     0x00000020
+/*!< Select to modify the data-tail-room setting */
+#define DPNI_BUF_LAYOUT_OPT_DATA_TAIL_ROOM     0x00000040
+
+/**
+ * struct dpni_buffer_layout - Structure representing DPNI buffer layout
+ * @options: Flags representing the suggested modifications to the buffer
+ *             layout; Use any combination of 'DPNI_BUF_LAYOUT_OPT_<X>' flags
+ * @pass_timestamp: Pass timestamp value
+ * @pass_parser_result: Pass parser results
+ * @pass_frame_status: Pass frame status
+ * @private_data_size: Size kept for private data (in bytes)
+ * @data_align: Data alignment
+ * @data_head_room: Data head room
+ * @data_tail_room: Data tail room
+ */
+struct dpni_buffer_layout {
+       uint32_t options;
+       int pass_timestamp;
+       int pass_parser_result;
+       int pass_frame_status;
+       uint16_t private_data_size;
+       uint16_t data_align;
+       uint16_t data_head_room;
+       uint16_t data_tail_room;
+};
+
+/**
+ * dpni_get_rx_buffer_layout() - Retrieve Rx buffer layout attributes.
+ * @mc_io:     Pointer to MC portal's I/O object
+ * @token:     Token of DPNI object
+ * @layout:    Returns buffer layout attributes
+ *
+ * Return:     '0' on Success; Error code otherwise.
+ */
+int dpni_get_rx_buffer_layout(struct fsl_mc_io         *mc_io,
+                             uint16_t                  token,
+                             struct dpni_buffer_layout *layout);
+/**
+ * dpni_set_rx_buffer_layout() - Set Rx buffer layout configuration.
+ * @mc_io:     Pointer to MC portal's I/O object
+ * @token:     Token of DPNI object
+ * @layout:    Buffer layout configuration
+ *
+ * Return:     '0' on Success; Error code otherwise.
+ *
+ * @warning    Allowed only when DPNI is disabled
+ */
+int dpni_set_rx_buffer_layout(struct fsl_mc_io                 *mc_io,
+                             uint16_t                          token,
+                             const struct dpni_buffer_layout   *layout);
+
+/**
+ * dpni_get_tx_buffer_layout() - Retrieve Tx buffer layout attributes.
+ * @mc_io:     Pointer to MC portal's I/O object
+ * @token:     Token of DPNI object
+ * @layout:    Returns buffer layout attributes
+ *
+ * Return:     '0' on Success; Error code otherwise.
+ */
+int dpni_get_tx_buffer_layout(struct fsl_mc_io         *mc_io,
+                             uint16_t                  token,
+                             struct dpni_buffer_layout *layout);
+
+/**
+ * @brief      Set Tx buffer layout configuration.
+ *
+ * @param[in]  mc_io   Pointer to MC portal's I/O object
+ * @param[in]   token  Token of DPNI object
+ * @param[in]  layout  Buffer layout configuration
+ *
+ * @returns    '0' on Success; Error code otherwise.
+ *
+ * @warning    Allowed only when DPNI is disabled
+ */
+int dpni_set_tx_buffer_layout(struct fsl_mc_io                 *mc_io,
+                             uint16_t                          token,
+                             const struct dpni_buffer_layout   *layout);
+/**
+ * dpni_get_tx_conf_buffer_layout() - Retrieve Tx confirmation buffer layout
+ *                             attributes.
+ * @mc_io:     Pointer to MC portal's I/O object
+ * @token:     Token of DPNI object
+ * @layout:    Returns buffer layout attributes
+ *
+ * Return:     '0' on Success; Error code otherwise.
+ */
+int dpni_get_tx_conf_buffer_layout(struct fsl_mc_io            *mc_io,
+                                  uint16_t                     token,
+                                  struct dpni_buffer_layout    *layout);
+/**
+ * dpni_set_tx_conf_buffer_layout() - Set Tx confirmation buffer layout
+ *                                     configuration.
+ * @mc_io:     Pointer to MC portal's I/O object
+ * @token:     Token of DPNI object
+ * @layout:    Buffer layout configuration
+ *
+ * Return:     '0' on Success; Error code otherwise.
+ *
+ * @warning    Allowed only when DPNI is disabled
+ */
+int dpni_set_tx_conf_buffer_layout(struct fsl_mc_io               *mc_io,
+                                  uint16_t                        token,
+                                  const struct dpni_buffer_layout *layout);
+/**
+ * dpni_get_spid() - Get the AIOP storage profile ID associated with the DPNI
+ * @mc_io:     Pointer to MC portal's I/O object
+ * @token:     Token of DPNI object
+ * @spid:      Returned aiop storage-profile ID
+ *
+ * Return:     '0' on Success; Error code otherwise.
+ *
+ * @warning    Only relevant for DPNI that belongs to AIOP container.
+ */
+int dpni_get_qdid(struct fsl_mc_io *mc_io, uint16_t token, uint16_t *qdid);
+
+/**
+ * dpni_get_tx_data_offset() - Get the Tx data offset (from start of buffer)
+ * @mc_io:     Pointer to MC portal's I/O object
+ * @token:     Token of DPNI object
+ * @data_offset: Tx data offset (from start of buffer)
+ *
+ * Return:     '0' on Success; Error code otherwise.
+ */
+int dpni_get_tx_data_offset(struct fsl_mc_io   *mc_io,
+                           uint16_t            token,
+                           uint16_t            *data_offset);
+
+/**
+ * enum dpni_counter - DPNI counter types
+ * @DPNI_CNT_ING_FRAME: Counts ingress frames
+ * @DPNI_CNT_ING_BYTE: Counts ingress bytes
+ * @DPNI_CNT_ING_FRAME_DROP: Counts ingress frames dropped due to explicit
+ *             'drop' setting
+ * @DPNI_CNT_ING_FRAME_DISCARD: Counts ingress frames discarded due to errors
+ * @DPNI_CNT_ING_MCAST_FRAME: Counts ingress multicast frames
+ * @DPNI_CNT_ING_MCAST_BYTE: Counts ingress multicast bytes
+ * @DPNI_CNT_ING_BCAST_FRAME: Counts ingress broadcast frames
+ * @DPNI_CNT_ING_BCAST_BYTES: Counts ingress broadcast bytes
+ * @DPNI_CNT_EGR_FRAME: Counts egress frames
+ * @DPNI_CNT_EGR_BYTE: Counts egress bytes
+ * @DPNI_CNT_EGR_FRAME_DISCARD: Counts egress frames discarded due to errors
+ */
+enum dpni_counter {
+       DPNI_CNT_ING_FRAME = 0x0,
+       DPNI_CNT_ING_BYTE = 0x1,
+       DPNI_CNT_ING_FRAME_DROP = 0x2,
+       DPNI_CNT_ING_FRAME_DISCARD = 0x3,
+       DPNI_CNT_ING_MCAST_FRAME = 0x4,
+       DPNI_CNT_ING_MCAST_BYTE = 0x5,
+       DPNI_CNT_ING_BCAST_FRAME = 0x6,
+       DPNI_CNT_ING_BCAST_BYTES = 0x7,
+       DPNI_CNT_EGR_FRAME = 0x8,
+       DPNI_CNT_EGR_BYTE = 0x9,
+       DPNI_CNT_EGR_FRAME_DISCARD = 0xa
+};
+
+/**
+ * dpni_get_counter() - Read a specific DPNI counter
+ * @mc_io:     Pointer to MC portal's I/O object
+ * @token:     Token of DPNI object
+ * @counter:   The requested counter
+ * @value:     Returned counter's current value
+ *
+ * Return:     '0' on Success; Error code otherwise.
+ */
+int dpni_get_counter(struct fsl_mc_io  *mc_io,
+                    uint16_t           token,
+                    enum dpni_counter  counter,
+                    uint64_t           *value);
+
+/**
+ * dpni_set_counter() - Set (or clear) a specific DPNI counter
+ * @mc_io:     Pointer to MC portal's I/O object
+ * @token:     Token of DPNI object
+ * @counter:   The requested counter
+ * @value:     New counter value; typically pass '0' for resetting
+ *                     the counter.
+ *
+ * Return:     '0' on Success; Error code otherwise.
+ */
+int dpni_set_counter(struct fsl_mc_io  *mc_io,
+                    uint16_t           token,
+                    enum dpni_counter  counter,
+                    uint64_t           value);
+/**
+ * struct - Structure representing DPNI link configuration
+ * @rate: Rate
+ * @options: Mask of available options; use 'DPNI_LINK_OPT_<X>' values
+ */
+struct dpni_link_cfg {
+       uint64_t rate;
+       uint64_t options;
+};
+
+/**
+ * dpni_set_link_cfg() - set the link configuration.
+ * @mc_io:     Pointer to MC portal's I/O object
+ * @token:     Token of DPNI object
+ * @cfg:       Link configuration
+ *
+ * Return:     '0' on Success; Error code otherwise.
+ */
+int dpni_set_link_cfg(struct fsl_mc_io *mc_io,
+                     uint16_t token,
+                     struct dpni_link_cfg *cfg);
+
+/**
+ * struct dpni_link_state - Structure representing DPNI link state
+ * @rate: Rate
+ * @options: Mask of available options; use 'DPNI_LINK_OPT_<X>' values
+ * @up: Link state; '0' for down, '1' for up
+ */
+struct dpni_link_state {
+       uint64_t rate;
+       uint64_t options;
+       int up;
+};
+
+/**
+ * dpni_get_link_state() - Return the link state (either up or down)
+ * @mc_io:     Pointer to MC portal's I/O object
+ * @token:     Token of DPNI object
+ * @state:     Returned link state;
+ *
+ * Return:     '0' on Success; Error code otherwise.
+ */
+int dpni_get_link_state(struct fsl_mc_io *mc_io,
+                       uint16_t token,
+                       struct dpni_link_state *state);
+
+/**
+ * dpni_set_primary_mac_addr() - Set the primary MAC address
+ * @mc_io:     Pointer to MC portal's I/O object
+ * @token:     Token of DPNI object
+ * @mac_addr:  MAC address to set as primary address
+ *
+ * Return:     '0' on Success; Error code otherwise.
+ */
+int dpni_set_primary_mac_addr(struct fsl_mc_io *mc_io,
+                             uint16_t          token,
+                             const uint8_t     mac_addr[6]);
+/**
+ * dpni_get_primary_mac_addr() - Get the primary MAC address
+ * @mc_io:     Pointer to MC portal's I/O object
+ * @token:     Token of DPNI object
+ * @mac_addr:  Returned MAC address
+ *
+ * Return:     '0' on Success; Error code otherwise.
+ */
+int dpni_get_primary_mac_addr(struct fsl_mc_io *mc_io,
+                             uint16_t          token,
+                             uint8_t           mac_addr[6]);
+/**
+ * dpni_add_mac_addr() - Add MAC address filter
+ * @mc_io:     Pointer to MC portal's I/O object
+ * @token:     Token of DPNI object
+ * @mac_addr:  MAC address to add
+ *
+ * Return:     '0' on Success; Error code otherwise.
+ */
+int dpni_add_mac_addr(struct fsl_mc_io *mc_io,
+                     uint16_t          token,
+                     const uint8_t     mac_addr[6]);
+
+/**
+ * dpni_remove_mac_addr() - Remove MAC address filter
+ * @mc_io:     Pointer to MC portal's I/O object
+ * @token:     Token of DPNI object
+ * @mac_addr:  MAC address to remove
+ *
+ * Return:     '0' on Success; Error code otherwise.
+ */
+int dpni_remove_mac_addr(struct fsl_mc_io      *mc_io,
+                        uint16_t               token,
+                        const uint8_t          mac_addr[6]);
+
+/**
+ * enum dpni_dest - DPNI destination types
+ * DPNI_DEST_NONE: Unassigned destination; The queue is set in parked mode and
+ *             does not generate FQDAN notifications; user is expected to
+ *             dequeue from the queue based on polling or other user-defined
+ *             method
+ * @DPNI_DEST_DPIO: The queue is set in schedule mode and generates FQDAN
+ *             notifications to the specified DPIO; user is expected to dequeue
+ *             from the queue only after notification is received
+ * @DPNI_DEST_DPCON: The queue is set in schedule mode and does not generate
+ *             FQDAN notifications, but is connected to the specified DPCON
+ *             object; user is expected to dequeue from the DPCON channel
+ */
+enum dpni_dest {
+       DPNI_DEST_NONE = 0,
+       DPNI_DEST_DPIO = 1,
+       DPNI_DEST_DPCON = 2
+};
+
+/**
+ * struct dpni_dest_cfg - Structure representing DPNI destination parameters
+ * @dest_type: Destination type
+ * @dest_id: Either DPIO ID or DPCON ID, depending on the destination type
+ * @priority: Priority selection within the DPIO or DPCON channel; valid values
+ *             are 0-1 or 0-7, depending on the number of priorities in that
+ *             channel; not relevant for 'DPNI_DEST_NONE' option
+ */
+struct dpni_dest_cfg {
+       enum dpni_dest dest_type;
+       int dest_id;
+       uint8_t priority;
+};
+
+/* DPNI queue modification options */
+
+/* Select to modify the user's context associated with the queue */
+#define DPNI_QUEUE_OPT_USER_CTX                0x00000001
+/* Select to modify the queue's destination */
+#define DPNI_QUEUE_OPT_DEST            0x00000002
+
+/**
+ * struct dpni_queue_cfg - Structure representing queue configuration
+ * @options: Flags representing the suggested modifications to the queue;
+ *             Use any combination of 'DPNI_QUEUE_OPT_<X>' flags
+ * @user_ctx: User context value provided in the frame descriptor of each
+ *             dequeued frame; valid only if 'DPNI_QUEUE_OPT_USER_CTX'
+ *             is contained in 'options'
+ * @dest_cfg: Queue destination parameters;
+ *             valid only if 'DPNI_QUEUE_OPT_DEST' is contained in 'options'
+ */
+struct dpni_queue_cfg {
+       uint32_t options;
+       uint64_t user_ctx;
+       struct dpni_dest_cfg dest_cfg;
+};
+
+/**
+ * struct dpni_queue_attr - Structure representing queue attributes
+ * @user_ctx: User context value provided in the frame descriptor of each
+ *     dequeued frame
+ * @dest_cfg: Queue destination configuration
+ * @fqid: Virtual fqid value to be used for dequeue operations
+ */
+struct dpni_queue_attr {
+       uint64_t user_ctx;
+       struct dpni_dest_cfg dest_cfg;
+       uint32_t fqid;
+};
+
+/* DPNI Tx flow modification options */
+
+/* Select to modify the settings for dedicate Tx confirmation/error */
+#define DPNI_TX_FLOW_OPT_TX_CONF_ERROR 0x00000001
+/*!< Select to modify the Tx confirmation and/or error setting */
+#define DPNI_TX_FLOW_OPT_ONLY_TX_ERROR 0x00000002
+/*!< Select to modify the queue configuration */
+#define DPNI_TX_FLOW_OPT_QUEUE         0x00000004
+/*!< Select to modify the L3 checksum generation setting */
+#define DPNI_TX_FLOW_OPT_L3_CHKSUM_GEN 0x00000010
+/*!< Select to modify the L4 checksum generation setting */
+#define DPNI_TX_FLOW_OPT_L4_CHKSUM_GEN 0x00000020
+
+/**
+ * struct dpni_tx_flow_cfg - Structure representing Tx flow configuration
+ * @options: Flags representing the suggested modifications to the Tx flow;
+ *             Use any combination 'DPNI_TX_FLOW_OPT_<X>' flags
+ * @conf_err_cfg: Tx confirmation and error configuration; these settings are
+ *             ignored if 'DPNI_OPT_PRIVATE_TX_CONF_ERROR_DISABLED' was set at
+ *             DPNI creation
+ * @l3_chksum_gen: Set to '1' to enable L3 checksum generation; '0' to disable;
+ *             valid only if 'DPNI_TX_FLOW_OPT_L3_CHKSUM_GEN' is contained in
+ *             'options'
+ * @l4_chksum_gen: Set to '1' to enable L4 checksum generation; '0' to disable;
+ *             valid only if 'DPNI_TX_FLOW_OPT_L4_CHKSUM_GEN' is contained in
+ *             'options'
+ */
+struct dpni_tx_flow_cfg {
+       uint32_t options;
+       /**
+        * struct cnf_err_cfg - Tx confirmation and error configuration
+        * @use_default_queue: Set to '1' to use the common (default) Tx
+        *              confirmation and error queue; Set to '0' to use the
+        *              private Tx confirmation and error queue; valid only if
+        *              'DPNI_TX_FLOW_OPT_TX_CONF_ERROR' is contained in
+        *              'options'
+        * @errors_only: Set to '1' to report back only error frames;
+        *              Set to '0' to confirm transmission/error for all
+        *              transmitted frames;
+        *              valid only if 'DPNI_TX_FLOW_OPT_ONLY_TX_ERROR' is
+        *              contained in 'options' and 'use_default_queue = 0';
+        * @queue_cfg: Queue configuration; valid only if
+        *              'DPNI_TX_FLOW_OPT_QUEUE' is contained in 'options'
+        */
+       struct {
+               int use_default_queue;
+               int errors_only;
+               struct dpni_queue_cfg queue_cfg;
+       } conf_err_cfg;
+       int l3_chksum_gen;
+       int l4_chksum_gen;
+};
+
+/**
+ * dpni_set_tx_flow() - Set Tx flow configuration
+ * @mc_io:     Pointer to MC portal's I/O object
+ * @token:     Token of DPNI object
+ * @flow_id:   Provides (or returns) the sender's flow ID;
+ *                             for each new sender set (*flow_id) to
+ *                             'DPNI_NEW_FLOW_ID' to generate a new flow_id;
+ *                             this ID should be used as the QDBIN argument
+ *                             in enqueue operations
+ * @cfg:       Tx flow configuration
+ *
+ * Return:     '0' on Success; Error code otherwise.
+ */
+int dpni_set_tx_flow(struct fsl_mc_io                  *mc_io,
+                    uint16_t                           token,
+                    uint16_t                           *flow_id,
+                    const struct dpni_tx_flow_cfg      *cfg);
+
+/**
+ * struct dpni_tx_flow_attr - Structure representing Tx flow attributes
+ * @conf_err_attr: Tx confirmation and error attributes
+ * @l3_chksum_gen: '1' if L3 checksum generation is enabled; '0' if disabled
+ * @l4_chksum_gen: '1' if L4 checksum generation is enabled; '0' if disabled
+ */
+struct dpni_tx_flow_attr {
+       /**
+        * struct conf_err_attr - Tx confirmation and error attributes
+        * @use_default_queue: '1' if using common (default) Tx confirmation and
+        *                      error queue;
+        *                      '0' if using private Tx confirmation and error
+        *                      queue
+        * @errors_only: '1' if only error frames are reported back; '0' if all
+        *              transmitted frames are confirmed
+        * @queue_attr: Queue attributes
+        */
+       struct {
+               int use_default_queue;
+               int errors_only;
+               struct dpni_queue_attr queue_attr;
+       } conf_err_attr;
+       int l3_chksum_gen;
+       int l4_chksum_gen;
+};
+
+/**
+ * dpni_get_tx_flow() - Get Tx flow attributes
+ * @mc_io:     Pointer to MC portal's I/O object
+ * @token:     Token of DPNI object
+ * @flow_id:   The sender's flow ID, as returned by the
+ *                     dpni_set_tx_flow() function
+ * @attr:      Returned Tx flow attributes
+ *
+ * Return:     '0' on Success; Error code otherwise.
+ */
+int dpni_get_tx_flow(struct fsl_mc_io          *mc_io,
+                    uint16_t                   token,
+                    uint16_t                   flow_id,
+                    struct dpni_tx_flow_attr   *attr);
+
+/**
+ * dpni_set_rx_flow() - Set Rx flow configuration
+ * @mc_io:     Pointer to MC portal's I/O object
+ * @token:     Token of DPNI object
+ * @tc_id:     Traffic class selection (0-7);
+ *                     use 'DPNI_ALL_TCS' to set all TCs and all flows
+ * @flow_id    Rx flow id within the traffic class; use
+ *                     'DPNI_ALL_TC_FLOWS' to set all flows within
+ *                     this tc_id; ignored if tc_id is set to
+ *                     'DPNI_ALL_TCS';
+ * @cfg:       Rx flow configuration
+ *
+ * Return:     '0' on Success; Error code otherwise.
+ */
+int dpni_set_rx_flow(struct fsl_mc_io                  *mc_io,
+                    uint16_t                           token,
+                    uint8_t                            tc_id,
+                    uint16_t                           flow_id,
+                    const struct dpni_queue_cfg        *cfg);
+
+/**
+ * dpni_get_rx_flow() -        Get Rx flow attributes
+ * @mc_io:     Pointer to MC portal's I/O object
+ * @token:     Token of DPNI object
+ * @tc_id:     Traffic class selection (0-7)
+ * @flow_id:   Rx flow id within the traffic class
+ * @attr:      Returned Rx flow attributes
+ *
+ * Return:     '0' on Success; Error code otherwise.
+ */
+int dpni_get_rx_flow(struct fsl_mc_io          *mc_io,
+                    uint16_t                   token,
+                    uint8_t                    tc_id,
+                    uint16_t                   flow_id,
+                    struct dpni_queue_attr     *attr);
+
+#endif /* _FSL_DPNI_H */
diff --git a/include/fsl-mc/fsl_dprc.h b/include/fsl-mc/fsl_dprc.h
new file mode 100644 (file)
index 0000000..f837e89
--- /dev/null
@@ -0,0 +1,659 @@
+/*
+ * Freescale Layerscape MC I/O wrapper
+ *
+ * Copyright (C) 2013-2015 Freescale Semiconductor, Inc.
+ * Author: German Rivera <German.Rivera@freescale.com>
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+#ifndef _FSL_DPRC_H
+#define _FSL_DPRC_H
+
+/* DPRC Version */
+#define DPRC_VER_MAJOR                         2
+#define DPRC_VER_MINOR                         0
+
+/* Command IDs */
+#define DPRC_CMDID_CLOSE                       0x800
+#define DPRC_CMDID_OPEN                                0x805
+
+#define DPRC_CMDID_GET_ATTR                    0x004
+#define DPRC_CMDID_RESET_CONT                  0x005
+
+#define DPRC_CMDID_GET_CONT_ID                 0x830
+#define DPRC_CMDID_GET_OBJ_COUNT               0x159
+#define DPRC_CMDID_GET_OBJ                     0x15A
+#define DPRC_CMDID_GET_RES_COUNT               0x15B
+#define DPRC_CMDID_GET_RES_IDS                 0x15C
+#define DPRC_CMDID_GET_OBJ_REG                 0x15E
+
+#define DPRC_CMDID_CONNECT                     0x167
+#define DPRC_CMDID_DISCONNECT                  0x168
+#define DPRC_CMDID_GET_CONNECTION              0x16C
+
+/*                cmd, param, offset, width, type, arg_name */
+#define DPRC_RSP_GET_CONTAINER_ID(cmd, container_id) \
+       MC_RSP_OP(cmd, 0, 0,  32,  int,     container_id)
+
+/*                cmd, param, offset, width, type, arg_name */
+#define DPRC_CMD_OPEN(cmd, container_id) \
+       MC_CMD_OP(cmd, 0, 0,  32, int,      container_id)
+
+/*                cmd, param, offset, width, type, arg_name */
+#define DPRC_CMD_RESET_CONTAINER(cmd, child_container_id) \
+       MC_CMD_OP(cmd, 0, 0,  32, int,      child_container_id)
+
+/*                cmd, param, offset, width, type, arg_name */
+#define DPRC_RSP_GET_ATTRIBUTES(cmd, attr) \
+do { \
+       MC_RSP_OP(cmd, 0, 0,  32, int,      attr->container_id); \
+       MC_RSP_OP(cmd, 0, 32, 16, uint16_t, attr->icid); \
+       MC_RSP_OP(cmd, 1, 0,  32, uint32_t, attr->options);\
+       MC_RSP_OP(cmd, 1, 32, 32, int,      attr->portal_id); \
+       MC_RSP_OP(cmd, 2, 0,  16, uint16_t, attr->version.major);\
+       MC_RSP_OP(cmd, 2, 16, 16, uint16_t, attr->version.minor);\
+} while (0)
+
+/*                cmd, param, offset, width, type, arg_name */
+#define DPRC_RSP_GET_OBJ_COUNT(cmd, obj_count) \
+       MC_RSP_OP(cmd, 0, 32, 32, int,      obj_count)
+
+/*                cmd, param, offset, width, type, arg_name */
+#define DPRC_CMD_GET_OBJ(cmd, obj_index) \
+       MC_CMD_OP(cmd, 0, 0,  32, int,      obj_index)
+
+/*                cmd, param, offset, width, type, arg_name */
+#define DPRC_RSP_GET_OBJ(cmd, obj_desc) \
+do { \
+       MC_RSP_OP(cmd, 0, 32, 32, int,      obj_desc->id); \
+       MC_RSP_OP(cmd, 1, 0,  16, uint16_t, obj_desc->vendor); \
+       MC_RSP_OP(cmd, 1, 16, 8,  uint8_t,  obj_desc->irq_count); \
+       MC_RSP_OP(cmd, 1, 24, 8,  uint8_t,  obj_desc->region_count); \
+       MC_RSP_OP(cmd, 1, 32, 32, uint32_t, obj_desc->state);\
+       MC_RSP_OP(cmd, 2, 0,  16, uint16_t, obj_desc->ver_major);\
+       MC_RSP_OP(cmd, 2, 16, 16, uint16_t, obj_desc->ver_minor);\
+       MC_RSP_OP(cmd, 3, 0,  8,  char,     obj_desc->type[0]);\
+       MC_RSP_OP(cmd, 3, 8,  8,  char,     obj_desc->type[1]);\
+       MC_RSP_OP(cmd, 3, 16, 8,  char,     obj_desc->type[2]);\
+       MC_RSP_OP(cmd, 3, 24, 8,  char,     obj_desc->type[3]);\
+       MC_RSP_OP(cmd, 3, 32, 8,  char,     obj_desc->type[4]);\
+       MC_RSP_OP(cmd, 3, 40, 8,  char,     obj_desc->type[5]);\
+       MC_RSP_OP(cmd, 3, 48, 8,  char,     obj_desc->type[6]);\
+       MC_RSP_OP(cmd, 3, 56, 8,  char,     obj_desc->type[7]);\
+       MC_RSP_OP(cmd, 4, 0,  8,  char,     obj_desc->type[8]);\
+       MC_RSP_OP(cmd, 4, 8,  8,  char,     obj_desc->type[9]);\
+       MC_RSP_OP(cmd, 4, 16, 8,  char,     obj_desc->type[10]);\
+       MC_RSP_OP(cmd, 4, 24, 8,  char,     obj_desc->type[11]);\
+       MC_RSP_OP(cmd, 4, 32, 8,  char,     obj_desc->type[12]);\
+       MC_RSP_OP(cmd, 4, 40, 8,  char,     obj_desc->type[13]);\
+       MC_RSP_OP(cmd, 4, 48, 8,  char,     obj_desc->type[14]);\
+       MC_RSP_OP(cmd, 4, 56, 8,  char,     obj_desc->type[15]);\
+} while (0)
+
+/*                cmd, param, offset, width, type, arg_name */
+#define DPRC_CMD_GET_RES_COUNT(cmd, type) \
+do { \
+       MC_CMD_OP(cmd, 1, 0,  8,  char,     type[0]);\
+       MC_CMD_OP(cmd, 1, 8,  8,  char,     type[1]);\
+       MC_CMD_OP(cmd, 1, 16, 8,  char,     type[2]);\
+       MC_CMD_OP(cmd, 1, 24, 8,  char,     type[3]);\
+       MC_CMD_OP(cmd, 1, 32, 8,  char,     type[4]);\
+       MC_CMD_OP(cmd, 1, 40, 8,  char,     type[5]);\
+       MC_CMD_OP(cmd, 1, 48, 8,  char,     type[6]);\
+       MC_CMD_OP(cmd, 1, 56, 8,  char,     type[7]);\
+       MC_CMD_OP(cmd, 2, 0,  8,  char,     type[8]);\
+       MC_CMD_OP(cmd, 2, 8,  8,  char,     type[9]);\
+       MC_CMD_OP(cmd, 2, 16, 8,  char,     type[10]);\
+       MC_CMD_OP(cmd, 2, 24, 8,  char,     type[11]);\
+       MC_CMD_OP(cmd, 2, 32, 8,  char,     type[12]);\
+       MC_CMD_OP(cmd, 2, 40, 8,  char,     type[13]);\
+       MC_CMD_OP(cmd, 2, 48, 8,  char,     type[14]);\
+       MC_CMD_OP(cmd, 2, 56, 8,  char,     type[15]);\
+} while (0)
+
+/*                cmd, param, offset, width, type, arg_name */
+#define DPRC_RSP_GET_RES_COUNT(cmd, res_count) \
+       MC_RSP_OP(cmd, 0, 0,  32, int,      res_count)
+
+/*                cmd, param, offset, width, type, arg_name */
+#define DPRC_CMD_GET_RES_IDS(cmd, range_desc, type) \
+do { \
+       MC_CMD_OP(cmd, 0, 42, 7,  enum dprc_iter_status, \
+                                           range_desc->iter_status); \
+       MC_CMD_OP(cmd, 1, 0,  32, int,      range_desc->base_id); \
+       MC_CMD_OP(cmd, 1, 32, 32, int,      range_desc->last_id);\
+       MC_CMD_OP(cmd, 2, 0,  8,  char,     type[0]);\
+       MC_CMD_OP(cmd, 2, 8,  8,  char,     type[1]);\
+       MC_CMD_OP(cmd, 2, 16, 8,  char,     type[2]);\
+       MC_CMD_OP(cmd, 2, 24, 8,  char,     type[3]);\
+       MC_CMD_OP(cmd, 2, 32, 8,  char,     type[4]);\
+       MC_CMD_OP(cmd, 2, 40, 8,  char,     type[5]);\
+       MC_CMD_OP(cmd, 2, 48, 8,  char,     type[6]);\
+       MC_CMD_OP(cmd, 2, 56, 8,  char,     type[7]);\
+       MC_CMD_OP(cmd, 3, 0,  8,  char,     type[8]);\
+       MC_CMD_OP(cmd, 3, 8,  8,  char,     type[9]);\
+       MC_CMD_OP(cmd, 3, 16, 8,  char,     type[10]);\
+       MC_CMD_OP(cmd, 3, 24, 8,  char,     type[11]);\
+       MC_CMD_OP(cmd, 3, 32, 8,  char,     type[12]);\
+       MC_CMD_OP(cmd, 3, 40, 8,  char,     type[13]);\
+       MC_CMD_OP(cmd, 3, 48, 8,  char,     type[14]);\
+       MC_CMD_OP(cmd, 3, 56, 8,  char,     type[15]);\
+} while (0)
+
+/*                cmd, param, offset, width, type, arg_name */
+#define DPRC_RSP_GET_RES_IDS(cmd, range_desc) \
+do { \
+       MC_RSP_OP(cmd, 0, 42, 7,  enum dprc_iter_status, \
+                                           range_desc->iter_status);\
+       MC_RSP_OP(cmd, 1, 0,  32, int,      range_desc->base_id); \
+       MC_RSP_OP(cmd, 1, 32, 32, int,      range_desc->last_id);\
+} while (0)
+
+/*                cmd, param, offset, width, type, arg_name */
+#define DPRC_CMD_GET_OBJ_REGION(cmd, obj_type, obj_id, region_index) \
+do { \
+       MC_CMD_OP(cmd, 0, 0,  32, int,      obj_id); \
+       MC_CMD_OP(cmd, 0, 48, 8,  uint8_t,  region_index);\
+       MC_CMD_OP(cmd, 3, 0,  8,  char,     obj_type[0]);\
+       MC_CMD_OP(cmd, 3, 8,  8,  char,     obj_type[1]);\
+       MC_CMD_OP(cmd, 3, 16, 8,  char,     obj_type[2]);\
+       MC_CMD_OP(cmd, 3, 24, 8,  char,     obj_type[3]);\
+       MC_CMD_OP(cmd, 3, 32, 8,  char,     obj_type[4]);\
+       MC_CMD_OP(cmd, 3, 40, 8,  char,     obj_type[5]);\
+       MC_CMD_OP(cmd, 3, 48, 8,  char,     obj_type[6]);\
+       MC_CMD_OP(cmd, 3, 56, 8,  char,     obj_type[7]);\
+       MC_CMD_OP(cmd, 4, 0,  8,  char,     obj_type[8]);\
+       MC_CMD_OP(cmd, 4, 8,  8,  char,     obj_type[9]);\
+       MC_CMD_OP(cmd, 4, 16, 8,  char,     obj_type[10]);\
+       MC_CMD_OP(cmd, 4, 24, 8,  char,     obj_type[11]);\
+       MC_CMD_OP(cmd, 4, 32, 8,  char,     obj_type[12]);\
+       MC_CMD_OP(cmd, 4, 40, 8,  char,     obj_type[13]);\
+       MC_CMD_OP(cmd, 4, 48, 8,  char,     obj_type[14]);\
+       MC_CMD_OP(cmd, 4, 56, 8,  char,     obj_type[15]);\
+} while (0)
+
+/*     param, offset, width,   type,           arg_name */
+#define DPRC_RSP_GET_OBJ_REGION(cmd, region_desc) \
+do { \
+       MC_RSP_OP(cmd, 1, 0,  64, uint64_t, region_desc->base_paddr);\
+       MC_RSP_OP(cmd, 2, 0,  32, uint32_t, region_desc->size); \
+} while (0)
+
+/*                cmd, param, offset, width, type, arg_name */
+#define DPRC_CMD_CONNECT(cmd, endpoint1, endpoint2) \
+do { \
+       MC_CMD_OP(cmd, 0, 0,  32, int,      endpoint1->id); \
+       MC_CMD_OP(cmd, 0, 32, 32, int,      endpoint1->interface_id); \
+       MC_CMD_OP(cmd, 1, 0,  32, int,      endpoint2->id); \
+       MC_CMD_OP(cmd, 1, 32, 32, int,      endpoint2->interface_id); \
+       MC_CMD_OP(cmd, 2, 0,  8,  char,     endpoint1->type[0]); \
+       MC_CMD_OP(cmd, 2, 8,  8,  char,     endpoint1->type[1]); \
+       MC_CMD_OP(cmd, 2, 16, 8,  char,     endpoint1->type[2]); \
+       MC_CMD_OP(cmd, 2, 24, 8,  char,     endpoint1->type[3]); \
+       MC_CMD_OP(cmd, 2, 32, 8,  char,     endpoint1->type[4]); \
+       MC_CMD_OP(cmd, 2, 40, 8,  char,     endpoint1->type[5]); \
+       MC_CMD_OP(cmd, 2, 48, 8,  char,     endpoint1->type[6]); \
+       MC_CMD_OP(cmd, 2, 56, 8,  char,     endpoint1->type[7]); \
+       MC_CMD_OP(cmd, 3, 0,  8,  char,     endpoint1->type[8]); \
+       MC_CMD_OP(cmd, 3, 8,  8,  char,     endpoint1->type[9]); \
+       MC_CMD_OP(cmd, 3, 16, 8,  char,     endpoint1->type[10]); \
+       MC_CMD_OP(cmd, 3, 24, 8,  char,     endpoint1->type[11]); \
+       MC_CMD_OP(cmd, 3, 32, 8,  char,     endpoint1->type[12]); \
+       MC_CMD_OP(cmd, 3, 40, 8,  char,     endpoint1->type[13]); \
+       MC_CMD_OP(cmd, 3, 48, 8,  char,     endpoint1->type[14]); \
+       MC_CMD_OP(cmd, 3, 56, 8,  char,     endpoint1->type[15]); \
+       MC_CMD_OP(cmd, 5, 0,  8,  char,     endpoint2->type[0]); \
+       MC_CMD_OP(cmd, 5, 8,  8,  char,     endpoint2->type[1]); \
+       MC_CMD_OP(cmd, 5, 16, 8,  char,     endpoint2->type[2]); \
+       MC_CMD_OP(cmd, 5, 24, 8,  char,     endpoint2->type[3]); \
+       MC_CMD_OP(cmd, 5, 32, 8,  char,     endpoint2->type[4]); \
+       MC_CMD_OP(cmd, 5, 40, 8,  char,     endpoint2->type[5]); \
+       MC_CMD_OP(cmd, 5, 48, 8,  char,     endpoint2->type[6]); \
+       MC_CMD_OP(cmd, 5, 56, 8,  char,     endpoint2->type[7]); \
+       MC_CMD_OP(cmd, 6, 0,  8,  char,     endpoint2->type[8]); \
+       MC_CMD_OP(cmd, 6, 8,  8,  char,     endpoint2->type[9]); \
+       MC_CMD_OP(cmd, 6, 16, 8,  char,     endpoint2->type[10]); \
+       MC_CMD_OP(cmd, 6, 24, 8,  char,     endpoint2->type[11]); \
+       MC_CMD_OP(cmd, 6, 32, 8,  char,     endpoint2->type[12]); \
+       MC_CMD_OP(cmd, 6, 40, 8,  char,     endpoint2->type[13]); \
+       MC_CMD_OP(cmd, 6, 48, 8,  char,     endpoint2->type[14]); \
+       MC_CMD_OP(cmd, 6, 56, 8,  char,     endpoint2->type[15]); \
+} while (0)
+
+/*                cmd, param, offset, width, type, arg_name */
+#define DPRC_CMD_DISCONNECT(cmd, endpoint) \
+do { \
+       MC_CMD_OP(cmd, 0, 0,  32, int,      endpoint->id); \
+       MC_CMD_OP(cmd, 0, 32, 32, int,      endpoint->interface_id); \
+       MC_CMD_OP(cmd, 1, 0,  8,  char,     endpoint->type[0]); \
+       MC_CMD_OP(cmd, 1, 8,  8,  char,     endpoint->type[1]); \
+       MC_CMD_OP(cmd, 1, 16, 8,  char,     endpoint->type[2]); \
+       MC_CMD_OP(cmd, 1, 24, 8,  char,     endpoint->type[3]); \
+       MC_CMD_OP(cmd, 1, 32, 8,  char,     endpoint->type[4]); \
+       MC_CMD_OP(cmd, 1, 40, 8,  char,     endpoint->type[5]); \
+       MC_CMD_OP(cmd, 1, 48, 8,  char,     endpoint->type[6]); \
+       MC_CMD_OP(cmd, 1, 56, 8,  char,     endpoint->type[7]); \
+       MC_CMD_OP(cmd, 2, 0,  8,  char,     endpoint->type[8]); \
+       MC_CMD_OP(cmd, 2, 8,  8,  char,     endpoint->type[9]); \
+       MC_CMD_OP(cmd, 2, 16, 8,  char,     endpoint->type[10]); \
+       MC_CMD_OP(cmd, 2, 24, 8,  char,     endpoint->type[11]); \
+       MC_CMD_OP(cmd, 2, 32, 8,  char,     endpoint->type[12]); \
+       MC_CMD_OP(cmd, 2, 40, 8,  char,     endpoint->type[13]); \
+       MC_CMD_OP(cmd, 2, 48, 8,  char,     endpoint->type[14]); \
+       MC_CMD_OP(cmd, 2, 56, 8,  char,     endpoint->type[15]); \
+} while (0)
+
+/*                cmd, param, offset, width, type, arg_name */
+#define DPRC_CMD_GET_CONNECTION(cmd, endpoint1) \
+do { \
+       MC_CMD_OP(cmd, 0, 0,  32, int,      endpoint1->id); \
+       MC_CMD_OP(cmd, 0, 32, 32, int,      endpoint1->interface_id); \
+       MC_CMD_OP(cmd, 1, 0,  8,  char,     endpoint1->type[0]); \
+       MC_CMD_OP(cmd, 1, 8,  8,  char,     endpoint1->type[1]); \
+       MC_CMD_OP(cmd, 1, 16, 8,  char,     endpoint1->type[2]); \
+       MC_CMD_OP(cmd, 1, 24, 8,  char,     endpoint1->type[3]); \
+       MC_CMD_OP(cmd, 1, 32, 8,  char,     endpoint1->type[4]); \
+       MC_CMD_OP(cmd, 1, 40, 8,  char,     endpoint1->type[5]); \
+       MC_CMD_OP(cmd, 1, 48, 8,  char,     endpoint1->type[6]); \
+       MC_CMD_OP(cmd, 1, 56, 8,  char,     endpoint1->type[7]); \
+       MC_CMD_OP(cmd, 2, 0,  8,  char,     endpoint1->type[8]); \
+       MC_CMD_OP(cmd, 2, 8,  8,  char,     endpoint1->type[9]); \
+       MC_CMD_OP(cmd, 2, 16, 8,  char,     endpoint1->type[10]); \
+       MC_CMD_OP(cmd, 2, 24, 8,  char,     endpoint1->type[11]); \
+       MC_CMD_OP(cmd, 2, 32, 8,  char,     endpoint1->type[12]); \
+       MC_CMD_OP(cmd, 2, 40, 8,  char,     endpoint1->type[13]); \
+       MC_CMD_OP(cmd, 2, 48, 8,  char,     endpoint1->type[14]); \
+       MC_CMD_OP(cmd, 2, 56, 8,  char,     endpoint1->type[15]); \
+} while (0)
+
+
+/*                cmd, param, offset, width, type, arg_name */
+#define DPRC_RSP_GET_CONNECTION(cmd, endpoint2, state) \
+do { \
+       MC_RSP_OP(cmd, 3, 0,  32, int,      endpoint2->id); \
+       MC_RSP_OP(cmd, 3, 32, 32, int,      endpoint2->interface_id); \
+       MC_RSP_OP(cmd, 4, 0,  8,  char,     endpoint2->type[0]); \
+       MC_RSP_OP(cmd, 4, 8,  8,  char,     endpoint2->type[1]); \
+       MC_RSP_OP(cmd, 4, 16, 8,  char,     endpoint2->type[2]); \
+       MC_RSP_OP(cmd, 4, 24, 8,  char,     endpoint2->type[3]); \
+       MC_RSP_OP(cmd, 4, 32, 8,  char,     endpoint2->type[4]); \
+       MC_RSP_OP(cmd, 4, 40, 8,  char,     endpoint2->type[5]); \
+       MC_RSP_OP(cmd, 4, 48, 8,  char,     endpoint2->type[6]); \
+       MC_RSP_OP(cmd, 4, 56, 8,  char,     endpoint2->type[7]); \
+       MC_RSP_OP(cmd, 5, 0,  8,  char,     endpoint2->type[8]); \
+       MC_RSP_OP(cmd, 5, 8,  8,  char,     endpoint2->type[9]); \
+       MC_RSP_OP(cmd, 5, 16, 8,  char,     endpoint2->type[10]); \
+       MC_RSP_OP(cmd, 5, 24, 8,  char,     endpoint2->type[11]); \
+       MC_RSP_OP(cmd, 5, 32, 8,  char,     endpoint2->type[12]); \
+       MC_RSP_OP(cmd, 5, 40, 8,  char,     endpoint2->type[13]); \
+       MC_RSP_OP(cmd, 5, 48, 8,  char,     endpoint2->type[14]); \
+       MC_RSP_OP(cmd, 5, 56, 8,  char,     endpoint2->type[15]); \
+       MC_RSP_OP(cmd, 6, 0,  32, int,      state); \
+} while (0)
+
+/* Data Path Resource Container API
+ * Contains DPRC API for managing and querying DPAA resources
+ */
+struct fsl_mc_io;
+
+/**
+ * Set this value as the icid value in dprc_cfg structure when creating a
+ * container, in case the ICID is not selected by the user and should be
+ * allocated by the DPRC from the pool of ICIDs.
+ */
+#define DPRC_GET_ICID_FROM_POOL                        (uint16_t)(~(0))
+
+/**
+ * Set this value as the portal_id value in dprc_cfg structure when creating a
+ * container, in case the portal ID is not specifically selected by the
+ * user and should be allocated by the DPRC from the pool of portal ids.
+ */
+#define DPRC_GET_PORTAL_ID_FROM_POOL   (int)(~(0))
+
+/**
+ * dprc_get_container_id() - Get container ID associated with a given portal.
+ * @mc_io:             Pointer to MC portal's I/O object
+ * @container_id:      Requested container ID
+ *
+ * Return:     '0' on Success; Error code otherwise.
+ */
+int dprc_get_container_id(struct fsl_mc_io *mc_io, int *container_id);
+
+/**
+ * dprc_open() - Open DPRC object for use
+ * @mc_io:     Pointer to MC portal's I/O object
+ * @container_id: Container ID to open
+ * @token:     Returned token of DPRC object
+ *
+ * Return:     '0' on Success; Error code otherwise.
+ *
+ * @warning    Required before any operation on the object.
+ */
+int dprc_open(struct fsl_mc_io *mc_io, int container_id, uint16_t *token);
+
+/**
+ * dprc_close() - Close the control session of the object
+ * @mc_io:     Pointer to MC portal's I/O object
+ * @token:     Token of DPRC object
+ *
+ * After this function is called, no further operations are
+ * allowed on the object without opening a new control session.
+ *
+ * Return:     '0' on Success; Error code otherwise.
+ */
+int dprc_close(struct fsl_mc_io *mc_io, uint16_t token);
+
+/**
+ * Container general options
+ *
+ * These options may be selected at container creation by the container creator
+ * and can be retrieved using dprc_get_attributes()
+ */
+
+/* Spawn Policy Option allowed - Indicates that the new container is allowed
+ * to spawn and have its own child containers.
+ */
+#define DPRC_CFG_OPT_SPAWN_ALLOWED             0x00000001
+
+/* General Container allocation policy - Indicates that the new container is
+ * allowed to allocate requested resources from its parent container; if not
+ * set, the container is only allowed to use resources in its own pools; Note
+ * that this is a container's global policy, but the parent container may
+ * override it and set specific quota per resource type.
+ */
+#define DPRC_CFG_OPT_ALLOC_ALLOWED             0x00000002
+
+/* Object initialization allowed - software context associated with this
+ * container is allowed to invoke object initialization operations.
+ */
+#define DPRC_CFG_OPT_OBJ_CREATE_ALLOWED        0x00000004
+
+/* Topology change allowed - software context associated with this
+ * container is allowed to invoke topology operations, such as attach/detach
+ * of network objects.
+ */
+#define DPRC_CFG_OPT_TOPOLOGY_CHANGES_ALLOWED  0x00000008
+
+/* IOMMU bypass - indicates whether objects of this container are permitted
+ * to bypass the IOMMU.
+ */
+#define DPRC_CFG_OPT_IOMMU_BYPASS              0x00000010
+
+/* AIOP - Indicates that container belongs to AIOP.  */
+#define DPRC_CFG_OPT_AIOP                      0x00000020
+
+/**
+ * struct dprc_cfg - Container configuration options
+ * @icid: Container's ICID; if set to 'DPRC_GET_ICID_FROM_POOL', a free
+ *             ICID value is allocated by the DPRC
+ * @portal_id: Portal ID; if set to 'DPRC_GET_PORTAL_ID_FROM_POOL', a free
+ *             portal ID is allocated by the DPRC
+ * @options: Combination of 'DPRC_CFG_OPT_<X>' options
+ */
+struct dprc_cfg {
+       uint16_t icid;
+       int portal_id;
+       uint64_t options;
+};
+
+/**
+ * dprc_reset_container - Reset child container.
+ * @mc_io:     Pointer to MC portal's I/O object
+ * @token:     Token of DPRC object
+ * @child_container_id:        ID of the container to reset
+ *
+ * In case a software context crashes or becomes non-responsive, the parent
+ * may wish to reset its resources container before the software context is
+ * restarted.
+ *
+ * This routine informs all objects assigned to the child container that the
+ * container is being reset, so they may perform any cleanup operations that are
+ * needed. All objects handles that were owned by the child container shall be
+ * closed.
+ *
+ * Note that such request may be submitted even if the child software context
+ * has not crashed, but the resulting object cleanup operations will not be
+ * aware of that.
+ *
+ * Return:     '0' on Success; Error code otherwise.
+ */
+int dprc_reset_container(struct fsl_mc_io *mc_io,
+                        uint16_t token,
+                        int child_container_id);
+
+/**
+ * struct dprc_attributes - Container attributes
+ * @container_id: Container's ID
+ * @icid: Container's ICID
+ * @portal_id: Container's portal ID
+ * @options: Container's options as set at container's creation
+ * @version: DPRC version
+ */
+struct dprc_attributes {
+       int container_id;
+       uint16_t icid;
+       int portal_id;
+       uint64_t options;
+       /**
+        * struct version - DPRC version
+        * @major: DPRC major version
+        * @minor: DPRC minor version
+        */
+       struct {
+               uint16_t major;
+               uint16_t minor;
+       } version;
+};
+
+/**
+ * dprc_get_attributes() - Obtains container attributes
+ * @mc_io:     Pointer to MC portal's I/O object
+ * @token:     Token of DPRC object
+ * @attributes Returned container attributes
+ *
+ * Return:     '0' on Success; Error code otherwise.
+ */
+int dprc_get_attributes(struct fsl_mc_io       *mc_io,
+                       uint16_t                token,
+                       struct dprc_attributes  *attributes);
+
+/**
+ * dprc_get_obj_count() - Obtains the number of objects in the DPRC
+ * @mc_io:     Pointer to MC portal's I/O object
+ * @token:     Token of DPRC object
+ * @obj_count: Number of objects assigned to the DPRC
+ *
+ * Return:     '0' on Success; Error code otherwise.
+ */
+int dprc_get_obj_count(struct fsl_mc_io *mc_io, uint16_t token, int *obj_count);
+
+/* Objects Attributes Flags */
+
+/* Opened state - Indicates that an object is open by at least one owner */
+#define DPRC_OBJ_STATE_OPEN            0x00000001
+/* Plugged state - Indicates that the object is plugged */
+#define DPRC_OBJ_STATE_PLUGGED         0x00000002
+
+/**
+ * struct dprc_obj_desc - Object descriptor, returned from dprc_get_obj()
+ * @type: Type of object: NULL terminated string
+ * @id: ID of logical object resource
+ * @vendor: Object vendor identifier
+ * @ver_major: Major version number
+ * @ver_minor:  Minor version number
+ * @irq_count: Number of interrupts supported by the object
+ * @region_count: Number of mappable regions supported by the object
+ * @state: Object state: combination of DPRC_OBJ_STATE_ states
+ */
+struct dprc_obj_desc {
+       char type[16];
+       int id;
+       uint16_t vendor;
+       uint16_t ver_major;
+       uint16_t ver_minor;
+       uint8_t irq_count;
+       uint8_t region_count;
+       uint32_t state;
+};
+
+/**
+ * dprc_get_obj() - Get general information on an object
+ * @mc_io:     Pointer to MC portal's I/O object
+ * @token:     Token of DPRC object
+ * @obj_index: Index of the object to be queried (< obj_count)
+ * @obj_desc:  Returns the requested object descriptor
+ *
+ * The object descriptors are retrieved one by one by incrementing
+ * obj_index up to (not including) the value of obj_count returned
+ * from dprc_get_obj_count(). dprc_get_obj_count() must
+ * be called prior to dprc_get_obj().
+ *
+ * Return:     '0' on Success; Error code otherwise.
+ */
+int dprc_get_obj(struct fsl_mc_io      *mc_io,
+                uint16_t               token,
+                int                    obj_index,
+                struct dprc_obj_desc   *obj_desc);
+
+/**
+ * dprc_get_res_count() - Obtains the number of free resources that are assigned
+ *             to this container, by pool type
+ * @mc_io:     Pointer to MC portal's I/O object
+ * @token:     Token of DPRC object
+ * @type:      pool type
+ * @res_count: Returned number of free resources of the given
+ *                     resource type that are assigned to this DPRC
+ *
+ * Return:     '0' on Success; Error code otherwise.
+ */
+int dprc_get_res_count(struct fsl_mc_io        *mc_io,
+                      uint16_t         token,
+                      char             *type,
+                      int              *res_count);
+
+/**
+ * enum dprc_iter_status - Iteration status
+ * @DPRC_ITER_STATUS_FIRST: Perform first iteration
+ * @DPRC_ITER_STATUS_MORE: Indicates more/next iteration is needed
+ * @DPRC_ITER_STATUS_LAST: Indicates last iteration
+ */
+enum dprc_iter_status {
+       DPRC_ITER_STATUS_FIRST = 0,
+       DPRC_ITER_STATUS_MORE = 1,
+       DPRC_ITER_STATUS_LAST = 2
+};
+
+/**
+ * struct dprc_res_ids_range_desc - Resource ID range descriptor
+ * @base_id: Base resource ID of this range
+ * @last_id: Last resource ID of this range
+ * @iter_status: Iteration status - should be set to DPRC_ITER_STATUS_FIRST at
+ *     first iteration; while the returned marker is DPRC_ITER_STATUS_MORE,
+ *     additional iterations are needed, until the returned marker is
+ *     DPRC_ITER_STATUS_LAST
+ */
+struct dprc_res_ids_range_desc {
+       int base_id;
+       int last_id;
+       enum dprc_iter_status iter_status;
+};
+
+/**
+ * dprc_get_res_ids() - Obtains IDs of free resources in the container
+ * @mc_io:     Pointer to MC portal's I/O object
+ * @token:     Token of DPRC object
+ * @type:      pool type
+ * @range_desc:        range descriptor
+ *
+ * Return:     '0' on Success; Error code otherwise.
+ */
+int dprc_get_res_ids(struct fsl_mc_io                  *mc_io,
+                    uint16_t                           token,
+                    char                               *type,
+                    struct dprc_res_ids_range_desc     *range_desc);
+
+/**
+ * struct dprc_region_desc - Mappable region descriptor
+ * @base_paddr: Region base physical address
+ * @size: Region size (in bytes)
+ */
+struct dprc_region_desc {
+       uint64_t base_paddr;
+       uint32_t size;
+};
+
+/**
+ * dprc_get_obj_region() - Get region information for a specified object.
+ * @mc_io:     Pointer to MC portal's I/O object
+ * @token:     Token of DPRC object
+ * @obj_type;  Object type as returned in dprc_get_obj()
+ * @obj_id:    Unique object instance as returned in dprc_get_obj()
+ * @region_index: The specific region to query
+ * @region_desc:  Returns the requested region descriptor
+ *
+ * Return:     '0' on Success; Error code otherwise.
+ */
+int dprc_get_obj_region(struct fsl_mc_io       *mc_io,
+                       uint16_t                token,
+                       char                    *obj_type,
+                       int                     obj_id,
+                       uint8_t                 region_index,
+                       struct dprc_region_desc *region_desc);
+/**
+ * struct dprc_endpoint - Endpoint description for link connect/disconnect
+ *                     operations
+ * @type: Endpoint object type: NULL terminated string
+ * @id: Endpoint object ID
+ * @interface_id: Interface ID; should be set for endpoints with multiple
+ *             interfaces ("dpsw", "dpdmux"); for others, always set to 0
+ */
+struct dprc_endpoint {
+       char type[16];
+       int id;
+       int interface_id;
+};
+
+/**
+ * dprc_connect() - Connect two endpoints to create a network link between them
+ * @mc_io:     Pointer to MC portal's I/O object
+ * @token:     Token of DPRC object
+ * @endpoint1: Endpoint 1 configuration parameters
+ * @endpoint2: Endpoint 2 configuration parameters
+ *
+ * Return:     '0' on Success; Error code otherwise.
+ */
+int dprc_connect(struct fsl_mc_io              *mc_io,
+                uint16_t                       token,
+                const struct dprc_endpoint     *endpoint1,
+                const struct dprc_endpoint     *endpoint2);
+
+/**
+ * dprc_disconnect() - Disconnect one endpoint to remove its network connection
+ * @mc_io:     Pointer to MC portal's I/O object
+ * @token:     Token of DPRC object
+ * @endpoint:  Endpoint configuration parameters
+ *
+ * Return:     '0' on Success; Error code otherwise.
+ */
+int dprc_disconnect(struct fsl_mc_io           *mc_io,
+                   uint16_t                    token,
+                   const struct dprc_endpoint  *endpoint);
+
+/**
+* dprc_get_connection() - Get connected endpoint and link status if connection
+*                      exists.
+* @mc_io               Pointer to MC portal's I/O object
+* @token               Token of DPRC object
+* @endpoint1   Endpoint 1 configuration parameters
+* @endpoint2   Returned endpoint 2 configuration parameters
+* @state:      Returned link state: 1 - link is up, 0 - link is down
+*
+* Return:     '0' on Success; -ENAVAIL if connection does not exist.
+*/
+int dprc_get_connection(struct fsl_mc_io               *mc_io,
+                       uint16_t                        token,
+                       const struct dprc_endpoint      *endpoint1,
+                       struct dprc_endpoint            *endpoint2,
+                       int                             *state);
+
+#endif /* _FSL_DPRC_H */
index b9f089e5f32c8d2264e5b4b6bf32abd8c4c7d87b..ec244150e82f77f425328f4811bb2d96004cb97a 100644 (file)
@@ -53,7 +53,8 @@ struct mc_ccsr_registers {
        u32 reg_error[];
 };
 
-int mc_init(bd_t *bis);
-
 int get_mc_boot_status(void);
+unsigned long mc_get_dram_block_size(void);
+int fsl_mc_ldpaa_init(bd_t *bis);
+void fsl_mc_ldpaa_exit(bd_t *bis);
 #endif
index e7fcb5b142bd06b4b21a625efef52ce70b7afc00..cb39c39722a90d8b18dd730efc91b5c601db33ee 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright 2014 Freescale Semiconductor Inc.
+/* Copyright 2013-2015 Freescale Semiconductor Inc.
  *
  * SPDX-License-Identifier:    GPL-2.0+
  */
@@ -41,9 +41,9 @@ enum mc_cmd_status {
 
 #define MC_CMD_HDR_CMDID_O     52      /* Command ID field offset */
 #define MC_CMD_HDR_CMDID_S     12      /* Command ID field size */
-#define MC_CMD_HDR_AUTHID_O    38      /* Authentication ID field offset */
-#define MC_CMD_HDR_AUTHID_S    10      /* Authentication ID field size */
 #define MC_CMD_HDR_STATUS_O    16      /* Status field offset */
+#define MC_CMD_HDR_TOKEN_O     38      /* Token field offset */
+#define MC_CMD_HDR_TOKEN_S     10      /* Token field size */
 #define MC_CMD_HDR_STATUS_S    8       /* Status field size*/
 #define MC_CMD_HDR_PRI_O       15      /* Priority field offset */
 #define MC_CMD_HDR_PRI_S       1       /* Priority field size */
@@ -52,12 +52,15 @@ enum mc_cmd_status {
        ((enum mc_cmd_status)u64_dec((_hdr), \
                MC_CMD_HDR_STATUS_O, MC_CMD_HDR_STATUS_S))
 
-#define MC_CMD_HDR_READ_AUTHID(_hdr) \
-       ((uint16_t)u64_dec((_hdr), MC_CMD_HDR_AUTHID_O, MC_CMD_HDR_AUTHID_S))
+#define MC_CMD_HDR_READ_TOKEN(_hdr) \
+       ((uint16_t)u64_dec((_hdr), MC_CMD_HDR_TOKEN_O, MC_CMD_HDR_TOKEN_S))
 
 #define MC_CMD_PRI_LOW         0 /*!< Low Priority command indication */
 #define MC_CMD_PRI_HIGH                1 /*!< High Priority command indication */
 
+#define MC_EXT_OP(_ext, _param, _offset, _width, _type, _arg) \
+       ((_ext)[_param] |= u64_enc((_offset), (_width), _arg))
+
 #define MC_CMD_OP(_cmd, _param, _offset, _width, _type, _arg) \
        ((_cmd).params[_param] |= u64_enc((_offset), (_width), _arg))
 
@@ -66,12 +69,12 @@ enum mc_cmd_status {
 
 static inline uint64_t mc_encode_cmd_header(uint16_t cmd_id,
                                            uint8_t priority,
-                                           uint16_t auth_id)
+                                           uint16_t token)
 {
        uint64_t hdr;
 
        hdr = u64_enc(MC_CMD_HDR_CMDID_O, MC_CMD_HDR_CMDID_S, cmd_id);
-       hdr |= u64_enc(MC_CMD_HDR_AUTHID_O, MC_CMD_HDR_AUTHID_S, auth_id);
+       hdr |= u64_enc(MC_CMD_HDR_TOKEN_O, MC_CMD_HDR_TOKEN_S, token);
        hdr |= u64_enc(MC_CMD_HDR_PRI_O, MC_CMD_HDR_PRI_S, priority);
        hdr |= u64_enc(MC_CMD_HDR_STATUS_O, MC_CMD_HDR_STATUS_S,
                       MC_CMD_STATUS_READY);
diff --git a/include/fsl-mc/fsl_mc_private.h b/include/fsl-mc/fsl_mc_private.h
new file mode 100644 (file)
index 0000000..9f06978
--- /dev/null
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2014 Freescale Semiconductor
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#ifndef _FSL_MC_PRIVATE_H_
+#define _FSL_MC_PRIVATE_H_
+
+#include <errno.h>
+#include <malloc.h>
+#include <asm/io.h>
+#include <linux/compat.h>
+#include <linux/types.h>
+#include <linux/stringify.h>
+
+#include <fsl-mc/fsl_mc_sys.h>
+#include <fsl-mc/fsl_mc_cmd.h>
+#include <fsl-mc/fsl_dprc.h>
+#include <fsl-mc/fsl_dpbp.h>
+
+extern struct fsl_mc_io *dflt_mc_io;
+
+/**
+ * struct dpbp_node - DPBP strucuture
+ * @uint16_t handle: DPBP object handle
+ * @int dpbp_id: DPBP id
+ */
+struct fsl_dpbp_obj {
+       uint16_t dpbp_handle;
+       struct dpbp_attr dpbp_attr;
+};
+
+extern struct fsl_dpbp_obj *dflt_dpbp;
+
+/**
+ * struct fsl_dpio_obj - DPIO strucuture
+ * @int dpio_id: DPIO id
+ * @struct qbman_swp *sw_portal: SW portal object
+ */
+struct fsl_dpio_obj {
+       int dpio_id;
+       struct qbman_swp *sw_portal; /** SW portal object */
+};
+
+extern struct fsl_dpio_obj *dflt_dpio;
+
+int mc_init(void);
+int ldpaa_eth_init(struct dprc_obj_desc obj_desc);
+#endif /* _FSL_MC_PRIVATE_H_ */
diff --git a/include/fsl-mc/fsl_qbman_base.h b/include/fsl-mc/fsl_qbman_base.h
new file mode 100644 (file)
index 0000000..c92cbe1
--- /dev/null
@@ -0,0 +1,87 @@
+/*
+ * Copyright (C) 2014 Freescale Semiconductor
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#ifndef _FSL_QBMAN_BASE_H
+#define _FSL_QBMAN_BASE_H
+
+/* Descriptor for a QBMan instance on the SoC. On partitions/targets that do not
+ * control this QBMan instance, these values may simply be place-holders. The
+ * idea is simply that we be able to distinguish between them, eg. so that SWP
+ * descriptors can identify which QBMan instance they belong to. */
+struct qbman_block_desc {
+       void *ccsr_reg_bar; /* CCSR register map */
+       int irq_rerr;  /* Recoverable error interrupt line */
+       int irq_nrerr; /* Non-recoverable error interrupt line */
+};
+
+/* Descriptor for a QBMan software portal, expressed in terms that make sense to
+ * the user context. Ie. on MC, this information is likely to be true-physical,
+ * and instantiated statically at compile-time. On GPP, this information is
+ * likely to be obtained via "discovery" over a partition's "layerscape bus"
+ * (ie. in response to a MC portal command), and would take into account any
+ * virtualisation of the GPP user's address space and/or interrupt numbering. */
+struct qbman_swp_desc {
+       const struct qbman_block_desc *block; /* The QBMan instance */
+       void *cena_bar; /* Cache-enabled portal register map */
+       void *cinh_bar; /* Cache-inhibited portal register map */
+};
+
+/* Driver object for managing a QBMan portal */
+struct qbman_swp;
+
+/* Place-holder for FDs, we represent it via the simplest form that we need for
+ * now. Different overlays may be needed to support different options, etc. (It
+ * is impractical to define One True Struct, because the resulting encoding
+ * routines (lots of read-modify-writes) would be worst-case performance whether
+ * or not circumstances required them.)
+ *
+ * Note, as with all data-structures exchanged between software and hardware (be
+ * they located in the portal register map or DMA'd to and from main-memory),
+ * the driver ensures that the caller of the driver API sees the data-structures
+ * in host-endianness. "struct qbman_fd" is no exception. The 32-bit words
+ * contained within this structure are represented in host-endianness, even if
+ * hardware always treats them as little-endian. As such, if any of these fields
+ * are interpreted in a binary (rather than numerical) fashion by hardware
+ * blocks (eg. accelerators), then the user should be careful. We illustrate
+ * with an example;
+ *
+ * Suppose the desired behaviour of an accelerator is controlled by the "frc"
+ * field of the FDs that are sent to it. Suppose also that the behaviour desired
+ * by the user corresponds to an "frc" value which is expressed as the literal
+ * sequence of bytes 0xfe, 0xed, 0xab, and 0xba. So "frc" should be the 32-bit
+ * value in which 0xfe is the first byte and 0xba is the last byte, and as
+ * hardware is little-endian, this amounts to a 32-bit "value" of 0xbaabedfe. If
+ * the software is little-endian also, this can simply be achieved by setting
+ * frc=0xbaabedfe. On the other hand, if software is big-endian, it should set
+ * frc=0xfeedabba! The best away of avoiding trouble with this sort of thing is
+ * to treat the 32-bit words as numerical values, in which the offset of a field
+ * from the beginning of the first byte (as required or generated by hardware)
+ * is numerically encoded by a left-shift (ie. by raising the field to a
+ * corresponding power of 2).  Ie. in the current example, software could set
+ * "frc" in the following way, and it would work correctly on both little-endian
+ * and big-endian operation;
+ *    fd.frc = (0xfe << 0) | (0xed << 8) | (0xab << 16) | (0xba << 24);
+ */
+struct qbman_fd {
+       union {
+               uint32_t words[8];
+               struct qbman_fd_simple {
+                       uint32_t addr_lo;
+                       uint32_t addr_hi;
+                       uint32_t len;
+                       /* offset in the MS 16 bits, BPID in the LS 16 bits */
+                       uint32_t bpid_offset;
+                       uint32_t frc; /* frame context */
+                       /* "err", "va", "cbmt", "asal", [...] */
+                       uint32_t ctrl;
+                       /* flow context */
+                       uint32_t flc_lo;
+                       uint32_t flc_hi;
+               } simple;
+       };
+};
+
+#endif /* !_FSL_QBMAN_BASE_H */
diff --git a/include/fsl-mc/fsl_qbman_portal.h b/include/fsl-mc/fsl_qbman_portal.h
new file mode 100644 (file)
index 0000000..2aadad8
--- /dev/null
@@ -0,0 +1,175 @@
+/*
+ * Copyright (C) 2014 Freescale Semiconductor
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#ifndef _FSL_QBMAN_PORTAL_H
+#define _FSL_QBMAN_PORTAL_H
+
+#include <fsl-mc/fsl_qbman_base.h>
+
+/* Create and destroy a functional object representing the given QBMan portal
+ * descriptor. */
+struct qbman_swp *qbman_swp_init(const struct qbman_swp_desc *);
+
+       /************/
+       /* Dequeues */
+       /************/
+
+/* See the QBMan driver API documentation for details on the enqueue
+ * mechanisms. NB: the use of a 'ldpaa_' prefix for this type is because it is
+ * primarily used by the "DPIO" layer that sits above (and hides) the QBMan
+ * driver. The structure is defined in the DPIO interface, but to avoid circular
+ * dependencies we just pre/re-declare it here opaquely. */
+struct ldpaa_dq;
+
+
+/* ------------------- */
+/* Pull-mode dequeuing */
+/* ------------------- */
+
+struct qbman_pull_desc {
+       uint32_t dont_manipulate_directly[6];
+};
+
+/* Clear the contents of a descriptor to default/starting state. */
+void qbman_pull_desc_clear(struct qbman_pull_desc *);
+/* If not called, or if called with 'storage' as NULL, the result pull dequeues
+ * will produce results to DQRR. If 'storage' is non-NULL, then results are
+ * produced to the given memory location (using the physical/DMA address which
+ * the caller provides in 'storage_phys'), and 'stash' controls whether or not
+ * those writes to main-memory express a cache-warming attribute. */
+void qbman_pull_desc_set_storage(struct qbman_pull_desc *,
+                                struct ldpaa_dq *storage,
+                                dma_addr_t storage_phys,
+                                int stash);
+/* numframes must be between 1 and 16, inclusive */
+void qbman_pull_desc_set_numframes(struct qbman_pull_desc *, uint8_t numframes);
+/* token is the value that shows up in the dequeue results that can be used to
+ * detect when the results have been published, and is not really used when
+ * dequeue results go to DQRR. The easiest technique is to zero result "storage"
+ * before issuing a pull dequeue, and use any non-zero 'token' value. */
+void qbman_pull_desc_set_token(struct qbman_pull_desc *, uint8_t token);
+/* Exactly one of the following descriptor "actions" should be set. (Calling any
+ * one of these will replace the effect of any prior call to one of these.)
+ * - pull dequeue from the given frame queue (FQ)
+ * - pull dequeue from any FQ in the given work queue (WQ)
+ * - pull dequeue from any FQ in any WQ in the given channel
+ */
+void qbman_pull_desc_set_fq(struct qbman_pull_desc *, uint32_t fqid);
+
+/* Issue the pull dequeue command */
+int qbman_swp_pull(struct qbman_swp *, struct qbman_pull_desc *);
+
+/* -------------------------------- */
+/* Polling DQRR for dequeue results */
+/* -------------------------------- */
+
+/* NULL return if there are no unconsumed DQRR entries. Returns a DQRR entry
+ * only once, so repeated calls can return a sequence of DQRR entries, without
+ * requiring they be consumed immediately or in any particular order. */
+const struct ldpaa_dq *qbman_swp_dqrr_next(struct qbman_swp *);
+/* Consume DQRR entries previously returned from qbman_swp_dqrr_next(). */
+void qbman_swp_dqrr_consume(struct qbman_swp *, const struct ldpaa_dq *);
+
+/* ------------------------------------------------- */
+/* Polling user-provided storage for dequeue results */
+/* ------------------------------------------------- */
+
+/* Only used for user-provided storage of dequeue results, not DQRR. Prior to
+ * being used, the storage must set "oldtoken", so that the driver notices when
+ * hardware has filled it in with results using a "newtoken". NB, for efficiency
+ * purposes, the driver will perform any required endianness conversion to
+ * ensure that the user's dequeue result storage is in host-endian format
+ * (whether or not that is the same as the little-endian format that hardware
+ * DMA'd to the user's storage). As such, once the user has called
+ * qbman_dq_entry_has_newtoken() and been returned a valid dequeue result, they
+ * should not call it again on the same memory location (except of course if
+ * another dequeue command has been executed to produce a new result to that
+ * location).
+ */
+void qbman_dq_entry_set_oldtoken(struct ldpaa_dq *,
+                                unsigned int num_entries,
+                                uint8_t oldtoken);
+int qbman_dq_entry_has_newtoken(struct qbman_swp *,
+                               const struct ldpaa_dq *,
+                               uint8_t newtoken);
+
+/* -------------------------------------------------------- */
+/* Parsing dequeue entries (DQRR and user-provided storage) */
+/* -------------------------------------------------------- */
+
+/* DQRR entries may contain non-dequeue results, ie. notifications */
+int qbman_dq_entry_is_DQ(const struct ldpaa_dq *);
+
+       /************/
+       /* Enqueues */
+       /************/
+
+struct qbman_eq_desc {
+       uint32_t dont_manipulate_directly[8];
+};
+
+
+/* Clear the contents of a descriptor to default/starting state. */
+void qbman_eq_desc_clear(struct qbman_eq_desc *);
+/* Exactly one of the following descriptor "actions" should be set. (Calling
+ * any one of these will replace the effect of any prior call to one of these.)
+ * - enqueue without order-restoration
+ * - enqueue with order-restoration
+ * - fill a hole in the order-restoration sequence, without any enqueue
+ * - advance NESN (Next Expected Sequence Number), without any enqueue
+ * 'respond_success' indicates whether an enqueue response should be DMA'd
+ * after success (otherwise a response is DMA'd only after failure).
+ * 'incomplete' indicates that other fragments of the same 'seqnum' are yet to
+ * be enqueued.
+ */
+void qbman_eq_desc_set_no_orp(struct qbman_eq_desc *, int respond_success);
+void qbman_eq_desc_set_response(struct qbman_eq_desc *,
+                               dma_addr_t storage_phys,
+                               int stash);
+/* token is the value that shows up in an enqueue response that can be used to
+ * detect when the results have been published. The easiest technique is to zero
+ * result "storage" before issuing an enqueue, and use any non-zero 'token'
+ * value. */
+void qbman_eq_desc_set_token(struct qbman_eq_desc *, uint8_t token);
+/* Exactly one of the following descriptor "targets" should be set. (Calling any
+ * one of these will replace the effect of any prior call to one of these.)
+ * - enqueue to a frame queue
+ * - enqueue to a queuing destination
+ * Note, that none of these will have any affect if the "action" type has been
+ * set to "orp_hole" or "orp_nesn".
+ */
+void qbman_eq_desc_set_fq(struct qbman_eq_desc *, uint32_t fqid);
+void qbman_eq_desc_set_qd(struct qbman_eq_desc *, uint32_t qdid,
+                         uint32_t qd_bin, uint32_t qd_prio);
+
+/* Issue an enqueue command. ('fd' should only be NULL if the "action" of the
+ * descriptor is "orp_hole" or "orp_nesn".) */
+int qbman_swp_enqueue(struct qbman_swp *, const struct qbman_eq_desc *,
+                     const struct qbman_fd *fd);
+
+       /*******************/
+       /* Buffer releases */
+       /*******************/
+
+struct qbman_release_desc {
+       uint32_t dont_manipulate_directly[1];
+};
+
+/* Clear the contents of a descriptor to default/starting state. */
+void qbman_release_desc_clear(struct qbman_release_desc *);
+/* Set the ID of the buffer pool to release to */
+void qbman_release_desc_set_bpid(struct qbman_release_desc *, uint32_t bpid);
+/* Issue a release command. 'num_buffers' must be less than 8. */
+int qbman_swp_release(struct qbman_swp *, const struct qbman_release_desc *,
+                     const uint64_t *buffers, unsigned int num_buffers);
+
+       /*******************/
+       /* Buffer acquires */
+       /*******************/
+
+int qbman_swp_acquire(struct qbman_swp *, uint32_t bpid, uint64_t *buffers,
+                     unsigned int num_buffers);
+#endif /* !_FSL_QBMAN_PORTAL_H */
diff --git a/include/fsl-mc/ldpaa_wriop.h b/include/fsl-mc/ldpaa_wriop.h
new file mode 100644 (file)
index 0000000..ca8e440
--- /dev/null
@@ -0,0 +1,70 @@
+/*
+ * Copyright (C) 2015 Freescale Semiconductor
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#ifndef __LDPAA_WRIOP_H
+#define __LDPAA_WRIOP_H
+
+ #include <phy.h>
+
+enum wriop_port {
+       WRIOP1_DPMAC1 = 1,
+       WRIOP1_DPMAC2,
+       WRIOP1_DPMAC3,
+       WRIOP1_DPMAC4,
+       WRIOP1_DPMAC5,
+       WRIOP1_DPMAC6,
+       WRIOP1_DPMAC7,
+       WRIOP1_DPMAC8,
+       WRIOP1_DPMAC9,
+       WRIOP1_DPMAC10,
+       WRIOP1_DPMAC11,
+       WRIOP1_DPMAC12,
+       WRIOP1_DPMAC13,
+       WRIOP1_DPMAC14,
+       WRIOP1_DPMAC15,
+       WRIOP1_DPMAC16,
+       WRIOP1_DPMAC17,
+       WRIOP1_DPMAC18,
+       WRIOP1_DPMAC19,
+       WRIOP1_DPMAC20,
+       WRIOP1_DPMAC21,
+       WRIOP1_DPMAC22,
+       WRIOP1_DPMAC23,
+       WRIOP1_DPMAC24,
+       NUM_WRIOP_PORTS,
+};
+
+struct wriop_dpmac_info {
+       u8 enabled;
+       u8 id;
+       u8 phy_addr;
+       u8 board_mux;
+       void *phy_regs;
+       phy_interface_t enet_if;
+       struct phy_device *phydev;
+       struct mii_dev *bus;
+};
+
+extern struct wriop_dpmac_info dpmac_info[NUM_WRIOP_PORTS];
+
+#define DEFAULT_WRIOP_MDIO1_NAME "FSL_MDIO0"
+#define DEFAULT_WRIOP_MDIO2_NAME "FSL_MDIO1"
+
+void wriop_init_dpmac(int, int, int);
+void wriop_disable_dpmac(int);
+void wriop_enable_dpmac(int);
+void wriop_set_mdio(int, struct mii_dev *);
+struct mii_dev *wriop_get_mdio(int);
+void wriop_set_phy_address(int, int);
+int wriop_get_phy_address(int);
+void wriop_set_phy_dev(int, struct phy_device *);
+struct phy_device *wriop_get_phy_dev(int);
+phy_interface_t wriop_get_enet_if(int);
+
+void wriop_dpmac_disable(int);
+void wriop_dpmac_enable(int);
+phy_interface_t wriop_dpmac_enet_if(int, int);
+#endif /* __LDPAA_WRIOP_H */
index feccef9c9cd16b2311d60ed82c4a742bf7389b0f..4099a74a4af2cf0b86a4664c6d367a176ba90861 100644 (file)
@@ -34,9 +34,7 @@
 #define ddr_clrsetbits32(a, clear, set)        clrsetbits_be32(a, clear, set)
 #endif
 
-#define _DDR_ADDR CONFIG_SYS_FSL_DDR_ADDR
-
-u32 fsl_ddr_get_version(void);
+u32 fsl_ddr_get_version(unsigned int ctrl_num);
 
 #if defined(CONFIG_DDR_SPD) || defined(CONFIG_SPD_EEPROM)
 /*
index 095b33e29ee75086217c443c9f40fef18191dc8e..e5b6e03c8fd7a569d07045270f32adef4528e0f1 100644 (file)
@@ -155,6 +155,8 @@ typedef struct ddr4_spd_eeprom_s generic_spd_eeprom_t;
 #define MD_CNTL_CKE_CNTL_HIGH  0x00200000
 #define MD_CNTL_WRCW           0x00080000
 #define MD_CNTL_MD_VALUE(x)    (x & 0x0000FFFF)
+#define MD_CNTL_CS_SEL(x)      (((x) & 0x7) << 28)
+#define MD_CNTL_MD_SEL(x)      (((x) & 0xf) << 24)
 
 /* DDR_CDR1 */
 #define DDR_CDR1_DHC_EN        0x80000000
@@ -165,6 +167,7 @@ typedef struct ddr4_spd_eeprom_s generic_spd_eeprom_t;
 #define DDR_CDR2_ODT(x) (x & DDR_CDR2_ODT_MASK)
 #define DDR_CDR2_VREF_OVRD(x)  (0x00008080 | ((((x) - 37) & 0x3F) << 8))
 #define DDR_CDR2_VREF_TRAIN_EN 0x00000080
+#define DDR_CDR2_VREF_RANGE_2  0x00000040
 
 #if (defined(CONFIG_SYS_FSL_DDR_VER) && \
        (CONFIG_SYS_FSL_DDR_VER >= FSL_DDR_VER_4_7))
diff --git a/include/fsl_debug_server.h b/include/fsl_debug_server.h
new file mode 100644 (file)
index 0000000..28d8adb
--- /dev/null
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2014 Freescale Semiconductor
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#ifndef __FSL_DBG_SERVER_H__
+#define __FSL_DBG_SERVER_H__
+
+#include <asm/io.h>
+#include <common.h>
+
+/*
+ * Define Debug Server firmware version information
+ */
+
+/* Major version number: incremented on API compatibility changes */
+#define DEBUG_SERVER_VER_MAJOR 0
+
+/* Minor version number: incremented on API additions (backward
+ * compatible); reset when major version is incremented.
+ */
+#define DEBUG_SERVER_VER_MINOR 1
+
+#define DEBUG_SERVER_INIT_STATUS       (1 << 0)
+#define DEBUG_SERVER_INIT_STATUS_MASK  (0x00000001)
+
+int debug_server_init(void);
+unsigned long debug_server_get_dram_block_size(void);
+
+#endif /* __FSL_DBG_SERVER_H__ */
+
index 57295b4bc03496e596a3731e78aeae3dc936e314..41bf05be4c042a6c9f86b16db7b5731b316000b9 100644 (file)
 #define ESDHC_VENDORSPEC_VSELECT 0x00000002 /* Use 1.8V */
 
 struct fsl_esdhc_cfg {
+#ifdef CONFIG_LS2085A
+       u64     esdhc_base;
+#else
        u32     esdhc_base;
+#endif
        u32     sdhc_clk;
        u8      max_bus_width;
        struct mmc_config cfg;
index 11474b757c39e26a9b1d076e88d72c5df0585c9e..a7ddd5fc88732f45b74c0b3b0cd38a391c966a52 100644 (file)
@@ -790,24 +790,36 @@ extern void print_ifc_regs(void);
 extern void init_early_memctl_regs(void);
 void init_final_memctl_regs(void);
 
-#define IFC_BASE_ADDR ((struct fsl_ifc *)CONFIG_SYS_IFC_ADDR)
-
-#define get_ifc_cspr_ext(i) (ifc_in32(&(IFC_BASE_ADDR)->cspr_cs[i].cspr_ext))
-#define get_ifc_cspr(i) (ifc_in32(&(IFC_BASE_ADDR)->cspr_cs[i].cspr))
-#define get_ifc_csor_ext(i) (ifc_in32(&(IFC_BASE_ADDR)->csor_cs[i].csor_ext))
-#define get_ifc_csor(i) (ifc_in32(&(IFC_BASE_ADDR)->csor_cs[i].csor))
-#define get_ifc_amask(i) (ifc_in32(&(IFC_BASE_ADDR)->amask_cs[i].amask))
-#define get_ifc_ftim(i, j) (ifc_in32(&(IFC_BASE_ADDR)->ftim_cs[i].ftim[j]))
-
-#define set_ifc_cspr_ext(i, v) \
-                       (ifc_out32(&(IFC_BASE_ADDR)->cspr_cs[i].cspr_ext, v))
-#define set_ifc_cspr(i, v) (ifc_out32(&(IFC_BASE_ADDR)->cspr_cs[i].cspr, v))
-#define set_ifc_csor_ext(i, v) \
-                       (ifc_out32(&(IFC_BASE_ADDR)->csor_cs[i].csor_ext, v))
-#define set_ifc_csor(i, v) (ifc_out32(&(IFC_BASE_ADDR)->csor_cs[i].csor, v))
-#define set_ifc_amask(i, v) (ifc_out32(&(IFC_BASE_ADDR)->amask_cs[i].amask, v))
-#define set_ifc_ftim(i, j, v) \
-                       (ifc_out32(&(IFC_BASE_ADDR)->ftim_cs[i].ftim[j], v))
+#define IFC_RREGS_4KOFFSET     (4*1024)
+#define IFC_RREGS_64KOFFSET    (64*1024)
+
+#define IFC_FCM_BASE_ADDR \
+       ((struct fsl_ifc_fcm *)CONFIG_SYS_IFC_ADDR)
+
+#define get_ifc_cspr_ext(i)    \
+               (ifc_in32(&(IFC_FCM_BASE_ADDR)->cspr_cs[i].cspr_ext))
+#define get_ifc_cspr(i)                \
+               (ifc_in32(&(IFC_FCM_BASE_ADDR)->cspr_cs[i].cspr))
+#define get_ifc_csor_ext(i)    \
+               (ifc_in32(&(IFC_FCM_BASE_ADDR)->csor_cs[i].csor_ext))
+#define get_ifc_csor(i)                \
+               (ifc_in32(&(IFC_FCM_BASE_ADDR)->csor_cs[i].csor))
+#define get_ifc_amask(i)       \
+               (ifc_in32(&(IFC_FCM_BASE_ADDR)->amask_cs[i].amask))
+#define get_ifc_ftim(i, j)     \
+               (ifc_in32(&(IFC_FCM_BASE_ADDR)->ftim_cs[i].ftim[j]))
+#define set_ifc_cspr_ext(i, v) \
+               (ifc_out32(&(IFC_FCM_BASE_ADDR)->cspr_cs[i].cspr_ext, v))
+#define set_ifc_cspr(i, v)     \
+               (ifc_out32(&(IFC_FCM_BASE_ADDR)->cspr_cs[i].cspr, v))
+#define set_ifc_csor_ext(i, v) \
+               (ifc_out32(&(IFC_FCM_BASE_ADDR)->csor_cs[i].csor_ext, v))
+#define set_ifc_csor(i, v)     \
+               (ifc_out32(&(IFC_FCM_BASE_ADDR)->csor_cs[i].csor, v))
+#define set_ifc_amask(i, v)    \
+               (ifc_out32(&(IFC_FCM_BASE_ADDR)->amask_cs[i].amask, v))
+#define set_ifc_ftim(i, j, v)  \
+               (ifc_out32(&(IFC_FCM_BASE_ADDR)->ftim_cs[i].ftim[j], v))
 
 enum ifc_chip_sel {
        IFC_CS0,
@@ -869,20 +881,26 @@ struct fsl_ifc_nand {
        u32 nand_evter_en;
        u32 res17[0x2];
        u32 nand_evter_intr_en;
-       u32 res18[0x2];
+       u32 nand_vol_addr_stat;
+       u32 res18;
        u32 nand_erattr0;
        u32 nand_erattr1;
        u32 res19[0x10];
        u32 nand_fsr;
-       u32 res20;
-       u32 nand_eccstat[4];
-       u32 res21[0x20];
+       u32 res20[0x3];
+       u32 nand_eccstat[6];
+       u32 res21[0x1c];
        u32 nanndcr;
        u32 res22[0x2];
        u32 nand_autoboot_trgr;
        u32 res23;
        u32 nand_mdr;
-       u32 res24[0x5C];
+       u32 res24[0x1c];
+       u32 nand_dll_lowcfg0;
+       u32 nand_dll_lowcfg1;
+       u32 res25;
+       u32 nand_dll_lowstat;
+       u32 res26[0x3C];
 };
 
 /*
@@ -917,7 +935,6 @@ struct fsl_ifc_gpcm {
        u32 gpcm_erattr1;
        u32 gpcm_erattr2;
        u32 gpcm_stat;
-       u32 res4[0x1F3];
 };
 
 #ifdef CONFIG_SYS_FSL_IFC_BANK_COUNT
@@ -965,9 +982,11 @@ struct fsl_ifc_ftim {
 };
 
 /*
- * IFC Controller Registers
+ * IFC Controller Global Registers
+ * FCM - Flash control machine
  */
-struct fsl_ifc {
+
+struct fsl_ifc_fcm {
        u32 ifc_rev;
        u32 res1[0x2];
        struct fsl_ifc_cspr cspr_cs[CONFIG_SYS_FSL_IFC_BANK_COUNT];
@@ -979,7 +998,8 @@ struct fsl_ifc {
        struct fsl_ifc_ftim ftim_cs[CONFIG_SYS_FSL_IFC_BANK_COUNT];
        u8 res5[IFC_FTIM_REG_LEN - IFC_FTIM_USED_LEN];
        u32 rb_stat;
-       u32 res6[0x2];
+       u32 rb_map;
+       u32 wp_map;
        u32 ifc_gcr;
        u32 res7[0x2];
        u32 cm_evter_stat;
@@ -993,12 +1013,20 @@ struct fsl_ifc {
        u32 res11[0x2];
        u32 ifc_ccr;
        u32 ifc_csr;
-       u32 res12[0x2EB];
+       u32 ddr_ccr_low;
+};
+
+struct fsl_ifc_runtime {
        struct fsl_ifc_nand ifc_nand;
        struct fsl_ifc_nor ifc_nor;
        struct fsl_ifc_gpcm ifc_gpcm;
 };
 
+struct fsl_ifc {
+       struct fsl_ifc_fcm *gregs;
+       struct fsl_ifc_runtime *rregs;
+};
+
 #ifdef CONFIG_SYS_FSL_ERRATUM_IFC_A002769
 #undef CSPR_MSEL_NOR
 #define CSPR_MSEL_NOR  CSPR_MSEL_GPCM
index d251f5d4ce17831f715aa2c241c6452576b02ac1..33d9f030960c27117e754ec49b51390e8ad2936a 100644 (file)
@@ -87,6 +87,33 @@ struct ccsr_usb_phy {
 
 /* USB Erratum Checking code */
 #ifdef CONFIG_PPC
+static inline bool has_dual_phy(void)
+{
+       u32 svr = get_svr();
+       u32 soc = SVR_SOC_VER(svr);
+
+       switch (soc) {
+       case SVR_T1023:
+       case SVR_T1024:
+       case SVR_T1013:
+       case SVR_T1014:
+               return IS_SVR_REV(svr, 1, 0);
+       case SVR_T1040:
+       case SVR_T1042:
+       case SVR_T1020:
+       case SVR_T1022:
+       case SVR_T2080:
+       case SVR_T2081:
+               return IS_SVR_REV(svr, 1, 0) || IS_SVR_REV(svr, 1, 1);
+       case SVR_T4240:
+       case SVR_T4160:
+       case SVR_T4080:
+               return IS_SVR_REV(svr, 1, 0) || IS_SVR_REV(svr, 2, 0);
+       }
+
+       return false;
+}
+
 static inline bool has_erratum_a006261(void)
 {
        u32 svr = get_svr();
@@ -155,8 +182,13 @@ static inline bool has_erratum_a007792(void)
        case SVR_T4240:
        case SVR_T4160:
                return IS_SVR_REV(svr, 2, 0);
-       case SVR_T1040:
+       case SVR_T1024:
+       case SVR_T1023:
                return IS_SVR_REV(svr, 1, 0);
+       case SVR_T1040:
+       case SVR_T1042:
+       case SVR_T1020:
+       case SVR_T1022:
        case SVR_T2080:
        case SVR_T2081:
                return IS_SVR_REV(svr, 1, 0) || IS_SVR_REV(svr, 1, 1);
@@ -164,7 +196,25 @@ static inline bool has_erratum_a007792(void)
        return false;
 }
 
+static inline bool has_erratum_a005697(void)
+{
+       u32 svr = get_svr();
+       u32 soc = SVR_SOC_VER(svr);
+
+       switch (soc) {
+       case SVR_9131:
+       case SVR_9132:
+               return IS_SVR_REV(svr, 1, 0) || IS_SVR_REV(svr, 1, 1);
+       }
+       return false;
+}
+
 #else
+static inline bool has_dual_phy(void)
+{
+       return false;
+}
+
 static inline bool has_erratum_a006261(void)
 {
        return false;
@@ -184,5 +234,10 @@ static inline bool has_erratum_a007792(void)
 {
        return false;
 }
+
+static inline bool has_erratum_a005697(void)
+{
+       return false;
+}
 #endif
 #endif /*_ASM_FSL_USB_H_ */
index b317dcb5fe88d9072f5aad93b6e7cfeedd17d0a6..6d1f88ec2e1d5a606c3f95ccc41c6e3879266441 100644 (file)
 #endif
 #endif
 
+#ifdef CONFIG_LS102XA
+#define QE_MURAM_SIZE          0x6000UL
+#define MAX_QE_RISC            1
+#define QE_NUM_OF_SNUM         28
+#endif
+
+#ifdef CONFIG_PPC
+#define QE_IMMR_OFFSET         0x00140000
+#else
+#define QE_IMMR_OFFSET         0x01400000
+#endif
+
 /* QE I-RAM */
 typedef struct qe_iram {
        u32 iadd;               /* I-RAM Address Register */
index 5df634873f147f93fb444b9621abf07e1e6e21e1..f4da9e6dddb67e2ccb78464558caf5aa85f5ce74 100644 (file)
@@ -906,6 +906,9 @@ void *realloc_simple(void *ptr, size_t size);
 
 #endif
 
+/* Set up pre-relocation malloc() ready for use */
+int initf_malloc(void);
+
 /* Public routines */
 
 /* Simple versions which can be used when space is tight */
index 11d898527bf1fedc35667927d6938c95f0fab90a..3753e47edfb5336ecd371028dea708b961854bc9 100644 (file)
@@ -6,10 +6,6 @@
 #ifndef        __MPC85xx_H__
 #define __MPC85xx_H__
 
-/* define for common ppc_asm.tmpl */
-#define EXC_OFF_SYS_RESET      0x100   /* System reset */
-#define _START_OFFSET          0
-
 #if defined(CONFIG_E500)
 #include <e500.h>
 #endif
index 961d79995c51f74009933f74396794ebd10431e0..e61e92d4d5424da40e63a77e2842264b7db52e5d 100644 (file)
 /*
  * MFP configuration is represented by a 32-bit unsigned integer
  */
-#define MFP(_off, _pull, _pF, _drv, _dF, _edge, _eF, _afn, _aF) ( \
+#ifdef CONFIG_MVMFP_V2
+#define MFP(_off, _pull, _drv, _slp, _edge, _sleep, _afn) ( \
+       /* bits 31..16 - MFP Register Offset */ (((_off) & 0xffff) << 16) | \
+       /* bits 15..13 - Run Mode Pull State */ (((_pull) & 0x7) << 13) | \
+       /* bit  12..11 - Driver Strength */     (((_drv) & 0x3) << 11) | \
+       /* bits 10     - pad driver */          (((_slp) & 0x1) << 10) | \
+       /* bit  09..07 - sleep mode */          (((_sleep) & 0xe) << 6) | \
+       /* bits 06..04 - Edge Detection */      (((_edge) & 0x7) << 4) | \
+       /* bits 03     - sleep mode */          (((_sleep) & 0x1) << 3) | \
+       /* bits 02..00 - Alt-fun select */      ((_afn) & 0x7))
+#else
+#define MFP(_off, _pull, _drv, _slp, _edge, _sleep, _afn) ( \
        /* bits 31..16 - MFP Register Offset */ (((_off) & 0xffff) << 16) | \
        /* bits 15..13 - Run Mode Pull State */ (((_pull) & 0x7) << 13) | \
        /* bit  12     - Unused */ \
        /* bits 11..10 - Driver Strength */     (((_drv) & 0x3) << 10) | \
-       /* bit  09     - Pull State flag */     (((_pF) & 0x1) << 9) | \
-       /* bit  08     - Drv-strength flag */   (((_dF) & 0x1) << 8) | \
-       /* bit  07     - Edge-det flag */       (((_eF) & 0x1) << 7) | \
+       /* bit  09..07 - sleep mode */          (((_sleep) & 0xe) << 6) | \
        /* bits 06..04 - Edge Detection */      (((_edge) & 0x7) << 4) | \
-       /* bits 03..00 - Alt-fun flag */        (((_aF) & 0x1) << 3) | \
-       /* bits Alternate-fun select */         ((_afn) & 0x7))
+       /* bits 03     - sleep mode */          (((_sleep) & 0x1) << 3) | \
+       /* bits 02..00 - Alt-fun select */      ((_afn) & 0x7))
+#endif
 
 /*
  * to facilitate the definition, the following macros are provided
  *
  *                                 offset, pull,pF, drv,dF, edge,eF ,afn,aF
  */
-#define MFP_OFFSET_MASK                MFP(0xffff,    0,0,    0,0,     0,0,   0,0)
-#define MFP_REG(x)             MFP(x,         0,0,    0,0,     0,0,   0,0)
+#define MFP_OFFSET_MASK                MFP(0xffff,    0,    0,   0,   0,   0,   0)
+#define MFP_REG(x)             MFP(x,         0,    0,   0,   0,   0,   0)
 #define MFP_REG_GET_OFFSET(x)  ((x & MFP_OFFSET_MASK) >> 16)
 
-#define MFP_AF_FLAG            MFP(0x0000,    0,0,    0,0,     0,0,   0,1)
-#define MFP_DRIVE_FLAG         MFP(0x0000,    0,0,    0,1,     0,0,   0,0)
-#define MFP_EDGE_FLAG          MFP(0x0000,    0,0,    0,0,     0,1,   0,0)
-#define MFP_PULL_FLAG          MFP(0x0000,    0,1,    0,0,     0,0,   0,0)
+#define MFP_AF0                        MFP(0x0000,    0,    0,   0,   0,   0,   0)
+#define MFP_AF1                        MFP(0x0000,    0,    0,   0,   0,   0,   1)
+#define MFP_AF2                        MFP(0x0000,    0,    0,   0,   0,   0,   2)
+#define MFP_AF3                        MFP(0x0000,    0,    0,   0,   0,   0,   3)
+#define MFP_AF4                        MFP(0x0000,    0,    0,   0,   0,   0,   4)
+#define MFP_AF5                        MFP(0x0000,    0,    0,   0,   0,   0,   5)
+#define MFP_AF6                        MFP(0x0000,    0,    0,   0,   0,   0,   6)
+#define MFP_AF7                        MFP(0x0000,    0,    0,   0,   0,   0,   7)
+#define MFP_AF_MASK            MFP(0x0000,    0,    0,   0,   0,   0,   7)
+
+#define MFP_SLEEP_CTRL2                MFP(0x0000,    0,    0,   0,   0,   1,   0)
+#define MFP_SLEEP_DIR          MFP(0x0000,    0,    0,   0,   0,   2,   0)
+#define MFP_SLEEP_DATA         MFP(0x0000,    0,    0,   0,   0,   4,   0)
+#define MFP_SLEEP_CTRL         MFP(0x0000,    0,    0,   0,   0,   8,   0)
+#define MFP_SLEEP_MASK         MFP(0x0000,    0,    0,   0,   0, 0xf,   0)
 
-#define MFP_AF0                        MFP(0x0000,    0,0,    0,0,     0,0,   0,1)
-#define MFP_AF1                        MFP(0x0000,    0,0,    0,0,     0,0,   1,1)
-#define MFP_AF2                        MFP(0x0000,    0,0,    0,0,     0,0,   2,1)
-#define MFP_AF3                        MFP(0x0000,    0,0,    0,0,     0,0,   3,1)
-#define MFP_AF4                        MFP(0x0000,    0,0,    0,0,     0,0,   4,1)
-#define MFP_AF5                        MFP(0x0000,    0,0,    0,0,     0,0,   5,1)
-#define MFP_AF6                        MFP(0x0000,    0,0,    0,0,     0,0,   6,1)
-#define MFP_AF7                        MFP(0x0000,    0,0,    0,0,     0,0,   7,1)
-#define MFP_AF_MASK            MFP(0x0000,    0,0,    0,0,     0,0,   7,0)
+#define MFP_LPM_EDGE_NONE      MFP(0x0000,    0,    0,   0,   4,   0,   0)
+#define MFP_LPM_EDGE_RISE      MFP(0x0000,    0,    0,   0,   1,   0,   0)
+#define MFP_LPM_EDGE_FALL      MFP(0x0000,    0,    0,   0,   2,   0,   0)
+#define MFP_LPM_EDGE_BOTH      MFP(0x0000,    0,    0,   0,   3,   0,   0)
+#define MFP_LPM_EDGE_MASK      MFP(0x0000,    0,    0,   0,   7,   0,   0)
 
-#define MFP_LPM_EDGE_NONE      MFP(0x0000,    0,0,    0,0,     0,1,   0,0)
-#define MFP_LPM_EDGE_RISE      MFP(0x0000,    0,0,    0,0,     1,1,   0,0)
-#define MFP_LPM_EDGE_FALL      MFP(0x0000,    0,0,    0,0,     2,1,   0,0)
-#define MFP_LPM_EDGE_BOTH      MFP(0x0000,    0,0,    0,0,     3,1,   0,0)
-#define MFP_LPM_EDGE_MASK      MFP(0x0000,    0,0,    0,0,     3,0,   0,0)
+#define MFP_SLP_DI             MFP(0x0000,    0,    0,   1,   0,   0,   0)
 
-#define MFP_DRIVE_VERY_SLOW    MFP(0x0000,    0,0,    0,1,     0,0,   0,0)
-#define MFP_DRIVE_SLOW         MFP(0x0000,    0,0,    1,1,     0,0,   0,0)
-#define MFP_DRIVE_MEDIUM       MFP(0x0000,    0,0,    2,1,     0,0,   0,0)
-#define MFP_DRIVE_FAST         MFP(0x0000,    0,0,    3,1,     0,0,   0,0)
-#define MFP_DRIVE_MASK         MFP(0x0000,    0,0,    3,0,     0,0,   0,0)
+#define MFP_DRIVE_VERY_SLOW    MFP(0x0000,    0,    0,   0,   0,   0,   0)
+#define MFP_DRIVE_SLOW         MFP(0x0000,    0,    1,   0,   0,   0,   0)
+#define MFP_DRIVE_MEDIUM       MFP(0x0000,    0,    2,   0,   0,   0,   0)
+#define MFP_DRIVE_FAST         MFP(0x0000,    0,    3,   0,   0,   0,   0)
+#define MFP_DRIVE_MASK         MFP(0x0000,    0,    3,   0,   0,   0,   0)
 
-#define MFP_PULL_NONE          MFP(0x0000,    0,1,    0,0,     0,0,   0,0)
-#define MFP_PULL_LOW           MFP(0x0000,    1,1,    0,0,     0,0,   0,0)
-#define MFP_PULL_HIGH          MFP(0x0000,    2,1,    0,0,     0,0,   0,0)
-#define MFP_PULL_BOTH          MFP(0x0000,    3,1,    0,0,     0,0,   0,0)
-#define MFP_PULL_FLOAT         MFP(0x0000,    4,1,    0,0,     0,0,   0,0)
-#define MFP_PULL_MASK          MFP(0x0000,    7,0,    0,0,     0,0,   0,0)
+#define MFP_PULL_NONE          MFP(0x0000,    0,    0,   0,   0,   0,   0)
+#define MFP_PULL_LOW           MFP(0x0000,    5,    0,   0,   0,   0,   0)
+#define MFP_PULL_HIGH          MFP(0x0000,    6,    0,   0,   0,   0,   0)
+#define MFP_PULL_BOTH          MFP(0x0000,    7,    0,   0,   0,   0,   0)
+#define MFP_PULL_FLOAT         MFP(0x0000,    4,    0,   0,   0,   0,   0)
+#define MFP_PULL_MASK          MFP(0x0000,    7,    0,   0,   0,   0,   0)
 
+#define MFP_VALUE_MASK         (MFP_PULL_MASK | MFP_DRIVE_MASK | MFP_SLP_DI \
+                               | MFP_LPM_EDGE_MASK | MFP_SLEEP_MASK \
+                               | MFP_AF_MASK)
 #define MFP_EOC                        0xffffffff      /* indicates end-of-conf */
 
 /* Functions */
index 384dc2321e541278409b3c67f4e9677b306c5973..3f826b66f71feb995832572bdc5bad2ccd27066c 100644 (file)
@@ -254,6 +254,7 @@ int phy_teranetics_init(void);
 int phy_vitesse_init(void);
 
 int board_phy_config(struct phy_device *phydev);
+int get_phy_id(struct mii_dev *bus, int addr, int devad, u32 *phy_id);
 
 /**
  * phy_get_interface_by_name() - Look up a PHY interface name
index 07199b4f89ac2244fb07daf134ec31f5e265bfec..8e7a22d020f648cc3e88da48b8b9aee1708734b1 100644 (file)
@@ -180,7 +180,7 @@ enum {
 #define LDOB_3_30V     15
 
 #define LDO_VOL_MASK   0xf
-#define LDO_EN         4
+#define LDO_EN         (1 << 4)
 
 /*
  * Boost Regulator
index 36d5975584549aefebd09c84311967ad4ad94c54..ba166ebdd4d62a16ae38234bba269a6e45019b9e 100644 (file)
@@ -12,6 +12,8 @@
 #ifndef        __PPC_ASM_TMPL__
 #define __PPC_ASM_TMPL__
 
+#include <config.h>
+
 /***************************************************************************
  *
  * These definitions simplify the ugly declarations necessary for GOT
  */
 #define COPY_EE(d, s)          rlwimi d,s,0,16,16
 #define NOCOPY(d, s)
+
+#ifdef CONFIG_E500
+#define EXC_XFER_TEMPLATE(n, label, hdlr, msr, copyee) \
+       stw     r22,_NIP(r21);                          \
+       stw     r23,_MSR(r21);                          \
+       li      r23,n;                                  \
+       stw     r23,TRAP(r21);                          \
+       li      r20,msr;                                \
+       copyee(r20,r23);                                \
+       rlwimi  r20,r23,0,25,25;                        \
+       mtmsr   r20;                                    \
+       bl      1f;                                     \
+1:     mflr    r23;                                    \
+       addis   r23,r23,(hdlr - 1b)@ha;                 \
+       addi    r23,r23,(hdlr - 1b)@l;                  \
+       b       transfer_to_handler
+
+#define STD_EXCEPTION(n, label, hdlr)                          \
+label:                                                         \
+       EXCEPTION_PROLOG(SRR0, SRR1);                           \
+       addi    r3,r1,STACK_FRAME_OVERHEAD;                     \
+       EXC_XFER_TEMPLATE(n, label, hdlr, MSR_KERNEL, NOCOPY)   \
+
+#define CRIT_EXCEPTION(n, label, hdlr)                         \
+label:                                                         \
+       EXCEPTION_PROLOG(CSRR0, CSRR1);                         \
+       addi    r3,r1,STACK_FRAME_OVERHEAD;                     \
+       EXC_XFER_TEMPLATE(n, label, hdlr,                       \
+       MSR_KERNEL & ~(MSR_ME|MSR_DE|MSR_CE), NOCOPY)           \
+
+#define MCK_EXCEPTION(n, label, hdlr)                          \
+label:                                                         \
+       EXCEPTION_PROLOG(MCSRR0, MCSRR1);                       \
+       addi    r3,r1,STACK_FRAME_OVERHEAD;                     \
+       EXC_XFER_TEMPLATE(n, label, hdlr,                       \
+       MSR_KERNEL & ~(MSR_ME|MSR_DE|MSR_CE), NOCOPY)           \
+
+#else  /* !E500 */
+
 #define EXC_XFER_TEMPLATE(label, hdlr, msr, copyee)    \
        bl      1f;                                     \
 1:     mflr    r20;                                    \
@@ -280,4 +321,5 @@ label:                                                              \
        EXC_XFER_TEMPLATE(label, hdlr,                          \
        MSR_KERNEL & ~(MSR_ME|MSR_DE|MSR_CE), NOCOPY)           \
 
+#endif /* !E500 */
 #endif /* __PPC_ASM_TMPL__ */
index c58e453559616eb1cbbca36ee20704afcd4ebecc..9495ca53c9b6649acd7e04879261eb40c4344d8e 100644 (file)
 
 /* SPI RX operation modes */
 #define SPI_OPM_RX_AS          (1 << 0)
-#define SPI_OPM_RX_DOUT        (1 << 1)
-#define SPI_OPM_RX_DIO         (1 << 2)
-#define SPI_OPM_RX_QOF         (1 << 3)
-#define SPI_OPM_RX_QIOF        (1 << 4)
-#define SPI_OPM_RX_EXTN        (SPI_OPM_RX_AS | SPI_OPM_RX_DOUT | \
+#define SPI_OPM_RX_AF          (1 << 1)
+#define SPI_OPM_RX_DOUT                (1 << 2)
+#define SPI_OPM_RX_DIO         (1 << 3)
+#define SPI_OPM_RX_QOF         (1 << 4)
+#define SPI_OPM_RX_QIOF                (1 << 5)
+#define SPI_OPM_RX_EXTN        (SPI_OPM_RX_AS | SPI_OPM_RX_AF | SPI_OPM_RX_DOUT | \
                                SPI_OPM_RX_DIO | SPI_OPM_RX_QOF | \
                                SPI_OPM_RX_QIOF)
 
@@ -385,12 +386,12 @@ struct dm_spi_ops {
         * allowed to claim the same bus for several slaves without releasing
         * the bus in between.
         *
-        * @bus:        The SPI slave
+        * @dev:        The SPI slave
         *
         * Returns: 0 if the bus was claimed successfully, or a negative value
         * if it wasn't.
         */
-       int (*claim_bus)(struct udevice *bus);
+       int (*claim_bus)(struct udevice *dev);
 
        /**
         * Release the SPI bus
@@ -399,9 +400,9 @@ struct dm_spi_ops {
         * all transfers have finished. It may disable any SPI hardware as
         * appropriate.
         *
-        * @bus:        The SPI slave
+        * @dev:        The SPI slave
         */
-       int (*release_bus)(struct udevice *bus);
+       int (*release_bus)(struct udevice *dev);
 
        /**
         * Set the word length for SPI transactions
@@ -413,7 +414,7 @@ struct dm_spi_ops {
         *
         * Returns: 0 on success, -ve on failure.
         */
-       int (*set_wordlen)(struct udevice *bus, unsigned int wordlen);
+       int (*set_wordlen)(struct udevice *dev, unsigned int wordlen);
 
        /**
         * SPI transfer
index 218283fc987cc6380f86695a1f17cbb7679f0421..f2814ef41a0b3c27b2e82352190de831559422c9 100644 (file)
@@ -62,11 +62,10 @@ struct spi_slave;
  * return 0 - Success, 1 - Failure
  */
 struct spi_flash {
-#ifdef CONFIG_DM_SPI_FLASH
        struct spi_slave *spi;
+#ifdef CONFIG_DM_SPI_FLASH
        struct udevice *dev;
-#else
-       struct spi_slave *spi;
+       u16 flags;
 #endif
        const char *name;
        u8 dual_flash;
@@ -91,13 +90,13 @@ struct spi_flash {
 #ifndef CONFIG_DM_SPI_FLASH
        /*
         * These are not strictly needed for driver model, but keep them here
-        * whilt the transition is in progress.
+        * while the transition is in progress.
         *
         * Normally each driver would provide its own operations, but for
         * SPI flash most chips use the same algorithms. One approach is
         * to create a 'common' SPI flash device which knows how to talk
         * to most devices, and then allow other drivers to be used instead
-        * if requird, perhaps with a way of scanning through the list to
+        * if required, perhaps with a way of scanning through the list to
         * find the driver that matches the device.
         */
        int (*read)(struct spi_flash *flash, u32 offset, size_t len, void *buf);
index 27f4bdfa8773b36233f7bdc57136c655d5908e5c..a5e35df80ac1b13db6d82137a34c71f8ca63c9d5 100644 (file)
@@ -105,6 +105,7 @@ typedef unsigned long led_id_t;
 extern void __led_toggle (led_id_t mask);
 extern void __led_init (led_id_t mask, int state);
 extern void __led_set (led_id_t mask, int state);
+void __led_blink(led_id_t mask, int freq);
 #else
 # error Status LED configuration missing
 #endif
index 5624482d573b947fb3d533562bda755d75995853..09c8abd951d09c48ea8b937542549c25efb8ad79 100644 (file)
@@ -39,9 +39,32 @@ int strict_strtoul(const char *cp, unsigned int base, unsigned long *res);
 unsigned long long simple_strtoull(const char *cp, char **endp,
                                        unsigned int base);
 long simple_strtol(const char *cp, char **endp, unsigned int base);
+
+/**
+ * panic() - Print a message and reset/hang
+ *
+ * Prints a message on the console(s) and then resets. If CONFIG_PANIC_HANG is
+ * defined, then it will hang instead of reseting.
+ *
+ * @param fmt: printf() format string for message, which should not include
+ *             \n, followed by arguments
+ */
 void panic(const char *fmt, ...)
                __attribute__ ((format (__printf__, 1, 2), noreturn));
 
+/**
+ * panic_str() - Print a message and reset/hang
+ *
+ * Prints a message on the console(s) and then resets. If CONFIG_PANIC_HANG is
+ * defined, then it will hang instead of reseting.
+ *
+ * This function can be used instead of panic() when your board does not
+ * already use printf(), * to keep code size small.
+ *
+ * @param fmt: string to display, which should not include \n
+ */
+void panic_str(const char *str) __attribute__ ((noreturn));
+
 /**
  * Format a string and place it in a buffer
  *
index 07d175f45e87987c659404aba8e5774bccaf2860..97ed398ade42f1b0eb6ef233202b56fa3068a668 100644 (file)
@@ -44,6 +44,12 @@ obj-$(CONFIG_BITREVERSE) += bitrev.o
 obj-y += list_sort.o
 endif
 
+ifndef CONFIG_SPL_DISABLE_OF_CONTROL
+obj-$(CONFIG_OF_LIBFDT) += libfdt/
+obj-$(CONFIG_OF_CONTROL) += fdtdec_common.o
+obj-$(CONFIG_OF_CONTROL) += fdtdec.o
+endif
+
 ifdef CONFIG_SPL_BUILD
 obj-$(CONFIG_SPL_YMODEM_SUPPORT) += crc16.o
 obj-$(CONFIG_SPL_NET_SUPPORT) += net_utils.o
index 331eae2ce1e093f04efa6ba055c485efc9a3c1f1..80b897a21cd69a88ce5d3fe1398d23da11339f67 100644 (file)
@@ -9,6 +9,7 @@
 #include <serial.h>
 #include <libfdt.h>
 #include <fdtdec.h>
+#include <asm/sections.h>
 #include <linux/ctype.h>
 
 DECLARE_GLOBAL_DATA_PTR;
@@ -565,9 +566,11 @@ int fdtdec_prepare_fdt(void)
 {
        if (!gd->fdt_blob || ((uintptr_t)gd->fdt_blob & 3) ||
            fdt_check_header(gd->fdt_blob)) {
-               printf("No valid FDT found - please append one to U-Boot "
-                       "binary, use u-boot-dtb.bin or define "
-                       "CONFIG_OF_EMBED. For sandbox, use -d <file.dtb>\n");
+#ifdef CONFIG_SPL_BUILD
+               puts("Missing DTB\n");
+#else
+               puts("No valid device tree binary found - please append one to U-Boot binary, use u-boot-dtb.bin or define CONFIG_OF_EMBED. For sandbox, use -d <file.dtb>\n");
+#endif
                return -1;
        }
        return 0;
@@ -1035,4 +1038,34 @@ int fdtdec_decode_memory_region(const void *blob, int config_node,
 
        return 0;
 }
+
+int fdtdec_setup(void)
+{
+#ifdef CONFIG_OF_CONTROL
+# ifdef CONFIG_OF_EMBED
+       /* Get a pointer to the FDT */
+       gd->fdt_blob = __dtb_dt_begin;
+# elif defined CONFIG_OF_SEPARATE
+#  ifdef CONFIG_SPL_BUILD
+       /* FDT is at end of BSS */
+       gd->fdt_blob = (ulong *)&__bss_end;
+#  else
+       /* FDT is at end of image */
+       gd->fdt_blob = (ulong *)&_end;
+#endif
+# elif defined(CONFIG_OF_HOSTFILE)
+       if (sandbox_read_fdt_from_file()) {
+               puts("Failed to read control FDT\n");
+               return -1;
+       }
+# endif
+# ifndef CONFIG_SPL_BUILD
+       /* Allow the early environment to override the fdt address */
+       gd->fdt_blob = (void *)getenv_ulong("fdtcontroladdr", 16,
+                                               (uintptr_t)gd->fdt_blob);
+# endif
 #endif
+       return fdtdec_prepare_fdt();
+}
+
+#endif /* !USE_HOSTCC */
index f469fcbeadb5c0ceb77bc2e3b7a78a15797ffe6a..4128a1871c998836dde4bded2c6784d2b1826768 100644 (file)
 #include <image.h>
 #include <malloc.h>
 #include <u-boot/zlib.h>
+#include <div64.h>
 
+#define HEADER0                        '\x1f'
+#define HEADER1                        '\x8b'
 #define        ZALLOC_ALIGNMENT        16
 #define HEAD_CRC               2
 #define EXTRA_FIELD            4
@@ -66,6 +69,196 @@ int gunzip(void *dst, int dstlen, unsigned char *src, unsigned long *lenp)
        return zunzip(dst, dstlen, src, lenp, 1, i);
 }
 
+__weak
+void gzwrite_progress_init(u64 expectedsize)
+{
+       putc('\n');
+}
+
+__weak
+void gzwrite_progress(int iteration,
+                    u64 bytes_written,
+                    u64 total_bytes)
+{
+       if (0 == (iteration & 3))
+               printf("%llu/%llu\r", bytes_written, total_bytes);
+}
+
+__weak
+void gzwrite_progress_finish(int returnval,
+                            u64 bytes_written,
+                            u64 total_bytes,
+                            u32 expected_crc,
+                            u32 calculated_crc)
+{
+       if (0 == returnval) {
+               printf("\n\t%llu bytes, crc 0x%08x\n",
+                      total_bytes, calculated_crc);
+       } else {
+               printf("\n\tuncompressed %llu of %llu\n"
+                      "\tcrcs == 0x%08x/0x%08x\n",
+                      bytes_written, total_bytes,
+                      expected_crc, calculated_crc);
+       }
+}
+
+int gzwrite(unsigned char *src, int len,
+           struct block_dev_desc *dev,
+           unsigned long szwritebuf,
+           u64 startoffs,
+           u64 szexpected)
+{
+       int i, flags;
+       z_stream s;
+       int r = 0;
+       unsigned char *writebuf;
+       unsigned crc = 0;
+       u64 totalfilled = 0;
+       lbaint_t blksperbuf, outblock;
+       u32 expected_crc;
+       u32 payload_size;
+       int iteration = 0;
+
+       if (!szwritebuf ||
+           (szwritebuf % dev->blksz) ||
+           (szwritebuf < dev->blksz)) {
+               printf("%s: size %lu not a multiple of %lu\n",
+                      __func__, szwritebuf, dev->blksz);
+               return -1;
+       }
+
+       if (startoffs & (dev->blksz-1)) {
+               printf("%s: start offset %llu not a multiple of %lu\n",
+                      __func__, startoffs, dev->blksz);
+               return -1;
+       }
+
+       blksperbuf = szwritebuf / dev->blksz;
+       outblock = lldiv(startoffs, dev->blksz);
+
+       /* skip header */
+       i = 10;
+       flags = src[3];
+       if (src[2] != DEFLATED || (flags & RESERVED) != 0) {
+               puts("Error: Bad gzipped data\n");
+               return -1;
+       }
+       if ((flags & EXTRA_FIELD) != 0)
+               i = 12 + src[10] + (src[11] << 8);
+       if ((flags & ORIG_NAME) != 0)
+               while (src[i++] != 0)
+                       ;
+       if ((flags & COMMENT) != 0)
+               while (src[i++] != 0)
+                       ;
+       if ((flags & HEAD_CRC) != 0)
+               i += 2;
+
+       if (i >= len-8) {
+               puts("Error: gunzip out of data in header");
+               return -1;
+       }
+
+       payload_size = len - i - 8;
+
+       memcpy(&expected_crc, src + len - 8, sizeof(expected_crc));
+       expected_crc = le32_to_cpu(expected_crc);
+       u32 szuncompressed;
+       memcpy(&szuncompressed, src + len - 4, sizeof(szuncompressed));
+       if (szexpected == 0) {
+               szexpected = le32_to_cpu(szuncompressed);
+       } else if (szuncompressed != (u32)szexpected) {
+               printf("size of %llx doesn't match trailer low bits %x\n",
+                      szexpected, szuncompressed);
+               return -1;
+       }
+       if (lldiv(szexpected, dev->blksz) > (dev->lba - outblock)) {
+               printf("%s: uncompressed size %llu exceeds device size\n",
+                      __func__, szexpected);
+               return -1;
+       }
+
+       gzwrite_progress_init(szexpected);
+
+       s.zalloc = gzalloc;
+       s.zfree = gzfree;
+
+       r = inflateInit2(&s, -MAX_WBITS);
+       if (r != Z_OK) {
+               printf("Error: inflateInit2() returned %d\n", r);
+               return -1;
+       }
+
+       s.next_in = src + i;
+       s.avail_in = payload_size+8;
+       writebuf = (unsigned char *)malloc(szwritebuf);
+
+       /* decompress until deflate stream ends or end of file */
+       do {
+               if (s.avail_in == 0) {
+                       printf("%s: weird termination with result %d\n",
+                              __func__, r);
+                       break;
+               }
+
+               /* run inflate() on input until output buffer not full */
+               do {
+                       unsigned long blocks_written;
+                       int numfilled;
+                       lbaint_t writeblocks;
+
+                       s.avail_out = szwritebuf;
+                       s.next_out = writebuf;
+                       r = inflate(&s, Z_SYNC_FLUSH);
+                       if ((r != Z_OK) &&
+                           (r != Z_STREAM_END)) {
+                               printf("Error: inflate() returned %d\n", r);
+                               goto out;
+                       }
+                       numfilled = szwritebuf - s.avail_out;
+                       crc = crc32(crc, writebuf, numfilled);
+                       totalfilled += numfilled;
+                       if (numfilled < szwritebuf) {
+                               writeblocks = (numfilled+dev->blksz-1)
+                                               / dev->blksz;
+                               memset(writebuf+numfilled, 0,
+                                      dev->blksz-(numfilled%dev->blksz));
+                       } else {
+                               writeblocks = blksperbuf;
+                       }
+
+                       gzwrite_progress(iteration++,
+                                        totalfilled,
+                                        szexpected);
+                       blocks_written = dev->block_write(dev->dev,
+                                                         outblock,
+                                                         writeblocks,
+                                                         writebuf);
+                       outblock += blocks_written;
+                       if (ctrlc()) {
+                               puts("abort\n");
+                               goto out;
+                       }
+                       WATCHDOG_RESET();
+               } while (s.avail_out == 0);
+               /* done when inflate() says it's done */
+       } while (r != Z_STREAM_END);
+
+       if ((szexpected != totalfilled) ||
+           (crc != expected_crc))
+               r = -1;
+       else
+               r = 0;
+
+out:
+       gzwrite_progress_finish(r, totalfilled, szexpected,
+                               expected_crc, crc);
+       free(writebuf);
+       inflateEnd(&s);
+
+       return r;
+}
+
 /*
  * Uncompress blocks compressed with zlib without headers
  */
@@ -81,7 +274,7 @@ int zunzip(void *dst, int dstlen, unsigned char *src, unsigned long *lenp,
 
        r = inflateInit2(&s, -MAX_WBITS);
        if (r != Z_OK) {
-               printf ("Error: inflateInit2() returned %d\n", r);
+               printf("Error: inflateInit2() returned %d\n", r);
                return -1;
        }
        s.next_in = src + offset;
index 03733e574f71db1df2ebec2c08ec66dff95908d0..44fc0aa900d2556996ab5f9ef7c87f12fca517ce 100644 (file)
@@ -113,6 +113,25 @@ int fdt_subnode_offset(const void *fdt, int parentoffset,
        return fdt_subnode_offset_namelen(fdt, parentoffset, name, strlen(name));
 }
 
+/*
+ * Find the next of path seperator, note we need to search for both '/' and ':'
+ * and then take the first one so that we do the rigth thing for e.g.
+ * "foo/bar:option" and "bar:option/otheroption", both of which happen, so
+ * first searching for either ':' or '/' does not work.
+ */
+static const char *fdt_path_next_seperator(const char *path)
+{
+       const char *sep1 = strchr(path, '/');
+       const char *sep2 = strchr(path, ':');
+
+       if (sep1 && sep2)
+               return (sep1 < sep2) ? sep1 : sep2;
+       else if (sep1)
+               return sep1;
+       else
+               return sep2;
+}
+
 int fdt_path_offset(const void *fdt, const char *path)
 {
        const char *end = path + strlen(path);
@@ -123,7 +142,7 @@ int fdt_path_offset(const void *fdt, const char *path)
 
        /* see if we have an alias */
        if (*path != '/') {
-               const char *q = strchr(path, '/');
+               const char *q = fdt_path_next_seperator(path);
 
                if (!q)
                        q = end;
@@ -141,9 +160,9 @@ int fdt_path_offset(const void *fdt, const char *path)
 
                while (*p == '/')
                        p++;
-               if (! *p)
+               if (*p == '\0' || *p == ':')
                        return offset;
-               q = strchr(p, '/');
+               q = fdt_path_next_seperator(p);
                if (! q)
                        q = end;
 
index e0f264850f7fa75bc6cbeaad2537d3fffc4a318d..bedc865240de0dd7a2d50fa9be5a73dce5084b7b 100644 (file)
@@ -842,13 +842,11 @@ int sprintf(char *buf, const char *fmt, ...)
        return i;
 }
 
-void panic(const char *fmt, ...)
+static void panic_finish(void) __attribute__ ((noreturn));
+
+static void panic_finish(void)
 {
-       va_list args;
-       va_start(args, fmt);
-       vprintf(fmt, args);
        putc('\n');
-       va_end(args);
 #if defined(CONFIG_PANIC_HANG)
        hang();
 #else
@@ -859,6 +857,21 @@ void panic(const char *fmt, ...)
                ;
 }
 
+void panic_str(const char *str)
+{
+       puts(str);
+       panic_finish();
+}
+
+void panic(const char *fmt, ...)
+{
+       va_list args;
+       va_start(args, fmt);
+       vprintf(fmt, args);
+       va_end(args);
+       panic_finish();
+}
+
 void __assert_fail(const char *assertion, const char *file, unsigned line,
                   const char *function)
 {
index 990d390d0150da5edb8b52a6e5887f1d94e68dc4..91be1e5d4382d827cf1be47214f5e9d580bc19e9 100644 (file)
@@ -129,6 +129,61 @@ static int dm_test_autobind(struct dm_test_state *dms)
 }
 DM_TEST(dm_test_autobind, 0);
 
+/* Test that binding with uclass platdata allocation occurs correctly */
+static int dm_test_autobind_uclass_pdata_alloc(struct dm_test_state *dms)
+{
+       struct dm_test_perdev_uc_pdata *uc_pdata;
+       struct udevice *dev;
+       struct uclass *uc;
+
+       ut_assertok(uclass_get(UCLASS_TEST, &uc));
+       ut_assert(uc);
+
+       /**
+        * Test if test uclass driver requires allocation for the uclass
+        * platform data and then check the dev->uclass_platdata pointer.
+        */
+       ut_assert(uc->uc_drv->per_device_platdata_auto_alloc_size);
+
+       for (uclass_find_first_device(UCLASS_TEST, &dev);
+            dev;
+            uclass_find_next_device(&dev)) {
+               ut_assert(dev);
+
+               uc_pdata = dev_get_uclass_platdata(dev);
+               ut_assert(uc_pdata);
+       }
+
+       return 0;
+}
+DM_TEST(dm_test_autobind_uclass_pdata_alloc, DM_TESTF_SCAN_PDATA);
+
+/* Test that binding with uclass platdata setting occurs correctly */
+static int dm_test_autobind_uclass_pdata_valid(struct dm_test_state *dms)
+{
+       struct dm_test_perdev_uc_pdata *uc_pdata;
+       struct udevice *dev;
+
+       /**
+        * In the test_postbind() method of test uclass driver, the uclass
+        * platform data should be set to three test int values - test it.
+        */
+       for (uclass_find_first_device(UCLASS_TEST, &dev);
+            dev;
+            uclass_find_next_device(&dev)) {
+               ut_assert(dev);
+
+               uc_pdata = dev_get_uclass_platdata(dev);
+               ut_assert(uc_pdata);
+               ut_assert(uc_pdata->intval1 == TEST_UC_PDATA_INTVAL1);
+               ut_assert(uc_pdata->intval2 == TEST_UC_PDATA_INTVAL2);
+               ut_assert(uc_pdata->intval3 == TEST_UC_PDATA_INTVAL3);
+       }
+
+       return 0;
+}
+DM_TEST(dm_test_autobind_uclass_pdata_valid, DM_TESTF_SCAN_PDATA);
+
 /* Test that autoprobe finds all the expected devices */
 static int dm_test_autoprobe(struct dm_test_state *dms)
 {
@@ -596,14 +651,130 @@ static int dm_test_uclass_before_ready(struct dm_test_state *dms)
 
        ut_assertok(uclass_get(UCLASS_TEST, &uc));
 
-       memset(gd, '\0', sizeof(*gd));
+       gd->dm_root = NULL;
+       gd->dm_root_f = NULL;
+       memset(&gd->uclass_root, '\0', sizeof(gd->uclass_root));
+
        ut_asserteq_ptr(NULL, uclass_find(UCLASS_TEST));
 
        return 0;
 }
-
 DM_TEST(dm_test_uclass_before_ready, 0);
 
+static int dm_test_uclass_devices_find(struct dm_test_state *dms)
+{
+       struct udevice *dev;
+       int ret;
+
+       for (ret = uclass_find_first_device(UCLASS_TEST, &dev);
+            dev;
+            ret = uclass_find_next_device(&dev)) {
+               ut_assert(!ret);
+               ut_assert(dev);
+       }
+
+       return 0;
+}
+DM_TEST(dm_test_uclass_devices_find, DM_TESTF_SCAN_PDATA);
+
+static int dm_test_uclass_devices_find_by_name(struct dm_test_state *dms)
+{
+       struct udevice *finddev;
+       struct udevice *testdev;
+       int findret, ret;
+
+       /*
+        * For each test device found in fdt like: "a-test", "b-test", etc.,
+        * use its name and try to find it by uclass_find_device_by_name().
+        * Then, on success check if:
+        * - current 'testdev' name is equal to the returned 'finddev' name
+        * - current 'testdev' pointer is equal to the returned 'finddev'
+        *
+        * We assume that, each uclass's device name is unique, so if not, then
+        * this will fail on checking condition: testdev == finddev, since the
+        * uclass_find_device_by_name(), returns the first device by given name.
+       */
+       for (ret = uclass_find_first_device(UCLASS_TEST_FDT, &testdev);
+            testdev;
+            ret = uclass_find_next_device(&testdev)) {
+               ut_assertok(ret);
+               ut_assert(testdev);
+
+               findret = uclass_find_device_by_name(UCLASS_TEST_FDT,
+                                                    testdev->name,
+                                                    &finddev);
+
+               ut_assertok(findret);
+               ut_assert(testdev);
+               ut_asserteq_str(testdev->name, finddev->name);
+               ut_asserteq_ptr(testdev, finddev);
+       }
+
+       return 0;
+}
+DM_TEST(dm_test_uclass_devices_find_by_name, DM_TESTF_SCAN_FDT);
+
+static int dm_test_uclass_devices_get(struct dm_test_state *dms)
+{
+       struct udevice *dev;
+       int ret;
+
+       for (ret = uclass_first_device(UCLASS_TEST, &dev);
+            dev;
+            ret = uclass_next_device(&dev)) {
+               ut_assert(!ret);
+               ut_assert(dev);
+               ut_assert(device_active(dev));
+       }
+
+       return 0;
+}
+DM_TEST(dm_test_uclass_devices_get, DM_TESTF_SCAN_PDATA);
+
+static int dm_test_uclass_devices_get_by_name(struct dm_test_state *dms)
+{
+       struct udevice *finddev;
+       struct udevice *testdev;
+       int ret, findret;
+
+       /*
+        * For each test device found in fdt like: "a-test", "b-test", etc.,
+        * use its name and try to get it by uclass_get_device_by_name().
+        * On success check if:
+        * - returned finddev' is active
+        * - current 'testdev' name is equal to the returned 'finddev' name
+        * - current 'testdev' pointer is equal to the returned 'finddev'
+        *
+        * We asserts that the 'testdev' is active on each loop entry, so we
+        * could be sure that the 'finddev' is activated too, but for sure
+        * we check it again.
+        *
+        * We assume that, each uclass's device name is unique, so if not, then
+        * this will fail on checking condition: testdev == finddev, since the
+        * uclass_get_device_by_name(), returns the first device by given name.
+       */
+       for (ret = uclass_first_device(UCLASS_TEST_FDT, &testdev);
+            testdev;
+            ret = uclass_next_device(&testdev)) {
+               ut_assertok(ret);
+               ut_assert(testdev);
+               ut_assert(device_active(testdev));
+
+               findret = uclass_get_device_by_name(UCLASS_TEST_FDT,
+                                                   testdev->name,
+                                                   &finddev);
+
+               ut_assertok(findret);
+               ut_assert(finddev);
+               ut_assert(device_active(finddev));
+               ut_asserteq_str(testdev->name, finddev->name);
+               ut_asserteq_ptr(testdev, finddev);
+       }
+
+       return 0;
+}
+DM_TEST(dm_test_uclass_devices_get_by_name, DM_TESTF_SCAN_FDT);
+
 static int dm_test_device_get_uclass_id(struct dm_test_state *dms)
 {
        struct udevice *dev;
index 7cb37f70c785c9df2e7f238f67532eeb43d4ec5c..4ae75ef7640c4382958805c31657f3c43850c6e4 100644 (file)
@@ -30,9 +30,18 @@ int test_ping(struct udevice *dev, int pingval, int *pingret)
 
 static int test_post_bind(struct udevice *dev)
 {
+       struct dm_test_perdev_uc_pdata *uc_pdata;
+
        dm_testdrv_op_count[DM_TEST_OP_POST_BIND]++;
        ut_assert(!device_active(dev));
 
+       uc_pdata = dev_get_uclass_platdata(dev);
+       ut_assert(uc_pdata);
+
+       uc_pdata->intval1 = TEST_UC_PDATA_INTVAL1;
+       uc_pdata->intval2 = TEST_UC_PDATA_INTVAL2;
+       uc_pdata->intval3 = TEST_UC_PDATA_INTVAL3;
+
        return 0;
 }
 
@@ -115,4 +124,6 @@ UCLASS_DRIVER(test) = {
        .destroy        = test_destroy,
        .priv_auto_alloc_size   = sizeof(struct dm_test_uclass_priv),
        .per_device_auto_alloc_size = sizeof(struct dm_test_uclass_perdev_priv),
+       .per_device_platdata_auto_alloc_size =
+                                       sizeof(struct dm_test_perdev_uc_pdata),
 };
index e870d54c1ff64ad55e567b34198b85f9f5fa34df..8ecdd8f8541928d06b68784a4017ed028737c64e 100644 (file)
@@ -348,7 +348,7 @@ At the time of writing, U-Boot has these architectures:
    arc, arm, avr32, blackfin, m68k, microblaze, mips, nds32, nios2, openrisc
    powerpc, sandbox, sh, sparc, x86
 
-Of these, only arc, microblaze and nds32 are not available at kernel.org..
+Of these, only arc and nds32 are not available at kernel.org..
 
 
 How to run it
index 7642d94473663df4c4781365a6ca4a70f6b70011..d8f3c81fadf9345f6ffbec9dad86257a2dca8b76 100644 (file)
@@ -411,7 +411,7 @@ class TestBuild(unittest.TestCase):
 
     def testToolchainDownload(self):
         """Test that we can download toolchains"""
-        self.assertEqual('https://www.kernel.org/pub/tools/crosstool/files/bin/x86_64/4.6.3/x86_64-gcc-4.6.3-nolibc_arm-unknown-linux-gnueabi.tar.xz',
+        self.assertEqual('https://www.kernel.org/pub/tools/crosstool/files/bin/x86_64/4.9.0/x86_64-gcc-4.9.0-nolibc_arm-unknown-linux-gnueabi.tar.xz',
             self.toolchains.LocateArchUrl('arm'))
 
 
index 051da11ef01de007afc59bd152cd70c24d8cbc3c..e33e10532ee9171897426f8e817bb112396083dc 100644 (file)
@@ -339,7 +339,7 @@ class Toolchains:
         """
         arch = command.OutputOneLine('uname', '-m')
         base = 'https://www.kernel.org/pub/tools/crosstool/files/bin'
-        versions = ['4.6.3', '4.6.2', '4.5.1', '4.2.4']
+        versions = ['4.9.0', '4.6.3', '4.6.2', '4.5.1', '4.2.4']
         links = []
         for version in versions:
             url = '%s/%s/%s/' % (base, arch, version)
index 7d039e82bc2781bc6624bb423f5d8f4ef302232d..27ec90acc80f08bbd0c514a9dccd4cb4fea40d6a 100644 (file)
@@ -154,7 +154,11 @@ Series-version: n
 
 Series-prefix: prefix
        Sets the subject prefix. Normally empty but it can be RFC for
-       RFC patches, or RESEND if you are being ignored.
+       RFC patches, or RESEND if you are being ignored. The patch subject
+       is like [RFC PATCH] or [RESEND PATCH].
+       In the meantime, git format.subjectprefix option will be added as
+       well. If your format.subjectprefix is set to InternalProject, then
+       the patch shows like: [InternalProject][RFC/RESEND PATCH]
 
 Series-name: name
        Sets the name of the series. You don't need to have a name, and
index 4c2c35bf9acfdc44af538cae6ffd64b609018ce9..9e739d89b6ff7ac261d6bc96b6c66def4b7d2937 100644 (file)
@@ -545,6 +545,17 @@ def GetDefaultUserEmail():
     uemail = command.OutputOneLine('git', 'config', '--global', 'user.email')
     return uemail
 
+def GetDefaultSubjectPrefix():
+    """Gets the format.subjectprefix from local .git/config file.
+
+    Returns:
+        Subject prefix found in local .git/config file, or None if none
+    """
+    sub_prefix = command.OutputOneLine('git', 'config', 'format.subjectprefix',
+                 raise_on_error=False)
+
+    return sub_prefix
+
 def Setup():
     """Set up git utils, by reading the alias files."""
     # Check for a git alias file also
index 60ebc766f7e956f959e6577c833ec9c68dc5d848..a17a7d1de7b1a69bd5257cbbc004a84b149c0ca5 100644 (file)
@@ -254,6 +254,12 @@ class Series(dict):
         Return:
             Patch string, like 'RFC PATCH v5' or just 'PATCH'
         """
+        git_prefix = gitutil.GetDefaultSubjectPrefix()
+        if git_prefix:
+           git_prefix = '%s][' % git_prefix
+        else:
+            git_prefix = ''
+
         version = ''
         if self.get('version'):
             version = ' v%s' % self['version']
@@ -262,4 +268,4 @@ class Series(dict):
         prefix = ''
         if self.get('prefix'):
             prefix = '%s ' % self['prefix']
-        return '%sPATCH%s' % (prefix, version)
+        return '%s%sPATCH%s' % (git_prefix, prefix, version)