Merge branch 'master' into next
authorTom Rini <trini@konsulko.com>
Mon, 19 Sep 2022 17:19:39 +0000 (13:19 -0400)
committerTom Rini <trini@konsulko.com>
Mon, 19 Sep 2022 20:07:12 +0000 (16:07 -0400)
Signed-off-by: Tom Rini <trini@konsulko.com>
340 files changed:
.github/pull_request_template.md
.gitlab-ci.yml
Kconfig
MAINTAINERS
Makefile
arch/arm/Kconfig
arch/arm/cpu/armv8/fsl-layerscape/spl.c
arch/arm/cpu/armv8/sec_firmware.c
arch/arm/dts/Makefile
arch/arm/dts/imx6ulz-bsh-smm-m2-u-boot.dtsi [new file with mode: 0644]
arch/arm/dts/imx6ulz-bsh-smm-m2.dts [new file with mode: 0644]
arch/arm/dts/imx8mn-beacon-kit-u-boot.dtsi
arch/arm/dts/imx8mp-dhcom-pdk2-u-boot.dtsi
arch/arm/dts/imx8mp-dhcom-pdk2.dts
arch/arm/dts/imx8mp-dhcom-som.dtsi
arch/arm/dts/imx8mp-dhcom-u-boot.dtsi [new file with mode: 0644]
arch/arm/dts/imx8mq-librem5-r4-u-boot.dtsi [new file with mode: 0644]
arch/arm/dts/imx8mq-librem5-r4.dts [new file with mode: 0644]
arch/arm/dts/imx8mq-librem5.dtsi [new file with mode: 0644]
arch/arm/dts/imxrt1170-evk-u-boot.dtsi [new file with mode: 0644]
arch/arm/dts/imxrt1170-evk.dts [new file with mode: 0644]
arch/arm/dts/imxrt1170-pinfunc.h [new file with mode: 0644]
arch/arm/dts/imxrt1170.dtsi [new file with mode: 0644]
arch/arm/dts/px30-u-boot.dtsi
arch/arm/dts/r7s72100-gr-peach-u-boot.dts
arch/arm/dts/r8a774c0-u-boot.dtsi
arch/arm/dts/r8a77950-u-boot.dtsi
arch/arm/dts/r8a77960-u-boot.dtsi
arch/arm/dts/r8a77965-u-boot.dtsi
arch/arm/dts/r8a77970-u-boot.dtsi
arch/arm/dts/r8a77980-u-boot.dtsi
arch/arm/dts/r8a77990-u-boot.dtsi
arch/arm/dts/r8a77995-u-boot.dtsi
arch/arm/dts/r8a779a0-u-boot.dtsi
arch/arm/dts/rk3288-u-boot.dtsi
arch/arm/dts/rk3288.dtsi
arch/arm/dts/rk3308-u-boot.dtsi
arch/arm/dts/rk3326-odroid-go2-u-boot.dtsi
arch/arm/dts/rk3328-u-boot.dtsi
arch/arm/dts/rk3368-u-boot.dtsi
arch/arm/dts/rk3399-u-boot.dtsi
arch/arm/dts/rk3568-u-boot.dtsi
arch/arm/dts/rockchip-u-boot.dtsi
arch/arm/dts/stm32f746-disco-u-boot.dtsi
arch/arm/dts/stm32mp151.dtsi
arch/arm/dts/stm32mp15xx-dhcom-picoitx-u-boot.dtsi
arch/arm/dts/stm32mp15xx-dhcom-u-boot.dtsi
arch/arm/dts/stm32mp15xx-dhcor-drc-compact-u-boot.dtsi
arch/arm/include/asm/arch-imx/cpu.h
arch/arm/include/asm/pl310.h
arch/arm/lib/semihosting.c
arch/arm/mach-imx/imx8m/Kconfig
arch/arm/mach-imx/imxrt/Kconfig
arch/arm/mach-imx/imxrt/soc.c
arch/arm/mach-imx/mx6/Kconfig
arch/arm/mach-imx/spl_imx_romapi.c
arch/arm/mach-kirkwood/cpu.c
arch/arm/mach-kirkwood/include/mach/cpu.h
arch/arm/mach-mvebu/cpu.c
arch/arm/mach-mvebu/include/mach/cpu.h
arch/arm/mach-mvebu/lowlevel.S
arch/arm/mach-mvebu/mbus.c
arch/arm/mach-mvebu/serdes/a38x/high_speed_env_spec.c
arch/arm/mach-mvebu/system-controller.c
arch/arm/mach-rockchip/Kconfig
arch/arm/mach-rockchip/rk3308/rk3308.c
arch/arm/mach-rockchip/rk3399/rk3399.c
arch/arm/mach-stm32mp/stm32mp15x.c
arch/powerpc/Kconfig
arch/powerpc/cpu/mpc85xx/Kconfig
arch/powerpc/cpu/mpc85xx/cpu.c
arch/powerpc/cpu/mpc85xx/u-boot-spl.lds
arch/powerpc/dts/kmcent2-u-boot.dtsi
arch/powerpc/dts/u-boot.dtsi
arch/riscv/dts/fu740-c000-u-boot.dtsi
arch/riscv/dts/fu740-c000.dtsi
arch/riscv/dts/hifive-unmatched-a00.dts
board/CZ.NIC/turris_atsha_otp.c
board/CZ.NIC/turris_atsha_otp.h
board/CZ.NIC/turris_mox/turris_mox.c
board/CZ.NIC/turris_omnia/turris_omnia.c
board/Marvell/mvebu_armada-37xx/board.c
board/bsh/imx6ulz_smm_m2/Kconfig [new file with mode: 0644]
board/bsh/imx6ulz_smm_m2/MAINTAINERS [new file with mode: 0644]
board/bsh/imx6ulz_smm_m2/Makefile [new file with mode: 0644]
board/bsh/imx6ulz_smm_m2/README [new file with mode: 0644]
board/bsh/imx6ulz_smm_m2/imx6ulz_smm_m2.c [new file with mode: 0644]
board/bsh/imx6ulz_smm_m2/spl.c [new file with mode: 0644]
board/data_modul/imx8mm_edm_sbc/lpddr4_timing_2G_32.c
board/data_modul/imx8mm_edm_sbc/lpddr4_timing_4G_32.c
board/dhelectronics/dh_imx8mp/lpddr4_timing_4G_32.c
board/dhelectronics/dh_stm32mp1/board.c
board/firefly/firefly-rk3308/roc_cc_rk3308.c
board/freescale/imxrt1170-evk/Kconfig [new file with mode: 0644]
board/freescale/imxrt1170-evk/MAINTAINERS [new file with mode: 0644]
board/freescale/imxrt1170-evk/Makefile [new file with mode: 0644]
board/freescale/imxrt1170-evk/imximage.cfg [new file with mode: 0644]
board/freescale/imxrt1170-evk/imxrt1170-evk.c [new file with mode: 0644]
board/freescale/ls1043ardb/ddr.c
board/freescale/p1_p2_rdb_pc/README
board/freescale/p1_p2_rdb_pc/p1_p2_rdb_pc.c
board/freescale/p1_p2_rdb_pc/spl.c
board/freescale/p1_p2_rdb_pc/tlb.c
board/freescale/p2041rdb/README
board/freescale/t102xrdb/README
board/freescale/t104xrdb/README
board/freescale/t208xqds/README
board/freescale/t208xrdb/README
board/gateworks/venice/eeprom.c
board/gateworks/venice/eeprom.h
board/gateworks/venice/venice.c
board/kontron/sl28/common.c
board/kontron/sl28/sl28.c
board/kontron/sl28/sl28.h [new file with mode: 0644]
board/kontron/sl28/spl.c
board/purism/librem5/Kconfig [new file with mode: 0644]
board/purism/librem5/MAINTAINERS [new file with mode: 0644]
board/purism/librem5/Makefile [new file with mode: 0644]
board/purism/librem5/imximage-8mq-lpddr4.cfg [new file with mode: 0644]
board/purism/librem5/librem5.c [new file with mode: 0644]
board/purism/librem5/librem5.h [new file with mode: 0644]
board/purism/librem5/lpddr4_timing.c [new file with mode: 0644]
board/purism/librem5/lpddr4_timing_b0.c [new file with mode: 0644]
board/purism/librem5/spl.c [new file with mode: 0644]
board/renesas/rcar-common/common.c
board/st/stm32mp1/stm32mp1.c
board/ti/common/board_detect.c
board/toradex/verdin-imx8mm/spl.c
board/toradex/verdin-imx8mm/verdin-imx8mm.c
board/toradex/verdin-imx8mp/verdin-imx8mp.c
boot/bootm.c
boot/bootmeth_distro.c
boot/bootmeth_pxe.c
boot/image-fit.c
boot/vbe.c
boot/vbe_simple.c
cmd/Kconfig
cmd/dm.c
cmd/fpga.c
cmd/i2c.c
cmd/mvebu/Kconfig
cmd/mvebu/bubt.c
cmd/net.c
cmd/pci.c
cmd/riscv/sbi.c
cmd/tpm-common.c
cmd/tpm-user-utils.h
cmd/tpm-v1.c
cmd/tpm-v2.c
cmd/tpm_test.c
cmd/ximg.c
common/Kconfig
common/console.c
common/fdt_support.c
configs/dockstar_defconfig
configs/dreamplug_defconfig
configs/eDPU_defconfig
configs/goflexhome_defconfig
configs/iconnect_defconfig
configs/imx6ulz_smm_m2_defconfig [new file with mode: 0644]
configs/imx8mm_venice_defconfig
configs/imx8mn_venice_defconfig
configs/imx8mp_dhcom_pdk2_defconfig
configs/imx8mp_venice_defconfig
configs/imxrt1170-evk_defconfig [new file with mode: 0644]
configs/kontron_sl28_defconfig
configs/librem5_defconfig [new file with mode: 0644]
configs/mvebu_db-88f3720_defconfig
configs/mvebu_espressobin-88f3720_defconfig
configs/pogo_e02_defconfig
configs/qemu-ppce500_defconfig
configs/qemu-riscv32_smode_defconfig
configs/qemu-riscv32_spl_defconfig
configs/qemu-riscv64_smode_defconfig
configs/qemu-riscv64_spl_defconfig
configs/sheevaplug_defconfig
configs/stm32f769-disco_defconfig
configs/stm32f769-disco_spl_defconfig
configs/stm32mp15_defconfig
configs/stm32mp15_dhcom_basic_defconfig
configs/stm32mp15_dhcor_basic_defconfig
configs/turris_mox_defconfig
configs/turris_omnia_defconfig
configs/uDPU_defconfig
configs/verdin-imx8mm_defconfig
configs/verdin-imx8mp_defconfig
disk/part.c
doc/Makefile
doc/board/index.rst
doc/board/purism/index.rst [new file with mode: 0644]
doc/board/purism/librem5.rst [new file with mode: 0644]
doc/develop/bootstd.rst
doc/develop/index.rst
doc/develop/process.rst
doc/develop/release_cycle.rst
doc/develop/sending_patches.rst
doc/device-tree-bindings/firmware/fwu-mdata-mtd.yaml [new file with mode: 0644]
doc/imx/habv4/csf_examples/mx8m/csf.sh [new file with mode: 0644]
doc/imx/habv4/csf_examples/mx8m/csf_fit.txt [new file with mode: 0644]
doc/imx/habv4/csf_examples/mx8m/csf_spl.txt [new file with mode: 0644]
doc/imx/habv4/guides/mx8m_spl_secure_boot.txt [new file with mode: 0644]
doc/usage/cmd/gpio.rst
doc/usage/cmd/tftpput.rst [new file with mode: 0644]
doc/usage/index.rst
drivers/clk/imx/Kconfig
drivers/clk/imx/Makefile
drivers/clk/imx/clk-imxrt1170.c [new file with mode: 0644]
drivers/clk/imx/clk-pllv3.c
drivers/clk/imx/clk.h
drivers/clk/rockchip/clk_rk3399.c
drivers/clk/sifive/fu740-prci.c
drivers/clk/sifive/sifive-prci.c
drivers/clk/stm32/clk-stm32mp1.c
drivers/crypto/fsl/fsl_hash.c
drivers/ddr/fsl/ctrl_regs.c
drivers/ddr/fsl/ddr4_dimm_params.c
drivers/ddr/fsl/interactive.c
drivers/ddr/imx/imx8m/ddrphy_utils.c [deleted file]
drivers/i2c/stm32f7_i2c.c
drivers/mmc/fsl_esdhc_spl.c
drivers/mtd/renesas_rpc_hf.c
drivers/net/fm/fm.c
drivers/net/fsl-mc/mc.c
drivers/net/fsl_enetc.c
drivers/net/pfe_eth/pfe_firmware.c
drivers/nvme/nvme.c
drivers/pci/pci-uclass.c
drivers/phy/phy-stm32-usbphyc.c
drivers/ram/imxrt_sdram.c
drivers/ram/rockchip/sdram_rk3399.c
drivers/serial/serial_mxc.c
drivers/spi/renesas_rpc_spi.c
drivers/sysreset/Kconfig
drivers/timer/orion-timer.c
drivers/tpm/cr50_i2c.c
drivers/tpm/tpm-uclass.c
drivers/tpm/tpm2_tis_sandbox.c
drivers/usb/gadget/f_fastboot.c
include/asm-generic/global_data.h
include/config_distro_bootcmd.h
include/configs/corenet_ds.h [deleted file]
include/configs/dh_imx6.h
include/configs/imx6ulz_smm_m2.h [new file with mode: 0644]
include/configs/imxrt1170-evk.h [new file with mode: 0644]
include/configs/kontron_sl28.h
include/configs/librem5.h [new file with mode: 0644]
include/configs/p1_p2_bootsrc.h
include/configs/p1_p2_rdb_pc.h
include/configs/stih410-b2260.h
include/configs/turris_mox.h
include/configs/verdin-imx8mm.h
include/configs/verdin-imx8mp.h
include/dt-bindings/clock/imxrt1170-clock.h [new file with mode: 0644]
include/dt-bindings/clock/sifive-fu740-prci.h
include/dt-bindings/memory/imxrt-sdram.h
include/efi_api.h
include/efi_loader.h
include/efi_selftest.h
include/fdt_support.h
include/fs.h
include/image.h
include/tpm-common.h
include/tpm-v2.h
include/tpm_api.h
lib/efi_driver/efi_uclass.c
lib/efi_loader/Kconfig
lib/efi_loader/Makefile
lib/efi_loader/efi_boottime.c
lib/efi_loader/efi_conformance.c [new file with mode: 0644]
lib/efi_loader/efi_console.c
lib/efi_loader/efi_device_path_to_text.c
lib/efi_loader/efi_disk.c
lib/efi_loader/efi_setup.c
lib/efi_loader/helloworld.c
lib/efi_selftest/Makefile
lib/efi_selftest/efi_selftest.c
lib/efi_selftest/efi_selftest_ecpt.c [new file with mode: 0644]
lib/efi_selftest/efi_selftest_fdt.c
lib/efi_selftest/efi_selftest_miniapp_exception.c
lib/efi_selftest/efi_selftest_util.c
lib/tpm-v1.c
lib/tpm-v2.c
lib/tpm_api.c
lib/uuid.c
scripts/Makefile.host
scripts/config_whitelist.txt
test/dm/Makefile
test/dm/tpm.c [new file with mode: 0644]
tools/binman/binman.rst
tools/binman/bintool.py
tools/binman/btool/btool_gzip.py
tools/binman/btool/bzip2.py
tools/binman/btool/fiptool.py
tools/binman/btool/futility.py
tools/binman/btool/lz4.py
tools/binman/btool/mkimage.py
tools/binman/entries.rst
tools/binman/etype/mkimage.py
tools/binman/etype/u_boot_vpl.py [new file with mode: 0644]
tools/binman/etype/u_boot_vpl_bss_pad.py [new file with mode: 0644]
tools/binman/etype/u_boot_vpl_dtb.py [new file with mode: 0644]
tools/binman/etype/u_boot_vpl_expanded.py [new file with mode: 0644]
tools/binman/etype/u_boot_vpl_nodtb.py [new file with mode: 0644]
tools/binman/ftest.py
tools/binman/state.py
tools/binman/test/082_fdt_update_all.dts
tools/binman/test/230_dev.key [moved from tools/binman/test/225_dev.key with 100% similarity]
tools/binman/test/230_pre_load.dts [moved from tools/binman/test/225_pre_load.dts with 86% similarity]
tools/binman/test/231_pre_load_pkcs.dts [moved from tools/binman/test/226_pre_load_pkcs.dts with 87% similarity]
tools/binman/test/232_pre_load_pss.dts [moved from tools/binman/test/227_pre_load_pss.dts with 87% similarity]
tools/binman/test/233_pre_load_invalid_padding.dts [moved from tools/binman/test/228_pre_load_invalid_padding.dts with 86% similarity]
tools/binman/test/234_pre_load_invalid_sha.dts [moved from tools/binman/test/229_pre_load_invalid_sha.dts with 86% similarity]
tools/binman/test/235_pre_load_invalid_algo.dts [moved from tools/binman/test/230_pre_load_invalid_algo.dts with 86% similarity]
tools/binman/test/236_pre_load_invalid_key.dts [moved from tools/binman/test/231_pre_load_invalid_key.dts with 86% similarity]
tools/binman/test/237_unique_names.dts [moved from tools/binman/test/230_unique_names.dts with 100% similarity]
tools/binman/test/238_unique_names_multi.dts [moved from tools/binman/test/231_unique_names_multi.dts with 100% similarity]
tools/binman/test/239_replace_with_bintool.dts [moved from tools/binman/test/232_replace_with_bintool.dts with 100% similarity]
tools/binman/test/240_fit_extract_replace.dts [moved from tools/binman/test/233_fit_extract_replace.dts with 100% similarity]
tools/binman/test/241_replace_section_simple.dts [moved from tools/binman/test/234_replace_section_simple.dts with 100% similarity]
tools/binman/test/242_mkimage_name.dts [moved from tools/binman/test/235_mkimage_name.dts with 100% similarity]
tools/binman/test/243_mkimage_image.dts [moved from tools/binman/test/236_mkimage_image.dts with 100% similarity]
tools/binman/test/244_mkimage_image_no_content.dts [moved from tools/binman/test/237_mkimage_image_no_content.dts with 100% similarity]
tools/binman/test/245_mkimage_image_bad.dts [moved from tools/binman/test/238_mkimage_image_bad.dts with 100% similarity]
tools/binman/test/246_collection_other.dts [moved from tools/binman/test/239_collection_other.dts with 100% similarity]
tools/binman/test/247_mkimage_coll.dts [moved from tools/binman/test/240_mkimage_coll.dts with 100% similarity]
tools/binman/test/248_compress_dtb_prepend_invalid.dts [moved from tools/binman/test/235_compress_dtb_prepend_invalid.dts with 100% similarity]
tools/binman/test/249_compress_dtb_prepend_length.dts [moved from tools/binman/test/236_compress_dtb_prepend_length.dts with 100% similarity]
tools/binman/test/250_compress_dtb_invalid.dts [moved from tools/binman/test/237_compress_dtb_invalid.dts with 100% similarity]
tools/binman/test/251_compress_dtb_zstd.dts [moved from tools/binman/test/238_compress_dtb_zstd.dts with 100% similarity]
tools/binman/test/252_mkimage_mult_data.dts [new file with mode: 0644]
tools/binman/test/253_mkimage_mult_no_content.dts [new file with mode: 0644]
tools/binman/test/254_mkimage_filename.dts [new file with mode: 0644]
tools/binman/test/255_u_boot_vpl.dts [new file with mode: 0644]
tools/binman/test/256_u_boot_vpl_nodtb.dts [new file with mode: 0644]
tools/binman/test/257_fdt_incl_vpl.dts [new file with mode: 0644]
tools/binman/test/258_vpl_bss_pad.dts [new file with mode: 0644]
tools/kwboot.c
tools/patman/patman.rst
tools/sunxi_toc0.c
tools/termios_linux.h

index ae91252..7728104 100644 (file)
@@ -1,6 +1,6 @@
 Please do not submit a Pull Request via github.  Our project makes use of
 mailing lists for patch submission and review.  For more details please
-see https://www.denx.de/wiki/U-Boot/Patches
+see https://u-boot.readthedocs.io/en/latest/develop/sending_patches.html
 
 The only exception to this is in order to trigger a CI loop on Azure prior
 to posting of patches.
index 8e94bf8..29af8c6 100644 (file)
@@ -1,7 +1,7 @@
 # SPDX-License-Identifier: GPL-2.0+
 
-# Grab our configured image.  The source for this is found at:
-# https://source.denx.de/u-boot/gitlab-ci-runner
+# Grab our configured image.  The source for this is found
+# in the u-boot tree at tools/docker/Dockerfile
 image: trini/u-boot-gitlab-ci-runner:jammy-20220801-09Aug2022
 
 # We run some tests in different order, to catch some failures quicker.
diff --git a/Kconfig b/Kconfig
index 991b260..c8c2255 100644 (file)
--- a/Kconfig
+++ b/Kconfig
@@ -299,7 +299,7 @@ config SYS_MALLOC_F_LEN
        default 0x4000 if SANDBOX || RISCV || ARCH_APPLE || ROCKCHIP_RK3368 || \
                          ROCKCHIP_RK3399
        default 0x8000 if RCAR_GEN3
-       default 0x10000 if ARCH_IMX8 || (ARCH_IMX8M && !IMX8MQ)
+       default 0x10000 if ARCH_IMX8 || ARCH_IMX8M
        default 0x2000
        help
          Before relocation, memory is very limited on many platforms. Still,
@@ -325,6 +325,7 @@ config SPL_SYS_MALLOC_F_LEN
        depends on SYS_MALLOC_F && SPL
        default 0 if !SPL_FRAMEWORK
        default 0x2800 if RCAR_GEN3
+       default 0x2000 if IMX8MQ
        default SYS_MALLOC_F_LEN
        help
          In SPL memory is very limited on many platforms. Still,
index 1a7a563..e4fd099 100644 (file)
@@ -264,6 +264,7 @@ F:  arch/arm/include/asm/arch-mx*/
 F:     arch/arm/include/asm/arch-vf610/
 F:     arch/arm/include/asm/mach-imx/
 F:     board/freescale/*mx*/
+F:     drivers/serial/serial_mxc.c
 
 ARM HISILICON
 M:     Peter Griffin <peter.griffin@linaro.org>
index 0b8079c..b421296 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -3,7 +3,7 @@
 VERSION = 2022
 PATCHLEVEL = 10
 SUBLEVEL =
-EXTRAVERSION = -rc3
+EXTRAVERSION = -rc5
 NAME =
 
 # *DOCUMENTATION*
@@ -1004,22 +1004,12 @@ ifeq ($(CONFIG_INIT_SP_RELATIVE)$(CONFIG_OF_SEPARATE),yy)
 INPUTS-y += init_sp_bss_offset_check
 endif
 
-ifeq ($(CONFIG_MPC85xx)$(CONFIG_OF_SEPARATE),yy)
-INPUTS-y += u-boot-with-dtb.bin
-endif
-
-ifeq ($(CONFIG_ARCH_ROCKCHIP),y)
-# On ARM64 this target is produced by binman so we don't need this dep
+ifeq ($(CONFIG_ARCH_ROCKCHIP)$(CONFIG_SPL),yy)
+# Binman image dependencies
 ifeq ($(CONFIG_ARM64),y)
-ifeq ($(CONFIG_SPL),y)
-# TODO: Get binman to generate this too
-INPUTS-y += u-boot-rockchip.bin
-endif
+INPUTS-y += u-boot.itb
 else
-ifeq ($(CONFIG_SPL),y)
-# Generate these inputs for binman which will create the output files
-INPUTS-y += idbloader.img u-boot.img
-endif
+INPUTS-y += u-boot.img
 endif
 endif
 
@@ -1230,9 +1220,12 @@ else ifeq ($(CONFIG_OF_SEPARATE).$(CONFIG_OF_OMIT_DTB),y.)
 u-boot-dtb.bin: u-boot-nodtb.bin dts/dt.dtb FORCE
        $(call if_changed,cat)
 
+ifneq ($(CONFIG_MPC85XX_HAVE_RESET_VECTOR)$(CONFIG_OF_SEPARATE),yy)
 u-boot.bin: u-boot-dtb.bin FORCE
        $(call if_changed,copy)
-else
+endif
+
+else ifneq ($(CONFIG_MPC85XX_HAVE_RESET_VECTOR)$(CONFIG_OF_SEPARATE),yy)
 u-boot.bin: u-boot-nodtb.bin FORCE
        $(call if_changed,copy)
 endif
@@ -1280,7 +1273,7 @@ spl/u-boot-spl.srec: spl/u-boot-spl FORCE
 
 OBJCOPYFLAGS_u-boot-nodtb.bin := -O binary \
                $(if $(CONFIG_X86_16BIT_INIT),-R .start16 -R .resetvec) \
-               $(if $(CONFIG_MPC85XX_HAVE_RESET_VECTOR),$(if $(CONFIG_OF_EMBED),,-R .bootpg -R .resetvec))
+               $(if $(CONFIG_MPC85XX_HAVE_RESET_VECTOR),$(if $(CONFIG_OF_SEPARATE),-R .bootpg -R .resetvec))
 
 binary_size_check: u-boot-nodtb.bin FORCE
        @file_size=$(shell wc -c u-boot-nodtb.bin | awk '{print $$1}') ; \
@@ -1445,11 +1438,7 @@ MKIMAGEFLAGS_u-boot-spl.kwb = -n $(KWD_CONFIG_FILE) \
 MKIMAGEFLAGS_u-boot.pbl = -n $(srctree)/$(CONFIG_SYS_FSL_PBL_RCW:"%"=%) \
                -R $(srctree)/$(CONFIG_SYS_FSL_PBL_PBI:"%"=%) -A $(ARCH) -T pblimage
 
-ifeq ($(CONFIG_MPC85xx)$(CONFIG_OF_SEPARATE),yy)
-UBOOT_BIN := u-boot-with-dtb.bin
-else
 UBOOT_BIN := u-boot.bin
-endif
 
 MKIMAGEFLAGS_u-boot-lzma.img = -A $(ARCH) -T standalone -C lzma -O u-boot \
        -a $(CONFIG_SYS_TEXT_BASE) -e $(CONFIG_SYS_UBOOT_START) \
@@ -1505,29 +1494,6 @@ OBJCOPYFLAGS_u-boot-with-spl.bin = -I binary -O binary \
 u-boot-with-spl.bin: $(SPL_IMAGE) $(SPL_PAYLOAD) FORCE
        $(call if_changed,pad_cat)
 
-ifeq ($(CONFIG_ARCH_ROCKCHIP),y)
-
-# TPL + SPL
-ifeq ($(CONFIG_SPL)$(CONFIG_TPL),yy)
-MKIMAGEFLAGS_u-boot-tpl-rockchip.bin = -n $(CONFIG_SYS_SOC) -T rksd
-tpl/u-boot-tpl-rockchip.bin: tpl/u-boot-tpl.bin FORCE
-       $(call if_changed,mkimage)
-idbloader.img: tpl/u-boot-tpl-rockchip.bin spl/u-boot-spl.bin FORCE
-       $(call if_changed,cat)
-else
-MKIMAGEFLAGS_idbloader.img = -n $(CONFIG_SYS_SOC) -T rksd
-idbloader.img: spl/u-boot-spl.bin FORCE
-       $(call if_changed,mkimage)
-endif
-
-ifeq ($(CONFIG_ARM64),y)
-OBJCOPYFLAGS_u-boot-rockchip.bin = -I binary -O binary \
-       --pad-to=$(CONFIG_SPL_PAD_TO) --gap-fill=0xff
-u-boot-rockchip.bin: idbloader.img u-boot.itb FORCE
-       $(call if_changed,pad_cat)
-endif # CONFIG_ARM64
-
-endif # CONFIG_ARCH_ROCKCHIP
 
 ifeq ($(CONFIG_ARCH_LPC32XX)$(CONFIG_SPL),yy)
 MKIMAGEFLAGS_lpc32xx-spl.img = -T lpc32xximage -a $(CONFIG_SPL_TEXT_BASE)
@@ -1639,17 +1605,14 @@ u-boot-with-nand-spl.sfp: u-boot-spl-padx4.sfp u-boot.img FORCE
 
 endif
 
-ifeq ($(CONFIG_MPC85xx)$(CONFIG_OF_SEPARATE),yy)
-u-boot-with-dtb.bin: u-boot.bin u-boot.dtb \
-       $(if $(CONFIG_MPC85XX_HAVE_RESET_VECTOR), u-boot-br.bin) FORCE
+ifeq ($(CONFIG_MPC85XX_HAVE_RESET_VECTOR)$(CONFIG_OF_SEPARATE),yy)
+u-boot.bin: u-boot-nodtb.bin u-boot.dtb u-boot-br.bin FORCE
        $(call if_changed,binman)
 
-ifeq ($(CONFIG_MPC85XX_HAVE_RESET_VECTOR),y)
 OBJCOPYFLAGS_u-boot-br.bin := -O binary -j .bootpg -j .resetvec
 u-boot-br.bin: u-boot FORCE
        $(call if_changed,objcopy)
 endif
-endif
 
 quiet_cmd_ldr = LD      $@
 cmd_ldr = $(LD) $(LDFLAGS_$(@F)) \
@@ -1706,12 +1669,8 @@ spl/u-boot-spl.pbl: spl/u-boot-spl.bin FORCE
 ifeq ($(ARCH),arm)
 UBOOT_BINLOAD := u-boot.img
 else
-ifeq ($(CONFIG_MPC85xx)$(CONFIG_OF_SEPARATE),yy)
-UBOOT_BINLOAD := u-boot-with-dtb.bin
-else
 UBOOT_BINLOAD := u-boot.bin
 endif
-endif
 
 OBJCOPYFLAGS_u-boot-with-spl-pbl.bin = -I binary -O binary --pad-to=$(CONFIG_SPL_PAD_TO) \
                          --gap-fill=0xff
@@ -2232,7 +2191,9 @@ CLEAN_FILES += include/bmp_logo.h include/bmp_logo_data.h \
               lpc32xx-* bl31.c bl31.elf bl31_*.bin image.map tispl.bin* \
               idbloader.img flash.bin flash.log defconfig keep-syms-lto.c \
               mkimage-out.spl.mkimage mkimage.spl.mkimage imx-boot.map \
-              itb.fit.fit itb.fit.itb itb.map spl.map
+              itb.fit.fit itb.fit.itb itb.map spl.map mkimage-out.rom.mkimage \
+              mkimage.rom.mkimage rom.map simple-bin.map simple-bin-spi.map \
+              idbloader-spi.img
 
 # Directories & files removed with 'make mrproper'
 MRPROPER_DIRS  += include/config include/generated spl tpl \
index 03169eb..f3a3c0f 100644 (file)
@@ -1986,7 +1986,7 @@ config ARCH_STM32MP
 config ARCH_ROCKCHIP
        bool "Support Rockchip SoCs"
        select BLK
-       select BINMAN if SPL_OPTEE || (SPL && !ARM64)
+       select BINMAN if SPL_OPTEE || SPL
        select DM
        select DM_GPIO
        select DM_I2C
index 5f09ef0..3a4b665 100644 (file)
@@ -67,11 +67,24 @@ void spl_board_init(void)
 #endif
 }
 
+void tzpc_init(void)
+{
+       /*
+        * Mark the whole OCRAM as non-secure, otherwise DMA devices cannot
+        * access it. This is for example necessary for MMC boot.
+        */
+#ifdef TZPCR0SIZE_BASE
+       out_le32(TZPCR0SIZE_BASE, 0);
+#endif
+}
+
 void board_init_f(ulong dummy)
 {
        int ret;
 
        icache_enable();
+       tzpc_init();
+
        /* Clear global data */
        memset((void *)gd, 0, sizeof(gd_t));
        if (IS_ENABLED(CONFIG_DEBUG_UART))
index 7e6e406..540436b 100644 (file)
@@ -36,9 +36,6 @@ phys_addr_t sec_firmware_addr;
 #ifndef SEC_FIRMWARE_FIT_IMAGE
 #define SEC_FIRMWARE_FIT_IMAGE         "firmware"
 #endif
-#ifndef SEC_FIRMWARE_FIT_CNF_NAME
-#define SEC_FIRMWARE_FIT_CNF_NAME      "config-1"
-#endif
 #ifndef SEC_FIRMWARE_TARGET_EL
 #define SEC_FIRMWARE_TARGET_EL         2
 #endif
@@ -46,46 +43,8 @@ phys_addr_t sec_firmware_addr;
 static int sec_firmware_get_data(const void *sec_firmware_img,
                                const void **data, size_t *size)
 {
-       int conf_node_off, fw_node_off;
-       char *conf_node_name = NULL;
-       char *desc;
-       int ret;
-
-       conf_node_name = SEC_FIRMWARE_FIT_CNF_NAME;
-
-       conf_node_off = fit_conf_get_node(sec_firmware_img, conf_node_name);
-       if (conf_node_off < 0) {
-               printf("SEC Firmware: %s: no such config\n", conf_node_name);
-               return -ENOENT;
-       }
-
-       fw_node_off = fit_conf_get_prop_node(sec_firmware_img, conf_node_off,
-                       SEC_FIRMWARE_FIT_IMAGE);
-       if (fw_node_off < 0) {
-               printf("SEC Firmware: No '%s' in config\n",
-                      SEC_FIRMWARE_FIT_IMAGE);
-               return -ENOLINK;
-       }
-
-       /* Verify secure firmware image */
-       if (!(fit_image_verify(sec_firmware_img, fw_node_off))) {
-               printf("SEC Firmware: Bad firmware image (bad CRC)\n");
-               return -EINVAL;
-       }
-
-       if (fit_image_get_data(sec_firmware_img, fw_node_off, data, size)) {
-               printf("SEC Firmware: Can't get %s subimage data/size",
-                      SEC_FIRMWARE_FIT_IMAGE);
-               return -ENOENT;
-       }
-
-       ret = fit_get_desc(sec_firmware_img, fw_node_off, &desc);
-       if (ret)
-               printf("SEC Firmware: Can't get description\n");
-       else
-               printf("%s\n", desc);
-
-       return ret;
+       return fit_get_data_conf_prop(sec_firmware_img, SEC_FIRMWARE_FIT_IMAGE,
+                                     data, size);
 }
 
 /*
@@ -124,18 +83,15 @@ static int sec_firmware_check_copy_loadable(const void *sec_firmware_img,
 {
        phys_addr_t sec_firmware_loadable_addr = 0;
        int conf_node_off, ld_node_off, images;
-       char *conf_node_name = NULL;
        const void *data;
        size_t size;
        ulong load;
        const char *name, *str, *type;
        int len;
 
-       conf_node_name = SEC_FIRMWARE_FIT_CNF_NAME;
-
-       conf_node_off = fit_conf_get_node(sec_firmware_img, conf_node_name);
+       conf_node_off = fit_conf_get_node(sec_firmware_img, NULL);
        if (conf_node_off < 0) {
-               printf("SEC Firmware: %s: no such config\n", conf_node_name);
+               puts("SEC Firmware: no config\n");
                return -ENOENT;
        }
 
index 5bff2e6..7c40714 100644 (file)
@@ -893,6 +893,7 @@ dtb-$(CONFIG_MX6ULL) += \
        imx6ull-phytec-segin-ff-rdk-emmc.dtb \
        imx6ull-dart-6ul.dtb \
        imx6ull-somlabs-visionsom.dtb \
+       imx6ulz-bsh-smm-m2.dtb \
        imx6ulz-14x14-evk.dtb
 
 dtb-$(CONFIG_ARCH_MX6) += \
@@ -972,13 +973,15 @@ dtb-$(CONFIG_ARCH_IMX8M) += \
        imx8mp-venice-gw74xx.dtb \
        imx8mp-verdin-wifi-dev.dtb \
        imx8mq-pico-pi.dtb \
-       imx8mq-kontron-pitx-imx8m.dtb
+       imx8mq-kontron-pitx-imx8m.dtb \
+       imx8mq-librem5-r4.dtb
 
 dtb-$(CONFIG_ARCH_IMX9) += \
        imx93-11x11-evk.dtb
 
 dtb-$(CONFIG_ARCH_IMXRT) += imxrt1050-evk.dtb \
-       imxrt1020-evk.dtb
+       imxrt1020-evk.dtb \
+       imxrt1170-evk.dtb \
 
 dtb-$(CONFIG_RCAR_GEN2) += \
        r8a7790-lager-u-boot.dtb \
diff --git a/arch/arm/dts/imx6ulz-bsh-smm-m2-u-boot.dtsi b/arch/arm/dts/imx6ulz-bsh-smm-m2-u-boot.dtsi
new file mode 100644 (file)
index 0000000..75dbf6e
--- /dev/null
@@ -0,0 +1,35 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (C) 2022 BSH Hausgeraete GmbH
+ *
+ * Author: Michael Trimarchi <michael@amarulasolutions.com>
+ */
+
+&{/soc} {
+       u-boot,dm-pre-reloc;
+};
+
+&aips2 {
+       u-boot,dm-pre-reloc;
+};
+
+&iomuxc {
+       u-boot,dm-pre-reloc;
+};
+
+&iomuxc_snvs {
+       u-boot,dm-pre-reloc;
+};
+
+&uart4 {
+       u-boot,dm-pre-reloc;
+};
+
+&pinctrl_uart4 {
+       u-boot,dm-pre-reloc;
+};
+
+&gpmi {
+       u-boot,dm-spl;
+       u-boot,dm-pre-reloc;
+};
diff --git a/arch/arm/dts/imx6ulz-bsh-smm-m2.dts b/arch/arm/dts/imx6ulz-bsh-smm-m2.dts
new file mode 100644 (file)
index 0000000..59bcfc9
--- /dev/null
@@ -0,0 +1,146 @@
+// SPDX-License-Identifier: (GPL-2.0 OR MIT)
+/*
+ * Copyright (C) 2021 BSH Hausgeraete GmbH
+ */
+
+/dts-v1/;
+
+#include <dt-bindings/input/input.h>
+#include "imx6ulz.dtsi"
+
+/ {
+       model = "BSH SMM M2";
+       compatible = "bsh,imx6ulz-bsh-smm-m2", "fsl,imx6ull", "fsl,imx6ulz";
+
+       chosen {
+               stdout-path = &uart4;
+       };
+
+       usdhc2_pwrseq: usdhc2-pwrseq {
+               compatible = "mmc-pwrseq-simple";
+               reset-gpios = <&gpio2 21 GPIO_ACTIVE_LOW>;
+       };
+};
+
+&gpmi {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_gpmi_nand>;
+       nand-on-flash-bbt;
+       status = "okay";
+};
+
+&uart3 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_uart3>;
+       uart-has-rtscts;
+       status = "okay";
+
+       bluetooth {
+               compatible = "brcm,bcm4330-bt";
+               max-speed = <3000000>;
+               shutdown-gpios = <&gpio1 1 GPIO_ACTIVE_HIGH>;
+               device-wakeup-gpios = <&gpio2 17 GPIO_ACTIVE_HIGH>;
+               host-wakeup-gpios = <&gpio2 13 GPIO_ACTIVE_HIGH>;
+       };
+};
+
+&uart4 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_uart4>;
+       status = "okay";
+};
+
+&usbotg1 {
+       dr_mode = "peripheral";
+       srp-disable;
+       hnp-disable;
+       adp-disable;
+       status = "okay";
+};
+
+&usbphy1 {
+       fsl,tx-d-cal = <106>;
+};
+
+&usdhc2 {
+       #address-cells = <1>;
+       #size-cells = <0>;
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_wlan>;
+       bus-width = <4>;
+       no-1-8-v;
+       non-removable;
+       cap-power-off-card;
+       keep-power-in-suspend;
+       cap-sdio-irq;
+       mmc-pwrseq = <&usdhc2_pwrseq>;
+       status = "okay";
+
+       brcmf: wifi@1 {
+               reg = <1>;
+               compatible = "brcm,bcm4329-fmac";
+               interrupt-parent = <&gpio1>;
+               interrupts = <18 IRQ_TYPE_LEVEL_HIGH>;
+               interrupt-names = "host-wake";
+       };
+};
+
+&wdog1 {
+       status = "okay";
+};
+
+&iomuxc {
+       pinctrl_gpmi_nand: gpmi-nand {
+               fsl,pins = <
+                       MX6UL_PAD_NAND_CLE__RAWNAND_CLE         0xb0b1
+                       MX6UL_PAD_NAND_ALE__RAWNAND_ALE         0xb0b1
+                       MX6UL_PAD_NAND_WP_B__RAWNAND_WP_B       0xb0b1
+                       MX6UL_PAD_NAND_READY_B__RAWNAND_READY_B 0xb000
+                       MX6UL_PAD_NAND_CE0_B__RAWNAND_CE0_B     0xb0b1
+                       MX6UL_PAD_NAND_RE_B__RAWNAND_RE_B       0xb0b1
+                       MX6UL_PAD_NAND_WE_B__RAWNAND_WE_B       0xb0b1
+                       MX6UL_PAD_NAND_DATA00__RAWNAND_DATA00   0xb0b1
+                       MX6UL_PAD_NAND_DATA01__RAWNAND_DATA01   0xb0b1
+                       MX6UL_PAD_NAND_DATA02__RAWNAND_DATA02   0xb0b1
+                       MX6UL_PAD_NAND_DATA03__RAWNAND_DATA03   0xb0b1
+                       MX6UL_PAD_NAND_DATA04__RAWNAND_DATA04   0xb0b1
+                       MX6UL_PAD_NAND_DATA05__RAWNAND_DATA05   0xb0b1
+                       MX6UL_PAD_NAND_DATA06__RAWNAND_DATA06   0xb0b1
+                       MX6UL_PAD_NAND_DATA07__RAWNAND_DATA07   0xb0b1
+               >;
+       };
+
+       pinctrl_uart3: uart3grp {
+               fsl,pins = <
+                       MX6UL_PAD_UART3_TX_DATA__UART3_DCE_TX   0x1b0b1
+                       MX6UL_PAD_UART3_RX_DATA__UART3_DCE_RX   0x1b099
+                       MX6UL_PAD_UART3_RTS_B__UART3_DCE_RTS    0x1b0b1
+                       MX6UL_PAD_UART3_CTS_B__UART3_DCE_CTS    0x1b099
+                       MX6UL_PAD_GPIO1_IO01__GPIO1_IO01        0x79            /* BT_REG_ON */
+                       MX6UL_PAD_SD1_CLK__GPIO2_IO17           0x100b1         /* BT_DEV_WAKE out */
+                       MX6UL_PAD_ENET2_TX_EN__GPIO2_IO13       0x1b0b0         /* BT_HOST_WAKE in */
+               >;
+       };
+
+       pinctrl_uart4: uart4grp {
+               fsl,pins = <
+                       MX6UL_PAD_UART4_TX_DATA__UART4_DCE_TX   0x1b0b1
+                       MX6UL_PAD_UART4_RX_DATA__UART4_DCE_RX   0x1b0b1
+               >;
+       };
+
+       pinctrl_wlan: wlangrp {
+               fsl,pins = <
+                       MX6UL_PAD_CSI_HSYNC__USDHC2_CMD         0x17059
+                       MX6UL_PAD_CSI_VSYNC__USDHC2_CLK         0x10059
+                       MX6UL_PAD_CSI_DATA00__USDHC2_DATA0      0x17059
+                       MX6UL_PAD_CSI_DATA01__USDHC2_DATA1      0x17059
+                       MX6UL_PAD_CSI_DATA02__USDHC2_DATA2      0x17059
+                       MX6UL_PAD_CSI_DATA03__USDHC2_DATA3      0x17059
+                       MX6UL_PAD_SD1_DATA3__GPIO2_IO21         0x79            /* WL_REG_ON */
+                       MX6UL_PAD_UART2_CTS_B__GPIO1_IO22       0x100b1         /* WL_DEV_WAKE - WiFi_GPIO_4 - WiFi FW UART */
+                       MX6UL_PAD_UART1_CTS_B__GPIO1_IO18       0x1b0b1         /* WL_HOST_WAKE - WIFI_GPIO_0 - OOB IRQ */
+                       MX6UL_PAD_ENET1_RX_EN__OSC32K_32K_OUT   0x4001b031      /* OSC 32Khz wifi clk in */
+               >;
+       };
+};
index 5f83952..0efa686 100644 (file)
        u-boot,off-on-delay-us = <20000>;
 };
 
+&spba1 {
+       u-boot,dm-spl;
+};
+
 &uart2 {
        u-boot,dm-spl;
 };
index ae838ca..be2d4fb 100644 (file)
@@ -3,139 +3,4 @@
  * Copyright (C) 2022 Marek Vasut <marex@denx.de>
  */
 
-#include "imx8mp-u-boot.dtsi"
-
-/ {
-       aliases {
-               eeprom0 = &eeprom0;
-               eeprom1 = &eeprom1;
-               mmc0 = &usdhc2; /* MicroSD */
-               mmc1 = &usdhc3; /* eMMC */
-               mmc2 = &usdhc1; /* SDIO */
-       };
-
-       config {
-               dh,ram-coding-gpios = <&gpio3 22 0>, <&gpio3 23 0>, <&gpio3 24 0>;
-       };
-
-       wdt-reboot {
-               compatible = "wdt-reboot";
-               wdt = <&wdog1>;
-               u-boot,dm-spl;
-       };
-};
-
-&buck4 {
-       u-boot,dm-spl;
-};
-
-&buck5 {
-       u-boot,dm-spl;
-};
-
-&eqos {
-       /delete-property/ assigned-clocks;
-       /delete-property/ assigned-clock-parents;
-       /delete-property/ assigned-clock-rates;
-};
-
-&gpio1 {
-       u-boot,dm-spl;
-};
-
-&gpio2 {
-       u-boot,dm-spl;
-};
-
-&gpio3 {
-       u-boot,dm-spl;
-};
-
-&gpio4 {
-       u-boot,dm-spl;
-};
-
-&gpio5 {
-       u-boot,dm-spl;
-};
-
-&i2c3 {
-       u-boot,dm-spl;
-};
-
-&pinctrl_i2c3 {
-       u-boot,dm-spl;
-};
-
-&pinctrl_i2c3_gpio {
-       u-boot,dm-spl;
-};
-
-&pinctrl_pmic {
-       u-boot,dm-spl;
-};
-
-&pinctrl_uart1 {
-       u-boot,dm-spl;
-};
-
-&pinctrl_usdhc2 {
-       u-boot,dm-spl;
-};
-
-&pinctrl_usdhc2_100mhz {
-       u-boot,dm-spl;
-};
-
-&pinctrl_usdhc2_200mhz {
-       u-boot,dm-spl;
-};
-
-&pinctrl_usdhc2_vmmc {
-       u-boot,dm-spl;
-};
-
-&pinctrl_usdhc3 {
-       u-boot,dm-spl;
-};
-
-&pinctrl_usdhc3_100mhz {
-       u-boot,dm-spl;
-};
-
-&pinctrl_usdhc3_100mhz {
-       u-boot,dm-spl;
-};
-
-&pmic {
-       u-boot,dm-spl;
-
-       regulators {
-               u-boot,dm-spl;
-       };
-};
-
-&reg_usdhc2_vmmc {
-       u-boot,dm-spl;
-};
-
-&uart1 {
-       u-boot,dm-spl;
-};
-
-/* SDIO WiFi */
-&usdhc1 {
-       status = "disabled";
-};
-
-&usdhc2 {
-       u-boot,dm-spl;
-};
-
-&usdhc3 {
-       u-boot,dm-spl;
-};
-
-&wdog1 {
-       u-boot,dm-spl;
-};
+#include "imx8mp-dhcom-u-boot.dtsi"
index e95abfb..c9a481a 100644 (file)
@@ -1,18 +1,23 @@
 // SPDX-License-Identifier: (GPL-2.0+ OR MIT)
 /*
  * Copyright (C) 2022 Marek Vasut <marex@denx.de>
+ *
+ * DHCOM iMX8MP variant:
+ * DHCM-iMX8ML8-C160-R409-F1638-SPI16-GE-CAN2-SD-RTC-WBTA-ADC-T-RGB-CSI2-HS-I-01D2
+ * DHCOM PCB number: 660-100 or newer
+ * PDK2 PCB number: 516-400 or newer
  */
 
 /dts-v1/;
 
 #include <dt-bindings/leds/common.h>
-#include <dt-bindings/net/qca-ar803x.h>
 #include <dt-bindings/phy/phy-imx8-pcie.h>
 #include "imx8mp-dhcom-som.dtsi"
 
 / {
        model = "DH electronics i.MX8M Plus DHCOM Premium Developer Kit (2)";
-       compatible = "dh,imx8mp-dhcom-pdk2", "fsl,imx8mp";
+       compatible = "dh,imx8mp-dhcom-pdk2", "dh,imx8mp-dhcom-som",
+                    "fsl,imx8mp";
 
        chosen {
                stdout-path = &uart1;
index 63cc6c9..197840d 100644 (file)
@@ -70,7 +70,7 @@
 &ecspi1 {
        pinctrl-names = "default";
        pinctrl-0 = <&pinctrl_ecspi1>;
-       cs-gpios = <&gpio5 9 GPIO_ACTIVE_LOW>;
+       cs-gpios = <&gpio5 17 GPIO_ACTIVE_LOW>;
        status = "disabled";
 };
 
        pinctrl-names = "default", "gpio";
        pinctrl-0 = <&pinctrl_i2c5>;
        pinctrl-1 = <&pinctrl_i2c5_gpio>;
-       scl-gpios = <&gpio5 26 (GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN)>;
-       sda-gpios = <&gpio5 27 (GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN)>;
+       scl-gpios = <&gpio3 26 (GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN)>;
+       sda-gpios = <&gpio3 27 (GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN)>;
        status = "okay";
 };
 
 
        pinctrl_ecspi1: dhcom-ecspi1-grp {
                fsl,pins = <
-                       MX8MP_IOMUXC_ECSPI1_SCLK__ECSPI1_SCLK           0x44
-                       MX8MP_IOMUXC_ECSPI1_MOSI__ECSPI1_MOSI           0x44
-                       MX8MP_IOMUXC_ECSPI1_MISO__ECSPI1_MISO           0x44
-                       MX8MP_IOMUXC_ECSPI1_SS0__GPIO5_IO09             0x40
+                       MX8MP_IOMUXC_I2C1_SCL__ECSPI1_SCLK              0x44
+                       MX8MP_IOMUXC_I2C1_SDA__ECSPI1_MOSI              0x44
+                       MX8MP_IOMUXC_I2C2_SCL__ECSPI1_MISO              0x44
+                       MX8MP_IOMUXC_I2C2_SDA__GPIO5_IO17               0x40
                >;
        };
 
diff --git a/arch/arm/dts/imx8mp-dhcom-u-boot.dtsi b/arch/arm/dts/imx8mp-dhcom-u-boot.dtsi
new file mode 100644 (file)
index 0000000..ae838ca
--- /dev/null
@@ -0,0 +1,141 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+/*
+ * Copyright (C) 2022 Marek Vasut <marex@denx.de>
+ */
+
+#include "imx8mp-u-boot.dtsi"
+
+/ {
+       aliases {
+               eeprom0 = &eeprom0;
+               eeprom1 = &eeprom1;
+               mmc0 = &usdhc2; /* MicroSD */
+               mmc1 = &usdhc3; /* eMMC */
+               mmc2 = &usdhc1; /* SDIO */
+       };
+
+       config {
+               dh,ram-coding-gpios = <&gpio3 22 0>, <&gpio3 23 0>, <&gpio3 24 0>;
+       };
+
+       wdt-reboot {
+               compatible = "wdt-reboot";
+               wdt = <&wdog1>;
+               u-boot,dm-spl;
+       };
+};
+
+&buck4 {
+       u-boot,dm-spl;
+};
+
+&buck5 {
+       u-boot,dm-spl;
+};
+
+&eqos {
+       /delete-property/ assigned-clocks;
+       /delete-property/ assigned-clock-parents;
+       /delete-property/ assigned-clock-rates;
+};
+
+&gpio1 {
+       u-boot,dm-spl;
+};
+
+&gpio2 {
+       u-boot,dm-spl;
+};
+
+&gpio3 {
+       u-boot,dm-spl;
+};
+
+&gpio4 {
+       u-boot,dm-spl;
+};
+
+&gpio5 {
+       u-boot,dm-spl;
+};
+
+&i2c3 {
+       u-boot,dm-spl;
+};
+
+&pinctrl_i2c3 {
+       u-boot,dm-spl;
+};
+
+&pinctrl_i2c3_gpio {
+       u-boot,dm-spl;
+};
+
+&pinctrl_pmic {
+       u-boot,dm-spl;
+};
+
+&pinctrl_uart1 {
+       u-boot,dm-spl;
+};
+
+&pinctrl_usdhc2 {
+       u-boot,dm-spl;
+};
+
+&pinctrl_usdhc2_100mhz {
+       u-boot,dm-spl;
+};
+
+&pinctrl_usdhc2_200mhz {
+       u-boot,dm-spl;
+};
+
+&pinctrl_usdhc2_vmmc {
+       u-boot,dm-spl;
+};
+
+&pinctrl_usdhc3 {
+       u-boot,dm-spl;
+};
+
+&pinctrl_usdhc3_100mhz {
+       u-boot,dm-spl;
+};
+
+&pinctrl_usdhc3_100mhz {
+       u-boot,dm-spl;
+};
+
+&pmic {
+       u-boot,dm-spl;
+
+       regulators {
+               u-boot,dm-spl;
+       };
+};
+
+&reg_usdhc2_vmmc {
+       u-boot,dm-spl;
+};
+
+&uart1 {
+       u-boot,dm-spl;
+};
+
+/* SDIO WiFi */
+&usdhc1 {
+       status = "disabled";
+};
+
+&usdhc2 {
+       u-boot,dm-spl;
+};
+
+&usdhc3 {
+       u-boot,dm-spl;
+};
+
+&wdog1 {
+       u-boot,dm-spl;
+};
diff --git a/arch/arm/dts/imx8mq-librem5-r4-u-boot.dtsi b/arch/arm/dts/imx8mq-librem5-r4-u-boot.dtsi
new file mode 100644 (file)
index 0000000..9d0a54a
--- /dev/null
@@ -0,0 +1,24 @@
+// SPDX-License-Identifier: (GPL-2.0 OR MIT)
+
+#include "imx8mq-u-boot.dtsi"
+
+&pinctrl_uart1 {
+       u-boot,dm-spl;
+};
+
+&uart1 { /* console */
+       u-boot,dm-spl;
+};
+
+&binman {
+       /delete-node/ signed-hdmi;
+
+       signed-hdmi {
+               filename = "signed_hdmi.bin";
+
+               signed-dp-imx8m {
+                       filename = "signed_dp_imx8m.bin";
+                       type = "blob-ext";
+               };
+       };
+};
diff --git a/arch/arm/dts/imx8mq-librem5-r4.dts b/arch/arm/dts/imx8mq-librem5-r4.dts
new file mode 100644 (file)
index 0000000..cbfb49a
--- /dev/null
@@ -0,0 +1,35 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+// Copyright (C) 2020 Purism SPC <kernel@puri.sm>
+
+/dts-v1/;
+
+#include "imx8mq-librem5.dtsi"
+
+/ {
+       model = "Purism Librem 5r4";
+       compatible = "purism,librem5r4", "purism,librem5", "fsl,imx8mq";
+};
+
+&accel_gyro {
+       mount-matrix =  "1",  "0",  "0",
+                       "0",  "1",  "0",
+                       "0",  "0", "-1";
+};
+
+&bat {
+       maxim,rsns-microohm = <1667>;
+};
+
+&bq25895 {
+       ti,battery-regulation-voltage = <4200000>; /* uV */
+       ti,charge-current = <1500000>; /* uA */
+       ti,termination-current = <144000>;  /* uA */
+};
+
+&led_backlight {
+       led-max-microamp = <25000>;
+};
+
+&proximity {
+       proximity-near-level = <10>;
+};
diff --git a/arch/arm/dts/imx8mq-librem5.dtsi b/arch/arm/dts/imx8mq-librem5.dtsi
new file mode 100644 (file)
index 0000000..60d47c7
--- /dev/null
@@ -0,0 +1,1255 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright 2018-2020 Purism SPC
+ */
+
+/dts-v1/;
+
+#include "dt-bindings/input/input.h"
+#include <dt-bindings/interrupt-controller/irq.h>
+#include "dt-bindings/pwm/pwm.h"
+#include "dt-bindings/usb/pd.h"
+#include "imx8mq.dtsi"
+
+/ {
+       model = "Purism Librem 5";
+       compatible = "purism,librem5", "fsl,imx8mq";
+
+       backlight_dsi: backlight-dsi {
+               compatible = "led-backlight";
+               leds = <&led_backlight>;
+       };
+
+       pmic_osc: clock-pmic {
+               compatible = "fixed-clock";
+               #clock-cells = <0>;
+               clock-frequency = <32768>;
+               clock-output-names = "pmic_osc";
+       };
+
+       chosen {
+               stdout-path = &uart1;
+       };
+
+       gpio-keys {
+               compatible = "gpio-keys";
+               pinctrl-names = "default";
+               pinctrl-0 = <&pinctrl_keys>;
+
+               vol-down {
+                       label = "VOL_DOWN";
+                       gpios = <&gpio1 17 GPIO_ACTIVE_LOW>;
+                       linux,code = <KEY_VOLUMEDOWN>;
+                       debounce-interval = <50>;
+               };
+
+               vol-up {
+                       label = "VOL_UP";
+                       gpios = <&gpio1 16 GPIO_ACTIVE_LOW>;
+                       linux,code = <KEY_VOLUMEUP>;
+                       debounce-interval = <50>;
+               };
+       };
+
+       reg_aud_1v8: regulator-audio-1v8 {
+               compatible = "regulator-fixed";
+               pinctrl-names = "default";
+               pinctrl-0 = <&pinctrl_audiopwr>;
+               regulator-name = "AUDIO_PWR_EN";
+               regulator-min-microvolt = <1800000>;
+               regulator-max-microvolt = <1800000>;
+               gpio = <&gpio1 4 GPIO_ACTIVE_HIGH>;
+               enable-active-high;
+       };
+
+       reg_gnss: regulator-gnss {
+               compatible = "regulator-fixed";
+               pinctrl-names = "default";
+               pinctrl-0 = <&pinctrl_gnsspwr>;
+               regulator-name = "GNSS";
+               regulator-min-microvolt = <3300000>;
+               regulator-max-microvolt = <3300000>;
+               gpio = <&gpio3 12 GPIO_ACTIVE_HIGH>;
+               enable-active-high;
+       };
+
+       reg_hub: regulator-hub {
+               compatible = "regulator-fixed";
+               pinctrl-names = "default";
+               pinctrl-0 = <&pinctrl_hub_pwr>;
+               regulator-name = "HUB";
+               regulator-min-microvolt = <3300000>;
+               regulator-max-microvolt = <3300000>;
+               gpio = <&gpio1 14 GPIO_ACTIVE_HIGH>;
+               enable-active-high;
+       };
+
+       reg_lcd_1v8: regulator-lcd-1v8 {
+               compatible = "regulator-fixed";
+               pinctrl-names = "default";
+               pinctrl-0 = <&pinctrl_dsien>;
+               regulator-name = "LCD_1V8";
+               regulator-min-microvolt = <1800000>;
+               regulator-max-microvolt = <1800000>;
+               vin-supply = <&reg_vdd_1v8>;
+               gpio = <&gpio1 5 GPIO_ACTIVE_HIGH>;
+               enable-active-high;
+               /* Otherwise i2c3 is not functional */
+               regulator-always-on;
+       };
+
+       reg_lcd_3v4: regulator-lcd-3v4 {
+               compatible = "regulator-fixed";
+               regulator-name = "LCD_3V4";
+               pinctrl-names = "default";
+               pinctrl-0 = <&pinctrl_dsibiasen>;
+               vin-supply = <&reg_vsys_3v4>;
+               gpio = <&gpio1 20 GPIO_ACTIVE_HIGH>;
+               enable-active-high;
+       };
+
+       reg_vdd_sen: regulator-vdd-sen {
+               compatible = "regulator-fixed";
+               regulator-name = "VDD_SEN";
+               regulator-min-microvolt = <3300000>;
+               regulator-max-microvolt = <3300000>;
+       };
+
+       reg_vdd_1v8: regulator-vdd-1v8 {
+               compatible = "regulator-fixed";
+               regulator-name = "VDD_1V8";
+               regulator-min-microvolt = <1800000>;
+               regulator-max-microvolt = <1800000>;
+               vin-supply = <&buck7_reg>;
+       };
+
+       reg_vdd_3v3: regulator-vdd-3v3 {
+               compatible = "regulator-fixed";
+               regulator-name = "VDD_3V3";
+               regulator-min-microvolt = <3300000>;
+               regulator-max-microvolt = <3300000>;
+       };
+
+       reg_vsys_3v4: regulator-vsys-3v4 {
+               compatible = "regulator-fixed";
+               regulator-name = "VSYS_3V4";
+               regulator-min-microvolt = <3400000>;
+               regulator-max-microvolt = <3400000>;
+               regulator-always-on;
+       };
+
+       reg_wifi_3v3: regulator-wifi-3v3 {
+               compatible = "regulator-fixed";
+               pinctrl-names = "default";
+               pinctrl-0 = <&pinctrl_wifi_pwr>;
+               regulator-name = "3V3_WIFI";
+               regulator-min-microvolt = <3300000>;
+               regulator-max-microvolt = <3300000>;
+               gpio = <&gpio3 10 GPIO_ACTIVE_HIGH>;
+               enable-active-high;
+               vin-supply = <&reg_vdd_3v3>;
+       };
+
+       sound {
+               compatible = "simple-audio-card";
+               pinctrl-names = "default";
+               pinctrl-0 = <&pinctrl_hp>;
+               simple-audio-card,name = "Librem 5";
+               simple-audio-card,format = "i2s";
+               simple-audio-card,widgets =
+                       "Headphone", "Headphones",
+                       "Microphone", "Headset Mic",
+                       "Microphone", "Digital Mic",
+                       "Speaker", "Speaker";
+               simple-audio-card,routing =
+                       "Headphones", "HPOUTL",
+                       "Headphones", "HPOUTR",
+                       "Speaker", "SPKOUTL",
+                       "Speaker", "SPKOUTR",
+                       "Headset Mic", "MICBIAS",
+                       "IN3R", "Headset Mic",
+                       "DMICDAT", "Digital Mic";
+               simple-audio-card,hp-det-gpio = <&gpio3 9 GPIO_ACTIVE_HIGH>;
+
+               simple-audio-card,cpu {
+                       sound-dai = <&sai2>;
+               };
+
+               simple-audio-card,codec {
+                       sound-dai = <&codec>;
+                       clocks = <&clk IMX8MQ_CLK_SAI2_ROOT>;
+                       frame-master;
+                       bitclock-master;
+               };
+       };
+
+       sound-wwan {
+               compatible = "simple-audio-card";
+               simple-audio-card,name = "Modem";
+               simple-audio-card,format = "i2s";
+
+               simple-audio-card,cpu {
+                       sound-dai = <&sai6>;
+                       frame-inversion;
+               };
+
+               simple-audio-card,codec {
+                       sound-dai = <&bm818_codec>;
+                       frame-master;
+                       bitclock-master;
+               };
+       };
+
+       usdhc2_pwrseq: pwrseq {
+               pinctrl-names = "default";
+               pinctrl-0 = <&pinctrl_bt>, <&pinctrl_wifi_disable>;
+               compatible = "mmc-pwrseq-simple";
+               reset-gpios = <&gpio3 25 GPIO_ACTIVE_HIGH>,
+                             <&gpio4 29 GPIO_ACTIVE_HIGH>;
+       };
+
+       bm818_codec: sound-wwan-codec {
+               compatible = "broadmobi,bm818", "option,gtm601";
+               #sound-dai-cells = <0>;
+       };
+
+       vibrator {
+               compatible = "pwm-vibrator";
+               pwms = <&pwm1 0 1000000000 0>;
+               pwm-names = "enable";
+               vcc-supply = <&reg_vdd_3v3>;
+       };
+};
+
+&A53_0 {
+       cpu-supply = <&buck2_reg>;
+};
+
+&A53_1 {
+       cpu-supply = <&buck2_reg>;
+};
+
+&A53_2 {
+       cpu-supply = <&buck2_reg>;
+};
+
+&A53_3 {
+       cpu-supply = <&buck2_reg>;
+};
+
+&ddrc {
+       operating-points-v2 = <&ddrc_opp_table>;
+
+       ddrc_opp_table: opp-table {
+               compatible = "operating-points-v2";
+
+               opp-25M {
+                       opp-hz = /bits/ 64 <25000000>;
+               };
+
+               opp-100M {
+                       opp-hz = /bits/ 64 <100000000>;
+               };
+
+               opp-800M {
+                       opp-hz = /bits/ 64 <800000000>;
+               };
+       };
+};
+
+&dphy {
+       status = "okay";
+};
+
+&ecspi1 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_ecspi1>;
+       cs-gpios = <&gpio5 9 GPIO_ACTIVE_LOW>;
+       #address-cells = <1>;
+       #size-cells = <0>;
+       status = "okay";
+
+       nor_flash: flash@0 {
+               compatible = "jedec,spi-nor";
+               reg = <0>;
+               spi-max-frequency = <1000000>;
+               #address-cells = <1>;
+               #size-cells = <1>;
+
+               partition@0 {
+                       label = "protected0";
+                       reg = <0x0 0x30000>;
+                       read-only;
+               };
+
+               partition@30000 {
+                       label = "protected1";
+                       reg = <0x30000 0x10000>;
+                       read-only;
+               };
+
+               partition@40000 {
+                       label = "rw";
+                       reg = <0x40000 0x1C0000>;
+               };
+       };
+};
+
+&gpio1 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_pmic_5v>;
+
+       pmic-5v-hog {
+               gpio-hog;
+               gpios = <1 GPIO_ACTIVE_HIGH>;
+               input;
+               lane-mapping = "pmic-5v";
+       };
+};
+
+&iomuxc {
+       pinctrl_audiopwr: audiopwrgrp {
+               fsl,pins = <
+                       /* AUDIO_POWER_EN_3V3 */
+                       MX8MQ_IOMUXC_GPIO1_IO04_GPIO1_IO4       0x83
+               >;
+       };
+
+       pinctrl_bl: blgrp {
+               fsl,pins = <
+                       /* BACKLINGE_EN */
+                       MX8MQ_IOMUXC_NAND_DQS_GPIO3_IO14        0x83
+               >;
+       };
+
+       pinctrl_bt: btgrp {
+               fsl,pins = <
+                       /* BT_REG_ON */
+                       MX8MQ_IOMUXC_SAI5_MCLK_GPIO3_IO25       0x83
+               >;
+       };
+
+       pinctrl_charger_in: chargeringrp {
+               fsl,pins = <
+                       /* CHRG_INT */
+                       MX8MQ_IOMUXC_NAND_CE2_B_GPIO3_IO3       0x80
+                       /* CHG_STATUS_B */
+                       MX8MQ_IOMUXC_NAND_ALE_GPIO3_IO0         0x80
+               >;
+       };
+
+       pinctrl_dsibiasen: dsibiasengrp {
+               fsl,pins = <
+                       /* DSI_BIAS_EN */
+                       MX8MQ_IOMUXC_ENET_TD1_GPIO1_IO20        0x83
+               >;
+       };
+
+       pinctrl_dsien: dsiengrp {
+               fsl,pins = <
+                       /* DSI_EN_3V3 */
+                       MX8MQ_IOMUXC_GPIO1_IO05_GPIO1_IO5       0x83
+               >;
+       };
+
+       pinctrl_dsirst: dsirstgrp {
+               fsl,pins = <
+                       /* DSI_RST */
+                       MX8MQ_IOMUXC_ENET_RD3_GPIO1_IO29        0x83
+                       /* DSI_TE */
+                       MX8MQ_IOMUXC_ENET_RD2_GPIO1_IO28        0x83
+                       /* TP_RST */
+                       MX8MQ_IOMUXC_ENET_RX_CTL_GPIO1_IO24     0x83
+               >;
+       };
+
+       pinctrl_ecspi1: ecspigrp {
+               fsl,pins = <
+                       MX8MQ_IOMUXC_ECSPI1_MOSI_ECSPI1_MOSI    0x83
+                       MX8MQ_IOMUXC_ECSPI1_MISO_ECSPI1_MISO    0x83
+                       MX8MQ_IOMUXC_ECSPI1_SS0_GPIO5_IO9       0x19
+                       MX8MQ_IOMUXC_ECSPI1_SCLK_ECSPI1_SCLK    0x83
+               >;
+       };
+
+       pinctrl_gauge: gaugegrp {
+               fsl,pins = <
+                       /* BAT_LOW */
+                       MX8MQ_IOMUXC_SAI5_RXC_GPIO3_IO20        0x80
+               >;
+       };
+
+       pinctrl_gnsspwr: gnsspwrgrp {
+               fsl,pins = <
+                       /* GPS3V3_EN */
+                       MX8MQ_IOMUXC_NAND_DATA06_GPIO3_IO12     0x83
+               >;
+       };
+
+       pinctrl_haptic: hapticgrp {
+               fsl,pins = <
+                       /* MOTO */
+                       MX8MQ_IOMUXC_SPDIF_EXT_CLK_PWM1_OUT     0x83
+               >;
+       };
+
+       pinctrl_hp: hpgrp {
+               fsl,pins = <
+                       /* HEADPHONE_DET_1V8 */
+                       MX8MQ_IOMUXC_NAND_DATA03_GPIO3_IO9      0x180
+               >;
+       };
+
+       pinctrl_hub_pwr: hubpwrgrp {
+               fsl,pins = <
+                       /* HUB_PWR_3V3_EN */
+                       MX8MQ_IOMUXC_GPIO1_IO14_GPIO1_IO14      0x83
+               >;
+       };
+
+       pinctrl_i2c1: i2c1grp {
+               fsl,pins = <
+                       MX8MQ_IOMUXC_I2C1_SCL_I2C1_SCL          0x40000026
+                       MX8MQ_IOMUXC_I2C1_SDA_I2C1_SDA          0x40000026
+               >;
+       };
+
+       pinctrl_i2c2: i2c2grp {
+               fsl,pins = <
+                       MX8MQ_IOMUXC_I2C2_SCL_I2C2_SCL          0x40000026
+                       MX8MQ_IOMUXC_I2C2_SDA_I2C2_SDA          0x40000026
+               >;
+       };
+
+       pinctrl_i2c3: i2c3grp {
+               fsl,pins = <
+                       MX8MQ_IOMUXC_I2C3_SCL_I2C3_SCL          0x40000026
+                       MX8MQ_IOMUXC_I2C3_SDA_I2C3_SDA          0x40000026
+               >;
+       };
+
+       pinctrl_i2c4: i2c4grp {
+               fsl,pins = <
+                       MX8MQ_IOMUXC_I2C4_SCL_I2C4_SCL          0x40000026
+                       MX8MQ_IOMUXC_I2C4_SDA_I2C4_SDA          0x40000026
+               >;
+       };
+
+       pinctrl_keys: keysgrp {
+               fsl,pins = <
+                       /* VOL- */
+                       MX8MQ_IOMUXC_ENET_MDIO_GPIO1_IO17       0x01C0
+                       /* VOL+ */
+                       MX8MQ_IOMUXC_ENET_MDC_GPIO1_IO16        0x01C0
+               >;
+       };
+
+       pinctrl_led_b: ledbgrp {
+               fsl,pins = <
+                       /* LED_B */
+                       MX8MQ_IOMUXC_GPIO1_IO13_PWM2_OUT        0x06
+               >;
+       };
+
+       pinctrl_led_g: ledggrp {
+               fsl,pins = <
+                       /* LED_G */
+                       MX8MQ_IOMUXC_SAI3_MCLK_PWM4_OUT         0x06
+               >;
+       };
+
+       pinctrl_led_r: ledrgrp {
+               fsl,pins = <
+                       /* LED_R */
+                       MX8MQ_IOMUXC_SPDIF_TX_PWM3_OUT          0x06
+               >;
+       };
+
+       pinctrl_mag: maggrp {
+               fsl,pins = <
+                       /* INT_MAG */
+                       MX8MQ_IOMUXC_SAI5_RXD1_GPIO3_IO22       0x80
+               >;
+       };
+
+       pinctrl_pmic: pmicgrp {
+               fsl,pins = <
+                       /* PMIC_NINT */
+                       MX8MQ_IOMUXC_GPIO1_IO07_GPIO1_IO7       0x80
+               >;
+       };
+
+       pinctrl_pmic_5v: pmic5vgrp {
+               fsl,pins = <
+                       /* PMIC_5V */
+                       MX8MQ_IOMUXC_GPIO1_IO01_GPIO1_IO1       0x80
+               >;
+       };
+
+       pinctrl_prox: proxgrp {
+               fsl,pins = <
+                       /* INT_LIGHT */
+                       MX8MQ_IOMUXC_NAND_DATA01_GPIO3_IO7      0x80
+               >;
+       };
+
+       pinctrl_rtc: rtcgrp {
+               fsl,pins = <
+                       /* RTC_INT */
+                       MX8MQ_IOMUXC_GPIO1_IO09_GPIO1_IO9       0x80
+               >;
+       };
+
+       pinctrl_sai2: sai2grp {
+               fsl,pins = <
+                       MX8MQ_IOMUXC_SAI2_TXD0_SAI2_TX_DATA0    0xd6
+                       MX8MQ_IOMUXC_SAI2_TXFS_SAI2_TX_SYNC     0xd6
+                       MX8MQ_IOMUXC_SAI2_MCLK_SAI2_MCLK        0xd6
+                       MX8MQ_IOMUXC_SAI2_RXD0_SAI2_RX_DATA0    0xd6
+                       MX8MQ_IOMUXC_SAI2_TXC_SAI2_TX_BCLK      0xd6
+               >;
+       };
+
+       pinctrl_sai6: sai6grp {
+               fsl,pins = <
+                       MX8MQ_IOMUXC_SAI1_RXD5_SAI6_RX_DATA0    0xd6
+                       MX8MQ_IOMUXC_SAI1_RXD6_SAI6_RX_SYNC     0xd6
+                       MX8MQ_IOMUXC_SAI1_TXD4_SAI6_RX_BCLK     0xd6
+                       MX8MQ_IOMUXC_SAI1_TXD5_SAI6_TX_DATA0    0xd6
+               >;
+       };
+
+       pinctrl_tcpc: tcpcgrp {
+               fsl,pins = <
+                       /* TCPC_INT */
+                       MX8MQ_IOMUXC_GPIO1_IO10_GPIO1_IO10      0x01C0
+               >;
+       };
+
+       pinctrl_touch: touchgrp {
+               fsl,pins = <
+                       /* TP_INT */
+                       MX8MQ_IOMUXC_ENET_RD1_GPIO1_IO27        0x80
+               >;
+       };
+
+       pinctrl_typec: typecgrp {
+               fsl,pins = <
+                       /* TYPEC_MUX_EN */
+                       MX8MQ_IOMUXC_GPIO1_IO11_GPIO1_IO11      0x83
+               >;
+       };
+
+       pinctrl_uart1: uart1grp {
+               fsl,pins = <
+                       MX8MQ_IOMUXC_UART1_RXD_UART1_DCE_RX     0x49
+                       MX8MQ_IOMUXC_UART1_TXD_UART1_DCE_TX     0x49
+               >;
+       };
+
+       pinctrl_uart2: uart2grp {
+               fsl,pins = <
+                       MX8MQ_IOMUXC_UART2_TXD_UART2_DCE_TX     0x49
+                       MX8MQ_IOMUXC_UART2_RXD_UART2_DCE_RX     0x49
+               >;
+       };
+
+       pinctrl_uart3: uart3grp {
+               fsl,pins = <
+                       MX8MQ_IOMUXC_UART3_RXD_UART3_DCE_RX     0x49
+                       MX8MQ_IOMUXC_UART3_TXD_UART3_DCE_TX     0x49
+               >;
+       };
+
+       pinctrl_uart4: uart4grp {
+               fsl,pins = <
+                       MX8MQ_IOMUXC_ECSPI2_SCLK_UART4_DCE_RX           0x49
+                       MX8MQ_IOMUXC_ECSPI2_MOSI_UART4_DCE_TX           0x49
+                       MX8MQ_IOMUXC_ECSPI2_MISO_UART4_DCE_CTS_B        0x49
+                       MX8MQ_IOMUXC_ECSPI2_SS0_UART4_DCE_RTS_B         0x49
+               >;
+       };
+
+       pinctrl_usdhc1: usdhc1grp {
+               fsl,pins = <
+                       MX8MQ_IOMUXC_SD1_CLK_USDHC1_CLK                 0x83
+                       MX8MQ_IOMUXC_SD1_CMD_USDHC1_CMD                 0xc3
+                       MX8MQ_IOMUXC_SD1_DATA0_USDHC1_DATA0             0xc3
+                       MX8MQ_IOMUXC_SD1_DATA1_USDHC1_DATA1             0xc3
+                       MX8MQ_IOMUXC_SD1_DATA2_USDHC1_DATA2             0xc3
+                       MX8MQ_IOMUXC_SD1_DATA3_USDHC1_DATA3             0xc3
+                       MX8MQ_IOMUXC_SD1_DATA4_USDHC1_DATA4             0xc3
+                       MX8MQ_IOMUXC_SD1_DATA5_USDHC1_DATA5             0xc3
+                       MX8MQ_IOMUXC_SD1_DATA6_USDHC1_DATA6             0xc3
+                       MX8MQ_IOMUXC_SD1_DATA7_USDHC1_DATA7             0xc3
+                       MX8MQ_IOMUXC_SD1_STROBE_USDHC1_STROBE           0x83
+                       MX8MQ_IOMUXC_SD1_RESET_B_USDHC1_RESET_B         0xc1
+               >;
+       };
+
+       pinctrl_usdhc1_100mhz: usdhc1grp100mhz {
+               fsl,pins = <
+                       MX8MQ_IOMUXC_SD1_CLK_USDHC1_CLK                 0x8d
+                       MX8MQ_IOMUXC_SD1_CMD_USDHC1_CMD                 0xcd
+                       MX8MQ_IOMUXC_SD1_DATA0_USDHC1_DATA0             0xcd
+                       MX8MQ_IOMUXC_SD1_DATA1_USDHC1_DATA1             0xcd
+                       MX8MQ_IOMUXC_SD1_DATA2_USDHC1_DATA2             0xcd
+                       MX8MQ_IOMUXC_SD1_DATA3_USDHC1_DATA3             0xcd
+                       MX8MQ_IOMUXC_SD1_DATA4_USDHC1_DATA4             0xcd
+                       MX8MQ_IOMUXC_SD1_DATA5_USDHC1_DATA5             0xcd
+                       MX8MQ_IOMUXC_SD1_DATA6_USDHC1_DATA6             0xcd
+                       MX8MQ_IOMUXC_SD1_DATA7_USDHC1_DATA7             0xcd
+                       MX8MQ_IOMUXC_SD1_STROBE_USDHC1_STROBE           0x8d
+                       MX8MQ_IOMUXC_SD1_RESET_B_USDHC1_RESET_B         0xc1
+               >;
+       };
+
+       pinctrl_usdhc1_200mhz: usdhc1grp200mhz {
+               fsl,pins = <
+                       MX8MQ_IOMUXC_SD1_CLK_USDHC1_CLK                 0x9f
+                       MX8MQ_IOMUXC_SD1_CMD_USDHC1_CMD                 0xdf
+                       MX8MQ_IOMUXC_SD1_DATA0_USDHC1_DATA0             0xdf
+                       MX8MQ_IOMUXC_SD1_DATA1_USDHC1_DATA1             0xdf
+                       MX8MQ_IOMUXC_SD1_DATA2_USDHC1_DATA2             0xdf
+                       MX8MQ_IOMUXC_SD1_DATA3_USDHC1_DATA3             0xdf
+                       MX8MQ_IOMUXC_SD1_DATA4_USDHC1_DATA4             0xdf
+                       MX8MQ_IOMUXC_SD1_DATA5_USDHC1_DATA5             0xdf
+                       MX8MQ_IOMUXC_SD1_DATA6_USDHC1_DATA6             0xdf
+                       MX8MQ_IOMUXC_SD1_DATA7_USDHC1_DATA7             0xdf
+                       MX8MQ_IOMUXC_SD1_STROBE_USDHC1_STROBE           0x9f
+                       MX8MQ_IOMUXC_SD1_RESET_B_USDHC1_RESET_B         0xc1
+               >;
+       };
+
+       pinctrl_usdhc2: usdhc2grp {
+               fsl,pins = <
+                       MX8MQ_IOMUXC_SD2_CD_B_GPIO2_IO12        0x80
+                       MX8MQ_IOMUXC_SD2_CLK_USDHC2_CLK         0x83
+                       MX8MQ_IOMUXC_SD2_CMD_USDHC2_CMD         0xc3
+                       MX8MQ_IOMUXC_SD2_DATA0_USDHC2_DATA0     0xc3
+                       MX8MQ_IOMUXC_SD2_DATA1_USDHC2_DATA1     0xc3
+                       MX8MQ_IOMUXC_SD2_DATA2_USDHC2_DATA2     0xc3
+                       MX8MQ_IOMUXC_SD2_DATA3_USDHC2_DATA3     0xc3
+                       MX8MQ_IOMUXC_SD2_RESET_B_USDHC2_RESET_B 0xc1
+               >;
+       };
+
+       pinctrl_usdhc2_100mhz: usdhc2grp100mhz {
+               fsl,pins = <
+                       MX8MQ_IOMUXC_SD2_CD_B_GPIO2_IO12        0x80
+                       MX8MQ_IOMUXC_SD2_CLK_USDHC2_CLK         0x8d
+                       MX8MQ_IOMUXC_SD2_CMD_USDHC2_CMD         0xcd
+                       MX8MQ_IOMUXC_SD2_DATA0_USDHC2_DATA0     0xcd
+                       MX8MQ_IOMUXC_SD2_DATA1_USDHC2_DATA1     0xcd
+                       MX8MQ_IOMUXC_SD2_DATA2_USDHC2_DATA2     0xcd
+                       MX8MQ_IOMUXC_SD2_DATA3_USDHC2_DATA3     0xcd
+                       MX8MQ_IOMUXC_SD2_RESET_B_USDHC2_RESET_B 0xc1
+               >;
+       };
+
+       pinctrl_usdhc2_200mhz: usdhc2grp200mhz {
+               fsl,pins = <
+                       MX8MQ_IOMUXC_SD2_CD_B_GPIO2_IO12        0x80
+                       MX8MQ_IOMUXC_SD2_CLK_USDHC2_CLK         0x9f
+                       MX8MQ_IOMUXC_SD2_CMD_USDHC2_CMD         0xcf
+                       MX8MQ_IOMUXC_SD2_DATA0_USDHC2_DATA0     0xcf
+                       MX8MQ_IOMUXC_SD2_DATA1_USDHC2_DATA1     0xcf
+                       MX8MQ_IOMUXC_SD2_DATA2_USDHC2_DATA2     0xcf
+                       MX8MQ_IOMUXC_SD2_DATA3_USDHC2_DATA3     0xcf
+                       MX8MQ_IOMUXC_SD2_RESET_B_USDHC2_RESET_B 0xc1
+               >;
+       };
+
+       pinctrl_wifi_disable: wifidisablegrp {
+               fsl,pins = <
+                       /* WIFI_REG_ON */
+                       MX8MQ_IOMUXC_SAI3_RXC_GPIO4_IO29        0x83
+               >;
+       };
+
+       pinctrl_wifi_pwr: wifipwrgrp {
+               fsl,pins = <
+                       /* WIFI3V3_EN */
+                       MX8MQ_IOMUXC_NAND_DATA04_GPIO3_IO10     0x83
+               >;
+       };
+
+       pinctrl_wdog: wdoggrp {
+               fsl,pins = <
+                       /* nWDOG */
+                       MX8MQ_IOMUXC_GPIO1_IO02_WDOG1_WDOG_B    0x1f
+               >;
+       };
+};
+
+&i2c1 {
+       clock-frequency = <387000>;
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_i2c1>;
+       status = "okay";
+
+       typec_pd: usb-pd@3f {
+               compatible = "ti,tps6598x";
+               reg = <0x3f>;
+               pinctrl-names = "default";
+               pinctrl-0 = <&pinctrl_typec>, <&pinctrl_tcpc>;
+               interrupt-parent = <&gpio1>;
+               interrupts = <10 IRQ_TYPE_LEVEL_LOW>;
+               interrupt-names = "irq";
+
+               connector {
+                       ports {
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+
+                               port@0 {
+                                       reg = <0>;
+
+                                       usb_con_hs: endpoint {
+                                               remote-endpoint = <&typec_hs>;
+                                       };
+                               };
+
+                               port@1 {
+                                       reg = <1>;
+
+                                       usb_con_ss: endpoint {
+                                               remote-endpoint = <&typec_ss>;
+                                       };
+                               };
+                       };
+               };
+       };
+
+       pmic: pmic@4b {
+               compatible = "rohm,bd71837";
+               reg = <0x4b>;
+               pinctrl-names = "default";
+               pinctrl-0 = <&pinctrl_pmic>;
+               clocks = <&pmic_osc>;
+               clock-names = "osc";
+               clock-output-names = "pmic_clk";
+               interrupt-parent = <&gpio1>;
+               interrupts = <7 IRQ_TYPE_LEVEL_LOW>;
+               rohm,reset-snvs-powered;
+
+               regulators {
+                       buck1_reg: BUCK1 {
+                               regulator-name = "buck1";
+                               regulator-min-microvolt = <700000>;
+                               regulator-max-microvolt = <1300000>;
+                               regulator-boot-on;
+                               regulator-ramp-delay = <1250>;
+                               rohm,dvs-run-voltage = <900000>;
+                               rohm,dvs-idle-voltage = <850000>;
+                               rohm,dvs-suspend-voltage = <800000>;
+                               regulator-always-on;
+                       };
+
+                       buck2_reg: BUCK2 {
+                               regulator-name = "buck2";
+                               regulator-min-microvolt = <700000>;
+                               regulator-max-microvolt = <1300000>;
+                               regulator-boot-on;
+                               regulator-ramp-delay = <1250>;
+                               rohm,dvs-run-voltage = <1000000>;
+                               rohm,dvs-idle-voltage = <900000>;
+                               regulator-always-on;
+                       };
+
+                       buck3_reg: BUCK3 {
+                               regulator-name = "buck3";
+                               regulator-min-microvolt = <700000>;
+                               regulator-max-microvolt = <1300000>;
+                               regulator-boot-on;
+                               rohm,dvs-run-voltage = <900000>;
+                       };
+
+                       buck4_reg: BUCK4 {
+                               regulator-name = "buck4";
+                               regulator-min-microvolt = <700000>;
+                               regulator-max-microvolt = <1300000>;
+                               rohm,dvs-run-voltage = <1000000>;
+                       };
+
+                       buck5_reg: BUCK5 {
+                               regulator-name = "buck5";
+                               regulator-min-microvolt = <700000>;
+                               regulator-max-microvolt = <1350000>;
+                               regulator-boot-on;
+                               regulator-always-on;
+                       };
+
+                       buck6_reg: BUCK6 {
+                               regulator-name = "buck6";
+                               regulator-min-microvolt = <3000000>;
+                               regulator-max-microvolt = <3300000>;
+                               regulator-boot-on;
+                               regulator-always-on;
+                       };
+
+                       buck7_reg: BUCK7 {
+                               regulator-name = "buck7";
+                               regulator-min-microvolt = <1605000>;
+                               regulator-max-microvolt = <1995000>;
+                               regulator-boot-on;
+                               regulator-always-on;
+                       };
+
+                       buck8_reg: BUCK8 {
+                               regulator-name = "buck8";
+                               regulator-min-microvolt = <800000>;
+                               regulator-max-microvolt = <1400000>;
+                               regulator-boot-on;
+                               regulator-always-on;
+                       };
+
+                       ldo1_reg: LDO1 {
+                               regulator-name = "ldo1";
+                               regulator-min-microvolt = <3000000>;
+                               regulator-max-microvolt = <3300000>;
+                               regulator-boot-on;
+                               /* leave on for snvs power button */
+                               regulator-always-on;
+                       };
+
+                       ldo2_reg: LDO2 {
+                               regulator-name = "ldo2";
+                               regulator-min-microvolt = <900000>;
+                               regulator-max-microvolt = <900000>;
+                               regulator-boot-on;
+                               /* leave on for snvs power button */
+                               regulator-always-on;
+                       };
+
+                       ldo3_reg: LDO3 {
+                               regulator-name = "ldo3";
+                               regulator-min-microvolt = <1800000>;
+                               regulator-max-microvolt = <3300000>;
+                               regulator-boot-on;
+                               regulator-always-on;
+                       };
+
+                       ldo4_reg: LDO4 {
+                               regulator-name = "ldo4";
+                               regulator-min-microvolt = <900000>;
+                               regulator-max-microvolt = <1800000>;
+                               regulator-boot-on;
+                               regulator-always-on;
+                       };
+
+                       ldo5_reg: LDO5 {
+                               /* VDD_PHY_0V9 - MIPI and HDMI domains */
+                               regulator-name = "ldo5";
+                               regulator-min-microvolt = <1800000>;
+                               regulator-max-microvolt = <3300000>;
+                               regulator-always-on;
+                       };
+
+                       ldo6_reg: LDO6 {
+                               /* VDD_PHY_0V9 - MIPI, HDMI and USB domains */
+                               regulator-name = "ldo6";
+                               regulator-min-microvolt = <900000>;
+                               regulator-max-microvolt = <1800000>;
+                               regulator-boot-on;
+                               regulator-always-on;
+                       };
+
+                       ldo7_reg: LDO7 {
+                               /* VDD_PHY_3V3 - USB domain */
+                               regulator-name = "ldo7";
+                               regulator-min-microvolt = <1800000>;
+                               regulator-max-microvolt = <3300000>;
+                               regulator-boot-on;
+                               regulator-always-on;
+                       };
+               };
+       };
+
+       rtc@68 {
+               compatible = "microcrystal,rv4162";
+               reg = <0x68>;
+               pinctrl-names = "default";
+               pinctrl-0 = <&pinctrl_rtc>;
+               interrupt-parent = <&gpio1>;
+               interrupts = <9 IRQ_TYPE_LEVEL_LOW>;
+       };
+};
+
+&i2c2 {
+       clock-frequency = <387000>;
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_i2c2>;
+       status = "okay";
+
+       magnetometer@1e {
+               compatible = "st,lsm9ds1-magn";
+               reg = <0x1e>;
+               pinctrl-names = "default";
+               pinctrl-0 = <&pinctrl_mag>;
+               interrupt-parent = <&gpio3>;
+               interrupts = <22 IRQ_TYPE_LEVEL_HIGH>;
+               vdd-supply = <&reg_vdd_sen>;
+               vddio-supply = <&reg_vdd_1v8>;
+       };
+
+       regulator@3e {
+               compatible = "tps65132";
+               reg = <0x3e>;
+
+               reg_lcd_avdd: outp {
+                       regulator-name = "LCD_AVDD";
+                       vin-supply = <&reg_lcd_3v4>;
+               };
+
+               reg_lcd_avee: outn {
+                       regulator-name = "LCD_AVEE";
+                       vin-supply = <&reg_lcd_3v4>;
+               };
+       };
+
+       proximity: prox@60 {
+               compatible = "vishay,vcnl4040";
+               reg = <0x60>;
+               pinctrl-names = "default";
+               pinctrl-0 = <&pinctrl_prox>;
+               interrupt-parent = <&gpio3>;
+               interrupts = <7 IRQ_TYPE_LEVEL_LOW>;
+       };
+
+       accel_gyro: accel-gyro@6a       {
+               compatible = "st,lsm9ds1-imu";
+               reg = <0x6a>;
+               vdd-supply = <&reg_vdd_sen>;
+               vddio-supply = <&reg_vdd_1v8>;
+       };
+};
+
+&i2c3 {
+       clock-frequency = <387000>;
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_i2c3>;
+       status = "okay";
+
+       codec: audio-codec@1a {
+               compatible = "wlf,wm8962";
+               reg = <0x1a>;
+               clocks = <&clk IMX8MQ_CLK_SAI2_ROOT>;
+               assigned-clocks = <&clk IMX8MQ_CLK_SAI2>;
+               assigned-clock-parents = <&clk IMX8MQ_AUDIO_PLL1_OUT>;
+               assigned-clock-rates = <24576000>;
+               #sound-dai-cells = <0>;
+               mic-cfg = <0x200>;
+               DCVDD-supply = <&reg_aud_1v8>;
+               DBVDD-supply = <&reg_aud_1v8>;
+               AVDD-supply = <&reg_aud_1v8>;
+               CPVDD-supply = <&reg_aud_1v8>;
+               MICVDD-supply = <&reg_aud_1v8>;
+               PLLVDD-supply = <&reg_aud_1v8>;
+               SPKVDD1-supply = <&reg_vsys_3v4>;
+               SPKVDD2-supply = <&reg_vsys_3v4>;
+               gpio-cfg = <
+                       0x0000 /* n/c */
+                       0x0001 /* gpio2, 1: default */
+                       0x0013 /* gpio3, 2: dmicclk */
+                       0x0000 /* n/c, 3: default */
+                       0x8014 /* gpio5, 4: dmic_dat */
+                       0x0000 /* gpio6, 5: default */
+               >;
+       };
+
+       backlight@36 {
+               compatible = "ti,lm36922";
+               reg = <0x36>;
+               pinctrl-names = "default";
+               pinctrl-0 = <&pinctrl_bl>;
+               #address-cells = <1>;
+               #size-cells = <0>;
+               enable-gpios = <&gpio3 14 GPIO_ACTIVE_HIGH>;
+               vled-supply = <&reg_vsys_3v4>;
+               ti,ovp-microvolt = <25000000>;
+
+               led_backlight: led@0 {
+                       reg = <0>;
+                       label = ":backlight";
+                       linux,default-trigger = "backlight";
+                       led-max-microamp = <20000>;
+               };
+       };
+
+       touchscreen@38 {
+               compatible = "edt,edt-ft5506";
+               reg = <0x38>;
+               pinctrl-names = "default";
+               pinctrl-0 = <&pinctrl_touch>;
+               interrupt-parent = <&gpio1>;
+               interrupts = <27 IRQ_TYPE_EDGE_FALLING>;
+               touchscreen-size-x = <720>;
+               touchscreen-size-y = <1440>;
+               vcc-supply = <&reg_lcd_1v8>;
+       };
+};
+
+&i2c4 {
+       clock-frequency = <387000>;
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_i2c4>;
+       status = "okay";
+
+       bat: fuel-gauge@36 {
+               compatible = "maxim,max17055";
+               reg = <0x36>;
+               interrupt-parent = <&gpio3>;
+               interrupts = <20 IRQ_TYPE_LEVEL_LOW>;
+               pinctrl-names = "default";
+               pinctrl-0 = <&pinctrl_gauge>;
+               maxim,over-heat-temp = <700>;
+               maxim,over-volt = <4500>;
+               maxim,rsns-microohm = <5000>;
+       };
+
+       bq25895: charger@6a {
+               compatible = "ti,bq25895", "ti,bq25890";
+               reg = <0x6a>;
+               pinctrl-names = "default";
+               pinctrl-0 = <&pinctrl_charger_in>;
+               interrupt-parent = <&gpio3>;
+               interrupts = <3 IRQ_TYPE_EDGE_FALLING>;
+               phys = <&usb3_phy0>;
+               ti,precharge-current = <130000>; /* uA */
+               ti,minimum-sys-voltage = <3700000>; /* uV */
+               ti,boost-voltage = <5000000>; /* uV */
+               ti,boost-max-current = <500000>; /* uA */
+               ti,use-vinmin-threshold = <1>; /* enable VINDPM */
+               ti,vinmin-threshold = <3900000>; /* uV */
+               monitored-battery = <&bat>;
+               power-supplies = <&typec_pd>;
+       };
+};
+
+&lcdif {
+       status = "okay";
+};
+
+&mipi_dsi {
+       #address-cells = <1>;
+       #size-cells = <0>;
+       status = "okay";
+
+       lcd_panel: panel@0 {
+               compatible = "mantix,mlaf057we51-x";
+               reg = <0>;
+               pinctrl-names = "default";
+               pinctrl-0 = <&pinctrl_dsirst>;
+               avdd-supply = <&reg_lcd_avdd>;
+               avee-supply = <&reg_lcd_avee>;
+               vddi-supply = <&reg_lcd_1v8>;
+               backlight = <&backlight_dsi>;
+               reset-gpios = <&gpio1 29 GPIO_ACTIVE_LOW>;
+               mantix,tp-rstn-gpios = <&gpio1 24 GPIO_ACTIVE_LOW>;
+
+               port {
+                       panel_in: endpoint {
+                               remote-endpoint = <&mipi_dsi_out>;
+                       };
+               };
+       };
+
+       ports {
+               port@1 {
+                       reg = <1>;
+
+                       mipi_dsi_out: endpoint {
+                               remote-endpoint = <&panel_in>;
+                       };
+               };
+       };
+};
+
+&pgc_gpu {
+       power-supply = <&buck3_reg>;
+};
+
+&pgc_mipi {
+       power-supply = <&ldo5_reg>;
+};
+
+&pgc_vpu {
+       power-supply = <&buck4_reg>;
+};
+
+&pwm1 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_haptic>;
+       status = "okay";
+};
+
+&pwm2 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_led_b>;
+       status = "okay";
+};
+
+&pwm3 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_led_r>;
+       status = "okay";
+};
+
+&pwm4 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_led_g>;
+       status = "okay";
+};
+
+&sai2 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_sai2>;
+       assigned-clocks = <&clk IMX8MQ_CLK_SAI2>;
+       assigned-clock-parents = <&clk IMX8MQ_AUDIO_PLL1_OUT>;
+       assigned-clock-rates = <24576000>;
+       status = "okay";
+};
+
+&sai6 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_sai6>;
+       assigned-clocks = <&clk IMX8MQ_CLK_SAI6>;
+       assigned-clock-parents = <&clk IMX8MQ_AUDIO_PLL1_OUT>;
+       assigned-clock-rates = <24576000>;
+       fsl,sai-synchronous-rx;
+       status = "okay";
+};
+
+&snvs_pwrkey {
+       status = "okay";
+};
+
+&snvs_rtc {
+       status = "disabled";
+};
+
+&uart1 { /* console */
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_uart1>;
+       status = "okay";
+};
+
+&uart2 { /* TPS - GPS - DEBUG */
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_uart2>;
+       status = "okay";
+
+       gnss {
+               compatible = "globaltop,pa6h";
+               vcc-supply = <&reg_gnss>;
+               current-speed = <9600>;
+       };
+};
+
+&uart3 { /* SMC */
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_uart3>;
+       status = "okay";
+};
+
+&uart4 { /* BT */
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_uart4>;
+       uart-has-rtscts;
+       status = "okay";
+};
+
+&usb3_phy0 {
+       status = "okay";
+};
+
+&usb3_phy1 {
+       vbus-supply = <&reg_hub>;
+       status = "okay";
+};
+
+&usb_dwc3_0 {
+       #address-cells = <1>;
+       #size-cells = <0>;
+       dr_mode = "otg";
+       snps,dis_u3_susphy_quirk;
+       status = "okay";
+
+       port@0 {
+               reg = <0>;
+
+               typec_hs: endpoint {
+                       remote-endpoint = <&usb_con_hs>;
+               };
+       };
+
+       port@1 {
+               reg = <1>;
+
+               typec_ss: endpoint {
+                       remote-endpoint = <&usb_con_ss>;
+               };
+       };
+};
+
+&usb_dwc3_1 {
+       dr_mode = "host";
+       status = "okay";
+       #address-cells = <1>;
+       #size-cells = <0>;
+
+       /* Microchip USB2642 */
+       hub@1 {
+               compatible = "usb424,2640";
+               reg = <1>;
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               mass-storage@1 {
+                       compatible = "usb424,4041";
+                       reg = <1>;
+               };
+       };
+};
+
+&usdhc1 {
+       assigned-clocks = <&clk IMX8MQ_CLK_USDHC1>;
+       assigned-clock-rates = <400000000>;
+       pinctrl-names = "default", "state_100mhz", "state_200mhz";
+       pinctrl-0 = <&pinctrl_usdhc1>;
+       pinctrl-1 = <&pinctrl_usdhc1_100mhz>;
+       pinctrl-2 = <&pinctrl_usdhc1_200mhz>;
+       bus-width = <8>;
+       vmmc-supply = <&reg_vdd_3v3>;
+       power-supply = <&reg_vdd_1v8>;
+       non-removable;
+       status = "okay";
+};
+
+&usdhc2 {
+       assigned-clocks = <&clk IMX8MQ_CLK_USDHC2>;
+       assigned-clock-rates = <200000000>;
+       pinctrl-names = "default", "state_100mhz", "state_200mhz";
+       pinctrl-0 = <&pinctrl_usdhc2>;
+       pinctrl-1 = <&pinctrl_usdhc2_100mhz>;
+       pinctrl-2 = <&pinctrl_usdhc2_200mhz>;
+       bus-width = <4>;
+       vmmc-supply = <&reg_wifi_3v3>;
+       mmc-pwrseq = <&usdhc2_pwrseq>;
+       post-power-on-delay-ms = <1000>;
+       cd-gpios = <&gpio2 12 GPIO_ACTIVE_LOW>;
+       max-frequency = <50000000>;
+       disable-wp;
+       cap-sdio-irq;
+       keep-power-in-suspend;
+       wakeup-source;
+       status = "okay";
+};
+
+&wdog1 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_wdog>;
+       fsl,ext-reset-output;
+       status = "okay";
+};
diff --git a/arch/arm/dts/imxrt1170-evk-u-boot.dtsi b/arch/arm/dts/imxrt1170-evk-u-boot.dtsi
new file mode 100644 (file)
index 0000000..88ff986
--- /dev/null
@@ -0,0 +1,94 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause)
+/*
+ * Copyright (C) 2022
+ * Author(s): Jesse Taube <Mr.Bossman075@gmail.com>
+ * Giulio Benetti <giulio.benetti@benettiengineering.com>
+ */
+
+/ {
+       chosen {
+               u-boot,dm-spl;
+       };
+
+       clocks {
+               u-boot,dm-spl;
+       };
+
+       soc {
+               u-boot,dm-spl;
+       };
+};
+
+&osc {
+       u-boot,dm-spl;
+};
+
+&rcosc16M {
+       u-boot,dm-spl;
+};
+
+&osc32k {
+       u-boot,dm-spl;
+};
+
+&clks {
+       u-boot,dm-spl;
+};
+
+&gpio1 {
+       u-boot,dm-spl;
+};
+
+&gpio2 {
+       u-boot,dm-spl;
+};
+
+&gpio3 {
+       u-boot,dm-spl;
+};
+
+&gpio4 {
+       u-boot,dm-spl;
+};
+
+&gpio5 {
+       u-boot,dm-spl;
+};
+
+&gpt1 {
+       u-boot,dm-spl;
+};
+
+&lpuart1 { /* console */
+       u-boot,dm-spl;
+};
+
+&semc {
+       u-boot,dm-spl;
+
+       bank1: bank@0 {
+               u-boot,dm-spl;
+       };
+};
+
+&iomuxc {
+       u-boot,dm-spl;
+
+       imxrt1170-evk {
+               u-boot,dm-spl;
+               pinctrl_lpuart1: lpuart1grp {
+                       u-boot,dm-spl;
+               };
+
+               pinctrl_usdhc0: usdhc0grp {
+                       u-boot,dm-spl;
+               };
+               pinctrl_semc: semcgrp {
+                       u-boot,dm-spl;
+               };
+       };
+};
+
+&usdhc1 {
+       u-boot,dm-spl;
+};
diff --git a/arch/arm/dts/imxrt1170-evk.dts b/arch/arm/dts/imxrt1170-evk.dts
new file mode 100644 (file)
index 0000000..c2fd0c0
--- /dev/null
@@ -0,0 +1,250 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause)
+/*
+ * Copyright (C) 2022
+ * Author(s): Jesse Taube <Mr.Bossman075@gmail.com>
+ * Giulio Benetti <giulio.benetti@benettiengineering.com>
+ */
+
+/dts-v1/;
+#include "imxrt1170.dtsi"
+#include "imxrt1170-evk-u-boot.dtsi"
+#include "imxrt1170-pinfunc.h"
+
+/ {
+       model = "NXP imxrt1170-evk board";
+       compatible = "fsl,imxrt1170-evk", "fsl,imxrt1170";
+
+       chosen {
+               stdout-path = "serial0:115200n8";
+               tick-timer = &gpt1;
+       };
+
+       memory {
+               device_type = "memory";
+               reg = <0x20240000 0xf0000 0x80000000 0x4000000>;
+
+               ocram: ocram@20240000 {
+                       device_type = "memory";
+                       reg = <0x20240000 0xf0000>;
+               };
+
+               sdram: sdram@80000000 {
+                       device_type = "memory";
+                       reg = <0x80000000 0x4000000>;
+               };
+       };
+};
+
+&lpuart1 { /* console */
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_lpuart1>;
+       status = "okay";
+};
+
+&semc {
+       /*
+        * Memory configuration from sdram datasheet IS42S16160J-6BLI
+        */
+       fsl,sdram-mux = /bits/ 8 <MUX_A8_SDRAM_A8
+                               0
+                               0
+                               0
+                               0
+                               0>;
+       fsl,sdram-control = /bits/ 8 <MEM_WIDTH_32BITS
+                                       BL_8
+                                       COL_9BITS
+                                       CL_3>;
+       fsl,sdram-timing = /bits/ 8 <0x2
+                                    0x2
+                                    0xd
+                                    0x0
+                                    0x8
+                                    0x7
+
+                                    0x0d
+                                    0x0b
+                                    0x00
+                                    0x00
+
+                                    0x00
+                                    0x0A
+                                    0x08
+                                    0x09>;
+
+       bank1: bank@0 {
+               fsl,base-address = <0x80000000>;
+               fsl,memory-size = <MEM_SIZE_64M>;
+       };
+};
+
+&iomuxc {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_lpuart1>;
+
+       imxrt1170-evk {
+               pinctrl_lpuart1: lpuart1grp {
+                       fsl,pins = <
+                               IOMUXC_GPIO_AD_24_LPUART1_TXD 0xf1
+                               IOMUXC_GPIO_AD_25_LPUART1_RXD 0xf1
+                       >;
+               };
+
+               pinctrl_usdhc0: usdhc0grp {
+                       fsl,pins = <
+                               IOMUXC_GPIO_AD_32_USDHC1_CD_B
+                                       0x1B000
+                               IOMUXC_GPIO_AD_34_USDHC1_VSELECT
+                                       0xB069
+                               IOMUXC_GPIO_SD_B1_00_USDHC1_CMD
+                                       0x17061
+                               IOMUXC_GPIO_SD_B1_01_USDHC1_CLK
+                                       0x17061
+                               IOMUXC_GPIO_SD_B1_05_USDHC1_DATA3
+                                       0x17061
+                               IOMUXC_GPIO_SD_B1_04_USDHC1_DATA2
+                                       0x17061
+                               IOMUXC_GPIO_SD_B1_03_USDHC1_DATA1
+                                       0x17061
+                               IOMUXC_GPIO_SD_B1_02_USDHC1_DATA0
+                                       0x17061
+                       >;
+               };
+               pinctrl_semc: semcgrp {
+                       fsl,pins = <
+                               IOMUXC_GPIO_EMC_B1_00_SEMC_DATA00
+                                       8       /* SEMC_D0 */
+                               IOMUXC_GPIO_EMC_B1_01_SEMC_DATA01
+                                       8       /* SEMC_D1 */
+                               IOMUXC_GPIO_EMC_B1_02_SEMC_DATA02
+                                       8       /* SEMC_D2 */
+                               IOMUXC_GPIO_EMC_B1_03_SEMC_DATA03
+                                       8       /* SEMC_D3 */
+                               IOMUXC_GPIO_EMC_B1_04_SEMC_DATA04
+                                       8       /* SEMC_D4 */
+                               IOMUXC_GPIO_EMC_B1_05_SEMC_DATA05
+                                       8       /* SEMC_D5 */
+                               IOMUXC_GPIO_EMC_B1_06_SEMC_DATA06
+                                       8       /* SEMC_D6 */
+                               IOMUXC_GPIO_EMC_B1_07_SEMC_DATA07
+                                       8       /* SEMC_D7 */
+                               IOMUXC_GPIO_EMC_B1_08_SEMC_DM00
+                                       8       /* SEMC_DM0 */
+                               IOMUXC_GPIO_EMC_B1_09_SEMC_ADDR00
+                                       8       /* SEMC_A0 */
+                               IOMUXC_GPIO_EMC_B1_10_SEMC_ADDR01
+                                       8       /* SEMC_A1 */
+                               IOMUXC_GPIO_EMC_B1_11_SEMC_ADDR02
+                                       8       /* SEMC_A2 */
+                               IOMUXC_GPIO_EMC_B1_12_SEMC_ADDR03
+                                       8       /* SEMC_A3 */
+                               IOMUXC_GPIO_EMC_B1_13_SEMC_ADDR04
+                                       8       /* SEMC_A4 */
+                               IOMUXC_GPIO_EMC_B1_14_SEMC_ADDR05
+                                       8       /* SEMC_A5 */
+                               IOMUXC_GPIO_EMC_B1_15_SEMC_ADDR06
+                                       8       /* SEMC_A6 */
+                               IOMUXC_GPIO_EMC_B1_16_SEMC_ADDR07
+                                       8       /* SEMC_A7 */
+                               IOMUXC_GPIO_EMC_B1_17_SEMC_ADDR08
+                                       8       /* SEMC_A8 */
+                               IOMUXC_GPIO_EMC_B1_18_SEMC_ADDR09
+                                       8       /* SEMC_A9 */
+                               IOMUXC_GPIO_EMC_B1_19_SEMC_ADDR11
+                                       8       /* SEMC_A11 */
+                               IOMUXC_GPIO_EMC_B1_20_SEMC_ADDR12
+                                       8       /* SEMC_A12 */
+                               IOMUXC_GPIO_EMC_B1_21_SEMC_BA0
+                                       8       /* SEMC_BA0 */
+                               IOMUXC_GPIO_EMC_B1_22_SEMC_BA1
+                                       8       /* SEMC_BA1 */
+                               IOMUXC_GPIO_EMC_B1_23_SEMC_ADDR10
+                                       8       /* SEMC_A10 */
+                               IOMUXC_GPIO_EMC_B1_24_SEMC_CAS
+                                       8       /* SEMC_CAS */
+                               IOMUXC_GPIO_EMC_B1_25_SEMC_RAS
+                                       8       /* SEMC_RAS */
+                               IOMUXC_GPIO_EMC_B1_26_SEMC_CLK
+                                       8       /* SEMC_CLK */
+                               IOMUXC_GPIO_EMC_B1_27_SEMC_CKE
+                                       8       /* SEMC_CKE */
+                               IOMUXC_GPIO_EMC_B1_28_SEMC_WE
+                                       8       /* SEMC_WE */
+                               IOMUXC_GPIO_EMC_B1_29_SEMC_CS0
+                                       8       /* SEMC_CS0 */
+                               IOMUXC_GPIO_EMC_B1_30_SEMC_DATA08
+                                       8       /* SEMC_D8 */
+                               IOMUXC_GPIO_EMC_B1_31_SEMC_DATA09
+                                       8       /* SEMC_D9 */
+                               IOMUXC_GPIO_EMC_B1_32_SEMC_DATA10
+                                       8       /* SEMC_D10 */
+                               IOMUXC_GPIO_EMC_B1_33_SEMC_DATA11
+                                       8       /* SEMC_D11 */
+                               IOMUXC_GPIO_EMC_B1_34_SEMC_DATA12
+                                       8       /* SEMC_D12 */
+                               IOMUXC_GPIO_EMC_B1_35_SEMC_DATA13
+                                       8       /* SEMC_D13 */
+                               IOMUXC_GPIO_EMC_B1_36_SEMC_DATA14
+                                       8       /* SEMC_D14 */
+                               IOMUXC_GPIO_EMC_B1_37_SEMC_DATA15
+                                       8       /* SEMC_D15 */
+                               IOMUXC_GPIO_EMC_B1_08_SEMC_DM00
+                                       8       /* SEMC_DM00 */
+                               IOMUXC_GPIO_EMC_B1_38_SEMC_DM01
+                                       8       /* SEMC_DM01 */
+                               IOMUXC_GPIO_EMC_B2_08_SEMC_DM02
+                                       4       /* SEMC_DM02 */
+                               IOMUXC_GPIO_EMC_B2_17_SEMC_DM03
+                                       8       /* SEMC_DM03 */
+                               IOMUXC_GPIO_EMC_B2_00_SEMC_DATA16
+                                       8       /* SEMC_D16 */
+                               IOMUXC_GPIO_EMC_B2_01_SEMC_DATA17
+                                       8       /* SEMC_D17 */
+                               IOMUXC_GPIO_EMC_B2_02_SEMC_DATA18
+                                       8       /* SEMC_D18 */
+                               IOMUXC_GPIO_EMC_B2_03_SEMC_DATA19
+                                       8       /* SEMC_D19 */
+                               IOMUXC_GPIO_EMC_B2_04_SEMC_DATA20
+                                       8       /* SEMC_D20 */
+                               IOMUXC_GPIO_EMC_B2_05_SEMC_DATA21
+                                       8       /* SEMC_D21 */
+                               IOMUXC_GPIO_EMC_B2_06_SEMC_DATA22
+                                       8       /* SEMC_D22 */
+                               IOMUXC_GPIO_EMC_B2_07_SEMC_DATA23
+                                       8       /* SEMC_D23 */
+                               IOMUXC_GPIO_EMC_B2_09_SEMC_DATA24
+                                       8       /* SEMC_D24 */
+                               IOMUXC_GPIO_EMC_B2_10_SEMC_DATA25
+                                       8       /* SEMC_D25 */
+                               IOMUXC_GPIO_EMC_B2_11_SEMC_DATA26
+                                       4       /* SEMC_D26 */
+                               IOMUXC_GPIO_EMC_B2_12_SEMC_DATA27
+                                       8       /* SEMC_D27 */
+                               IOMUXC_GPIO_EMC_B2_13_SEMC_DATA28
+                                       8       /* SEMC_D28 */
+                               IOMUXC_GPIO_EMC_B2_14_SEMC_DATA29
+                                       8       /* SEMC_D29 */
+                               IOMUXC_GPIO_EMC_B2_15_SEMC_DATA30
+                                       8       /* SEMC_D30 */
+                               IOMUXC_GPIO_EMC_B2_16_SEMC_DATA31
+                                       8       /* SEMC_D31 */
+                               IOMUXC_GPIO_EMC_B1_39_SEMC_DQS
+                                       (IMX_PAD_SION | 8)      /* SEMC_DQS */
+                       >;
+               };
+       };
+};
+
+&gpt1 {
+       status = "okay";
+};
+
+&usdhc1 {
+       pinctrl-names = "default", "state_100mhz", "state_200mhz", "sleep";
+       pinctrl-0 = <&pinctrl_usdhc0>;
+       pinctrl-1 = <&pinctrl_usdhc0>;
+       pinctrl-2 = <&pinctrl_usdhc0>;
+       pinctrl-3 = <&pinctrl_usdhc0>;
+       status = "okay";
+       broken-cd;
+};
diff --git a/arch/arm/dts/imxrt1170-pinfunc.h b/arch/arm/dts/imxrt1170-pinfunc.h
new file mode 100644 (file)
index 0000000..fba5483
--- /dev/null
@@ -0,0 +1,1561 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
+/*
+ * Copyright (C) 2021
+ * Author(s): Jesse Taube <Mr.Bossman075@gmail.com>
+ */
+
+#ifndef _DT_BINDINGS_PINCTRL_IMXRT1170_PINFUNC_H
+#define _DT_BINDINGS_PINCTRL_IMXRT1170_PINFUNC_H
+
+#define IMX_PAD_SION           0x40000000
+
+/*
+ * The pin function ID is a tuple of
+ * <mux_reg conf_reg input_reg mux_mode input_val>
+ */
+
+#define IOMUXC_GPIO_LPSR_00_FLEXCAN3_TX                                0x000 0x040 0x0 0x0 0x0
+#define IOMUXC_GPIO_LPSR_00_MIC_CLK                            0x000 0x040 0x0 0x1 0x0
+#define IOMUXC_GPIO_LPSR_00_MQS_RIGHT                          0x000 0x040 0x0 0x2 0x0
+#define IOMUXC_GPIO_LPSR_00_ARM_CM4_EVENTO                     0x000 0x040 0x0 0x3 0x0
+#define IOMUXC_GPIO_LPSR_00_GPIO_MUX6_IO00                     0x000 0x040 0x0 0x5 0x0
+#define IOMUXC_GPIO_LPSR_00_LPUART12_TXD                       0x000 0x040 0x0B0 0x6 0x0
+#define IOMUXC_GPIO_LPSR_00_SAI4_MCLK                          0x000 0x040 0x0C8 0x7 0x0
+#define IOMUXC_GPIO_LPSR_00_GPIO12_IO00                                0x000 0x040 0x0 0xA 0x0
+
+#define IOMUXC_GPIO_LPSR_01_FLEXCAN3_RX                                0x004 0x044 0x080 0x0 0x0
+#define IOMUXC_GPIO_LPSR_01_MIC_BITSTREAM0                     0x004 0x044 0x0B4 0x1 0x0
+#define IOMUXC_GPIO_LPSR_01_MQS_LEFT                           0x004 0x044 0x0 0x2 0x0
+#define IOMUXC_GPIO_LPSR_01_ARM_CM4_EVENTI                     0x004 0x044 0x0 0x3 0x0
+#define IOMUXC_GPIO_LPSR_01_GPIO_MUX6_IO01                     0x004 0x044 0x0 0x5 0x0
+#define IOMUXC_GPIO_LPSR_01_LPUART12_RXD                       0x004 0x044 0x0AC 0x6 0x0
+#define IOMUXC_GPIO_LPSR_01_GPIO12_IO01                                0x004 0x044 0x0 0xA 0x0
+
+#define IOMUXC_GPIO_LPSR_02_GPIO12_IO02                                0x008 0x048 0x0 0xA 0x0
+#define IOMUXC_GPIO_LPSR_02_SRC_BOOT_MODE00                    0x008 0x048 0x0 0x0 0x0
+#define IOMUXC_GPIO_LPSR_02_LPSPI5_SCK                         0x008 0x048 0x098 0x1 0x0
+#define IOMUXC_GPIO_LPSR_02_SAI4_TX_DATA                       0x008 0x048 0x0 0x2 0x0
+#define IOMUXC_GPIO_LPSR_02_MQS_RIGHT                          0x008 0x048 0x0 0x3 0x0
+#define IOMUXC_GPIO_LPSR_02_GPIO_MUX6_IO02                     0x008 0x048 0x0 0x5 0x0
+
+#define IOMUXC_GPIO_LPSR_03_SRC_BOOT_MODE01                    0x00C 0x04C 0x0 0x0 0x0
+#define IOMUXC_GPIO_LPSR_03_LPSPI5_PCS0                                0x00C 0x04C 0x094 0x1 0x0
+#define IOMUXC_GPIO_LPSR_03_SAI4_TX_SYNC                       0x00C 0x04C 0x0DC 0x2 0x0
+#define IOMUXC_GPIO_LPSR_03_MQS_LEFT                           0x00C 0x04C 0x0 0x3 0x0
+#define IOMUXC_GPIO_LPSR_03_GPIO_MUX6_IO03                     0x00C 0x04C 0x0 0x5 0x0
+#define IOMUXC_GPIO_LPSR_03_GPIO12_IO03                                0x00C 0x04C 0x0 0xA 0x0
+
+#define IOMUXC_GPIO_LPSR_04_LPI2C5_SDA                         0x010 0x050 0x088 0x0 0x0
+#define IOMUXC_GPIO_LPSR_04_LPSPI5_SOUT                                0x010 0x050 0x0A0 0x1 0x0
+#define IOMUXC_GPIO_LPSR_04_SAI4_TX_BCLK                       0x010 0x050 0x0D8 0x2 0x0
+#define IOMUXC_GPIO_LPSR_04_LPUART12_RTS_B                     0x010 0x050 0x0 0x3 0x0
+#define IOMUXC_GPIO_LPSR_04_GPIO_MUX6_IO04                     0x010 0x050 0x0 0x5 0x0
+#define IOMUXC_GPIO_LPSR_04_LPUART11_TXD                       0x010 0x050 0x0A8 0x6 0x0
+#define IOMUXC_GPIO_LPSR_04_GPIO12_IO04                                0x010 0x050 0x0 0xA 0x0
+
+#define IOMUXC_GPIO_LPSR_05_GPIO12_IO05                                0x014 0x054 0x0 0xA 0x0
+#define IOMUXC_GPIO_LPSR_05_LPI2C5_SCL                         0x014 0x054 0x084 0x0 0x0
+#define IOMUXC_GPIO_LPSR_05_LPSPI5_SIN                         0x014 0x054 0x09C 0x1 0x0
+#define IOMUXC_GPIO_LPSR_05_SAI4_MCLK                          0x014 0x054 0x0C8 0x2 0x1
+#define IOMUXC_GPIO_LPSR_05_LPUART12_CTS_B                     0x014 0x054 0x0 0x3 0x0
+#define IOMUXC_GPIO_LPSR_05_GPIO_MUX6_IO05                     0x014 0x054 0x0 0x5 0x0
+#define IOMUXC_GPIO_LPSR_05_LPUART11_RXD                       0x014 0x054 0x0A4 0x6 0x0
+#define IOMUXC_GPIO_LPSR_05_NMI_GLUE_NMI                       0x014 0x054 0x0C4 0x7 0x0
+
+#define IOMUXC_GPIO_LPSR_06_LPI2C6_SDA                         0x018 0x058 0x090 0x0 0x0
+#define IOMUXC_GPIO_LPSR_06_SAI4_RX_DATA                       0x018 0x058 0x0D0 0x2 0x0
+#define IOMUXC_GPIO_LPSR_06_LPUART12_TXD                       0x018 0x058 0x0B0 0x3 0x1
+#define IOMUXC_GPIO_LPSR_06_LPSPI6_PCS3                                0x018 0x058 0x0 0x4 0x0
+#define IOMUXC_GPIO_LPSR_06_GPIO_MUX6_IO06                     0x018 0x058 0x0 0x5 0x0
+#define IOMUXC_GPIO_LPSR_06_FLEXCAN3_TX                                0x018 0x058 0x0 0x6 0x0
+#define IOMUXC_GPIO_LPSR_06_PIT2_TRIGGER3                      0x018 0x058 0x0 0x7 0x0
+#define IOMUXC_GPIO_LPSR_06_LPSPI5_PCS1                                0x018 0x058 0x0 0x8 0x0
+#define IOMUXC_GPIO_LPSR_06_GPIO12_IO06                                0x018 0x058 0x0 0xA 0x0
+
+#define IOMUXC_GPIO_LPSR_07_LPI2C6_SCL                         0x01C 0x05C 0x08C 0x0 0x0
+#define IOMUXC_GPIO_LPSR_07_SAI4_RX_BCLK                       0x01C 0x05C 0x0CC 0x2 0x0
+#define IOMUXC_GPIO_LPSR_07_LPUART12_RXD                       0x01C 0x05C 0x0AC 0x3 0x1
+#define IOMUXC_GPIO_LPSR_07_LPSPI6_PCS2                                0x01C 0x05C 0x0 0x4 0x0
+#define IOMUXC_GPIO_LPSR_07_GPIO_MUX6_IO07                     0x01C 0x05C 0x0 0x5 0x0
+#define IOMUXC_GPIO_LPSR_07_FLEXCAN3_RX                                0x01C 0x05C 0x080 0x6 0x1
+#define IOMUXC_GPIO_LPSR_07_PIT2_TRIGGER2                      0x01C 0x05C 0x0 0x7 0x0
+#define IOMUXC_GPIO_LPSR_07_LPSPI5_PCS2                                0x01C 0x05C 0x0 0x8 0x0
+#define IOMUXC_GPIO_LPSR_07_GPIO12_IO07                                0x01C 0x05C 0x0 0xA 0x0
+
+#define IOMUXC_GPIO_LPSR_08_GPIO12_IO08                                0x020 0x060 0x0 0xA 0x0
+#define IOMUXC_GPIO_LPSR_08_LPUART11_TXD                       0x020 0x060 0x0A8 0x0 0x1
+#define IOMUXC_GPIO_LPSR_08_FLEXCAN3_TX                                0x020 0x060 0x0 0x1 0x0
+#define IOMUXC_GPIO_LPSR_08_SAI4_RX_SYNC                       0x020 0x060 0x0D4 0x2 0x0
+#define IOMUXC_GPIO_LPSR_08_MIC_CLK                            0x020 0x060 0x0 0x3 0x0
+#define IOMUXC_GPIO_LPSR_08_LPSPI6_PCS1                                0x020 0x060 0x0 0x4 0x0
+#define IOMUXC_GPIO_LPSR_08_GPIO_MUX6_IO08                     0x020 0x060 0x0 0x5 0x0
+#define IOMUXC_GPIO_LPSR_08_LPI2C5_SDA                         0x020 0x060 0x088 0x6 0x1
+#define IOMUXC_GPIO_LPSR_08_PIT2_TRIGGER1                      0x020 0x060 0x0 0x7 0x0
+#define IOMUXC_GPIO_LPSR_08_LPSPI5_PCS3                                0x020 0x060 0x0 0x8 0x0
+
+#define IOMUXC_GPIO_LPSR_09_GPIO12_IO09                                0x024 0x064 0x0 0xA 0x0
+#define IOMUXC_GPIO_LPSR_09_LPUART11_RXD                       0x024 0x064 0x0A4 0x0 0x1
+#define IOMUXC_GPIO_LPSR_09_FLEXCAN3_RX                                0x024 0x064 0x080 0x1 0x2
+#define IOMUXC_GPIO_LPSR_09_PIT2_TRIGGER0                      0x024 0x064 0x0 0x2 0x0
+#define IOMUXC_GPIO_LPSR_09_MIC_BITSTREAM0                     0x024 0x064 0x0B4 0x3 0x1
+#define IOMUXC_GPIO_LPSR_09_LPSPI6_PCS0                                0x024 0x064 0x0 0x4 0x0
+#define IOMUXC_GPIO_LPSR_09_GPIO_MUX6_IO09                     0x024 0x064 0x0 0x5 0x0
+#define IOMUXC_GPIO_LPSR_09_LPI2C5_SCL                         0x024 0x064 0x084 0x6 0x1
+#define IOMUXC_GPIO_LPSR_09_SAI4_TX_DATA                       0x024 0x064 0x0 0x7 0x0
+
+#define IOMUXC_GPIO_LPSR_10_GPIO12_IO10                                0x028 0x068 0x0 0xA 0x0
+#define IOMUXC_GPIO_LPSR_10_JTAG_MUX_TRSTB                     0x028 0x068 0x0 0x0 0x0
+#define IOMUXC_GPIO_LPSR_10_LPUART11_CTS_B                     0x028 0x068 0x0 0x1 0x0
+#define IOMUXC_GPIO_LPSR_10_LPI2C6_SDA                         0x028 0x068 0x090 0x2 0x1
+#define IOMUXC_GPIO_LPSR_10_MIC_BITSTREAM1                     0x028 0x068 0x0B8 0x3 0x0
+#define IOMUXC_GPIO_LPSR_10_LPSPI6_SCK                         0x028 0x068 0x0 0x4 0x0
+#define IOMUXC_GPIO_LPSR_10_GPIO_MUX6_IO10                     0x028 0x068 0x0 0x5 0x0
+#define IOMUXC_GPIO_LPSR_10_LPI2C5_SCLS                                0x028 0x068 0x0 0x6 0x0
+#define IOMUXC_GPIO_LPSR_10_SAI4_TX_SYNC                       0x028 0x068 0x0DC 0x7 0x1
+#define IOMUXC_GPIO_LPSR_10_LPUART12_TXD                       0x028 0x068 0x0B0 0x8 0x2
+
+#define IOMUXC_GPIO_LPSR_11_JTAG_MUX_TDO                       0x02C 0x06C 0x0 0x0 0x0
+#define IOMUXC_GPIO_LPSR_11_LPUART11_RTS_B                     0x02C 0x06C 0x0 0x1 0x0
+#define IOMUXC_GPIO_LPSR_11_LPI2C6_SCL                         0x02C 0x06C 0x08C 0x2 0x1
+#define IOMUXC_GPIO_LPSR_11_MIC_BITSTREAM2                     0x02C 0x06C 0x0BC 0x3 0x0
+#define IOMUXC_GPIO_LPSR_11_LPSPI6_SOUT                                0x02C 0x06C 0x0 0x4 0x0
+#define IOMUXC_GPIO_LPSR_11_GPIO_MUX6_IO11                     0x02C 0x06C 0x0 0x5 0x0
+#define IOMUXC_GPIO_LPSR_11_LPI2C5_SDAS                                0x02C 0x06C 0x0 0x6 0x0
+#define IOMUXC_GPIO_LPSR_11_ARM_TRACE_SWO                      0x02C 0x06C 0x0 0x7 0x0
+#define IOMUXC_GPIO_LPSR_11_LPUART12_RXD                       0x02C 0x06C 0x0AC 0x8 0x2
+#define IOMUXC_GPIO_LPSR_11_GPIO12_IO11                                0x02C 0x06C 0x0 0xA 0x0
+
+#define IOMUXC_GPIO_LPSR_12_GPIO12_IO12                                0x030 0x070 0x0 0xA 0x0
+#define IOMUXC_GPIO_LPSR_12_JTAG_MUX_TDI                       0x030 0x070 0x0 0x0 0x0
+#define IOMUXC_GPIO_LPSR_12_PIT2_TRIGGER0                      0x030 0x070 0x0 0x1 0x0
+#define IOMUXC_GPIO_LPSR_12_MIC_BITSTREAM3                     0x030 0x070 0x0C0 0x3 0x0
+#define IOMUXC_GPIO_LPSR_12_LPSPI6_SIN                         0x030 0x070 0x0 0x4 0x0
+#define IOMUXC_GPIO_LPSR_12_GPIO_MUX6_IO12                     0x030 0x070 0x0 0x5 0x0
+#define IOMUXC_GPIO_LPSR_12_LPI2C5_HREQ                                0x030 0x070 0x0 0x6 0x0
+#define IOMUXC_GPIO_LPSR_12_SAI4_TX_BCLK                       0x030 0x070 0x0D8 0x7 0x1
+#define IOMUXC_GPIO_LPSR_12_LPSPI5_SCK                         0x030 0x070 0x098 0x8 0x1
+
+#define IOMUXC_GPIO_LPSR_13_GPIO12_IO13                                0x034 0x074 0x0 0xA 0x0
+#define IOMUXC_GPIO_LPSR_13_JTAG_MUX_MOD                       0x034 0x074 0x0 0x0 0x0
+#define IOMUXC_GPIO_LPSR_13_MIC_BITSTREAM1                     0x034 0x074 0x0B8 0x1 0x1
+#define IOMUXC_GPIO_LPSR_13_PIT2_TRIGGER1                      0x034 0x074 0x0 0x2 0x0
+#define IOMUXC_GPIO_LPSR_13_GPIO_MUX6_IO13                     0x034 0x074 0x0 0x5 0x0
+#define IOMUXC_GPIO_LPSR_13_SAI4_RX_DATA                       0x034 0x074 0x0D0 0x7 0x1
+#define IOMUXC_GPIO_LPSR_13_LPSPI5_PCS0                                0x034 0x074 0x094 0x8 0x1
+
+#define IOMUXC_GPIO_LPSR_14_JTAG_MUX_TCK                       0x038 0x078 0x0 0x0 0x0
+#define IOMUXC_GPIO_LPSR_14_MIC_BITSTREAM2                     0x038 0x078 0x0BC 0x1 0x1
+#define IOMUXC_GPIO_LPSR_14_PIT2_TRIGGER2                      0x038 0x078 0x0 0x2 0x0
+#define IOMUXC_GPIO_LPSR_14_GPIO_MUX6_IO14                     0x038 0x078 0x0 0x5 0x0
+#define IOMUXC_GPIO_LPSR_14_SAI4_RX_BCLK                       0x038 0x078 0x0CC 0x7 0x1
+#define IOMUXC_GPIO_LPSR_14_LPSPI5_SOUT                                0x038 0x078 0x0A0 0x8 0x1
+#define IOMUXC_GPIO_LPSR_14_GPIO12_IO14                                0x038 0x078 0x0 0xA 0x0
+
+#define IOMUXC_GPIO_LPSR_15_GPIO12_IO15                                0x03C 0x07C 0x0 0xA 0x0
+#define IOMUXC_GPIO_LPSR_15_JTAG_MUX_TMS                       0x03C 0x07C 0x0 0x0 0x0
+#define IOMUXC_GPIO_LPSR_15_MIC_BITSTREAM3                     0x03C 0x07C 0x0C0 0x1 0x1
+#define IOMUXC_GPIO_LPSR_15_PIT2_TRIGGER3                      0x03C 0x07C 0x0 0x2 0x0
+#define IOMUXC_GPIO_LPSR_15_GPIO_MUX6_IO15                     0x03C 0x07C 0x0 0x5 0x0
+#define IOMUXC_GPIO_LPSR_15_SAI4_RX_SYNC                       0x03C 0x07C 0x0D4 0x7 0x1
+#define IOMUXC_GPIO_LPSR_15_LPSPI5_SIN                         0x03C 0x07C 0x09C 0x8 0x1
+
+#define IOMUXC_WAKEUP_DIG_GPIO13_IO00                          0x40C94000 0x40C94040 0x0 0x5 0x0
+#define IOMUXC_WAKEUP_DIG_NMI_GLUE_NMI                         0x40C94000 0x40C94040 0x0C4 0x7 0x1
+
+#define IOMUXC_PMIC_ON_REQ_DIG_SNVS_LP_PMIC_ON_REQ             0x40C94004 0x40C94044 0x0 0x0 0x0
+#define IOMUXC_PMIC_ON_REQ_DIG_GPIO13_IO01                     0x40C94004 0x40C94044 0x0 0x5 0x0
+
+#define IOMUXC_PMIC_STBY_REQ_DIG_CCM_PMIC_VSTBY_REQ            0x40C94008 0x40C94048 0x0 0x0 0x0
+#define IOMUXC_PMIC_STBY_REQ_DIG_GPIO13_IO02                   0x40C94008 0x40C94048 0x0 0x5 0x0
+
+#define IOMUXC_GPIO_SNVS_00_DIG_SNVS_TAMPER0                   0x40C9400C 0x40C9404C 0x0 0x0 0x0
+#define IOMUXC_GPIO_SNVS_00_DIG_GPIO13_IO03                    0x40C9400C 0x40C9404C 0x0 0x5 0x0
+
+#define IOMUXC_GPIO_SNVS_01_DIG_SNVS_TAMPER1                   0x40C94010 0x40C94050 0x0 0x0 0x0
+#define IOMUXC_GPIO_SNVS_01_DIG_GPIO13_IO04                    0x40C94010 0x40C94050 0x0 0x5 0x0
+
+#define IOMUXC_GPIO_SNVS_02_DIG_SNVS_TAMPER2                   0x40C94014 0x40C94054 0x0 0x0 0x0
+#define IOMUXC_GPIO_SNVS_02_DIG_GPIO13_IO05                    0x40C94014 0x40C94054 0x0 0x5 0x0
+
+#define IOMUXC_GPIO_SNVS_03_DIG_SNVS_TAMPER3                   0x40C94018 0x40C94058 0x0 0x0 0x0
+#define IOMUXC_GPIO_SNVS_03_DIG_GPIO13_IO06                    0x40C94018 0x40C94058 0x0 0x5 0x0
+
+#define IOMUXC_GPIO_SNVS_04_DIG_SNVS_TAMPER4                   0x40C9401C 0x40C9405C 0x0 0x0 0x0
+#define IOMUXC_GPIO_SNVS_04_DIG_GPIO13_IO07                    0x40C9401C 0x40C9405C 0x0 0x5 0x0
+
+#define IOMUXC_GPIO_SNVS_05_DIG_SNVS_TAMPER5                   0x40C94020 0x40C94060 0x0 0x0 0x0
+#define IOMUXC_GPIO_SNVS_05_DIG_GPIO13_IO08                    0x40C94020 0x40C94060 0x0 0x5 0x0
+
+#define IOMUXC_GPIO_SNVS_06_DIG_SNVS_TAMPER6                   0x40C94024 0x40C94064 0x0 0x0 0x0
+#define IOMUXC_GPIO_SNVS_06_DIG_GPIO13_IO09                    0x40C94024 0x40C94064 0x0 0x5 0x0
+
+#define IOMUXC_GPIO_SNVS_07_DIG_SNVS_TAMPER7                   0x40C94028 0x40C94068 0x0 0x0 0x0
+#define IOMUXC_GPIO_SNVS_07_DIG_GPIO13_IO10                    0x40C94028 0x40C94068 0x0 0x5 0x0
+
+#define IOMUXC_GPIO_SNVS_08_DIG_SNVS_TAMPER8                   0x40C9402C 0x40C9406C 0x0 0x0 0x0
+#define IOMUXC_GPIO_SNVS_08_DIG_GPIO13_IO11                    0x40C9402C 0x40C9406C 0x0 0x5 0x0
+
+#define IOMUXC_GPIO_SNVS_09_DIG_SNVS_TAMPER9                   0x40C94030 0x40C94070 0x0 0x0 0x0
+#define IOMUXC_GPIO_SNVS_09_DIG_GPIO13_IO12                    0x40C94030 0x40C94070 0x0 0x5 0x0
+
+#define IOMUXC_TEST_MODE_DIG                                   0x0 0x40C94034 0x0 0x0 0x0
+
+#define IOMUXC_POR_B_DIG                                       0x0 0x40C94038 0x0 0x0 0x0
+
+#define IOMUXC_ONOFF_DIG                                       0x0 0x40C9403C 0x0 0x0 0x0
+
+#define IOMUXC_GPIO_EMC_B1_00_SEMC_DATA00                      0x010 0x254 0x0 0x0 0x0
+#define IOMUXC_GPIO_EMC_B1_00_FLEXPWM4_PWM0_A                  0x010 0x254 0x0 0x1 0x0
+#define IOMUXC_GPIO_EMC_B1_00_GPIO_MUX1_IO00                   0x010 0x254 0x0 0x5 0x0
+#define IOMUXC_GPIO_EMC_B1_00_FLEXIO1_D00                      0x010 0x254 0x0 0x8 0x0
+#define IOMUXC_GPIO_EMC_B1_00_GPIO7_IO00                       0x010 0x254 0x0 0xA 0x0
+
+#define IOMUXC_GPIO_EMC_B1_01_GPIO7_IO01                       0x014 0x258 0x0 0xA 0x0
+#define IOMUXC_GPIO_EMC_B1_01_SEMC_DATA01                      0x014 0x258 0x0 0x0 0x0
+#define IOMUXC_GPIO_EMC_B1_01_FLEXPWM4_PWM0_B                  0x014 0x258 0x0 0x1 0x0
+#define IOMUXC_GPIO_EMC_B1_01_GPIO_MUX1_IO01                   0x014 0x258 0x0 0x5 0x0
+#define IOMUXC_GPIO_EMC_B1_01_FLEXIO1_D01                      0x014 0x258 0x0 0x8 0x0
+
+#define IOMUXC_GPIO_EMC_B1_02_SEMC_DATA02                      0x018 0x25C 0x0 0x0 0x0
+#define IOMUXC_GPIO_EMC_B1_02_FLEXPWM4_PWM1_A                  0x018 0x25C 0x0 0x1 0x0
+#define IOMUXC_GPIO_EMC_B1_02_GPIO_MUX1_IO02                   0x018 0x25C 0x0 0x5 0x0
+#define IOMUXC_GPIO_EMC_B1_02_FLEXIO1_D02                      0x018 0x25C 0x0 0x8 0x0
+#define IOMUXC_GPIO_EMC_B1_02_GPIO7_IO02                       0x018 0x25C 0x0 0xA 0x0
+
+#define IOMUXC_GPIO_EMC_B1_03_SEMC_DATA03                      0x01C 0x260 0x0 0x0 0x0
+#define IOMUXC_GPIO_EMC_B1_03_FLEXPWM4_PWM1_B                  0x01C 0x260 0x0 0x1 0x0
+#define IOMUXC_GPIO_EMC_B1_03_GPIO_MUX1_IO03                   0x01C 0x260 0x0 0x5 0x0
+#define IOMUXC_GPIO_EMC_B1_03_FLEXIO1_D03                      0x01C 0x260 0x0 0x8 0x0
+#define IOMUXC_GPIO_EMC_B1_03_GPIO7_IO03                       0x01C 0x260 0x0 0xA 0x0
+
+#define IOMUXC_GPIO_EMC_B1_04_GPIO7_IO04                       0x020 0x264 0x0 0xA 0x0
+#define IOMUXC_GPIO_EMC_B1_04_SEMC_DATA04                      0x020 0x264 0x0 0x0 0x0
+#define IOMUXC_GPIO_EMC_B1_04_FLEXPWM4_PWM2_A                  0x020 0x264 0x0 0x1 0x0
+#define IOMUXC_GPIO_EMC_B1_04_GPIO_MUX1_IO04                   0x020 0x264 0x0 0x5 0x0
+#define IOMUXC_GPIO_EMC_B1_04_FLEXIO1_D04                      0x020 0x264 0x0 0x8 0x0
+
+#define IOMUXC_GPIO_EMC_B1_05_SEMC_DATA05                      0x024 0x268 0x0 0x0 0x0
+#define IOMUXC_GPIO_EMC_B1_05_FLEXPWM4_PWM2_B                  0x024 0x268 0x0 0x1 0x0
+#define IOMUXC_GPIO_EMC_B1_05_GPIO_MUX1_IO05                   0x024 0x268 0x0 0x5 0x0
+#define IOMUXC_GPIO_EMC_B1_05_FLEXIO1_D05                      0x024 0x268 0x0 0x8 0x0
+#define IOMUXC_GPIO_EMC_B1_05_GPIO7_IO05                       0x024 0x268 0x0 0xA 0x0
+
+#define IOMUXC_GPIO_EMC_B1_06_SEMC_DATA06                      0x028 0x26C 0x0 0x0 0x0
+#define IOMUXC_GPIO_EMC_B1_06_FLEXPWM2_PWM0_A                  0x028 0x26C 0x518 0x1 0x0
+#define IOMUXC_GPIO_EMC_B1_06_GPIO_MUX1_IO06                   0x028 0x26C 0x0 0x5 0x0
+#define IOMUXC_GPIO_EMC_B1_06_FLEXIO1_D06                      0x028 0x26C 0x0 0x8 0x0
+#define IOMUXC_GPIO_EMC_B1_06_GPIO7_IO06                       0x028 0x26C 0x0 0xA 0x0
+
+#define IOMUXC_GPIO_EMC_B1_07_GPIO7_IO07                       0x02C 0x270 0x0 0xA 0x0
+#define IOMUXC_GPIO_EMC_B1_07_SEMC_DATA07                      0x02C 0x270 0x0 0x0 0x0
+#define IOMUXC_GPIO_EMC_B1_07_FLEXPWM2_PWM0_B                  0x02C 0x270 0x524 0x1 0x0
+#define IOMUXC_GPIO_EMC_B1_07_GPIO_MUX1_IO07                   0x02C 0x270 0x0 0x5 0x0
+#define IOMUXC_GPIO_EMC_B1_07_FLEXIO1_D07                      0x02C 0x270 0x0 0x8 0x0
+
+#define IOMUXC_GPIO_EMC_B1_08_SEMC_DM00                                0x030 0x274 0x0 0x0 0x0
+#define IOMUXC_GPIO_EMC_B1_08_FLEXPWM2_PWM1_A                  0x030 0x274 0x51C 0x1 0x0
+#define IOMUXC_GPIO_EMC_B1_08_GPIO_MUX1_IO08                   0x030 0x274 0x0 0x5 0x0
+#define IOMUXC_GPIO_EMC_B1_08_FLEXIO1_D08                      0x030 0x274 0x0 0x8 0x0
+#define IOMUXC_GPIO_EMC_B1_08_GPIO7_IO08                       0x030 0x274 0x0 0xA 0x0
+
+#define IOMUXC_GPIO_EMC_B1_09_SEMC_ADDR00                      0x034 0x278 0x0 0x0 0x0
+#define IOMUXC_GPIO_EMC_B1_09_FLEXPWM2_PWM1_B                  0x034 0x278 0x528 0x1 0x0
+#define IOMUXC_GPIO_EMC_B1_09_GPT5_CAPTURE1                    0x034 0x278 0x0 0x2 0x0
+#define IOMUXC_GPIO_EMC_B1_09_GPIO_MUX1_IO09                   0x034 0x278 0x0 0x5 0x0
+#define IOMUXC_GPIO_EMC_B1_09_FLEXIO1_D09                      0x034 0x278 0x0 0x8 0x0
+#define IOMUXC_GPIO_EMC_B1_09_GPIO7_IO09                       0x034 0x278 0x0 0xA 0x0
+
+#define IOMUXC_GPIO_EMC_B1_10_SEMC_ADDR01                      0x038 0x27C 0x0 0x0 0x0
+#define IOMUXC_GPIO_EMC_B1_10_FLEXPWM2_PWM2_A                  0x038 0x27C 0x520 0x1 0x0
+#define IOMUXC_GPIO_EMC_B1_10_GPT5_CAPTURE2                    0x038 0x27C 0x0 0x2 0x0
+#define IOMUXC_GPIO_EMC_B1_10_GPIO_MUX1_IO10                   0x038 0x27C 0x0 0x5 0x0
+#define IOMUXC_GPIO_EMC_B1_10_FLEXIO1_D10                      0x038 0x27C 0x0 0x8 0x0
+#define IOMUXC_GPIO_EMC_B1_10_GPIO7_IO10                       0x038 0x27C 0x0 0xA 0x0
+
+#define IOMUXC_GPIO_EMC_B1_11_GPIO7_IO11                       0x03C 0x280 0x0 0xA 0x0
+#define IOMUXC_GPIO_EMC_B1_11_SEMC_ADDR02                      0x03C 0x280 0x0 0x0 0x0
+#define IOMUXC_GPIO_EMC_B1_11_FLEXPWM2_PWM2_B                  0x03C 0x280 0x52C 0x1 0x0
+#define IOMUXC_GPIO_EMC_B1_11_GPT5_COMPARE1                    0x03C 0x280 0x0 0x2 0x0
+#define IOMUXC_GPIO_EMC_B1_11_GPIO_MUX1_IO11                   0x03C 0x280 0x0 0x5 0x0
+#define IOMUXC_GPIO_EMC_B1_11_FLEXIO1_D11                      0x03C 0x280 0x0 0x8 0x0
+
+#define IOMUXC_GPIO_EMC_B1_12_SEMC_ADDR03                      0x040 0x284 0x0 0x0 0x0
+#define IOMUXC_GPIO_EMC_B1_12_XBAR1_INOUT04                    0x040 0x284 0x0 0x1 0x0
+#define IOMUXC_GPIO_EMC_B1_12_GPT5_COMPARE2                    0x040 0x284 0x0 0x2 0x0
+#define IOMUXC_GPIO_EMC_B1_12_GPIO_MUX1_IO12                   0x040 0x284 0x0 0x5 0x0
+#define IOMUXC_GPIO_EMC_B1_12_FLEXIO1_D12                      0x040 0x284 0x0 0x8 0x0
+#define IOMUXC_GPIO_EMC_B1_12_GPIO7_IO12                       0x040 0x284 0x0 0xA 0x0
+
+#define IOMUXC_GPIO_EMC_B1_13_SEMC_ADDR04                      0x044 0x288 0x0 0x0 0x0
+#define IOMUXC_GPIO_EMC_B1_13_XBAR1_INOUT05                    0x044 0x288 0x0 0x1 0x0
+#define IOMUXC_GPIO_EMC_B1_13_GPT5_COMPARE3                    0x044 0x288 0x0 0x2 0x0
+#define IOMUXC_GPIO_EMC_B1_13_GPIO_MUX1_IO13                   0x044 0x288 0x0 0x5 0x0
+#define IOMUXC_GPIO_EMC_B1_13_FLEXIO1_D13                      0x044 0x288 0x0 0x8 0x0
+#define IOMUXC_GPIO_EMC_B1_13_GPIO7_IO13                       0x044 0x288 0x0 0xA 0x0
+
+#define IOMUXC_GPIO_EMC_B1_14_GPIO7_IO14                       0x048 0x28C 0x0 0xA 0x0
+#define IOMUXC_GPIO_EMC_B1_14_SEMC_ADDR05                      0x048 0x28C 0x0 0x0 0x0
+#define IOMUXC_GPIO_EMC_B1_14_XBAR1_INOUT06                    0x048 0x28C 0x0 0x1 0x0
+#define IOMUXC_GPIO_EMC_B1_14_GPT5_CLK                         0x048 0x28C 0x0 0x2 0x0
+#define IOMUXC_GPIO_EMC_B1_14_GPIO_MUX1_IO14                   0x048 0x28C 0x0 0x5 0x0
+#define IOMUXC_GPIO_EMC_B1_14_FLEXIO1_D14                      0x048 0x28C 0x0 0x8 0x0
+
+#define IOMUXC_GPIO_EMC_B1_15_SEMC_ADDR06                      0x04C 0x290 0x0 0x0 0x0
+#define IOMUXC_GPIO_EMC_B1_15_XBAR1_INOUT07                    0x04C 0x290 0x0 0x1 0x0
+#define IOMUXC_GPIO_EMC_B1_15_GPIO_MUX1_IO15                   0x04C 0x290 0x0 0x5 0x0
+#define IOMUXC_GPIO_EMC_B1_15_FLEXIO1_D15                      0x04C 0x290 0x0 0x8 0x0
+#define IOMUXC_GPIO_EMC_B1_15_GPIO7_IO15                       0x04C 0x290 0x0 0xA 0x0
+
+#define IOMUXC_GPIO_EMC_B1_16_SEMC_ADDR07                      0x050 0x294 0x0 0x0 0x0
+#define IOMUXC_GPIO_EMC_B1_16_XBAR1_INOUT08                    0x050 0x294 0x0 0x1 0x0
+#define IOMUXC_GPIO_EMC_B1_16_GPIO_MUX1_IO16                   0x050 0x294 0x0 0x5 0x0
+#define IOMUXC_GPIO_EMC_B1_16_FLEXIO1_D16                      0x050 0x294 0x0 0x8 0x0
+#define IOMUXC_GPIO_EMC_B1_16_GPIO7_IO16                       0x050 0x294 0x0 0xA 0x0
+
+#define IOMUXC_GPIO_EMC_B1_17_GPIO7_IO17                       0x054 0x298 0x0 0xA 0x0
+#define IOMUXC_GPIO_EMC_B1_17_SEMC_ADDR08                      0x054 0x298 0x0 0x0 0x0
+#define IOMUXC_GPIO_EMC_B1_17_FLEXPWM4_PWM3_A                  0x054 0x298 0x0 0x1 0x0
+#define IOMUXC_GPIO_EMC_B1_17_TMR1_TIMER0                      0x054 0x298 0x63C 0x2 0x0
+#define IOMUXC_GPIO_EMC_B1_17_GPIO_MUX1_IO17                   0x054 0x298 0x0 0x5 0x0
+#define IOMUXC_GPIO_EMC_B1_17_FLEXIO1_D17                      0x054 0x298 0x0 0x8 0x0
+
+#define IOMUXC_GPIO_EMC_B1_18_SEMC_ADDR09                      0x058 0x29C 0x0 0x0 0x0
+#define IOMUXC_GPIO_EMC_B1_18_FLEXPWM4_PWM3_B                  0x058 0x29C 0x0 0x1 0x0
+#define IOMUXC_GPIO_EMC_B1_18_TMR2_TIMER0                      0x058 0x29C 0x648 0x2 0x0
+#define IOMUXC_GPIO_EMC_B1_18_GPIO_MUX1_IO18                   0x058 0x29C 0x0 0x5 0x0
+#define IOMUXC_GPIO_EMC_B1_18_FLEXIO1_D18                      0x058 0x29C 0x0 0x8 0x0
+#define IOMUXC_GPIO_EMC_B1_18_GPIO7_IO18                       0x058 0x29C 0x0 0xA 0x0
+
+#define IOMUXC_GPIO_EMC_B1_19_SEMC_ADDR11                      0x05C 0x2A0 0x0 0x0 0x0
+#define IOMUXC_GPIO_EMC_B1_19_FLEXPWM2_PWM3_A                  0x05C 0x2A0 0x0 0x1 0x0
+#define IOMUXC_GPIO_EMC_B1_19_TMR3_TIMER0                      0x05C 0x2A0 0x654 0x2 0x0
+#define IOMUXC_GPIO_EMC_B1_19_GPIO_MUX1_IO19                   0x05C 0x2A0 0x0 0x5 0x0
+#define IOMUXC_GPIO_EMC_B1_19_FLEXIO1_D19                      0x05C 0x2A0 0x0 0x8 0x0
+#define IOMUXC_GPIO_EMC_B1_19_GPIO7_IO19                       0x05C 0x2A0 0x0 0xA 0x0
+
+#define IOMUXC_GPIO_EMC_B1_20_SEMC_ADDR12                      0x060 0x2A4 0x0 0x0 0x0
+#define IOMUXC_GPIO_EMC_B1_20_FLEXPWM2_PWM3_B                  0x060 0x2A4 0x0 0x1 0x0
+#define IOMUXC_GPIO_EMC_B1_20_TMR4_TIMER0                      0x060 0x2A4 0x660 0x2 0x0
+#define IOMUXC_GPIO_EMC_B1_20_GPIO_MUX1_IO20                   0x060 0x2A4 0x0 0x5 0x0
+#define IOMUXC_GPIO_EMC_B1_20_FLEXIO1_D20                      0x060 0x2A4 0x0 0x8 0x0
+#define IOMUXC_GPIO_EMC_B1_20_GPIO7_IO20                       0x060 0x2A4 0x0 0xA 0x0
+
+#define IOMUXC_GPIO_EMC_B1_21_GPIO7_IO21                       0x064 0x2A8 0x0 0xA 0x0
+#define IOMUXC_GPIO_EMC_B1_21_SEMC_BA0                         0x064 0x2A8 0x0 0x0 0x0
+#define IOMUXC_GPIO_EMC_B1_21_FLEXPWM3_PWM3_A                  0x064 0x2A8 0x53C 0x1 0x0
+#define IOMUXC_GPIO_EMC_B1_21_GPIO_MUX1_IO21                   0x064 0x2A8 0x0 0x5 0x0
+#define IOMUXC_GPIO_EMC_B1_21_FLEXIO1_D21                      0x064 0x2A8 0x0 0x8 0x0
+
+#define IOMUXC_GPIO_EMC_B1_22_GPIO7_IO22                       0x068 0x2AC 0x0 0xA 0x0
+#define IOMUXC_GPIO_EMC_B1_22_SEMC_BA1                         0x068 0x2AC 0x0 0x0 0x0
+#define IOMUXC_GPIO_EMC_B1_22_FLEXPWM3_PWM3_B                  0x068 0x2AC 0x54C 0x1 0x0
+#define IOMUXC_GPIO_EMC_B1_22_GPIO_MUX1_IO22                   0x068 0x2AC 0x0 0x5 0x0
+#define IOMUXC_GPIO_EMC_B1_22_FLEXIO1_D22                      0x068 0x2AC 0x0 0x8 0x0
+
+#define IOMUXC_GPIO_EMC_B1_23_SEMC_ADDR10                      0x06C 0x2B0 0x0 0x0 0x0
+#define IOMUXC_GPIO_EMC_B1_23_FLEXPWM1_PWM0_A                  0x06C 0x2B0 0x500 0x1 0x0
+#define IOMUXC_GPIO_EMC_B1_23_GPIO_MUX1_IO23                   0x06C 0x2B0 0x0 0x5 0x0
+#define IOMUXC_GPIO_EMC_B1_23_FLEXIO1_D23                      0x06C 0x2B0 0x0 0x8 0x0
+#define IOMUXC_GPIO_EMC_B1_23_GPIO7_IO23                       0x06C 0x2B0 0x0 0xA 0x0
+
+#define IOMUXC_GPIO_EMC_B1_24_GPIO7_IO24                       0x070 0x2B4 0x0 0xA 0x0
+#define IOMUXC_GPIO_EMC_B1_24_SEMC_CAS                         0x070 0x2B4 0x0 0x0 0x0
+#define IOMUXC_GPIO_EMC_B1_24_FLEXPWM1_PWM0_B                  0x070 0x2B4 0x50C 0x1 0x0
+#define IOMUXC_GPIO_EMC_B1_24_GPIO_MUX1_IO24                   0x070 0x2B4 0x0 0x5 0x0
+#define IOMUXC_GPIO_EMC_B1_24_FLEXIO1_D24                      0x070 0x2B4 0x0 0x8 0x0
+
+#define IOMUXC_GPIO_EMC_B1_25_GPIO7_IO25                       0x074 0x2B8 0x0 0xA 0x0
+#define IOMUXC_GPIO_EMC_B1_25_SEMC_RAS                         0x074 0x2B8 0x0 0x0 0x0
+#define IOMUXC_GPIO_EMC_B1_25_FLEXPWM1_PWM1_A                  0x074 0x2B8 0x504 0x1 0x0
+#define IOMUXC_GPIO_EMC_B1_25_GPIO_MUX1_IO25                   0x074 0x2B8 0x0 0x5 0x0
+#define IOMUXC_GPIO_EMC_B1_25_FLEXIO1_D25                      0x074 0x2B8 0x0 0x8 0x0
+
+#define IOMUXC_GPIO_EMC_B1_26_SEMC_CLK                         0x078 0x2BC 0x0 0x0 0x0
+#define IOMUXC_GPIO_EMC_B1_26_FLEXPWM1_PWM1_B                  0x078 0x2BC 0x510 0x1 0x0
+#define IOMUXC_GPIO_EMC_B1_26_GPIO_MUX1_IO26                   0x078 0x2BC 0x0 0x5 0x0
+#define IOMUXC_GPIO_EMC_B1_26_FLEXIO1_D26                      0x078 0x2BC 0x0 0x8 0x0
+#define IOMUXC_GPIO_EMC_B1_26_GPIO7_IO26                       0x078 0x2BC 0x0 0xA 0x0
+
+#define IOMUXC_GPIO_EMC_B1_27_GPIO7_IO27                       0x07C 0x2C0 0x0 0xA 0x0
+#define IOMUXC_GPIO_EMC_B1_27_SEMC_CKE                         0x07C 0x2C0 0x0 0x0 0x0
+#define IOMUXC_GPIO_EMC_B1_27_FLEXPWM1_PWM2_A                  0x07C 0x2C0 0x508 0x1 0x0
+#define IOMUXC_GPIO_EMC_B1_27_GPIO_MUX1_IO27                   0x07C 0x2C0 0x0 0x5 0x0
+#define IOMUXC_GPIO_EMC_B1_27_FLEXIO1_D27                      0x07C 0x2C0 0x0 0x8 0x0
+
+#define IOMUXC_GPIO_EMC_B1_28_GPIO7_IO28                       0x080 0x2C4 0x0 0xA 0x0
+#define IOMUXC_GPIO_EMC_B1_28_SEMC_WE                          0x080 0x2C4 0x0 0x0 0x0
+#define IOMUXC_GPIO_EMC_B1_28_FLEXPWM1_PWM2_B                  0x080 0x2C4 0x514 0x1 0x0
+#define IOMUXC_GPIO_EMC_B1_28_GPIO_MUX1_IO28                   0x080 0x2C4 0x0 0x5 0x0
+#define IOMUXC_GPIO_EMC_B1_28_FLEXIO1_D28                      0x080 0x2C4 0x0 0x8 0x0
+
+#define IOMUXC_GPIO_EMC_B1_29_SEMC_CS0                         0x084 0x2C8 0x0 0x0 0x0
+#define IOMUXC_GPIO_EMC_B1_29_FLEXPWM3_PWM0_A                  0x084 0x2C8 0x530 0x1 0x0
+#define IOMUXC_GPIO_EMC_B1_29_GPIO_MUX1_IO29                   0x084 0x2C8 0x0 0x5 0x0
+#define IOMUXC_GPIO_EMC_B1_29_FLEXIO1_D29                      0x084 0x2C8 0x0 0x8 0x0
+#define IOMUXC_GPIO_EMC_B1_29_GPIO7_IO29                       0x084 0x2C8 0x0 0xA 0x0
+
+#define IOMUXC_GPIO_EMC_B1_30_SEMC_DATA08                      0x088 0x2CC 0x0 0x0 0x0
+#define IOMUXC_GPIO_EMC_B1_30_FLEXPWM3_PWM0_B                  0x088 0x2CC 0x540 0x1 0x0
+#define IOMUXC_GPIO_EMC_B1_30_GPIO_MUX1_IO30                   0x088 0x2CC 0x0 0x5 0x0
+#define IOMUXC_GPIO_EMC_B1_30_FLEXIO1_D30                      0x088 0x2CC 0x0 0x8 0x0
+#define IOMUXC_GPIO_EMC_B1_30_GPIO7_IO30                       0x088 0x2CC 0x0 0xA 0x0
+
+#define IOMUXC_GPIO_EMC_B1_31_GPIO7_IO31                       0x08C 0x2D0 0x0 0xA 0x0
+#define IOMUXC_GPIO_EMC_B1_31_SEMC_DATA09                      0x08C 0x2D0 0x0 0x0 0x0
+#define IOMUXC_GPIO_EMC_B1_31_FLEXPWM3_PWM1_A                  0x08C 0x2D0 0x534 0x1 0x0
+#define IOMUXC_GPIO_EMC_B1_31_GPIO_MUX1_IO31                   0x08C 0x2D0 0x0 0x5 0x0
+#define IOMUXC_GPIO_EMC_B1_31_FLEXIO1_D31                      0x08C 0x2D0 0x0 0x8 0x0
+
+#define IOMUXC_GPIO_EMC_B1_32_GPIO8_IO00                       0x090 0x2D4 0x0 0xA 0x0
+#define IOMUXC_GPIO_EMC_B1_32_SEMC_DATA10                      0x090 0x2D4 0x0 0x0 0x0
+#define IOMUXC_GPIO_EMC_B1_32_FLEXPWM3_PWM1_B                  0x090 0x2D4 0x544 0x1 0x0
+#define IOMUXC_GPIO_EMC_B1_32_GPIO_MUX2_IO00                   0x090 0x2D4 0x0 0x5 0x0
+
+#define IOMUXC_GPIO_EMC_B1_33_SEMC_DATA11                      0x094 0x2D8 0x0 0x0 0x0
+#define IOMUXC_GPIO_EMC_B1_33_FLEXPWM3_PWM2_A                  0x094 0x2D8 0x538 0x1 0x0
+#define IOMUXC_GPIO_EMC_B1_33_GPIO_MUX2_IO01                   0x094 0x2D8 0x0 0x5 0x0
+#define IOMUXC_GPIO_EMC_B1_33_GPIO8_IO01                       0x094 0x2D8 0x0 0xA 0x0
+
+#define IOMUXC_GPIO_EMC_B1_34_GPIO8_IO02                       0x098 0x2DC 0x0 0xA 0x0
+#define IOMUXC_GPIO_EMC_B1_34_SEMC_DATA12                      0x098 0x2DC 0x0 0x0 0x0
+#define IOMUXC_GPIO_EMC_B1_34_FLEXPWM3_PWM2_B                  0x098 0x2DC 0x548 0x1 0x0
+#define IOMUXC_GPIO_EMC_B1_34_GPIO_MUX2_IO02                   0x098 0x2DC 0x0 0x5 0x0
+
+#define IOMUXC_GPIO_EMC_B1_35_GPIO8_IO03                       0x09C 0x2E0 0x0 0xA 0x0
+#define IOMUXC_GPIO_EMC_B1_35_SEMC_DATA13                      0x09C 0x2E0 0x0 0x0 0x0
+#define IOMUXC_GPIO_EMC_B1_35_XBAR1_INOUT09                    0x09C 0x2E0 0x0 0x1 0x0
+#define IOMUXC_GPIO_EMC_B1_35_GPIO_MUX2_IO03                   0x09C 0x2E0 0x0 0x5 0x0
+
+#define IOMUXC_GPIO_EMC_B1_36_SEMC_DATA14                      0x0A0 0x2E4 0x0 0x0 0x0
+#define IOMUXC_GPIO_EMC_B1_36_XBAR1_INOUT10                    0x0A0 0x2E4 0x0 0x1 0x0
+#define IOMUXC_GPIO_EMC_B1_36_GPIO_MUX2_IO04                   0x0A0 0x2E4 0x0 0x5 0x0
+#define IOMUXC_GPIO_EMC_B1_36_GPIO8_IO04                       0x0A0 0x2E4 0x0 0xA 0x0
+
+#define IOMUXC_GPIO_EMC_B1_37_GPIO8_IO05                       0x0A4 0x2E8 0x0 0xA 0x0
+#define IOMUXC_GPIO_EMC_B1_37_SEMC_DATA15                      0x0A4 0x2E8 0x0 0x0 0x0
+#define IOMUXC_GPIO_EMC_B1_37_XBAR1_INOUT11                    0x0A4 0x2E8 0x0 0x1 0x0
+#define IOMUXC_GPIO_EMC_B1_37_GPIO_MUX2_IO05                   0x0A4 0x2E8 0x0 0x5 0x0
+
+#define IOMUXC_GPIO_EMC_B1_38_GPIO8_IO06                       0x0A8 0x2EC 0x0 0xA 0x0
+#define IOMUXC_GPIO_EMC_B1_38_SEMC_DM01                                0x0A8 0x2EC 0x0 0x0 0x0
+#define IOMUXC_GPIO_EMC_B1_38_FLEXPWM1_PWM3_A                  0x0A8 0x2EC 0x0 0x1 0x0
+#define IOMUXC_GPIO_EMC_B1_38_TMR1_TIMER1                      0x0A8 0x2EC 0x640 0x2 0x0
+#define IOMUXC_GPIO_EMC_B1_38_GPIO_MUX2_IO06                   0x0A8 0x2EC 0x0 0x5 0x0
+
+#define IOMUXC_GPIO_EMC_B1_39_SEMC_DQS                         0x0AC 0x2F0 0x0 0x0 0x0
+#define IOMUXC_GPIO_EMC_B1_39_FLEXPWM1_PWM3_B                  0x0AC 0x2F0 0x0 0x1 0x0
+#define IOMUXC_GPIO_EMC_B1_39_TMR2_TIMER1                      0x0AC 0x2F0 0x64C 0x2 0x0
+#define IOMUXC_GPIO_EMC_B1_39_GPIO_MUX2_IO07                   0x0AC 0x2F0 0x0 0x5 0x0
+#define IOMUXC_GPIO_EMC_B1_39_GPIO8_IO07                       0x0AC 0x2F0 0x0 0xA 0x0
+
+#define IOMUXC_GPIO_EMC_B1_40_SEMC_RDY                         0x0B0 0x2F4 0x0 0x0 0x0
+#define IOMUXC_GPIO_EMC_B1_40_XBAR1_INOUT12                    0x0B0 0x2F4 0x0 0x1 0x0
+#define IOMUXC_GPIO_EMC_B1_40_MQS_RIGHT                                0x0B0 0x2F4 0x0 0x2 0x0
+#define IOMUXC_GPIO_EMC_B1_40_LPUART6_TXD                      0x0B0 0x2F4 0x0 0x3 0x0
+#define IOMUXC_GPIO_EMC_B1_40_GPIO_MUX2_IO08                   0x0B0 0x2F4 0x0 0x5 0x0
+#define IOMUXC_GPIO_EMC_B1_40_ENET_1G_MDC                      0x0B0 0x2F4 0x0 0x7 0x0
+#define IOMUXC_GPIO_EMC_B1_40_CCM_CLKO1                                0x0B0 0x2F4 0x0 0x9 0x0
+#define IOMUXC_GPIO_EMC_B1_40_GPIO8_IO08                       0x0B0 0x2F4 0x0 0xA 0x0
+
+#define IOMUXC_GPIO_EMC_B1_41_GPIO8_IO09                       0x0B4 0x2F8 0x0 0xA 0x0
+#define IOMUXC_GPIO_EMC_B1_41_SEMC_CSX00                       0x0B4 0x2F8 0x0 0x0 0x0
+#define IOMUXC_GPIO_EMC_B1_41_XBAR1_INOUT13                    0x0B4 0x2F8 0x0 0x1 0x0
+#define IOMUXC_GPIO_EMC_B1_41_MQS_LEFT                         0x0B4 0x2F8 0x0 0x2 0x0
+#define IOMUXC_GPIO_EMC_B1_41_LPUART6_RXD                      0x0B4 0x2F8 0x0 0x3 0x0
+#define IOMUXC_GPIO_EMC_B1_41_FLEXSPI2_B_DATA07                        0x0B4 0x2F8 0x0 0x4 0x0
+#define IOMUXC_GPIO_EMC_B1_41_GPIO_MUX2_IO09                   0x0B4 0x2F8 0x0 0x5 0x0
+#define IOMUXC_GPIO_EMC_B1_41_ENET_1G_MDIO                     0x0B4 0x2F8 0x4C8 0x7 0x0
+#define IOMUXC_GPIO_EMC_B1_41_CCM_CLKO2                                0x0B4 0x2F8 0x0 0x9 0x0
+
+#define IOMUXC_GPIO_EMC_B2_00_SEMC_DATA16                      0x0B8 0x2FC 0x0 0x0 0x0
+#define IOMUXC_GPIO_EMC_B2_00_CCM_ENET_REF_CLK_25M             0x0B8 0x2FC 0x0 0x1 0x0
+#define IOMUXC_GPIO_EMC_B2_00_TMR3_TIMER1                      0x0B8 0x2FC 0x658 0x2 0x0
+#define IOMUXC_GPIO_EMC_B2_00_LPUART6_CTS_B                    0x0B8 0x2FC 0x0 0x3 0x0
+#define IOMUXC_GPIO_EMC_B2_00_FLEXSPI2_B_DATA06                        0x0B8 0x2FC 0x0 0x4 0x0
+#define IOMUXC_GPIO_EMC_B2_00_GPIO_MUX2_IO10                   0x0B8 0x2FC 0x0 0x5 0x0
+#define IOMUXC_GPIO_EMC_B2_00_XBAR1_INOUT20                    0x0B8 0x2FC 0x6D8 0x6 0x0
+#define IOMUXC_GPIO_EMC_B2_00_ENET_QOS_1588_EVENT1_OUT         0x0B8 0x2FC 0x0 0x7 0x0
+#define IOMUXC_GPIO_EMC_B2_00_LPSPI1_SCK                       0x0B8 0x2FC 0x5D0 0x8 0x0
+#define IOMUXC_GPIO_EMC_B2_00_LPI2C2_SCL                       0x0B8 0x2FC 0x5B4 0x9 0x0
+#define IOMUXC_GPIO_EMC_B2_00_GPIO8_IO10                       0x0B8 0x2FC 0x0 0xA 0x0
+#define IOMUXC_GPIO_EMC_B2_00_FLEXPWM3_PWM0_A                  0x0B8 0x2FC 0x530 0xB 0x1
+
+#define IOMUXC_GPIO_EMC_B2_01_SEMC_DATA17                      0x0BC 0x300 0x0 0x0 0x0
+#define IOMUXC_GPIO_EMC_B2_01_USDHC2_CD_B                      0x0BC 0x300 0x6D0 0x1 0x0
+#define IOMUXC_GPIO_EMC_B2_01_TMR4_TIMER1                      0x0BC 0x300 0x664 0x2 0x0
+#define IOMUXC_GPIO_EMC_B2_01_LPUART6_RTS_B                    0x0BC 0x300 0x0 0x3 0x0
+#define IOMUXC_GPIO_EMC_B2_01_FLEXSPI2_B_DATA05                        0x0BC 0x300 0x0 0x4 0x0
+#define IOMUXC_GPIO_EMC_B2_01_GPIO_MUX2_IO11                   0x0BC 0x300 0x0 0x5 0x0
+#define IOMUXC_GPIO_EMC_B2_01_XBAR1_INOUT21                    0x0BC 0x300 0x6DC 0x6 0x0
+#define IOMUXC_GPIO_EMC_B2_01_ENET_QOS_1588_EVENT1_IN          0x0BC 0x300 0x0 0x7 0x0
+#define IOMUXC_GPIO_EMC_B2_01_LPSPI1_PCS0                      0x0BC 0x300 0x5CC 0x8 0x0
+#define IOMUXC_GPIO_EMC_B2_01_LPI2C2_SDA                       0x0BC 0x300 0x5B8 0x9 0x0
+#define IOMUXC_GPIO_EMC_B2_01_GPIO8_IO11                       0x0BC 0x300 0x0 0xA 0x0
+#define IOMUXC_GPIO_EMC_B2_01_FLEXPWM3_PWM0_B                  0x0BC 0x300 0x540 0xB 0x1
+
+#define IOMUXC_GPIO_EMC_B2_02_SEMC_DATA18                      0x0C0 0x304 0x0 0x0 0x0
+#define IOMUXC_GPIO_EMC_B2_02_USDHC2_WP                                0x0C0 0x304 0x6D4 0x1 0x0
+#define IOMUXC_GPIO_EMC_B2_02_VIDEO_MUX_CSI_DATA23             0x0C0 0x304 0x0 0x3 0x0
+#define IOMUXC_GPIO_EMC_B2_02_FLEXSPI2_B_DATA04                        0x0C0 0x304 0x0 0x4 0x0
+#define IOMUXC_GPIO_EMC_B2_02_GPIO_MUX2_IO12                   0x0C0 0x304 0x0 0x5 0x0
+#define IOMUXC_GPIO_EMC_B2_02_XBAR1_INOUT22                    0x0C0 0x304 0x6E0 0x6 0x0
+#define IOMUXC_GPIO_EMC_B2_02_ENET_QOS_1588_EVENT1_AUX_IN      0x0C0 0x304 0x0 0x7 0x0
+#define IOMUXC_GPIO_EMC_B2_02_LPSPI1_SOUT                      0x0C0 0x304 0x5D8 0x8 0x0
+#define IOMUXC_GPIO_EMC_B2_02_GPIO8_IO12                       0x0C0 0x304 0x0 0xA 0x0
+#define IOMUXC_GPIO_EMC_B2_02_FLEXPWM3_PWM1_A                  0x0C0 0x304 0x534 0xB 0x1
+
+#define IOMUXC_GPIO_EMC_B2_03_SEMC_DATA19                      0x0C4 0x308 0x0 0x0 0x0
+#define IOMUXC_GPIO_EMC_B2_03_USDHC2_VSELECT                   0x0C4 0x308 0x0 0x1 0x0
+#define IOMUXC_GPIO_EMC_B2_03_VIDEO_MUX_CSI_DATA22             0x0C4 0x308 0x0 0x3 0x0
+#define IOMUXC_GPIO_EMC_B2_03_FLEXSPI2_B_DATA03                        0x0C4 0x308 0x0 0x4 0x0
+#define IOMUXC_GPIO_EMC_B2_03_GPIO_MUX2_IO13                   0x0C4 0x308 0x0 0x5 0x0
+#define IOMUXC_GPIO_EMC_B2_03_XBAR1_INOUT23                    0x0C4 0x308 0x6E4 0x6 0x0
+#define IOMUXC_GPIO_EMC_B2_03_ENET_1G_TX_DATA03                        0x0C4 0x308 0x0 0x7 0x0
+#define IOMUXC_GPIO_EMC_B2_03_LPSPI1_SIN                       0x0C4 0x308 0x5D4 0x8 0x0
+#define IOMUXC_GPIO_EMC_B2_03_GPIO8_IO13                       0x0C4 0x308 0x0 0xA 0x0
+#define IOMUXC_GPIO_EMC_B2_03_FLEXPWM3_PWM1_B                  0x0C4 0x308 0x544 0xB 0x1
+
+#define IOMUXC_GPIO_EMC_B2_04_SEMC_DATA20                      0x0C8 0x30C 0x0 0x0 0x0
+#define IOMUXC_GPIO_EMC_B2_04_USDHC2_RESET_B                   0x0C8 0x30C 0x0 0x1 0x0
+#define IOMUXC_GPIO_EMC_B2_04_SAI2_MCLK                                0x0C8 0x30C 0x0 0x2 0x0
+#define IOMUXC_GPIO_EMC_B2_04_VIDEO_MUX_CSI_DATA21             0x0C8 0x30C 0x0 0x3 0x0
+#define IOMUXC_GPIO_EMC_B2_04_FLEXSPI2_B_DATA02                        0x0C8 0x30C 0x0 0x4 0x0
+#define IOMUXC_GPIO_EMC_B2_04_GPIO_MUX2_IO14                   0x0C8 0x30C 0x0 0x5 0x0
+#define IOMUXC_GPIO_EMC_B2_04_XBAR1_INOUT24                    0x0C8 0x30C 0x6E8 0x6 0x0
+#define IOMUXC_GPIO_EMC_B2_04_ENET_1G_TX_DATA02                        0x0C8 0x30C 0x0 0x7 0x0
+#define IOMUXC_GPIO_EMC_B2_04_LPSPI3_SCK                       0x0C8 0x30C 0x600 0x8 0x0
+#define IOMUXC_GPIO_EMC_B2_04_GPIO8_IO14                       0x0C8 0x30C 0x0 0xA 0x0
+#define IOMUXC_GPIO_EMC_B2_04_FLEXPWM3_PWM2_A                  0x0C8 0x30C 0x538 0xB 0x1
+
+#define IOMUXC_GPIO_EMC_B2_05_SEMC_DATA21                      0x0CC 0x310 0x0 0x0 0x0
+#define IOMUXC_GPIO_EMC_B2_05_GPT3_CLK                         0x0CC 0x310 0x598 0x1 0x0
+#define IOMUXC_GPIO_EMC_B2_05_SAI2_RX_SYNC                     0x0CC 0x310 0x0 0x2 0x0
+#define IOMUXC_GPIO_EMC_B2_05_VIDEO_MUX_CSI_DATA20             0x0CC 0x310 0x0 0x3 0x0
+#define IOMUXC_GPIO_EMC_B2_05_FLEXSPI2_B_DATA01                        0x0CC 0x310 0x0 0x4 0x0
+#define IOMUXC_GPIO_EMC_B2_05_GPIO_MUX2_IO15                   0x0CC 0x310 0x0 0x5 0x0
+#define IOMUXC_GPIO_EMC_B2_05_XBAR1_INOUT25                    0x0CC 0x310 0x6EC 0x6 0x0
+#define IOMUXC_GPIO_EMC_B2_05_ENET_1G_RX_CLK                   0x0CC 0x310 0x4CC 0x7 0x0
+#define IOMUXC_GPIO_EMC_B2_05_LPSPI3_PCS0                      0x0CC 0x310 0x5F0 0x8 0x0
+#define IOMUXC_GPIO_EMC_B2_05_PIT1_TRIGGER0                    0x0CC 0x310 0x0 0x9 0x0
+#define IOMUXC_GPIO_EMC_B2_05_GPIO8_IO15                       0x0CC 0x310 0x0 0xA 0x0
+#define IOMUXC_GPIO_EMC_B2_05_FLEXPWM3_PWM2_B                  0x0CC 0x310 0x548 0xB 0x1
+
+#define IOMUXC_GPIO_EMC_B2_06_SEMC_DATA22                      0x0D0 0x314 0x0 0x0 0x0
+#define IOMUXC_GPIO_EMC_B2_06_GPT3_CAPTURE1                    0x0D0 0x314 0x590 0x1 0x0
+#define IOMUXC_GPIO_EMC_B2_06_GPIO8_IO16                       0x0D0 0x314 0x0 0xA 0x0
+#define IOMUXC_GPIO_EMC_B2_06_SAI2_RX_BCLK                     0x0D0 0x314 0x0 0x2 0x0
+#define IOMUXC_GPIO_EMC_B2_06_FLEXPWM3_PWM3_A                  0x0D0 0x314 0x53C 0xB 0x1
+#define IOMUXC_GPIO_EMC_B2_06_VIDEO_MUX_CSI_DATA19             0x0D0 0x314 0x0 0x3 0x0
+#define IOMUXC_GPIO_EMC_B2_06_FLEXSPI2_B_DATA00                        0x0D0 0x314 0x0 0x4 0x0
+#define IOMUXC_GPIO_EMC_B2_06_GPIO_MUX2_IO16                   0x0D0 0x314 0x0 0x5 0x0
+#define IOMUXC_GPIO_EMC_B2_06_XBAR1_INOUT26                    0x0D0 0x314 0x6F0 0x6 0x0
+#define IOMUXC_GPIO_EMC_B2_06_ENET_1G_TX_ER                    0x0D0 0x314 0x0 0x7 0x0
+#define IOMUXC_GPIO_EMC_B2_06_LPSPI3_SOUT                      0x0D0 0x314 0x608 0x8 0x0
+#define IOMUXC_GPIO_EMC_B2_06_PIT1_TRIGGER1                    0x0D0 0x314 0x0 0x9 0x0
+
+#define IOMUXC_GPIO_EMC_B2_07_SEMC_DATA23                      0x0D4 0x318 0x0 0x0 0x0
+#define IOMUXC_GPIO_EMC_B2_07_GPT3_CAPTURE2                    0x0D4 0x318 0x594 0x1 0x0
+#define IOMUXC_GPIO_EMC_B2_07_SAI2_RX_DATA                     0x0D4 0x318 0x0 0x2 0x0
+#define IOMUXC_GPIO_EMC_B2_07_VIDEO_MUX_CSI_DATA18             0x0D4 0x318 0x0 0x3 0x0
+#define IOMUXC_GPIO_EMC_B2_07_FLEXSPI2_B_DQS                   0x0D4 0x318 0x0 0x4 0x0
+#define IOMUXC_GPIO_EMC_B2_07_GPIO_MUX2_IO17                   0x0D4 0x318 0x0 0x5 0x0
+#define IOMUXC_GPIO_EMC_B2_07_XBAR1_INOUT27                    0x0D4 0x318 0x6F4 0x6 0x0
+#define IOMUXC_GPIO_EMC_B2_07_ENET_1G_RX_DATA03                        0x0D4 0x318 0x4DC 0x7 0x0
+#define IOMUXC_GPIO_EMC_B2_07_LPSPI3_SIN                       0x0D4 0x318 0x604 0x8 0x0
+#define IOMUXC_GPIO_EMC_B2_07_PIT1_TRIGGER2                    0x0D4 0x318 0x0 0x9 0x0
+#define IOMUXC_GPIO_EMC_B2_07_GPIO8_IO17                       0x0D4 0x318 0x0 0xA 0x0
+#define IOMUXC_GPIO_EMC_B2_07_FLEXPWM3_PWM3_B                  0x0D4 0x318 0x54C 0xB 0x1
+
+#define IOMUXC_GPIO_EMC_B2_08_SEMC_DM02                                0x0D8 0x31C 0x0 0x0 0x0
+#define IOMUXC_GPIO_EMC_B2_08_GPT3_COMPARE1                    0x0D8 0x31C 0x0 0x1 0x0
+#define IOMUXC_GPIO_EMC_B2_08_SAI2_TX_DATA                     0x0D8 0x31C 0x0 0x2 0x0
+#define IOMUXC_GPIO_EMC_B2_08_VIDEO_MUX_CSI_DATA17             0x0D8 0x31C 0x0 0x3 0x0
+#define IOMUXC_GPIO_EMC_B2_08_FLEXSPI2_B_SS0_B                 0x0D8 0x31C 0x0 0x4 0x0
+#define IOMUXC_GPIO_EMC_B2_08_GPIO_MUX2_IO18                   0x0D8 0x31C 0x0 0x5 0x0
+#define IOMUXC_GPIO_EMC_B2_08_XBAR1_INOUT28                    0x0D8 0x31C 0x6F8 0x6 0x0
+#define IOMUXC_GPIO_EMC_B2_08_ENET_1G_RX_DATA02                        0x0D8 0x31C 0x4D8 0x7 0x0
+#define IOMUXC_GPIO_EMC_B2_08_LPSPI3_PCS1                      0x0D8 0x31C 0x5F4 0x8 0x0
+#define IOMUXC_GPIO_EMC_B2_08_PIT1_TRIGGER3                    0x0D8 0x31C 0x0 0x9 0x0
+#define IOMUXC_GPIO_EMC_B2_08_GPIO8_IO18                       0x0D8 0x31C 0x0 0xA 0x0
+
+#define IOMUXC_GPIO_EMC_B2_09_GPIO8_IO19                       0x0DC 0x320 0x0 0xA 0x0
+#define IOMUXC_GPIO_EMC_B2_09_SEMC_DATA24                      0x0DC 0x320 0x0 0x0 0x0
+#define IOMUXC_GPIO_EMC_B2_09_GPT3_COMPARE2                    0x0DC 0x320 0x0 0x1 0x0
+#define IOMUXC_GPIO_EMC_B2_09_SAI2_TX_BCLK                     0x0DC 0x320 0x0 0x2 0x0
+#define IOMUXC_GPIO_EMC_B2_09_VIDEO_MUX_CSI_DATA16             0x0DC 0x320 0x0 0x3 0x0
+#define IOMUXC_GPIO_EMC_B2_09_FLEXSPI2_B_SCLK                  0x0DC 0x320 0x0 0x4 0x0
+#define IOMUXC_GPIO_EMC_B2_09_GPIO_MUX2_IO19                   0x0DC 0x320 0x0 0x5 0x0
+#define IOMUXC_GPIO_EMC_B2_09_XBAR1_INOUT29                    0x0DC 0x320 0x6FC 0x6 0x0
+#define IOMUXC_GPIO_EMC_B2_09_ENET_1G_CRS                      0x0DC 0x320 0x0 0x7 0x0
+#define IOMUXC_GPIO_EMC_B2_09_LPSPI3_PCS2                      0x0DC 0x320 0x5F8 0x8 0x0
+#define IOMUXC_GPIO_EMC_B2_09_TMR1_TIMER0                      0x0DC 0x320 0x63C 0x9 0x1
+
+#define IOMUXC_GPIO_EMC_B2_10_GPIO8_IO20                       0x0E0 0x324 0x0 0xA 0x0
+#define IOMUXC_GPIO_EMC_B2_10_SEMC_DATA25                      0x0E0 0x324 0x0 0x0 0x0
+#define IOMUXC_GPIO_EMC_B2_10_GPT3_COMPARE3                    0x0E0 0x324 0x0 0x1 0x0
+#define IOMUXC_GPIO_EMC_B2_10_SAI2_TX_SYNC                     0x0E0 0x324 0x0 0x2 0x0
+#define IOMUXC_GPIO_EMC_B2_10_VIDEO_MUX_CSI_FIELD              0x0E0 0x324 0x0 0x3 0x0
+#define IOMUXC_GPIO_EMC_B2_10_FLEXSPI2_A_SCLK                  0x0E0 0x324 0x58C 0x4 0x0
+#define IOMUXC_GPIO_EMC_B2_10_GPIO_MUX2_IO20                   0x0E0 0x324 0x0 0x5 0x0
+#define IOMUXC_GPIO_EMC_B2_10_XBAR1_INOUT30                    0x0E0 0x324 0x700 0x6 0x0
+#define IOMUXC_GPIO_EMC_B2_10_ENET_1G_COL                      0x0E0 0x324 0x0 0x7 0x0
+#define IOMUXC_GPIO_EMC_B2_10_LPSPI3_PCS3                      0x0E0 0x324 0x5FC 0x8 0x0
+#define IOMUXC_GPIO_EMC_B2_10_TMR1_TIMER1                      0x0E0 0x324 0x640 0x9 0x1
+
+#define IOMUXC_GPIO_EMC_B2_11_SEMC_DATA26                      0x0E4 0x328 0x0 0x0 0x0
+#define IOMUXC_GPIO_EMC_B2_11_SPDIF_IN                         0x0E4 0x328 0x6B4 0x1 0x0
+#define IOMUXC_GPIO_EMC_B2_11_ENET_1G_TX_DATA00                        0x0E4 0x328 0x0 0x2 0x0
+#define IOMUXC_GPIO_EMC_B2_11_SAI3_RX_SYNC                     0x0E4 0x328 0x0 0x3 0x0
+#define IOMUXC_GPIO_EMC_B2_11_FLEXSPI2_A_SS0_B                 0x0E4 0x328 0x0 0x4 0x0
+#define IOMUXC_GPIO_EMC_B2_11_GPIO_MUX2_IO21                   0x0E4 0x328 0x0 0x5 0x0
+#define IOMUXC_GPIO_EMC_B2_11_XBAR1_INOUT31                    0x0E4 0x328 0x704 0x6 0x0
+#define IOMUXC_GPIO_EMC_B2_11_EMVSIM1_IO                       0x0E4 0x328 0x69C 0x8 0x0
+#define IOMUXC_GPIO_EMC_B2_11_TMR1_TIMER2                      0x0E4 0x328 0x644 0x9 0x0
+#define IOMUXC_GPIO_EMC_B2_11_GPIO8_IO21                       0x0E4 0x328 0x0 0xA 0x0
+
+#define IOMUXC_GPIO_EMC_B2_12_SEMC_DATA27                      0x0E8 0x32C 0x0 0x0 0x0
+#define IOMUXC_GPIO_EMC_B2_12_SPDIF_OUT                                0x0E8 0x32C 0x0 0x1 0x0
+#define IOMUXC_GPIO_EMC_B2_12_ENET_1G_TX_DATA01                        0x0E8 0x32C 0x0 0x2 0x0
+#define IOMUXC_GPIO_EMC_B2_12_SAI3_RX_BCLK                     0x0E8 0x32C 0x0 0x3 0x0
+#define IOMUXC_GPIO_EMC_B2_12_FLEXSPI2_A_DQS                   0x0E8 0x32C 0x0 0x4 0x0
+#define IOMUXC_GPIO_EMC_B2_12_GPIO_MUX2_IO22                   0x0E8 0x32C 0x0 0x5 0x0
+#define IOMUXC_GPIO_EMC_B2_12_XBAR1_INOUT32                    0x0E8 0x32C 0x708 0x6 0x0
+#define IOMUXC_GPIO_EMC_B2_12_EMVSIM1_CLK                      0x0E8 0x32C 0x0 0x8 0x0
+#define IOMUXC_GPIO_EMC_B2_12_TMR1_TIMER3                      0x0E8 0x32C 0x0 0x9 0x0
+#define IOMUXC_GPIO_EMC_B2_12_GPIO8_IO22                       0x0E8 0x32C 0x0 0xA 0x0
+
+#define IOMUXC_GPIO_EMC_B2_13_GPIO8_IO23                       0x0EC 0x330 0x0 0xA 0x0
+#define IOMUXC_GPIO_EMC_B2_13_SEMC_DATA28                      0x0EC 0x330 0x0 0x0 0x0
+#define IOMUXC_GPIO_EMC_B2_13_ENET_1G_TX_EN                    0x0EC 0x330 0x0 0x2 0x0
+#define IOMUXC_GPIO_EMC_B2_13_SAI3_RX_DATA                     0x0EC 0x330 0x0 0x3 0x0
+#define IOMUXC_GPIO_EMC_B2_13_FLEXSPI2_A_DATA00                        0x0EC 0x330 0x57C 0x4 0x0
+#define IOMUXC_GPIO_EMC_B2_13_GPIO_MUX2_IO23                   0x0EC 0x330 0x0 0x5 0x0
+#define IOMUXC_GPIO_EMC_B2_13_XBAR1_INOUT33                    0x0EC 0x330 0x70C 0x6 0x0
+#define IOMUXC_GPIO_EMC_B2_13_EMVSIM1_RST                      0x0EC 0x330 0x0 0x8 0x0
+#define IOMUXC_GPIO_EMC_B2_13_TMR2_TIMER0                      0x0EC 0x330 0x648 0x9 0x1
+
+#define IOMUXC_GPIO_EMC_B2_14_SEMC_DATA29                      0x0F0 0x334 0x0 0x0 0x0
+#define IOMUXC_GPIO_EMC_B2_14_ENET_1G_TX_CLK_IO                        0x0F0 0x334 0x4E8 0x2 0x0
+#define IOMUXC_GPIO_EMC_B2_14_SAI3_TX_DATA                     0x0F0 0x334 0x0 0x3 0x0
+#define IOMUXC_GPIO_EMC_B2_14_FLEXSPI2_A_DATA01                        0x0F0 0x334 0x580 0x4 0x0
+#define IOMUXC_GPIO_EMC_B2_14_GPIO_MUX2_IO24                   0x0F0 0x334 0x0 0x5 0x0
+#define IOMUXC_GPIO_EMC_B2_14_XBAR1_INOUT34                    0x0F0 0x334 0x710 0x6 0x0
+#define IOMUXC_GPIO_EMC_B2_14_SFA_ipp_do_atx_clk_under_test    0x0F0 0x334 0x0 0x7 0x0
+#define IOMUXC_GPIO_EMC_B2_14_EMVSIM1_SVEN                     0x0F0 0x334 0x0 0x8 0x0
+#define IOMUXC_GPIO_EMC_B2_14_TMR2_TIMER1                      0x0F0 0x334 0x64C 0x9 0x1
+#define IOMUXC_GPIO_EMC_B2_14_GPIO8_IO24                       0x0F0 0x334 0x0 0xA 0x0
+
+#define IOMUXC_GPIO_EMC_B2_15_SEMC_DATA30                      0x0F4 0x338 0x0 0x0 0x0
+#define IOMUXC_GPIO_EMC_B2_15_ENET_1G_RX_DATA00                        0x0F4 0x338 0x4D0 0x2 0x0
+#define IOMUXC_GPIO_EMC_B2_15_SAI3_TX_BCLK                     0x0F4 0x338 0x0 0x3 0x0
+#define IOMUXC_GPIO_EMC_B2_15_FLEXSPI2_A_DATA02                        0x0F4 0x338 0x584 0x4 0x0
+#define IOMUXC_GPIO_EMC_B2_15_GPIO_MUX2_IO25                   0x0F4 0x338 0x0 0x5 0x0
+#define IOMUXC_GPIO_EMC_B2_15_XBAR1_INOUT35                    0x0F4 0x338 0x714 0x6 0x0
+#define IOMUXC_GPIO_EMC_B2_15_EMVSIM1_PD                       0x0F4 0x338 0x6A0 0x8 0x0
+#define IOMUXC_GPIO_EMC_B2_15_TMR2_TIMER2                      0x0F4 0x338 0x650 0x9 0x0
+#define IOMUXC_GPIO_EMC_B2_15_GPIO8_IO25                       0x0F4 0x338 0x0 0xA 0x0
+
+#define IOMUXC_GPIO_EMC_B2_16_GPIO8_IO26                       0x0F8 0x33C 0x0 0xA 0x0
+#define IOMUXC_GPIO_EMC_B2_16_SEMC_DATA31                      0x0F8 0x33C 0x0 0x0 0x0
+#define IOMUXC_GPIO_EMC_B2_16_XBAR1_INOUT14                    0x0F8 0x33C 0x0 0x1 0x0
+#define IOMUXC_GPIO_EMC_B2_16_ENET_1G_RX_DATA01                        0x0F8 0x33C 0x4D4 0x2 0x0
+#define IOMUXC_GPIO_EMC_B2_16_SAI3_TX_SYNC                     0x0F8 0x33C 0x0 0x3 0x0
+#define IOMUXC_GPIO_EMC_B2_16_FLEXSPI2_A_DATA03                        0x0F8 0x33C 0x588 0x4 0x0
+#define IOMUXC_GPIO_EMC_B2_16_GPIO_MUX2_IO26                   0x0F8 0x33C 0x0 0x5 0x0
+#define IOMUXC_GPIO_EMC_B2_16_EMVSIM1_POWER_FAIL               0x0F8 0x33C 0x6A4 0x8 0x0
+#define IOMUXC_GPIO_EMC_B2_16_TMR2_TIMER3                      0x0F8 0x33C 0x0 0x9 0x0
+
+#define IOMUXC_GPIO_EMC_B2_17_SEMC_DM03                                0x0FC 0x340 0x0 0x0 0x0
+#define IOMUXC_GPIO_EMC_B2_17_XBAR1_INOUT15                    0x0FC 0x340 0x0 0x1 0x0
+#define IOMUXC_GPIO_EMC_B2_17_ENET_1G_RX_EN                    0x0FC 0x340 0x4E0 0x2 0x0
+#define IOMUXC_GPIO_EMC_B2_17_SAI3_MCLK                                0x0FC 0x340 0x0 0x3 0x0
+#define IOMUXC_GPIO_EMC_B2_17_FLEXSPI2_A_DATA04                        0x0FC 0x340 0x0 0x4 0x0
+#define IOMUXC_GPIO_EMC_B2_17_GPIO_MUX2_IO27                   0x0FC 0x340 0x0 0x5 0x0
+#define IOMUXC_GPIO_EMC_B2_17_WDOG1_ANY                                0x0FC 0x340 0x0 0x8 0x0
+#define IOMUXC_GPIO_EMC_B2_17_TMR3_TIMER0                      0x0FC 0x340 0x654 0x9 0x1
+#define IOMUXC_GPIO_EMC_B2_17_GPIO8_IO27                       0x0FC 0x340 0x0 0xA 0x0
+
+#define IOMUXC_GPIO_EMC_B2_18_SEMC_DQS4                                0x100 0x344 0x0 0x0 0x0
+#define IOMUXC_GPIO_EMC_B2_18_XBAR1_INOUT16                    0x100 0x344 0x0 0x1 0x0
+#define IOMUXC_GPIO_EMC_B2_18_ENET_1G_RX_ER                    0x100 0x344 0x4E4 0x2 0x0
+#define IOMUXC_GPIO_EMC_B2_18_EWM_OUT_B                                0x100 0x344 0x0 0x3 0x0
+#define IOMUXC_GPIO_EMC_B2_18_FLEXSPI2_A_DATA05                        0x100 0x344 0x0 0x4 0x0
+#define IOMUXC_GPIO_EMC_B2_18_GPIO_MUX2_IO28                   0x100 0x344 0x0 0x5 0x0
+#define IOMUXC_GPIO_EMC_B2_18_FLEXSPI1_A_DQS                   0x100 0x344 0x550 0x6 0x0
+#define IOMUXC_GPIO_EMC_B2_18_WDOG1_B                          0x100 0x344 0x0 0x8 0x0
+#define IOMUXC_GPIO_EMC_B2_18_TMR3_TIMER1                      0x100 0x344 0x658 0x9 0x1
+#define IOMUXC_GPIO_EMC_B2_18_GPIO8_IO28                       0x100 0x344 0x0 0xA 0x0
+
+#define IOMUXC_GPIO_EMC_B2_19_GPIO8_IO29                       0x104 0x348 0x0 0xA 0x0
+#define IOMUXC_GPIO_EMC_B2_19_SEMC_CLKX00                      0x104 0x348 0x0 0x0 0x0
+#define IOMUXC_GPIO_EMC_B2_19_ENET_MDC                         0x104 0x348 0x0 0x1 0x0
+#define IOMUXC_GPIO_EMC_B2_19_ENET_1G_MDC                      0x104 0x348 0x0 0x2 0x0
+#define IOMUXC_GPIO_EMC_B2_19_ENET_1G_REF_CLK                  0x104 0x348 0x4C4 0x3 0x0
+#define IOMUXC_GPIO_EMC_B2_19_FLEXSPI2_A_DATA06                        0x104 0x348 0x0 0x4 0x0
+#define IOMUXC_GPIO_EMC_B2_19_GPIO_MUX2_IO29                   0x104 0x348 0x0 0x5 0x0
+#define IOMUXC_GPIO_EMC_B2_19_ENET_QOS_MDC                     0x104 0x348 0x0 0x8 0x0
+#define IOMUXC_GPIO_EMC_B2_19_TMR3_TIMER2                      0x104 0x348 0x65C 0x9 0x0
+
+#define IOMUXC_GPIO_EMC_B2_20_GPIO8_IO30                       0x108 0x34C 0x0 0xA 0x0
+#define IOMUXC_GPIO_EMC_B2_20_SEMC_CLKX01                      0x108 0x34C 0x0 0x0 0x0
+#define IOMUXC_GPIO_EMC_B2_20_ENET_MDIO                                0x108 0x34C 0x4AC 0x1 0x0
+#define IOMUXC_GPIO_EMC_B2_20_ENET_1G_MDIO                     0x108 0x34C 0x4C8 0x2 0x1
+#define IOMUXC_GPIO_EMC_B2_20_ENET_QOS_REF_CLK                 0x108 0x34C 0x4A0 0x3 0x0
+#define IOMUXC_GPIO_EMC_B2_20_FLEXSPI2_A_DATA07                        0x108 0x34C 0x0 0x4 0x0
+#define IOMUXC_GPIO_EMC_B2_20_GPIO_MUX2_IO30                   0x108 0x34C 0x0 0x5 0x0
+#define IOMUXC_GPIO_EMC_B2_20_ENET_QOS_MDIO                    0x108 0x34C 0x4EC 0x8 0x0
+#define IOMUXC_GPIO_EMC_B2_20_TMR3_TIMER3                      0x108 0x34C 0x0 0x9 0x0
+
+#define IOMUXC_GPIO_AD_00_GPIO8_IO31                           0x10C 0x350 0x0 0xA 0x0
+#define IOMUXC_GPIO_AD_00_EMVSIM1_IO                           0x10C 0x350 0x69C 0x0 0x1
+#define IOMUXC_GPIO_AD_00_FLEXCAN2_TX                          0x10C 0x350 0x0 0x1 0x0
+#define IOMUXC_GPIO_AD_00_ENET_1G_1588_EVENT1_IN               0x10C 0x350 0x0 0x2 0x0
+#define IOMUXC_GPIO_AD_00_GPT2_CAPTURE1                                0x10C 0x350 0x0 0x3 0x0
+#define IOMUXC_GPIO_AD_00_FLEXPWM1_PWM0_A                      0x10C 0x350 0x500 0x4 0x1
+#define IOMUXC_GPIO_AD_00_GPIO_MUX2_IO31                       0x10C 0x350 0x0 0x5 0x0
+#define IOMUXC_GPIO_AD_00_LPUART7_TXD                          0x10C 0x350 0x630 0x6 0x0
+#define IOMUXC_GPIO_AD_00_FLEXIO2_D00                          0x10C 0x350 0x0 0x8 0x0
+#define IOMUXC_GPIO_AD_00_FLEXSPI2_B_SS1_B                     0x10C 0x350 0x0 0x9 0x0
+
+#define IOMUXC_GPIO_AD_01_GPIO9_IO00                           0x110 0x354 0x0 0xA 0x0
+#define IOMUXC_GPIO_AD_01_EMVSIM1_CLK                          0x110 0x354 0x0 0x0 0x0
+#define IOMUXC_GPIO_AD_01_FLEXCAN2_RX                          0x110 0x354 0x49C 0x1 0x0
+#define IOMUXC_GPIO_AD_01_ENET_1G_1588_EVENT1_OUT              0x110 0x354 0x0 0x2 0x0
+#define IOMUXC_GPIO_AD_01_GPT2_CAPTURE2                                0x110 0x354 0x0 0x3 0x0
+#define IOMUXC_GPIO_AD_01_FLEXPWM1_PWM0_B                      0x110 0x354 0x50C 0x4 0x1
+#define IOMUXC_GPIO_AD_01_GPIO_MUX3_IO00                       0x110 0x354 0x0 0x5 0x0
+#define IOMUXC_GPIO_AD_01_LPUART7_RXD                          0x110 0x354 0x62C 0x6 0x0
+#define IOMUXC_GPIO_AD_01_FLEXIO2_D01                          0x110 0x354 0x0 0x8 0x0
+#define IOMUXC_GPIO_AD_01_FLEXSPI2_A_SS1_B                     0x110 0x354 0x0 0x9 0x0
+
+#define IOMUXC_GPIO_AD_02_GPIO9_IO01                           0x114 0x358 0x0 0xA 0x0
+#define IOMUXC_GPIO_AD_02_EMVSIM1_RST                          0x114 0x358 0x0 0x0 0x0
+#define IOMUXC_GPIO_AD_02_LPUART7_CTS_B                                0x114 0x358 0x0 0x1 0x0
+#define IOMUXC_GPIO_AD_02_ENET_1G_1588_EVENT2_IN               0x114 0x358 0x0 0x2 0x0
+#define IOMUXC_GPIO_AD_02_GPT2_COMPARE1                                0x114 0x358 0x0 0x3 0x0
+#define IOMUXC_GPIO_AD_02_FLEXPWM1_PWM1_A                      0x114 0x358 0x504 0x4 0x1
+#define IOMUXC_GPIO_AD_02_GPIO_MUX3_IO01                       0x114 0x358 0x0 0x5 0x0
+#define IOMUXC_GPIO_AD_02_LPUART8_TXD                          0x114 0x358 0x638 0x6 0x0
+#define IOMUXC_GPIO_AD_02_FLEXIO2_D02                          0x114 0x358 0x0 0x8 0x0
+#define IOMUXC_GPIO_AD_02_VIDEO_MUX_EXT_DCIC1                  0x114 0x358 0x0 0x9 0x0
+
+#define IOMUXC_GPIO_AD_03_GPIO9_IO02                           0x118 0x35C 0x0 0xA 0x0
+#define IOMUXC_GPIO_AD_03_EMVSIM1_SVEN                         0x118 0x35C 0x0 0x0 0x0
+#define IOMUXC_GPIO_AD_03_LPUART7_RTS_B                                0x118 0x35C 0x0 0x1 0x0
+#define IOMUXC_GPIO_AD_03_ENET_1G_1588_EVENT2_OUT              0x118 0x35C 0x0 0x2 0x0
+#define IOMUXC_GPIO_AD_03_GPT2_COMPARE2                                0x118 0x35C 0x0 0x3 0x0
+#define IOMUXC_GPIO_AD_03_FLEXPWM1_PWM1_B                      0x118 0x35C 0x510 0x4 0x1
+#define IOMUXC_GPIO_AD_03_GPIO_MUX3_IO02                       0x118 0x35C 0x0 0x5 0x0
+#define IOMUXC_GPIO_AD_03_LPUART8_RXD                          0x118 0x35C 0x634 0x6 0x0
+#define IOMUXC_GPIO_AD_03_FLEXIO2_D03                          0x118 0x35C 0x0 0x8 0x0
+#define IOMUXC_GPIO_AD_03_VIDEO_MUX_EXT_DCIC2                  0x118 0x35C 0x0 0x9 0x0
+
+#define IOMUXC_GPIO_AD_04_EMVSIM1_PD                           0x11C 0x360 0x6A0 0x0 0x1
+#define IOMUXC_GPIO_AD_04_LPUART8_CTS_B                                0x11C 0x360 0x0 0x1 0x0
+#define IOMUXC_GPIO_AD_04_ENET_1G_1588_EVENT3_IN               0x11C 0x360 0x0 0x2 0x0
+#define IOMUXC_GPIO_AD_04_GPT2_COMPARE3                                0x11C 0x360 0x0 0x3 0x0
+#define IOMUXC_GPIO_AD_04_FLEXPWM1_PWM2_A                      0x11C 0x360 0x508 0x4 0x1
+#define IOMUXC_GPIO_AD_04_GPIO_MUX3_IO03                       0x11C 0x360 0x0 0x5 0x0
+#define IOMUXC_GPIO_AD_04_WDOG1_B                              0x11C 0x360 0x0 0x6 0x0
+#define IOMUXC_GPIO_AD_04_FLEXIO2_D04                          0x11C 0x360 0x0 0x8 0x0
+#define IOMUXC_GPIO_AD_04_TMR4_TIMER0                          0x11C 0x360 0x660 0x9 0x1
+#define IOMUXC_GPIO_AD_04_GPIO9_IO03                           0x11C 0x360 0x0 0xA 0x0
+
+#define IOMUXC_GPIO_AD_05_EMVSIM1_POWER_FAIL                   0x120 0x364 0x6A4 0x0 0x1
+#define IOMUXC_GPIO_AD_05_LPUART8_RTS_B                                0x120 0x364 0x0 0x1 0x0
+#define IOMUXC_GPIO_AD_05_ENET_1G_1588_EVENT3_OUT              0x120 0x364 0x0 0x2 0x0
+#define IOMUXC_GPIO_AD_05_GPT2_CLK                             0x120 0x364 0x0 0x3 0x0
+#define IOMUXC_GPIO_AD_05_FLEXPWM1_PWM2_B                      0x120 0x364 0x514 0x4 0x1
+#define IOMUXC_GPIO_AD_05_GPIO_MUX3_IO04                       0x120 0x364 0x0 0x5 0x0
+#define IOMUXC_GPIO_AD_05_WDOG2_B                              0x120 0x364 0x0 0x6 0x0
+#define IOMUXC_GPIO_AD_05_FLEXIO2_D05                          0x120 0x364 0x0 0x8 0x0
+#define IOMUXC_GPIO_AD_05_TMR4_TIMER1                          0x120 0x364 0x664 0x9 0x1
+#define IOMUXC_GPIO_AD_05_GPIO9_IO04                           0x120 0x364 0x0 0xA 0x0
+
+#define IOMUXC_GPIO_AD_06_USB_OTG2_OC                          0x124 0x368 0x6B8 0x0 0x0
+#define IOMUXC_GPIO_AD_06_FLEXCAN1_TX                          0x124 0x368 0x0 0x1 0x0
+#define IOMUXC_GPIO_AD_06_EMVSIM2_IO                           0x124 0x368 0x6A8 0x2 0x0
+#define IOMUXC_GPIO_AD_06_GPT3_CAPTURE1                                0x124 0x368 0x590 0x3 0x1
+#define IOMUXC_GPIO_AD_06_VIDEO_MUX_CSI_DATA15                 0x124 0x368 0x0 0x4 0x0
+#define IOMUXC_GPIO_AD_06_GPIO_MUX3_IO05                       0x124 0x368 0x0 0x5 0x0
+#define IOMUXC_GPIO_AD_06_ENET_1588_EVENT1_IN                  0x124 0x368 0x0 0x6 0x0
+#define IOMUXC_GPIO_AD_06_FLEXIO2_D06                          0x124 0x368 0x0 0x8 0x0
+#define IOMUXC_GPIO_AD_06_TMR4_TIMER2                          0x124 0x368 0x668 0x9 0x0
+#define IOMUXC_GPIO_AD_06_GPIO9_IO05                           0x124 0x368 0x0 0xA 0x0
+#define IOMUXC_GPIO_AD_06_FLEXPWM1_PWM0_X                      0x124 0x368 0x0 0xB 0x0
+
+#define IOMUXC_GPIO_AD_07_USB_OTG2_PWR                         0x128 0x36C 0x0 0x0 0x0
+#define IOMUXC_GPIO_AD_07_FLEXCAN1_RX                          0x128 0x36C 0x498 0x1 0x0
+#define IOMUXC_GPIO_AD_07_EMVSIM2_CLK                          0x128 0x36C 0x0 0x2 0x0
+#define IOMUXC_GPIO_AD_07_GPT3_CAPTURE2                                0x128 0x36C 0x594 0x3 0x1
+#define IOMUXC_GPIO_AD_07_VIDEO_MUX_CSI_DATA14                 0x128 0x36C 0x0 0x4 0x0
+#define IOMUXC_GPIO_AD_07_GPIO_MUX3_IO06                       0x128 0x36C 0x0 0x5 0x0
+#define IOMUXC_GPIO_AD_07_ENET_1588_EVENT1_OUT                 0x128 0x36C 0x0 0x6 0x0
+#define IOMUXC_GPIO_AD_07_FLEXIO2_D07                          0x128 0x36C 0x0 0x8 0x0
+#define IOMUXC_GPIO_AD_07_TMR4_TIMER3                          0x128 0x36C 0x0 0x9 0x0
+#define IOMUXC_GPIO_AD_07_GPIO9_IO06                           0x128 0x36C 0x0 0xA 0x0
+#define IOMUXC_GPIO_AD_07_FLEXPWM1_PWM1_X                      0x128 0x36C 0x0 0xB 0x0
+
+#define IOMUXC_GPIO_AD_08_USBPHY2_OTG_ID                       0x12C 0x370 0x6C4 0x0 0x0
+#define IOMUXC_GPIO_AD_08_LPI2C1_SCL                           0x12C 0x370 0x5AC 0x1 0x0
+#define IOMUXC_GPIO_AD_08_EMVSIM2_RST                          0x12C 0x370 0x0 0x2 0x0
+#define IOMUXC_GPIO_AD_08_GPT3_COMPARE1                                0x12C 0x370 0x0 0x3 0x0
+#define IOMUXC_GPIO_AD_08_VIDEO_MUX_CSI_DATA13                 0x12C 0x370 0x0 0x4 0x0
+#define IOMUXC_GPIO_AD_08_GPIO_MUX3_IO07                       0x12C 0x370 0x0 0x5 0x0
+#define IOMUXC_GPIO_AD_08_ENET_1588_EVENT2_IN                  0x12C 0x370 0x0 0x6 0x0
+#define IOMUXC_GPIO_AD_08_FLEXIO2_D08                          0x12C 0x370 0x0 0x8 0x0
+#define IOMUXC_GPIO_AD_08_GPIO9_IO07                           0x12C 0x370 0x0 0xA 0x0
+#define IOMUXC_GPIO_AD_08_FLEXPWM1_PWM2_X                      0x12C 0x370 0x0 0xB 0x0
+
+#define IOMUXC_GPIO_AD_09_USBPHY1_OTG_ID                       0x130 0x374 0x6C0 0x0 0x0
+#define IOMUXC_GPIO_AD_09_LPI2C1_SDA                           0x130 0x374 0x5B0 0x1 0x0
+#define IOMUXC_GPIO_AD_09_EMVSIM2_SVEN                         0x130 0x374 0x0 0x2 0x0
+#define IOMUXC_GPIO_AD_09_GPT3_COMPARE2                                0x130 0x374 0x0 0x3 0x0
+#define IOMUXC_GPIO_AD_09_VIDEO_MUX_CSI_DATA12                 0x130 0x374 0x0 0x4 0x0
+#define IOMUXC_GPIO_AD_09_GPIO_MUX3_IO08                       0x130 0x374 0x0 0x5 0x0
+#define IOMUXC_GPIO_AD_09_ENET_1588_EVENT2_OUT                 0x130 0x374 0x0 0x6 0x0
+#define IOMUXC_GPIO_AD_09_FLEXIO2_D09                          0x130 0x374 0x0 0x8 0x0
+#define IOMUXC_GPIO_AD_09_GPIO9_IO08                           0x130 0x374 0x0 0xA 0x0
+#define IOMUXC_GPIO_AD_09_FLEXPWM1_PWM3_X                      0x130 0x374 0x0 0xB 0x0
+
+#define IOMUXC_GPIO_AD_10_USB_OTG1_PWR                         0x134 0x378 0x0 0x0 0x0
+#define IOMUXC_GPIO_AD_10_LPI2C1_SCLS                          0x134 0x378 0x0 0x1 0x0
+#define IOMUXC_GPIO_AD_10_EMVSIM2_PD                           0x134 0x378 0x6AC 0x2 0x0
+#define IOMUXC_GPIO_AD_10_GPT3_COMPARE3                                0x134 0x378 0x0 0x3 0x0
+#define IOMUXC_GPIO_AD_10_VIDEO_MUX_CSI_DATA11                 0x134 0x378 0x0 0x4 0x0
+#define IOMUXC_GPIO_AD_10_GPIO_MUX3_IO09                       0x134 0x378 0x0 0x5 0x0
+#define IOMUXC_GPIO_AD_10_ENET_1588_EVENT3_IN                  0x134 0x378 0x0 0x6 0x0
+#define IOMUXC_GPIO_AD_10_FLEXIO2_D10                          0x134 0x378 0x0 0x8 0x0
+#define IOMUXC_GPIO_AD_10_GPIO9_IO09                           0x134 0x378 0x0 0xA 0x0
+#define IOMUXC_GPIO_AD_10_FLEXPWM2_PWM0_X                      0x134 0x378 0x0 0xB 0x0
+
+#define IOMUXC_GPIO_AD_11_USB_OTG1_OC                          0x138 0x37C 0x6BC 0x0 0x0
+#define IOMUXC_GPIO_AD_11_LPI2C1_SDAS                          0x138 0x37C 0x0 0x1 0x0
+#define IOMUXC_GPIO_AD_11_EMVSIM2_POWER_FAIL                   0x138 0x37C 0x6B0 0x2 0x0
+#define IOMUXC_GPIO_AD_11_GPT3_CLK                             0x138 0x37C 0x598 0x3 0x1
+#define IOMUXC_GPIO_AD_11_VIDEO_MUX_CSI_DATA10                 0x138 0x37C 0x0 0x4 0x0
+#define IOMUXC_GPIO_AD_11_GPIO_MUX3_IO10                       0x138 0x37C 0x0 0x5 0x0
+#define IOMUXC_GPIO_AD_11_ENET_1588_EVENT3_OUT                 0x138 0x37C 0x0 0x6 0x0
+#define IOMUXC_GPIO_AD_11_FLEXIO2_D11                          0x138 0x37C 0x0 0x8 0x0
+#define IOMUXC_GPIO_AD_11_GPIO9_IO10                           0x138 0x37C 0x0 0xA 0x0
+#define IOMUXC_GPIO_AD_11_FLEXPWM2_PWM1_X                      0x138 0x37C 0x0 0xB 0x0
+
+#define IOMUXC_GPIO_AD_12_SPDIF_LOCK                           0x13C 0x380 0x0 0x0 0x0
+#define IOMUXC_GPIO_AD_12_LPI2C1_HREQ                          0x13C 0x380 0x0 0x1 0x0
+#define IOMUXC_GPIO_AD_12_GPT1_CAPTURE1                                0x13C 0x380 0x0 0x2 0x0
+#define IOMUXC_GPIO_AD_12_FLEXSPI1_B_DATA03                    0x13C 0x380 0x570 0x3 0x0
+#define IOMUXC_GPIO_AD_12_VIDEO_MUX_CSI_PIXCLK                 0x13C 0x380 0x0 0x4 0x0
+#define IOMUXC_GPIO_AD_12_GPIO_MUX3_IO11                       0x13C 0x380 0x0 0x5 0x0
+#define IOMUXC_GPIO_AD_12_ENET_TX_DATA03                       0x13C 0x380 0x0 0x6 0x0
+#define IOMUXC_GPIO_AD_12_FLEXIO2_D12                          0x13C 0x380 0x0 0x8 0x0
+#define IOMUXC_GPIO_AD_12_EWM_OUT_B                            0x13C 0x380 0x0 0x9 0x0
+#define IOMUXC_GPIO_AD_12_GPIO9_IO11                           0x13C 0x380 0x0 0xA 0x0
+#define IOMUXC_GPIO_AD_12_FLEXPWM2_PWM2_X                      0x13C 0x380 0x0 0xB 0x0
+
+#define IOMUXC_GPIO_AD_13_SPDIF_SR_CLK                         0x140 0x384 0x0 0x0 0x0
+#define IOMUXC_GPIO_AD_13_PIT1_TRIGGER0                                0x140 0x384 0x0 0x1 0x0
+#define IOMUXC_GPIO_AD_13_GPT1_CAPTURE2                                0x140 0x384 0x0 0x2 0x0
+#define IOMUXC_GPIO_AD_13_FLEXSPI1_B_DATA02                    0x140 0x384 0x56C 0x3 0x0
+#define IOMUXC_GPIO_AD_13_VIDEO_MUX_CSI_MCLK                   0x140 0x384 0x0 0x4 0x0
+#define IOMUXC_GPIO_AD_13_GPIO_MUX3_IO12                       0x140 0x384 0x0 0x5 0x0
+#define IOMUXC_GPIO_AD_13_ENET_TX_DATA02                       0x140 0x384 0x0 0x6 0x0
+#define IOMUXC_GPIO_AD_13_FLEXIO2_D13                          0x140 0x384 0x0 0x8 0x0
+#define IOMUXC_GPIO_AD_13_REF_CLK_32K                          0x140 0x384 0x0 0x9 0x0
+#define IOMUXC_GPIO_AD_13_GPIO9_IO12                           0x140 0x384 0x0 0xA 0x0
+#define IOMUXC_GPIO_AD_13_FLEXPWM2_PWM3_X                      0x140 0x384 0x0 0xB 0x0
+
+#define IOMUXC_GPIO_AD_14_SPDIF_EXT_CLK                                0x144 0x388 0x0 0x0 0x0
+#define IOMUXC_GPIO_AD_14_REF_CLK_24M                          0x144 0x388 0x0 0x1 0x0
+#define IOMUXC_GPIO_AD_14_GPT1_COMPARE1                                0x144 0x388 0x0 0x2 0x0
+#define IOMUXC_GPIO_AD_14_FLEXSPI1_B_DATA01                    0x144 0x388 0x568 0x3 0x0
+#define IOMUXC_GPIO_AD_14_VIDEO_MUX_CSI_VSYNC                  0x144 0x388 0x0 0x4 0x0
+#define IOMUXC_GPIO_AD_14_GPIO_MUX3_IO13                       0x144 0x388 0x0 0x5 0x0
+#define IOMUXC_GPIO_AD_14_ENET_RX_CLK                          0x144 0x388 0x0 0x6 0x0
+#define IOMUXC_GPIO_AD_14_FLEXIO2_D14                          0x144 0x388 0x0 0x8 0x0
+#define IOMUXC_GPIO_AD_14_CCM_ENET_REF_CLK_25M                 0x144 0x388 0x0 0x9 0x0
+#define IOMUXC_GPIO_AD_14_GPIO9_IO13                           0x144 0x388 0x0 0xA 0x0
+#define IOMUXC_GPIO_AD_14_FLEXPWM3_PWM0_X                      0x144 0x388 0x0 0xB 0x0
+
+#define IOMUXC_GPIO_AD_15_GPIO9_IO14                           0x148 0x38C 0x0 0xA 0x0
+#define IOMUXC_GPIO_AD_15_FLEXPWM3_PWM1_X                      0x148 0x38C 0x0 0xB 0x0
+#define IOMUXC_GPIO_AD_15_SPDIF_IN                             0x148 0x38C 0x6B4 0x0 0x1
+#define IOMUXC_GPIO_AD_15_LPUART10_TXD                         0x148 0x38C 0x628 0x1 0x0
+#define IOMUXC_GPIO_AD_15_GPT1_COMPARE2                                0x148 0x38C 0x0 0x2 0x0
+#define IOMUXC_GPIO_AD_15_FLEXSPI1_B_DATA00                    0x148 0x38C 0x564 0x3 0x0
+#define IOMUXC_GPIO_AD_15_VIDEO_MUX_CSI_HSYNC                  0x148 0x38C 0x0 0x4 0x0
+#define IOMUXC_GPIO_AD_15_GPIO_MUX3_IO14                       0x148 0x38C 0x0 0x5 0x0
+#define IOMUXC_GPIO_AD_15_ENET_TX_ER                           0x148 0x38C 0x0 0x6 0x0
+#define IOMUXC_GPIO_AD_15_FLEXIO2_D15                          0x148 0x38C 0x0 0x8 0x0
+
+#define IOMUXC_GPIO_AD_16_SPDIF_OUT                            0x14C 0x390 0x0 0x0 0x0
+#define IOMUXC_GPIO_AD_16_LPUART10_RXD                         0x14C 0x390 0x624 0x1 0x0
+#define IOMUXC_GPIO_AD_16_GPT1_COMPARE3                                0x14C 0x390 0x0 0x2 0x0
+#define IOMUXC_GPIO_AD_16_FLEXSPI1_B_SCLK                      0x14C 0x390 0x578 0x3 0x0
+#define IOMUXC_GPIO_AD_16_VIDEO_MUX_CSI_DATA09                 0x14C 0x390 0x0 0x4 0x0
+#define IOMUXC_GPIO_AD_16_GPIO_MUX3_IO15                       0x14C 0x390 0x0 0x5 0x0
+#define IOMUXC_GPIO_AD_16_ENET_RX_DATA03                       0x14C 0x390 0x0 0x6 0x0
+#define IOMUXC_GPIO_AD_16_FLEXIO2_D16                          0x14C 0x390 0x0 0x8 0x0
+#define IOMUXC_GPIO_AD_16_ENET_1G_MDC                          0x14C 0x390 0x0 0x9 0x0
+#define IOMUXC_GPIO_AD_16_GPIO9_IO15                           0x14C 0x390 0x0 0xA 0x0
+#define IOMUXC_GPIO_AD_16_FLEXPWM3_PWM2_X                      0x14C 0x390 0x0 0xB 0x0
+
+#define IOMUXC_GPIO_AD_17_SAI1_MCLK                            0x150 0x394 0x66C 0x0 0x0
+#define IOMUXC_GPIO_AD_17_ACMP1_OUT                            0x150 0x394 0x0 0x1 0x0
+#define IOMUXC_GPIO_AD_17_GPT1_CLK                             0x150 0x394 0x0 0x2 0x0
+#define IOMUXC_GPIO_AD_17_FLEXSPI1_A_DQS                       0x150 0x394 0x550 0x3 0x1
+#define IOMUXC_GPIO_AD_17_VIDEO_MUX_CSI_DATA08                 0x150 0x394 0x0 0x4 0x0
+#define IOMUXC_GPIO_AD_17_GPIO_MUX3_IO16                       0x150 0x394 0x0 0x5 0x0
+#define IOMUXC_GPIO_AD_17_ENET_RX_DATA02                       0x150 0x394 0x0 0x6 0x0
+#define IOMUXC_GPIO_AD_17_FLEXIO2_D17                          0x150 0x394 0x0 0x8 0x0
+#define IOMUXC_GPIO_AD_17_ENET_1G_MDIO                         0x150 0x394 0x4C8 0x9 0x2
+#define IOMUXC_GPIO_AD_17_GPIO9_IO16                           0x150 0x394 0x0 0xA 0x0
+#define IOMUXC_GPIO_AD_17_FLEXPWM3_PWM3_X                      0x150 0x394 0x0 0xB 0x0
+
+#define IOMUXC_GPIO_AD_18_GPIO9_IO17                           0x154 0x398 0x0 0xA 0x0
+#define IOMUXC_GPIO_AD_18_FLEXPWM4_PWM0_X                      0x154 0x398 0x0 0xB 0x0
+#define IOMUXC_GPIO_AD_18_SAI1_RX_SYNC                         0x154 0x398 0x678 0x0 0x0
+#define IOMUXC_GPIO_AD_18_ACMP2_OUT                            0x154 0x398 0x0 0x1 0x0
+#define IOMUXC_GPIO_AD_18_LPSPI1_PCS1                          0x154 0x398 0x0 0x2 0x0
+#define IOMUXC_GPIO_AD_18_FLEXSPI1_A_SS0_B                     0x154 0x398 0x0 0x3 0x0
+#define IOMUXC_GPIO_AD_18_VIDEO_MUX_CSI_DATA07                 0x154 0x398 0x0 0x4 0x0
+#define IOMUXC_GPIO_AD_18_GPIO_MUX3_IO17                       0x154 0x398 0x0 0x5 0x0
+#define IOMUXC_GPIO_AD_18_ENET_CRS                             0x154 0x398 0x0 0x6 0x0
+#define IOMUXC_GPIO_AD_18_FLEXIO2_D18                          0x154 0x398 0x0 0x8 0x0
+#define IOMUXC_GPIO_AD_18_LPI2C2_SCL                           0x154 0x398 0x5B4 0x9 0x1
+
+#define IOMUXC_GPIO_AD_19_SAI1_RX_BCLK                         0x158 0x39C 0x670 0x0 0x0
+#define IOMUXC_GPIO_AD_19_ACMP3_OUT                            0x158 0x39C 0x0 0x1 0x0
+#define IOMUXC_GPIO_AD_19_LPSPI1_PCS2                          0x158 0x39C 0x0 0x2 0x0
+#define IOMUXC_GPIO_AD_19_FLEXSPI1_A_SCLK                      0x158 0x39C 0x574 0x3 0x0
+#define IOMUXC_GPIO_AD_19_VIDEO_MUX_CSI_DATA06                 0x158 0x39C 0x0 0x4 0x0
+#define IOMUXC_GPIO_AD_19_GPIO_MUX3_IO18                       0x158 0x39C 0x0 0x5 0x0
+#define IOMUXC_GPIO_AD_19_ENET_COL                             0x158 0x39C 0x0 0x6 0x0
+#define IOMUXC_GPIO_AD_19_FLEXIO2_D19                          0x158 0x39C 0x0 0x8 0x0
+#define IOMUXC_GPIO_AD_19_LPI2C2_SDA                           0x158 0x39C 0x5B8 0x9 0x1
+#define IOMUXC_GPIO_AD_19_GPIO9_IO18                           0x158 0x39C 0x0 0xA 0x0
+#define IOMUXC_GPIO_AD_19_FLEXPWM4_PWM1_X                      0x158 0x39C 0x0 0xB 0x0
+
+#define IOMUXC_GPIO_AD_20_SAI1_RX_DATA00                       0x15C 0x3A0 0x674 0x0 0x0
+#define IOMUXC_GPIO_AD_20_ACMP4_OUT                            0x15C 0x3A0 0x0 0x1 0x0
+#define IOMUXC_GPIO_AD_20_LPSPI1_PCS3                          0x15C 0x3A0 0x0 0x2 0x0
+#define IOMUXC_GPIO_AD_20_FLEXSPI1_A_DATA00                    0x15C 0x3A0 0x554 0x3 0x0
+#define IOMUXC_GPIO_AD_20_VIDEO_MUX_CSI_DATA05                 0x15C 0x3A0 0x0 0x4 0x0
+#define IOMUXC_GPIO_AD_20_GPIO_MUX3_IO19                       0x15C 0x3A0 0x0 0x5 0x0
+#define IOMUXC_GPIO_AD_20_KPP_ROW07                            0x15C 0x3A0 0x5A8 0x6 0x0
+#define IOMUXC_GPIO_AD_20_FLEXIO2_D20                          0x15C 0x3A0 0x0 0x8 0x0
+#define IOMUXC_GPIO_AD_20_ENET_QOS_1588_EVENT2_OUT             0x15C 0x3A0 0x0 0x9 0x0
+#define IOMUXC_GPIO_AD_20_GPIO9_IO19                           0x15C 0x3A0 0x0 0xA 0x0
+#define IOMUXC_GPIO_AD_20_FLEXPWM4_PWM2_X                      0x15C 0x3A0 0x0 0xB 0x0
+
+#define IOMUXC_GPIO_AD_21_SAI1_TX_DATA00                       0x160 0x3A4 0x0 0x0 0x0
+#define IOMUXC_GPIO_AD_21_LPSPI2_PCS1                          0x160 0x3A4 0x5E0 0x2 0x0
+#define IOMUXC_GPIO_AD_21_FLEXSPI1_A_DATA01                    0x160 0x3A4 0x558 0x3 0x0
+#define IOMUXC_GPIO_AD_21_VIDEO_MUX_CSI_DATA04                 0x160 0x3A4 0x0 0x4 0x0
+#define IOMUXC_GPIO_AD_21_GPIO_MUX3_IO20                       0x160 0x3A4 0x0 0x5 0x0
+#define IOMUXC_GPIO_AD_21_KPP_COL07                            0x160 0x3A4 0x5A0 0x6 0x0
+#define IOMUXC_GPIO_AD_21_FLEXIO2_D21                          0x160 0x3A4 0x0 0x8 0x0
+#define IOMUXC_GPIO_AD_21_ENET_QOS_1588_EVENT2_IN              0x160 0x3A4 0x0 0x9 0x0
+#define IOMUXC_GPIO_AD_21_GPIO9_IO20                           0x160 0x3A4 0x0 0xA 0x0
+#define IOMUXC_GPIO_AD_21_FLEXPWM4_PWM3_X                      0x160 0x3A4 0x0 0xB 0x0
+
+#define IOMUXC_GPIO_AD_22_GPIO9_IO21                           0x164 0x3A8 0x0 0xA 0x0
+#define IOMUXC_GPIO_AD_22_SAI1_TX_BCLK                         0x164 0x3A8 0x67C 0x0 0x0
+#define IOMUXC_GPIO_AD_22_LPSPI2_PCS2                          0x164 0x3A8 0x0 0x2 0x0
+#define IOMUXC_GPIO_AD_22_FLEXSPI1_A_DATA02                    0x164 0x3A8 0x55C 0x3 0x0
+#define IOMUXC_GPIO_AD_22_VIDEO_MUX_CSI_DATA03                 0x164 0x3A8 0x0 0x4 0x0
+#define IOMUXC_GPIO_AD_22_GPIO_MUX3_IO21                       0x164 0x3A8 0x0 0x5 0x0
+#define IOMUXC_GPIO_AD_22_KPP_ROW06                            0x164 0x3A8 0x5A4 0x6 0x0
+#define IOMUXC_GPIO_AD_22_FLEXIO2_D22                          0x164 0x3A8 0x0 0x8 0x0
+#define IOMUXC_GPIO_AD_22_ENET_QOS_1588_EVENT3_OUT             0x164 0x3A8 0x0 0x9 0x0
+
+#define IOMUXC_GPIO_AD_23_SAI1_TX_SYNC                         0x168 0x3AC 0x680 0x0 0x0
+#define IOMUXC_GPIO_AD_23_LPSPI2_PCS3                          0x168 0x3AC 0x0 0x2 0x0
+#define IOMUXC_GPIO_AD_23_FLEXSPI1_A_DATA03                    0x168 0x3AC 0x560 0x3 0x0
+#define IOMUXC_GPIO_AD_23_VIDEO_MUX_CSI_DATA02                 0x168 0x3AC 0x0 0x4 0x0
+#define IOMUXC_GPIO_AD_23_GPIO_MUX3_IO22                       0x168 0x3AC 0x0 0x5 0x0
+#define IOMUXC_GPIO_AD_23_KPP_COL06                            0x168 0x3AC 0x59C 0x6 0x0
+#define IOMUXC_GPIO_AD_23_FLEXIO2_D23                          0x168 0x3AC 0x0 0x8 0x0
+#define IOMUXC_GPIO_AD_23_ENET_QOS_1588_EVENT3_IN              0x168 0x3AC 0x0 0x9 0x0
+#define IOMUXC_GPIO_AD_23_GPIO9_IO22                           0x168 0x3AC 0x0 0xA 0x0
+
+#define IOMUXC_GPIO_AD_24_LPUART1_TXD                          0x16C 0x3B0 0x620 0x0 0x0
+#define IOMUXC_GPIO_AD_24_LPSPI2_SCK                           0x16C 0x3B0 0x5E4 0x1 0x0
+#define IOMUXC_GPIO_AD_24_VIDEO_MUX_CSI_DATA00                 0x16C 0x3B0 0x0 0x2 0x0
+#define IOMUXC_GPIO_AD_24_ENET_RX_EN                           0x16C 0x3B0 0x4B8 0x3 0x0
+#define IOMUXC_GPIO_AD_24_FLEXPWM2_PWM0_A                      0x16C 0x3B0 0x518 0x4 0x1
+#define IOMUXC_GPIO_AD_24_GPIO_MUX3_IO23                       0x16C 0x3B0 0x0 0x5 0x0
+#define IOMUXC_GPIO_AD_24_KPP_ROW05                            0x16C 0x3B0 0x0 0x6 0x0
+#define IOMUXC_GPIO_AD_24_FLEXIO2_D24                          0x16C 0x3B0 0x0 0x8 0x0
+#define IOMUXC_GPIO_AD_24_LPI2C4_SCL                           0x16C 0x3B0 0x5C4 0x9 0x0
+#define IOMUXC_GPIO_AD_24_GPIO9_IO23                           0x16C 0x3B0 0x0 0xA 0x0
+
+#define IOMUXC_GPIO_AD_25_GPIO9_IO24                           0x170 0x3B4 0x0 0xA 0x0
+#define IOMUXC_GPIO_AD_25_LPUART1_RXD                          0x170 0x3B4 0x61C 0x0 0x0
+#define IOMUXC_GPIO_AD_25_LPSPI2_PCS0                          0x170 0x3B4 0x5DC 0x1 0x0
+#define IOMUXC_GPIO_AD_25_VIDEO_MUX_CSI_DATA01                 0x170 0x3B4 0x0 0x2 0x0
+#define IOMUXC_GPIO_AD_25_ENET_RX_ER                           0x170 0x3B4 0x4BC 0x3 0x0
+#define IOMUXC_GPIO_AD_25_FLEXPWM2_PWM0_B                      0x170 0x3B4 0x524 0x4 0x1
+#define IOMUXC_GPIO_AD_25_GPIO_MUX3_IO24                       0x170 0x3B4 0x0 0x5 0x0
+#define IOMUXC_GPIO_AD_25_KPP_COL05                            0x170 0x3B4 0x0 0x6 0x0
+#define IOMUXC_GPIO_AD_25_FLEXIO2_D25                          0x170 0x3B4 0x0 0x8 0x0
+#define IOMUXC_GPIO_AD_25_LPI2C4_SDA                           0x170 0x3B4 0x5C8 0x9 0x0
+
+#define IOMUXC_GPIO_AD_26_LPUART1_CTS_B                                0x174 0x3B8 0x0 0x0 0x0
+#define IOMUXC_GPIO_AD_26_LPSPI2_SOUT                          0x174 0x3B8 0x5EC 0x1 0x0
+#define IOMUXC_GPIO_AD_26_SEMC_CSX01                           0x174 0x3B8 0x0 0x2 0x0
+#define IOMUXC_GPIO_AD_26_ENET_RX_DATA00                       0x174 0x3B8 0x4B0 0x3 0x0
+#define IOMUXC_GPIO_AD_26_FLEXPWM2_PWM1_A                      0x174 0x3B8 0x51C 0x4 0x1
+#define IOMUXC_GPIO_AD_26_GPIO_MUX3_IO25                       0x174 0x3B8 0x0 0x5 0x0
+#define IOMUXC_GPIO_AD_26_KPP_ROW04                            0x174 0x3B8 0x0 0x6 0x0
+#define IOMUXC_GPIO_AD_26_FLEXIO2_D26                          0x174 0x3B8 0x0 0x8 0x0
+#define IOMUXC_GPIO_AD_26_ENET_QOS_MDC                         0x174 0x3B8 0x0 0x9 0x0
+#define IOMUXC_GPIO_AD_26_GPIO9_IO25                           0x174 0x3B8 0x0 0xA 0x0
+#define IOMUXC_GPIO_AD_26_USDHC2_CD_B                          0x174 0x3B8 0x6D0 0xB 0x1
+
+#define IOMUXC_GPIO_AD_27_LPUART1_RTS_B                                0x178 0x3BC 0x0 0x0 0x0
+#define IOMUXC_GPIO_AD_27_LPSPI2_SIN                           0x178 0x3BC 0x5E8 0x1 0x0
+#define IOMUXC_GPIO_AD_27_SEMC_CSX02                           0x178 0x3BC 0x0 0x2 0x0
+#define IOMUXC_GPIO_AD_27_ENET_RX_DATA01                       0x178 0x3BC 0x4B4 0x3 0x0
+#define IOMUXC_GPIO_AD_27_FLEXPWM2_PWM1_B                      0x178 0x3BC 0x528 0x4 0x1
+#define IOMUXC_GPIO_AD_27_GPIO_MUX3_IO26                       0x178 0x3BC 0x0 0x5 0x0
+#define IOMUXC_GPIO_AD_27_KPP_COL04                            0x178 0x3BC 0x0 0x6 0x0
+#define IOMUXC_GPIO_AD_27_FLEXIO2_D27                          0x178 0x3BC 0x0 0x8 0x0
+#define IOMUXC_GPIO_AD_27_ENET_QOS_MDIO                                0x178 0x3BC 0x4EC 0x9 0x1
+#define IOMUXC_GPIO_AD_27_GPIO9_IO26                           0x178 0x3BC 0x0 0xA 0x0
+#define IOMUXC_GPIO_AD_27_USDHC2_WP                            0x178 0x3BC 0x6D4 0xB 0x1
+
+#define IOMUXC_GPIO_AD_28_GPIO9_IO27                           0x17C 0x3C0 0x0 0xA 0x0
+#define IOMUXC_GPIO_AD_28_USDHC2_VSELECT                       0x17C 0x3C0 0x0 0xB 0x0
+#define IOMUXC_GPIO_AD_28_LPSPI1_SCK                           0x17C 0x3C0 0x5D0 0x0 0x1
+#define IOMUXC_GPIO_AD_28_LPUART5_TXD                          0x17C 0x3C0 0x0 0x1 0x0
+#define IOMUXC_GPIO_AD_28_SEMC_CSX03                           0x17C 0x3C0 0x0 0x2 0x0
+#define IOMUXC_GPIO_AD_28_ENET_TX_EN                           0x17C 0x3C0 0x0 0x3 0x0
+#define IOMUXC_GPIO_AD_28_FLEXPWM2_PWM2_A                      0x17C 0x3C0 0x520 0x4 0x1
+#define IOMUXC_GPIO_AD_28_GPIO_MUX3_IO27                       0x17C 0x3C0 0x0 0x5 0x0
+#define IOMUXC_GPIO_AD_28_KPP_ROW03                            0x17C 0x3C0 0x0 0x6 0x0
+#define IOMUXC_GPIO_AD_28_FLEXIO2_D28                          0x17C 0x3C0 0x0 0x8 0x0
+#define IOMUXC_GPIO_AD_28_VIDEO_MUX_EXT_DCIC1                  0x17C 0x3C0 0x0 0x9 0x0
+
+#define IOMUXC_GPIO_AD_29_LPSPI1_PCS0                          0x180 0x3C4 0x5CC 0x0 0x1
+#define IOMUXC_GPIO_AD_29_LPUART5_RXD                          0x180 0x3C4 0x0 0x1 0x0
+#define IOMUXC_GPIO_AD_29_ENET_REF_CLK                         0x180 0x3C4 0x4A8 0x2 0x0
+#define IOMUXC_GPIO_AD_29_ENET_TX_CLK                          0x180 0x3C4 0x4C0 0x3 0x0
+#define IOMUXC_GPIO_AD_29_FLEXPWM2_PWM2_B                      0x180 0x3C4 0x52C 0x4 0x1
+#define IOMUXC_GPIO_AD_29_GPIO_MUX3_IO28                       0x180 0x3C4 0x0 0x5 0x0
+#define IOMUXC_GPIO_AD_29_KPP_COL03                            0x180 0x3C4 0x0 0x6 0x0
+#define IOMUXC_GPIO_AD_29_FLEXIO2_D29                          0x180 0x3C4 0x0 0x8 0x0
+#define IOMUXC_GPIO_AD_29_VIDEO_MUX_EXT_DCIC2                  0x180 0x3C4 0x0 0x9 0x0
+#define IOMUXC_GPIO_AD_29_GPIO9_IO28                           0x180 0x3C4 0x0 0xA 0x0
+#define IOMUXC_GPIO_AD_29_USDHC2_RESET_B                       0x180 0x3C4 0x0 0xB 0x0
+
+#define IOMUXC_GPIO_AD_30_LPSPI1_SOUT                          0x184 0x3C8 0x5D8 0x0 0x1
+#define IOMUXC_GPIO_AD_30_USB_OTG2_OC                          0x184 0x3C8 0x6B8 0x1 0x1
+#define IOMUXC_GPIO_AD_30_FLEXCAN2_TX                          0x184 0x3C8 0x0 0x2 0x0
+#define IOMUXC_GPIO_AD_30_ENET_TX_DATA00                       0x184 0x3C8 0x0 0x3 0x0
+#define IOMUXC_GPIO_AD_30_LPUART3_TXD                          0x184 0x3C8 0x0 0x4 0x0
+#define IOMUXC_GPIO_AD_30_GPIO_MUX3_IO29                       0x184 0x3C8 0x0 0x5 0x0
+#define IOMUXC_GPIO_AD_30_KPP_ROW02                            0x184 0x3C8 0x0 0x6 0x0
+#define IOMUXC_GPIO_AD_30_FLEXIO2_D30                          0x184 0x3C8 0x0 0x8 0x0
+#define IOMUXC_GPIO_AD_30_WDOG2_RESET_B_DEB                    0x184 0x3C8 0x0 0x9 0x0
+#define IOMUXC_GPIO_AD_30_GPIO9_IO29                           0x184 0x3C8 0x0 0xA 0x0
+
+#define IOMUXC_GPIO_AD_31_LPSPI1_SIN                           0x188 0x3CC 0x5D4 0x0 0x1
+#define IOMUXC_GPIO_AD_31_USB_OTG2_PWR                         0x188 0x3CC 0x0 0x1 0x0
+#define IOMUXC_GPIO_AD_31_FLEXCAN2_RX                          0x188 0x3CC 0x49C 0x2 0x1
+#define IOMUXC_GPIO_AD_31_ENET_TX_DATA01                       0x188 0x3CC 0x0 0x3 0x0
+#define IOMUXC_GPIO_AD_31_LPUART3_RXD                          0x188 0x3CC 0x0 0x4 0x0
+#define IOMUXC_GPIO_AD_31_GPIO_MUX3_IO30                       0x188 0x3CC 0x0 0x5 0x0
+#define IOMUXC_GPIO_AD_31_KPP_COL02                            0x188 0x3CC 0x0 0x6 0x0
+#define IOMUXC_GPIO_AD_31_FLEXIO2_D31                          0x188 0x3CC 0x0 0x8 0x0
+#define IOMUXC_GPIO_AD_31_WDOG1_RESET_B_DEB                    0x188 0x3CC 0x0 0x9 0x0
+#define IOMUXC_GPIO_AD_31_GPIO9_IO30                           0x188 0x3CC 0x0 0xA 0x0
+
+#define IOMUXC_GPIO_AD_32_GPIO9_IO31                           0x18C 0x3D0 0x0 0xA 0x0
+#define IOMUXC_GPIO_AD_32_LPI2C1_SCL                           0x18C 0x3D0 0x5AC 0x0 0x1
+#define IOMUXC_GPIO_AD_32_USBPHY2_OTG_ID                       0x18C 0x3D0 0x6C4 0x1 0x1
+#define IOMUXC_GPIO_AD_32_PGMC_PMIC_RDY                                0x18C 0x3D0 0x0 0x2 0x0
+#define IOMUXC_GPIO_AD_32_ENET_MDC                             0x18C 0x3D0 0x0 0x3 0x0
+#define IOMUXC_GPIO_AD_32_USDHC1_CD_B                          0x18C 0x3D0 0x6C8 0x4 0x0
+#define IOMUXC_GPIO_AD_32_GPIO_MUX3_IO31                       0x18C 0x3D0 0x0 0x5 0x0
+#define IOMUXC_GPIO_AD_32_KPP_ROW01                            0x18C 0x3D0 0x0 0x6 0x0
+#define IOMUXC_GPIO_AD_32_LPUART10_TXD                         0x18C 0x3D0 0x628 0x8 0x1
+#define IOMUXC_GPIO_AD_32_ENET_1G_MDC                          0x18C 0x3D0 0x0 0x9 0x0
+
+#define IOMUXC_GPIO_AD_33_LPI2C1_SDA                           0x190 0x3D4 0x5B0 0x0 0x1
+#define IOMUXC_GPIO_AD_33_USBPHY1_OTG_ID                       0x190 0x3D4 0x6C0 0x1 0x1
+#define IOMUXC_GPIO_AD_33_XBAR1_INOUT17                                0x190 0x3D4 0x0 0x2 0x0
+#define IOMUXC_GPIO_AD_33_ENET_MDIO                            0x190 0x3D4 0x4AC 0x3 0x1
+#define IOMUXC_GPIO_AD_33_USDHC1_WP                            0x190 0x3D4 0x6CC 0x4 0x0
+#define IOMUXC_GPIO_AD_33_GPIO_MUX4_IO00                       0x190 0x3D4 0x0 0x5 0x0
+#define IOMUXC_GPIO_AD_33_KPP_COL01                            0x190 0x3D4 0x0 0x6 0x0
+#define IOMUXC_GPIO_AD_33_LPUART10_RXD                         0x190 0x3D4 0x624 0x8 0x1
+#define IOMUXC_GPIO_AD_33_ENET_1G_MDIO                         0x190 0x3D4 0x4C8 0x9 0x3
+#define IOMUXC_GPIO_AD_33_GPIO10_IO00                          0x190 0x3D4 0x0 0xA 0x0
+
+#define IOMUXC_GPIO_AD_34_ENET_1G_1588_EVENT0_IN               0x194 0x3D8 0x0 0x0 0x0
+#define IOMUXC_GPIO_AD_34_USB_OTG1_PWR                         0x194 0x3D8 0x0 0x1 0x0
+#define IOMUXC_GPIO_AD_34_XBAR1_INOUT18                                0x194 0x3D8 0x0 0x2 0x0
+#define IOMUXC_GPIO_AD_34_ENET_1588_EVENT0_IN                  0x194 0x3D8 0x0 0x3 0x0
+#define IOMUXC_GPIO_AD_34_USDHC1_VSELECT                       0x194 0x3D8 0x0 0x4 0x0
+#define IOMUXC_GPIO_AD_34_GPIO_MUX4_IO01                       0x194 0x3D8 0x0 0x5 0x0
+#define IOMUXC_GPIO_AD_34_KPP_ROW00                            0x194 0x3D8 0x0 0x6 0x0
+#define IOMUXC_GPIO_AD_34_LPUART10_CTS_B                       0x194 0x3D8 0x0 0x8 0x0
+#define IOMUXC_GPIO_AD_34_WDOG1_ANY                            0x194 0x3D8 0x0 0x9 0x0
+#define IOMUXC_GPIO_AD_34_GPIO10_IO01                          0x194 0x3D8 0x0 0xA 0x0
+
+#define IOMUXC_GPIO_AD_35_GPIO10_IO02                          0x198 0x3DC 0x0 0xA 0x0
+#define IOMUXC_GPIO_AD_35_ENET_1G_1588_EVENT0_OUT              0x198 0x3DC 0x0 0x0 0x0
+#define IOMUXC_GPIO_AD_35_USB_OTG1_OC                          0x198 0x3DC 0x6BC 0x1 0x1
+#define IOMUXC_GPIO_AD_35_XBAR1_INOUT19                                0x198 0x3DC 0x0 0x2 0x0
+#define IOMUXC_GPIO_AD_35_ENET_1588_EVENT0_OUT                 0x198 0x3DC 0x0 0x3 0x0
+#define IOMUXC_GPIO_AD_35_USDHC1_RESET_B                       0x198 0x3DC 0x0 0x4 0x0
+#define IOMUXC_GPIO_AD_35_GPIO_MUX4_IO02                       0x198 0x3DC 0x0 0x5 0x0
+#define IOMUXC_GPIO_AD_35_KPP_COL00                            0x198 0x3DC 0x0 0x6 0x0
+#define IOMUXC_GPIO_AD_35_LPUART10_RTS_B                       0x198 0x3DC 0x0 0x8 0x0
+#define IOMUXC_GPIO_AD_35_FLEXSPI1_B_SS1_B                     0x198 0x3DC 0x0 0x9 0x0
+
+#define IOMUXC_GPIO_SD_B1_00_USDHC1_CMD                                0x19C 0x3E0 0x0 0x0 0x0
+#define IOMUXC_GPIO_SD_B1_00_XBAR1_INOUT20                     0x19C 0x3E0 0x6D8 0x2 0x1
+#define IOMUXC_GPIO_SD_B1_00_GPT4_CAPTURE1                     0x19C 0x3E0 0x0 0x3 0x0
+#define IOMUXC_GPIO_SD_B1_00_GPIO_MUX4_IO03                    0x19C 0x3E0 0x0 0x5 0x0
+#define IOMUXC_GPIO_SD_B1_00_FLEXSPI2_A_SS0_B                  0x19C 0x3E0 0x0 0x6 0x0
+#define IOMUXC_GPIO_SD_B1_00_KPP_ROW07                         0x19C 0x3E0 0x5A8 0x8 0x1
+#define IOMUXC_GPIO_SD_B1_00_GPIO10_IO03                       0x19C 0x3E0 0x0 0xA 0x0
+
+#define IOMUXC_GPIO_SD_B1_01_USDHC1_CLK                                0x1A0 0x3E4 0x0 0x0 0x0
+#define IOMUXC_GPIO_SD_B1_01_XBAR1_INOUT21                     0x1A0 0x3E4 0x6DC 0x2 0x1
+#define IOMUXC_GPIO_SD_B1_01_GPT4_CAPTURE2                     0x1A0 0x3E4 0x0 0x3 0x0
+#define IOMUXC_GPIO_SD_B1_01_GPIO_MUX4_IO04                    0x1A0 0x3E4 0x0 0x5 0x0
+#define IOMUXC_GPIO_SD_B1_01_FLEXSPI2_A_SCLK                   0x1A0 0x3E4 0x58C 0x6 0x1
+#define IOMUXC_GPIO_SD_B1_01_KPP_COL07                         0x1A0 0x3E4 0x5A0 0x8 0x1
+#define IOMUXC_GPIO_SD_B1_01_GPIO10_IO04                       0x1A0 0x3E4 0x0 0xA 0x0
+
+#define IOMUXC_GPIO_SD_B1_02_GPIO10_IO05                       0x1A4 0x3E8 0x0 0xA 0x0
+#define IOMUXC_GPIO_SD_B1_02_USDHC1_DATA0                      0x1A4 0x3E8 0x0 0x0 0x0
+#define IOMUXC_GPIO_SD_B1_02_XBAR1_INOUT22                     0x1A4 0x3E8 0x6E0 0x2 0x1
+#define IOMUXC_GPIO_SD_B1_02_GPT4_COMPARE1                     0x1A4 0x3E8 0x0 0x3 0x0
+#define IOMUXC_GPIO_SD_B1_02_GPIO_MUX4_IO05                    0x1A4 0x3E8 0x0 0x5 0x0
+#define IOMUXC_GPIO_SD_B1_02_FLEXSPI2_A_DATA00                 0x1A4 0x3E8 0x57C 0x6 0x1
+#define IOMUXC_GPIO_SD_B1_02_KPP_ROW06                         0x1A4 0x3E8 0x5A4 0x8 0x1
+#define IOMUXC_GPIO_SD_B1_02_FLEXSPI1_A_SS1_B                  0x1A4 0x3E8 0x0 0x9 0x0
+
+#define IOMUXC_GPIO_SD_B1_03_USDHC1_DATA1                      0x1A8 0x3EC 0x0 0x0 0x0
+#define IOMUXC_GPIO_SD_B1_03_XBAR1_INOUT23                     0x1A8 0x3EC 0x6E4 0x2 0x1
+#define IOMUXC_GPIO_SD_B1_03_GPT4_COMPARE2                     0x1A8 0x3EC 0x0 0x3 0x0
+#define IOMUXC_GPIO_SD_B1_03_GPIO_MUX4_IO06                    0x1A8 0x3EC 0x0 0x5 0x0
+#define IOMUXC_GPIO_SD_B1_03_FLEXSPI2_A_DATA01                 0x1A8 0x3EC 0x580 0x6 0x1
+#define IOMUXC_GPIO_SD_B1_03_KPP_COL06                         0x1A8 0x3EC 0x59C 0x8 0x1
+#define IOMUXC_GPIO_SD_B1_03_FLEXSPI1_B_SS1_B                  0x1A8 0x3EC 0x0 0x9 0x0
+#define IOMUXC_GPIO_SD_B1_03_GPIO10_IO06                       0x1A8 0x3EC 0x0 0xA 0x0
+
+#define IOMUXC_GPIO_SD_B1_04_USDHC1_DATA2                      0x1AC 0x3F0 0x0 0x0 0x0
+#define IOMUXC_GPIO_SD_B1_04_XBAR1_INOUT24                     0x1AC 0x3F0 0x6E8 0x2 0x1
+#define IOMUXC_GPIO_SD_B1_04_GPT4_COMPARE3                     0x1AC 0x3F0 0x0 0x3 0x0
+#define IOMUXC_GPIO_SD_B1_04_GPIO_MUX4_IO07                    0x1AC 0x3F0 0x0 0x5 0x0
+#define IOMUXC_GPIO_SD_B1_04_FLEXSPI2_A_DATA02                 0x1AC 0x3F0 0x584 0x6 0x1
+#define IOMUXC_GPIO_SD_B1_04_FLEXSPI1_B_SS0_B                  0x1AC 0x3F0 0x0 0x8 0x0
+#define IOMUXC_GPIO_SD_B1_04_ENET_QOS_1588_EVENT2_AUX_IN       0x1AC 0x3F0 0x0 0x9 0x0
+#define IOMUXC_GPIO_SD_B1_04_GPIO10_IO07                       0x1AC 0x3F0 0x0 0xA 0x0
+
+#define IOMUXC_GPIO_SD_B1_05_GPIO10_IO08                       0x1B0 0x3F4 0x0 0xA 0x0
+#define IOMUXC_GPIO_SD_B1_05_USDHC1_DATA3                      0x1B0 0x3F4 0x0 0x0 0x0
+#define IOMUXC_GPIO_SD_B1_05_XBAR1_INOUT25                     0x1B0 0x3F4 0x6EC 0x2 0x1
+#define IOMUXC_GPIO_SD_B1_05_GPT4_CLK                          0x1B0 0x3F4 0x0 0x3 0x0
+#define IOMUXC_GPIO_SD_B1_05_GPIO_MUX4_IO08                    0x1B0 0x3F4 0x0 0x5 0x0
+#define IOMUXC_GPIO_SD_B1_05_FLEXSPI2_A_DATA03                 0x1B0 0x3F4 0x588 0x6 0x1
+#define IOMUXC_GPIO_SD_B1_05_FLEXSPI1_B_DQS                    0x1B0 0x3F4 0x0 0x8 0x0
+#define IOMUXC_GPIO_SD_B1_05_ENET_QOS_1588_EVENT3_AUX_IN       0x1B0 0x3F4 0x0 0x9 0x0
+
+#define IOMUXC_GPIO_SD_B2_00_GPIO10_IO09                       0x1B4 0x3F8 0x0 0xA 0x0
+#define IOMUXC_GPIO_SD_B2_00_USDHC2_DATA3                      0x1B4 0x3F8 0x0 0x0 0x0
+#define IOMUXC_GPIO_SD_B2_00_FLEXSPI1_B_DATA03                 0x1B4 0x3F8 0x570 0x1 0x1
+#define IOMUXC_GPIO_SD_B2_00_ENET_1G_RX_EN                     0x1B4 0x3F8 0x4E0 0x2 0x1
+#define IOMUXC_GPIO_SD_B2_00_LPUART9_TXD                       0x1B4 0x3F8 0x0 0x3 0x0
+#define IOMUXC_GPIO_SD_B2_00_LPSPI4_SCK                                0x1B4 0x3F8 0x610 0x4 0x0
+#define IOMUXC_GPIO_SD_B2_00_GPIO_MUX4_IO09                    0x1B4 0x3F8 0x0 0x5 0x0
+
+#define IOMUXC_GPIO_SD_B2_01_USDHC2_DATA2                      0x1B8 0x3FC 0x0 0x0 0x0
+#define IOMUXC_GPIO_SD_B2_01_FLEXSPI1_B_DATA02                 0x1B8 0x3FC 0x56C 0x1 0x1
+#define IOMUXC_GPIO_SD_B2_01_ENET_1G_RX_CLK                    0x1B8 0x3FC 0x4CC 0x2 0x1
+#define IOMUXC_GPIO_SD_B2_01_LPUART9_RXD                       0x1B8 0x3FC 0x0 0x3 0x0
+#define IOMUXC_GPIO_SD_B2_01_LPSPI4_PCS0                       0x1B8 0x3FC 0x60C 0x4 0x0
+#define IOMUXC_GPIO_SD_B2_01_GPIO_MUX4_IO10                    0x1B8 0x3FC 0x0 0x5 0x0
+#define IOMUXC_GPIO_SD_B2_01_GPIO10_IO10                       0x1B8 0x3FC 0x0 0xA 0x0
+
+#define IOMUXC_GPIO_SD_B2_02_GPIO10_IO11                       0x1BC 0x400 0x0 0xA 0x0
+#define IOMUXC_GPIO_SD_B2_02_USDHC2_DATA1                      0x1BC 0x400 0x0 0x0 0x0
+#define IOMUXC_GPIO_SD_B2_02_FLEXSPI1_B_DATA01                 0x1BC 0x400 0x568 0x1 0x1
+#define IOMUXC_GPIO_SD_B2_02_ENET_1G_RX_DATA00                 0x1BC 0x400 0x4D0 0x2 0x1
+#define IOMUXC_GPIO_SD_B2_02_LPUART9_CTS_B                     0x1BC 0x400 0x0 0x3 0x0
+#define IOMUXC_GPIO_SD_B2_02_LPSPI4_SOUT                       0x1BC 0x400 0x618 0x4 0x0
+#define IOMUXC_GPIO_SD_B2_02_GPIO_MUX4_IO11                    0x1BC 0x400 0x0 0x5 0x0
+
+#define IOMUXC_GPIO_SD_B2_03_GPIO10_IO12                       0x1C0 0x404 0x0 0xA 0x0
+#define IOMUXC_GPIO_SD_B2_03_USDHC2_DATA0                      0x1C0 0x404 0x0 0x0 0x0
+#define IOMUXC_GPIO_SD_B2_03_FLEXSPI1_B_DATA00                 0x1C0 0x404 0x564 0x1 0x1
+#define IOMUXC_GPIO_SD_B2_03_ENET_1G_RX_DATA01                 0x1C0 0x404 0x4D4 0x2 0x1
+#define IOMUXC_GPIO_SD_B2_03_LPUART9_RTS_B                     0x1C0 0x404 0x0 0x3 0x0
+#define IOMUXC_GPIO_SD_B2_03_LPSPI4_SIN                                0x1C0 0x404 0x614 0x4 0x0
+#define IOMUXC_GPIO_SD_B2_03_GPIO_MUX4_IO12                    0x1C0 0x404 0x0 0x5 0x0
+
+#define IOMUXC_GPIO_SD_B2_04_USDHC2_CLK                                0x1C4 0x408 0x0 0x0 0x0
+#define IOMUXC_GPIO_SD_B2_04_FLEXSPI1_B_SCLK                   0x1C4 0x408 0x578 0x1 0x1
+#define IOMUXC_GPIO_SD_B2_04_ENET_1G_RX_DATA02                 0x1C4 0x408 0x4D8 0x2 0x1
+#define IOMUXC_GPIO_SD_B2_04_FLEXSPI1_A_SS1_B                  0x1C4 0x408 0x0 0x3 0x0
+#define IOMUXC_GPIO_SD_B2_04_LPSPI4_PCS1                       0x1C4 0x408 0x0 0x4 0x0
+#define IOMUXC_GPIO_SD_B2_04_GPIO_MUX4_IO13                    0x1C4 0x408 0x0 0x5 0x0
+#define IOMUXC_GPIO_SD_B2_04_GPIO10_IO13                       0x1C4 0x408 0x0 0xA 0x0
+
+#define IOMUXC_GPIO_SD_B2_05_GPIO10_IO14                       0x1C8 0x40C 0x0 0xA 0x0
+#define IOMUXC_GPIO_SD_B2_05_USDHC2_CMD                                0x1C8 0x40C 0x0 0x0 0x0
+#define IOMUXC_GPIO_SD_B2_05_FLEXSPI1_A_DQS                    0x1C8 0x40C 0x550 0x1 0x2
+#define IOMUXC_GPIO_SD_B2_05_ENET_1G_RX_DATA03                 0x1C8 0x40C 0x4DC 0x2 0x1
+#define IOMUXC_GPIO_SD_B2_05_FLEXSPI1_B_SS0_B                  0x1C8 0x40C 0x0 0x3 0x0
+#define IOMUXC_GPIO_SD_B2_05_LPSPI4_PCS2                       0x1C8 0x40C 0x0 0x4 0x0
+#define IOMUXC_GPIO_SD_B2_05_GPIO_MUX4_IO14                    0x1C8 0x40C 0x0 0x5 0x0
+
+#define IOMUXC_GPIO_SD_B2_06_GPIO10_IO15                       0x1CC 0x410 0x0 0xA 0x0
+#define IOMUXC_GPIO_SD_B2_06_USDHC2_RESET_B                    0x1CC 0x410 0x0 0x0 0x0
+#define IOMUXC_GPIO_SD_B2_06_FLEXSPI1_A_SS0_B                  0x1CC 0x410 0x0 0x1 0x0
+#define IOMUXC_GPIO_SD_B2_06_ENET_1G_TX_DATA03                 0x1CC 0x410 0x0 0x2 0x0
+#define IOMUXC_GPIO_SD_B2_06_LPSPI4_PCS3                       0x1CC 0x410 0x0 0x3 0x0
+#define IOMUXC_GPIO_SD_B2_06_GPT6_CAPTURE1                     0x1CC 0x410 0x0 0x4 0x0
+#define IOMUXC_GPIO_SD_B2_06_GPIO_MUX4_IO15                    0x1CC 0x410 0x0 0x5 0x0
+
+#define IOMUXC_GPIO_SD_B2_07_USDHC2_STROBE                     0x1D0 0x414 0x0 0x0 0x0
+#define IOMUXC_GPIO_SD_B2_07_FLEXSPI1_A_SCLK                   0x1D0 0x414 0x574 0x1 0x1
+#define IOMUXC_GPIO_SD_B2_07_ENET_1G_TX_DATA02                 0x1D0 0x414 0x0 0x2 0x0
+#define IOMUXC_GPIO_SD_B2_07_LPUART3_CTS_B                     0x1D0 0x414 0x0 0x3 0x0
+#define IOMUXC_GPIO_SD_B2_07_GPT6_CAPTURE2                     0x1D0 0x414 0x0 0x4 0x0
+#define IOMUXC_GPIO_SD_B2_07_GPIO_MUX4_IO16                    0x1D0 0x414 0x0 0x5 0x0
+#define IOMUXC_GPIO_SD_B2_07_LPSPI2_SCK                                0x1D0 0x414 0x5E4 0x6 0x1
+#define IOMUXC_GPIO_SD_B2_07_ENET_TX_ER                                0x1D0 0x414 0x0 0x8 0x0
+#define IOMUXC_GPIO_SD_B2_07_ENET_QOS_REF_CLK                  0x1D0 0x414 0x4A0 0x9 0x1
+#define IOMUXC_GPIO_SD_B2_07_GPIO10_IO16                       0x1D0 0x414 0x0 0xA 0x0
+
+#define IOMUXC_GPIO_SD_B2_08_GPIO10_IO17                       0x1D4 0x418 0x0 0xA 0x0
+#define IOMUXC_GPIO_SD_B2_08_USDHC2_DATA4                      0x1D4 0x418 0x0 0x0 0x0
+#define IOMUXC_GPIO_SD_B2_08_FLEXSPI1_A_DATA00                 0x1D4 0x418 0x554 0x1 0x1
+#define IOMUXC_GPIO_SD_B2_08_ENET_1G_TX_DATA01                 0x1D4 0x418 0x0 0x2 0x0
+#define IOMUXC_GPIO_SD_B2_08_LPUART3_RTS_B                     0x1D4 0x418 0x0 0x3 0x0
+#define IOMUXC_GPIO_SD_B2_08_GPT6_COMPARE1                     0x1D4 0x418 0x0 0x4 0x0
+#define IOMUXC_GPIO_SD_B2_08_GPIO_MUX4_IO17                    0x1D4 0x418 0x0 0x5 0x0
+#define IOMUXC_GPIO_SD_B2_08_LPSPI2_PCS0                       0x1D4 0x418 0x5DC 0x6 0x1
+
+#define IOMUXC_GPIO_SD_B2_09_GPIO10_IO18                       0x1D8 0x41C 0x0 0xA 0x0
+#define IOMUXC_GPIO_SD_B2_09_USDHC2_DATA5                      0x1D8 0x41C 0x0 0x0 0x0
+#define IOMUXC_GPIO_SD_B2_09_FLEXSPI1_A_DATA01                 0x1D8 0x41C 0x558 0x1 0x1
+#define IOMUXC_GPIO_SD_B2_09_ENET_1G_TX_DATA00                 0x1D8 0x41C 0x0 0x2 0x0
+#define IOMUXC_GPIO_SD_B2_09_LPUART5_CTS_B                     0x1D8 0x41C 0x0 0x3 0x0
+#define IOMUXC_GPIO_SD_B2_09_GPT6_COMPARE2                     0x1D8 0x41C 0x0 0x4 0x0
+#define IOMUXC_GPIO_SD_B2_09_GPIO_MUX4_IO18                    0x1D8 0x41C 0x0 0x5 0x0
+#define IOMUXC_GPIO_SD_B2_09_LPSPI2_SOUT                       0x1D8 0x41C 0x5EC 0x6 0x1
+
+#define IOMUXC_GPIO_SD_B2_10_GPIO10_IO19                       0x1DC 0x420 0x0 0xA 0x0
+#define IOMUXC_GPIO_SD_B2_10_USDHC2_DATA6                      0x1DC 0x420 0x0 0x0 0x0
+#define IOMUXC_GPIO_SD_B2_10_FLEXSPI1_A_DATA02                 0x1DC 0x420 0x55C 0x1 0x1
+#define IOMUXC_GPIO_SD_B2_10_ENET_1G_TX_EN                     0x1DC 0x420 0x0 0x2 0x0
+#define IOMUXC_GPIO_SD_B2_10_LPUART5_RTS_B                     0x1DC 0x420 0x0 0x3 0x0
+#define IOMUXC_GPIO_SD_B2_10_GPT6_COMPARE3                     0x1DC 0x420 0x0 0x4 0x0
+#define IOMUXC_GPIO_SD_B2_10_GPIO_MUX4_IO19                    0x1DC 0x420 0x0 0x5 0x0
+#define IOMUXC_GPIO_SD_B2_10_LPSPI2_SIN                                0x1DC 0x420 0x5E8 0x6 0x1
+
+#define IOMUXC_GPIO_SD_B2_11_USDHC2_DATA7                      0x1E0 0x424 0x0 0x0 0x0
+#define IOMUXC_GPIO_SD_B2_11_FLEXSPI1_A_DATA03                 0x1E0 0x424 0x560 0x1 0x1
+#define IOMUXC_GPIO_SD_B2_11_ENET_1G_TX_CLK_IO                 0x1E0 0x424 0x4E8 0x2 0x1
+#define IOMUXC_GPIO_SD_B2_11_ENET_1G_REF_CLK                   0x1E0 0x424 0x4C4 0x3 0x1
+#define IOMUXC_GPIO_SD_B2_11_GPT6_CLK                          0x1E0 0x424 0x0 0x4 0x0
+#define IOMUXC_GPIO_SD_B2_11_GPIO_MUX4_IO20                    0x1E0 0x424 0x0 0x5 0x0
+#define IOMUXC_GPIO_SD_B2_11_LPSPI2_PCS1                       0x1E0 0x424 0x5E0 0x6 0x1
+#define IOMUXC_GPIO_SD_B2_11_GPIO10_IO20                       0x1E0 0x424 0x0 0xA 0x0
+
+#define IOMUXC_GPIO_DISP_B1_00_VIDEO_MUX_LCDIF_CLK             0x1E4 0x428 0x0 0x0 0x0
+#define IOMUXC_GPIO_DISP_B1_00_ENET_1G_RX_EN                   0x1E4 0x428 0x4E0 0x1 0x2
+#define IOMUXC_GPIO_DISP_B1_00_TMR1_TIMER0                     0x1E4 0x428 0x63C 0x3 0x2
+#define IOMUXC_GPIO_DISP_B1_00_XBAR1_INOUT26                   0x1E4 0x428 0x6F0 0x4 0x1
+#define IOMUXC_GPIO_DISP_B1_00_GPIO_MUX4_IO21                  0x1E4 0x428 0x0 0x5 0x0
+#define IOMUXC_GPIO_DISP_B1_00_ENET_QOS_RX_EN                  0x1E4 0x428 0x4F8 0x8 0x0
+#define IOMUXC_GPIO_DISP_B1_00_GPIO10_IO21                     0x1E4 0x428 0x0 0xA 0x0
+
+#define IOMUXC_GPIO_DISP_B1_01_VIDEO_MUX_LCDIF_ENABLE          0x1E8 0x42C 0x0 0x0 0x0
+#define IOMUXC_GPIO_DISP_B1_01_ENET_1G_RX_CLK                  0x1E8 0x42C 0x4CC 0x1 0x2
+#define IOMUXC_GPIO_DISP_B1_01_ENET_1G_RX_ER                   0x1E8 0x42C 0x4E4 0x2 0x1
+#define IOMUXC_GPIO_DISP_B1_01_TMR1_TIMER1                     0x1E8 0x42C 0x640 0x3 0x2
+#define IOMUXC_GPIO_DISP_B1_01_XBAR1_INOUT27                   0x1E8 0x42C 0x6F4 0x4 0x1
+#define IOMUXC_GPIO_DISP_B1_01_GPIO_MUX4_IO22                  0x1E8 0x42C 0x0 0x5 0x0
+#define IOMUXC_GPIO_DISP_B1_01_ENET_QOS_RX_CLK                 0x1E8 0x42C 0x0 0x8 0x0
+#define IOMUXC_GPIO_DISP_B1_01_ENET_QOS_RX_ER                  0x1E8 0x42C 0x4FC 0x9 0x0
+#define IOMUXC_GPIO_DISP_B1_01_GPIO10_IO22                     0x1E8 0x42C 0x0 0xA 0x0
+
+#define IOMUXC_GPIO_DISP_B1_02_GPIO10_IO23                     0x1EC 0x430 0x0 0xA 0x0
+#define IOMUXC_GPIO_DISP_B1_02_VIDEO_MUX_LCDIF_HSYNC           0x1EC 0x430 0x0 0x0 0x0
+#define IOMUXC_GPIO_DISP_B1_02_ENET_1G_RX_DATA00               0x1EC 0x430 0x4D0 0x1 0x2
+#define IOMUXC_GPIO_DISP_B1_02_LPI2C3_SCL                      0x1EC 0x430 0x5BC 0x2 0x0
+#define IOMUXC_GPIO_DISP_B1_02_TMR1_TIMER2                     0x1EC 0x430 0x644 0x3 0x1
+#define IOMUXC_GPIO_DISP_B1_02_XBAR1_INOUT28                   0x1EC 0x430 0x6F8 0x4 0x1
+#define IOMUXC_GPIO_DISP_B1_02_GPIO_MUX4_IO23                  0x1EC 0x430 0x0 0x5 0x0
+#define IOMUXC_GPIO_DISP_B1_02_ENET_QOS_RX_DATA00              0x1EC 0x430 0x4F0 0x8 0x0
+#define IOMUXC_GPIO_DISP_B1_02_LPUART1_TXD                     0x1EC 0x430 0x620 0x9 0x1
+
+#define IOMUXC_GPIO_DISP_B1_03_VIDEO_MUX_LCDIF_VSYNC           0x1F0 0x434 0x0 0x0 0x0
+#define IOMUXC_GPIO_DISP_B1_03_ENET_1G_RX_DATA01               0x1F0 0x434 0x4D4 0x1 0x2
+#define IOMUXC_GPIO_DISP_B1_03_LPI2C3_SDA                      0x1F0 0x434 0x5C0 0x2 0x0
+#define IOMUXC_GPIO_DISP_B1_03_TMR2_TIMER0                     0x1F0 0x434 0x648 0x3 0x2
+#define IOMUXC_GPIO_DISP_B1_03_XBAR1_INOUT29                   0x1F0 0x434 0x6FC 0x4 0x1
+#define IOMUXC_GPIO_DISP_B1_03_GPIO_MUX4_IO24                  0x1F0 0x434 0x0 0x5 0x0
+#define IOMUXC_GPIO_DISP_B1_03_ENET_QOS_RX_DATA01              0x1F0 0x434 0x4F4 0x8 0x0
+#define IOMUXC_GPIO_DISP_B1_03_LPUART1_RXD                     0x1F0 0x434 0x61C 0x9 0x1
+#define IOMUXC_GPIO_DISP_B1_03_GPIO10_IO24                     0x1F0 0x434 0x0 0xA 0x0
+
+#define IOMUXC_GPIO_DISP_B1_04_VIDEO_MUX_LCDIF_DATA00          0x1F4 0x438 0x0 0x0 0x0
+#define IOMUXC_GPIO_DISP_B1_04_ENET_1G_RX_DATA02               0x1F4 0x438 0x4D8 0x1 0x2
+#define IOMUXC_GPIO_DISP_B1_04_LPUART4_RXD                     0x1F4 0x438 0x0 0x2 0x0
+#define IOMUXC_GPIO_DISP_B1_04_TMR2_TIMER1                     0x1F4 0x438 0x64C 0x3 0x2
+#define IOMUXC_GPIO_DISP_B1_04_XBAR1_INOUT30                   0x1F4 0x438 0x700 0x4 0x1
+#define IOMUXC_GPIO_DISP_B1_04_GPIO_MUX4_IO25                  0x1F4 0x438 0x0 0x5 0x0
+#define IOMUXC_GPIO_DISP_B1_04_ENET_QOS_RX_DATA02              0x1F4 0x438 0x0 0x8 0x0
+#define IOMUXC_GPIO_DISP_B1_04_LPSPI3_SCK                      0x1F4 0x438 0x600 0x9 0x1
+#define IOMUXC_GPIO_DISP_B1_04_GPIO10_IO25                     0x1F4 0x438 0x0 0xA 0x0
+
+#define IOMUXC_GPIO_DISP_B1_05_GPIO10_IO26                     0x1F8 0x43C 0x0 0xA 0x0
+#define IOMUXC_GPIO_DISP_B1_05_VIDEO_MUX_LCDIF_DATA01          0x1F8 0x43C 0x0 0x0 0x0
+#define IOMUXC_GPIO_DISP_B1_05_ENET_1G_RX_DATA03               0x1F8 0x43C 0x4DC 0x1 0x2
+#define IOMUXC_GPIO_DISP_B1_05_LPUART4_CTS_B                   0x1F8 0x43C 0x0 0x2 0x0
+#define IOMUXC_GPIO_DISP_B1_05_TMR2_TIMER2                     0x1F8 0x43C 0x650 0x3 0x1
+#define IOMUXC_GPIO_DISP_B1_05_XBAR1_INOUT31                   0x1F8 0x43C 0x704 0x4 0x1
+#define IOMUXC_GPIO_DISP_B1_05_GPIO_MUX4_IO26                  0x1F8 0x43C 0x0 0x5 0x0
+#define IOMUXC_GPIO_DISP_B1_05_ENET_QOS_RX_DATA03              0x1F8 0x43C 0x0 0x8 0x0
+#define IOMUXC_GPIO_DISP_B1_05_LPSPI3_SIN                      0x1F8 0x43C 0x604 0x9 0x1
+
+#define IOMUXC_GPIO_DISP_B1_06_VIDEO_MUX_LCDIF_DATA02          0x1FC 0x440 0x0 0x0 0x0
+#define IOMUXC_GPIO_DISP_B1_06_ENET_1G_TX_DATA03               0x1FC 0x440 0x0 0x1 0x0
+#define IOMUXC_GPIO_DISP_B1_06_LPUART4_TXD                     0x1FC 0x440 0x0 0x2 0x0
+#define IOMUXC_GPIO_DISP_B1_06_TMR3_TIMER0                     0x1FC 0x440 0x654 0x3 0x2
+#define IOMUXC_GPIO_DISP_B1_06_XBAR1_INOUT32                   0x1FC 0x440 0x708 0x4 0x1
+#define IOMUXC_GPIO_DISP_B1_06_GPIO_MUX4_IO27                  0x1FC 0x440 0x0 0x5 0x0
+#define IOMUXC_GPIO_DISP_B1_06_SRC_BT_CFG00                    0x1FC 0x440 0x0 0x6 0x0
+#define IOMUXC_GPIO_DISP_B1_06_ENET_QOS_TX_DATA03              0x1FC 0x440 0x0 0x8 0x0
+#define IOMUXC_GPIO_DISP_B1_06_LPSPI3_SOUT                     0x1FC 0x440 0x608 0x9 0x1
+#define IOMUXC_GPIO_DISP_B1_06_GPIO10_IO27                     0x1FC 0x440 0x0 0xA 0x0
+
+#define IOMUXC_GPIO_DISP_B1_07_VIDEO_MUX_LCDIF_DATA03          0x200 0x444 0x0 0x0 0x0
+#define IOMUXC_GPIO_DISP_B1_07_ENET_1G_TX_DATA02               0x200 0x444 0x0 0x1 0x0
+#define IOMUXC_GPIO_DISP_B1_07_LPUART4_RTS_B                   0x200 0x444 0x0 0x2 0x0
+#define IOMUXC_GPIO_DISP_B1_07_TMR3_TIMER1                     0x200 0x444 0x658 0x3 0x2
+#define IOMUXC_GPIO_DISP_B1_07_XBAR1_INOUT33                   0x200 0x444 0x70C 0x4 0x1
+#define IOMUXC_GPIO_DISP_B1_07_GPIO_MUX4_IO28                  0x200 0x444 0x0 0x5 0x0
+#define IOMUXC_GPIO_DISP_B1_07_SRC_BT_CFG01                    0x200 0x444 0x0 0x6 0x0
+#define IOMUXC_GPIO_DISP_B1_07_ENET_QOS_TX_DATA02              0x200 0x444 0x0 0x8 0x0
+#define IOMUXC_GPIO_DISP_B1_07_LPSPI3_PCS0                     0x200 0x444 0x5F0 0x9 0x1
+#define IOMUXC_GPIO_DISP_B1_07_GPIO10_IO28                     0x200 0x444 0x0 0xA 0x0
+
+#define IOMUXC_GPIO_DISP_B1_08_GPIO10_IO29                     0x204 0x448 0x0 0xA 0x0
+#define IOMUXC_GPIO_DISP_B1_08_VIDEO_MUX_LCDIF_DATA04          0x204 0x448 0x0 0x0 0x0
+#define IOMUXC_GPIO_DISP_B1_08_ENET_1G_TX_DATA01               0x204 0x448 0x0 0x1 0x0
+#define IOMUXC_GPIO_DISP_B1_08_USDHC1_CD_B                     0x204 0x448 0x6C8 0x2 0x1
+#define IOMUXC_GPIO_DISP_B1_08_TMR3_TIMER2                     0x204 0x448 0x65C 0x3 0x1
+#define IOMUXC_GPIO_DISP_B1_08_XBAR1_INOUT34                   0x204 0x448 0x710 0x4 0x1
+#define IOMUXC_GPIO_DISP_B1_08_GPIO_MUX4_IO29                  0x204 0x448 0x0 0x5 0x0
+#define IOMUXC_GPIO_DISP_B1_08_SRC_BT_CFG02                    0x204 0x448 0x0 0x6 0x0
+#define IOMUXC_GPIO_DISP_B1_08_ENET_QOS_TX_DATA01              0x204 0x448 0x0 0x8 0x0
+#define IOMUXC_GPIO_DISP_B1_08_LPSPI3_PCS1                     0x204 0x448 0x5F4 0x9 0x1
+
+#define IOMUXC_GPIO_DISP_B1_09_VIDEO_MUX_LCDIF_DATA05          0x208 0x44C 0x0 0x0 0x0
+#define IOMUXC_GPIO_DISP_B1_09_ENET_1G_TX_DATA00               0x208 0x44C 0x0 0x1 0x0
+#define IOMUXC_GPIO_DISP_B1_09_USDHC1_WP                       0x208 0x44C 0x6CC 0x2 0x1
+#define IOMUXC_GPIO_DISP_B1_09_TMR4_TIMER0                     0x208 0x44C 0x660 0x3 0x2
+#define IOMUXC_GPIO_DISP_B1_09_XBAR1_INOUT35                   0x208 0x44C 0x714 0x4 0x1
+#define IOMUXC_GPIO_DISP_B1_09_GPIO_MUX4_IO30                  0x208 0x44C 0x0 0x5 0x0
+#define IOMUXC_GPIO_DISP_B1_09_SRC_BT_CFG03                    0x208 0x44C 0x0 0x6 0x0
+#define IOMUXC_GPIO_DISP_B1_09_ENET_QOS_TX_DATA00              0x208 0x44C 0x0 0x8 0x0
+#define IOMUXC_GPIO_DISP_B1_09_LPSPI3_PCS2                     0x208 0x44C 0x5F8 0x9 0x1
+#define IOMUXC_GPIO_DISP_B1_09_GPIO10_IO30                     0x208 0x44C 0x0 0xA 0x0
+
+#define IOMUXC_GPIO_DISP_B1_10_VIDEO_MUX_LCDIF_DATA06          0x20C 0x450 0x0 0x0 0x0
+#define IOMUXC_GPIO_DISP_B1_10_ENET_1G_TX_EN                   0x20C 0x450 0x0 0x1 0x0
+#define IOMUXC_GPIO_DISP_B1_10_USDHC1_RESET_B                  0x20C 0x450 0x0 0x2 0x0
+#define IOMUXC_GPIO_DISP_B1_10_TMR4_TIMER1                     0x20C 0x450 0x664 0x3 0x2
+#define IOMUXC_GPIO_DISP_B1_10_XBAR1_INOUT36                   0x20C 0x450 0x0 0x4 0x0
+#define IOMUXC_GPIO_DISP_B1_10_GPIO_MUX4_IO31                  0x20C 0x450 0x0 0x5 0x0
+#define IOMUXC_GPIO_DISP_B1_10_SRC_BT_CFG04                    0x20C 0x450 0x0 0x6 0x0
+#define IOMUXC_GPIO_DISP_B1_10_ENET_QOS_TX_EN                  0x20C 0x450 0x0 0x8 0x0
+#define IOMUXC_GPIO_DISP_B1_10_LPSPI3_PCS3                     0x20C 0x450 0x5FC 0x9 0x1
+#define IOMUXC_GPIO_DISP_B1_10_GPIO10_IO31                     0x20C 0x450 0x0 0xA 0x0
+
+#define IOMUXC_GPIO_DISP_B1_11_VIDEO_MUX_LCDIF_DATA07          0x210 0x454 0x0 0x0 0x0
+#define IOMUXC_GPIO_DISP_B1_11_ENET_1G_TX_CLK_IO               0x210 0x454 0x4E8 0x1 0x2
+#define IOMUXC_GPIO_DISP_B1_11_ENET_1G_REF_CLK                 0x210 0x454 0x4C4 0x2 0x2
+#define IOMUXC_GPIO_DISP_B1_11_TMR4_TIMER2                     0x210 0x454 0x668 0x3 0x1
+#define IOMUXC_GPIO_DISP_B1_11_XBAR1_INOUT37                   0x210 0x454 0x0 0x4 0x0
+#define IOMUXC_GPIO_DISP_B1_11_GPIO_MUX5_IO00                  0x210 0x454 0x0 0x5 0x0
+#define IOMUXC_GPIO_DISP_B1_11_SRC_BT_CFG05                    0x210 0x454 0x0 0x6 0x0
+#define IOMUXC_GPIO_DISP_B1_11_ENET_QOS_TX_CLK                 0x210 0x454 0x4A4 0x8 0x0
+#define IOMUXC_GPIO_DISP_B1_11_ENET_QOS_REF_CLK                        0x210 0x454 0x4A0 0x9 0x2
+#define IOMUXC_GPIO_DISP_B1_11_GPIO11_IO00                     0x210 0x454 0x0 0xA 0x0
+
+#define IOMUXC_GPIO_DISP_B2_00_GPIO11_IO01                     0x214 0x458 0x0 0xA 0x0
+#define IOMUXC_GPIO_DISP_B2_00_VIDEO_MUX_LCDIF_DATA08          0x214 0x458 0x0 0x0 0x0
+#define IOMUXC_GPIO_DISP_B2_00_WDOG1_B                         0x214 0x458 0x0 0x1 0x0
+#define IOMUXC_GPIO_DISP_B2_00_MQS_RIGHT                       0x214 0x458 0x0 0x2 0x0
+#define IOMUXC_GPIO_DISP_B2_00_ENET_1G_TX_ER                   0x214 0x458 0x0 0x3 0x0
+#define IOMUXC_GPIO_DISP_B2_00_SAI1_TX_DATA03                  0x214 0x458 0x0 0x4 0x0
+#define IOMUXC_GPIO_DISP_B2_00_GPIO_MUX5_IO01                  0x214 0x458 0x0 0x5 0x0
+#define IOMUXC_GPIO_DISP_B2_00_SRC_BT_CFG06                    0x214 0x458 0x0 0x6 0x0
+#define IOMUXC_GPIO_DISP_B2_00_ENET_QOS_TX_ER                  0x214 0x458 0x0 0x8 0x0
+
+#define IOMUXC_GPIO_DISP_B2_01_VIDEO_MUX_LCDIF_DATA09          0x218 0x45C 0x0 0x0 0x0
+#define IOMUXC_GPIO_DISP_B2_01_USDHC1_VSELECT                  0x218 0x45C 0x0 0x1 0x0
+#define IOMUXC_GPIO_DISP_B2_01_MQS_LEFT                                0x218 0x45C 0x0 0x2 0x0
+#define IOMUXC_GPIO_DISP_B2_01_WDOG2_B                         0x218 0x45C 0x0 0x3 0x0
+#define IOMUXC_GPIO_DISP_B2_01_SAI1_TX_DATA02                  0x218 0x45C 0x0 0x4 0x0
+#define IOMUXC_GPIO_DISP_B2_01_GPIO_MUX5_IO02                  0x218 0x45C 0x0 0x5 0x0
+#define IOMUXC_GPIO_DISP_B2_01_SRC_BT_CFG07                    0x218 0x45C 0x0 0x6 0x0
+#define IOMUXC_GPIO_DISP_B2_01_EWM_OUT_B                       0x218 0x45C 0x0 0x8 0x0
+#define IOMUXC_GPIO_DISP_B2_01_CCM_ENET_REF_CLK_25M            0x218 0x45C 0x0 0x9 0x0
+#define IOMUXC_GPIO_DISP_B2_01_GPIO11_IO02                     0x218 0x45C 0x0 0xA 0x0
+
+#define IOMUXC_GPIO_DISP_B2_02_GPIO11_IO03                     0x21C 0x460 0x0 0xA 0x0
+#define IOMUXC_GPIO_DISP_B2_02_VIDEO_MUX_LCDIF_DATA10          0x21C 0x460 0x0 0x0 0x0
+#define IOMUXC_GPIO_DISP_B2_02_ENET_TX_DATA00                  0x21C 0x460 0x0 0x1 0x0
+#define IOMUXC_GPIO_DISP_B2_02_PIT1_TRIGGER3                   0x21C 0x460 0x0 0x2 0x0
+#define IOMUXC_GPIO_DISP_B2_02_ARM_TRACE00                     0x21C 0x460 0x0 0x3 0x0
+#define IOMUXC_GPIO_DISP_B2_02_SAI1_TX_DATA01                  0x21C 0x460 0x0 0x4 0x0
+#define IOMUXC_GPIO_DISP_B2_02_GPIO_MUX5_IO03                  0x21C 0x460 0x0 0x5 0x0
+#define IOMUXC_GPIO_DISP_B2_02_SRC_BT_CFG08                    0x21C 0x460 0x0 0x6 0x0
+#define IOMUXC_GPIO_DISP_B2_02_ENET_QOS_TX_DATA00              0x21C 0x460 0x0 0x8 0x0
+
+#define IOMUXC_GPIO_DISP_B2_03_GPIO11_IO04                     0x220 0x464 0x0 0xA 0x0
+#define IOMUXC_GPIO_DISP_B2_03_VIDEO_MUX_LCDIF_DATA11          0x220 0x464 0x0 0x0 0x0
+#define IOMUXC_GPIO_DISP_B2_03_ENET_TX_DATA01                  0x220 0x464 0x0 0x1 0x0
+#define IOMUXC_GPIO_DISP_B2_03_PIT1_TRIGGER2                   0x220 0x464 0x0 0x2 0x0
+#define IOMUXC_GPIO_DISP_B2_03_ARM_TRACE01                     0x220 0x464 0x0 0x3 0x0
+#define IOMUXC_GPIO_DISP_B2_03_SAI1_MCLK                       0x220 0x464 0x66C 0x4 0x1
+#define IOMUXC_GPIO_DISP_B2_03_GPIO_MUX5_IO04                  0x220 0x464 0x0 0x5 0x0
+#define IOMUXC_GPIO_DISP_B2_03_SRC_BT_CFG09                    0x220 0x464 0x0 0x6 0x0
+#define IOMUXC_GPIO_DISP_B2_03_ENET_QOS_TX_DATA01              0x220 0x464 0x0 0x8 0x0
+
+#define IOMUXC_GPIO_DISP_B2_04_VIDEO_MUX_LCDIF_DATA12          0x224 0x468 0x0 0x0 0x0
+#define IOMUXC_GPIO_DISP_B2_04_ENET_TX_EN                      0x224 0x468 0x0 0x1 0x0
+#define IOMUXC_GPIO_DISP_B2_04_PIT1_TRIGGER1                   0x224 0x468 0x0 0x2 0x0
+#define IOMUXC_GPIO_DISP_B2_04_ARM_TRACE02                     0x224 0x468 0x0 0x3 0x0
+#define IOMUXC_GPIO_DISP_B2_04_SAI1_RX_SYNC                    0x224 0x468 0x678 0x4 0x1
+#define IOMUXC_GPIO_DISP_B2_04_GPIO_MUX5_IO05                  0x224 0x468 0x0 0x5 0x0
+#define IOMUXC_GPIO_DISP_B2_04_SRC_BT_CFG10                    0x224 0x468 0x0 0x6 0x0
+#define IOMUXC_GPIO_DISP_B2_04_ENET_QOS_TX_EN                  0x224 0x468 0x0 0x8 0x0
+#define IOMUXC_GPIO_DISP_B2_04_GPIO11_IO05                     0x224 0x468 0x0 0xA 0x0
+
+#define IOMUXC_GPIO_DISP_B2_05_GPIO11_IO06                     0x228 0x46C 0x0 0xA 0x0
+#define IOMUXC_GPIO_DISP_B2_05_VIDEO_MUX_LCDIF_DATA13          0x228 0x46C 0x0 0x0 0x0
+#define IOMUXC_GPIO_DISP_B2_05_ENET_TX_CLK                     0x228 0x46C 0x4C0 0x1 0x1
+#define IOMUXC_GPIO_DISP_B2_05_ENET_REF_CLK                    0x228 0x46C 0x4A8 0x2 0x1
+#define IOMUXC_GPIO_DISP_B2_05_ARM_TRACE03                     0x228 0x46C 0x0 0x3 0x0
+#define IOMUXC_GPIO_DISP_B2_05_SAI1_RX_BCLK                    0x228 0x46C 0x670 0x4 0x1
+#define IOMUXC_GPIO_DISP_B2_05_GPIO_MUX5_IO06                  0x228 0x46C 0x0 0x5 0x0
+#define IOMUXC_GPIO_DISP_B2_05_SRC_BT_CFG11                    0x228 0x46C 0x0 0x6 0x0
+#define IOMUXC_GPIO_DISP_B2_05_ENET_QOS_TX_CLK                 0x228 0x46C 0x4A4 0x8 0x1
+
+#define IOMUXC_GPIO_DISP_B2_06_GPIO11_IO07                     0x22C 0x470 0x0 0xA 0x0
+#define IOMUXC_GPIO_DISP_B2_06_VIDEO_MUX_LCDIF_DATA14          0x22C 0x470 0x0 0x0 0x0
+#define IOMUXC_GPIO_DISP_B2_06_ENET_RX_DATA00                  0x22C 0x470 0x4B0 0x1 0x1
+#define IOMUXC_GPIO_DISP_B2_06_LPUART7_TXD                     0x22C 0x470 0x630 0x2 0x1
+#define IOMUXC_GPIO_DISP_B2_06_ARM_TRACE_CLK                   0x22C 0x470 0x0 0x3 0x0
+#define IOMUXC_GPIO_DISP_B2_06_SAI1_RX_DATA00                  0x22C 0x470 0x674 0x4 0x1
+#define IOMUXC_GPIO_DISP_B2_06_GPIO_MUX5_IO07                  0x22C 0x470 0x0 0x5 0x0
+#define IOMUXC_GPIO_DISP_B2_06_ENET_QOS_RX_DATA00              0x22C 0x470 0x4F0 0x8 0x1
+
+#define IOMUXC_GPIO_DISP_B2_07_VIDEO_MUX_LCDIF_DATA15          0x230 0x474 0x0 0x0 0x0
+#define IOMUXC_GPIO_DISP_B2_07_ENET_RX_DATA01                  0x230 0x474 0x4B4 0x1 0x1
+#define IOMUXC_GPIO_DISP_B2_07_LPUART7_RXD                     0x230 0x474 0x62C 0x2 0x1
+#define IOMUXC_GPIO_DISP_B2_07_ARM_TRACE_SWO                   0x230 0x474 0x0 0x3 0x0
+#define IOMUXC_GPIO_DISP_B2_07_SAI1_TX_DATA00                  0x230 0x474 0x0 0x4 0x0
+#define IOMUXC_GPIO_DISP_B2_07_GPIO_MUX5_IO08                  0x230 0x474 0x0 0x5 0x0
+#define IOMUXC_GPIO_DISP_B2_07_ENET_QOS_RX_DATA01              0x230 0x474 0x4F4 0x8 0x1
+#define IOMUXC_GPIO_DISP_B2_07_GPIO11_IO08                     0x230 0x474 0x0 0xA 0x0
+
+#define IOMUXC_GPIO_DISP_B2_08_GPIO11_IO09                     0x234 0x478 0x0 0xA 0x0
+#define IOMUXC_GPIO_DISP_B2_08_VIDEO_MUX_LCDIF_DATA16          0x234 0x478 0x0 0x0 0x0
+#define IOMUXC_GPIO_DISP_B2_08_ENET_RX_EN                      0x234 0x478 0x4B8 0x1 0x1
+#define IOMUXC_GPIO_DISP_B2_08_LPUART8_TXD                     0x234 0x478 0x638 0x2 0x1
+#define IOMUXC_GPIO_DISP_B2_08_ARM_CM7_EVENTO                  0x234 0x478 0x0 0x3 0x0
+#define IOMUXC_GPIO_DISP_B2_08_SAI1_TX_BCLK                    0x234 0x478 0x67C 0x4 0x1
+#define IOMUXC_GPIO_DISP_B2_08_GPIO_MUX5_IO09                  0x234 0x478 0x0 0x5 0x0
+#define IOMUXC_GPIO_DISP_B2_08_ENET_QOS_RX_EN                  0x234 0x478 0x4F8 0x8 0x1
+#define IOMUXC_GPIO_DISP_B2_08_LPUART1_TXD                     0x234 0x478 0x620 0x9 0x2
+
+#define IOMUXC_GPIO_DISP_B2_09_GPIO11_IO10                     0x238 0x47C 0x0 0xA 0x0
+#define IOMUXC_GPIO_DISP_B2_09_VIDEO_MUX_LCDIF_DATA17          0x238 0x47C 0x0 0x0 0x0
+#define IOMUXC_GPIO_DISP_B2_09_ENET_RX_ER                      0x238 0x47C 0x4BC 0x1 0x1
+#define IOMUXC_GPIO_DISP_B2_09_LPUART8_RXD                     0x238 0x47C 0x634 0x2 0x1
+#define IOMUXC_GPIO_DISP_B2_09_ARM_CM7_EVENTI                  0x238 0x47C 0x0 0x3 0x0
+#define IOMUXC_GPIO_DISP_B2_09_SAI1_TX_SYNC                    0x238 0x47C 0x680 0x4 0x1
+#define IOMUXC_GPIO_DISP_B2_09_GPIO_MUX5_IO10                  0x238 0x47C 0x0 0x5 0x0
+#define IOMUXC_GPIO_DISP_B2_09_ENET_QOS_RX_ER                  0x238 0x47C 0x4FC 0x8 0x1
+#define IOMUXC_GPIO_DISP_B2_09_LPUART1_RXD                     0x238 0x47C 0x61C 0x9 0x2
+
+#define IOMUXC_GPIO_DISP_B2_10_GPIO11_IO11                     0x23C 0x480 0x0 0xA 0x0
+#define IOMUXC_GPIO_DISP_B2_10_VIDEO_MUX_LCDIF_DATA18          0x23C 0x480 0x0 0x0 0x0
+#define IOMUXC_GPIO_DISP_B2_10_EMVSIM2_IO                      0x23C 0x480 0x6A8 0x1 0x1
+#define IOMUXC_GPIO_DISP_B2_10_LPUART2_TXD                     0x23C 0x480 0x0 0x2 0x0
+#define IOMUXC_GPIO_DISP_B2_10_WDOG2_RESET_B_DEB               0x23C 0x480 0x0 0x3 0x0
+#define IOMUXC_GPIO_DISP_B2_10_XBAR1_INOUT38                   0x23C 0x480 0x0 0x4 0x0
+#define IOMUXC_GPIO_DISP_B2_10_GPIO_MUX5_IO11                  0x23C 0x480 0x0 0x5 0x0
+#define IOMUXC_GPIO_DISP_B2_10_LPI2C3_SCL                      0x23C 0x480 0x5BC 0x6 0x1
+#define IOMUXC_GPIO_DISP_B2_10_ENET_QOS_RX_ER                  0x23C 0x480 0x4FC 0x8 0x2
+#define IOMUXC_GPIO_DISP_B2_10_SPDIF_IN                                0x23C 0x480 0x6B4 0x9 0x2
+
+#define IOMUXC_GPIO_DISP_B2_11_VIDEO_MUX_LCDIF_DATA19          0x240 0x484 0x0 0x0 0x0
+#define IOMUXC_GPIO_DISP_B2_11_EMVSIM2_CLK                     0x240 0x484 0x0 0x1 0x0
+#define IOMUXC_GPIO_DISP_B2_11_LPUART2_RXD                     0x240 0x484 0x0 0x2 0x0
+#define IOMUXC_GPIO_DISP_B2_11_WDOG1_RESET_B_DEB               0x240 0x484 0x0 0x3 0x0
+#define IOMUXC_GPIO_DISP_B2_11_XBAR1_INOUT39                   0x240 0x484 0x0 0x4 0x0
+#define IOMUXC_GPIO_DISP_B2_11_GPIO_MUX5_IO12                  0x240 0x484 0x0 0x5 0x0
+#define IOMUXC_GPIO_DISP_B2_11_LPI2C3_SDA                      0x240 0x484 0x5C0 0x6 0x1
+#define IOMUXC_GPIO_DISP_B2_11_ENET_QOS_CRS                    0x240 0x484 0x0 0x8 0x0
+#define IOMUXC_GPIO_DISP_B2_11_SPDIF_OUT                       0x240 0x484 0x0 0x9 0x0
+#define IOMUXC_GPIO_DISP_B2_11_GPIO11_IO12                     0x240 0x484 0x0 0xA 0x0
+
+#define IOMUXC_GPIO_DISP_B2_12_GPIO11_IO13                     0x244 0x488 0x0 0xA 0x0
+#define IOMUXC_GPIO_DISP_B2_12_VIDEO_MUX_LCDIF_DATA20          0x244 0x488 0x0 0x0 0x0
+#define IOMUXC_GPIO_DISP_B2_12_EMVSIM2_RST                     0x244 0x488 0x0 0x1 0x0
+#define IOMUXC_GPIO_DISP_B2_12_FLEXCAN1_TX                     0x244 0x488 0x0 0x2 0x0
+#define IOMUXC_GPIO_DISP_B2_12_LPUART2_CTS_B                   0x244 0x488 0x0 0x3 0x0
+#define IOMUXC_GPIO_DISP_B2_12_XBAR1_INOUT40                   0x244 0x488 0x0 0x4 0x0
+#define IOMUXC_GPIO_DISP_B2_12_GPIO_MUX5_IO13                  0x244 0x488 0x0 0x5 0x0
+#define IOMUXC_GPIO_DISP_B2_12_LPI2C4_SCL                      0x244 0x488 0x5C4 0x6 0x1
+#define IOMUXC_GPIO_DISP_B2_12_ENET_QOS_COL                    0x244 0x488 0x0 0x8 0x0
+#define IOMUXC_GPIO_DISP_B2_12_LPSPI4_SCK                      0x244 0x488 0x610 0x9 0x1
+
+#define IOMUXC_GPIO_DISP_B2_13_GPIO11_IO14                     0x248 0x48C 0x0 0xA 0x0
+#define IOMUXC_GPIO_DISP_B2_13_VIDEO_MUX_LCDIF_DATA21          0x248 0x48C 0x0 0x0 0x0
+#define IOMUXC_GPIO_DISP_B2_13_EMVSIM2_SVEN                    0x248 0x48C 0x0 0x1 0x0
+#define IOMUXC_GPIO_DISP_B2_13_FLEXCAN1_RX                     0x248 0x48C 0x498 0x2 0x1
+#define IOMUXC_GPIO_DISP_B2_13_LPUART2_RTS_B                   0x248 0x48C 0x0 0x3 0x0
+#define IOMUXC_GPIO_DISP_B2_13_ENET_REF_CLK                    0x248 0x48C 0x4A8 0x4 0x2
+#define IOMUXC_GPIO_DISP_B2_13_GPIO_MUX5_IO14                  0x248 0x48C 0x0 0x5 0x0
+#define IOMUXC_GPIO_DISP_B2_13_LPI2C4_SDA                      0x248 0x48C 0x5C8 0x6 0x1
+#define IOMUXC_GPIO_DISP_B2_13_ENET_QOS_1588_EVENT0_OUT                0x248 0x48C 0x0 0x8 0x0
+#define IOMUXC_GPIO_DISP_B2_13_LPSPI4_SIN                      0x248 0x48C 0x614 0x9 0x1
+
+#define IOMUXC_GPIO_DISP_B2_14_GPIO_MUX5_IO15                  0x24C 0x490 0x0 0x5 0x0
+#define IOMUXC_GPIO_DISP_B2_14_FLEXCAN1_TX                     0x24C 0x490 0x0 0x6 0x0
+#define IOMUXC_GPIO_DISP_B2_14_ENET_QOS_1588_EVENT0_IN         0x24C 0x490 0x0 0x8 0x0
+#define IOMUXC_GPIO_DISP_B2_14_LPSPI4_SOUT                     0x24C 0x490 0x618 0x9 0x1
+#define IOMUXC_GPIO_DISP_B2_14_GPIO11_IO15                     0x24C 0x490 0x0 0xA 0x0
+#define IOMUXC_GPIO_DISP_B2_14_VIDEO_MUX_LCDIF_DATA22          0x24C 0x490 0x0 0x0 0x0
+#define IOMUXC_GPIO_DISP_B2_14_EMVSIM2_PD                      0x24C 0x490 0x6AC 0x1 0x1
+#define IOMUXC_GPIO_DISP_B2_14_WDOG2_B                         0x24C 0x490 0x0 0x2 0x0
+#define IOMUXC_GPIO_DISP_B2_14_VIDEO_MUX_EXT_DCIC1             0x24C 0x490 0x0 0x3 0x0
+#define IOMUXC_GPIO_DISP_B2_14_ENET_1G_REF_CLK                 0x24C 0x490 0x4C4 0x4 0x3
+
+#define IOMUXC_GPIO_DISP_B2_15_VIDEO_MUX_LCDIF_DATA23          0x250 0x494 0x0 0x0 0x0
+#define IOMUXC_GPIO_DISP_B2_15_EMVSIM2_POWER_FAIL              0x250 0x494 0x6B0 0x1 0x1
+#define IOMUXC_GPIO_DISP_B2_15_WDOG1_B                         0x250 0x494 0x0 0x2 0x0
+#define IOMUXC_GPIO_DISP_B2_15_VIDEO_MUX_EXT_DCIC2             0x250 0x494 0x0 0x3 0x0
+#define IOMUXC_GPIO_DISP_B2_15_PIT1_TRIGGER0                   0x250 0x494 0x0 0x4 0x0
+#define IOMUXC_GPIO_DISP_B2_15_GPIO_MUX5_IO16                  0x250 0x494 0x0 0x5 0x0
+#define IOMUXC_GPIO_DISP_B2_15_FLEXCAN1_RX                     0x250 0x494 0x498 0x6 0x2
+#define IOMUXC_GPIO_DISP_B2_15_ENET_QOS_1588_EVENT0_AUX_IN     0x250 0x494 0x0 0x8 0x0
+#define IOMUXC_GPIO_DISP_B2_15_LPSPI4_PCS0                     0x250 0x494 0x60C 0x9 0x1
+#define IOMUXC_GPIO_DISP_B2_15_GPIO11_IO16                     0x250 0x494 0x0 0xA 0x0
+
+#endif  /* _DT_BINDINGS_PINCTRL_IMXRT1170_PINFUNC_H */
diff --git a/arch/arm/dts/imxrt1170.dtsi b/arch/arm/dts/imxrt1170.dtsi
new file mode 100644 (file)
index 0000000..2de775f
--- /dev/null
@@ -0,0 +1,257 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause)
+/*
+ * Copyright (C) 2022
+ * Author(s): Jesse Taube <Mr.Bossman075@gmail.com>
+ * Giulio Benetti <giulio.benetti@benettiengineering.com>
+ */
+
+#include "armv7-m.dtsi"
+#include <dt-bindings/interrupt-controller/arm-gic.h>
+#include <dt-bindings/clock/imxrt1170-clock.h>
+#include <dt-bindings/gpio/gpio.h>
+#include <dt-bindings/memory/imxrt-sdram.h>
+
+/ {
+       #address-cells = <1>;
+       #size-cells = <1>;
+
+       aliases {
+               gpio0 = &gpio1;
+               gpio1 = &gpio2;
+               gpio2 = &gpio3;
+               gpio3 = &gpio4;
+               gpio4 = &gpio5;
+               gpio5 = &gpio6;
+               gpio6 = &gpio7;
+               gpio7 = &gpio8;
+               gpio8 = &gpio9;
+               gpio9 = &gpio10;
+               gpio10 = &gpio11;
+               gpio11 = &gpio12;
+               gpio12 = &gpio13;
+               mmc0 = &usdhc1;
+               serial0 = &lpuart1;
+       };
+
+       clocks {
+               osc: osc {
+                       compatible = "fsl,imx-osc", "fixed-clock";
+                       #clock-cells = <0>;
+                       clock-frequency = <24000000>;
+               };
+
+               rcosc16M: rcosc16M {
+                       compatible = "fsl,imx-osc", "fixed-clock";
+                       #clock-cells = <0>;
+                       clock-frequency = <16000000>;
+               };
+
+               osc32k: osc32k {
+                       compatible = "fsl,imx-osc", "fixed-clock";
+                       #clock-cells = <0>;
+                       clock-frequency = <32768>;
+               };
+
+       };
+
+       soc {
+               semc: semc@400d4000 {
+                       compatible = "fsl,imxrt-semc";
+                       reg = <0x400d4000 0x4000>;
+                       interrupts = <132>;
+                       clocks = <&clks IMXRT1170_CLK_SEMC>;
+                       pinctrl-0 = <&pinctrl_semc>;
+                       pinctrl-names = "default";
+                       status = "okay";
+               };
+
+               lpuart1: serial@4007c000 {
+                       compatible = "fsl,imxrt-lpuart";
+                       reg = <0x4007c000 0x4000>;
+                       interrupts = <20>;
+                       clocks = <&clks IMXRT1170_CLK_LPUART1>;
+                       clock-names = "per";
+                       status = "disabled";
+               };
+
+               iomuxc: iomuxc@400e8000 {
+                       compatible = "fsl,imxrt-iomuxc";
+                       reg = <0x400e8000 0x4000>;
+                       fsl,mux_mask = <0x7>;
+               };
+
+               anatop: anatop@40c84000 {
+                       compatible = "fsl,imxrt-anatop";
+                       reg = <0x40c84000 0x4000>;
+               };
+
+               clks: ccm@40cc0000 {
+                       compatible = "fsl,imxrt1170-ccm";
+                       reg = <0x40cc0000 0x4000>;
+                       #clock-cells = <1>;
+               };
+
+               usdhc1: usdhc@40418000 {
+                       compatible = "fsl,imxrt-usdhc";
+                       reg = <0x40418000 0x10000>;
+                       interrupts = <133>;
+                       clocks = <&clks IMXRT1170_CLK_USDHC1>;
+                       clock-names = "per";
+                       bus-width = <4>;
+                       fsl,tuning-start-tap = <20>;
+                       fsl,tuning-step= <2>;
+                       status = "disabled";
+               };
+
+               gpio1: gpio@4012c000 {
+                       compatible = "fsl,imxrt-gpio", "fsl,imx35-gpio";
+                       reg = <0x4012c000 0x4000>;
+                       interrupts = <100>,
+                                    <101>;
+                       gpio-controller;
+                       #gpio-cells = <2>;
+                       interrupt-controller;
+                       #interrupt-cells = <2>;
+               };
+
+               gpio2: gpio@40130000 {
+                       compatible = "fsl,imxrt-gpio", "fsl,imx35-gpio";
+                       reg = <0x40130000 0x4000>;
+                       interrupts = <102>,
+                               <103>;
+                       gpio-controller;
+                       #gpio-cells = <2>;
+                       interrupt-controller;
+                       #interrupt-cells = <2>;
+               };
+
+               gpio3: gpio@40134000 {
+                       compatible = "fsl,imxrt-gpio", "fsl,imx35-gpio";
+                       reg = <0x40134000 0x4000>;
+                       interrupts = <104>,
+                               <105>;
+                       gpio-controller;
+                       #gpio-cells = <2>;
+                       interrupt-controller;
+                       #interrupt-cells = <2>;
+               };
+
+               gpio4: gpio@40138000 {
+                       compatible = "fsl,imxrt-gpio", "fsl,imx35-gpio";
+                       reg = <0x40138000 0x4000>;
+                       interrupts = <106>,
+                                       <107>;
+                       gpio-controller;
+                       #gpio-cells = <2>;
+                       interrupt-controller;
+                       #interrupt-cells = <2>;
+               };
+
+               gpio5: gpio@4013c000 {
+                       compatible = "fsl,imxrt-gpio", "fsl,imx35-gpio";
+                       reg = <0x4013c000 0x4000>;
+                       interrupts = <108>,
+                               <109>;
+                       gpio-controller;
+                       #gpio-cells = <2>;
+                       interrupt-controller;
+                       #interrupt-cells = <2>;
+               };
+
+               gpio6: gpio@40140000 {
+                       compatible = "fsl,imxrt-gpio", "fsl,imx35-gpio";
+                       reg = <0x40140000 0x4000>;
+                       interrupts = <61>,
+                               <62>;
+                       gpio-controller;
+                       #gpio-cells = <2>;
+                       interrupt-controller;
+                       #interrupt-cells = <2>;
+               };
+
+               gpio7: gpio@40c5c000 {
+                       compatible = "fsl,imxrt-gpio", "fsl,imx35-gpio";
+                       reg = <0x40c5c000 0x4000>;
+                       interrupts = <99>,
+                               <99>;
+                       gpio-controller;
+                       #gpio-cells = <2>;
+                       interrupt-controller;
+                       #interrupt-cells = <2>;
+               };
+
+               gpio8: gpio@40c60000 {
+                       compatible = "fsl,imxrt-gpio", "fsl,imx35-gpio";
+                       reg = <0x40c60000 0x4000>;
+                       interrupts = <99>,
+                               <99>;
+                       gpio-controller;
+                       #gpio-cells = <2>;
+                       interrupt-controller;
+                       #interrupt-cells = <2>;
+               };
+
+               gpio9: gpio@40c64000 {
+                       compatible = "fsl,imxrt-gpio", "fsl,imx35-gpio";
+                       reg = <0x40c64000 0x4000>;
+                       interrupts = <99>,
+                               <99>;
+                       gpio-controller;
+                       #gpio-cells = <2>;
+                       interrupt-controller;
+                       #interrupt-cells = <2>;
+               };
+
+               gpio10: gpio@40c68000 {
+                       compatible = "fsl,imxrt-gpio", "fsl,imx35-gpio";
+                       reg = <0x40c68000 0x4000>;
+                       interrupts = <99>,
+                               <99>;
+                       gpio-controller;
+                       #gpio-cells = <2>;
+                       interrupt-controller;
+                       #interrupt-cells = <2>;
+               };
+
+               gpio11: gpio@40c6c000 {
+                       compatible = "fsl,imxrt-gpio", "fsl,imx35-gpio";
+                       reg = <0x40c6c000 0x4000>;
+                       interrupts = <99>,
+                               <99>;
+                       gpio-controller;
+                       #gpio-cells = <2>;
+                       interrupt-controller;
+                       #interrupt-cells = <2>;
+               };
+
+               gpio12: gpio@40c70000 {
+                       compatible = "fsl,imxrt-gpio", "fsl,imx35-gpio";
+                       reg = <0x40c70000 0x4000>;
+                       interrupts = <61>,
+                               <62>; // only cm4
+                       gpio-controller;
+                       #gpio-cells = <2>;
+                       interrupt-controller;
+                       #interrupt-cells = <2>;
+               };
+
+               gpio13: gpio@40ca0000 {
+                       compatible = "fsl,imxrt-gpio", "fsl,imx35-gpio";
+                       reg = <0x40ca0000 0x4000>;
+                       interrupts = <93>,
+                               <93>;
+                       gpio-controller;
+                       #gpio-cells = <2>;
+                       interrupt-controller;
+                       #interrupt-cells = <2>;
+               };
+
+               gpt1: gpt1@400ec000 {
+                       compatible = "fsl,imxrt-gpt";
+                       reg = <0x400ec000 0x4000>;
+                       interrupts = <119>;
+                       clocks = <&clks IMXRT1170_CLK_GPT1>;
+                       status = "disabled";
+               };
+       };
+};
index f102b2a..462eaf6 100644 (file)
@@ -3,6 +3,8 @@
  * (C) Copyright 2019 Rockchip Electronics Co., Ltd
  */
 
+#include "rockchip-u-boot.dtsi"
+
 / {
        aliases {
                mmc0 = &emmc;
index f48121a..5b176a9 100644 (file)
@@ -46,8 +46,8 @@
        };
 
 
-       rpc: rpc@ee200000 {
-               compatible = "renesas,rpc-r7s72100", "renesas,rpc";
+       rpc: spi@ee200000 {
+               compatible = "renesas,r7s72100-rpc-if";
                reg = <0x3fefa000 0x100>, <0x18000000 0x08000000>;
                bank-width = <2>;
                num-cs = <1>;
index af1c861..d296106 100644 (file)
@@ -10,8 +10,8 @@
 
 / {
        soc {
-               rpc: rpc@ee200000 {
-                       compatible = "renesas,rcar-gen3-rpc", "renesas,rpc-r8a774c0";
+               rpc: spi@ee200000 {
+                       compatible = "renesas,r8a774c0-rpc-if", "renesas,rcar-gen3-rpc-if";
                        reg = <0 0xee200000 0 0x100>, <0 0x08000000 0 0x04000000>;
                        clocks = <&cpg CPG_MOD 917>;
                        bank-width = <2>;
index 5a11651..2306c7b 100644 (file)
@@ -13,8 +13,8 @@
 
 / {
        soc {
-               rpc: rpc@ee200000 {
-                       compatible = "renesas,rpc-r8a7795", "renesas,rpc";
+               rpc: spi@ee200000 {
+                       compatible = "renesas,r8a7795-rpc-if", "renesas,rcar-gen3-rpc-if";
                        reg = <0 0xee200000 0 0x100>, <0 0x08000000 0 0>;
                        clocks = <&cpg CPG_MOD 917>;
                        bank-width = <2>;
index f1cae1c..f64e5a4 100644 (file)
@@ -13,8 +13,8 @@
 
 / {
        soc {
-               rpc: rpc@ee200000 {
-                       compatible = "renesas,rpc-r8a7796", "renesas,rpc";
+               rpc: spi@ee200000 {
+                       compatible = "renesas,r8a7796-rpc-if", "renesas,rcar-gen3-rpc-if";
                        reg = <0 0xee200000 0 0x100>, <0 0x08000000 0 0>;
                        clocks = <&cpg CPG_MOD 917>;
                        bank-width = <2>;
index 9cc6f20..c4abcc5 100644 (file)
@@ -13,8 +13,8 @@
 
 / {
        soc {
-               rpc: rpc@ee200000 {
-                       compatible = "renesas,rpc-r8a77965", "renesas,rpc";
+               rpc: spi@ee200000 {
+                       compatible = "renesas,r8a77965-rpc-if", "renesas,rcar-gen3-rpc-if";
                        reg = <0 0xee200000 0 0x100>, <0 0x08000000 0 0>;
                        clocks = <&cpg CPG_MOD 917>;
                        bank-width = <2>;
index ac3c6be..614caa9 100644 (file)
@@ -13,8 +13,8 @@
 
 / {
        soc {
-               rpc: rpc@ee200000 {
-                       compatible = "renesas,rpc-r8a77970", "renesas,rpc";
+               rpc: spi@ee200000 {
+                       compatible = "renesas,r8a77970-rpc-if", "renesas,rcar-gen3-rpc-if";
                        reg = <0 0xee200000 0 0x100>, <0 0x08000000 0 0>;
                        clocks = <&cpg CPG_MOD 917>;
                        bank-width = <2>;
index 365d40a..54f01c9 100644 (file)
@@ -13,8 +13,8 @@
 
 / {
        soc {
-               rpc: rpc@ee200000 {
-                       compatible = "renesas,rpc-r8a77980", "renesas,rpc";
+               rpc: spi@ee200000 {
+                       compatible = "renesas,r8a77980-rpc-if", "renesas,rcar-gen3-rpc-if";
                        reg = <0 0xee200000 0 0x100>, <0 0x08000000 0 0>;
                        clocks = <&cpg CPG_MOD 917>;
                        bank-width = <2>;
index 6655abe..50bbbe1 100644 (file)
@@ -9,8 +9,8 @@
 
 / {
        soc {
-               rpc: rpc@ee200000 {
-                       compatible = "renesas,rpc-r8a77990", "renesas,rpc";
+               rpc: spi@ee200000 {
+                       compatible = "renesas,r8a77990-rpc-if", "renesas,rcar-gen3-rpc-if";
                        reg = <0 0xee200000 0 0x100>, <0 0x08000000 0 0>;
                        clocks = <&cpg CPG_MOD 917>;
                        bank-width = <2>;
index 0917a80..347b59a 100644 (file)
@@ -9,8 +9,8 @@
 
 / {
        soc {
-               rpc: rpc@ee200000 {
-                       compatible = "renesas,rpc-r8a77995", "renesas,rpc";
+               rpc: spi@ee200000 {
+                       compatible = "renesas,r8a77995-rpc-if", "renesas,rcar-gen3-rpc-if";
                        reg = <0 0xee200000 0 0x100>, <0 0x08000000 0 0>;
                        clocks = <&cpg CPG_MOD 917>;
                        bank-width = <2>;
index 83dbe3f..9f2772a 100644 (file)
@@ -10,7 +10,7 @@
 / {
        soc {
                rpc: spi@ee200000 {
-                       compatible = "renesas,rpc-r8a779a0", "renesas,rcar-gen3-rpc";
+                       compatible = "renesas,r8a779a0-rpc-if", "renesas,rcar-gen3-rpc-if";
                        reg = <0 0xee200000 0 0x200>, <0 0x08000000 0 0x04000000>;
                        clocks = <&cpg CPG_MOD 629>;
                        bank-width = <2>;
index 9eb696b..e411445 100644 (file)
@@ -56,7 +56,7 @@
        };
 };
 
-#ifdef CONFIG_ROCKCHIP_SPI_IMAGE
+#if defined(CONFIG_ROCKCHIP_SPI_IMAGE) && defined(CONFIG_HAS_ROM)
 &binman {
        rom {
                filename = "u-boot.rom";
index 9fb6d86..53ee760 100644 (file)
                ports = <&vopl_out>, <&vopb_out>;
        };
 
-       sdmmc: dwmmc@ff0c0000 {
+       sdmmc: mmc@ff0c0000 {
                compatible = "rockchip,rk3288-dw-mshc";
                max-frequency = <150000000>;
                clocks = <&cru HCLK_SDMMC>, <&cru SCLK_SDMMC>,
                         <&cru SCLK_SDMMC_DRV>, <&cru SCLK_SDMMC_SAMPLE>;
-               clock-names = "biu", "ciu", "ciu_drv", "ciu_sample";
+               clock-names = "biu", "ciu", "ciu-drive", "ciu-sample";
                fifo-depth = <0x100>;
                interrupts = <GIC_SPI 32 IRQ_TYPE_LEVEL_HIGH>;
                reg = <0xff0c0000 0x4000>;
                status = "disabled";
        };
 
-       sdio0: dwmmc@ff0d0000 {
+       sdio0: mmc@ff0d0000 {
                compatible = "rockchip,rk3288-dw-mshc";
                max-frequency = <150000000>;
                clocks = <&cru HCLK_SDIO0>, <&cru SCLK_SDIO0>,
                         <&cru SCLK_SDIO0_DRV>, <&cru SCLK_SDIO0_SAMPLE>;
-               clock-names = "biu", "ciu", "ciu_drv", "ciu_sample";
+               clock-names = "biu", "ciu", "ciu-drive", "ciu-sample";
                fifo-depth = <0x100>;
                interrupts = <GIC_SPI 33 IRQ_TYPE_LEVEL_HIGH>;
                reg = <0xff0d0000 0x4000>;
                status = "disabled";
        };
 
-       sdio1: dwmmc@ff0e0000 {
+       sdio1: mmc@ff0e0000 {
                compatible = "rockchip,rk3288-dw-mshc";
                max-frequency = <150000000>;
                clocks = <&cru HCLK_SDIO1>, <&cru SCLK_SDIO1>,
                         <&cru SCLK_SDIO1_DRV>, <&cru SCLK_SDIO1_SAMPLE>;
-               clock-names = "biu", "ciu", "ciu_drv", "ciu_sample";
+               clock-names = "biu", "ciu", "ciu-drive", "ciu-sample";
                fifo-depth = <0x100>;
                interrupts = <GIC_SPI 34 IRQ_TYPE_LEVEL_HIGH>;
                reg = <0xff0e0000 0x4000>;
                status = "disabled";
        };
 
-       emmc: dwmmc@ff0f0000 {
+       emmc: mmc@ff0f0000 {
                compatible = "rockchip,rk3288-dw-mshc";
                max-frequency = <150000000>;
                clocks = <&cru HCLK_EMMC>, <&cru SCLK_EMMC>,
                         <&cru SCLK_EMMC_DRV>, <&cru SCLK_EMMC_SAMPLE>;
-               clock-names = "biu", "ciu", "ciu_drv", "ciu_sample";
+               clock-names = "biu", "ciu", "ciu-drive", "ciu-sample";
                fifo-depth = <0x100>;
                interrupts = <GIC_SPI 35 IRQ_TYPE_LEVEL_HIGH>;
                reg = <0xff0f0000 0x4000>;
index 4bfad31..ab5bfc2 100644 (file)
@@ -3,6 +3,8 @@
  *(C) Copyright 2019 Rockchip Electronics Co., Ltd
  */
 
+#include "rockchip-u-boot.dtsi"
+
 / {
        aliases {
                mmc0 = &emmc;
index 95f2652..16c3373 100644 (file)
@@ -3,6 +3,8 @@
  * Copyright (c) 2020 Theobroma Systems Design und Consulting GmbH
  */
 
+#include "rockchip-u-boot.dtsi"
+
 / {
        chosen {
                u-boot,spl-boot-order = &sdmmc;
index 1633558..d4a7540 100644 (file)
@@ -3,6 +3,8 @@
  * (C) Copyright 2019 Rockchip Electronics Co., Ltd
  */
 
+#include "rockchip-u-boot.dtsi"
+
 / {
        aliases {
                mmc0 = &emmc;
index 2767c26..811d59a 100644 (file)
@@ -4,6 +4,7 @@
  */
 
 #include <dt-bindings/memory/rk3368-dmc.h>
+#include "rockchip-u-boot.dtsi"
 
 / {
        dmc: dmc@ff610000 {
index 716b9a4..3c1a15f 100644 (file)
@@ -60,7 +60,7 @@
 
 };
 
-#ifdef CONFIG_ROCKCHIP_SPI_IMAGE
+#if defined(CONFIG_ROCKCHIP_SPI_IMAGE) && defined(CONFIG_HAS_ROM)
 &binman {
        rom {
                filename = "u-boot.rom";
index 5a80dda..fa9b6ae 100644 (file)
@@ -3,6 +3,8 @@
  * (C) Copyright 2021 Rockchip Electronics Co., Ltd
  */
 
+#include "rockchip-u-boot.dtsi"
+
 / {
        aliases {
                mmc0 = &sdhci;
index eae3ee7..584f21e 100644 (file)
                filename = "u-boot-rockchip.bin";
                pad-byte = <0xff>;
 
-               blob {
+               mkimage {
                        filename = "idbloader.img";
+                       args = "-n", CONFIG_SYS_SOC, "-T", "rksd";
+#ifdef CONFIG_TPL
+                       multiple-data-files;
+
+                       u-boot-tpl {
+                       };
+#endif
+                       u-boot-spl {
+                       };
                };
 
+#ifdef CONFIG_ARM64
+               blob {
+                       filename = "u-boot.itb";
+#else
                u-boot-img {
+#endif
                        offset = <CONFIG_SPL_PAD_TO>;
                };
        };
+
+#ifdef CONFIG_ROCKCHIP_SPI_IMAGE
+       simple-bin-spi {
+               filename = "u-boot-rockchip-spi.bin";
+               pad-byte = <0xff>;
+
+               mkimage {
+                       filename = "idbloader-spi.img";
+                       args = "-n", CONFIG_SYS_SOC, "-T", "rkspi";
+#ifdef CONFIG_TPL
+                       multiple-data-files;
+
+                       u-boot-tpl {
+                       };
+#endif
+                       u-boot-spl {
+                       };
+               };
+
+#ifdef CONFIG_ARM64
+               blob {
+                       filename = "u-boot.itb";
+#else
+               u-boot-img {
+#endif
+                       /* Sync with u-boot,spl-payload-offset if present */
+                       offset = <CONFIG_SYS_SPI_U_BOOT_OFFS>;
+               };
+       };
+#endif
 };
 #endif
index f88466f..a4ce936 100644 (file)
@@ -58,7 +58,7 @@
                                vsync-len = <10>;
                                hsync-active = <0>;
                                vsync-active = <0>;
-                               de-active = <0>;
+                               de-active = <1>;
                                pixelclk-active = <1>;
                        };
                };
index a5ac62c..767a06e 100644 (file)
                        ranges = <0 0x50002000 0xa400>;
                        interrupt-parent = <&exti>;
                        st,syscfg = <&exti 0x60 0xff>;
-                       hwlocks = <&hwspinlock 0>;
                        pins-are-numbered;
 
                        gpioa: gpio@50002000 {
                        pins-are-numbered;
                        interrupt-parent = <&exti>;
                        st,syscfg = <&exti 0x60 0xff>;
-                       hwlocks = <&hwspinlock 0>;
 
                        gpioz: gpio@54004000 {
                                gpio-controller;
index 5bc6698..0bcaec5 100644 (file)
@@ -5,14 +5,6 @@
 
 #include "stm32mp15xx-dhcom-u-boot.dtsi"
 
-/ {
-       aliases {
-               /delete-property/ ethernet1;
-       };
-};
-
-/delete-node/ &ks8851;
-
 &usbotg_hs {
        dr_mode = "peripheral";
 };
index ee747a5..8a7156c 100644 (file)
@@ -9,8 +9,6 @@
 #include "stm32mp15-ddr3-dhsom-2x2Gb-1066-binG.dtsi"
 #include "stm32mp15-ddr3-dhsom-2x4Gb-1066-binG.dtsi"
 
-/delete-node/ &ksz8851;
-
 / {
        aliases {
                i2c1 = &i2c2;
@@ -21,7 +19,6 @@
                spi0 = &qspi;
                usb0 = &usbotg_hs;
                eeprom0 = &eeprom0;
-               ethernet1 = &ks8851;
        };
 
        config {
                dh,som-coding-gpios = <&gpiof 12 0>, <&gpiof 13 0>, <&gpiof 15 0>;
                dh,ddr3-coding-gpios = <&gpioz 6 0>, <&gpioz 7 0>;
        };
-
-       /* This is actually on FMC2, but we do not have bus driver for that */
-       ks8851: ks8851mll@64000000 {
-               compatible = "micrel,ks8851-mll";
-               reg = <0x64000000 0x20000>;
-       };
 };
 
 &ethernet0 {
 };
 
 &pinctrl {
-       /* These should bound to FMC2 bus driver, but we do not have one */
-       pinctrl-0 = <&fmc_pins_b &mco2_pins_a>;
-       pinctrl-1 = <&fmc_sleep_pins_b &mco2_sleep_pins_a>;
-       pinctrl-names = "default", "sleep";
-
        mco2_pins_a: mco2-0 {
                pins {
                        pinmux = <STM32_PINMUX('G', 2, AF1)>; /* MCO2 */
index 407fed5..b6a6a78 100644 (file)
@@ -5,25 +5,16 @@
 
 #include "stm32mp15xx-dhcor-u-boot.dtsi"
 
-/delete-node/ &ksz8851;
-
 / {
        aliases {
                mmc0 = &sdmmc1;
                mmc1 = &sdmmc2;
                usb0 = &usbotg_hs;
-               ethernet1 = &ks8851;
        };
 
        config {
                dh,board-coding-gpios = <&gpioh 9 0>, <&gpioh 8 0>, <&gpioh 3 0>;
        };
-
-       /* This is actually on FMC2, but we do not have bus driver for that */
-       ks8851: ks8851mll@64000000 {
-               compatible = "micrel,ks8851-mll";
-               reg = <0x64000000 0x20000>;
-       };
 };
 
 &ethernet0 {
        };
 };
 
-&pinctrl {
-       /* These should bound to FMC2 bus driver, but we do not have one */
-       pinctrl-0 = <&fmc_pins_b>;
-       pinctrl-1 = <&fmc_sleep_pins_b>;
-       pinctrl-names = "default", "sleep";
-};
-
 &sdmmc1 {
        u-boot,dm-spl;
        st,use-ckin;
index d54e6e6..a666271 100644 (file)
@@ -56,6 +56,7 @@
 
 #define MXC_CPU_IMXRT1020      0xB4 /* dummy ID */
 #define MXC_CPU_IMXRT1050      0xB6 /* dummy ID */
+#define MXC_CPU_IMXRT1170      0xBA /* dummy ID */
 
 #define MXC_CPU_MX7ULP         0xE1 /* Temporally hard code */
 #define MXC_CPU_VF610          0xF6 /* dummy ID */
index f69e9e4..9d4cd68 100644 (file)
@@ -7,13 +7,12 @@
 #ifndef _PL310_H_
 #define _PL310_H_
 
-#include <linux/types.h>
-
 /* Register bit fields */
 #define PL310_AUX_CTRL_ASSOCIATIVITY_MASK      (1 << 16)
 #define L2X0_DYNAMIC_CLK_GATING_EN             (1 << 1)
 #define L2X0_STNDBY_MODE_EN                    (1 << 0)
 #define L2X0_CTRL_EN                           1
+#define L2X0_CTRL_OFF                          0x100
 
 #define L310_SHARED_ATT_OVERRIDE_ENABLE                (1 << 22)
 #define L310_AUX_CTRL_DATA_PREFETCH_MASK       (1 << 28)
 #define L2X0_CACHE_ID_RTL_MASK          0x3f
 #define L2X0_CACHE_ID_RTL_R3P2          0x8
 
+#ifndef __ASSEMBLY__
+
+#include <linux/types.h>
+
 struct pl310_regs {
        u32 pl310_cache_id;
        u32 pl310_cache_type;
@@ -87,3 +90,5 @@ void pl310_inval_range(u32 start, u32 end);
 void pl310_clean_inval_range(u32 start, u32 end);
 
 #endif
+
+#endif
index dbea2b0..01d652a 100644 (file)
@@ -32,12 +32,12 @@ static noinline long smh_trap(unsigned int sysnum, void *addr)
 {
        register long result asm("r0");
 #if defined(CONFIG_ARM64)
-       asm volatile ("hlt #0xf000" : "=r" (result) : "0"(sysnum), "r"(addr));
+       asm volatile ("hlt #0xf000" : "=r" (result) : "0"(sysnum), "r"(addr) : "memory");
 #elif defined(CONFIG_CPU_V7M)
-       asm volatile ("bkpt #0xAB" : "=r" (result) : "0"(sysnum), "r"(addr));
+       asm volatile ("bkpt #0xAB" : "=r" (result) : "0"(sysnum), "r"(addr) : "memory");
 #else
        /* Note - untested placeholder */
-       asm volatile ("svc #0x123456" : "=r" (result) : "0"(sysnum), "r"(addr));
+       asm volatile ("svc #0x123456" : "=r" (result) : "0"(sysnum), "r"(addr) : "memory");
 #endif
        return result;
 }
index 979b30a..3470160 100644 (file)
@@ -269,6 +269,14 @@ config TARGET_IMX8MP_RSB3720A1_6G
        select IMX8MP
        select SUPPORT_SPL
        select IMX8M_LPDDR4
+
+config TARGET_LIBREM5
+       bool "Purism Librem5 Phone"
+       select BINMAN
+       select IMX8MQ
+       select SUPPORT_SPL
+       select IMX8M_LPDDR4
+
 endchoice
 
 source "board/advantech/imx8mp_rsb3720a1/Kconfig"
@@ -290,6 +298,7 @@ source "board/kontron/sl-mx8mm/Kconfig"
 source "board/menlo/mx8menlo/Kconfig"
 source "board/phytec/phycore_imx8mm/Kconfig"
 source "board/phytec/phycore_imx8mp/Kconfig"
+source "board/purism/librem5/Kconfig"
 source "board/ronetix/imx8mq-cm/Kconfig"
 source "board/technexion/pico-imx8mq/Kconfig"
 source "board/variscite/imx8mn_var_som/Kconfig"
index 8c89133..c1d6b09 100644 (file)
@@ -12,6 +12,10 @@ config IMXRT1050
        bool
        select IMXRT
 
+config IMXRT1170
+       bool
+       select IMXRT
+
 config SYS_SOC
        default "imxrt"
 
@@ -27,9 +31,14 @@ config TARGET_IMXRT1050_EVK
        bool "Support imxrt1050 EVK board"
        select IMXRT1050
 
+config TARGET_IMXRT1170_EVK
+       bool "Support imxrt1170 EVK board"
+       select IMXRT1170
+
 endchoice
 
 source "board/freescale/imxrt1020-evk/Kconfig"
 source "board/freescale/imxrt1050-evk/Kconfig"
+source "board/freescale/imxrt1170-evk/Kconfig"
 
 endif
index ba01599..34162a3 100644 (file)
@@ -43,6 +43,8 @@ u32 get_cpu_rev(void)
        return MXC_CPU_IMXRT1020 << 12;
 #elif defined(CONFIG_IMXRT1050)
        return MXC_CPU_IMXRT1050 << 12;
+#elif defined(CONFIG_IMXRT1170)
+       return MXC_CPU_IMXRT1170 << 12;
 #else
 #error This IMXRT SoC is not supported
 #endif
index ec560fe..c7a03e5 100644 (file)
@@ -466,6 +466,17 @@ config TARGET_MX6ULL_14X14_EVK
        select DM_THERMAL
        imply CMD_DM
 
+config TARGET_MX6ULZ_SMM_M2
+       bool "Support imx6ulz_smm_m2"
+       depends on MX6ULL
+       select DM
+       select DM_GPIO
+       select DM_I2C
+       select DM_SERIAL
+       select DM_MTD
+       select DM_THERMAL
+       select SUPPORT_SPL
+
 config TARGET_MYS_6ULX
        bool "MYiR MYS-6ULX"
        depends on MX6ULL
@@ -680,6 +691,7 @@ source "board/ge/b1x5v2/Kconfig"
 source "board/aristainetos/Kconfig"
 source "board/armadeus/opos6uldev/Kconfig"
 source "board/boundary/nitrogen6x/Kconfig"
+source "board/bsh/imx6ulz_smm_m2/Kconfig"
 source "board/bticino/mamoj/Kconfig"
 source "board/compulab/cm_fx6/Kconfig"
 source "board/dhelectronics/dh_imx6/Kconfig"
index cc3c125..07bf07b 100644 (file)
@@ -288,7 +288,7 @@ static int spl_romapi_load_image_stream(struct spl_image_info *spl_image,
        }
 
        imagesize = img_info_size(phdr);
-       printf("Find img info 0x&%p, size %d\n", phdr, imagesize);
+       printf("Find img info 0x%p, size %d\n", phdr, imagesize);
 
        if (p - phdr < imagesize) {
                imagesize -= p - phdr;
index 80f893a..df3e8f1 100644 (file)
@@ -52,7 +52,7 @@ unsigned int kw_winctrl_calcsize(unsigned int sizeval)
        return (0x0000ffff & j);
 }
 
-static struct mbus_win windows[] = {
+static const struct mbus_win windows[] = {
        /* Window 0: PCIE MEM address space */
        { KW_DEFADR_PCI_MEM, KW_DEFADR_PCI_MEM_SIZE,
          KWCPU_TARGET_PCIE, KWCPU_ATTR_PCIE_MEM },
index d8639c6..9eec786 100644 (file)
@@ -150,7 +150,7 @@ struct kwgpio_registers {
 unsigned int mvebu_sdram_bar(enum memory_bank bank);
 unsigned int mvebu_sdram_bs(enum memory_bank bank);
 void mvebu_sdram_size_adjust(enum memory_bank bank);
-int mvebu_mbus_probe(struct mbus_win windows[], int count);
+int mvebu_mbus_probe(const struct mbus_win windows[], int count);
 void mvebu_config_gpio(unsigned int gpp0_oe_val, unsigned int gpp1_oe_val,
                unsigned int gpp0_oe, unsigned int gpp1_oe);
 int kw_config_mpp(unsigned int mpp0_7, unsigned int mpp8_15,
index 1457af1..1f8cdf8 100644 (file)
@@ -20,7 +20,7 @@
 #define DDR_BASE_CS_OFF(n)     (0x0000 + ((n) << 3))
 #define DDR_SIZE_CS_OFF(n)     (0x0004 + ((n) << 3))
 
-static struct mbus_win windows[] = {
+static const struct mbus_win windows[] = {
        /* SPI */
        { MBUS_SPI_BASE, MBUS_SPI_SIZE,
          CPU_TARGET_DEVICEBUS_BOOTROM_SPI, CPU_ATTR_SPIFLASH },
@@ -445,19 +445,6 @@ static void setup_usb_phys(void)
  */
 int arch_cpu_init(void)
 {
-       struct pl310_regs *const pl310 =
-               (struct pl310_regs *)CONFIG_SYS_PL310_BASE;
-
-       if (IS_ENABLED(CONFIG_ARMADA_38X)) {
-               /*
-                * To fully release / unlock this area from cache, we need
-                * to flush all caches and disable the L2 cache.
-                */
-               icache_disable();
-               dcache_disable();
-               clrbits_le32(&pl310->pl310_ctrl, L2X0_CTRL_EN);
-       }
-
        /*
         * We need to call mvebu_mbus_probe() before calling
         * update_sdram_window_sizes() as it disables all previously
@@ -663,7 +650,7 @@ void enable_caches(void)
         * ethernet driver (mvpp2). So lets keep the d-cache disabled
         * until this is solved.
         */
-       if (IS_ENABLED(CONFIG_ARMADA_375)) {
+       if (!IS_ENABLED(CONFIG_ARMADA_375)) {
                /* Enable D-cache. I-cache is already enabled in start.S */
                dcache_enable();
        }
@@ -671,13 +658,21 @@ void enable_caches(void)
 
 void v7_outer_cache_enable(void)
 {
+       struct pl310_regs *const pl310 =
+               (struct pl310_regs *)CONFIG_SYS_PL310_BASE;
+
+       /* The L2 cache is already disabled at this point */
+
+       /*
+        * For now L2 cache will be enabled only for Armada XP and Armada 38x.
+        * It can be enabled also for other SoCs after testing that it works fine.
+        */
+       if (!IS_ENABLED(CONFIG_ARMADA_XP) && !IS_ENABLED(CONFIG_ARMADA_38X))
+               return;
+
        if (IS_ENABLED(CONFIG_ARMADA_XP)) {
-               struct pl310_regs *const pl310 =
-                       (struct pl310_regs *)CONFIG_SYS_PL310_BASE;
                u32 u;
 
-               /* The L2 cache is already disabled at this point */
-
                /*
                 * For Aurora cache in no outer mode, enable via the CP15
                 * coprocessor broadcasting of cache commands to L2.
@@ -687,10 +682,10 @@ void v7_outer_cache_enable(void)
                asm volatile("mcr p15, 1, %0, c15, c2, 0" : : "r" (u));
 
                isb();
-
-               /* Enable the L2 cache */
-               setbits_le32(&pl310->pl310_ctrl, L2X0_CTRL_EN);
        }
+
+       /* Enable the L2 cache */
+       setbits_le32(&pl310->pl310_ctrl, L2X0_CTRL_EN);
 }
 
 void v7_outer_cache_disable(void)
index d9fa1f3..b127fce 100644 (file)
@@ -128,7 +128,7 @@ struct sar_freq_modes {
 unsigned int mvebu_sdram_bar(enum memory_bank bank);
 unsigned int mvebu_sdram_bs(enum memory_bank bank);
 void mvebu_sdram_size_adjust(enum memory_bank bank);
-int mvebu_mbus_probe(struct mbus_win windows[], int count);
+int mvebu_mbus_probe(const struct mbus_win windows[], int count);
 u32 mvebu_get_nand_clock(void);
 
 void __noreturn return_to_bootrom(void);
index 2491310..60c2072 100644 (file)
@@ -2,6 +2,8 @@
 
 #include <config.h>
 #include <linux/linkage.h>
+#include <asm/system.h>
+#include <asm/pl310.h>
 
 ENTRY(arch_very_early_init)
 #ifdef CONFIG_ARMADA_38X
@@ -10,10 +12,36 @@ ENTRY(arch_very_early_init)
         * register address on Armada 38x. Without this the SDRAM
         * located at >= 0x4000.0000 is also not accessible, as its
         * still locked to cache.
+        *
+        * So to fully release / unlock this area from cache, we need
+        * to first flush all caches, then disable the MMU and
+        * disable the L2 cache.
         */
+
+       /* Invalidate L1 I/D */
+       mov     r0, #0                  @ set up for MCR
+       mcr     p15, 0, r0, c8, c7, 0   @ invalidate TLBs
+       mcr     p15, 0, r0, c7, c5, 0   @ invalidate icache
+       mcr     p15, 0, r0, c7, c5, 6   @ invalidate BP array
+       mcr     p15, 0, r0, c7, c10, 4  @ DSB
+       mcr     p15, 0, r0, c7, c5, 4   @ ISB
+
+       /* Disable MMU */
        mrc     p15, 0, r0, c1, c0, 0
-       bic     r0, #1
+       bic     r0, #CR_M
        mcr     p15, 0, r0, c1, c0, 0
+
+       /*
+        * Disable L2 cache
+        *
+        * NOTE: Internal registers are still at address INTREG_BASE_ADDR_REG
+        *       but CONFIG_SYS_PL310_BASE is already calculated from base
+        *       address SOC_REGS_PHY_BASE.
+        */
+       ldr     r1, =(CONFIG_SYS_PL310_BASE - SOC_REGS_PHY_BASE + INTREG_BASE_ADDR_REG)
+       ldr     r0, [r1, #L2X0_CTRL_OFF]
+       bic     r0, #L2X0_CTRL_EN
+       str     r0, [r1, #L2X0_CTRL_OFF]
 #endif
 
        /* Move internal registers from INTREG_BASE_ADDR_REG to SOC_REGS_PHY_BASE */
index 7092f6c..959ca8e 100644 (file)
@@ -469,7 +469,7 @@ int mbus_dt_setup_win(u32 base, u32 size, u8 target, u8 attr)
        return 0;
 }
 
-int mvebu_mbus_probe(struct mbus_win windows[], int count)
+int mvebu_mbus_probe(const struct mbus_win windows[], int count)
 {
        int win;
        int ret;
index 2e467b5..943ae01 100644 (file)
@@ -105,7 +105,7 @@ struct serdes_unit_data {
        u8 serdes_unit_num;
 };
 
-static struct serdes_unit_data serdes_type_to_unit_info[] = {
+static const struct serdes_unit_data serdes_type_to_unit_info[] = {
        {PEX_UNIT_ID, 0,},
        {PEX_UNIT_ID, 1,},
        {PEX_UNIT_ID, 2,},
index ea858b2..e90aff0 100644 (file)
@@ -86,7 +86,7 @@ static const struct udevice_id mvebu_reset_of_match[] = {
        { },
 };
 
-static struct reset_ops mvebu_reset_ops = {
+static const struct reset_ops mvebu_reset_ops = {
        .of_xlate = mvebu_reset_of_xlate,
        .request = mvebu_reset_request,
        .rfree = mvebu_reset_free,
index c561a77..b46cea2 100644 (file)
@@ -425,12 +425,10 @@ config SPL_MMC
 
 config ROCKCHIP_SPI_IMAGE
        bool "Build a SPI image for rockchip"
-       depends on HAS_ROM
        help
          Some Rockchip SoCs support booting from SPI flash. Enable this
-         option to produce a 4MB SPI-flash image (called u-boot.rom)
-         containing U-Boot. The image is built by binman. U-Boot sits near
-         the start of the image.
+         option to produce a SPI-flash image containing U-Boot. The image
+         is built by binman. U-Boot sits near the start of the image.
 
 config LNX_KRNL_IMG_TEXT_OFFSET_BASE
        default SYS_TEXT_BASE
index 70fe0d0..dd9109b 100644 (file)
@@ -8,6 +8,7 @@
 #include <asm/global_data.h>
 #include <asm/io.h>
 #include <asm/arch/grf_rk3308.h>
+#include <asm/arch-rockchip/bootrom.h>
 #include <asm/arch-rockchip/hardware.h>
 #include <asm/gpio.h>
 #include <debug_uart.h>
@@ -142,6 +143,11 @@ enum {
 
 #define GPIO0_A4       4
 
+const char * const boot_devices[BROM_LAST_BOOTSOURCE + 1] = {
+       [BROM_BOOTSOURCE_EMMC] = "/mmc@ff490000",
+       [BROM_BOOTSOURCE_SD] = "/mmc@ff480000",
+};
+
 int rk_board_init(void)
 {
        static struct rk3308_grf * const grf = (void *)GRF_BASE;
index 01a0559..21db03b 100644 (file)
@@ -27,7 +27,7 @@ DECLARE_GLOBAL_DATA_PTR;
 #define GRF_BASE       0xff770000
 
 const char * const boot_devices[BROM_LAST_BOOTSOURCE + 1] = {
-       [BROM_BOOTSOURCE_EMMC] = "/sdhci@fe330000",
+       [BROM_BOOTSOURCE_EMMC] = "/mmc@fe330000",
        [BROM_BOOTSOURCE_SPINOR] = "/spi@ff1d0000/flash@0",
        [BROM_BOOTSOURCE_SD] = "/mmc@fe320000",
 };
@@ -180,9 +180,9 @@ const char *spl_decode_boot_device(u32 boot_device)
                u32 boot_device;
                const char *ofpath;
        } spl_boot_devices_tbl[] = {
-               { BOOT_DEVICE_MMC1, "/mmc@fe320000" },
-               { BOOT_DEVICE_MMC2, "/sdhci@fe330000" },
-               { BOOT_DEVICE_SPI, "/spi@ff1d0000" },
+               { BOOT_DEVICE_MMC2, "/mmc@fe320000" },
+               { BOOT_DEVICE_MMC1, "/mmc@fe330000" },
+               { BOOT_DEVICE_SPI, "/spi@ff1d0000/flash@0" },
        };
 
        for (i = 0; i < ARRAY_SIZE(spl_boot_devices_tbl); ++i)
index a093e61..660c907 100644 (file)
@@ -274,7 +274,6 @@ static void get_cpu_string_offsets(unsigned int *type, unsigned int *pkg,
        u32 cpu_type = get_cpu_type();
        u32 ct = cpu_type & ~(BIT(7) | BIT(0));
        u32 cm = ((cpu_type & BIT(7)) >> 6) | (cpu_type & BIT(0));
-       u32 cp = get_cpu_package();
 
        /* Bits 0 and 7 are the ACDF, 00:C 01:A 10:F 11:D */
        switch (ct) {
@@ -293,17 +292,9 @@ static void get_cpu_string_offsets(unsigned int *type, unsigned int *pkg,
        }
 
        /* Package */
-       switch (cp) {
-       case STM32MP15_PKG_AA_LBGA448:
-       case STM32MP15_PKG_AB_LBGA354:
-       case STM32MP15_PKG_AC_TFBGA361:
-       case STM32MP15_PKG_AD_TFBGA257:
-               *pkg = cp;
-               break;
-       default:
-               *pkg = 0;
-               break;
-       }
+       *pkg = get_cpu_package();
+       if (*pkg > STM32MP15_PKG_AA_LBGA448)
+               *pkg = STM32MP15_PKG_UNKNOWN;
 
        /* Revision */
        switch (get_cpu_rev()) {
index 2cb5dae..3b518c2 100644 (file)
@@ -21,7 +21,7 @@ config MPC85xx
        select SYS_FSL_DDR
        select SYS_FSL_DDR_BE
        select SYS_FSL_IFC_BE
-       select BINMAN if OF_SEPARATE
+       select BINMAN if MPC85XX_HAVE_RESET_VECTOR && OF_SEPARATE
        imply CMD_HASH
        imply CMD_IRQ
        imply USB_EHCI_HCD if USB
index 085ddd8..27f069a 100644 (file)
@@ -15,7 +15,7 @@ config CMD_ERRATA
 config FSL_PREPBL_ESDHC_BOOT_SECTOR
        bool "Generate QorIQ pre-PBL eSDHC boot sector"
        depends on MPC85xx
-       depends on SYS_EXTRA_OPTIONS = SDCARD
+       depends on SDCARD
        help
          With this option final image would have prepended QorIQ pre-PBL eSDHC
          boot sector suitable for SD card images. This boot sector instruct
index 1b6cdc4..14d5c56 100644 (file)
@@ -44,7 +44,9 @@ __board_reset(void)
 {
        /* Do nothing */
 }
+void board_reset_prepare(void) __attribute__((weak, alias("__board_reset")));
 void board_reset(void) __attribute__((weak, alias("__board_reset")));
+void board_reset_last(void) __attribute__((weak, alias("__board_reset")));
 
 int checkcpu (void)
 {
@@ -319,12 +321,18 @@ int do_reset(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
 #else
        volatile ccsr_gur_t *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR);
 
+       /* Call board-specific preparation for reset */
+       board_reset_prepare();
+
        /* Attempt board-specific reset */
        board_reset();
 
        /* Next try asserting HRESET_REQ */
        out_be32(&gur->rstcr, 0x2);
        udelay(100);
+
+       /* Attempt last-stage board-specific reset */
+       board_reset_last();
 #endif
 
        return 1;
index e881537..f28826c 100644 (file)
@@ -58,10 +58,17 @@ SECTIONS
        __ex_table : { *(__ex_table) }
        __stop___ex_table = .;
 
-       . = ALIGN(8);
+       . = ALIGN(4);
        __init_begin = .;
        __init_end = .;
        _end = .;
+
+#if CONFIG_IS_ENABLED(SYS_MPC85XX_NO_RESETVEC)
+#if defined(CONFIG_SDCARD) && !defined(CONFIG_SYS_MMC_U_BOOT_OFFS)
+       mmc_u_boot_offs = .;
+#endif
+#endif
+
 #ifdef CONFIG_SPL_SKIP_RELOCATE
        . = ALIGN(4);
        __bss_start = .;
@@ -94,6 +101,9 @@ SECTIONS
        .resetvec IMAGE_TEXT_BASE + RESET_VECTOR_OFFSET : {
                KEEP(*(.resetvec))
        } = 0xffff
+#if defined(CONFIG_SDCARD) && !defined(CONFIG_SYS_MMC_U_BOOT_OFFS)
+       mmc_u_boot_offs = .;
+#endif
 #endif
 
 #ifndef CONFIG_SPL_SKIP_RELOCATE
index ab76a9f..eeaa688 100644 (file)
@@ -76,7 +76,7 @@
        };
 
        binman {
-               filename = "u-boot-with-dtb.bin";
+               filename = "u-boot.bin";
                skip-at-start = <CONFIG_SYS_TEXT_BASE>;
                sort-by-offset;
                pad-byte = <0xff>;
index 67de476..6588bb7 100644 (file)
@@ -5,9 +5,11 @@
 
 #include <config.h>
 
+#if defined(CONFIG_MPC85XX_HAVE_RESET_VECTOR) && defined(CONFIG_OF_SEPARATE)
+
 / {
        binman {
-               filename = "u-boot-with-dtb.bin";
+               filename = "u-boot.bin";
                skip-at-start = <CONFIG_SYS_TEXT_BASE>;
                sort-by-offset;
                pad-byte = <0xff>;
                };
 
                u-boot-dtb-with-ucode {
-#ifdef CONFIG_MPC85xx
                        align = <4>;
-#endif
                };
-#ifdef CONFIG_MPC85XX_HAVE_RESET_VECTOR
 #ifndef CONFIG_RESET_VECTOR_ADDRESS
 #define CONFIG_RESET_VECTOR_ADDRESS 0xfffffffc
 #endif
                powerpc-mpc85xx-bootpg-resetvec {
                        offset = <(CONFIG_RESET_VECTOR_ADDRESS - 0xffc)>;
                };
-#endif
        };
 };
+
+#endif
index a6f7a08..917e9bf 100644 (file)
@@ -7,11 +7,11 @@
 
 / {
        cpus {
-               assigned-clocks = <&prci PRCI_CLK_COREPLL>;
+               assigned-clocks = <&prci FU740_PRCI_CLK_COREPLL>;
                assigned-clock-rates = <1200000000>;
                u-boot,dm-spl;
                cpu0: cpu@0 {
-                       clocks = <&prci PRCI_CLK_COREPLL>;
+                       clocks = <&prci FU740_PRCI_CLK_COREPLL>;
                        u-boot,dm-spl;
                        status = "okay";
                        cpu0_intc: interrupt-controller {
                        };
                };
                cpu1: cpu@1 {
-                       clocks = <&prci PRCI_CLK_COREPLL>;
+                       clocks = <&prci FU740_PRCI_CLK_COREPLL>;
                        u-boot,dm-spl;
                        cpu1_intc: interrupt-controller {
                                u-boot,dm-spl;
                        };
                };
                cpu2: cpu@2 {
-                       clocks = <&prci PRCI_CLK_COREPLL>;
+                       clocks = <&prci FU740_PRCI_CLK_COREPLL>;
                        u-boot,dm-spl;
                        cpu2_intc: interrupt-controller {
                                 u-boot,dm-spl;
                        };
                };
                cpu3: cpu@3 {
-                       clocks = <&prci PRCI_CLK_COREPLL>;
+                       clocks = <&prci FU740_PRCI_CLK_COREPLL>;
                        u-boot,dm-spl;
                        cpu3_intc: interrupt-controller {
                                u-boot,dm-spl;
                        };
                };
                cpu4: cpu@4 {
-                       clocks = <&prci PRCI_CLK_COREPLL>;
+                       clocks = <&prci FU740_PRCI_CLK_COREPLL>;
                        u-boot,dm-spl;
                        cpu4_intc: interrupt-controller {
                                u-boot,dm-spl;
@@ -76,7 +76,7 @@
                        reg = <0x0 0x100b0000 0x0 0x0800
                               0x0 0x100b2000 0x0 0x2000
                               0x0 0x100b8000 0x0 0x1000>;
-                       clocks = <&prci PRCI_CLK_DDRPLL>;
+                       clocks = <&prci FU740_PRCI_CLK_DDRPLL>;
                        clock-frequency = <933333324>;
                        u-boot,dm-spl;
                };
 };
 
 &eth0 {
-       assigned-clocks = <&prci PRCI_CLK_GEMGXLPLL>;
+       assigned-clocks = <&prci FU740_PRCI_CLK_GEMGXLPLL>;
        assigned-clock-rates = <125125000>;
 };
 
index 649efe4..7b77c13 100644 (file)
@@ -1,10 +1,9 @@
 // SPDX-License-Identifier: (GPL-2.0 OR MIT)
-/* Copyright (c) 2020-2021 SiFive, Inc */
+/* Copyright (c) 2020 SiFive, Inc */
 
 /dts-v1/;
 
 #include <dt-bindings/clock/sifive-fu740-prci.h>
-#include <dt-bindings/reset/sifive-fu740-prci.h>
 
 / {
        #address-cells = <2>;
        soc {
                #address-cells = <2>;
                #size-cells = <2>;
-               compatible = "sifive,fu740-c000", "sifive,fu740", "simple-bus";
+               compatible = "simple-bus";
                ranges;
                plic0: interrupt-controller@c000000 {
                        #interrupt-cells = <1>;
-                       compatible = "sifive,plic-1.0.0";
+                       #address-cells = <0>;
+                       compatible = "sifive,fu540-c000-plic", "sifive,plic-1.0.0";
                        reg = <0x0 0xc000000 0x0 0x4000000>;
                        riscv,ndev = <69>;
                        interrupt-controller;
-                       interrupts-extended = <
-                               &cpu0_intc 0xffffffff
-                               &cpu1_intc 0xffffffff &cpu1_intc 9
-                               &cpu2_intc 0xffffffff &cpu2_intc 9
-                               &cpu3_intc 0xffffffff &cpu3_intc 9
-                               &cpu4_intc 0xffffffff &cpu4_intc 9>;
+                       interrupts-extended =
+                               <&cpu0_intc 0xffffffff>,
+                               <&cpu1_intc 0xffffffff>, <&cpu1_intc 9>,
+                               <&cpu2_intc 0xffffffff>, <&cpu2_intc 9>,
+                               <&cpu3_intc 0xffffffff>, <&cpu3_intc 9>,
+                               <&cpu4_intc 0xffffffff>, <&cpu4_intc 9>;
                };
                prci: clock-controller@10000000 {
                        compatible = "sifive,fu740-c000-prci";
                        reg = <0x0 0x10010000 0x0 0x1000>;
                        interrupt-parent = <&plic0>;
                        interrupts = <39>;
-                       clocks = <&prci PRCI_CLK_PCLK>;
+                       clocks = <&prci FU740_PRCI_CLK_PCLK>;
                        status = "disabled";
                };
                uart1: serial@10011000 {
                        reg = <0x0 0x10011000 0x0 0x1000>;
                        interrupt-parent = <&plic0>;
                        interrupts = <40>;
-                       clocks = <&prci PRCI_CLK_PCLK>;
+                       clocks = <&prci FU740_PRCI_CLK_PCLK>;
                        status = "disabled";
                };
                i2c0: i2c@10030000 {
                        reg = <0x0 0x10030000 0x0 0x1000>;
                        interrupt-parent = <&plic0>;
                        interrupts = <52>;
-                       clocks = <&prci PRCI_CLK_PCLK>;
+                       clocks = <&prci FU740_PRCI_CLK_PCLK>;
                        reg-shift = <2>;
                        reg-io-width = <1>;
                        #address-cells = <1>;
                        reg = <0x0 0x10031000 0x0 0x1000>;
                        interrupt-parent = <&plic0>;
                        interrupts = <53>;
-                       clocks = <&prci PRCI_CLK_PCLK>;
+                       clocks = <&prci FU740_PRCI_CLK_PCLK>;
                        reg-shift = <2>;
                        reg-io-width = <1>;
                        #address-cells = <1>;
                };
                qspi0: spi@10040000 {
                        compatible = "sifive,fu740-c000-spi", "sifive,spi0";
-                       reg = <0x0 0x10040000 0x0 0x1000
-                              0x0 0x20000000 0x0 0x10000000>;
+                       reg = <0x0 0x10040000 0x0 0x1000>,
+                             <0x0 0x20000000 0x0 0x10000000>;
                        interrupt-parent = <&plic0>;
                        interrupts = <41>;
-                       clocks = <&prci PRCI_CLK_PCLK>;
+                       clocks = <&prci FU740_PRCI_CLK_PCLK>;
                        #address-cells = <1>;
                        #size-cells = <0>;
                        status = "disabled";
                };
                qspi1: spi@10041000 {
                        compatible = "sifive,fu740-c000-spi", "sifive,spi0";
-                       reg = <0x0 0x10041000 0x0 0x1000
-                              0x0 0x30000000 0x0 0x10000000>;
+                       reg = <0x0 0x10041000 0x0 0x1000>,
+                             <0x0 0x30000000 0x0 0x10000000>;
                        interrupt-parent = <&plic0>;
                        interrupts = <42>;
-                       clocks = <&prci PRCI_CLK_PCLK>;
+                       clocks = <&prci FU740_PRCI_CLK_PCLK>;
                        #address-cells = <1>;
                        #size-cells = <0>;
                        status = "disabled";
                        reg = <0x0 0x10050000 0x0 0x1000>;
                        interrupt-parent = <&plic0>;
                        interrupts = <43>;
-                       clocks = <&prci PRCI_CLK_PCLK>;
+                       clocks = <&prci FU740_PRCI_CLK_PCLK>;
                        #address-cells = <1>;
                        #size-cells = <0>;
                        status = "disabled";
                        compatible = "sifive,fu540-c000-gem";
                        interrupt-parent = <&plic0>;
                        interrupts = <55>;
-                       reg = <0x0 0x10090000 0x0 0x2000
-                              0x0 0x100a0000 0x0 0x1000>;
+                       reg = <0x0 0x10090000 0x0 0x2000>,
+                             <0x0 0x100a0000 0x0 0x1000>;
                        local-mac-address = [00 00 00 00 00 00];
                        clock-names = "pclk", "hclk";
-                       clocks = <&prci PRCI_CLK_GEMGXLPLL>,
-                                <&prci PRCI_CLK_GEMGXLPLL>;
+                       clocks = <&prci FU740_PRCI_CLK_GEMGXLPLL>,
+                                <&prci FU740_PRCI_CLK_GEMGXLPLL>;
                        #address-cells = <1>;
                        #size-cells = <0>;
                        status = "disabled";
                        compatible = "sifive,fu740-c000-pwm", "sifive,pwm0";
                        reg = <0x0 0x10020000 0x0 0x1000>;
                        interrupt-parent = <&plic0>;
-                       interrupts = <44 45 46 47>;
-                       clocks = <&prci PRCI_CLK_PCLK>;
+                       interrupts = <44>, <45>, <46>, <47>;
+                       clocks = <&prci FU740_PRCI_CLK_PCLK>;
                        #pwm-cells = <3>;
                        status = "disabled";
                };
                        compatible = "sifive,fu740-c000-pwm", "sifive,pwm0";
                        reg = <0x0 0x10021000 0x0 0x1000>;
                        interrupt-parent = <&plic0>;
-                       interrupts = <48 49 50 51>;
-                       clocks = <&prci PRCI_CLK_PCLK>;
+                       interrupts = <48>, <49>, <50>, <51>;
+                       clocks = <&prci FU740_PRCI_CLK_PCLK>;
                        #pwm-cells = <3>;
                        status = "disabled";
                };
                        cache-size = <2097152>;
                        cache-unified;
                        interrupt-parent = <&plic0>;
-                       interrupts = <19 21 22 20>;
+                       interrupts = <19>, <21>, <22>, <20>;
                        reg = <0x0 0x2010000 0x0 0x1000>;
                };
                gpio: gpio@10060000 {
                        #gpio-cells = <2>;
                        interrupt-controller;
                        #interrupt-cells = <2>;
-                       clocks = <&prci PRCI_CLK_PCLK>;
+                       clocks = <&prci FU740_PRCI_CLK_PCLK>;
                        status = "disabled";
                };
                pcie@e00000000 {
+                       compatible = "sifive,fu740-pcie";
                        #address-cells = <3>;
-                       #interrupt-cells = <1>;
-                       #num-lanes = <8>;
                        #size-cells = <2>;
-                       compatible = "sifive,fu740-pcie";
-                       reg = <0xe 0x00000000 0x1 0x0
-                              0xd 0xf0000000 0x0 0x10000000
-                              0x0 0x100d0000 0x0 0x1000>;
+                       #interrupt-cells = <1>;
+                       reg = <0xe 0x00000000 0x0 0x80000000>,
+                             <0xd 0xf0000000 0x0 0x10000000>,
+                             <0x0 0x100d0000 0x0 0x1000>;
                        reg-names = "dbi", "config", "mgmt";
                        device_type = "pci";
                        dma-coherent;
                        bus-range = <0x0 0xff>;
-                       ranges = <0x81000000  0x0 0x60080000  0x0 0x60080000 0x0 0x10000
-                                 0x82000000  0x0 0x60090000  0x0 0x60090000 0x0 0xff70000
-                                 0x82000000  0x0 0x70000000  0x0 0x70000000 0x0 0x1000000
-                                 0xc3000000 0x20 0x00000000 0x20 0x00000000 0x20 0x00000000>;
+                       ranges = <0x81000000  0x0 0x60080000  0x0 0x60080000 0x0 0x10000>,      /* I/O */
+                                <0x82000000  0x0 0x60090000  0x0 0x60090000 0x0 0xff70000>,    /* mem */
+                                <0x82000000  0x0 0x70000000  0x0 0x70000000 0x0 0x1000000>,    /* mem */
+                                <0xc3000000 0x20 0x00000000 0x20 0x00000000 0x20 0x00000000>;  /* mem prefetchable */
                        num-lanes = <0x8>;
-                       interrupts = <56 57 58 59 60 61 62 63 64>;
+                       interrupts = <56>, <57>, <58>, <59>, <60>, <61>, <62>, <63>, <64>;
                        interrupt-names = "msi", "inta", "intb", "intc", "intd";
                        interrupt-parent = <&plic0>;
                        interrupt-map-mask = <0x0 0x0 0x0 0x7>;
                                        <0x0 0x0 0x0 0x2 &plic0 58>,
                                        <0x0 0x0 0x0 0x3 &plic0 59>,
                                        <0x0 0x0 0x0 0x4 &plic0 60>;
+                       clock-names = "pcie_aux";
+                       clocks = <&prci FU740_PRCI_CLK_PCIE_AUX>;
                        pwren-gpios = <&gpio 5 0>;
                        reset-gpios = <&gpio 8 0>;
-                       clocks = <&prci PRCI_CLK_PCIEAUX>;
-                       clock-names = "pcieaux";
-                       resets = <&prci PRCI_RST_PCIE_POWER_UP_N>;
-                       reset-names = "rst_n";
-
+                       resets = <&prci 4>;
                        status = "okay";
                };
        };
index b44e8c1..c4ed9ef 100644 (file)
@@ -1,5 +1,5 @@
-// SPDX-License-Identifier: GPL-2.0+
-/* Copyright (c) 2019-2021 SiFive, Inc */
+// SPDX-License-Identifier: (GPL-2.0 OR MIT)
+/* Copyright (c) 2020 SiFive, Inc */
 
 #include "fu740-c000.dtsi"
 #include <dt-bindings/gpio/gpio.h>
@@ -9,8 +9,6 @@
 #define RTCCLK_FREQ            1000000
 
 / {
-       #address-cells = <2>;
-       #size-cells = <2>;
        model = "SiFive HiFive Unmatched A00";
        compatible = "sifive,hifive-unmatched-a00", "sifive,fu740-c000",
                     "sifive,fu740";
@@ -28,9 +26,6 @@
                reg = <0x0 0x80000000 0x4 0x00000000>;
        };
 
-       soc {
-       };
-
        hfclk: hfclk {
                #clock-cells = <0>;
                compatible = "fixed-clock";
        temperature-sensor@4c {
                compatible = "ti,tmp451";
                reg = <0x4c>;
+               vcc-supply = <&vdd_bpro>;
                interrupt-parent = <&gpio>;
                interrupts = <6 IRQ_TYPE_LEVEL_LOW>;
        };
 
+       eeprom@54 {
+               compatible = "microchip,24c02", "atmel,24c02";
+               reg = <0x54>;
+               vcc-supply = <&vdd_bpro>;
+               label = "board-id";
+               pagesize = <16>;
+               read-only;
+               size = <256>;
+       };
+
        pmic@58 {
                compatible = "dlg,da9063";
                reg = <0x58>;
                interrupts = <1 IRQ_TYPE_LEVEL_LOW>;
                interrupt-controller;
 
-               regulators {
-                       vdd_bcore1: bcore1 {
-                               regulator-min-microvolt = <1050000>;
-                               regulator-max-microvolt = <1050000>;
-                               regulator-min-microamp = <5000000>;
-                               regulator-max-microamp = <5000000>;
-                               regulator-always-on;
-                       };
+               onkey {
+                       compatible = "dlg,da9063-onkey";
+               };
+
+               rtc {
+                       compatible = "dlg,da9063-rtc";
+               };
+
+               wdt {
+                       compatible = "dlg,da9063-watchdog";
+               };
 
-                       vdd_bcore2: bcore2 {
+               regulators {
+                       vdd_bcore: bcores-merged {
                                regulator-min-microvolt = <1050000>;
                                regulator-max-microvolt = <1050000>;
-                               regulator-min-microamp = <5000000>;
-                               regulator-max-microamp = <5000000>;
+                               regulator-min-microamp = <4800000>;
+                               regulator-max-microamp = <4800000>;
                                regulator-always-on;
                        };
 
                        vdd_bpro: bpro {
                                regulator-min-microvolt = <1800000>;
                                regulator-max-microvolt = <1800000>;
-                               regulator-min-microamp = <2500000>;
-                               regulator-max-microamp = <2500000>;
+                               regulator-min-microamp = <2400000>;
+                               regulator-max-microamp = <2400000>;
                                regulator-always-on;
                        };
 
                        vdd_bperi: bperi {
-                               regulator-min-microvolt = <1050000>;
-                               regulator-max-microvolt = <1050000>;
+                               regulator-min-microvolt = <1060000>;
+                               regulator-max-microvolt = <1060000>;
                                regulator-min-microamp = <1500000>;
                                regulator-max-microamp = <1500000>;
                                regulator-always-on;
                        };
 
-                       vdd_bmem: bmem {
-                               regulator-min-microvolt = <1200000>;
-                               regulator-max-microvolt = <1200000>;
-                               regulator-min-microamp = <3000000>;
-                               regulator-max-microamp = <3000000>;
-                               regulator-always-on;
-                       };
-
-                       vdd_bio: bio {
+                       vdd_bmem_bio: bmem-bio-merged {
                                regulator-min-microvolt = <1200000>;
                                regulator-max-microvolt = <1200000>;
                                regulator-min-microamp = <3000000>;
                        vdd_ldo1: ldo1 {
                                regulator-min-microvolt = <1800000>;
                                regulator-max-microvolt = <1800000>;
-                               regulator-min-microamp = <100000>;
-                               regulator-max-microamp = <100000>;
                                regulator-always-on;
                        };
 
                        vdd_ldo2: ldo2 {
                                regulator-min-microvolt = <1800000>;
                                regulator-max-microvolt = <1800000>;
-                               regulator-min-microamp = <200000>;
-                               regulator-max-microamp = <200000>;
                                regulator-always-on;
                        };
 
                        vdd_ldo3: ldo3 {
                                regulator-min-microvolt = <3300000>;
                                regulator-max-microvolt = <3300000>;
-                               regulator-min-microamp = <200000>;
-                               regulator-max-microamp = <200000>;
                                regulator-always-on;
                        };
 
                        vdd_ldo4: ldo4 {
                                regulator-min-microvolt = <2500000>;
                                regulator-max-microvolt = <2500000>;
-                               regulator-min-microamp = <200000>;
-                               regulator-max-microamp = <200000>;
                                regulator-always-on;
                        };
 
                        vdd_ldo5: ldo5 {
                                regulator-min-microvolt = <3300000>;
                                regulator-max-microvolt = <3300000>;
-                               regulator-min-microamp = <100000>;
-                               regulator-max-microamp = <100000>;
                                regulator-always-on;
                        };
 
                        vdd_ldo6: ldo6 {
                                regulator-min-microvolt = <1800000>;
                                regulator-max-microvolt = <1800000>;
-                               regulator-min-microamp = <200000>;
-                               regulator-max-microamp = <200000>;
                                regulator-always-on;
                        };
 
                        vdd_ldo7: ldo7 {
                                regulator-min-microvolt = <3300000>;
                                regulator-max-microvolt = <3300000>;
-                               regulator-min-microamp = <200000>;
-                               regulator-max-microamp = <200000>;
                                regulator-always-on;
                        };
 
                        vdd_ldo8: ldo8 {
                                regulator-min-microvolt = <3300000>;
                                regulator-max-microvolt = <3300000>;
-                               regulator-min-microamp = <200000>;
-                               regulator-max-microamp = <200000>;
                                regulator-always-on;
                        };
 
                        vdd_ld09: ldo9 {
                                regulator-min-microvolt = <1050000>;
                                regulator-max-microvolt = <1050000>;
-                               regulator-min-microamp = <200000>;
-                               regulator-max-microamp = <200000>;
+                               regulator-always-on;
                        };
 
                        vdd_ldo10: ldo10 {
                                regulator-min-microvolt = <1000000>;
                                regulator-max-microvolt = <1000000>;
-                               regulator-min-microamp = <300000>;
-                               regulator-max-microamp = <300000>;
+                               regulator-always-on;
                        };
 
                        vdd_ldo11: ldo11 {
                                regulator-min-microvolt = <2500000>;
                                regulator-max-microvolt = <2500000>;
-                               regulator-min-microamp = <300000>;
-                               regulator-max-microamp = <300000>;
                                regulator-always-on;
                        };
                };
 &qspi0 {
        status = "okay";
        flash@0 {
-               compatible = "issi,is25wp256", "jedec,spi-nor";
+               compatible = "jedec,spi-nor";
                reg = <0>;
                spi-max-frequency = <50000000>;
                m25p,fast-read;
                spi-max-frequency = <20000000>;
                voltage-ranges = <3300 3300>;
                disable-wp;
+               gpios = <&gpio 15 GPIO_ACTIVE_LOW>;
        };
 };
 
 
 &gpio {
        status = "okay";
+       gpio-line-names = "J29.1", "PMICNTB", "PMICSHDN", "J8.1", "J8.3",
+               "PCIe_PWREN", "THERM", "UBRDG_RSTN", "PCIe_PERSTN",
+               "ULPI_RSTN", "J8.2", "UHUB_RSTN", "GEMGXL_RST", "J8.4",
+               "EN_VDD_SD", "SD_CD";
 };
index aa4e29b..a29fe36 100644 (file)
@@ -93,30 +93,57 @@ int turris_atsha_otp_init_mac_addresses(int first_idx)
        return 0;
 }
 
-int turris_atsha_otp_get_serial_number(u32 *version_num, u32 *serial_num)
+int turris_atsha_otp_init_serial_number(void)
+{
+       char serial[17];
+       int ret;
+
+       ret = turris_atsha_otp_get_serial_number(serial);
+       if (ret)
+               return ret;
+
+       if (!env_get("serial#"))
+               return -1;
+
+       return 0;
+}
+
+int turris_atsha_otp_get_serial_number(char serial[17])
 {
        struct udevice *dev = get_atsha204a_dev();
+       u32 version_num, serial_num;
+       const char *serial_env;
        int ret;
 
        if (!dev)
                return -1;
 
+       serial_env = env_get("serial#");
+       if (serial_env && strlen(serial_env) == 16) {
+               memcpy(serial, serial_env, 17);
+               return 0;
+       }
+
        ret = atsha204a_wakeup(dev);
        if (ret)
                return ret;
 
        ret = atsha204a_read(dev, ATSHA204A_ZONE_OTP, false,
                             TURRIS_ATSHA_OTP_VERSION,
-                            (u8 *)version_num);
+                            (u8 *)&version_num);
        if (ret)
                return ret;
 
        ret = atsha204a_read(dev, ATSHA204A_ZONE_OTP, false,
                             TURRIS_ATSHA_OTP_SERIAL,
-                            (u8 *)serial_num);
+                            (u8 *)&serial_num);
        if (ret)
                return ret;
 
        atsha204a_sleep(dev);
+
+       sprintf(serial, "%08X%08X", be32_to_cpu(version_num), be32_to_cpu(serial_num));
+       env_set("serial#", serial);
+
        return 0;
 }
index bd4308f..2cfe20b 100644 (file)
@@ -4,6 +4,7 @@
 #define TURRIS_ATSHA_OTP_H
 
 int turris_atsha_otp_init_mac_addresses(int first_idx);
-int turris_atsha_otp_get_serial_number(u32 *version_num, u32 *serial_num);
+int turris_atsha_otp_init_serial_number(void);
+int turris_atsha_otp_get_serial_number(char serial[17]);
 
 #endif
index 3dbd68e..ff1c4cb 100644 (file)
@@ -23,6 +23,7 @@
 #include <linux/string.h>
 #include <miiphy.h>
 #include <spi.h>
+#include <spi_flash.h>
 
 #include "mox_sp.h"
 
@@ -339,6 +340,51 @@ static int get_reset_gpio(struct gpio_desc *reset_gpio)
        return 0;
 }
 
+/* Load default system DTB binary to $fdr_addr */
+static void load_spi_dtb(void)
+{
+       const char *const env_name[1] = { "fdt_addr" };
+       unsigned long size, offset;
+       struct udevice *spi_dev;
+       struct spi_flash *flash;
+       const char *addr_str;
+       unsigned long addr;
+       void *buf;
+
+       addr_str = env_get(env_name[0]);
+       if (!addr_str) {
+               env_set_default_vars(1, (char * const *)env_name, 0);
+               addr_str = env_get(env_name[0]);
+       }
+
+       if (!addr_str)
+               return;
+
+       addr = hextoul(addr_str, NULL);
+       if (!addr)
+               return;
+
+       spi_flash_probe_bus_cs(CONFIG_SF_DEFAULT_BUS, CONFIG_SF_DEFAULT_CS, &spi_dev);
+       flash = dev_get_uclass_priv(spi_dev);
+       if (!flash)
+               return;
+
+       /*
+        * SPI NOR "dtb" partition offset & size hardcoded for now because the
+        * mtd subsystem does not offer finding the partition yet and we do not
+        * want to reimplement OF partition parser here.
+        */
+       offset = 0x7f0000;
+       size = 0x10000;
+
+       buf = map_physmem(addr, size, MAP_WRBACK);
+       if (!buf)
+               return;
+
+       spi_flash_read(flash, offset, size, buf);
+       unmap_physmem(buf, size);
+}
+
 int misc_init_r(void)
 {
        u8 mac[2][6];
@@ -358,6 +404,8 @@ int misc_init_r(void)
                        eth_env_set_enetaddr_by_index("eth", i, mac[i]);
        }
 
+       load_spi_dtb();
+
        return 0;
 }
 
@@ -440,8 +488,9 @@ static void handle_reset_button(void)
        env_set_default_vars(1, (char * const *)vars, 0);
 
        if (read_reset_button()) {
-               const char * const vars[2] = {
+               const char * const vars[3] = {
                        "bootcmd",
+                       "bootdelay",
                        "distro_bootcmd",
                };
 
@@ -449,7 +498,7 @@ static void handle_reset_button(void)
                 * Set the above envs to their default values, in case the user
                 * managed to break them.
                 */
-               env_set_default_vars(2, (char * const *)vars, 0);
+               env_set_default_vars(3, (char * const *)vars, 0);
 
                /* Ensure bootcmd_rescue is used by distroboot */
                env_set("boot_targets", "rescue");
index ab5061e..19c5043 100644 (file)
@@ -549,8 +549,9 @@ static void handle_reset_button(void)
        env_set_ulong("omnia_reset", reset_status);
 
        if (reset_status) {
-               const char * const vars[2] = {
+               const char * const vars[3] = {
                        "bootcmd",
+                       "bootdelay",
                        "distro_bootcmd",
                };
 
@@ -558,7 +559,7 @@ static void handle_reset_button(void)
                 * Set the above envs to their default values, in case the user
                 * managed to break them.
                 */
-               env_set_default_vars(2, (char * const *)vars, 0);
+               env_set_default_vars(3, (char * const *)vars, 0);
 
                /* Ensure bootcmd_rescue is used by distroboot */
                env_set("boot_targets", "rescue");
@@ -653,7 +654,7 @@ static void initialize_switch(void)
        ctrl[1] = EXT_CTL_nRES_LAN;
        err = omnia_mcu_write(CMD_EXT_CONTROL, ctrl, sizeof(ctrl));
 
-       mdelay(10);
+       mdelay(50);
 
        /* Change RGMII pins back to RGMII mode */
 
@@ -963,19 +964,15 @@ int board_late_init(void)
 
 int show_board_info(void)
 {
-       u32 version_num, serial_num;
+       char serial[17];
        int err;
 
-       err = turris_atsha_otp_get_serial_number(&version_num, &serial_num);
+       err = turris_atsha_otp_get_serial_number(serial);
        printf("Model: Turris Omnia\n");
        printf("  MCU type: %s\n", omnia_get_mcu_type());
        printf("  MCU version: %s\n", omnia_get_mcu_version());
        printf("  RAM size: %i MiB\n", omnia_get_ram_size_gb() * 1024);
-       if (err)
-               printf("  Serial Number: unknown\n");
-       else
-               printf("  Serial Number: %08X%08X\n", be32_to_cpu(version_num),
-                      be32_to_cpu(serial_num));
+       printf("  Serial Number: %s\n", !err ? serial : "unknown");
 
        return 0;
 }
@@ -983,6 +980,7 @@ int show_board_info(void)
 int misc_init_r(void)
 {
        turris_atsha_otp_init_mac_addresses(1);
+       turris_atsha_otp_init_serial_number();
        return 0;
 }
 
index 3e5e0a0..c6ecc32 100644 (file)
@@ -132,6 +132,8 @@ int board_late_init(void)
                dev = mmc_dev->dev;
                device_remove(dev, DM_REMOVE_NORMAL);
                device_unbind(dev);
+               if (of_live_active())
+                       ofnode_set_enabled(dev_ofnode(dev), false);
        }
 
        /* Ensure that 'env default -a' set correct value to $fdtfile */
diff --git a/board/bsh/imx6ulz_smm_m2/Kconfig b/board/bsh/imx6ulz_smm_m2/Kconfig
new file mode 100644 (file)
index 0000000..e38df7c
--- /dev/null
@@ -0,0 +1,12 @@
+if TARGET_MX6ULZ_SMM_M2
+
+config SYS_BOARD
+       default "imx6ulz_smm_m2"
+
+config SYS_VENDOR
+       default "bsh"
+
+config SYS_CONFIG_NAME
+       default "imx6ulz_smm_m2"
+
+endif
diff --git a/board/bsh/imx6ulz_smm_m2/MAINTAINERS b/board/bsh/imx6ulz_smm_m2/MAINTAINERS
new file mode 100644 (file)
index 0000000..8f3d79d
--- /dev/null
@@ -0,0 +1,6 @@
+MX6ULZ_SMM_M2 BOARD
+M:     Michael Trimarchi <michael@amarulasolutions.com>
+S:     Maintained
+F:     board/bsh/mx6ulz_smm_m2/
+F:     include/configs/imx6ulz_smm_m2.h
+F:     configs/imx6ulz_smm_m2_defconfig
diff --git a/board/bsh/imx6ulz_smm_m2/Makefile b/board/bsh/imx6ulz_smm_m2/Makefile
new file mode 100644 (file)
index 0000000..b761bbb
--- /dev/null
@@ -0,0 +1,6 @@
+# SPDX-License-Identifier: GPL-2.0+
+# (C) Copyright 2021 Amarula Solutions B.V.
+
+obj-y  := imx6ulz_smm_m2.o
+obj-$(CONFIG_SPL_BUILD) += spl.o
+
diff --git a/board/bsh/imx6ulz_smm_m2/README b/board/bsh/imx6ulz_smm_m2/README
new file mode 100644 (file)
index 0000000..03d0132
--- /dev/null
@@ -0,0 +1,67 @@
+How to Update U-Boot on imx6ulz_smm_m2 board
+--------------------------------------------
+
+Required software on the host PC:
+
+- UUU: https://github.com/NXPmicro/mfgtools
+
+Build U-Boot for m2:
+
+$ make mrproper
+$ make imx6ulz_smm_m2_defconfig
+$ make
+
+This generates the SPL and u-boot-dtb.img binaries.
+
+1. Loading U-Boot via USB Serial Download Protocol
+
+Copy SPL and u-boot-dtb.img to the uuu folder.
+
+Load the U-Boot via USB:
+
+$ sudo uuu -v -b nand_script.lst u-boot-with-spl.imx
+
+where nand_script.lst contains the following:
+
+uuu_version 1.2.39
+
+# @_flash.bin            | bootloader
+# @_image   [_flash.bin] | image burn to nand, default is the same as bootloader
+
+# This command will be run when i.MX6/7 i.MX8MM, i.MX8MQ
+SDP: boot -f _flash.bin
+
+# This command will be run when ROM support stream mode
+# i.MX8QXP, i.MX8QM
+SDPS: boot -f _flash.bin
+
+# These commands will be run when use SPL and will be skipped if no spl
+# SDPU will be deprecated. please use SDPV instead of SDPU
+# {
+SDPU: delay 1000
+SDPU: write -f _flash.bin -offset 0x57c00
+SDPU: jump
+# }
+
+# These commands will be run when use SPL and will be skipped if no spl
+# if (SPL support SDPV)
+# {
+SDPV: delay 1000
+SDPV: write -f _flash.bin -offset 0x11000
+SDPV: jump
+# }
+
+FB: ucmd setenv fastboot_buffer ${loadaddr}
+FB: download -f _image
+FB: ucmd if test ! -n "$fastboot_bytes"; then setenv fastboot_bytes $filesize; else true; fi
+# Burn image to nandfit partition if needed
+FB: ucmd if env exists nandfit_part; then nand erase.part nandfit; nand write ${fastboot_buffer} nandfit ${fastboot_bytes}; else true; fi;
+FB: ucmd nandbcb init ${fastboot_buffer} nandboot ${fastboot_bytes}
+FB: Done
+
+Then U-Boot starts and its messages appear in the console program.
+
+Use the default environment variables:
+
+=> env default -f -a
+=> saveenv
diff --git a/board/bsh/imx6ulz_smm_m2/imx6ulz_smm_m2.c b/board/bsh/imx6ulz_smm_m2/imx6ulz_smm_m2.c
new file mode 100644 (file)
index 0000000..c82eabb
--- /dev/null
@@ -0,0 +1,53 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ *
+ * Copyright (C) 2021 BSH Hausgeraete GmbH
+ */
+
+#include <init.h>
+#include <asm/arch/clock.h>
+#include <asm/arch/iomux.h>
+#include <asm/arch/imx-regs.h>
+#include <asm/arch/crm_regs.h>
+#include <asm/arch/mx6-pins.h>
+#include <asm/arch/sys_proto.h>
+#include <asm/mach-imx/boot_mode.h>
+#include <asm/global_data.h>
+#include <asm/gpio.h>
+#include <common.h>
+#include <env.h>
+#include <linux/sizes.h>
+
+static void setup_gpmi_nand(void)
+{
+       setup_gpmi_io_clk((MXC_CCM_CS2CDR_ENFC_CLK_PODF(0) |
+                          MXC_CCM_CS2CDR_ENFC_CLK_PRED(3) |
+                          MXC_CCM_CS2CDR_ENFC_CLK_SEL(3)));
+};
+
+int dram_init(void)
+{
+       gd->ram_size = imx_ddr_size();
+
+       return 0;
+}
+
+int board_init(void)
+{
+       /* Address of boot parameters */
+       gd->bd->bi_boot_params = PHYS_SDRAM + 0x100;
+
+       setup_gpmi_nand();
+
+       return 0;
+}
+
+int board_late_init(void)
+{
+       if (is_boot_from_usb()) {
+               env_set("bootcmd", "run bootcmd_mfg");
+               env_set("bootdelay", "0");
+       }
+
+       return 0;
+}
diff --git a/board/bsh/imx6ulz_smm_m2/spl.c b/board/bsh/imx6ulz_smm_m2/spl.c
new file mode 100644 (file)
index 0000000..5b4812e
--- /dev/null
@@ -0,0 +1,130 @@
+// SPDX-License-Identifier: GPL-2.0+
+
+#include <common.h>
+#include <cpu_func.h>
+#include <hang.h>
+#include <init.h>
+#include <asm/arch/clock.h>
+#include <asm/arch/iomux.h>
+#include <asm/arch/imx-regs.h>
+#include <asm/arch/crm_regs.h>
+#include <asm/arch/mx6ull_pins.h>
+#include <asm/arch/mx6-pins.h>
+#include <asm/arch/sys_proto.h>
+#include <asm/gpio.h>
+#include <asm/mach-imx/iomux-v3.h>
+#include <asm/mach-imx/boot_mode.h>
+#include <linux/libfdt.h>
+#include <spl.h>
+#include <asm/arch/mx6-ddr.h>
+
+#define UART_PAD_CTRL (PAD_CTL_PKE | PAD_CTL_PUE | \
+                      PAD_CTL_PUS_100K_UP | PAD_CTL_SPEED_MED | \
+                      PAD_CTL_DSE_40ohm | PAD_CTL_SRE_FAST | PAD_CTL_HYS)
+
+static const iomux_v3_cfg_t uart4_pads[] = {
+       MX6_PAD_UART4_TX_DATA__UART4_DCE_TX | MUX_PAD_CTRL(UART_PAD_CTRL),
+       MX6_PAD_UART4_RX_DATA__UART4_DCE_RX | MUX_PAD_CTRL(UART_PAD_CTRL),
+};
+
+static void setup_iomux_uart(void)
+{
+       imx_iomux_v3_setup_multiple_pads(uart4_pads, ARRAY_SIZE(uart4_pads));
+}
+
+static struct mx6ul_iomux_grp_regs mx6_grp_ioregs = {
+       .grp_addds              = 0x00000028,
+       .grp_ddrmode_ctl        = 0x00020000,
+       .grp_b0ds               = 0x00000028,
+       .grp_ctlds              = 0x00000028,
+       .grp_b1ds               = 0x00000028,
+       .grp_ddrpke             = 0x00000000,
+       .grp_ddrmode            = 0x00020000,
+       .grp_ddr_type           = 0x000c0000,
+};
+
+static struct mx6ul_iomux_ddr_regs mx6_ddr_ioregs = {
+       .dram_dqm0              = 0x00000028,
+       .dram_dqm1              = 0x00000028,
+       .dram_ras               = 0x00000028,
+       .dram_cas               = 0x00000028,
+       .dram_odt0              = 0x00000028,
+       .dram_odt1              = 0x00000028,
+       .dram_sdba2             = 0x00000000,
+       .dram_sdclk_0           = 0x00000028,
+       .dram_sdqs0             = 0x00000028,
+       .dram_sdqs1             = 0x00000028,
+       .dram_reset             = 0x000c0028,
+};
+
+static struct mx6_mmdc_calibration mx6_mmcd_calib = {
+       .p0_mpwldectrl0         = 0x00000000,
+       .p0_mpwldectrl1         = 0x00100010,
+       .p0_mpdgctrl0           = 0x414c014c,
+       .p0_mpdgctrl1           = 0x00000000,
+       .p0_mprddlctl           = 0x40403a42,
+       .p0_mpwrdlctl           = 0x4040342e,
+};
+
+static struct mx6_ddr_sysinfo ddr_sysinfo = {
+       .dsize                  = 0,
+       .cs1_mirror             = 0,
+       .cs_density             = 32,
+       .ncs                    = 1,
+       .bi_on                  = 1,
+       .rtt_nom                = 1,
+       .rtt_wr                 = 0,
+       .ralat                  = 5,
+       .walat                  = 1,
+       .mif3_mode              = 3,
+       .rst_to_cke             = 0x23, /* 33 cycles (JEDEC value for DDR3) - total of 500 us */
+       .sde_to_rst             = 0x10, /* 14 cycles (JEDEC value for DDR3) - total of 200 us */
+       .refsel                 = 1,
+       .refr                   = 3,
+};
+
+static struct mx6_ddr3_cfg mem_ddr = {
+       .mem_speed              = 1333,
+       .density                = 2,
+       .width                  = 16,
+       .banks                  = 8,
+       .rowaddr                = 13,
+       .coladdr                = 10,
+       .pagesz                 = 2,
+       .trcd                   = 1350,
+       .trcmin                 = 4950,
+       .trasmin                = 3600,
+};
+
+static void ccgr_init(void)
+{
+       struct mxc_ccm_reg *ccm = (struct mxc_ccm_reg *)CCM_BASE_ADDR;
+
+       writel(0xFFFFFFFF, &ccm->CCGR0);
+       writel(0xFFFFFFFF, &ccm->CCGR1);
+       writel(0xFFFFFFFF, &ccm->CCGR2);
+       writel(0xFFFFFFFF, &ccm->CCGR3);
+       writel(0xFFFFFFFF, &ccm->CCGR4);
+       writel(0xFFFFFFFF, &ccm->CCGR5);
+       writel(0xFFFFFFFF, &ccm->CCGR6);
+}
+
+static void imx6ul_spl_dram_cfg(void)
+{
+       mx6ul_dram_iocfg(mem_ddr.width, &mx6_ddr_ioregs, &mx6_grp_ioregs);
+       mx6_dram_cfg(&ddr_sysinfo, &mx6_mmcd_calib, &mem_ddr);
+}
+
+void board_init_f(ulong dummy)
+{
+       ccgr_init();
+       arch_cpu_init();
+       timer_init();
+       setup_iomux_uart();
+       preloader_console_init();
+       imx6ul_spl_dram_cfg();
+}
+
+void reset_cpu(void)
+{
+}
index c2abcb5..f40fd48 100644 (file)
@@ -22,7 +22,7 @@ static struct dram_cfg_param ddr_ddrc_cfg[] = {
        { 0x3d4000d4, 0x940000 },
        { 0x3d4000dc, 0xd4002d },
        { 0x3d4000e0, 0x310000 },
-       { 0x3d4000e8, 0x66004d },
+       { 0x3d4000e8, 0x36004d },
        { 0x3d4000ec, 0x16004d },
        { 0x3d400100, 0x191e1920 },
        { 0x3d400104, 0x60630 },
@@ -55,6 +55,7 @@ static struct dram_cfg_param ddr_ddrc_cfg[] = {
        { 0x3d400204, 0x80808 },
        { 0x3d400214, 0x7070707 },
        { 0x3d400218, 0x7070707 },
+       { 0x3d40021c, 0xf0f },
        { 0x3d400250, 0x29001701 },
        { 0x3d400254, 0x2c },
        { 0x3d40025c, 0x4000030 },
@@ -72,7 +73,7 @@ static struct dram_cfg_param ddr_ddrc_cfg[] = {
        { 0x3d402064, 0xc001c },
        { 0x3d4020dc, 0x840000 },
        { 0x3d4020e0, 0x310000 },
-       { 0x3d4020e8, 0x66004d },
+       { 0x3d4020e8, 0x36004d },
        { 0x3d4020ec, 0x16004d },
        { 0x3d402100, 0xa040305 },
        { 0x3d402104, 0x30407 },
@@ -97,7 +98,7 @@ static struct dram_cfg_param ddr_ddrc_cfg[] = {
        { 0x3d403064, 0x30007 },
        { 0x3d4030dc, 0x840000 },
        { 0x3d4030e0, 0x310000 },
-       { 0x3d4030e8, 0x66004d },
+       { 0x3d4030e8, 0x36004d },
        { 0x3d4030ec, 0x16004d },
        { 0x3d403100, 0xa010102 },
        { 0x3d403104, 0x30404 },
@@ -1059,25 +1060,25 @@ static struct dram_cfg_param ddr_fsp0_cfg[] = {
        { 0x54012, 0x110 },
        { 0x54019, 0x2dd4 },
        { 0x5401a, 0x31 },
-       { 0x5401b, 0x4d66 },
+       { 0x5401b, 0x4d36 },
        { 0x5401c, 0x4d00 },
        { 0x5401e, 0x16 },
        { 0x5401f, 0x2dd4 },
        { 0x54020, 0x31 },
-       { 0x54021, 0x4d66 },
+       { 0x54021, 0x4d36 },
        { 0x54022, 0x4d00 },
        { 0x54024, 0x16 },
        { 0x5402b, 0x1000 },
        { 0x5402c, 0x1 },
        { 0x54032, 0xd400 },
        { 0x54033, 0x312d },
-       { 0x54034, 0x6600 },
+       { 0x54034, 0x3600 },
        { 0x54035, 0x4d },
        { 0x54036, 0x4d },
        { 0x54037, 0x1600 },
        { 0x54038, 0xd400 },
        { 0x54039, 0x312d },
-       { 0x5403a, 0x6600 },
+       { 0x5403a, 0x3600 },
        { 0x5403b, 0x4d },
        { 0x5403c, 0x4d },
        { 0x5403d, 0x1600 },
@@ -1098,25 +1099,25 @@ static struct dram_cfg_param ddr_fsp1_cfg[] = {
        { 0x54012, 0x110 },
        { 0x54019, 0x84 },
        { 0x5401a, 0x31 },
-       { 0x5401b, 0x4d66 },
+       { 0x5401b, 0x4d36 },
        { 0x5401c, 0x4d00 },
        { 0x5401e, 0x16 },
        { 0x5401f, 0x84 },
        { 0x54020, 0x31 },
-       { 0x54021, 0x4d66 },
+       { 0x54021, 0x4d36 },
        { 0x54022, 0x4d00 },
        { 0x54024, 0x16 },
        { 0x5402b, 0x1000 },
        { 0x5402c, 0x1 },
        { 0x54032, 0x8400 },
        { 0x54033, 0x3100 },
-       { 0x54034, 0x6600 },
+       { 0x54034, 0x3600 },
        { 0x54035, 0x4d },
        { 0x54036, 0x4d },
        { 0x54037, 0x1600 },
        { 0x54038, 0x8400 },
        { 0x54039, 0x3100 },
-       { 0x5403a, 0x6600 },
+       { 0x5403a, 0x3600 },
        { 0x5403b, 0x4d },
        { 0x5403c, 0x4d },
        { 0x5403d, 0x1600 },
@@ -1137,25 +1138,25 @@ static struct dram_cfg_param ddr_fsp2_cfg[] = {
        { 0x54012, 0x110 },
        { 0x54019, 0x84 },
        { 0x5401a, 0x31 },
-       { 0x5401b, 0x4d66 },
+       { 0x5401b, 0x4d36 },
        { 0x5401c, 0x4d00 },
        { 0x5401e, 0x16 },
        { 0x5401f, 0x84 },
        { 0x54020, 0x31 },
-       { 0x54021, 0x4d66 },
+       { 0x54021, 0x4d36 },
        { 0x54022, 0x4d00 },
        { 0x54024, 0x16 },
        { 0x5402b, 0x1000 },
        { 0x5402c, 0x1 },
        { 0x54032, 0x8400 },
        { 0x54033, 0x3100 },
-       { 0x54034, 0x6600 },
+       { 0x54034, 0x3600 },
        { 0x54035, 0x4d },
        { 0x54036, 0x4d },
        { 0x54037, 0x1600 },
        { 0x54038, 0x8400 },
        { 0x54039, 0x3100 },
-       { 0x5403a, 0x6600 },
+       { 0x5403a, 0x3600 },
        { 0x5403b, 0x4d },
        { 0x5403c, 0x4d },
        { 0x5403d, 0x1600 },
@@ -1177,25 +1178,25 @@ static struct dram_cfg_param ddr_fsp0_2d_cfg[] = {
        { 0x54012, 0x110 },
        { 0x54019, 0x2dd4 },
        { 0x5401a, 0x31 },
-       { 0x5401b, 0x4d66 },
+       { 0x5401b, 0x4d36 },
        { 0x5401c, 0x4d00 },
        { 0x5401e, 0x16 },
        { 0x5401f, 0x2dd4 },
        { 0x54020, 0x31 },
-       { 0x54021, 0x4d66 },
+       { 0x54021, 0x4d36 },
        { 0x54022, 0x4d00 },
        { 0x54024, 0x16 },
        { 0x5402b, 0x1000 },
        { 0x5402c, 0x1 },
        { 0x54032, 0xd400 },
        { 0x54033, 0x312d },
-       { 0x54034, 0x6600 },
+       { 0x54034, 0x3600 },
        { 0x54035, 0x4d },
        { 0x54036, 0x4d },
        { 0x54037, 0x1600 },
        { 0x54038, 0xd400 },
        { 0x54039, 0x312d },
-       { 0x5403a, 0x6600 },
+       { 0x5403a, 0x3600 },
        { 0x5403b, 0x4d },
        { 0x5403c, 0x4d },
        { 0x5403d, 0x1600 },
@@ -1692,15 +1693,15 @@ static struct dram_cfg_param ddr_phy_pie[] = {
        { 0x400d6, 0x20a },
        { 0x400d7, 0x20b },
        { 0x2003a, 0x2 },
-       { 0x2000b, 0x5d },
+       { 0x2000b, 0x34b },
        { 0x2000c, 0xbb },
        { 0x2000d, 0x753 },
        { 0x2000e, 0x2c },
-       { 0x12000b, 0xc },
+       { 0x12000b, 0x70 },
        { 0x12000c, 0x19 },
        { 0x12000d, 0xfa },
        { 0x12000e, 0x10 },
-       { 0x22000b, 0x3 },
+       { 0x22000b, 0x1c },
        { 0x22000c, 0x6 },
        { 0x22000d, 0x3e },
        { 0x22000e, 0x10 },
index e44c1ea..0e5be8e 100644 (file)
@@ -22,7 +22,7 @@ static struct dram_cfg_param ddr_ddrc_cfg[] = {
        { 0x3d4000d4, 0x940000 },
        { 0x3d4000dc, 0xd4002d },
        { 0x3d4000e0, 0x310000 },
-       { 0x3d4000e8, 0x66004d },
+       { 0x3d4000e8, 0x36004d },
        { 0x3d4000ec, 0x16004d },
        { 0x3d400100, 0x191e1920 },
        { 0x3d400104, 0x60630 },
@@ -55,6 +55,7 @@ static struct dram_cfg_param ddr_ddrc_cfg[] = {
        { 0x3d400204, 0x80808 },
        { 0x3d400214, 0x7070707 },
        { 0x3d400218, 0x7070707 },
+       { 0x3d40021c, 0xf0f },
        { 0x3d400250, 0x29001701 },
        { 0x3d400254, 0x2c },
        { 0x3d40025c, 0x4000030 },
@@ -72,7 +73,7 @@ static struct dram_cfg_param ddr_ddrc_cfg[] = {
        { 0x3d402064, 0xc001c },
        { 0x3d4020dc, 0x840000 },
        { 0x3d4020e0, 0x310000 },
-       { 0x3d4020e8, 0x66004d },
+       { 0x3d4020e8, 0x36004d },
        { 0x3d4020ec, 0x16004d },
        { 0x3d402100, 0xa040305 },
        { 0x3d402104, 0x30407 },
@@ -1059,25 +1060,25 @@ static struct dram_cfg_param ddr_fsp0_cfg[] = {
        { 0x54012, 0x310 },
        { 0x54019, 0x2dd4 },
        { 0x5401a, 0x31 },
-       { 0x5401b, 0x4d66 },
+       { 0x5401b, 0x4d36 },
        { 0x5401c, 0x4d00 },
        { 0x5401e, 0x16 },
        { 0x5401f, 0x2dd4 },
        { 0x54020, 0x31 },
-       { 0x54021, 0x4d66 },
+       { 0x54021, 0x4d36 },
        { 0x54022, 0x4d00 },
        { 0x54024, 0x16 },
        { 0x5402b, 0x1000 },
        { 0x5402c, 0x3 },
        { 0x54032, 0xd400 },
        { 0x54033, 0x312d },
-       { 0x54034, 0x6600 },
+       { 0x54034, 0x3600 },
        { 0x54035, 0x4d },
        { 0x54036, 0x4d },
        { 0x54037, 0x1600 },
        { 0x54038, 0xd400 },
        { 0x54039, 0x312d },
-       { 0x5403a, 0x6600 },
+       { 0x5403a, 0x3600 },
        { 0x5403b, 0x4d },
        { 0x5403c, 0x4d },
        { 0x5403d, 0x1600 },
@@ -1098,25 +1099,25 @@ static struct dram_cfg_param ddr_fsp1_cfg[] = {
        { 0x54012, 0x310 },
        { 0x54019, 0x84 },
        { 0x5401a, 0x31 },
-       { 0x5401b, 0x4d66 },
+       { 0x5401b, 0x4d36 },
        { 0x5401c, 0x4d00 },
        { 0x5401e, 0x16 },
        { 0x5401f, 0x84 },
        { 0x54020, 0x31 },
-       { 0x54021, 0x4d66 },
+       { 0x54021, 0x4d36 },
        { 0x54022, 0x4d00 },
        { 0x54024, 0x16 },
        { 0x5402b, 0x1000 },
        { 0x5402c, 0x3 },
        { 0x54032, 0x8400 },
        { 0x54033, 0x3100 },
-       { 0x54034, 0x6600 },
+       { 0x54034, 0x3600 },
        { 0x54035, 0x4d },
        { 0x54036, 0x4d },
        { 0x54037, 0x1600 },
        { 0x54038, 0x8400 },
        { 0x54039, 0x3100 },
-       { 0x5403a, 0x6600 },
+       { 0x5403a, 0x3600 },
        { 0x5403b, 0x4d },
        { 0x5403c, 0x4d },
        { 0x5403d, 0x1600 },
@@ -1172,31 +1173,30 @@ static struct dram_cfg_param ddr_fsp0_2d_cfg[] = {
        { 0x54008, 0x61 },
        { 0x54009, 0xc8 },
        { 0x5400b, 0x2 },
-       { 0x5400d, 0x100 },
        { 0x5400f, 0x100 },
        { 0x54010, 0x1f7f },
        { 0x54012, 0x310 },
        { 0x54019, 0x2dd4 },
        { 0x5401a, 0x31 },
-       { 0x5401b, 0x4d66 },
+       { 0x5401b, 0x4d36 },
        { 0x5401c, 0x4d00 },
        { 0x5401e, 0x16 },
        { 0x5401f, 0x2dd4 },
        { 0x54020, 0x31 },
-       { 0x54021, 0x4d66 },
+       { 0x54021, 0x4d36 },
        { 0x54022, 0x4d00 },
        { 0x54024, 0x16 },
        { 0x5402b, 0x1000 },
        { 0x5402c, 0x3 },
        { 0x54032, 0xd400 },
        { 0x54033, 0x312d },
-       { 0x54034, 0x6600 },
+       { 0x54034, 0x3600 },
        { 0x54035, 0x4d },
        { 0x54036, 0x4d },
        { 0x54037, 0x1600 },
        { 0x54038, 0xd400 },
        { 0x54039, 0x312d },
-       { 0x5403a, 0x6600 },
+       { 0x5403a, 0x3600 },
        { 0x5403b, 0x4d },
        { 0x5403c, 0x4d },
        { 0x5403d, 0x1600 },
@@ -1693,15 +1693,15 @@ static struct dram_cfg_param ddr_phy_pie[] = {
        { 0x400d6, 0x20a },
        { 0x400d7, 0x20b },
        { 0x2003a, 0x2 },
-       { 0x2000b, 0x5d },
+       { 0x2000b, 0x34b },
        { 0x2000c, 0xbb },
        { 0x2000d, 0x753 },
        { 0x2000e, 0x2c },
-       { 0x12000b, 0xc },
+       { 0x12000b, 0x70 },
        { 0x12000c, 0x19 },
        { 0x12000d, 0xfa },
        { 0x12000e, 0x10 },
-       { 0x22000b, 0x3 },
+       { 0x22000b, 0x1c },
        { 0x22000c, 0x6 },
        { 0x22000d, 0x3e },
        { 0x22000e, 0x10 },
@@ -1715,6 +1715,10 @@ static struct dram_cfg_param ddr_phy_pie[] = {
        { 0x90013, 0x6152 },
        { 0x20010, 0x5a },
        { 0x20011, 0x3 },
+       { 0x120010, 0x5a },
+       { 0x120011, 0x3 },
+       { 0x220010, 0x5a },
+       { 0x220011, 0x3 },
        { 0x40080, 0xe0 },
        { 0x40081, 0x12 },
        { 0x40082, 0xe0 },
index 2eda4a5..a4c1b12 100644 (file)
@@ -1799,8 +1799,8 @@ static struct dram_cfg_param ddr_phy_pie[] = {
 
 static struct dram_fsp_msg ddr_dram_fsp_msg[] = {
        {
-               /* P0 3732mts 1D */
-               .drate = 3732,
+               /* P0 3733mts 1D */
+               .drate = 3733,
                .fw_type = FW_1D_IMAGE,
                .fsp_cfg = ddr_fsp0_cfg,
                .fsp_cfg_num = ARRAY_SIZE(ddr_fsp0_cfg),
@@ -1820,8 +1820,8 @@ static struct dram_fsp_msg ddr_dram_fsp_msg[] = {
                .fsp_cfg_num = ARRAY_SIZE(ddr_fsp2_cfg),
        },
        {
-               /* P0 3732mts 2D */
-               .drate = 3732,
+               /* P0 3733mts 2D */
+               .drate = 3733,
                .fw_type = FW_2D_IMAGE,
                .fsp_cfg = ddr_fsp0_2d_cfg,
                .fsp_cfg_num = ARRAY_SIZE(ddr_fsp0_2d_cfg),
@@ -1840,5 +1840,5 @@ struct dram_timing_info dh_imx8mp_dhcom_dram_timing_32g_x32 = {
        .ddrphy_trained_csr_num = ARRAY_SIZE(ddr_ddrphy_trained_csr),
        .ddrphy_pie = ddr_phy_pie,
        .ddrphy_pie_num = ARRAY_SIZE(ddr_phy_pie),
-       .fsp_table = { 3732, 400, 100, },
+       .fsp_table = { 3733, 400, 100, },
 };
index 7e4f3ff..2bc0d7b 100644 (file)
@@ -527,56 +527,6 @@ static void sysconf_init(void)
 #endif
 }
 
-static void board_init_fmc2(void)
-{
-#define STM32_FMC2_BCR1                        0x0
-#define STM32_FMC2_BTR1                        0x4
-#define STM32_FMC2_BWTR1               0x104
-#define STM32_FMC2_BCR(x)              ((x) * 0x8 + STM32_FMC2_BCR1)
-#define STM32_FMC2_BCRx_FMCEN          BIT(31)
-#define STM32_FMC2_BCRx_WREN           BIT(12)
-#define STM32_FMC2_BCRx_RSVD           BIT(7)
-#define STM32_FMC2_BCRx_FACCEN         BIT(6)
-#define STM32_FMC2_BCRx_MWID(n)                ((n) << 4)
-#define STM32_FMC2_BCRx_MTYP(n)                ((n) << 2)
-#define STM32_FMC2_BCRx_MUXEN          BIT(1)
-#define STM32_FMC2_BCRx_MBKEN          BIT(0)
-#define STM32_FMC2_BTR(x)              ((x) * 0x8 + STM32_FMC2_BTR1)
-#define STM32_FMC2_BTRx_DATAHLD(n)     ((n) << 30)
-#define STM32_FMC2_BTRx_BUSTURN(n)     ((n) << 16)
-#define STM32_FMC2_BTRx_DATAST(n)      ((n) << 8)
-#define STM32_FMC2_BTRx_ADDHLD(n)      ((n) << 4)
-#define STM32_FMC2_BTRx_ADDSET(n)      ((n) << 0)
-
-#define RCC_MP_AHB6RSTCLRR             0x218
-#define RCC_MP_AHB6RSTCLRR_FMCRST      BIT(12)
-#define RCC_MP_AHB6ENSETR              0x19c
-#define RCC_MP_AHB6ENSETR_FMCEN                BIT(12)
-
-       const u32 bcr = STM32_FMC2_BCRx_WREN |STM32_FMC2_BCRx_RSVD |
-                       STM32_FMC2_BCRx_FACCEN | STM32_FMC2_BCRx_MWID(1) |
-                       STM32_FMC2_BCRx_MTYP(2) | STM32_FMC2_BCRx_MUXEN |
-                       STM32_FMC2_BCRx_MBKEN;
-       const u32 btr = STM32_FMC2_BTRx_DATAHLD(3) |
-                       STM32_FMC2_BTRx_BUSTURN(2) |
-                       STM32_FMC2_BTRx_DATAST(0x22) |
-                       STM32_FMC2_BTRx_ADDHLD(2) |
-                       STM32_FMC2_BTRx_ADDSET(2);
-
-       /* Set up FMC2 bus for KS8851-16MLL and X11 SRAM */
-       writel(RCC_MP_AHB6RSTCLRR_FMCRST, STM32_RCC_BASE + RCC_MP_AHB6RSTCLRR);
-       writel(RCC_MP_AHB6ENSETR_FMCEN, STM32_RCC_BASE + RCC_MP_AHB6ENSETR);
-
-       /* KS8851-16MLL -- Muxed mode */
-       writel(bcr, STM32_FMC2_BASE + STM32_FMC2_BCR(1));
-       writel(btr, STM32_FMC2_BASE + STM32_FMC2_BTR(1));
-       /* AS7C34098 SRAM on X11 -- Muxed mode */
-       writel(bcr, STM32_FMC2_BASE + STM32_FMC2_BCR(3));
-       writel(btr, STM32_FMC2_BASE + STM32_FMC2_BTR(3));
-
-       setbits_le32(STM32_FMC2_BASE + STM32_FMC2_BCR1, STM32_FMC2_BCRx_FMCEN);
-}
-
 #ifdef CONFIG_DM_REGULATOR
 #define STPMIC_NVM_BUCKS_VOUT_SHR                      0xfc
 #define STPMIC_NVM_BUCKS_VOUT_SHR_BUCK_1V2             0
@@ -671,8 +621,6 @@ int board_init(void)
 
        sysconf_init();
 
-       board_init_fmc2();
-
        return 0;
 }
 
index 28dcc2a..bdf3cc0 100644 (file)
@@ -70,7 +70,7 @@ int rockchip_dnl_key_pressed(void)
 {
        unsigned int val;
 
-       if (adc_channel_single_shot("saradc", 1, &val)) {
+       if (adc_channel_single_shot("saradc@ff1e0000", 1, &val)) {
                printf("%s read adc key val failed\n", __func__);
                return false;
        }
diff --git a/board/freescale/imxrt1170-evk/Kconfig b/board/freescale/imxrt1170-evk/Kconfig
new file mode 100644 (file)
index 0000000..c61fc57
--- /dev/null
@@ -0,0 +1,22 @@
+if TARGET_IMXRT1170_EVK
+
+config SYS_BOARD
+       string
+       default "imxrt1170-evk"
+
+config SYS_VENDOR
+       string
+       default "freescale"
+
+config SYS_SOC
+       string
+       default "imxrt1170"
+
+config SYS_CONFIG_NAME
+       string
+       default "imxrt1170-evk"
+
+config IMX_CONFIG
+       default "board/freescale/imxrt1170-evk/imximage.cfg"
+
+endif
diff --git a/board/freescale/imxrt1170-evk/MAINTAINERS b/board/freescale/imxrt1170-evk/MAINTAINERS
new file mode 100644 (file)
index 0000000..1fc3179
--- /dev/null
@@ -0,0 +1,7 @@
+IMXRT1170 EVALUATION KIT
+M:     Giulio Benetti <giulio.benetti@benettiengineering.com>
+M:     Jesse Taube <Mr.Bossman075@gmail.com>
+S:     Maintained
+F:     board/freescale/imxrt1170-evk
+F:     include/configs/imxrt1170-evk.h
+F:     configs/imxrt1170-evk_defconfig
diff --git a/board/freescale/imxrt1170-evk/Makefile b/board/freescale/imxrt1170-evk/Makefile
new file mode 100644 (file)
index 0000000..857a168
--- /dev/null
@@ -0,0 +1,6 @@
+# SPDX-License-Identifier: GPL-2.0+
+#
+# Copyright (C) 2019
+# Author(s): Giulio Benetti <giulio.benetti@benettiengineering.com>
+
+obj-y  := imxrt1170-evk.o
diff --git a/board/freescale/imxrt1170-evk/imximage.cfg b/board/freescale/imxrt1170-evk/imximage.cfg
new file mode 100644 (file)
index 0000000..57583d0
--- /dev/null
@@ -0,0 +1,31 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
+/*
+ * Copyright (C) 2022
+ * Author(s): Jesse Taube <Mr.Bossman075@gmail.com>
+ * Giulio Benetti <giulio.benetti@benettiengineering.com>
+ */
+
+#include <config.h>
+
+/* image version */
+
+IMAGE_VERSION 2
+
+/*
+ * Boot Device : one of
+ * spi/sd/nand/onenand, qspi/nor
+ */
+
+BOOT_FROM      sd
+
+/*
+ * Device Configuration Data (DCD)
+ *
+ * Each entry must have the format:
+ * Addr-type           Address        Value
+ *
+ * where:
+ *     Addr-type register length (1,2 or 4 bytes)
+ *     Address   absolute address of the register
+ *     value     value to be stored in the register
+ */
diff --git a/board/freescale/imxrt1170-evk/imxrt1170-evk.c b/board/freescale/imxrt1170-evk/imxrt1170-evk.c
new file mode 100644 (file)
index 0000000..4b82ee5
--- /dev/null
@@ -0,0 +1,80 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright (C) 2019
+ * Author(s): Giulio Benetti <giulio.benetti@benettiengineering.com>
+ */
+
+#include <common.h>
+#include <dm.h>
+#include <init.h>
+#include <log.h>
+#include <ram.h>
+#include <spl.h>
+#include <asm/global_data.h>
+#include <asm/io.h>
+#include <asm/armv7m.h>
+#include <serial.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+int dram_init(void)
+{
+#ifndef CONFIG_SUPPORT_SPL
+       int rv;
+       struct udevice *dev;
+
+       rv = uclass_get_device(UCLASS_RAM, 0, &dev);
+       if (rv) {
+               debug("DRAM init failed: %d\n", rv);
+               return rv;
+       }
+
+#endif
+       return fdtdec_setup_mem_size_base();
+}
+
+int dram_init_banksize(void)
+{
+       return fdtdec_setup_memory_banksize();
+}
+
+#ifdef CONFIG_SPL_BUILD
+#ifdef CONFIG_SPL_OS_BOOT
+int spl_start_uboot(void)
+{
+       debug("SPL: booting kernel\n");
+       /* break into full u-boot on 'c' */
+       return serial_tstc() && serial_getc() == 'c';
+}
+#endif
+
+int spl_dram_init(void)
+{
+       struct udevice *dev;
+       int rv;
+
+       rv = uclass_get_device(UCLASS_RAM, 0, &dev);
+       if (rv)
+               debug("DRAM init failed: %d\n", rv);
+       return rv;
+}
+
+void spl_board_init(void)
+{
+       preloader_console_init();
+       spl_dram_init();
+       arch_cpu_init(); /* to configure mpu for sdram rw permissions */
+}
+
+u32 spl_boot_device(void)
+{
+       return BOOT_DEVICE_MMC1;
+}
+#endif
+
+int board_init(void)
+{
+       gd->bd->bi_boot_params = gd->bd->bi_dram[0].start + 0x100;
+
+       return 0;
+}
index 08b43ff..4d2fce3 100644 (file)
@@ -114,7 +114,7 @@ dimm_params_t ddr_raw_timing = {
        .mirrored_dimm = 0,
        .n_row_addr = 15,
        .n_col_addr = 10,
-       .bank_addr_bits = 0,
+       .bank_addr_bits = 2,
        .bank_group_bits = 2,
        .edc_config = 0,
        .burst_lengths_bitmask = 0x0c,
index 86ff04e..f542dec 100644 (file)
@@ -60,5 +60,5 @@ enabled in relative defconfig file,
    CONFIG_RESET_VECTOR_ADDRESS - 0xffc
 
 If device tree support is enabled in defconfig,
-1. use 'u-boot-with-dtb.bin' for NOR boot.
+1. use 'u-boot.bin' for NOR boot.
 2. use 'u-boot-with-spl.bin' for other boot.
index a71952d..b301491 100644 (file)
@@ -83,7 +83,19 @@ struct cpld_data {
 #define CPLD_FXS_LED   0x0F
 #define CPLD_SYS_RST   0x00
 
-void board_reset(void)
+void board_reset_prepare(void)
+{
+       /*
+        * During reset preparation, turn off external watchdog.
+        * This ensures that external watchdog does not trigger
+        * another reset or possible infinite reset loop.
+        */
+       struct cpld_data *cpld_data = (void *)(CONFIG_SYS_CPLD_BASE);
+       out_8(&cpld_data->wd_cfg, CPLD_WD_CFG);
+       in_8(&cpld_data->wd_cfg); /* Read back to sync write */
+}
+
+void board_reset_last(void)
 {
        struct cpld_data *cpld_data = (void *)(CONFIG_SYS_CPLD_BASE);
        out_8(&cpld_data->system_rst, 1);
@@ -92,12 +104,46 @@ void board_reset(void)
 void board_cpld_init(void)
 {
        struct cpld_data *cpld_data = (void *)(CONFIG_SYS_CPLD_BASE);
+       u8 prev_wd_cfg = in_8(&cpld_data->wd_cfg);
 
        out_8(&cpld_data->wd_cfg, CPLD_WD_CFG);
        out_8(&cpld_data->status_led, CPLD_STATUS_LED);
        out_8(&cpld_data->fxo_led, CPLD_FXO_LED);
        out_8(&cpld_data->fxs_led, CPLD_FXS_LED);
+
+       /*
+        * CPLD's system reset register on P1/P2 RDB boards is not autocleared
+        * after flipping it. If this register is set to one then CPLD triggers
+        * reset of CPU in few ms.
+        *
+        * CPLD does not trigger reset of CPU for 100ms after the last reset.
+        *
+        * This means that trying to reset board via CPLD system reset register
+        * cause reboot loop. To prevent this reboot loop, the only workaround
+        * is to try to clear CPLD's system reset register as early as possible
+        * and it has to be done in 100ms since the last start of reset.
+        */
        out_8(&cpld_data->system_rst, CPLD_SYS_RST);
+
+       /*
+        * If watchdog timer was already set to non-disabled value then it means
+        * that watchdog timer was already activated, has already expired and
+        * caused CPU reset. If this happened then due to CPLD firmware bug,
+        * writing to wd_cfg register has no effect and therefore it is not
+        * possible to reactivate watchdog timer again. Also if CPU was reset
+        * via watchdog then some peripherals like i2c do not work. Watchdog and
+        * i2c start working again after CPU reset via non-watchdog method.
+        *
+        * So in case watchdog timer register in CPLD was already enabled then
+        * disable it in CPLD and reset CPU which cause new boot. Watchdog timer
+        * is disabled few lines above, after reading CPLD previous value.
+        * This logic (disabling timer before reset) prevents reboot loop.
+        */
+       if (prev_wd_cfg != CPLD_WD_CFG) {
+               eieio();
+               do_reset(NULL, 0, 0, NULL);
+               while (1); /* do_reset() does not occur immediately */
+       }
 }
 
 void board_gpio_init(void)
@@ -368,6 +414,24 @@ int board_eth_init(struct bd_info *bis)
 }
 #endif
 
+#if defined(CONFIG_OF_BOARD_SETUP) || defined(CONFIG_OF_BOARD_FIXUP)
+static void fix_max6370_watchdog(void *blob)
+{
+       int off = fdt_node_offset_by_compatible(blob, -1, "maxim,max6370");
+       ccsr_gpio_t *pgpio = (void *)(CONFIG_SYS_MPC85xx_GPIO_ADDR);
+       u32 gpioval = in_be32(&pgpio->gpdat);
+
+       /*
+        * Delete watchdog max6370 node in load_default mode (detected by
+        * GPIO7 - LOAD_DEFAULT_N) because CPLD in load_default mode ignores
+        * watchdog reset signal. CPLD in load_default mode does not reset
+        * board when watchdog triggers reset signal.
+        */
+       if (!(gpioval & BIT(31-7)) && off >= 0)
+               fdt_del_node(blob, off);
+}
+#endif
+
 #ifdef CONFIG_OF_BOARD_SETUP
 int ft_board_setup(void *blob, struct bd_info *bd)
 {
@@ -393,6 +457,8 @@ int ft_board_setup(void *blob, struct bd_info *bd)
                        sizeof("okay"), 0);
 #endif
 
+       fix_max6370_watchdog(blob);
+
 #if defined(CONFIG_HAS_FSL_DR_USB)
        fsl_fdt_fixup_dr_usb(blob, bd);
 #endif
@@ -444,3 +510,11 @@ int ft_board_setup(void *blob, struct bd_info *bd)
        return 0;
 }
 #endif
+
+#ifdef CONFIG_OF_BOARD_FIXUP
+int board_fix_fdt(void *blob)
+{
+       fix_max6370_watchdog(blob);
+       return 0;
+}
+#endif
index b60027e..eda84bf 100644 (file)
@@ -31,6 +31,12 @@ void board_init_f(ulong bootflag)
        u32 plat_ratio, bus_clk;
        ccsr_gur_t *gur = (void *)CONFIG_SYS_MPC85xx_GUTS_ADDR;
 
+       /*
+        * Call board_early_init_f() as early as possible as it workarounds
+        * reboot loop due to broken CPLD state machine for reset line.
+        */
+       board_early_init_f();
+
        console_init_f();
 
        /* Set pmuxcr to allow both i2c1 and i2c2 */
index 105d9e3..65cedd4 100644 (file)
@@ -61,11 +61,11 @@ struct fsl_e_tlb_entry tlb_table[] = {
                        MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G,
                        0, 5, BOOKE_PAGESZ_1M, 1),
 #endif
+#endif /* not SPL */
 
        SET_TLB_ENTRY(1, CONFIG_SYS_CPLD_BASE, CONFIG_SYS_CPLD_BASE_PHYS,
                        MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G,
                        0, 6, BOOKE_PAGESZ_1M, 1),
-#endif /* not SPL */
 
 #ifdef CONFIG_SYS_NAND_BASE
        /* *I*G - NAND */
index 79f77e4..96612da 100644 (file)
@@ -100,9 +100,6 @@ enabled in relative defconfig file,
 3. CONFIG_MPC85XX_HAVE_RESET_VECTOR if reset vector is located at
    CONFIG_RESET_VECTOR_ADDRESS - 0xffc
 
-If device tree support is enabled in defconfig, use 'u-boot-with-dtb.bin'
-instead of u-boot.bin for all boot.
-
 CPLD command
 ============
 The CPLD is used to control the power sequence and some serdes lane
index 84deb95..de170f5 100644 (file)
@@ -267,7 +267,7 @@ enabled in relative defconfig file,
    config_reset_vector_address - 0xffc
 
 if device tree support is enabled in defconfig,
-1. use 'u-boot-with-dtb.bin' for nor boot.
+1. use 'u-boot.bin' for nor boot.
 2. use 'u-boot-with-spl-pbl.bin' for other boot.
 
 2-stage NAND/SPI/SD boot loader
index 09cb98e..e90dca4 100644 (file)
@@ -382,5 +382,5 @@ enabled in relative defconfig file,
    CONFIG_RESET_VECTOR_ADDRESS - 0xffc
 
 If device tree support is enabled in defconfig,
-1. use 'u-boot-with-dtb.bin' for NOR boot.
+1. use 'u-boot.bin' for NOR boot.
 2. use 'u-boot-with-spl-pbl.bin' for other boot.
index 75d3173..63953d6 100755 (executable)
@@ -288,5 +288,5 @@ enabled in relative defconfig file,
    CONFIG_RESET_VECTOR_ADDRESS - 0xffc
 
 If device tree support is enabled in defconfig,
-1. use 'u-boot-with-dtb.bin' for NOR boot.
+1. use 'u-boot.bin' for NOR boot.
 2. use 'u-boot-with-spl-pbl.bin' for other boot.
index c4bfd3b..60551f6 100644 (file)
@@ -284,5 +284,5 @@ enabled in relative defconfig file,
    CONFIG_RESET_VECTOR_ADDRESS - 0xffc
 
 If device tree support is enabled in defconfig,
-1. use 'u-boot-with-dtb.bin' for NOR boot.
+1. use 'u-boot.bin' for NOR boot.
 2. use 'u-boot-with-spl-pbl.bin' for other boot.
index 7a46f44..ac52cc0 100644 (file)
@@ -20,6 +20,7 @@
 struct venice_board_info som_info;
 struct venice_board_info base_info;
 char venice_model[32];
+char venice_baseboard_model[32];
 u32 venice_serial;
 
 /* return a mac address from EEPROM info */
@@ -321,6 +322,7 @@ int eeprom_init(int quiet)
                        base_info.model[3], /* baseboard */
                        base_info.model[4], base_info.model[5], /* subload of baseboard */
                        som_info.model[4], som_info.model[5]); /* last 2digits of SOM */
+               strlcpy(venice_baseboard_model, base_info.model, sizeof(venice_baseboard_model));
 
                /* baseboard revision */
                rev_pcb = get_pcb_rev(base_info.model);
@@ -357,6 +359,11 @@ const char *eeprom_get_model(void)
        return venice_model;
 }
 
+const char *eeprom_get_baseboard_model(void)
+{
+       return venice_baseboard_model;
+}
+
 u32 eeprom_get_serial(void)
 {
        return venice_serial;
index 37bfe76..8ea7318 100644 (file)
@@ -26,8 +26,11 @@ struct venice_board_info {
 
 int eeprom_init(int quiet);
 const char *eeprom_get_model(void);
+const char *eeprom_get_baseboard_model(void);
 const char *eeprom_get_dtb_name(int level, char *buf, int len);
 int eeprom_getmac(int index, uint8_t *enetaddr);
 uint32_t eeprom_get_serial(void);
+int get_bom_rev(const char *str);
+char get_pcb_rev(const char *str);
 
 #endif
index f1efabb..32b25ff 100644 (file)
@@ -3,6 +3,7 @@
  * Copyright 2021 Gateworks Corporation
  */
 
+#include <fdt_support.h>
 #include <init.h>
 #include <led.h>
 #include <miiphy.h>
@@ -169,26 +170,54 @@ int board_mmc_get_env_dev(int devno)
        return devno;
 }
 
-int ft_board_setup(void *blob, struct bd_info *bd)
+int ft_board_setup(void *fdt, struct bd_info *bd)
 {
+       const char *base_model = eeprom_get_baseboard_model();
+       char pcbrev;
        int off;
 
        /* set board model dt prop */
-       fdt_setprop_string(blob, 0, "board", eeprom_get_model());
+       fdt_setprop_string(fdt, 0, "board", eeprom_get_model());
 
        /* update temp thresholds */
-       off = fdt_path_offset(blob, "/thermal-zones/cpu-thermal/trips");
+       off = fdt_path_offset(fdt, "/thermal-zones/cpu-thermal/trips");
        if (off >= 0) {
                int minc, maxc, prop;
 
                get_cpu_temp_grade(&minc, &maxc);
-               fdt_for_each_subnode(prop, blob, off) {
-                       const char *type = fdt_getprop(blob, prop, "type", NULL);
+               fdt_for_each_subnode(prop, fdt, off) {
+                       const char *type = fdt_getprop(fdt, prop, "type", NULL);
 
                        if (type && (!strcmp("critical", type)))
-                               fdt_setprop_u32(blob, prop, "temperature", maxc * 1000);
+                               fdt_setprop_u32(fdt, prop, "temperature", maxc * 1000);
                        else if (type && (!strcmp("passive", type)))
-                               fdt_setprop_u32(blob, prop, "temperature", (maxc - 10) * 1000);
+                               fdt_setprop_u32(fdt, prop, "temperature", (maxc - 10) * 1000);
+               }
+       }
+
+       if (!strncmp(base_model, "GW73", 4)) {
+               pcbrev = get_pcb_rev(base_model);
+
+               if (pcbrev > 'B') {
+                       printf("adjusting dt for %s\n", base_model);
+
+                       /*
+                        * revC replaced PCIe 5-port switch with 4-port
+                        * which changed ethernet1 PCIe GbE
+                        * from: pcie@0,0/pcie@1,0/pcie@2,4/pcie@6.0
+                        *   to: pcie@0,0/pcie@1,0/pcie@2,3/pcie@5.0
+                        */
+                       off = fdt_path_offset(fdt, "ethernet1");
+                       if (off > 0) {
+                               u32 reg[5];
+
+                               fdt_set_name(fdt, off, "pcie@5,0");
+                               off = fdt_parent_offset(fdt, off);
+                               fdt_set_name(fdt, off, "pcie@2,3");
+                               memset(reg, 0, sizeof(reg));
+                               reg[0] = cpu_to_fdt32(PCI_DEVFN(3, 0));
+                               fdt_setprop(fdt, off, "reg", reg, sizeof(reg));
+                       }
                }
        }
 
index 33c6843..331de29 100644 (file)
@@ -2,6 +2,9 @@
 
 #include <common.h>
 #include <asm/global_data.h>
+#include <asm/io.h>
+
+#include "sl28.h"
 
 DECLARE_GLOBAL_DATA_PTR;
 
@@ -9,3 +12,22 @@ u32 get_lpuart_clk(void)
 {
        return gd->bus_clk / CONFIG_SYS_FSL_LPUART_CLK_DIV;
 }
+
+enum boot_source sl28_boot_source(void)
+{
+       u32 rcw_src = in_le32(DCFG_BASE + DCFG_PORSR1) & DCFG_PORSR1_RCW_SRC;
+
+       switch (rcw_src) {
+       case DCFG_PORSR1_RCW_SRC_SDHC1:
+               return BOOT_SOURCE_SDHC;
+       case DCFG_PORSR1_RCW_SRC_SDHC2:
+               return BOOT_SOURCE_MMC;
+       case DCFG_PORSR1_RCW_SRC_I2C:
+               return BOOT_SOURCE_I2C;
+       case DCFG_PORSR1_RCW_SRC_FSPI_NOR:
+               return BOOT_SOURCE_SPI;
+       default:
+               debug("unknown bootsource (%08x)\n", rcw_src);
+               return BOOT_SOURCE_UNKNOWN;
+       }
+}
index 32e9694..0576b3e 100644 (file)
@@ -24,6 +24,8 @@
 #include <fdtdec.h>
 #include <miiphy.h>
 
+#include "sl28.h"
+
 DECLARE_GLOBAL_DATA_PTR;
 
 #if CONFIG_IS_ENABLED(EFI_HAVE_CAPSULE_SUPPORT)
@@ -60,6 +62,27 @@ int board_eth_init(struct bd_info *bis)
        return pci_eth_init(bis);
 }
 
+enum env_location env_get_location(enum env_operation op, int prio)
+{
+       enum boot_source src = sl28_boot_source();
+
+       if (prio)
+               return ENVL_UNKNOWN;
+
+       if (!CONFIG_IS_ENABLED(ENV_IS_IN_SPI_FLASH))
+               return ENVL_NOWHERE;
+
+       /* write and erase always operate on the environment */
+       if (op == ENVOP_SAVE || op == ENVOP_ERASE)
+               return ENVL_SPI_FLASH;
+
+       /* failsafe boot will always use the compiled-in default environment */
+       if (src == BOOT_SOURCE_SPI)
+               return ENVL_NOWHERE;
+
+       return ENVL_SPI_FLASH;
+}
+
 static int __sl28cpld_read(uint reg)
 {
        struct udevice *dev;
@@ -103,8 +126,28 @@ static void stop_recovery_watchdog(void)
                wdt_stop(dev);
 }
 
+static void sl28_set_prompt(void)
+{
+       enum boot_source src = sl28_boot_source();
+
+       switch (src) {
+       case BOOT_SOURCE_SPI:
+               env_set("PS1", "[FAILSAFE] => ");
+               break;
+       case BOOT_SOURCE_SDHC:
+               env_set("PS1", "[SDHC] => ");
+               break;
+       default:
+               env_set("PS1", NULL);
+               break;
+       }
+}
+
 int fsl_board_late_init(void)
 {
+       if (IS_ENABLED(CONFIG_CMDLINE_PS_SUPPORT))
+               sl28_set_prompt();
+
        /*
         * Usually, the after a board reset, the watchdog is enabled by
         * default. This is to supervise the bootloader boot-up. Therefore,
diff --git a/board/kontron/sl28/sl28.h b/board/kontron/sl28/sl28.h
new file mode 100644 (file)
index 0000000..7f01050
--- /dev/null
@@ -0,0 +1,16 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
+
+#ifndef __SL28_H
+#define __SL28_H
+
+enum boot_source {
+       BOOT_SOURCE_UNKNOWN,
+       BOOT_SOURCE_SDHC,
+       BOOT_SOURCE_MMC,
+       BOOT_SOURCE_I2C,
+       BOOT_SOURCE_SPI,
+};
+
+enum boot_source sl28_boot_source(void);
+
+#endif
index 0e6ad5f..ffaf517 100644 (file)
@@ -5,6 +5,9 @@
 #include <asm/spl.h>
 #include <asm/arch-fsl-layerscape/fsl_serdes.h>
 #include <asm/arch-fsl-layerscape/soc.h>
+#include <spi_flash.h>
+
+#include "sl28.h"
 
 #define DCFG_RCWSR25 0x160
 #define GPINFO_HW_VARIANT_MASK 0xff
@@ -58,7 +61,56 @@ int board_fit_config_name_match(const char *name)
 
 void board_boot_order(u32 *spl_boot_list)
 {
-       spl_boot_list[0] = BOOT_DEVICE_SPI;
+       enum boot_source src = sl28_boot_source();
+
+       switch (src) {
+       case BOOT_SOURCE_SDHC:
+               spl_boot_list[0] = BOOT_DEVICE_MMC2;
+               break;
+       case BOOT_SOURCE_SPI:
+       case BOOT_SOURCE_I2C:
+               spl_boot_list[0] = BOOT_DEVICE_SPI;
+               break;
+       case BOOT_SOURCE_MMC:
+               spl_boot_list[0] = BOOT_DEVICE_MMC1;
+               break;
+       default:
+               panic("unexpected bootsource (%d)\n", src);
+               break;
+       }
+}
+
+unsigned int spl_spi_get_uboot_offs(struct spi_flash *flash)
+{
+       enum boot_source src = sl28_boot_source();
+
+       switch (src) {
+       case BOOT_SOURCE_SPI:
+               return 0x000000;
+       case BOOT_SOURCE_I2C:
+               return 0x230000;
+       default:
+               panic("unexpected bootsource (%d)\n", src);
+               break;
+       }
+}
+
+const char *spl_board_loader_name(u32 boot_device)
+{
+       enum boot_source src = sl28_boot_source();
+
+       switch (src) {
+       case BOOT_SOURCE_SDHC:
+               return "SD card (Test mode)";
+       case BOOT_SOURCE_SPI:
+               return "Failsafe SPI flash";
+       case BOOT_SOURCE_I2C:
+               return "SPI flash";
+       case BOOT_SOURCE_MMC:
+               return "eMMC";
+       default:
+               return "(unknown)";
+       }
 }
 
 int board_early_init_f(void)
diff --git a/board/purism/librem5/Kconfig b/board/purism/librem5/Kconfig
new file mode 100644 (file)
index 0000000..cf0f303
--- /dev/null
@@ -0,0 +1,15 @@
+if TARGET_LIBREM5
+
+config SYS_BOARD
+       default "librem5"
+
+config SYS_VENDOR
+       default "purism"
+
+config SYS_CONFIG_NAME
+       default "librem5"
+
+config IMX_CONFIG
+       default "board/purism/librem5/imximage-8mq-lpddr4.cfg"
+
+endif
diff --git a/board/purism/librem5/MAINTAINERS b/board/purism/librem5/MAINTAINERS
new file mode 100644 (file)
index 0000000..09e7f20
--- /dev/null
@@ -0,0 +1,8 @@
+PURISM LIBREM5 PHONE
+M:     Angus Ainslie <angus@akkea.ca>
+R:     kernel@puri.sm
+S:     Supported
+F:     arch/arm/dts/imx8mq-librem5*
+F:     board/purism/librem5/
+F:     configs/librem5_defconfig
+F:     include/configs/librem5.h
diff --git a/board/purism/librem5/Makefile b/board/purism/librem5/Makefile
new file mode 100644 (file)
index 0000000..47f25f0
--- /dev/null
@@ -0,0 +1,13 @@
+#
+# Copyright 2017 NXP
+# Copyright 2019 Purism
+#
+# SPDX-License-Identifier:      GPL-2.0+
+#
+
+obj-y += librem5.o
+
+ifdef CONFIG_SPL_BUILD
+obj-y += spl.o
+obj-$(CONFIG_IMX8M_LPDDR4) += lpddr4_timing.o lpddr4_timing_b0.o
+endif
diff --git a/board/purism/librem5/imximage-8mq-lpddr4.cfg b/board/purism/librem5/imximage-8mq-lpddr4.cfg
new file mode 100644 (file)
index 0000000..3b59671
--- /dev/null
@@ -0,0 +1,9 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
+/*
+ * Copyright 2021 NXP
+ */
+
+FIT
+BOOT_FROM      sd
+SIGNED_HDMI     signed_hdmi.bin
+LOADER         u-boot-spl-ddr.bin      0x7E1000
diff --git a/board/purism/librem5/librem5.c b/board/purism/librem5/librem5.c
new file mode 100644 (file)
index 0000000..caa0265
--- /dev/null
@@ -0,0 +1,425 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright 2018 NXP
+ * Copyright 2021 Purism
+ */
+
+#include <common.h>
+#include <malloc.h>
+#include <errno.h>
+#include <asm/io.h>
+#include <miiphy.h>
+#include <asm/mach-imx/iomux-v3.h>
+#include <asm-generic/gpio.h>
+#include <asm/arch/sys_proto.h>
+#include <fsl_esdhc.h>
+#include <mmc.h>
+#include <asm/arch/imx8mq_pins.h>
+#include <asm/arch/sys_proto.h>
+#include <asm/mach-imx/gpio.h>
+#include <asm/mach-imx/mxc_i2c.h>
+#include <asm/arch/clock.h>
+#include <asm/mach-imx/video.h>
+#include <fuse.h>
+#include <i2c.h>
+#include <spl.h>
+#include <usb.h>
+#include <dwc3-uboot.h>
+#include <linux/delay.h>
+#include <linux/bitfield.h>
+#include <power/regulator.h>
+#include <usb/xhci.h>
+#include "librem5.h"
+
+DECLARE_GLOBAL_DATA_PTR;
+
+int board_early_init_f(void)
+{
+       return 0;
+}
+
+#if IS_ENABLED(CONFIG_LOAD_ENV_FROM_MMC_BOOT_PARTITION)
+uint board_mmc_get_env_part(struct mmc *mmc)
+{
+       uint part = (mmc->part_config >> 3) & PART_ACCESS_MASK;
+
+       if (part == 7)
+               part = 0;
+       return part;
+}
+#endif
+
+int tps65982_wait_for_app(int timeout, int timeout_step)
+{
+       int ret;
+       char response[6];
+       struct udevice *udev, *bus;
+
+       log_debug("%s: starting\n", __func__);
+
+       /* Set the i2c bus */
+       ret = uclass_get_device_by_seq(UCLASS_I2C, 0, &bus);
+       if (ret) {
+               log_err("%s: No bus %d\n", __func__, 0);
+               return 1;
+       }
+
+       ret = i2c_get_chip(bus, 0x3f, 1, &udev);
+       if (ret) {
+               log_err("%s: setting chip offset failed %d\n", __func__, ret);
+               return 1;
+       }
+
+       while (timeout > 0) {
+               ret = dm_i2c_read(udev, 0x03, (u8 *)response, 5);
+               log_debug("tps65982 mode %s\n", response);
+               if (response[1] == 'A')
+                       return 0;
+               mdelay(timeout_step);
+               timeout -= timeout_step;
+               log_debug("tps65982 waited %d ms %c\n", timeout_step, response[1]);
+       }
+
+       return 1;
+}
+
+int tps65982_clear_dead_battery(void)
+{
+       int ret;
+       char cmd[5] = "\04DBfg";
+       struct udevice *udev, *bus;
+
+       log_debug("%s: starting\n", __func__);
+
+       /* Set the i2c bus */
+       ret = uclass_get_device_by_seq(UCLASS_I2C, 0, &bus);
+       if (ret) {
+               log_err("%s: No bus %d\n", __func__, 0);
+               return 1;
+       }
+
+       ret = i2c_get_chip(bus, 0x3f, 1, &udev);
+       if (ret) {
+               log_err("%s: setting chip offset failed %d\n", __func__, ret);
+               return 1;
+       }
+
+       /* clearing the dead battery flag when not in dead battery condition
+        * is a no-op, so there's no need to check if it's in effect
+        */
+       ret = dm_i2c_write(udev, 0x08, cmd, 5);
+       if (ret) {
+               log_err("%s: writing 4CC command failed %d", __func__, ret);
+               return 1;
+       }
+
+       return 0;
+}
+
+#define TPS_POWER_STATUS_PWROPMODE(x)      FIELD_GET(GENMASK(3, 2), x)
+
+#define TPS_PDO_CONTRACT_TYPE(x)       FIELD_GET(GENMASK(31, 30), x)
+#define TPS_PDO_CONTRACT_FIXED 0
+#define TPS_PDO_CONTRACT_BATTERY       1
+#define TPS_PDO_CONTRACT_VARIABLE      2
+
+#define TPS_TYPEC_PWR_MODE_USB 0
+#define TPS_TYPEC_PWR_MODE_1_5A        1
+#define TPS_TYPEC_PWR_MODE_3_0A        2
+#define TPS_TYPEC_PWR_MODE_PD  3
+
+#define TPS_PDO_FIXED_CONTRACT_MAX_CURRENT(x)  (FIELD_GET(GENMASK(9, 0), x) * 10)
+#define TPS_PDO_VAR_CONTRACT_MAX_CURRENT(x)    (FIELD_GET(GENMASK(9, 0), x) * 10)
+#define TPS_PDO_BAT_CONTRACT_MAX_VOLTAGE(x)    (FIELD_GET(GENMASK(29, 20), x) * 50)
+#define TPS_PDO_BAT_CONTRACT_MAX_POWER(x)      (FIELD_GET(GENMASK(9, 0), x) * 250)
+
+int tps65982_get_max_current(void)
+{
+       int ret;
+       u8 buf[7];
+       u8 pwr_status;
+       u32 contract;
+       int type, mode;
+       struct udevice *udev, *bus;
+
+       log_debug("%s: starting\n", __func__);
+
+       /* Set the i2c bus */
+       ret = uclass_get_device_by_seq(UCLASS_I2C, 0, &bus);
+       if (ret) {
+               log_debug("%s: No bus %d\n", __func__, 0);
+               return -1;
+       }
+
+       ret = i2c_get_chip(bus, 0x3f, 1, &udev);
+       if (ret) {
+               log_debug("%s: setting chip offset failed %d\n", __func__, ret);
+               return -1;
+       }
+
+       ret = dm_i2c_read(udev, 0x3f, buf, 3);
+       if (ret) {
+               log_debug("%s: reading pwr_status failed %d\n", __func__, ret);
+               return -1;
+       }
+
+       pwr_status = buf[1];
+
+       if (!(pwr_status & 1))
+               return 0;
+
+       mode = TPS_POWER_STATUS_PWROPMODE(pwr_status);
+       switch (mode) {
+       case TPS_TYPEC_PWR_MODE_1_5A:
+               return 1500;
+       case TPS_TYPEC_PWR_MODE_3_0A:
+               return 3000;
+       case TPS_TYPEC_PWR_MODE_PD:
+               ret = dm_i2c_read(udev, 0x34, buf, 7);
+               if (ret) {
+                       log_debug("%s: reading active contract failed %d\n", __func__, ret);
+                       return -1;
+               }
+
+               contract = buf[1] + (buf[2] << 8) + (buf[3] << 16) + (buf[4] << 24);
+
+               type = TPS_PDO_CONTRACT_TYPE(contract);
+
+               switch (type) {
+               case TPS_PDO_CONTRACT_FIXED:
+                       return TPS_PDO_FIXED_CONTRACT_MAX_CURRENT(contract);
+               case TPS_PDO_CONTRACT_BATTERY:
+                       return 1000 * TPS_PDO_BAT_CONTRACT_MAX_POWER(contract)
+                               / TPS_PDO_BAT_CONTRACT_MAX_VOLTAGE(contract);
+               case TPS_PDO_CONTRACT_VARIABLE:
+                       return TPS_PDO_VAR_CONTRACT_MAX_CURRENT(contract);
+               default:
+                       log_debug("Unknown contract type: %d\n", type);
+                       return -1;
+               }
+       case TPS_TYPEC_PWR_MODE_USB:
+               return 500;
+       default:
+               log_debug("Unknown power mode: %d\n", mode);
+               return -1;
+       }
+}
+
+int init_tps65982(void)
+{
+       log_debug("%s: starting\n", __func__);
+
+       if (tps65982_wait_for_app(500, 100)) {
+               log_err("tps65982 APP boot failed\n");
+               return 1;
+       }
+
+       log_info("tps65982 boot successful\n");
+       return 0;
+}
+
+int bq25895_set_iinlim(int current)
+{
+       u8 val, iinlim;
+       int ret;
+       struct udevice *udev, *bus;
+
+       /* Set the i2c bus */
+       ret = uclass_get_device_by_seq(UCLASS_I2C, 3, &bus);
+       if (ret) {
+               log_err("%s: No bus 3\n", __func__);
+               return ret;
+       }
+
+       ret = i2c_get_chip(bus, 0x6a, 1, &udev);
+       if (ret) {
+               log_err("%s: setting chip offset failed %d\n", __func__, ret);
+               return ret;
+       }
+
+       if (current > 3250)
+               current = 3250;
+       if (current < 100)
+               current = 100;
+
+       val = dm_i2c_reg_read(udev, 0x00);
+       iinlim = ((current - 100) / 50) & 0x3f;
+       val = (val & 0xc0) | iinlim;
+       dm_i2c_reg_write(udev, 0x00, val);
+       log_debug("REG00 0x%x\n", val);
+
+       return 0;
+}
+
+bool bq25895_battery_present(void)
+{
+       u8 val;
+       int ret;
+       struct udevice *udev, *bus;
+
+       /* Set the i2c bus */
+       ret = uclass_get_device_by_seq(UCLASS_I2C, 3, &bus);
+       if (ret) {
+               log_err("%s: No bus 3\n", __func__);
+               return ret;
+       }
+
+       ret = i2c_get_chip(bus, 0x6a, 1, &udev);
+       if (ret) {
+               log_err("%s: setting chip offset failed %d\n", __func__, ret);
+               return ret;
+       }
+
+       /* note that this may return false negatives when there's
+        * no external power applied and the battery voltage is below
+        * Vsys. this isn't a problem when used for clearing the dead
+        * battery flag though, since it's certain that there's an external
+        * power applied in this case
+        */
+       val = dm_i2c_reg_read(udev, 0x0e) & 0x7f;
+       if (val == 0x00 || val == 0x7f)
+               return false;
+
+       return true;
+}
+
+/*
+ * set some safe defaults for the battery charger
+ */
+int init_charger_bq25895(void)
+{
+       u8 val;
+       int iinlim, ret;
+       struct udevice *udev, *bus;
+
+       /* Set the i2c bus */
+       ret = uclass_get_device_by_seq(UCLASS_I2C, 3, &bus);
+       if (ret) {
+               log_debug("%s: No bus 3\n", __func__);
+               return ret;
+       }
+
+       ret = i2c_get_chip(bus, 0x6a, 1, &udev);
+       if (ret) {
+               log_debug("%s: setting chip offset failed %d\n", __func__, ret);
+               return ret;
+       }
+
+       val = dm_i2c_reg_read(udev, 0x0b);
+       log_debug("REG0B 0x%x\n", val);
+
+       log_debug("VBUS_STAT 0x%x\n", val >> 5);
+       switch (val >> 5) {
+       case 0:
+               log_debug("VBUS not detected\n");
+               break;
+       case 1:
+               log_debug("USB SDP IINLIM 500mA\n");
+               break;
+       case 2:
+               log_debug("USB CDP IINLIM 1500mA\n");
+               break;
+       case 3:
+               log_debug("USB DCP IINLIM 3500mA\n");
+               break;
+       case 4:
+               log_debug("MAXCHARGE IINLIM 1500mA\n");
+               break;
+       case 5:
+               log_debug("Unknown IINLIM 500mA\n");
+               break;
+       case 6:
+               log_debug("DIVIDER IINLIM > 1000mA\n");
+               break;
+       case 7:
+               log_debug("OTG\n");
+               break;
+       };
+
+       log_debug("CHRG_STAT 0x%x\n", (val >> 3) & 0x3);
+       log_debug("PG_STAT 0x%x\n", (val >> 2) & 1);
+       log_debug("SDP_STAT 0x%x\n", (val >> 1) & 1);
+       log_debug("VSYS_STAT 0x%x\n", val & 1);
+
+       val = dm_i2c_reg_read(udev, 0x00);
+       log_debug("REG00 0x%x\n", val);
+       iinlim = 100 + (val & 0x3f) * 50;
+       log_debug("IINLIM %d mA\n", iinlim);
+       log_debug("EN_HIZ 0x%x\n", (val >> 7) & 1);
+       log_debug("EN_ILIM 0x%x\n", (val >> 6) & 1);
+
+       /* set 1.6A charge limit */
+       dm_i2c_reg_write(udev, 0x04, 0x19);
+
+       /* re-enable charger */
+       val = dm_i2c_reg_read(udev, 0x03);
+       val = val | 0x10;
+       dm_i2c_reg_write(udev, 0x03, val);
+
+       return 0;
+}
+
+int board_init(void)
+{
+       struct udevice *dev;
+       int tps_ret;
+
+       if (IS_ENABLED(CONFIG_USB_DWC3) || IS_ENABLED(CONFIG_USB_XHCI_IMX8M)) {
+               log_debug("%s: initializing USB clk\n", __func__);
+
+               /* init_usb_clk won't enable the second clock if it's a USB boot */
+               if (is_usb_boot()) {
+                       clock_enable(CCGR_USB_CTRL2, 1);
+                       clock_enable(CCGR_USB_PHY2, 1);
+               }
+
+               printf("Enabling regulator-hub\n");
+               if (!regulator_get_by_devname("regulator-hub", &dev)) {
+                       if (regulator_set_enable(dev, true))
+                               pr_err("Failed to enable regulator-hub\n");
+               }
+       }
+
+       tps_ret = init_tps65982();
+       init_charger_bq25895();
+
+       if (!tps_ret) {
+               int current = tps65982_get_max_current();
+
+               if (current > 500)
+                       bq25895_set_iinlim(current);
+
+               if (bq25895_battery_present())
+                       tps65982_clear_dead_battery();
+       }
+
+       return 0;
+}
+
+int board_late_init(void)
+{
+       if (IS_ENABLED(CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG)) {
+               u32 rev;
+               char rev_str[3];
+
+               env_set("board_name", "librem5");
+               if (fuse_read(9, 0, &rev)) {
+                       env_set("board_rev", BOARD_REV_ERROR);
+               } else if (rev == 0) {
+                       env_set("board_rev", BOARD_REV_UNKNOWN);
+               } else if (rev > 0) {
+                       sprintf(rev_str, "%u", rev);
+                       env_set("board_rev", rev_str);
+               }
+
+               printf("Board name: %s\n", env_get("board_name"));
+               printf("Board rev:  %s\n", env_get("board_rev"));
+       }
+
+       if (is_usb_boot()) {
+               puts("USB Boot\n");
+               env_set("bootcmd", "fastboot 0");
+       }
+
+       return 0;
+}
diff --git a/board/purism/librem5/librem5.h b/board/purism/librem5/librem5.h
new file mode 100644 (file)
index 0000000..0d24ede
--- /dev/null
@@ -0,0 +1,181 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
+/*
+ * Copyright 2021 Purism
+ */
+
+#ifndef __LIBREM5_H__
+#define __LIBREM5_H__
+
+#define CAMERA_EN IMX_GPIO_NR(1, 0)
+#define SD_EN IMX_GPIO_NR(1, 3)
+#define AUDIO_EN IMX_GPIO_NR(1, 4)
+#define DSI_EN IMX_GPIO_NR(1, 5)
+#define SMC_EN IMX_GPIO_NR(1, 6)
+#define TYPEC_MUX_EN IMX_GPIO_NR(1, 11)
+#define HUB_NRESET IMX_GPIO_NR(1, 12)
+#define HUB_EN IMX_GPIO_NR(1, 14)
+#define VOL_UP IMX_GPIO_NR(1, 16)
+#define VOL_DOWN IMX_GPIO_NR(1, 17)
+#define DSI_BIAS_EN IMX_GPIO_NR(1, 20)
+#define FLASH_EN IMX_GPIO_NR(1, 23)
+#define WWAN_NRESET IMX_GPIO_NR(3, 1)
+#define CHG_EN IMX_GPIO_NR(3, 2)
+#define CHG_OTG_OUT_EN IMX_GPIO_NR(3, 4)
+#define WIFI_EN IMX_GPIO_NR(3, 10)
+#define GPS_EN IMX_GPIO_NR(3, 12)
+#define BL_EN IMX_GPIO_NR(3, 14)
+#define WWAN_EN IMX_GPIO_NR(3, 18)
+#define NFC_EN IMX_GPIO_NR(4, 28)
+#define LED_G IMX_GPIO_NR(5, 2)
+#define LED_R IMX_GPIO_NR(5, 3)
+#define LED_B IMX_GPIO_NR(1, 13)
+#define MOTO IMX_GPIO_NR(5, 5)
+#define SPI1_SCLK IMX_GPIO_NR(5, 6)
+#define SPI1_MOSI IMX_GPIO_NR(5, 7)
+#define SPI1_MISO IMX_GPIO_NR(5, 8)
+#define SPI1_SS0 IMX_GPIO_NR(5, 9)
+
+#define UART1_TX IMX_GPIO_NR(5, 23)
+#define UART1_RX IMX_GPIO_NR(5, 22)
+#define UART2_TX IMX_GPIO_NR(5, 25)
+#define UART2_RX IMX_GPIO_NR(5, 24)
+#define UART3_TX IMX_GPIO_NR(5, 27)
+#define UART3_RX IMX_GPIO_NR(5, 26)
+#define UART4_TX IMX_GPIO_NR(5, 11)
+#define UART4_RX IMX_GPIO_NR(5, 10)
+
+#define TPS_RESET IMX_GPIO_NR(3, 24)
+
+#define PURISM_VID     0x316d
+#define PURISM_PID     0x4c05
+
+#define BOARD_REV_ERROR                "unknown"
+#define BOARD_REV_BIRCH                "1"
+#define BOARD_REV_CHESTNUT     "2"
+#define BOARD_REV_DOGWOOD      "3"
+#define BOARD_REV_EVERGREEN    "4"
+/* Could be ASPEN, BIRCH or CHESTNUT. assume CHESTNUT */
+#define BOARD_REV_UNKNOWN      BOARD_REV_CHESTNUT
+
+#ifdef CONFIG_SPL_BUILD
+static const iomux_v3_cfg_t configure_pads[] = {
+       IMX8MQ_PAD_GPIO1_IO00__GPIO1_IO0 | MUX_PAD_CTRL(PAD_CTL_DSE6),
+       IMX8MQ_PAD_GPIO1_IO03__GPIO1_IO3 | MUX_PAD_CTRL(PAD_CTL_DSE6) | MUX_MODE_SION,
+       IMX8MQ_PAD_GPIO1_IO04__GPIO1_IO4 | MUX_PAD_CTRL(PAD_CTL_DSE6),
+       IMX8MQ_PAD_GPIO1_IO05__GPIO1_IO5 | MUX_PAD_CTRL(PAD_CTL_DSE6) | MUX_MODE_SION,
+       IMX8MQ_PAD_GPIO1_IO06__GPIO1_IO6 | MUX_PAD_CTRL(PAD_CTL_DSE6),
+       IMX8MQ_PAD_GPIO1_IO11__GPIO1_IO11 | MUX_PAD_CTRL(PAD_CTL_DSE6),
+       IMX8MQ_PAD_GPIO1_IO12__GPIO1_IO12 | MUX_PAD_CTRL(PAD_CTL_DSE6) | MUX_MODE_SION,
+       IMX8MQ_PAD_GPIO1_IO13__GPIO1_IO13 | MUX_PAD_CTRL(PAD_CTL_DSE6) | MUX_MODE_SION,
+       IMX8MQ_PAD_GPIO1_IO14__GPIO1_IO14 | MUX_PAD_CTRL(PAD_CTL_DSE6) | MUX_MODE_SION,
+       IMX8MQ_PAD_ENET_MDC__GPIO1_IO16 | MUX_PAD_CTRL(PAD_CTL_PUE),
+       IMX8MQ_PAD_ENET_MDIO__GPIO1_IO17 | MUX_PAD_CTRL(PAD_CTL_PUE),
+       IMX8MQ_PAD_ENET_TD1__GPIO1_IO20 | MUX_PAD_CTRL(PAD_CTL_DSE6),
+       IMX8MQ_PAD_ENET_TXC__GPIO1_IO23 | MUX_PAD_CTRL(PAD_CTL_DSE6),
+       IMX8MQ_PAD_NAND_CE0_B__GPIO3_IO1 | MUX_PAD_CTRL(PAD_CTL_DSE6),
+       IMX8MQ_PAD_NAND_CE1_B__GPIO3_IO2 | MUX_PAD_CTRL(PAD_CTL_DSE6),
+       IMX8MQ_PAD_NAND_CE3_B__GPIO3_IO4 | MUX_PAD_CTRL(PAD_CTL_DSE6),
+       IMX8MQ_PAD_NAND_DATA04__GPIO3_IO10 | MUX_PAD_CTRL(PAD_CTL_DSE6),
+       IMX8MQ_PAD_NAND_DATA06__GPIO3_IO12 | MUX_PAD_CTRL(PAD_CTL_DSE6),
+       IMX8MQ_PAD_NAND_DQS__GPIO3_IO14 | MUX_PAD_CTRL(PAD_CTL_DSE6),
+       IMX8MQ_PAD_NAND_WP_B__GPIO3_IO18 | MUX_PAD_CTRL(PAD_CTL_DSE6),
+       IMX8MQ_PAD_SAI3_RXFS__GPIO4_IO28 | MUX_PAD_CTRL(PAD_CTL_DSE6),
+       IMX8MQ_PAD_SAI3_MCLK__GPIO5_IO2 | MUX_PAD_CTRL(PAD_CTL_DSE6) | MUX_MODE_SION,
+       IMX8MQ_PAD_SPDIF_TX__GPIO5_IO3 | MUX_PAD_CTRL(PAD_CTL_DSE6) | MUX_MODE_SION,
+       IMX8MQ_PAD_SAI5_RXD3__GPIO3_IO24 | MUX_PAD_CTRL(PAD_CTL_DSE6) | MUX_MODE_SION,
+};
+
+static inline void init_pinmux(void)
+{
+       imx_iomux_v3_setup_multiple_pads(configure_pads, ARRAY_SIZE(configure_pads));
+
+       gpio_request(LED_R, "LED_R");
+       gpio_request(LED_G, "LED_G");
+       gpio_request(LED_B, "LED_B");
+       gpio_request(VOL_UP, "VOL_UP");
+       gpio_request(VOL_DOWN, "VOL_DOWN");
+
+       gpio_request(NFC_EN, "NFC_EN");
+       gpio_request(CHG_EN, "CHG_EN");
+       gpio_request(CHG_OTG_OUT_EN, "CHG_OTG_OUT_EN");
+
+       gpio_request(TYPEC_MUX_EN, "TYPEC_MUX_EN");
+
+       gpio_request(TPS_RESET, "TPS_RESET");
+
+       gpio_request(WWAN_EN, "WWAN_EN");
+       gpio_request(WWAN_NRESET, "WWAN_NRESET");
+
+       gpio_request(HUB_EN, "HUB_EN");
+       gpio_request(HUB_NRESET, "HUB_NRESET");
+       gpio_request(SD_EN, "SD_EN");
+       gpio_request(AUDIO_EN, "AUDIO_EN");
+       gpio_request(DSI_EN, "DSI_EN");
+       gpio_request(SMC_EN, "SMC_EN");
+       gpio_request(CAMERA_EN, "CAMERA_EN");
+       gpio_request(FLASH_EN, "FLASH_EN");
+       gpio_request(DSI_BIAS_EN, "DSI_BIAS_EN");
+       gpio_request(GPS_EN, "GPS_EN");
+       gpio_request(BL_EN, "BL_EN");
+#ifndef CONSOLE_ON_UART4
+       gpio_request(WIFI_EN, "WIFI_EN");
+       gpio_direction_output(WIFI_EN, 0);
+#endif /* CONSOLE_ON_UART4 */
+       gpio_direction_input(VOL_UP);
+       gpio_direction_input(VOL_DOWN);
+
+       /* ensure charger is in the automated mode */
+       gpio_direction_output(NFC_EN, 0);
+       gpio_direction_output(CHG_EN, 0);
+       gpio_direction_output(CHG_OTG_OUT_EN, 0);
+
+       gpio_direction_input(TYPEC_MUX_EN);
+
+       gpio_direction_output(TPS_RESET, 0);
+
+       gpio_direction_output(WWAN_EN, 0);
+       gpio_direction_output(WWAN_NRESET, 1);
+
+       gpio_direction_output(HUB_EN, 1);
+       gpio_direction_output(HUB_NRESET, 1);
+       mdelay(10);
+       gpio_direction_output(SD_EN, 1);
+       gpio_direction_output(SMC_EN, 0);
+       gpio_direction_output(CAMERA_EN, 0);
+       gpio_direction_output(FLASH_EN, 0);
+       gpio_direction_output(DSI_BIAS_EN, 0);
+       gpio_direction_output(GPS_EN, 0);
+       gpio_direction_output(BL_EN, 0);
+
+       /* turn these on for i2c busses */
+       gpio_direction_output(AUDIO_EN, 1);
+       gpio_direction_output(DSI_EN, 1);
+}
+#endif /* CONFIG_SPL_BUILD */
+
+#define USB1_BASE_ADDR         0x38100000
+#define USB2_BASE_ADDR         0x38200000
+#define USB1_PHY_BASE_ADDR     0x381F0000
+#define USB2_PHY_BASE_ADDR     0x382F0000
+
+#define USB_PHY_CTRL0                  0xF0040
+#define USB_PHY_CTRL0_REF_SSP_EN       BIT(2)
+#define USB_PHY_CTRL0_SSC_RANGE_MASK   GENMASK(23, 21)
+#define USB_PHY_CTRL0_SSC_RANGE_4003PPM        (0x2 << 21)
+
+#define USB_PHY_CTRL1                  0xF0044
+#define USB_PHY_CTRL1_RESET            BIT(0)
+#define USB_PHY_CTRL1_COMMONONN                BIT(1)
+#define USB_PHY_CTRL1_ATERESET         BIT(3)
+#define USB_PHY_CTRL1_VDATSRCENB0      BIT(19)
+#define USB_PHY_CTRL1_VDATDETENB0      BIT(20)
+
+#define USB_PHY_CTRL2                  0xF0048
+#define USB_PHY_CTRL2_TXENABLEN0       BIT(8)
+
+#define USB_PHY_CTRL6                  0x18
+#define USB_PHY_CTRL6_RXTERM_OVERRIDE_SEL      BIT(29)
+
+extern struct dram_timing_info dram_timing_b0;
+
+#endif
diff --git a/board/purism/librem5/lpddr4_timing.c b/board/purism/librem5/lpddr4_timing.c
new file mode 100644 (file)
index 0000000..46bc7f8
--- /dev/null
@@ -0,0 +1,1324 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright 2018 NXP
+ */
+
+#include <linux/kernel.h>
+#include <common.h>
+#include <asm/arch/ddr.h>
+#include <asm/arch/lpddr4_define.h>
+
+#define WR_POST_EXT_3200       /* recommened to define */
+
+struct dram_cfg_param lpddr4_ddrc_cfg[] = {
+       /* Start to config, default 3200mbps */
+       { DDRC_DBG1(0), 0x00000001 },
+       { DDRC_PWRCTL(0), 0x00000001 },
+       { DDRC_MSTR(0), 0xa3080020 },
+       { DDRC_MSTR2(0), 0x00000000 },
+       { DDRC_RFSHTMG(0), 0x006100E0 },
+       { DDRC_INIT0(0), 0xC003061B },
+       { DDRC_INIT1(0), 0x009D0000 },
+       { DDRC_INIT3(0), 0x00D4002D },
+#ifdef WR_POST_EXT_3200
+       { DDRC_INIT4(0), 0x00330008 },
+#else
+       { DDRC_INIT4(0), 0x00310008 },
+#endif
+       { DDRC_INIT6(0), 0x0066004a },
+       { DDRC_INIT7(0), 0x0006004a },
+
+       { DDRC_DRAMTMG0(0), 0x1A201B22 },
+       { DDRC_DRAMTMG1(0), 0x00060633 },
+       { DDRC_DRAMTMG3(0), 0x00C0C000 },
+       { DDRC_DRAMTMG4(0), 0x0F04080F },
+       { DDRC_DRAMTMG5(0), 0x02040C0C },
+       { DDRC_DRAMTMG6(0), 0x01010007 },
+       { DDRC_DRAMTMG7(0), 0x00000401 },
+       { DDRC_DRAMTMG12(0), 0x00020600 },
+       { DDRC_DRAMTMG13(0), 0x0C100002 },
+       { DDRC_DRAMTMG14(0), 0x000000E6 },
+       { DDRC_DRAMTMG17(0), 0x00A00050 },
+
+       { DDRC_ZQCTL0(0), 0x03200018 },
+       { DDRC_ZQCTL1(0), 0x028061A8 },
+       { DDRC_ZQCTL2(0), 0x00000000 },
+
+       { DDRC_DFITMG0(0), 0x0497820A },
+       { DDRC_DFITMG1(0), 0x00080303 },
+       { DDRC_DFIUPD0(0), 0xE0400018 },
+       { DDRC_DFIUPD1(0), 0x00DF00E4 },
+       { DDRC_DFIUPD2(0), 0x80000000 },
+       { DDRC_DFIMISC(0), 0x00000011 },
+       { DDRC_DFITMG2(0), 0x0000170A },
+
+       { DDRC_DBICTL(0), 0x00000001 },
+       { DDRC_DFIPHYMSTR(0), 0x00000001 },
+       { DDRC_RANKCTL(0), 0x00000c99 },
+       { DDRC_DRAMTMG2(0), 0x070E171a },
+
+       /* address mapping */
+       { DDRC_ADDRMAP0(0), 0x00000015 },
+       { DDRC_ADDRMAP3(0), 0x00000000 },
+       { DDRC_ADDRMAP4(0), 0x00001F1F },
+       /* bank interleave */
+       { DDRC_ADDRMAP1(0), 0x00080808 },
+       { DDRC_ADDRMAP5(0), 0x07070707 },
+       { DDRC_ADDRMAP6(0), 0x08080707 },
+
+       /* performance setting */
+       { DDRC_ODTCFG(0), 0x0b060908 },
+       { DDRC_ODTMAP(0), 0x00000000 },
+       { DDRC_SCHED(0), 0x29511505 },
+       { DDRC_SCHED1(0), 0x0000002c },
+       { DDRC_PERFHPR1(0), 0x5900575b },
+       /* 150T starve and 0x90 max tran len */
+       { DDRC_PERFLPR1(0), 0x90000096 },
+       /* 300T starve and 0x10 max tran len */
+       { DDRC_PERFWR1(0), 0x1000012c },
+       { DDRC_DBG0(0), 0x00000016 },
+       { DDRC_DBG1(0), 0x00000000 },
+       { DDRC_DBGCMD(0), 0x00000000 },
+       { DDRC_SWCTL(0), 0x00000001 },
+       { DDRC_POISONCFG(0), 0x00000011 },
+       { DDRC_PCCFG(0), 0x00000111 },
+       { DDRC_PCFGR_0(0), 0x000010f3 },
+       { DDRC_PCFGW_0(0), 0x000072ff },
+       { DDRC_PCTRL_0(0), 0x00000001 },
+       /* disable Read Qos*/
+       { DDRC_PCFGQOS0_0(0), 0x00000e00 },
+       { DDRC_PCFGQOS1_0(0), 0x0062ffff },
+       /* disable Write Qos*/
+       { DDRC_PCFGWQOS0_0(0), 0x00000e00 },
+       { DDRC_PCFGWQOS1_0(0), 0x0000ffff },
+
+       /* Frequency 1: 400mbps */
+       { DDRC_FREQ1_DRAMTMG0(0), 0x0d0b010c },
+       { DDRC_FREQ1_DRAMTMG1(0), 0x00030410 },
+       { DDRC_FREQ1_DRAMTMG2(0), 0x0305090c },
+       { DDRC_FREQ1_DRAMTMG3(0), 0x00505006 },
+       { DDRC_FREQ1_DRAMTMG4(0), 0x05040305 },
+       { DDRC_FREQ1_DRAMTMG5(0), 0x0d0e0504 },
+       { DDRC_FREQ1_DRAMTMG6(0), 0x0a060004 },
+       { DDRC_FREQ1_DRAMTMG7(0), 0x0000090e },
+       { DDRC_FREQ1_DRAMTMG14(0), 0x00000032 },
+       { DDRC_FREQ1_DRAMTMG15(0), 0x00000000 },
+       { DDRC_FREQ1_DRAMTMG17(0), 0x0036001b },
+       { DDRC_FREQ1_DERATEINT(0), 0x7e9fbeb1 },
+       { DDRC_FREQ1_DFITMG0(0), 0x03818200 },
+       { DDRC_FREQ1_DFITMG2(0), 0x00000000 },
+       { DDRC_FREQ1_RFSHTMG(0), 0x000C001c },
+       { DDRC_FREQ1_INIT3(0), 0x00840000 },
+       { DDRC_FREQ1_INIT4(0), 0x00310008 },
+       { DDRC_FREQ1_INIT6(0), 0x0066004a },
+       { DDRC_FREQ1_INIT7(0), 0x0006004a },
+
+       /* Frequency 2: 100mbps */
+       { DDRC_FREQ2_DRAMTMG0(0), 0x0d0b010c },
+       { DDRC_FREQ2_DRAMTMG1(0), 0x00030410 },
+       { DDRC_FREQ2_DRAMTMG2(0), 0x0305090c },
+       { DDRC_FREQ2_DRAMTMG3(0), 0x00505006 },
+       { DDRC_FREQ2_DRAMTMG4(0), 0x05040305 },
+       { DDRC_FREQ2_DRAMTMG5(0), 0x0d0e0504 },
+       { DDRC_FREQ2_DRAMTMG6(0), 0x0a060004 },
+       { DDRC_FREQ2_DRAMTMG7(0), 0x0000090e },
+       { DDRC_FREQ2_DRAMTMG14(0), 0x00000032 },
+       { DDRC_FREQ2_DRAMTMG17(0), 0x0036001b },
+       { DDRC_FREQ2_DERATEINT(0), 0x7e9fbeb1 },
+       { DDRC_FREQ2_DFITMG0(0), 0x03818200 },
+       { DDRC_FREQ2_DFITMG2(0), 0x00000000 },
+       { DDRC_FREQ2_RFSHTMG(0), 0x00030007 },
+       { DDRC_FREQ2_INIT3(0), 0x00840000 },
+       { DDRC_FREQ2_INIT4(0), 0x00310008 },
+       { DDRC_FREQ2_INIT6(0), 0x0066004a },
+       { DDRC_FREQ2_INIT7(0), 0x0006004a },
+};
+
+/* PHY Initialize Configuration */
+struct dram_cfg_param lpddr4_ddrphy_cfg[] = {
+       { 0x20110, 0x02 },
+       { 0x20111, 0x03 },
+       { 0x20112, 0x04 },
+       { 0x20113, 0x05 },
+       { 0x20114, 0x00 },
+       { 0x20115, 0x01 },
+
+       { 0x1005f, 0x1ff },
+       { 0x1015f, 0x1ff },
+       { 0x1105f, 0x1ff },
+       { 0x1115f, 0x1ff },
+       { 0x1205f, 0x1ff },
+       { 0x1215f, 0x1ff },
+       { 0x1305f, 0x1ff },
+       { 0x1315f, 0x1ff },
+
+       { 0x11005f, 0x1ff },
+       { 0x11015f, 0x1ff },
+       { 0x11105f, 0x1ff },
+       { 0x11115f, 0x1ff },
+       { 0x11205f, 0x1ff },
+       { 0x11215f, 0x1ff },
+       { 0x11305f, 0x1ff },
+       { 0x11315f, 0x1ff },
+
+       { 0x21005f, 0x1ff },
+       { 0x21015f, 0x1ff },
+       { 0x21105f, 0x1ff },
+       { 0x21115f, 0x1ff },
+       { 0x21205f, 0x1ff },
+       { 0x21215f, 0x1ff },
+       { 0x21305f, 0x1ff },
+       { 0x21315f, 0x1ff },
+
+       { 0x55, 0x1ff },
+       { 0x1055, 0x1ff },
+       { 0x2055, 0x1ff },
+       { 0x3055, 0x1ff },
+       { 0x4055, 0x1ff },
+       { 0x5055, 0x1ff },
+       { 0x6055, 0x1ff },
+       { 0x7055, 0x1ff },
+       { 0x8055, 0x1ff },
+       { 0x9055, 0x1ff },
+
+       { 0x200c5, 0x19 },
+       { 0x1200c5, 0x7 },
+       { 0x2200c5, 0x7 },
+
+       { 0x2002e, 0x2 },
+       { 0x12002e, 0x2 },
+       { 0x22002e, 0x2 },
+
+       { 0x90204, 0x0 },
+       { 0x190204, 0x0 },
+       { 0x290204, 0x0 },
+
+#ifdef WR_POST_EXT_3200
+       { 0x20024, 0xeb },
+#else
+       { 0x20024, 0xab },
+#endif
+       { 0x2003a, 0x0 },
+       { 0x120024, 0xab },
+       { 0x2003a, 0x0 },
+       { 0x220024, 0xab },
+       { 0x2003a, 0x0 },
+       { 0x20056, 0x3 },
+       { 0x120056, 0xa },
+       { 0x220056, 0xa },
+       { 0x1004d, 0xe00 },
+       { 0x1014d, 0xe00 },
+       { 0x1104d, 0xe00 },
+       { 0x1114d, 0xe00 },
+       { 0x1204d, 0xe00 },
+       { 0x1214d, 0xe00 },
+       { 0x1304d, 0xe00 },
+       { 0x1314d, 0xe00 },
+       { 0x11004d, 0xe00 },
+       { 0x11014d, 0xe00 },
+       { 0x11104d, 0xe00 },
+       { 0x11114d, 0xe00 },
+       { 0x11204d, 0xe00 },
+       { 0x11214d, 0xe00 },
+       { 0x11304d, 0xe00 },
+       { 0x11314d, 0xe00 },
+       { 0x21004d, 0xe00 },
+       { 0x21014d, 0xe00 },
+       { 0x21104d, 0xe00 },
+       { 0x21114d, 0xe00 },
+       { 0x21204d, 0xe00 },
+       { 0x21214d, 0xe00 },
+       { 0x21304d, 0xe00 },
+       { 0x21314d, 0xe00 },
+
+       { 0x10049, 0xfbe },
+       { 0x10149, 0xfbe },
+       { 0x11049, 0xfbe },
+       { 0x11149, 0xfbe },
+       { 0x12049, 0xfbe },
+       { 0x12149, 0xfbe },
+       { 0x13049, 0xfbe },
+       { 0x13149, 0xfbe },
+       { 0x110049, 0xfbe },
+       { 0x110149, 0xfbe },
+       { 0x111049, 0xfbe },
+       { 0x111149, 0xfbe },
+       { 0x112049, 0xfbe },
+       { 0x112149, 0xfbe },
+       { 0x113049, 0xfbe },
+       { 0x113149, 0xfbe },
+       { 0x210049, 0xfbe },
+       { 0x210149, 0xfbe },
+       { 0x211049, 0xfbe },
+       { 0x211149, 0xfbe },
+       { 0x212049, 0xfbe },
+       { 0x212149, 0xfbe },
+       { 0x213049, 0xfbe },
+       { 0x213149, 0xfbe },
+
+       { 0x43, ((LPDDR4_PHY_ADDR_RON << 5) | LPDDR4_PHY_ADDR_RON) },
+       { 0x1043, ((LPDDR4_PHY_ADDR_RON << 5) | LPDDR4_PHY_ADDR_RON) },
+       { 0x2043, ((LPDDR4_PHY_ADDR_RON << 5) | LPDDR4_PHY_ADDR_RON) },
+       { 0x3043, ((LPDDR4_PHY_ADDR_RON << 5) | LPDDR4_PHY_ADDR_RON) },
+       { 0x4043, ((LPDDR4_PHY_ADDR_RON << 5) | LPDDR4_PHY_ADDR_RON) },
+       { 0x5043, ((LPDDR4_PHY_ADDR_RON << 5) | LPDDR4_PHY_ADDR_RON) },
+       { 0x6043, ((LPDDR4_PHY_ADDR_RON << 5) | LPDDR4_PHY_ADDR_RON) },
+       { 0x7043, ((LPDDR4_PHY_ADDR_RON << 5) | LPDDR4_PHY_ADDR_RON) },
+       { 0x8043, ((LPDDR4_PHY_ADDR_RON << 5) | LPDDR4_PHY_ADDR_RON) },
+       { 0x9043, ((LPDDR4_PHY_ADDR_RON << 5) | LPDDR4_PHY_ADDR_RON) },
+
+       { 0x20018, 0x3 },
+       { 0x20075, 0x4 },
+       { 0x20050, 0x0 },
+       { 0x20008, 0x320 },
+       { 0x120008, 0x64 },
+       { 0x220008, 0x19 },
+       { 0x20088, 0x9 },
+       { 0x200b2, 0x104 },
+       { 0x10043, 0x5a1 },
+       { 0x10143, 0x5a1 },
+       { 0x11043, 0x5a1 },
+       { 0x11143, 0x5a1 },
+       { 0x12043, 0x5a1 },
+       { 0x12143, 0x5a1 },
+       { 0x13043, 0x5a1 },
+       { 0x13143, 0x5a1 },
+       { 0x1200b2, 0x104 },
+       { 0x110043, 0x5a1 },
+       { 0x110143, 0x5a1 },
+       { 0x111043, 0x5a1 },
+       { 0x111143, 0x5a1 },
+       { 0x112043, 0x5a1 },
+       { 0x112143, 0x5a1 },
+       { 0x113043, 0x5a1 },
+       { 0x113143, 0x5a1 },
+       { 0x2200b2, 0x104 },
+       { 0x210043, 0x5a1 },
+       { 0x210143, 0x5a1 },
+       { 0x211043, 0x5a1 },
+       { 0x211143, 0x5a1 },
+       { 0x212043, 0x5a1 },
+       { 0x212143, 0x5a1 },
+       { 0x213043, 0x5a1 },
+       { 0x213143, 0x5a1 },
+       { 0x200fa, 0x1 },
+       { 0x1200fa, 0x1 },
+       { 0x2200fa, 0x1 },
+       { 0x20019, 0x1 },
+       { 0x120019, 0x1 },
+       { 0x220019, 0x1 },
+       { 0x200f0, 0x660 },
+       { 0x200f1, 0x0 },
+       { 0x200f2, 0x4444 },
+       { 0x200f3, 0x8888 },
+       { 0x200f4, 0x5665 },
+       { 0x200f5, 0x0 },
+       { 0x200f6, 0x0 },
+       { 0x200f7, 0xf000 },
+       { 0x20025, 0x0 },
+       { 0x2002d, 0x0 },
+       { 0x12002d, 0x0 },
+       { 0x22002d, 0x0 },
+
+       { 0x200c7, 0x80 },
+       { 0x1200c7, 0x80 },
+       { 0x2200c7, 0x80 },
+       { 0x200ca, 0x106 },
+       { 0x1200ca, 0x106 },
+       { 0x2200ca, 0x106 },
+};
+
+/* P0 message block paremeter for training firmware */
+struct dram_cfg_param lpddr4_fsp0_cfg[] = {
+       { 0xd0000, 0x0 },
+       { 0x54000, 0x0 },
+       { 0x54001, 0x0 },
+       { 0x54002, 0x0 },
+       { 0x54003, 0xc80 },
+       { 0x54004, 0x2 },
+       { 0x54005, ((LPDDR4_PHY_RON << 8) | LPDDR4_PHY_RTT) }, /* PHY Ron/Rtt */
+       { 0x54006, LPDDR4_PHY_VREF_VALUE },
+       { 0x54007, 0x0 },
+       { 0x54008, 0x131f },
+       { 0x54009, LPDDR4_HDT_CTL_3200_1D },
+       { 0x5400a, 0x0 },
+       { 0x5400b, 0x2 },
+       { 0x5400c, 0x0 },
+       { 0x5400d, (LPDDR4_CATRAIN_3200_1d << 8) },
+       { 0x5400e, 0x0 },
+       { 0x5400f, 0x0 },
+       { 0x54010, 0x0 },
+       { 0x54011, 0x0 },
+       { 0x54012, 0x310 },
+       { 0x54013, 0x0 },
+       { 0x54014, 0x0 },
+       { 0x54015, 0x0 },
+       { 0x54016, 0x0 },
+       { 0x54017, 0x0 },
+       { 0x54018, 0x0 },
+
+       { 0x54019, 0x2dd4 },
+#ifdef WR_POST_EXT_3200
+       { 0x5401a, (((LPDDR4_RON) << 3) | 0x3) },
+#else
+       { 0x5401a, (((LPDDR4_RON) << 3) | 0x1) },
+#endif
+       { 0x5401b, ((LPDDR4_VREF_VALUE_CA << 8) |
+                   (LPDDR4_RTT_CA_BANK0 << 4) | LPDDR4_RTT_DQ) },
+       { 0x5401c, ((LPDDR4_VREF_VALUE_DQ_RANK0 << 8) | 0x08) },
+       { 0x5401d, 0x0 },
+       { 0x5401e, LPDDR4_MR22_RANK0 },
+       { 0x5401f, 0x2dd4 },
+#ifdef WR_POST_EXT_3200
+       { 0x54020, (((LPDDR4_RON) << 3) | 0x3) },
+#else
+       { 0x54020, (((LPDDR4_RON) << 3) | 0x1) },
+#endif
+       { 0x54021, ((LPDDR4_VREF_VALUE_CA << 8) |
+                   (LPDDR4_RTT_CA_BANK1 << 4) | LPDDR4_RTT_DQ) },
+       { 0x54022, ((LPDDR4_VREF_VALUE_DQ_RANK1 << 8) | 0x08) },
+       { 0x54023, 0x0 },
+       { 0x54024, LPDDR4_MR22_RANK1 },
+
+       { 0x54025, 0x0 },
+       { 0x54026, 0x0 },
+       { 0x54027, 0x0 },
+       { 0x54028, 0x0 },
+       { 0x54029, 0x0 },
+       { 0x5402a, 0x0 },
+       { 0x5402b, 0x1000 },
+       { 0x5402c, 0x3 },
+       { 0x5402d, 0x0 },
+       { 0x5402e, 0x0 },
+       { 0x5402f, 0x0 },
+       { 0x54030, 0x0 },
+       { 0x54031, 0x0 },
+       { 0x54032, 0xd400 },
+       /* MR3/MR2 */
+#ifdef WR_POST_EXT_3200
+       { 0x54033, ((((LPDDR4_RON) << 3) | 0x3) << 8) | 0x2d /*0x312d*/ },
+#else
+       { 0x54033, ((((LPDDR4_RON) << 3) | 0x1) << 8) | 0x2d/*0x312d*/ },
+#endif
+       /* MR11/MR4 */
+       { 0x54034, (((LPDDR4_RTT_CA_BANK0 << 4) | LPDDR4_RTT_DQ) << 8) },
+       /* self:0x284d//MR13/MR12 */
+       { 0x54035, (0x0800 | LPDDR4_VREF_VALUE_CA)/*0x084d*/ },
+       /* MR16/MR14*/
+       { 0x54036, LPDDR4_VREF_VALUE_DQ_RANK0/*0x4d*/ },
+       { 0x54037, (LPDDR4_MR22_RANK0 << 8)/*0x500*/ },
+       /* MR1 */
+       { 0x54038, 0xd400 },
+       /* MR3/MR2 */
+#ifdef WR_POST_EXT_3200
+       { 0x54039, ((((LPDDR4_RON) << 3) | 0x3) << 8) | 0x2d/*0x312d*/ },
+#else
+       { 0x54039, ((((LPDDR4_RON) << 3) | 0x1) << 8) | 0x2d/*0x312d*/ },
+#endif
+       /* MR11/MR4 */
+       { 0x5403a, (((LPDDR4_RTT_CA_BANK1 << 4) | LPDDR4_RTT_DQ) << 8) },
+       /* self:0x284d//MR13/MR12 */
+       { 0x5403b, (0x0800 | LPDDR4_VREF_VALUE_CA)/*0x084d*/ },
+       /* MR16/MR14 */
+       { 0x5403c, LPDDR4_VREF_VALUE_DQ_RANK1/*0x4d*/ },
+       { 0x5403d, (LPDDR4_MR22_RANK1 << 8)/*0x500*/ },
+       /* { 0x5403d, 0x500 } */
+       { 0x5403d, (LPDDR4_MR22_RANK1 << 8)/*0x500*/ },
+       { 0x5403e, 0x0 },
+       { 0x5403f, 0x0 },
+       { 0x54040, 0x0 },
+       { 0x54041, 0x0 },
+       { 0x54042, 0x0 },
+       { 0x54043, 0x0 },
+       { 0x54044, 0x0 },
+       { 0xd0000, 0x1 },
+};
+
+/* P1 message block paremeter for training firmware */
+struct dram_cfg_param lpddr4_fsp1_cfg[] = {
+       { 0xd0000, 0x0 },
+       { 0x54000, 0x0 },
+       { 0x54001, 0x0 },
+       { 0x54002, 0x101 },
+       { 0x54003, 0x190 },
+       { 0x54004, 0x2 },
+       /* PHY Ron/Rtt */
+       { 0x54005, ((LPDDR4_PHY_RON << 8) | LPDDR4_PHY_RTT)/*0x2828*/ },
+       { 0x54006, LPDDR4_PHY_VREF_VALUE },
+       { 0x54007, 0x0 },
+       { 0x54008, LPDDR4_TRAIN_SEQ_400 },
+       { 0x54009, LPDDR4_HDT_CTL_400_1D },
+       { 0x5400a, 0x0 },
+       { 0x5400b, 0x2 },
+       { 0x5400c, 0x0 },
+       { 0x5400d, (LPDDR4_CATRAIN_400 << 8) },
+       { 0x5400e, 0x0 },
+       { 0x5400f, 0x0 },
+       { 0x54010, 0x0 },
+       { 0x54011, 0x0 },
+       { 0x54012, 0x310 },
+       { 0x54013, 0x0 },
+       { 0x54014, 0x0 },
+       { 0x54015, 0x0 },
+       { 0x54016, 0x0 },
+       { 0x54017, 0x0 },
+       { 0x54018, 0x0 },
+       { 0x54019, 0x84 },
+       /* MR4/MR3 */
+       { 0x5401a, (((LPDDR4_RON) << 3) | 0x1)/*0x31*/ },
+       /* MR12/MR11 */
+       { 0x5401b, ((LPDDR4_VREF_VALUE_CA << 8) | (LPDDR4_RTT_CA << 4) |
+                   LPDDR4_RTT_DQ)/*0x4d46*/ },
+       /* self:0x4d28//MR14/MR13 */
+       { 0x5401c, ((LPDDR4_VREF_VALUE_DQ_RANK0 << 8) | 0x08)/*0x4d08*/ },
+       { 0x5401d, 0x0 },
+       { 0x5401e, LPDDR4_MR22_RANK0/*0x5*/ },
+       { 0x5401f, 0x84 },
+       { 0x54020, (((LPDDR4_RON) << 3) | 0x1)/*0x31*/ }, /* MR4/MR3 */
+       { 0x54021, ((LPDDR4_VREF_VALUE_CA << 8) | (LPDDR4_RTT_CA << 4) |
+                   LPDDR4_RTT_DQ)/*0x4d46*/ },/* MR12/MR11 */
+       /* self:0x4d28//MR14/MR13 */
+       { 0x54022, ((LPDDR4_VREF_VALUE_DQ_RANK1 << 8) | 0x08)/*0x4d08*/ },
+       { 0x54023, 0x0 },
+       { 0x54024, LPDDR4_MR22_RANK1 },
+       { 0x54025, 0x0 },
+       { 0x54026, 0x0 },
+       { 0x54027, 0x0 },
+       { 0x54028, 0x0 },
+       { 0x54029, 0x0 },
+       { 0x5402a, 0x0 },
+       { 0x5402b, 0x1000 },
+       { 0x5402c, 0x3 },
+       { 0x5402d, 0x0 },
+       { 0x5402e, 0x0 },
+       { 0x5402f, 0x0 },
+       { 0x54030, 0x0 },
+       { 0x54031, 0x0 },
+       { 0x54032, 0x8400 },
+       { 0x54033, ((((LPDDR4_RON) << 3) | 0x1) << 8) | 0x00 },
+       { 0x54034, (((LPDDR4_RTT_CA << 4) | LPDDR4_RTT_DQ) << 8) },
+       { 0x54035, (0x0800 | LPDDR4_VREF_VALUE_CA) },
+       { 0x54036, LPDDR4_VREF_VALUE_DQ_RANK0 },
+       { 0x54037, (LPDDR4_MR22_RANK0 << 8) },
+       { 0x54038, 0x8400 },
+       { 0x54039, ((((LPDDR4_RON) << 3) | 0x1) << 8) | 0x00 },
+       { 0x5403a, (((LPDDR4_RTT_CA << 4) | LPDDR4_RTT_DQ) << 8) },
+       { 0x5403b, (0x0800 | LPDDR4_VREF_VALUE_CA) },
+       { 0x5403c, LPDDR4_VREF_VALUE_DQ_RANK1 },
+       { 0x5403d, (LPDDR4_MR22_RANK1 << 8) },
+       { 0x5403e, 0x0 },
+       { 0x5403f, 0x0 },
+       { 0x54040, 0x0 },
+       { 0x54041, 0x0 },
+       { 0x54042, 0x0 },
+       { 0x54043, 0x0 },
+       { 0x54044, 0x0 },
+       { 0xd0000, 0x1 },
+};
+
+/* P2 message block paremeter for training firmware */
+struct dram_cfg_param lpddr4_fsp2_cfg[] = {
+       { 0xd0000, 0x0 },
+       { 0x54000, 0x0 },
+       { 0x54001, 0x0 },
+       { 0x54002, 0x102 },
+       { 0x54003, 0x64 },
+       { 0x54004, 0x2 },
+       { 0x54005, ((LPDDR4_PHY_RON << 8) | LPDDR4_PHY_RTT) },
+       { 0x54006, LPDDR4_PHY_VREF_VALUE },
+       { 0x54007, 0x0 },
+       { 0x54008, LPDDR4_TRAIN_SEQ_100 },
+       { 0x54009, LPDDR4_HDT_CTL_100_1D },
+       { 0x5400a, 0x0 },
+       { 0x5400b, 0x2 },
+       { 0x5400c, 0x0 },
+       { 0x5400d, (LPDDR4_CATRAIN_100 << 8) },
+       { 0x5400e, 0x0 },
+       { 0x5400f, 0x0 },
+       { 0x54010, 0x0 },
+       { 0x54011, 0x0 },
+       { 0x54012, 0x310 },
+       { 0x54013, 0x0 },
+       { 0x54014, 0x0 },
+       { 0x54015, 0x0 },
+       { 0x54016, 0x0 },
+       { 0x54017, 0x0 },
+       { 0x54018, 0x0 },
+       { 0x54019, 0x84 },
+       { 0x5401a, (((LPDDR4_RON) << 3) | 0x1) },
+       { 0x5401b, ((LPDDR4_VREF_VALUE_CA << 8) | (LPDDR4_RTT_CA << 4) |
+                   LPDDR4_RTT_DQ) },
+       { 0x5401c, ((LPDDR4_VREF_VALUE_DQ_RANK0 << 8) | 0x08) },
+       { 0x5401d, 0x0 },
+       { 0x5401e, LPDDR4_MR22_RANK0 },
+       { 0x5401f, 0x84 },
+       { 0x54020, (((LPDDR4_RON) << 3) | 0x1) },
+       { 0x54021, ((LPDDR4_VREF_VALUE_CA << 8) | (LPDDR4_RTT_CA << 4) |
+                   LPDDR4_RTT_DQ) },
+       { 0x54022, ((LPDDR4_VREF_VALUE_DQ_RANK1 << 8) | 0x08) },
+       { 0x54023, 0x0 },
+       { 0x54024, LPDDR4_MR22_RANK1 },
+       { 0x54025, 0x0 },
+       { 0x54026, 0x0 },
+       { 0x54027, 0x0 },
+       { 0x54028, 0x0 },
+       { 0x54029, 0x0 },
+       { 0x5402a, 0x0 },
+       { 0x5402b, 0x1000 },
+       { 0x5402c, 0x3 },
+       { 0x5402d, 0x0 },
+       { 0x5402e, 0x0 },
+       { 0x5402f, 0x0 },
+       { 0x54030, 0x0 },
+       { 0x54031, 0x0 },
+       { 0x54032, 0x8400 },
+       { 0x54033, ((((LPDDR4_RON) << 3) | 0x1) << 8) | 0x00 },
+       { 0x54034, (((LPDDR4_RTT_CA << 4) | LPDDR4_RTT_DQ) << 8) },
+       { 0x54035, (0x0800 | LPDDR4_VREF_VALUE_CA) },
+       { 0x54036, LPDDR4_VREF_VALUE_DQ_RANK0 },
+       { 0x54037, (LPDDR4_MR22_RANK0 << 8) },
+       { 0x54038, 0x8400 },
+       { 0x54039, ((((LPDDR4_RON) << 3) | 0x1) << 8) | 0x00 },
+       { 0x5403a, (((LPDDR4_RTT_CA << 4) | LPDDR4_RTT_DQ) << 8) },
+       { 0x5403b, (0x0800 | LPDDR4_VREF_VALUE_CA) },
+       { 0x5403c, LPDDR4_VREF_VALUE_DQ_RANK1 },
+       { 0x5403d, (LPDDR4_MR22_RANK1 << 8) },
+       { 0x5403e, 0x0 },
+       { 0x5403f, 0x0 },
+       { 0x54040, 0x0 },
+       { 0x54041, 0x0 },
+       { 0x54042, 0x0 },
+       { 0x54043, 0x0 },
+       { 0x54044, 0x0 },
+       { 0xd0000, 0x1 },
+};
+
+/* P0 2D message block paremeter for training firmware */
+struct dram_cfg_param lpddr4_fsp0_2d_cfg[] = {
+       { 0xd0000, 0x0 },
+       { 0x54000, 0x0 },
+       { 0x54001, 0x0 },
+       { 0x54002, 0x0 },
+       { 0x54003, 0xc80 },
+       { 0x54004, 0x2 },
+       { 0x54005, ((LPDDR4_PHY_RON << 8) | LPDDR4_PHY_RTT) },
+       { 0x54006, LPDDR4_PHY_VREF_VALUE },
+       { 0x54007, 0x0 },
+       { 0x54008, 0x61 },
+       { 0x54009, LPDDR4_HDT_CTL_2D },
+       { 0x5400a, 0x0 },
+       { 0x5400b, 0x2 },
+       { 0x5400c, 0x0 },
+       { 0x5400d, (LPDDR4_CATRAIN_3200_2d << 8) },
+       { 0x5400e, 0x0 },
+       { 0x5400f, (LPDDR4_2D_SHARE << 8) | 0x00 },
+       { 0x54010, LPDDR4_2D_WEIGHT },
+       { 0x54011, 0x0 },
+       { 0x54012, 0x310 },
+       { 0x54013, 0x0 },
+       { 0x54014, 0x0 },
+       { 0x54015, 0x0 },
+       { 0x54016, 0x0 },
+       { 0x54017, 0x0 },
+       { 0x54018, 0x0 },
+       { 0x54019, 0x2dd4 },
+#ifdef WR_POST_EXT_3200
+       { 0x5401a, (((LPDDR4_RON) << 3) | 0x3) },
+#else
+       { 0x5401a, (((LPDDR4_RON) << 3) | 0x1) },
+#endif
+       { 0x5401b, ((LPDDR4_VREF_VALUE_CA << 8) |
+                   (LPDDR4_RTT_CA_BANK0 << 4) | LPDDR4_RTT_DQ) },
+       { 0x5401c, ((LPDDR4_VREF_VALUE_DQ_RANK0 << 8) | 0x08) },
+       { 0x5401d, 0x0 },
+       { 0x5401e, LPDDR4_MR22_RANK0 },
+       { 0x5401f, 0x2dd4 },
+#ifdef WR_POST_EXT_3200
+       { 0x54020, (((LPDDR4_RON) << 3) | 0x3) },
+#else
+       { 0x54020, (((LPDDR4_RON) << 3) | 0x1) },
+#endif
+       { 0x54021, ((LPDDR4_VREF_VALUE_CA << 8) |
+                   (LPDDR4_RTT_CA_BANK1 << 4) | LPDDR4_RTT_DQ) },
+       { 0x54022, ((LPDDR4_VREF_VALUE_DQ_RANK1 << 8) | 0x08) },
+       { 0x54023, 0x0 },
+       { 0x54024, LPDDR4_MR22_RANK1 },
+       { 0x54025, 0x0 },
+       { 0x54026, 0x0 },
+       { 0x54027, 0x0 },
+       { 0x54028, 0x0 },
+       { 0x54029, 0x0 },
+       { 0x5402a, 0x0 },
+       { 0x5402b, 0x1000 },
+       { 0x5402c, 0x3 },
+       { 0x5402d, 0x0 },
+       { 0x5402e, 0x0 },
+       { 0x5402f, 0x0 },
+       { 0x54030, 0x0 },
+       { 0x54031, 0x0 },
+
+       { 0x54032, 0xd400 },
+#ifdef WR_POST_EXT_3200
+       { 0x54033, ((((LPDDR4_RON) << 3) | 0x3) << 8) | 0x2d },
+#else
+       { 0x54033, ((((LPDDR4_RON) << 3) | 0x1) << 8) | 0x2d },
+#endif
+       { 0x54034, (((LPDDR4_RTT_CA_BANK0 << 4) | LPDDR4_RTT_DQ) << 8) },
+       { 0x54035, (0x0800 | LPDDR4_VREF_VALUE_CA) },
+       { 0x54036, LPDDR4_VREF_VALUE_DQ_RANK0 },
+       { 0x54037, (LPDDR4_MR22_RANK0 << 8) },
+       { 0x54038, 0xd400 },
+#ifdef WR_POST_EXT_3200
+       { 0x54039, ((((LPDDR4_RON) << 3) | 0x3) << 8) | 0x2d },
+#else
+       { 0x54039, ((((LPDDR4_RON) << 3) | 0x1) << 8) | 0x2d },
+#endif
+       { 0x5403a, (((LPDDR4_RTT_CA_BANK1 << 4) | LPDDR4_RTT_DQ) << 8) },
+       { 0x5403b, (0x0800 | LPDDR4_VREF_VALUE_CA) },
+       { 0x5403c, LPDDR4_VREF_VALUE_DQ_RANK1 },
+       { 0x5403d, (LPDDR4_MR22_RANK1 << 8) },
+       { 0x5403e, 0x0 },
+       { 0x5403f, 0x0 },
+       { 0x54040, 0x0 },
+       { 0x54041, 0x0 },
+       { 0x54042, 0x0 },
+       { 0x54043, 0x0 },
+       { 0x54044, 0x0 },
+       { 0xd0000, 0x1 },
+};
+
+/* DRAM PHY init engine image */
+struct dram_cfg_param lpddr4_phy_pie[] = {
+       { 0xd0000, 0x0 },
+       { 0x90000, 0x10 },
+       { 0x90001, 0x400 },
+       { 0x90002, 0x10e },
+       { 0x90003, 0x0 },
+       { 0x90004, 0x0 },
+       { 0x90005, 0x8 },
+       { 0x90029, 0xb },
+       { 0x9002a, 0x480 },
+       { 0x9002b, 0x109 },
+       { 0x9002c, 0x8 },
+       { 0x9002d, 0x448 },
+       { 0x9002e, 0x139 },
+       { 0x9002f, 0x8 },
+       { 0x90030, 0x478 },
+       { 0x90031, 0x109 },
+       { 0x90032, 0x0 },
+       { 0x90033, 0xe8 },
+       { 0x90034, 0x109 },
+       { 0x90035, 0x2 },
+       { 0x90036, 0x10 },
+       { 0x90037, 0x139 },
+       { 0x90038, 0xf },
+       { 0x90039, 0x7c0 },
+       { 0x9003a, 0x139 },
+       { 0x9003b, 0x44 },
+       { 0x9003c, 0x630 },
+       { 0x9003d, 0x159 },
+       { 0x9003e, 0x14f },
+       { 0x9003f, 0x630 },
+       { 0x90040, 0x159 },
+       { 0x90041, 0x47 },
+       { 0x90042, 0x630 },
+       { 0x90043, 0x149 },
+       { 0x90044, 0x4f },
+       { 0x90045, 0x630 },
+       { 0x90046, 0x179 },
+       { 0x90047, 0x8 },
+       { 0x90048, 0xe0 },
+       { 0x90049, 0x109 },
+       { 0x9004a, 0x0 },
+       { 0x9004b, 0x7c8 },
+       { 0x9004c, 0x109 },
+       { 0x9004d, 0x0 },
+       { 0x9004e, 0x1 },
+       { 0x9004f, 0x8 },
+       { 0x90050, 0x0 },
+       { 0x90051, 0x45a },
+       { 0x90052, 0x9 },
+       { 0x90053, 0x0 },
+       { 0x90054, 0x448 },
+       { 0x90055, 0x109 },
+       { 0x90056, 0x40 },
+       { 0x90057, 0x630 },
+       { 0x90058, 0x179 },
+       { 0x90059, 0x1 },
+       { 0x9005a, 0x618 },
+       { 0x9005b, 0x109 },
+       { 0x9005c, 0x40c0 },
+       { 0x9005d, 0x630 },
+       { 0x9005e, 0x149 },
+       { 0x9005f, 0x8 },
+       { 0x90060, 0x4 },
+       { 0x90061, 0x48 },
+       { 0x90062, 0x4040 },
+       { 0x90063, 0x630 },
+       { 0x90064, 0x149 },
+       { 0x90065, 0x0 },
+       { 0x90066, 0x4 },
+       { 0x90067, 0x48 },
+       { 0x90068, 0x40 },
+       { 0x90069, 0x630 },
+       { 0x9006a, 0x149 },
+       { 0x9006b, 0x10 },
+       { 0x9006c, 0x4 },
+       { 0x9006d, 0x18 },
+       { 0x9006e, 0x0 },
+       { 0x9006f, 0x4 },
+       { 0x90070, 0x78 },
+       { 0x90071, 0x549 },
+       { 0x90072, 0x630 },
+       { 0x90073, 0x159 },
+       { 0x90074, 0xd49 },
+       { 0x90075, 0x630 },
+       { 0x90076, 0x159 },
+       { 0x90077, 0x94a },
+       { 0x90078, 0x630 },
+       { 0x90079, 0x159 },
+       { 0x9007a, 0x441 },
+       { 0x9007b, 0x630 },
+       { 0x9007c, 0x149 },
+       { 0x9007d, 0x42 },
+       { 0x9007e, 0x630 },
+       { 0x9007f, 0x149 },
+       { 0x90080, 0x1 },
+       { 0x90081, 0x630 },
+       { 0x90082, 0x149 },
+       { 0x90083, 0x0 },
+       { 0x90084, 0xe0 },
+       { 0x90085, 0x109 },
+       { 0x90086, 0xa },
+       { 0x90087, 0x10 },
+       { 0x90088, 0x109 },
+       { 0x90089, 0x9 },
+       { 0x9008a, 0x3c0 },
+       { 0x9008b, 0x149 },
+       { 0x9008c, 0x9 },
+       { 0x9008d, 0x3c0 },
+       { 0x9008e, 0x159 },
+       { 0x9008f, 0x18 },
+       { 0x90090, 0x10 },
+       { 0x90091, 0x109 },
+       { 0x90092, 0x0 },
+       { 0x90093, 0x3c0 },
+       { 0x90094, 0x109 },
+       { 0x90095, 0x18 },
+       { 0x90096, 0x4 },
+       { 0x90097, 0x48 },
+       { 0x90098, 0x18 },
+       { 0x90099, 0x4 },
+       { 0x9009a, 0x58 },
+       { 0x9009b, 0xa },
+       { 0x9009c, 0x10 },
+       { 0x9009d, 0x109 },
+       { 0x9009e, 0x2 },
+       { 0x9009f, 0x10 },
+       { 0x900a0, 0x109 },
+       { 0x900a1, 0x5 },
+       { 0x900a2, 0x7c0 },
+       { 0x900a3, 0x109 },
+       { 0x900a4, 0x10 },
+       { 0x900a5, 0x10 },
+       { 0x900a6, 0x109 },
+       { 0x40000, 0x811 },
+       { 0x40020, 0x880 },
+       { 0x40040, 0x0 },
+       { 0x40060, 0x0 },
+       { 0x40001, 0x4008 },
+       { 0x40021, 0x83 },
+       { 0x40041, 0x4f },
+       { 0x40061, 0x0 },
+       { 0x40002, 0x4040 },
+       { 0x40022, 0x83 },
+       { 0x40042, 0x51 },
+       { 0x40062, 0x0 },
+       { 0x40003, 0x811 },
+       { 0x40023, 0x880 },
+       { 0x40043, 0x0 },
+       { 0x40063, 0x0 },
+       { 0x40004, 0x720 },
+       { 0x40024, 0xf },
+       { 0x40044, 0x1740 },
+       { 0x40064, 0x0 },
+       { 0x40005, 0x16 },
+       { 0x40025, 0x83 },
+       { 0x40045, 0x4b },
+       { 0x40065, 0x0 },
+       { 0x40006, 0x716 },
+       { 0x40026, 0xf },
+       { 0x40046, 0x2001 },
+       { 0x40066, 0x0 },
+       { 0x40007, 0x716 },
+       { 0x40027, 0xf },
+       { 0x40047, 0x2800 },
+       { 0x40067, 0x0 },
+       { 0x40008, 0x716 },
+       { 0x40028, 0xf },
+       { 0x40048, 0xf00 },
+       { 0x40068, 0x0 },
+       { 0x40009, 0x720 },
+       { 0x40029, 0xf },
+       { 0x40049, 0x1400 },
+       { 0x40069, 0x0 },
+       { 0x4000a, 0xe08 },
+       { 0x4002a, 0xc15 },
+       { 0x4004a, 0x0 },
+       { 0x4006a, 0x0 },
+       { 0x4000b, 0x623 },
+       { 0x4002b, 0x15 },
+       { 0x4004b, 0x0 },
+       { 0x4006b, 0x0 },
+       { 0x4000c, 0x4028 },
+       { 0x4002c, 0x80 },
+       { 0x4004c, 0x0 },
+       { 0x4006c, 0x0 },
+       { 0x4000d, 0xe08 },
+       { 0x4002d, 0xc1a },
+       { 0x4004d, 0x0 },
+       { 0x4006d, 0x0 },
+       { 0x4000e, 0x623 },
+       { 0x4002e, 0x1a },
+       { 0x4004e, 0x0 },
+       { 0x4006e, 0x0 },
+       { 0x4000f, 0x4040 },
+       { 0x4002f, 0x80 },
+       { 0x4004f, 0x0 },
+       { 0x4006f, 0x0 },
+       { 0x40010, 0x2604 },
+       { 0x40030, 0x15 },
+       { 0x40050, 0x0 },
+       { 0x40070, 0x0 },
+       { 0x40011, 0x708 },
+       { 0x40031, 0x5 },
+       { 0x40051, 0x0 },
+       { 0x40071, 0x2002 },
+       { 0x40012, 0x8 },
+       { 0x40032, 0x80 },
+       { 0x40052, 0x0 },
+       { 0x40072, 0x0 },
+       { 0x40013, 0x2604 },
+       { 0x40033, 0x1a },
+       { 0x40053, 0x0 },
+       { 0x40073, 0x0 },
+       { 0x40014, 0x708 },
+       { 0x40034, 0xa },
+       { 0x40054, 0x0 },
+       { 0x40074, 0x2002 },
+       { 0x40015, 0x4040 },
+       { 0x40035, 0x80 },
+       { 0x40055, 0x0 },
+       { 0x40075, 0x0 },
+       { 0x40016, 0x60a },
+       { 0x40036, 0x15 },
+       { 0x40056, 0x1200 },
+       { 0x40076, 0x0 },
+       { 0x40017, 0x61a },
+       { 0x40037, 0x15 },
+       { 0x40057, 0x1300 },
+       { 0x40077, 0x0 },
+       { 0x40018, 0x60a },
+       { 0x40038, 0x1a },
+       { 0x40058, 0x1200 },
+       { 0x40078, 0x0 },
+       { 0x40019, 0x642 },
+       { 0x40039, 0x1a },
+       { 0x40059, 0x1300 },
+       { 0x40079, 0x0 },
+       { 0x4001a, 0x4808 },
+       { 0x4003a, 0x880 },
+       { 0x4005a, 0x0 },
+       { 0x4007a, 0x0 },
+       { 0x900a7, 0x0 },
+       { 0x900a8, 0x790 },
+       { 0x900a9, 0x11a },
+       { 0x900aa, 0x8 },
+       { 0x900ab, 0x7aa },
+       { 0x900ac, 0x2a },
+       { 0x900ad, 0x10 },
+       { 0x900ae, 0x7b2 },
+       { 0x900af, 0x2a },
+       { 0x900b0, 0x0 },
+       { 0x900b1, 0x7c8 },
+       { 0x900b2, 0x109 },
+       { 0x900b3, 0x10 },
+       { 0x900b4, 0x2a8 },
+       { 0x900b5, 0x129 },
+       { 0x900b6, 0x8 },
+       { 0x900b7, 0x370 },
+       { 0x900b8, 0x129 },
+       { 0x900b9, 0xa },
+       { 0x900ba, 0x3c8 },
+       { 0x900bb, 0x1a9 },
+       { 0x900bc, 0xc },
+       { 0x900bd, 0x408 },
+       { 0x900be, 0x199 },
+       { 0x900bf, 0x14 },
+       { 0x900c0, 0x790 },
+       { 0x900c1, 0x11a },
+       { 0x900c2, 0x8 },
+       { 0x900c3, 0x4 },
+       { 0x900c4, 0x18 },
+       { 0x900c5, 0xe },
+       { 0x900c6, 0x408 },
+       { 0x900c7, 0x199 },
+       { 0x900c8, 0x8 },
+       { 0x900c9, 0x8568 },
+       { 0x900ca, 0x108 },
+       { 0x900cb, 0x18 },
+       { 0x900cc, 0x790 },
+       { 0x900cd, 0x16a },
+       { 0x900ce, 0x8 },
+       { 0x900cf, 0x1d8 },
+       { 0x900d0, 0x169 },
+       { 0x900d1, 0x10 },
+       { 0x900d2, 0x8558 },
+       { 0x900d3, 0x168 },
+       { 0x900d4, 0x70 },
+       { 0x900d5, 0x788 },
+       { 0x900d6, 0x16a },
+       { 0x900d7, 0x1ff8 },
+       { 0x900d8, 0x85a8 },
+       { 0x900d9, 0x1e8 },
+       { 0x900da, 0x50 },
+       { 0x900db, 0x798 },
+       { 0x900dc, 0x16a },
+       { 0x900dd, 0x60 },
+       { 0x900de, 0x7a0 },
+       { 0x900df, 0x16a },
+       { 0x900e0, 0x8 },
+       { 0x900e1, 0x8310 },
+       { 0x900e2, 0x168 },
+       { 0x900e3, 0x8 },
+       { 0x900e4, 0xa310 },
+       { 0x900e5, 0x168 },
+       { 0x900e6, 0xa },
+       { 0x900e7, 0x408 },
+       { 0x900e8, 0x169 },
+       { 0x900e9, 0x6e },
+       { 0x900ea, 0x0 },
+       { 0x900eb, 0x68 },
+       { 0x900ec, 0x0 },
+       { 0x900ed, 0x408 },
+       { 0x900ee, 0x169 },
+       { 0x900ef, 0x0 },
+       { 0x900f0, 0x8310 },
+       { 0x900f1, 0x168 },
+       { 0x900f2, 0x0 },
+       { 0x900f3, 0xa310 },
+       { 0x900f4, 0x168 },
+       { 0x900f5, 0x1ff8 },
+       { 0x900f6, 0x85a8 },
+       { 0x900f7, 0x1e8 },
+       { 0x900f8, 0x68 },
+       { 0x900f9, 0x798 },
+       { 0x900fa, 0x16a },
+       { 0x900fb, 0x78 },
+       { 0x900fc, 0x7a0 },
+       { 0x900fd, 0x16a },
+       { 0x900fe, 0x68 },
+       { 0x900ff, 0x790 },
+       { 0x90100, 0x16a },
+       { 0x90101, 0x8 },
+       { 0x90102, 0x8b10 },
+       { 0x90103, 0x168 },
+       { 0x90104, 0x8 },
+       { 0x90105, 0xab10 },
+       { 0x90106, 0x168 },
+       { 0x90107, 0xa },
+       { 0x90108, 0x408 },
+       { 0x90109, 0x169 },
+       { 0x9010a, 0x58 },
+       { 0x9010b, 0x0 },
+       { 0x9010c, 0x68 },
+       { 0x9010d, 0x0 },
+       { 0x9010e, 0x408 },
+       { 0x9010f, 0x169 },
+       { 0x90110, 0x0 },
+       { 0x90111, 0x8b10 },
+       { 0x90112, 0x168 },
+       { 0x90113, 0x0 },
+       { 0x90114, 0xab10 },
+       { 0x90115, 0x168 },
+       { 0x90116, 0x0 },
+       { 0x90117, 0x1d8 },
+       { 0x90118, 0x169 },
+       { 0x90119, 0x80 },
+       { 0x9011a, 0x790 },
+       { 0x9011b, 0x16a },
+       { 0x9011c, 0x18 },
+       { 0x9011d, 0x7aa },
+       { 0x9011e, 0x6a },
+       { 0x9011f, 0xa },
+       { 0x90120, 0x0 },
+       { 0x90121, 0x1e9 },
+       { 0x90122, 0x8 },
+       { 0x90123, 0x8080 },
+       { 0x90124, 0x108 },
+       { 0x90125, 0xf },
+       { 0x90126, 0x408 },
+       { 0x90127, 0x169 },
+       { 0x90128, 0xc },
+       { 0x90129, 0x0 },
+       { 0x9012a, 0x68 },
+       { 0x9012b, 0x9 },
+       { 0x9012c, 0x0 },
+       { 0x9012d, 0x1a9 },
+       { 0x9012e, 0x0 },
+       { 0x9012f, 0x408 },
+       { 0x90130, 0x169 },
+       { 0x90131, 0x0 },
+       { 0x90132, 0x8080 },
+       { 0x90133, 0x108 },
+       { 0x90134, 0x8 },
+       { 0x90135, 0x7aa },
+       { 0x90136, 0x6a },
+       { 0x90137, 0x0 },
+       { 0x90138, 0x8568 },
+       { 0x90139, 0x108 },
+       { 0x9013a, 0xb7 },
+       { 0x9013b, 0x790 },
+       { 0x9013c, 0x16a },
+       { 0x9013d, 0x1f },
+       { 0x9013e, 0x0 },
+       { 0x9013f, 0x68 },
+       { 0x90140, 0x8 },
+       { 0x90141, 0x8558 },
+       { 0x90142, 0x168 },
+       { 0x90143, 0xf },
+       { 0x90144, 0x408 },
+       { 0x90145, 0x169 },
+       { 0x90146, 0xc },
+       { 0x90147, 0x0 },
+       { 0x90148, 0x68 },
+       { 0x90149, 0x0 },
+       { 0x9014a, 0x408 },
+       { 0x9014b, 0x169 },
+       { 0x9014c, 0x0 },
+       { 0x9014d, 0x8558 },
+       { 0x9014e, 0x168 },
+       { 0x9014f, 0x8 },
+       { 0x90150, 0x3c8 },
+       { 0x90151, 0x1a9 },
+       { 0x90152, 0x3 },
+       { 0x90153, 0x370 },
+       { 0x90154, 0x129 },
+       { 0x90155, 0x20 },
+       { 0x90156, 0x2aa },
+       { 0x90157, 0x9 },
+       { 0x90158, 0x0 },
+       { 0x90159, 0x400 },
+       { 0x9015a, 0x10e },
+       { 0x9015b, 0x8 },
+       { 0x9015c, 0xe8 },
+       { 0x9015d, 0x109 },
+       { 0x9015e, 0x0 },
+       { 0x9015f, 0x8140 },
+       { 0x90160, 0x10c },
+       { 0x90161, 0x10 },
+       { 0x90162, 0x8138 },
+       { 0x90163, 0x10c },
+       { 0x90164, 0x8 },
+       { 0x90165, 0x7c8 },
+       { 0x90166, 0x101 },
+       { 0x90167, 0x8 },
+       { 0x90168, 0x0 },
+       { 0x90169, 0x8 },
+       { 0x9016a, 0x8 },
+       { 0x9016b, 0x448 },
+       { 0x9016c, 0x109 },
+       { 0x9016d, 0xf },
+       { 0x9016e, 0x7c0 },
+       { 0x9016f, 0x109 },
+       { 0x90170, 0x0 },
+       { 0x90171, 0xe8 },
+       { 0x90172, 0x109 },
+       { 0x90173, 0x47 },
+       { 0x90174, 0x630 },
+       { 0x90175, 0x109 },
+       { 0x90176, 0x8 },
+       { 0x90177, 0x618 },
+       { 0x90178, 0x109 },
+       { 0x90179, 0x8 },
+       { 0x9017a, 0xe0 },
+       { 0x9017b, 0x109 },
+       { 0x9017c, 0x0 },
+       { 0x9017d, 0x7c8 },
+       { 0x9017e, 0x109 },
+       { 0x9017f, 0x8 },
+       { 0x90180, 0x8140 },
+       { 0x90181, 0x10c },
+       { 0x90182, 0x0 },
+       { 0x90183, 0x1 },
+       { 0x90184, 0x8 },
+       { 0x90185, 0x8 },
+       { 0x90186, 0x4 },
+       { 0x90187, 0x8 },
+       { 0x90188, 0x8 },
+       { 0x90189, 0x7c8 },
+       { 0x9018a, 0x101 },
+       { 0x90006, 0x0 },
+       { 0x90007, 0x0 },
+       { 0x90008, 0x8 },
+       { 0x90009, 0x0 },
+       { 0x9000a, 0x0 },
+       { 0x9000b, 0x0 },
+       { 0xd00e7, 0x400 },
+       { 0x90017, 0x0 },
+       { 0x9001f, 0x2a },
+       { 0x90026, 0x6a },
+       { 0x400d0, 0x0 },
+       { 0x400d1, 0x101 },
+       { 0x400d2, 0x105 },
+       { 0x400d3, 0x107 },
+       { 0x400d4, 0x10f },
+       { 0x400d5, 0x202 },
+       { 0x400d6, 0x20a },
+       { 0x400d7, 0x20b },
+       { 0x2003a, 0x2 },
+       { 0x2000b, 0x64 },
+       { 0x2000c, 0xc8 },
+       { 0x2000d, 0x7d0 },
+       { 0x2000e, 0x2c },
+       { 0x12000b, 0xc },
+       { 0x12000c, 0x19 },
+       { 0x12000d, 0xfa },
+       { 0x12000e, 0x10 },
+       { 0x22000b, 0x3 },
+       { 0x22000c, 0x6 },
+       { 0x22000d, 0x3e },
+       { 0x22000e, 0x10 },
+       { 0x9000c, 0x0 },
+       { 0x9000d, 0x173 },
+       { 0x9000e, 0x60 },
+       { 0x9000f, 0x6110 },
+       { 0x90010, 0x2152 },
+       { 0x90011, 0xdfbd },
+       { 0x90012, 0x60 },
+       { 0x90013, 0x6152 },
+       { 0x20010, 0x5a },
+       { 0x20011, 0x3 },
+       { 0x40080, 0xe0 },
+       { 0x40081, 0x12 },
+       { 0x40082, 0xe0 },
+       { 0x40083, 0x12 },
+       { 0x40084, 0xe0 },
+       { 0x40085, 0x12 },
+       { 0x140080, 0xe0 },
+       { 0x140081, 0x12 },
+       { 0x140082, 0xe0 },
+       { 0x140083, 0x12 },
+       { 0x140084, 0xe0 },
+       { 0x140085, 0x12 },
+       { 0x240080, 0xe0 },
+       { 0x240081, 0x12 },
+       { 0x240082, 0xe0 },
+       { 0x240083, 0x12 },
+       { 0x240084, 0xe0 },
+       { 0x240085, 0x12 },
+       { 0x400fd, 0xf },
+       { 0x10011, 0x1 },
+       { 0x10012, 0x1 },
+       { 0x10013, 0x180 },
+       { 0x10018, 0x1 },
+       { 0x10002, 0x6209 },
+       { 0x100b2, 0x1 },
+       { 0x101b4, 0x1 },
+       { 0x102b4, 0x1 },
+       { 0x103b4, 0x1 },
+       { 0x104b4, 0x1 },
+       { 0x105b4, 0x1 },
+       { 0x106b4, 0x1 },
+       { 0x107b4, 0x1 },
+       { 0x108b4, 0x1 },
+       { 0x11011, 0x1 },
+       { 0x11012, 0x1 },
+       { 0x11013, 0x180 },
+       { 0x11018, 0x1 },
+       { 0x11002, 0x6209 },
+       { 0x110b2, 0x1 },
+       { 0x111b4, 0x1 },
+       { 0x112b4, 0x1 },
+       { 0x113b4, 0x1 },
+       { 0x114b4, 0x1 },
+       { 0x115b4, 0x1 },
+       { 0x116b4, 0x1 },
+       { 0x117b4, 0x1 },
+       { 0x118b4, 0x1 },
+       { 0x12011, 0x1 },
+       { 0x12012, 0x1 },
+       { 0x12013, 0x180 },
+       { 0x12018, 0x1 },
+       { 0x12002, 0x6209 },
+       { 0x120b2, 0x1 },
+       { 0x121b4, 0x1 },
+       { 0x122b4, 0x1 },
+       { 0x123b4, 0x1 },
+       { 0x124b4, 0x1 },
+       { 0x125b4, 0x1 },
+       { 0x126b4, 0x1 },
+       { 0x127b4, 0x1 },
+       { 0x128b4, 0x1 },
+       { 0x13011, 0x1 },
+       { 0x13012, 0x1 },
+       { 0x13013, 0x180 },
+       { 0x13018, 0x1 },
+       { 0x13002, 0x6209 },
+       { 0x130b2, 0x1 },
+       { 0x131b4, 0x1 },
+       { 0x132b4, 0x1 },
+       { 0x133b4, 0x1 },
+       { 0x134b4, 0x1 },
+       { 0x135b4, 0x1 },
+       { 0x136b4, 0x1 },
+       { 0x137b4, 0x1 },
+       { 0x138b4, 0x1 },
+       { 0x2003a, 0x2 },
+       { 0xc0080, 0x2 },
+       { 0xd0000, 0x1 },
+};
+
+struct dram_fsp_msg lpddr4_dram_fsp_msg[] = {
+       {
+               /* P0 3200mts 1D */
+               .drate = 3200,
+               .fw_type = FW_1D_IMAGE,
+               .fsp_cfg = lpddr4_fsp0_cfg,
+               .fsp_cfg_num = ARRAY_SIZE(lpddr4_fsp0_cfg),
+       },
+       {
+               /* P1 400mts 1D */
+               .drate = 400,
+               .fw_type = FW_1D_IMAGE,
+               .fsp_cfg = lpddr4_fsp1_cfg,
+               .fsp_cfg_num = ARRAY_SIZE(lpddr4_fsp1_cfg),
+       },
+       {
+               /* P1 100mts 1D */
+               .drate = 100,
+               .fw_type = FW_1D_IMAGE,
+               .fsp_cfg = lpddr4_fsp2_cfg,
+               .fsp_cfg_num = ARRAY_SIZE(lpddr4_fsp2_cfg),
+       },
+       {
+               /* P0 3200mts 2D */
+               .drate = 3200,
+               .fw_type = FW_2D_IMAGE,
+               .fsp_cfg = lpddr4_fsp0_2d_cfg,
+               .fsp_cfg_num = ARRAY_SIZE(lpddr4_fsp0_2d_cfg),
+       },
+};
+
+/* lpddr4 timing config params on EVK board */
+struct dram_timing_info dram_timing = {
+       .ddrc_cfg = lpddr4_ddrc_cfg,
+       .ddrc_cfg_num = ARRAY_SIZE(lpddr4_ddrc_cfg),
+       .ddrphy_cfg = lpddr4_ddrphy_cfg,
+       .ddrphy_cfg_num = ARRAY_SIZE(lpddr4_ddrphy_cfg),
+       .fsp_msg = lpddr4_dram_fsp_msg,
+       .fsp_msg_num = ARRAY_SIZE(lpddr4_dram_fsp_msg),
+       .ddrphy_pie = lpddr4_phy_pie,
+       .ddrphy_pie_num = ARRAY_SIZE(lpddr4_phy_pie),
+       .fsp_table = { 3200, 400, 100, },
+};
diff --git a/board/purism/librem5/lpddr4_timing_b0.c b/board/purism/librem5/lpddr4_timing_b0.c
new file mode 100644 (file)
index 0000000..ec68eda
--- /dev/null
@@ -0,0 +1,1191 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright 2018 NXP
+ */
+
+#include <linux/kernel.h>
+#include <common.h>
+#include <asm/arch/ddr.h>
+#include <asm/arch/lpddr4_define.h>
+
+#define WR_POST_EXT_3200  /* recommened to define */
+
+static struct dram_cfg_param lpddr4_ddrc_cfg[] = {
+       /* Start to config, default 3200mbps */
+       /* dis_dq=1, indicates no reads or writes are issued to SDRAM */
+       { DDRC_DBG1(0), 0x00000001 },
+       /* selfref_en=1, SDRAM enter self-refresh state */
+       { DDRC_PWRCTL(0), 0x00000001 },
+       { DDRC_MSTR(0), 0xa3080020 },
+       { DDRC_MSTR2(0), 0x00000000 },
+       { DDRC_RFSHTMG(0), 0x006100E0 },
+       { DDRC_INIT0(0), 0xC003061B },
+       { DDRC_INIT1(0), 0x009D0000 },
+       { DDRC_INIT3(0), 0x00D4002D },
+#ifdef WR_POST_EXT_3200  /* recommened to define */
+       { DDRC_INIT4(0), 0x00330008 },
+#else
+       { DDRC_INIT4(0), 0x00310008 },
+#endif
+       { DDRC_INIT6(0), 0x0066004a },
+       { DDRC_INIT7(0), 0x0006004a },
+
+       { DDRC_DRAMTMG0(0), 0x1A201B22 },
+       { DDRC_DRAMTMG1(0), 0x00060633 },
+       { DDRC_DRAMTMG3(0), 0x00C0C000 },
+       { DDRC_DRAMTMG4(0), 0x0F04080F },
+       { DDRC_DRAMTMG5(0), 0x02040C0C },
+       { DDRC_DRAMTMG6(0), 0x01010007 },
+       { DDRC_DRAMTMG7(0), 0x00000401 },
+       { DDRC_DRAMTMG12(0), 0x00020600 },
+       { DDRC_DRAMTMG13(0), 0x0C100002 },
+       { DDRC_DRAMTMG14(0), 0x000000E6 },
+       { DDRC_DRAMTMG17(0), 0x00A00050 },
+
+       { DDRC_ZQCTL0(0), 0x03200018 },
+       { DDRC_ZQCTL1(0), 0x028061A8 },
+       { DDRC_ZQCTL2(0), 0x00000000 },
+
+       { DDRC_DFITMG0(0), 0x0497820A },
+       { DDRC_DFITMG1(0), 0x00080303 },
+       { DDRC_DFIUPD0(0), 0xE0400018 },
+       { DDRC_DFIUPD1(0), 0x00DF00E4 },
+       { DDRC_DFIUPD2(0), 0x80000000 },
+       { DDRC_DFIMISC(0), 0x00000011 },
+       { DDRC_DFITMG2(0), 0x0000170A },
+
+       { DDRC_DBICTL(0), 0x00000001 },
+       { DDRC_DFIPHYMSTR(0), 0x00000001 },
+
+       /* need be refined by ddrphy trained value */
+       { DDRC_RANKCTL(0), 0x00000c99 },
+       { DDRC_DRAMTMG2(0), 0x070E171a },
+
+       /* address mapping */
+       /* Address map is from MSB 29: r15, r14, cs, r13-r0, b2-b0, c9-c0 */
+       { DDRC_ADDRMAP0(0), 0x00000015 },
+       { DDRC_ADDRMAP3(0), 0x00000000 },
+       /* addrmap_col_b10 addrmap_col_b11 set to de-activated (5-bit width) */
+       { DDRC_ADDRMAP4(0), 0x00001F1F },
+       /* bank interleave */
+       /* addrmap_bank_b2, addrmap_bank_b1, addrmap_bank_b0 */
+       { DDRC_ADDRMAP1(0), 0x00080808 },
+       /* addrmap_row_b11 addrmap_row_b10_b2 addrmap_row_b1 addrmap_row_b0 */
+       { DDRC_ADDRMAP5(0), 0x07070707 },
+       /* addrmap_row_b15 addrmap_row_b14 addrmap_row_b13 addrmap_row_b12 */
+       { DDRC_ADDRMAP6(0), 0x08080707 },
+
+       /* 667mts frequency setting */
+       { DDRC_FREQ1_DERATEEN(0), 0x0000000 },
+       { DDRC_FREQ1_DERATEINT(0), 0x0800000 },
+       { DDRC_FREQ1_RFSHCTL0(0), 0x0210000 },
+       { DDRC_FREQ1_RFSHTMG(0), 0x014001E },
+       { DDRC_FREQ1_INIT3(0), 0x0140009 },
+       { DDRC_FREQ1_INIT4(0), 0x00310008 },
+       { DDRC_FREQ1_INIT6(0), 0x0066004a },
+       { DDRC_FREQ1_INIT7(0), 0x0006004a },
+       { DDRC_FREQ1_DRAMTMG0(0), 0xB070A07 },
+       { DDRC_FREQ1_DRAMTMG1(0), 0x003040A },
+       { DDRC_FREQ1_DRAMTMG2(0), 0x305080C },
+       { DDRC_FREQ1_DRAMTMG3(0), 0x0505000 },
+       { DDRC_FREQ1_DRAMTMG4(0), 0x3040203 },
+       { DDRC_FREQ1_DRAMTMG5(0), 0x2030303 },
+       { DDRC_FREQ1_DRAMTMG6(0), 0x2020004 },
+       { DDRC_FREQ1_DRAMTMG7(0), 0x0000302 },
+       { DDRC_FREQ1_DRAMTMG12(0), 0x0020310 },
+       { DDRC_FREQ1_DRAMTMG13(0), 0xA100002 },
+       { DDRC_FREQ1_DRAMTMG14(0), 0x0000020 },
+       { DDRC_FREQ1_DRAMTMG17(0), 0x0220011 },
+       { DDRC_FREQ1_ZQCTL0(0), 0x0A70005 },
+       { DDRC_FREQ1_DFITMG0(0), 0x3858202 },
+       { DDRC_FREQ1_DFITMG1(0), 0x0000404 },
+       { DDRC_FREQ1_DFITMG2(0), 0x0000502 },
+
+       /* performance setting */
+       { DDRC_ODTCFG(0), 0x0b060908 },
+       { DDRC_ODTMAP(0), 0x00000000 },
+       { DDRC_SCHED(0), 0x29511505 },
+       { DDRC_SCHED1(0), 0x0000002c },
+       { DDRC_PERFHPR1(0), 0x5900575b },
+       /* 150T starve and 0x90 max tran len */
+       { DDRC_PERFLPR1(0), 0x90000096 },
+       /* 300T starve and 0x10 max tran len */
+       { DDRC_PERFWR1(0), 0x1000012c },
+       { DDRC_DBG0(0), 0x00000016 },
+       { DDRC_DBG1(0), 0x00000000 },
+       { DDRC_DBGCMD(0), 0x00000000 },
+       { DDRC_SWCTL(0), 0x00000001 },
+       { DDRC_POISONCFG(0), 0x00000011 },
+       { DDRC_PCCFG(0), 0x00000111 },
+       { DDRC_PCFGR_0(0), 0x000010f3 },
+       { DDRC_PCFGW_0(0), 0x000072ff },
+       { DDRC_PCTRL_0(0), 0x00000001 },
+       /* disable Read Qos*/
+       { DDRC_PCFGQOS0_0(0), 0x00000e00 },
+       { DDRC_PCFGQOS1_0(0), 0x0062ffff },
+       /* disable Write Qos*/
+       { DDRC_PCFGWQOS0_0(0), 0x00000e00 },
+       { DDRC_PCFGWQOS1_0(0), 0x0000ffff },
+       { DDRC_FREQ1_DERATEEN(0), 0x00000202 },
+       { DDRC_FREQ1_DERATEINT(0), 0xec78f4b5 },
+       { DDRC_FREQ1_RFSHCTL0(0), 0x00618040 },
+       { DDRC_FREQ1_RFSHTMG(0), 0x00610090 },
+};
+
+/* PHY Initialize Configuration */
+static struct dram_cfg_param lpddr4_ddrphy_cfg[] = {
+       { 0x20110, 0x02 }, /* MapCAB0toDFI */
+       { 0x20111, 0x03 }, /* MapCAB1toDFI */
+       { 0x20112, 0x04 }, /* MapCAB2toDFI */
+       { 0x20113, 0x05 }, /* MapCAB3toDFI */
+       { 0x20114, 0x00 }, /* MapCAB4toDFI */
+       { 0x20115, 0x01 }, /* MapCAB5toDFI */
+
+       /* Initialize PHY Configuration */
+       { 0x1005f, 0x1ff },
+       { 0x1015f, 0x1ff },
+       { 0x1105f, 0x1ff },
+       { 0x1115f, 0x1ff },
+       { 0x1205f, 0x1ff },
+       { 0x1215f, 0x1ff },
+       { 0x1305f, 0x1ff },
+       { 0x1315f, 0x1ff },
+
+       { 0x11005f, 0x1ff },
+       { 0x11015f, 0x1ff },
+       { 0x11105f, 0x1ff },
+       { 0x11115f, 0x1ff },
+       { 0x11205f, 0x1ff },
+       { 0x11215f, 0x1ff },
+       { 0x11305f, 0x1ff },
+       { 0x11315f, 0x1ff },
+
+       { 0x21005f, 0x1ff },
+       { 0x21015f, 0x1ff },
+       { 0x21105f, 0x1ff },
+       { 0x21115f, 0x1ff },
+       { 0x21205f, 0x1ff },
+       { 0x21215f, 0x1ff },
+       { 0x21305f, 0x1ff },
+       { 0x21315f, 0x1ff },
+
+       { 0x55, 0x1ff },
+       { 0x1055, 0x1ff },
+       { 0x2055, 0x1ff },
+       { 0x3055, 0x1ff },
+       { 0x4055, 0x1ff },
+       { 0x5055, 0x1ff },
+       { 0x6055, 0x1ff },
+       { 0x7055, 0x1ff },
+       { 0x8055, 0x1ff },
+       { 0x9055, 0x1ff },
+       { 0x200c5, 0x19 },
+       { 0x1200c5, 0x7 },
+       { 0x2200c5, 0x7 },
+       { 0x2002e, 0x2 },
+       { 0x12002e, 0x1 },
+       { 0x22002e, 0x2 },
+       { 0x90204, 0x0 },
+       { 0x190204, 0x0 },
+       { 0x290204, 0x0 },
+
+       { 0x20024, 0xe3 },
+       { 0x2003a, 0x2 },
+       { 0x120024, 0xa3 },
+       { 0x2003a, 0x2 },
+       { 0x220024, 0xa3 },
+       { 0x2003a, 0x2 },
+
+       { 0x20056, 0x3 },
+       { 0x120056, 0xa },
+       { 0x220056, 0xa },
+
+       { 0x1004d, 0xe00 },
+       { 0x1014d, 0xe00 },
+       { 0x1104d, 0xe00 },
+       { 0x1114d, 0xe00 },
+       { 0x1204d, 0xe00 },
+       { 0x1214d, 0xe00 },
+       { 0x1304d, 0xe00 },
+       { 0x1314d, 0xe00 },
+       { 0x11004d, 0xe00 },
+       { 0x11014d, 0xe00 },
+       { 0x11104d, 0xe00 },
+       { 0x11114d, 0xe00 },
+       { 0x11204d, 0xe00 },
+       { 0x11214d, 0xe00 },
+       { 0x11304d, 0xe00 },
+       { 0x11314d, 0xe00 },
+       { 0x21004d, 0xe00 },
+       { 0x21014d, 0xe00 },
+       { 0x21104d, 0xe00 },
+       { 0x21114d, 0xe00 },
+       { 0x21204d, 0xe00 },
+       { 0x21214d, 0xe00 },
+       { 0x21304d, 0xe00 },
+       { 0x21314d, 0xe00 },
+
+       { 0x10049, 0xfbe },
+       { 0x10149, 0xfbe },
+       { 0x11049, 0xfbe },
+       { 0x11149, 0xfbe },
+       { 0x12049, 0xfbe },
+       { 0x12149, 0xfbe },
+       { 0x13049, 0xfbe },
+       { 0x13149, 0xfbe },
+
+       { 0x110049, 0xfbe },
+       { 0x110149, 0xfbe },
+       { 0x111049, 0xfbe },
+       { 0x111149, 0xfbe },
+       { 0x112049, 0xfbe },
+       { 0x112149, 0xfbe },
+       { 0x113049, 0xfbe },
+       { 0x113149, 0xfbe },
+
+       { 0x210049, 0xfbe },
+       { 0x210149, 0xfbe },
+       { 0x211049, 0xfbe },
+       { 0x211149, 0xfbe },
+       { 0x212049, 0xfbe },
+       { 0x212149, 0xfbe },
+       { 0x213049, 0xfbe },
+       { 0x213149, 0xfbe },
+
+       { 0x43, 0x63 },
+       { 0x1043, 0x63 },
+       { 0x2043, 0x63 },
+       { 0x3043, 0x63 },
+       { 0x4043, 0x63 },
+       { 0x5043, 0x63 },
+       { 0x6043, 0x63 },
+       { 0x7043, 0x63 },
+       { 0x8043, 0x63 },
+       { 0x9043, 0x63 },
+
+       { 0x20018, 0x3 },
+       { 0x20075, 0x4 },
+       { 0x20050, 0x0 },
+       { 0x20008, 0x320 },
+       { 0x120008, 0xa7 },
+       { 0x220008, 0x19 },
+       { 0x20088, 0x9 },
+       { 0x200b2, 0x104 },
+       { 0x10043, 0x5a1 },
+       { 0x10143, 0x5a1 },
+       { 0x11043, 0x5a1 },
+       { 0x11143, 0x5a1 },
+       { 0x12043, 0x5a1 },
+       { 0x12143, 0x5a1 },
+       { 0x13043, 0x5a1 },
+       { 0x13143, 0x5a1 },
+       { 0x1200b2, 0x104 },
+       { 0x110043, 0x5a1 },
+       { 0x110143, 0x5a1 },
+       { 0x111043, 0x5a1 },
+       { 0x111143, 0x5a1 },
+       { 0x112043, 0x5a1 },
+       { 0x112143, 0x5a1 },
+       { 0x113043, 0x5a1 },
+       { 0x113143, 0x5a1 },
+       { 0x2200b2, 0x104 },
+       { 0x210043, 0x5a1 },
+       { 0x210143, 0x5a1 },
+       { 0x211043, 0x5a1 },
+       { 0x211143, 0x5a1 },
+       { 0x212043, 0x5a1 },
+       { 0x212143, 0x5a1 },
+       { 0x213043, 0x5a1 },
+       { 0x213143, 0x5a1 },
+       { 0x200fa, 0x1 },
+       { 0x1200fa, 0x1 },
+       { 0x2200fa, 0x1 },
+       { 0x20019, 0x1 },
+       { 0x120019, 0x1 },
+       { 0x220019, 0x1 },
+       { 0x200f0, 0x600 },
+       { 0x200f1, 0x0 },
+       { 0x200f2, 0x4444 },
+       { 0x200f3, 0x8888 },
+       { 0x200f4, 0x5655 },
+       { 0x200f5, 0x0 },
+       { 0x200f6, 0x0 },
+       { 0x200f7, 0xf000 },
+       { 0x20025, 0x0 },
+       { 0x2002d, 0x0 },
+       { 0x12002d, 0x0 },
+       { 0x22002d, 0x0 },
+};
+
+/* P0 message block paremeter for training firmware */
+static struct dram_cfg_param lpddr4_fsp0_cfg[] = {
+       { 0xd0000, 0x0 },
+       { 0x54000, 0x0 },
+       { 0x54001, 0x0 },
+       { 0x54002, 0x0 },
+       { 0x54003, 0xc80 },
+       { 0x54004, 0x2 },
+       { 0x54005, ((LPDDR4_PHY_RON << 8) | LPDDR4_PHY_RTT) },
+       { 0x54006, LPDDR4_PHY_VREF_VALUE },
+       { 0x54007, 0x0 },
+       { 0x54008, 0x131f },
+       { 0x54009, LPDDR4_HDT_CTL_3200_1D },
+       { 0x5400a, 0x0 },
+       { 0x5400b, 0x2 },
+       { 0x5400c, 0x0 },
+       { 0x5400d, (LPDDR4_CATRAIN_3200_1d << 8) },
+       { 0x5400e, 0x0 },
+       { 0x5400f, 0x0 },
+       { 0x54010, 0x0 },
+       { 0x54011, 0x0 },
+       { 0x54012, 0x310 },
+       { 0x54013, 0x0 },
+       { 0x54014, 0x0 },
+       { 0x54015, 0x0 },
+       { 0x54016, 0x0 },
+       { 0x54017, 0x0 },
+       { 0x54018, 0x0 },
+       { 0x54019, 0x2dd4 },
+       { 0x5401a, (((LPDDR4_RON) << 3) | 0x3) },
+       { 0x5401b, ((LPDDR4_VREF_VALUE_CA << 8) |
+                   (LPDDR4_RTT_CA_BANK0 << 4) | LPDDR4_RTT_DQ) },
+       { 0x5401c, ((LPDDR4_VREF_VALUE_DQ_RANK0 << 8) | 0x08) },
+       { 0x5401d, 0x0 },
+       { 0x5401e, LPDDR4_MR22_RANK0 },
+       { 0x5401f, 0x2dd4 },
+       { 0x54020, (((LPDDR4_RON) << 3) | 0x3) },
+       { 0x54021, ((LPDDR4_VREF_VALUE_CA << 8) |
+                   (LPDDR4_RTT_CA_BANK1 << 4) | LPDDR4_RTT_DQ) },
+       { 0x54022, ((LPDDR4_VREF_VALUE_DQ_RANK1 << 8) | 0x08) },
+       { 0x54023, 0x0 },
+       { 0x54024, LPDDR4_MR22_RANK1 },
+       { 0x54025, 0x0 },
+       { 0x54026, 0x0 },
+       { 0x54027, 0x0 },
+       { 0x54028, 0x0 },
+       { 0x54029, 0x0 },
+       { 0x5402a, 0x0 },
+       { 0x5402b, 0x1000 },
+       { 0x5402c, 0x3 },
+       { 0x5402d, 0x0 },
+       { 0x5402e, 0x0 },
+       { 0x5402f, 0x0 },
+       { 0x54030, 0x0 },
+       { 0x54031, 0x0 },
+       { 0x54032, 0xd400 },
+       { 0x54033, ((((LPDDR4_RON) << 3) | 0x3) << 8) | 0x2d },
+       { 0x54034, (((LPDDR4_RTT_CA_BANK0 << 4) | LPDDR4_RTT_DQ) << 8) },
+       { 0x54035, (0x0800 | LPDDR4_VREF_VALUE_CA) },
+       { 0x54036, LPDDR4_VREF_VALUE_DQ_RANK0 },
+       { 0x54037, (LPDDR4_MR22_RANK0 << 8) },
+       { 0x54038, 0xd400 },
+       { 0x54039, ((((LPDDR4_RON) << 3) | 0x3) << 8) | 0x2d },
+       { 0x5403a, (((LPDDR4_RTT_CA_BANK1 << 4) | LPDDR4_RTT_DQ) << 8) },
+       { 0x5403b, (0x0800 | LPDDR4_VREF_VALUE_CA) },
+       { 0x5403c, LPDDR4_VREF_VALUE_DQ_RANK1 },
+       { 0x5403d, (LPDDR4_MR22_RANK1 << 8) },
+       { 0x5403d, (LPDDR4_MR22_RANK1 << 8) },
+       { 0x5403e, 0x0 },
+       { 0x5403f, 0x0 },
+       { 0x54040, 0x0 },
+       { 0x54041, 0x0 },
+       { 0x54042, 0x0 },
+       { 0x54043, 0x0 },
+       { 0x54044, 0x0 },
+       { 0xd0000, 0x1 },
+};
+
+/* P1 message block paremeter for training firmware */
+static struct dram_cfg_param lpddr4_fsp1_cfg[] = {
+       { 0xd0000, 0x0 },
+       { 0x54000, 0x0 },
+       { 0x54001, 0x0 },
+       { 0x54002, 0x1 },
+       { 0x54003, 0x29c },
+       { 0x54004, 0x2 },
+       { 0x54005, ((LPDDR4_PHY_RON << 8) | LPDDR4_PHY_RTT) },
+       { 0x54006, LPDDR4_PHY_VREF_VALUE },
+       { 0x54007, 0x0 },
+       { 0x54008, 0x121f },
+       { 0x54009, 0xc8 },
+       { 0x5400a, 0x0 },
+       { 0x5400b, 0x2 },
+       { 0x5400c, 0x0 },
+       { 0x5400d, 0x0 },
+       { 0x5400e, 0x0 },
+       { 0x5400f, 0x0 },
+       { 0x54010, 0x0 },
+       { 0x54011, 0x0 },
+       { 0x54012, 0x310 },
+       { 0x54013, 0x0 },
+       { 0x54014, 0x0 },
+       { 0x54015, 0x0 },
+       { 0x54016, 0x0 },
+       { 0x54017, 0x0 },
+       { 0x54018, 0x0 },
+       { 0x54019, 0x914 },
+       { 0x5401a, (((LPDDR4_RON) << 3) | 0x1) },
+       { 0x5401b, ((LPDDR4_VREF_VALUE_CA << 8) |
+                   (LPDDR4_RTT_CA_BANK0 << 4) | LPDDR4_RTT_DQ) },
+       { 0x5401c, ((LPDDR4_VREF_VALUE_DQ_RANK0 << 8) | 0x08) },
+       { 0x5401e, 0x6 },
+       { 0x5401f, 0x914 },
+       { 0x54020, (((LPDDR4_RON) << 3) | 0x1) },
+       { 0x54021, ((LPDDR4_VREF_VALUE_CA << 8) |
+                   (LPDDR4_RTT_CA_BANK1 << 4) | LPDDR4_RTT_DQ) },
+       { 0x54022, ((LPDDR4_VREF_VALUE_DQ_RANK1 << 8) | 0x08) },
+       { 0x54023, 0x0 },
+       { 0x54024, LPDDR4_MR22_RANK1 },
+       { 0x54025, 0x0 },
+       { 0x54026, 0x0 },
+       { 0x54027, 0x0 },
+       { 0x54028, 0x0 },
+       { 0x54029, 0x0 },
+       { 0x5402a, 0x0 },
+       { 0x5402b, 0x1000 },
+       { 0x5402c, 0x3 },
+       { 0x5402d, 0x0 },
+       { 0x5402e, 0x0 },
+       { 0x5402f, 0x0 },
+       { 0x54030, 0x0 },
+       { 0x54031, 0x0 },
+       { 0x54032, 0x1400 },
+       { 0x54033, ((((LPDDR4_RON) << 3) | 0x1) << 8) | 0x09 },
+       { 0x54034, (((LPDDR4_RTT_CA_BANK0 << 4) | LPDDR4_RTT_DQ) << 8) },
+       { 0x54035, (0x0800 | LPDDR4_VREF_VALUE_CA) },
+       { 0x54036, LPDDR4_VREF_VALUE_DQ_RANK0 },
+       { 0x54037, 0x600 },
+       { 0x54038, 0x1400 },
+       { 0x54039, ((((LPDDR4_RON) << 3) | 0x1) << 8) | 0x09 },
+       { 0x5403a, (((LPDDR4_RTT_CA_BANK1 << 4) | LPDDR4_RTT_DQ) << 8) },
+       { 0x5403b, (0x0800 | LPDDR4_VREF_VALUE_CA) },
+       { 0x5403c, LPDDR4_VREF_VALUE_DQ_RANK1 },
+       { 0x5403d, (LPDDR4_MR22_RANK1 << 8) },
+       { 0x5403e, 0x0 },
+       { 0x5403f, 0x0 },
+       { 0x54040, 0x0 },
+       { 0x54041, 0x0 },
+       { 0x54042, 0x0 },
+       { 0x54043, 0x0 },
+       { 0xd0000, 0x1 },
+
+};
+
+/* P0 2D message block paremeter for training firmware */
+static struct dram_cfg_param lpddr4_fsp0_2d_cfg[] = {
+       { 0xd0000, 0x0 },
+       { 0x54000, 0x0 },
+       { 0x54001, 0x0 },
+       { 0x54002, 0x0 },
+       { 0x54003, 0xc80 },
+       { 0x54004, 0x2 },
+       { 0x54005, ((LPDDR4_PHY_RON << 8) | LPDDR4_PHY_RTT) },
+       { 0x54006, LPDDR4_PHY_VREF_VALUE },
+       { 0x54007, 0x0 },
+       { 0x54008, 0x61 },
+       { 0x54009, LPDDR4_HDT_CTL_2D },
+       { 0x5400a, 0x0 },
+       { 0x5400b, 0x2 },
+       { 0x5400c, 0x0 },
+       { 0x5400d, (LPDDR4_CATRAIN_3200_2d << 8) },
+       { 0x5400e, 0x0 },
+       { 0x5400f, (LPDDR4_2D_SHARE << 8) | 0x00 },
+       { 0x54010, LPDDR4_2D_WEIGHT },
+       { 0x54011, 0x0 },
+       { 0x54012, 0x310 },
+       { 0x54013, 0x0 },
+       { 0x54014, 0x0 },
+       { 0x54015, 0x0 },
+       { 0x54016, 0x0 },
+       { 0x54017, 0x0 },
+       { 0x54018, 0x0 },
+       { 0x54024, 0x5 },
+       { 0x54019, 0x2dd4 },
+       { 0x5401a, (((LPDDR4_RON) << 3) | 0x3) },
+       { 0x5401b, ((LPDDR4_VREF_VALUE_CA << 8) |
+                   (LPDDR4_RTT_CA_BANK0 << 4) | LPDDR4_RTT_DQ) },
+       { 0x5401c, ((LPDDR4_VREF_VALUE_DQ_RANK0 << 8) | 0x08) },
+       { 0x5401d, 0x0 },
+       { 0x5401e, LPDDR4_MR22_RANK0 },
+       { 0x5401f, 0x2dd4 },
+       { 0x54020, (((LPDDR4_RON) << 3) | 0x3) },
+       { 0x54021, ((LPDDR4_VREF_VALUE_CA << 8) |
+                   (LPDDR4_RTT_CA_BANK1 << 4) | LPDDR4_RTT_DQ) },
+       { 0x54022, ((LPDDR4_VREF_VALUE_DQ_RANK1 << 8) | 0x08) },
+       { 0x54023, 0x0 },
+       { 0x54024, LPDDR4_MR22_RANK1 },
+       { 0x54025, 0x0 },
+       { 0x54026, 0x0 },
+       { 0x54027, 0x0 },
+       { 0x54028, 0x0 },
+       { 0x54029, 0x0 },
+       { 0x5402a, 0x0 },
+       { 0x5402b, 0x1000 },
+       { 0x5402c, 0x3 },
+       { 0x5402d, 0x0 },
+       { 0x5402e, 0x0 },
+       { 0x5402f, 0x0 },
+       { 0x54030, 0x0 },
+       { 0x54031, 0x0 },
+       { 0x54032, 0xd400 },
+       { 0x54033, ((((LPDDR4_RON) << 3) | 0x3) << 8) | 0x2d },
+       { 0x54034, (((LPDDR4_RTT_CA_BANK0 << 4) | LPDDR4_RTT_DQ) << 8) },
+       { 0x54035, (0x0800 | LPDDR4_VREF_VALUE_CA) },
+       { 0x54036, LPDDR4_VREF_VALUE_DQ_RANK0 },
+       { 0x54037, (LPDDR4_MR22_RANK0 << 8) },
+       { 0x54038, 0xd400 },
+       { 0x54039, ((((LPDDR4_RON) << 3) | 0x3) << 8) | 0x2d },
+       { 0x5403a, (((LPDDR4_RTT_CA_BANK1 << 4) | LPDDR4_RTT_DQ) << 8) },
+       { 0x5403b, (0x0800 | LPDDR4_VREF_VALUE_CA) },
+       { 0x5403c, LPDDR4_VREF_VALUE_DQ_RANK1 },
+       { 0x5403d, (LPDDR4_MR22_RANK1 << 8) },
+       { 0x5403e, 0x0 },
+       { 0x5403f, 0x0 },
+       { 0x54040, 0x0 },
+       { 0x54041, 0x0 },
+       { 0x54042, 0x0 },
+       { 0x54043, 0x0 },
+       { 0x54044, 0x0 },
+       { 0xd0000, 0x1 },
+
+};
+
+/* DRAM PHY init engine image */
+static struct dram_cfg_param lpddr4_phy_pie[] = {
+       { 0xd0000, 0x0 },
+       { 0x90000, 0x10 },
+       { 0x90001, 0x400 },
+       { 0x90002, 0x10e },
+       { 0x90003, 0x0 },
+       { 0x90004, 0x0 },
+       { 0x90005, 0x8 },
+       { 0x90029, 0xb },
+       { 0x9002a, 0x480 },
+       { 0x9002b, 0x109 },
+       { 0x9002c, 0x8 },
+       { 0x9002d, 0x448 },
+       { 0x9002e, 0x139 },
+       { 0x9002f, 0x8 },
+       { 0x90030, 0x478 },
+       { 0x90031, 0x109 },
+       { 0x90032, 0x0 },
+       { 0x90033, 0xe8 },
+       { 0x90034, 0x109 },
+       { 0x90035, 0x2 },
+       { 0x90036, 0x10 },
+       { 0x90037, 0x139 },
+       { 0x90038, 0xb },
+       { 0x90039, 0x7c0 },
+       { 0x9003a, 0x139 },
+       { 0x9003b, 0x44 },
+       { 0x9003c, 0x630 },
+       { 0x9003d, 0x159 },
+       { 0x9003e, 0x14f },
+       { 0x9003f, 0x630 },
+       { 0x90040, 0x159 },
+       { 0x90041, 0x47 },
+       { 0x90042, 0x630 },
+       { 0x90043, 0x149 },
+       { 0x90044, 0x4f },
+       { 0x90045, 0x630 },
+       { 0x90046, 0x179 },
+       { 0x90047, 0x8 },
+       { 0x90048, 0xe0 },
+       { 0x90049, 0x109 },
+       { 0x9004a, 0x0 },
+       { 0x9004b, 0x7c8 },
+       { 0x9004c, 0x109 },
+       { 0x9004d, 0x0 },
+       { 0x9004e, 0x1 },
+       { 0x9004f, 0x8 },
+       { 0x90050, 0x0 },
+       { 0x90051, 0x45a },
+       { 0x90052, 0x9 },
+       { 0x90053, 0x0 },
+       { 0x90054, 0x448 },
+       { 0x90055, 0x109 },
+       { 0x90056, 0x40 },
+       { 0x90057, 0x630 },
+       { 0x90058, 0x179 },
+       { 0x90059, 0x1 },
+       { 0x9005a, 0x618 },
+       { 0x9005b, 0x109 },
+       { 0x9005c, 0x40c0 },
+       { 0x9005d, 0x630 },
+       { 0x9005e, 0x149 },
+       { 0x9005f, 0x8 },
+       { 0x90060, 0x4 },
+       { 0x90061, 0x48 },
+       { 0x90062, 0x4040 },
+       { 0x90063, 0x630 },
+       { 0x90064, 0x149 },
+       { 0x90065, 0x0 },
+       { 0x90066, 0x4 },
+       { 0x90067, 0x48 },
+       { 0x90068, 0x40 },
+       { 0x90069, 0x630 },
+       { 0x9006a, 0x149 },
+       { 0x9006b, 0x10 },
+       { 0x9006c, 0x4 },
+       { 0x9006d, 0x18 },
+       { 0x9006e, 0x0 },
+       { 0x9006f, 0x4 },
+       { 0x90070, 0x78 },
+       { 0x90071, 0x549 },
+       { 0x90072, 0x630 },
+       { 0x90073, 0x159 },
+       { 0x90074, 0xd49 },
+       { 0x90075, 0x630 },
+       { 0x90076, 0x159 },
+       { 0x90077, 0x94a },
+       { 0x90078, 0x630 },
+       { 0x90079, 0x159 },
+       { 0x9007a, 0x441 },
+       { 0x9007b, 0x630 },
+       { 0x9007c, 0x149 },
+       { 0x9007d, 0x42 },
+       { 0x9007e, 0x630 },
+       { 0x9007f, 0x149 },
+       { 0x90080, 0x1 },
+       { 0x90081, 0x630 },
+       { 0x90082, 0x149 },
+       { 0x90083, 0x0 },
+       { 0x90084, 0xe0 },
+       { 0x90085, 0x109 },
+       { 0x90086, 0xa },
+       { 0x90087, 0x10 },
+       { 0x90088, 0x109 },
+       { 0x90089, 0x9 },
+       { 0x9008a, 0x3c0 },
+       { 0x9008b, 0x149 },
+       { 0x9008c, 0x9 },
+       { 0x9008d, 0x3c0 },
+       { 0x9008e, 0x159 },
+       { 0x9008f, 0x18 },
+       { 0x90090, 0x10 },
+       { 0x90091, 0x109 },
+       { 0x90092, 0x0 },
+       { 0x90093, 0x3c0 },
+       { 0x90094, 0x109 },
+       { 0x90095, 0x18 },
+       { 0x90096, 0x4 },
+       { 0x90097, 0x48 },
+       { 0x90098, 0x18 },
+       { 0x90099, 0x4 },
+       { 0x9009a, 0x58 },
+       { 0x9009b, 0xa },
+       { 0x9009c, 0x10 },
+       { 0x9009d, 0x109 },
+       { 0x9009e, 0x2 },
+       { 0x9009f, 0x10 },
+       { 0x900a0, 0x109 },
+       { 0x900a1, 0x5 },
+       { 0x900a2, 0x7c0 },
+       { 0x900a3, 0x109 },
+       { 0x900a4, 0xd },
+       { 0x900a5, 0x7c0 },
+       { 0x900a6, 0x109 },
+       { 0x900a7, 0x4 },
+       { 0x900a8, 0x7c0 },
+       { 0x900a9, 0x109 },
+       { 0x40000, 0x811 },
+       { 0x40020, 0x880 },
+       { 0x40040, 0x0 },
+       { 0x40060, 0x0 },
+       { 0x40001, 0x4008 },
+       { 0x40021, 0x83 },
+       { 0x40041, 0x4f },
+       { 0x40061, 0x0 },
+       { 0x40002, 0x4040 },
+       { 0x40022, 0x83 },
+       { 0x40042, 0x51 },
+       { 0x40062, 0x0 },
+       { 0x40003, 0x811 },
+       { 0x40023, 0x880 },
+       { 0x40043, 0x0 },
+       { 0x40063, 0x0 },
+       { 0x40004, 0x720 },
+       { 0x40024, 0xf },
+       { 0x40044, 0x1740 },
+       { 0x40064, 0x0 },
+       { 0x40005, 0x16 },
+       { 0x40025, 0x83 },
+       { 0x40045, 0x4b },
+       { 0x40065, 0x0 },
+       { 0x40006, 0x716 },
+       { 0x40026, 0xf },
+       { 0x40046, 0x2001 },
+       { 0x40066, 0x0 },
+       { 0x40007, 0x716 },
+       { 0x40027, 0xf },
+       { 0x40047, 0x2800 },
+       { 0x40067, 0x0 },
+       { 0x40008, 0x716 },
+       { 0x40028, 0xf },
+       { 0x40048, 0xf00 },
+       { 0x40068, 0x0 },
+       { 0x40009, 0x720 },
+       { 0x40029, 0xf },
+       { 0x40049, 0x1400 },
+       { 0x40069, 0x0 },
+       { 0x4000a, 0xe08 },
+       { 0x4002a, 0xc15 },
+       { 0x4004a, 0x0 },
+       { 0x4006a, 0x0 },
+       { 0x4000b, 0x623 },
+       { 0x4002b, 0x15 },
+       { 0x4004b, 0x0 },
+       { 0x4006b, 0x0 },
+       { 0x4000c, 0x4028 },
+       { 0x4002c, 0x80 },
+       { 0x4004c, 0x0 },
+       { 0x4006c, 0x0 },
+       { 0x4000d, 0xe08 },
+       { 0x4002d, 0xc1a },
+       { 0x4004d, 0x0 },
+       { 0x4006d, 0x0 },
+       { 0x4000e, 0x623 },
+       { 0x4002e, 0x1a },
+       { 0x4004e, 0x0 },
+       { 0x4006e, 0x0 },
+       { 0x4000f, 0x4040 },
+       { 0x4002f, 0x80 },
+       { 0x4004f, 0x0 },
+       { 0x4006f, 0x0 },
+       { 0x40010, 0x2604 },
+       { 0x40030, 0x15 },
+       { 0x40050, 0x0 },
+       { 0x40070, 0x0 },
+       { 0x40011, 0x708 },
+       { 0x40031, 0x5 },
+       { 0x40051, 0x0 },
+       { 0x40071, 0x2002 },
+       { 0x40012, 0x8 },
+       { 0x40032, 0x80 },
+       { 0x40052, 0x0 },
+       { 0x40072, 0x0 },
+       { 0x40013, 0x2604 },
+       { 0x40033, 0x1a },
+       { 0x40053, 0x0 },
+       { 0x40073, 0x0 },
+       { 0x40014, 0x708 },
+       { 0x40034, 0xa },
+       { 0x40054, 0x0 },
+       { 0x40074, 0x2002 },
+       { 0x40015, 0x4040 },
+       { 0x40035, 0x80 },
+       { 0x40055, 0x0 },
+       { 0x40075, 0x0 },
+       { 0x40016, 0x60a },
+       { 0x40036, 0x15 },
+       { 0x40056, 0x1200 },
+       { 0x40076, 0x0 },
+       { 0x40017, 0x61a },
+       { 0x40037, 0x15 },
+       { 0x40057, 0x1300 },
+       { 0x40077, 0x0 },
+       { 0x40018, 0x60a },
+       { 0x40038, 0x1a },
+       { 0x40058, 0x1200 },
+       { 0x40078, 0x0 },
+       { 0x40019, 0x642 },
+       { 0x40039, 0x1a },
+       { 0x40059, 0x1300 },
+       { 0x40079, 0x0 },
+       { 0x4001a, 0x4808 },
+       { 0x4003a, 0x880 },
+       { 0x4005a, 0x0 },
+       { 0x4007a, 0x0 },
+       { 0x900aa, 0x0 },
+       { 0x900ab, 0x790 },
+       { 0x900ac, 0x11a },
+       { 0x900ad, 0x8 },
+       { 0x900ae, 0x7aa },
+       { 0x900af, 0x2a },
+       { 0x900b0, 0x10 },
+       { 0x900b1, 0x7b2 },
+       { 0x900b2, 0x2a },
+       { 0x900b3, 0x0 },
+       { 0x900b4, 0x7c8 },
+       { 0x900b5, 0x109 },
+       { 0x900b6, 0x10 },
+       { 0x900b7, 0x10 },
+       { 0x900b8, 0x109 },
+       { 0x900b9, 0x10 },
+       { 0x900ba, 0x2a8 },
+       { 0x900bb, 0x129 },
+       { 0x900bc, 0x8 },
+       { 0x900bd, 0x370 },
+       { 0x900be, 0x129 },
+       { 0x900bf, 0xa },
+       { 0x900c0, 0x3c8 },
+       { 0x900c1, 0x1a9 },
+       { 0x900c2, 0xc },
+       { 0x900c3, 0x408 },
+       { 0x900c4, 0x199 },
+       { 0x900c5, 0x14 },
+       { 0x900c6, 0x790 },
+       { 0x900c7, 0x11a },
+       { 0x900c8, 0x8 },
+       { 0x900c9, 0x4 },
+       { 0x900ca, 0x18 },
+       { 0x900cb, 0xe },
+       { 0x900cc, 0x408 },
+       { 0x900cd, 0x199 },
+       { 0x900ce, 0x8 },
+       { 0x900cf, 0x8568 },
+       { 0x900d0, 0x108 },
+       { 0x900d1, 0x18 },
+       { 0x900d2, 0x790 },
+       { 0x900d3, 0x16a },
+       { 0x900d4, 0x8 },
+       { 0x900d5, 0x1d8 },
+       { 0x900d6, 0x169 },
+       { 0x900d7, 0x10 },
+       { 0x900d8, 0x8558 },
+       { 0x900d9, 0x168 },
+       { 0x900da, 0x70 },
+       { 0x900db, 0x788 },
+       { 0x900dc, 0x16a },
+       { 0x900dd, 0x1ff8 },
+       { 0x900de, 0x85a8 },
+       { 0x900df, 0x1e8 },
+       { 0x900e0, 0x50 },
+       { 0x900e1, 0x798 },
+       { 0x900e2, 0x16a },
+       { 0x900e3, 0x60 },
+       { 0x900e4, 0x7a0 },
+       { 0x900e5, 0x16a },
+       { 0x900e6, 0x8 },
+       { 0x900e7, 0x8310 },
+       { 0x900e8, 0x168 },
+       { 0x900e9, 0x8 },
+       { 0x900ea, 0xa310 },
+       { 0x900eb, 0x168 },
+       { 0x900ec, 0xa },
+       { 0x900ed, 0x408 },
+       { 0x900ee, 0x169 },
+       { 0x900ef, 0x6e },
+       { 0x900f0, 0x0 },
+       { 0x900f1, 0x68 },
+       { 0x900f2, 0x0 },
+       { 0x900f3, 0x408 },
+       { 0x900f4, 0x169 },
+       { 0x900f5, 0x0 },
+       { 0x900f6, 0x8310 },
+       { 0x900f7, 0x168 },
+       { 0x900f8, 0x0 },
+       { 0x900f9, 0xa310 },
+       { 0x900fa, 0x168 },
+       { 0x900fb, 0x1ff8 },
+       { 0x900fc, 0x85a8 },
+       { 0x900fd, 0x1e8 },
+       { 0x900fe, 0x68 },
+       { 0x900ff, 0x798 },
+       { 0x90100, 0x16a },
+       { 0x90101, 0x78 },
+       { 0x90102, 0x7a0 },
+       { 0x90103, 0x16a },
+       { 0x90104, 0x68 },
+       { 0x90105, 0x790 },
+       { 0x90106, 0x16a },
+       { 0x90107, 0x8 },
+       { 0x90108, 0x8b10 },
+       { 0x90109, 0x168 },
+       { 0x9010a, 0x8 },
+       { 0x9010b, 0xab10 },
+       { 0x9010c, 0x168 },
+       { 0x9010d, 0xa },
+       { 0x9010e, 0x408 },
+       { 0x9010f, 0x169 },
+       { 0x90110, 0x58 },
+       { 0x90111, 0x0 },
+       { 0x90112, 0x68 },
+       { 0x90113, 0x0 },
+       { 0x90114, 0x408 },
+       { 0x90115, 0x169 },
+       { 0x90116, 0x0 },
+       { 0x90117, 0x8b10 },
+       { 0x90118, 0x168 },
+       { 0x90119, 0x0 },
+       { 0x9011a, 0xab10 },
+       { 0x9011b, 0x168 },
+       { 0x9011c, 0x0 },
+       { 0x9011d, 0x1d8 },
+       { 0x9011e, 0x169 },
+       { 0x9011f, 0x80 },
+       { 0x90120, 0x790 },
+       { 0x90121, 0x16a },
+       { 0x90122, 0x18 },
+       { 0x90123, 0x7aa },
+       { 0x90124, 0x6a },
+       { 0x90125, 0xa },
+       { 0x90126, 0x0 },
+       { 0x90127, 0x1e9 },
+       { 0x90128, 0x8 },
+       { 0x90129, 0x8080 },
+       { 0x9012a, 0x108 },
+       { 0x9012b, 0xf },
+       { 0x9012c, 0x408 },
+       { 0x9012d, 0x169 },
+       { 0x9012e, 0xc },
+       { 0x9012f, 0x0 },
+       { 0x90130, 0x68 },
+       { 0x90131, 0x9 },
+       { 0x90132, 0x0 },
+       { 0x90133, 0x1a9 },
+       { 0x90134, 0x0 },
+       { 0x90135, 0x408 },
+       { 0x90136, 0x169 },
+       { 0x90137, 0x0 },
+       { 0x90138, 0x8080 },
+       { 0x90139, 0x108 },
+       { 0x9013a, 0x8 },
+       { 0x9013b, 0x7aa },
+       { 0x9013c, 0x6a },
+       { 0x9013d, 0x0 },
+       { 0x9013e, 0x8568 },
+       { 0x9013f, 0x108 },
+       { 0x90140, 0xb7 },
+       { 0x90141, 0x790 },
+       { 0x90142, 0x16a },
+       { 0x90143, 0x1f },
+       { 0x90144, 0x0 },
+       { 0x90145, 0x68 },
+       { 0x90146, 0x8 },
+       { 0x90147, 0x8558 },
+       { 0x90148, 0x168 },
+       { 0x90149, 0xf },
+       { 0x9014a, 0x408 },
+       { 0x9014b, 0x169 },
+       { 0x9014c, 0xc },
+       { 0x9014d, 0x0 },
+       { 0x9014e, 0x68 },
+       { 0x9014f, 0x0 },
+       { 0x90150, 0x408 },
+       { 0x90151, 0x169 },
+       { 0x90152, 0x0 },
+       { 0x90153, 0x8558 },
+       { 0x90154, 0x168 },
+       { 0x90155, 0x8 },
+       { 0x90156, 0x3c8 },
+       { 0x90157, 0x1a9 },
+       { 0x90158, 0x3 },
+       { 0x90159, 0x370 },
+       { 0x9015a, 0x129 },
+       { 0x9015b, 0x20 },
+       { 0x9015c, 0x2aa },
+       { 0x9015d, 0x9 },
+       { 0x9015e, 0x0 },
+       { 0x9015f, 0x400 },
+       { 0x90160, 0x10e },
+       { 0x90161, 0x8 },
+       { 0x90162, 0xe8 },
+       { 0x90163, 0x109 },
+       { 0x90164, 0x0 },
+       { 0x90165, 0x8140 },
+       { 0x90166, 0x10c },
+       { 0x90167, 0x10 },
+       { 0x90168, 0x8138 },
+       { 0x90169, 0x10c },
+       { 0x9016a, 0x8 },
+       { 0x9016b, 0x7c8 },
+       { 0x9016c, 0x101 },
+       { 0x9016d, 0x8 },
+       { 0x9016e, 0x0 },
+       { 0x9016f, 0x8 },
+       { 0x90170, 0x8 },
+       { 0x90171, 0x448 },
+       { 0x90172, 0x109 },
+       { 0x90173, 0xf },
+       { 0x90174, 0x7c0 },
+       { 0x90175, 0x109 },
+       { 0x90176, 0x0 },
+       { 0x90177, 0xe8 },
+       { 0x90178, 0x109 },
+       { 0x90179, 0x47 },
+       { 0x9017a, 0x630 },
+       { 0x9017b, 0x109 },
+       { 0x9017c, 0x8 },
+       { 0x9017d, 0x618 },
+       { 0x9017e, 0x109 },
+       { 0x9017f, 0x8 },
+       { 0x90180, 0xe0 },
+       { 0x90181, 0x109 },
+       { 0x90182, 0x0 },
+       { 0x90183, 0x7c8 },
+       { 0x90184, 0x109 },
+       { 0x90185, 0x8 },
+       { 0x90186, 0x8140 },
+       { 0x90187, 0x10c },
+       { 0x90188, 0x0 },
+       { 0x90189, 0x1 },
+       { 0x9018a, 0x8 },
+       { 0x9018b, 0x8 },
+       { 0x9018c, 0x4 },
+       { 0x9018d, 0x8 },
+       { 0x9018e, 0x8 },
+       { 0x9018f, 0x7c8 },
+       { 0x90190, 0x101 },
+       { 0x90006, 0x0 },
+       { 0x90007, 0x0 },
+       { 0x90008, 0x8 },
+       { 0x90009, 0x0 },
+       { 0x9000a, 0x0 },
+       { 0x9000b, 0x0 },
+       { 0xd00e7, 0x400 },
+       { 0x90017, 0x0 },
+       { 0x9001f, 0x2b },
+       { 0x90026, 0x6c },
+       { 0x400d0, 0x0 },
+       { 0x400d1, 0x101 },
+       { 0x400d2, 0x105 },
+       { 0x400d3, 0x107 },
+       { 0x400d4, 0x10f },
+       { 0x400d5, 0x202 },
+       { 0x400d6, 0x20a },
+       { 0x400d7, 0x20b },
+       { 0x2003a, 0x2 },
+       { 0x2000b, 0x64 },
+       { 0x2000c, 0xc8 },
+       { 0x2000d, 0x7d0 },
+       { 0x2000e, 0x2c },
+       { 0x12000b, 0x14 },
+       { 0x12000c, 0x29 },
+       { 0x12000d, 0x1a1 },
+       { 0x12000e, 0x10 },
+       { 0x22000b, 0x3 },
+       { 0x22000c, 0x6 },
+       { 0x22000d, 0x3e },
+       { 0x22000e, 0x10 },
+       { 0x9000c, 0x0 },
+       { 0x9000d, 0x173 },
+       { 0x9000e, 0x60 },
+       { 0x9000f, 0x6110 },
+       { 0x90010, 0x2152 },
+       { 0x90011, 0xdfbd },
+       { 0x90012, 0x60 },
+       { 0x90013, 0x6152 },
+       { 0x20010, 0x5a },
+       { 0x20011, 0x3 },
+       { 0x40080, 0xe0 },
+       { 0x40081, 0x12 },
+       { 0x40082, 0xe0 },
+       { 0x40083, 0x12 },
+       { 0x40084, 0xe0 },
+       { 0x40085, 0x12 },
+       { 0x140080, 0xe0 },
+       { 0x140081, 0x12 },
+       { 0x140082, 0xe0 },
+       { 0x140083, 0x12 },
+       { 0x140084, 0xe0 },
+       { 0x140085, 0x12 },
+       { 0x240080, 0xe0 },
+       { 0x240081, 0x12 },
+       { 0x240082, 0xe0 },
+       { 0x240083, 0x12 },
+       { 0x240084, 0xe0 },
+       { 0x240085, 0x12 },
+       { 0x400fd, 0xf },
+       { 0x10011, 0x1 },
+       { 0x10012, 0x1 },
+       { 0x10013, 0x180 },
+       { 0x10018, 0x1 },
+       { 0x10002, 0x6209 },
+       { 0x100b2, 0x1 },
+       { 0x101b4, 0x1 },
+       { 0x102b4, 0x1 },
+       { 0x103b4, 0x1 },
+       { 0x104b4, 0x1 },
+       { 0x105b4, 0x1 },
+       { 0x106b4, 0x1 },
+       { 0x107b4, 0x1 },
+       { 0x108b4, 0x1 },
+       { 0x11011, 0x1 },
+       { 0x11012, 0x1 },
+       { 0x11013, 0x180 },
+       { 0x11018, 0x1 },
+       { 0x11002, 0x6209 },
+       { 0x110b2, 0x1 },
+       { 0x111b4, 0x1 },
+       { 0x112b4, 0x1 },
+       { 0x113b4, 0x1 },
+       { 0x114b4, 0x1 },
+       { 0x115b4, 0x1 },
+       { 0x116b4, 0x1 },
+       { 0x117b4, 0x1 },
+       { 0x118b4, 0x1 },
+       { 0x12011, 0x1 },
+       { 0x12012, 0x1 },
+       { 0x12013, 0x180 },
+       { 0x12018, 0x1 },
+       { 0x12002, 0x6209 },
+       { 0x120b2, 0x1 },
+       { 0x121b4, 0x1 },
+       { 0x122b4, 0x1 },
+       { 0x123b4, 0x1 },
+       { 0x124b4, 0x1 },
+       { 0x125b4, 0x1 },
+       { 0x126b4, 0x1 },
+       { 0x127b4, 0x1 },
+       { 0x128b4, 0x1 },
+       { 0x13011, 0x1 },
+       { 0x13012, 0x1 },
+       { 0x13013, 0x180 },
+       { 0x13018, 0x1 },
+       { 0x13002, 0x6209 },
+       { 0x130b2, 0x1 },
+       { 0x131b4, 0x1 },
+       { 0x132b4, 0x1 },
+       { 0x133b4, 0x1 },
+       { 0x134b4, 0x1 },
+       { 0x135b4, 0x1 },
+       { 0x136b4, 0x1 },
+       { 0x137b4, 0x1 },
+       { 0x138b4, 0x1 },
+       { 0x20089, 0x1 },
+       { 0x20088, 0x19 },
+       { 0xc0080, 0x2 },
+       { 0xd0000, 0x1 },
+};
+
+static struct dram_fsp_msg lpddr4_dram_fsp_msg[] = {
+       {
+               /* P0 3200mts 1D */
+               .drate = 3200,
+               .fw_type = FW_1D_IMAGE,
+               .fsp_cfg = lpddr4_fsp0_cfg,
+               .fsp_cfg_num = ARRAY_SIZE(lpddr4_fsp0_cfg),
+       },
+       {
+               /* P1 667mts 1D */
+               .drate = 667,
+               .fw_type = FW_1D_IMAGE,
+               .fsp_cfg = lpddr4_fsp1_cfg,
+               .fsp_cfg_num = ARRAY_SIZE(lpddr4_fsp1_cfg),
+       },
+       {
+               /* P0 3200mts 2D */
+               .drate = 3200,
+               .fw_type = FW_2D_IMAGE,
+               .fsp_cfg = lpddr4_fsp0_2d_cfg,
+               .fsp_cfg_num = ARRAY_SIZE(lpddr4_fsp0_2d_cfg),
+       },
+};
+
+/* lpddr4 timing config params on EVK board */
+struct dram_timing_info dram_timing_b0 = {
+       .ddrc_cfg = lpddr4_ddrc_cfg,
+       .ddrc_cfg_num = ARRAY_SIZE(lpddr4_ddrc_cfg),
+       .ddrphy_cfg = lpddr4_ddrphy_cfg,
+       .ddrphy_cfg_num = ARRAY_SIZE(lpddr4_ddrphy_cfg),
+       .fsp_msg = lpddr4_dram_fsp_msg,
+       .fsp_msg_num = ARRAY_SIZE(lpddr4_dram_fsp_msg),
+       .ddrphy_pie = lpddr4_phy_pie,
+       .ddrphy_pie_num = ARRAY_SIZE(lpddr4_phy_pie),
+       /*
+        * this table must be initialized if DDRPHY bypass mode is
+        * not used: all fsp drate > 666MTS.
+        */
+       .fsp_table = { 3200, 667, },
+};
diff --git a/board/purism/librem5/spl.c b/board/purism/librem5/spl.c
new file mode 100644 (file)
index 0000000..a068f76
--- /dev/null
@@ -0,0 +1,592 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright 2018 NXP
+ * Copyright 2021 Purism
+ */
+
+#include <common.h>
+#include <asm/io.h>
+#include <errno.h>
+#include <asm/io.h>
+#include <asm/arch/ddr.h>
+#include <asm/arch/imx8mq_pins.h>
+#include <asm/arch/sys_proto.h>
+#include <asm/arch/clock.h>
+#include <asm/mach-imx/boot_mode.h>
+#include <asm/mach-imx/iomux-v3.h>
+#include <asm/mach-imx/gpio.h>
+#include <asm/mach-imx/mxc_i2c.h>
+#include <fsl_esdhc_imx.h>
+#include <mmc.h>
+#include <power/pmic.h>
+#include <power/bd71837.h>
+#include <hang.h>
+#include <init.h>
+#include <spl.h>
+#include <usb.h>
+#include <dwc3-uboot.h>
+#include <linux/delay.h>
+#include "librem5.h"
+
+DECLARE_GLOBAL_DATA_PTR;
+
+void spl_dram_init(void)
+{
+       /* ddr init */
+       if ((get_cpu_rev() & 0xfff) == CHIP_REV_2_1)
+               ddr_init(&dram_timing);
+       else
+               ddr_init(&dram_timing_b0);
+}
+
+int spl_board_boot_device(enum boot_device boot_dev_spl)
+{
+       log_debug("%s : starting\n", __func__);
+
+       switch (boot_dev_spl) {
+       case SD1_BOOT:
+       case MMC1_BOOT:
+               return BOOT_DEVICE_MMC1;
+       case USB_BOOT:
+               return BOOT_DEVICE_BOARD;
+       default:
+               return BOOT_DEVICE_NONE;
+       }
+}
+
+#define ECSPI_PAD_CTRL (PAD_CTL_DSE2 | PAD_CTL_HYS)
+
+static const iomux_v3_cfg_t ecspi_pads[] = {
+       IMX8MQ_PAD_ECSPI1_SCLK__ECSPI1_SCLK | MUX_PAD_CTRL(ECSPI_PAD_CTRL),
+       IMX8MQ_PAD_ECSPI1_SS0__GPIO5_IO9 | MUX_PAD_CTRL(ECSPI_PAD_CTRL),
+       IMX8MQ_PAD_ECSPI1_MOSI__ECSPI1_MOSI | MUX_PAD_CTRL(ECSPI_PAD_CTRL),
+       IMX8MQ_PAD_ECSPI1_MISO__ECSPI1_MISO | MUX_PAD_CTRL(ECSPI_PAD_CTRL),
+};
+
+int board_ecspi_init(void)
+{
+       imx_iomux_v3_setup_multiple_pads(ecspi_pads, ARRAY_SIZE(ecspi_pads));
+
+       return 0;
+}
+
+int board_spi_cs_gpio(unsigned int bus, unsigned int cs)
+{
+       return (bus == 0 && cs == 0) ? (SPI1_SS0) : -1;
+}
+
+#define I2C_PAD_CTRL   (PAD_CTL_PUE | PAD_CTL_ODE | PAD_CTL_DSE7 | PAD_CTL_FSEL3)
+#define PC MUX_PAD_CTRL(I2C_PAD_CTRL)
+struct i2c_pads_info i2c_pad_info1 = {
+       .scl = {
+               .i2c_mode = IMX8MQ_PAD_I2C1_SCL__I2C1_SCL | PC,
+               .gpio_mode = IMX8MQ_PAD_I2C1_SCL__GPIO5_IO14 | PC,
+               .gp = IMX_GPIO_NR(5, 14),
+       },
+       .sda = {
+               .i2c_mode = IMX8MQ_PAD_I2C1_SDA__I2C1_SDA | PC,
+               .gpio_mode = IMX8MQ_PAD_I2C1_SDA__GPIO5_IO15 | PC,
+               .gp = IMX_GPIO_NR(5, 15),
+       },
+};
+
+struct i2c_pads_info i2c_pad_info2 = {
+       .scl = {
+               .i2c_mode = IMX8MQ_PAD_I2C2_SCL__I2C2_SCL | PC,
+               .gpio_mode = IMX8MQ_PAD_I2C2_SCL__GPIO5_IO16 | PC,
+               .gp = IMX_GPIO_NR(5, 16),
+       },
+       .sda = {
+               .i2c_mode = IMX8MQ_PAD_I2C2_SDA__I2C2_SDA | PC,
+               .gpio_mode = IMX8MQ_PAD_I2C2_SDA__GPIO5_IO17 | PC,
+               .gp = IMX_GPIO_NR(5, 17),
+       },
+};
+
+struct i2c_pads_info i2c_pad_info3 = {
+       .scl = {
+               .i2c_mode = IMX8MQ_PAD_I2C3_SCL__I2C3_SCL | PC,
+               .gpio_mode = IMX8MQ_PAD_I2C3_SCL__GPIO5_IO18 | PC,
+               .gp = IMX_GPIO_NR(5, 18),
+       },
+       .sda = {
+               .i2c_mode = IMX8MQ_PAD_I2C3_SDA__I2C3_SDA | PC,
+               .gpio_mode = IMX8MQ_PAD_I2C3_SDA__GPIO5_IO19 | PC,
+               .gp = IMX_GPIO_NR(5, 19),
+       },
+};
+
+struct i2c_pads_info i2c_pad_info4 = {
+       .scl = {
+               .i2c_mode = IMX8MQ_PAD_I2C4_SCL__I2C4_SCL | PC,
+               .gpio_mode = IMX8MQ_PAD_I2C4_SCL__GPIO5_IO20 | PC,
+               .gp = IMX_GPIO_NR(5, 20),
+       },
+       .sda = {
+               .i2c_mode = IMX8MQ_PAD_I2C4_SDA__I2C4_SDA | PC,
+               .gpio_mode = IMX8MQ_PAD_I2C4_SDA__GPIO5_IO21 | PC,
+               .gp = IMX_GPIO_NR(5, 21),
+       },
+};
+
+#define UART_PAD_CTRL  (PAD_CTL_DSE6 | PAD_CTL_FSEL1)
+
+static const iomux_v3_cfg_t uart_pads[] = {
+       IMX8MQ_PAD_UART1_RXD__UART1_RX | MUX_PAD_CTRL(UART_PAD_CTRL),
+       IMX8MQ_PAD_UART1_TXD__UART1_TX | MUX_PAD_CTRL(UART_PAD_CTRL),
+       IMX8MQ_PAD_UART2_RXD__UART2_RX | MUX_PAD_CTRL(UART_PAD_CTRL),
+       IMX8MQ_PAD_UART2_TXD__UART2_TX | MUX_PAD_CTRL(UART_PAD_CTRL),
+       IMX8MQ_PAD_UART3_RXD__UART3_RX | MUX_PAD_CTRL(UART_PAD_CTRL),
+       IMX8MQ_PAD_UART3_TXD__UART3_TX | MUX_PAD_CTRL(UART_PAD_CTRL),
+       IMX8MQ_PAD_ECSPI2_SCLK__UART4_RX | MUX_PAD_CTRL(UART_PAD_CTRL),
+       IMX8MQ_PAD_ECSPI2_MOSI__UART4_TX | MUX_PAD_CTRL(UART_PAD_CTRL),
+};
+
+#define USDHC1_PWR_GPIO IMX_GPIO_NR(2, 10)
+#define USDHC2_PWR_GPIO IMX_GPIO_NR(2, 19)
+
+int board_mmc_getcd(struct mmc *mmc)
+{
+       struct fsl_esdhc_cfg *cfg = (struct fsl_esdhc_cfg *)mmc->priv;
+       int ret = 0;
+
+       switch (cfg->esdhc_base) {
+       case USDHC1_BASE_ADDR:
+               ret = 1;
+               break;
+       case USDHC2_BASE_ADDR:
+               ret = 1;
+               break;
+       }
+
+       return ret;
+}
+
+#define USDHC_PAD_CTRL (PAD_CTL_DSE6 | PAD_CTL_HYS | PAD_CTL_PUE | \
+                        PAD_CTL_FSEL1)
+#define USDHC_GPIO_PAD_CTRL (PAD_CTL_PUE | PAD_CTL_DSE1)
+
+static const iomux_v3_cfg_t usdhc1_pads[] = {
+       IMX8MQ_PAD_SD1_CLK__USDHC1_CLK | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+       IMX8MQ_PAD_SD1_CMD__USDHC1_CMD | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+       IMX8MQ_PAD_SD1_DATA0__USDHC1_DATA0 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+       IMX8MQ_PAD_SD1_DATA1__USDHC1_DATA1 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+       IMX8MQ_PAD_SD1_DATA2__USDHC1_DATA2 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+       IMX8MQ_PAD_SD1_DATA3__USDHC1_DATA3 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+       IMX8MQ_PAD_SD1_DATA4__USDHC1_DATA4 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+       IMX8MQ_PAD_SD1_DATA5__USDHC1_DATA5 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+       IMX8MQ_PAD_SD1_DATA6__USDHC1_DATA6 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+       IMX8MQ_PAD_SD1_DATA7__USDHC1_DATA7 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+       IMX8MQ_PAD_SD1_RESET_B__GPIO2_IO10 | MUX_PAD_CTRL(NO_PAD_CTRL),
+};
+
+static const iomux_v3_cfg_t usdhc2_pads[] = {
+       IMX8MQ_PAD_SD2_CLK__USDHC2_CLK | MUX_PAD_CTRL(USDHC_PAD_CTRL), /* 0xd6 */
+       IMX8MQ_PAD_SD2_CMD__USDHC2_CMD | MUX_PAD_CTRL(USDHC_PAD_CTRL), /* 0xd6 */
+       IMX8MQ_PAD_SD2_DATA0__USDHC2_DATA0 | MUX_PAD_CTRL(USDHC_PAD_CTRL), /* 0xd6 */
+       IMX8MQ_PAD_SD2_DATA1__USDHC2_DATA1 | MUX_PAD_CTRL(USDHC_PAD_CTRL), /* 0xd6 */
+       IMX8MQ_PAD_SD2_DATA2__USDHC2_DATA2 | MUX_PAD_CTRL(USDHC_PAD_CTRL), /* 0x16 */
+       IMX8MQ_PAD_SD2_DATA3__USDHC2_DATA3 | MUX_PAD_CTRL(USDHC_PAD_CTRL), /* 0xd6 */
+       IMX8MQ_PAD_SD2_RESET_B__GPIO2_IO19 | MUX_PAD_CTRL(USDHC_GPIO_PAD_CTRL),
+};
+
+static struct fsl_esdhc_cfg usdhc_cfg[2] = {
+       {USDHC1_BASE_ADDR, 0, 8},
+       {USDHC2_BASE_ADDR, 0, 4},
+};
+
+int board_mmc_init(struct bd_info *bis)
+{
+       int i, ret;
+       /*
+        * According to the board_mmc_init() the following map is done:
+        * (U-Boot device node)    (Physical Port)
+        * mmc0                    USDHC1
+        * mmc1                    USDHC2
+        */
+       for (i = 0; i < CONFIG_SYS_FSL_USDHC_NUM; i++) {
+               log_debug("Initializing FSL USDHC port %d\n", i);
+               switch (i) {
+               case 0:
+                       init_clk_usdhc(0);
+                       usdhc_cfg[0].sdhc_clk = mxc_get_clock(USDHC1_CLK_ROOT);
+                       imx_iomux_v3_setup_multiple_pads(usdhc1_pads,
+                                                        ARRAY_SIZE(usdhc1_pads));
+                       gpio_request(USDHC1_PWR_GPIO, "usdhc1_reset");
+                       gpio_direction_output(USDHC1_PWR_GPIO, 0);
+                       udelay(500);
+                       gpio_direction_output(USDHC1_PWR_GPIO, 1);
+                       break;
+               case 1:
+                       init_clk_usdhc(1);
+                       usdhc_cfg[1].sdhc_clk = mxc_get_clock(USDHC2_CLK_ROOT);
+                       imx_iomux_v3_setup_multiple_pads(usdhc2_pads,
+                                                        ARRAY_SIZE(usdhc2_pads));
+                       gpio_request(USDHC2_PWR_GPIO, "usdhc2_reset");
+                       gpio_direction_output(USDHC2_PWR_GPIO, 0);
+                       udelay(500);
+                       gpio_direction_output(USDHC2_PWR_GPIO, 1);
+                       break;
+               default:
+                       log_err("Warning: USDHC controller(%d) not supported\n", i + 1);
+                       return -EINVAL;
+               }
+
+               ret = fsl_esdhc_initialize(bis, &usdhc_cfg[i]);
+               if (ret)
+                       return ret;
+       }
+
+       return 0;
+}
+
+#define LDO_VOLT_EN                     BIT(6)
+
+/*
+ * Disable the charger - it will be re-enabled in u-boot
+ */
+void disable_charger_bq25895(void)
+{
+       u8 val;
+       int timeout = 1000; // ms
+
+       /* Set the i2c bus */
+       i2c_set_bus_num(3);
+
+       /* disable ship mode if BATFET_DLY is set */
+       val = i2c_reg_read(0x6a, 0x09);
+       log_debug("REG09 0x%x\n", val);
+       if (val & 0x28) {
+               val = val & ~0x28;
+               i2c_reg_write(0x6a, 0x09, val);
+       }
+
+       /* disable and trigger DPDM, ICO, HVDCP and MaxCharge */
+       val = i2c_reg_read(0x6a, 0x02);
+       log_debug("REG02 0x%x\n", val);
+       val &= 0xe0;
+       i2c_reg_write(0x6a, 0x02, val);
+
+       /* disable charger and enable BAT_LOADEN */
+       val = i2c_reg_read(0x6a, 0x03);
+       log_debug("REG03 0x%x\n", val);
+       val = (val | 0x80) & ~0x10;
+       i2c_reg_write(0x6a, 0x03, val);
+
+       mdelay(10);
+
+       /* force ADC conversions */
+       val = i2c_reg_read(0x6a, 0x02);
+       log_debug("REG02 0x%x\n", val);
+       val = (val | 0x80) & ~0x40;
+       i2c_reg_write(0x6a, 0x02, val);
+
+       do {
+               mdelay(10);
+               timeout -= 10;
+       } while ((i2c_reg_read(0x6a, 0x02) & 0x80) && (timeout > 0));
+
+       /* enable STAT pin */
+       val = i2c_reg_read(0x6a, 0x07);
+       log_debug("REG07 0x%x\n", val);
+       val = val & ~0x40;
+       i2c_reg_write(0x6a, 0x07, val);
+
+       /* check VBUS */
+       val = i2c_reg_read(0x6a, 0x11);
+       log_debug("VBUS good %d\n", (val >> 7) & 1);
+       log_debug("VBUS mV %d\n", (val & 0x7f) * 100 + 2600);
+
+       /* check VBAT */
+       val = i2c_reg_read(0x6a, 0x0e);
+       log_debug("VBAT mV %d\n", (val & 0x7f) * 20 + 2304);
+
+       /* limit the VINDPM to 3.9V  */
+       i2c_reg_write(0x6a, 0x0d, 0x8d);
+
+       /* set the max voltage to 4.192V */
+       val = i2c_reg_read(0x6a, 0x6);
+       val = (val & ~0xFC) | 0x16 << 2;
+       i2c_reg_write(0x6a, 0x6, val);
+
+       /* set the SYS_MIN to 3.7V */
+       val = i2c_reg_read(0x6a, 0x3);
+       val = val | 0xE;
+       i2c_reg_write(0x6a, 0x3, val);
+
+       /* disable BAT_LOADEN */
+       val = i2c_reg_read(0x6a, 0x03);
+       log_debug("REG03 0x%x\n", val);
+       val = val & ~0x80;
+       i2c_reg_write(0x6a, 0x03, val);
+}
+
+#define I2C_PMIC       0
+
+int power_bd71837_init(unsigned char bus)
+{
+       static const char name[] = BD718XX_REGULATOR_DRIVER;
+       struct pmic *p = pmic_alloc();
+
+       if (!p) {
+               log_err("%s: POWER allocation error!\n", __func__);
+               return -ENOMEM;
+       }
+
+       p->name = name;
+       p->interface = I2C_PMIC;
+       p->number_of_regs = BD718XX_MAX_REGISTER;
+       p->hw.i2c.addr = CONFIG_POWER_BD71837_I2C_ADDR;
+       p->hw.i2c.tx_num = 1;
+       p->bus = bus;
+
+       return 0;
+}
+
+int power_init_board(void)
+{
+       struct pmic *p;
+       int ldo[] = {BD718XX_LDO5_VOLT, BD718XX_LDO6_VOLT,
+                    BD71837_LDO7_VOLT};
+       u32 val;
+       int i, rv;
+
+       /* Set the i2c bus */
+       setup_i2c(0, CONFIG_SYS_I2C_SPEED, 0x7f, &i2c_pad_info1);
+
+       /*
+        * Init PMIC
+        */
+       rv = power_bd71837_init(CONFIG_POWER_BD71837_I2C_BUS);
+       if (rv) {
+               log_err("%s: power_bd71837_init(%d) error %d\n", __func__,
+                       CONFIG_POWER_BD71837_I2C_BUS, rv);
+               goto out;
+       }
+
+       p = pmic_get(BD718XX_REGULATOR_DRIVER);
+       if (!p) {
+               log_err("%s: pmic_get(%s) failed\n", __func__, BD718XX_REGULATOR_DRIVER);
+               rv = -ENODEV;
+               goto out;
+       }
+
+       rv = pmic_probe(p);
+       if (rv) {
+               log_err("%s: pmic_probe() error %d\n", __func__, rv);
+               goto out;
+       }
+
+       /*
+        * Unlock all regs
+        */
+       pmic_reg_write(p, BD718XX_REGLOCK, 0);
+
+       /* find the reset cause */
+       pmic_reg_read(p, 0x29, &val);
+       log_debug("%s: reset cause %d\n", __func__, val);
+
+       /*
+        * Reconfigure default voltages and disable:
+        * - BUCK3: VDD_GPU_0V9 (1.00 -> 0.90)
+        * - BUCK4: VDD_VPU_0V9 (1.00 -> 0.90)
+        */
+       pmic_reg_write(p, BD71837_BUCK3_VOLT_RUN, 0x14);
+       pmic_reg_write(p, BD71837_BUCK4_VOLT_RUN, 0x14);
+
+       /*
+        * Enable PHYs voltages: LDO5-7
+        */
+       for (i = 0; i < ARRAY_SIZE(ldo); i++) {
+               rv = pmic_reg_read(p, ldo[i], &val);
+               if (rv) {
+                       log_err("%s: pmic_read(%x) error %d\n", __func__,
+                               ldo[i], rv);
+                       continue;
+               }
+
+               pmic_reg_write(p, ldo[i], val | LDO_VOLT_EN);
+       }
+
+       udelay(500);
+
+       rv = 0;
+out:
+       return rv;
+}
+
+int usb_gadget_handle_interrupts(void)
+{
+       dwc3_uboot_handle_interrupt(0);
+       return 0;
+}
+
+static void dwc3_nxp_usb_phy_init(struct dwc3_device *dwc3)
+{
+       u32 RegData;
+
+       RegData = readl(dwc3->base + USB_PHY_CTRL1);
+       RegData &= ~(USB_PHY_CTRL1_VDATSRCENB0 | USB_PHY_CTRL1_VDATDETENB0 |
+                       USB_PHY_CTRL1_COMMONONN);
+       RegData |= USB_PHY_CTRL1_RESET | USB_PHY_CTRL1_ATERESET;
+       writel(RegData, dwc3->base + USB_PHY_CTRL1);
+
+       RegData = readl(dwc3->base + USB_PHY_CTRL0);
+       RegData |= USB_PHY_CTRL0_REF_SSP_EN;
+       RegData &= ~USB_PHY_CTRL0_SSC_RANGE_MASK;
+       RegData |= USB_PHY_CTRL0_SSC_RANGE_4003PPM;
+       writel(RegData, dwc3->base + USB_PHY_CTRL0);
+
+       RegData = readl(dwc3->base + USB_PHY_CTRL2);
+       RegData |= USB_PHY_CTRL2_TXENABLEN0;
+       writel(RegData, dwc3->base + USB_PHY_CTRL2);
+
+       RegData = readl(dwc3->base + USB_PHY_CTRL1);
+       RegData &= ~(USB_PHY_CTRL1_RESET | USB_PHY_CTRL1_ATERESET);
+       writel(RegData, dwc3->base + USB_PHY_CTRL1);
+
+       /* Disable rx term override */
+       RegData = readl(dwc3->base + USB_PHY_CTRL6);
+       RegData &= ~USB_PHY_CTRL6_RXTERM_OVERRIDE_SEL;
+       writel(RegData, dwc3->base + USB_PHY_CTRL6);
+}
+
+static struct dwc3_device dwc3_device0_data = {
+       .maximum_speed = USB_SPEED_HIGH,
+       .base = USB1_BASE_ADDR,
+       .dr_mode = USB_DR_MODE_PERIPHERAL,
+       .index = 0,
+};
+
+static struct dwc3_device dwc3_device1_data = {
+       .maximum_speed = USB_SPEED_HIGH,
+       .base = USB2_BASE_ADDR,
+       .dr_mode = USB_DR_MODE_HOST,
+       .index = 1,
+};
+
+int board_usb_init(int index, enum usb_init_type init)
+{
+       int ret = 0;
+
+       printf("%s : index %d type %d\n", __func__, index, init);
+
+       if (index == 0 && init == USB_INIT_DEVICE) {
+               dwc3_nxp_usb_phy_init(&dwc3_device0_data);
+               ret = dwc3_uboot_init(&dwc3_device0_data);
+       }
+       if (index == 1 && init == USB_INIT_HOST) {
+               dwc3_nxp_usb_phy_init(&dwc3_device1_data);
+               ret = dwc3_uboot_init(&dwc3_device1_data);
+       }
+
+       return ret;
+}
+
+int board_usb_cleanup(int index, enum usb_init_type init)
+{
+       u32 RegData;
+       struct dwc3_device *dwc3;
+
+       printf("%s : %d\n", __func__, index);
+
+       if (index == 0 && init == USB_INIT_DEVICE)
+               dwc3 = &dwc3_device0_data;
+       if (index == 1 && init == USB_INIT_HOST)
+               dwc3 = &dwc3_device1_data;
+
+       dwc3_uboot_exit(index);
+
+       /* reset the phy */
+       RegData = readl(dwc3->base + USB_PHY_CTRL1);
+       RegData &= ~(USB_PHY_CTRL1_VDATSRCENB0 | USB_PHY_CTRL1_VDATDETENB0 |
+                       USB_PHY_CTRL1_COMMONONN);
+       RegData |= USB_PHY_CTRL1_RESET | USB_PHY_CTRL1_ATERESET;
+       writel(RegData, dwc3->base + USB_PHY_CTRL1);
+
+       /* enable rx term override */
+       RegData = readl(dwc3->base + USB_PHY_CTRL6);
+       RegData |= USB_PHY_CTRL6_RXTERM_OVERRIDE_SEL;
+       writel(RegData, dwc3->base + USB_PHY_CTRL6);
+
+       return 0;
+}
+
+void spl_board_init(void)
+{
+       if (is_usb_boot())
+               puts("USB Boot\n");
+       else
+               puts("Normal Boot\n");
+}
+
+void board_boot_order(u32 *spl_boot_list)
+{
+       if (is_usb_boot())
+               spl_boot_list[0] = BOOT_DEVICE_BOARD;
+       else
+               spl_boot_list[0] = BOOT_DEVICE_MMC1;
+}
+
+#define WDOG_PAD_CTRL  (PAD_CTL_DSE6 | PAD_CTL_HYS | PAD_CTL_PUE)
+
+static const iomux_v3_cfg_t wdog_pads[] = {
+       IMX8MQ_PAD_GPIO1_IO02__WDOG1_WDOG_B | MUX_PAD_CTRL(WDOG_PAD_CTRL),
+};
+
+void board_init_f(ulong dummy)
+{
+       int ret;
+       struct wdog_regs *wdog = (struct wdog_regs *)WDOG1_BASE_ADDR;
+
+       arch_cpu_init();
+
+       imx_iomux_v3_setup_multiple_pads(wdog_pads, ARRAY_SIZE(wdog_pads));
+       set_wdog_reset(wdog);
+
+       init_uart_clk(CONSOLE_UART_CLK);
+       imx_iomux_v3_setup_multiple_pads(uart_pads, ARRAY_SIZE(uart_pads));
+
+#ifdef CONSOLE_ON_UART4
+       gpio_request(WIFI_EN, "WIFI_EN");
+       gpio_direction_output(WIFI_EN, 1);
+#endif
+
+       board_early_init_f();
+
+       timer_init();
+
+       preloader_console_init();
+
+       ret = spl_init();
+       if (ret) {
+               log_err("spl_init() failed: %d\n", ret);
+               hang();
+       }
+
+       enable_tzc380();
+
+       printf("Initializing pinmux\n");
+       init_pinmux();
+       gpio_direction_output(LED_G, 1);
+       gpio_direction_output(MOTO, 1);
+       mdelay(50);
+       gpio_direction_output(MOTO, 0);
+
+       /* Enable and configure i2c buses not used below */
+       setup_i2c(1, CONFIG_SYS_I2C_SPEED, 0x7f, &i2c_pad_info2);
+       setup_i2c(2, CONFIG_SYS_I2C_SPEED, 0x7f, &i2c_pad_info3);
+       setup_i2c(3, CONFIG_SYS_I2C_SPEED, 0x7f, &i2c_pad_info4);
+
+       power_init_board();
+
+       disable_charger_bq25895();
+
+       /* initialize this for M4 even if u-boot doesn't have SF_CMD */
+       printf("Initializing ECSPI\n");
+       board_ecspi_init();
+
+       /* DDR initialization */
+       printf("Initializing DRAM\n");
+       spl_dram_init();
+}
index 0352d34..daa1beb 100644 (file)
@@ -9,6 +9,7 @@
 
 #include <common.h>
 #include <dm.h>
+#include <fdt_support.h>
 #include <init.h>
 #include <asm/global_data.h>
 #include <dm/uclass-internal.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
-/* If the firmware passed a device tree use it for U-Boot DRAM setup. */
+/* If the firmware passed a device tree use it for e.g. U-Boot DRAM setup. */
 extern u64 rcar_atf_boot_args[];
 
+#define FDT_RPC_PATH   "/soc/spi@ee200000"
+
 int fdtdec_board_setup(const void *fdt_blob)
 {
        void *atf_fdt_blob = (void *)(rcar_atf_boot_args[1]);
@@ -81,7 +84,7 @@ static int is_mem_overlap(void *blob, int first_mem_node, int curr_mem_node)
        return 0;
 }
 
-int ft_board_setup(void *blob, struct bd_info *bd)
+static void scrub_duplicate_memory(void *blob)
 {
        /*
         * Scrub duplicate /memory@* node entries here. Some R-Car DTs might
@@ -119,6 +122,45 @@ int ft_board_setup(void *blob, struct bd_info *bd)
                first_mem_node = 0;
                mem = 0;
        }
+}
+
+static void update_rpc_status(void *blob)
+{
+       void *atf_fdt_blob = (void *)(rcar_atf_boot_args[1]);
+       int offset, enabled;
+
+       /*
+        * Check if the DT fragment received from TF-A had its RPC-IF device node
+        * enabled.
+        */
+       if (fdt_magic(atf_fdt_blob) != FDT_MAGIC)
+               return;
+
+       offset = fdt_path_offset(atf_fdt_blob, FDT_RPC_PATH);
+       if (offset < 0)
+               return;
+
+       enabled = fdtdec_get_is_enabled(atf_fdt_blob, offset);
+       if (!enabled)
+               return;
+
+       /*
+        * Find the RPC-IF device node, and enable it if it has a flash subnode.
+        */
+       offset = fdt_path_offset(blob, FDT_RPC_PATH);
+       if (offset < 0)
+               return;
+
+       if (fdt_subnode_offset(blob, offset, "flash") < 0)
+               return;
+
+       fdt_status_okay(blob, offset);
+}
+
+int ft_board_setup(void *blob, struct bd_info *bd)
+{
+       scrub_duplicate_memory(blob);
+       update_rpc_status(blob);
 
        return 0;
 }
index 6028a0b..581a4df 100644 (file)
@@ -494,7 +494,7 @@ static void sysconf_init(void)
        ret = uclass_get_device_by_driver(UCLASS_PMIC,
                                          DM_DRIVER_GET(stm32mp_pwr_pmic),
                                          &pwr_dev);
-       if (!ret && IS_ENABLED(CONFIG_DM_REGULATOR)) {
+       if (!ret) {
                ret = uclass_get_device_by_driver(UCLASS_MISC,
                                                  DM_DRIVER_GET(stm32mp_bsec),
                                                  &dev);
@@ -555,9 +555,6 @@ static int board_stm32mp15x_dk2_init(void)
        struct gpio_desc hdmi, audio;
        int ret = 0;
 
-       if (!IS_ENABLED(CONFIG_DM_REGULATOR))
-               return -ENODEV;
-
        /* Fix to make I2C1 usable on DK2 for touchscreen usage in kernel */
        node = ofnode_path("/soc/i2c@40012000/hdmi-transmitter@39");
        if (!ofnode_valid(node)) {
@@ -658,8 +655,7 @@ int board_init(void)
        if (board_is_stm32mp15x_dk2())
                board_stm32mp15x_dk2_init();
 
-       if (IS_ENABLED(CONFIG_DM_REGULATOR))
-               regulators_enable_boot_on(_DEBUG);
+       regulators_enable_boot_on(_DEBUG);
 
        /*
         * sysconf initialisation done only when U-Boot is running in secure
index ed34991..9fa7b7b 100644 (file)
@@ -86,7 +86,6 @@ __weak void gpi2c_init(void)
 static int __maybe_unused ti_i2c_eeprom_get(int bus_addr, int dev_addr,
                                            u32 header, u32 size, uint8_t *ep)
 {
-       u32 hdr_read = 0xdeadbeef;
        int rc;
 
 #if CONFIG_IS_ENABLED(DM_I2C)
@@ -113,10 +112,10 @@ static int __maybe_unused ti_i2c_eeprom_get(int bus_addr, int dev_addr,
         * We must allow for fall through to check the data if 2 byte
         * addressing works
         */
-       (void)dm_i2c_read(dev, 0, (uint8_t *)&hdr_read, 4);
+       (void)dm_i2c_read(dev, 0, ep, size);
 
        /* Corrupted data??? */
-       if (hdr_read != header) {
+       if (*((u32 *)ep) != header) {
                /*
                 * read the eeprom header using i2c again, but use only a
                 * 2 byte address (some newer boards need this..)
@@ -125,16 +124,12 @@ static int __maybe_unused ti_i2c_eeprom_get(int bus_addr, int dev_addr,
                if (rc)
                        return rc;
 
-               rc = dm_i2c_read(dev, 0, (uint8_t *)&hdr_read, 4);
+               rc = dm_i2c_read(dev, 0, ep, size);
                if (rc)
                        return rc;
        }
-       if (hdr_read != header)
+       if (*((u32 *)ep) != header)
                return -1;
-
-       rc = dm_i2c_read(dev, 0, ep, size);
-       if (rc)
-               return rc;
 #else
        u32 byte;
 
@@ -154,26 +149,21 @@ static int __maybe_unused ti_i2c_eeprom_get(int bus_addr, int dev_addr,
         * We must allow for fall through to check the data if 2 byte
         * addressing works
         */
-       (void)i2c_read(dev_addr, 0x0, byte, (uint8_t *)&hdr_read, 4);
+       (void)i2c_read(dev_addr, 0x0, byte, ep, size);
 
        /* Corrupted data??? */
-       if (hdr_read != header) {
+       if (*((u32 *)ep) != header) {
                /*
                 * read the eeprom header using i2c again, but use only a
                 * 2 byte address (some newer boards need this..)
                 */
                byte = 2;
-               rc = i2c_read(dev_addr, 0x0, byte, (uint8_t *)&hdr_read,
-                             4);
+               rc = i2c_read(dev_addr, 0x0, byte, ep, size);
                if (rc)
                        return rc;
        }
-       if (hdr_read != header)
+       if (*((u32 *)ep) != header)
                return -1;
-
-       rc = i2c_read(dev_addr, 0x0, byte, ep, size);
-       if (rc)
-               return rc;
 #endif
        return 0;
 }
index 243c97e..fb9aae6 100644 (file)
@@ -34,14 +34,11 @@ DECLARE_GLOBAL_DATA_PTR;
 int spl_board_boot_device(enum boot_device boot_dev_spl)
 {
        switch (boot_dev_spl) {
-       case MMC1_BOOT:
+       case MMC1_BOOT: /* eMMC */
                return BOOT_DEVICE_MMC1;
-       case SD2_BOOT:
+       case SD2_BOOT: /* SD card */
        case MMC2_BOOT:
                return BOOT_DEVICE_MMC2;
-       case SD3_BOOT:
-       case MMC3_BOOT:
-               return BOOT_DEVICE_MMC1;
        case USB_BOOT:
                return BOOT_DEVICE_BOARD;
        default:
@@ -56,6 +53,15 @@ void spl_dram_init(void)
 
 void spl_board_init(void)
 {
+       if (IS_ENABLED(CONFIG_FSL_CAAM)) {
+               struct udevice *dev;
+               int ret;
+
+               ret = uclass_get_device_by_driver(UCLASS_MISC, DM_DRIVER_GET(caam_jr), &dev);
+               if (ret)
+                       printf("Failed to initialize %s: %d\n", dev->name, ret);
+       }
+
        /* Serial download mode */
        if (is_usb_boot()) {
                puts("Back to ROM, SDP\n");
@@ -74,7 +80,6 @@ int board_fit_config_name_match(const char *name)
 }
 #endif
 
-
 __weak void board_early_init(void)
 {
        init_uart_clk(0);
index 7597cd8..bad8833 100644 (file)
@@ -102,9 +102,6 @@ static void select_dt_from_module_version(void)
        if (strcmp(variant, env_variant)) {
                printf("Setting variant to %s\n", variant);
                env_set("variant", variant);
-
-               if (IS_ENABLED(CONFIG_ENV_IS_NOWHERE))
-                       env_save();
        }
 }
 
index e3c1a12..783e2bd 100644 (file)
@@ -108,9 +108,6 @@ static void select_dt_from_module_version(void)
        if (strcmp(variant, env_variant)) {
                printf("Setting variant to %s\n", variant);
                env_set("variant", variant);
-
-               if (IS_ENABLED(CONFIG_ENV_IS_NOWHERE))
-                       env_save();
        }
 }
 
index 86dbfbc..e3233fd 100644 (file)
@@ -305,9 +305,9 @@ int bootm_find_images(int flag, int argc, char *const argv[], ulong start,
        /* check if FDT overlaps OS image */
        if (images.ft_addr &&
            (((ulong)images.ft_addr >= start &&
-             (ulong)images.ft_addr <= start + size) ||
+             (ulong)images.ft_addr < start + size) ||
             ((ulong)images.ft_addr + images.ft_len >= start &&
-             (ulong)images.ft_addr + images.ft_len <= start + size))) {
+             (ulong)images.ft_addr + images.ft_len < start + size))) {
                printf("ERROR: FDT image overlaps OS image (OS=0x%lx..0x%lx)\n",
                       start, start + size);
                return 1;
@@ -1006,7 +1006,7 @@ static int bootm_host_load_image(const void *fit, int req_image_type,
        int noffset;
        ulong load_end, buf_size;
        uint8_t image_type;
-       uint8_t imape_comp;
+       uint8_t image_comp;
        void *load_buf;
        int ret;
 
@@ -1024,20 +1024,18 @@ static int bootm_host_load_image(const void *fit, int req_image_type,
                return -EINVAL;
        }
 
-       if (fit_image_get_comp(fit, noffset, &imape_comp)) {
-               puts("Can't get image compression!\n");
-               return -EINVAL;
-       }
+       if (fit_image_get_comp(fit, noffset, &image_comp))
+               image_comp = IH_COMP_NONE;
 
        /* Allow the image to expand by a factor of 4, should be safe */
        buf_size = (1 << 20) + len * 4;
        load_buf = malloc(buf_size);
-       ret = image_decomp(imape_comp, 0, data, image_type, load_buf,
+       ret = image_decomp(image_comp, 0, data, image_type, load_buf,
                           (void *)data, len, buf_size, &load_end);
        free(load_buf);
 
        if (ret) {
-               ret = handle_decomp_error(imape_comp, load_end - 0, buf_size, ret);
+               ret = handle_decomp_error(image_comp, load_end - 0, buf_size, ret);
                if (ret != BOOTM_ERR_UNIMPLEMENTED)
                        return ret;
        }
index fea09b2..5c6c687 100644 (file)
@@ -35,8 +35,8 @@ static int distro_get_state_desc(struct udevice *dev, char *buf, int maxsize)
        return 0;
 }
 
-static int disto_getfile(struct pxe_context *ctx, const char *file_path,
-                        char *file_addr, ulong *sizep)
+static int distro_getfile(struct pxe_context *ctx, const char *file_path,
+                         char *file_addr, ulong *sizep)
 {
        struct distro_info *info = ctx->userdata;
        ulong addr;
@@ -113,7 +113,7 @@ static int distro_boot(struct udevice *dev, struct bootflow *bflow)
        addr = map_to_sysmem(bflow->buf);
        info.dev = dev;
        info.bflow = bflow;
-       ret = pxe_setup_ctx(&ctx, &cmdtp, disto_getfile, &info, true,
+       ret = pxe_setup_ctx(&ctx, &cmdtp, distro_getfile, &info, true,
                            bflow->subdir);
        if (ret)
                return log_msg_ret("ctx", -EINVAL);
index f1e2b4c..e699216 100644 (file)
@@ -23,8 +23,8 @@
 #include <net.h>
 #include <pxe_utils.h>
 
-static int disto_pxe_getfile(struct pxe_context *ctx, const char *file_path,
-                            char *file_addr, ulong *sizep)
+static int distro_pxe_getfile(struct pxe_context *ctx, const char *file_path,
+                             char *file_addr, ulong *sizep)
 {
        struct distro_info *info = ctx->userdata;
        ulong addr;
@@ -142,7 +142,7 @@ static int distro_pxe_boot(struct udevice *dev, struct bootflow *bflow)
        info.dev = dev;
        info.bflow = bflow;
        info.cmdtp = &cmdtp;
-       ret = pxe_setup_ctx(ctx, &cmdtp, disto_pxe_getfile, &info, false,
+       ret = pxe_setup_ctx(ctx, &cmdtp, distro_pxe_getfile, &info, false,
                            bflow->subdir);
        if (ret)
                return log_msg_ret("ctx", -EINVAL);
index df3e5df..f16eab9 100644 (file)
@@ -477,7 +477,7 @@ void fit_print_contents(const void *fit)
 void fit_image_print(const void *fit, int image_noffset, const char *p)
 {
        char *desc;
-       uint8_t type, arch, os, comp;
+       uint8_t type, arch, os, comp = IH_COMP_NONE;
        size_t size;
        ulong load, entry;
        const void *data;
@@ -794,7 +794,6 @@ int fit_image_get_comp(const void *fit, int noffset, uint8_t *comp)
        data = fdt_getprop(fit, noffset, FIT_COMP_PROP, &len);
        if (data == NULL) {
                fit_get_debug(fit, noffset, FIT_COMP_PROP, len);
-               *comp = -1;
                return -1;
        }
 
@@ -1917,6 +1916,43 @@ int fit_conf_get_prop_node(const void *fit, int noffset,
        return fit_conf_get_prop_node_index(fit, noffset, prop_name, 0);
 }
 
+static int fit_get_data_tail(const void *fit, int noffset,
+                            const void **data, size_t *size)
+{
+       char *desc;
+
+       if (noffset < 0)
+               return noffset;
+
+       if (!fit_image_verify(fit, noffset))
+               return -EINVAL;
+
+       if (fit_image_get_data_and_size(fit, noffset, data, size))
+               return -ENOENT;
+
+       if (!fit_get_desc(fit, noffset, &desc))
+               printf("%s\n", desc);
+
+       return 0;
+}
+
+int fit_get_data_node(const void *fit, const char *image_uname,
+                     const void **data, size_t *size)
+{
+       int noffset = fit_image_get_node(fit, image_uname);
+
+       return fit_get_data_tail(fit, noffset, data, size);
+}
+
+int fit_get_data_conf_prop(const void *fit, const char *prop_name,
+                          const void **data, size_t *size)
+{
+       int noffset = fit_conf_get_node(fit, NULL);
+
+       noffset = fit_conf_get_prop_node(fit, noffset, prop_name);
+       return fit_get_data_tail(fit, noffset, data, size);
+}
+
 static int fit_image_select(const void *fit, int rd_noffset, int verify)
 {
        fit_image_print(fit, rd_noffset, "   ");
index e6ee087..52b3283 100644 (file)
@@ -40,7 +40,7 @@ int vbe_find_next_device(struct udevice **devp)
 int vbe_find_first_device(struct udevice **devp)
 {
        uclass_find_first_device(UCLASS_BOOTMETH, devp);
-       if (*devp && is_vbe(*devp))
+       if (!*devp || is_vbe(*devp))
                return 0;
 
        return vbe_find_next_device(devp);
index a395bc2..0fc5738 100644 (file)
@@ -225,17 +225,16 @@ static int bootmeth_vbe_simple_ft_fixup(void *ctx, struct event *event)
 {
        oftree tree = event->data.ft_fixup.tree;
        struct udevice *dev;
-       ofnode node;
-       int ret;
 
        /*
         * Ideally we would have driver model support for fixups, but that does
         * not exist yet. It is a step too far to try to do this before VBE is
         * in place.
         */
-       for (ret = vbe_find_first_device(&dev); dev;
-            ret = vbe_find_next_device(&dev)) {
+       for (vbe_find_first_device(&dev); dev; vbe_find_next_device(&dev)) {
                struct simple_state state;
+               ofnode node;
+               int ret;
 
                if (strcmp("vbe_simple", dev->driver->name))
                        continue;
index 6db76e9..bfa12ce 100644 (file)
@@ -333,7 +333,7 @@ config BOOTM_RTEMS
 config CMD_VBE
        bool "vbe - Verified Boot for Embedded"
        depends on BOOTMETH_VBE
-       default y
+       default y if BOOTSTD_FULL
        help
          Provides various subcommands related to VBE, such as listing the
          available methods, looking at the state and changing which method
@@ -1721,7 +1721,7 @@ config CMD_TFTPBOOT
        bool "tftpboot"
        default y
        help
-         tftpboot - boot image via network using TFTP protocol
+         tftpboot - load file via network using TFTP protocol
 
 config CMD_TFTPPUT
        bool "tftp put"
index eb40f08..218be85 100644 (file)
--- a/cmd/dm.c
+++ b/cmd/dm.c
@@ -87,7 +87,7 @@ static char dm_help_text[] =
        "dm drivers       Dump list of drivers with uclass and instances\n"
        DM_MEM_HELP
        "dm static        Dump list of drivers with static platform data\n"
-       "dn tree          Dump tree of driver model devices ('*' = activated)\n"
+       "dm tree          Dump tree of driver model devices ('*' = activated)\n"
        "dm uclass        Dump list of instances for each uclass"
        ;
 #endif
index c4651dd..9cf7651 100644 (file)
@@ -322,7 +322,7 @@ static int do_fpga_loadmk(struct cmd_tbl *cmdtp, int flag, int argc,
        case IMAGE_FORMAT_FIT:
        {
                const void *fit_hdr = (const void *)fpga_data;
-               int noffset;
+               int err;
                const void *fit_data;
 
                if (!fit_uname) {
@@ -335,23 +335,11 @@ static int do_fpga_loadmk(struct cmd_tbl *cmdtp, int flag, int argc,
                        return CMD_RET_FAILURE;
                }
 
-               /* get fpga component image node offset */
-               noffset = fit_image_get_node(fit_hdr, fit_uname);
-               if (noffset < 0) {
-                       printf("Can't find '%s' FIT subimage\n", fit_uname);
-                       return CMD_RET_FAILURE;
-               }
-
-               /* verify integrity */
-               if (!fit_image_verify(fit_hdr, noffset)) {
-                       puts("Bad Data Hash\n");
-                       return CMD_RET_FAILURE;
-               }
-
-               /* get fpga subimage/external data address and length */
-               if (fit_image_get_data_and_size(fit_hdr, noffset,
-                                              &fit_data, &data_size)) {
-                       puts("Fpga subimage data not found\n");
+               err = fit_get_data_node(fit_hdr, fit_uname, &fit_data,
+                                       &data_size);
+               if (err) {
+                       printf("Could not load '%s' subimage (err %d)\n",
+                              fit_uname, err);
                        return CMD_RET_FAILURE;
                }
 
index bd04b14..e196a73 100644 (file)
--- a/cmd/i2c.c
+++ b/cmd/i2c.c
@@ -200,10 +200,10 @@ void i2c_init_board(void)
  *
  * Returns the address length.
  */
-static uint get_alen(char *arg, uint default_len)
+static uint get_alen(char *arg, int default_len)
 {
-       uint    j;
-       uint    alen;
+       int     j;
+       int     alen;
 
        alen = default_len;
        for (j = 0; j < 8; j++) {
@@ -247,7 +247,7 @@ static int do_i2c_read(struct cmd_tbl *cmdtp, int flag, int argc,
 {
        uint    chip;
        uint    devaddr, length;
-       uint    alen;
+       int alen;
        u_char  *memaddr;
        int ret;
 #if CONFIG_IS_ENABLED(DM_I2C)
@@ -301,7 +301,7 @@ static int do_i2c_write(struct cmd_tbl *cmdtp, int flag, int argc,
 {
        uint    chip;
        uint    devaddr, length;
-       uint    alen;
+       int alen;
        u_char  *memaddr;
        int ret;
 #if CONFIG_IS_ENABLED(DM_I2C)
@@ -469,8 +469,9 @@ static int do_i2c_md(struct cmd_tbl *cmdtp, int flag, int argc,
 {
        uint    chip;
        uint    addr, length;
-       uint    alen;
-       uint    j, nbytes, linebytes;
+       int alen;
+       int j;
+       uint nbytes, linebytes;
        int ret;
 #if CONFIG_IS_ENABLED(DM_I2C)
        struct udevice *dev;
@@ -589,9 +590,9 @@ static int do_i2c_mw(struct cmd_tbl *cmdtp, int flag, int argc,
 {
        uint    chip;
        ulong   addr;
-       uint    alen;
+       int     alen;
        uchar   byte;
-       uint    count;
+       int     count;
        int ret;
 #if CONFIG_IS_ENABLED(DM_I2C)
        struct udevice *dev;
@@ -676,8 +677,8 @@ static int do_i2c_crc(struct cmd_tbl *cmdtp, int flag, int argc,
 {
        uint    chip;
        ulong   addr;
-       uint    alen;
-       uint    count;
+       int     alen;
+       int     count;
        uchar   byte;
        ulong   crc;
        ulong   err;
@@ -985,7 +986,7 @@ static int do_i2c_loop(struct cmd_tbl *cmdtp, int flag, int argc,
                       char *const argv[])
 {
        uint    chip;
-       uint    alen;
+       int alen;
        uint    addr;
        uint    length;
        u_char  bytes[16];
index 120397d..9ec3aa9 100644 (file)
@@ -5,6 +5,7 @@ config CMD_MVEBU_BUBT
        bool "bubt"
        select SHA256 if ARMADA_3700
        select SHA512 if ARMADA_3700
+       select MVEBU_EFUSE if ARMADA_38X || ARMADA_3700
        help
          bubt - Burn a u-boot image to flash
          For details about bubt command please see the documentation
index 825d4be..1efbe2e 100644 (file)
@@ -13,6 +13,8 @@
 #include <vsprintf.h>
 #include <errno.h>
 #include <dm.h>
+#include <fuse.h>
+#include <mach/efuse.h>
 
 #include <spi_flash.h>
 #include <spi.h>
@@ -121,6 +123,17 @@ struct a38x_main_hdr_v1 {
        u8  checksum;              /* 0x1F      */
 };
 
+/*
+ * Header for the optional headers, version 1 (Armada 370/XP/375/38x/39x)
+ */
+struct a38x_opt_hdr_v1 {
+       u8      headertype;
+       u8      headersz_msb;
+       u16     headersz_lsb;
+       u8      data[0];
+};
+#define A38X_OPT_HDR_V1_SECURE_TYPE    0x1
+
 struct a38x_boot_mode {
        unsigned int id;
        const char *name;
@@ -688,9 +701,25 @@ static uint8_t image_checksum8(const void *start, size_t len)
        return csum;
 }
 
+static uint32_t image_checksum32(const void *start, size_t len)
+{
+       u32 csum = 0;
+       const u32 *p = start;
+
+       while (len) {
+               csum += *p;
+               ++p;
+               len -= sizeof(u32);
+       }
+
+       return csum;
+}
+
 static int check_image_header(void)
 {
        u8 checksum;
+       u32 checksum32, exp_checksum32;
+       u32 offset, size;
        const struct a38x_main_hdr_v1 *hdr =
                (struct a38x_main_hdr_v1 *)get_load_addr();
        const size_t image_size = a38x_header_size(hdr);
@@ -701,14 +730,74 @@ static int check_image_header(void)
        checksum = image_checksum8(hdr, image_size);
        checksum -= hdr->checksum;
        if (checksum != hdr->checksum) {
-               printf("Error: Bad A38x image checksum. 0x%x != 0x%x\n",
+               printf("Error: Bad A38x image header checksum. 0x%x != 0x%x\n",
                       checksum, hdr->checksum);
                return -ENOEXEC;
        }
 
+       offset = le32_to_cpu(hdr->srcaddr);
+       size = le32_to_cpu(hdr->blocksize);
+
+       if (hdr->blockid == 0x78) { /* SATA id */
+               if (offset < 1) {
+                       printf("Error: Bad A38x image srcaddr.\n");
+                       return -ENOEXEC;
+               }
+               offset -= 1;
+               offset *= 512;
+       }
+
+       if (hdr->blockid == 0xAE) /* SDIO id */
+               offset *= 512;
+
+       if (offset % 4 != 0 || size < 4 || size % 4 != 0) {
+               printf("Error: Bad A38x image blocksize.\n");
+               return -ENOEXEC;
+       }
+
+       checksum32 = image_checksum32((u8 *)hdr + offset, size - 4);
+       exp_checksum32 = *(u32 *)((u8 *)hdr + offset + size - 4);
+       if (checksum32 != exp_checksum32) {
+               printf("Error: Bad A38x image data checksum. 0x%08x != 0x%08x\n",
+                      checksum32, exp_checksum32);
+               return -ENOEXEC;
+       }
+
        printf("Image checksum...OK!\n");
        return 0;
 }
+
+#if defined(CONFIG_ARMADA_38X)
+static int a38x_image_is_secure(const struct a38x_main_hdr_v1 *hdr)
+{
+       u32 image_size = a38x_header_size(hdr);
+       struct a38x_opt_hdr_v1 *ohdr;
+       u32 ohdr_size;
+
+       if (hdr->version != 1)
+               return 0;
+
+       if (!hdr->ext)
+               return 0;
+
+       ohdr = (struct a38x_opt_hdr_v1 *)(hdr + 1);
+       do {
+               if (ohdr->headertype == A38X_OPT_HDR_V1_SECURE_TYPE)
+                       return 1;
+
+               ohdr_size = (ohdr->headersz_msb << 16) | le16_to_cpu(ohdr->headersz_lsb);
+
+               if (!*((u8 *)ohdr + ohdr_size - 4))
+                       break;
+
+               ohdr = (struct a38x_opt_hdr_v1 *)((u8 *)ohdr + ohdr_size);
+               if ((u8 *)ohdr >= (u8 *)hdr + image_size)
+                       break;
+       } while (1);
+
+       return 0;
+}
+#endif
 #else /* Not ARMADA? */
 static int check_image_header(void)
 {
@@ -717,20 +806,60 @@ static int check_image_header(void)
 }
 #endif
 
+#if defined(CONFIG_ARMADA_3700) || defined(CONFIG_ARMADA_32BIT)
+static u64 fuse_read_u64(u32 bank)
+{
+       u32 val[2];
+       int ret;
+
+       ret = fuse_read(bank, 0, &val[0]);
+       if (ret < 0)
+               return -1;
+
+       ret = fuse_read(bank, 1, &val[1]);
+       if (ret < 0)
+               return -1;
+
+       return ((u64)val[1] << 32) | val[0];
+}
+#endif
+
+#if defined(CONFIG_ARMADA_3700)
+static inline u8 maj3(u8 val)
+{
+       /* return majority vote of 3 bits */
+       return ((val & 0x7) == 3 || (val & 0x7) > 4) ? 1 : 0;
+}
+#endif
+
 static int bubt_check_boot_mode(const struct bubt_dev *dst)
 {
 #if defined(CONFIG_ARMADA_3700) || defined(CONFIG_ARMADA_32BIT)
-       int mode;
+       int mode, secure_mode;
 #if defined(CONFIG_ARMADA_3700)
        const struct tim_boot_flash_sign *boot_modes = tim_boot_flash_signs;
        const struct common_tim_data *hdr =
                (struct common_tim_data *)get_load_addr();
        u32 id = hdr->boot_flash_sign;
+       int is_secure = hdr->trusted != 0;
+       u64 otp_secure_bits = fuse_read_u64(1);
+       int otp_secure_boot = ((maj3(otp_secure_bits >> 0) << 0) |
+                              (maj3(otp_secure_bits >> 4) << 1)) == 2;
+       unsigned int otp_boot_device = (maj3(otp_secure_bits >> 48) << 0) |
+                                      (maj3(otp_secure_bits >> 52) << 1) |
+                                      (maj3(otp_secure_bits >> 56) << 2) |
+                                      (maj3(otp_secure_bits >> 60) << 3);
 #elif defined(CONFIG_ARMADA_32BIT)
        const struct a38x_boot_mode *boot_modes = a38x_boot_modes;
        const struct a38x_main_hdr_v1 *hdr =
                (struct a38x_main_hdr_v1 *)get_load_addr();
        u32 id = hdr->blockid;
+#if defined(CONFIG_ARMADA_38X)
+       int is_secure = a38x_image_is_secure(hdr);
+       u64 otp_secure_bits = fuse_read_u64(EFUSE_LINE_SECURE_BOOT);
+       int otp_secure_boot = otp_secure_bits & 0x1;
+       unsigned int otp_boot_device = (otp_secure_bits >> 8) & 0x7;
+#endif
 #endif
 
        for (mode = 0; boot_modes[mode].name; mode++) {
@@ -743,15 +872,42 @@ static int bubt_check_boot_mode(const struct bubt_dev *dst)
                return -ENOEXEC;
        }
 
-       if (strcmp(boot_modes[mode].name, dst->name) == 0)
-               return 0;
+       if (strcmp(boot_modes[mode].name, dst->name) != 0) {
+               printf("Error: image meant to be booted from \"%s\", not \"%s\"!\n",
+                      boot_modes[mode].name, dst->name);
+               return -ENOEXEC;
+       }
 
-       printf("Error: image meant to be booted from \"%s\", not \"%s\"!\n",
-              boot_modes[mode].name, dst->name);
-       return -ENOEXEC;
-#else
-       return 0;
+#if defined(CONFIG_ARMADA_38X) || defined(CONFIG_ARMADA_3700)
+       if (otp_secure_bits == (u64)-1) {
+               printf("Error: cannot read OTP secure bits\n");
+               return -ENOEXEC;
+       } else {
+               if (otp_secure_boot && !is_secure) {
+                       printf("Error: secure boot is enabled in OTP but image does not have secure boot header!\n");
+                       return -ENOEXEC;
+               } else if (!otp_secure_boot && is_secure) {
+#if defined(CONFIG_ARMADA_3700)
+                       /*
+                        * Armada 3700 BootROM rejects trusted image when secure boot is not enabled.
+                        * Armada 385 BootROM accepts image with secure boot header also when secure boot is not enabled.
+                        */
+                       printf("Error: secure boot is disabled in OTP but image has secure boot header!\n");
+                       return -ENOEXEC;
 #endif
+               } else if (otp_boot_device && otp_boot_device != id) {
+                       for (secure_mode = 0; boot_modes[secure_mode].name; secure_mode++) {
+                               if (boot_modes[secure_mode].id == otp_boot_device)
+                                       break;
+                       }
+                       printf("Error: boot source is set to \"%s\" in OTP but image is for \"%s\"!\n",
+                              boot_modes[secure_mode].name ?: "unknown", dst->name);
+                       return -ENOEXEC;
+               }
+       }
+#endif
+#endif
+       return 0;
 }
 
 static int bubt_verify(const struct bubt_dev *dst)
index 3619c84..46f8c87 100644 (file)
--- a/cmd/net.c
+++ b/cmd/net.c
@@ -46,7 +46,7 @@ int do_tftpb(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
 
 U_BOOT_CMD(
        tftpboot,       3,      1,      do_tftpb,
-       "boot image via network using TFTP protocol",
+       "load file via network using TFTP protocol",
        "[loadAddress] [[hostIPaddr:]bootfilename]"
 );
 #endif
@@ -189,30 +189,49 @@ static void netboot_update_env(void)
 #endif
 }
 
-static int netboot_common(enum proto_t proto, struct cmd_tbl *cmdtp, int argc,
-                         char *const argv[])
+/**
+ * parse_addr_size() - parse address and size arguments for tftpput
+ *
+ * @argv:      command line arguments
+ * Return:     0 on success
+ */
+static int parse_addr_size(char * const argv[])
 {
-       char *s;
-       char *end;
-       int   rcode = 0;
-       int   size;
-       ulong addr;
-
-       net_boot_file_name_explicit = false;
+       if (strict_strtoul(argv[1], 16, &image_save_addr) < 0 ||
+           strict_strtoul(argv[2], 16, &image_save_size) < 0) {
+               printf("Invalid address/size\n");
+               return CMD_RET_USAGE;
+       }
+       return 0;
+}
 
-       /* pre-set image_load_addr */
-       s = env_get("loadaddr");
-       if (s != NULL)
-               image_load_addr = hextoul(s, NULL);
+/**
+ * parse_args() - parse command line arguments
+ *
+ * @proto:     command prototype
+ * @argc:      number of arguments
+ * @argv:      command line arguments
+ * Return:     0 on success
+ */
+static int parse_args(enum proto_t proto, int argc, char *const argv[])
+{
+       ulong addr;
+       char *end;
 
        switch (argc) {
        case 1:
+               if (CONFIG_IS_ENABLED(CMD_TFTPPUT) && proto == TFTPPUT)
+                       return 1;
+
                /* refresh bootfile name from env */
                copy_filename(net_boot_file_name, env_get("bootfile"),
                              sizeof(net_boot_file_name));
                break;
 
-       case 2: /*
+       case 2:
+               if (CONFIG_IS_ENABLED(CMD_TFTPPUT) && proto == TFTPPUT)
+                       return 1;
+               /*
                 * Only one arg - accept two forms:
                 * Just load address, or just boot file name. The latter
                 * form must be written in a format which can not be
@@ -232,29 +251,52 @@ static int netboot_common(enum proto_t proto, struct cmd_tbl *cmdtp, int argc,
                break;
 
        case 3:
-               image_load_addr = hextoul(argv[1], NULL);
-               net_boot_file_name_explicit = true;
-               copy_filename(net_boot_file_name, argv[2],
-                             sizeof(net_boot_file_name));
-
+               if (CONFIG_IS_ENABLED(CMD_TFTPPUT) && proto == TFTPPUT) {
+                       if (parse_addr_size(argv))
+                               return 1;
+               } else {
+                       image_load_addr = hextoul(argv[1], NULL);
+                       net_boot_file_name_explicit = true;
+                       copy_filename(net_boot_file_name, argv[2],
+                                     sizeof(net_boot_file_name));
+               }
                break;
 
 #ifdef CONFIG_CMD_TFTPPUT
        case 4:
-               if (strict_strtoul(argv[1], 16, &image_save_addr) < 0 ||
-                   strict_strtoul(argv[2], 16, &image_save_size) < 0) {
-                       printf("Invalid address/size\n");
-                       return CMD_RET_USAGE;
-               }
+               if (parse_addr_size(argv))
+                       return 1;
                net_boot_file_name_explicit = true;
                copy_filename(net_boot_file_name, argv[3],
                              sizeof(net_boot_file_name));
                break;
 #endif
        default:
+               return 1;
+       }
+       return 0;
+}
+
+static int netboot_common(enum proto_t proto, struct cmd_tbl *cmdtp, int argc,
+                         char *const argv[])
+{
+       char *s;
+       int   rcode = 0;
+       int   size;
+
+       net_boot_file_name_explicit = false;
+       *net_boot_file_name = '\0';
+
+       /* pre-set image_load_addr */
+       s = env_get("loadaddr");
+       if (s != NULL)
+               image_load_addr = hextoul(s, NULL);
+
+       if (parse_args(proto, argc, argv)) {
                bootstage_error(BOOTSTAGE_ID_NET_START);
                return CMD_RET_USAGE;
        }
+
        bootstage_mark(BOOTSTAGE_ID_NET_START);
 
        size = net_loop(proto);
index a99e8f8..6258699 100644 (file)
--- a/cmd/pci.c
+++ b/cmd/pci.c
@@ -358,6 +358,9 @@ static int pci_cfg_display(struct udevice *dev, ulong addr,
        if (length == 0)
                length = 0x40 / byte_size; /* Standard PCI config space */
 
+       if (addr >= 4096)
+               return 1;
+
        /* Print the lines.
         * once, and all accesses are with the specified bus width.
         */
@@ -378,7 +381,10 @@ static int pci_cfg_display(struct udevice *dev, ulong addr,
                        rc = 1;
                        break;
                }
-       } while (nbytes > 0);
+       } while (nbytes > 0 && addr < 4096);
+
+       if (rc == 0 && nbytes > 0)
+               return 1;
 
        return (rc);
 }
@@ -390,6 +396,9 @@ static int pci_cfg_modify(struct udevice *dev, ulong addr, ulong size,
        int     nbytes;
        ulong val;
 
+       if (addr >= 4096)
+               return 1;
+
        /* Print the address, followed by value.  Then accept input for
         * the next value.  A non-converted value exits.
         */
@@ -427,7 +436,10 @@ static int pci_cfg_modify(struct udevice *dev, ulong addr, ulong size,
                                        addr += size;
                        }
                }
-       } while (nbytes);
+       } while (nbytes && addr < 4096);
+
+       if (nbytes)
+               return 1;
 
        return 0;
 }
index ee11e0f..522f502 100644 (file)
@@ -68,11 +68,21 @@ static int do_sbi(struct cmd_tbl *cmdtp, int flag, int argc,
                                ret = sbi_get_impl_version(&vers);
                                if (ret < 0)
                                        break;
-                               if (impl_id == 1)
+                               switch (impl_id) {
+                               case 1: /* OpenSBI */
                                        printf("%ld.%ld",
                                               vers >> 16, vers & 0xffff);
-                               else
+                                       break;
+                               case 3: /* KVM */
+                                       printf("%ld.%ld.%ld",
+                                              vers >> 16,
+                                              (vers >> 8) & 0xff,
+                                              vers & 0xff);
+                                       break;
+                               default:
                                        printf("0x%lx", vers);
+                                       break;
+                               }
                                break;
                        }
                }
index 47adaff..d0c63ca 100644 (file)
@@ -333,6 +333,26 @@ int do_tpm_info(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
        return 0;
 }
 
+int do_tpm_report_state(struct cmd_tbl *cmdtp, int flag, int argc,
+                       char *const argv[])
+{
+       struct udevice *dev;
+       char buf[80];
+       int rc;
+
+       rc = get_tpm(&dev);
+       if (rc)
+               return rc;
+       rc = tpm_report_state(dev, buf, sizeof(buf));
+       if (rc < 0) {
+               printf("Couldn't get TPM state (%d)\n", rc);
+               return CMD_RET_FAILURE;
+       }
+       printf("%s\n", buf);
+
+       return 0;
+}
+
 int do_tpm_init(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
 {
        struct udevice *dev;
index 358ddff..de4a934 100644 (file)
@@ -21,6 +21,8 @@ int do_tpm_device(struct cmd_tbl *cmdtp, int flag, int argc,
                  char *const argv[]);
 int do_tpm_init(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]);
 int do_tpm_info(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]);
+int do_tpm_report_state(struct cmd_tbl *cmdtp, int flag, int argc,
+                       char *const argv[]);
 int do_tpm(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]);
 
 #endif /* __TPM_USER_UTILS_H */
index bf238a9..0efb079 100644 (file)
@@ -131,7 +131,8 @@ static int do_tpm_extend(struct cmd_tbl *cmdtp, int flag, int argc,
                return CMD_RET_FAILURE;
        }
 
-       rc = tpm_pcr_extend(dev, index, in_digest, out_digest);
+       rc = tpm_pcr_extend(dev, index, in_digest, sizeof(in_digest),
+                           out_digest, "cmd");
        if (!rc) {
                puts("PCR value after execution of the command:\n");
                print_byte_string(out_digest, sizeof(out_digest));
index 4ea5f9f..d93b83a 100644 (file)
@@ -359,6 +359,7 @@ static int do_tpm_pcr_setauthvalue(struct cmd_tbl *cmdtp, int flag,
 static struct cmd_tbl tpm2_commands[] = {
        U_BOOT_CMD_MKENT(device, 0, 1, do_tpm_device, "", ""),
        U_BOOT_CMD_MKENT(info, 0, 1, do_tpm_info, "", ""),
+       U_BOOT_CMD_MKENT(state, 0, 1, do_tpm_report_state, "", ""),
        U_BOOT_CMD_MKENT(init, 0, 1, do_tpm_init, "", ""),
        U_BOOT_CMD_MKENT(startup, 0, 1, do_tpm2_startup, "", ""),
        U_BOOT_CMD_MKENT(self_test, 0, 1, do_tpm2_self_test, "", ""),
@@ -389,6 +390,8 @@ U_BOOT_CMD(tpm2, CONFIG_SYS_MAXARGS, 1, do_tpm, "Issue a TPMv2.x command",
 "    Show all devices or set the specified device\n"
 "info\n"
 "    Show information about the TPM.\n"
+"state\n"
+"    Show internal state from the TPM (if available)\n"
 "init\n"
 "    Initialize the software stack. Always the first command to issue.\n"
 "startup <mode>\n"
index a3ccb12..b35eae8 100644 (file)
@@ -91,7 +91,8 @@ static int test_early_extend(struct udevice *dev)
        tpm_init(dev);
        TPM_CHECK(tpm_startup(dev, TPM_ST_CLEAR));
        TPM_CHECK(tpm_continue_self_test(dev));
-       TPM_CHECK(tpm_pcr_extend(dev, 1, value_in, value_out));
+       TPM_CHECK(tpm_pcr_extend(dev, 1, value_in, sizeof(value_in), value_out,
+                                "test"));
        printf("done\n");
        return 0;
 }
@@ -438,7 +439,7 @@ static int test_timing(struct udevice *dev)
                   100);
        TTPM_CHECK(tpm_nv_read_value(dev, INDEX0, (uint8_t *)&x, sizeof(x)),
                   100);
-       TTPM_CHECK(tpm_pcr_extend(dev, 0, in, out), 200);
+       TTPM_CHECK(tpm_pcr_extend(dev, 0, in, sizeof(in), out, "test"), 200);
        TTPM_CHECK(tpm_set_global_lock(dev), 50);
        TTPM_CHECK(tpm_tsc_physical_presence(dev, PHYS_PRESENCE), 100);
        printf("done\n");
index 8533d0d..63b2004 100644 (file)
@@ -171,11 +171,8 @@ do_imgextract(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
                        return 1;
                }
 
-               if (fit_image_get_comp(fit_hdr, noffset, &comp)) {
-                       puts("Could not find script subimage "
-                               "compression type\n");
-                       return 1;
-               }
+               if (fit_image_get_comp(fit_hdr, noffset, &comp))
+                       comp = IH_COMP_NONE;
 
                data = (ulong)fit_data;
                len = (ulong)fit_len;
index 3e44acd..b776c5c 100644 (file)
@@ -809,6 +809,20 @@ config TPL_STACKPROTECTOR
        bool "Stack Protector buffer overflow detection for TPL"
        depends on STACKPROTECTOR && TPL
 
+config BOARD_RNG_SEED
+       bool "Provide /chosen/rng-seed property to the linux kernel"
+       help
+         Selecting this option requires the board to define a
+         board_rng_seed() function, which should return a buffer
+         which will be used to populate the /chosen/rng-seed property
+         in the device tree for the OS being booted.
+
+         It is up to the board code (and more generally the whole
+         BSP) where and how to store (or generate) such a seed, how
+         to ensure a given seed is only used once, how to create a
+         new seed for use on subsequent boots, and whether or not the
+         kernel should account any entropy from the given seed.
+
 endmenu
 
 menu "Update support"
index 66b9813..e5be6ff 100644 (file)
@@ -600,6 +600,9 @@ static void pre_console_putc(const char c)
 {
        char *buffer;
 
+       if (gd->precon_buf_idx < 0)
+               return;
+
        buffer = map_sysmem(CONFIG_VAL(PRE_CON_BUF_ADDR), CONFIG_VAL(PRE_CON_BUF_SZ));
 
        buffer[CIRC_BUF_IDX(gd->precon_buf_idx++)] = c;
@@ -609,13 +612,16 @@ static void pre_console_putc(const char c)
 
 static void pre_console_puts(const char *s)
 {
+       if (gd->precon_buf_idx < 0)
+               return;
+
        while (*s)
                pre_console_putc(*s++);
 }
 
 static void print_pre_console_buffer(int flushpoint)
 {
-       unsigned long in = 0, out = 0;
+       long in = 0, out = 0;
        char buf_out[CONFIG_VAL(PRE_CON_BUF_SZ) + 1];
        char *buf_in;
 
@@ -632,6 +638,7 @@ static void print_pre_console_buffer(int flushpoint)
 
        buf_out[out] = 0;
 
+       gd->precon_buf_idx = -1;
        switch (flushpoint) {
        case PRE_CONSOLE_FLUSHPOINT1_SERIAL:
                puts(buf_out);
@@ -640,6 +647,7 @@ static void print_pre_console_buffer(int flushpoint)
                console_puts_select(stdout, false, buf_out);
                break;
        }
+       gd->precon_buf_idx = in;
 }
 #else
 static inline void pre_console_putc(const char c) {}
index 8c18af2..baf7fb7 100644 (file)
@@ -7,6 +7,7 @@
  */
 
 #include <common.h>
+#include <abuf.h>
 #include <env.h>
 #include <log.h>
 #include <mapmem.h>
@@ -279,6 +280,7 @@ __weak char *board_fdt_chosen_bootargs(void)
 
 int fdt_chosen(void *fdt)
 {
+       struct abuf buf = {};
        int   nodeoffset;
        int   err;
        char  *str;             /* used to set string properties */
@@ -294,6 +296,17 @@ int fdt_chosen(void *fdt)
        if (nodeoffset < 0)
                return nodeoffset;
 
+       if (IS_ENABLED(CONFIG_BOARD_RNG_SEED) && !board_rng_seed(&buf)) {
+               err = fdt_setprop(fdt, nodeoffset, "rng-seed",
+                                 abuf_data(&buf), abuf_size(&buf));
+               abuf_uninit(&buf);
+               if (err < 0) {
+                       printf("WARNING: could not set rng-seed %s.\n",
+                              fdt_strerror(err));
+                       return err;
+               }
+       }
+
        str = board_fdt_chosen_bootargs();
 
        if (str) {
index d43423c..feba398 100644 (file)
@@ -4,6 +4,9 @@ CONFIG_SYS_DCACHE_OFF=y
 CONFIG_ARCH_CPU_INIT=y
 CONFIG_SYS_THUMB_BUILD=y
 CONFIG_ARCH_KIRKWOOD=y
+CONFIG_SUPPORT_PASSING_ATAGS=y
+CONFIG_CMDLINE_TAG=y
+CONFIG_INITRD_TAG=y
 CONFIG_SYS_KWD_CONFIG="board/Seagate/dockstar/kwbimage.cfg"
 CONFIG_SYS_TEXT_BASE=0x600000
 CONFIG_NR_DRAM_BANKS=2
index 24090c8..650b146 100644 (file)
@@ -3,6 +3,9 @@ CONFIG_SKIP_LOWLEVEL_INIT=y
 CONFIG_SYS_DCACHE_OFF=y
 CONFIG_ARCH_CPU_INIT=y
 CONFIG_ARCH_KIRKWOOD=y
+CONFIG_SUPPORT_PASSING_ATAGS=y
+CONFIG_CMDLINE_TAG=y
+CONFIG_INITRD_TAG=y
 CONFIG_SYS_KWD_CONFIG="board/Marvell/dreamplug/kwbimage.cfg"
 CONFIG_SYS_TEXT_BASE=0x600000
 CONFIG_NR_DRAM_BANKS=2
index 7c3c977..9706b64 100644 (file)
@@ -3,7 +3,6 @@ CONFIG_ARCH_CPU_INIT=y
 CONFIG_ARCH_MVEBU=y
 CONFIG_SYS_TEXT_BASE=0x00000000
 CONFIG_TARGET_MVEBU_ARMADA_37XX=y
-CONFIG_MVEBU_EFUSE=y
 CONFIG_ENV_SIZE=0x10000
 CONFIG_ENV_OFFSET=0x180000
 CONFIG_ENV_SECT_SIZE=0x10000
index 0856a31..aeb4a7d 100644 (file)
@@ -4,6 +4,9 @@ CONFIG_SYS_DCACHE_OFF=y
 CONFIG_ARCH_CPU_INIT=y
 CONFIG_SYS_THUMB_BUILD=y
 CONFIG_ARCH_KIRKWOOD=y
+CONFIG_SUPPORT_PASSING_ATAGS=y
+CONFIG_CMDLINE_TAG=y
+CONFIG_INITRD_TAG=y
 CONFIG_SYS_KWD_CONFIG="board/Seagate/goflexhome/kwbimage.cfg"
 CONFIG_SYS_TEXT_BASE=0x600000
 CONFIG_NR_DRAM_BANKS=2
index 1c66b42..c91d58d 100644 (file)
@@ -4,6 +4,9 @@ CONFIG_SYS_DCACHE_OFF=y
 CONFIG_ARCH_CPU_INIT=y
 CONFIG_SYS_THUMB_BUILD=y
 CONFIG_ARCH_KIRKWOOD=y
+CONFIG_SUPPORT_PASSING_ATAGS=y
+CONFIG_CMDLINE_TAG=y
+CONFIG_INITRD_TAG=y
 CONFIG_SYS_KWD_CONFIG="board/iomega/iconnect/kwbimage.cfg"
 CONFIG_SYS_TEXT_BASE=0x600000
 CONFIG_NR_DRAM_BANKS=2
diff --git a/configs/imx6ulz_smm_m2_defconfig b/configs/imx6ulz_smm_m2_defconfig
new file mode 100644 (file)
index 0000000..6b4a0cc
--- /dev/null
@@ -0,0 +1,79 @@
+CONFIG_ARM=y
+CONFIG_ARCH_MX6=y
+CONFIG_SYS_TEXT_BASE=0x87800000
+CONFIG_SYS_MALLOC_LEN=0x1000000
+CONFIG_SYS_MALLOC_F_LEN=0x18000
+CONFIG_SPL_GPIO=y
+CONFIG_SPL_LIBCOMMON_SUPPORT=y
+CONFIG_SPL_LIBGENERIC_SUPPORT=y
+CONFIG_NR_DRAM_BANKS=1
+CONFIG_ENV_SIZE=0x20000
+CONFIG_ENV_OFFSET=0x400000
+CONFIG_MX6ULL=y
+CONFIG_TARGET_MX6ULZ_SMM_M2=y
+CONFIG_DEFAULT_DEVICE_TREE="imx6ulz-bsh-smm-m2"
+CONFIG_SPL_TEXT_BASE=0x00908000
+CONFIG_SPL_SERIAL=y
+CONFIG_SPL=y
+CONFIG_DISTRO_DEFAULTS=y
+CONFIG_FIT=y
+CONFIG_FIT_SIGNATURE=y
+CONFIG_FIT_VERBOSE=y
+CONFIG_LEGACY_IMAGE_FORMAT=y
+CONFIG_BOOTDELAY=3
+CONFIG_BOARD_LATE_INIT=y
+CONFIG_SPL_BSS_START_ADDR=0x84100000
+CONFIG_SYS_SPL_MALLOC=y
+CONFIG_SPL_DMA=y
+CONFIG_SPL_MTD_SUPPORT=y
+CONFIG_SPL_NAND_SUPPORT=y
+CONFIG_SPL_USB_HOST=y
+CONFIG_SPL_USB_GADGET=y
+CONFIG_SPL_USB_SDP_SUPPORT=y
+CONFIG_SPL_WATCHDOG=y
+CONFIG_CMD_DM=y
+CONFIG_CMD_GPIO=y
+CONFIG_CMD_I2C=y
+CONFIG_CMD_USB=y
+CONFIG_CMD_USB_SDP=y
+CONFIG_CMD_CACHE=y
+CONFIG_CMD_MTDPARTS=y
+CONFIG_MTDIDS_DEFAULT="nand0=gpmi-nand"
+CONFIG_MTDPARTS_DEFAULT="mtdparts=gpmi-nand:4m(nandboot),1m(env),8m(kernel),1m(nanddtb),-(rootfs)"
+CONFIG_CMD_UBI=y
+# CONFIG_ISO_PARTITION is not set
+CONFIG_OF_CONTROL=y
+CONFIG_ENV_OVERWRITE=y
+CONFIG_ENV_IS_IN_NAND=y
+CONFIG_SYS_RELOC_GD_ENV_ADDR=y
+# CONFIG_NET is not set
+CONFIG_BOUNCE_BUFFER=y
+CONFIG_USB_FUNCTION_FASTBOOT=y
+CONFIG_FASTBOOT_BUF_ADDR=0x82000000
+CONFIG_FASTBOOT_FLASH=y
+CONFIG_FASTBOOT_UUU_SUPPORT=y
+CONFIG_SYS_I2C_MXC=y
+# CONFIG_MMC is not set
+CONFIG_MTD=y
+CONFIG_MTD_RAW_NAND=y
+CONFIG_SYS_NAND_USE_FLASH_BBT=y
+CONFIG_NAND_MXS=y
+CONFIG_NAND_MXS_DT=y
+CONFIG_SYS_NAND_ONFI_DETECTION=y
+CONFIG_SYS_NAND_U_BOOT_LOCATIONS=y
+CONFIG_SYS_NAND_U_BOOT_OFFS=0x111400
+CONFIG_SYS_NAND_U_BOOT_OFFS_REDUND=0x291400
+CONFIG_PINCTRL=y
+CONFIG_PINCTRL_IMX6=y
+CONFIG_DM_PMIC=y
+CONFIG_DM_REGULATOR=y
+CONFIG_DM_REGULATOR_FIXED=y
+CONFIG_MXC_UART=y
+CONFIG_IMX_THERMAL=y
+CONFIG_USB=y
+CONFIG_USB_GADGET=y
+CONFIG_USB_GADGET_MANUFACTURER="BSH"
+CONFIG_USB_GADGET_VENDOR_NUM=0x0525
+CONFIG_USB_GADGET_PRODUCT_NUM=0xa4a5
+CONFIG_CI_UDC=y
+CONFIG_SDP_LOADADDR=0x877fffc0
index dfe2a51..2a44bf6 100644 (file)
@@ -28,7 +28,6 @@ CONFIG_SPL_LOAD_FIT=y
 # CONFIG_USE_SPL_FIT_GENERATOR is not set
 CONFIG_OF_BOARD_SETUP=y
 CONFIG_OF_SYSTEM_SETUP=y
-# CONFIG_USE_BOOTCOMMAND is not set
 CONFIG_USE_PREBOOT=y
 CONFIG_PREBOOT="gsc wd-disable"
 CONFIG_BOARD_LATE_INIT=y
index fa3821f..1e79543 100644 (file)
@@ -29,7 +29,6 @@ CONFIG_SPL_LOAD_FIT=y
 # CONFIG_USE_SPL_FIT_GENERATOR is not set
 CONFIG_OF_BOARD_SETUP=y
 CONFIG_OF_SYSTEM_SETUP=y
-# CONFIG_USE_BOOTCOMMAND is not set
 CONFIG_USE_PREBOOT=y
 CONFIG_PREBOOT="gsc wd-disable"
 CONFIG_BOARD_LATE_INIT=y
index ff8f53d..e78b9a1 100644 (file)
@@ -86,6 +86,7 @@ CONFIG_MD5SUM_VERIFY=y
 CONFIG_CMD_MEMTEST=y
 CONFIG_CMD_SHA1SUM=y
 CONFIG_SHA1SUM_VERIFY=y
+CONFIG_CMD_BIND=y
 CONFIG_CMD_CLK=y
 CONFIG_CMD_DFU=y
 CONFIG_CMD_FUSE=y
@@ -168,6 +169,7 @@ CONFIG_FASTBOOT_BUF_SIZE=0x20000000
 CONFIG_FASTBOOT_FLASH=y
 CONFIG_FASTBOOT_FLASH_MMC_DEV=0
 CONFIG_GPIO_HOG=y
+CONFIG_SPL_GPIO_HOG=y
 CONFIG_MXC_GPIO=y
 CONFIG_DM_I2C=y
 # CONFIG_INPUT is not set
@@ -238,20 +240,23 @@ CONFIG_DM_THERMAL=y
 CONFIG_IMX_TMU=y
 CONFIG_USB=y
 # CONFIG_SPL_DM_USB is not set
+CONFIG_DM_USB_GADGET=y
 CONFIG_USB_XHCI_HCD=y
 CONFIG_USB_XHCI_DWC3=y
 CONFIG_USB_XHCI_DWC3_OF_SIMPLE=y
 CONFIG_USB_EHCI_HCD=y
 CONFIG_USB_DWC3=y
-# CONFIG_USB_DWC3_GADGET is not set
 CONFIG_USB_DWC3_GENERIC=y
 CONFIG_USB_STORAGE=y
+CONFIG_USB_HOST_ETHER=y
+CONFIG_USB_ETHER_ASIX=y
 CONFIG_USB_GADGET=y
 CONFIG_USB_GADGET_MANUFACTURER="DH electronics"
 CONFIG_USB_GADGET_VENDOR_NUM=0x0525
 CONFIG_USB_GADGET_PRODUCT_NUM=0xa4a5
-CONFIG_CI_UDC=y
 CONFIG_SDP_LOADADDR=0x0
 CONFIG_USB_FUNCTION_ACM=y
+CONFIG_USB_ETHER=y
+CONFIG_USB_ETH_CDC=y
 CONFIG_IMX_WATCHDOG=y
 CONFIG_OF_LIBFDT_OVERLAY=y
index ded9b7f..f3f98aa 100644 (file)
@@ -29,7 +29,6 @@ CONFIG_SPL_LOAD_FIT=y
 # CONFIG_USE_SPL_FIT_GENERATOR is not set
 CONFIG_OF_BOARD_SETUP=y
 CONFIG_OF_SYSTEM_SETUP=y
-# CONFIG_USE_BOOTCOMMAND is not set
 CONFIG_USE_PREBOOT=y
 CONFIG_PREBOOT="gsc wd-disable"
 CONFIG_BOARD_LATE_INIT=y
diff --git a/configs/imxrt1170-evk_defconfig b/configs/imxrt1170-evk_defconfig
new file mode 100644 (file)
index 0000000..4edda39
--- /dev/null
@@ -0,0 +1,70 @@
+CONFIG_ARM=y
+CONFIG_SYS_DCACHE_OFF=y
+# CONFIG_SPL_SYS_DCACHE_OFF is not set
+CONFIG_ARCH_IMXRT=y
+CONFIG_SYS_TEXT_BASE=0x20240000
+CONFIG_SYS_MALLOC_LEN=0x8000
+CONFIG_SYS_MALLOC_F_LEN=0x8000
+CONFIG_SPL_GPIO=y
+CONFIG_SPL_LIBCOMMON_SUPPORT=y
+CONFIG_SPL_LIBGENERIC_SUPPORT=y
+CONFIG_NR_DRAM_BANKS=1
+CONFIG_ENV_OFFSET=0x80000
+CONFIG_DM_GPIO=y
+CONFIG_DEFAULT_DEVICE_TREE="imxrt1170-evk"
+CONFIG_SPL_TEXT_BASE=0x202C0000
+CONFIG_TARGET_IMXRT1170_EVK=y
+CONFIG_SPL_MMC=y
+CONFIG_SPL_SERIAL=y
+CONFIG_SPL_SIZE_LIMIT=0x20000
+CONFIG_SPL=y
+CONFIG_SYS_LOAD_ADDR=0x202C0000
+CONFIG_DISTRO_DEFAULTS=y
+CONFIG_HAS_CUSTOM_SYS_INIT_SP_ADDR=y
+CONFIG_CUSTOM_SYS_INIT_SP_ADDR=0x20340000
+CONFIG_SD_BOOT=y
+# CONFIG_USE_BOOTCOMMAND is not set
+CONFIG_SYS_CONSOLE_ENV_OVERWRITE=y
+# CONFIG_DISPLAY_CPUINFO is not set
+CONFIG_SPL_NO_BSS_LIMIT=y
+CONFIG_SPL_BOARD_INIT=y
+# CONFIG_SPL_RAW_IMAGE_SUPPORT is not set
+CONFIG_SPL_SYS_MALLOC_SIMPLE=y
+CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_USE_SECTOR=y
+CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR=0x100
+# CONFIG_SPL_CRC32 is not set
+# CONFIG_BOOTM_NETBSD is not set
+# CONFIG_BOOTM_PLAN9 is not set
+# CONFIG_BOOTM_RTEMS is not set
+# CONFIG_BOOTM_VXWORKS is not set
+# CONFIG_CMD_MII is not set
+# CONFIG_SPL_DOS_PARTITION is not set
+# CONFIG_ISO_PARTITION is not set
+# CONFIG_EFI_PARTITION is not set
+CONFIG_OF_CONTROL=y
+CONFIG_SPL_OF_CONTROL=y
+CONFIG_ENV_IS_NOWHERE=y
+CONFIG_ENV_IS_IN_MMC=y
+CONFIG_SYS_RELOC_GD_ENV_ADDR=y
+CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG=y
+CONFIG_SPL_DM=y
+CONFIG_SPL_DM_SEQ_ALIAS=y
+# CONFIG_OF_TRANSLATE is not set
+CONFIG_SPL_CLK_COMPOSITE_CCF=y
+CONFIG_CLK_COMPOSITE_CCF=y
+CONFIG_SPL_CLK_IMXRT1170=y
+CONFIG_CLK_IMXRT1170=y
+# CONFIG_SPL_DM_GPIO is not set
+CONFIG_MXC_GPIO=y
+# CONFIG_INPUT is not set
+CONFIG_FSL_USDHC=y
+CONFIG_PINCTRL=y
+CONFIG_SPL_PINCTRL=y
+CONFIG_PINCTRL_IMXRT=y
+CONFIG_RAM=y
+CONFIG_SPL_RAM=y
+CONFIG_IMXRT_SDRAM=y
+CONFIG_FSL_LPUART=y
+CONFIG_TIMER=y
+CONFIG_SPL_TIMER=y
+CONFIG_IMX_GPT_TIMER=y
index b0b5fb1..9112956 100644 (file)
@@ -12,6 +12,7 @@ CONFIG_ENV_SECT_SIZE=0x10000
 CONFIG_DEFAULT_DEVICE_TREE="fsl-ls1028a-kontron-sl28"
 CONFIG_SPL_TEXT_BASE=0x18010000
 CONFIG_SYS_FSL_SDHC_CLK_DIV=1
+CONFIG_SPL_MMC=y
 CONFIG_SPL_SERIAL=y
 CONFIG_SPL_SIZE_LIMIT=0x20000
 CONFIG_SPL_SIZE_LIMIT_PROVIDE_STACK=0x0
@@ -46,9 +47,11 @@ CONFIG_SPL_BOARD_INIT=y
 # CONFIG_SPL_SHARES_INIT_SP_ADDR is not set
 CONFIG_SPL_STACK=0x18009ff0
 CONFIG_SYS_SPL_MALLOC=y
+CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_USE_SECTOR=y
+CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR=0x900
 CONFIG_SPL_MPC8XXX_INIT_DDR=y
 CONFIG_SPL_SPI_LOAD=y
-CONFIG_SYS_SPI_U_BOOT_OFFS=0x230000
+CONFIG_CMDLINE_PS_SUPPORT=y
 CONFIG_SYS_CBSIZE=256
 CONFIG_SYS_PBSIZE=276
 CONFIG_SYS_BOOTM_LEN=0x800000
diff --git a/configs/librem5_defconfig b/configs/librem5_defconfig
new file mode 100644 (file)
index 0000000..b022ae3
--- /dev/null
@@ -0,0 +1,151 @@
+CONFIG_ARM=y
+CONFIG_ARCH_IMX8M=y
+CONFIG_SYS_TEXT_BASE=0x40200000
+CONFIG_SPL_GPIO=y
+CONFIG_SPL_LIBCOMMON_SUPPORT=y
+CONFIG_SPL_LIBGENERIC_SUPPORT=y
+CONFIG_ENV_SIZE=0x2000
+CONFIG_ENV_OFFSET=0x3FE000
+CONFIG_SYS_I2C_MXC_I2C1=y
+CONFIG_SYS_I2C_MXC_I2C2=y
+CONFIG_SYS_I2C_MXC_I2C3=y
+CONFIG_SYS_I2C_MXC_I2C4=y
+CONFIG_DM_GPIO=y
+CONFIG_DEFAULT_DEVICE_TREE="imx8mq-librem5-r4"
+CONFIG_SPL_TEXT_BASE=0x7E1000
+CONFIG_TARGET_LIBREM5=y
+CONFIG_SYS_PROMPT="u-boot=> "
+CONFIG_SPL_MMC=y
+CONFIG_SPL_SERIAL=y
+CONFIG_SPL_DRIVERS_MISC=y
+CONFIG_SPL=y
+CONFIG_IMX_BOOTAUX=y
+CONFIG_SYS_LOAD_ADDR=0x40480000
+CONFIG_DISTRO_DEFAULTS=y
+CONFIG_REMAKE_ELF=y
+CONFIG_FIT=y
+CONFIG_FIT_EXTERNAL_OFFSET=0x3000
+CONFIG_SPL_LOAD_FIT=y
+# CONFIG_USE_SPL_FIT_GENERATOR is not set
+CONFIG_OF_SYSTEM_SETUP=y
+CONFIG_BOOTDELAY=0
+CONFIG_SYS_CONSOLE_IS_IN_ENV=y
+# CONFIG_SYS_DEVICE_NULLDEV is not set
+CONFIG_ARCH_MISC_INIT=y
+CONFIG_BOARD_EARLY_INIT_F=y
+CONFIG_BOARD_LATE_INIT=y
+CONFIG_SPL_MAX_SIZE=0x25000
+CONFIG_SPL_HAS_BSS_LINKER_SECTION=y
+CONFIG_SPL_BSS_START_ADDR=0x180000
+CONFIG_SPL_BSS_MAX_SIZE=0x2000
+CONFIG_SPL_BOARD_INIT=y
+# CONFIG_SPL_SHARES_INIT_SP_ADDR is not set
+CONFIG_SPL_STACK=0x187ff0
+CONFIG_SYS_SPL_MALLOC=y
+CONFIG_HAS_CUSTOM_SPL_MALLOC_START=y
+CONFIG_CUSTOM_SYS_SPL_MALLOC_ADDR=0x42200000
+CONFIG_SYS_SPL_MALLOC_SIZE=0x80000
+CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_USE_SECTOR=y
+CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR=0x300
+CONFIG_SPL_I2C=y
+CONFIG_SPL_POWER=y
+CONFIG_SPL_USB_GADGET=y
+CONFIG_SPL_USB_SDP_SUPPORT=y
+CONFIG_SPL_WATCHDOG=y
+CONFIG_SYS_MAXARGS=64
+CONFIG_SYS_PBSIZE=1050
+CONFIG_CMD_MEMTEST=y
+CONFIG_SYS_ALT_MEMTEST=y
+CONFIG_CMD_CLK=y
+CONFIG_CMD_FUSE=y
+CONFIG_CMD_GPIO=y
+CONFIG_CMD_I2C=y
+CONFIG_CMD_MMC=y
+CONFIG_CMD_USB=y
+CONFIG_CMD_USB_SDP=y
+CONFIG_CMD_CACHE=y
+CONFIG_CMD_REGULATOR=y
+CONFIG_CMD_EXT4_WRITE=y
+CONFIG_OF_CONTROL=y
+CONFIG_SPL_OF_CONTROL=y
+CONFIG_ENV_OVERWRITE=y
+CONFIG_ENV_IS_IN_MMC=y
+CONFIG_SYS_RELOC_GD_ENV_ADDR=y
+CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG=y
+CONFIG_SPL_DM=y
+CONFIG_DEVRES=y
+# CONFIG_SPL_BLK is not set
+CONFIG_BUTTON=y
+CONFIG_BUTTON_GPIO=y
+CONFIG_SAVED_DRAM_TIMING_BASE=0x40000000
+CONFIG_DMA=y
+CONFIG_DMA_CHANNELS=y
+CONFIG_USB_FUNCTION_FASTBOOT=y
+CONFIG_FASTBOOT_BUF_ADDR=0x43000000
+CONFIG_FASTBOOT_BUF_SIZE=0x40000000
+CONFIG_FASTBOOT_FLASH=y
+CONFIG_FASTBOOT_UUU_SUPPORT=y
+CONFIG_FASTBOOT_FLASH_MMC_DEV=0
+CONFIG_FASTBOOT_MMC_BOOT_SUPPORT=y
+CONFIG_FASTBOOT_MMC_USER_SUPPORT=y
+CONFIG_FASTBOOT_CMD_OEM_PARTCONF=y
+CONFIG_FASTBOOT_CMD_OEM_BOOTBUS=y
+# CONFIG_SPL_DM_GPIO is not set
+CONFIG_GPIO_HOG=y
+CONFIG_DM_GPIO_LOOKUP_LABEL=y
+CONFIG_MXC_GPIO=y
+CONFIG_DM_I2C=y
+# CONFIG_SPL_DM_I2C is not set
+CONFIG_SPL_SYS_I2C_LEGACY=y
+CONFIG_SYS_I2C_EARLY_INIT=y
+CONFIG_SYS_MXC_I2C1_SPEED=50000
+CONFIG_SYS_MXC_I2C2_SPEED=50000
+CONFIG_SYS_MXC_I2C3_SPEED=50000
+CONFIG_SYS_MXC_I2C4_SPEED=50000
+CONFIG_SYS_I2C_SPEED=50000
+CONFIG_LED=y
+CONFIG_LED_BLINK=y
+CONFIG_LED_GPIO=y
+CONFIG_MISC=y
+CONFIG_PWRSEQ=y
+CONFIG_MMC_BROKEN_CD=y
+# CONFIG_SPL_DM_MMC is not set
+CONFIG_SUPPORT_EMMC_BOOT=y
+CONFIG_MMC_IO_VOLTAGE=y
+CONFIG_MMC_UHS_SUPPORT=y
+CONFIG_MMC_HS400_ES_SUPPORT=y
+CONFIG_MMC_HS400_SUPPORT=y
+CONFIG_FSL_USDHC=y
+CONFIG_DM_SPI_FLASH=y
+CONFIG_SPI_FLASH_STMICRO=y
+CONFIG_SPI_FLASH_WINBOND=y
+CONFIG_PHY=y
+CONFIG_PHY_IMX8MQ_USB=y
+CONFIG_PINCTRL=y
+CONFIG_PINCTRL_IMX8M=y
+CONFIG_POWER_LEGACY=y
+CONFIG_POWER_DOMAIN=y
+CONFIG_IMX8M_POWER_DOMAIN=y
+CONFIG_DM_REGULATOR=y
+CONFIG_DM_REGULATOR_FIXED=y
+CONFIG_DM_REGULATOR_GPIO=y
+CONFIG_POWER_I2C=y
+CONFIG_DM_RESET=y
+CONFIG_MXC_UART=y
+CONFIG_SPI=y
+CONFIG_DM_SPI=y
+CONFIG_MXC_SPI=y
+CONFIG_DM_THERMAL=y
+CONFIG_IMX_TMU=y
+CONFIG_USB=y
+CONFIG_DM_USB_GADGET=y
+CONFIG_USB_XHCI_HCD=y
+CONFIG_USB_XHCI_DWC3=y
+CONFIG_USB_DWC3=y
+CONFIG_USB_DWC3_GENERIC=y
+CONFIG_USB_GADGET=y
+CONFIG_USB_GADGET_MANUFACTURER="Purism"
+CONFIG_USB_GADGET_VENDOR_NUM=0x0525
+CONFIG_USB_GADGET_PRODUCT_NUM=0xa4a5
+CONFIG_SDP_LOADADDR=0x40400000
+CONFIG_USB_FUNCTION_ACM=y
index 437d438..a2a1efb 100644 (file)
@@ -4,7 +4,6 @@ CONFIG_ARCH_MVEBU=y
 CONFIG_SYS_TEXT_BASE=0x00000000
 CONFIG_NR_DRAM_BANKS=1
 CONFIG_TARGET_MVEBU_ARMADA_37XX=y
-CONFIG_MVEBU_EFUSE=y
 CONFIG_ENV_SIZE=0x10000
 CONFIG_ENV_OFFSET=0x3f0000
 CONFIG_ENV_SECT_SIZE=0x10000
index dd1f912..c9ea42a 100644 (file)
@@ -4,7 +4,6 @@ CONFIG_ARCH_MVEBU=y
 CONFIG_SYS_TEXT_BASE=0x00000000
 CONFIG_NR_DRAM_BANKS=1
 CONFIG_TARGET_MVEBU_ARMADA_37XX=y
-CONFIG_MVEBU_EFUSE=y
 CONFIG_ENV_SIZE=0x10000
 CONFIG_ENV_OFFSET=0x3F0000
 CONFIG_ENV_SECT_SIZE=0x10000
index 15b883b..6adb230 100644 (file)
@@ -4,6 +4,9 @@ CONFIG_SYS_DCACHE_OFF=y
 CONFIG_ARCH_CPU_INIT=y
 CONFIG_SYS_THUMB_BUILD=y
 CONFIG_ARCH_KIRKWOOD=y
+CONFIG_SUPPORT_PASSING_ATAGS=y
+CONFIG_CMDLINE_TAG=y
+CONFIG_INITRD_TAG=y
 CONFIG_SYS_KWD_CONFIG="board/cloudengines/pogo_e02/kwbimage.cfg"
 CONFIG_SYS_TEXT_BASE=0x600000
 CONFIG_NR_DRAM_BANKS=2
index 7756f5f..f48564c 100644 (file)
@@ -61,5 +61,4 @@ CONFIG_VIRTIO_PCI=y
 CONFIG_VIRTIO_NET=y
 CONFIG_VIRTIO_BLK=y
 CONFIG_ADDR_MAP=y
-# CONFIG_BINMAN_FDT is not set
 CONFIG_PANIC_HANG=y
index 1c5a061..c3d13a5 100644 (file)
@@ -21,4 +21,3 @@ CONFIG_CMD_NVEDIT_EFI=y
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
 CONFIG_DM_MTD=y
 CONFIG_SYS_MAX_FLASH_BANKS=2
-CONFIG_SYSRESET_SBI=y
index 2421c9a..a3a899e 100644 (file)
@@ -25,5 +25,4 @@ CONFIG_SYS_BOOTM_LEN=0x4000000
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
 CONFIG_DM_MTD=y
 CONFIG_SYS_MAX_FLASH_BANKS=2
-CONFIG_SYSRESET_SBI=y
 # CONFIG_BINMAN_FDT is not set
index 2861d07..1cb06b4 100644 (file)
@@ -24,4 +24,3 @@ CONFIG_CMD_NVEDIT_EFI=y
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
 CONFIG_DM_MTD=y
 CONFIG_SYS_MAX_FLASH_BANKS=2
-CONFIG_SYSRESET_SBI=y
index 1ecfa27..68b16f0 100644 (file)
@@ -25,5 +25,4 @@ CONFIG_SYS_BOOTM_LEN=0x4000000
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
 CONFIG_DM_MTD=y
 CONFIG_SYS_MAX_FLASH_BANKS=2
-CONFIG_SYSRESET_SBI=y
 # CONFIG_BINMAN_FDT is not set
index edbc2ee..6d1e59e 100644 (file)
@@ -4,6 +4,9 @@ CONFIG_SYS_DCACHE_OFF=y
 CONFIG_ARCH_CPU_INIT=y
 CONFIG_SYS_THUMB_BUILD=y
 CONFIG_ARCH_KIRKWOOD=y
+CONFIG_SUPPORT_PASSING_ATAGS=y
+CONFIG_CMDLINE_TAG=y
+CONFIG_INITRD_TAG=y
 CONFIG_SYS_KWD_CONFIG="board/Marvell/sheevaplug/kwbimage.cfg"
 CONFIG_SYS_TEXT_BASE=0x600000
 CONFIG_NR_DRAM_BANKS=2
index 1333c06..423af74 100644 (file)
@@ -50,6 +50,7 @@ CONFIG_ETH_DESIGNWARE=y
 CONFIG_DW_ALTDESCRIPTOR=y
 CONFIG_MII=y
 # CONFIG_PINCTRL_FULL is not set
+CONFIG_DM_REGULATOR=y
 CONFIG_SPI=y
 CONFIG_DM_SPI=y
 CONFIG_STM32_QSPI=y
index 16763e2..19d2c24 100644 (file)
@@ -72,6 +72,7 @@ CONFIG_DW_ALTDESCRIPTOR=y
 CONFIG_MII=y
 # CONFIG_PINCTRL_FULL is not set
 CONFIG_SPL_PINCTRL=y
+CONFIG_DM_REGULATOR=y
 CONFIG_SPL_RAM=y
 CONFIG_SPECIFY_CONSOLE_INDEX=y
 CONFIG_SPI=y
index 4bc2e8e..ec8fb37 100644 (file)
@@ -120,6 +120,7 @@ CONFIG_DM_REGULATOR_FIXED=y
 CONFIG_DM_REGULATOR_GPIO=y
 CONFIG_DM_REGULATOR_STM32_VREFBUF=y
 CONFIG_DM_REGULATOR_STPMIC1=y
+CONFIG_DM_REGULATOR_SCMI=y
 CONFIG_REMOTEPROC_STM32_COPRO=y
 CONFIG_RESET_SCMI=y
 CONFIG_DM_RNG=y
index e1a557e..f47e70b 100644 (file)
@@ -108,6 +108,7 @@ CONFIG_DM_I2C=y
 CONFIG_SYS_I2C_STM32F7=y
 CONFIG_LED=y
 CONFIG_LED_GPIO=y
+CONFIG_STM32_FMC2_EBI=y
 CONFIG_I2C_EEPROM=y
 CONFIG_SYS_I2C_EEPROM_ADDR=0x50
 CONFIG_SUPPORT_EMMC_BOOT=y
index 81eabeb..02cce50 100644 (file)
@@ -105,6 +105,7 @@ CONFIG_DM_I2C=y
 CONFIG_SYS_I2C_STM32F7=y
 CONFIG_LED=y
 CONFIG_LED_GPIO=y
+CONFIG_STM32_FMC2_EBI=y
 CONFIG_I2C_EEPROM=y
 CONFIG_SYS_I2C_EEPROM_ADDR=0x53
 CONFIG_SUPPORT_EMMC_BOOT=y
index 1df47fe..21bd1bc 100644 (file)
@@ -4,7 +4,6 @@ CONFIG_ARCH_MVEBU=y
 CONFIG_SYS_TEXT_BASE=0x00000000
 CONFIG_NR_DRAM_BANKS=2
 CONFIG_TARGET_TURRIS_MOX=y
-CONFIG_MVEBU_EFUSE=y
 CONFIG_ENV_SIZE=0x10000
 CONFIG_ENV_OFFSET=0x180000
 CONFIG_ENV_SECT_SIZE=0x10000
index bce14cc..ba635fe 100644 (file)
@@ -33,6 +33,7 @@ CONFIG_FIT_VERBOSE=y
 CONFIG_OF_BOARD_SETUP=y
 CONFIG_BOOTDELAY=3
 CONFIG_USE_PREBOOT=y
+CONFIG_CONSOLE_MUX=y
 CONFIG_SYS_CONSOLE_INFO_QUIET=y
 # CONFIG_DISPLAY_BOARDINFO is not set
 CONFIG_DISPLAY_BOARDINFO_LATE=y
@@ -103,6 +104,7 @@ CONFIG_PINCTRL_ARMADA_38X=y
 CONFIG_DM_RTC=y
 CONFIG_RTC_ARMADA38X=y
 CONFIG_SCSI=y
+CONFIG_SERIAL_PROBE_ALL=y
 CONFIG_SPL_DEBUG_UART_BASE=0xd0012000
 CONFIG_DEBUG_UART_SHIFT=2
 CONFIG_SYS_NS16550=y
index 13d1d92..3b0c527 100644 (file)
@@ -3,7 +3,6 @@ CONFIG_ARCH_CPU_INIT=y
 CONFIG_ARCH_MVEBU=y
 CONFIG_SYS_TEXT_BASE=0x00000000
 CONFIG_TARGET_MVEBU_ARMADA_37XX=y
-CONFIG_MVEBU_EFUSE=y
 CONFIG_ENV_SIZE=0x10000
 CONFIG_ENV_OFFSET=0x180000
 CONFIG_ENV_SECT_SIZE=0x10000
index 59534cd..f65b4a7 100644 (file)
@@ -15,10 +15,14 @@ CONFIG_SYS_PROMPT="Verdin iMX8MM # "
 CONFIG_SPL_MMC=y
 CONFIG_SPL_SERIAL=y
 CONFIG_SPL_DRIVERS_MISC=y
+CONFIG_BOOTCOUNT_BOOTLIMIT=3
+CONFIG_SYS_BOOTCOUNT_ADDR=0x30370090
 CONFIG_SPL=y
-CONFIG_SYS_LOAD_ADDR=0x40480000
+CONFIG_SYS_BOOTCOUNT_SINGLEWORD=y
+CONFIG_SYS_LOAD_ADDR=0x48280000
 CONFIG_SYS_MEMTEST_START=0x40000000
 CONFIG_SYS_MEMTEST_END=0x80000000
+CONFIG_LTO=y
 CONFIG_DISTRO_DEFAULTS=y
 CONFIG_FIT=y
 CONFIG_FIT_EXTERNAL_OFFSET=0x3000
@@ -26,7 +30,7 @@ CONFIG_FIT_VERBOSE=y
 CONFIG_SPL_LOAD_FIT=y
 # CONFIG_USE_SPL_FIT_GENERATOR is not set
 CONFIG_OF_SYSTEM_SETUP=y
-# CONFIG_USE_BOOTCOMMAND is not set
+CONFIG_BOOTDELAY=1
 CONFIG_USE_PREBOOT=y
 CONFIG_PREBOOT="test -n ${fdtfile} || setenv fdtfile imx8mm-verdin-${variant}-${fdt_board}.dtb"
 CONFIG_LOG=y
@@ -54,20 +58,26 @@ CONFIG_SYS_PBSIZE=2081
 # CONFIG_BOOTM_NETBSD is not set
 CONFIG_CMD_ASKENV=y
 # CONFIG_CMD_EXPORTENV is not set
-# CONFIG_CMD_CRC32 is not set
+CONFIG_CRC32_VERIFY=y
+CONFIG_CMD_MD5SUM=y
+CONFIG_MD5SUM_VERIFY=y
 CONFIG_CMD_MEMTEST=y
 CONFIG_CMD_CLK=y
 CONFIG_CMD_FUSE=y
 CONFIG_CMD_GPIO=y
 CONFIG_CMD_I2C=y
 CONFIG_CMD_MMC=y
+CONFIG_CMD_READ=y
 CONFIG_CMD_USB=y
+CONFIG_CMD_BOOTCOUNT=y
 CONFIG_CMD_CACHE=y
+CONFIG_CMD_TIME=y
 CONFIG_CMD_UUID=y
+CONFIG_CMD_PMIC=y
 CONFIG_CMD_REGULATOR=y
 CONFIG_CMD_EXT4_WRITE=y
 # CONFIG_ISO_PARTITION is not set
-# CONFIG_EFI_PARTITION is not set
+# CONFIG_SPL_EFI_PARTITION is not set
 CONFIG_OF_CONTROL=y
 CONFIG_SPL_OF_CONTROL=y
 CONFIG_ENV_OVERWRITE=y
@@ -76,11 +86,13 @@ CONFIG_SYS_RELOC_GD_ENV_ADDR=y
 CONFIG_SYS_MMC_ENV_PART=1
 CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG=y
 CONFIG_USE_ETHPRIME=y
-CONFIG_ETHPRIME="FEC"
+CONFIG_ETHPRIME="eth0"
 CONFIG_VERSION_VARIABLE=y
 CONFIG_IP_DEFRAG=y
 CONFIG_TFTP_BLOCKSIZE=4096
 CONFIG_SPL_DM=y
+CONFIG_BOOTCOUNT_LIMIT=y
+CONFIG_SYS_BOOTCOUNT_MAGIC=0xB0C40000
 CONFIG_SPL_CLK_COMPOSITE_CCF=y
 CONFIG_CLK_COMPOSITE_CCF=y
 CONFIG_SPL_CLK_IMX8MM=y
@@ -91,11 +103,20 @@ CONFIG_DM_I2C=y
 CONFIG_MISC=y
 CONFIG_I2C_EEPROM=y
 CONFIG_SUPPORT_EMMC_BOOT=y
+CONFIG_MMC_IO_VOLTAGE=y
+CONFIG_SPL_MMC_IO_VOLTAGE=y
+CONFIG_MMC_UHS_SUPPORT=y
+CONFIG_SPL_MMC_UHS_SUPPORT=y
+CONFIG_MMC_HS400_ES_SUPPORT=y
+CONFIG_MMC_HS400_SUPPORT=y
+CONFIG_SPL_MMC_HS400_SUPPORT=y
 CONFIG_FSL_USDHC=y
 CONFIG_PHYLIB=y
 CONFIG_PHY_ADDR_ENABLE=y
 CONFIG_PHY_MICREL=y
 CONFIG_PHY_MICREL_KSZ90X1=y
+CONFIG_PHY_FIXED=y
+CONFIG_DM_MDIO=y
 CONFIG_FEC_MXC=y
 CONFIG_MII=y
 CONFIG_PINCTRL=y
@@ -105,7 +126,6 @@ CONFIG_POWER_DOMAIN=y
 CONFIG_IMX8M_POWER_DOMAIN=y
 CONFIG_DM_PMIC=y
 CONFIG_SPL_DM_PMIC_PCA9450=y
-CONFIG_DM_PMIC_PFUZE100=y
 CONFIG_DM_REGULATOR=y
 CONFIG_DM_REGULATOR_FIXED=y
 CONFIG_DM_REGULATOR_GPIO=y
@@ -116,8 +136,11 @@ CONFIG_SPL_SYSRESET=y
 CONFIG_SYSRESET_PSCI=y
 CONFIG_SYSRESET_WATCHDOG=y
 CONFIG_DM_THERMAL=y
+CONFIG_IMX_TMU=y
 CONFIG_USB=y
-# CONFIG_SPL_DM_USB is not set
 CONFIG_USB_EHCI_HCD=y
+CONFIG_USB_KEYBOARD=y
+CONFIG_USB_HOST_ETHER=y
 CONFIG_IMX_WATCHDOG=y
+CONFIG_HEXDUMP=y
 CONFIG_OF_LIBFDT_OVERLAY=y
index 6168ee9..5d0c57c 100644 (file)
@@ -22,7 +22,7 @@ CONFIG_SPL_DRIVERS_MISC=y
 CONFIG_SPL=y
 CONFIG_IMX_BOOTAUX=y
 CONFIG_SPL_IMX_ROMAPI_LOADADDR=0x48000000
-CONFIG_SYS_LOAD_ADDR=0x43500000
+CONFIG_SYS_LOAD_ADDR=0x48280000
 CONFIG_SYS_MEMTEST_START=0x40000000
 CONFIG_SYS_MEMTEST_END=0x80000000
 CONFIG_DISTRO_DEFAULTS=y
index 5705c22..47214c0 100644 (file)
@@ -457,7 +457,7 @@ int blk_get_device_part_str(const char *ifname, const char *dev_part_str,
        }
 #endif
 
-#ifdef CONFIG_CMD_UBIFS
+#if IS_ENABLED(CONFIG_CMD_UBIFS) && !IS_ENABLED(CONFIG_SPL_BUILD)
        /*
         * Special-case ubi, ubi goes through a mtd, rather than through
         * a regular block device.
index 6081858..f5de65e 100644 (file)
@@ -58,6 +58,7 @@ quiet_cmd_sphinx = SPHINX  $@ --> file://$(abspath $(BUILDDIR)/$3/$4)
        $(SPHINXBUILD) \
        -j$(shell nproc) \
        -b $2 \
+       -j auto \
        -c $(abspath $(srctree)/$(src)) \
        -d $(abspath $(BUILDDIR)/.doctrees/$3) \
        -D version=$(KERNELVERSION) -D release=$(KERNELRELEASE) \
index 01b99f9..53edd53 100644 (file)
@@ -28,6 +28,7 @@ Board-specific doc
    nokia/index
    nxp/index
    openpiton/index
+   purism/index
    qualcomm/index
    rockchip/index
    samsung/index
diff --git a/doc/board/purism/index.rst b/doc/board/purism/index.rst
new file mode 100644 (file)
index 0000000..a9cdc31
--- /dev/null
@@ -0,0 +1,9 @@
+.. SPDX-License-Identifier: GPL-2.0+
+
+Purism SPC
+==========
+
+.. toctree::
+   :maxdepth: 2
+
+   librem5
diff --git a/doc/board/purism/librem5.rst b/doc/board/purism/librem5.rst
new file mode 100644 (file)
index 0000000..fb050c6
--- /dev/null
@@ -0,0 +1,60 @@
+.. SPDX-License-Identifier: GPL-2.0+
+
+Librem5
+==========
+
+U-Boot for the Purism Librem5 phone
+
+Quick Start
+-----------
+
+- Build the ARM Trusted firmware binary
+- Get ddr and hdmi firmware
+- Build U-Boot
+
+Get and Build the ARM Trusted firmware
+--------------------------------------
+
+Note: srctree is U-Boot source directory
+Get ATF from: https://source.puri.sm/Librem5/arm-trusted-firmware
+branch: librem5
+
+.. code-block:: bash
+
+   $ make PLAT=imx8mq CROSS_COMPILE=aarch64-linux-gnu- bl31
+   $ cp build/imx8mq/release/bl31.bin $(builddir)
+
+Get the ddr and display port firmware
+-------------------------------------
+
+.. code-block:: bash
+
+   $ wget https://www.nxp.com/lgfiles/NMG/MAD/YOCTO/firmware-imx-8.15.bin
+   $ chmod +x firmware-imx-8.15.bin
+   $ ./firmware-imx-8.15.bin
+   $ cp firmware-imx-8.15/firmware/hdmi/cadence/signed_dp_imx8m.bin $(builddir)
+   $ cp firmware-imx-8.15/firmware/ddr/synopsys/lpddr4*.bin $(builddir)
+
+Build U-Boot
+------------
+
+.. code-block:: bash
+
+   $ export CROSS_COMPILE=aarch64-linux-gnu-
+   $ make librem5_defconfig
+   $ make ARCH=arm
+
+Burn the flash.bin
+------------------
+
+Use uuu to burn flash.bin. Power on the phone while holding vol+ to get it
+into uuu mode.
+
+.. code-block:: bash
+
+   $ git clone https://source.puri.sm/Librem5/librem5-devkit-tools.git
+   $ cd librem5-devkit-tools
+   $ cp $(builddir)/flash.bin files/u-boot-librem5.imx
+   $ uuu uuu_scripts/u-boot_flash_librem5.lst
+
+Reboot the phone.
index f7fc725..1ccc494 100644 (file)
@@ -322,7 +322,7 @@ look like this::
 
 The `sf-bootdev` driver can implement a way to read from the SPI flash, using
 the offset and size provided, and return that bootflow file back to the caller.
-When distro boot wants to read the kernel it calls disto_getfile() which must
+When distro boot wants to read the kernel it calls distro_getfile() which must
 provide a way to read from the SPI flash. See `distro_boot()` at distro_boot_
 for more details.
 
index ce6b38e..5934d9f 100644 (file)
@@ -11,6 +11,7 @@ General
 
    codingstyle
    designprinciples
+   patman
    process
    release_cycle
    system_configuration
index 388945c..0fa0143 100644 (file)
@@ -108,6 +108,8 @@ Differences to the Linux Development Process
   In U-Boot, ``"-rc1"`` will only be released after all (or at least most of
   the) patches that were submitted during the merge window have been applied.
 
+.. _custodians:
+
 Custodians
 ----------
 
@@ -127,31 +129,88 @@ patch, these should leave no doubt if they were just comments and the
 patch will be accepted anyway, or if the patch should be
 reworked/resubmitted, or if it was rejected.
 
-Work flow of a Custodian
+Review Process, Git Tags
 ------------------------
 
-The normal flow of work in the U-Boot development process will look
-like this:
+There are a number of *git tags* that are used to document the origin and the
+processing of patches on their way into the mainline U-Boot code. The following
+is an attempt to document how these are usually handled in the U-Boot project.
+
+In general, we try to follow the established procedures from other projects,
+especially the Linux kernel, but there may be smaller differences. For
+reference, see the Linux kernel's `Submitting patches
+<https://www.kernel.org/doc/html/latest/process/submitting-patches.html>`_
+document.
+
+.. _dco:
+
+* Signed-off-by: the *Signed-off-by:* is a line at the end of the commit
+  message by which the signer certifies that they were involved in the development
+  of the patch and that they accept the `Developer Certificate of Origin
+  <https://developercertificate.org/>`_. Following this and adding a
+  ``Signed-off-by:`` line that contains the developer's name and email address
+  is required.
 
-#. A developer submits a patch via e-mail to the u-boot mailing list.  In
-   U-Boot, we make use of the `Developer Certificate of Origin
-   <https://developercertificate.org/>`_ that is common in other projects such
-   as the Linux kernel.  Following this and adding a ``Signed-off-by:`` line
-   that contains the developer's name and email address is required.
+   * Please note that in U-Boot, we do not add a ``Signed-off-by`` tag if we
+     just pass on a patch without any changes.
 
    * Please note that when importing code from other projects you must say
      where it comes from, and what revision you are importing. You must not
      however copy ``Signed-off-by`` or other tags.
 
-#. Everybody who can is invited to review and test the changes.  Typically, we
-   follow the same guidelines as the Linux kernel for `Acked-by
-   <https://www.kernel.org/doc/html/latest/process/submitting-patches.html#when-to-use-acked-by-cc-and-co-developed-by>`_
-   as well as `Reviewed-by
-   <https://www.kernel.org/doc/html/latest/process/submitting-patches.html#using-reported-by-tested-by-reviewed-by-suggested-by-and-fixes>`_
-   and similar additional tags.
+* Everybody who can is invited to review and test the changes. Typically, we
+  follow the same guidelines as the Linux kernel for `Acked-by
+  <https://www.kernel.org/doc/html/latest/process/submitting-patches.html#when-to-use-acked-by-cc-and-co-developed-by>`_
+  as well as `Reviewed-by
+  <https://www.kernel.org/doc/html/latest/process/submitting-patches.html#using-reported-by-tested-by-reviewed-by-suggested-by-and-fixes>`_
+  and similar additional tags.
+
+* Reviewed-by: The patch has been reviewed and found acceptible according to
+  the `Reveiwer's statement of oversight
+  <https://www.kernel.org/doc/html/latest/process/submitting-patches.html#reviewer-s-statement-of-oversight>`_.
+  A *Reviewed-by:* tag is a statement of opinion that the patch is an
+  appropriate modification of the code without any remaining serious technical
+  issues. Any interested reviewer (who has done the work) can offer a
+  *Reviewed-by:* tag for a patch.
+
+* Acked-by: If a person was not directly involved in the preparation or
+  handling of a patch but wishes to signify and record their approval of it
+  then they can arrange to have an *Acked-by:* line added to the patch's
+  changelog.
+
+* Tested-by: A *Tested-by:* tag indicates that the patch has been successfully
+  tested (in some environment) by the person named. Andrew Morton: "I think
+  it's very useful information to have. For a start, it tells you who has the
+  hardware and knows how to build a kernel. So if you're making a change to a
+  driver and want it tested, you can troll the file's changelog looking for
+  people who might be able to help."
+
+* Reported-by: If this patch fixes a problem reported by somebody else,
+  consider adding a *Reported-by:* tag to credit the reporter for their
+  contribution. Please note that this tag should not be added without the
+  reporter's permission, especially if the problem was not reported in a public
+  forum.
+
+* Cc: If a person should have the opportunity to comment on a patch, you may
+  optionally add a *Cc:* tag to the patch. Git tools (git send-email) will then
+  automatically arrange that they receives a copy of the patch when you submit it
+  to the mainling list. This is the only tag which might be added without an
+  explicit action by the person it names. This tag documents that potentially
+  interested parties have been included in the discussion.
+  For example, when your change affects a specific board or driver, then makes
+  a lot of sense to put the respective maintainer of this code on Cc:
+
+Work flow of a Custodian
+------------------------
+
+The normal flow of work in the U-Boot development process will look
+like this:
 
 #. The responsible custodian inspects this patch, especially for:
 
+   #. The commit message is useful, descriptive and makes correct and
+      appropraite usage of required *git tags*.
+
    #. :doc:`codingstyle`
 
    #. Basic logic:
index b75576c..7d8a610 100644 (file)
@@ -68,9 +68,9 @@ For the next scheduled release, release candidates were made on::
 
 * U-Boot v2022.10-rc3 was released on Mon 22 August 2022.
 
-.. * U-Boot v2022.10-rc4 was released on Mon 05 September 2022.
+* U-Boot v2022.10-rc4 was released on Mon 05 September 2022.
 
-.. * U-Boot v2022.10-rc5 was released on Mon 19 September 2022.
+* U-Boot v2022.10-rc5 was released on Mon 19 September 2022.
 
 Please note that the following dates are planned only and may be deviated from
 as needed.
index 0542ade..1730756 100644 (file)
 Sending patches
 ===============
 
-.. toctree::
-   :maxdepth: 2
+*Before you begin* to implement any new ideas or concepts it is always a good
+idea to present your plans on the `U-Boot mailing list
+<https://lists.denx.de/listinfo/u-boot>`_. U-Boot supports a huge amount of
+very different systems, and it is often impossible for the individual developer
+to oversee the consequences of a specific change to all architectures.
+Discussing concepts early can help you to avoid spending effort on code which,
+when submitted as a patch, might be rejected and/or will need lots of rework
+because it does not fit for some reason. Early peer review is an important
+resource - use it. Being familiar with the :doc:`process` is also important.
 
-   patman
+A good introduction how to prepare for submitting patches can be found in the
+LWN article `How to Get Your Change Into the Linux Kernel
+<http://lwn.net/Articles/139918/>`_ as the same rules apply to U-Boot, too.
 
+Using patman
+------------
 
 You can use a tool called patman to prepare, check and sent patches. It creates
 change logs, cover letters and patch notes. It also simplified the process of
 sending multiple versions of a series.
 
 See more details at :doc:`patman`.
+
+General Patch Submission Rules
+------------------------------
+
+* All patches must be sent to the `u-boot@lists.denx.de
+  <https://lists.denx.de/listinfo/u-boot>`_ mailing list.
+
+* If your patch affects the code maintained by one of the :ref:`custodians`, CC
+  them when emailing your patch. The easiest way to make sure you don't forget
+  this even when you resubmit the patch later is to add a ``Cc: name
+  <address>`` line after your ``Signed-off-by:`` line (see the example below).
+
+* Take a look at the commit logs of the files you are modifying. Authors of
+  past commits might have input to your change, so also CC them if you think
+  they may have feedback.
+
+* Patches should always contain exactly one complete logical change, i. e.
+
+   * Changes that contain different, unrelated modifications shall be submitted
+     as *separate* patches, one patch per changeset.
+
+   * If one logical set of modifications affects or creates several files, all
+     these changes shall be submitted in a *single* patch.
+
+* Non-functional changes, i.e. whitespace and reformatting changes, should be
+  done in separate patches marked as ``cosmetic``. This separation of functional
+  and cosmetic changes greatly facilitates the review process.
+
+* Some comments on running :doc:`checkpatch.pl <checkpatch>`:
+
+   * Checkpatch is a tool that can help you find some style problems, but is
+     imperfect, and the things it complains about are of varying importance.
+     So use common sense in interpreting the results.
+
+   * Warnings that clearly only make sense in the Linux kernel can be ignored.
+     This includes ``Use #include <linux/$file> instead of <asm/$file>`` for
+     example.
+
+   * If you encounter warnings for existing code, not modified by your patch,
+     consider submitting a separate, cosmetic-only patch -- clearly described
+     as such -- that *precedes* your substantive patch.
+
+   * For minor modifications (e.g. changed arguments of a function call),
+     adhere to the present codingstyle of the module. Relating checkpatch
+     warnings can be ignored in this case. A respective note in the commit or
+     cover letter why they are ignored is desired.
+
+* Send your patches as plain text messages: no HTML, no MIME, no links, no
+  compression, no attachments. Just plain text. The best way the generate
+  patches is by using the ``git format-patch`` command. Please use the
+  ``master`` branch of the mainline U-Boot git repository
+  (``https://source.denx.de/u-boot/u-boot.git``) as reference, unless (usually
+  late in a release cycle) there has been an announcement to use the ``next``
+  branch of this repository instead.
+
+* Make sure that your mailer does not mangle the patch by automatic changes
+  like wrapping of longer lines etc.
+  The best way to send patches is by not using your regular mail tool, but by
+  using either ``git send-email`` or the ``git imap-send`` command instead.
+  If you believe you need to use a mailing list for testing (instead of any
+  regular mail address you own), we have a special test list for such purposes.
+  It would be best to subscribe to the list for the duration of your tests to
+  avoid repeated moderation - see https://lists.denx.de/listinfo/test
+
+* Choose a meaningful Subject: - keep in mind that the Subject will also be
+  visible as headline of your commit message. Make sure the subject does not
+  exceed 60 characters or so.
+
+* The start of the subject should be a meaningfull tag (arm:, ppc:, tegra:,
+  net:, ext2:, etc)
+
+* Include the string "PATCH" in the Subject: line of your message, e. g.
+  "[PATCH] Add support for feature X". ``git format-patch`` should automatically
+  do this.
+
+* If you are sending a patch series composed of multiple patches, make sure
+  their titles clearly state the patch order and total number of patches (``git
+  format-patch -n``). Also, often times an introductory email describing what
+  the patchset does is useful (``git format-patch -n --cover-letter``). As an
+  example::
+
+   [PATCH 0/3] Add support for new SuperCPU2000
+      (This email does not contain a patch, just a description)
+   [PATCH 1/3] Add core support for SuperCPU2000
+   [PATCH 2/3] Add support for SuperCPU2000's on-chip I2C controller
+   [PATCH 3/3] Add support for SuperCPU2000's on-chip UART
+
+* In the message body, include a description of your changes.
+
+   * For bug fixes: a description of the bug and how your patch fixes this bug.
+     Please try to include a way of demonstrating that the patch actually fixes
+     something.
+
+   * For new features: a description of the feature and your implementation.
+
+* Additional comments which you don't want included in U-Boot's history can be
+  included below the first "---" in the message body.
+
+* If your description gets too long, that's a strong indication that you should
+  split up your patch.
+
+* Remember that there is a size limit of 100 kB on the mailing list. In most
+  cases, you did something wrong if your patch exceeds this limit. Think again
+  if you should not split it into separate logical parts.
+
+Attributing Code, Copyrights, Signing
+-------------------------------------
+
+* Sign your changes, i. e. add a *Signed-off-by:* line to the message body.
+  This can be automated by using ``git commit -s``. Please see the
+  :ref:`Developer Certificate of Origin <dco>` section for more details here.
+
+* If you change or add *significant* parts to a file, then please make sure to
+  add your copyright to that file, for example like this::
+
+   (C) Copyright 2010  Joe Hacker <jh@hackers.paradise.com>
+
+         Please do *not* include a detailed description of your
+         changes. We use the *git* commit messages for this purpose.
+
+* If you add new files, please always make sure that these contain your
+  copyright note and a GPLv2+ SPDX-License-Identifier, for example like this::
+
+   (C) Copyright 2010  Joe Hacker <jh@hackers.paradise.com>
+
+   SPDX-License-Identifier:<TAB>GPL-2.0+
+
+* If you are copying or adapting code from other projects, like the Linux
+  kernel, or BusyBox, or similar, please make sure to state clearly where you
+  copied the code from, and provide terse but precise information which exact
+  version or even commit ID was used. Follow the ideas of this note from the
+  Linux "SubmittingPatches" document::
+
+   Special note to back-porters: It seems to be a common and useful practice
+   to insert an indication of the origin of a patch at the top of the commit
+   message (just after the subject line) to facilitate tracking. For instance,
+   here's what we see in 2.6-stable :
+
+        Date:  Tue May 13 19:10:30 2008 +0000
+
+                 SCSI: libiscsi regression in 2.6.25: fix nop timer handling
+
+                 commit 4cf1043593db6a337f10e006c23c69e5fc93e722 upstream
+
+   And here's what appears in 2.4 :
+
+        Date:  Tue May 13 22:12:27 2008 +0200
+
+                 wireless, airo: waitbusy() won't delay
+
+                 [backport of 2.6 commit b7acbdfbd1f277c1eb23f344f899cfa4cd0bf36a]
+
+Whatever the format, this information provides a valuable help to people
+tracking your trees, and to people trying to trouble-shoot bugs in your
+tree.
+
+Commit message conventions
+--------------------------
+
+Please adhere to the following conventions when writing your commit
+log messages.
+
+* The first line of the log message is the summary line. Keep this less than 70
+  characters long.
+
+* Don't use periods to end the summary line (e.g., don't do "Add support for
+  X.")
+
+* Use the present tense in your summary line (e.g., "Add support for X" rather
+  than "Added support for X"). Furthermore, use the present tense in your log
+  message to describe what the patch is doing. This isn't a strict rule -- it's
+  OK to use the past tense for describing things that were happening in the old
+  code for example.
+
+* Use the imperative tense in your summary line (e.g., "Add support for X"
+  rather than "Adds support for X"). In general, you can think of the summary
+  line as "this commit is meant to 'Add support for X'"
+
+* If applicable, prefix the summary line with a word describing what area of
+  code is being affected followed by a colon. This is a standard adopted by
+  both U-Boot and Linux. For example, if your change affects all mpc85xx
+  boards, prefix your summary line with "mpc85xx:". If your change affects the
+  PCI common code, prefix your summary line with "pci:". The best thing to do
+  is look at the "git log <file>" output to see what others have done so you
+  don't break conventions.
+
+* Insert a blank line after the summary line
+
+* For bug fixes, it's good practice to briefly describe how things behaved
+  before this commit
+
+* Put a detailed description after the summary and blank line. If the summary
+  line is sufficient to describe the change (e.g. it is a trivial spelling
+  correction or whitespace update), you can omit the blank line and detailed
+  description.
+
+* End your log message with S.O.B. (Signed-off-by) line. This is done
+  automatically when you use ``git commit -s``. Please see the
+  :ref:`Developer Certificate of Origin <dco>` section for more details here.
+
+* Keep EVERY line under 72 characters. That is, your message should be
+  line-wrapped with line-feeds. However, don't get carried away and wrap it too
+  short either since this also looks funny.
+
+* Detail level: The audience of the commit log message that you should cater to
+  is those familiar with the underlying source code you are modifying, but who
+  are _not_ familiar with the patch you are submitting. They should be able to
+  determine what is being changed and why. Avoid excessive low-level detail.
+  Before submitting, re-read your commit log message with this audience in mind
+  and adjust as needed.
+
+Sending updated patch versions
+------------------------------
+
+It is pretty normal that the first version of a patch you are submitting does
+not get accepted as is, and that you are asked to submit another, improved
+version.
+
+When re-posting such a new version of your patch(es), please always make sure
+to observe the following rules.
+
+* Make an appropriate note that this is a re-submission in the subject line,
+  eg. "[PATCH v2] Add support for feature X". ``git format-patch
+  --subject-prefix="PATCH v2"`` can be used in this case (see the example
+  below).
+
+* Please make sure to keep a "change log", i. e. a description of what you have
+  changed compared to previous versions of this patch. This change log should
+  be added below the "---" line in the patch, which starts the "comment
+  section", i. e. which contains text that does not get included into the
+  actual commit message.
+  Note: it is *not* sufficient to provide a change log in some cover letter
+  that gets sent as a separate message with the patch series. The reason is
+  that such cover letters are not as easily reviewed in our `patchwork queue
+  <http://patchwork.ozlabs.org/project/uboot/list/>`_ so they are not helpful
+  to any reviewers using this tool. Example::
+
+   From: Joe Hacker <jh@hackers.paradise.com>
+   Date: Thu, 1 Jan 2222 12:21:22 +0200
+   Subject: [PATCH 1/2 v3] FOO: add timewarp-support
+
+   This patch adds timewarp-support for the FOO family of processors.
+
+   adapted for the current kernel structures.
+
+   Signed-off-by: Joe Hacker <jh@hackers.paradise.com>
+   Cc: Tom Maintainer <tm@u-boot.custodians.org>
+   ---
+   Changes for v2:
+   - Coding Style cleanup
+   - fixed miscalculation of time-space discontinuities
+   Changes for v3:
+   - fixed compiler warnings observed with GCC-17.3.5
+   - worked around integer overflow in warp driver
+
+    arch/foo/cpu/spacetime.c |  8 +
+    drivers/warp/Kconfig     |  7 +
+    drivers/warp/Makefile    | 42 +++
+    drivers/warp/warp-core.c | 255 +++++++++++++++++++++++++
+
+* Make sure that your mailer adds or keeps correct ``In-reply-to:`` and
+  ``References:`` headers, so threading of messages is working and everybody
+  can see that the new message refers to some older posting of the same topic.
+
+Uncommented and un-threaded repostings are extremely annoying and
+time-consuming, as we have to try to remember if anything similar has been
+posted before, look up the old threads, and then manually compare if anything
+has been changed, or what.
+
+If you have problems with your e-mail client, for example because it mangles
+white space or wraps long lines, then please read this article about `Email
+Clients and Patches <http://kerneltrap.org/Linux/Email_Clients_and_Patches>`_.
+
+Notes
+-----
+
+1. U-Boot is Free Software that can redistributed and/or modified under the
+   terms of the `GNU General Public License
+   <http://www.fsf.org/licensing/licenses/gpl.html>`_ (GPL). Currently (August
+   2022) version 2 of the GPL applies. Please see :download:`Licensing
+   <../../Licenses/README>` for details. To allow that later versions of U-Boot
+   may be released under a later version of the GPL, all new code that gets
+   added to U-Boot shall use a "GPL-2.0+" SPDX-License-Identifier.
+
+2. All code must follow the :doc:`codingstyle` requirements.
+
+3. Before sending the patch, you *must* run some form of local testing.
+   Submitting a patch that does not build or function correct is a mistake. For
+   non-trivial patches, either building a number of platforms locally or making
+   use of :doc:`ci_testing` is strongly encouraged in order to avoid problems
+   that can be found when attempting to merge the patch.
+
+4. If you modify existing code, make sure that your new code does not add to
+   the memory footprint of the code. Remember: Small is beautiful! When adding
+   new features follow the guidelines laid out in :doc:`system_configuration`.
+
+Patch Tracking
+--------------
+
+Like some other projects, U-Boot uses `Patchwork <http://patchwork.ozlabs.org/>`_
+to track the state of patches. This is one of the reasons why it is mandatory
+to submit all patches to the U-Boot mailing list - only then they will be
+picked up by patchwork.
+
+At http://patchwork.ozlabs.org/project/uboot/list/ you can find the list of
+open U-Boot patches. By using the "Filters" link (Note: requires JavaScript)
+you can also select other views, for example, to include old patches that have,
+for example, already been applied or rejected.
+
+Note that Patchwork automatically tracks and collects a number of git tags from
+follow-up mails, so it is usually better to apply a patch through the Patchwork
+commandline interface than just manually applying it from a posting on the
+mailing list (in which case you have to do all the tracking and adding of git
+tags yourself). This also obviates the need of a developer to resubmit a patch
+only in order to collect these tags.
+
+A Custodian has additional privileges and can:
+
+* **Delegate** a patch
+
+* **Change the state** of a patch. The following states exist:
+
+   * New
+
+   * Under Review
+
+   * Accepted
+
+   * Rejected
+
+   * RFC
+
+   * Not Applicable
+
+   * Changes Requested
+
+   * Awaiting Upstream
+
+   * Superseeded
+
+   * Deferred
+
+   * Archived
+
+Patchwork work-flow
+^^^^^^^^^^^^^^^^^^^
+
+The following are a "rule of thumb" as to how the states are used in patchwork
+today. Not all states are used by all custodians.
+
+* New: Patch has been submitted to the list, and none of the maintainers has
+  changed it's state since.
+
+* Under Review: A custodian is reviewing the patch currently.
+
+* Accepted: When a patch has been applied to a custodian repository that gets
+  used for pulling from into upstream, they are put into "accepted" state.
+
+* Rejected: Rejected means we just don't want to do what the patch does.
+
+* RFC: The patch is not intended to be applied to any of the mainline
+  repositories, but merely for discussing or testing some idea or new feature.
+
+* Not Applicable: The patch either was not intended to be applied, as it was
+  a debugging or discussion aide that patchwork picked up, or was cross-posted
+  to our list but intended for another project entirely.
+
+* Changes Requested: The patch looks mostly OK, but requires some rework before
+  it will be accepted for mainline.
+
+* Awaiting Upstream: A custodian may have applied this to the ``next`` branch
+  and has not merged yet to master, or has queued the patch up to be submitted
+  to be merged, but has not yet.
+
+* Superseeded: Patches are marked as 'superseeded' when the poster submits a
+  new version of these patches.
+
+* Deferred: Deferred usually means the patch depends on something else that
+  isn't upstream, such as patches that only apply against some specific other
+  repository. This is also used when a patch has been in patchwork for over a
+  year and it is unlikely to be applied as-is.
+
+* Archived: Archiving puts the patch away somewhere where it doesn't appear in
+  the normal pages and needs extra effort to get to.
+
+Apply patches
+^^^^^^^^^^^^^
+
+To apply a patch from the `patchwork queue
+<http://patchwork.ozlabs.org/project/uboot/list/>`_ using ``git``, download the
+mbox file and apply it using::
+
+   git am file
+
+The `openembedded wiki <http://wiki.openembedded.net/>`_ also provides a script
+named `pw-am.sh
+<http://cgit.openembedded.org/cgit.cgi/openembedded/tree/contrib/patchwork/pw-am.sh>`_
+which can be used to fetch an 'mbox' patch from patchwork and git am it::
+
+   usage: pw-am.sh <number>
+   example: 'pw-am.sh 71002' will get and apply the patch from http://patchwork.ozlabs.org/patch/71002/
+
+Update the state of patches
+^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+You have to register to be able to update the state of patches. You can use the
+Web interface, `pwclient`, or `pwparser`.
+
+pwclient
+^^^^^^^^
+
+The `pwclient` command line tool can be used for example to retrieve patches,
+search the queue or update the state.
+
+All necessary information for `pwclient` is linked from the bottom of
+http://patchwork.ozlabs.org/project/uboot/
+
+Use::
+
+   pwclient help
+
+for an overview on how to use it.
+
+pwparser
+^^^^^^^^
+
+See http://www.mail-archive.com/patchwork@lists.ozlabs.org/msg00057.html
diff --git a/doc/device-tree-bindings/firmware/fwu-mdata-mtd.yaml b/doc/device-tree-bindings/firmware/fwu-mdata-mtd.yaml
new file mode 100644 (file)
index 0000000..4f5404f
--- /dev/null
@@ -0,0 +1,38 @@
+# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/firmware/u-boot,fwu-mdata-sf.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: FWU metadata on MTD device without GPT
+
+maintainers:
+ - Masami Hiramatsu <masami.hiramatsu@linaro.org>
+
+properties:
+  compatible:
+    items:
+      - const: u-boot,fwu-mdata-mtd
+
+  fwu-mdata-store:
+    maxItems: 1
+    description: Phandle of the MTD device which contains the FWU medatata.
+
+  mdata-offsets:
+    minItems: 2
+    description: Offsets of the primary and secondary FWU metadata in the NOR flash.
+
+required:
+  - compatible
+  - fwu-mdata-store
+  - mdata-offsets
+
+additionalProperties: false
+
+examples:
+  - |
+    fwu-mdata {
+        compatible = "u-boot,fwu-mdata-mtd";
+        fwu-mdata-store = <&spi-flash>;
+        mdata-offsets = <0x500000 0x530000>;
+    };
diff --git a/doc/imx/habv4/csf_examples/mx8m/csf.sh b/doc/imx/habv4/csf_examples/mx8m/csf.sh
new file mode 100644 (file)
index 0000000..6898513
--- /dev/null
@@ -0,0 +1,77 @@
+#!/bin/sh
+
+# 0) Generate keys
+#
+# WARNING: ECDSA keys are only supported by HAB 4.5 and newer (i.e. i.MX8M Plus)
+#
+# cd /path/to/cst-3.3.1/keys/
+#    ./hab4_pki_tree.sh -existing-ca n -use-ecc n -kl 4096 -duration 10 -num-srk 4 -srk-ca y
+# cd /path/to/cst-3.3.1/crts/
+#   ../linux64/bin/srktool -h 4 -t SRK_1_2_3_4_table.bin -e SRK_1_2_3_4_fuse.bin -d sha256 -c ./SRK1_sha256_4096_65537_v3_ca_crt.pem,./SRK2_sha256_4096_65537_v3_ca_crt.pem,./SRK3_sha256_4096_65537_v3_ca_crt.pem,./SRK4_sha256_4096_65537_v3_ca_crt.pem -f 1
+
+# 1) Build U-Boot (e.g. for i.MX8MM)
+#
+# export ATF_LOAD_ADDR=0x920000
+# cp -Lv /path/to/arm-trusted-firmware/build/imx8mm/release/bl31.bin .
+# cp -Lv /path/to/firmware-imx-8.14/firmware/ddr/synopsys/ddr3* .
+# make -j imx8mm_board_defconfig
+# make -j`nproc` flash.bin
+
+# 2) Sign SPL and DRAM blobs
+
+cp doc/imx/habv4/csf_examples/mx8m/csf_spl.txt csf_spl.tmp
+cp doc/imx/habv4/csf_examples/mx8m/csf_fit.txt csf_fit.tmp
+
+spl_block_base=$(printf "0x%x" $(( $(sed -n "/CONFIG_SPL_TEXT_BASE=/ s@.*=@@p" .config) - 0x40)) )
+spl_block_size=$(printf "0x%x" $(stat -tc %s u-boot-spl-ddr.bin))
+sed -i "/Blocks = / s@.*@  Blocks = $spl_block_base 0x0 $spl_block_size \"flash.bin\"@" csf_spl.tmp
+
+# Generate CSF blob
+cst -i csf_spl.tmp -o csf_spl.bin
+
+# Patch CSF blob into flash.bin
+spl_csf_offset=$(xxd -s 24 -l 4 -e flash.bin | cut -d " " -f 2 | sed "s@^@0x@")
+spl_bin_offset=$(xxd -s 4 -l 4 -e flash.bin | cut -d " " -f 2 | sed "s@^@0x@")
+spl_dd_offset=$((${spl_csf_offset} - ${spl_bin_offset} + 0x40))
+dd if=csf_spl.bin of=flash.bin bs=1 seek=${spl_dd_offset} conv=notrunc
+
+# 3) Sign u-boot.itb
+
+# fitImage tree
+fit_block_base=$(printf "0x%x" $(( $(sed -n "/CONFIG_SYS_TEXT_BASE=/ s@.*=@@p" .config) - $(sed -n "/CONFIG_FIT_EXTERNAL_OFFSET=/ s@.*=@@p" .config) - 0x200 - 0x40)) )
+fit_block_offset=$(printf "0x%s" $(fdtget -t x u-boot.dtb /binman/imx-boot/uboot offset))
+fit_block_size=$(printf "0x%x" $(( ( $(fdtdump u-boot.itb 2>/dev/null | sed -n "/^...totalsize:/ s@.*\(0x[0-9a-f]\+\).*@\1@p") + 0x1000 - 0x1 ) & ~(0x1000 - 0x1) + 0x20 )) )
+sed -i "/Blocks = / s@.*@  Blocks = $fit_block_base $fit_block_offset $fit_block_size \"flash.bin\", \\\\@" csf_fit.tmp
+
+# U-Boot
+uboot_block_base=$(printf "0x%s" $(fdtget -t x u-boot.itb /images/uboot load))
+uboot_block_offset=$(printf "0x%x" $(( $(printf "0x%s" $(fdtget -t x u-boot.itb /images/uboot data-position)) + ${fit_block_offset} )))
+uboot_block_size=$(printf "0x%s" $(fdtget -t x u-boot.itb /images/uboot data-size))
+sed -i "/0xuuuu/ s@.*@           $uboot_block_base $uboot_block_offset $uboot_block_size \"flash.bin\", \\\\@" csf_fit.tmp
+
+# ATF
+atf_block_base=$(printf "0x%s" $(fdtget -t x u-boot.itb /images/atf load))
+atf_block_offset=$(printf "0x%x" $(( $(printf "0x%s" $(fdtget -t x u-boot.itb /images/atf data-position)) + ${fit_block_offset} )))
+atf_block_size=$(printf "0x%s" $(fdtget -t x u-boot.itb /images/atf data-size))
+sed -i "/0xaaaa/ s@.*@           $atf_block_base $atf_block_offset $atf_block_size \"flash.bin\", \\\\@" csf_fit.tmp
+
+# DTB
+dtb_block_base=$(printf "0x%x" $(( ${uboot_block_base} + ${uboot_block_size} )))
+dtb_block_offset=$(printf "0x%x" $(( $(printf "0x%s" $(fdtget -t x u-boot.itb /images/fdt-1 data-position)) + ${fit_block_offset} )))
+dtb_block_size=$(printf "0x%s" $(fdtget -t x u-boot.itb /images/fdt-1 data-size))
+sed -i "/0xdddd/ s@.*@           $dtb_block_base $dtb_block_offset $dtb_block_size \"flash.bin\"@" csf_fit.tmp
+
+# IVT
+ivt_ptr_base=$(printf "%08x" ${fit_block_base} | sed "s@\(..\)\(..\)\(..\)\(..\)@0x\4\3\2\1@")
+ivt_block_base=$(printf "%08x" $(( ${fit_block_base} + ${fit_block_size} - 0x20 )) | sed "s@\(..\)\(..\)\(..\)\(..\)@0x\4\3\2\1@")
+csf_block_base=$(printf "%08x" $(( ${fit_block_base} + ${fit_block_size} )) | sed "s@\(..\)\(..\)\(..\)\(..\)@0x\4\3\2\1@")
+ivt_block_offset=$((${fit_block_offset} + ${fit_block_size} - 0x20))
+csf_block_offset=$((${ivt_block_offset} + 0x20))
+
+echo "0xd1002041 ${ivt_ptr_base} 0x00000000 0x00000000 0x00000000 ${ivt_block_base} ${csf_block_base} 0x00000000" | xxd -r -p > ivt.bin
+dd if=ivt.bin of=flash.bin bs=1 seek=${ivt_block_offset} conv=notrunc
+
+# Generate CSF blob
+cst -i csf_fit.tmp -o csf_fit.bin
+# Patch CSF blob into flash.bin
+dd if=csf_fit.bin of=flash.bin bs=1 seek=${csf_block_offset} conv=notrunc
diff --git a/doc/imx/habv4/csf_examples/mx8m/csf_fit.txt b/doc/imx/habv4/csf_examples/mx8m/csf_fit.txt
new file mode 100644 (file)
index 0000000..cd1d407
--- /dev/null
@@ -0,0 +1,36 @@
+[Header]
+  Version = 4.3
+  Hash Algorithm = sha256
+  Engine = CAAM
+  Engine Configuration = 0
+  Certificate Format = X509
+  Signature Format = CMS
+
+[Install SRK]
+  # FIXME: Adjust path here
+  File = "/path/to/cst-3.3.1/crts/SRK_1_2_3_4_table.bin"
+  Source index = 0
+
+[Install CSFK]
+  # FIXME: Adjust path here
+  File = "/path/to/cst-3.3.1/crts/CSF1_1_sha256_4096_65537_v3_usr_crt.pem"
+
+[Authenticate CSF]
+
+[Install Key]
+  Verification index = 0
+  Target Index = 2
+  # FIXME: Adjust path here
+  File = "/path/to/cst-3.3.1/crts/IMG1_1_sha256_4096_65537_v3_usr_crt.pem"
+
+[Authenticate Data]
+  Verification index = 2
+  # FIXME:
+  # Line 1 -- fitImage tree
+  # Line 2 -- U-Boot u-boot-nodtb.bin blob
+  # Line 3 -- ATF BL31 blob
+  # Line 4 -- DT blob
+  Blocks = 0x401fcdc0 0x57c00 0xffff "flash.bin", \
+           0x40200000 0x62c00 0xuuuu "flash.bin", \
+          0x920000   0x00000 0xaaaa "flash.bin", \
+          0x40200000 0x00000 0xdddd "flash.bin"
diff --git a/doc/imx/habv4/csf_examples/mx8m/csf_spl.txt b/doc/imx/habv4/csf_examples/mx8m/csf_spl.txt
new file mode 100644 (file)
index 0000000..00e34f6
--- /dev/null
@@ -0,0 +1,33 @@
+[Header]
+  Version = 4.3
+  Hash Algorithm = sha256
+  Engine = CAAM
+  Engine Configuration = 0
+  Certificate Format = X509
+  Signature Format = CMS
+
+[Install SRK]
+  # FIXME: Adjust path here
+  File = "/path/to/cst-3.3.1/crts/SRK_1_2_3_4_table.bin"
+  Source index = 0
+
+[Install CSFK]
+  # FIXME: Adjust path here
+  File = "/path/to/cst-3.3.1/crts/CSF1_1_sha256_4096_65537_v3_usr_crt.pem"
+
+[Authenticate CSF]
+
+[Unlock]
+  Engine = CAAM
+  Features = MID
+
+[Install Key]
+  Verification index = 0
+  Target Index = 2
+  # FIXME: Adjust path here
+  File = "/path/to/cst-3.3.1/crts/IMG1_1_sha256_4096_65537_v3_usr_crt.pem"
+
+[Authenticate Data]
+  Verification index = 2
+  # FIXME: Adjust start (first column) and size (third column) here
+  Blocks = 0x7e0fc0 0x0 0x306f0 "flash.bin"
diff --git a/doc/imx/habv4/guides/mx8m_spl_secure_boot.txt b/doc/imx/habv4/guides/mx8m_spl_secure_boot.txt
new file mode 100644 (file)
index 0000000..747f7cd
--- /dev/null
@@ -0,0 +1,265 @@
+      +=========================================================+
+      +  i.MX8M U-Boot HABv4 Secure Boot guide for SPL targets  +
+      +=========================================================+
+
+1. HABv4 secure boot process
+-----------------------------
+
+This document is an addendum of mx6_mx7_spl_secure_boot.txt guide describing
+a step-by-step procedure on how to sign and securely boot an U-Boot image for
+SPL targets on i.MX8M, i.MX8M Mini, i.MX8M Nano, i.MX8M Plus.
+
+Details about HAB can be found in the application note AN4581[1] and in the
+introduction_habv4.txt document.
+
+1.1 Building a SPL target supporting secure boot
+-------------------------------------------------
+
+The U-Boot build for i.MX8M SoC makes use of Second Program Loader (SPL)
+support, fitImage support and custom i.MX8M specific flash.bin container.
+This leads to a generation of multiple intermediate build artifacts, the
+U-Boot SPL, U-Boot binary, DT blob. These later two artifacts are bundled
+with external ATF BL31 blob to form a fitImage. The fitImage is bundled
+with SPL and external DDR and optional HDMI PHY initialization blobs to
+form the final flash.bin container. The HABv4 can be used to authenticate
+all of the input binaries separately.
+
+Out of reset the ROM code authenticates the SPL and PHY initialization
+blobs, combination of which is responsible for initializing essential
+features such as DDR, UART, PMIC and clock enablement. Once the DDR is
+available, the SPL code loads the secondary fitImage to its specific
+address and call the HAB APIs to extend the root of trust on its
+components.
+
+The U-Boot SPL provides support to secure boot configuration and also
+provide access to the HAB APIs exposed by the ROM vector table, the
+U-Boot provides access to HAB APIs via SMC calls to ATF. The support
+is enabled by selecting the CONFIG_IMX_HAB option.
+
+When built with this configuration the U-Boot correctly pads combined
+SPL and PHY initialization blob image, called u-boot-spl-ddr.bin, by
+aligning to the next 0xC00 address, so the CSF signature data generated
+by CST can be concatenated to the image.
+
+The U-Boot also reserves space in the fitImage binary (u-boot.itb) between
+the fitImage tree and external blobs included in it, so it can be used to
+inject IVT and CST signatures used by SPL HAB calls to authenticate the
+fitImage components.
+
+The diagram below illustrate a signed SPL combined with DDR PHY
+initialization firmware blobs part of flash.bin container layout.
+This part is loaded to memory address ( CONFIG_SPL_TEXT_BASE - 0x40 ) and
+authenticated the BootROM. The reason for the offset is so that the *entry
+would be at memory address CONFIG_SPL_TEXT_BASE when BootROM executes the
+code within it:
+
+            ------- +-----------------------------+ <-- *start
+                ^   |      Image Vector Table     |
+                |   |         (0x20 bytes)        |
+                |   +-----------------------------+ <-- *boot_data
+                |   |          Boot Data          |
+                |   +-----------------------------+
+                |   |           Padding           |
+         Signed |   |  to 0x40 bytes from *start  |
+          Data  |   +-----------------------------+ <-- *entry
+                |   |                             |
+                |   |  SPL combined with DDR PHY  |
+                |   |    initialization blobs     |
+                |   |    (u-boot-spl-ddr.bin)     |
+                |   |                             |
+                |   +-----------------------------+
+                v   |           Padding           |
+            ------- +-----------------------------+ <-- *csf
+                    |                             |
+                    | Command Sequence File (CSF) |
+                    |                             |
+                    +-----------------------------+
+                    |      Padding (optional)     |
+                    +-----------------------------+
+
+The diagram below illustrate a signed U-Boot binary, DT blob and external
+ATF BL31 blob combined to form fitImage part of flash.bin container layout.
+The *load_address is derived from CONFIG_SYS_TEXT_BASE such that the U-Boot
+binary *start is placed exactly at CONFIG_SPL_TEXT_BASE in DRAM, however the
+SPL moves the fitImage tree further to location:
+ *load_address = CONFIG_SPL_TEXT_BASE - CONFIG_FIT_EXTERNAL_OFFSET (=12kiB) -
+                 512 Byte sector - sizeof(mkimage header)
+
+            ------- +-----------------------------+ <-- *load_address
+                ^   |                             |
+                |   |        fitImage tree        |
+                |   |    with external data at    |
+                |   |   offset 12 kiB from tree   |
+                |   |        (cca. 1 kiB)         |
+         Signed |   |                             |
+  .-----  Tree  |   +-----------------------------+
+  |       Data  |   | Padding to next 4k aligned  |
+  |             |   |     from *load_address      |
+  |             |   +-----------------------------+ <-- *ivt
+  |             |   |     Image Vector Table      |
+  |             v   |         (0x20 bytes)        |
+  |         ------- +-----------------------------+ <-- *csf
+  |                 | Command Sequence File (CSF) |
+  |                 |  for all signed entries in  |
+   >--------------->| the fitImage, tree and data |
+  |                 |        (cca 6-7 kiB)        |
+  |                 +-----------------------------+
+  |                 |  Padding to 12 kiB offset   |
+  |                 |     from *load_address      |
+  |         ------- +-----------------------------+ <-- *start
+  |             ^   |                             |
+  |      Signed |   |                             |
+  |---- Payload |   |  U-Boot external data blob  |
+  |       Data  |   |                             |
+  |             v   |                             |
+  |         ------- +-----------------------------+
+  |                 |     Padding to 4 Bytes      |
+  |         ------- +-----------------------------+
+  |             ^   |                             |
+  |      Signed |   |                             |
+  |---- Payload |   |    ATF external data blob   |
+  |       Data  |   |                             |
+  |             v   |                             |
+  |         ------- +-----------------------------+
+  |                 |     Padding to 4 Bytes      |
+  |         ------- +-----------------------------+
+  |             ^   |                             |
+  |      Signed |   |                             |
+  '---- Payload |   |    DTB external data blob   |
+          Data  |   |                             |
+                v   |                             |
+            ------- +-----------------------------+
+
+The diagram below illustrate a combined flash.bin container layout:
+
+                    +-----------------------------+
+                    |       Signed SPL part       |
+                    +-----------------------------+
+                    |     Signed fitImage part    |
+                    +-----------------------------+
+
+1.2 Enabling the secure boot support
+-------------------------------------
+
+The first step is to generate an U-Boot image supporting the HAB features
+mentioned above, this can be achieved by adding CONFIG_IMX_HAB to the
+build configuration:
+
+- Defconfig:
+
+  CONFIG_IMX_HAB=y
+
+- Kconfig:
+
+  ARM architecture -> Support i.MX HAB features
+
+1.3 Signing the images
+-----------------------
+
+The CSF contains all the commands that the HAB executes during the secure
+boot. These commands instruct the HAB code on which memory areas of the image
+to authenticate, which keys to install, use and etc.
+
+CSF examples are available under doc/imx/habv4/csf_examples/ directory.
+
+CSF "Blocks" line for csf_spl.txt can be generated as follows:
+
+```
+spl_block_base=$(printf "0x%x" $(( $(sed -n "/CONFIG_SPL_TEXT_BASE=/ s@.*=@@p" .config) - 0x40)) )
+spl_block_size=$(printf "0x%x" $(stat -tc %s u-boot-spl-ddr.bin))
+sed -i "/Blocks = / s@.*@  Blocks = $spl_block_base 0x0 $spl_block_size \"flash.bin\"@" csf_spl.txt
+```
+
+The resulting line looks as follows:
+```
+  Blocks = 0x7e0fc0 0x0 0x306f0 "flash.bin"
+```
+
+The columns mean:
+  - CONFIG_SPL_TEXT_BASE - 0x40 -- Start address of signed data, in DRAM
+  - 0x0 -- Start address of signed data, in "flash.bin"
+  - 0x306f0 -- Length of signed data, in "flash.bin"
+  - Filename -- "flash.bin"
+
+To generate signature for the SPL part of flash.bin container, use CST:
+```
+cst -i csf_spl.tmp -o csf_spl.bin
+```
+
+The newly generated CST blob has to be patched into existing flash.bin
+container. Conveniently, flash.bin IVT contains physical address of the
+CSF blob. Remember, the SPL part of flash.bin container is loaded by the
+BootROM at CONFIG_SPL_TEXT_BASE - 0x40 , so the offset of CSF blob in
+the fitImage can be calculated and inserted into the flash.bin in the
+correct location as follows:
+```
+# offset = IVT_HEADER[6 = CSF address] - CONFIG_SPL_TEXT_BASE - 0x40
+spl_csf_offset=$(xxd -s 24 -l 4 -e flash.bin | cut -d " " -f 2 | sed "s@^@0x@")
+spl_bin_offset=$(xxd -s 4 -l 4 -e flash.bin | cut -d " " -f 2 | sed "s@^@0x@")
+spl_dd_offset=$((${spl_csf_offset} - ${spl_bin_offset} + 0x40))
+dd if=csf_spl.bin of=flash.bin bs=1 seek=${spl_dd_offset} conv=notrunc
+```
+
+CSF "Blocks" line for csf_fit.txt can be generated as follows:
+```
+# fitImage tree
+fit_block_base=$(printf "0x%x" $(( $(sed -n "/CONFIG_SYS_TEXT_BASE=/ s@.*=@@p" .config) - $(sed -n "/CONFIG_FIT_EXTERNAL_OFFSET=/ s@.*=@@p" .config) - 0x200 - 0x40)) )
+fit_block_offset=$(printf "0x%s" $(fdtget -t x u-boot.dtb /binman/imx-boot/uboot offset))
+fit_block_size=$(printf "0x%x" $(( ( $(fdtdump u-boot.itb 2>/dev/null | sed -n "/^...totalsize:/ s@.*\(0x[0-9a-f]\+\).*@\1@p") + 0x1000 - 0x1 ) & ~(0x1000 - 0x1) + 0x20 )) )
+sed -i "/Blocks = / s@.*@  Blocks = $fit_block_base $fit_block_offset $fit_block_size \"flash.bin\", \\\\@" csf_fit.tmp
+
+# U-Boot
+uboot_block_base=$(printf "0x%s" $(fdtget -t x u-boot.itb /images/uboot load))
+uboot_block_offset=$(printf "0x%x" $(( $(printf "0x%s" $(fdtget -t x u-boot.itb /images/uboot data-position)) + ${fit_block_offset} )))
+uboot_block_size=$(printf "0x%s" $(fdtget -t x u-boot.itb /images/uboot data-size))
+sed -i "/0xuuuu/ s@.*@           $uboot_block_base $uboot_block_offset $uboot_block_size \"flash.bin\", \\\\@" csf_fit.tmp
+
+# ATF
+atf_block_base=$(printf "0x%s" $(fdtget -t x u-boot.itb /images/atf load))
+atf_block_offset=$(printf "0x%x" $(( $(printf "0x%s" $(fdtget -t x u-boot.itb /images/atf data-position)) + ${fit_block_offset} )))
+atf_block_size=$(printf "0x%s" $(fdtget -t x u-boot.itb /images/atf data-size))
+sed -i "/0xaaaa/ s@.*@           $atf_block_base $atf_block_offset $atf_block_size \"flash.bin\", \\\\@" csf_fit.tmp
+
+# DTB
+dtb_block_base=$(printf "0x%x" $(( ${uboot_block_base} + ${uboot_block_size} )))
+dtb_block_offset=$(printf "0x%x" $(( $(printf "0x%s" $(fdtget -t x u-boot.itb /images/fdt-1 data-position)) + ${fit_block_offset} )))
+dtb_block_size=$(printf "0x%s" $(fdtget -t x u-boot.itb /images/fdt-1 data-size))
+sed -i "/0xdddd/ s@.*@           $dtb_block_base $dtb_block_offset $dtb_block_size \"flash.bin\"@" csf_fit.tmp
+```
+
+The fitImage part of flash.bin requires separate IVT. Generate the IVT and
+patch it into the correct aligned location of flash.bin as follows:
+```
+# IVT
+ivt_ptr_base=$(printf "%08x" ${fit_block_base} | sed "s@\(..\)\(..\)\(..\)\(..\)@0x\4\3\2\1@")
+ivt_block_base=$(printf "%08x" $(( ${fit_block_base} + ${fit_block_size} - 0x20 )) | sed "s@\(..\)\(..\)\(..\)\(..\)@0x\4\3\2\1@")
+csf_block_base=$(printf "%08x" $(( ${fit_block_base} + ${fit_block_size} )) | sed "s@\(..\)\(..\)\(..\)\(..\)@0x\4\3\2\1@")
+ivt_block_offset=$((${fit_block_offset} + ${fit_block_size} - 0x20))
+csf_block_offset=$((${ivt_block_offset} + 0x20))
+
+echo "0xd1002041 ${ivt_ptr_base} 0x00000000 0x00000000 0x00000000 ${ivt_block_base} ${csf_block_base} 0x00000000" | xxd -r -p > ivt.bin
+dd if=ivt.bin of=flash.bin bs=1 seek=${ivt_block_offset} conv=notrunc
+
+To generate CSF signature for the fitImage part of flash.bin container, use CST:
+```
+cst -i csf_fit.tmp -o csf_fit.bin
+```
+
+Finally, patch the CSF signature into the fitImage right past the IVT:
+```
+dd if=csf_fit.bin of=flash.bin bs=1 seek=${csf_block_offset} conv=notrunc
+```
+
+The entire script is available in doc/imx/habv4/csf_examples/mx8m/csf.sh
+
+1.4 Closing the device
+-----------------------
+
+The procedure for closing the device is similar as in Non-SPL targets, for a
+complete procedure please refer to section "1.5 Programming SRK Hash" in
+mx6_mx7_secure_boot.txt document available under doc/imx/habv4/guides/
+directory.
+
+References:
+[1] AN4581: "Secure Boot on i.MX 50, i.MX 53, i.MX 6 and i.MX 7 Series using
+ HABv4" - Rev 2.
index f6a5668..ee90213 100644 (file)
@@ -45,6 +45,31 @@ gpio status
 
 Display the status of one or multiple GPIOs. By default only claimed GPIOs
 are displayed.
+gpio status command output fields are::
+
+    <name>: <function>: <value> [x] <label>
+
+*function* can take the following values:
+
+output
+    pin configured in gpio output, *value* indicates the pin's level
+
+input
+    pin configured in gpio input, *value* indicates the pin's level
+
+func
+    pin configured in alternate function, followed by *label*
+    which shows pinmuxing label.
+
+unused
+    pin not configured
+
+*[x]* or *[ ]* indicate respectively if the gpio is used or not.
+
+*label* shows the gpio label.
+
+Parameters
+----------
 
 -a
     Display GPIOs irrespective of being claimed.
@@ -77,6 +102,23 @@ Switch the status of a GPIO::
     => echo $myvar
     0
 
+Show the GPIO status::
+
+    => gpio status
+    Bank GPIOA:
+    GPIOA1: func rgmii-0
+    GPIOA2: func rgmii-0
+    GPIOA7: func rgmii-0
+    GPIOA10: output: 0 [x] hdmi-transmitter@39.reset-gpios
+    GPIOA13: output: 1 [x] red.gpios
+
+    Bank GPIOB:
+    GPIOB0: func rgmii-0
+    GPIOB1: func rgmii-0
+    GPIOB2: func uart4-0
+    GPIOB7: input: 0 [x] mmc@58005000.cd-gpios
+    GPIOB11: func rgmii-0
+
 Configuration
 -------------
 
diff --git a/doc/usage/cmd/tftpput.rst b/doc/usage/cmd/tftpput.rst
new file mode 100644 (file)
index 0000000..52ba7b1
--- /dev/null
@@ -0,0 +1,87 @@
+.. SPDX-License-Identifier: GPL-2.0+:
+
+tftpput command
+===============
+
+Synopsis
+--------
+
+::
+
+    tftpput address size [[hostIPaddr:]filename]
+
+Description
+-----------
+
+The tftpput command is used to transfer a file to a TFTP server.
+
+By default the destination port is 69 and the source port is pseudo-random.
+If CONFIG_TFTP_PORT=y, the environment variable *tftpsrcp* can be used to set
+the source port and the environment variable *tftpdstp* can be used to set
+the destination port.
+
+address
+    memory address where the data starts
+
+size
+    number of bytes to be transferred
+
+hostIPaddr
+    IP address of the TFTP server, defaults to the value of environment
+    variable *serverip*
+
+filename
+    path of the file to be written. If not provided, the client's IP address is
+    used to construct a default file name, e.g. C0.A8.00.28.img for IP address
+    192.168.0.40.
+
+Example
+-------
+
+In the example the following steps are executed:
+
+* setup client network address
+* load a file from the SD-card
+* send the file via TFTP to a server
+
+::
+
+    => setenv autoload no
+    => dhcp
+    BOOTP broadcast 1
+    DHCP client bound to address 192.168.1.40 (7 ms)
+    => load mmc 0:1 $loadaddr test.txt
+    260096 bytes read in 13 ms (19.1 MiB/s)
+    => tftpput $loadaddr $filesize 192.168.1.3:upload/test.txt
+    Using ethernet@1c30000 device
+    TFTP to server 192.168.1.3; our IP address is 192.168.1.40
+    Filename 'upload/test.txt'.
+    Save address: 0x42000000
+    Save size:    0x3f800
+    Saving: #################
+         4.4 MiB/s
+    done
+    Bytes transferred = 260096 (3f800 hex)
+    =>
+
+Configuration
+-------------
+
+The command is only available if CONFIG_CMD_TFTPPUT=y.
+
+CONFIG_TFTP_BLOCKSIZE defines the size of the TFTP blocks sent. It defaults
+to 1468 matching an ethernet MTU of 1500.
+
+If CONFIG_TFTP_PORT=y, the environment variables *tftpsrcp* and *tftpdstp* can
+be used to set the source and the destination ports.
+
+CONFIG_TFTP_WINDOWSIZE can be used to set the TFTP window size of transmits
+after which an ACK response is required. The window size defaults to 1.
+
+If CONFIG_TFTP_TSIZE=y, the progress bar is limited to 50 '#' characters.
+Otherwise an '#' is written per UDP package which may decrease performance.
+
+Return value
+------------
+
+The return value $? is 0 (true) on success and 1 (false) otherwise.
index 73966c6..0fda121 100644 (file)
@@ -66,6 +66,7 @@ Shell commands
    cmd/scp03
    cmd/setexpr
    cmd/size
+   cmd/tftpput
    cmd/true
    cmd/ums
    cmd/wdt
index 04d252a..abcb19c 100644 (file)
@@ -124,3 +124,19 @@ config CLK_IMXRT1050
        select CLK_COMPOSITE_CCF
        help
          This enables support clock driver for i.MXRT1050 platforms.
+
+config SPL_CLK_IMXRT1170
+       bool "SPL clock support for i.MXRT1170"
+       depends on ARCH_IMXRT && SPL
+       select SPL_CLK
+       select SPL_CLK_CCF
+       help
+         This enables SPL DM/DTS support for clock driver in i.MXRT1170.
+
+config CLK_IMXRT1170
+       bool "Clock support for i.MXRT1170"
+       depends on ARCH_IMXRT
+       select CLK
+       select CLK_CCF
+       help
+         This enables support clock driver for i.MXRT1170 platforms.
index c576690..b9c197f 100644 (file)
@@ -21,3 +21,4 @@ obj-$(CONFIG_$(SPL_TPL_)CLK_IMX8MQ) += clk-imx8mq.o clk-pll14xx.o \
 
 obj-$(CONFIG_$(SPL_TPL_)CLK_IMXRT1020) += clk-imxrt1020.o
 obj-$(CONFIG_$(SPL_TPL_)CLK_IMXRT1050) += clk-imxrt1050.o
+obj-$(CONFIG_$(SPL_TPL_)CLK_IMXRT1170) += clk-imxrt1170.o
diff --git a/drivers/clk/imx/clk-imxrt1170.c b/drivers/clk/imx/clk-imxrt1170.c
new file mode 100644 (file)
index 0000000..077dd1b
--- /dev/null
@@ -0,0 +1,221 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright (C) 2022
+ * Author(s): Jesse Taube <Mr.Bossman075@gmail.com>
+ */
+
+#include <common.h>
+#include <clk.h>
+#include <clk-uclass.h>
+#include <dm.h>
+#include <log.h>
+#include <asm/arch/clock.h>
+#include <asm/arch/imx-regs.h>
+#include <dt-bindings/clock/imxrt1170-clock.h>
+
+#include "clk.h"
+
+static ulong imxrt1170_clk_get_rate(struct clk *clk)
+{
+       struct clk *c;
+       int ret;
+
+       debug("%s(#%lu)\n", __func__, clk->id);
+
+       ret = clk_get_by_id(clk->id, &c);
+       if (ret)
+               return ret;
+
+       return clk_get_rate(c);
+}
+
+static ulong imxrt1170_clk_set_rate(struct clk *clk, ulong rate)
+{
+       struct clk *c;
+       int ret;
+
+       debug("%s(#%lu), rate: %lu\n", __func__, clk->id, rate);
+
+       ret = clk_get_by_id(clk->id, &c);
+       if (ret)
+               return ret;
+
+       return clk_set_rate(c, rate);
+}
+
+static int __imxrt1170_clk_enable(struct clk *clk, bool enable)
+{
+       struct clk *c;
+       int ret;
+
+       debug("%s(#%lu) en: %d\n", __func__, clk->id, enable);
+
+       ret = clk_get_by_id(clk->id, &c);
+       if (ret)
+               return ret;
+
+       if (enable)
+               ret = clk_enable(c);
+       else
+               ret = clk_disable(c);
+
+       return ret;
+}
+
+static int imxrt1170_clk_disable(struct clk *clk)
+{
+       return __imxrt1170_clk_enable(clk, 0);
+}
+
+static int imxrt1170_clk_enable(struct clk *clk)
+{
+       return __imxrt1170_clk_enable(clk, 1);
+}
+
+static int imxrt1170_clk_set_parent(struct clk *clk, struct clk *parent)
+{
+       struct clk *c, *cp;
+       int ret;
+
+       debug("%s(#%lu), parent: %lu\n", __func__, clk->id, parent->id);
+
+       ret = clk_get_by_id(clk->id, &c);
+       if (ret)
+               return ret;
+
+       ret = clk_get_by_id(parent->id, &cp);
+       if (ret)
+               return ret;
+
+       return clk_set_parent(c, cp);
+}
+
+static struct clk_ops imxrt1170_clk_ops = {
+       .set_rate = imxrt1170_clk_set_rate,
+       .get_rate = imxrt1170_clk_get_rate,
+       .enable = imxrt1170_clk_enable,
+       .disable = imxrt1170_clk_disable,
+       .set_parent = imxrt1170_clk_set_parent,
+};
+
+static const char * const lpuart1_sels[] = {"rcosc48M_div2", "osc", "rcosc400M", "rcosc16M",
+"pll3_div2", "pll1_div5", "pll2_sys", "pll2_pfd3"};
+static const char * const gpt1_sels[] = {"rcosc48M_div2", "osc", "rcosc400M", "rcosc16M",
+"pll3_div2", "pll1_div5", "pll3_pfd2", "pll3_pfd3"};
+static const char * const usdhc1_sels[] = {"rcosc48M_div2", "osc", "rcosc400M", "rcosc16M",
+"pll2_pfd2", "pll2_pfd0", "pll1_div5", "pll_arm"};
+static const char * const semc_sels[] = {"rcosc48M_div2", "osc", "rcosc400M", "rcosc16M",
+"pll1_div5", "pll2_sys", "pll2_pfd2", "pll3_pfd0"};
+
+static int imxrt1170_clk_probe(struct udevice *dev)
+{
+       void *base;
+
+       /* Anatop clocks */
+       base = (void *)ofnode_get_addr(ofnode_by_compatible(ofnode_null(), "fsl,imxrt-anatop"));
+
+
+
+       clk_dm(IMXRT1170_CLK_RCOSC_48M,
+              imx_clk_fixed_factor("rcosc48M", "rcosc16M", 3, 1));
+       clk_dm(IMXRT1170_CLK_RCOSC_400M,
+              imx_clk_fixed_factor("rcosc400M",  "rcosc16M", 25, 1));
+       clk_dm(IMXRT1170_CLK_RCOSC_48M_DIV2,
+              imx_clk_fixed_factor("rcosc48M_div2",  "rcosc48M", 1, 2));
+
+
+       clk_dm(IMXRT1170_CLK_PLL_ARM,
+              imx_clk_pllv3(IMX_PLLV3_SYS, "pll_arm", "osc",
+                            base + 0x200, 0xff));
+       clk_dm(IMXRT1170_CLK_PLL3,
+              imx_clk_pllv3(IMX_PLLV3_GENERICV2, "pll3_sys", "osc",
+                            base + 0x210, 1));
+       clk_dm(IMXRT1170_CLK_PLL2,
+              imx_clk_pllv3(IMX_PLLV3_GENERICV2, "pll2_sys", "osc",
+                            base + 0x240, 1));
+
+       clk_dm(IMXRT1170_CLK_PLL3_PFD0,
+              imx_clk_pfd("pll3_pfd0", "pll3_sys", base + 0x230, 0));
+       clk_dm(IMXRT1170_CLK_PLL3_PFD1,
+              imx_clk_pfd("pll3_pfd1", "pll3_sys", base + 0x230, 1));
+       clk_dm(IMXRT1170_CLK_PLL3_PFD2,
+              imx_clk_pfd("pll3_pfd2", "pll3_sys", base + 0x230, 2));
+       clk_dm(IMXRT1170_CLK_PLL3_PFD3,
+              imx_clk_pfd("pll3_pfd3", "pll3_sys", base + 0x230, 3));
+
+       clk_dm(IMXRT1170_CLK_PLL2_PFD0,
+              imx_clk_pfd("pll2_pfd0", "pll2_sys", base + 0x270, 0));
+       clk_dm(IMXRT1170_CLK_PLL2_PFD1,
+              imx_clk_pfd("pll2_pfd1", "pll2_sys", base + 0x270, 1));
+       clk_dm(IMXRT1170_CLK_PLL2_PFD2,
+              imx_clk_pfd("pll2_pfd2", "pll2_sys", base + 0x270, 2));
+       clk_dm(IMXRT1170_CLK_PLL2_PFD3,
+              imx_clk_pfd("pll2_pfd3", "pll2_sys", base + 0x270, 3));
+
+       clk_dm(IMXRT1170_CLK_PLL3_DIV2,
+              imx_clk_fixed_factor("pll3_div2", "pll3_sys", 1, 2));
+
+       /* CCM clocks */
+       base = dev_read_addr_ptr(dev);
+       if (base == (void *)FDT_ADDR_T_NONE)
+               return -EINVAL;
+
+       clk_dm(IMXRT1170_CLK_LPUART1_SEL,
+              imx_clk_mux("lpuart1_sel", base + (25 * 0x80), 8, 3,
+                          lpuart1_sels, ARRAY_SIZE(lpuart1_sels)));
+       clk_dm(IMXRT1170_CLK_LPUART1,
+              imx_clk_divider("lpuart1", "lpuart1_sel",
+                              base + (25 * 0x80), 0, 8));
+
+       clk_dm(IMXRT1170_CLK_USDHC1_SEL,
+              imx_clk_mux("usdhc1_sel", base + (58 * 0x80), 8, 3,
+                          usdhc1_sels, ARRAY_SIZE(usdhc1_sels)));
+       clk_dm(IMXRT1170_CLK_USDHC1,
+              imx_clk_divider("usdhc1", "usdhc1_sel",
+                              base + (58 * 0x80), 0, 8));
+
+       clk_dm(IMXRT1170_CLK_GPT1_SEL,
+              imx_clk_mux("gpt1_sel", base + (14 * 0x80), 8, 3,
+                          gpt1_sels, ARRAY_SIZE(gpt1_sels)));
+       clk_dm(IMXRT1170_CLK_GPT1,
+              imx_clk_divider("gpt1", "gpt1_sel",
+                              base + (14 * 0x80), 0, 8));
+
+       clk_dm(IMXRT1170_CLK_SEMC_SEL,
+              imx_clk_mux("semc_sel", base + (4 * 0x80), 8, 3,
+                          semc_sels, ARRAY_SIZE(semc_sels)));
+       clk_dm(IMXRT1170_CLK_SEMC,
+              imx_clk_divider("semc", "semc_sel",
+                              base + (4 * 0x80), 0, 8));
+       struct clk *clk, *clk1;
+
+       clk_get_by_id(IMXRT1170_CLK_PLL2_PFD2, &clk);
+
+       clk_get_by_id(IMXRT1170_CLK_SEMC_SEL, &clk1);
+       clk_enable(clk1);
+       clk_set_parent(clk1, clk);
+
+       clk_get_by_id(IMXRT1170_CLK_SEMC, &clk);
+       clk_enable(clk);
+       clk_set_rate(clk, 132000000UL);
+
+       clk_get_by_id(IMXRT1170_CLK_GPT1, &clk);
+       clk_enable(clk);
+       clk_set_rate(clk, 32000000UL);
+
+       return 0;
+}
+
+static const struct udevice_id imxrt1170_clk_ids[] = {
+       { .compatible = "fsl,imxrt1170-ccm" },
+       { },
+};
+
+U_BOOT_DRIVER(imxrt1170_clk) = {
+       .name = "clk_imxrt1170",
+       .id = UCLASS_CLK,
+       .of_match = imxrt1170_clk_ids,
+       .ops = &imxrt1170_clk_ops,
+       .probe = imxrt1170_clk_probe,
+       .flags = DM_FLAG_PRE_RELOC,
+};
index 077757e..fad306a 100644 (file)
 #define UBOOT_DM_CLK_IMX_PLLV3_USB     "imx_clk_pllv3_usb"
 #define UBOOT_DM_CLK_IMX_PLLV3_AV      "imx_clk_pllv3_av"
 #define UBOOT_DM_CLK_IMX_PLLV3_ENET     "imx_clk_pllv3_enet"
+#define UBOOT_DM_CLK_IMX_PLLV3_GENV2   "imx_clk_pllv3_genericv2"
 
 #define PLL_NUM_OFFSET         0x10
 #define PLL_DENOM_OFFSET       0x20
 
 #define BM_PLL_POWER           (0x1 << 12)
+#define BM_PLL_POWER_V2                (0x1 << 21)
 #define BM_PLL_ENABLE          (0x1 << 13)
 #define BM_PLL_LOCK            (0x1 << 31)
+#define BM_PLL_LOCK_V2         (0x1 << 29)
 
 struct clk_pllv3 {
        struct clk      clk;
        void __iomem    *base;
        u32             power_bit;
        bool            powerup_set;
+       u32             lock_bit;
        u32             enable_bit;
        u32             div_mask;
        u32             div_shift;
@@ -42,6 +46,30 @@ struct clk_pllv3 {
 
 #define to_clk_pllv3(_clk) container_of(_clk, struct clk_pllv3, clk)
 
+static ulong clk_pllv3_genericv2_get_rate(struct clk *clk)
+{
+       struct clk_pllv3 *pll = to_clk_pllv3(dev_get_clk_ptr(clk->dev));
+       unsigned long parent_rate = clk_get_parent_rate(clk);
+
+       u32 div = (readl(pll->base) >> pll->div_shift) & pll->div_mask;
+
+       return (div == 0) ? parent_rate * 22 : parent_rate * 20;
+}
+
+static ulong clk_pllv3_genericv2_set_rate(struct clk *clk, ulong rate)
+{
+       struct clk_pllv3 *pll = to_clk_pllv3(clk);
+       unsigned long parent_rate = clk_get_parent_rate(clk);
+
+       u32 div = (readl(pll->base) >> pll->div_shift) & pll->div_mask;
+       u32 val = (div == 0) ? parent_rate * 22 : parent_rate * 20;
+
+       if (rate == val)
+               return 0;
+
+       return -EINVAL;
+}
+
 static ulong clk_pllv3_generic_get_rate(struct clk *clk)
 {
        struct clk_pllv3 *pll = to_clk_pllv3(dev_get_clk_ptr(clk->dev));
@@ -71,7 +99,7 @@ static ulong clk_pllv3_generic_set_rate(struct clk *clk, ulong rate)
        writel(val, pll->base);
 
        /* Wait for PLL to lock */
-       while (!(readl(pll->base) & BM_PLL_LOCK))
+       while (!(readl(pll->base) & pll->lock_bit))
                ;
 
        return 0;
@@ -120,6 +148,13 @@ static const struct clk_ops clk_pllv3_generic_ops = {
        .set_rate       = clk_pllv3_generic_set_rate,
 };
 
+static const struct clk_ops clk_pllv3_genericv2_ops = {
+       .get_rate       = clk_pllv3_genericv2_get_rate,
+       .enable         = clk_pllv3_generic_enable,
+       .disable        = clk_pllv3_generic_disable,
+       .set_rate       = clk_pllv3_genericv2_set_rate,
+};
+
 static ulong clk_pllv3_sys_get_rate(struct clk *clk)
 {
        struct clk_pllv3 *pll = to_clk_pllv3(clk);
@@ -153,7 +188,7 @@ static ulong clk_pllv3_sys_set_rate(struct clk *clk, ulong rate)
        writel(val, pll->base);
 
        /* Wait for PLL to lock */
-       while (!(readl(pll->base) & BM_PLL_LOCK))
+       while (!(readl(pll->base) & pll->lock_bit))
                ;
 
        return 0;
@@ -221,7 +256,7 @@ static ulong clk_pllv3_av_set_rate(struct clk *clk, ulong rate)
        writel(mfd, pll->base + PLL_DENOM_OFFSET);
 
        /* Wait for PLL to lock */
-       while (!(readl(pll->base) & BM_PLL_LOCK))
+       while (!(readl(pll->base) & pll->lock_bit))
                ;
 
        return 0;
@@ -262,6 +297,7 @@ struct clk *imx_clk_pllv3(enum imx_pllv3_type type, const char *name,
 
        pll->power_bit = BM_PLL_POWER;
        pll->enable_bit = BM_PLL_ENABLE;
+       pll->lock_bit = BM_PLL_LOCK;
 
        switch (type) {
        case IMX_PLLV3_GENERIC:
@@ -269,6 +305,13 @@ struct clk *imx_clk_pllv3(enum imx_pllv3_type type, const char *name,
                pll->div_shift = 0;
                pll->powerup_set = false;
                break;
+       case IMX_PLLV3_GENERICV2:
+               pll->power_bit = BM_PLL_POWER_V2;
+               pll->lock_bit = BM_PLL_LOCK_V2;
+               drv_name = UBOOT_DM_CLK_IMX_PLLV3_GENV2;
+               pll->div_shift = 0;
+               pll->powerup_set = false;
+               break;
        case IMX_PLLV3_SYS:
                drv_name = UBOOT_DM_CLK_IMX_PLLV3_SYS;
                pll->div_shift = 0;
@@ -313,6 +356,13 @@ U_BOOT_DRIVER(clk_pllv3_generic) = {
        .flags = DM_FLAG_PRE_RELOC,
 };
 
+U_BOOT_DRIVER(clk_pllv3_genericv2) = {
+       .name   = UBOOT_DM_CLK_IMX_PLLV3_GENV2,
+       .id     = UCLASS_CLK,
+       .ops    = &clk_pllv3_genericv2_ops,
+       .flags = DM_FLAG_PRE_RELOC,
+};
+
 U_BOOT_DRIVER(clk_pllv3_sys) = {
        .name   = UBOOT_DM_CLK_IMX_PLLV3_SYS,
        .id     = UCLASS_CLK,
index 0e1eaf0..46dee35 100644 (file)
@@ -10,6 +10,7 @@
 
 enum imx_pllv3_type {
        IMX_PLLV3_GENERIC,
+       IMX_PLLV3_GENERICV2,
        IMX_PLLV3_SYS,
        IMX_PLLV3_USB,
        IMX_PLLV3_USB_VF610,
index 7d31a9f..97bf1c6 100644 (file)
@@ -728,6 +728,12 @@ static ulong rk3399_mmc_get_clk(struct rockchip_cru *cru, uint clk_id)
        u32 div, con;
 
        switch (clk_id) {
+       case HCLK_SDIO:
+       case SCLK_SDIO:
+               con = readl(&cru->clksel_con[15]);
+               /* dwmmc controller have internal div 2 */
+               div = 2;
+               break;
        case HCLK_SDMMC:
        case SCLK_SDMMC:
                con = readl(&cru->clksel_con[16]);
@@ -750,37 +756,46 @@ static ulong rk3399_mmc_get_clk(struct rockchip_cru *cru, uint clk_id)
                return DIV_TO_RATE(GPLL_HZ, div);
 }
 
+static void rk3399_dwmmc_set_clk(struct rockchip_cru *cru,
+                                unsigned int con, ulong set_rate)
+{
+       /* Select clk_sdmmc source from GPLL by default */
+       /* mmc clock defaulg div 2 internal, provide double in cru */
+       int src_clk_div = DIV_ROUND_UP(GPLL_HZ / 2, set_rate);
+
+       if (src_clk_div > 128) {
+               /* use 24MHz source for 400KHz clock */
+               src_clk_div = DIV_ROUND_UP(OSC_HZ / 2, set_rate);
+               assert(src_clk_div - 1 < 128);
+               rk_clrsetreg(&cru->clksel_con[con],
+                            CLK_EMMC_PLL_MASK | CLK_EMMC_DIV_CON_MASK,
+                            CLK_EMMC_PLL_SEL_24M << CLK_EMMC_PLL_SHIFT |
+                            (src_clk_div - 1) << CLK_EMMC_DIV_CON_SHIFT);
+       } else {
+               rk_clrsetreg(&cru->clksel_con[con],
+                            CLK_EMMC_PLL_MASK | CLK_EMMC_DIV_CON_MASK,
+                            CLK_EMMC_PLL_SEL_GPLL << CLK_EMMC_PLL_SHIFT |
+                            (src_clk_div - 1) << CLK_EMMC_DIV_CON_SHIFT);
+       }
+}
+
 static ulong rk3399_mmc_set_clk(struct rockchip_cru *cru,
                                ulong clk_id, ulong set_rate)
 {
-       int src_clk_div;
-       int aclk_emmc = 198 * MHz;
-
        switch (clk_id) {
+       case HCLK_SDIO:
+       case SCLK_SDIO:
+               rk3399_dwmmc_set_clk(cru, 15, set_rate);
+               break;
        case HCLK_SDMMC:
        case SCLK_SDMMC:
-               /* Select clk_sdmmc source from GPLL by default */
-               /* mmc clock defaulg div 2 internal, provide double in cru */
-               src_clk_div = DIV_ROUND_UP(GPLL_HZ / 2, set_rate);
-
-               if (src_clk_div > 128) {
-                       /* use 24MHz source for 400KHz clock */
-                       src_clk_div = DIV_ROUND_UP(OSC_HZ / 2, set_rate);
-                       assert(src_clk_div - 1 < 128);
-                       rk_clrsetreg(&cru->clksel_con[16],
-                                    CLK_EMMC_PLL_MASK | CLK_EMMC_DIV_CON_MASK,
-                                    CLK_EMMC_PLL_SEL_24M << CLK_EMMC_PLL_SHIFT |
-                                    (src_clk_div - 1) << CLK_EMMC_DIV_CON_SHIFT);
-               } else {
-                       rk_clrsetreg(&cru->clksel_con[16],
-                                    CLK_EMMC_PLL_MASK | CLK_EMMC_DIV_CON_MASK,
-                                    CLK_EMMC_PLL_SEL_GPLL << CLK_EMMC_PLL_SHIFT |
-                                    (src_clk_div - 1) << CLK_EMMC_DIV_CON_SHIFT);
-               }
+               rk3399_dwmmc_set_clk(cru, 16, set_rate);
                break;
-       case SCLK_EMMC:
+       case SCLK_EMMC: {
+               int aclk_emmc = 198 * MHz;
                /* Select aclk_emmc source from GPLL */
-               src_clk_div = DIV_ROUND_UP(GPLL_HZ, aclk_emmc);
+               int src_clk_div = DIV_ROUND_UP(GPLL_HZ, aclk_emmc);
+
                assert(src_clk_div - 1 < 32);
 
                rk_clrsetreg(&cru->clksel_con[21],
@@ -797,6 +812,7 @@ static ulong rk3399_mmc_set_clk(struct rockchip_cru *cru,
                             CLK_EMMC_PLL_SEL_GPLL << CLK_EMMC_PLL_SHIFT |
                             (src_clk_div - 1) << CLK_EMMC_DIV_CON_SHIFT);
                break;
+       }
        default:
                return -EINVAL;
        }
@@ -918,6 +934,8 @@ static ulong rk3399_clk_get_rate(struct clk *clk)
        switch (clk->id) {
        case 0 ... 63:
                return 0;
+       case HCLK_SDIO:
+       case SCLK_SDIO:
        case HCLK_SDMMC:
        case SCLK_SDMMC:
        case SCLK_EMMC:
@@ -992,6 +1010,8 @@ static ulong rk3399_clk_set_rate(struct clk *clk, ulong rate)
        case PCLK_PERILP1:
                return 0;
 
+       case HCLK_SDIO:
+       case SCLK_SDIO:
        case HCLK_SDMMC:
        case SCLK_SDMMC:
        case SCLK_EMMC:
index b025050..5edc864 100644 (file)
@@ -103,53 +103,53 @@ static const struct __prci_clock_ops sifive_fu740_prci_pcieaux_clk_ops = {
 
 /* List of clock controls provided by the PRCI */
 struct __prci_clock __prci_init_clocks_fu740[] = {
-       [PRCI_CLK_COREPLL] = {
+       [FU740_PRCI_CLK_COREPLL] = {
                .name = "corepll",
                .parent_name = "hfclk",
                .ops = &sifive_fu740_prci_wrpll_clk_ops,
                .pwd = &__prci_corepll_data,
        },
-       [PRCI_CLK_DDRPLL] = {
+       [FU740_PRCI_CLK_DDRPLL] = {
                .name = "ddrpll",
                .parent_name = "hfclk",
                .ops = &sifive_fu740_prci_wrpll_clk_ops,
                .pwd = &__prci_ddrpll_data,
        },
-       [PRCI_CLK_GEMGXLPLL] = {
+       [FU740_PRCI_CLK_GEMGXLPLL] = {
                .name = "gemgxlpll",
                .parent_name = "hfclk",
                .ops = &sifive_fu740_prci_wrpll_clk_ops,
                .pwd = &__prci_gemgxlpll_data,
        },
-       [PRCI_CLK_DVFSCOREPLL] = {
+       [FU740_PRCI_CLK_DVFSCOREPLL] = {
                .name = "dvfscorepll",
                .parent_name = "hfclk",
                .ops = &sifive_fu740_prci_wrpll_clk_ops,
                .pwd = &__prci_dvfscorepll_data,
        },
-       [PRCI_CLK_HFPCLKPLL] = {
+       [FU740_PRCI_CLK_HFPCLKPLL] = {
                .name = "hfpclkpll",
                .parent_name = "hfclk",
                .ops = &sifive_fu740_prci_wrpll_clk_ops,
                .pwd = &__prci_hfpclkpll_data,
        },
-       [PRCI_CLK_CLTXPLL] = {
+       [FU740_PRCI_CLK_CLTXPLL] = {
                .name = "cltxpll",
                .parent_name = "hfclk",
                .ops = &sifive_fu740_prci_wrpll_clk_ops,
                .pwd = &__prci_cltxpll_data,
        },
-       [PRCI_CLK_TLCLK] = {
+       [FU740_PRCI_CLK_TLCLK] = {
                .name = "tlclk",
                .parent_name = "corepll",
                .ops = &sifive_fu740_prci_tlclksel_clk_ops,
        },
-       [PRCI_CLK_PCLK] = {
+       [FU740_PRCI_CLK_PCLK] = {
                .name = "pclk",
                .parent_name = "hfpclkpll",
                .ops = &sifive_fu740_prci_hfpclkplldiv_clk_ops,
        },
-       [PRCI_CLK_PCIEAUX] {
+       [FU740_PRCI_CLK_PCIE_AUX] {
                .name = "pcieaux",
                .parent_name = "",
                .ops = &sifive_fu740_prci_pcieaux_clk_ops,
index 52ae268..c8fb600 100644 (file)
@@ -685,14 +685,14 @@ static int sifive_prci_probe(struct udevice *dev)
                                 * case the design uses hfpclk to drive
                                 * Chiplink
                                 */
-                               pc = &data->clks[PRCI_CLK_HFPCLKPLL];
+                               pc = &data->clks[FU740_PRCI_CLK_HFPCLKPLL];
                                parent_rate = sifive_prci_parent_rate(pc, data);
                                sifive_prci_wrpll_set_rate(pc, 260000000,
                                                           parent_rate);
                                pc->ops->enable_clk(pc, 1);
                        } else if (prci_pll_reg & PRCI_PRCIPLL_CLTXPLL) {
                                /* CLTX pll init */
-                               pc = &data->clks[PRCI_CLK_CLTXPLL];
+                               pc = &data->clks[FU740_PRCI_CLK_CLTXPLL];
                                parent_rate = sifive_prci_parent_rate(pc, data);
                                sifive_prci_wrpll_set_rate(pc, 260000000,
                                                           parent_rate);
index 4525500..4f4524f 100644 (file)
@@ -962,6 +962,24 @@ static ulong stm32mp1_read_pll_freq(struct stm32mp1_clk_priv *priv,
        return dfout;
 }
 
+static ulong stm32mp1_clk_get_by_name(const char *name)
+{
+       struct clk clk;
+       struct udevice *dev = NULL;
+       ulong clock = 0;
+
+       if (!uclass_get_device_by_name(UCLASS_CLK, name, &dev)) {
+               if (clk_request(dev, &clk)) {
+                       log_err("%s request", name);
+               } else {
+                       clk.id = 0;
+                       clock = clk_get_rate(&clk);
+               }
+       }
+
+       return clock;
+}
+
 static ulong stm32mp1_clk_get(struct stm32mp1_clk_priv *priv, int p)
 {
        u32 reg;
@@ -1127,24 +1145,11 @@ static ulong stm32mp1_clk_get(struct stm32mp1_clk_priv *priv, int p)
                break;
        /* other */
        case _USB_PHY_48:
-               clock = 48000000;
+               clock = stm32mp1_clk_get_by_name("ck_usbo_48m");
                break;
        case _DSI_PHY:
-       {
-               struct clk clk;
-               struct udevice *dev = NULL;
-
-               if (!uclass_get_device_by_name(UCLASS_CLK, "ck_dsi_phy",
-                                              &dev)) {
-                       if (clk_request(dev, &clk)) {
-                               log_err("ck_dsi_phy request");
-                       } else {
-                               clk.id = 0;
-                               clock = clk_get_rate(&clk);
-                       }
-               }
+               clock = stm32mp1_clk_get_by_name("ck_dsi_phy");
                break;
-       }
        default:
                break;
        }
index 5751967..f22f24b 100644 (file)
@@ -131,25 +131,35 @@ static int caam_hash_update(void *hash_ctx, const void *buf,
 static int caam_hash_finish(void *hash_ctx, void *dest_buf,
                            int size, enum caam_hash_algos caam_algo)
 {
-       uint32_t len = 0;
+       uint32_t len = 0, sg_entry_len;
        struct sha_ctx *ctx = hash_ctx;
        int i = 0, ret = 0;
+       caam_dma_addr_t addr;
 
        if (size < driver_hash[caam_algo].digestsize) {
                return -EINVAL;
        }
 
-       for (i = 0; i < ctx->sg_num; i++)
-               len += (sec_in32(&ctx->sg_tbl[i].len_flag) &
-                       SG_ENTRY_LENGTH_MASK);
-
+       flush_dcache_range((ulong)ctx->sg_tbl,
+                          (ulong)(ctx->sg_tbl) + (ctx->sg_num * sizeof(struct sg_entry)));
+       for (i = 0; i < ctx->sg_num; i++) {
+               sg_entry_len = (sec_in32(&ctx->sg_tbl[i].len_flag) &
+                               SG_ENTRY_LENGTH_MASK);
+               len += sg_entry_len;
+#ifdef CONFIG_CAAM_64BIT
+               addr = sec_in32(&ctx->sg_tbl[i].addr_hi);
+               addr = (addr << 32) | sec_in32(&ctx->sg_tbl[i].addr_lo);
+#else
+               addr = sec_in32(&ctx->sg_tbl[i].addr_lo);
+#endif
+               flush_dcache_range(addr, addr + sg_entry_len);
+       }
        inline_cnstr_jobdesc_hash(ctx->sha_desc, (uint8_t *)ctx->sg_tbl, len,
                                  ctx->hash,
                                  driver_hash[caam_algo].alg_type,
                                  driver_hash[caam_algo].digestsize,
                                  1);
 
-       flush_dcache_range((ulong)ctx->sg_tbl, (ulong)(ctx->sg_tbl) + len);
        flush_dcache_range((ulong)ctx->sha_desc,
                           (ulong)(ctx->sha_desc) + (sizeof(uint32_t) * MAX_CAAM_DESCSIZE));
        flush_dcache_range((ulong)ctx->hash,
index b5122d1..0b0b4e5 100644 (file)
@@ -214,7 +214,7 @@ static void set_csn_config(int dimm_number, int i, fsl_ddr_cfg_regs_t *ddr,
                odt_rd_cfg = popts->cs_local_opts[i].odt_rd_cfg;
                odt_wr_cfg = popts->cs_local_opts[i].odt_wr_cfg;
 #ifdef CONFIG_SYS_FSL_DDR4
-               ba_bits_cs_n = dimm_params[dimm_number].bank_addr_bits;
+               ba_bits_cs_n = dimm_params[dimm_number].bank_addr_bits - 2;
                bg_bits_cs_n = dimm_params[dimm_number].bank_group_bits;
 #else
                n_banks_per_sdram_device
index e2bdc12..ea79162 100644 (file)
@@ -246,7 +246,7 @@ unsigned int ddr_compute_dimm_parameters(const unsigned int ctrl_num,
        /* SDRAM device parameters */
        pdimm->n_row_addr = ((spd->addressing >> 3) & 0x7) + 12;
        pdimm->n_col_addr = (spd->addressing & 0x7) + 9;
-       pdimm->bank_addr_bits = (spd->density_banks >> 4) & 0x3;
+       pdimm->bank_addr_bits = ((spd->density_banks >> 4) & 0x3) + 2;
        pdimm->bank_group_bits = (spd->density_banks >> 6) & 0x3;
 
        /*
index 2f76beb..eb2f06e 100644 (file)
@@ -27,9 +27,9 @@
 /* Option parameter Structures */
 struct options_string {
        const char *option_name;
-       size_t offset;
-       unsigned int size;
-       const char printhex;
+       u32 offset : 9;
+       u32 size : 4;
+       u32 printhex : 1;
 };
 
 static unsigned int picos_to_mhz(unsigned int picos)
diff --git a/drivers/ddr/imx/imx8m/ddrphy_utils.c b/drivers/ddr/imx/imx8m/ddrphy_utils.c
deleted file mode 100644 (file)
index 975d553..0000000
+++ /dev/null
@@ -1,369 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0+
-/*
- * Copyright 2018 NXP
- */
-
-#include <common.h>
-#include <errno.h>
-#include <log.h>
-#include <asm/io.h>
-#include <asm/arch/ddr.h>
-#include <asm/arch/clock.h>
-#include <asm/arch/ddr.h>
-#include <asm/arch/lpddr4_define.h>
-#include <asm/arch/sys_proto.h>
-
-static unsigned int g_cdd_rr_max[4];
-static unsigned int g_cdd_rw_max[4];
-static unsigned int g_cdd_wr_max[4];
-static unsigned int g_cdd_ww_max[4];
-
-static inline void poll_pmu_message_ready(void)
-{
-       unsigned int reg;
-
-       do {
-               reg = reg32_read(IP2APB_DDRPHY_IPS_BASE_ADDR(0) + 4 * 0xd0004);
-       } while (reg & 0x1);
-}
-
-static inline void ack_pmu_message_receive(void)
-{
-       unsigned int reg;
-
-       reg32_write(IP2APB_DDRPHY_IPS_BASE_ADDR(0) + 4 * 0xd0031, 0x0);
-
-       do {
-               reg = reg32_read(IP2APB_DDRPHY_IPS_BASE_ADDR(0) + 4 * 0xd0004);
-       } while (!(reg & 0x1));
-
-       reg32_write(IP2APB_DDRPHY_IPS_BASE_ADDR(0) + 4 * 0xd0031, 0x1);
-}
-
-static inline unsigned int get_mail(void)
-{
-       unsigned int reg;
-
-       poll_pmu_message_ready();
-
-       reg = reg32_read(IP2APB_DDRPHY_IPS_BASE_ADDR(0) + 4 * 0xd0032);
-
-       ack_pmu_message_receive();
-
-       return reg;
-}
-
-static inline unsigned int get_stream_message(void)
-{
-       unsigned int reg, reg2;
-
-       poll_pmu_message_ready();
-
-       reg = reg32_read(IP2APB_DDRPHY_IPS_BASE_ADDR(0) + 4 * 0xd0032);
-
-       reg2 = reg32_read(IP2APB_DDRPHY_IPS_BASE_ADDR(0) + 4 * 0xd0034);
-
-       reg2 = (reg2 << 16) | reg;
-
-       ack_pmu_message_receive();
-
-       return reg2;
-}
-
-static inline void decode_major_message(unsigned int mail)
-{
-       debug("[PMU Major message = 0x%08x]\n", mail);
-}
-
-static inline void decode_streaming_message(void)
-{
-       unsigned int string_index, arg __maybe_unused;
-       int i = 0;
-
-       string_index = get_stream_message();
-       debug("PMU String index = 0x%08x\n", string_index);
-       while (i < (string_index & 0xffff)) {
-               arg = get_stream_message();
-               debug("arg[%d] = 0x%08x\n", i, arg);
-               i++;
-       }
-
-       debug("\n");
-}
-
-int wait_ddrphy_training_complete(void)
-{
-       unsigned int mail;
-
-       while (1) {
-               mail = get_mail();
-               decode_major_message(mail);
-               if (mail == 0x08) {
-                       decode_streaming_message();
-               } else if (mail == 0x07) {
-                       debug("Training PASS\n");
-                       return 0;
-               } else if (mail == 0xff) {
-                       debug("Training FAILED\n");
-                       return -1;
-               }
-       }
-}
-
-void ddrphy_init_set_dfi_clk(unsigned int drate)
-{
-       switch (drate) {
-       case 4000:
-               dram_pll_init(MHZ(1000));
-               dram_disable_bypass();
-               break;
-       case 3732:
-               dram_pll_init(MHZ(933));
-               dram_disable_bypass();
-               break;
-       case 3200:
-               dram_pll_init(MHZ(800));
-               dram_disable_bypass();
-               break;
-       case 3000:
-               dram_pll_init(MHZ(750));
-               dram_disable_bypass();
-               break;
-       case 2400:
-               dram_pll_init(MHZ(600));
-               dram_disable_bypass();
-               break;
-       case 1600:
-               dram_pll_init(MHZ(400));
-               dram_disable_bypass();
-               break;
-       case 1066:
-               dram_pll_init(MHZ(266));
-               dram_disable_bypass();
-               break;
-       case 667:
-               dram_pll_init(MHZ(167));
-               dram_disable_bypass();
-               break;
-       case 400:
-               dram_enable_bypass(MHZ(400));
-               break;
-       case 100:
-               dram_enable_bypass(MHZ(100));
-               break;
-       default:
-               return;
-       }
-}
-
-void ddrphy_init_read_msg_block(enum fw_type type)
-{
-}
-
-void lpddr4_mr_write(unsigned int mr_rank, unsigned int mr_addr,
-                    unsigned int mr_data)
-{
-       unsigned int tmp;
-       /*
-        * 1. Poll MRSTAT.mr_wr_busy until it is 0.
-        * This checks that there is no outstanding MR transaction.
-        * No writes should be performed to MRCTRL0 and MRCTRL1 if
-        * MRSTAT.mr_wr_busy = 1.
-        */
-       do {
-               tmp = reg32_read(DDRC_MRSTAT(0));
-       } while (tmp & 0x1);
-       /*
-        * 2. Write the MRCTRL0.mr_type, MRCTRL0.mr_addr, MRCTRL0.mr_rank and
-        * (for MRWs) MRCTRL1.mr_data to define the MR transaction.
-        */
-       reg32_write(DDRC_MRCTRL0(0), (mr_rank << 4));
-       reg32_write(DDRC_MRCTRL1(0), (mr_addr << 8) | mr_data);
-       reg32setbit(DDRC_MRCTRL0(0), 31);
-}
-
-unsigned int lpddr4_mr_read(unsigned int mr_rank, unsigned int mr_addr)
-{
-       unsigned int tmp;
-
-       reg32_write(DRC_PERF_MON_MRR0_DAT(0), 0x1);
-       do {
-               tmp = reg32_read(DDRC_MRSTAT(0));
-       } while (tmp & 0x1);
-
-       reg32_write(DDRC_MRCTRL0(0), (mr_rank << 4) | 0x1);
-       reg32_write(DDRC_MRCTRL1(0), (mr_addr << 8));
-       reg32setbit(DDRC_MRCTRL0(0), 31);
-       do {
-               tmp = reg32_read(DRC_PERF_MON_MRR0_DAT(0));
-       } while ((tmp & 0x8) == 0);
-       tmp = reg32_read(DRC_PERF_MON_MRR1_DAT(0));
-       reg32_write(DRC_PERF_MON_MRR0_DAT(0), 0x4);
-       while (tmp) { //try to find a significant byte in the word
-               if (tmp & 0xff) {
-                       tmp &= 0xff;
-                       break;
-               }
-               tmp >>= 8;
-       }
-       return tmp;
-}
-
-unsigned int look_for_max(unsigned int data[],
-                         unsigned int addr_start, unsigned int addr_end)
-{
-       unsigned int i, imax = 0;
-
-       for (i = addr_start; i <= addr_end; i++) {
-               if (((data[i] >> 7) == 0) && (data[i] > imax))
-                       imax = data[i];
-       }
-
-       return imax;
-}
-
-void get_trained_CDD(u32 fsp)
-{
-       unsigned int i, ddr_type, tmp;
-       unsigned int cdd_cha[12], cdd_chb[12];
-       unsigned int cdd_cha_rr_max, cdd_cha_rw_max, cdd_cha_wr_max, cdd_cha_ww_max;
-       unsigned int cdd_chb_rr_max, cdd_chb_rw_max, cdd_chb_wr_max, cdd_chb_ww_max;
-
-       ddr_type = reg32_read(DDRC_MSTR(0)) & 0x3f;
-       if (ddr_type == 0x20) {
-               for (i = 0; i < 6; i++) {
-                       tmp = reg32_read(IP2APB_DDRPHY_IPS_BASE_ADDR(0) + (0x54013 + i) * 4);
-                       cdd_cha[i * 2] = tmp & 0xff;
-                       cdd_cha[i * 2 + 1] = (tmp >> 8) & 0xff;
-               }
-
-               for (i = 0; i < 7; i++) {
-                       tmp = reg32_read(IP2APB_DDRPHY_IPS_BASE_ADDR(0) + (0x5402c + i) * 4);
-                       if (i == 0) {
-                               cdd_cha[0] = (tmp >> 8) & 0xff;
-                       } else if (i == 6) {
-                               cdd_cha[11] = tmp & 0xff;
-                       } else {
-                               cdd_chb[i * 2 - 1] = tmp & 0xff;
-                               cdd_chb[i * 2] = (tmp >> 8) & 0xff;
-                       }
-               }
-
-               cdd_cha_rr_max = look_for_max(cdd_cha, 0, 1);
-               cdd_cha_rw_max = look_for_max(cdd_cha, 2, 5);
-               cdd_cha_wr_max = look_for_max(cdd_cha, 6, 9);
-               cdd_cha_ww_max = look_for_max(cdd_cha, 10, 11);
-               cdd_chb_rr_max = look_for_max(cdd_chb, 0, 1);
-               cdd_chb_rw_max = look_for_max(cdd_chb, 2, 5);
-               cdd_chb_wr_max = look_for_max(cdd_chb, 6, 9);
-               cdd_chb_ww_max = look_for_max(cdd_chb, 10, 11);
-               g_cdd_rr_max[fsp] =  cdd_cha_rr_max > cdd_chb_rr_max ? cdd_cha_rr_max : cdd_chb_rr_max;
-               g_cdd_rw_max[fsp] =  cdd_cha_rw_max > cdd_chb_rw_max ? cdd_cha_rw_max : cdd_chb_rw_max;
-               g_cdd_wr_max[fsp] =  cdd_cha_wr_max > cdd_chb_wr_max ? cdd_cha_wr_max : cdd_chb_wr_max;
-               g_cdd_ww_max[fsp] =  cdd_cha_ww_max > cdd_chb_ww_max ? cdd_cha_ww_max : cdd_chb_ww_max;
-       } else {
-               unsigned int ddr4_cdd[64];
-
-               for (i = 0; i < 29; i++) {
-                       tmp = reg32_read(IP2APB_DDRPHY_IPS_BASE_ADDR(0) + (0x54012 + i) * 4);
-                       ddr4_cdd[i * 2] = tmp & 0xff;
-                       ddr4_cdd[i * 2 + 1] = (tmp >> 8) & 0xff;
-               }
-
-               g_cdd_rr_max[fsp] = look_for_max(ddr4_cdd, 1, 12);
-               g_cdd_ww_max[fsp] = look_for_max(ddr4_cdd, 13, 24);
-               g_cdd_rw_max[fsp] = look_for_max(ddr4_cdd, 25, 40);
-               g_cdd_wr_max[fsp] = look_for_max(ddr4_cdd, 41, 56);
-       }
-}
-
-void update_umctl2_rank_space_setting(unsigned int pstat_num)
-{
-       unsigned int i, ddr_type;
-       unsigned int addr_slot, rdata, tmp, tmp_t;
-       unsigned int ddrc_w2r, ddrc_r2w, ddrc_wr_gap, ddrc_rd_gap;
-
-       ddr_type = reg32_read(DDRC_MSTR(0)) & 0x3f;
-       for (i = 0; i < pstat_num; i++) {
-               addr_slot = i ? (i + 1) * 0x1000 : 0;
-               if (ddr_type == 0x20) {
-                       /* update r2w:[13:8], w2r:[5:0] */
-                       rdata = reg32_read(DDRC_DRAMTMG2(0) + addr_slot);
-                       ddrc_w2r = rdata & 0x3f;
-                       if (is_imx8mp())
-                               tmp = ddrc_w2r + (g_cdd_wr_max[i] >> 1);
-                       else
-                               tmp = ddrc_w2r + (g_cdd_wr_max[i] >> 1) + 1;
-                       ddrc_w2r = (tmp > 0x3f) ? 0x3f : tmp;
-
-                       ddrc_r2w = (rdata >> 8) & 0x3f;
-                       if (is_imx8mp())
-                               tmp = ddrc_r2w + (g_cdd_rw_max[i] >> 1);
-                       else
-                               tmp = ddrc_r2w + (g_cdd_rw_max[i] >> 1) + 1;
-                       ddrc_r2w = (tmp > 0x3f) ? 0x3f : tmp;
-
-                       tmp_t = (rdata & 0xffffc0c0) | (ddrc_r2w << 8) | ddrc_w2r;
-                       reg32_write((DDRC_DRAMTMG2(0) + addr_slot), tmp_t);
-               } else {
-                       /* update w2r:[5:0] */
-                       rdata = reg32_read(DDRC_DRAMTMG9(0) + addr_slot);
-                       ddrc_w2r = rdata & 0x3f;
-                       if (is_imx8mp())
-                               tmp = ddrc_w2r + (g_cdd_wr_max[i] >> 1);
-                       else
-                               tmp = ddrc_w2r + (g_cdd_wr_max[i] >> 1) + 1;
-                       ddrc_w2r = (tmp > 0x3f) ? 0x3f : tmp;
-                       tmp_t = (rdata & 0xffffffc0) | ddrc_w2r;
-                       reg32_write((DDRC_DRAMTMG9(0) + addr_slot), tmp_t);
-
-                       /* update r2w:[13:8] */
-                       rdata = reg32_read(DDRC_DRAMTMG2(0) + addr_slot);
-                       ddrc_r2w = (rdata >> 8) & 0x3f;
-                       if (is_imx8mp())
-                               tmp = ddrc_r2w + (g_cdd_rw_max[i] >> 1);
-                       else
-                               tmp = ddrc_r2w + (g_cdd_rw_max[i] >> 1) + 1;
-                       ddrc_r2w = (tmp > 0x3f) ? 0x3f : tmp;
-
-                       tmp_t = (rdata & 0xffffc0ff) | (ddrc_r2w << 8);
-                       reg32_write((DDRC_DRAMTMG2(0) + addr_slot), tmp_t);
-               }
-
-               if (!is_imx8mq()) {
-                       /* update rankctl: wr_gap:11:8; rd:gap:7:4; quasi-dymic, doc wrong(static) */
-                       rdata = reg32_read(DDRC_RANKCTL(0) + addr_slot);
-                       ddrc_wr_gap = (rdata >> 8) & 0xf;
-                       if (is_imx8mp())
-                               tmp = ddrc_wr_gap + (g_cdd_ww_max[i] >> 1);
-                       else
-                               tmp = ddrc_wr_gap + (g_cdd_ww_max[i] >> 1) + 1;
-                       ddrc_wr_gap = (tmp > 0xf) ? 0xf : tmp;
-
-                       ddrc_rd_gap = (rdata >> 4) & 0xf;
-                       if (is_imx8mp())
-                               tmp = ddrc_rd_gap + (g_cdd_rr_max[i] >> 1);
-                       else
-                               tmp = ddrc_rd_gap + (g_cdd_rr_max[i] >> 1) + 1;
-                       ddrc_rd_gap = (tmp > 0xf) ? 0xf : tmp;
-
-                       tmp_t = (rdata & 0xfffff00f) | (ddrc_wr_gap << 8) | (ddrc_rd_gap << 4);
-                       reg32_write((DDRC_RANKCTL(0) + addr_slot), tmp_t);
-               }
-       }
-
-       if (is_imx8mq()) {
-               /* update rankctl: wr_gap:11:8; rd:gap:7:4; quasi-dymic, doc wrong(static) */
-               rdata = reg32_read(DDRC_RANKCTL(0));
-               ddrc_wr_gap = (rdata >> 8) & 0xf;
-               tmp = ddrc_wr_gap + (g_cdd_ww_max[0] >> 1) + 1;
-               ddrc_wr_gap = (tmp > 0xf) ? 0xf : tmp;
-
-               ddrc_rd_gap = (rdata >> 4) & 0xf;
-               tmp = ddrc_rd_gap + (g_cdd_rr_max[0] >> 1) + 1;
-               ddrc_rd_gap = (tmp > 0xf) ? 0xf : tmp;
-
-               tmp_t = (rdata & 0xfffff00f) | (ddrc_wr_gap << 8) | (ddrc_rd_gap << 4);
-               reg32_write(DDRC_RANKCTL(0), tmp_t);
-       }
-}
index bf2a6c9..836148e 100644 (file)
@@ -57,7 +57,6 @@ struct stm32_i2c_regs {
 #define STM32_I2C_CR1_PE                       BIT(0)
 
 /* STM32 I2C control 2 */
-#define STM32_I2C_CR2_AUTOEND                  BIT(25)
 #define STM32_I2C_CR2_RELOAD                   BIT(24)
 #define STM32_I2C_CR2_NBYTES_MASK              GENMASK(23, 16)
 #define STM32_I2C_CR2_NBYTES(n)                        ((n & 0xff) << 16)
@@ -283,7 +282,7 @@ static int stm32_i2c_check_device_busy(struct stm32_i2c_priv *i2c_priv)
 }
 
 static void stm32_i2c_message_start(struct stm32_i2c_priv *i2c_priv,
-                                   struct i2c_msg *msg, bool stop)
+                                   struct i2c_msg *msg)
 {
        struct stm32_i2c_regs *regs = i2c_priv->regs;
        u32 cr2 = readl(&regs->cr2);
@@ -304,9 +303,8 @@ static void stm32_i2c_message_start(struct stm32_i2c_priv *i2c_priv,
                cr2 |= STM32_I2C_CR2_SADD7(msg->addr);
        }
 
-       /* Set nb bytes to transfer and reload or autoend bits */
-       cr2 &= ~(STM32_I2C_CR2_NBYTES_MASK | STM32_I2C_CR2_RELOAD |
-                STM32_I2C_CR2_AUTOEND);
+       /* Set nb bytes to transfer and reload (if needed) */
+       cr2 &= ~(STM32_I2C_CR2_NBYTES_MASK | STM32_I2C_CR2_RELOAD);
        if (msg->len > STM32_I2C_MAX_LEN) {
                cr2 |= STM32_I2C_CR2_NBYTES(STM32_I2C_MAX_LEN);
                cr2 |= STM32_I2C_CR2_RELOAD;
@@ -327,7 +325,7 @@ static void stm32_i2c_message_start(struct stm32_i2c_priv *i2c_priv,
  */
 
 static void stm32_i2c_handle_reload(struct stm32_i2c_priv *i2c_priv,
-                                   struct i2c_msg *msg, bool stop)
+                                   struct i2c_msg *msg)
 {
        struct stm32_i2c_regs *regs = i2c_priv->regs;
        u32 cr2 = readl(&regs->cr2);
@@ -413,7 +411,7 @@ static int stm32_i2c_check_end_of_message(struct stm32_i2c_priv *i2c_priv)
                setbits_le32(&regs->icr, STM32_I2C_ICR_STOPCF);
 
                /* Clear control register 2 */
-               setbits_le32(&regs->cr2, STM32_I2C_CR2_RESET_MASK);
+               clrbits_le32(&regs->cr2, STM32_I2C_CR2_RESET_MASK);
        }
 
        return ret;
@@ -433,7 +431,7 @@ static int stm32_i2c_message_xfer(struct stm32_i2c_priv *i2c_priv,
        /* Add errors */
        mask |= STM32_I2C_ISR_ERRORS;
 
-       stm32_i2c_message_start(i2c_priv, msg, stop);
+       stm32_i2c_message_start(i2c_priv, msg);
 
        while (msg->len) {
                /*
@@ -471,7 +469,7 @@ static int stm32_i2c_message_xfer(struct stm32_i2c_priv *i2c_priv,
                        mask = msg->flags & I2C_M_RD ? STM32_I2C_ISR_RXNE :
                               STM32_I2C_ISR_TXIS | STM32_I2C_ISR_NACKF;
 
-                       stm32_i2c_handle_reload(i2c_priv, msg, stop);
+                       stm32_i2c_handle_reload(i2c_priv, msg);
                } else if (!bytes_to_rw) {
                        /* Wait until TC flag is set */
                        mask = STM32_I2C_ISR_TC;
@@ -485,9 +483,9 @@ static int stm32_i2c_message_xfer(struct stm32_i2c_priv *i2c_priv,
                }
        }
 
-       /* End of transfer, send stop condition */
-       mask = STM32_I2C_CR2_STOP;
-       setbits_le32(&regs->cr2, mask);
+       /* End of transfer, send stop condition if appropriate */
+       if (!ret && !(status & (STM32_I2C_ISR_NACKF | STM32_I2C_ISR_ERRORS)))
+               setbits_le32(&regs->cr2, STM32_I2C_CR2_STOP);
 
        return stm32_i2c_check_end_of_message(i2c_priv);
 }
@@ -916,18 +914,19 @@ static int stm32_of_to_plat(struct udevice *dev)
 {
        const struct stm32_i2c_data *data;
        struct stm32_i2c_priv *i2c_priv = dev_get_priv(dev);
-       u32 rise_time, fall_time;
        int ret;
 
        data = (const struct stm32_i2c_data *)dev_get_driver_data(dev);
        if (!data)
                return -EINVAL;
 
-       rise_time = dev_read_u32_default(dev, "i2c-scl-rising-time-ns",
-                                        STM32_I2C_RISE_TIME_DEFAULT);
+       i2c_priv->setup.rise_time = dev_read_u32_default(dev,
+                                                        "i2c-scl-rising-time-ns",
+                                                        STM32_I2C_RISE_TIME_DEFAULT);
 
-       fall_time = dev_read_u32_default(dev, "i2c-scl-falling-time-ns",
-                                        STM32_I2C_FALL_TIME_DEFAULT);
+       i2c_priv->setup.fall_time = dev_read_u32_default(dev,
+                                                        "i2c-scl-falling-time-ns",
+                                                        STM32_I2C_FALL_TIME_DEFAULT);
 
        i2c_priv->dnf_dt = dev_read_u32_default(dev, "i2c-digital-filter-width-ns", 0);
        if (!dev_read_bool(dev, "i2c-digital-filter"))
index 760f13d..aa00d7e 100644 (file)
@@ -9,6 +9,10 @@
 #include <mmc.h>
 #include <malloc.h>
 
+#ifndef CONFIG_SYS_MMC_U_BOOT_OFFS
+extern uchar mmc_u_boot_offs[];
+#endif
+
 /*
  * The environment variables are written to just after the u-boot image
  * on SDCard, so we must read the MBR to get the start address and code
@@ -58,10 +62,10 @@ void __noreturn mmc_boot(void)
 {
        __attribute__((noreturn)) void (*uboot)(void);
        uint blk_start, blk_cnt, err;
-#ifndef CONFIG_FSL_CORENET
        uchar *tmp_buf;
        u32 blklen;
        u32 blk_off;
+#ifndef CONFIG_FSL_CORENET
        uchar val;
 #ifndef CONFIG_SPL_FSL_PBL
        u32 val32;
@@ -83,9 +87,6 @@ void __noreturn mmc_boot(void)
                hang();
        }
 
-#ifdef CONFIG_FSL_CORENET
-       offset = CONFIG_SYS_MMC_U_BOOT_OFFS;
-#else
        blklen = mmc->read_bl_len;
        if (blklen < 512)
                blklen = 512;
@@ -95,6 +96,9 @@ void __noreturn mmc_boot(void)
                hang();
        }
 
+#ifdef CONFIG_FSL_CORENET
+       offset = CONFIG_SYS_MMC_U_BOOT_OFFS;
+#else
        sector = 0;
 again:
        memset(tmp_buf, 0, blklen);
@@ -149,23 +153,44 @@ again:
                val = *(tmp_buf + blk_off + ESDHC_BOOT_IMAGE_ADDR + i);
                offset = (offset << 8) + val;
        }
+#ifndef CONFIG_SYS_MMC_U_BOOT_OFFS
+       offset += (ulong)&mmc_u_boot_offs - CONFIG_SPL_TEXT_BASE;
+#else
        offset += CONFIG_SYS_MMC_U_BOOT_OFFS;
 #endif
+#endif
        /*
        * Load U-Boot image from mmc into RAM
        */
        code_len = CONFIG_SYS_MMC_U_BOOT_SIZE;
-       blk_start = ALIGN(offset, mmc->read_bl_len) / mmc->read_bl_len;
-       blk_cnt = ALIGN(code_len, mmc->read_bl_len) / mmc->read_bl_len;
+       blk_start = offset / mmc->read_bl_len;
+       blk_off = offset % mmc->read_bl_len;
+       blk_cnt = ALIGN(code_len, mmc->read_bl_len) / mmc->read_bl_len + 1;
+       if (blk_off) {
+               err = mmc->block_dev.block_read(&mmc->block_dev,
+                                               blk_start, 1, tmp_buf);
+               if (err != 1) {
+                       puts("spl: mmc read failed!!\n");
+                       hang();
+               }
+               blk_start++;
+       }
        err = mmc->block_dev.block_read(&mmc->block_dev, blk_start, blk_cnt,
-                                       (uchar *)CONFIG_SYS_MMC_U_BOOT_DST);
+                                       (uchar *)CONFIG_SYS_MMC_U_BOOT_DST +
+                                       (blk_off ? (mmc->read_bl_len - blk_off) : 0));
        if (err != blk_cnt) {
                puts("spl: mmc read failed!!\n");
-#ifndef CONFIG_FSL_CORENET
                free(tmp_buf);
-#endif
                hang();
        }
+       /*
+        * SDHC DMA may erase bytes at dst + bl_len - blk_off - 8
+        * due to unaligned access. So copy leading bytes from tmp_buf
+        * after SDHC DMA transfer.
+        */
+       if (blk_off)
+               memcpy((uchar *)CONFIG_SYS_MMC_U_BOOT_DST,
+                      tmp_buf + blk_off, mmc->read_bl_len - blk_off);
 
        /*
        * Clean d-cache and invalidate i-cache, to
index 2c61ce7..aca7a6c 100644 (file)
@@ -388,7 +388,8 @@ static int rpc_hf_probe(struct udevice *dev)
 }
 
 static const struct udevice_id rpc_hf_ids[] = {
-       { .compatible = "renesas,rpc" },
+       { .compatible = "renesas,r7s72100-rpc-if" },
+       { .compatible = "renesas,rcar-gen3-rpc-if" },
        {}
 };
 
index d0b492b..ee96abb 100644 (file)
@@ -5,6 +5,7 @@
  */
 #include <common.h>
 #include <env.h>
+#include <image.h>
 #include <malloc.h>
 #include <asm/io.h>
 #include <linux/errno.h>
@@ -513,6 +514,23 @@ int fm_init_common(int index, struct ccsr_fman *reg)
        void *addr = NULL;
 #endif
 
+       rc = fit_check_format(addr, CONFIG_SYS_QE_FMAN_FW_LENGTH);
+       if (!rc) {
+               size_t unused;
+               const void *new_addr;
+
+               rc = fit_get_data_conf_prop(addr, "fman", &new_addr, &unused);
+               if (rc)
+                       return rc;
+               addr = (void *)new_addr;
+       } else if (CONFIG_IS_ENABLED(FIT_SIGNATURE)) {
+               /*
+                * Using a (signed) FIT wrapper is mandatory if we are
+                * doing verified boot.
+                */
+               return rc;
+       }
+
        /* Upload the Fman microcode if it's present */
        rc = fman_upload_firmware(index, &reg->fm_imem, addr);
        if (rc)
index bc1c31d..68833f9 100644 (file)
@@ -137,13 +137,7 @@ int parse_mc_firmware_fit_image(u64 mc_fw_addr,
                                size_t *raw_image_size)
 {
        int format;
-       void *fit_hdr;
-       int node_offset;
-       const void *data;
-       size_t size;
-       const char *uname = "firmware";
-
-       fit_hdr = (void *)mc_fw_addr;
+       void *fit_hdr = (void *)mc_fw_addr;
 
        /* Check if Image is in FIT format */
        format = genimg_get_format(fit_hdr);
@@ -158,26 +152,8 @@ int parse_mc_firmware_fit_image(u64 mc_fw_addr,
                return -EINVAL;
        }
 
-       node_offset = fit_image_get_node(fit_hdr, uname);
-
-       if (node_offset < 0) {
-               printf("fsl-mc: ERR: Bad firmware image (missing subimage)\n");
-               return -ENOENT;
-       }
-
-       /* Verify MC firmware image */
-       if (!(fit_image_verify(fit_hdr, node_offset))) {
-               printf("fsl-mc: ERR: Bad firmware image (bad CRC)\n");
-               return -EINVAL;
-       }
-
-       /* 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;
+       return fit_get_data_node(fit_hdr, "firmware", raw_image_addr,
+                                raw_image_size);
 }
 #endif
 
index cd4c2c2..835e5bd 100644 (file)
@@ -22,6 +22,8 @@
 
 #define ENETC_DRIVER_NAME      "enetc_eth"
 
+static int enetc_remove(struct udevice *dev);
+
 /*
  * sets the MAC address in IERB registers, this setting is persistent and
  * carried over to Linux.
@@ -319,6 +321,7 @@ static int enetc_config_phy(struct udevice *dev)
 static int enetc_probe(struct udevice *dev)
 {
        struct enetc_priv *priv = dev_get_priv(dev);
+       int res;
 
        if (ofnode_valid(dev_ofnode(dev)) && !ofnode_is_available(dev_ofnode(dev))) {
                enetc_dbg(dev, "interface disabled\n");
@@ -350,7 +353,10 @@ static int enetc_probe(struct udevice *dev)
 
        enetc_start_pcs(dev);
 
-       return enetc_config_phy(dev);
+       res = enetc_config_phy(dev);
+       if(res)
+               enetc_remove(dev);
+       return res;
 }
 
 /*
index 82a4aa8..da4f2ca 100644 (file)
@@ -104,45 +104,7 @@ err:
 static int pfe_get_fw(const void **data,
                      size_t *size, char *fw_name)
 {
-       int conf_node_off, fw_node_off;
-       char *conf_node_name = NULL;
-       char *desc;
-       int ret = 0;
-
-       conf_node_name = PFE_FIRMWARE_FIT_CNF_NAME;
-
-       conf_node_off = fit_conf_get_node(pfe_fit_addr, conf_node_name);
-       if (conf_node_off < 0) {
-               printf("PFE Firmware: %s: no such config\n", conf_node_name);
-               return -ENOENT;
-       }
-
-       fw_node_off = fit_conf_get_prop_node(pfe_fit_addr, conf_node_off,
-                                            fw_name);
-       if (fw_node_off < 0) {
-               printf("PFE Firmware: No '%s' in config\n",
-                      fw_name);
-               return -ENOLINK;
-       }
-
-       if (!(fit_image_verify(pfe_fit_addr, fw_node_off))) {
-               printf("PFE Firmware: Bad firmware image (bad CRC)\n");
-               return -EINVAL;
-       }
-
-       if (fit_image_get_data(pfe_fit_addr, fw_node_off, data, size)) {
-               printf("PFE Firmware: Can't get %s subimage data/size",
-                      fw_name);
-               return -ENOENT;
-       }
-
-       ret = fit_get_desc(pfe_fit_addr, fw_node_off, &desc);
-       if (ret)
-               printf("PFE Firmware: Can't get description\n");
-       else
-               printf("%s\n", desc);
-
-       return ret;
+       return fit_get_data_conf_prop(pfe_fit_addr, fw_name, data, size);
 }
 
 /*
index 3510f79..6d0d3f3 100644 (file)
@@ -27,9 +27,8 @@
 #define IO_TIMEOUT             30
 #define MAX_PRP_POOL           512
 
-static int nvme_wait_ready(struct nvme_dev *dev, bool enabled)
+static int nvme_wait_csts(struct nvme_dev *dev, u32 mask, u32 val)
 {
-       u32 bit = enabled ? NVME_CSTS_RDY : 0;
        int timeout;
        ulong start;
 
@@ -38,7 +37,7 @@ static int nvme_wait_ready(struct nvme_dev *dev, bool enabled)
 
        start = get_timer(0);
        while (get_timer(start) < timeout) {
-               if ((readl(&dev->bar->csts) & NVME_CSTS_RDY) == bit)
+               if ((readl(&dev->bar->csts) & mask) == val)
                        return 0;
        }
 
@@ -295,7 +294,7 @@ static int nvme_enable_ctrl(struct nvme_dev *dev)
        dev->ctrl_config |= NVME_CC_ENABLE;
        writel(dev->ctrl_config, &dev->bar->cc);
 
-       return nvme_wait_ready(dev, true);
+       return nvme_wait_csts(dev, NVME_CSTS_RDY, NVME_CSTS_RDY);
 }
 
 static int nvme_disable_ctrl(struct nvme_dev *dev)
@@ -304,7 +303,16 @@ static int nvme_disable_ctrl(struct nvme_dev *dev)
        dev->ctrl_config &= ~NVME_CC_ENABLE;
        writel(dev->ctrl_config, &dev->bar->cc);
 
-       return nvme_wait_ready(dev, false);
+       return nvme_wait_csts(dev, NVME_CSTS_RDY, 0);
+}
+
+static int nvme_shutdown_ctrl(struct nvme_dev *dev)
+{
+       dev->ctrl_config &= ~NVME_CC_SHN_MASK;
+       dev->ctrl_config |= NVME_CC_SHN_NORMAL;
+       writel(dev->ctrl_config, &dev->bar->cc);
+
+       return nvme_wait_csts(dev, NVME_CSTS_SHST_MASK, NVME_CSTS_SHST_CMPLT);
 }
 
 static void nvme_free_queue(struct nvme_queue *nvmeq)
@@ -904,6 +912,13 @@ free_nvme:
 int nvme_shutdown(struct udevice *udev)
 {
        struct nvme_dev *ndev = dev_get_priv(udev);
+       int ret;
+
+       ret = nvme_shutdown_ctrl(ndev);
+       if (ret < 0) {
+               printf("Error: %s: Shutdown timed out!\n", udev->name);
+               return ret;
+       }
 
        return nvme_disable_ctrl(ndev);
 }
index 2c85e78..16a6a69 100644 (file)
@@ -286,6 +286,8 @@ int pci_bus_write_config(struct udevice *bus, pci_dev_t bdf, int offset,
        ops = pci_get_ops(bus);
        if (!ops->write_config)
                return -ENOSYS;
+       if (offset < 0 || offset >= 4096)
+               return -EINVAL;
        return ops->write_config(bus, bdf, offset, value, size);
 }
 
@@ -364,8 +366,14 @@ int pci_bus_read_config(const struct udevice *bus, pci_dev_t bdf, int offset,
        struct dm_pci_ops *ops;
 
        ops = pci_get_ops(bus);
-       if (!ops->read_config)
+       if (!ops->read_config) {
+               *valuep = pci_conv_32_to_size(~0, offset, size);
                return -ENOSYS;
+       }
+       if (offset < 0 || offset >= 4096) {
+               *valuep = pci_conv_32_to_size(0, offset, size);
+               return -EINVAL;
+       }
        return ops->read_config(bus, bdf, offset, valuep, size);
 }
 
index d7f7c37..9f0b7d7 100644 (file)
@@ -7,6 +7,7 @@
 
 #include <common.h>
 #include <clk.h>
+#include <clk-uclass.h>
 #include <div64.h>
 #include <dm.h>
 #include <fdtdec.h>
@@ -17,6 +18,7 @@
 #include <usb.h>
 #include <asm/io.h>
 #include <dm/device_compat.h>
+#include <dm/lists.h>
 #include <dm/of_access.h>
 #include <linux/bitfield.h>
 #include <linux/bitops.h>
@@ -72,6 +74,9 @@
 #define PLL_INFF_MIN_RATE      19200000 /* in Hz */
 #define PLL_INFF_MAX_RATE      38400000 /* in Hz */
 
+/* USBPHYC_CLK48 */
+#define USBPHYC_CLK48_FREQ     48000000 /* in Hz */
+
 enum boosting_vals {
        BOOST_1000_UA = 1000,
        BOOST_2000_UA = 2000,
@@ -144,6 +149,7 @@ struct stm32_usbphyc {
                bool init;
                bool powered;
        } phys[MAX_PHYS];
+       int n_pll_cons;
 };
 
 static void stm32_usbphyc_get_pll_params(u32 clk_rate,
@@ -203,18 +209,6 @@ static int stm32_usbphyc_pll_init(struct stm32_usbphyc *usbphyc)
        return 0;
 }
 
-static bool stm32_usbphyc_is_init(struct stm32_usbphyc *usbphyc)
-{
-       int i;
-
-       for (i = 0; i < MAX_PHYS; i++) {
-               if (usbphyc->phys[i].init)
-                       return true;
-       }
-
-       return false;
-}
-
 static bool stm32_usbphyc_is_powered(struct stm32_usbphyc *usbphyc)
 {
        int i;
@@ -227,18 +221,17 @@ static bool stm32_usbphyc_is_powered(struct stm32_usbphyc *usbphyc)
        return false;
 }
 
-static int stm32_usbphyc_phy_init(struct phy *phy)
+static int stm32_usbphyc_pll_enable(struct stm32_usbphyc *usbphyc)
 {
-       struct stm32_usbphyc *usbphyc = dev_get_priv(phy->dev);
-       struct stm32_usbphyc_phy *usbphyc_phy = usbphyc->phys + phy->id;
        bool pllen = readl(usbphyc->base + STM32_USBPHYC_PLL) & PLLEN ?
                     true : false;
        int ret;
 
-       dev_dbg(phy->dev, "phy ID = %lu\n", phy->id);
-       /* Check if one phy port has already configured the pll */
-       if (pllen && stm32_usbphyc_is_init(usbphyc))
-               goto initialized;
+       /* Check if one consumer has already configured the pll */
+       if (pllen && usbphyc->n_pll_cons) {
+               usbphyc->n_pll_cons++;
+               return 0;
+       }
 
        if (usbphyc->vdda1v1) {
                ret = regulator_set_enable(usbphyc->vdda1v1, true);
@@ -269,23 +262,19 @@ static int stm32_usbphyc_phy_init(struct phy *phy)
        if (!(readl(usbphyc->base + STM32_USBPHYC_PLL) & PLLEN))
                return -EIO;
 
-initialized:
-       usbphyc_phy->init = true;
+       usbphyc->n_pll_cons++;
 
        return 0;
 }
 
-static int stm32_usbphyc_phy_exit(struct phy *phy)
+static int stm32_usbphyc_pll_disable(struct stm32_usbphyc *usbphyc)
 {
-       struct stm32_usbphyc *usbphyc = dev_get_priv(phy->dev);
-       struct stm32_usbphyc_phy *usbphyc_phy = usbphyc->phys + phy->id;
        int ret;
 
-       dev_dbg(phy->dev, "phy ID = %lu\n", phy->id);
-       usbphyc_phy->init = false;
+       usbphyc->n_pll_cons--;
 
-       /* Check if other phy port requires pllen */
-       if (stm32_usbphyc_is_init(usbphyc))
+       /* Check if other consumer requires pllen */
+       if (usbphyc->n_pll_cons)
                return 0;
 
        clrbits_le32(usbphyc->base + STM32_USBPHYC_PLL, PLLEN);
@@ -314,6 +303,42 @@ static int stm32_usbphyc_phy_exit(struct phy *phy)
        return 0;
 }
 
+static int stm32_usbphyc_phy_init(struct phy *phy)
+{
+       struct stm32_usbphyc *usbphyc = dev_get_priv(phy->dev);
+       struct stm32_usbphyc_phy *usbphyc_phy = usbphyc->phys + phy->id;
+       int ret;
+
+       dev_dbg(phy->dev, "phy ID = %lu\n", phy->id);
+       if (usbphyc_phy->init)
+               return 0;
+
+       ret = stm32_usbphyc_pll_enable(usbphyc);
+       if (ret)
+               return log_ret(ret);
+
+       usbphyc_phy->init = true;
+
+       return 0;
+}
+
+static int stm32_usbphyc_phy_exit(struct phy *phy)
+{
+       struct stm32_usbphyc *usbphyc = dev_get_priv(phy->dev);
+       struct stm32_usbphyc_phy *usbphyc_phy = usbphyc->phys + phy->id;
+       int ret;
+
+       dev_dbg(phy->dev, "phy ID = %lu\n", phy->id);
+       if (!usbphyc_phy->init)
+               return 0;
+
+       ret = stm32_usbphyc_pll_disable(usbphyc);
+
+       usbphyc_phy->init = false;
+
+       return log_ret(ret);
+}
+
 static int stm32_usbphyc_phy_power_on(struct phy *phy)
 {
        struct stm32_usbphyc *usbphyc = dev_get_priv(phy->dev);
@@ -498,6 +523,16 @@ static const struct phy_ops stm32_usbphyc_phy_ops = {
        .of_xlate = stm32_usbphyc_of_xlate,
 };
 
+static int stm32_usbphyc_bind(struct udevice *dev)
+{
+       int ret;
+
+       ret = device_bind_driver_to_node(dev, "stm32-usbphyc-clk", "ck_usbo_48m",
+                                        dev_ofnode(dev), NULL);
+
+       return log_ret(ret);
+}
+
 static int stm32_usbphyc_probe(struct udevice *dev)
 {
        struct stm32_usbphyc *usbphyc = dev_get_priv(dev);
@@ -591,6 +626,70 @@ U_BOOT_DRIVER(stm32_usb_phyc) = {
        .id = UCLASS_PHY,
        .of_match = stm32_usbphyc_of_match,
        .ops = &stm32_usbphyc_phy_ops,
+       .bind = stm32_usbphyc_bind,
        .probe = stm32_usbphyc_probe,
        .priv_auto      = sizeof(struct stm32_usbphyc),
 };
+
+struct stm32_usbphyc_clk {
+       bool enable;
+};
+
+static ulong stm32_usbphyc_clk48_get_rate(struct clk *clk)
+{
+       return USBPHYC_CLK48_FREQ;
+}
+
+static int stm32_usbphyc_clk48_enable(struct clk *clk)
+{
+       struct stm32_usbphyc_clk *usbphyc_clk = dev_get_priv(clk->dev);
+       struct stm32_usbphyc *usbphyc;
+       int ret;
+
+       if (usbphyc_clk->enable)
+               return 0;
+
+       usbphyc = dev_get_priv(clk->dev->parent);
+
+       /* ck_usbo_48m is generated by usbphyc PLL */
+       ret = stm32_usbphyc_pll_enable(usbphyc);
+       if (ret)
+               return ret;
+
+       usbphyc_clk->enable = true;
+
+       return 0;
+}
+
+static int stm32_usbphyc_clk48_disable(struct clk *clk)
+{
+       struct stm32_usbphyc_clk *usbphyc_clk = dev_get_priv(clk->dev);
+       struct stm32_usbphyc *usbphyc;
+       int ret;
+
+       if (!usbphyc_clk->enable)
+               return 0;
+
+       usbphyc = dev_get_priv(clk->dev->parent);
+
+       ret = stm32_usbphyc_pll_disable(usbphyc);
+       if (ret)
+               return ret;
+
+       usbphyc_clk->enable = false;
+
+       return 0;
+}
+
+const struct clk_ops usbphyc_clk48_ops = {
+       .get_rate = stm32_usbphyc_clk48_get_rate,
+       .enable = stm32_usbphyc_clk48_enable,
+       .disable = stm32_usbphyc_clk48_disable,
+};
+
+U_BOOT_DRIVER(stm32_usb_phyc_clk) = {
+       .name = "stm32-usbphyc-clk",
+       .id = UCLASS_CLK,
+       .ops = &usbphyc_clk48_ops,
+       .priv_auto = sizeof(struct stm32_usbphyc_clk),
+};
index ca2eec7..d0a8884 100644 (file)
@@ -87,12 +87,21 @@ struct imxrt_semc_regs {
        u32 sts[16];
 };
 
+#if !defined(TARGET_IMXRT1170_EVK)
 #define SEMC_IOCR_MUX_A8_SHIFT         0
 #define SEMC_IOCR_MUX_CSX0_SHIFT       3
 #define SEMC_IOCR_MUX_CSX1_SHIFT       6
 #define SEMC_IOCR_MUX_CSX2_SHIFT       9
 #define SEMC_IOCR_MUX_CSX3_SHIFT       12
 #define SEMC_IOCR_MUX_RDY_SHIFT                15
+#else
+#define SEMC_IOCR_MUX_A8_SHIFT         0
+#define SEMC_IOCR_MUX_CSX0_SHIFT       4
+#define SEMC_IOCR_MUX_CSX1_SHIFT       8
+#define SEMC_IOCR_MUX_CSX2_SHIFT       12
+#define SEMC_IOCR_MUX_CSX3_SHIFT       16
+#define SEMC_IOCR_MUX_RDY_SHIFT                20
+#endif
 
 struct imxrt_sdram_mux {
        u8 a8;
index c0a06dc..cbf502b 100644 (file)
@@ -85,7 +85,7 @@ struct sdram_rk3399_ops {
        int (*data_training_first)(struct dram_info *dram, u32 channel, u8 rank,
                                   struct rk3399_sdram_params *sdram);
        int (*set_rate_index)(struct dram_info *dram,
-                             struct rk3399_sdram_params *params);
+                             struct rk3399_sdram_params *params, u32 ctl_fn);
        void (*modify_param)(const struct chan_info *chan,
                             struct rk3399_sdram_params *params);
        struct rk3399_sdram_params *
@@ -1644,7 +1644,8 @@ static int data_training_first(struct dram_info *dram, u32 channel, u8 rank,
 }
 
 static int switch_to_phy_index1(struct dram_info *dram,
-                               struct rk3399_sdram_params *params)
+                               struct rk3399_sdram_params *params,
+                               u32 unused)
 {
        u32 channel;
        u32 *denali_phy;
@@ -2539,26 +2540,25 @@ static int lpddr4_set_ctl(struct dram_info *dram,
 }
 
 static int lpddr4_set_rate(struct dram_info *dram,
-                          struct rk3399_sdram_params *params)
+                           struct rk3399_sdram_params *params,
+                           u32 ctl_fn)
 {
-       u32 ctl_fn;
        u32 phy_fn;
 
-       for (ctl_fn = 0; ctl_fn < 2; ctl_fn++) {
-               phy_fn = lpddr4_get_phy_fn(params, ctl_fn);
+       phy_fn = lpddr4_get_phy_fn(params, ctl_fn);
 
-               lpddr4_set_phy(dram, params, phy_fn, &dfs_cfgs_lpddr4[ctl_fn]);
-               lpddr4_set_ctl(dram, params, ctl_fn,
-                              dfs_cfgs_lpddr4[ctl_fn].base.ddr_freq);
+       lpddr4_set_phy(dram, params, phy_fn, &dfs_cfgs_lpddr4[ctl_fn]);
+       lpddr4_set_ctl(dram, params, ctl_fn,
+                      dfs_cfgs_lpddr4[ctl_fn].base.ddr_freq);
 
-               if (IS_ENABLED(CONFIG_RAM_ROCKCHIP_DEBUG))
-                       printf("%s: change freq to %d mhz %d, %d\n", __func__,
-                              dfs_cfgs_lpddr4[ctl_fn].base.ddr_freq,
-                              ctl_fn, phy_fn);
-       }
+       if (IS_ENABLED(CONFIG_RAM_ROCKCHIP_DEBUG))
+               printf("%s: change freq to %dMHz %d, %d\n", __func__,
+                      dfs_cfgs_lpddr4[ctl_fn].base.ddr_freq / MHz,
+                      ctl_fn, phy_fn);
 
        return 0;
 }
+
 #endif /* CONFIG_RAM_RK3399_LPDDR4 */
 
 /* CS0,n=1
@@ -2955,6 +2955,12 @@ static int sdram_init(struct dram_info *dram,
                params->ch[ch].cap_info.rank = rank;
        }
 
+#if defined(CONFIG_RAM_RK3399_LPDDR4)
+       /* LPDDR4 needs to be trained at 400MHz */
+       lpddr4_set_rate(dram, params, 0);
+       params->base.ddr_freq = dfs_cfgs_lpddr4[0].base.ddr_freq / MHz;
+#endif
+
        params->base.num_channels = 0;
        for (channel = 0; channel < 2; channel++) {
                const struct chan_info *chan = &dram->chan[channel];
@@ -2964,8 +2970,6 @@ static int sdram_init(struct dram_info *dram,
                if (cap_info->rank == 0) {
                        clear_channel_params(params, 1);
                        continue;
-               } else {
-                       params->base.num_channels++;
                }
 
                if (IS_ENABLED(CONFIG_RAM_ROCKCHIP_DEBUG)) {
@@ -2991,6 +2995,8 @@ static int sdram_init(struct dram_info *dram,
                        printf("no ddrconfig find, Cap not support!\n");
                        continue;
                }
+
+               params->base.num_channels++;
                set_ddrconfig(chan, params, channel, cap_info->ddrconfig);
                set_cap_relate_config(chan, params, channel);
        }
@@ -3005,7 +3011,9 @@ static int sdram_init(struct dram_info *dram,
        params->base.stride = calculate_stride(params);
        dram_all_config(dram, params);
 
-       dram->ops->set_rate_index(dram, params);
+       ret = dram->ops->set_rate_index(dram, params, 1);
+       if (ret)
+               return ret;
 
        debug("Finish SDRAM initialization...\n");
        return 0;
index 315c136..4cf79c1 100644 (file)
 #define UCR3_AWAKEN    (1<<4)  /* Async wake interrupt enable */
 #define UCR3_REF25     (1<<3)  /* Ref freq 25 MHz */
 #define UCR3_REF30     (1<<2)  /* Ref Freq 30 MHz */
+
+/* imx8 names these bitsfields instead: */
+#define UCR3_DTRDEN    BIT(3)  /* bit not used in this chip */
+#define UCR3_RXDMUXSEL BIT(2)  /* RXD muxed input selected; 'should always be set' */
+
 #define UCR3_INVT      (1<<1)  /* Inverted Infrared transmission */
 #define UCR3_BPEN      (1<<0)  /* Preset registers enable */
 #define UCR4_CTSTL_32  (32<<10) /* CTS trigger level (32 chars) */
@@ -176,6 +181,14 @@ static void _mxc_serial_setbrg(struct mxc_uart *base, unsigned long clk,
 
        writel(UCR2_WS | UCR2_IRTS | UCR2_RXEN | UCR2_TXEN | UCR2_SRST,
               &base->cr2);
+
+       /*
+        * setting the baudrate triggers a reset, returning cr3 to its
+        * reset value but UCR3_RXDMUXSEL "should always be set."
+        * according to the imx8 reference-manual
+        */
+       writel(readl(&base->cr3) | UCR3_RXDMUXSEL, &base->cr3);
+
        writel(UCR1_UARTEN, &base->cr1);
 }
 
@@ -298,7 +311,7 @@ static int mxc_serial_putc(struct udevice *dev, const char ch)
        struct mxc_serial_plat *plat = dev_get_plat(dev);
        struct mxc_uart *const uart = plat->reg;
 
-       if (!(readl(&uart->ts) & UTS_TXEMPTY))
+       if (readl(&uart->ts) & UTS_TXFULL)
                return -EAGAIN;
 
        writel(ch, &uart->txd);
index 26b6aa8..cb2b8fb 100644 (file)
@@ -449,13 +449,8 @@ static const struct dm_spi_ops rpc_spi_ops = {
 };
 
 static const struct udevice_id rpc_spi_ids[] = {
-       { .compatible = "renesas,rpc-r7s72100" },
-       { .compatible = "renesas,rpc-r8a7795" },
-       { .compatible = "renesas,rpc-r8a7796" },
-       { .compatible = "renesas,rpc-r8a77965" },
-       { .compatible = "renesas,rpc-r8a77970" },
-       { .compatible = "renesas,rpc-r8a77995" },
-       { .compatible = "renesas,rcar-gen3-rpc" },
+       { .compatible = "renesas,r7s72100-rpc-if" },
+       { .compatible = "renesas,rcar-gen3-rpc-if" },
        { }
 };
 
index a0acffa..03f7fdd 100644 (file)
@@ -113,6 +113,7 @@ config SYSRESET_PSCI
 config SYSRESET_SBI
        bool "Enable support for SBI System Reset"
        depends on RISCV_SMODE && SBI_V02
+       default y
        select SYSRESET_CMD_POWEROFF if CMD_POWEROFF
        help
          Enable system reset and poweroff via the SBI system reset extension.
index fd30e1b..d7d1a1b 100644 (file)
@@ -19,7 +19,7 @@ static uint64_t orion_timer_get_count(struct udevice *dev)
 {
        struct orion_timer_priv *priv = dev_get_priv(dev);
 
-       return ~readl(priv->base + TIMER0_VAL);
+       return timer_conv_64(~readl(priv->base + TIMER0_VAL));
 }
 
 static int orion_timer_probe(struct udevice *dev)
index f8c3087..acf4c78 100644 (file)
 #include <irq.h>
 #include <log.h>
 #include <spl.h>
+#include <tpm-common.h>
 #include <tpm-v2.h>
 #include <acpi/acpigen.h>
 #include <acpi/acpi_device.h>
 #include <asm/gpio.h>
 #include <asm/io.h>
+#include <asm/unaligned.h>
 #include <linux/delay.h>
 #include <dm/acpi.h>
 
@@ -37,6 +39,50 @@ enum {
        CR50_MAX_BUF_SIZE = 63,
 };
 
+/*
+ * Operations specific to the Cr50 TPM used on Chromium OS and Android devices
+ *
+ * FIXME: below is not enough to differentiate between vendors commands
+ * of numerous devices. However, the current tpm2 APIs aren't very amenable
+ * to extending generically because the marshaling code is assuming all
+ * knowledge of all commands.
+ */
+#define TPM2_CC_VENDOR_BIT_MASK                        0x20000000
+
+#define TPM2_CR50_VENDOR_COMMAND               (TPM2_CC_VENDOR_BIT_MASK | 0)
+#define TPM2_CR50_SUB_CMD_IMMEDIATE_RESET      19
+#define TPM2_CR50_SUB_CMD_NVMEM_ENABLE_COMMITS 21
+#define TPM2_CR50_SUB_CMD_REPORT_TPM_STATE     23
+#define TPM2_CR50_SUB_CMD_TURN_UPDATE_ON       24
+#define TPM2_CR50_SUB_CMD_GET_REC_BTN          29
+#define TPM2_CR50_SUB_CMD_TPM_MODE             40
+#define TPM2_CR50_SUB_CMD_GET_BOOT_MODE                52
+#define TPM2_CR50_SUB_CMD_RESET_EC             53
+
+/* Cr50 vendor-specific error codes. */
+#define VENDOR_RC_ERR              0x00000500
+enum cr50_vendor_rc {
+       VENDOR_RC_INTERNAL_ERROR        = (VENDOR_RC_ERR | 6),
+       VENDOR_RC_NO_SUCH_SUBCOMMAND    = (VENDOR_RC_ERR | 8),
+       VENDOR_RC_NO_SUCH_COMMAND       = (VENDOR_RC_ERR | 127),
+};
+
+enum cr50_tpm_mode {
+       /*
+        * Default state: TPM is enabled, and may be set to either
+        * TPM_MODE_ENABLED or TPM_MODE_DISABLED.
+        */
+       TPM_MODE_ENABLED_TENTATIVE = 0,
+
+       /* TPM is enabled, and mode may not be changed. */
+       TPM_MODE_ENABLED = 1,
+
+       /* TPM is disabled, and mode may not be changed. */
+       TPM_MODE_DISABLED = 2,
+
+       TPM_MODE_INVALID,
+};
+
 /**
  * struct cr50_priv - Private driver data
  *
@@ -54,6 +100,41 @@ struct cr50_priv {
        bool use_irq;
 };
 
+/*
+ * The below structure represents the body of the response to the 'report tpm
+ * state' vendor command.
+ *
+ * It is transferred over the wire, so it needs to be serialized/deserialized,
+ * and it is likely to change, so its contents must be versioned.
+ */
+#define TPM_STATE_VERSION      1
+struct tpm_vendor_state {
+       u32 version;
+       /*
+        * The following three fields are set by the TPM in case of an assert.
+        * There is no other processing than setting the source code line
+        * number, error code and the first 4 characters of the function name.
+        *
+        * We don't expect this happening, but it is included in the report
+        * just in case.
+        */
+       u32 fail_line;  /* s_failLIne */
+       u32 fail_code;  /* s_failCode */
+       char func_name[4];      /* s_failFunction, limited to 4 chars */
+
+       /*
+        * The following two fields are the current time filtered value of the
+        * 'failed tries' TPM counter, and the maximum allowed value of the
+        * counter.
+        *
+        * failed_tries == max_tries is the definition of the TPM lockout
+        * condition.
+        */
+       u32 failed_tries;       /* gp.failedTries */
+       u32 max_tries;  /* gp.maxTries */
+       /* The below fields are present in version 2 and above */
+};
+
 /* Wait for interrupt to indicate TPM is ready */
 static int cr50_i2c_wait_tpm_ready(struct udevice *dev)
 {
@@ -573,6 +654,87 @@ static int cr50_i2c_get_desc(struct udevice *dev, char *buf, int size)
        return len;
 }
 
+static int stringify_state(char *buf, int len, char *str, size_t max_size)
+{
+       struct tpm_vendor_state state;
+       size_t text_size = 0;
+
+       state.version = get_unaligned_be32(buf +
+               offsetof(struct tpm_vendor_state, version));
+       state.fail_line = get_unaligned_be32(buf +
+               offsetof(struct tpm_vendor_state, fail_line));
+       state.fail_code = get_unaligned_be32(buf +
+               offsetof(struct tpm_vendor_state, fail_code));
+       memcpy(state.func_name,
+              buf + offsetof(struct tpm_vendor_state, func_name),
+              sizeof(state.func_name));
+       state.failed_tries = get_unaligned_be32(buf +
+               offsetof(struct tpm_vendor_state, failed_tries));
+       state.max_tries = get_unaligned_be32(buf +
+               offsetof(struct tpm_vendor_state, max_tries));
+
+       text_size += snprintf(str + text_size, max_size - text_size,
+                             "v=%d", state.version);
+       if (text_size >= max_size)
+               return -ENOSPC;
+
+       if (state.version > TPM_STATE_VERSION)
+               text_size += snprintf(str + text_size,
+                                     max_size - text_size,
+                                     " not fully supported\n");
+       if (text_size >= max_size)
+               return -ENOSPC;
+
+       if (state.version == 0)
+               return -EINVAL; /* This should never happen */
+
+       text_size += snprintf(str + text_size,
+                             max_size - text_size,
+                             " failed_tries=%d max_tries=%d\n",
+                             state.failed_tries, state.max_tries);
+       if (text_size >= max_size)
+               return -ENOSPC;
+
+       if (state.fail_line) {
+               /* make sure function name is zero terminated. */
+               char func_name[sizeof(state.func_name) + 1];
+
+               memcpy(func_name, state.func_name, sizeof(state.func_name));
+               func_name[sizeof(state.func_name)] = '\0';
+
+               text_size += snprintf(str + text_size,
+                                     max_size - text_size,
+                                     "tpm failed: f %s line %d code %d",
+                                     func_name,
+                                     state.fail_line,
+                                     state.fail_code);
+               if (text_size >= max_size)
+                       return -ENOSPC;
+       }
+
+       return 0;
+}
+
+static int cr50_i2c_report_state(struct udevice *dev, char *str, int str_max)
+{
+       char buf[50];
+       size_t buf_size = sizeof(buf);
+       int ret;
+
+       ret = tpm2_report_state(dev, TPM2_CR50_VENDOR_COMMAND,
+                               TPM2_CR50_SUB_CMD_REPORT_TPM_STATE,
+                               buf, &buf_size);
+       if (ret)
+               return ret;
+
+       /* TPM responded as expected */
+       ret = stringify_state(buf, buf_size, str, str_max);
+       if (ret)
+               return ret;
+
+       return 0;
+}
+
 static int cr50_i2c_open(struct udevice *dev)
 {
        char buf[80];
@@ -730,6 +892,7 @@ struct acpi_ops cr50_acpi_ops = {
 static const struct tpm_ops cr50_i2c_ops = {
        .open           = cr50_i2c_open,
        .get_desc       = cr50_i2c_get_desc,
+       .report_state   = cr50_i2c_report_state,
        .send           = cr50_i2c_send,
        .recv           = cr50_i2c_recv,
        .cleanup        = cr50_i2c_cleanup,
index 0eb35f5..5ff0cd3 100644 (file)
@@ -49,6 +49,16 @@ int tpm_get_desc(struct udevice *dev, char *buf, int size)
        return ops->get_desc(dev, buf, size);
 }
 
+int tpm_report_state(struct udevice *dev, char *buf, int size)
+{
+       struct tpm_ops *ops = tpm_get_ops(dev);
+
+       if (!ops->report_state)
+               return -ENOSYS;
+
+       return ops->report_state(dev, buf, size);
+}
+
 /* Returns max number of milliseconds to wait */
 static ulong tpm_tis_i2c_calc_ordinal_duration(struct tpm_chip_priv *priv,
                                               u32 ordinal)
index ac6eb14..dd94bdc 100644 (file)
@@ -366,8 +366,10 @@ static int sandbox_tpm2_check_readyness(struct udevice *dev, int command)
 
                break;
        default:
-               if (!tpm->tests_done)
-                       return TPM2_RC_NEEDS_TEST;
+               /* Skip this, since the startup may have happened in SPL
+                * if (!tpm->tests_done)
+                *    return TPM2_RC_NEEDS_TEST;
+                */
 
                break;
        }
@@ -793,6 +795,16 @@ static int sandbox_tpm2_get_desc(struct udevice *dev, char *buf, int size)
        return snprintf(buf, size, "Sandbox TPM2.x");
 }
 
+static int sandbox_tpm2_report_state(struct udevice *dev, char *buf, int size)
+{
+       struct sandbox_tpm2 *priv = dev_get_priv(dev);
+
+       if (size < 40)
+               return -ENOSPC;
+
+       return snprintf(buf, size, "init_done=%d", priv->init_done);
+}
+
 static int sandbox_tpm2_open(struct udevice *dev)
 {
        struct sandbox_tpm2 *tpm = dev_get_priv(dev);
@@ -832,6 +844,7 @@ static const struct tpm_ops sandbox_tpm2_ops = {
        .open           = sandbox_tpm2_open,
        .close          = sandbox_tpm2_close,
        .get_desc       = sandbox_tpm2_get_desc,
+       .report_state   = sandbox_tpm2_report_state,
        .xfer           = sandbox_tpm2_xfer,
 };
 
index 8ba55aa..d0e92c7 100644 (file)
@@ -119,6 +119,7 @@ static struct usb_descriptor_header *fb_fs_function[] = {
        (struct usb_descriptor_header *)&interface_desc,
        (struct usb_descriptor_header *)&fs_ep_in,
        (struct usb_descriptor_header *)&fs_ep_out,
+       NULL,
 };
 
 static struct usb_descriptor_header *fb_hs_function[] = {
index 9006c76..4aeb61f 100644 (file)
@@ -116,10 +116,14 @@ struct global_data {
        /**
         * @precon_buf_idx: pre-console buffer index
         *
-        * @precon_buf_idx indicates the current position of the buffer used to
-        * collect output before the console becomes available
-        */
-       unsigned long precon_buf_idx;
+        * @precon_buf_idx indicates the current position of the
+        * buffer used to collect output before the console becomes
+        * available. When negative, the pre-console buffer is
+        * temporarily disabled (used when the pre-console buffer is
+        * being written out, to prevent adding its contents to
+        * itself).
+        */
+       long precon_buf_idx;
 #endif
        /**
         * @env_addr: address of environment structure
index 2157f35..fcb319a 100644 (file)
@@ -70,7 +70,7 @@
 #ifdef CONFIG_CMD_UBIFS
 #define BOOTENV_SHARED_UBIFS \
        "ubifs_boot=" \
-               "if ubi part ${bootubipart} && " \
+               "if ubi part ${bootubipart} ${bootubioff} && " \
                        "ubifsmount ubi0:${bootubivol}; " \
                "then " \
                        "devtype=ubi; " \
                        "run scan_dev_for_boot; " \
                        "ubifsumount; " \
                "fi\0"
-#define BOOTENV_DEV_UBIFS(devtypeu, devtypel, instance, bootubipart, bootubivol) \
+#define BOOTENV_DEV_UBIFS_BOOTUBIOFF(off) #off /* type check, throw error when called with more args */
+#define BOOTENV_DEV_UBIFS(devtypeu, devtypel, instance, bootubipart, bootubivol, ...) \
        "bootcmd_ubifs" #instance "=" \
                "bootubipart=" #bootubipart "; " \
                "bootubivol=" #bootubivol "; " \
+               "bootubioff=" BOOTENV_DEV_UBIFS_BOOTUBIOFF(__VA_ARGS__) "; " \
                "run ubifs_boot\0"
-#define BOOTENV_DEV_NAME_UBIFS(devtypeu, devtypel, instance, bootubipart, bootubivol) \
+#define BOOTENV_DEV_NAME_UBIFS(devtypeu, devtypel, instance, ...) \
        #devtypel #instance " "
 #else
 #define BOOTENV_SHARED_UBIFS
diff --git a/include/configs/corenet_ds.h b/include/configs/corenet_ds.h
deleted file mode 100644 (file)
index 6ee5ec0..0000000
+++ /dev/null
@@ -1,365 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0+ */
-/*
- * Copyright 2009-2012 Freescale Semiconductor, Inc.
- * Copyright 2020-2021 NXP
- */
-
-/*
- * Corenet DS style board configuration file
- */
-#ifndef __CONFIG_H
-#define __CONFIG_H
-
-#include <linux/stringify.h>
-
-#include "../board/freescale/common/ics307_clk.h"
-
-#ifdef CONFIG_RAMBOOT_PBL
-#define CONFIG_RAMBOOT_TEXT_BASE       CONFIG_SYS_TEXT_BASE
-#define CONFIG_RESET_VECTOR_ADDRESS    0xfffffffc
-#endif
-
-#ifdef CONFIG_SRIO_PCIE_BOOT_SLAVE
-/* Set 1M boot space */
-#define CONFIG_SYS_SRIO_PCIE_BOOT_SLAVE_ADDR (CONFIG_SYS_TEXT_BASE & 0xfff00000)
-#define CONFIG_SYS_SRIO_PCIE_BOOT_SLAVE_ADDR_PHYS \
-               (0x300000000ull | CONFIG_SYS_SRIO_PCIE_BOOT_SLAVE_ADDR)
-#define CONFIG_RESET_VECTOR_ADDRESS 0xfffffffc
-#endif
-
-/* High Level Configuration Options */
-
-#ifndef CONFIG_RESET_VECTOR_ADDRESS
-#define CONFIG_RESET_VECTOR_ADDRESS    0xeffffffc
-#endif
-
-#define CONFIG_SYS_NUM_CPC             CONFIG_SYS_NUM_DDR_CTLRS
-
-/*
- * These can be toggled for performance analysis, otherwise use default.
- */
-#define CONFIG_SYS_INIT_L2CSR0         L2CSR0_L2E
-#ifdef CONFIG_DDR_ECC
-#define CONFIG_MEM_INIT_VALUE          0xdeadbeef
-#endif
-
-#define CONFIG_POST CONFIG_SYS_POST_MEMORY     /* test POST memory test */
-
-/*
- *  Config the L3 Cache as L3 SRAM
- */
-#define CONFIG_SYS_INIT_L3_ADDR                CONFIG_RAMBOOT_TEXT_BASE
-#ifdef CONFIG_PHYS_64BIT
-#define CONFIG_SYS_INIT_L3_ADDR_PHYS   (0xf00000000ull | CONFIG_RAMBOOT_TEXT_BASE)
-#else
-#define CONFIG_SYS_INIT_L3_ADDR_PHYS   CONFIG_SYS_INIT_L3_ADDR
-#endif
-#define CONFIG_SYS_L3_SIZE             (1024 << 10)
-#define CONFIG_SYS_INIT_L3_END (CONFIG_SYS_INIT_L3_ADDR + CONFIG_SYS_L3_SIZE)
-
-#ifdef CONFIG_PHYS_64BIT
-#define CONFIG_SYS_DCSRBAR             0xf0000000
-#define CONFIG_SYS_DCSRBAR_PHYS                0xf00000000ull
-#endif
-
-/*
- * DDR Setup
- */
-#define CONFIG_VERY_BIG_RAM
-#define CONFIG_SYS_DDR_SDRAM_BASE      0x00000000
-#define CONFIG_SYS_SDRAM_BASE          CONFIG_SYS_DDR_SDRAM_BASE
-
-#define SPD_EEPROM_ADDRESS1    0x51
-#define SPD_EEPROM_ADDRESS2    0x52
-#define SPD_EEPROM_ADDRESS     SPD_EEPROM_ADDRESS1     /* for p3041/p5010 */
-#define CONFIG_SYS_SDRAM_SIZE  4096    /* for fixed parameter use */
-
-/*
- * Local Bus Definitions
- */
-
-/* Set the local bus clock 1/8 of platform clock */
-#define CONFIG_SYS_LBC_LCRR            LCRR_CLKDIV_8
-
-#define CONFIG_SYS_FLASH_BASE          0xe0000000      /* Start of PromJet */
-#ifdef CONFIG_PHYS_64BIT
-#define CONFIG_SYS_FLASH_BASE_PHYS     0xfe0000000ull
-#else
-#define CONFIG_SYS_FLASH_BASE_PHYS     CONFIG_SYS_FLASH_BASE
-#endif
-
-#define PIXIS_BASE             0xffdf0000      /* PIXIS registers */
-#ifdef CONFIG_PHYS_64BIT
-#define PIXIS_BASE_PHYS                0xfffdf0000ull
-#else
-#define PIXIS_BASE_PHYS                PIXIS_BASE
-#endif
-
-#define PIXIS_LBMAP_SWITCH     7
-#define PIXIS_LBMAP_MASK       0xf0
-#define PIXIS_LBMAP_SHIFT      4
-#define PIXIS_LBMAP_ALTBANK    0x40
-
-#define CONFIG_FLASH_SHOW_PROGRESS     45 /* count down from 45/5: 9..1 */
-
-/* Nand Flash */
-#ifdef CONFIG_NAND_FSL_ELBC
-#define CONFIG_SYS_NAND_BASE           0xffa00000
-#ifdef CONFIG_PHYS_64BIT
-#define CONFIG_SYS_NAND_BASE_PHYS      0xfffa00000ull
-#else
-#define CONFIG_SYS_NAND_BASE_PHYS      CONFIG_SYS_NAND_BASE
-#endif
-
-#define CONFIG_SYS_NAND_BASE_LIST     {CONFIG_SYS_NAND_BASE}
-#define CONFIG_SYS_MAX_NAND_DEVICE     1
-
-/* NAND flash config */
-#define CONFIG_SYS_NAND_BR_PRELIM  (BR_PHYS_ADDR(CONFIG_SYS_NAND_BASE_PHYS) \
-                              | (2<<BR_DECC_SHIFT)    /* Use HW ECC */ \
-                              | BR_PS_8               /* Port Size = 8 bit */ \
-                              | BR_MS_FCM             /* MSEL = FCM */ \
-                              | BR_V)                 /* valid */
-#define CONFIG_SYS_NAND_OR_PRELIM  (0xFFFC0000       /* length 256K */ \
-                              | OR_FCM_PGS            /* Large Page*/ \
-                              | OR_FCM_CSCT \
-                              | OR_FCM_CST \
-                              | OR_FCM_CHT \
-                              | OR_FCM_SCY_1 \
-                              | OR_FCM_TRLX \
-                              | OR_FCM_EHTR)
-#endif /* CONFIG_NAND_FSL_ELBC */
-
-#define CONFIG_SYS_FLASH_BANKS_LIST    {CONFIG_SYS_FLASH_BASE_PHYS + 0x8000000, CONFIG_SYS_FLASH_BASE_PHYS}
-
-#define CONFIG_HWCONFIG
-
-/* define to use L1 as initial stack */
-#define CONFIG_L1_INIT_RAM
-#define CONFIG_SYS_INIT_RAM_LOCK
-#define CONFIG_SYS_INIT_RAM_ADDR       0xfdd00000      /* Initial L1 address */
-#ifdef CONFIG_PHYS_64BIT
-#define CONFIG_SYS_INIT_RAM_ADDR_PHYS_HIGH 0xf
-#define CONFIG_SYS_INIT_RAM_ADDR_PHYS_LOW CONFIG_SYS_INIT_RAM_ADDR
-/* The assembler doesn't like typecast */
-#define CONFIG_SYS_INIT_RAM_ADDR_PHYS \
-       ((CONFIG_SYS_INIT_RAM_ADDR_PHYS_HIGH * 1ull << 32) | \
-         CONFIG_SYS_INIT_RAM_ADDR_PHYS_LOW)
-#else
-#define CONFIG_SYS_INIT_RAM_ADDR_PHYS  CONFIG_SYS_INIT_RAM_ADDR /* Initial L1 address */
-#define CONFIG_SYS_INIT_RAM_ADDR_PHYS_HIGH 0
-#define CONFIG_SYS_INIT_RAM_ADDR_PHYS_LOW CONFIG_SYS_INIT_RAM_ADDR_PHYS
-#endif
-#define CONFIG_SYS_INIT_RAM_SIZE               0x00004000      /* Size of used area in RAM */
-
-#define CONFIG_SYS_INIT_SP_OFFSET      (CONFIG_SYS_INIT_RAM_SIZE - GENERATED_GBL_DATA_SIZE)
-
-#define CONFIG_SYS_MONITOR_LEN         (768 * 1024)
-
-/* Serial Port - controlled on board with jumper J8
- * open - index 2
- * shorted - index 1
- */
-#define CONFIG_SYS_NS16550_SERIAL
-#define CONFIG_SYS_NS16550_REG_SIZE    1
-#define CONFIG_SYS_NS16550_CLK         (get_bus_freq(0)/2)
-
-#define CONFIG_SYS_BAUDRATE_TABLE      \
-       {300, 600, 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200}
-
-#define CONFIG_SYS_NS16550_COM1        (CONFIG_SYS_CCSRBAR+0x11C500)
-#define CONFIG_SYS_NS16550_COM2        (CONFIG_SYS_CCSRBAR+0x11C600)
-#define CONFIG_SYS_NS16550_COM3        (CONFIG_SYS_CCSRBAR+0x11D500)
-#define CONFIG_SYS_NS16550_COM4        (CONFIG_SYS_CCSRBAR+0x11D600)
-
-/* I2C */
-
-/*
- * RapidIO
- */
-#define CONFIG_SYS_SRIO1_MEM_VIRT      0xa0000000
-#ifdef CONFIG_PHYS_64BIT
-#define CONFIG_SYS_SRIO1_MEM_PHYS      0xc20000000ull
-#else
-#define CONFIG_SYS_SRIO1_MEM_PHYS      0xa0000000
-#endif
-#define CONFIG_SYS_SRIO1_MEM_SIZE      0x10000000      /* 256M */
-
-#define CONFIG_SYS_SRIO2_MEM_VIRT      0xb0000000
-#ifdef CONFIG_PHYS_64BIT
-#define CONFIG_SYS_SRIO2_MEM_PHYS      0xc30000000ull
-#else
-#define CONFIG_SYS_SRIO2_MEM_PHYS      0xb0000000
-#endif
-#define CONFIG_SYS_SRIO2_MEM_SIZE      0x10000000      /* 256M */
-
-/*
- * for slave u-boot IMAGE instored in master memory space,
- * PHYS must be aligned based on the SIZE
- */
-#define CONFIG_SRIO_PCIE_BOOT_IMAGE_MEM_PHYS 0xfef200000ull
-#define CONFIG_SRIO_PCIE_BOOT_IMAGE_MEM_BUS1 0xfff00000ull
-#define CONFIG_SRIO_PCIE_BOOT_IMAGE_SIZE 0x100000      /* 1M */
-#define CONFIG_SRIO_PCIE_BOOT_IMAGE_MEM_BUS2 0x3fff00000ull
-/*
- * for slave UCODE and ENV instored in master memory space,
- * PHYS must be aligned based on the SIZE
- */
-#define CONFIG_SRIO_PCIE_BOOT_UCODE_ENV_MEM_PHYS 0xfef100000ull
-#define CONFIG_SRIO_PCIE_BOOT_UCODE_ENV_MEM_BUS 0x3ffe00000ull
-#define CONFIG_SRIO_PCIE_BOOT_UCODE_ENV_SIZE 0x40000   /* 256K */
-
-/* slave core release by master*/
-#define CONFIG_SRIO_PCIE_BOOT_BRR_OFFSET 0xe00e4
-#define CONFIG_SRIO_PCIE_BOOT_RELEASE_MASK 0x00000001 /* release core 0 */
-
-/*
- * SRIO_PCIE_BOOT - SLAVE
- */
-#ifdef CONFIG_SRIO_PCIE_BOOT_SLAVE
-#define CONFIG_SYS_SRIO_PCIE_BOOT_UCODE_ENV_ADDR 0xFFE00000
-#define CONFIG_SYS_SRIO_PCIE_BOOT_UCODE_ENV_ADDR_PHYS \
-               (0x300000000ull | CONFIG_SYS_SRIO_PCIE_BOOT_UCODE_ENV_ADDR)
-#endif
-
-/*
- * eSPI - Enhanced SPI
- */
-
-/*
- * General PCI
- * Memory space is mapped 1-1, but I/O space must start from 0.
- */
-
-/* controller 1, direct to uli, tgtid 3, Base address 20000 */
-#define CONFIG_SYS_PCIE1_MEM_VIRT      0x80000000
-#define CONFIG_SYS_PCIE1_MEM_PHYS      0xc00000000ull
-#define CONFIG_SYS_PCIE1_IO_VIRT       0xf8000000
-#define CONFIG_SYS_PCIE1_IO_PHYS       0xff8000000ull
-
-/* controller 2, Slot 2, tgtid 2, Base address 201000 */
-#define CONFIG_SYS_PCIE2_MEM_VIRT      0xa0000000
-#define CONFIG_SYS_PCIE2_MEM_PHYS      0xc20000000ull
-#define CONFIG_SYS_PCIE2_IO_VIRT       0xf8010000
-#define CONFIG_SYS_PCIE2_IO_PHYS       0xff8010000ull
-
-/* controller 3, Slot 1, tgtid 1, Base address 202000 */
-#define CONFIG_SYS_PCIE3_MEM_VIRT      0xc0000000
-#define CONFIG_SYS_PCIE3_MEM_PHYS      0xc40000000ull
-#define CONFIG_SYS_PCIE3_IO_VIRT       0xf8020000
-#define CONFIG_SYS_PCIE3_IO_PHYS       0xff8020000ull
-
-/* controller 4, Base address 203000 */
-#define CONFIG_SYS_PCIE4_MEM_PHYS      0xc60000000ull
-#define CONFIG_SYS_PCIE4_IO_PHYS       0xff8030000ull
-
-/* Qman/Bman */
-#define CONFIG_SYS_BMAN_NUM_PORTALS    10
-#define CONFIG_SYS_BMAN_MEM_BASE       0xf4000000
-#ifdef CONFIG_PHYS_64BIT
-#define CONFIG_SYS_BMAN_MEM_PHYS       0xff4000000ull
-#else
-#define CONFIG_SYS_BMAN_MEM_PHYS       CONFIG_SYS_BMAN_MEM_BASE
-#endif
-#define CONFIG_SYS_BMAN_MEM_SIZE       0x00200000
-#define CONFIG_SYS_BMAN_SP_CENA_SIZE    0x4000
-#define CONFIG_SYS_BMAN_SP_CINH_SIZE    0x1000
-#define CONFIG_SYS_BMAN_CENA_BASE       CONFIG_SYS_BMAN_MEM_BASE
-#define CONFIG_SYS_BMAN_CENA_SIZE       (CONFIG_SYS_BMAN_MEM_SIZE >> 1)
-#define CONFIG_SYS_BMAN_CINH_BASE       (CONFIG_SYS_BMAN_MEM_BASE + \
-                                       CONFIG_SYS_BMAN_CENA_SIZE)
-#define CONFIG_SYS_BMAN_CINH_SIZE       (CONFIG_SYS_BMAN_MEM_SIZE >> 1)
-#define CONFIG_SYS_BMAN_SWP_ISDR_REG   0xE08
-#define CONFIG_SYS_QMAN_NUM_PORTALS    10
-#define CONFIG_SYS_QMAN_MEM_BASE       0xf4200000
-#ifdef CONFIG_PHYS_64BIT
-#define CONFIG_SYS_QMAN_MEM_PHYS       0xff4200000ull
-#else
-#define CONFIG_SYS_QMAN_MEM_PHYS       CONFIG_SYS_QMAN_MEM_BASE
-#endif
-#define CONFIG_SYS_QMAN_MEM_SIZE       0x00200000
-#define CONFIG_SYS_QMAN_SP_CENA_SIZE    0x4000
-#define CONFIG_SYS_QMAN_SP_CINH_SIZE    0x1000
-#define CONFIG_SYS_QMAN_CENA_BASE       CONFIG_SYS_QMAN_MEM_BASE
-#define CONFIG_SYS_QMAN_CENA_SIZE       (CONFIG_SYS_QMAN_MEM_SIZE >> 1)
-#define CONFIG_SYS_QMAN_CINH_BASE       (CONFIG_SYS_QMAN_MEM_BASE + \
-                                       CONFIG_SYS_QMAN_CENA_SIZE)
-#define CONFIG_SYS_QMAN_CINH_SIZE       (CONFIG_SYS_QMAN_MEM_SIZE >> 1)
-#define CONFIG_SYS_QMAN_SWP_ISDR_REG   0xE08
-
-#define CONFIG_SYS_DPAA_FMAN
-#define CONFIG_SYS_DPAA_PME
-
-#ifdef CONFIG_FMAN_ENET
-#define CONFIG_SYS_FM1_DTSEC1_PHY_ADDR 0x1c
-#define CONFIG_SYS_FM1_DTSEC2_PHY_ADDR 0x1d
-#define CONFIG_SYS_FM1_DTSEC3_PHY_ADDR 0x1e
-#define CONFIG_SYS_FM1_DTSEC4_PHY_ADDR 0x1f
-#define CONFIG_SYS_FM1_10GEC1_PHY_ADDR 4
-
-#define CONFIG_SYS_FM2_DTSEC1_PHY_ADDR 0x1c
-#define CONFIG_SYS_FM2_DTSEC2_PHY_ADDR 0x1d
-#define CONFIG_SYS_FM2_DTSEC3_PHY_ADDR 0x1e
-#define CONFIG_SYS_FM2_DTSEC4_PHY_ADDR 0x1f
-#define CONFIG_SYS_FM2_10GEC1_PHY_ADDR 0
-
-#define CONFIG_SYS_TBIPA_VALUE 8
-#endif
-
-/*
- * Environment
- */
-#define CONFIG_LOADS_ECHO              /* echo on for serial download */
-#define CONFIG_SYS_LOADS_BAUD_CHANGE   /* allow baudrate change */
-
-#ifdef CONFIG_MMC
-#define CONFIG_SYS_FSL_ESDHC_ADDR       CONFIG_SYS_MPC85xx_ESDHC_ADDR
-#endif
-
-/*
- * Miscellaneous configurable options
- */
-
-/*
- * For booting Linux, the board info and command line data
- * have to be in the first 64 MB of memory, since this is
- * the maximum mapped by the Linux kernel during initialization.
- */
-#define CONFIG_SYS_BOOTMAPSZ   (64 << 20)      /* Initial Memory map for Linux*/
-
-/*
- * Environment Configuration
- */
-#define CONFIG_ROOTPATH                "/opt/nfsroot"
-#define CONFIG_UBOOTPATH       u-boot.bin      /* U-Boot image on TFTP server */
-
-#ifdef CONFIG_TARGET_P4080DS
-#define __USB_PHY_TYPE ulpi
-#else
-#define __USB_PHY_TYPE utmi
-#endif
-
-#define        CONFIG_EXTRA_ENV_SETTINGS                               \
-       "hwconfig=fsl_ddr:ctlr_intlv=cacheline,"                \
-       "bank_intlv=cs0_cs1;"                                   \
-       "usb1:dr_mode=host,phy_type=" __stringify(__USB_PHY_TYPE) ";"\
-       "usb2:dr_mode=peripheral,phy_type=" __stringify(__USB_PHY_TYPE) "\0"\
-       "netdev=eth0\0"                                         \
-       "uboot=" __stringify(CONFIG_UBOOTPATH) "\0"             \
-       "ubootaddr=" __stringify(CONFIG_SYS_TEXT_BASE) "\0"     \
-       "tftpflash=tftpboot $loadaddr $uboot && "               \
-       "protect off $ubootaddr +$filesize && "                 \
-       "erase $ubootaddr +$filesize && "                       \
-       "cp.b $loadaddr $ubootaddr $filesize && "               \
-       "protect on $ubootaddr +$filesize && "                  \
-       "cmp.b $loadaddr $ubootaddr $filesize\0"                \
-       "consoledev=ttyS0\0"                                    \
-       "ramdiskaddr=2000000\0"                                 \
-       "ramdiskfile=p4080ds/ramdisk.uboot\0"                   \
-       "fdtaddr=1e00000\0"                                     \
-       "fdtfile=p4080ds/p4080ds.dtb\0"                         \
-       "bdev=sda3\0"
-
-#include <asm/fsl_secure_boot.h>
-
-#endif /* __CONFIG_H */
index 7942464..0f7e1c5 100644 (file)
@@ -60,7 +60,7 @@
        "fdtfile=imx6q-dhcom-pdk2.dtb\0"\
        "update_sf=" /* Erase SPI NOR and install U-Boot from SD */     \
                "load mmc 0:1 ${loadaddr} /boot/u-boot-with-spl.imx && "\
-               "sf probe && sf erase 0x0 0xa0000 && "                  \
+               "sf probe && sf erase 0x0 0x100000 && "                 \
                "sf write ${loadaddr} 0x400 ${filesize}\0"              \
        BOOTENV
 
diff --git a/include/configs/imx6ulz_smm_m2.h b/include/configs/imx6ulz_smm_m2.h
new file mode 100644 (file)
index 0000000..50885c5
--- /dev/null
@@ -0,0 +1,78 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
+/*
+ * Copyright (C) 2021 Amarula Solutions B.V.
+ *
+ */
+#ifndef __IMX6ULZ_SMM_M2_CONFIG_H
+#define __IMX6ULZ_SMM_M2_CONFIG_H
+
+#include "mx6_common.h"
+
+#include <asm/arch/imx-regs.h>
+#include <linux/sizes.h>
+#include <linux/stringify.h>
+
+/* SPL options */
+#include "imx6_spl.h"
+
+#define CONFIG_MXC_UART_BASE           UART4_BASE
+
+#ifndef CONFIG_SPL_BUILD
+
+#define BOOT_TARGET_DEVICES(func) \
+       func(NAND, nand, 0) \
+
+#include <config_distro_bootcmd.h>
+
+#endif /* !CONFIG_SPL_BUILD */
+
+#define MEM_LAYOUT_ENV_SETTINGS \
+       "scriptaddr=" __stringify(CONFIG_SYS_LOAD_ADDR) "\0" \
+       "kernel_addr_r=" __stringify(CONFIG_SYS_LOAD_ADDR) "\0" \
+       "fdt_addr_r=0x81000000\0" \
+       "fdtfile=" CONFIG_DEFAULT_FDT_FILE "\0" \
+       "bootcmd_mfg=echo Running fastboot mode; fastboot usb 0\0" \
+
+#define NANDARGS \
+       "mtdids=" CONFIG_MTDIDS_DEFAULT "\0" \
+       CONFIG_MTDPARTS_DEFAULT "\0" \
+       "nandargs=setenv bootargs " \
+               "${optargs} " \
+               "mtdparts=${mtdparts} " \
+               "root=${nandroot} " \
+               "rootfstype=${nandrootfstype}\0" \
+       "nandroot=ubi0:root rw ubi.mtd=rootfs\0" \
+       "nandrootfstype=ubifs rootwait=1\0" \
+       "nandboot=echo Booting from nand ...; " \
+               "run nandargs; " \
+               "nand read ${fdt_addr_r} nanddtb; " \
+               "nand read ${loadaddr} kernel; " \
+               "bootz ${loadaddr} - ${fdt_addr_r}\0"
+
+#define BOOTENV_DEV_NAND(devtypeu, devtypel, instance) \
+       "bootcmd_" #devtypel #instance "=" \
+       "run nandboot\0"
+
+#define BOOTENV_DEV_NAME_NAND(devtypeu, devtypel, instance) \
+       #devtypel #instance " "
+
+/* Initial environment variables */
+#define CONFIG_EXTRA_ENV_SETTINGS \
+       MEM_LAYOUT_ENV_SETTINGS \
+       NANDARGS \
+       BOOTENV
+
+/* Physical Memory Map */
+#define PHYS_SDRAM                     MMDC0_ARB_BASE_ADDR
+#define PHYS_SDRAM_SIZE                        SZ_128M
+
+#define CONFIG_SYS_SDRAM_BASE          PHYS_SDRAM
+#define CONFIG_SYS_INIT_RAM_ADDR       IRAM_BASE_ADDR
+#define CONFIG_SYS_INIT_RAM_SIZE       IRAM_SIZE
+
+/* NAND */
+#define CONFIG_SYS_MAX_NAND_DEVICE     1
+
+#define CONFIG_SYS_NAND_BASE           0x20000000
+
+#endif
diff --git a/include/configs/imxrt1170-evk.h b/include/configs/imxrt1170-evk.h
new file mode 100644 (file)
index 0000000..2459fe2
--- /dev/null
@@ -0,0 +1,29 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
+/*
+ * Copyright (C) 2022
+ * Author(s): Jesse Taube <Mr.Bossman075@gmail.com>
+ * Giulio Benetti <giulio.benetti@benettiengineering.com>
+ */
+
+#ifndef __IMXRT1170_EVK_H
+#define __IMXRT1170_EVK_H
+
+#include <asm/arch/imx-regs.h>
+
+#define ESDHCI_QUIRK_BROKEN_TIMEOUT_VALUE      1
+
+/*
+ * Configuration of the external SDRAM memory
+ */
+
+#define PHYS_SDRAM                     0x80000000
+#define PHYS_SDRAM_SIZE                        (64 * 1024 * 1024)
+
+#define DMAMEM_SZ_ALL                  (1 * 1024 * 1024)
+#define DMAMEM_BASE                    (PHYS_SDRAM + PHYS_SDRAM_SIZE - \
+                                        DMAMEM_SZ_ALL)
+/* For SPL */
+#define CONFIG_SYS_UBOOT_START         0x202403FD
+/* For SPL ends */
+
+#endif /* __IMXRT1170_EVK_H */
index 38063ba..df46e58 100644 (file)
@@ -37,8 +37,6 @@
 /* serial port */
 #define CONFIG_SYS_NS16550_CLK          (get_bus_freq(0) / 2)
 
-#define COUNTER_FREQUENCY_REAL         (get_board_sys_clk() / 4)
-
 /* SPL */
 
 #define CONFIG_SYS_MONITOR_LEN         (1024 * 1024)
diff --git a/include/configs/librem5.h b/include/configs/librem5.h
new file mode 100644 (file)
index 0000000..389469a
--- /dev/null
@@ -0,0 +1,95 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
+/*
+ * Copyright 2017 NXP
+ * Copyright 2018 Emcraft Systems
+ * Copyright 2022 Purism
+ *
+ */
+
+#ifndef __LIBREM5_H
+#define __LIBREM5_H
+
+/* #define DEBUG */
+
+#include <version.h>
+#include <linux/sizes.h>
+#include <asm/arch/imx-regs.h>
+
+#define CONFIG_SYS_MONITOR_LEN         (512 * 1024)
+
+#ifdef CONFIG_SPL_BUILD
+
+#define CONFIG_SPL_ABORT_ON_RAW_IMAGE /* For RAW image gives a error info not panic */
+
+#define CONFIG_POWER_BD71837
+#define CONFIG_POWER_BD71837_I2C_BUS   0
+#define CONFIG_POWER_BD71837_I2C_ADDR  0x4B
+
+#endif /* CONFIG_SPL_BUILD*/
+
+#define CONFIG_SYS_FSL_USDHC_NUM       2
+
+#define CONFIG_USBD_HS
+
+#define CONSOLE_ON_UART1
+
+#ifdef CONSOLE_ON_UART1
+#define CONFIG_MXC_UART_BASE           UART1_BASE_ADDR
+#define CONSOLE_UART_CLK               0
+#define CONSOLE                "ttymxc0"
+#elif defined(CONSOLE_ON_UART2)
+#define CONFIG_MXC_UART_BASE           UART2_BASE_ADDR
+#define CONSOLE_UART_CLK               1
+#define CONSOLE                "ttymxc1"
+#elif defined(CONSOLE_ON_UART3)
+#define CONFIG_MXC_UART_BASE           UART3_BASE_ADDR
+#define CONSOLE_UART_CLK               2
+#define CONSOLE                "ttymxc2"
+#elif defined(CONSOLE_ON_UART4)
+#define CONFIG_MXC_UART_BASE           UART4_BASE_ADDR
+#define CONSOLE_UART_CLK               3
+#define CONSOLE                "ttymxc3"
+#else
+#define CONFIG_MXC_UART_BASE           UART1_BASE_ADDR
+#define CONSOLE_UART_CLK               0
+#define CONSOLE                "ttymxc0"
+#endif
+
+#ifndef CONFIG_SPL_BUILD
+#define BOOT_TARGET_DEVICES(func) \
+       func(MMC, mmc, 0) \
+       func(USB, usb, 0) \
+       func(DHCP, dhcp, na)
+#include <config_distro_bootcmd.h>
+#else
+#define BOOTENV
+#endif
+
+/* Initial environment variables */
+#define CONFIG_EXTRA_ENV_SETTINGS              \
+       "scriptaddr=0x80000000\0" \
+       "pxefile_addr_r=0x80100000\0" \
+       "kernel_addr_r=0x80800000\0" \
+       "fdt_addr_r=0x84800000\0" \
+       "ramdisk_addr_r=0x85000000\0" \
+       "console=" CONSOLE ",115200\0" \
+       "bootargs=u_boot_version=" PLAIN_VERSION "\0" \
+       "stdin=usbacm,serial\0" \
+       "stdout=usbacm,serial\0" \
+       "stderr=usbacm,serial\0" \
+       BOOTENV
+
+/* Link Definitions */
+
+#define CONFIG_SYS_INIT_RAM_ADDR        0x40000000
+#define CONFIG_SYS_INIT_RAM_SIZE        0x80000
+
+#define CONFIG_SYS_SDRAM_BASE           0x40000000
+#define PHYS_SDRAM                      0x40000000
+#define PHYS_SDRAM_SIZE                        0xc0000000 /* 3GB LPDDR4 one Rank */
+
+/* Monitor Command Prompt */
+
+#define CONFIG_SYS_FSL_ESDHC_ADDR       0
+
+#endif
index 13e4fdb..d155e55 100644 (file)
 #define RST_NOR_CMD(var, ...) ""
 #endif
 
+#ifdef __SW_BOOT_NOR_BANK_LO
+#define RST_NOR_LO_CMD(var, ...) __VAR_CMD_RST(var, __VA_ARGS__ __BOOTSRC_CMD(__SW_BOOT_NOR_BANK_LO, __SW_BOOT_MASK))
+#else
+#define RST_NOR_LO_CMD(var, ...) ""
+#endif
+
+#ifdef __SW_BOOT_NOR_BANK_UP
+#define RST_NOR_UP_CMD(var, ...) __VAR_CMD_RST(var, __VA_ARGS__ __BOOTSRC_CMD(__SW_BOOT_NOR_BANK_UP, __SW_BOOT_MASK))
+#else
+#define RST_NOR_UP_CMD(var, ...) ""
+#endif
+
 #ifdef __SW_BOOT_SPI
 #define RST_SPI_CMD(var, ...) __VAR_CMD_RST(var, __VA_ARGS__ __BOOTSRC_CMD(__SW_BOOT_SPI, __SW_BOOT_MASK))
 #else
 #define RST_SD_CMD(var, ...) ""
 #endif
 
+#ifdef __SW_BOOT_SD2
+#define RST_SD2_CMD(var, ...) __VAR_CMD_RST(var, __VA_ARGS__ __BOOTSRC_CMD(__SW_BOOT_SD2, __SW_BOOT_MASK))
+#else
+#define RST_SD2_CMD(var, ...) ""
+#endif
+
 #ifdef __SW_BOOT_NAND
 #define RST_NAND_CMD(var, ...) __VAR_CMD_RST(var, __VA_ARGS__ __BOOTSRC_CMD(__SW_BOOT_NAND, __SW_BOOT_MASK))
 #else
@@ -57,3 +75,5 @@
 #else
 #define RST_PCIE_CMD(var, ...) ""
 #endif
+
+#define RST_DEF_CMD(var, ...) __VAR_CMD_RST(var, __VA_ARGS__ __BOOTSRC_CMD(0x00, 0xff))
index f7d8723..d201c72 100644 (file)
@@ -24,6 +24,9 @@
 #define __SW_NOR_BANK_MASK     0xfd
 #define __SW_NOR_BANK_UP       0x00
 #define __SW_NOR_BANK_LO       0x02
+#define __SW_BOOT_NOR_BANK_UP  0x5c /* (__SW_BOOT_NOR | __SW_NOR_BANK_UP) */
+#define __SW_BOOT_NOR_BANK_LO  0x5e /* (__SW_BOOT_NOR | __SW_NOR_BANK_LO) */
+#define __SW_BOOT_NOR_BANK_MASK        0x01 /* (__SW_BOOT_MASK & __SW_NOR_BANK_MASK) */
 #define CONFIG_SYS_L2_SIZE     (256 << 10)
 #endif
 
@@ -52,6 +55,9 @@
 #define __SW_NOR_BANK_MASK     0xfd
 #define __SW_NOR_BANK_UP       0x00
 #define __SW_NOR_BANK_LO       0x02
+#define __SW_BOOT_NOR_BANK_UP  0x64 /* (__SW_BOOT_NOR | __SW_NOR_BANK_UP) */
+#define __SW_BOOT_NOR_BANK_LO  0x66 /* (__SW_BOOT_NOR | __SW_NOR_BANK_LO) */
+#define __SW_BOOT_NOR_BANK_MASK        0x01 /* (__SW_BOOT_MASK & __SW_NOR_BANK_MASK) */
 #define CONFIG_SYS_L2_SIZE     (256 << 10)
 /*
  * Dynamic MTD Partition support with mtdparts
@@ -70,6 +76,9 @@
 #define __SW_NOR_BANK_MASK     0xfd
 #define __SW_NOR_BANK_UP       0x00
 #define __SW_NOR_BANK_LO       0x02
+#define __SW_BOOT_NOR_BANK_UP  0xc8 /* (__SW_BOOT_NOR | __SW_NOR_BANK_UP) */
+#define __SW_BOOT_NOR_BANK_LO  0xca /* (__SW_BOOT_NOR | __SW_NOR_BANK_LO) */
+#define __SW_BOOT_NOR_BANK_MASK        0x01 /* (__SW_BOOT_MASK & __SW_NOR_BANK_MASK) */
 #define CONFIG_SYS_L2_SIZE     (512 << 10)
 /*
  * Dynamic MTD Partition support with mtdparts
 #define CONFIG_SYS_MMC_U_BOOT_SIZE     (768 << 10)
 #define CONFIG_SYS_MMC_U_BOOT_DST      CONFIG_SYS_TEXT_BASE
 #define CONFIG_SYS_MMC_U_BOOT_START    CONFIG_SYS_TEXT_BASE
+#ifdef CONFIG_FSL_PREPBL_ESDHC_BOOT_SECTOR
+#define CONFIG_SYS_MMC_U_BOOT_OFFS     (CONFIG_SPL_PAD_TO - CONFIG_FSL_PREPBL_ESDHC_BOOT_SECTOR_DATA*512)
+#else
 #define CONFIG_SYS_MMC_U_BOOT_OFFS     CONFIG_SPL_PAD_TO
+#endif
 #elif defined(CONFIG_SPIFLASH)
 #define CONFIG_SYS_SPI_FLASH_U_BOOT_SIZE       (768 << 10)
 #define CONFIG_SYS_SPI_FLASH_U_BOOT_DST                CONFIG_SYS_TEXT_BASE
@@ -465,10 +478,14 @@ __VSCFW_ADDR      \
 MAP_NOR_LO_CMD(map_lowernorbank) \
 MAP_NOR_UP_CMD(map_uppernorbank) \
 RST_NOR_CMD(norboot) \
+RST_NOR_LO_CMD(norlowerboot) \
+RST_NOR_UP_CMD(norupperboot) \
 RST_SPI_CMD(spiboot) \
 RST_SD_CMD(sdboot) \
+RST_SD2_CMD(sd2boot) \
 RST_NAND_CMD(nandboot) \
 RST_PCIE_CMD(pciboot) \
+RST_DEF_CMD(defboot) \
 ""
 
 #define CONFIG_USB_FAT_BOOT    \
index b1a011b..1e966a2 100644 (file)
@@ -14,7 +14,7 @@
 #define CONFIG_SYS_SDRAM_BASE          PHYS_SDRAM_1
 #define PHYS_SDRAM_1_SIZE              0x3E000000
 
-#define CONFIG_SYS_HZ_CLOCK            1000000000      /* 1 GHz */
+#define CONFIG_SYS_HZ_CLOCK            750000000       /* 750 MHz */
 
 /* Environment */
 
index b8ff705..f549f9f 100644 (file)
@@ -36,6 +36,7 @@
        "bootm 0x5800000"
 
 #define CONFIG_EXTRA_ENV_SETTINGS                              \
+       "fdt_addr=0x4c00000\0"                                  \
        "scriptaddr=0x4d00000\0"                                \
        "pxefile_addr_r=0x4e00000\0"                            \
        "fdt_addr_r=0x4f00000\0"                                \
index 5b5fce9..4d20b86 100644 (file)
 #endif
 
 #define MEM_LAYOUT_ENV_SETTINGS \
-       "fdt_addr_r=0x44000000\0" \
-       "kernel_addr_r=0x42000000\0" \
-       "ramdisk_addr_r=0x46400000\0" \
-       "scriptaddr=0x46000000\0"
+       "fdt_addr_r=0x50200000\0" \
+       "kernel_addr_r=" __stringify(CONFIG_SYS_LOAD_ADDR) "\0" \
+       "kernel_comp_addr_r=0x40200000\0" \
+       "kernel_comp_size=0x08080000\0" \
+       "ramdisk_addr_r=0x50300000\0" \
+       "scriptaddr=0x50280000\0"
 
 /* Enable Distro Boot */
 #define BOOT_TARGET_DEVICES(func) \
index fca40be..9b8db22 100644 (file)
 #endif /* CONFIG_CMD_NET */
 
 #define MEM_LAYOUT_ENV_SETTINGS \
-       "fdt_addr_r=0x43000000\0" \
-       "kernel_addr_r=0x40000000\0" \
-       "ramdisk_addr_r=0x46400000\0" \
-       "scriptaddr=0x46000000\0"
+       "fdt_addr_r=0x50200000\0" \
+       "kernel_addr_r=" __stringify(CONFIG_SYS_LOAD_ADDR) "\0" \
+       "kernel_comp_addr_r=0x40200000\0" \
+       "kernel_comp_size=0x08080000\0" \
+       "ramdisk_addr_r=0x50300000\0" \
+       "scriptaddr=0x50280000\0"
 
 /* Enable Distro Boot */
 #define BOOT_TARGET_DEVICES(func) \
diff --git a/include/dt-bindings/clock/imxrt1170-clock.h b/include/dt-bindings/clock/imxrt1170-clock.h
new file mode 100644 (file)
index 0000000..8ab8018
--- /dev/null
@@ -0,0 +1,48 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
+/*
+ * Copyright (C) 2022
+ * Author(s): Jesse Taube <Mr.Bossman075@gmail.com>
+ */
+
+#ifndef __DT_BINDINGS_CLOCK_IMXRT1170_H
+#define __DT_BINDINGS_CLOCK_IMXRT1170_H
+
+#define IMXRT1170_CLK_DUMMY                    0
+#define IMXRT1170_CLK_OSC                      1
+#define IMXRT1170_CLK_OSC_32K                  2
+#define IMXRT1170_CLK_RCOSC_16M                        3
+#define IMXRT1170_CLK_RCOSC_48M                        4
+#define IMXRT1170_CLK_RCOSC_48M_DIV2           5
+#define IMXRT1170_CLK_RCOSC_400M               6
+#define IMXRT1170_CLK_PLL_ARM                  7
+#define IMXRT1170_CLK_PLL_AUDIO                        8
+#define IMXRT1170_CLK_PLL_VIDEO                        9
+#define IMXRT1170_CLK_PLL1                     10
+#define IMXRT1170_CLK_PLL1_DIV2                        11
+#define IMXRT1170_CLK_PLL1_DIV5                        12
+#define IMXRT1170_CLK_PLL2                     13
+#define IMXRT1170_CLK_PLL2_PFD0                        14
+#define IMXRT1170_CLK_PLL2_PFD1                        15
+#define IMXRT1170_CLK_PLL2_PFD2                        16
+#define IMXRT1170_CLK_PLL2_PFD3                        17
+#define IMXRT1170_CLK_PLL3                     18
+#define IMXRT1170_CLK_PLL3_DIV2                        19
+#define IMXRT1170_CLK_PLL3_PFD0                        20
+#define IMXRT1170_CLK_PLL3_PFD1                        21
+#define IMXRT1170_CLK_PLL3_PFD2                        22
+#define IMXRT1170_CLK_PLL3_PFD3                        23
+#define IMXRT1170_CLK_M7                       24
+#define IMXRT1170_CLK_M4                       25
+#define IMXRT1170_CLK_BUS                      26
+#define IMXRT1170_CLK_BUS_LPSR                 27
+#define IMXRT1170_CLK_LPUART1_SEL              28
+#define IMXRT1170_CLK_LPUART1                  29
+#define IMXRT1170_CLK_USDHC1_SEL               30
+#define IMXRT1170_CLK_USDHC1                   31
+#define IMXRT1170_CLK_GPT1_SEL                 32
+#define IMXRT1170_CLK_GPT1                     33
+#define IMXRT1170_CLK_SEMC_SEL                 34
+#define IMXRT1170_CLK_SEMC                     35
+#define IMXRT1170_CLK_END                      36
+
+#endif /* __DT_BINDINGS_CLOCK_IMXRT1170_H */
index c122478..672bdad 100644 (file)
@@ -1,10 +1,9 @@
-/* SPDX-License-Identifier: GPL-2.0 OR MIT */
+/* SPDX-License-Identifier: (GPL-2.0 OR MIT) */
 /*
- * Copyright (C) 2020-2021 SiFive, Inc.
+ * Copyright (C) 2019 SiFive, Inc.
  * Wesley Terpstra
  * Paul Walmsley
  * Zong Li
- * Pragnesh Patel
  */
 
 #ifndef __DT_BINDINGS_CLOCK_SIFIVE_FU740_PRCI_H
 
 /* Clock indexes for use by Device Tree data and the PRCI driver */
 
-#define PRCI_CLK_COREPLL       0
-#define PRCI_CLK_DDRPLL                1
-#define PRCI_CLK_GEMGXLPLL     2
-#define PRCI_CLK_DVFSCOREPLL   3
-#define PRCI_CLK_HFPCLKPLL     4
-#define PRCI_CLK_CLTXPLL       5
-#define PRCI_CLK_TLCLK         6
-#define PRCI_CLK_PCLK          7
-#define PRCI_CLK_PCIEAUX       8
+#define FU740_PRCI_CLK_COREPLL         0
+#define FU740_PRCI_CLK_DDRPLL          1
+#define FU740_PRCI_CLK_GEMGXLPLL       2
+#define FU740_PRCI_CLK_DVFSCOREPLL     3
+#define FU740_PRCI_CLK_HFPCLKPLL       4
+#define FU740_PRCI_CLK_CLTXPLL         5
+#define FU740_PRCI_CLK_TLCLK           6
+#define FU740_PRCI_CLK_PCLK            7
+#define FU740_PRCI_CLK_PCIE_AUX                8
 
-#endif
+#endif /* __DT_BINDINGS_CLOCK_SIFIVE_FU740_PRCI_H */
index acb35bc..4b3b0c2 100644 (file)
@@ -82,6 +82,7 @@
 
 #define MEM_WIDTH_8BITS                0x0
 #define MEM_WIDTH_16BITS       0x1
+#define MEM_WIDTH_32BITS       0x2
 
 #define BL_1                   0x0
 #define BL_2                   0x1
index 83c0108..9bb0d44 100644 (file)
@@ -226,6 +226,22 @@ enum efi_reset_type {
        EFI_GUID(0x6dcbd5ed, 0xe82d, 0x4c44, 0xbd, 0xa1, \
                 0x71, 0x94, 0x19, 0x9a, 0xd9, 0x2a)
 
+#define EFI_CONFORMANCE_PROFILES_TABLE_GUID \
+       EFI_GUID(0x36122546, 0xf7ef, 0x4c8f, 0xbd, 0x9b, \
+                0xeb, 0x85, 0x25, 0xb5, 0x0c, 0x0b)
+
+#define EFI_CONFORMANCE_PROFILES_TABLE_VERSION 1
+
+#define EFI_CONFORMANCE_PROFILE_EBBR_2_0_GUID \
+       EFI_GUID(0xcce33c35, 0x74ac, 0x4087, 0xbc, 0xe7, \
+                0x8b, 0x29, 0xb0, 0x2e, 0xeb, 0x27)
+
+struct efi_conformance_profiles_table {
+       u16 version;
+       u16 number_of_profiles;
+       efi_guid_t      conformance_profiles[];
+} __packed;
+
 struct efi_capsule_header {
        efi_guid_t capsule_guid;
        u32 header_size;
index fb35087..7554f3b 100644 (file)
@@ -544,8 +544,10 @@ void efi_carve_out_dt_rsv(void *fdt);
 void efi_try_purge_kaslr_seed(void *fdt);
 /* Called by bootefi to make console interface available */
 efi_status_t efi_console_register(void);
-/* Called by efi_init_obj_list() to initialize efi_disks */
+/* Called by efi_init_early() to add block devices when probed */
 efi_status_t efi_disk_init(void);
+/* Called by efi_init_obj_list() to proble all block devices */
+efi_status_t efi_disks_register(void);
 /* Called by efi_init_obj_list() to install EFI_RNG_PROTOCOL */
 efi_status_t efi_rng_register(void);
 /* Called by efi_init_obj_list() to install EFI_TCG2_PROTOCOL */
@@ -1080,6 +1082,13 @@ extern u8 num_image_type_guids;
 efi_status_t efi_esrt_register(void);
 
 /**
+ * efi_ecpt_register() - Install the ECPT system table.
+ *
+ * Return: status code
+ */
+efi_status_t efi_ecpt_register(void);
+
+/**
  * efi_esrt_populate() - Populates the ESRT entries from the FMP instances
  * present in the system.
  * If an ESRT already exists, the old ESRT is replaced in the system table.
index 5340cef..e900cb8 100644 (file)
@@ -18,6 +18,9 @@
 #define EFI_ST_FAILURE 1
 #define EFI_ST_SUCCESS_STR u"SUCCESS"
 
+extern const struct efi_system_table *st_systable;
+extern const struct efi_boot_services *st_boottime;
+
 /**
  * efi_st_printf() - print a message
  *
@@ -131,6 +134,14 @@ u16 *efi_st_translate_code(u16 code);
 int efi_st_strcmp_16_8(const u16 *buf1, const char *buf2);
 
 /**
+ * efi_st_get_config_table() - get configuration table
+ *
+ * @guid:      GUID of the configuration table
+ * Return:     pointer to configuration table or NULL
+ */
+void *efi_st_get_config_table(const efi_guid_t *guid);
+
+/**
  * efi_st_get_key() - reads an Unicode character from the input device
  *
  * Return:     Unicode character
index ac76939..b838071 100644 (file)
@@ -11,6 +11,7 @@
 
 #include <asm/u-boot.h>
 #include <linux/libfdt.h>
+#include <abuf.h>
 
 /**
  * arch_fixup_fdt() - Write arch-specific information to fdt
@@ -187,6 +188,18 @@ int fdt_find_or_add_subnode(void *fdt, int parentoffset, const char *name);
 int ft_board_setup(void *blob, struct bd_info *bd);
 
 /**
+ * board_rng_seed() - Provide a seed to be passed via /chosen/rng-seed
+ *
+ * This function is called if CONFIG_BOARD_RNG_SEED is set, and must
+ * be provided by the board. It should return, via @buf, some suitable
+ * seed value to pass to the kernel.
+ *
+ * @param buf         A struct abuf for returning the seed and its size.
+ * @return            0 if ok, negative on error.
+ */
+int board_rng_seed(struct abuf *buf);
+
+/**
  * board_fdt_chosen_bootargs() - Arbitrarily amend fdt kernel command line
  *
  * This is used for late modification of kernel command line arguments just
index 2195dc1..8370d88 100644 (file)
@@ -46,7 +46,7 @@ int do_fat_fsload(struct cmd_tbl *cmdtp, int flag, int argc,
 int do_ext2load(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]);
 
 /*
- * Tell the fs layer which block device an partition to use for future
+ * Tell the fs layer which block device and partition to use for future
  * commands. This also internally identifies the filesystem that is present
  * within the partition. The identification process may be limited to a
  * specific filesystem type by passing FS_* in the fstype parameter.
index a148073..03424f0 100644 (file)
@@ -1020,6 +1020,76 @@ int fit_image_get_data_size_unciphered(const void *fit, int noffset,
 int fit_image_get_data_and_size(const void *fit, int noffset,
                                const void **data, size_t *size);
 
+/**
+ * fit_get_data_node() - Get verified image data for an image
+ * @fit: Pointer to the FIT format image header
+ * @image_uname: The name of the image node
+ * @data: A pointer which will be filled with the location of the image data
+ * @size: A pointer which will be filled with the size of the image data
+ *
+ * This function looks up the location and size of an image specified by its
+ * name. For example, if you had a FIT like::
+ *
+ *     images {
+ *         my-firmware {
+ *             ...
+ *        };
+ *      };
+ *
+ * Then you could look up the data location and size of the my-firmware image
+ * by calling this function with @image_uname set to "my-firmware". This
+ * function also verifies the image data (if enabled) before returning. The
+ * image description is printed out on success. @data and @size will not be
+ * modified on faulure.
+ *
+ * Return:
+ * * 0 on success
+ * * -EINVAL if the image could not be verified
+ * * -ENOENT if there was a problem getting the data/size
+ * * Another negative error if there was a problem looking up the image node.
+ */
+int fit_get_data_node(const void *fit, const char *image_uname,
+                     const void **data, size_t *size);
+
+/**
+ * fit_get_data_conf_prop() - Get verified image data for a property in /conf
+ * @fit: Pointer to the FIT format image header
+ * @prop_name: The name of the property in /conf referencing the image
+ * @data: A pointer which will be filled with the location of the image data
+ * @size: A pointer which will be filled with the size of the image data
+ *
+ * This function looks up the location and size of an image specified by a
+ * property in /conf. For example, if you had a FIT like::
+ *
+ *     images {
+ *         my-firmware {
+ *             ...
+ *        };
+ *      };
+ *
+ *      configurations {
+ *          default = "conf-1";
+ *          conf-1 {
+ *              some-firmware = "my-firmware";
+ *          };
+ *      };
+ *
+ * Then you could look up the data location and size of the my-firmware image
+ * by calling this function with @prop_name set to "some-firmware". This
+ * function also verifies the image data (if enabled) before returning. The
+ * image description is printed out on success. @data and @size will not be
+ * modified on faulure.
+ *
+ * Return:
+ * * 0 on success
+ * * -EINVAL if the image could not be verified
+ * * -ENOENT if there was a problem getting the data/size
+ * * Another negative error if there was a problem looking up the configuration
+ *   or image node.
+ */
+int fit_get_data_conf_prop(const void *fit, const char *prop_name,
+                          const void **data, size_t *size);
+
 int fit_image_hash_get_algo(const void *fit, int noffset, const char **algo);
 int fit_image_hash_get_value(const void *fit, int noffset, uint8_t **value,
                                int *value_len);
index a28629e..b2c5404 100644 (file)
@@ -120,6 +120,16 @@ struct tpm_ops {
        int (*get_desc)(struct udevice *dev, char *buf, int size);
 
        /**
+        * report_state() - Collect information about the current TPM state
+        *
+        * @dev:        Device to check
+        * @buf:        Buffer to put the string
+        * @size:       Maximum size of buffer
+        * Return: return code of the operation (0 = success)
+        */
+       int (*report_state)(struct udevice *dev, char *buf, int size);
+
+       /**
         * send() - send data to the TPM
         *
         * @dev:        Device to talk to
@@ -235,6 +245,16 @@ u32 tpm_clear_and_reenable(struct udevice *dev);
 int tpm_get_desc(struct udevice *dev, char *buf, int size);
 
 /**
+ * tpm_report_state() - Collect information about the current TPM state
+ *
+ * @dev:       Device to check
+ * @buf:       Buffer to put the string
+ * @size:      Maximum size of buffer
+ * Return: return code of the operation (0 = success)
+ */
+int tpm_report_state(struct udevice *dev, char *buf, int size);
+
+/**
  * tpm_xfer() - send data to the TPM and get response
  *
  * This first uses the device's send() method to send the bytes. Then it calls
index e79c90b..737e575 100644 (file)
@@ -658,4 +658,34 @@ u32 tpm2_disable_platform_hierarchy(struct udevice *dev);
 u32 tpm2_submit_command(struct udevice *dev, const u8 *sendbuf,
                        u8 *recvbuf, size_t *recv_size);
 
+/**
+ * tpm_cr50_report_state() - Report the Cr50 internal state
+ *
+ * @dev:       TPM device
+ * @vendor_cmd:        Vendor command number to send
+ * @vendor_subcmd: Vendor sub-command number to send
+ * @recvbuf:   Buffer to save the response to
+ * @recv_size: Pointer to the size of the response buffer
+ * Return: result of the operation
+ */
+u32 tpm2_report_state(struct udevice *dev, uint vendor_cmd, uint vendor_subcmd,
+                     u8 *recvbuf, size_t *recv_size);
+
+/**
+ * tpm2_enable_nvcommits() - Tell TPM to commit NV data immediately
+ *
+ * For Chromium OS verified boot, we may reboot or reset at different times,
+ * possibly leaving non-volatile data unwritten by the TPM.
+ *
+ * This vendor command is used to indicate that non-volatile data should be
+ * written to its store immediately.
+ *
+ * @dev                TPM device
+ * @vendor_cmd:        Vendor command number to send
+ * @vendor_subcmd: Vendor sub-command number to send
+ * Return: result of the operation
+ */
+u32 tpm2_enable_nvcommits(struct udevice *dev, uint vendor_cmd,
+                         uint vendor_subcmd);
+
 #endif /* __TPM_V2_H */
index 11aa14e..8979d9d 100644 (file)
@@ -81,14 +81,16 @@ u32 tpm_nv_write_value(struct udevice *dev, u32 index, const void *data,
  *
  * @param dev          TPM device
  * @param index                index of the PCR
- * @param in_digest    160-bit value representing the event to be
+ * @param in_digest    160/256-bit value representing the event to be
  *                     recorded
- * @param out_digest   160-bit PCR value after execution of the
+ * @param size         size of digest in bytes
+ * @param out_digest   160/256-bit PCR value after execution of the
  *                     command
+ * @param name         digest source, used for log output
  * Return: return code of the operation
  */
 u32 tpm_pcr_extend(struct udevice *dev, u32 index, const void *in_digest,
-                  void *out_digest);
+                  uint size, void *out_digest, const char *name);
 
 /**
  * Issue a TPM_PCRRead command.
index b01ce89..74dd003 100644 (file)
@@ -71,6 +71,15 @@ static efi_status_t EFIAPI efi_uc_supported(
        EFI_ENTRY("%p, %p, %ls", this, controller_handle,
                  efi_dp_str(remaining_device_path));
 
+       /*
+        * U-Boot internal devices install protocols interfaces without calling
+        * ConnectController(). Hence we should not bind an extra driver.
+        */
+       if (controller_handle->dev) {
+               ret = EFI_UNSUPPORTED;
+               goto out;
+       }
+
        ret = EFI_CALL(systab.boottime->open_protocol(
                        controller_handle, bp->ops->protocol,
                        &interface, this->driver_binding_handle,
index 476a22d..41756ea 100644 (file)
@@ -384,6 +384,23 @@ config EFI_ESRT
        help
          Enabling this option creates the ESRT UEFI system table.
 
+config EFI_ECPT
+       bool "Enable the UEFI ECPT generation"
+       default y
+       help
+         Enabling this option created the ECPT UEFI table.
+
+config EFI_EBBR_2_0_CONFORMANCE
+       bool "Add the EBBRv2.0 conformance entry to the ECPT table"
+       depends on EFI_ECPT
+       depends on EFI_LOADER_HII
+       depends on EFI_RISCV_BOOT_PROTOCOL || !RISCV
+       depends on EFI_RNG_PROTOCOL || !DM_RNG
+       depends on EFI_UNICODE_COLLATION_PROTOCOL2
+       default y
+       help
+         Enabling this option adds the EBBRv2.0 conformance entry to the ECPT UEFI table.
+
 config EFI_RISCV_BOOT_PROTOCOL
        bool "RISCV_EFI_BOOT_PROTOCOL support"
        default y
index f54c244..e187d2a 100644 (file)
@@ -76,6 +76,7 @@ obj-$(CONFIG_EFI_TCG2_PROTOCOL) += efi_tcg2.o
 obj-$(CONFIG_EFI_RISCV_BOOT_PROTOCOL) += efi_riscv.o
 obj-$(CONFIG_EFI_LOAD_FILE2_INITRD) += efi_load_initrd.o
 obj-$(CONFIG_EFI_SIGNATURE_SUPPORT) += efi_signature.o
+obj-$(CONFIG_EFI_ECPT) += efi_conformance.o
 
 EFI_VAR_SEED_FILE := $(subst $\",,$(CONFIG_EFI_VAR_SEED_FILE))
 $(obj)/efi_var_seed.o: $(srctree)/$(EFI_VAR_SEED_FILE)
index 8da3bb2..1bfd094 100644 (file)
@@ -619,9 +619,14 @@ efi_status_t efi_remove_all_protocols(const efi_handle_t handle)
  */
 void efi_delete_handle(efi_handle_t handle)
 {
-       if (!handle)
+       efi_status_t ret;
+
+       ret = efi_remove_all_protocols(handle);
+       if (ret == EFI_INVALID_PARAMETER) {
+               log_err("Can't remove invalid handle %p\n", handle);
                return;
-       efi_remove_all_protocols(handle);
+       }
+
        list_del(&handle->link);
        free(handle);
 }
diff --git a/lib/efi_loader/efi_conformance.c b/lib/efi_loader/efi_conformance.c
new file mode 100644 (file)
index 0000000..a49aae9
--- /dev/null
@@ -0,0 +1,60 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ *  EFI conformance profile table
+ *
+ *  Copyright (C) 2022 Arm Ltd.
+ */
+
+#include <common.h>
+#include <efi_loader.h>
+#include <log.h>
+#include <efi_api.h>
+#include <malloc.h>
+
+static const efi_guid_t efi_ecpt_guid = EFI_CONFORMANCE_PROFILES_TABLE_GUID;
+static const efi_guid_t efi_ebbr_2_0_guid =
+       EFI_CONFORMANCE_PROFILE_EBBR_2_0_GUID;
+
+/**
+ * efi_ecpt_register() - Install the ECPT system table.
+ *
+ * Return: status code
+ */
+efi_status_t efi_ecpt_register(void)
+{
+       int num_entries = 0;
+       struct efi_conformance_profiles_table *ecpt;
+       efi_status_t ret;
+       size_t ecpt_size;
+
+       ecpt_size = num_entries * sizeof(efi_guid_t)
+               + sizeof(struct efi_conformance_profiles_table);
+       ret = efi_allocate_pool(EFI_BOOT_SERVICES_DATA, ecpt_size,
+                               (void **)&ecpt);
+
+       if (ret != EFI_SUCCESS) {
+               log_err("Out of memory\n");
+
+               return ret;
+       }
+
+       if (CONFIG_IS_ENABLED(EFI_EBBR_2_0_CONFORMANCE))
+               guidcpy(&ecpt->conformance_profiles[num_entries++],
+                       &efi_ebbr_2_0_guid);
+
+       ecpt->version = EFI_CONFORMANCE_PROFILES_TABLE_VERSION;
+       ecpt->number_of_profiles = num_entries;
+
+       /* Install the ECPT in the system configuration table. */
+       ret = efi_install_configuration_table(&efi_ecpt_guid, (void *)ecpt);
+       if (ret != EFI_SUCCESS) {
+               log_err("Failed to install ECPT\n");
+               efi_free_pool(ecpt);
+
+               return ret;
+       }
+
+       log_debug("ECPT created\n");
+
+       return EFI_SUCCESS;
+}
index 5be509f..cf9fbd9 100644 (file)
@@ -988,12 +988,14 @@ static efi_status_t EFIAPI efi_cin_read_key_stroke_ex(
        efi_cin_check();
 
        if (!key_available) {
+               memset(key_data, 0, sizeof(struct efi_key_data));
                ret = EFI_NOT_READY;
                goto out;
        }
        /*
         * CTRL+A - CTRL+Z have to be signaled as a - z.
         * SHIFT+CTRL+A - SHIFT+CTRL+Z have to be signaled as A - Z.
+        * CTRL+\ - CTRL+_ have to be signaled as \ - _.
         */
        switch (next_key.key.unicode_char) {
        case 0x01 ... 0x07:
@@ -1006,6 +1008,9 @@ static efi_status_t EFIAPI efi_cin_read_key_stroke_ex(
                        next_key.key.unicode_char += 0x40;
                else
                        next_key.key.unicode_char += 0x60;
+               break;
+       case 0x1c ... 0x1f:
+                       next_key.key.unicode_char += 0x40;
        }
        *key_data = next_key;
        key_available = false;
index 6c428ee..9062058 100644 (file)
@@ -190,13 +190,14 @@ static char *dp_msging(char *s, struct efi_device_path *dp)
                struct efi_device_path_nvme *ndp =
                        (struct efi_device_path_nvme *)dp;
                u32 ns_id;
-               int i;
 
                memcpy(&ns_id, &ndp->ns_id, sizeof(ns_id));
                s += sprintf(s, "NVMe(0x%x,", ns_id);
-               for (i = 0; i < sizeof(ndp->eui64); ++i)
+
+               /* Display byte 7 first, byte 0 last */
+               for (int i = 0; i < 8; ++i)
                        s += sprintf(s, "%s%02x", i ? "-" : "",
-                                    ndp->eui64[i]);
+                                    ndp->eui64[i ^ 7]);
                s += sprintf(s, ")");
 
                break;
index 819dcb4..e39968a 100644 (file)
@@ -810,3 +810,20 @@ efi_status_t efi_disk_get_device_name(const efi_handle_t handle, char *buf, int
 
        return EFI_SUCCESS;
 }
+
+/**
+ * efi_disks_register() - ensure all block devices are available in UEFI
+ *
+ * The function probes all block devices. As we store UEFI variables on the
+ * EFI system partition this function has to be called before enabling
+ * variable services.
+ */
+efi_status_t efi_disks_register(void)
+{
+       struct udevice *dev;
+
+       uclass_foreach_dev_probe(UCLASS_BLK, dev) {
+       }
+
+       return EFI_SUCCESS;
+}
index 751beda..c633fcd 100644 (file)
@@ -246,6 +246,14 @@ efi_status_t efi_init_obj_list(void)
        /* Set up console modes */
        efi_setup_console_size();
 
+       /*
+        * Probe block devices to find the ESP.
+        * efi_disks_register() must be called before efi_init_variables().
+        */
+       ret = efi_disks_register();
+       if (ret != EFI_SUCCESS)
+               goto out;
+
        /* Initialize variable services */
        ret = efi_init_variables();
        if (ret != EFI_SUCCESS)
@@ -266,6 +274,12 @@ efi_status_t efi_init_obj_list(void)
        if (ret != EFI_SUCCESS)
                goto out;
 
+       if (IS_ENABLED(CONFIG_EFI_ECPT)) {
+               ret = efi_ecpt_register();
+               if (ret != EFI_SUCCESS)
+                       goto out;
+       }
+
        if (IS_ENABLED(CONFIG_EFI_ESRT)) {
                ret = efi_esrt_register();
                if (ret != EFI_SUCCESS)
index 10666dc..d565f32 100644 (file)
@@ -29,24 +29,66 @@ static struct efi_system_table *systable;
 static struct efi_boot_services *boottime;
 static struct efi_simple_text_output_protocol *con_out;
 
+/*
+ * Print an unsigned 32bit value as decimal number to an u16 string
+ *
+ * @value:     value to be printed
+ * @buf:       pointer to buffer address
+ *             on return position of terminating zero word
+ */
+static void uint2dec(u32 value, u16 **buf)
+{
+       u16 *pos = *buf;
+       int i;
+       u16 c;
+       u64 f;
+
+       /*
+        * Increment by .5 and multiply with
+        * (2 << 60) / 1,000,000,000 = 0x44B82FA0.9B5A52CC
+        * to move the first digit to bit 60-63.
+        */
+       f = 0x225C17D0;
+       f += (0x9B5A52DULL * value) >> 28;
+       f += 0x44B82FA0ULL * value;
+
+       for (i = 0; i < 10; ++i) {
+               /* Write current digit */
+               c = f >> 60;
+               if (c || pos != *buf)
+                       *pos++ = c + '0';
+               /* Eliminate current digit */
+               f &= 0xfffffffffffffff;
+               /* Get next digit */
+               f *= 0xaULL;
+       }
+       if (pos == *buf)
+               *pos++ = '0';
+       *pos = 0;
+       *buf = pos;
+}
+
 /**
  * print_uefi_revision() - print UEFI revision number
  */
 static void print_uefi_revision(void)
 {
-       u16 rev[] = u"0.0.0";
-
-       rev[0] = (systable->hdr.revision >> 16) + '0';
-       rev[4] = systable->hdr.revision & 0xffff;
-       for (; rev[4] >= 10;) {
-               rev[4] -= 10;
-               ++rev[2];
+       u16 rev[13] = {0};
+       u16 *buf = rev;
+       u16 digit;
+
+       uint2dec(systable->hdr.revision >> 16, &buf);
+       *buf++ = '.';
+       uint2dec(systable->hdr.revision & 0xffff, &buf);
+
+       /* Minor revision is only to be shown if non-zero */
+       digit = *--buf;
+       if (digit == '0') {
+               *buf = 0;
+       } else {
+               *buf++ = '.';
+               *buf = digit;
        }
-       /* Third digit is only to be shown if non-zero */
-       if (rev[4])
-               rev[4] += '0';
-       else
-               rev[3] = 0;
 
        con_out->output_string(con_out, u"Running on UEFI ");
        con_out->output_string(con_out, rev);
index 33536c9..daac6c3 100644 (file)
@@ -49,6 +49,7 @@ efi_selftest_variables.o \
 efi_selftest_variables_runtime.o \
 efi_selftest_watchdog.o
 
+obj-$(CONFIG_EFI_ECPT) += efi_selftest_ecpt.o
 obj-$(CONFIG_NET) += efi_selftest_snp.o
 
 obj-$(CONFIG_EFI_DEVICE_PATH_TO_TEXT) += efi_selftest_devicepath.o
index 8e427b9..191da7f 100644 (file)
@@ -14,8 +14,8 @@
 #define EFI_ST_EXECUTE 2
 #define EFI_ST_TEARDOWN        4
 
-static const struct efi_system_table *systable;
-static const struct efi_boot_services *boottime;
+const struct efi_system_table *st_systable;
+const struct efi_boot_services *st_boottime;
 static const struct efi_runtime_services *runtime;
 static efi_handle_t handle;
 static u16 reset_message[] = u"Selftest completed";
@@ -41,7 +41,7 @@ void efi_st_exit_boot_services(void)
        /* Do not detach devices in ExitBootServices. We need the console. */
        efi_st_keep_devices = true;
 
-       ret = boottime->get_memory_map(&map_size, NULL, &map_key, &desc_size,
+       ret = st_boottime->get_memory_map(&map_size, NULL, &map_key, &desc_size,
                                       &desc_version);
        if (ret != EFI_BUFFER_TOO_SMALL) {
                efi_st_error(
@@ -50,19 +50,19 @@ void efi_st_exit_boot_services(void)
        }
        /* Allocate extra space for newly allocated memory */
        map_size += sizeof(struct efi_mem_desc);
-       ret = boottime->allocate_pool(EFI_BOOT_SERVICES_DATA, map_size,
+       ret = st_boottime->allocate_pool(EFI_BOOT_SERVICES_DATA, map_size,
                                      (void **)&memory_map);
        if (ret != EFI_SUCCESS) {
                efi_st_error("AllocatePool did not return EFI_SUCCESS\n");
                return;
        }
-       ret = boottime->get_memory_map(&map_size, memory_map, &map_key,
+       ret = st_boottime->get_memory_map(&map_size, memory_map, &map_key,
                                       &desc_size, &desc_version);
        if (ret != EFI_SUCCESS) {
                efi_st_error("GetMemoryMap did not return EFI_SUCCESS\n");
                return;
        }
-       ret = boottime->exit_boot_services(handle, map_key);
+       ret = st_boottime->exit_boot_services(handle, map_key);
        if (ret != EFI_SUCCESS) {
                efi_st_error("ExitBootServices did not return EFI_SUCCESS\n");
                return;
@@ -84,7 +84,7 @@ static int setup(struct efi_unit_test *test, unsigned int *failures)
        if (!test->setup)
                return EFI_ST_SUCCESS;
        efi_st_printc(EFI_LIGHTBLUE, "\nSetting up '%s'\n", test->name);
-       ret = test->setup(handle, systable);
+       ret = test->setup(handle, st_systable);
        if (ret != EFI_ST_SUCCESS) {
                efi_st_error("Setting up '%s' failed\n", test->name);
                ++*failures;
@@ -240,8 +240,8 @@ void efi_st_do_tests(const u16 *testname, unsigned int phase,
  * All tests use a driver model and are run in three phases:
  * setup, execute, teardown.
  *
- * A test may be setup and executed at boottime,
- * it may be setup at boottime and executed at runtime,
+ * A test may be setup and executed at st_boottime,
+ * it may be setup at st_boottime and executed at runtime,
  * or it may be setup and executed at runtime.
  *
  * After executing all tests the system is reset.
@@ -257,14 +257,14 @@ efi_status_t EFIAPI efi_selftest(efi_handle_t image_handle,
        struct efi_loaded_image *loaded_image;
        efi_status_t ret;
 
-       systable = systab;
-       boottime = systable->boottime;
-       runtime = systable->runtime;
+       st_systable = systab;
+       st_boottime = st_systable->boottime;
+       runtime = st_systable->runtime;
        handle = image_handle;
-       con_out = systable->con_out;
-       con_in = systable->con_in;
+       con_out = st_systable->con_out;
+       con_in = st_systable->con_in;
 
-       ret = boottime->handle_protocol(image_handle, &efi_guid_loaded_image,
+       ret = st_boottime->handle_protocol(image_handle, &efi_guid_loaded_image,
                                        (void **)&loaded_image);
        if (ret != EFI_SUCCESS) {
                efi_st_error("Cannot open loaded image protocol\n");
@@ -280,9 +280,9 @@ efi_status_t EFIAPI efi_selftest(efi_handle_t image_handle,
                        list_all_tests();
                        /*
                         * TODO:
-                        * Once the Exit boottime service is correctly
+                        * Once the Exit st_boottime service is correctly
                         * implemented we should call
-                        *   boottime->exit(image_handle, EFI_SUCCESS, 0, NULL);
+                        *   st_boottime->exit(image_handle, EFI_SUCCESS, 0, NULL);
                         * here, cf.
                         * https://lists.denx.de/pipermail/u-boot/2017-October/308720.html
                         */
@@ -300,7 +300,7 @@ efi_status_t EFIAPI efi_selftest(efi_handle_t image_handle,
                                             efi_unit_test));
 
        /* Allocate buffer for setup results */
-       ret = boottime->allocate_pool(EFI_RUNTIME_SERVICES_DATA, sizeof(int) *
+       ret = st_boottime->allocate_pool(EFI_RUNTIME_SERVICES_DATA, sizeof(int) *
                                      ll_entry_count(struct efi_unit_test,
                                                     efi_unit_test),
                                      (void **)&setup_status);
@@ -309,7 +309,7 @@ efi_status_t EFIAPI efi_selftest(efi_handle_t image_handle,
                return ret;
        }
 
-       /* Execute boottime tests */
+       /* Execute st_boottime tests */
        efi_st_do_tests(testname, EFI_EXECUTE_BEFORE_BOOTTIME_EXIT,
                        EFI_ST_SETUP | EFI_ST_EXECUTE | EFI_ST_TEARDOWN,
                        &failures);
diff --git a/lib/efi_selftest/efi_selftest_ecpt.c b/lib/efi_selftest/efi_selftest_ecpt.c
new file mode 100644 (file)
index 0000000..e8cc135
--- /dev/null
@@ -0,0 +1,76 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * efi_selftest_fdt
+ *
+ * Copyright (c) 2022 Heinrich Schuchardt <xypron.glpk@gmx.de>
+ *
+ * Check the EFI_CONFORMANCE_PROFILE_TABLE
+ */
+
+#include <efi_selftest.h>
+
+static const efi_guid_t guid_ecpt = EFI_CONFORMANCE_PROFILES_TABLE_GUID;
+static const efi_guid_t guid_ebbr_2_0 = EFI_CONFORMANCE_PROFILE_EBBR_2_0_GUID;
+
+/*
+ * ecpt_find_guid() - find GUID in EFI Conformance Profile Table
+ *
+ * @ecpt:      EFI Conformance Profile Table
+ * @guid:      GUID to find
+ * Return:     EFI_ST_SUCCESS for success
+ */
+static int ecpt_find_guid(struct efi_conformance_profiles_table *ecpt,
+                         const efi_guid_t *guid) {
+       int i;
+
+       for (i = 0; i < ecpt->number_of_profiles; ++i) {
+               if (!memcmp(&ecpt->conformance_profiles[i], guid, 16))
+                       return EFI_ST_SUCCESS;
+       }
+       efi_st_error("GUID %pU not found\n", guid);
+       return EFI_ST_FAILURE;
+}
+
+/*
+ * Execute unit test.
+ *
+ * Return:     EFI_ST_SUCCESS for success
+ */
+static int execute(void)
+{
+       struct efi_conformance_profiles_table *ecpt;
+       int expected_entries = 0;
+
+       ecpt = efi_st_get_config_table(&guid_ecpt);
+
+       if (!ecpt) {
+               efi_st_error("Missing EFI Conformance Profile Table\n");
+               return EFI_ST_FAILURE;
+       }
+
+       if (ecpt->version != EFI_CONFORMANCE_PROFILES_TABLE_VERSION) {
+               efi_st_error("Wrong table version\n");
+               return EFI_ST_FAILURE;
+       }
+
+       if (CONFIG_IS_ENABLED(EFI_EBBR_2_0_CONFORMANCE)) {
+               ++expected_entries;
+               if (ecpt_find_guid(ecpt, &guid_ebbr_2_0))
+                       return EFI_ST_FAILURE;
+       }
+
+       if (ecpt->number_of_profiles != expected_entries) {
+               efi_st_error("Expected %d entries, found %d\n",
+                            expected_entries, ecpt->number_of_profiles);
+               return EFI_ST_FAILURE;
+       }
+
+       return EFI_ST_SUCCESS;
+}
+
+
+EFI_UNIT_TEST(ecpt) = {
+       .name = "conformance profile table",
+       .phase = EFI_EXECUTE_BEFORE_BOOTTIME_EXIT,
+       .execute = execute,
+};
index 114ac58..aa3b13a 100644 (file)
@@ -144,23 +144,6 @@ static char *get_property(const u16 *property, const u16 *node)
        return NULL;
 }
 
-/**
- * efi_st_get_config_table() - get configuration table
- *
- * @guid:      GUID of the configuration table
- * Return:     pointer to configuration table or NULL
- */
-static void *efi_st_get_config_table(const efi_guid_t *guid)
-{
-       size_t i;
-
-       for (i = 0; i < systab.nr_tables; i++) {
-               if (!guidcmp(guid, &systemtab->tables[i].guid))
-                       return systemtab->tables[i].table;
-       }
-       return NULL;
-}
-
 /*
  * Setup unit test.
  *
index 79f9a67..a9ad381 100644 (file)
@@ -9,6 +9,7 @@
 
 #include <common.h>
 #include <efi_api.h>
+#include <host_arch.h>
 
 /*
  * Entry point of the EFI application.
@@ -33,11 +34,17 @@ efi_status_t EFIAPI efi_main(efi_handle_t handle,
        asm volatile (".word 0xe7f7defb\n");
 #elif defined(CONFIG_RISCV)
        asm volatile (".word 0xffffffff\n");
+#elif defined(CONFIG_X86)
+       asm volatile (".word 0xffff\n");
 #elif defined(CONFIG_SANDBOX)
+#if (HOST_ARCH == HOST_ARCH_ARM || HOST_ARCH == HOST_ARCH_AARCH64)
+       asm volatile (".word 0xe7f7defb\n");
+#elif (HOST_ARCH == HOST_ARCH_RISCV32 || HOST_ARCH == HOST_ARCH_RISCV64)
        asm volatile (".word 0xffffffff\n");
-#elif defined(CONFIG_X86)
+#elif (HOST_ARCH == HOST_ARCH_X86 || HOST_ARCH == HOST_ARCH_X86_64)
        asm volatile (".word 0xffff\n");
 #endif
+#endif
        con_out->output_string(con_out, u"Exception not triggered.\n");
        return EFI_ABORTED;
 }
index dba02d6..7e03e0c 100644 (file)
@@ -110,3 +110,14 @@ int efi_st_strcmp_16_8(const u16 *buf1, const char *buf2)
        }
        return 0;
 }
+
+void *efi_st_get_config_table(const efi_guid_t *guid)
+{
+       size_t i;
+
+       for (i = 0; i < st_systable->nr_tables; i++) {
+               if (!guidcmp(guid, &st_systable->tables[i].guid))
+                       return st_systable->tables[i].table;
+       }
+       return NULL;
+}
index 22a769c..d0e3ab1 100644 (file)
@@ -456,12 +456,13 @@ u32 tpm1_get_permissions(struct udevice *dev, u32 index, u32 *perm)
                0x0, 0x0, 0x0, 0x4,
        };
        const size_t index_offset = 18;
-       const size_t perm_offset = 60;
+       const size_t perm_offset = 74;
        u8 buf[COMMAND_BUFFER_SIZE], response[COMMAND_BUFFER_SIZE];
        size_t response_length = sizeof(response);
        u32 err;
 
-       if (pack_byte_string(buf, sizeof(buf), "d", 0, command, sizeof(command),
+       if (pack_byte_string(buf, sizeof(buf), "sd",
+                            0, command, sizeof(command),
                             index_offset, index))
                return TPM_LIB_ERROR;
        err = tpm_sendrecv_command(dev, buf, response, &response_length);
index 1bf6278..697b982 100644 (file)
@@ -89,14 +89,18 @@ u32 tpm2_nv_define_space(struct udevice *dev, u32 space_index,
         * Calculate the offset of the nv_policy piece by adding each of the
         * chunks below.
         */
-       uint offset = 10 + 8 + 13 + 14;
+       const int platform_len = sizeof(u32);
+       const int session_hdr_len = 13;
+       const int message_len = 14;
+       uint offset = TPM2_HDR_LEN + platform_len + session_hdr_len +
+               message_len;
        u8 command_v2[COMMAND_BUFFER_SIZE] = {
                /* header 10 bytes */
                tpm_u16(TPM2_ST_SESSIONS),      /* TAG */
-               tpm_u32(offset + nv_policy_size),/* Length */
+               tpm_u32(offset + nv_policy_size + 2),/* Length */
                tpm_u32(TPM2_CC_NV_DEFINE_SPACE),/* Command code */
 
-               /* handles 8 bytes */
+               /* handles 4 bytes */
                tpm_u32(TPM2_RH_PLATFORM),      /* Primary platform seed */
 
                /* session header 13 bytes */
@@ -107,12 +111,15 @@ u32 tpm2_nv_define_space(struct udevice *dev, u32 space_index,
                tpm_u16(0),                     /* auth_size */
 
                /* message 14 bytes + policy */
-               tpm_u16(12 + nv_policy_size),   /* size */
+               tpm_u16(message_len + nv_policy_size),  /* size */
                tpm_u32(space_index),
                tpm_u16(TPM2_ALG_SHA256),
                tpm_u32(nv_attributes),
                tpm_u16(nv_policy_size),
-               /* nv_policy */
+               /*
+                * nv_policy
+                * space_size
+                */
        };
        int ret;
 
@@ -120,8 +127,9 @@ u32 tpm2_nv_define_space(struct udevice *dev, u32 space_index,
         * Fill the command structure starting from the first buffer:
         *     - the password (if any)
         */
-       ret = pack_byte_string(command_v2, sizeof(command_v2), "s",
-                              offset, nv_policy, nv_policy_size);
+       ret = pack_byte_string(command_v2, sizeof(command_v2), "sw",
+                              offset, nv_policy, nv_policy_size,
+                              offset + nv_policy_size, space_size);
        if (ret)
                return TPM_LIB_ERROR;
 
@@ -157,6 +165,8 @@ u32 tpm2_pcr_extend(struct udevice *dev, u32 index, u32 algorithm,
        };
        int ret;
 
+       if (!digest)
+               return -EINVAL;
        /*
         * Fill the command structure starting from the first buffer:
         *     - the digest
@@ -669,3 +679,49 @@ u32 tpm2_submit_command(struct udevice *dev, const u8 *sendbuf,
 {
        return tpm_sendrecv_command(dev, sendbuf, recvbuf, recv_size);
 }
+
+u32 tpm2_report_state(struct udevice *dev, uint vendor_cmd, uint vendor_subcmd,
+                     u8 *recvbuf, size_t *recv_size)
+{
+       u8 command_v2[COMMAND_BUFFER_SIZE] = {
+               /* header 10 bytes */
+               tpm_u16(TPM2_ST_NO_SESSIONS),           /* TAG */
+               tpm_u32(10 + 2),                        /* Length */
+               tpm_u32(vendor_cmd),    /* Command code */
+
+               tpm_u16(vendor_subcmd),
+       };
+       int ret;
+
+       ret = tpm_sendrecv_command(dev, command_v2, recvbuf, recv_size);
+       log_debug("ret=%s, %x\n", dev->name, ret);
+       if (ret)
+               return ret;
+       if (*recv_size < 12)
+               return -ENODATA;
+       *recv_size -= 12;
+       memcpy(recvbuf, recvbuf + 12, *recv_size);
+
+       return 0;
+}
+
+u32 tpm2_enable_nvcommits(struct udevice *dev, uint vendor_cmd,
+                         uint vendor_subcmd)
+{
+       u8 command_v2[COMMAND_BUFFER_SIZE] = {
+               /* header 10 bytes */
+               tpm_u16(TPM2_ST_NO_SESSIONS),           /* TAG */
+               tpm_u32(10 + 2),                        /* Length */
+               tpm_u32(vendor_cmd),    /* Command code */
+
+               tpm_u16(vendor_subcmd),
+       };
+       int ret;
+
+       ret = tpm_sendrecv_command(dev, command_v2, NULL, NULL);
+       log_debug("ret=%s, %x\n", dev->name, ret);
+       if (ret)
+               return ret;
+
+       return 0;
+}
index 032f383..7e8df87 100644 (file)
@@ -140,15 +140,17 @@ u32 tpm_write_lock(struct udevice *dev, u32 index)
 }
 
 u32 tpm_pcr_extend(struct udevice *dev, u32 index, const void *in_digest,
-                  void *out_digest)
+                  uint size, void *out_digest, const char *name)
 {
-       if (tpm_is_v1(dev))
+       if (tpm_is_v1(dev)) {
                return tpm1_extend(dev, index, in_digest, out_digest);
-       else if (tpm_is_v2(dev))
+       } else if (tpm_is_v2(dev)) {
                return tpm2_pcr_extend(dev, index, TPM2_ALG_SHA256, in_digest,
                                       TPM2_DIGEST_LEN);
-       else
+               /* @name is ignored as we do not support the TPM log here */
+       } else {
                return -ENOSYS;
+       }
 }
 
 u32 tpm_pcr_read(struct udevice *dev, u32 index, void *data, size_t count)
index 284f811..465e1ac 100644 (file)
@@ -220,6 +220,10 @@ static const struct {
                "TCG2 Final Events Table",
                EFI_TCG2_FINAL_EVENTS_TABLE_GUID,
        },
+       {
+               "EFI Conformance Profiles Table",
+               EFI_CONFORMANCE_PROFILES_TABLE_GUID,
+       },
 #ifdef CONFIG_EFI_RISCV_BOOT_PROTOCOL
        {
                "RISC-V Boot",
index 69983a1..7624304 100644 (file)
@@ -89,7 +89,7 @@ hostcxx_flags  = -Wp,-MD,$(depfile) $(__hostcxx_flags)
 # Create executable from a single .c file
 # host-csingle -> Executable
 quiet_cmd_host-csingle         = HOSTCC  $@
-      cmd_host-csingle = $(HOSTCC) $(hostc_flags) -o $@ $< \
+      cmd_host-csingle = $(HOSTCC) $(hostc_flags) $(KBUILD_HOSTLDFLAGS) -o $@ $< \
                $(KBUILD_HOSTLDLIBS) $(HOSTLDLIBS_$(@F))
 $(host-csingle): $(obj)/%: $(src)/%.c FORCE
        $(call if_changed_dep,host-csingle)
index 22a0f2b..49e3b38 100644 (file)
@@ -653,12 +653,7 @@ CONFIG_SYS_FM1_DTSEC4_RISER_PHY_ADDR
 CONFIG_SYS_FM1_DTSEC5_PHY_ADDR
 CONFIG_SYS_FM1_QSGMII11_PHY_ADDR
 CONFIG_SYS_FM1_QSGMII21_PHY_ADDR
-CONFIG_SYS_FM2_10GEC1_PHY_ADDR
 CONFIG_SYS_FM2_CLK
-CONFIG_SYS_FM2_DTSEC1_PHY_ADDR
-CONFIG_SYS_FM2_DTSEC2_PHY_ADDR
-CONFIG_SYS_FM2_DTSEC3_PHY_ADDR
-CONFIG_SYS_FM2_DTSEC4_PHY_ADDR
 CONFIG_SYS_FM_MURAM_SIZE
 CONFIG_SYS_FPGAREG_DIPSW
 CONFIG_SYS_FPGAREG_FREQ
index 52fe178..7543df8 100644 (file)
@@ -107,6 +107,7 @@ obj-$(CONFIG_SYSINFO_GPIO) += sysinfo-gpio.o
 obj-$(CONFIG_UT_DM) += tag.o
 obj-$(CONFIG_TEE) += tee.o
 obj-$(CONFIG_TIMER) += timer.o
+obj-$(CONFIG_TPM_V2) += tpm.o
 obj-$(CONFIG_DM_USB) += usb.o
 obj-$(CONFIG_DM_VIDEO) += video.o
 ifeq ($(CONFIG_VIRTIO_SANDBOX),y)
diff --git a/test/dm/tpm.c b/test/dm/tpm.c
new file mode 100644 (file)
index 0000000..0b46f79
--- /dev/null
@@ -0,0 +1,34 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright 2022 Google LLC
+ * Written by Simon Glass <sjg@chromium.org>
+ */
+
+#include <common.h>
+#include <dm.h>
+#include <tpm_api.h>
+#include <dm/test.h>
+#include <test/test.h>
+#include <test/ut.h>
+
+/* Basic test of the TPM uclass */
+static int dm_test_tpm(struct unit_test_state *uts)
+{
+       struct udevice *dev;
+       char buf[50];
+
+       /* check probe success */
+       ut_assertok(uclass_first_device_err(UCLASS_TPM, &dev));
+       ut_assert(tpm_is_v2(dev));
+
+       ut_assert(tpm_report_state(dev, buf, sizeof(buf)));
+       ut_asserteq_str("init_done=0", buf);
+
+       ut_assertok(tpm_init(dev));
+
+       ut_assert(tpm_report_state(dev, buf, sizeof(buf)));
+       ut_asserteq_str("init_done=1", buf);
+
+       return 0;
+}
+DM_TEST(dm_test_tpm, UT_TESTF_SCAN_FDT);
index f94fd7e..4ee6f41 100644 (file)
@@ -236,6 +236,10 @@ variable. Within binman, this EntryArg is picked up by the `Entry_atf_bl31`
 etype. An EntryArg is simply an argument to the entry. The `atf-bl31-path`
 name is documented in :ref:`etype_atf_bl31`.
 
+Taking this a little further, when binman is used to create a FIT, it supports
+using an ELF file, e.g. `bl31.elf` and splitting it into separate pieces (with
+`fit,operation = "split-elf"`), each with its own load address.
+
 
 Invoking binman outside U-Boot
 ------------------------------
@@ -854,6 +858,55 @@ allow-repack:
     image description to be stored in the FDT and fdtmap.
 
 
+Image dependencies
+------------------
+
+Binman does not currently support images that depend on each other. For example,
+if one image creates `fred.bin` and then the next uses this `fred.bin` to
+produce a final `image.bin`, then the behaviour is undefined. It may work, or it
+may produce an error about `fred.bin` being missing, or it may use a version of
+`fred.bin` from a previous run.
+
+Often this can be handled by incorporating the dependency into the second
+image. For example, instead of::
+
+    binman {
+        multiple-images;
+
+        fred {
+            u-boot {
+            };
+            fill {
+                size = <0x100>;
+            };
+        };
+
+        image {
+            blob {
+                filename = "fred.bin";
+            };
+            u-boot-spl {
+            };
+        };
+
+you can do this::
+
+    binman {
+        image {
+            fred {
+                type = "section";
+                u-boot {
+                };
+                fill {
+                    size = <0x100>;
+                };
+            };
+            u-boot-spl {
+            };
+        };
+
+
+
 Hashing Entries
 ---------------
 
@@ -1684,6 +1737,7 @@ Some ideas:
 - Figure out how to make Fdt support changing the node order, so that
   Node.AddSubnode() can support adding a node before another, existing node.
   Perhaps it should completely regenerate the flat tree?
+- Support images which depend on each other
 
 --
 Simon Glass <sjg@chromium.org>
index ec30cef..032179a 100644 (file)
@@ -53,9 +53,11 @@ class Bintool:
     # List of bintools to regard as missing
     missing_list = []
 
-    def __init__(self, name, desc):
+    def __init__(self, name, desc, version_regex=None, version_args='-V'):
         self.name = name
         self.desc = desc
+        self.version_regex = version_regex
+        self.version_args = version_args
 
     @staticmethod
     def find_bintool_class(btype):
@@ -464,16 +466,27 @@ binaries. It is fairly easy to create new bintools. Just add a new file to the
         print(f"No method to fetch bintool '{self.name}'")
         return False
 
-    # pylint: disable=R0201
     def version(self):
         """Version handler for a bintool
 
-        This should be implemented by the base class
-
         Returns:
             str: Version string for this bintool
         """
-        return 'unknown'
+        if self.version_regex is None:
+            return 'unknown'
+
+        import re
+
+        result = self.run_cmd_result(self.version_args)
+        out = result.stdout.strip()
+        if not out:
+            out = result.stderr.strip()
+        if not out:
+            return 'unknown'
+
+        m_version = re.search(self.version_regex, out)
+        return m_version.group(1) if m_version else out
+
 
 class BintoolPacker(Bintool):
     """Tool which compression / decompression entry contents
@@ -495,9 +508,9 @@ class BintoolPacker(Bintool):
     """
     def __init__(self, name, compression=None, compress_args=None,
                  decompress_args=None, fetch_package=None,
-                 version_regex=r'(v[0-9.]+)'):
+                 version_regex=r'(v[0-9.]+)', version_args='-V'):
         desc = '%s compression' % (compression if compression else name)
-        super().__init__(name, desc)
+        super().__init__(name, desc, version_regex, version_args)
         if compress_args is None:
             compress_args = ['--compress']
         self.compress_args = compress_args
@@ -507,7 +520,6 @@ class BintoolPacker(Bintool):
         if fetch_package is None:
             fetch_package = name
         self.fetch_package = fetch_package
-        self.version_regex = version_regex
 
     def compress(self, indata):
         """Compress data
@@ -557,21 +569,3 @@ class BintoolPacker(Bintool):
         if method != FETCH_BIN:
             return None
         return self.apt_install(self.fetch_package)
-
-    def version(self):
-        """Version handler
-
-        Returns:
-            str: Version number
-        """
-        import re
-
-        result = self.run_cmd_result('-V')
-        out = result.stdout.strip()
-        if not out:
-            out = result.stderr.strip()
-        if not out:
-            return super().version()
-
-        m_version = re.search(self.version_regex, out)
-        return m_version.group(1) if m_version else out
index 7bea300..70cbc19 100644 (file)
@@ -27,5 +27,5 @@ class Bintoolbtool_gzip(bintool.BintoolPacker):
         man gzip
     """
     def __init__(self, name):
-        super().__init__(name, compress_args=[],
+        super().__init__("gzip", compress_args=[],
                          version_regex=r'gzip ([0-9.]+)')
index 9be87a6..c3897d6 100644 (file)
@@ -27,4 +27,4 @@ class Bintoolbzip2(bintool.BintoolPacker):
         man bzip2
     """
     def __init__(self, name):
-        super().__init__(name, version_regex=r'bzip2.*Version ([0-9.]+)')
+        super().__init__(name, version_regex=r'bzip2.*Version ([0-9.]+)', version_args='--help')
index c6d71ce..c80f827 100644 (file)
@@ -49,7 +49,7 @@ class Bintoolfiptool(bintool.Bintool):
         https://trustedfirmware-a.readthedocs.io/en/latest/getting_started/tools-build.html?highlight=fiptool#building-and-using-the-fip-tool
     """
     def __init__(self, name):
-        super().__init__(name, 'Manipulate ATF FIP files')
+        super().__init__(name, 'Manipulate ATF FIP files', r'^(.*)$', 'version')
 
     def info(self, fname):
         """Get info on a FIP image
@@ -112,12 +112,3 @@ class Bintoolfiptool(bintool.Bintool):
             'fiptool',
             'tools/fiptool/fiptool')
         return result
-
-    def version(self):
-        """Version handler for fiptool
-
-        Returns:
-            str: Version number of fiptool
-        """
-        out = self.run_cmd('version').strip()
-        return out or super().version()
index 8d00966..75a05c2 100644 (file)
@@ -69,7 +69,7 @@ class Bintoolfutility(bintool.Bintool):
         https://chromium.googlesource.com/chromiumos/platform/vboot/+/refs/heads/main/_vboot_reference/README
     """
     def __init__(self, name):
-        super().__init__(name, 'Chromium OS firmware utility')
+        super().__init__(name, 'Chromium OS firmware utility', r'^(.*)$', 'version')
 
     def gbb_create(self, fname, sizes):
         """Create a new Google Binary Block
@@ -165,14 +165,3 @@ class Bintoolfutility(bintool.Bintool):
         fname, tmpdir = self.fetch_from_drive(
             '1hdsInzsE4aJbmBeJ663kYgjOQyW1I-E0')
         return fname, tmpdir
-
-    def version(self):
-        """Version handler for futility
-
-        Returns:
-            str: Version string for futility
-        """
-        out = self.run_cmd('version').strip()
-        if not out:
-            return super().version()
-        return out
index f09c5c8..dc9e379 100644 (file)
@@ -76,7 +76,7 @@ class Bintoollz4(bintool.Bintool):
         man lz4
     """
     def __init__(self, name):
-        super().__init__(name, 'lz4 compression')
+        super().__init__(name, 'lz4 compression', r'.* (v[0-9.]*),.*')
 
     def compress(self, indata):
         """Compress data with lz4
@@ -126,15 +126,3 @@ class Bintoollz4(bintool.Bintool):
         if method != bintool.FETCH_BIN:
             return None
         return self.apt_install('lz4')
-
-    def version(self):
-        """Version handler
-
-        Returns:
-            str: Version number of lz4
-        """
-        out = self.run_cmd('-V').strip()
-        if not out:
-            return super().version()
-        m_version = re.match(r'.* (v[0-9.]*),.*', out)
-        return m_version.group(1) if m_version else out
index c85bfe0..da5f344 100644 (file)
@@ -18,11 +18,11 @@ class Bintoolmkimage(bintool.Bintool):
     Support is provided for fetching this on Debian-like systems, using apt.
     """
     def __init__(self, name):
-        super().__init__(name, 'Generate image for U-Boot')
+        super().__init__(name, 'Generate image for U-Boot', r'mkimage version (.*)')
 
     # pylint: disable=R0913
     def run(self, reset_timestamp=False, output_fname=None, external=False,
-            pad=None, version=False):
+            pad=None):
         """Run mkimage
 
         Args:
@@ -44,8 +44,6 @@ class Bintoolmkimage(bintool.Bintool):
             args.append('-t')
         if output_fname:
             args += ['-F', output_fname]
-        if version:
-            args.append('-V')
         return self.run_cmd(*args)
 
     def fetch(self, method):
@@ -66,15 +64,3 @@ class Bintoolmkimage(bintool.Bintool):
         if method != bintool.FETCH_BIN:
             return None
         return self.apt_install('u-boot-tools')
-
-    def version(self):
-        """Version handler for mkimage
-
-        Returns:
-            str: Version string for mkimage
-        """
-        out = self.run(version=True).strip()
-        if not out:
-            return super().version()
-        m_version = re.match(r'mkimage version (.*)', out)
-        return m_version.group(1) if m_version else out
index b3613d7..18bd328 100644 (file)
@@ -1175,6 +1175,9 @@ Properties / Entry arguments:
     - args: Arguments to pass
     - data-to-imagename: Indicates that the -d data should be passed in as
       the image name also (-n)
+    - multiple-data-files: boolean to tell binman to pass all files as
+      datafiles to mkimage instead of creating a temporary file the result
+      of datafiles concatenation
 
 The data passed to mkimage via the -d flag is collected from subnodes of the
 mkimage node, e.g.::
@@ -1205,6 +1208,25 @@ a section, or just multiple subnodes like this::
         };
     };
 
+To pass all datafiles untouched to mkimage::
+
+    mkimage {
+        args = "-n rk3399 -T rkspi";
+        multiple-data-files;
+
+        u-boot-tpl {
+        };
+
+        u-boot-spl {
+        };
+    };
+
+This calls mkimage to create a Rockchip RK3399-specific first stage
+bootloader, made of TPL+SPL. Since this first stage bootloader requires to
+align the TPL and SPL but also some weird hacks that is handled by mkimage
+directly, binman is told to not perform the concatenation of datafiles prior
+to passing the data to mkimage.
+
 To use CONFIG options in the arguments, use a string list instead, as in
 this example which also produces four arguments::
 
index ddbd9ce..c2288c4 100644 (file)
@@ -18,11 +18,16 @@ class Entry_mkimage(Entry):
         - args: Arguments to pass
         - data-to-imagename: Indicates that the -d data should be passed in as
           the image name also (-n)
+        - multiple-data-files: boolean to tell binman to pass all files as
+          datafiles to mkimage instead of creating a temporary file the result
+          of datafiles concatenation
+        - filename: filename of output binary generated by mkimage
 
     The data passed to mkimage via the -d flag is collected from subnodes of the
     mkimage node, e.g.::
 
         mkimage {
+            filename = "imximage.bin";
             args = "-n test -T imximage";
 
             u-boot-spl {
@@ -35,8 +40,9 @@ class Entry_mkimage(Entry):
         mkimage -d <data_file> -n test -T imximage <output_file>
 
     The output from mkimage then becomes part of the image produced by
-    binman. If you need to put multiple things in the data file, you can use
-    a section, or just multiple subnodes like this::
+    binman but also is written into `imximage.bin` file. If you need to put
+    multiple things in the data file, you can use a section, or just multiple
+    subnodes like this::
 
         mkimage {
             args = "-n test -T imximage";
@@ -51,6 +57,25 @@ class Entry_mkimage(Entry):
     Note that binman places the contents (here SPL and TPL) into a single file
     and passes that to mkimage using the -d option.
 
+       To pass all datafiles untouched to mkimage::
+
+               mkimage {
+                       args = "-n rk3399 -T rkspi";
+                       multiple-data-files;
+
+                       u-boot-tpl {
+                       };
+
+                       u-boot-spl {
+                       };
+               };
+
+       This calls mkimage to create a Rockchip RK3399-specific first stage
+       bootloader, made of TPL+SPL. Since this first stage bootloader requires to
+       align the TPL and SPL but also some weird hacks that is handled by mkimage
+       directly, binman is told to not perform the concatenation of datafiles prior
+       to passing the data to mkimage.
+
     To use CONFIG options in the arguments, use a string list instead, as in
     this example which also produces four arguments::
 
@@ -96,8 +121,10 @@ class Entry_mkimage(Entry):
     """
     def __init__(self, section, etype, node):
         super().__init__(section, etype, node)
+        self._multiple_data_files = fdt_util.GetBool(self._node, 'multiple-data-files')
         self._mkimage_entries = OrderedDict()
         self._imagename = None
+        self._filename = fdt_util.GetString(self._node, 'filename')
         self.align_default = None
 
     def ReadNode(self):
@@ -122,16 +149,27 @@ class Entry_mkimage(Entry):
     def ObtainContents(self):
         # Use a non-zero size for any fake files to keep mkimage happy
         # Note that testMkimageImagename() relies on this 'mkimage' parameter
-        data, input_fname, uniq = self.collect_contents_to_file(
-            self._mkimage_entries.values(), 'mkimage', 1024)
-        if data is None:
-            return False
+        fake_size = 1024
+        if self._multiple_data_files:
+            fnames = []
+            uniq = self.GetUniqueName()
+            for entry in self._mkimage_entries.values():
+                if not entry.ObtainContents(fake_size=fake_size):
+                    return False
+                fnames.append(tools.get_input_filename(entry.GetDefaultFilename()))
+            input_fname = ":".join(fnames)
+        else:
+            data, input_fname, uniq = self.collect_contents_to_file(
+                self._mkimage_entries.values(), 'mkimage', fake_size)
+            if data is None:
+                return False
         if self._imagename:
             image_data, imagename_fname, _ = self.collect_contents_to_file(
                 [self._imagename], 'mkimage-n', 1024)
             if image_data is None:
                 return False
-        output_fname = tools.get_output_filename('mkimage-out.%s' % uniq)
+        outfile = self._filename if self._filename else 'mkimage-out.%s' % uniq
+        output_fname = tools.get_output_filename(outfile)
 
         args = ['-d', input_fname]
         if self._data_to_imagename:
diff --git a/tools/binman/etype/u_boot_vpl.py b/tools/binman/etype/u_boot_vpl.py
new file mode 100644 (file)
index 0000000..9daaca4
--- /dev/null
@@ -0,0 +1,42 @@
+# SPDX-License-Identifier: GPL-2.0+
+# Copyright (c) 2016 Google, Inc
+# Written by Simon Glass <sjg@chromium.org>
+#
+# Entry-type module for vpl/u-boot-vpl.bin
+#
+
+from binman import elf
+from binman.entry import Entry
+from binman.etype.blob import Entry_blob
+
+class Entry_u_boot_vpl(Entry_blob):
+    """U-Boot VPL binary
+
+    Properties / Entry arguments:
+        - filename: Filename of u-boot-vpl.bin (default 'vpl/u-boot-vpl.bin')
+
+    This is the U-Boot VPL (Verifying Program Loader) binary. This is a small
+    binary which loads before SPL, typically into on-chip SRAM. It is
+    responsible for locating, loading and jumping to SPL, the next-stage
+    loader. Note that VPL is not relocatable so must be loaded to the correct
+    address in SRAM, or written to run from the correct address if direct
+    flash execution is possible (e.g. on x86 devices).
+
+    SPL can access binman symbols at runtime. See:
+
+        'Access to binman entry offsets at run time (symbols)'
+
+    in the binman README for more information.
+
+    The ELF file 'vpl/u-boot-vpl' must also be available for this to work, since
+    binman uses that to look up symbols to write into the VPL binary.
+    """
+    def __init__(self, section, etype, node):
+        super().__init__(section, etype, node)
+        self.elf_fname = 'vpl/u-boot-vpl'
+
+    def GetDefaultFilename(self):
+        return 'vpl/u-boot-vpl.bin'
+
+    def WriteSymbols(self, section):
+        elf.LookupAndWriteSymbols(self.elf_fname, self, section.GetImage())
diff --git a/tools/binman/etype/u_boot_vpl_bss_pad.py b/tools/binman/etype/u_boot_vpl_bss_pad.py
new file mode 100644 (file)
index 0000000..b2ce2a3
--- /dev/null
@@ -0,0 +1,44 @@
+# SPDX-License-Identifier: GPL-2.0+
+# Copyright 2021 Google LLC
+# Written by Simon Glass <sjg@chromium.org>
+#
+# Entry-type module for BSS padding for vpl/u-boot-vpl.bin. This padding
+# can be added after the VPL binary to ensure that anything concatenated
+# to it will appear to VPL to be at the end of BSS rather than the start.
+#
+
+from binman import elf
+from binman.entry import Entry
+from binman.etype.blob import Entry_blob
+from patman import tools
+
+class Entry_u_boot_vpl_bss_pad(Entry_blob):
+    """U-Boot VPL binary padded with a BSS region
+
+    Properties / Entry arguments:
+        None
+
+    This holds the padding added after the VPL binary to cover the BSS (Block
+    Started by Symbol) region. This region holds the various variables used by
+    VPL. It is set to 0 by VPL when it starts up. If you want to append data to
+    the VPL image (such as a device tree file), you must pad out the BSS region
+    to avoid the data overlapping with U-Boot variables. This entry is useful in
+    that case. It automatically pads out the entry size to cover both the code,
+    data and BSS.
+
+    The contents of this entry will a certain number of zero bytes, determined
+    by __bss_size
+
+    The ELF file 'vpl/u-boot-vpl' must also be available for this to work, since
+    binman uses that to look up the BSS address.
+    """
+    def __init__(self, section, etype, node):
+        super().__init__(section, etype, node)
+
+    def ObtainContents(self):
+        fname = tools.get_input_filename('vpl/u-boot-vpl')
+        bss_size = elf.GetSymbolAddress(fname, '__bss_size')
+        if not bss_size:
+            self.Raise('Expected __bss_size symbol in vpl/u-boot-vpl')
+        self.SetContents(tools.get_bytes(0, bss_size))
+        return True
diff --git a/tools/binman/etype/u_boot_vpl_dtb.py b/tools/binman/etype/u_boot_vpl_dtb.py
new file mode 100644 (file)
index 0000000..f6253bf
--- /dev/null
@@ -0,0 +1,28 @@
+# SPDX-License-Identifier: GPL-2.0+
+# Copyright (c) 2016 Google, Inc
+# Written by Simon Glass <sjg@chromium.org>
+#
+# Entry-type module for U-Boot device tree in VPL (Verifying Program Loader)
+#
+
+from binman.entry import Entry
+from binman.etype.blob_dtb import Entry_blob_dtb
+
+class Entry_u_boot_vpl_dtb(Entry_blob_dtb):
+    """U-Boot VPL device tree
+
+    Properties / Entry arguments:
+        - filename: Filename of u-boot.dtb (default 'vpl/u-boot-vpl.dtb')
+
+    This is the VPL device tree, containing configuration information for
+    VPL. VPL needs this to know what devices are present and which drivers
+    to activate.
+    """
+    def __init__(self, section, etype, node):
+        super().__init__(section, etype, node)
+
+    def GetDefaultFilename(self):
+        return 'vpl/u-boot-vpl.dtb'
+
+    def GetFdtEtype(self):
+        return 'u-boot-vpl-dtb'
diff --git a/tools/binman/etype/u_boot_vpl_expanded.py b/tools/binman/etype/u_boot_vpl_expanded.py
new file mode 100644 (file)
index 0000000..92c64f0
--- /dev/null
@@ -0,0 +1,45 @@
+# SPDX-License-Identifier: GPL-2.0+
+# Copyright 2021 Google LLC
+# Written by Simon Glass <sjg@chromium.org>
+#
+# Entry-type module for expanded U-Boot VPL binary
+#
+
+from patman import tout
+
+from binman import state
+from binman.etype.blob_phase import Entry_blob_phase
+
+class Entry_u_boot_vpl_expanded(Entry_blob_phase):
+    """U-Boot VPL flat binary broken out into its component parts
+
+    Properties / Entry arguments:
+        - vpl-dtb: Controls whether this entry is selected (set to 'y' or '1' to
+            select)
+
+    This is a section containing the U-Boot binary, BSS padding if needed and a
+    devicetree. Using this entry type automatically creates this section, with
+    the following entries in it:
+
+       u-boot-vpl-nodtb
+       u-boot-vpl-bss-pad
+       u-boot-dtb
+
+    Having the devicetree separate allows binman to update it in the final
+    image, so that the entries positions are provided to the running U-Boot.
+
+    This entry is selected based on the value of the 'vpl-dtb' entryarg. If
+    this is non-empty (and not 'n' or '0') then this expanded entry is selected.
+    """
+    def __init__(self, section, etype, node):
+        bss_pad = state.GetEntryArgBool('vpl-bss-pad')
+        super().__init__(section, etype, node, 'u-boot-vpl', 'u-boot-vpl-dtb',
+                         bss_pad)
+
+    @classmethod
+    def UseExpanded(cls, node, etype, new_etype):
+        val = state.GetEntryArgBool('vpl-dtb')
+        tout.do_output(tout.INFO if val else tout.DETAIL,
+                       "Node '%s': etype '%s': %s %sselected" %
+                       (node.path, etype, new_etype, '' if val else 'not '))
+        return val
diff --git a/tools/binman/etype/u_boot_vpl_nodtb.py b/tools/binman/etype/u_boot_vpl_nodtb.py
new file mode 100644 (file)
index 0000000..25c966c
--- /dev/null
@@ -0,0 +1,42 @@
+# SPDX-License-Identifier: GPL-2.0+
+# Copyright (c) 2016 Google, Inc
+# Written by Simon Glass <sjg@chromium.org>
+#
+# Entry-type module for 'u-boot-vpl-nodtb.bin'
+#
+
+from binman import elf
+from binman.entry import Entry
+from binman.etype.blob import Entry_blob
+
+class Entry_u_boot_vpl_nodtb(Entry_blob):
+    """VPL binary without device tree appended
+
+    Properties / Entry arguments:
+        - filename: Filename to include (default 'vpl/u-boot-vpl-nodtb.bin')
+
+    This is the U-Boot VPL binary, It does not include a device tree blob at
+    the end of it so may not be able to work without it, assuming VPL needs
+    a device tree to operate on your platform. You can add a u_boot_vpl_dtb
+    entry after this one, or use a u_boot_vpl entry instead, which normally
+    expands to a section containing u-boot-vpl-dtb, u-boot-vpl-bss-pad and
+    u-boot-vpl-dtb
+
+    VPL can access binman symbols at runtime. See:
+
+        'Access to binman entry offsets at run time (symbols)'
+
+    in the binman README for more information.
+
+    The ELF file 'vpl/u-boot-vpl' must also be available for this to work, since
+    binman uses that to look up symbols to write into the VPL binary.
+    """
+    def __init__(self, section, etype, node):
+        super().__init__(section, etype, node)
+        self.elf_fname = 'vpl/u-boot-vpl'
+
+    def GetDefaultFilename(self):
+        return 'vpl/u-boot-vpl-nodtb.bin'
+
+    def WriteSymbols(self, section):
+        elf.LookupAndWriteSymbols(self.elf_fname, self, section.GetImage())
index 0b17740..ecb3595 100644 (file)
@@ -44,12 +44,14 @@ U_BOOT_DATA           = b'1234'
 U_BOOT_IMG_DATA       = b'img'
 U_BOOT_SPL_DATA       = b'56780123456789abcdefghijklm'
 U_BOOT_TPL_DATA       = b'tpl9876543210fedcbazywvuts'
+U_BOOT_VPL_DATA       = b'vpl76543210fedcbazywxyz_'
 BLOB_DATA             = b'89'
 ME_DATA               = b'0abcd'
 VGA_DATA              = b'vga'
 U_BOOT_DTB_DATA       = b'udtb'
 U_BOOT_SPL_DTB_DATA   = b'spldtb'
 U_BOOT_TPL_DTB_DATA   = b'tpldtb'
+U_BOOT_VPL_DTB_DATA   = b'vpldtb'
 X86_START16_DATA      = b'start16'
 X86_START16_SPL_DATA  = b'start16spl'
 X86_START16_TPL_DATA  = b'start16tpl'
@@ -60,6 +62,7 @@ PPC_MPC85XX_BR_DATA   = b'ppcmpc85xxbr'
 U_BOOT_NODTB_DATA     = b'nodtb with microcode pointer somewhere in here'
 U_BOOT_SPL_NODTB_DATA = b'splnodtb with microcode pointer somewhere in here'
 U_BOOT_TPL_NODTB_DATA = b'tplnodtb with microcode pointer somewhere in here'
+U_BOOT_VPL_NODTB_DATA = b'vplnodtb'
 U_BOOT_EXP_DATA       = U_BOOT_NODTB_DATA + U_BOOT_DTB_DATA
 U_BOOT_SPL_EXP_DATA   = U_BOOT_SPL_NODTB_DATA + U_BOOT_SPL_DTB_DATA
 U_BOOT_TPL_EXP_DATA   = U_BOOT_TPL_NODTB_DATA + U_BOOT_TPL_DTB_DATA
@@ -140,6 +143,7 @@ class TestFunctional(unittest.TestCase):
         TestFunctional._MakeInputFile('u-boot.img', U_BOOT_IMG_DATA)
         TestFunctional._MakeInputFile('spl/u-boot-spl.bin', U_BOOT_SPL_DATA)
         TestFunctional._MakeInputFile('tpl/u-boot-tpl.bin', U_BOOT_TPL_DATA)
+        TestFunctional._MakeInputFile('vpl/u-boot-vpl.bin', U_BOOT_VPL_DATA)
         TestFunctional._MakeInputFile('blobfile', BLOB_DATA)
         TestFunctional._MakeInputFile('me.bin', ME_DATA)
         TestFunctional._MakeInputFile('vga.bin', VGA_DATA)
@@ -165,6 +169,8 @@ class TestFunctional(unittest.TestCase):
                                       U_BOOT_SPL_NODTB_DATA)
         TestFunctional._MakeInputFile('tpl/u-boot-tpl-nodtb.bin',
                                       U_BOOT_TPL_NODTB_DATA)
+        TestFunctional._MakeInputFile('vpl/u-boot-vpl-nodtb.bin',
+                                      U_BOOT_VPL_NODTB_DATA)
         TestFunctional._MakeInputFile('fsp.bin', FSP_DATA)
         TestFunctional._MakeInputFile('cmc.bin', CMC_DATA)
         TestFunctional._MakeInputFile('vbt.bin', VBT_DATA)
@@ -296,6 +302,7 @@ class TestFunctional(unittest.TestCase):
         TestFunctional._MakeInputFile('u-boot.dtb', U_BOOT_DTB_DATA)
         TestFunctional._MakeInputFile('spl/u-boot-spl.dtb', U_BOOT_SPL_DTB_DATA)
         TestFunctional._MakeInputFile('tpl/u-boot-tpl.dtb', U_BOOT_TPL_DTB_DATA)
+        TestFunctional._MakeInputFile('vpl/u-boot-vpl.dtb', U_BOOT_VPL_DTB_DATA)
 
     def _RunBinman(self, *args, **kwargs):
         """Run binman using the command line
@@ -431,8 +438,8 @@ class TestFunctional(unittest.TestCase):
         shutil.rmtree(tmpdir)
         return data
 
-    def _GetDtbContentsForSplTpl(self, dtb_data, name):
-        """Create a version of the main DTB for SPL or SPL
+    def _GetDtbContentsForSpls(self, dtb_data, name):
+        """Create a version of the main DTB for SPL / TPL / VPL
 
         For testing we don't actually have different versions of the DTB. With
         U-Boot we normally run fdtgrep to remove unwanted nodes, but for tests
@@ -502,11 +509,11 @@ class TestFunctional(unittest.TestCase):
 
             # For testing purposes, make a copy of the DT for SPL and TPL. Add
             # a node indicating which it is, so aid verification.
-            for name in ['spl', 'tpl']:
+            for name in ['spl', 'tpl', 'vpl']:
                 dtb_fname = '%s/u-boot-%s.dtb' % (name, name)
                 outfile = os.path.join(self._indir, dtb_fname)
                 TestFunctional._MakeInputFile(dtb_fname,
-                        self._GetDtbContentsForSplTpl(dtb_data, name))
+                        self._GetDtbContentsForSpls(dtb_data, name))
 
         try:
             retcode = self._DoTestFile(fname, map=map, update_dtb=update_dtb,
@@ -613,6 +620,16 @@ class TestFunctional(unittest.TestCase):
             tools.read_file(cls.ElfTestFile(src_fname)))
 
     @classmethod
+    def _SetupVplElf(cls, src_fname='bss_data'):
+        """Set up an ELF file with a '_dt_ucode_base_size' symbol
+
+        Args:
+            Filename of ELF file to use as VPL
+        """
+        TestFunctional._MakeInputFile('vpl/u-boot-vpl',
+            tools.read_file(cls.ElfTestFile(src_fname)))
+
+    @classmethod
     def _SetupDescriptor(cls):
         with open(cls.TestFile('descriptor.bin'), 'rb') as fd:
             TestFunctional._MakeInputFile('descriptor.bin', fd.read())
@@ -1907,21 +1924,24 @@ class TestFunctional(unittest.TestCase):
         data = self._DoReadFileRealDtb('082_fdt_update_all.dts')
 
         base_expected = {
-            'section:image-pos': 0,
-            'u-boot-tpl-dtb:size': 513,
-            'u-boot-spl-dtb:size': 513,
-            'u-boot-spl-dtb:offset': 493,
-            'image-pos': 0,
-            'section/u-boot-dtb:image-pos': 0,
-            'u-boot-spl-dtb:image-pos': 493,
-            'section/u-boot-dtb:size': 493,
-            'u-boot-tpl-dtb:image-pos': 1006,
-            'section/u-boot-dtb:offset': 0,
-            'section:size': 493,
             'offset': 0,
+            'image-pos': 0,
+            'size': 2320,
             'section:offset': 0,
-            'u-boot-tpl-dtb:offset': 1006,
-            'size': 1519
+            'section:image-pos': 0,
+            'section:size': 565,
+            'section/u-boot-dtb:offset': 0,
+            'section/u-boot-dtb:image-pos': 0,
+            'section/u-boot-dtb:size': 565,
+            'u-boot-spl-dtb:offset': 565,
+            'u-boot-spl-dtb:image-pos': 565,
+            'u-boot-spl-dtb:size': 585,
+            'u-boot-tpl-dtb:offset': 1150,
+            'u-boot-tpl-dtb:image-pos': 1150,
+            'u-boot-tpl-dtb:size': 585,
+            'u-boot-vpl-dtb:image-pos': 1735,
+            'u-boot-vpl-dtb:offset': 1735,
+            'u-boot-vpl-dtb:size': 585,
         }
 
         # We expect three device-tree files in the output, one after the other.
@@ -1929,11 +1949,12 @@ class TestFunctional(unittest.TestCase):
         # and 'tpl' in the TPL tree, to make sure they are distinct from the
         # main U-Boot tree. All three should have the same postions and offset.
         start = 0
-        for item in ['', 'spl', 'tpl']:
+        self.maxDiff = None
+        for item in ['', 'spl', 'tpl', 'vpl']:
             dtb = fdt.Fdt.FromData(data[start:])
             dtb.Scan()
             props = self._GetPropTree(dtb, BASE_DTB_PROPS + REPACK_DTB_PROPS +
-                                      ['spl', 'tpl'])
+                                      ['spl', 'tpl', 'vpl'])
             expected = dict(base_expected)
             if item:
                 expected[item] = 0
@@ -1953,7 +1974,7 @@ class TestFunctional(unittest.TestCase):
             # over to the expected place.
             start = 0
             for fname in ['u-boot.dtb.out', 'spl/u-boot-spl.dtb.out',
-                          'tpl/u-boot-tpl.dtb.out']:
+                          'tpl/u-boot-tpl.dtb.out', 'vpl/u-boot-vpl.dtb.out']:
                 dtb = fdt.Fdt.FromData(data[start:])
                 size = dtb._fdt_obj.totalsize()
                 pathname = tools.get_output_filename(os.path.split(fname)[1])
@@ -1961,7 +1982,7 @@ class TestFunctional(unittest.TestCase):
                 name = os.path.split(fname)[0]
 
                 if name:
-                    orig_indata = self._GetDtbContentsForSplTpl(dtb_data, name)
+                    orig_indata = self._GetDtbContentsForSpls(dtb_data, name)
                 else:
                     orig_indata = dtb_data
                 self.assertNotEqual(outdata, orig_indata,
@@ -5351,16 +5372,6 @@ fdt         fdtmap                Extract the devicetree blob from the fdtmap
             "Node '/binman/u-boot': Please use 'extend-size' instead of 'expand-size'",
             str(e.exception))
 
-    def testMkimageMissingBlob(self):
-        """Test using mkimage to build an image"""
-        with test_util.capture_sys_output() as (stdout, stderr):
-            self._DoTestFile('229_mkimage_missing.dts', allow_missing=True,
-                             allow_fake_blobs=True)
-        err = stderr.getvalue()
-        self.assertRegex(
-            err,
-            "Image '.*' has faked external blobs and is non-functional: .*")
-
     def testFitSplitElf(self):
         """Test an image with an FIT with an split-elf operation"""
         if not elf.ELF_TOOLS:
@@ -5461,24 +5472,6 @@ fdt         fdtmap                Extract the devicetree blob from the fdtmap
             "Node '/binman/fit': subnode 'images/@atf-SEQ': Failed to read ELF file: Magic number does not match",
             str(exc.exception))
 
-    def testFitSplitElfBadDirective(self):
-        """Test a FIT split-elf invalid fit,xxx directive in an image node"""
-        if not elf.ELF_TOOLS:
-            self.skipTest('Python elftools not available')
-        err = self._check_bad_fit('227_fit_bad_dir.dts')
-        self.assertIn(
-            "Node '/binman/fit': subnode 'images/@atf-SEQ': Unknown directive 'fit,something'",
-            err)
-
-    def testFitSplitElfBadDirectiveConfig(self):
-        """Test a FIT split-elf with invalid fit,xxx directive in config"""
-        if not elf.ELF_TOOLS:
-            self.skipTest('Python elftools not available')
-        err = self._check_bad_fit('228_fit_bad_dir_config.dts')
-        self.assertEqual(
-            "Node '/binman/fit': subnode 'configurations/@config-SEQ': Unknown directive 'fit,config'",
-            err)
-
     def checkFitSplitElf(self, **kwargs):
         """Test an split-elf FIT with a missing ELF file
 
@@ -5505,6 +5498,25 @@ fdt         fdtmap                Extract the devicetree blob from the fdtmap
             err = stderr.getvalue()
         return out, err
 
+    def testFitSplitElfBadDirective(self):
+        """Test a FIT split-elf invalid fit,xxx directive in an image node"""
+        if not elf.ELF_TOOLS:
+            self.skipTest('Python elftools not available')
+        err = self._check_bad_fit('227_fit_bad_dir.dts')
+        self.assertIn(
+            "Node '/binman/fit': subnode 'images/@atf-SEQ': Unknown directive 'fit,something'",
+            err)
+
+    def testFitSplitElfBadDirectiveConfig(self):
+        """Test a FIT split-elf with invalid fit,xxx directive in config"""
+        if not elf.ELF_TOOLS:
+            self.skipTest('Python elftools not available')
+        err = self._check_bad_fit('228_fit_bad_dir_config.dts')
+        self.assertEqual(
+            "Node '/binman/fit': subnode 'configurations/@config-SEQ': Unknown directive 'fit,config'",
+            err)
+
+
     def testFitSplitElfMissing(self):
         """Test an split-elf FIT with a missing ELF file"""
         if not elf.ELF_TOOLS:
@@ -5531,31 +5543,41 @@ fdt         fdtmap                Extract the devicetree blob from the fdtmap
         fname = tools.get_output_filename('binman-fake/missing.elf')
         self.assertTrue(os.path.exists(fname))
 
+    def testMkimageMissingBlob(self):
+        """Test using mkimage to build an image"""
+        with test_util.capture_sys_output() as (stdout, stderr):
+            self._DoTestFile('229_mkimage_missing.dts', allow_missing=True,
+                             allow_fake_blobs=True)
+        err = stderr.getvalue()
+        self.assertRegex(
+            err,
+            "Image '.*' has faked external blobs and is non-functional: .*")
+
     def testPreLoad(self):
         """Test an image with a pre-load header"""
         entry_args = {
             'pre-load-key-path': '.',
         }
-        data, _, _, _ = self._DoReadFileDtb('225_pre_load.dts',
+        data, _, _, _ = self._DoReadFileDtb('230_pre_load.dts',
                                             entry_args=entry_args)
         self.assertEqual(PRE_LOAD_MAGIC, data[:len(PRE_LOAD_MAGIC)])
         self.assertEqual(PRE_LOAD_VERSION, data[4:4 + len(PRE_LOAD_VERSION)])
         self.assertEqual(PRE_LOAD_HDR_SIZE, data[8:8 + len(PRE_LOAD_HDR_SIZE)])
-        data = self._DoReadFile('225_pre_load.dts')
+        data = self._DoReadFile('230_pre_load.dts')
         self.assertEqual(PRE_LOAD_MAGIC, data[:len(PRE_LOAD_MAGIC)])
         self.assertEqual(PRE_LOAD_VERSION, data[4:4 + len(PRE_LOAD_VERSION)])
         self.assertEqual(PRE_LOAD_HDR_SIZE, data[8:8 + len(PRE_LOAD_HDR_SIZE)])
 
     def testPreLoadPkcs(self):
         """Test an image with a pre-load header with padding pkcs"""
-        data = self._DoReadFile('226_pre_load_pkcs.dts')
+        data = self._DoReadFile('231_pre_load_pkcs.dts')
         self.assertEqual(PRE_LOAD_MAGIC, data[:len(PRE_LOAD_MAGIC)])
         self.assertEqual(PRE_LOAD_VERSION, data[4:4 + len(PRE_LOAD_VERSION)])
         self.assertEqual(PRE_LOAD_HDR_SIZE, data[8:8 + len(PRE_LOAD_HDR_SIZE)])
 
     def testPreLoadPss(self):
         """Test an image with a pre-load header with padding pss"""
-        data = self._DoReadFile('227_pre_load_pss.dts')
+        data = self._DoReadFile('232_pre_load_pss.dts')
         self.assertEqual(PRE_LOAD_MAGIC, data[:len(PRE_LOAD_MAGIC)])
         self.assertEqual(PRE_LOAD_VERSION, data[4:4 + len(PRE_LOAD_VERSION)])
         self.assertEqual(PRE_LOAD_HDR_SIZE, data[8:8 + len(PRE_LOAD_HDR_SIZE)])
@@ -5563,22 +5585,22 @@ fdt         fdtmap                Extract the devicetree blob from the fdtmap
     def testPreLoadInvalidPadding(self):
         """Test an image with a pre-load header with an invalid padding"""
         with self.assertRaises(ValueError) as e:
-            data = self._DoReadFile('228_pre_load_invalid_padding.dts')
+            data = self._DoReadFile('233_pre_load_invalid_padding.dts')
 
     def testPreLoadInvalidSha(self):
         """Test an image with a pre-load header with an invalid hash"""
         with self.assertRaises(ValueError) as e:
-            data = self._DoReadFile('229_pre_load_invalid_sha.dts')
+            data = self._DoReadFile('234_pre_load_invalid_sha.dts')
 
     def testPreLoadInvalidAlgo(self):
         """Test an image with a pre-load header with an invalid algo"""
         with self.assertRaises(ValueError) as e:
-            data = self._DoReadFile('230_pre_load_invalid_algo.dts')
+            data = self._DoReadFile('235_pre_load_invalid_algo.dts')
 
     def testPreLoadInvalidKey(self):
         """Test an image with a pre-load header with an invalid key"""
         with self.assertRaises(ValueError) as e:
-            data = self._DoReadFile('231_pre_load_invalid_key.dts')
+            data = self._DoReadFile('236_pre_load_invalid_key.dts')
 
     def _CheckSafeUniqueNames(self, *images):
         """Check all entries of given images for unsafe unique names"""
@@ -5593,7 +5615,7 @@ fdt         fdtmap                Extract the devicetree blob from the fdtmap
 
     def testSafeUniqueNames(self):
         """Test entry unique names are safe in single image configuration"""
-        data = self._DoReadFileRealDtb('230_unique_names.dts')
+        data = self._DoReadFileRealDtb('237_unique_names.dts')
 
         orig_image = control.images['image']
         image_fname = tools.get_output_filename('image.bin')
@@ -5603,7 +5625,7 @@ fdt         fdtmap                Extract the devicetree blob from the fdtmap
 
     def testSafeUniqueNamesMulti(self):
         """Test entry unique names are safe with multiple images"""
-        data = self._DoReadFileRealDtb('231_unique_names_multi.dts')
+        data = self._DoReadFileRealDtb('238_unique_names_multi.dts')
 
         orig_image = control.images['image']
         image_fname = tools.get_output_filename('image.bin')
@@ -5613,7 +5635,7 @@ fdt         fdtmap                Extract the devicetree blob from the fdtmap
 
     def testReplaceCmdWithBintool(self):
         """Test replacing an entry that needs a bintool to pack"""
-        data = self._DoReadFileRealDtb('232_replace_with_bintool.dts')
+        data = self._DoReadFileRealDtb('239_replace_with_bintool.dts')
         expected = U_BOOT_DATA + b'aa'
         self.assertEqual(expected, data[:len(expected)])
 
@@ -5632,7 +5654,7 @@ fdt         fdtmap                Extract the devicetree blob from the fdtmap
 
     def testReplaceCmdOtherWithBintool(self):
         """Test replacing an entry when another needs a bintool to pack"""
-        data = self._DoReadFileRealDtb('232_replace_with_bintool.dts')
+        data = self._DoReadFileRealDtb('239_replace_with_bintool.dts')
         expected = U_BOOT_DATA + b'aa'
         self.assertEqual(expected, data[:len(expected)])
 
@@ -5672,7 +5694,7 @@ fdt         fdtmap                Extract the devicetree blob from the fdtmap
 
     def testExtractFit(self):
         """Test extracting a FIT section"""
-        self._DoReadFileRealDtb('233_fit_extract_replace.dts')
+        self._DoReadFileRealDtb('240_fit_extract_replace.dts')
         image_fname = tools.get_output_filename('image.bin')
 
         fit_data = control.ReadEntry(image_fname, 'fit')
@@ -5691,7 +5713,7 @@ fdt         fdtmap                Extract the devicetree blob from the fdtmap
 
     def testExtractFitSubentries(self):
         """Test extracting FIT section subentries"""
-        self._DoReadFileRealDtb('233_fit_extract_replace.dts')
+        self._DoReadFileRealDtb('240_fit_extract_replace.dts')
         image_fname = tools.get_output_filename('image.bin')
 
         for entry_path, expected in [
@@ -5710,7 +5732,7 @@ fdt         fdtmap                Extract the devicetree blob from the fdtmap
         new_data = b'x' * len(U_BOOT_DATA)
         data, expected_fdtmap, _ = self._RunReplaceCmd(
             'fit/kernel/u-boot', new_data,
-            dts='233_fit_extract_replace.dts')
+            dts='240_fit_extract_replace.dts')
         self.assertEqual(new_data, data)
 
         path, fdtmap = state.GetFdtContents('fdtmap')
@@ -5722,7 +5744,7 @@ fdt         fdtmap                Extract the devicetree blob from the fdtmap
         new_data = b'ub' * len(U_BOOT_NODTB_DATA)
         data, expected_fdtmap, _ = self._RunReplaceCmd(
             'fit/fdt-1/u-boot-nodtb', new_data,
-            dts='233_fit_extract_replace.dts')
+            dts='240_fit_extract_replace.dts')
         self.assertEqual(new_data, data)
 
         # Will be repacked, so fdtmap must change
@@ -5736,7 +5758,7 @@ fdt         fdtmap                Extract the devicetree blob from the fdtmap
         expected = new_data.ljust(len(U_BOOT_NODTB_DATA), b'\0')
         data, expected_fdtmap, _ = self._RunReplaceCmd(
             'fit/fdt-1/u-boot-nodtb', new_data,
-            dts='233_fit_extract_replace.dts')
+            dts='240_fit_extract_replace.dts')
         self.assertEqual(expected, data)
 
         path, fdtmap = state.GetFdtContents('fdtmap')
@@ -5748,14 +5770,14 @@ fdt         fdtmap                Extract the devicetree blob from the fdtmap
         new_data = b'w' * len(COMPRESS_DATA + U_BOOT_DATA)
         with self.assertRaises(ValueError) as exc:
             self._RunReplaceCmd('section', new_data,
-                                dts='234_replace_section_simple.dts')
+                                dts='241_replace_section_simple.dts')
         self.assertIn(
             "Node '/section': Replacing sections is not implemented yet",
             str(exc.exception))
 
     def testMkimageImagename(self):
         """Test using mkimage with -n holding the data too"""
-        data = self._DoReadFile('235_mkimage_name.dts')
+        data = self._DoReadFile('242_mkimage_name.dts')
 
         # Check that the data appears in the file somewhere
         self.assertIn(U_BOOT_SPL_DATA, data)
@@ -5772,7 +5794,7 @@ fdt         fdtmap                Extract the devicetree blob from the fdtmap
 
     def testMkimageImage(self):
         """Test using mkimage with -n holding the data too"""
-        data = self._DoReadFile('236_mkimage_image.dts')
+        data = self._DoReadFile('243_mkimage_image.dts')
 
         # Check that the data appears in the file somewhere
         self.assertIn(U_BOOT_SPL_DATA, data)
@@ -5793,20 +5815,20 @@ fdt         fdtmap                Extract the devicetree blob from the fdtmap
     def testMkimageImageNoContent(self):
         """Test using mkimage with -n and no data"""
         with self.assertRaises(ValueError) as exc:
-            self._DoReadFile('237_mkimage_image_no_content.dts')
+            self._DoReadFile('244_mkimage_image_no_content.dts')
         self.assertIn('Could not complete processing of contents',
                       str(exc.exception))
 
     def testMkimageImageBad(self):
         """Test using mkimage with imagename node and data-to-imagename"""
         with self.assertRaises(ValueError) as exc:
-            self._DoReadFile('238_mkimage_image_bad.dts')
+            self._DoReadFile('245_mkimage_image_bad.dts')
         self.assertIn('Cannot use both imagename node and data-to-imagename',
                       str(exc.exception))
 
     def testCollectionOther(self):
         """Test a collection where the data comes from another section"""
-        data = self._DoReadFile('239_collection_other.dts')
+        data = self._DoReadFile('246_collection_other.dts')
         self.assertEqual(U_BOOT_NODTB_DATA + U_BOOT_DTB_DATA +
                          tools.get_bytes(0xff, 2) + U_BOOT_NODTB_DATA +
                          tools.get_bytes(0xfe, 3) + U_BOOT_DTB_DATA,
@@ -5814,20 +5836,20 @@ fdt         fdtmap                Extract the devicetree blob from the fdtmap
 
     def testMkimageCollection(self):
         """Test using a collection referring to an entry in a mkimage entry"""
-        data = self._DoReadFile('240_mkimage_coll.dts')
+        data = self._DoReadFile('247_mkimage_coll.dts')
         expect = U_BOOT_SPL_DATA + U_BOOT_DATA
         self.assertEqual(expect, data[:len(expect)])
 
     def testCompressDtbPrependInvalid(self):
         """Test that invalid header is detected"""
         with self.assertRaises(ValueError) as e:
-            self._DoReadFileDtb('235_compress_dtb_prepend_invalid.dts')
+            self._DoReadFileDtb('248_compress_dtb_prepend_invalid.dts')
         self.assertIn("Node '/binman/u-boot-dtb': Invalid prepend in "
                       "'u-boot-dtb': 'invalid'", str(e.exception))
 
     def testCompressDtbPrependLength(self):
         """Test that compress with length header works as expected"""
-        data = self._DoReadFileRealDtb('236_compress_dtb_prepend_length.dts')
+        data = self._DoReadFileRealDtb('249_compress_dtb_prepend_length.dts')
         image = control.images['image']
         entries = image.GetEntries()
         self.assertIn('u-boot-dtb', entries)
@@ -5860,7 +5882,7 @@ fdt         fdtmap                Extract the devicetree blob from the fdtmap
     def testInvalidCompress(self):
         """Test that invalid compress algorithm is detected"""
         with self.assertRaises(ValueError) as e:
-            self._DoTestFile('237_compress_dtb_invalid.dts')
+            self._DoTestFile('250_compress_dtb_invalid.dts')
         self.assertIn("Unknown algorithm 'invalid'", str(e.exception))
 
     def testCompUtilCompressions(self):
@@ -5893,10 +5915,86 @@ fdt         fdtmap                Extract the devicetree blob from the fdtmap
     def testCompressDtbZstd(self):
         """Test that zstd compress of device-tree files failed"""
         with self.assertRaises(ValueError) as e:
-            self._DoTestFile('238_compress_dtb_zstd.dts')
+            self._DoTestFile('251_compress_dtb_zstd.dts')
         self.assertIn("Node '/binman/u-boot-dtb': The zstd compression "
                       "requires a length header", str(e.exception))
 
+    def testMkimageMultipleDataFiles(self):
+        """Test passing multiple files to mkimage in a mkimage entry"""
+        data = self._DoReadFile('252_mkimage_mult_data.dts')
+        # Size of files are packed in their 4B big-endian format
+        expect = struct.pack('>I', len(U_BOOT_TPL_DATA))
+        expect += struct.pack('>I', len(U_BOOT_SPL_DATA))
+        # Size info is always followed by a 4B zero value.
+        expect += tools.get_bytes(0, 4)
+        expect += U_BOOT_TPL_DATA
+        # All but last files are 4B-aligned
+        align_pad = len(U_BOOT_TPL_DATA) % 4
+        if align_pad:
+            expect += tools.get_bytes(0, align_pad)
+        expect += U_BOOT_SPL_DATA
+        self.assertEqual(expect, data[-len(expect):])
+
+    def testMkimageMultipleNoContent(self):
+        """Test passing multiple data files to mkimage with one data file having no content"""
+        with self.assertRaises(ValueError) as exc:
+            self._DoReadFile('253_mkimage_mult_no_content.dts')
+        self.assertIn('Could not complete processing of contents',
+                      str(exc.exception))
+
+    def testMkimageFilename(self):
+        """Test using mkimage to build a binary with a filename"""
+        retcode = self._DoTestFile('254_mkimage_filename.dts')
+        self.assertEqual(0, retcode)
+        fname = tools.get_output_filename('mkimage-test.bin')
+        self.assertTrue(os.path.exists(fname))
+
+    def testVpl(self):
+        """Test that an image with VPL and its device tree can be created"""
+        # ELF file with a '__bss_size' symbol
+        self._SetupVplElf()
+        data = self._DoReadFile('255_u_boot_vpl.dts')
+        self.assertEqual(U_BOOT_VPL_DATA + U_BOOT_VPL_DTB_DATA, data)
+
+    def testVplNoDtb(self):
+        """Test that an image with vpl/u-boot-vpl-nodtb.bin can be created"""
+        self._SetupVplElf()
+        data = self._DoReadFile('256_u_boot_vpl_nodtb.dts')
+        self.assertEqual(U_BOOT_VPL_NODTB_DATA,
+                         data[:len(U_BOOT_VPL_NODTB_DATA)])
+
+    def testExpandedVpl(self):
+        """Test that an expanded entry type is selected for TPL when needed"""
+        self._SetupVplElf()
+
+        entry_args = {
+            'vpl-bss-pad': 'y',
+            'vpl-dtb': 'y',
+        }
+        self._DoReadFileDtb('257_fdt_incl_vpl.dts', use_expanded=True,
+                            entry_args=entry_args)
+        image = control.images['image']
+        entries = image.GetEntries()
+        self.assertEqual(1, len(entries))
+
+        # We only have u-boot-vpl, which be expanded
+        self.assertIn('u-boot-vpl', entries)
+        entry = entries['u-boot-vpl']
+        self.assertEqual('u-boot-vpl-expanded', entry.etype)
+        subent = entry.GetEntries()
+        self.assertEqual(3, len(subent))
+        self.assertIn('u-boot-vpl-nodtb', subent)
+        self.assertIn('u-boot-vpl-bss-pad', subent)
+        self.assertIn('u-boot-vpl-dtb', subent)
+
+    def testVplBssPadMissing(self):
+        """Test that a missing symbol is detected"""
+        self._SetupVplElf('u_boot_ucode_ptr')
+        with self.assertRaises(ValueError) as e:
+            self._DoReadFile('258_vpl_bss_pad.dts')
+        self.assertIn('Expected __bss_size symbol in vpl/u-boot-vpl',
+                      str(e.exception))
+
 
 if __name__ == "__main__":
     unittest.main()
index a302e1f..56e5bf8 100644 (file)
@@ -22,6 +22,7 @@ OUR_PATH = os.path.dirname(os.path.realpath(__file__))
 DTB_TYPE_FNAME = {
     'u-boot-spl-dtb': 'spl/u-boot-spl.dtb',
     'u-boot-tpl-dtb': 'tpl/u-boot-tpl.dtb',
+    'u-boot-vpl-dtb': 'vpl/u-boot-vpl.dtb',
     }
 
 # Records the device-tree files known to binman, keyed by entry type (e.g.
@@ -292,7 +293,7 @@ def GetAllFdts():
     """Yield all device tree files being used by binman
 
     Yields:
-        Device trees being used (U-Boot proper, SPL, TPL)
+        Device trees being used (U-Boot proper, SPL, TPL, VPL)
     """
     if main_dtb:
         yield main_dtb
index 284975c..1aea569 100644 (file)
@@ -14,5 +14,7 @@
                };
                u-boot-tpl-dtb {
                };
+               u-boot-vpl-dtb {
+               };
        };
 };
similarity index 86%
rename from tools/binman/test/225_pre_load.dts
rename to tools/binman/test/230_pre_load.dts
index c1ffe1a..c0c2472 100644 (file)
@@ -10,7 +10,7 @@
                pre-load {
                        content = <&image>;
                         algo-name = "sha256,rsa2048";
-                        key-name = "tools/binman/test/225_dev.key";
+                        key-name = "tools/binman/test/230_dev.key";
                         header-size = <4096>;
                         version = <0x11223344>;
                };
similarity index 87%
rename from tools/binman/test/226_pre_load_pkcs.dts
rename to tools/binman/test/231_pre_load_pkcs.dts
index 3db0a37..530638c 100644 (file)
@@ -11,7 +11,7 @@
                        content = <&image>;
                         algo-name = "sha256,rsa2048";
                         padding-name = "pkcs-1.5";
-                        key-name = "tools/binman/test/225_dev.key";
+                        key-name = "tools/binman/test/230_dev.key";
                         header-size = <4096>;
                         version = <0x11223344>;
                };
similarity index 87%
rename from tools/binman/test/227_pre_load_pss.dts
rename to tools/binman/test/232_pre_load_pss.dts
index b1b01d5..371e0fd 100644 (file)
@@ -11,7 +11,7 @@
                        content = <&image>;
                         algo-name = "sha256,rsa2048";
                         padding-name = "pss";
-                        key-name = "tools/binman/test/225_dev.key";
+                        key-name = "tools/binman/test/230_dev.key";
                         header-size = <4096>;
                         version = <0x11223344>;
                };
@@ -11,7 +11,7 @@
                        content = <&image>;
                         algo-name = "sha256,rsa2048";
                         padding-name = "padding";
-                        key-name = "tools/binman/test/225_dev.key";
+                        key-name = "tools/binman/test/230_dev.key";
                         header-size = <4096>;
                         version = <1>;
                };
@@ -11,7 +11,7 @@
                        content = <&image>;
                         algo-name = "sha2560,rsa2048";
                         padding-name = "pkcs-1.5";
-                        key-name = "tools/binman/test/225_dev.key";
+                        key-name = "tools/binman/test/230_dev.key";
                         header-size = <4096>;
                         version = <1>;
                };
@@ -11,7 +11,7 @@
                        content = <&image>;
                         algo-name = "sha256,rsa20480";
                         padding-name = "pkcs-1.5";
-                        key-name = "tools/binman/test/225_dev.key";
+                        key-name = "tools/binman/test/230_dev.key";
                         header-size = <4096>;
                         version = <1>;
                };
@@ -11,7 +11,7 @@
                        content = <&image>;
                         algo-name = "sha256,rsa4096";
                         padding-name = "pkcs-1.5";
-                        key-name = "tools/binman/test/225_dev.key";
+                        key-name = "tools/binman/test/230_dev.key";
                         header-size = <4096>;
                         version = <1>;
                };
diff --git a/tools/binman/test/252_mkimage_mult_data.dts b/tools/binman/test/252_mkimage_mult_data.dts
new file mode 100644 (file)
index 0000000..a092bc3
--- /dev/null
@@ -0,0 +1,21 @@
+// SPDX-License-Identifier: GPL-2.0+
+
+/dts-v1/;
+
+/ {
+       #address-cells = <1>;
+       #size-cells = <1>;
+
+       binman {
+               mkimage {
+                       args = "-T script";
+                       multiple-data-files;
+
+                       u-boot-tpl {
+                       };
+
+                       u-boot-spl {
+                       };
+               };
+       };
+};
diff --git a/tools/binman/test/253_mkimage_mult_no_content.dts b/tools/binman/test/253_mkimage_mult_no_content.dts
new file mode 100644 (file)
index 0000000..dd65666
--- /dev/null
@@ -0,0 +1,22 @@
+// SPDX-License-Identifier: GPL-2.0+
+
+/dts-v1/;
+
+/ {
+       #address-cells = <1>;
+       #size-cells = <1>;
+
+       binman {
+               mkimage {
+                       args = "-T script";
+                       multiple-data-files;
+
+                       _testing {
+                               return-unknown-contents;
+                       };
+
+                       u-boot-spl {
+                       };
+               };
+       };
+};
diff --git a/tools/binman/test/254_mkimage_filename.dts b/tools/binman/test/254_mkimage_filename.dts
new file mode 100644 (file)
index 0000000..4483790
--- /dev/null
@@ -0,0 +1,18 @@
+// SPDX-License-Identifier: GPL-2.0+
+
+/dts-v1/;
+
+/ {
+       #address-cells = <1>;
+       #size-cells = <1>;
+
+       binman {
+               mkimage {
+                       filename = "mkimage-test.bin";
+                       args = "-T script";
+
+                       u-boot-spl {
+                       };
+               };
+       };
+};
diff --git a/tools/binman/test/255_u_boot_vpl.dts b/tools/binman/test/255_u_boot_vpl.dts
new file mode 100644 (file)
index 0000000..a3a281a
--- /dev/null
@@ -0,0 +1,11 @@
+// SPDX-License-Identifier: GPL-2.0+
+/dts-v1/;
+
+/ {
+       binman {
+               u-boot-vpl {
+               };
+               u-boot-vpl-dtb {
+               };
+       };
+};
diff --git a/tools/binman/test/256_u_boot_vpl_nodtb.dts b/tools/binman/test/256_u_boot_vpl_nodtb.dts
new file mode 100644 (file)
index 0000000..055016b
--- /dev/null
@@ -0,0 +1,13 @@
+// SPDX-License-Identifier: GPL-2.0+
+
+/dts-v1/;
+
+/ {
+       #address-cells = <1>;
+       #size-cells = <1>;
+
+       binman {
+               u-boot-vpl-nodtb {
+               };
+       };
+};
diff --git a/tools/binman/test/257_fdt_incl_vpl.dts b/tools/binman/test/257_fdt_incl_vpl.dts
new file mode 100644 (file)
index 0000000..435256f
--- /dev/null
@@ -0,0 +1,13 @@
+// SPDX-License-Identifier: GPL-2.0+
+
+/dts-v1/;
+
+/ {
+       #address-cells = <1>;
+       #size-cells = <1>;
+
+       binman {
+               u-boot-vpl {
+               };
+       };
+};
diff --git a/tools/binman/test/258_vpl_bss_pad.dts b/tools/binman/test/258_vpl_bss_pad.dts
new file mode 100644 (file)
index 0000000..d308dca
--- /dev/null
@@ -0,0 +1,19 @@
+// SPDX-License-Identifier: GPL-2.0+
+
+/dts-v1/;
+
+/ {
+       #address-cells = <1>;
+       #size-cells = <1>;
+
+       binman {
+               u-boot-vpl {
+               };
+
+               u-boot-vpl-bss-pad {
+               };
+
+               u-boot {
+               };
+       };
+};
index 16bcd4d..da4fe32 100644 (file)
@@ -84,7 +84,7 @@ static unsigned char kwboot_msg_debug[] = {
 #define KWBOOT_MSG_RSP_TIMEO   50 /* ms */
 
 /* Defines known to work on Armada XP */
-#define KWBOOT_MSG_RSP_TIMEO_AXP       1000 /* ms */
+#define KWBOOT_MSG_RSP_TIMEO_AXP       10 /* ms */
 
 /*
  * Xmodem Transfers
index 9226b66..8c5c9cc 100644 (file)
@@ -3,7 +3,7 @@
 .. Simon Glass <sjg@chromium.org>
 .. v1, v2, 19-Oct-11
 .. revised v3 24-Nov-11
-.. revised v4 04-Jul-2020, with Patchwork integration
+.. revised v4 Independence Day 2020, with Patchwork integration
 
 Patman patch manager
 ====================
@@ -11,21 +11,15 @@ Patman patch manager
 This tool is a Python script which:
 
 - Creates patch directly from your branch
-
 - Cleans them up by removing unwanted tags
-
 - Inserts a cover letter with change lists
-
 - Runs the patches through checkpatch.pl and its own checks
-
 - Optionally emails them out to selected people
 
 It also has some Patchwork features:
 
 - shows review tags from Patchwork so you can update your local patches
-
 - pulls these down into a new branch on request
-
 - lists comments received on a series
 
 It is intended to automate patch creation and make it a less
@@ -53,15 +47,12 @@ This tool requires a certain way of working:
 
 - Maintain a number of branches, one for each patch series you are
   working on
-
 - Add tags into the commits within each branch to indicate where the
   series should be sent, cover letter, version, etc. Most of these are
   normally in the top commit so it is easy to change them with 'git
   commit --amend'
-
 - Each branch tracks the upstream branch, so that this script can
   automatically determine the number of commits in it (optional)
-
 - Check out a branch, and run this script to create and send out your
   patches. Weeks later, change the patches and repeat, knowing that you
   will get a consistent result each time.
@@ -623,41 +614,35 @@ and it will create and send the version 2 series.
 General points
 --------------
 
-1. When you change back to the us-cmd branch days or weeks later all your
+#. When you change back to the us-cmd branch days or weeks later all your
    information is still there, safely stored in the commits. You don't need
    to remember what version you are up to, who you sent the last lot of patches
    to, or anything about the change logs.
-
-2. If you put tags in the subject, patman will Cc the maintainers
+#. If you put tags in the subject, patman will Cc the maintainers
    automatically in many cases.
-
-3. If you want to keep the commits from each series you sent so that you can
+#. If you want to keep the commits from each series you sent so that you can
    compare change and see what you did, you can either create a new branch for
    each version, or just tag the branch before you start changing it:
 
-.. code-block:: bash
+   .. code-block:: bash
 
         git tag sent/us-cmd-rfc
         # ...later...
         git tag sent/us-cmd-v2
 
-4. If you want to modify the patches a little before sending, you can do
+#. If you want to modify the patches a little before sending, you can do
    this in your editor, but be careful!
-
-5. If you want to run git send-email yourself, use the -n flag which will
+#. If you want to run git send-email yourself, use the -n flag which will
    print out the command line patman would have used.
-
-6. It is a good idea to add the change log info as you change the commit,
+#. It is a good idea to add the change log info as you change the commit,
    not later when you can't remember which patch you changed. You can always
    go back and change or remove logs from commits.
-
-7. Some mailing lists have size limits and when we add binary contents to
+#. Some mailing lists have size limits and when we add binary contents to
    our patches it's easy to exceed the size limits. Use "--no-binary" to
    generate patches without any binary contents. You are supposed to include
    a link to a git repository in your "Commit-notes", "Series-notes" or
    "Cover-letter" for maintainers to fetch the original commit.
-
-8. Patches will have no changelog entries for revisions where they did not
+#. Patches will have no changelog entries for revisions where they did not
    change. For clarity, if there are no changes for this patch in the most
    recent revision of the series, a note will be added. For example, a patch
    with the following tags in the commit::
@@ -669,15 +654,15 @@ General points
         Series-changes: 4
         - Another change
 
-would have a changelog of:::
+   would have a changelog of:::
 
-    (no changes since v4)
+        (no changes since v4)
 
-    Changes in v4:
-    - Another change
+        Changes in v4:
+        - Another change
 
-    Changes in v2:
-    - Some change
+        Changes in v2:
+        - Some change
 
 
 Other thoughts
index 56200bd..7a8d74b 100644 (file)
@@ -34,7 +34,7 @@
 #define pr_warn(fmt, args...)  fprintf(stderr, pr_fmt(fmt), "warning", ##args)
 #define pr_info(fmt, args...)  fprintf(stderr, pr_fmt(fmt), "info", ##args)
 
-#if defined(LIBRESSL_VERSION_NUMBER)
+#if defined(LIBRESSL_VERSION_NUMBER) && LIBRESSL_VERSION_NUMBER < 0x3050000fL
 #define RSA_get0_n(key) (key)->n
 #define RSA_get0_e(key) (key)->e
 #define RSA_get0_d(key) (key)->d
index 45f5c12..0806a91 100644 (file)
@@ -29,6 +29,7 @@
 #include <errno.h>
 #include <sys/ioctl.h>
 #include <sys/types.h>
+#include <asm/ioctls.h>
 #include <asm/termbits.h>
 
 #if defined(BOTHER) && defined(TCGETS2)