Merge tag 'dm-pull-8jan20' of git://git.denx.de/u-boot-dm
authorTom Rini <trini@konsulko.com>
Thu, 9 Jan 2020 13:52:21 +0000 (08:52 -0500)
committerTom Rini <trini@konsulko.com>
Thu, 9 Jan 2020 13:52:21 +0000 (08:52 -0500)
dm: Increased separation of ofdata_to_platdata() and probe methods

254 files changed:
Kconfig
Makefile
arch/arm/Kconfig
arch/arm/dts/Makefile
arch/arm/dts/imx8mp-evk-u-boot.dtsi [new file with mode: 0644]
arch/arm/dts/imx8mp-evk.dts [new file with mode: 0644]
arch/arm/dts/imx8mp-pinfunc.h [new file with mode: 0644]
arch/arm/dts/imx8mp.dtsi [new file with mode: 0644]
arch/arm/dts/meson-sm1-khadas-vim3l.dts [new file with mode: 0644]
arch/arm/dts/socfpga-common-u-boot.dtsi
arch/arm/dts/socfpga.dtsi
arch/arm/dts/socfpga_agilex-u-boot.dtsi [new file with mode: 0644]
arch/arm/dts/socfpga_agilex.dtsi [new file with mode: 0644]
arch/arm/dts/socfpga_agilex_socdk-u-boot.dtsi [new file with mode: 0644]
arch/arm/dts/socfpga_agilex_socdk.dts [new file with mode: 0644]
arch/arm/dts/socfpga_arria10.dtsi
arch/arm/dts/socfpga_arria10_socdk.dtsi
arch/arm/dts/socfpga_stratix10.dtsi
arch/arm/dts/socfpga_stratix10_socdk-u-boot.dtsi
arch/arm/dts/uniphier-pinctrl.dtsi
arch/arm/include/asm/arch-imx/cpu.h
arch/arm/include/asm/arch-imx8m/clock.h
arch/arm/include/asm/arch-imx8m/clock_imx8mm.h
arch/arm/include/asm/arch-imx8m/imx8mp_pins.h [new file with mode: 0644]
arch/arm/include/asm/mach-imx/iomux-v3.h
arch/arm/include/asm/mach-imx/sys_proto.h
arch/arm/mach-imx/Kconfig
arch/arm/mach-imx/cpu.c
arch/arm/mach-imx/imx8m/Kconfig
arch/arm/mach-imx/imx8m/Makefile
arch/arm/mach-imx/imx8m/clock_imx8mm.c
arch/arm/mach-imx/imx8m/clock_imx8mq.c
arch/arm/mach-imx/imx8m/clock_slice.c
arch/arm/mach-imx/imx8m/imximage-8mp-lpddr4.cfg [new file with mode: 0644]
arch/arm/mach-imx/imx8m/soc.c
arch/arm/mach-imx/spl.c
arch/arm/mach-meson/Kconfig
arch/arm/mach-socfpga/Kconfig
arch/arm/mach-socfpga/Makefile
arch/arm/mach-socfpga/clock_manager.c
arch/arm/mach-socfpga/clock_manager_agilex.c [new file with mode: 0644]
arch/arm/mach-socfpga/clock_manager_arria10.c
arch/arm/mach-socfpga/clock_manager_gen5.c
arch/arm/mach-socfpga/clock_manager_s10.c
arch/arm/mach-socfpga/firewall.c [new file with mode: 0644]
arch/arm/mach-socfpga/include/mach/base_addr_s10.h
arch/arm/mach-socfpga/include/mach/clock_manager.h
arch/arm/mach-socfpga/include/mach/clock_manager_agilex.h [new file with mode: 0644]
arch/arm/mach-socfpga/include/mach/clock_manager_arria10.h
arch/arm/mach-socfpga/include/mach/clock_manager_gen5.h
arch/arm/mach-socfpga/include/mach/clock_manager_s10.h
arch/arm/mach-socfpga/include/mach/clock_manager_soc64.h [new file with mode: 0644]
arch/arm/mach-socfpga/include/mach/firewall.h [new file with mode: 0644]
arch/arm/mach-socfpga/include/mach/firewall_s10.h [deleted file]
arch/arm/mach-socfpga/include/mach/handoff_s10.h
arch/arm/mach-socfpga/include/mach/misc.h
arch/arm/mach-socfpga/include/mach/reset_manager.h
arch/arm/mach-socfpga/include/mach/reset_manager_arria10.h
arch/arm/mach-socfpga/include/mach/reset_manager_gen5.h
arch/arm/mach-socfpga/include/mach/reset_manager_s10.h [deleted file]
arch/arm/mach-socfpga/include/mach/reset_manager_soc64.h [new file with mode: 0644]
arch/arm/mach-socfpga/include/mach/system_manager.h
arch/arm/mach-socfpga/include/mach/system_manager_arria10.h
arch/arm/mach-socfpga/include/mach/system_manager_gen5.h
arch/arm/mach-socfpga/include/mach/system_manager_s10.h [deleted file]
arch/arm/mach-socfpga/include/mach/system_manager_soc64.h [new file with mode: 0644]
arch/arm/mach-socfpga/mailbox_s10.c
arch/arm/mach-socfpga/misc.c
arch/arm/mach-socfpga/misc_arria10.c
arch/arm/mach-socfpga/misc_gen5.c
arch/arm/mach-socfpga/misc_s10.c
arch/arm/mach-socfpga/reset_manager_arria10.c
arch/arm/mach-socfpga/reset_manager_gen5.c
arch/arm/mach-socfpga/reset_manager_s10.c
arch/arm/mach-socfpga/scan_manager.c
arch/arm/mach-socfpga/spl_a10.c
arch/arm/mach-socfpga/spl_agilex.c [new file with mode: 0644]
arch/arm/mach-socfpga/spl_gen5.c
arch/arm/mach-socfpga/spl_s10.c
arch/arm/mach-socfpga/system_manager_gen5.c
arch/arm/mach-socfpga/system_manager_s10.c
arch/arm/mach-socfpga/wrap_pll_config_s10.c
arch/arm/mach-stm32mp/cpu.c
arch/arm/mach-stm32mp/include/mach/stm32.h
arch/sandbox/dts/test.dts
board/amlogic/w400/MAINTAINERS
board/amlogic/w400/README.khadas-vim3l [new file with mode: 0644]
board/emulation/qemu-arm/qemu-arm.c
board/freescale/imx8mn_evk/README [new file with mode: 0644]
board/freescale/imx8mn_evk/imx8mn_evk.c
board/freescale/imx8mp_evk/Kconfig [new file with mode: 0644]
board/freescale/imx8mp_evk/MAINTAINERS [new file with mode: 0644]
board/freescale/imx8mp_evk/Makefile [new file with mode: 0644]
board/freescale/imx8mp_evk/imx8mp_evk.c [new file with mode: 0644]
board/freescale/imx8mp_evk/lpddr4_timing.c [new file with mode: 0644]
board/freescale/imx8mp_evk/spl.c [new file with mode: 0644]
board/intel/agilex-socdk/MAINTAINERS [new file with mode: 0644]
board/intel/agilex-socdk/Makefile [new file with mode: 0644]
board/intel/agilex-socdk/socfpga.c [new file with mode: 0644]
board/st/stm32mp1/stm32mp1.c
board/wandboard/wandboard.c
cmd/Kconfig
cmd/Makefile
cmd/bdinfo.c
cmd/bootefi.c
cmd/dfu.c
cmd/efidebug.c
cmd/rng.c [new file with mode: 0644]
common/bootm_os.c
common/dfu.c
common/image-fit.c
common/image.c
common/spl/Kconfig
common/spl/spl_fit.c
configs/edison_defconfig
configs/imx8mn_ddr4_evk_defconfig
configs/imx8mp_evk_defconfig [new file with mode: 0644]
configs/khadas-vim3l_defconfig [new file with mode: 0644]
configs/qemu_arm64_defconfig
configs/qemu_arm_defconfig
configs/sandbox64_defconfig
configs/sandbox_defconfig
configs/socfpga_agilex_defconfig [new file with mode: 0644]
configs/stm32mp15_basic_defconfig
configs/stm32mp15_optee_defconfig
configs/stm32mp15_trusted_defconfig
configs/uniphier_v7_defconfig
configs/uniphier_v8_defconfig
doc/README.dfu
doc/uImage.FIT/uefi.its [new file with mode: 0644]
doc/uefi/uefi.rst
drivers/Kconfig
drivers/Makefile
drivers/ata/fsl_sata.c
drivers/ata/sata_sil.c
drivers/board/Kconfig
drivers/board/Makefile
drivers/board/board-uclass.c
drivers/cache/Kconfig
drivers/cache/Makefile
drivers/cache/cache-ncore.c [new file with mode: 0644]
drivers/clk/altera/Makefile
drivers/clk/altera/clk-agilex.c [new file with mode: 0644]
drivers/clk/altera/clk-agilex.h [new file with mode: 0644]
drivers/clk/clk_stm32mp1.c
drivers/clk/imx/Kconfig
drivers/clk/imx/Makefile
drivers/clk/imx/clk-imx8mp.c [new file with mode: 0644]
drivers/clk/imx/clk.h
drivers/ddr/altera/Kconfig
drivers/ddr/altera/Makefile
drivers/ddr/altera/sdram_agilex.c [new file with mode: 0644]
drivers/ddr/altera/sdram_gen5.c
drivers/ddr/altera/sdram_s10.c
drivers/ddr/altera/sdram_s10.h
drivers/ddr/altera/sdram_soc64.c [new file with mode: 0644]
drivers/ddr/altera/sdram_soc64.h [new file with mode: 0644]
drivers/ddr/imx/imx8m/ddrphy_utils.c
drivers/dfu/Kconfig
drivers/dfu/dfu.c
drivers/fpga/socfpga_arria10.c
drivers/fpga/socfpga_gen5.c
drivers/misc/mxc_ocotp.c
drivers/mmc/socfpga_dw_mmc.c
drivers/pinctrl/nxp/pinctrl-imx8m.c
drivers/power/pmic/Kconfig
drivers/power/pmic/Makefile
drivers/power/pmic/pca9450.c [new file with mode: 0644]
drivers/power/pmic/pmic_pca9450.c [new file with mode: 0644]
drivers/power/regulator/regulator_common.c
drivers/remoteproc/rproc-elf-loader.c
drivers/remoteproc/stm32_copro.c
drivers/rng/Kconfig [new file with mode: 0644]
drivers/rng/Makefile [new file with mode: 0644]
drivers/rng/rng-uclass.c [new file with mode: 0644]
drivers/rng/sandbox_rng.c [new file with mode: 0644]
drivers/rng/stm32mp1_rng.c [new file with mode: 0644]
drivers/sysreset/sysreset_socfpga.c
drivers/video/meson/meson_canvas.c
drivers/video/meson/meson_plane.c
drivers/video/meson/meson_vclk.c
drivers/video/meson/meson_venc.c
drivers/video/meson/meson_vpu.c
drivers/video/meson/meson_vpu.h
drivers/video/meson/meson_vpu_init.c
drivers/virtio/Kconfig
drivers/virtio/Makefile
drivers/virtio/virtio-uclass.c
drivers/virtio/virtio_rng.c [new file with mode: 0644]
dts/Kconfig
include/board.h
include/configs/gardena-smart-gateway-at91sam.h
include/configs/imx8mp_evk.h [new file with mode: 0644]
include/configs/ls1046a_common.h
include/configs/mccmon6.h
include/configs/meson64.h
include/configs/microblaze-generic.h
include/configs/mt7623.h
include/configs/mt7629.h
include/configs/mt8518.h
include/configs/omap3_cairo.h
include/configs/pumpkin.h
include/configs/socfpga_agilex_socdk.h [new file with mode: 0644]
include/configs/socfpga_soc64_common.h [new file with mode: 0644]
include/configs/socfpga_stratix10_socdk.h
include/configs/tegra-common.h
include/configs/x600.h
include/configs/xilinx_zynqmp_r5.h
include/configs/zynq-common.h
include/dfu.h
include/dm/uclass-id.h
include/dt-bindings/clock/agilex-clock.h [new file with mode: 0644]
include/dt-bindings/clock/imx8mp-clock.h [new file with mode: 0644]
include/efi.h
include/efi_loader.h
include/efi_rng.h [new file with mode: 0644]
include/image.h
include/part_efi.h
include/pe.h
include/power/pca9450.h [new file with mode: 0644]
include/remoteproc.h
include/rng.h [new file with mode: 0644]
include/test/suites.h
include/video.h
include/virtio.h
lib/efi_loader/.gitignore
lib/efi_loader/Kconfig
lib/efi_loader/Makefile
lib/efi_loader/efi_boottime.c
lib/efi_loader/efi_console.c
lib/efi_loader/efi_file.c
lib/efi_loader/efi_freestanding.c
lib/efi_loader/efi_rng.c [new file with mode: 0644]
lib/efi_loader/efi_root_node.c
lib/efi_selftest/.gitignore
lib/efi_selftest/Makefile
lib/efi_selftest/efi_selftest_rng.c [new file with mode: 0644]
scripts/Makefile.lib
test/bloblist.c
test/cmd_ut.c
test/compression.c
test/dm/Makefile
test/dm/remoteproc.c
test/dm/rng.c [new file with mode: 0644]
test/env/cmd_ut_env.c
test/lib/cmd_ut_lib.c
test/optee/cmd_ut_optee.c
test/overlay/cmd_ut_overlay.c
test/py/conftest.py
test/py/tests/test_efi_fit.py [new file with mode: 0644]
test/py/tests/test_efi_loader.py
test/unicode_ut.c
tools/dumpimage.c
tools/fit_image.c

diff --git a/Kconfig b/Kconfig
index 46a31f45b9a5f2a5fe3dab7248553f13b7880c91..99cc56f3c2b07f4c1c39fcef5d58b6fc3c7efd6d 100644 (file)
--- a/Kconfig
+++ b/Kconfig
@@ -444,6 +444,24 @@ config SPL_LOAD_FIT
          particular it can handle selecting from multiple device tree
          and passing the correct one to U-Boot.
 
+config SPL_LOAD_FIT_APPLY_OVERLAY
+       bool "Enable SPL applying DT overlays from FIT"
+       depends on SPL_LOAD_FIT
+       select OF_LIBFDT_OVERLAY
+       help
+         The device tree is loaded from the FIT image. Allow the SPL is to
+         also load device-tree overlays from the FIT image an apply them
+         over the device tree.
+
+config SPL_LOAD_FIT_APPLY_OVERLAY_BUF_SZ
+       depends on SPL_LOAD_FIT_APPLY_OVERLAY
+       default 0x10000
+       hex "size of temporary buffer used to load the overlays"
+       help
+         The size of the area where the overlays will be loaded and
+         uncompress. Must be at least as large as biggest overlay
+         (uncompressed)
+
 config SPL_LOAD_FIT_FULL
        bool "Enable SPL loading U-Boot as a FIT (full fitImage features)"
        select SPL_FIT
index 1766f5ab18acec3310a7b6d3732e2ef306fc0469..cc126ebc53b5918a4618eeb03d50c9724bf6fd3b 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -1265,7 +1265,7 @@ u-boot.ldr.hex u-boot.ldr.srec: u-boot.ldr FORCE
 # from the SPL U-Boot version.
 #
 ifndef CONFIG_SYS_UBOOT_START
-CONFIG_SYS_UBOOT_START := 0
+CONFIG_SYS_UBOOT_START := $(CONFIG_SYS_TEXT_BASE)
 endif
 
 # Boards with more complex image requirements can provide an .its source file
@@ -1292,7 +1292,8 @@ MKIMAGEFLAGS_u-boot.img = -f auto -A $(ARCH) -T firmware -C none -O u-boot \
        -a $(CONFIG_SYS_TEXT_BASE) -e $(CONFIG_SYS_UBOOT_START) \
        -p $(CONFIG_FIT_EXTERNAL_OFFSET) \
        -n "U-Boot $(UBOOTRELEASE) for $(BOARD) board" -E \
-       $(patsubst %,-b arch/$(ARCH)/dts/%.dtb,$(subst ",,$(CONFIG_OF_LIST)))
+       $(patsubst %,-b arch/$(ARCH)/dts/%.dtb,$(subst ",,$(CONFIG_OF_LIST))) \
+       $(patsubst %,-b arch/$(ARCH)/dts/%.dtbo,$(subst ",,$(CONFIG_OF_OVERLAY_LIST)))
 else
 MKIMAGEFLAGS_u-boot.img = -A $(ARCH) -T firmware -C none -O u-boot \
        -a $(CONFIG_SYS_TEXT_BASE) -e $(CONFIG_SYS_UBOOT_START) \
index 0bc4322c51b7ede4634833902056e0f05a598d93..76365ef3136285e3e8d63666b4d577d4a55d4aec 100644 (file)
@@ -907,7 +907,7 @@ config ARCH_SOCFPGA
        bool "Altera SOCFPGA family"
        select ARCH_EARLY_INIT_R
        select ARCH_MISC_INIT if !TARGET_SOCFPGA_ARRIA10
-       select ARM64 if TARGET_SOCFPGA_STRATIX10
+       select ARM64 if TARGET_SOCFPGA_STRATIX10 || TARGET_SOCFPGA_AGILEX
        select CPU_V7A if TARGET_SOCFPGA_GEN5 || TARGET_SOCFPGA_ARRIA10
        select DM
        select DM_SERIAL
@@ -919,7 +919,7 @@ config ARCH_SOCFPGA
        select SPL_LIBGENERIC_SUPPORT
        select SPL_NAND_SUPPORT if SPL_NAND_DENALI
        select SPL_OF_CONTROL
-       select SPL_SEPARATE_BSS if TARGET_SOCFPGA_STRATIX10
+       select SPL_SEPARATE_BSS if TARGET_SOCFPGA_STRATIX10 || TARGET_SOCFPGA_AGILEX
        select SPL_SERIAL_SUPPORT
        select SPL_SYSRESET
        select SPL_WATCHDOG_SUPPORT
index afe38e10b1367c707f5963d89ad42fe280e12b21..983e235f442703a146a0977c7ca4bc6e9f121995 100644 (file)
@@ -153,6 +153,7 @@ dtb-$(CONFIG_ARCH_MESON) += \
        meson-g12a-sei510.dtb \
        meson-g12b-odroid-n2.dtb \
        meson-g12b-a311d-khadas-vim3.dtb \
+       meson-sm1-khadas-vim3l.dtb \
        meson-sm1-sei610.dtb
 dtb-$(CONFIG_TEGRA) += tegra20-harmony.dtb \
        tegra20-medcom-wide.dtb \
@@ -329,6 +330,7 @@ dtb-$(CONFIG_TI816X) += dm8168-evm.dtb
 dtb-$(CONFIG_THUNDERX) += thunderx-88xx.dtb
 
 dtb-$(CONFIG_ARCH_SOCFPGA) +=                          \
+       socfpga_agilex_socdk.dtb                        \
        socfpga_arria5_socdk.dtb                        \
        socfpga_arria10_socdk_sdmmc.dtb                 \
        socfpga_cyclone5_mcvevk.dtb                     \
@@ -702,7 +704,8 @@ dtb-$(CONFIG_ARCH_IMX8) += \
 dtb-$(CONFIG_ARCH_IMX8M) += \
        imx8mm-evk.dtb \
        imx8mn-ddr4-evk.dtb \
-       imx8mq-evk.dtb
+       imx8mq-evk.dtb \
+       imx8mp-evk.dtb
 
 dtb-$(CONFIG_RCAR_GEN2) += \
        r8a7790-lager-u-boot.dtb \
diff --git a/arch/arm/dts/imx8mp-evk-u-boot.dtsi b/arch/arm/dts/imx8mp-evk-u-boot.dtsi
new file mode 100644 (file)
index 0000000..4675ada
--- /dev/null
@@ -0,0 +1,121 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright 2019 NXP
+ */
+
+&{/soc@0} {
+       u-boot,dm-pre-reloc;
+       u-boot,dm-spl;
+};
+
+&clk {
+       u-boot,dm-spl;
+       u-boot,dm-pre-reloc;
+};
+
+&osc_32k {
+       u-boot,dm-spl;
+       u-boot,dm-pre-reloc;
+};
+
+&osc_24m {
+       u-boot,dm-spl;
+       u-boot,dm-pre-reloc;
+};
+
+&aips1 {
+       u-boot,dm-spl;
+       u-boot,dm-pre-reloc;
+};
+
+&aips2 {
+       u-boot,dm-spl;
+};
+
+&aips3 {
+       u-boot,dm-spl;
+};
+
+&iomuxc {
+       u-boot,dm-spl;
+};
+
+&reg_usdhc2_vmmc {
+       u-boot,dm-spl;
+};
+
+&pinctrl_uart2 {
+       u-boot,dm-spl;
+};
+
+&pinctrl_usdhc2_gpio {
+       u-boot,dm-spl;
+};
+
+&pinctrl_usdhc2 {
+       u-boot,dm-spl;
+};
+
+&pinctrl_usdhc3 {
+       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;
+};
+
+&uart2 {
+       u-boot,dm-spl;
+};
+
+&i2c1 {
+       u-boot,dm-spl;
+};
+
+&i2c2 {
+       u-boot,dm-spl;
+};
+
+&i2c3 {
+       u-boot,dm-spl;
+};
+
+&i2c4 {
+       u-boot,dm-spl;
+};
+
+&i2c5 {
+       u-boot,dm-spl;
+};
+
+&i2c6 {
+       u-boot,dm-spl;
+};
+
+&usdhc1 {
+       u-boot,dm-spl;
+};
+
+&usdhc2 {
+       u-boot,dm-spl;
+};
+
+&usdhc3 {
+       u-boot,dm-spl;
+};
diff --git a/arch/arm/dts/imx8mp-evk.dts b/arch/arm/dts/imx8mp-evk.dts
new file mode 100644 (file)
index 0000000..6df3beb
--- /dev/null
@@ -0,0 +1,231 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+/*
+ * Copyright 2019 NXP
+ */
+
+/dts-v1/;
+
+#include "imx8mp.dtsi"
+
+/ {
+       model = "NXP i.MX8MPlus EVK board";
+       compatible = "fsl,imx8mp-evk", "fsl,imx8mp";
+
+       chosen {
+               stdout-path = &uart2;
+       };
+
+       memory@40000000 {
+               device_type = "memory";
+               reg = <0x0 0x40000000 0 0xc0000000>,
+                     <0x1 0x00000000 0 0xc0000000>;
+       };
+
+       reg_usdhc2_vmmc: regulator-usdhc2 {
+               compatible = "regulator-fixed";
+               pinctrl-names = "default";
+               pinctrl-0 = <&pinctrl_reg_usdhc2_vmmc>;
+               regulator-name = "VSD_3V3";
+               regulator-min-microvolt = <3300000>;
+               regulator-max-microvolt = <3300000>;
+               gpio = <&gpio2 19 GPIO_ACTIVE_HIGH>;
+               enable-active-high;
+       };
+};
+
+&fec {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_fec>;
+       phy-mode = "rgmii-id";
+       phy-handle = <&ethphy1>;
+       fsl,magic-packet;
+       status = "okay";
+
+       mdio {
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               ethphy1: ethernet-phy@1 {
+                       compatible = "ethernet-phy-ieee802.3-c22";
+                       reg = <1>;
+                       eee-broken-1000t;
+                       reset-gpios = <&gpio4 2 GPIO_ACTIVE_LOW>;
+               };
+       };
+};
+
+&snvs_pwrkey {
+       status = "okay";
+};
+
+&uart2 {
+       /* console */
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_uart2>;
+       status = "okay";
+};
+
+&usdhc2 {
+       assigned-clocks = <&clk IMX8MP_CLK_USDHC2>;
+       assigned-clock-rates = <400000000>;
+       pinctrl-names = "default", "state_100mhz", "state_200mhz";
+       pinctrl-0 = <&pinctrl_usdhc2>, <&pinctrl_usdhc2_gpio>;
+       pinctrl-1 = <&pinctrl_usdhc2_100mhz>, <&pinctrl_usdhc2_gpio>;
+       pinctrl-2 = <&pinctrl_usdhc2_200mhz>, <&pinctrl_usdhc2_gpio>;
+       cd-gpios = <&gpio2 12 GPIO_ACTIVE_LOW>;
+       vmmc-supply = <&reg_usdhc2_vmmc>;
+       bus-width = <4>;
+       status = "okay";
+};
+
+&usdhc3 {
+       assigned-clocks = <&clk IMX8MP_CLK_USDHC3>;
+       assigned-clock-rates = <400000000>;
+       pinctrl-names = "default", "state_100mhz", "state_200mhz";
+       pinctrl-0 = <&pinctrl_usdhc3>;
+       pinctrl-1 = <&pinctrl_usdhc3_100mhz>;
+       pinctrl-2 = <&pinctrl_usdhc3_200mhz>;
+       bus-width = <8>;
+       non-removable;
+       status = "okay";
+};
+
+&wdog1 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_wdog>;
+       fsl,ext-reset-output;
+       status = "okay";
+};
+
+&iomuxc {
+       pinctrl-names = "default";
+
+       pinctrl_fec: fecgrp {
+               fsl,pins = <
+                       MX8MP_IOMUXC_SAI1_RXD2__ENET1_MDC               0x3
+                       MX8MP_IOMUXC_SAI1_RXD3__ENET1_MDIO              0x3
+                       MX8MP_IOMUXC_SAI1_RXD4__ENET1_RGMII_RD0         0x91
+                       MX8MP_IOMUXC_SAI1_RXD5__ENET1_RGMII_RD1         0x91
+                       MX8MP_IOMUXC_SAI1_RXD6__ENET1_RGMII_RD2         0x91
+                       MX8MP_IOMUXC_SAI1_RXD7__ENET1_RGMII_RD3         0x91
+                       MX8MP_IOMUXC_SAI1_TXC__ENET1_RGMII_RXC          0x91
+                       MX8MP_IOMUXC_SAI1_TXFS__ENET1_RGMII_RX_CTL      0x91
+                       MX8MP_IOMUXC_SAI1_TXD0__ENET1_RGMII_TD0         0x1f
+                       MX8MP_IOMUXC_SAI1_TXD1__ENET1_RGMII_TD1         0x1f
+                       MX8MP_IOMUXC_SAI1_TXD2__ENET1_RGMII_TD2         0x1f
+                       MX8MP_IOMUXC_SAI1_TXD3__ENET1_RGMII_TD3         0x1f
+                       MX8MP_IOMUXC_SAI1_TXD4__ENET1_RGMII_TX_CTL      0x1f
+                       MX8MP_IOMUXC_SAI1_TXD5__ENET1_RGMII_TXC         0x1f
+                       MX8MP_IOMUXC_SAI1_RXD0__GPIO4_IO02              0x19
+               >;
+       };
+
+       pinctrl_reg_usdhc2_vmmc: regusdhc2vmmc {
+               fsl,pins = <
+                       MX8MP_IOMUXC_SD2_RESET_B__GPIO2_IO19    0x41
+               >;
+       };
+
+       pinctrl_uart2: uart2grp {
+               fsl,pins = <
+                       MX8MP_IOMUXC_UART2_RXD__UART2_DCE_RX    0x49
+                       MX8MP_IOMUXC_UART2_TXD__UART2_DCE_TX    0x49
+               >;
+       };
+
+       pinctrl_usdhc2: usdhc2grp {
+               fsl,pins = <
+                       MX8MP_IOMUXC_SD2_CLK__USDHC2_CLK        0x190
+                       MX8MP_IOMUXC_SD2_CMD__USDHC2_CMD        0x1d0
+                       MX8MP_IOMUXC_SD2_DATA0__USDHC2_DATA0    0x1d0
+                       MX8MP_IOMUXC_SD2_DATA1__USDHC2_DATA1    0x1d0
+                       MX8MP_IOMUXC_SD2_DATA2__USDHC2_DATA2    0x1d0
+                       MX8MP_IOMUXC_SD2_DATA3__USDHC2_DATA3    0x1d0
+                       MX8MP_IOMUXC_GPIO1_IO04__USDHC2_VSELECT 0xc1
+               >;
+       };
+
+       pinctrl_usdhc2_100mhz: usdhc2grp-100mhz {
+               fsl,pins = <
+                       MX8MP_IOMUXC_SD2_CLK__USDHC2_CLK        0x194
+                       MX8MP_IOMUXC_SD2_CMD__USDHC2_CMD        0x1d4
+                       MX8MP_IOMUXC_SD2_DATA0__USDHC2_DATA0    0x1d4
+                       MX8MP_IOMUXC_SD2_DATA1__USDHC2_DATA1    0x1d4
+                       MX8MP_IOMUXC_SD2_DATA2__USDHC2_DATA2    0x1d4
+                       MX8MP_IOMUXC_SD2_DATA3__USDHC2_DATA3    0x1d4
+                       MX8MP_IOMUXC_GPIO1_IO04__USDHC2_VSELECT 0xc1
+               >;
+       };
+
+       pinctrl_usdhc2_200mhz: usdhc2grp-200mhz {
+               fsl,pins = <
+                       MX8MP_IOMUXC_SD2_CLK__USDHC2_CLK        0x196
+                       MX8MP_IOMUXC_SD2_CMD__USDHC2_CMD        0x1d6
+                       MX8MP_IOMUXC_SD2_DATA0__USDHC2_DATA0    0x1d6
+                       MX8MP_IOMUXC_SD2_DATA1__USDHC2_DATA1    0x1d6
+                       MX8MP_IOMUXC_SD2_DATA2__USDHC2_DATA2    0x1d6
+                       MX8MP_IOMUXC_SD2_DATA3__USDHC2_DATA3    0x1d6
+                       MX8MP_IOMUXC_GPIO1_IO04__USDHC2_VSELECT 0xc1
+               >;
+       };
+
+       pinctrl_usdhc2_gpio: usdhc2grp-gpio {
+               fsl,pins = <
+                       MX8MP_IOMUXC_SD2_CD_B__GPIO2_IO12       0x1c4
+               >;
+       };
+
+       pinctrl_usdhc3: usdhc3grp {
+               fsl,pins = <
+                       MX8MP_IOMUXC_NAND_WE_B__USDHC3_CLK      0x190
+                       MX8MP_IOMUXC_NAND_WP_B__USDHC3_CMD      0x1d0
+                       MX8MP_IOMUXC_NAND_DATA04__USDHC3_DATA0  0x1d0
+                       MX8MP_IOMUXC_NAND_DATA05__USDHC3_DATA1  0x1d0
+                       MX8MP_IOMUXC_NAND_DATA06__USDHC3_DATA2  0x1d0
+                       MX8MP_IOMUXC_NAND_DATA07__USDHC3_DATA3  0x1d0
+                       MX8MP_IOMUXC_NAND_RE_B__USDHC3_DATA4    0x1d0
+                       MX8MP_IOMUXC_NAND_CE2_B__USDHC3_DATA5   0x1d0
+                       MX8MP_IOMUXC_NAND_CE3_B__USDHC3_DATA6   0x1d0
+                       MX8MP_IOMUXC_NAND_CLE__USDHC3_DATA7     0x1d0
+                       MX8MP_IOMUXC_NAND_CE1_B__USDHC3_STROBE  0x190
+               >;
+       };
+
+       pinctrl_usdhc3_100mhz: usdhc3grp-100mhz {
+               fsl,pins = <
+                       MX8MP_IOMUXC_NAND_WE_B__USDHC3_CLK      0x194
+                       MX8MP_IOMUXC_NAND_WP_B__USDHC3_CMD      0x1d4
+                       MX8MP_IOMUXC_NAND_DATA04__USDHC3_DATA0  0x1d4
+                       MX8MP_IOMUXC_NAND_DATA05__USDHC3_DATA1  0x1d4
+                       MX8MP_IOMUXC_NAND_DATA06__USDHC3_DATA2  0x1d4
+                       MX8MP_IOMUXC_NAND_DATA07__USDHC3_DATA3  0x1d4
+                       MX8MP_IOMUXC_NAND_RE_B__USDHC3_DATA4    0x1d4
+                       MX8MP_IOMUXC_NAND_CE2_B__USDHC3_DATA5   0x1d4
+                       MX8MP_IOMUXC_NAND_CE3_B__USDHC3_DATA6   0x1d4
+                       MX8MP_IOMUXC_NAND_CLE__USDHC3_DATA7     0x1d4
+                       MX8MP_IOMUXC_NAND_CE1_B__USDHC3_STROBE  0x194
+               >;
+       };
+
+       pinctrl_usdhc3_200mhz: usdhc3grp-200mhz {
+               fsl,pins = <
+                       MX8MP_IOMUXC_NAND_WE_B__USDHC3_CLK      0x196
+                       MX8MP_IOMUXC_NAND_WP_B__USDHC3_CMD      0x1d6
+                       MX8MP_IOMUXC_NAND_DATA04__USDHC3_DATA0  0x1d6
+                       MX8MP_IOMUXC_NAND_DATA05__USDHC3_DATA1  0x1d6
+                       MX8MP_IOMUXC_NAND_DATA06__USDHC3_DATA2  0x1d6
+                       MX8MP_IOMUXC_NAND_DATA07__USDHC3_DATA3  0x1d6
+                       MX8MP_IOMUXC_NAND_RE_B__USDHC3_DATA4    0x1d6
+                       MX8MP_IOMUXC_NAND_CE2_B__USDHC3_DATA5   0x1d6
+                       MX8MP_IOMUXC_NAND_CE3_B__USDHC3_DATA6   0x1d6
+                       MX8MP_IOMUXC_NAND_CLE__USDHC3_DATA7     0x1d6
+                       MX8MP_IOMUXC_NAND_CE1_B__USDHC3_STROBE  0x196
+               >;
+       };
+
+       pinctrl_wdog: wdoggrp {
+               fsl,pins = <
+                       MX8MP_IOMUXC_GPIO1_IO02__WDOG1_WDOG_B   0xc6
+               >;
+       };
+};
diff --git a/arch/arm/dts/imx8mp-pinfunc.h b/arch/arm/dts/imx8mp-pinfunc.h
new file mode 100644 (file)
index 0000000..da78f89
--- /dev/null
@@ -0,0 +1,931 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
+/*
+ * Copyright 2019 NXP
+ */
+
+#ifndef __DTS_IMX8MP_PINFUNC_H
+#define __DTS_IMX8MP_PINFUNC_H
+
+/*
+ * The pin function ID is a tuple of
+ * <mux_reg conf_reg input_reg mux_mode input_val>
+ */
+#define MX8MP_IOMUXC_GPIO1_IO00__GPIO1_IO00                          0x014 0x274 0x000 0x0 0x0
+#define MX8MP_IOMUXC_GPIO1_IO00__CCMSRCGPCMIX_ENET_PHY_REF_CLK_ROOT  0x014 0x274 0x000 0x1 0x0
+#define MX8MP_IOMUXC_GPIO1_IO00__MEDIAMIX_ISP_FL_TRIG_0              0x014 0x274 0x5D4 0x3 0x0
+#define MX8MP_IOMUXC_GPIO1_IO00__ANAMIX_REF_CLK_32K                  0x014 0x274 0x000 0x5 0x0
+#define MX8MP_IOMUXC_GPIO1_IO00__CCMSRCGPCMIX_EXT_CLK1               0x014 0x274 0x000 0x6 0x0
+#define MX8MP_IOMUXC_GPIO1_IO00__SJC_FAIL                            0x014 0x274 0x000 0x7 0x0
+#define MX8MP_IOMUXC_GPIO1_IO01__GPIO1_IO01                          0x018 0x278 0x000 0x0 0x0
+#define MX8MP_IOMUXC_GPIO1_IO01__PWM1_OUT                            0x018 0x278 0x000 0x1 0x0
+#define MX8MP_IOMUXC_GPIO1_IO01__MEDIAMIX_ISP_SHUTTER_TRIG_0         0x018 0x278 0x5DC 0x3 0x0
+#define MX8MP_IOMUXC_GPIO1_IO01__ANAMIX_REF_CLK_24M                  0x018 0x278 0x000 0x5 0x0
+#define MX8MP_IOMUXC_GPIO1_IO01__CCMSRCGPCMIX_EXT_CLK2               0x018 0x278 0x000 0x6 0x0
+#define MX8MP_IOMUXC_GPIO1_IO01__SJC_ACTIVE                          0x018 0x278 0x000 0x7 0x0
+#define MX8MP_IOMUXC_GPIO1_IO02__GPIO1_IO02                          0x01C 0x27C 0x000 0x0 0x0
+#define MX8MP_IOMUXC_GPIO1_IO02__WDOG1_WDOG_B                        0x01C 0x27C 0x000 0x1 0x0
+#define MX8MP_IOMUXC_GPIO1_IO02__MEDIAMIX_ISP_FLASH_TRIG_0           0x01C 0x27C 0x000 0x3 0x0
+#define MX8MP_IOMUXC_GPIO1_IO02__WDOG1_WDOG_ANY                      0x01C 0x27C 0x000 0x5 0x0
+#define MX8MP_IOMUXC_GPIO1_IO02__SJC_DE_B                            0x01C 0x27C 0x000 0x7 0x0
+#define MX8MP_IOMUXC_GPIO1_IO03__GPIO1_IO03                          0x020 0x280 0x000 0x0 0x0
+#define MX8MP_IOMUXC_GPIO1_IO03__USDHC1_VSELECT                      0x020 0x280 0x000 0x1 0x0
+#define MX8MP_IOMUXC_GPIO1_IO03__MEDIAMIX_ISP_PRELIGHT_TRIG_0        0x020 0x280 0x000 0x3 0x0
+#define MX8MP_IOMUXC_GPIO1_IO03__SDMA1_EXT_EVENT00                   0x020 0x280 0x000 0x5 0x0
+#define MX8MP_IOMUXC_GPIO1_IO03__ANAMIX_XTAL_OK                      0x020 0x280 0x000 0x6 0x0
+#define MX8MP_IOMUXC_GPIO1_IO03__SJC_DONE                            0x020 0x280 0x000 0x7 0x0
+#define MX8MP_IOMUXC_GPIO1_IO04__GPIO1_IO04                          0x024 0x284 0x000 0x0 0x0
+#define MX8MP_IOMUXC_GPIO1_IO04__USDHC2_VSELECT                      0x024 0x284 0x000 0x1 0x0
+#define MX8MP_IOMUXC_GPIO1_IO04__MEDIAMIX_ISP_SHUTTER_OPEN_0         0x024 0x284 0x000 0x3 0x0
+#define MX8MP_IOMUXC_GPIO1_IO04__SDMA1_EXT_EVENT01                   0x024 0x284 0x000 0x5 0x0
+#define MX8MP_IOMUXC_GPIO1_IO04__ANAMIX_XTAL_OK_LV                   0x024 0x284 0x000 0x6 0x0
+#define MX8MP_IOMUXC_GPIO1_IO04__USDHC1_TEST_TRIG                    0x024 0x284 0x000 0x7 0x0
+#define MX8MP_IOMUXC_GPIO1_IO05__GPIO1_IO05                          0x028 0x288 0x000 0x0 0x0
+#define MX8MP_IOMUXC_GPIO1_IO05__M7_NMI                              0x028 0x288 0x000 0x1 0x0
+#define MX8MP_IOMUXC_GPIO1_IO05__MEDIAMIX_ISP_FL_TRIG_1              0x028 0x288 0x5D8 0x3 0x0
+#define MX8MP_IOMUXC_GPIO1_IO05__CCMSRCGPCMIX_PMIC_READY             0x028 0x288 0x554 0x5 0x0
+#define MX8MP_IOMUXC_GPIO1_IO05__CCMSRCGPCMIX_INT_BOOT               0x028 0x288 0x000 0x6 0x0
+#define MX8MP_IOMUXC_GPIO1_IO05__USDHC2_TEST_TRIG                    0x028 0x288 0x000 0x7 0x0
+#define MX8MP_IOMUXC_GPIO1_IO06__GPIO1_IO06                          0x02C 0x28C 0x000 0x0 0x0
+#define MX8MP_IOMUXC_GPIO1_IO06__ENET_QOS_MDC                        0x02C 0x28C 0x000 0x1 0x0
+#define MX8MP_IOMUXC_GPIO1_IO06__MEDIAMIX_ISP_SHUTTER_TRIG_1         0x02C 0x28C 0x5E0 0x3 0x0
+#define MX8MP_IOMUXC_GPIO1_IO06__USDHC1_CD_B                         0x02C 0x28C 0x000 0x5 0x0
+#define MX8MP_IOMUXC_GPIO1_IO06__CCMSRCGPCMIX_EXT_CLK3               0x02C 0x28C 0x000 0x6 0x0
+#define MX8MP_IOMUXC_GPIO1_IO06__ECSPI1_TEST_TRIG                    0x02C 0x28C 0x000 0x7 0x0
+#define MX8MP_IOMUXC_GPIO1_IO07__GPIO1_IO07                          0x030 0x290 0x000 0x0 0x0
+#define MX8MP_IOMUXC_GPIO1_IO07__ENET_QOS_MDIO                       0x030 0x290 0x590 0x1 0x0
+#define MX8MP_IOMUXC_GPIO1_IO07__MEDIAMIX_ISP_FLASH_TRIG_1           0x030 0x290 0x000 0x3 0x0
+#define MX8MP_IOMUXC_GPIO1_IO07__USDHC1_WP                           0x030 0x290 0x000 0x5 0x0
+#define MX8MP_IOMUXC_GPIO1_IO07__CCMSRCGPCMIX_EXT_CLK4               0x030 0x290 0x000 0x6 0x0
+#define MX8MP_IOMUXC_GPIO1_IO07__ECSPI2_TEST_TRIG                    0x030 0x290 0x000 0x7 0x0
+#define MX8MP_IOMUXC_GPIO1_IO08__GPIO1_IO08                          0x034 0x294 0x000 0x0 0x0
+#define MX8MP_IOMUXC_GPIO1_IO08__ENET_QOS_1588_EVENT0_IN             0x034 0x294 0x000 0x1 0x0
+#define MX8MP_IOMUXC_GPIO1_IO08__PWM1_OUT                            0x034 0x294 0x000 0x2 0x0
+#define MX8MP_IOMUXC_GPIO1_IO08__MEDIAMIX_ISP_PRELIGHT_TRIG_1        0x034 0x294 0x000 0x3 0x0
+#define MX8MP_IOMUXC_GPIO1_IO08__ENET_QOS_1588_EVENT0_AUX_IN         0x034 0x294 0x000 0x4 0x0
+#define MX8MP_IOMUXC_GPIO1_IO08__USDHC2_RESET_B                      0x034 0x294 0x000 0x5 0x0
+#define MX8MP_IOMUXC_GPIO1_IO08__CCMSRCGPCMIX_WAIT                   0x034 0x294 0x000 0x6 0x0
+#define MX8MP_IOMUXC_GPIO1_IO08__FLEXSPI_TEST_TRIG                   0x034 0x294 0x000 0x7 0x0
+#define MX8MP_IOMUXC_GPIO1_IO09__GPIO1_IO09                          0x038 0x298 0x000 0x0 0x0
+#define MX8MP_IOMUXC_GPIO1_IO09__ENET_QOS_1588_EVENT0_OUT            0x038 0x298 0x000 0x1 0x0
+#define MX8MP_IOMUXC_GPIO1_IO09__PWM2_OUT                            0x038 0x298 0x000 0x2 0x0
+#define MX8MP_IOMUXC_GPIO1_IO09__MEDIAMIX_ISP_SHUTTER_OPEN_1         0x038 0x298 0x000 0x3 0x0
+#define MX8MP_IOMUXC_GPIO1_IO09__USDHC3_RESET_B                      0x038 0x298 0x000 0x4 0x0
+#define MX8MP_IOMUXC_GPIO1_IO09__AUDIOMIX_EXT_EVENT00                0x038 0x298 0x000 0x5 0x0
+#define MX8MP_IOMUXC_GPIO1_IO09__CCMSRCGPCMIX_STOP                   0x038 0x298 0x000 0x6 0x0
+#define MX8MP_IOMUXC_GPIO1_IO09__RAWNAND_TEST_TRIG                   0x038 0x298 0x000 0x7 0x0
+#define MX8MP_IOMUXC_GPIO1_IO10__GPIO1_IO10                          0x03C 0x29C 0x000 0x0 0x0
+#define MX8MP_IOMUXC_GPIO1_IO10__HSIOMIX_usb1_OTG_ID                 0x03C 0x29C 0x000 0x1 0x0
+#define MX8MP_IOMUXC_GPIO1_IO10__PWM3_OUT                            0x03C 0x29C 0x000 0x2 0x0
+#define MX8MP_IOMUXC_GPIO1_IO10__OCOTP_FUSE_LATCHED                  0x03C 0x29C 0x000 0x7 0x0
+#define MX8MP_IOMUXC_GPIO1_IO11__GPIO1_IO11                          0x040 0x2A0 0x000 0x0 0x0
+#define MX8MP_IOMUXC_GPIO1_IO11__HSIOMIX_usb2_OTG_ID                 0x040 0x2A0 0x000 0x1 0x0
+#define MX8MP_IOMUXC_GPIO1_IO11__PWM2_OUT                            0x040 0x2A0 0x000 0x2 0x0
+#define MX8MP_IOMUXC_GPIO1_IO11__USDHC3_VSELECT                      0x040 0x2A0 0x000 0x4 0x0
+#define MX8MP_IOMUXC_GPIO1_IO11__CCMSRCGPCMIX_PMIC_READY             0x040 0x2A0 0x554 0x5 0x1
+#define MX8MP_IOMUXC_GPIO1_IO11__CCMSRCGPCMIX_OUT0                   0x040 0x2A0 0x000 0x6 0x0
+#define MX8MP_IOMUXC_GPIO1_IO11__CAAM_RNG_OSC_OBS                    0x040 0x2A0 0x000 0x7 0x0
+#define MX8MP_IOMUXC_GPIO1_IO12__GPIO1_IO12                          0x044 0x2A4 0x000 0x0 0x0
+#define MX8MP_IOMUXC_GPIO1_IO12__HSIOMIX_usb1_OTG_PWR                0x044 0x2A4 0x000 0x1 0x0
+#define MX8MP_IOMUXC_GPIO1_IO12__AUDIOMIX_EXT_EVENT01                0x044 0x2A4 0x000 0x5 0x0
+#define MX8MP_IOMUXC_GPIO1_IO12__CCMSRCGPCMIX_OUT1                   0x044 0x2A4 0x000 0x6 0x0
+#define MX8MP_IOMUXC_GPIO1_IO12__CSU_CSU_ALARM_AUT00                 0x044 0x2A4 0x000 0x7 0x0
+#define MX8MP_IOMUXC_GPIO1_IO13__GPIO1_IO13                          0x048 0x2A8 0x000 0x0 0x0
+#define MX8MP_IOMUXC_GPIO1_IO13__HSIOMIX_usb1_OTG_OC                 0x048 0x2A8 0x000 0x1 0x0
+#define MX8MP_IOMUXC_GPIO1_IO13__PWM2_OUT                            0x048 0x2A8 0x000 0x5 0x0
+#define MX8MP_IOMUXC_GPIO1_IO13__CCMSRCGPCMIX_OUT2                   0x048 0x2A8 0x000 0x6 0x0
+#define MX8MP_IOMUXC_GPIO1_IO13__CSU_CSU_ALARM_AUT01                 0x048 0x2A8 0x000 0x7 0x0
+#define MX8MP_IOMUXC_GPIO1_IO14__GPIO1_IO14                          0x04C 0x2AC 0x000 0x0 0x0
+#define MX8MP_IOMUXC_GPIO1_IO14__HSIOMIX_usb2_OTG_PWR                0x04C 0x2AC 0x000 0x1 0x0
+#define MX8MP_IOMUXC_GPIO1_IO14__USDHC3_CD_B                         0x04C 0x2AC 0x608 0x4 0x0
+#define MX8MP_IOMUXC_GPIO1_IO14__PWM3_OUT                            0x04C 0x2AC 0x000 0x5 0x0
+#define MX8MP_IOMUXC_GPIO1_IO14__CCMSRCGPCMIX_CLKO1                  0x04C 0x2AC 0x000 0x6 0x0
+#define MX8MP_IOMUXC_GPIO1_IO14__CSU_CSU_ALARM_AUT02                 0x04C 0x2AC 0x000 0x7 0x0
+#define MX8MP_IOMUXC_GPIO1_IO15__GPIO1_IO15                          0x050 0x2B0 0x000 0x0 0x0
+#define MX8MP_IOMUXC_GPIO1_IO15__HSIOMIX_usb2_OTG_OC                 0x050 0x2B0 0x000 0x1 0x0
+#define MX8MP_IOMUXC_GPIO1_IO15__USDHC3_WP                           0x050 0x2B0 0x634 0x4 0x0
+#define MX8MP_IOMUXC_GPIO1_IO15__PWM4_OUT                            0x050 0x2B0 0x000 0x5 0x0
+#define MX8MP_IOMUXC_GPIO1_IO15__CCMSRCGPCMIX_CLKO2                  0x050 0x2B0 0x000 0x6 0x0
+#define MX8MP_IOMUXC_GPIO1_IO15__CSU_CSU_INT_DEB                     0x050 0x2B0 0x000 0x7 0x0
+#define MX8MP_IOMUXC_ENET_MDC__ENET_QOS_MDC                          0x054 0x2B4 0x000 0x0 0x0
+#define MX8MP_IOMUXC_ENET_MDC__AUDIOMIX_SAI6_TX_DATA00               0x054 0x2B4 0x000 0x2 0x0
+#define MX8MP_IOMUXC_ENET_MDC__GPIO1_IO16                            0x054 0x2B4 0x000 0x5 0x0
+#define MX8MP_IOMUXC_ENET_MDC__USDHC3_STROBE                         0x054 0x2B4 0x630 0x6 0x0
+#define MX8MP_IOMUXC_ENET_MDC__SIM_M_HADDR15                         0x054 0x2B4 0x000 0x7 0x0
+#define MX8MP_IOMUXC_ENET_MDIO__ENET_QOS_MDIO                        0x058 0x2B8 0x590 0x0 0x1
+#define MX8MP_IOMUXC_ENET_MDIO__AUDIOMIX_SAI6_TX_SYNC                0x058 0x2B8 0x528 0x2 0x0
+#define MX8MP_IOMUXC_ENET_MDIO__GPIO1_IO17                           0x058 0x2B8 0x000 0x5 0x0
+#define MX8MP_IOMUXC_ENET_MDIO__USDHC3_DATA5                         0x058 0x2B8 0x624 0x6 0x0
+#define MX8MP_IOMUXC_ENET_MDIO__SIM_M_HADDR16                        0x058 0x2B8 0x000 0x7 0x0
+#define MX8MP_IOMUXC_ENET_TD3__ENET_QOS_RGMII_TD3                    0x05C 0x2BC 0x000 0x0 0x0
+#define MX8MP_IOMUXC_ENET_TD3__AUDIOMIX_SAI6_TX_BCLK                 0x05C 0x2BC 0x524 0x2 0x0
+#define MX8MP_IOMUXC_ENET_TD3__GPIO1_IO18                            0x05C 0x2BC 0x000 0x5 0x0
+#define MX8MP_IOMUXC_ENET_TD3__USDHC3_DATA6                          0x05C 0x2BC 0x628 0x6 0x0
+#define MX8MP_IOMUXC_ENET_TD3__SIM_M_HADDR17                         0x05C 0x2BC 0x000 0x7 0x0
+#define MX8MP_IOMUXC_ENET_TD2__ENET_QOS_RGMII_TD2                    0x060 0x2C0 0x000 0x0 0x0
+#define MX8MP_IOMUXC_ENET_TD2__CCM_ENET_QOS_CLOCK_GENERATE_REF_CLK   0x060 0x2C0 0x000 0x1 0x0
+#define MX8MP_IOMUXC_ENET_TD2__AUDIOMIX_SAI6_RX_DATA00               0x060 0x2C0 0x51C 0x2 0x0
+#define MX8MP_IOMUXC_ENET_TD2__GPIO1_IO19                            0x060 0x2C0 0x000 0x5 0x0
+#define MX8MP_IOMUXC_ENET_TD2__USDHC3_DATA7                          0x060 0x2C0 0x62C 0x6 0x0
+#define MX8MP_IOMUXC_ENET_TD2__SIM_M_HADDR18                         0x060 0x2C0 0x000 0x7 0x0
+#define MX8MP_IOMUXC_ENET_TD1__ENET_QOS_RGMII_TD1                    0x064 0x2C4 0x000 0x0 0x0
+#define MX8MP_IOMUXC_ENET_TD1__AUDIOMIX_SAI6_RX_SYNC                 0x064 0x2C4 0x520 0x2 0x0
+#define MX8MP_IOMUXC_ENET_TD1__GPIO1_IO20                            0x064 0x2C4 0x000 0x5 0x0
+#define MX8MP_IOMUXC_ENET_TD1__USDHC3_CD_B                           0x064 0x2C4 0x608 0x6 0x1
+#define MX8MP_IOMUXC_ENET_TD1__SIM_M_HADDR19                         0x064 0x2C4 0x000 0x7 0x0
+#define MX8MP_IOMUXC_ENET_TD0__ENET_QOS_RGMII_TD0                    0x068 0x2C8 0x000 0x0 0x0
+#define MX8MP_IOMUXC_ENET_TD0__AUDIOMIX_SAI6_RX_BCLK                 0x068 0x2C8 0x518 0x2 0x0
+#define MX8MP_IOMUXC_ENET_TD0__GPIO1_IO21                            0x068 0x2C8 0x000 0x5 0x0
+#define MX8MP_IOMUXC_ENET_TD0__USDHC3_WP                             0x068 0x2C8 0x634 0x6 0x1
+#define MX8MP_IOMUXC_ENET_TD0__SIM_M_HADDR20                         0x068 0x2C8 0x000 0x7 0x0
+#define MX8MP_IOMUXC_ENET_TX_CTL__ENET_QOS_RGMII_TX_CTL              0x06C 0x2CC 0x000 0x0 0x0
+#define MX8MP_IOMUXC_ENET_TX_CTL__AUDIOMIX_SAI6_MCLK                 0x06C 0x2CC 0x514 0x2 0x0
+#define MX8MP_IOMUXC_ENET_TX_CTL__AUDIOMIX_SPDIF_OUT                 0x06C 0x2CC 0x000 0x3 0x0
+#define MX8MP_IOMUXC_ENET_TX_CTL__GPIO1_IO22                         0x06C 0x2CC 0x000 0x5 0x0
+#define MX8MP_IOMUXC_ENET_TX_CTL__USDHC3_DATA0                       0x06C 0x2CC 0x610 0x6 0x0
+#define MX8MP_IOMUXC_ENET_TX_CTL__SIM_M_HADDR21                      0x06C 0x2CC 0x000 0x7 0x0
+#define MX8MP_IOMUXC_ENET_TXC__CCM_ENET_QOS_CLOCK_GENERATE_TX_CLK    0x070 0x2D0 0x000 0x0 0x0
+#define MX8MP_IOMUXC_ENET_TXC__ENET_QOS_TX_ER                        0x070 0x2D0 0x000 0x1 0x0
+#define MX8MP_IOMUXC_ENET_TXC__AUDIOMIX_SAI7_TX_DATA00               0x070 0x2D0 0x000 0x2 0x0
+#define MX8MP_IOMUXC_ENET_TXC__GPIO1_IO23                            0x070 0x2D0 0x000 0x5 0x0
+#define MX8MP_IOMUXC_ENET_TXC__USDHC3_DATA1                          0x070 0x2D0 0x614 0x6 0x0
+#define MX8MP_IOMUXC_ENET_TXC__SIM_M_HADDR22                         0x070 0x2D0 0x000 0x7 0x0
+#define MX8MP_IOMUXC_ENET_RX_CTL__ENET_QOS_RGMII_RX_CTL              0x074 0x2D4 0x000 0x0 0x0
+#define MX8MP_IOMUXC_ENET_RX_CTL__AUDIOMIX_SAI7_TX_SYNC              0x074 0x2D4 0x540 0x2 0x0
+#define MX8MP_IOMUXC_ENET_RX_CTL__AUDIOMIX_BIT_STREAM03              0x074 0x2D4 0x4CC 0x3 0x0
+#define MX8MP_IOMUXC_ENET_RX_CTL__GPIO1_IO24                         0x074 0x2D4 0x000 0x5 0x0
+#define MX8MP_IOMUXC_ENET_RX_CTL__USDHC3_DATA2                       0x074 0x2D4 0x618 0x6 0x0
+#define MX8MP_IOMUXC_ENET_RX_CTL__SIM_M_HADDR23                      0x074 0x2D4 0x000 0x7 0x0
+#define MX8MP_IOMUXC_ENET_RXC__CCM_ENET_QOS_CLOCK_GENERATE_RX_CLK    0x078 0x2D8 0x000 0x0 0x0
+#define MX8MP_IOMUXC_ENET_RXC__ENET_QOS_RX_ER                        0x078 0x2D8 0x000 0x1 0x0
+#define MX8MP_IOMUXC_ENET_RXC__AUDIOMIX_SAI7_TX_BCLK                 0x078 0x2D8 0x53C 0x2 0x0
+#define MX8MP_IOMUXC_ENET_RXC__AUDIOMIX_BIT_STREAM02                 0x078 0x2D8 0x4C8 0x3 0x0
+#define MX8MP_IOMUXC_ENET_RXC__GPIO1_IO25                            0x078 0x2D8 0x000 0x5 0x0
+#define MX8MP_IOMUXC_ENET_RXC__USDHC3_DATA3                          0x078 0x2D8 0x61C 0x6 0x0
+#define MX8MP_IOMUXC_ENET_RXC__SIM_M_HADDR24                         0x078 0x2D8 0x000 0x7 0x0
+#define MX8MP_IOMUXC_ENET_RD0__ENET_QOS_RGMII_RD0                    0x07C 0x2DC 0x000 0x0 0x0
+#define MX8MP_IOMUXC_ENET_RD0__AUDIOMIX_SAI7_RX_DATA00               0x07C 0x2DC 0x534 0x2 0x0
+#define MX8MP_IOMUXC_ENET_RD0__AUDIOMIX_BIT_STREAM01                 0x07C 0x2DC 0x4C4 0x3 0x0
+#define MX8MP_IOMUXC_ENET_RD0__GPIO1_IO26                            0x07C 0x2DC 0x000 0x5 0x0
+#define MX8MP_IOMUXC_ENET_RD0__USDHC3_DATA4                          0x07C 0x2DC 0x620 0x6 0x0
+#define MX8MP_IOMUXC_ENET_RD0__SIM_M_HADDR25                         0x07C 0x2DC 0x000 0x7 0x0
+#define MX8MP_IOMUXC_ENET_RD1__ENET_QOS_RGMII_RD1                    0x080 0x2E0 0x000 0x0 0x0
+#define MX8MP_IOMUXC_ENET_RD1__AUDIOMIX_SAI7_RX_SYNC                 0x080 0x2E0 0x538 0x2 0x0
+#define MX8MP_IOMUXC_ENET_RD1__AUDIOMIX_BIT_STREAM00                 0x080 0x2E0 0x4C0 0x3 0x0
+#define MX8MP_IOMUXC_ENET_RD1__GPIO1_IO27                            0x080 0x2E0 0x000 0x5 0x0
+#define MX8MP_IOMUXC_ENET_RD1__USDHC3_RESET_B                        0x080 0x2E0 0x000 0x6 0x0
+#define MX8MP_IOMUXC_ENET_RD1__SIM_M_HADDR26                         0x080 0x2E0 0x000 0x7 0x0
+#define MX8MP_IOMUXC_ENET_RD2__ENET_QOS_RGMII_RD2                    0x084 0x2E4 0x000 0x0 0x0
+#define MX8MP_IOMUXC_ENET_RD2__AUDIOMIX_SAI7_RX_BCLK                 0x084 0x2E4 0x530 0x2 0x0
+#define MX8MP_IOMUXC_ENET_RD2__AUDIOMIX_CLK                          0x084 0x2E4 0x000 0x3 0x0
+#define MX8MP_IOMUXC_ENET_RD2__GPIO1_IO28                            0x084 0x2E4 0x000 0x5 0x0
+#define MX8MP_IOMUXC_ENET_RD2__USDHC3_CLK                            0x084 0x2E4 0x604 0x6 0x0
+#define MX8MP_IOMUXC_ENET_RD2__SIM_M_HADDR27                         0x084 0x2E4 0x000 0x7 0x0
+#define MX8MP_IOMUXC_ENET_RD3__ENET_QOS_RGMII_RD3                    0x088 0x2E8 0x000 0x0 0x0
+#define MX8MP_IOMUXC_ENET_RD3__AUDIOMIX_SAI7_MCLK                    0x088 0x2E8 0x52C 0x2 0x0
+#define MX8MP_IOMUXC_ENET_RD3__AUDIOMIX_SPDIF_IN                     0x088 0x2E8 0x544 0x3 0x0
+#define MX8MP_IOMUXC_ENET_RD3__GPIO1_IO29                            0x088 0x2E8 0x000 0x5 0x0
+#define MX8MP_IOMUXC_ENET_RD3__USDHC3_CMD                            0x088 0x2E8 0x60C 0x6 0x0
+#define MX8MP_IOMUXC_ENET_RD3__SIM_M_HADDR28                         0x088 0x2E8 0x000 0x7 0x0
+#define MX8MP_IOMUXC_SD1_CLK__USDHC1_CLK                             0x08C 0x2EC 0x000 0x0 0x0
+#define MX8MP_IOMUXC_SD1_CLK__ENET1_MDC                              0x08C 0x2EC 0x000 0x1 0x0
+#define MX8MP_IOMUXC_SD1_CLK__I2C5_SCL                               0x08C 0x2EC 0x5C4 0x3 0x0
+#define MX8MP_IOMUXC_SD1_CLK__UART1_DCE_TX                           0x08C 0x2EC 0x000 0x4 0x0
+#define MX8MP_IOMUXC_SD1_CLK__UART1_DTE_RX                           0x08C 0x2EC 0x5E8 0x4 0x0
+#define MX8MP_IOMUXC_SD1_CLK__GPIO2_IO00                             0x08C 0x2EC 0x000 0x5 0x0
+#define MX8MP_IOMUXC_SD1_CLK__SIM_M_HADDR29                          0x08C 0x2EC 0x000 0x7 0x0
+#define MX8MP_IOMUXC_SD1_CMD__USDHC1_CMD                             0x090 0x2F0 0x000 0x0 0x0
+#define MX8MP_IOMUXC_SD1_CMD__ENET1_MDIO                             0x090 0x2F0 0x57C 0x1 0x0
+#define MX8MP_IOMUXC_SD1_CMD__I2C5_SDA                               0x090 0x2F0 0x5C8 0x3 0x0
+#define MX8MP_IOMUXC_SD1_CMD__UART1_DCE_RX                           0x090 0x2F0 0x5E8 0x4 0x1
+#define MX8MP_IOMUXC_SD1_CMD__UART1_DTE_TX                           0x090 0x2F0 0x000 0x4 0x0
+#define MX8MP_IOMUXC_SD1_CMD__GPIO2_IO01                             0x090 0x2F0 0x000 0x5 0x0
+#define MX8MP_IOMUXC_SD1_CMD__SIM_M_HADDR30                          0x090 0x2F0 0x000 0x7 0x0
+#define MX8MP_IOMUXC_SD1_DATA0__USDHC1_DATA0                         0x094 0x2F4 0x000 0x0 0x0
+#define MX8MP_IOMUXC_SD1_DATA0__ENET1_RGMII_TD1                      0x094 0x2F4 0x000 0x1 0x0
+#define MX8MP_IOMUXC_SD1_DATA0__I2C6_SCL                             0x094 0x2F4 0x5CC 0x3 0x0
+#define MX8MP_IOMUXC_SD1_DATA0__UART1_DCE_RTS                        0x094 0x2F4 0x5E4 0x4 0x0
+#define MX8MP_IOMUXC_SD1_DATA0__UART1_DTE_CTS                        0x094 0x2F4 0x000 0x4 0x0
+#define MX8MP_IOMUXC_SD1_DATA0__GPIO2_IO02                           0x094 0x2F4 0x000 0x5 0x0
+#define MX8MP_IOMUXC_SD1_DATA0__SIM_M_HADDR31                        0x094 0x2F4 0x000 0x7 0x0
+#define MX8MP_IOMUXC_SD1_DATA1__USDHC1_DATA1                         0x098 0x2F8 0x000 0x0 0x0
+#define MX8MP_IOMUXC_SD1_DATA1__ENET1_RGMII_TD0                      0x098 0x2F8 0x000 0x1 0x0
+#define MX8MP_IOMUXC_SD1_DATA1__I2C6_SDA                             0x098 0x2F8 0x5D0 0x3 0x0
+#define MX8MP_IOMUXC_SD1_DATA1__UART1_DCE_CTS                        0x098 0x2F8 0x000 0x4 0x0
+#define MX8MP_IOMUXC_SD1_DATA1__UART1_DTE_RTS                        0x098 0x2F8 0x5E4 0x4 0x1
+#define MX8MP_IOMUXC_SD1_DATA1__GPIO2_IO03                           0x098 0x2F8 0x000 0x5 0x0
+#define MX8MP_IOMUXC_SD1_DATA1__SIM_M_HBURST00                       0x098 0x2F8 0x000 0x7 0x0
+#define MX8MP_IOMUXC_SD1_DATA2__USDHC1_DATA2                         0x09C 0x2FC 0x000 0x0 0x0
+#define MX8MP_IOMUXC_SD1_DATA2__ENET1_RGMII_RD0                      0x09C 0x2FC 0x580 0x1 0x0
+#define MX8MP_IOMUXC_SD1_DATA2__I2C4_SCL                             0x09C 0x2FC 0x5BC 0x3 0x0
+#define MX8MP_IOMUXC_SD1_DATA2__UART2_DCE_TX                         0x09C 0x2FC 0x000 0x4 0x0
+#define MX8MP_IOMUXC_SD1_DATA2__UART2_DTE_RX                         0x09C 0x2FC 0x5F0 0x4 0x0
+#define MX8MP_IOMUXC_SD1_DATA2__GPIO2_IO04                           0x09C 0x2FC 0x000 0x5 0x0
+#define MX8MP_IOMUXC_SD1_DATA2__SIM_M_HBURST01                       0x09C 0x2FC 0x000 0x7 0x0
+#define MX8MP_IOMUXC_SD1_DATA3__USDHC1_DATA3                         0x0A0 0x300 0x000 0x0 0x0
+#define MX8MP_IOMUXC_SD1_DATA3__ENET1_RGMII_RD1                      0x0A0 0x300 0x584 0x1 0x0
+#define MX8MP_IOMUXC_SD1_DATA3__I2C4_SDA                             0x0A0 0x300 0x5C0 0x3 0x0
+#define MX8MP_IOMUXC_SD1_DATA3__UART2_DCE_RX                         0x0A0 0x300 0x5F0 0x4 0x1
+#define MX8MP_IOMUXC_SD1_DATA3__UART2_DTE_TX                         0x0A0 0x300 0x000 0x4 0x0
+#define MX8MP_IOMUXC_SD1_DATA3__GPIO2_IO05                           0x0A0 0x300 0x000 0x5 0x0
+#define MX8MP_IOMUXC_SD1_DATA3__SIM_M_HBURST02                       0x0A0 0x300 0x000 0x7 0x0
+#define MX8MP_IOMUXC_SD1_DATA4__USDHC1_DATA4                         0x0A4 0x304 0x000 0x0 0x0
+#define MX8MP_IOMUXC_SD1_DATA4__ENET1_RGMII_TX_CTL                   0x0A4 0x304 0x000 0x1 0x0
+#define MX8MP_IOMUXC_SD1_DATA4__I2C1_SCL                             0x0A4 0x304 0x5A4 0x3 0x0
+#define MX8MP_IOMUXC_SD1_DATA4__UART2_DCE_RTS                        0x0A4 0x304 0x5EC 0x4 0x0
+#define MX8MP_IOMUXC_SD1_DATA4__UART2_DTE_CTS                        0x0A4 0x304 0x000 0x4 0x0
+#define MX8MP_IOMUXC_SD1_DATA4__GPIO2_IO06                           0x0A4 0x304 0x000 0x5 0x0
+#define MX8MP_IOMUXC_SD1_DATA4__SIM_M_HRESP                          0x0A4 0x304 0x000 0x7 0x0
+#define MX8MP_IOMUXC_SD1_DATA5__USDHC1_DATA5                         0x0A8 0x308 0x000 0x0 0x0
+#define MX8MP_IOMUXC_SD1_DATA5__ENET1_TX_ER                          0x0A8 0x308 0x000 0x1 0x0
+#define MX8MP_IOMUXC_SD1_DATA5__I2C1_SDA                             0x0A8 0x308 0x5A8 0x3 0x0
+#define MX8MP_IOMUXC_SD1_DATA5__UART2_DCE_CTS                        0x0A8 0x308 0x000 0x4 0x0
+#define MX8MP_IOMUXC_SD1_DATA5__UART2_DTE_RTS                        0x0A8 0x308 0x5EC 0x4 0x1
+#define MX8MP_IOMUXC_SD1_DATA5__GPIO2_IO07                           0x0A8 0x308 0x000 0x5 0x0
+#define MX8MP_IOMUXC_SD1_DATA5__TPSMP_HDATA05                        0x0A8 0x308 0x000 0x7 0x0
+#define MX8MP_IOMUXC_SD1_DATA6__USDHC1_DATA6                         0x0AC 0x30C 0x000 0x0 0x0
+#define MX8MP_IOMUXC_SD1_DATA6__ENET1_RGMII_RX_CTL                   0x0AC 0x30C 0x588 0x1 0x0
+#define MX8MP_IOMUXC_SD1_DATA6__I2C2_SCL                             0x0AC 0x30C 0x5AC 0x3 0x0
+#define MX8MP_IOMUXC_SD1_DATA6__UART3_DCE_TX                         0x0AC 0x30C 0x000 0x4 0x0
+#define MX8MP_IOMUXC_SD1_DATA6__UART3_DTE_RX                         0x0AC 0x30C 0x5F8 0x4 0x0
+#define MX8MP_IOMUXC_SD1_DATA6__GPIO2_IO08                           0x0AC 0x30C 0x000 0x5 0x0
+#define MX8MP_IOMUXC_SD1_DATA6__TPSMP_HDATA06                        0x0AC 0x30C 0x000 0x7 0x0
+#define MX8MP_IOMUXC_SD1_DATA7__USDHC1_DATA7                         0x0B0 0x310 0x000 0x0 0x0
+#define MX8MP_IOMUXC_SD1_DATA7__ENET1_RX_ER                          0x0B0 0x310 0x58C 0x1 0x0
+#define MX8MP_IOMUXC_SD1_DATA7__I2C2_SDA                             0x0B0 0x310 0x5B0 0x3 0x0
+#define MX8MP_IOMUXC_SD1_DATA7__UART3_DCE_RX                         0x0B0 0x310 0x5F8 0x4 0x1
+#define MX8MP_IOMUXC_SD1_DATA7__UART3_DTE_TX                         0x0B0 0x310 0x000 0x4 0x0
+#define MX8MP_IOMUXC_SD1_DATA7__GPIO2_IO09                           0x0B0 0x310 0x000 0x5 0x0
+#define MX8MP_IOMUXC_SD1_DATA7__TPSMP_HDATA07                        0x0B0 0x310 0x000 0x7 0x0
+#define MX8MP_IOMUXC_SD1_RESET_B__USDHC1_RESET_B                     0x0B4 0x314 0x000 0x0 0x0
+#define MX8MP_IOMUXC_SD1_RESET_B__ENET1_TX_CLK                       0x0B4 0x314 0x578 0x1 0x0
+#define MX8MP_IOMUXC_SD1_RESET_B__I2C3_SCL                           0x0B4 0x314 0x5B4 0x3 0x0
+#define MX8MP_IOMUXC_SD1_RESET_B__UART3_DCE_RTS                      0x0B4 0x314 0x5F4 0x4 0x0
+#define MX8MP_IOMUXC_SD1_RESET_B__UART3_DTE_CTS                      0x0B4 0x314 0x000 0x4 0x0
+#define MX8MP_IOMUXC_SD1_RESET_B__GPIO2_IO10                         0x0B4 0x314 0x000 0x5 0x0
+#define MX8MP_IOMUXC_SD1_RESET_B__ECSPI3_TEST_TRIG                   0x0B4 0x314 0x000 0x7 0x0
+#define MX8MP_IOMUXC_SD1_STROBE__USDHC1_STROBE                       0x0B8 0x318 0x000 0x0 0x0
+#define MX8MP_IOMUXC_SD1_STROBE__I2C3_SDA                            0x0B8 0x318 0x5B8 0x3 0x0
+#define MX8MP_IOMUXC_SD1_STROBE__UART3_DCE_CTS                       0x0B8 0x318 0x000 0x4 0x0
+#define MX8MP_IOMUXC_SD1_STROBE__UART3_DTE_RTS                       0x0B8 0x318 0x5F4 0x4 0x1
+#define MX8MP_IOMUXC_SD1_STROBE__GPIO2_IO11                          0x0B8 0x318 0x000 0x5 0x0
+#define MX8MP_IOMUXC_SD1_STROBE__USDHC3_TEST_TRIG                    0x0B8 0x318 0x000 0x7 0x0
+#define MX8MP_IOMUXC_SD2_CD_B__USDHC2_CD_B                           0x0BC 0x31C 0x000 0x0 0x0
+#define MX8MP_IOMUXC_SD2_CD_B__GPIO2_IO12                            0x0BC 0x31C 0x000 0x5 0x0
+#define MX8MP_IOMUXC_SD2_CD_B__CCMSRCGPCMIX_TESTER_ACK               0x0BC 0x31C 0x000 0x6 0x0
+#define MX8MP_IOMUXC_SD2_CLK__USDHC2_CLK                             0x0C0 0x320 0x000 0x0 0x0
+#define MX8MP_IOMUXC_SD2_CLK__ECSPI2_SCLK                            0x0C0 0x320 0x568 0x2 0x0
+#define MX8MP_IOMUXC_SD2_CLK__UART4_DCE_RX                           0x0C0 0x320 0x600 0x3 0x0
+#define MX8MP_IOMUXC_SD2_CLK__UART4_DTE_TX                           0x0C0 0x320 0x000 0x3 0x0
+#define MX8MP_IOMUXC_SD2_CLK__GPIO2_IO13                             0x0C0 0x320 0x000 0x5 0x0
+#define MX8MP_IOMUXC_SD2_CLK__CCMSRCGPCMIX_OBSERVE0                  0x0C0 0x320 0x000 0x6 0x0
+#define MX8MP_IOMUXC_SD2_CLK__OBSERVE_MUX_OUT00                      0x0C0 0x320 0x000 0x7 0x0
+#define MX8MP_IOMUXC_SD2_CMD__USDHC2_CMD                             0x0C4 0x324 0x000 0x0 0x0
+#define MX8MP_IOMUXC_SD2_CMD__ECSPI2_MOSI                            0x0C4 0x324 0x570 0x2 0x0
+#define MX8MP_IOMUXC_SD2_CMD__UART4_DCE_TX                           0x0C4 0x324 0x000 0x3 0x0
+#define MX8MP_IOMUXC_SD2_CMD__UART4_DTE_RX                           0x0C4 0x324 0x600 0x3 0x1
+#define MX8MP_IOMUXC_SD2_CMD__AUDIOMIX_CLK                           0x0C4 0x324 0x000 0x4 0x0
+#define MX8MP_IOMUXC_SD2_CMD__GPIO2_IO14                             0x0C4 0x324 0x000 0x5 0x0
+#define MX8MP_IOMUXC_SD2_CMD__CCMSRCGPCMIX_OBSERVE1                  0x0C4 0x324 0x000 0x6 0x0
+#define MX8MP_IOMUXC_SD2_CMD__OBSERVE_MUX_OUT01                      0x0C4 0x324 0x000 0x7 0x0
+#define MX8MP_IOMUXC_SD2_DATA0__USDHC2_DATA0                         0x0C8 0x328 0x000 0x0 0x0
+#define MX8MP_IOMUXC_SD2_DATA0__I2C4_SDA                             0x0C8 0x328 0x5C0 0x2 0x1
+#define MX8MP_IOMUXC_SD2_DATA0__UART2_DCE_RX                         0x0C8 0x328 0x5F0 0x3 0x2
+#define MX8MP_IOMUXC_SD2_DATA0__UART2_DTE_TX                         0x0C8 0x328 0x000 0x3 0x0
+#define MX8MP_IOMUXC_SD2_DATA0__AUDIOMIX_BIT_STREAM00                0x0C8 0x328 0x4C0 0x4 0x1
+#define MX8MP_IOMUXC_SD2_DATA0__GPIO2_IO15                           0x0C8 0x328 0x000 0x5 0x0
+#define MX8MP_IOMUXC_SD2_DATA0__CCMSRCGPCMIX_OBSERVE2                0x0C8 0x328 0x000 0x6 0x0
+#define MX8MP_IOMUXC_SD2_DATA0__OBSERVE_MUX_OUT02                    0x0C8 0x328 0x000 0x7 0x0
+#define MX8MP_IOMUXC_SD2_DATA1__USDHC2_DATA1                         0x0CC 0x32C 0x000 0x0 0x0
+#define MX8MP_IOMUXC_SD2_DATA1__I2C4_SCL                             0x0CC 0x32C 0x5BC 0x2 0x1
+#define MX8MP_IOMUXC_SD2_DATA1__UART2_DCE_TX                         0x0CC 0x32C 0x000 0x3 0x0
+#define MX8MP_IOMUXC_SD2_DATA1__UART2_DTE_RX                         0x0CC 0x32C 0x5F0 0x3 0x3
+#define MX8MP_IOMUXC_SD2_DATA1__AUDIOMIX_BIT_STREAM01                0x0CC 0x32C 0x4C4 0x4 0x1
+#define MX8MP_IOMUXC_SD2_DATA1__GPIO2_IO16                           0x0CC 0x32C 0x000 0x5 0x0
+#define MX8MP_IOMUXC_SD2_DATA1__CCMSRCGPCMIX_WAIT                    0x0CC 0x32C 0x000 0x6 0x0
+#define MX8MP_IOMUXC_SD2_DATA1__OBSERVE_MUX_OUT03                    0x0CC 0x32C 0x000 0x7 0x0
+#define MX8MP_IOMUXC_SD2_DATA2__USDHC2_DATA2                         0x0D0 0x330 0x000 0x0 0x0
+#define MX8MP_IOMUXC_SD2_DATA2__ECSPI2_SS0                           0x0D0 0x330 0x574 0x2 0x0
+#define MX8MP_IOMUXC_SD2_DATA2__AUDIOMIX_SPDIF_OUT                   0x0D0 0x330 0x000 0x3 0x0
+#define MX8MP_IOMUXC_SD2_DATA2__AUDIOMIX_BIT_STREAM02                0x0D0 0x330 0x4C8 0x4 0x1
+#define MX8MP_IOMUXC_SD2_DATA2__GPIO2_IO17                           0x0D0 0x330 0x000 0x5 0x0
+#define MX8MP_IOMUXC_SD2_DATA2__CCMSRCGPCMIX_STOP                    0x0D0 0x330 0x000 0x6 0x0
+#define MX8MP_IOMUXC_SD2_DATA2__OBSERVE_MUX_OUT04                    0x0D0 0x330 0x000 0x7 0x0
+#define MX8MP_IOMUXC_SD2_DATA3__USDHC2_DATA3                         0x0D4 0x334 0x000 0x0 0x0
+#define MX8MP_IOMUXC_SD2_DATA3__ECSPI2_MISO                          0x0D4 0x334 0x56C 0x2 0x0
+#define MX8MP_IOMUXC_SD2_DATA3__AUDIOMIX_SPDIF_IN                    0x0D4 0x334 0x544 0x3 0x1
+#define MX8MP_IOMUXC_SD2_DATA3__AUDIOMIX_BIT_STREAM03                0x0D4 0x334 0x4CC 0x4 0x1
+#define MX8MP_IOMUXC_SD2_DATA3__GPIO2_IO18                           0x0D4 0x334 0x000 0x5 0x0
+#define MX8MP_IOMUXC_SD2_DATA3__CCMSRCGPCMIX_EARLY_RESET             0x0D4 0x334 0x000 0x6 0x0
+#define MX8MP_IOMUXC_SD2_RESET_B__USDHC2_RESET_B                     0x0D8 0x338 0x000 0x0 0x0
+#define MX8MP_IOMUXC_SD2_RESET_B__GPIO2_IO19                         0x0D8 0x338 0x000 0x5 0x0
+#define MX8MP_IOMUXC_SD2_RESET_B__CCMSRCGPCMIX_SYSTEM_RESET          0x0D8 0x338 0x000 0x6 0x0
+#define MX8MP_IOMUXC_SD2_WP__USDHC2_WP                               0x0DC 0x33C 0x000 0x0 0x0
+#define MX8MP_IOMUXC_SD2_WP__GPIO2_IO20                              0x0DC 0x33C 0x000 0x5 0x0
+#define MX8MP_IOMUXC_SD2_WP__CORESIGHT_EVENTI                        0x0DC 0x33C 0x000 0x6 0x0
+#define MX8MP_IOMUXC_SD2_WP__SIM_M_HMASTLOCK                         0x0DC 0x33C 0x000 0x7 0x0
+#define MX8MP_IOMUXC_NAND_ALE__RAWNAND_ALE                           0x0E0 0x340 0x000 0x0 0x0
+#define MX8MP_IOMUXC_NAND_ALE__FLEXSPI_A_SCLK                        0x0E0 0x340 0x000 0x1 0x0
+#define MX8MP_IOMUXC_NAND_ALE__AUDIOMIX_SAI3_TX_BCLK                 0x0E0 0x340 0x4E8 0x2 0x0
+#define MX8MP_IOMUXC_NAND_ALE__MEDIAMIX_ISP_FL_TRIG_0                0x0E0 0x340 0x5D4 0x3 0x1
+#define MX8MP_IOMUXC_NAND_ALE__UART3_DCE_RX                          0x0E0 0x340 0x5F8 0x4 0x2
+#define MX8MP_IOMUXC_NAND_ALE__UART3_DTE_TX                          0x0E0 0x340 0x000 0x4 0x0
+#define MX8MP_IOMUXC_NAND_ALE__GPIO3_IO00                            0x0E0 0x340 0x000 0x5 0x0
+#define MX8MP_IOMUXC_NAND_ALE__CORESIGHT_TRACE_CLK                   0x0E0 0x340 0x000 0x6 0x0
+#define MX8MP_IOMUXC_NAND_ALE__SIM_M_HPROT00                         0x0E0 0x340 0x000 0x7 0x0
+#define MX8MP_IOMUXC_NAND_CE0_B__RAWNAND_CE0_B                       0x0E4 0x344 0x000 0x0 0x0
+#define MX8MP_IOMUXC_NAND_CE0_B__FLEXSPI_A_SS0_B                     0x0E4 0x344 0x000 0x1 0x0
+#define MX8MP_IOMUXC_NAND_CE0_B__AUDIOMIX_SAI3_TX_DATA00             0x0E4 0x344 0x000 0x2 0x0
+#define MX8MP_IOMUXC_NAND_CE0_B__MEDIAMIX_ISP_SHUTTER_TRIG_0         0x0E4 0x344 0x5DC 0x3 0x1
+#define MX8MP_IOMUXC_NAND_CE0_B__UART3_DCE_TX                        0x0E4 0x344 0x000 0x4 0x0
+#define MX8MP_IOMUXC_NAND_CE0_B__UART3_DTE_RX                        0x0E4 0x344 0x5F8 0x4 0x3
+#define MX8MP_IOMUXC_NAND_CE0_B__GPIO3_IO01                          0x0E4 0x344 0x000 0x5 0x0
+#define MX8MP_IOMUXC_NAND_CE0_B__CORESIGHT_TRACE_CTL                 0x0E4 0x344 0x000 0x6 0x0
+#define MX8MP_IOMUXC_NAND_CE0_B__SIM_M_HPROT01                       0x0E4 0x344 0x000 0x7 0x0
+#define MX8MP_IOMUXC_NAND_CE1_B__RAWNAND_CE1_B                       0x0E8 0x348 0x000 0x0 0x0
+#define MX8MP_IOMUXC_NAND_CE1_B__FLEXSPI_A_SS1_B                     0x0E8 0x348 0x000 0x1 0x0
+#define MX8MP_IOMUXC_NAND_CE1_B__USDHC3_STROBE                       0x0E8 0x348 0x630 0x2 0x1
+#define MX8MP_IOMUXC_NAND_CE1_B__I2C4_SCL                            0x0E8 0x348 0x5BC 0x4 0x2
+#define MX8MP_IOMUXC_NAND_CE1_B__GPIO3_IO02                          0x0E8 0x348 0x000 0x5 0x0
+#define MX8MP_IOMUXC_NAND_CE1_B__CORESIGHT_TRACE00                   0x0E8 0x348 0x000 0x6 0x0
+#define MX8MP_IOMUXC_NAND_CE1_B__SIM_M_HPROT02                       0x0E8 0x348 0x000 0x7 0x0
+#define MX8MP_IOMUXC_NAND_CE2_B__RAWNAND_CE2_B                       0x0EC 0x34C 0x000 0x0 0x0
+#define MX8MP_IOMUXC_NAND_CE2_B__FLEXSPI_B_SS0_B                     0x0EC 0x34C 0x000 0x1 0x0
+#define MX8MP_IOMUXC_NAND_CE2_B__USDHC3_DATA5                        0x0EC 0x34C 0x624 0x2 0x1
+#define MX8MP_IOMUXC_NAND_CE2_B__I2C4_SDA                            0x0EC 0x34C 0x5C0 0x4 0x2
+#define MX8MP_IOMUXC_NAND_CE2_B__GPIO3_IO03                          0x0EC 0x34C 0x000 0x5 0x0
+#define MX8MP_IOMUXC_NAND_CE2_B__CORESIGHT_TRACE01                   0x0EC 0x34C 0x000 0x6 0x0
+#define MX8MP_IOMUXC_NAND_CE2_B__SIM_M_HPROT03                       0x0EC 0x34C 0x000 0x7 0x0
+#define MX8MP_IOMUXC_NAND_CE3_B__RAWNAND_CE3_B                       0x0F0 0x350 0x000 0x0 0x0
+#define MX8MP_IOMUXC_NAND_CE3_B__FLEXSPI_B_SS1_B                     0x0F0 0x350 0x000 0x1 0x0
+#define MX8MP_IOMUXC_NAND_CE3_B__USDHC3_DATA6                        0x0F0 0x350 0x628 0x2 0x1
+#define MX8MP_IOMUXC_NAND_CE3_B__I2C3_SDA                            0x0F0 0x350 0x5B8 0x4 0x1
+#define MX8MP_IOMUXC_NAND_CE3_B__GPIO3_IO04                          0x0F0 0x350 0x000 0x5 0x0
+#define MX8MP_IOMUXC_NAND_CE3_B__CORESIGHT_TRACE02                   0x0F0 0x350 0x000 0x6 0x0
+#define MX8MP_IOMUXC_NAND_CE3_B__SIM_M_HADDR00                       0x0F0 0x350 0x000 0x7 0x0
+#define MX8MP_IOMUXC_NAND_CLE__RAWNAND_CLE                           0x0F4 0x354 0x000 0x0 0x0
+#define MX8MP_IOMUXC_NAND_CLE__FLEXSPI_B_SCLK                        0x0F4 0x354 0x000 0x1 0x0
+#define MX8MP_IOMUXC_NAND_CLE__USDHC3_DATA7                          0x0F4 0x354 0x62C 0x2 0x1
+#define MX8MP_IOMUXC_NAND_CLE__UART4_DCE_RX                          0x0F4 0x354 0x600 0x4 0x2
+#define MX8MP_IOMUXC_NAND_CLE__UART4_DTE_TX                          0x0F4 0x354 0x000 0x4 0x0
+#define MX8MP_IOMUXC_NAND_CLE__GPIO3_IO05                            0x0F4 0x354 0x000 0x5 0x0
+#define MX8MP_IOMUXC_NAND_CLE__CORESIGHT_TRACE03                     0x0F4 0x354 0x000 0x6 0x0
+#define MX8MP_IOMUXC_NAND_CLE__SIM_M_HADDR01                         0x0F4 0x354 0x000 0x7 0x0
+#define MX8MP_IOMUXC_NAND_DATA00__RAWNAND_DATA00                     0x0F8 0x358 0x000 0x0 0x0
+#define MX8MP_IOMUXC_NAND_DATA00__FLEXSPI_A_DATA00                   0x0F8 0x358 0x000 0x1 0x0
+#define MX8MP_IOMUXC_NAND_DATA00__AUDIOMIX_SAI3_RX_DATA00            0x0F8 0x358 0x4E4 0x2 0x0
+#define MX8MP_IOMUXC_NAND_DATA00__MEDIAMIX_ISP_FLASH_TRIG_0          0x0F8 0x358 0x000 0x3 0x0
+#define MX8MP_IOMUXC_NAND_DATA00__UART4_DCE_RX                       0x0F8 0x358 0x600 0x4 0x3
+#define MX8MP_IOMUXC_NAND_DATA00__UART4_DTE_TX                       0x0F8 0x358 0x000 0x4 0x0
+#define MX8MP_IOMUXC_NAND_DATA00__GPIO3_IO06                         0x0F8 0x358 0x000 0x5 0x0
+#define MX8MP_IOMUXC_NAND_DATA00__CORESIGHT_TRACE04                  0x0F8 0x358 0x000 0x6 0x0
+#define MX8MP_IOMUXC_NAND_DATA00__SIM_M_HADDR02                      0x0F8 0x358 0x000 0x7 0x0
+#define MX8MP_IOMUXC_NAND_DATA01__RAWNAND_DATA01                     0x0FC 0x35C 0x000 0x0 0x0
+#define MX8MP_IOMUXC_NAND_DATA01__FLEXSPI_A_DATA01                   0x0FC 0x35C 0x000 0x1 0x0
+#define MX8MP_IOMUXC_NAND_DATA01__AUDIOMIX_SAI3_TX_SYNC              0x0FC 0x35C 0x4EC 0x2 0x0
+#define MX8MP_IOMUXC_NAND_DATA01__MEDIAMIX_ISP_PRELIGHT_TRIG_0       0x0FC 0x35C 0x000 0x3 0x0
+#define MX8MP_IOMUXC_NAND_DATA01__UART4_DCE_TX                       0x0FC 0x35C 0x000 0x4 0x0
+#define MX8MP_IOMUXC_NAND_DATA01__UART4_DTE_RX                       0x0FC 0x35C 0x600 0x4 0x4
+#define MX8MP_IOMUXC_NAND_DATA01__GPIO3_IO07                         0x0FC 0x35C 0x000 0x5 0x0
+#define MX8MP_IOMUXC_NAND_DATA01__CORESIGHT_TRACE05                  0x0FC 0x35C 0x000 0x6 0x0
+#define MX8MP_IOMUXC_NAND_DATA01__SIM_M_HADDR03                      0x0FC 0x35C 0x000 0x7 0x0
+#define MX8MP_IOMUXC_NAND_DATA02__RAWNAND_DATA02                     0x100 0x360 0x000 0x0 0x0
+#define MX8MP_IOMUXC_NAND_DATA02__FLEXSPI_A_DATA02                   0x100 0x360 0x000 0x1 0x0
+#define MX8MP_IOMUXC_NAND_DATA02__USDHC3_CD_B                        0x100 0x360 0x608 0x2 0x2
+#define MX8MP_IOMUXC_NAND_DATA02__UART4_DCE_CTS                      0x100 0x360 0x000 0x3 0x0
+#define MX8MP_IOMUXC_NAND_DATA02__UART4_DTE_RTS                      0x100 0x360 0x5FC 0x3 0x0
+#define MX8MP_IOMUXC_NAND_DATA02__I2C4_SDA                           0x100 0x360 0x5C0 0x4 0x3
+#define MX8MP_IOMUXC_NAND_DATA02__GPIO3_IO08                         0x100 0x360 0x000 0x5 0x0
+#define MX8MP_IOMUXC_NAND_DATA02__CORESIGHT_TRACE06                  0x100 0x360 0x000 0x6 0x0
+#define MX8MP_IOMUXC_NAND_DATA02__SIM_M_HADDR04                      0x100 0x360 0x000 0x7 0x0
+#define MX8MP_IOMUXC_NAND_DATA03__RAWNAND_DATA03                     0x104 0x364 0x000 0x0 0x0
+#define MX8MP_IOMUXC_NAND_DATA03__FLEXSPI_A_DATA03                   0x104 0x364 0x000 0x1 0x0
+#define MX8MP_IOMUXC_NAND_DATA03__USDHC3_WP                          0x104 0x364 0x634 0x2 0x2
+#define MX8MP_IOMUXC_NAND_DATA03__UART4_DCE_RTS                      0x104 0x364 0x5FC 0x3 0x1
+#define MX8MP_IOMUXC_NAND_DATA03__UART4_DTE_CTS                      0x104 0x364 0x000 0x3 0x0
+#define MX8MP_IOMUXC_NAND_DATA03__MEDIAMIX_ISP_FL_TRIG_1             0x104 0x364 0x5D8 0x4 0x1
+#define MX8MP_IOMUXC_NAND_DATA03__GPIO3_IO09                         0x104 0x364 0x000 0x5 0x0
+#define MX8MP_IOMUXC_NAND_DATA03__CORESIGHT_TRACE07                  0x104 0x364 0x000 0x6 0x0
+#define MX8MP_IOMUXC_NAND_DATA03__SIM_M_HADDR05                      0x104 0x364 0x000 0x7 0x0
+#define MX8MP_IOMUXC_NAND_DATA04__RAWNAND_DATA04                     0x108 0x368 0x000 0x0 0x0
+#define MX8MP_IOMUXC_NAND_DATA04__FLEXSPI_B_DATA00                   0x108 0x368 0x000 0x1 0x0
+#define MX8MP_IOMUXC_NAND_DATA04__USDHC3_DATA0                       0x108 0x368 0x610 0x2 0x1
+#define MX8MP_IOMUXC_NAND_DATA04__FLEXSPI_A_DATA04                   0x108 0x368 0x000 0x3 0x0
+#define MX8MP_IOMUXC_NAND_DATA04__MEDIAMIX_ISP_SHUTTER_TRIG_1        0x108 0x368 0x5E0 0x4 0x1
+#define MX8MP_IOMUXC_NAND_DATA04__GPIO3_IO10                         0x108 0x368 0x000 0x5 0x0
+#define MX8MP_IOMUXC_NAND_DATA04__CORESIGHT_TRACE08                  0x108 0x368 0x000 0x6 0x0
+#define MX8MP_IOMUXC_NAND_DATA04__SIM_M_HADDR06                      0x108 0x368 0x000 0x7 0x0
+#define MX8MP_IOMUXC_NAND_DATA05__RAWNAND_DATA05                     0x10C 0x36C 0x000 0x0 0x0
+#define MX8MP_IOMUXC_NAND_DATA05__FLEXSPI_B_DATA01                   0x10C 0x36C 0x000 0x1 0x0
+#define MX8MP_IOMUXC_NAND_DATA05__USDHC3_DATA1                       0x10C 0x36C 0x614 0x2 0x1
+#define MX8MP_IOMUXC_NAND_DATA05__FLEXSPI_A_DATA05                   0x10C 0x36C 0x000 0x3 0x0
+#define MX8MP_IOMUXC_NAND_DATA05__MEDIAMIX_ISP_FLASH_TRIG_1          0x10C 0x36C 0x000 0x4 0x0
+#define MX8MP_IOMUXC_NAND_DATA05__GPIO3_IO11                         0x10C 0x36C 0x000 0x5 0x0
+#define MX8MP_IOMUXC_NAND_DATA05__CORESIGHT_TRACE09                  0x10C 0x36C 0x000 0x6 0x0
+#define MX8MP_IOMUXC_NAND_DATA05__SIM_M_HADDR07                      0x10C 0x36C 0x000 0x7 0x0
+#define MX8MP_IOMUXC_NAND_DATA06__RAWNAND_DATA06                     0x110 0x370 0x000 0x0 0x0
+#define MX8MP_IOMUXC_NAND_DATA06__FLEXSPI_B_DATA02                   0x110 0x370 0x000 0x1 0x0
+#define MX8MP_IOMUXC_NAND_DATA06__USDHC3_DATA2                       0x110 0x370 0x618 0x2 0x1
+#define MX8MP_IOMUXC_NAND_DATA06__FLEXSPI_A_DATA06                   0x110 0x370 0x000 0x3 0x0
+#define MX8MP_IOMUXC_NAND_DATA06__MEDIAMIX_ISP_PRELIGHT_TRIG_1       0x110 0x370 0x000 0x4 0x0
+#define MX8MP_IOMUXC_NAND_DATA06__GPIO3_IO12                         0x110 0x370 0x000 0x5 0x0
+#define MX8MP_IOMUXC_NAND_DATA06__CORESIGHT_TRACE10                  0x110 0x370 0x000 0x6 0x0
+#define MX8MP_IOMUXC_NAND_DATA06__SIM_M_HADDR08                      0x110 0x370 0x000 0x7 0x0
+#define MX8MP_IOMUXC_NAND_DATA07__RAWNAND_DATA07                     0x114 0x374 0x000 0x0 0x0
+#define MX8MP_IOMUXC_NAND_DATA07__FLEXSPI_B_DATA03                   0x114 0x374 0x000 0x1 0x0
+#define MX8MP_IOMUXC_NAND_DATA07__USDHC3_DATA3                       0x114 0x374 0x61C 0x2 0x1
+#define MX8MP_IOMUXC_NAND_DATA07__FLEXSPI_A_DATA07                   0x114 0x374 0x000 0x3 0x0
+#define MX8MP_IOMUXC_NAND_DATA07__MEDIAMIX_ISP_SHUTTER_OPEN_1        0x114 0x374 0x000 0x4 0x0
+#define MX8MP_IOMUXC_NAND_DATA07__GPIO3_IO13                         0x114 0x374 0x000 0x5 0x0
+#define MX8MP_IOMUXC_NAND_DATA07__CORESIGHT_TRACE11                  0x114 0x374 0x000 0x6 0x0
+#define MX8MP_IOMUXC_NAND_DATA07__SIM_M_HADDR09                      0x114 0x374 0x000 0x7 0x0
+#define MX8MP_IOMUXC_NAND_DQS__RAWNAND_DQS                           0x118 0x378 0x000 0x0 0x0
+#define MX8MP_IOMUXC_NAND_DQS__FLEXSPI_A_DQS                         0x118 0x378 0x000 0x1 0x0
+#define MX8MP_IOMUXC_NAND_DQS__AUDIOMIX_SAI3_MCLK                    0x118 0x378 0x4E0 0x2 0x0
+#define MX8MP_IOMUXC_NAND_DQS__MEDIAMIX_ISP_SHUTTER_OPEN_0           0x118 0x378 0x000 0x3 0x0
+#define MX8MP_IOMUXC_NAND_DQS__I2C3_SCL                              0x118 0x378 0x5B4 0x4 0x1
+#define MX8MP_IOMUXC_NAND_DQS__GPIO3_IO14                            0x118 0x378 0x000 0x5 0x0
+#define MX8MP_IOMUXC_NAND_DQS__CORESIGHT_TRACE12                     0x118 0x378 0x000 0x6 0x0
+#define MX8MP_IOMUXC_NAND_DQS__SIM_M_HADDR10                         0x118 0x378 0x000 0x7 0x0
+#define MX8MP_IOMUXC_NAND_RE_B__RAWNAND_RE_B                         0x11C 0x37C 0x000 0x0 0x0
+#define MX8MP_IOMUXC_NAND_RE_B__FLEXSPI_B_DQS                        0x11C 0x37C 0x000 0x1 0x0
+#define MX8MP_IOMUXC_NAND_RE_B__USDHC3_DATA4                         0x11C 0x37C 0x620 0x2 0x1
+#define MX8MP_IOMUXC_NAND_RE_B__UART4_DCE_TX                         0x11C 0x37C 0x000 0x4 0x0
+#define MX8MP_IOMUXC_NAND_RE_B__UART4_DTE_RX                         0x11C 0x37C 0x600 0x4 0x5
+#define MX8MP_IOMUXC_NAND_RE_B__GPIO3_IO15                           0x11C 0x37C 0x000 0x5 0x0
+#define MX8MP_IOMUXC_NAND_RE_B__CORESIGHT_TRACE13                    0x11C 0x37C 0x000 0x6 0x0
+#define MX8MP_IOMUXC_NAND_RE_B__SIM_M_HADDR11                        0x11C 0x37C 0x000 0x7 0x0
+#define MX8MP_IOMUXC_NAND_READY_B__RAWNAND_READY_B                   0x120 0x380 0x000 0x0 0x0
+#define MX8MP_IOMUXC_NAND_READY_B__USDHC3_RESET_B                    0x120 0x380 0x000 0x2 0x0
+#define MX8MP_IOMUXC_NAND_READY_B__I2C3_SCL                          0x120 0x380 0x5B4 0x4 0x2
+#define MX8MP_IOMUXC_NAND_READY_B__GPIO3_IO16                        0x120 0x380 0x000 0x5 0x0
+#define MX8MP_IOMUXC_NAND_READY_B__CORESIGHT_TRACE14                 0x120 0x380 0x000 0x6 0x0
+#define MX8MP_IOMUXC_NAND_READY_B__SIM_M_HADDR12                     0x120 0x380 0x000 0x7 0x0
+#define MX8MP_IOMUXC_NAND_WE_B__RAWNAND_WE_B                         0x124 0x384 0x000 0x0 0x0
+#define MX8MP_IOMUXC_NAND_WE_B__USDHC3_CLK                           0x124 0x384 0x604 0x2 0x1
+#define MX8MP_IOMUXC_NAND_WE_B__I2C3_SDA                             0x124 0x384 0x5B8 0x4 0x2
+#define MX8MP_IOMUXC_NAND_WE_B__GPIO3_IO17                           0x124 0x384 0x000 0x5 0x0
+#define MX8MP_IOMUXC_NAND_WE_B__CORESIGHT_TRACE15                    0x124 0x384 0x000 0x6 0x0
+#define MX8MP_IOMUXC_NAND_WE_B__SIM_M_HADDR13                        0x124 0x384 0x000 0x7 0x0
+#define MX8MP_IOMUXC_NAND_WP_B__RAWNAND_WP_B                         0x128 0x388 0x000 0x0 0x0
+#define MX8MP_IOMUXC_NAND_WP_B__USDHC3_CMD                           0x128 0x388 0x60C 0x2 0x1
+#define MX8MP_IOMUXC_NAND_WP_B__I2C4_SCL                             0x128 0x388 0x5BC 0x4 0x3
+#define MX8MP_IOMUXC_NAND_WP_B__GPIO3_IO18                           0x128 0x388 0x000 0x5 0x0
+#define MX8MP_IOMUXC_NAND_WP_B__CORESIGHT_EVENTO                     0x128 0x388 0x000 0x6 0x0
+#define MX8MP_IOMUXC_NAND_WP_B__SIM_M_HADDR14                        0x128 0x388 0x000 0x7 0x0
+#define MX8MP_IOMUXC_SAI5_RXFS__AUDIOMIX_SAI5_RX_SYNC                0x12C 0x38C 0x508 0x0 0x0
+#define MX8MP_IOMUXC_SAI5_RXFS__AUDIOMIX_SAI1_TX_DATA00              0x12C 0x38C 0x000 0x1 0x0
+#define MX8MP_IOMUXC_SAI5_RXFS__PWM4_OUT                             0x12C 0x38C 0x000 0x2 0x0
+#define MX8MP_IOMUXC_SAI5_RXFS__I2C6_SCL                             0x12C 0x38C 0x5CC 0x3 0x1
+#define MX8MP_IOMUXC_SAI5_RXFS__GPIO3_IO19                           0x12C 0x38C 0x000 0x5 0x0
+#define MX8MP_IOMUXC_SAI5_RXC__AUDIOMIX_SAI5_RX_BCLK                 0x130 0x390 0x4F4 0x0 0x0
+#define MX8MP_IOMUXC_SAI5_RXC__AUDIOMIX_SAI1_TX_DATA01               0x130 0x390 0x000 0x1 0x0
+#define MX8MP_IOMUXC_SAI5_RXC__PWM3_OUT                              0x130 0x390 0x000 0x2 0x0
+#define MX8MP_IOMUXC_SAI5_RXC__I2C6_SDA                              0x130 0x390 0x5D0 0x3 0x1
+#define MX8MP_IOMUXC_SAI5_RXC__AUDIOMIX_CLK                          0x130 0x390 0x000 0x4 0x0
+#define MX8MP_IOMUXC_SAI5_RXC__GPIO3_IO20                            0x130 0x390 0x000 0x5 0x0
+#define MX8MP_IOMUXC_SAI5_RXD0__AUDIOMIX_SAI5_RX_DATA00              0x134 0x394 0x4F8 0x0 0x0
+#define MX8MP_IOMUXC_SAI5_RXD0__AUDIOMIX_SAI1_TX_DATA02              0x134 0x394 0x000 0x1 0x0
+#define MX8MP_IOMUXC_SAI5_RXD0__PWM2_OUT                             0x134 0x394 0x000 0x2 0x0
+#define MX8MP_IOMUXC_SAI5_RXD0__I2C5_SCL                             0x134 0x394 0x5C4 0x3 0x1
+#define MX8MP_IOMUXC_SAI5_RXD0__AUDIOMIX_BIT_STREAM00                0x134 0x394 0x4C0 0x4 0x2
+#define MX8MP_IOMUXC_SAI5_RXD0__GPIO3_IO21                           0x134 0x394 0x000 0x5 0x0
+#define MX8MP_IOMUXC_SAI5_RXD1__AUDIOMIX_SAI5_RX_DATA01              0x138 0x398 0x4FC 0x0 0x0
+#define MX8MP_IOMUXC_SAI5_RXD1__AUDIOMIX_SAI1_TX_DATA03              0x138 0x398 0x000 0x1 0x0
+#define MX8MP_IOMUXC_SAI5_RXD1__AUDIOMIX_SAI1_TX_SYNC                0x138 0x398 0x4D8 0x2 0x0
+#define MX8MP_IOMUXC_SAI5_RXD1__AUDIOMIX_SAI5_TX_SYNC                0x138 0x398 0x510 0x3 0x0
+#define MX8MP_IOMUXC_SAI5_RXD1__AUDIOMIX_BIT_STREAM01                0x138 0x398 0x4C4 0x4 0x2
+#define MX8MP_IOMUXC_SAI5_RXD1__GPIO3_IO22                           0x138 0x398 0x000 0x5 0x0
+#define MX8MP_IOMUXC_SAI5_RXD1__CAN1_TX                              0x138 0x398 0x000 0x6 0x0
+#define MX8MP_IOMUXC_SAI5_RXD2__AUDIOMIX_SAI5_RX_DATA02              0x13C 0x39C 0x500 0x0 0x0
+#define MX8MP_IOMUXC_SAI5_RXD2__AUDIOMIX_SAI1_TX_DATA04              0x13C 0x39C 0x000 0x1 0x0
+#define MX8MP_IOMUXC_SAI5_RXD2__AUDIOMIX_SAI1_TX_SYNC                0x13C 0x39C 0x4D8 0x2 0x1
+#define MX8MP_IOMUXC_SAI5_RXD2__AUDIOMIX_SAI5_TX_BCLK                0x13C 0x39C 0x50C 0x3 0x0
+#define MX8MP_IOMUXC_SAI5_RXD2__AUDIOMIX_BIT_STREAM02                0x13C 0x39C 0x4C8 0x4 0x2
+#define MX8MP_IOMUXC_SAI5_RXD2__GPIO3_IO23                           0x13C 0x39C 0x000 0x5 0x0
+#define MX8MP_IOMUXC_SAI5_RXD2__CAN1_RX                              0x13C 0x39C 0x54C 0x6 0x0
+#define MX8MP_IOMUXC_SAI5_RXD3__AUDIOMIX_SAI5_RX_DATA03              0x140 0x3A0 0x504 0x0 0x0
+#define MX8MP_IOMUXC_SAI5_RXD3__AUDIOMIX_SAI1_TX_DATA05              0x140 0x3A0 0x000 0x1 0x0
+#define MX8MP_IOMUXC_SAI5_RXD3__AUDIOMIX_SAI1_TX_SYNC                0x140 0x3A0 0x4D8 0x2 0x2
+#define MX8MP_IOMUXC_SAI5_RXD3__AUDIOMIX_SAI5_TX_DATA00              0x140 0x3A0 0x000 0x3 0x0
+#define MX8MP_IOMUXC_SAI5_RXD3__AUDIOMIX_BIT_STREAM03                0x140 0x3A0 0x4CC 0x4 0x2
+#define MX8MP_IOMUXC_SAI5_RXD3__GPIO3_IO24                           0x140 0x3A0 0x000 0x5 0x0
+#define MX8MP_IOMUXC_SAI5_RXD3__CAN2_TX                              0x140 0x3A0 0x000 0x6 0x0
+#define MX8MP_IOMUXC_SAI5_MCLK__AUDIOMIX_SAI5_MCLK                   0x144 0x3A4 0x4F0 0x0 0x0
+#define MX8MP_IOMUXC_SAI5_MCLK__AUDIOMIX_SAI1_TX_BCLK                0x144 0x3A4 0x4D4 0x1 0x0
+#define MX8MP_IOMUXC_SAI5_MCLK__PWM1_OUT                             0x144 0x3A4 0x000 0x2 0x0
+#define MX8MP_IOMUXC_SAI5_MCLK__I2C5_SDA                             0x144 0x3A4 0x5C8 0x3 0x1
+#define MX8MP_IOMUXC_SAI5_MCLK__GPIO3_IO25                           0x144 0x3A4 0x000 0x5 0x0
+#define MX8MP_IOMUXC_SAI5_MCLK__CAN2_RX                              0x144 0x3A4 0x550 0x6 0x0
+#define MX8MP_IOMUXC_SAI1_RXFS__AUDIOMIX_SAI1_RX_SYNC                0x148 0x3A8 0x4D0 0x0 0x0
+#define MX8MP_IOMUXC_SAI1_RXFS__AUDIOMIX_SAI5_RX_SYNC                0x148 0x3A8 0x508 0x1 0x1
+#define MX8MP_IOMUXC_SAI1_RXFS__ENET1_1588_EVENT0_IN                 0x148 0x3A8 0x000 0x4 0x0
+#define MX8MP_IOMUXC_SAI1_RXFS__GPIO4_IO00                           0x148 0x3A8 0x000 0x5 0x0
+#define MX8MP_IOMUXC_SAI1_RXC__AUDIOMIX_SAI1_RX_BCLK                 0x14C 0x3AC 0x000 0x0 0x0
+#define MX8MP_IOMUXC_SAI1_RXC__AUDIOMIX_SAI5_RX_BCLK                 0x14C 0x3AC 0x4F4 0x1 0x1
+#define MX8MP_IOMUXC_SAI1_RXC__AUDIOMIX_CLK                          0x14C 0x3AC 0x000 0x3 0x0
+#define MX8MP_IOMUXC_SAI1_RXC__ENET1_1588_EVENT0_OUT                 0x14C 0x3AC 0x000 0x4 0x0
+#define MX8MP_IOMUXC_SAI1_RXC__GPIO4_IO01                            0x14C 0x3AC 0x000 0x5 0x0
+#define MX8MP_IOMUXC_SAI1_RXD0__AUDIOMIX_SAI1_RX_DATA00              0x150 0x3B0 0x000 0x0 0x0
+#define MX8MP_IOMUXC_SAI1_RXD0__AUDIOMIX_SAI5_RX_DATA00              0x150 0x3B0 0x4F8 0x1 0x1
+#define MX8MP_IOMUXC_SAI1_RXD0__AUDIOMIX_SAI1_TX_DATA01              0x150 0x3B0 0x000 0x2 0x0
+#define MX8MP_IOMUXC_SAI1_RXD0__AUDIOMIX_BIT_STREAM00                0x150 0x3B0 0x4C0 0x3 0x3
+#define MX8MP_IOMUXC_SAI1_RXD0__ENET1_1588_EVENT1_IN                 0x150 0x3B0 0x000 0x4 0x0
+#define MX8MP_IOMUXC_SAI1_RXD0__GPIO4_IO02                           0x150 0x3B0 0x000 0x5 0x0
+#define MX8MP_IOMUXC_SAI1_RXD1__AUDIOMIX_SAI1_RX_DATA01              0x154 0x3B4 0x000 0x0 0x0
+#define MX8MP_IOMUXC_SAI1_RXD1__AUDIOMIX_SAI5_RX_DATA01              0x154 0x3B4 0x4FC 0x1 0x1
+#define MX8MP_IOMUXC_SAI1_RXD1__AUDIOMIX_BIT_STREAM01                0x154 0x3B4 0x4C4 0x3 0x3
+#define MX8MP_IOMUXC_SAI1_RXD1__ENET1_1588_EVENT1_OUT                0x154 0x3B4 0x000 0x4 0x0
+#define MX8MP_IOMUXC_SAI1_RXD1__GPIO4_IO03                           0x154 0x3B4 0x000 0x5 0x0
+#define MX8MP_IOMUXC_SAI1_RXD2__AUDIOMIX_SAI1_RX_DATA02              0x158 0x3B8 0x000 0x0 0x0
+#define MX8MP_IOMUXC_SAI1_RXD2__AUDIOMIX_SAI5_RX_DATA02              0x158 0x3B8 0x500 0x1 0x1
+#define MX8MP_IOMUXC_SAI1_RXD2__AUDIOMIX_BIT_STREAM02                0x158 0x3B8 0x4C8 0x3 0x3
+#define MX8MP_IOMUXC_SAI1_RXD2__ENET1_MDC                            0x158 0x3B8 0x000 0x4 0x0
+#define MX8MP_IOMUXC_SAI1_RXD2__GPIO4_IO04                           0x158 0x3B8 0x000 0x5 0x0
+#define MX8MP_IOMUXC_SAI1_RXD3__AUDIOMIX_SAI1_RX_DATA03              0x15C 0x3BC 0x000 0x0 0x0
+#define MX8MP_IOMUXC_SAI1_RXD3__AUDIOMIX_SAI5_RX_DATA03              0x15C 0x3BC 0x504 0x1 0x1
+#define MX8MP_IOMUXC_SAI1_RXD3__AUDIOMIX_BIT_STREAM03                0x15C 0x3BC 0x4CC 0x3 0x3
+#define MX8MP_IOMUXC_SAI1_RXD3__ENET1_MDIO                           0x15C 0x3BC 0x57C 0x4 0x1
+#define MX8MP_IOMUXC_SAI1_RXD3__GPIO4_IO05                           0x15C 0x3BC 0x000 0x5 0x0
+#define MX8MP_IOMUXC_SAI1_RXD4__AUDIOMIX_SAI1_RX_DATA04              0x160 0x3C0 0x000 0x0 0x0
+#define MX8MP_IOMUXC_SAI1_RXD4__AUDIOMIX_SAI6_TX_BCLK                0x160 0x3C0 0x524 0x1 0x1
+#define MX8MP_IOMUXC_SAI1_RXD4__AUDIOMIX_SAI6_RX_BCLK                0x160 0x3C0 0x518 0x2 0x1
+#define MX8MP_IOMUXC_SAI1_RXD4__ENET1_RGMII_RD0                      0x160 0x3C0 0x580 0x4 0x1
+#define MX8MP_IOMUXC_SAI1_RXD4__GPIO4_IO06                           0x160 0x3C0 0x000 0x5 0x0
+#define MX8MP_IOMUXC_SAI1_RXD5__AUDIOMIX_SAI1_RX_DATA05              0x164 0x3C4 0x000 0x0 0x0
+#define MX8MP_IOMUXC_SAI1_RXD5__AUDIOMIX_SAI6_TX_DATA00              0x164 0x3C4 0x000 0x1 0x0
+#define MX8MP_IOMUXC_SAI1_RXD5__AUDIOMIX_SAI6_RX_DATA00              0x164 0x3C4 0x51C 0x2 0x1
+#define MX8MP_IOMUXC_SAI1_RXD5__AUDIOMIX_SAI1_RX_SYNC                0x164 0x3C4 0x4D0 0x3 0x1
+#define MX8MP_IOMUXC_SAI1_RXD5__ENET1_RGMII_RD1                      0x164 0x3C4 0x584 0x4 0x1
+#define MX8MP_IOMUXC_SAI1_RXD5__GPIO4_IO07                           0x164 0x3C4 0x000 0x5 0x0
+#define MX8MP_IOMUXC_SAI1_RXD6__AUDIOMIX_SAI1_RX_DATA06              0x168 0x3C8 0x000 0x0 0x0
+#define MX8MP_IOMUXC_SAI1_RXD6__AUDIOMIX_SAI6_TX_SYNC                0x168 0x3C8 0x528 0x1 0x1
+#define MX8MP_IOMUXC_SAI1_RXD6__AUDIOMIX_SAI6_RX_SYNC                0x168 0x3C8 0x520 0x2 0x1
+#define MX8MP_IOMUXC_SAI1_RXD6__ENET1_RGMII_RD2                      0x168 0x3C8 0x000 0x4 0x0
+#define MX8MP_IOMUXC_SAI1_RXD6__GPIO4_IO08                           0x168 0x3C8 0x000 0x5 0x0
+#define MX8MP_IOMUXC_SAI1_RXD7__AUDIOMIX_SAI1_RX_DATA07              0x16C 0x3CC 0x000 0x0 0x0
+#define MX8MP_IOMUXC_SAI1_RXD7__AUDIOMIX_SAI6_MCLK                   0x16C 0x3CC 0x514 0x1 0x1
+#define MX8MP_IOMUXC_SAI1_RXD7__AUDIOMIX_SAI1_TX_SYNC                0x16C 0x3CC 0x4D8 0x2 0x3
+#define MX8MP_IOMUXC_SAI1_RXD7__AUDIOMIX_SAI1_TX_DATA04              0x16C 0x3CC 0x000 0x3 0x0
+#define MX8MP_IOMUXC_SAI1_RXD7__ENET1_RGMII_RD3                      0x16C 0x3CC 0x000 0x4 0x0
+#define MX8MP_IOMUXC_SAI1_RXD7__GPIO4_IO09                           0x16C 0x3CC 0x000 0x5 0x0
+#define MX8MP_IOMUXC_SAI1_TXFS__AUDIOMIX_SAI1_TX_SYNC                0x170 0x3D0 0x4D8 0x0 0x4
+#define MX8MP_IOMUXC_SAI1_TXFS__AUDIOMIX_SAI5_TX_SYNC                0x170 0x3D0 0x510 0x1 0x1
+#define MX8MP_IOMUXC_SAI1_TXFS__ENET1_RGMII_RX_CTL                   0x170 0x3D0 0x588 0x4 0x1
+#define MX8MP_IOMUXC_SAI1_TXFS__GPIO4_IO10                           0x170 0x3D0 0x000 0x5 0x0
+#define MX8MP_IOMUXC_SAI1_TXC__AUDIOMIX_SAI1_TX_BCLK                 0x174 0x3D4 0x4D4 0x0 0x1
+#define MX8MP_IOMUXC_SAI1_TXC__AUDIOMIX_SAI5_TX_BCLK                 0x174 0x3D4 0x50C 0x1 0x1
+#define MX8MP_IOMUXC_SAI1_TXC__ENET1_RGMII_RXC                       0x174 0x3D4 0x000 0x4 0x0
+#define MX8MP_IOMUXC_SAI1_TXC__GPIO4_IO11                            0x174 0x3D4 0x000 0x5 0x0
+#define MX8MP_IOMUXC_SAI1_TXD0__AUDIOMIX_SAI1_TX_DATA00              0x178 0x3D8 0x000 0x0 0x0
+#define MX8MP_IOMUXC_SAI1_TXD0__AUDIOMIX_SAI5_TX_DATA00              0x178 0x3D8 0x000 0x1 0x0
+#define MX8MP_IOMUXC_SAI1_TXD0__ENET1_RGMII_TD0                      0x178 0x3D8 0x000 0x4 0x0
+#define MX8MP_IOMUXC_SAI1_TXD0__GPIO4_IO12                           0x178 0x3D8 0x000 0x5 0x0
+#define MX8MP_IOMUXC_SAI1_TXD1__AUDIOMIX_SAI1_TX_DATA01              0x17C 0x3DC 0x000 0x0 0x0
+#define MX8MP_IOMUXC_SAI1_TXD1__AUDIOMIX_SAI5_TX_DATA01              0x17C 0x3DC 0x000 0x1 0x0
+#define MX8MP_IOMUXC_SAI1_TXD1__ENET1_RGMII_TD1                      0x17C 0x3DC 0x000 0x4 0x0
+#define MX8MP_IOMUXC_SAI1_TXD1__GPIO4_IO13                           0x17C 0x3DC 0x000 0x5 0x0
+#define MX8MP_IOMUXC_SAI1_TXD2__AUDIOMIX_SAI1_TX_DATA02              0x180 0x3E0 0x000 0x0 0x0
+#define MX8MP_IOMUXC_SAI1_TXD2__AUDIOMIX_SAI5_TX_DATA02              0x180 0x3E0 0x000 0x1 0x0
+#define MX8MP_IOMUXC_SAI1_TXD2__ENET1_RGMII_TD2                      0x180 0x3E0 0x000 0x4 0x0
+#define MX8MP_IOMUXC_SAI1_TXD2__GPIO4_IO14                           0x180 0x3E0 0x000 0x5 0x0
+#define MX8MP_IOMUXC_SAI1_TXD3__AUDIOMIX_SAI1_TX_DATA03              0x184 0x3E4 0x000 0x0 0x0
+#define MX8MP_IOMUXC_SAI1_TXD3__AUDIOMIX_SAI5_TX_DATA03              0x184 0x3E4 0x000 0x1 0x0
+#define MX8MP_IOMUXC_SAI1_TXD3__ENET1_RGMII_TD3                      0x184 0x3E4 0x000 0x4 0x0
+#define MX8MP_IOMUXC_SAI1_TXD3__GPIO4_IO15                           0x184 0x3E4 0x000 0x5 0x0
+#define MX8MP_IOMUXC_SAI1_TXD4__AUDIOMIX_SAI1_TX_DATA04              0x188 0x3E8 0x000 0x0 0x0
+#define MX8MP_IOMUXC_SAI1_TXD4__AUDIOMIX_SAI6_RX_BCLK                0x188 0x3E8 0x518 0x1 0x2
+#define MX8MP_IOMUXC_SAI1_TXD4__AUDIOMIX_SAI6_TX_BCLK                0x188 0x3E8 0x524 0x2 0x2
+#define MX8MP_IOMUXC_SAI1_TXD4__ENET1_RGMII_TX_CTL                   0x188 0x3E8 0x000 0x4 0x0
+#define MX8MP_IOMUXC_SAI1_TXD4__GPIO4_IO16                           0x188 0x3E8 0x000 0x5 0x0
+#define MX8MP_IOMUXC_SAI1_TXD5__AUDIOMIX_SAI1_TX_DATA05              0x18C 0x3EC 0x000 0x0 0x0
+#define MX8MP_IOMUXC_SAI1_TXD5__AUDIOMIX_SAI6_RX_DATA00              0x18C 0x3EC 0x51C 0x1 0x2
+#define MX8MP_IOMUXC_SAI1_TXD5__AUDIOMIX_SAI6_TX_DATA00              0x18C 0x3EC 0x000 0x2 0x0
+#define MX8MP_IOMUXC_SAI1_TXD5__ENET1_RGMII_TXC                      0x18C 0x3EC 0x000 0x4 0x0
+#define MX8MP_IOMUXC_SAI1_TXD5__GPIO4_IO17                           0x18C 0x3EC 0x000 0x5 0x0
+#define MX8MP_IOMUXC_SAI1_TXD6__AUDIOMIX_SAI1_TX_DATA06              0x190 0x3F0 0x000 0x0 0x0
+#define MX8MP_IOMUXC_SAI1_TXD6__AUDIOMIX_SAI6_RX_SYNC                0x190 0x3F0 0x520 0x1 0x2
+#define MX8MP_IOMUXC_SAI1_TXD6__AUDIOMIX_SAI6_TX_SYNC                0x190 0x3F0 0x528 0x2 0x2
+#define MX8MP_IOMUXC_SAI1_TXD6__ENET1_RX_ER                          0x190 0x3F0 0x58C 0x4 0x1
+#define MX8MP_IOMUXC_SAI1_TXD6__GPIO4_IO18                           0x190 0x3F0 0x000 0x5 0x0
+#define MX8MP_IOMUXC_SAI1_TXD7__AUDIOMIX_SAI1_TX_DATA07              0x194 0x3F4 0x000 0x0 0x0
+#define MX8MP_IOMUXC_SAI1_TXD7__AUDIOMIX_SAI6_MCLK                   0x194 0x3F4 0x514 0x1 0x2
+#define MX8MP_IOMUXC_SAI1_TXD7__AUDIOMIX_CLK                         0x194 0x3F4 0x000 0x3 0x0
+#define MX8MP_IOMUXC_SAI1_TXD7__ENET1_TX_ER                          0x194 0x3F4 0x000 0x4 0x0
+#define MX8MP_IOMUXC_SAI1_TXD7__GPIO4_IO19                           0x194 0x3F4 0x000 0x5 0x0
+#define MX8MP_IOMUXC_SAI1_MCLK__AUDIOMIX_SAI1_MCLK                   0x198 0x3F8 0x000 0x0 0x0
+#define MX8MP_IOMUXC_SAI1_MCLK__AUDIOMIX_SAI5_MCLK                   0x198 0x3F8 0x4F0 0x1 0x1
+#define MX8MP_IOMUXC_SAI1_MCLK__AUDIOMIX_SAI1_TX_BCLK                0x198 0x3F8 0x4D4 0x2 0x2
+#define MX8MP_IOMUXC_SAI1_MCLK__ENET1_TX_CLK                         0x198 0x3F8 0x578 0x4 0x1
+#define MX8MP_IOMUXC_SAI1_MCLK__GPIO4_IO20                           0x198 0x3F8 0x000 0x5 0x0
+#define MX8MP_IOMUXC_SAI2_RXFS__AUDIOMIX_SAI2_RX_SYNC                0x19C 0x3FC 0x000 0x0 0x0
+#define MX8MP_IOMUXC_SAI2_RXFS__AUDIOMIX_SAI5_TX_SYNC                0x19C 0x3FC 0x510 0x1 0x2
+#define MX8MP_IOMUXC_SAI2_RXFS__AUDIOMIX_SAI5_TX_DATA01              0x19C 0x3FC 0x000 0x2 0x0
+#define MX8MP_IOMUXC_SAI2_RXFS__AUDIOMIX_SAI2_RX_DATA01              0x19C 0x3FC 0x4DC 0x3 0x0
+#define MX8MP_IOMUXC_SAI2_RXFS__UART1_DCE_TX                         0x19C 0x3FC 0x000 0x4 0x0
+#define MX8MP_IOMUXC_SAI2_RXFS__UART1_DTE_RX                         0x19C 0x3FC 0x5E8 0x4 0x2
+#define MX8MP_IOMUXC_SAI2_RXFS__GPIO4_IO21                           0x19C 0x3FC 0x000 0x5 0x0
+#define MX8MP_IOMUXC_SAI2_RXFS__AUDIOMIX_BIT_STREAM02                0x19C 0x3FC 0x4C8 0x6 0x4
+#define MX8MP_IOMUXC_SAI2_RXFS__SIM_M_HSIZE00                        0x19C 0x3FC 0x000 0x7 0x0
+#define MX8MP_IOMUXC_SAI2_RXC__AUDIOMIX_SAI2_RX_BCLK                 0x1A0 0x400 0x000 0x0 0x0
+#define MX8MP_IOMUXC_SAI2_RXC__AUDIOMIX_SAI5_TX_BCLK                 0x1A0 0x400 0x50C 0x1 0x2
+#define MX8MP_IOMUXC_SAI2_RXC__CAN1_TX                               0x1A0 0x400 0x000 0x3 0x0
+#define MX8MP_IOMUXC_SAI2_RXC__UART1_DCE_RX                          0x1A0 0x400 0x5E8 0x4 0x3
+#define MX8MP_IOMUXC_SAI2_RXC__UART1_DTE_TX                          0x1A0 0x400 0x000 0x4 0x0
+#define MX8MP_IOMUXC_SAI2_RXC__GPIO4_IO22                            0x1A0 0x400 0x000 0x5 0x0
+#define MX8MP_IOMUXC_SAI2_RXC__AUDIOMIX_BIT_STREAM01                 0x1A0 0x400 0x4C4 0x6 0x4
+#define MX8MP_IOMUXC_SAI2_RXC__SIM_M_HSIZE01                         0x1A0 0x400 0x000 0x7 0x0
+#define MX8MP_IOMUXC_SAI2_RXD0__AUDIOMIX_SAI2_RX_DATA00              0x1A4 0x404 0x000 0x0 0x0
+#define MX8MP_IOMUXC_SAI2_RXD0__AUDIOMIX_SAI5_TX_DATA00              0x1A4 0x404 0x000 0x1 0x0
+#define MX8MP_IOMUXC_SAI2_RXD0__ENET_QOS_1588_EVENT2_OUT             0x1A4 0x404 0x000 0x2 0x0
+#define MX8MP_IOMUXC_SAI2_RXD0__AUDIOMIX_SAI2_TX_DATA01              0x1A4 0x404 0x000 0x3 0x0
+#define MX8MP_IOMUXC_SAI2_RXD0__UART1_DCE_RTS                        0x1A4 0x404 0x5E4 0x4 0x2
+#define MX8MP_IOMUXC_SAI2_RXD0__UART1_DTE_CTS                        0x1A4 0x404 0x000 0x4 0x0
+#define MX8MP_IOMUXC_SAI2_RXD0__GPIO4_IO23                           0x1A4 0x404 0x000 0x5 0x0
+#define MX8MP_IOMUXC_SAI2_RXD0__AUDIOMIX_BIT_STREAM03                0x1A4 0x404 0x4CC 0x6 0x4
+#define MX8MP_IOMUXC_SAI2_RXD0__SIM_M_HSIZE02                        0x1A4 0x404 0x000 0x7 0x0
+#define MX8MP_IOMUXC_SAI2_TXFS__AUDIOMIX_SAI2_TX_SYNC                0x1A8 0x408 0x000 0x0 0x0
+#define MX8MP_IOMUXC_SAI2_TXFS__AUDIOMIX_SAI5_TX_DATA01              0x1A8 0x408 0x000 0x1 0x0
+#define MX8MP_IOMUXC_SAI2_TXFS__ENET_QOS_1588_EVENT3_OUT             0x1A8 0x408 0x000 0x2 0x0
+#define MX8MP_IOMUXC_SAI2_TXFS__AUDIOMIX_SAI2_TX_DATA01              0x1A8 0x408 0x000 0x3 0x0
+#define MX8MP_IOMUXC_SAI2_TXFS__UART1_DCE_CTS                        0x1A8 0x408 0x000 0x4 0x0
+#define MX8MP_IOMUXC_SAI2_TXFS__UART1_DTE_RTS                        0x1A8 0x408 0x5E4 0x4 0x3
+#define MX8MP_IOMUXC_SAI2_TXFS__GPIO4_IO24                           0x1A8 0x408 0x000 0x5 0x0
+#define MX8MP_IOMUXC_SAI2_TXFS__AUDIOMIX_BIT_STREAM02                0x1A8 0x408 0x4C8 0x6 0x5
+#define MX8MP_IOMUXC_SAI2_TXFS__SIM_M_HWRITE                         0x1A8 0x408 0x000 0x7 0x0
+#define MX8MP_IOMUXC_SAI2_TXC__AUDIOMIX_SAI2_TX_BCLK                 0x1AC 0x40C 0x000 0x0 0x0
+#define MX8MP_IOMUXC_SAI2_TXC__AUDIOMIX_SAI5_TX_DATA02               0x1AC 0x40C 0x000 0x1 0x0
+#define MX8MP_IOMUXC_SAI2_TXC__CAN1_RX                               0x1AC 0x40C 0x54C 0x3 0x1
+#define MX8MP_IOMUXC_SAI2_TXC__GPIO4_IO25                            0x1AC 0x40C 0x000 0x5 0x0
+#define MX8MP_IOMUXC_SAI2_TXC__AUDIOMIX_BIT_STREAM01                 0x1AC 0x40C 0x4C4 0x6 0x5
+#define MX8MP_IOMUXC_SAI2_TXC__SIM_M_HREADYOUT                       0x1AC 0x40C 0x000 0x7 0x0
+#define MX8MP_IOMUXC_SAI2_TXD0__AUDIOMIX_SAI2_TX_DATA00              0x1B0 0x410 0x000 0x0 0x0
+#define MX8MP_IOMUXC_SAI2_TXD0__AUDIOMIX_SAI5_TX_DATA03              0x1B0 0x410 0x000 0x1 0x0
+#define MX8MP_IOMUXC_SAI2_TXD0__ENET_QOS_1588_EVENT2_IN              0x1B0 0x410 0x000 0x2 0x0
+#define MX8MP_IOMUXC_SAI2_TXD0__CAN2_TX                              0x1B0 0x410 0x000 0x3 0x0
+#define MX8MP_IOMUXC_SAI2_TXD0__ENET_QOS_1588_EVENT2_AUX_IN          0x1B0 0x410 0x000 0x4 0x0
+#define MX8MP_IOMUXC_SAI2_TXD0__GPIO4_IO26                           0x1B0 0x410 0x000 0x5 0x0
+#define MX8MP_IOMUXC_SAI2_TXD0__CCMSRCGPCMIX_BOOT_MODE04             0x1B0 0x410 0x000 0x6 0x0
+#define MX8MP_IOMUXC_SAI2_TXD0__TPSMP_CLK                            0x1B0 0x410 0x000 0x7 0x0
+#define MX8MP_IOMUXC_SAI2_MCLK__AUDIOMIX_SAI2_MCLK                   0x1B4 0x414 0x000 0x0 0x0
+#define MX8MP_IOMUXC_SAI2_MCLK__AUDIOMIX_SAI5_MCLK                   0x1B4 0x414 0x4F0 0x1 0x2
+#define MX8MP_IOMUXC_SAI2_MCLK__ENET_QOS_1588_EVENT3_IN              0x1B4 0x414 0x000 0x2 0x0
+#define MX8MP_IOMUXC_SAI2_MCLK__CAN2_RX                              0x1B4 0x414 0x550 0x3 0x1
+#define MX8MP_IOMUXC_SAI2_MCLK__ENET_QOS_1588_EVENT3_AUX_IN          0x1B4 0x414 0x000 0x4 0x0
+#define MX8MP_IOMUXC_SAI2_MCLK__GPIO4_IO27                           0x1B4 0x414 0x000 0x5 0x0
+#define MX8MP_IOMUXC_SAI2_MCLK__AUDIOMIX_SAI3_MCLK                   0x1B4 0x414 0x4E0 0x6 0x1
+#define MX8MP_IOMUXC_SAI2_MCLK__TPSMP_HDATA_DIR                      0x1B4 0x414 0x000 0x7 0x0
+#define MX8MP_IOMUXC_SAI3_RXFS__AUDIOMIX_SAI3_RX_SYNC                0x1B8 0x418 0x000 0x0 0x0
+#define MX8MP_IOMUXC_SAI3_RXFS__AUDIOMIX_SAI2_RX_DATA01              0x1B8 0x418 0x4DC 0x1 0x1
+#define MX8MP_IOMUXC_SAI3_RXFS__AUDIOMIX_SAI5_RX_SYNC                0x1B8 0x418 0x508 0x2 0x2
+#define MX8MP_IOMUXC_SAI3_RXFS__AUDIOMIX_SAI3_RX_DATA01              0x1B8 0x418 0x000 0x3 0x0
+#define MX8MP_IOMUXC_SAI3_RXFS__AUDIOMIX_SPDIF_IN                    0x1B8 0x418 0x544 0x4 0x2
+#define MX8MP_IOMUXC_SAI3_RXFS__GPIO4_IO28                           0x1B8 0x418 0x000 0x5 0x0
+#define MX8MP_IOMUXC_SAI3_RXFS__AUDIOMIX_BIT_STREAM00                0x1B8 0x418 0x4C0 0x6 0x4
+#define MX8MP_IOMUXC_SAI3_RXFS__TPSMP_HTRANS00                       0x1B8 0x418 0x000 0x7 0x0
+#define MX8MP_IOMUXC_SAI3_RXC__AUDIOMIX_SAI3_RX_BCLK                 0x1BC 0x41C 0x000 0x0 0x0
+#define MX8MP_IOMUXC_SAI3_RXC__AUDIOMIX_SAI2_RX_DATA02               0x1BC 0x41C 0x000 0x1 0x0
+#define MX8MP_IOMUXC_SAI3_RXC__AUDIOMIX_SAI5_RX_BCLK                 0x1BC 0x41C 0x4F4 0x2 0x2
+#define MX8MP_IOMUXC_SAI3_RXC__GPT1_CLK                              0x1BC 0x41C 0x59C 0x3 0x0
+#define MX8MP_IOMUXC_SAI3_RXC__UART2_DCE_CTS                         0x1BC 0x41C 0x000 0x4 0x0
+#define MX8MP_IOMUXC_SAI3_RXC__UART2_DTE_RTS                         0x1BC 0x41C 0x5EC 0x4 0x2
+#define MX8MP_IOMUXC_SAI3_RXC__GPIO4_IO29                            0x1BC 0x41C 0x000 0x5 0x0
+#define MX8MP_IOMUXC_SAI3_RXC__AUDIOMIX_CLK                          0x1BC 0x41C 0x000 0x6 0x0
+#define MX8MP_IOMUXC_SAI3_RXC__TPSMP_HTRANS01                        0x1BC 0x41C 0x000 0x7 0x0
+#define MX8MP_IOMUXC_SAI3_RXD__AUDIOMIX_SAI3_RX_DATA00               0x1C0 0x420 0x4E4 0x0 0x1
+#define MX8MP_IOMUXC_SAI3_RXD__AUDIOMIX_SAI2_RX_DATA03               0x1C0 0x420 0x000 0x1 0x0
+#define MX8MP_IOMUXC_SAI3_RXD__AUDIOMIX_SAI5_RX_DATA00               0x1C0 0x420 0x4F8 0x2 0x2
+#define MX8MP_IOMUXC_SAI3_RXD__UART2_DCE_RTS                         0x1C0 0x420 0x5EC 0x4 0x3
+#define MX8MP_IOMUXC_SAI3_RXD__UART2_DTE_CTS                         0x1C0 0x420 0x000 0x4 0x0
+#define MX8MP_IOMUXC_SAI3_RXD__GPIO4_IO30                            0x1C0 0x420 0x000 0x5 0x0
+#define MX8MP_IOMUXC_SAI3_RXD__AUDIOMIX_BIT_STREAM01                 0x1C0 0x420 0x4C4 0x6 0x6
+#define MX8MP_IOMUXC_SAI3_RXD__TPSMP_HDATA00                         0x1C0 0x420 0x000 0x7 0x0
+#define MX8MP_IOMUXC_SAI3_TXFS__AUDIOMIX_SAI3_TX_SYNC                0x1C4 0x424 0x4EC 0x0 0x1
+#define MX8MP_IOMUXC_SAI3_TXFS__AUDIOMIX_SAI2_TX_DATA01              0x1C4 0x424 0x000 0x1 0x0
+#define MX8MP_IOMUXC_SAI3_TXFS__AUDIOMIX_SAI5_RX_DATA01              0x1C4 0x424 0x4FC 0x2 0x2
+#define MX8MP_IOMUXC_SAI3_TXFS__AUDIOMIX_SAI3_TX_DATA01              0x1C4 0x424 0x000 0x3 0x0
+#define MX8MP_IOMUXC_SAI3_TXFS__UART2_DCE_RX                         0x1C4 0x424 0x5F0 0x4 0x4
+#define MX8MP_IOMUXC_SAI3_TXFS__UART2_DTE_TX                         0x1C4 0x424 0x000 0x4 0x0
+#define MX8MP_IOMUXC_SAI3_TXFS__GPIO4_IO31                           0x1C4 0x424 0x000 0x5 0x0
+#define MX8MP_IOMUXC_SAI3_TXFS__AUDIOMIX_BIT_STREAM03                0x1C4 0x424 0x4CC 0x6 0x5
+#define MX8MP_IOMUXC_SAI3_TXFS__TPSMP_HDATA01                        0x1C4 0x424 0x000 0x7 0x0
+#define MX8MP_IOMUXC_SAI3_TXC__AUDIOMIX_SAI3_TX_BCLK                 0x1C8 0x428 0x4E8 0x0 0x1
+#define MX8MP_IOMUXC_SAI3_TXC__AUDIOMIX_SAI2_TX_DATA02               0x1C8 0x428 0x000 0x1 0x0
+#define MX8MP_IOMUXC_SAI3_TXC__AUDIOMIX_SAI5_RX_DATA02               0x1C8 0x428 0x500 0x2 0x2
+#define MX8MP_IOMUXC_SAI3_TXC__GPT1_CAPTURE1                         0x1C8 0x428 0x594 0x3 0x0
+#define MX8MP_IOMUXC_SAI3_TXC__UART2_DCE_TX                          0x1C8 0x428 0x000 0x4 0x0
+#define MX8MP_IOMUXC_SAI3_TXC__UART2_DTE_RX                          0x1C8 0x428 0x5F0 0x4 0x5
+#define MX8MP_IOMUXC_SAI3_TXC__GPIO5_IO00                            0x1C8 0x428 0x000 0x5 0x0
+#define MX8MP_IOMUXC_SAI3_TXC__AUDIOMIX_BIT_STREAM02                 0x1C8 0x428 0x4C8 0x6 0x6
+#define MX8MP_IOMUXC_SAI3_TXC__TPSMP_HDATA02                         0x1C8 0x428 0x000 0x7 0x0
+#define MX8MP_IOMUXC_SAI3_TXD__AUDIOMIX_SAI3_TX_DATA00               0x1CC 0x42C 0x000 0x0 0x0
+#define MX8MP_IOMUXC_SAI3_TXD__AUDIOMIX_SAI2_TX_DATA03               0x1CC 0x42C 0x000 0x1 0x0
+#define MX8MP_IOMUXC_SAI3_TXD__AUDIOMIX_SAI5_RX_DATA03               0x1CC 0x42C 0x504 0x2 0x2
+#define MX8MP_IOMUXC_SAI3_TXD__GPT1_CAPTURE2                         0x1CC 0x42C 0x598 0x3 0x0
+#define MX8MP_IOMUXC_SAI3_TXD__AUDIOMIX_SPDIF_EXT_CLK                0x1CC 0x42C 0x548 0x4 0x0
+#define MX8MP_IOMUXC_SAI3_TXD__GPIO5_IO01                            0x1CC 0x42C 0x000 0x5 0x0
+#define MX8MP_IOMUXC_SAI3_TXD__CCMSRCGPCMIX_BOOT_MODE05              0x1CC 0x42C 0x000 0x6 0x0
+#define MX8MP_IOMUXC_SAI3_TXD__TPSMP_HDATA03                         0x1CC 0x42C 0x000 0x7 0x0
+#define MX8MP_IOMUXC_SAI3_MCLK__AUDIOMIX_SAI3_MCLK                   0x1D0 0x430 0x4E0 0x0 0x2
+#define MX8MP_IOMUXC_SAI3_MCLK__PWM4_OUT                             0x1D0 0x430 0x000 0x1 0x0
+#define MX8MP_IOMUXC_SAI3_MCLK__AUDIOMIX_SAI5_MCLK                   0x1D0 0x430 0x4F0 0x2 0x3
+#define MX8MP_IOMUXC_SAI3_MCLK__AUDIOMIX_SPDIF_OUT                   0x1D0 0x430 0x000 0x4 0x0
+#define MX8MP_IOMUXC_SAI3_MCLK__GPIO5_IO02                           0x1D0 0x430 0x000 0x5 0x0
+#define MX8MP_IOMUXC_SAI3_MCLK__AUDIOMIX_SPDIF_IN                    0x1D0 0x430 0x544 0x6 0x3
+#define MX8MP_IOMUXC_SAI3_MCLK__TPSMP_HDATA04                        0x1D0 0x430 0x000 0x7 0x0
+#define MX8MP_IOMUXC_SPDIF_TX__AUDIOMIX_SPDIF_OUT                    0x1D4 0x434 0x000 0x0 0x0
+#define MX8MP_IOMUXC_SPDIF_TX__PWM3_OUT                              0x1D4 0x434 0x000 0x1 0x0
+#define MX8MP_IOMUXC_SPDIF_TX__I2C5_SCL                              0x1D4 0x434 0x5C4 0x2 0x2
+#define MX8MP_IOMUXC_SPDIF_TX__GPT1_COMPARE1                         0x1D4 0x434 0x000 0x3 0x0
+#define MX8MP_IOMUXC_SPDIF_TX__CAN1_TX                               0x1D4 0x434 0x000 0x4 0x0
+#define MX8MP_IOMUXC_SPDIF_TX__GPIO5_IO03                            0x1D4 0x434 0x000 0x5 0x0
+#define MX8MP_IOMUXC_SPDIF_RX__AUDIOMIX_SPDIF_IN                     0x1D8 0x438 0x544 0x0 0x4
+#define MX8MP_IOMUXC_SPDIF_RX__PWM2_OUT                              0x1D8 0x438 0x000 0x1 0x0
+#define MX8MP_IOMUXC_SPDIF_RX__I2C5_SDA                              0x1D8 0x438 0x5C8 0x2 0x2
+#define MX8MP_IOMUXC_SPDIF_RX__GPT1_COMPARE2                         0x1D8 0x438 0x000 0x3 0x0
+#define MX8MP_IOMUXC_SPDIF_RX__CAN1_RX                               0x1D8 0x438 0x54C 0x4 0x2
+#define MX8MP_IOMUXC_SPDIF_RX__GPIO5_IO04                            0x1D8 0x438 0x000 0x5 0x0
+#define MX8MP_IOMUXC_SPDIF_EXT_CLK__GPT1_COMPARE3                    0x1DC 0x43C 0x000 0x3 0x0
+#define MX8MP_IOMUXC_SPDIF_EXT_CLK__GPIO5_IO05                       0x1DC 0x43C 0x000 0x5 0x0
+#define MX8MP_IOMUXC_SPDIF_EXT_CLK__AUDIOMIX_SPDIF_EXT_CLK           0x1DC 0x43C 0x548 0x0 0x1
+#define MX8MP_IOMUXC_SPDIF_EXT_CLK__PWM1_OUT                         0x1DC 0x43C 0x000 0x1 0x0
+#define MX8MP_IOMUXC_ECSPI1_SCLK__ECSPI1_SCLK                        0x1E0 0x440 0x558 0x0 0x0
+#define MX8MP_IOMUXC_ECSPI1_SCLK__UART3_DCE_RX                       0x1E0 0x440 0x5F8 0x1 0x4
+#define MX8MP_IOMUXC_ECSPI1_SCLK__UART3_DTE_TX                       0x1E0 0x440 0x000 0x1 0x0
+#define MX8MP_IOMUXC_ECSPI1_SCLK__I2C1_SCL                           0x1E0 0x440 0x5A4 0x2 0x1
+#define MX8MP_IOMUXC_ECSPI1_SCLK__AUDIOMIX_SAI7_RX_SYNC              0x1E0 0x440 0x538 0x3 0x1
+#define MX8MP_IOMUXC_ECSPI1_SCLK__GPIO5_IO06                         0x1E0 0x440 0x000 0x5 0x0
+#define MX8MP_IOMUXC_ECSPI1_SCLK__TPSMP_HDATA08                      0x1E0 0x440 0x000 0x7 0x0
+#define MX8MP_IOMUXC_ECSPI1_MOSI__ECSPI1_MOSI                        0x1E4 0x444 0x560 0x0 0x0
+#define MX8MP_IOMUXC_ECSPI1_MOSI__UART3_DCE_TX                       0x1E4 0x444 0x000 0x1 0x0
+#define MX8MP_IOMUXC_ECSPI1_MOSI__UART3_DTE_RX                       0x1E4 0x444 0x5F8 0x1 0x5
+#define MX8MP_IOMUXC_ECSPI1_MOSI__I2C1_SDA                           0x1E4 0x444 0x5A8 0x2 0x1
+#define MX8MP_IOMUXC_ECSPI1_MOSI__AUDIOMIX_SAI7_RX_BCLK              0x1E4 0x444 0x530 0x3 0x1
+#define MX8MP_IOMUXC_ECSPI1_MOSI__GPIO5_IO07                         0x1E4 0x444 0x000 0x5 0x0
+#define MX8MP_IOMUXC_ECSPI1_MOSI__TPSMP_HDATA09                      0x1E4 0x444 0x000 0x7 0x0
+#define MX8MP_IOMUXC_ECSPI1_MISO__ECSPI1_MISO                        0x1E8 0x448 0x55C 0x0 0x0
+#define MX8MP_IOMUXC_ECSPI1_MISO__UART3_DCE_CTS                      0x1E8 0x448 0x000 0x1 0x0
+#define MX8MP_IOMUXC_ECSPI1_MISO__UART3_DTE_RTS                      0x1E8 0x448 0x5F4 0x1 0x2
+#define MX8MP_IOMUXC_ECSPI1_MISO__I2C2_SCL                           0x1E8 0x448 0x5AC 0x2 0x1
+#define MX8MP_IOMUXC_ECSPI1_MISO__AUDIOMIX_SAI7_RX_DATA00            0x1E8 0x448 0x534 0x3 0x1
+#define MX8MP_IOMUXC_ECSPI1_MISO__GPIO5_IO08                         0x1E8 0x448 0x000 0x5 0x0
+#define MX8MP_IOMUXC_ECSPI1_MISO__TPSMP_HDATA10                      0x1E8 0x448 0x000 0x7 0x0
+#define MX8MP_IOMUXC_ECSPI1_SS0__ECSPI1_SS0                          0x1EC 0x44C 0x564 0x0 0x0
+#define MX8MP_IOMUXC_ECSPI1_SS0__UART3_DCE_RTS                       0x1EC 0x44C 0x5F4 0x1 0x3
+#define MX8MP_IOMUXC_ECSPI1_SS0__UART3_DTE_CTS                       0x1EC 0x44C 0x000 0x1 0x0
+#define MX8MP_IOMUXC_ECSPI1_SS0__I2C2_SDA                            0x1EC 0x44C 0x5B0 0x2 0x1
+#define MX8MP_IOMUXC_ECSPI1_SS0__AUDIOMIX_SAI7_TX_SYNC               0x1EC 0x44C 0x540 0x3 0x1
+#define MX8MP_IOMUXC_ECSPI1_SS0__GPIO5_IO09                          0x1EC 0x44C 0x000 0x5 0x0
+#define MX8MP_IOMUXC_ECSPI1_SS0__TPSMP_HDATA11                       0x1EC 0x44C 0x000 0x7 0x0
+#define MX8MP_IOMUXC_ECSPI2_SCLK__ECSPI2_SCLK                        0x1F0 0x450 0x568 0x0 0x1
+#define MX8MP_IOMUXC_ECSPI2_SCLK__UART4_DCE_RX                       0x1F0 0x450 0x600 0x1 0x6
+#define MX8MP_IOMUXC_ECSPI2_SCLK__UART4_DTE_TX                       0x1F0 0x450 0x000 0x1 0x0
+#define MX8MP_IOMUXC_ECSPI2_SCLK__I2C3_SCL                           0x1F0 0x450 0x5B4 0x2 0x3
+#define MX8MP_IOMUXC_ECSPI2_SCLK__AUDIOMIX_SAI7_TX_BCLK              0x1F0 0x450 0x53C 0x3 0x1
+#define MX8MP_IOMUXC_ECSPI2_SCLK__GPIO5_IO10                         0x1F0 0x450 0x000 0x5 0x0
+#define MX8MP_IOMUXC_ECSPI2_SCLK__TPSMP_HDATA12                      0x1F0 0x450 0x000 0x7 0x0
+#define MX8MP_IOMUXC_ECSPI2_MOSI__ECSPI2_MOSI                        0x1F4 0x454 0x570 0x0 0x1
+#define MX8MP_IOMUXC_ECSPI2_MOSI__UART4_DCE_TX                       0x1F4 0x454 0x000 0x1 0x0
+#define MX8MP_IOMUXC_ECSPI2_MOSI__UART4_DTE_RX                       0x1F4 0x454 0x600 0x1 0x7
+#define MX8MP_IOMUXC_ECSPI2_MOSI__I2C3_SDA                           0x1F4 0x454 0x5B8 0x2 0x3
+#define MX8MP_IOMUXC_ECSPI2_MOSI__AUDIOMIX_SAI7_TX_DATA00            0x1F4 0x454 0x000 0x3 0x0
+#define MX8MP_IOMUXC_ECSPI2_MOSI__GPIO5_IO11                         0x1F4 0x454 0x000 0x5 0x0
+#define MX8MP_IOMUXC_ECSPI2_MOSI__TPSMP_HDATA13                      0x1F4 0x454 0x000 0x7 0x0
+#define MX8MP_IOMUXC_ECSPI2_MISO__GPIO5_IO12                         0x1F8 0x458 0x000 0x5 0x0
+#define MX8MP_IOMUXC_ECSPI2_MISO__TPSMP_HDATA14                      0x1F8 0x458 0x000 0x7 0x0
+#define MX8MP_IOMUXC_ECSPI2_MISO__ECSPI2_MISO                        0x1F8 0x458 0x56C 0x0 0x1
+#define MX8MP_IOMUXC_ECSPI2_MISO__UART4_DCE_CTS                      0x1F8 0x458 0x000 0x1 0x0
+#define MX8MP_IOMUXC_ECSPI2_MISO__UART4_DTE_RTS                      0x1F8 0x458 0x5FC 0x1 0x2
+#define MX8MP_IOMUXC_ECSPI2_MISO__I2C4_SCL                           0x1F8 0x458 0x5BC 0x2 0x4
+#define MX8MP_IOMUXC_ECSPI2_MISO__AUDIOMIX_SAI7_MCLK                 0x1F8 0x458 0x52C 0x3 0x1
+#define MX8MP_IOMUXC_ECSPI2_MISO__CCMSRCGPCMIX_CLKO1                 0x1F8 0x458 0x000 0x4 0x0
+#define MX8MP_IOMUXC_ECSPI2_SS0__ECSPI2_SS0                          0x1FC 0x45C 0x574 0x0 0x1
+#define MX8MP_IOMUXC_ECSPI2_SS0__UART4_DCE_RTS                       0x1FC 0x45C 0x5FC 0x1 0x3
+#define MX8MP_IOMUXC_ECSPI2_SS0__UART4_DTE_CTS                       0x1FC 0x45C 0x000 0x1 0x0
+#define MX8MP_IOMUXC_ECSPI2_SS0__I2C4_SDA                            0x1FC 0x45C 0x5C0 0x2 0x4
+#define MX8MP_IOMUXC_ECSPI2_SS0__CCMSRCGPCMIX_CLKO2                  0x1FC 0x45C 0x000 0x4 0x0
+#define MX8MP_IOMUXC_ECSPI2_SS0__GPIO5_IO13                          0x1FC 0x45C 0x000 0x5 0x0
+#define MX8MP_IOMUXC_ECSPI2_SS0__TPSMP_HDATA15                       0x1FC 0x45C 0x000 0x7 0x0
+#define MX8MP_IOMUXC_I2C1_SCL__I2C1_SCL                              0x200 0x460 0x5A4 0x0 0x2
+#define MX8MP_IOMUXC_I2C1_SCL__ENET_QOS_MDC                          0x200 0x460 0x000 0x1 0x0
+#define MX8MP_IOMUXC_I2C1_SCL__ECSPI1_SCLK                           0x200 0x460 0x558 0x3 0x1
+#define MX8MP_IOMUXC_I2C1_SCL__GPIO5_IO14                            0x200 0x460 0x000 0x5 0x0
+#define MX8MP_IOMUXC_I2C1_SCL__TPSMP_HDATA16                         0x200 0x460 0x000 0x7 0x0
+#define MX8MP_IOMUXC_I2C1_SDA__I2C1_SDA                              0x204 0x464 0x5A8 0x0 0x2
+#define MX8MP_IOMUXC_I2C1_SDA__ENET_QOS_MDIO                         0x204 0x464 0x590 0x1 0x2
+#define MX8MP_IOMUXC_I2C1_SDA__ECSPI1_MOSI                           0x204 0x464 0x560 0x3 0x1
+#define MX8MP_IOMUXC_I2C1_SDA__GPIO5_IO15                            0x204 0x464 0x000 0x5 0x0
+#define MX8MP_IOMUXC_I2C1_SDA__TPSMP_HDATA17                         0x204 0x464 0x000 0x7 0x0
+#define MX8MP_IOMUXC_I2C2_SCL__I2C2_SCL                              0x208 0x468 0x5AC 0x0 0x2
+#define MX8MP_IOMUXC_I2C2_SCL__ENET_QOS_1588_EVENT1_IN               0x208 0x468 0x000 0x1 0x0
+#define MX8MP_IOMUXC_I2C2_SCL__USDHC3_CD_B                           0x208 0x468 0x608 0x2 0x3
+#define MX8MP_IOMUXC_I2C2_SCL__ECSPI1_MISO                           0x208 0x468 0x55C 0x3 0x1
+#define MX8MP_IOMUXC_I2C2_SCL__ENET_QOS_1588_EVENT1_AUX_IN           0x208 0x468 0x000 0x4 0x0
+#define MX8MP_IOMUXC_I2C2_SCL__GPIO5_IO16                            0x208 0x468 0x000 0x5 0x0
+#define MX8MP_IOMUXC_I2C2_SCL__TPSMP_HDATA18                         0x208 0x468 0x000 0x7 0x0
+#define MX8MP_IOMUXC_I2C2_SDA__I2C2_SDA                              0x20C 0x46C 0x5B0 0x0 0x2
+#define MX8MP_IOMUXC_I2C2_SDA__ENET_QOS_1588_EVENT1_OUT              0x20C 0x46C 0x000 0x1 0x0
+#define MX8MP_IOMUXC_I2C2_SDA__USDHC3_WP                             0x20C 0x46C 0x634 0x2 0x3
+#define MX8MP_IOMUXC_I2C2_SDA__ECSPI1_SS0                            0x20C 0x46C 0x564 0x3 0x1
+#define MX8MP_IOMUXC_I2C2_SDA__GPIO5_IO17                            0x20C 0x46C 0x000 0x5 0x0
+#define MX8MP_IOMUXC_I2C2_SDA__TPSMP_HDATA19                         0x20C 0x46C 0x000 0x7 0x0
+#define MX8MP_IOMUXC_I2C3_SCL__I2C3_SCL                              0x210 0x470 0x5B4 0x0 0x4
+#define MX8MP_IOMUXC_I2C3_SCL__PWM4_OUT                              0x210 0x470 0x000 0x1 0x0
+#define MX8MP_IOMUXC_I2C3_SCL__GPT2_CLK                              0x210 0x470 0x000 0x2 0x0
+#define MX8MP_IOMUXC_I2C3_SCL__ECSPI2_SCLK                           0x210 0x470 0x568 0x3 0x2
+#define MX8MP_IOMUXC_I2C3_SCL__GPIO5_IO18                            0x210 0x470 0x000 0x5 0x0
+#define MX8MP_IOMUXC_I2C3_SCL__TPSMP_HDATA20                         0x210 0x470 0x000 0x7 0x0
+#define MX8MP_IOMUXC_I2C3_SDA__I2C3_SDA                              0x214 0x474 0x5B8 0x0 0x4
+#define MX8MP_IOMUXC_I2C3_SDA__PWM3_OUT                              0x214 0x474 0x000 0x1 0x0
+#define MX8MP_IOMUXC_I2C3_SDA__GPT3_CLK                              0x214 0x474 0x000 0x2 0x0
+#define MX8MP_IOMUXC_I2C3_SDA__ECSPI2_MOSI                           0x214 0x474 0x570 0x3 0x2
+#define MX8MP_IOMUXC_I2C3_SDA__GPIO5_IO19                            0x214 0x474 0x000 0x5 0x0
+#define MX8MP_IOMUXC_I2C3_SDA__TPSMP_HDATA21                         0x214 0x474 0x000 0x7 0x0
+#define MX8MP_IOMUXC_I2C4_SCL__I2C4_SCL                              0x218 0x478 0x5BC 0x0 0x5
+#define MX8MP_IOMUXC_I2C4_SCL__PWM2_OUT                              0x218 0x478 0x000 0x1 0x0
+#define MX8MP_IOMUXC_I2C4_SCL__HSIOMIX_PCIE_CLKREQ_B                 0x218 0x478 0x5A0 0x2 0x0
+#define MX8MP_IOMUXC_I2C4_SCL__ECSPI2_MISO                           0x218 0x478 0x56C 0x3 0x2
+#define MX8MP_IOMUXC_I2C4_SCL__GPIO5_IO20                            0x218 0x478 0x000 0x5 0x0
+#define MX8MP_IOMUXC_I2C4_SCL__TPSMP_HDATA22                         0x218 0x478 0x000 0x7 0x0
+#define MX8MP_IOMUXC_I2C4_SDA__I2C4_SDA                              0x21C 0x47C 0x5C0 0x0 0x5
+#define MX8MP_IOMUXC_I2C4_SDA__PWM1_OUT                              0x21C 0x47C 0x000 0x1 0x0
+#define MX8MP_IOMUXC_I2C4_SDA__ECSPI2_SS0                            0x21C 0x47C 0x574 0x3 0x2
+#define MX8MP_IOMUXC_I2C4_SDA__GPIO5_IO21                            0x21C 0x47C 0x000 0x5 0x0
+#define MX8MP_IOMUXC_I2C4_SDA__TPSMP_HDATA23                         0x21C 0x47C 0x000 0x7 0x0
+#define MX8MP_IOMUXC_UART1_RXD__UART1_DCE_RX                         0x220 0x480 0x5E8 0x0 0x4
+#define MX8MP_IOMUXC_UART1_RXD__UART1_DTE_TX                         0x220 0x480 0x000 0x0 0x0
+#define MX8MP_IOMUXC_UART1_RXD__ECSPI3_SCLK                          0x220 0x480 0x000 0x1 0x0
+#define MX8MP_IOMUXC_UART1_RXD__GPIO5_IO22                           0x220 0x480 0x000 0x5 0x0
+#define MX8MP_IOMUXC_UART1_RXD__TPSMP_HDATA24                        0x220 0x480 0x000 0x7 0x0
+#define MX8MP_IOMUXC_UART1_TXD__UART1_DCE_TX                         0x224 0x484 0x000 0x0 0x0
+#define MX8MP_IOMUXC_UART1_TXD__UART1_DTE_RX                         0x224 0x484 0x5E8 0x0 0x5
+#define MX8MP_IOMUXC_UART1_TXD__ECSPI3_MOSI                          0x224 0x484 0x000 0x1 0x0
+#define MX8MP_IOMUXC_UART1_TXD__GPIO5_IO23                           0x224 0x484 0x000 0x5 0x0
+#define MX8MP_IOMUXC_UART1_TXD__TPSMP_HDATA25                        0x224 0x484 0x000 0x7 0x0
+#define MX8MP_IOMUXC_UART2_RXD__UART2_DCE_RX                         0x228 0x488 0x5F0 0x0 0x6
+#define MX8MP_IOMUXC_UART2_RXD__UART2_DTE_TX                         0x228 0x488 0x000 0x0 0x0
+#define MX8MP_IOMUXC_UART2_RXD__ECSPI3_MISO                          0x228 0x488 0x000 0x1 0x0
+#define MX8MP_IOMUXC_UART2_RXD__GPT1_COMPARE3                        0x228 0x488 0x000 0x3 0x0
+#define MX8MP_IOMUXC_UART2_RXD__GPIO5_IO24                           0x228 0x488 0x000 0x5 0x0
+#define MX8MP_IOMUXC_UART2_RXD__TPSMP_HDATA26                        0x228 0x488 0x000 0x7 0x0
+#define MX8MP_IOMUXC_UART2_TXD__UART2_DCE_TX                         0x22C 0x48C 0x000 0x0 0x0
+#define MX8MP_IOMUXC_UART2_TXD__UART2_DTE_RX                         0x22C 0x48C 0x5F0 0x0 0x7
+#define MX8MP_IOMUXC_UART2_TXD__ECSPI3_SS0                           0x22C 0x48C 0x000 0x1 0x0
+#define MX8MP_IOMUXC_UART2_TXD__GPT1_COMPARE2                        0x22C 0x48C 0x000 0x3 0x0
+#define MX8MP_IOMUXC_UART2_TXD__GPIO5_IO25                           0x22C 0x48C 0x000 0x5 0x0
+#define MX8MP_IOMUXC_UART2_TXD__TPSMP_HDATA27                        0x22C 0x48C 0x000 0x7 0x0
+#define MX8MP_IOMUXC_UART3_RXD__UART3_DCE_RX                         0x230 0x490 0x5F8 0x0 0x6
+#define MX8MP_IOMUXC_UART3_RXD__UART3_DTE_TX                         0x230 0x490 0x000 0x0 0x0
+#define MX8MP_IOMUXC_UART3_RXD__UART1_DCE_CTS                        0x230 0x490 0x000 0x1 0x0
+#define MX8MP_IOMUXC_UART3_RXD__UART1_DTE_RTS                        0x230 0x490 0x5E4 0x1 0x4
+#define MX8MP_IOMUXC_UART3_RXD__USDHC3_RESET_B                       0x230 0x490 0x000 0x2 0x0
+#define MX8MP_IOMUXC_UART3_RXD__GPT1_CAPTURE2                        0x230 0x490 0x598 0x3 0x1
+#define MX8MP_IOMUXC_UART3_RXD__CAN2_TX                              0x230 0x490 0x000 0x4 0x0
+#define MX8MP_IOMUXC_UART3_RXD__GPIO5_IO26                           0x230 0x490 0x000 0x5 0x0
+#define MX8MP_IOMUXC_UART3_RXD__TPSMP_HDATA28                        0x230 0x490 0x000 0x7 0x0
+#define MX8MP_IOMUXC_UART3_TXD__UART3_DCE_TX                         0x234 0x494 0x000 0x0 0x0
+#define MX8MP_IOMUXC_UART3_TXD__UART3_DTE_RX                         0x234 0x494 0x5F8 0x0 0x7
+#define MX8MP_IOMUXC_UART3_TXD__UART1_DCE_RTS                        0x234 0x494 0x5E4 0x1 0x5
+#define MX8MP_IOMUXC_UART3_TXD__UART1_DTE_CTS                        0x234 0x494 0x000 0x1 0x0
+#define MX8MP_IOMUXC_UART3_TXD__USDHC3_VSELECT                       0x234 0x494 0x000 0x2 0x0
+#define MX8MP_IOMUXC_UART3_TXD__GPT1_CLK                             0x234 0x494 0x59C 0x3 0x1
+#define MX8MP_IOMUXC_UART3_TXD__CAN2_RX                              0x234 0x494 0x550 0x4 0x2
+#define MX8MP_IOMUXC_UART3_TXD__GPIO5_IO27                           0x234 0x494 0x000 0x5 0x0
+#define MX8MP_IOMUXC_UART3_TXD__TPSMP_HDATA29                        0x234 0x494 0x000 0x7 0x0
+#define MX8MP_IOMUXC_UART4_RXD__UART4_DCE_RX                         0x238 0x498 0x600 0x0 0x8
+#define MX8MP_IOMUXC_UART4_RXD__UART4_DTE_TX                         0x238 0x498 0x000 0x0 0x0
+#define MX8MP_IOMUXC_UART4_RXD__UART2_DCE_CTS                        0x238 0x498 0x000 0x1 0x0
+#define MX8MP_IOMUXC_UART4_RXD__UART2_DTE_RTS                        0x238 0x498 0x5EC 0x1 0x4
+#define MX8MP_IOMUXC_UART4_RXD__HSIOMIX_PCIE_CLKREQ_B                0x238 0x498 0x5A0 0x2 0x1
+#define MX8MP_IOMUXC_UART4_RXD__GPT1_COMPARE1                        0x238 0x498 0x000 0x3 0x0
+#define MX8MP_IOMUXC_UART4_RXD__I2C6_SCL                             0x238 0x498 0x5CC 0x4 0x2
+#define MX8MP_IOMUXC_UART4_RXD__GPIO5_IO28                           0x238 0x498 0x000 0x5 0x0
+#define MX8MP_IOMUXC_UART4_RXD__TPSMP_HDATA30                        0x238 0x498 0x000 0x7 0x0
+#define MX8MP_IOMUXC_UART4_TXD__UART4_DCE_TX                         0x23C 0x49C 0x000 0x0 0x0
+#define MX8MP_IOMUXC_UART4_TXD__UART4_DTE_RX                         0x23C 0x49C 0x600 0x0 0x9
+#define MX8MP_IOMUXC_UART4_TXD__UART2_DCE_RTS                        0x23C 0x49C 0x5EC 0x1 0x5
+#define MX8MP_IOMUXC_UART4_TXD__UART2_DTE_CTS                        0x23C 0x49C 0x000 0x1 0x0
+#define MX8MP_IOMUXC_UART4_TXD__GPT1_CAPTURE1                        0x23C 0x49C 0x594 0x3 0x1
+#define MX8MP_IOMUXC_UART4_TXD__I2C6_SDA                             0x23C 0x49C 0x5D0 0x4 0x2
+#define MX8MP_IOMUXC_UART4_TXD__GPIO5_IO29                           0x23C 0x49C 0x000 0x5 0x0
+#define MX8MP_IOMUXC_UART4_TXD__TPSMP_HDATA31                        0x23C 0x49C 0x000 0x7 0x0
+#define MX8MP_IOMUXC_HDMI_DDC_SCL__HDMIMIX_EARC_SCL                  0x240 0x4A0 0x000 0x0 0x0
+#define MX8MP_IOMUXC_HDMI_DDC_SCL__I2C5_SCL                          0x240 0x4A0 0x5C4 0x3 0x3
+#define MX8MP_IOMUXC_HDMI_DDC_SCL__CAN1_TX                           0x240 0x4A0 0x000 0x4 0x0
+#define MX8MP_IOMUXC_HDMI_DDC_SCL__GPIO3_IO26                        0x240 0x4A0 0x000 0x5 0x0
+#define MX8MP_IOMUXC_HDMI_DDC_SCL__AUDIOMIX_test_out00               0x240 0x4A0 0x000 0x6 0x0
+#define MX8MP_IOMUXC_HDMI_DDC_SDA__HDMIMIX_EARC_SDA                  0x244 0x4A4 0x000 0x0 0x0
+#define MX8MP_IOMUXC_HDMI_DDC_SDA__I2C5_SDA                          0x244 0x4A4 0x5C8 0x3 0x3
+#define MX8MP_IOMUXC_HDMI_DDC_SDA__CAN1_RX                           0x244 0x4A4 0x54C 0x4 0x3
+#define MX8MP_IOMUXC_HDMI_DDC_SDA__GPIO3_IO27                        0x244 0x4A4 0x000 0x5 0x0
+#define MX8MP_IOMUXC_HDMI_DDC_SDA__AUDIOMIX_test_out01               0x244 0x4A4 0x000 0x6 0x0
+#define MX8MP_IOMUXC_HDMI_CEC__HDMIMIX_EARC_CEC                      0x248 0x4A8 0x000 0x0 0x0
+#define MX8MP_IOMUXC_HDMI_CEC__I2C6_SCL                              0x248 0x4A8 0x5CC 0x3 0x3
+#define MX8MP_IOMUXC_HDMI_CEC__CAN2_TX                               0x248 0x4A8 0x000 0x4 0x0
+#define MX8MP_IOMUXC_HDMI_CEC__GPIO3_IO28                            0x248 0x4A8 0x000 0x5 0x0
+#define MX8MP_IOMUXC_HDMI_HPD__HDMIMIX_EARC_DC_HPD                   0x24C 0x4AC 0x000 0x0 0x0
+#define MX8MP_IOMUXC_HDMI_HPD__AUDIOMIX_EARC_HDMI_HPD_O              0x24C 0x4AC 0x000 0x1 0x0
+#define MX8MP_IOMUXC_HDMI_HPD__I2C6_SDA                              0x24C 0x4AC 0x5D0 0x3 0x3
+#define MX8MP_IOMUXC_HDMI_HPD__CAN2_RX                               0x24C 0x4AC 0x550 0x4 0x3
+#define MX8MP_IOMUXC_HDMI_HPD__GPIO3_IO29                            0x24C 0x4AC 0x000 0x5 0x0
+
+#endif /* __DTS_IMX8MP_PINFUNC_H */
diff --git a/arch/arm/dts/imx8mp.dtsi b/arch/arm/dts/imx8mp.dtsi
new file mode 100644 (file)
index 0000000..0fb29cc
--- /dev/null
@@ -0,0 +1,598 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+/*
+ * Copyright 2019 NXP
+ */
+
+#include <dt-bindings/clock/imx8mp-clock.h>
+#include <dt-bindings/gpio/gpio.h>
+#include <dt-bindings/input/input.h>
+#include <dt-bindings/interrupt-controller/arm-gic.h>
+
+#include "imx8mp-pinfunc.h"
+
+/ {
+       interrupt-parent = <&gic>;
+       #address-cells = <2>;
+       #size-cells = <2>;
+
+       aliases {
+               ethernet0 = &fec;
+               gpio0 = &gpio1;
+               gpio1 = &gpio2;
+               gpio2 = &gpio3;
+               gpio3 = &gpio4;
+               gpio4 = &gpio5;
+               mmc0 = &usdhc1;
+               mmc1 = &usdhc2;
+               mmc2 = &usdhc3;
+               serial0 = &uart1;
+               serial1 = &uart2;
+               serial2 = &uart3;
+               serial3 = &uart4;
+       };
+
+       cpus {
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               A53_0: cpu@0 {
+                       device_type = "cpu";
+                       compatible = "arm,cortex-a53";
+                       reg = <0x0>;
+                       clock-latency = <61036>;
+                       clocks = <&clk IMX8MP_CLK_ARM>;
+                       enable-method = "psci";
+                       next-level-cache = <&A53_L2>;
+               };
+
+               A53_1: cpu@1 {
+                       device_type = "cpu";
+                       compatible = "arm,cortex-a53";
+                       reg = <0x1>;
+                       clock-latency = <61036>;
+                       clocks = <&clk IMX8MP_CLK_ARM>;
+                       enable-method = "psci";
+                       next-level-cache = <&A53_L2>;
+               };
+
+               A53_2: cpu@2 {
+                       device_type = "cpu";
+                       compatible = "arm,cortex-a53";
+                       reg = <0x2>;
+                       clock-latency = <61036>;
+                       clocks = <&clk IMX8MP_CLK_ARM>;
+                       enable-method = "psci";
+                       next-level-cache = <&A53_L2>;
+               };
+
+               A53_3: cpu@3 {
+                       device_type = "cpu";
+                       compatible = "arm,cortex-a53";
+                       reg = <0x3>;
+                       clock-latency = <61036>;
+                       clocks = <&clk IMX8MP_CLK_ARM>;
+                       enable-method = "psci";
+                       next-level-cache = <&A53_L2>;
+               };
+
+               A53_L2: l2-cache0 {
+                       compatible = "cache";
+               };
+       };
+
+       osc_32k: clock-osc-32k {
+               compatible = "fixed-clock";
+               #clock-cells = <0>;
+               clock-frequency = <32768>;
+               clock-output-names = "osc_32k";
+       };
+
+       osc_24m: clock-osc-24m {
+               compatible = "fixed-clock";
+               #clock-cells = <0>;
+               clock-frequency = <24000000>;
+               clock-output-names = "osc_24m";
+       };
+
+       clk_ext1: clock-ext1 {
+               compatible = "fixed-clock";
+               #clock-cells = <0>;
+               clock-frequency = <133000000>;
+               clock-output-names = "clk_ext1";
+       };
+
+       clk_ext2: clock-ext2 {
+               compatible = "fixed-clock";
+               #clock-cells = <0>;
+               clock-frequency = <133000000>;
+               clock-output-names = "clk_ext2";
+       };
+
+       clk_ext3: clock-ext3 {
+               compatible = "fixed-clock";
+               #clock-cells = <0>;
+               clock-frequency = <133000000>;
+               clock-output-names = "clk_ext3";
+       };
+
+       clk_ext4: clock-ext4 {
+               compatible = "fixed-clock";
+               #clock-cells = <0>;
+               clock-frequency= <133000000>;
+               clock-output-names = "clk_ext4";
+       };
+
+       psci {
+               compatible = "arm,psci-1.0";
+               method = "smc";
+       };
+
+       timer {
+               compatible = "arm,armv8-timer";
+               interrupts = <GIC_PPI 13 (GIC_CPU_MASK_SIMPLE(6) | IRQ_TYPE_LEVEL_LOW)>,
+                            <GIC_PPI 14 (GIC_CPU_MASK_SIMPLE(6) | IRQ_TYPE_LEVEL_LOW)>,
+                            <GIC_PPI 11 (GIC_CPU_MASK_SIMPLE(6) | IRQ_TYPE_LEVEL_LOW)>,
+                            <GIC_PPI 10 (GIC_CPU_MASK_SIMPLE(6) | IRQ_TYPE_LEVEL_LOW)>;
+               clock-frequency = <8000000>;
+               arm,no-tick-in-suspend;
+       };
+
+       soc@0 {
+               compatible = "simple-bus";
+               #address-cells = <1>;
+               #size-cells = <1>;
+               ranges = <0x0 0x0 0x0 0x3e000000>;
+
+               aips1: bus@30000000 {
+                       compatible = "simple-bus";
+                       reg = <0x30000000 0x400000>;
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       ranges;
+
+                       gpio1: gpio@30200000 {
+                               compatible = "fsl,imx8mp-gpio", "fsl,imx35-gpio";
+                               reg = <0x30200000 0x10000>;
+                               interrupts = <GIC_SPI 64 IRQ_TYPE_LEVEL_HIGH>,
+                                            <GIC_SPI 65 IRQ_TYPE_LEVEL_HIGH>;
+                               clocks = <&clk IMX8MP_CLK_GPIO1_ROOT>;
+                               gpio-controller;
+                               #gpio-cells = <2>;
+                               interrupt-controller;
+                               #interrupt-cells = <2>;
+                               gpio-ranges = <&iomuxc 0 5 30>;
+                       };
+
+                       gpio2: gpio@30210000 {
+                               compatible = "fsl,imx8mp-gpio", "fsl,imx35-gpio";
+                               reg = <0x30210000 0x10000>;
+                               interrupts = <GIC_SPI 66 IRQ_TYPE_LEVEL_HIGH>,
+                                            <GIC_SPI 67 IRQ_TYPE_LEVEL_HIGH>;
+                               clocks = <&clk IMX8MP_CLK_GPIO2_ROOT>;
+                               gpio-controller;
+                               #gpio-cells = <2>;
+                               interrupt-controller;
+                               #interrupt-cells = <2>;
+                               gpio-ranges = <&iomuxc 0 35 21>;
+                       };
+
+                       gpio3: gpio@30220000 {
+                               compatible = "fsl,imx8mp-gpio", "fsl,imx35-gpio";
+                               reg = <0x30220000 0x10000>;
+                               interrupts = <GIC_SPI 68 IRQ_TYPE_LEVEL_HIGH>,
+                                            <GIC_SPI 69 IRQ_TYPE_LEVEL_HIGH>;
+                               clocks = <&clk IMX8MP_CLK_GPIO3_ROOT>;
+                               gpio-controller;
+                               #gpio-cells = <2>;
+                               interrupt-controller;
+                               #interrupt-cells = <2>;
+                               gpio-ranges = <&iomuxc 0 56 26>, <&iomuxc 0 144 4>;
+                       };
+
+                       gpio4: gpio@30230000 {
+                               compatible = "fsl,imx8mp-gpio", "fsl,imx35-gpio";
+                               reg = <0x30230000 0x10000>;
+                               interrupts = <GIC_SPI 70 IRQ_TYPE_LEVEL_HIGH>,
+                                            <GIC_SPI 71 IRQ_TYPE_LEVEL_HIGH>;
+                               clocks = <&clk IMX8MP_CLK_GPIO4_ROOT>;
+                               gpio-controller;
+                               #gpio-cells = <2>;
+                               interrupt-controller;
+                               #interrupt-cells = <2>;
+                               gpio-ranges = <&iomuxc 0 82 32>;
+                       };
+
+                       gpio5: gpio@30240000 {
+                               compatible = "fsl,imx8mp-gpio", "fsl,imx35-gpio";
+                               reg = <0x30240000 0x10000>;
+                               interrupts = <GIC_SPI 72 IRQ_TYPE_LEVEL_HIGH>,
+                                            <GIC_SPI 73 IRQ_TYPE_LEVEL_HIGH>;
+                               clocks = <&clk IMX8MP_CLK_GPIO5_ROOT>;
+                               gpio-controller;
+                               #gpio-cells = <2>;
+                               interrupt-controller;
+                               #interrupt-cells = <2>;
+                               gpio-ranges = <&iomuxc 0 114 30>;
+                       };
+
+                       wdog1: watchdog@30280000 {
+                               compatible = "fsl,imx8mp-wdt", "fsl,imx21-wdt";
+                               reg = <0x30280000 0x10000>;
+                               interrupts = <GIC_SPI 78 IRQ_TYPE_LEVEL_HIGH>;
+                               clocks = <&clk IMX8MP_CLK_WDOG1_ROOT>;
+                               status = "disabled";
+                       };
+
+                       iomuxc: pinctrl@30330000 {
+                               compatible = "fsl,imx8mp-iomuxc";
+                               reg = <0x30330000 0x10000>;
+                       };
+
+                       gpr: iomuxc-gpr@30340000 {
+                               compatible = "fsl,imx8mp-iomuxc-gpr", "syscon";
+                               reg = <0x30340000 0x10000>;
+                       };
+
+                       ocotp: ocotp-ctrl@30350000 {
+                               compatible = "fsl,imx8mp-ocotp", "fsl,imx8mm-ocotp", "syscon";
+                               reg = <0x30350000 0x10000>;
+                               clocks = <&clk IMX8MP_CLK_OCOTP_ROOT>;
+                               /* For nvmem subnodes */
+                               #address-cells = <1>;
+                               #size-cells = <1>;
+
+                               cpu_speed_grade: speed-grade@10 {
+                                       reg = <0x10 4>;
+                               };
+                       };
+
+                       anatop: anatop@30360000 {
+                               compatible = "fsl,imx8mp-anatop", "fsl,imx8mm-anatop",
+                                            "syscon";
+                               reg = <0x30360000 0x10000>;
+                       };
+
+                       snvs: snvs@30370000 {
+                               compatible = "fsl,sec-v4.0-mon","syscon", "simple-mfd";
+                               reg = <0x30370000 0x10000>;
+
+                               snvs_rtc: snvs-rtc-lp {
+                                       compatible = "fsl,sec-v4.0-mon-rtc-lp";
+                                       regmap =<&snvs>;
+                                       offset = <0x34>;
+                                       interrupts = <GIC_SPI 19 IRQ_TYPE_LEVEL_HIGH>,
+                                                    <GIC_SPI 20 IRQ_TYPE_LEVEL_HIGH>;
+                                       clocks = <&clk IMX8MP_CLK_SNVS_ROOT>;
+                                       clock-names = "snvs-rtc";
+                               };
+
+                               snvs_pwrkey: snvs-powerkey {
+                                       compatible = "fsl,sec-v4.0-pwrkey";
+                                       regmap = <&snvs>;
+                                       interrupts = <GIC_SPI 4 IRQ_TYPE_LEVEL_HIGH>;
+                                       linux,keycode = <KEY_POWER>;
+                                       wakeup-source;
+                                       status = "disabled";
+                               };
+                       };
+
+                       clk: clock-controller@30380000 {
+                               compatible = "fsl,imx8mp-ccm";
+                               reg = <0x30380000 0x10000>;
+                               #clock-cells = <1>;
+                               clocks = <&osc_32k>, <&osc_24m>, <&clk_ext1>, <&clk_ext2>,
+                                        <&clk_ext3>, <&clk_ext4>;
+                               clock-names = "osc_32k", "osc_24m", "clk_ext1", "clk_ext2",
+                                             "clk_ext3", "clk_ext4";
+                               assigned-clocks = <&clk IMX8MP_CLK_AUDIO_AHB>,
+                                                 <&clk IMX8MP_CLK_IPG_AUDIO_ROOT>,
+                                                 <&clk IMX8MP_AUDIO_PLL1>,
+                                                 <&clk IMX8MP_AUDIO_PLL2>;
+                       };
+
+                       src: src@30390000 {
+                               compatible = "fsl,imx8mp-src", "fsl,imx8mq-src", "syscon";
+                               reg = <0x30390000 0x10000>;
+                               interrupts = <GIC_SPI 89 IRQ_TYPE_LEVEL_HIGH>;
+                               #reset-cells = <1>;
+                       };
+               };
+
+               aips2: bus@30400000 {
+                       compatible = "simple-bus";
+                       reg = <0x30400000 0x400000>;
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       ranges;
+
+                       pwm1: pwm@30660000 {
+                               compatible = "fsl,imx8mp-pwm", "fsl,imx27-pwm";
+                               reg = <0x30660000 0x10000>;
+                               interrupts = <GIC_SPI 81 IRQ_TYPE_LEVEL_HIGH>;
+                               clocks = <&clk IMX8MP_CLK_PWM1_ROOT>,
+                                        <&clk IMX8MP_CLK_PWM1_ROOT>;
+                               clock-names = "ipg", "per";
+                               #pwm-cells = <2>;
+                               status = "disabled";
+                       };
+
+                       pwm2: pwm@30670000 {
+                               compatible = "fsl,imx8mp-pwm", "fsl,imx27-pwm";
+                               reg = <0x30670000 0x10000>;
+                               interrupts = <GIC_SPI 82 IRQ_TYPE_LEVEL_HIGH>;
+                               clocks = <&clk IMX8MP_CLK_PWM2_ROOT>,
+                                        <&clk IMX8MP_CLK_PWM2_ROOT>;
+                               clock-names = "ipg", "per";
+                               #pwm-cells = <2>;
+                               status = "disabled";
+                       };
+
+                       pwm3: pwm@30680000 {
+                               compatible = "fsl,imx8mp-pwm", "fsl,imx27-pwm";
+                               reg = <0x30680000 0x10000>;
+                               interrupts = <GIC_SPI 83 IRQ_TYPE_LEVEL_HIGH>;
+                               clocks = <&clk IMX8MP_CLK_PWM3_ROOT>,
+                                        <&clk IMX8MP_CLK_PWM3_ROOT>;
+                               clock-names = "ipg", "per";
+                               #pwm-cells = <2>;
+                               status = "disabled";
+                       };
+
+                       pwm4: pwm@30690000 {
+                               compatible = "fsl,imx8mp-pwm", "fsl,imx27-pwm";
+                               reg = <0x30690000 0x10000>;
+                               interrupts = <GIC_SPI 84 IRQ_TYPE_LEVEL_HIGH>;
+                               clocks = <&clk IMX8MP_CLK_PWM4_ROOT>,
+                                        <&clk IMX8MP_CLK_PWM4_ROOT>;
+                               clock-names = "ipg", "per";
+                               #pwm-cells = <2>;
+                               status = "disabled";
+                       };
+               };
+
+               aips3: bus@30800000 {
+                       compatible = "simple-bus";
+                       reg = <0x30800000 0x400000>;
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       ranges;
+
+                       ecspi1: spi@30820000 {
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+                               compatible = "fsl,imx8mp-ecspi", "fsl,imx51-ecspi";
+                               reg = <0x30820000 0x10000>;
+                               interrupts = <GIC_SPI 31 IRQ_TYPE_LEVEL_HIGH>;
+                               clocks = <&clk IMX8MP_CLK_ECSPI1_ROOT>,
+                                        <&clk IMX8MP_CLK_ECSPI1_ROOT>;
+                               clock-names = "ipg", "per";
+                               dmas = <&sdma1 0 7 1>, <&sdma1 1 7 2>;
+                               dma-names = "rx", "tx";
+                               status = "disabled";
+                       };
+
+                       ecspi2: spi@30830000 {
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+                               compatible = "fsl,imx8mp-ecspi", "fsl,imx51-ecspi";
+                               reg = <0x30830000 0x10000>;
+                               interrupts = <GIC_SPI 32 IRQ_TYPE_LEVEL_HIGH>;
+                               clocks = <&clk IMX8MP_CLK_ECSPI2_ROOT>,
+                                        <&clk IMX8MP_CLK_ECSPI2_ROOT>;
+                               clock-names = "ipg", "per";
+                               dmas = <&sdma1 2 7 1>, <&sdma1 3 7 2>;
+                               dma-names = "rx", "tx";
+                               status = "disabled";
+                       };
+
+                       ecspi3: spi@30840000 {
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+                               compatible = "fsl,imx8mp-ecspi", "fsl,imx51-ecspi";
+                               reg = <0x30840000 0x10000>;
+                               interrupts = <GIC_SPI 33 IRQ_TYPE_LEVEL_HIGH>;
+                               clocks = <&clk IMX8MP_CLK_ECSPI3_ROOT>,
+                                        <&clk IMX8MP_CLK_ECSPI3_ROOT>;
+                               clock-names = "ipg", "per";
+                               dmas = <&sdma1 4 7 1>, <&sdma1 5 7 2>;
+                               dma-names = "rx", "tx";
+                               status = "disabled";
+                       };
+
+                       uart1: serial@30860000 {
+                               compatible = "fsl,imx8mp-uart", "fsl,imx6q-uart";
+                               reg = <0x30860000 0x10000>;
+                               interrupts = <GIC_SPI 26 IRQ_TYPE_LEVEL_HIGH>;
+                               clocks = <&clk IMX8MP_CLK_UART1_ROOT>,
+                                        <&clk IMX8MP_CLK_UART1_ROOT>;
+                               clock-names = "ipg", "per";
+                               dmas = <&sdma1 22 4 0>, <&sdma1 23 4 0>;
+                               dma-names = "rx", "tx";
+                               status = "disabled";
+                       };
+
+                       uart3: serial@30880000 {
+                               compatible = "fsl,imx8mp-uart", "fsl,imx6q-uart";
+                               reg = <0x30880000 0x10000>;
+                               interrupts = <GIC_SPI 28 IRQ_TYPE_LEVEL_HIGH>;
+                               clocks = <&clk IMX8MP_CLK_UART3_ROOT>,
+                                        <&clk IMX8MP_CLK_UART3_ROOT>;
+                               clock-names = "ipg", "per";
+                               dmas = <&sdma1 26 4 0>, <&sdma1 27 4 0>;
+                               dma-names = "rx", "tx";
+                               status = "disabled";
+                       };
+
+                       uart2: serial@30890000 {
+                               compatible = "fsl,imx8mp-uart", "fsl,imx6q-uart";
+                               reg = <0x30890000 0x10000>;
+                               interrupts = <GIC_SPI 27 IRQ_TYPE_LEVEL_HIGH>;
+                               clocks = <&clk IMX8MP_CLK_UART2_ROOT>,
+                                        <&clk IMX8MP_CLK_UART2_ROOT>;
+                               clock-names = "ipg", "per";
+                               status = "disabled";
+                       };
+
+                       i2c1: i2c@30a20000 {
+                               compatible = "fsl,imx8mp-i2c", "fsl,imx21-i2c";
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+                               reg = <0x30a20000 0x10000>;
+                               interrupts = <GIC_SPI 35 IRQ_TYPE_LEVEL_HIGH>;
+                               clocks = <&clk IMX8MP_CLK_I2C1_ROOT>;
+                               status = "disabled";
+                       };
+
+                       i2c2: i2c@30a30000 {
+                               compatible = "fsl,imx8mp-i2c", "fsl,imx21-i2c";
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+                               reg = <0x30a30000 0x10000>;
+                               interrupts = <GIC_SPI 36 IRQ_TYPE_LEVEL_HIGH>;
+                               clocks = <&clk IMX8MP_CLK_I2C2_ROOT>;
+                               status = "disabled";
+                       };
+
+                       i2c3: i2c@30a40000 {
+                               compatible = "fsl,imx8mm-i2c", "fsl,imx21-i2c";
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+                               reg = <0x30a40000 0x10000>;
+                               interrupts = <GIC_SPI 37 IRQ_TYPE_LEVEL_HIGH>;
+                               clocks = <&clk IMX8MP_CLK_I2C3_ROOT>;
+                               status = "disabled";
+                       };
+
+                       i2c4: i2c@30a50000 {
+                               compatible = "fsl,imx8mp-i2c", "fsl,imx21-i2c";
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+                               reg = <0x30a50000 0x10000>;
+                               interrupts = <GIC_SPI 38 IRQ_TYPE_LEVEL_HIGH>;
+                               clocks = <&clk IMX8MP_CLK_I2C4_ROOT>;
+                               status = "disabled";
+                       };
+
+                       uart4: serial@30a60000 {
+                               compatible = "fsl,imx8mp-uart", "fsl,imx6q-uart";
+                               reg = <0x30a60000 0x10000>;
+                               interrupts = <GIC_SPI 29 IRQ_TYPE_LEVEL_HIGH>;
+                               clocks = <&clk IMX8MP_CLK_UART4_ROOT>,
+                                        <&clk IMX8MP_CLK_UART4_ROOT>;
+                               clock-names = "ipg", "per";
+                               dmas = <&sdma1 28 4 0>, <&sdma1 29 4 0>;
+                               dma-names = "rx", "tx";
+                               status = "disabled";
+                       };
+
+                       i2c5: i2c@30ad0000 {
+                               compatible = "fsl,imx8mp-i2c", "fsl,imx21-i2c";
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+                               reg = <0x30ad0000 0x10000>;
+                               interrupts = <GIC_SPI 76 IRQ_TYPE_LEVEL_HIGH>;
+                               clocks = <&clk IMX8MP_CLK_I2C5_ROOT>;
+                               status = "disabled";
+                       };
+
+                       i2c6: i2c@30ae0000 {
+                               compatible = "fsl,imx8mp-i2c", "fsl,imx21-i2c";
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+                               reg = <0x30ae0000 0x10000>;
+                               interrupts = <GIC_SPI 77 IRQ_TYPE_LEVEL_HIGH>;
+                               clocks = <&clk IMX8MP_CLK_I2C6_ROOT>;
+                               status = "disabled";
+                       };
+
+                       usdhc1: mmc@30b40000 {
+                               compatible = "fsl,imx8mm-usdhc", "fsl,imx7d-usdhc";
+                               reg = <0x30b40000 0x10000>;
+                               interrupts = <GIC_SPI 22 IRQ_TYPE_LEVEL_HIGH>;
+                               clocks = <&clk IMX8MP_CLK_DUMMY>,
+                                        <&clk IMX8MP_CLK_NAND_USDHC_BUS>,
+                                        <&clk IMX8MP_CLK_USDHC1_ROOT>;
+                               clock-names = "ipg", "ahb", "per";
+                               fsl,tuning-start-tap = <20>;
+                               fsl,tuning-step= <2>;
+                               bus-width = <4>;
+                               status = "disabled";
+                       };
+
+                       usdhc2: mmc@30b50000 {
+                               compatible = "fsl,imx8mm-usdhc", "fsl,imx7d-usdhc";
+                               reg = <0x30b50000 0x10000>;
+                               interrupts = <GIC_SPI 23 IRQ_TYPE_LEVEL_HIGH>;
+                               clocks = <&clk IMX8MP_CLK_DUMMY>,
+                                        <&clk IMX8MP_CLK_NAND_USDHC_BUS>,
+                                        <&clk IMX8MP_CLK_USDHC2_ROOT>;
+                               clock-names = "ipg", "ahb", "per";
+                               fsl,tuning-start-tap = <20>;
+                               fsl,tuning-step= <2>;
+                               bus-width = <4>;
+                               status = "disabled";
+                       };
+
+                       usdhc3: mmc@30b60000 {
+                               compatible = "fsl,imx8mm-usdhc", "fsl,imx7d-usdhc";
+                               reg = <0x30b60000 0x10000>;
+                               interrupts = <GIC_SPI 24 IRQ_TYPE_LEVEL_HIGH>;
+                               clocks = <&clk IMX8MP_CLK_DUMMY>,
+                                        <&clk IMX8MP_CLK_NAND_USDHC_BUS>,
+                                        <&clk IMX8MP_CLK_USDHC3_ROOT>;
+                               clock-names = "ipg", "ahb", "per";
+                               fsl,tuning-start-tap = <20>;
+                               fsl,tuning-step= <2>;
+                               bus-width = <4>;
+                               status = "disabled";
+                       };
+
+                       sdma1: dma-controller@30bd0000 {
+                               compatible = "fsl,imx8mp-sdma", "fsl,imx8mq-sdma";
+                               reg = <0x30bd0000 0x10000>;
+                               interrupts = <GIC_SPI 2 IRQ_TYPE_LEVEL_HIGH>;
+                               clocks = <&clk IMX8MP_CLK_SDMA1_ROOT>,
+                                        <&clk IMX8MP_CLK_SDMA1_ROOT>;
+                               clock-names = "ipg", "ahb";
+                               #dma-cells = <3>;
+                               fsl,sdma-ram-script-name = "imx/sdma/sdma-imx7d.bin";
+                       };
+
+                       fec: ethernet@30be0000 {
+                               compatible = "fsl,imx8mm-fec", "fsl,imx8mq-fec", "fsl,imx6sx-fec";
+                               reg = <0x30be0000 0x10000>;
+                               interrupts = <GIC_SPI 118 IRQ_TYPE_LEVEL_HIGH>,
+                                            <GIC_SPI 119 IRQ_TYPE_LEVEL_HIGH>,
+                                            <GIC_SPI 120 IRQ_TYPE_LEVEL_HIGH>;
+                               clocks = <&clk IMX8MP_CLK_ENET1_ROOT>,
+                                        <&clk IMX8MP_CLK_SIM_ENET_ROOT>,
+                                        <&clk IMX8MP_CLK_ENET_TIMER>,
+                                        <&clk IMX8MP_CLK_ENET_REF>,
+                                        <&clk IMX8MP_CLK_ENET_PHY_REF>;
+                               clock-names = "ipg", "ahb", "ptp",
+                                             "enet_clk_ref", "enet_out";
+                               assigned-clocks = <&clk IMX8MP_CLK_ENET_AXI>,
+                                                 <&clk IMX8MP_CLK_ENET_TIMER>,
+                                                 <&clk IMX8MP_CLK_ENET_REF>,
+                                                 <&clk IMX8MP_CLK_ENET_TIMER>;
+                               assigned-clock-parents = <&clk IMX8MP_SYS_PLL1_266M>,
+                                                        <&clk IMX8MP_SYS_PLL2_100M>,
+                                                        <&clk IMX8MP_SYS_PLL2_125M>;
+                               assigned-clock-rates = <0>, <0>, <125000000>, <100000000>;
+                               fsl,num-tx-queues = <3>;
+                               fsl,num-rx-queues = <3>;
+                               status = "disabled";
+                       };
+               };
+
+               gic: interrupt-controller@38800000 {
+                       compatible = "arm,gic-v3";
+                       reg = <0x38800000 0x10000>,
+                             <0x38880000 0xc0000>;
+                       #interrupt-cells = <3>;
+                       interrupt-controller;
+                       interrupts = <GIC_PPI 9 IRQ_TYPE_LEVEL_HIGH>;
+                       interrupt-parent = <&gic>;
+               };
+       };
+};
diff --git a/arch/arm/dts/meson-sm1-khadas-vim3l.dts b/arch/arm/dts/meson-sm1-khadas-vim3l.dts
new file mode 100644 (file)
index 0000000..1001b37
--- /dev/null
@@ -0,0 +1,95 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+/*
+ * Copyright (c) 2019 BayLibre, SAS
+ * Author: Neil Armstrong <narmstrong@baylibre.com>
+ */
+
+/dts-v1/;
+
+#include "meson-sm1.dtsi"
+#include "meson-khadas-vim3.dtsi"
+
+/ {
+       compatible = "khadas,vim3l", "amlogic,sm1";
+       model = "Khadas VIM3L";
+
+       vddcpu: regulator-vddcpu {
+               /*
+                * Silergy SY8030DEC Regulator.
+                */
+               compatible = "pwm-regulator";
+
+               regulator-name = "VDDCPU";
+               regulator-min-microvolt = <690000>;
+               regulator-max-microvolt = <1050000>;
+
+               vin-supply = <&vsys_3v3>;
+
+               pwms = <&pwm_AO_cd 1 1250 0>;
+               pwm-dutycycle-range = <100 0>;
+
+               regulator-boot-on;
+               regulator-always-on;
+       };
+};
+
+&cpu0 {
+       cpu-supply = <&vddcpu>;
+       operating-points-v2 = <&cpu_opp_table>;
+       clocks = <&clkc CLKID_CPU_CLK>;
+       clock-latency = <50000>;
+};
+
+&cpu1 {
+       cpu-supply = <&vddcpu>;
+       operating-points-v2 = <&cpu_opp_table>;
+       clocks = <&clkc CLKID_CPU1_CLK>;
+       clock-latency = <50000>;
+};
+
+&cpu2 {
+       cpu-supply = <&vddcpu>;
+       operating-points-v2 = <&cpu_opp_table>;
+       clocks = <&clkc CLKID_CPU2_CLK>;
+       clock-latency = <50000>;
+};
+
+&cpu3 {
+       cpu-supply = <&vddcpu>;
+       operating-points-v2 = <&cpu_opp_table>;
+       clocks = <&clkc CLKID_CPU3_CLK>;
+       clock-latency = <50000>;
+};
+
+&pwm_AO_cd {
+       pinctrl-0 = <&pwm_ao_d_e_pins>;
+       pinctrl-names = "default";
+       clocks = <&xtal>;
+       clock-names = "clkin1";
+       status = "okay";
+};
+
+/*
+ * The VIM3 on-board  MCU can mux the PCIe/USB3.0 shared differential
+ * lines using a FUSB340TMX USB 3.1 SuperSpeed Data Switch between
+ * an USB3.0 Type A connector and a M.2 Key M slot. The PHY driving
+ * these differential lines is shared between the USB3.0 controller
+ * and the PCIe Controller, thus only a single controller can use it.
+ * If the MCU is configured to mux the PCIe/USB3.0 differential lines
+ * to the M.2 Key M slot, uncomment the following block to disable
+ * USB3.0 from the USB Complex and enable the PCIe controller.
+ * The End User is not expected to uncomment the following except for
+ * testing purposes, but instead rely on the firmware/bootloader to
+ * update these nodes accordingly if PCIe mode is selected by the MCU.
+ */
+
+/*
+&pcie {
+       status = "okay";
+};
+
+&usb {
+       phys = <&usb2_phy0>, <&usb2_phy1>;
+       phy-names = "usb2-phy0", "usb2-phy1";
+};
+ */
index 322c858c4b06b8275a9bd8ee23dce2eee295d877..d55460755fe3cc8d96cf8db59ea9b3158444dd18 100644 (file)
        };
 };
 
+&clkmgr {
+       u-boot,dm-pre-reloc;
+};
+
 &rst {
        u-boot,dm-pre-reloc;
 };
@@ -17,3 +21,7 @@
 &sdr {
        u-boot,dm-pre-reloc;
 };
+
+&sysmgr {
+       u-boot,dm-pre-reloc;
+};
index 51a6a51b5380e920b6db44e095b096fbfbca81a5..eda558f2fe736f468869e64a0d3ca6465d2c5148 100644 (file)
                        status = "disabled";
                };
 
-               clkmgr@ffd04000 {
+               clkmgr: clkmgr@ffd04000 {
                                compatible = "altr,clk-mgr";
                                reg = <0xffd04000 0x1000>;
 
diff --git a/arch/arm/dts/socfpga_agilex-u-boot.dtsi b/arch/arm/dts/socfpga_agilex-u-boot.dtsi
new file mode 100644 (file)
index 0000000..f0528a9
--- /dev/null
@@ -0,0 +1,96 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * U-Boot additions
+ *
+ * Copyright (C) 2019 Intel Corporation <www.intel.com>
+ */
+
+/{
+       memory {
+               #address-cells = <2>;
+               #size-cells = <2>;
+               u-boot,dm-pre-reloc;
+       };
+
+       soc {
+               u-boot,dm-pre-reloc;
+
+               ccu: cache-controller@f7000000 {
+                       compatible = "arteris,ncore-ccu";
+                       reg = <0xf7000000 0x100900>;
+                       u-boot,dm-pre-reloc;
+               };
+       };
+};
+
+&clkmgr {
+       u-boot,dm-pre-reloc;
+};
+
+&gmac1 {
+       altr,sysmgr-syscon = <&sysmgr 0x48 0>;
+};
+
+&gmac2 {
+       altr,sysmgr-syscon = <&sysmgr 0x4c 0>;
+};
+
+&i2c0 {
+       reset-names = "i2c";
+};
+
+&i2c1 {
+       reset-names = "i2c";
+};
+
+&i2c2 {
+       reset-names = "i2c";
+};
+
+&i2c3 {
+       reset-names = "i2c";
+};
+
+&mmc {
+       resets = <&rst SDMMC_RESET>, <&rst SDMMC_OCP_RESET>;
+};
+
+&porta {
+       bank-name = "porta";
+};
+
+&portb {
+       bank-name = "portb";
+};
+
+&qspi {
+       u-boot,dm-pre-reloc;
+};
+
+&rst {
+       compatible = "altr,rst-mgr";
+       altr,modrst-offset = <0x20>;
+       u-boot,dm-pre-reloc;
+};
+
+&sdr {
+       compatible = "intel,sdr-ctl-agilex";
+       reg = <0xf8000400 0x80>,
+             <0xf8010000 0x190>,
+             <0xf8011000 0x500>;
+       resets = <&rst DDRSCH_RESET>;
+       u-boot,dm-pre-reloc;
+};
+
+&sysmgr {
+       compatible = "altr,sys-mgr", "syscon";
+       u-boot,dm-pre-reloc;
+};
+
+&uart0 {
+       u-boot,dm-pre-reloc;
+};
+
+&watchdog0 {
+       u-boot,dm-pre-reloc;
+};
diff --git a/arch/arm/dts/socfpga_agilex.dtsi b/arch/arm/dts/socfpga_agilex.dtsi
new file mode 100644 (file)
index 0000000..179b4d5
--- /dev/null
@@ -0,0 +1,622 @@
+// SPDX-License-Identifier:     GPL-2.0
+/*
+ * Copyright (C) 2019, Intel Corporation
+ */
+
+/dts-v1/;
+#include <dt-bindings/reset/altr,rst-mgr-s10.h>
+#include <dt-bindings/gpio/gpio.h>
+#include <dt-bindings/clock/agilex-clock.h>
+
+/ {
+       compatible = "intel,socfpga-agilex";
+       #address-cells = <2>;
+       #size-cells = <2>;
+
+       reserved-memory {
+               #address-cells = <2>;
+               #size-cells = <2>;
+               ranges;
+
+               service_reserved: svcbuffer@0 {
+                       compatible = "shared-dma-pool";
+                       reg = <0x0 0x0 0x0 0x1000000>;
+                       alignment = <0x1000>;
+                       no-map;
+               };
+       };
+
+       cpus {
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               cpu0: cpu@0 {
+                       compatible = "arm,cortex-a53";
+                       device_type = "cpu";
+                       enable-method = "psci";
+                       reg = <0x0>;
+               };
+
+               cpu1: cpu@1 {
+                       compatible = "arm,cortex-a53";
+                       device_type = "cpu";
+                       enable-method = "psci";
+                       reg = <0x1>;
+               };
+
+               cpu2: cpu@2 {
+                       compatible = "arm,cortex-a53";
+                       device_type = "cpu";
+                       enable-method = "psci";
+                       reg = <0x2>;
+               };
+
+               cpu3: cpu@3 {
+                       compatible = "arm,cortex-a53";
+                       device_type = "cpu";
+                       enable-method = "psci";
+                       reg = <0x3>;
+               };
+       };
+
+       pmu {
+               compatible = "arm,armv8-pmuv3";
+               interrupts = <0 170 4>,
+                            <0 171 4>,
+                            <0 172 4>,
+                            <0 173 4>;
+               interrupt-affinity = <&cpu0>,
+                                    <&cpu1>,
+                                    <&cpu2>,
+                                    <&cpu3>;
+               interrupt-parent = <&intc>;
+       };
+
+       psci {
+               compatible = "arm,psci-0.2";
+               method = "smc";
+       };
+
+       intc: intc@fffc1000 {
+               compatible = "arm,gic-400", "arm,cortex-a15-gic";
+               #interrupt-cells = <3>;
+               interrupt-controller;
+               reg = <0x0 0xfffc1000 0x0 0x1000>,
+                     <0x0 0xfffc2000 0x0 0x2000>,
+                     <0x0 0xfffc4000 0x0 0x2000>,
+                     <0x0 0xfffc6000 0x0 0x2000>;
+       };
+
+       soc {
+               #address-cells = <1>;
+               #size-cells = <1>;
+               compatible = "simple-bus";
+               device_type = "soc";
+               interrupt-parent = <&intc>;
+               ranges = <0 0 0 0xffffffff>;
+
+               base_fpga_region {
+                       #address-cells = <0x1>;
+                       #size-cells = <0x1>;
+                       compatible = "fpga-region";
+                       fpga-mgr = <&fpga_mgr>;
+               };
+
+               clkmgr: clock-controller@ffd10000 {
+                       compatible = "intel,agilex-clkmgr";
+                       reg = <0xffd10000 0x1000>;
+                       #clock-cells = <1>;
+               };
+
+               clocks {
+                       cb_intosc_hs_div2_clk: cb-intosc-hs-div2-clk {
+                               #clock-cells = <0>;
+                               compatible = "fixed-clock";
+                       };
+
+                       cb_intosc_ls_clk: cb-intosc-ls-clk {
+                               #clock-cells = <0>;
+                               compatible = "fixed-clock";
+                       };
+
+                       f2s_free_clk: f2s-free-clk {
+                               #clock-cells = <0>;
+                               compatible = "fixed-clock";
+                       };
+
+                       osc1: osc1 {
+                               #clock-cells = <0>;
+                               compatible = "fixed-clock";
+                       };
+
+                       qspi_clk: qspi-clk {
+                               #clock-cells = <0>;
+                               compatible = "fixed-clock";
+                               clock-frequency = <200000000>;
+                       };
+               };
+               gmac0: ethernet@ff800000 {
+                       compatible = "altr,socfpga-stmmac", "snps,dwmac-3.74a", "snps,dwmac";
+                       reg = <0xff800000 0x2000>;
+                       interrupts = <0 90 4>;
+                       interrupt-names = "macirq";
+                       mac-address = [00 00 00 00 00 00];
+                       resets = <&rst EMAC0_RESET>, <&rst EMAC0_OCP_RESET>;
+                       reset-names = "stmmaceth", "stmmaceth-ocp";
+                       tx-fifo-depth = <16384>;
+                       rx-fifo-depth = <16384>;
+                       snps,multicast-filter-bins = <256>;
+                       iommus = <&smmu 1>;
+                       altr,sysmgr-syscon = <&sysmgr 0x44 0>;
+                       clocks = <&clkmgr AGILEX_EMAC0_CLK>;
+                       clock-names = "stmmaceth";
+                       status = "disabled";
+               };
+
+               gmac1: ethernet@ff802000 {
+                       compatible = "altr,socfpga-stmmac", "snps,dwmac-3.74a", "snps,dwmac";
+                       reg = <0xff802000 0x2000>;
+                       interrupts = <0 91 4>;
+                       interrupt-names = "macirq";
+                       mac-address = [00 00 00 00 00 00];
+                       resets = <&rst EMAC1_RESET>, <&rst EMAC1_OCP_RESET>;
+                       reset-names = "stmmaceth", "stmmaceth-ocp";
+                       tx-fifo-depth = <16384>;
+                       rx-fifo-depth = <16384>;
+                       snps,multicast-filter-bins = <256>;
+                       iommus = <&smmu 2>;
+                       altr,sysmgr-syscon = <&sysmgr 0x48 8>;
+                       clocks = <&clkmgr AGILEX_EMAC1_CLK>;
+                       clock-names = "stmmaceth";
+                       status = "disabled";
+               };
+
+               gmac2: ethernet@ff804000 {
+                       compatible = "altr,socfpga-stmmac", "snps,dwmac-3.74a", "snps,dwmac";
+                       reg = <0xff804000 0x2000>;
+                       interrupts = <0 92 4>;
+                       interrupt-names = "macirq";
+                       mac-address = [00 00 00 00 00 00];
+                       resets = <&rst EMAC2_RESET>, <&rst EMAC2_OCP_RESET>;
+                       reset-names = "stmmaceth", "stmmaceth-ocp";
+                       tx-fifo-depth = <16384>;
+                       rx-fifo-depth = <16384>;
+                       snps,multicast-filter-bins = <256>;
+                       iommus = <&smmu 3>;
+                       altr,sysmgr-syscon = <&sysmgr 0x4c 16>;
+                       clocks = <&clkmgr AGILEX_EMAC2_CLK>;
+                       clock-names = "stmmaceth";
+                       status = "disabled";
+               };
+
+               gpio0: gpio@ffc03200 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       compatible = "snps,dw-apb-gpio";
+                       reg = <0xffc03200 0x100>;
+                       resets = <&rst GPIO0_RESET>;
+                       status = "disabled";
+
+                       porta: gpio-controller@0 {
+                               compatible = "snps,dw-apb-gpio-port";
+                               gpio-controller;
+                               #gpio-cells = <2>;
+                               snps,nr-gpios = <24>;
+                               reg = <0>;
+                               interrupt-controller;
+                               #interrupt-cells = <2>;
+                               interrupts = <0 110 4>;
+                       };
+               };
+
+               gpio1: gpio@ffc03300 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       compatible = "snps,dw-apb-gpio";
+                       reg = <0xffc03300 0x100>;
+                       resets = <&rst GPIO1_RESET>;
+                       status = "disabled";
+
+                       portb: gpio-controller@0 {
+                               compatible = "snps,dw-apb-gpio-port";
+                               gpio-controller;
+                               #gpio-cells = <2>;
+                               snps,nr-gpios = <24>;
+                               reg = <0>;
+                               interrupt-controller;
+                               #interrupt-cells = <2>;
+                               interrupts = <0 111 4>;
+                       };
+               };
+
+               i2c0: i2c@ffc02800 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       compatible = "snps,designware-i2c";
+                       reg = <0xffc02800 0x100>;
+                       interrupts = <0 103 4>;
+                       resets = <&rst I2C0_RESET>;
+                       clocks = <&clkmgr AGILEX_L4_SP_CLK>;
+                       status = "disabled";
+               };
+
+               i2c1: i2c@ffc02900 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       compatible = "snps,designware-i2c";
+                       reg = <0xffc02900 0x100>;
+                       interrupts = <0 104 4>;
+                       resets = <&rst I2C1_RESET>;
+                       clocks = <&clkmgr AGILEX_L4_SP_CLK>;
+                       status = "disabled";
+               };
+
+               i2c2: i2c@ffc02a00 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       compatible = "snps,designware-i2c";
+                       reg = <0xffc02a00 0x100>;
+                       interrupts = <0 105 4>;
+                       resets = <&rst I2C2_RESET>;
+                       clocks = <&clkmgr AGILEX_L4_SP_CLK>;
+                       status = "disabled";
+               };
+
+               i2c3: i2c@ffc02b00 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       compatible = "snps,designware-i2c";
+                       reg = <0xffc02b00 0x100>;
+                       interrupts = <0 106 4>;
+                       resets = <&rst I2C3_RESET>;
+                       clocks = <&clkmgr AGILEX_L4_SP_CLK>;
+                       status = "disabled";
+               };
+
+               i2c4: i2c@ffc02c00 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       compatible = "snps,designware-i2c";
+                       reg = <0xffc02c00 0x100>;
+                       interrupts = <0 107 4>;
+                       resets = <&rst I2C4_RESET>;
+                       clocks = <&clkmgr AGILEX_L4_SP_CLK>;
+                       status = "disabled";
+               };
+
+               mmc: dwmmc0@ff808000 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       compatible = "altr,socfpga-dw-mshc";
+                       reg = <0xff808000 0x1000>;
+                       interrupts = <0 96 4>;
+                       fifo-depth = <0x400>;
+                       resets = <&rst SDMMC_RESET>;
+                       reset-names = "reset";
+                       clocks = <&clkmgr AGILEX_L4_MP_CLK>,
+                                <&clkmgr AGILEX_SDMMC_CLK>;
+                       clock-names = "biu", "ciu";
+                       iommus = <&smmu 5>;
+                       status = "disabled";
+               };
+
+               nand: nand@ffb90000 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       compatible = "altr,socfpga-denali-nand";
+                       reg = <0xffb90000 0x10000>,
+                             <0xffb80000 0x1000>;
+                       reg-names = "nand_data", "denali_reg";
+                       interrupts = <0 97 4>;
+                       resets = <&rst NAND_RESET>, <&rst NAND_OCP_RESET>;
+                       status = "disabled";
+               };
+
+               ocram: sram@ffe00000 {
+                       compatible = "mmio-sram";
+                       reg = <0xffe00000 0x40000>;
+               };
+
+               pdma: pdma@ffda0000 {
+                       compatible = "arm,pl330", "arm,primecell";
+                       reg = <0xffda0000 0x1000>;
+                       interrupts = <0 81 4>,
+                                    <0 82 4>,
+                                    <0 83 4>,
+                                    <0 84 4>,
+                                    <0 85 4>,
+                                    <0 86 4>,
+                                    <0 87 4>,
+                                    <0 88 4>,
+                                    <0 89 4>;
+                       #dma-cells = <1>;
+                       #dma-channels = <8>;
+                       #dma-requests = <32>;
+                       resets = <&rst DMA_RESET>, <&rst DMA_OCP_RESET>;
+                       reset-names = "dma", "dma-ocp";
+                       clocks = <&clkmgr AGILEX_L4_MAIN_CLK>;
+                       clock-names = "apb_pclk";
+               };
+
+               rst: rstmgr@ffd11000 {
+                       #reset-cells = <1>;
+                       compatible = "altr,stratix10-rst-mgr";
+                       reg = <0xffd11000 0x100>;
+               };
+
+               smmu: iommu@fa000000 {
+                       compatible = "arm,mmu-500", "arm,smmu-v2";
+                       reg = <0xfa000000 0x40000>;
+                       #global-interrupts = <2>;
+                       #iommu-cells = <1>;
+                       interrupt-parent = <&intc>;
+                       interrupts = <0 128 4>, /* Global Secure Fault */
+                               <0 129 4>, /* Global Non-secure Fault */
+                               /* Non-secure Context Interrupts (32) */
+                               <0 138 4>, <0 139 4>, <0 140 4>, <0 141 4>,
+                               <0 142 4>, <0 143 4>, <0 144 4>, <0 145 4>,
+                               <0 146 4>, <0 147 4>, <0 148 4>, <0 149 4>,
+                               <0 150 4>, <0 151 4>, <0 152 4>, <0 153 4>,
+                               <0 154 4>, <0 155 4>, <0 156 4>, <0 157 4>,
+                               <0 158 4>, <0 159 4>, <0 160 4>, <0 161 4>,
+                               <0 162 4>, <0 163 4>, <0 164 4>, <0 165 4>,
+                               <0 166 4>, <0 167 4>, <0 168 4>, <0 169 4>;
+                       stream-match-mask = <0x7ff0>;
+                       status = "disabled";
+               };
+
+               spi0: spi@ffda4000 {
+                       compatible = "snps,dw-apb-ssi";
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       reg = <0xffda4000 0x1000>;
+                       interrupts = <0 99 4>;
+                       resets = <&rst SPIM0_RESET>;
+                       reg-io-width = <4>;
+                       num-cs = <4>;
+                       clocks = <&clkmgr AGILEX_L4_MAIN_CLK>;
+                       status = "disabled";
+               };
+
+               spi1: spi@ffda5000 {
+                       compatible = "snps,dw-apb-ssi";
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       reg = <0xffda5000 0x1000>;
+                       interrupts = <0 100 4>;
+                       resets = <&rst SPIM1_RESET>;
+                       reg-io-width = <4>;
+                       num-cs = <4>;
+                       clocks = <&clkmgr AGILEX_L4_MAIN_CLK>;
+                       status = "disabled";
+               };
+
+               sysmgr: sysmgr@ffd12000 {
+                       compatible = "altr,sys-mgr-s10","altr,sys-mgr";
+                       reg = <0xffd12000 0x500>;
+               };
+
+               /* Local timer */
+               timer {
+                       compatible = "arm,armv8-timer";
+                       interrupts = <1 13 0xf08>,
+                                    <1 14 0xf08>,
+                                    <1 11 0xf08>,
+                                    <1 10 0xf08>;
+               };
+
+               timer0: timer0@ffc03000 {
+                       compatible = "snps,dw-apb-timer";
+                       interrupts = <0 113 4>;
+                       reg = <0xffc03000 0x100>;
+                       clocks = <&clkmgr AGILEX_L4_SP_CLK>;
+                       clock-names = "timer";
+               };
+
+               timer1: timer1@ffc03100 {
+                       compatible = "snps,dw-apb-timer";
+                       interrupts = <0 114 4>;
+                       reg = <0xffc03100 0x100>;
+                       clocks = <&clkmgr AGILEX_L4_SP_CLK>;
+                       clock-names = "timer";
+               };
+
+               timer2: timer2@ffd00000 {
+                       compatible = "snps,dw-apb-timer";
+                       interrupts = <0 115 4>;
+                       reg = <0xffd00000 0x100>;
+                       clocks = <&clkmgr AGILEX_L4_SP_CLK>;
+                       clock-names = "timer";
+               };
+
+               timer3: timer3@ffd00100 {
+                       compatible = "snps,dw-apb-timer";
+                       interrupts = <0 116 4>;
+                       reg = <0xffd00100 0x100>;
+                       clocks = <&clkmgr AGILEX_L4_SP_CLK>;
+                       clock-names = "timer";
+               };
+
+               uart0: serial0@ffc02000 {
+                       compatible = "snps,dw-apb-uart";
+                       reg = <0xffc02000 0x100>;
+                       interrupts = <0 108 4>;
+                       reg-shift = <2>;
+                       reg-io-width = <4>;
+                       resets = <&rst UART0_RESET>;
+                       status = "disabled";
+                       clocks = <&clkmgr AGILEX_L4_SP_CLK>;
+                       clock-frequency = <100000000>;
+               };
+
+               uart1: serial1@ffc02100 {
+                       compatible = "snps,dw-apb-uart";
+                       reg = <0xffc02100 0x100>;
+                       interrupts = <0 109 4>;
+                       reg-shift = <2>;
+                       reg-io-width = <4>;
+                       resets = <&rst UART1_RESET>;
+                       clocks = <&clkmgr AGILEX_L4_SP_CLK>;
+                       status = "disabled";
+               };
+
+               usbphy0: usbphy@0 {
+                       #phy-cells = <0>;
+                       compatible = "usb-nop-xceiv";
+                       status = "okay";
+               };
+
+               usb0: usb@ffb00000 {
+                       compatible = "snps,dwc2";
+                       reg = <0xffb00000 0x40000>;
+                       interrupts = <0 93 4>;
+                       phys = <&usbphy0>;
+                       phy-names = "usb2-phy";
+                       resets = <&rst USB0_RESET>, <&rst USB0_OCP_RESET>;
+                       reset-names = "dwc2", "dwc2-ecc";
+                       clocks = <&clkmgr AGILEX_USB_CLK>;
+                       iommus = <&smmu 6>;
+                       status = "disabled";
+               };
+
+               usb1: usb@ffb40000 {
+                       compatible = "snps,dwc2";
+                       reg = <0xffb40000 0x40000>;
+                       interrupts = <0 94 4>;
+                       phys = <&usbphy0>;
+                       phy-names = "usb2-phy";
+                       resets = <&rst USB1_RESET>, <&rst USB1_OCP_RESET>;
+                       reset-names = "dwc2", "dwc2-ecc";
+                       iommus = <&smmu 7>;
+                       clocks = <&clkmgr AGILEX_USB_CLK>;
+                       status = "disabled";
+               };
+
+               watchdog0: watchdog@ffd00200 {
+                       compatible = "snps,dw-wdt";
+                       reg = <0xffd00200 0x100>;
+                       interrupts = <0 117 4>;
+                       resets = <&rst WATCHDOG0_RESET>;
+                       clocks = <&clkmgr AGILEX_L4_SYS_FREE_CLK>;
+                       status = "disabled";
+               };
+
+               watchdog1: watchdog@ffd00300 {
+                       compatible = "snps,dw-wdt";
+                       reg = <0xffd00300 0x100>;
+                       interrupts = <0 118 4>;
+                       resets = <&rst WATCHDOG1_RESET>;
+                       clocks = <&clkmgr AGILEX_L4_SYS_FREE_CLK>;
+                       status = "disabled";
+               };
+
+               watchdog2: watchdog@ffd00400 {
+                       compatible = "snps,dw-wdt";
+                       reg = <0xffd00400 0x100>;
+                       interrupts = <0 125 4>;
+                       resets = <&rst WATCHDOG2_RESET>;
+                       clocks = <&clkmgr AGILEX_L4_SYS_FREE_CLK>;
+                       status = "disabled";
+               };
+
+               watchdog3: watchdog@ffd00500 {
+                       compatible = "snps,dw-wdt";
+                       reg = <0xffd00500 0x100>;
+                       interrupts = <0 126 4>;
+                       resets = <&rst WATCHDOG3_RESET>;
+                       clocks = <&clkmgr AGILEX_L4_SYS_FREE_CLK>;
+                       status = "disabled";
+               };
+
+               sdr: sdr@f8011100 {
+                       compatible = "altr,sdr-ctl", "syscon";
+                       reg = <0xf8011100 0xc0>;
+               };
+
+               eccmgr {
+                       compatible = "altr,socfpga-s10-ecc-manager",
+                                    "altr,socfpga-a10-ecc-manager";
+                       altr,sysmgr-syscon = <&sysmgr>;
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       interrupts = <0 15 4>;
+                       interrupt-controller;
+                       #interrupt-cells = <2>;
+                       ranges;
+
+                       sdramedac {
+                               compatible = "altr,sdram-edac-s10";
+                               altr,sdr-syscon = <&sdr>;
+                               interrupts = <16 4>;
+                       };
+
+                       ocram-ecc@ff8cc000 {
+                               compatible = "altr,socfpga-s10-ocram-ecc",
+                                            "altr,socfpga-a10-ocram-ecc";
+                               reg = <0xff8cc000 0x100>;
+                               altr,ecc-parent = <&ocram>;
+                               interrupts = <1 4>;
+                       };
+
+                       usb0-ecc@ff8c4000 {
+                               compatible = "altr,socfpga-s10-usb-ecc",
+                                            "altr,socfpga-usb-ecc";
+                               reg = <0xff8c4000 0x100>;
+                               altr,ecc-parent = <&usb0>;
+                               interrupts = <2 4>;
+                       };
+
+                       emac0-rx-ecc@ff8c0000 {
+                               compatible = "altr,socfpga-s10-eth-mac-ecc",
+                                            "altr,socfpga-eth-mac-ecc";
+                               reg = <0xff8c0000 0x100>;
+                               altr,ecc-parent = <&gmac0>;
+                               interrupts = <4 4>;
+                       };
+
+                       emac0-tx-ecc@ff8c0400 {
+                               compatible = "altr,socfpga-s10-eth-mac-ecc",
+                                            "altr,socfpga-eth-mac-ecc";
+                               reg = <0xff8c0400 0x100>;
+                               altr,ecc-parent = <&gmac0>;
+                               interrupts = <5 4>;
+                       };
+
+                       sdmmca-ecc@ff8c8c00 {
+                               compatible = "altr,socfpga-s10-sdmmc-ecc",
+                                            "altr,socfpga-sdmmc-ecc";
+                               reg = <0xff8c8c00 0x100>;
+                               altr,ecc-parent = <&mmc>;
+                               interrupts = <14 4>,
+                                            <15 4>;
+                       };
+               };
+
+               qspi: spi@ff8d2000 {
+                       compatible = "cdns,qspi-nor";
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       reg = <0xff8d2000 0x100>,
+                             <0xff900000 0x100000>;
+                       interrupts = <0 3 4>;
+                       cdns,fifo-depth = <128>;
+                       cdns,fifo-width = <4>;
+                       cdns,trigger-address = <0x00000000>;
+                       clocks = <&qspi_clk>;
+
+                       status = "disabled";
+               };
+
+               firmware {
+                       svc {
+                               compatible = "intel,stratix10-svc";
+                               method = "smc";
+                               memory-region = <&service_reserved>;
+
+                               fpga_mgr: fpga-mgr {
+                                       compatible = "intel,stratix10-soc-fpga-mgr";
+                               };
+                       };
+               };
+       };
+};
diff --git a/arch/arm/dts/socfpga_agilex_socdk-u-boot.dtsi b/arch/arm/dts/socfpga_agilex_socdk-u-boot.dtsi
new file mode 100644 (file)
index 0000000..1908be4
--- /dev/null
@@ -0,0 +1,39 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * U-Boot additions
+ *
+ * Copyright (C) 2019 Intel Corporation <www.intel.com>
+ */
+
+#include "socfpga_agilex-u-boot.dtsi"
+
+/{
+       aliases {
+               spi0 = &qspi;
+               i2c0 = &i2c1;
+       };
+
+       memory {
+               /* 8GB */
+               reg = <0 0x00000000 0 0x80000000>,
+                     <2 0x80000000 1 0x80000000>;
+       };
+};
+
+&flash0 {
+       compatible = "jedec,spi-nor";
+       spi-tx-bus-width = <4>;
+       spi-rx-bus-width = <4>;
+       u-boot,dm-pre-reloc;
+};
+
+&i2c1 {
+       status = "okay";
+};
+
+&mmc {
+       drvsel = <3>;
+       smplsel = <0>;
+       u-boot,dm-pre-reloc;
+};
+
diff --git a/arch/arm/dts/socfpga_agilex_socdk.dts b/arch/arm/dts/socfpga_agilex_socdk.dts
new file mode 100644 (file)
index 0000000..bcdeecc
--- /dev/null
@@ -0,0 +1,141 @@
+// SPDX-License-Identifier:     GPL-2.0
+/*
+ * Copyright (C) 2019, Intel Corporation
+ */
+#include "socfpga_agilex.dtsi"
+
+/ {
+       model = "SoCFPGA Agilex SoCDK";
+
+       aliases {
+               serial0 = &uart0;
+               ethernet0 = &gmac0;
+               ethernet1 = &gmac1;
+               ethernet2 = &gmac2;
+       };
+
+       chosen {
+               stdout-path = "serial0:115200n8";
+       };
+
+       leds {
+               compatible = "gpio-leds";
+               hps0 {
+                       label = "hps_led0";
+                       gpios = <&portb 20 GPIO_ACTIVE_HIGH>;
+               };
+
+               hps1 {
+                       label = "hps_led1";
+                       gpios = <&portb 19 GPIO_ACTIVE_HIGH>;
+               };
+
+               hps2 {
+                       label = "hps_led2";
+                       gpios = <&portb 21 GPIO_ACTIVE_HIGH>;
+               };
+       };
+
+       memory {
+               device_type = "memory";
+               /* We expect the bootloader to fill in the reg */
+               reg = <0 0 0 0>;
+       };
+
+       soc {
+               clocks {
+                       osc1 {
+                               clock-frequency = <25000000>;
+                       };
+               };
+       };
+};
+
+&gpio1 {
+       status = "okay";
+};
+
+&gmac0 {
+       status = "okay";
+       phy-mode = "rgmii";
+       phy-handle = <&phy0>;
+
+       max-frame-size = <9000>;
+
+       mdio0 {
+               #address-cells = <1>;
+               #size-cells = <0>;
+               compatible = "snps,dwmac-mdio";
+               phy0: ethernet-phy@0 {
+                       reg = <4>;
+
+                       txd0-skew-ps = <0>; /* -420ps */
+                       txd1-skew-ps = <0>; /* -420ps */
+                       txd2-skew-ps = <0>; /* -420ps */
+                       txd3-skew-ps = <0>; /* -420ps */
+                       rxd0-skew-ps = <420>; /* 0ps */
+                       rxd1-skew-ps = <420>; /* 0ps */
+                       rxd2-skew-ps = <420>; /* 0ps */
+                       rxd3-skew-ps = <420>; /* 0ps */
+                       txen-skew-ps = <0>; /* -420ps */
+                       txc-skew-ps = <900>; /* 0ps */
+                       rxdv-skew-ps = <420>; /* 0ps */
+                       rxc-skew-ps = <1680>; /* 780ps */
+               };
+       };
+};
+
+&mmc {
+       status = "okay";
+       cap-sd-highspeed;
+       broken-cd;
+       bus-width = <4>;
+};
+
+&uart0 {
+       status = "okay";
+};
+
+&usb0 {
+       status = "okay";
+       disable-over-current;
+};
+
+&watchdog0 {
+       status = "okay";
+};
+
+&qspi {
+       flash0: flash@0 {
+               #address-cells = <1>;
+               #size-cells = <1>;
+               compatible = "mt25qu02g";
+               reg = <0>;
+               spi-max-frequency = <100000000>;
+
+               m25p,fast-read;
+               cdns,page-size = <256>;
+               cdns,block-size = <16>;
+               cdns,read-delay = <1>;
+               cdns,tshsl-ns = <50>;
+               cdns,tsd2d-ns = <50>;
+               cdns,tchsh-ns = <4>;
+               cdns,tslch-ns = <4>;
+
+               partitions {
+                       compatible = "fixed-partitions";
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+
+                       qspi_boot: partition@0 {
+                               label = "Boot and fpga data";
+                               reg = <0x0 0x034B0000>;
+                       };
+
+                       qspi_rootfs: partition@34B0000 {
+                               label = "Root Filesystem - JFFS2";
+                               reg = <0x034B0000 0x0EB50000>;
+                       };
+               };
+       };
+};
index c11a5c0cc1af10271a78f8e3b966df19f6c90e50..cc529bcd115675a82efb94e2d9d631b08de06693 100644 (file)
@@ -96,7 +96,7 @@
                        fpga-mgr = <&fpga_mgr>;
                };
 
-               clkmgr@ffd04000 {
+               clkmgr: clkmgr@ffd04000 {
                                compatible = "altr,clk-mgr";
                                reg = <0xffd04000 0x1000>;
                                u-boot,dm-pre-reloc;
index 6e5578d7bd3c015193fe1837a756f97a854ef934..ef10708ee867a811afc8d371a27ea3cdb7b922f9 100644 (file)
 &l4_sp_clk {
        u-boot,dm-pre-reloc;
 };
+
+&clkmgr {
+       u-boot,dm-pre-reloc;
+};
+
+&sysmgr {
+       u-boot,dm-pre-reloc;
+};
index bd68a78a37a9b6b22f66e1b33cb2e6822adfddab..a8e61cf7280a3b24f969facd9767002eebfd9c2f 100755 (executable)
@@ -82,7 +82,7 @@
                ranges = <0 0 0 0xffffffff>;
                u-boot,dm-pre-reloc;
 
-               clkmgr@ffd1000 {
+               clkmgr: clkmgr@ffd10000 {
                        compatible = "altr,clk-mgr";
                        reg = <0xffd10000 0x1000>;
                };
index e1cfb522bfce88a9d07381be45eb81a7e4f22511..38855aecd7ea0c4a73703fee392eac67873661eb 100755 (executable)
        };
 };
 
+&clkmgr {
+       u-boot,dm-pre-reloc;
+};
+
 &qspi {
        status = "okay";
        u-boot,dm-pre-reloc;
@@ -23,3 +27,7 @@
        spi-rx-bus-width = <4>;
        u-boot,dm-pre-reloc;
 };
+
+&sysmgr {
+       u-boot,dm-pre-reloc;
+};
index 1fee5ffbfb9c9e463a500d88c5965e5267e5c83e..bfdfb764b25b9ee9cb9a55add120f5fd988d7e6c 100644 (file)
                function = "i2c4";
        };
 
+       pinctrl_i2c5: i2c5 {
+               groups = "i2c5";
+               function = "i2c5";
+       };
+
+       pinctrl_i2c6: i2c6 {
+               groups = "i2c6";
+               function = "i2c6";
+       };
+
        pinctrl_nand: nand {
                groups = "nand";
                function = "nand";
index b0f4dd089f69a17314e911a8112a10fad38838c6..5ade63665ab03c43f147cc8662224327b6161403 100644 (file)
@@ -33,6 +33,7 @@
 #define MXC_CPU_IMX8MMS                0x89 /* dummy ID */
 #define MXC_CPU_IMX8MMSL       0x8a /* dummy ID */
 #define MXC_CPU_IMX8MN         0x8b /* dummy ID */
+#define MXC_CPU_IMX8MP         0x182/* dummy ID */
 #define MXC_CPU_IMX8QXP_A0     0x90 /* dummy ID */
 #define MXC_CPU_IMX8QM         0x91 /* dummy ID */
 #define MXC_CPU_IMX8QXP                0x92 /* dummy ID */
index c910b614ac3f93011f3c37cd0a3d90477971e661..87cc4d3b2b7174bff816e44128db0b0028e9f7b4 100644 (file)
@@ -9,7 +9,8 @@
 
 #ifdef CONFIG_IMX8MQ
 #include <asm/arch/clock_imx8mq.h>
-#elif defined(CONFIG_IMX8MM) || defined(CONFIG_IMX8MN)
+#elif defined(CONFIG_IMX8MM) || defined(CONFIG_IMX8MN) || \
+       defined(CONFIG_IMX8MP)
 #include <asm/arch/clock_imx8mm.h>
 #else
 #error "Error no clock.h"
index 76c73edc90fd2afdbbc36072b444f7e8cc7ab786..debed6bac7c08b7ee4f7596b5fec2e743ad3d7fb 100644 (file)
@@ -52,7 +52,109 @@ enum pll_clocks {
        ANATOP_DRAM_PLL,
 };
 
-#ifdef CONFIG_IMX8MN
+#ifdef CONFIG_IMX8MP
+enum clk_root_index {
+       ARM_A53_CLK_ROOT                = 0,
+       ARM_M7_CLK_ROOT                 = 1,
+       ML_CLK_ROOT                     = 2,
+       GPU3D_CORE_CLK_ROOT             = 3,
+       GPU3D_SHADER_CLK_ROOT           = 4,
+       GPU2D_CLK_ROOT                  = 5,
+       AUDIO_AXI_CLK_ROOT              = 6,
+       HSIO_AXI_CLK_ROOT               = 7,
+       MEDIA_ISP_CLK_ROOT              = 8,
+       MAIN_AXI_CLK_ROOT               = 16,
+       ENET_AXI_CLK_ROOT               = 17,
+       NAND_USDHC_BUS_CLK_ROOT         = 18,
+       VPU_BUS_CLK_ROOT                = 19,
+       MEDIA_AXI_CLK_ROOT              = 20,
+       MEDIA_APB_CLK_ROOT              = 21,
+       HDMI_APB_CLK_ROOT               = 22,
+       HDMI_AXI_CLK_ROOT               = 23,
+       GPU_AXI_CLK_ROOT                = 24,
+       GPU_AHB_CLK_ROOT                = 25,
+       NOC_CLK_ROOT                    = 26,
+       NOC_IO_CLK_ROOT                 = 27,
+       ML_AXI_CLK_ROOT                 = 28,
+       ML_AHB_CLK_ROOT                 = 29,
+       AHB_CLK_ROOT                    = 32,
+       IPG_CLK_ROOT                    = 33,
+       AUDIO_AHB_CLK_ROOT              = 34,
+       MIPI_DSI_ESC_RX_CLK_ROOT        = 36,
+       MEDIA_DISP2_CLK_ROOT            = 38,
+       DRAM_SEL_CFG                    = 48,
+       CORE_SEL_CFG                    = 49,
+       DRAM_ALT_CLK_ROOT               = 64,
+       DRAM_APB_CLK_ROOT               = 65,
+       VPU_G1_CLK_ROOT                 = 66,
+       VPU_G2_CLK_ROOT                 = 67,
+       CAN1_CLK_ROOT                   = 68,
+       CAN2_CLK_ROOT                   = 69,
+       PCIE_PHY_CLK_ROOT               = 71,
+       PCIE_AUX_CLK_ROOT               = 72,
+       I2C5_CLK_ROOT                   = 73,
+       I2C6_CLK_ROOT                   = 74,
+       SAI1_CLK_ROOT                   = 75,
+       SAI2_CLK_ROOT                   = 76,
+       SAI3_CLK_ROOT                   = 77,
+       SAI4_CLK_ROOT                   = 78,
+       SAI5_CLK_ROOT                   = 79,
+       SAI6_CLK_ROOT                   = 80,
+       ENET_QOS_CLK_ROOT               = 81,
+       ENET_QOS_TIMER_CLK_ROOT         = 82,
+       ENET_REF_CLK_ROOT               = 83,
+       ENET_TIMER_CLK_ROOT             = 84,
+       ENET_PHY_REF_CLK_ROOT           = 85,
+       NAND_CLK_ROOT                   = 86,
+       QSPI_CLK_ROOT                   = 87,
+       USDHC1_CLK_ROOT                 = 88,
+       USDHC2_CLK_ROOT                 = 89,
+       I2C1_CLK_ROOT                   = 90,
+       I2C2_CLK_ROOT                   = 91,
+       I2C3_CLK_ROOT                   = 92,
+       I2C4_CLK_ROOT                   = 93,
+       UART1_CLK_ROOT                  = 94,
+       UART2_CLK_ROOT                  = 95,
+       UART3_CLK_ROOT                  = 96,
+       UART4_CLK_ROOT                  = 97,
+       USB_CORE_REF_CLK_ROOT           = 98,
+       USB_PHY_REF_CLK_ROOT            = 99,
+       GIC_CLK_ROOT                    = 100,
+       ECSPI1_CLK_ROOT                 = 101,
+       ECSPI2_CLK_ROOT                 = 102,
+       PWM1_CLK_ROOT                   = 103,
+       PWM2_CLK_ROOT                   = 104,
+       PWM3_CLK_ROOT                   = 105,
+       PWM4_CLK_ROOT                   = 106,
+       GPT1_CLK_ROOT                   = 107,
+       GPT2_CLK_ROOT                   = 108,
+       GPT3_CLK_ROOT                   = 109,
+       GPT4_CLK_ROOT                   = 110,
+       GPT5_CLK_ROOT                   = 111,
+       GPT6_CLK_ROOT                   = 112,
+       TRACE_CLK_ROOT                  = 113,
+       WDOG_CLK_ROOT                   = 114,
+       WRCLK_CLK_ROOT                  = 115,
+       IPP_DO_CLKO1                    = 116,
+       IPP_DO_CLKO2                    = 117,
+       HDMI_FDCC_TST_CLK_ROOT          = 118,
+       HDMI_27M_CLK_ROOT               = 119,
+       HDMI_REF_266M_CLK_ROOT          = 120,
+       USDHC3_CLK_ROOT                 = 121,
+       MEDIA_CAM1_PIX_CLK_ROOT         = 122,
+       MEDIA_MIPI_PHY1_REF_CLK_ROOT    = 123,
+       MEDIA_DISP1_PIX_CLK_ROOT        = 124,
+       MEDIA_CAM2_PIX_CLK_ROOT         = 125,
+       MEDIA_LDB_CLK_ROOT      = 126,
+       MEMREPAIR_CLK_ROOT      = 127,
+       MEDIA_MIPI_TEST_BYTE_CLK        = 130,
+       ECSPI3_CLK_ROOT                 = 131,
+       PDM_CLK_ROOT                    = 132,
+       VPU_VC8000E_CLK_ROOT            = 133,
+       SAI7_CLK_ROOT                   = 134,
+       CLK_ROOT_MAX,
+};
+#elif defined(CONFIG_IMX8MN)
 enum clk_root_index {
        ARM_A53_CLK_ROOT                = 0,
        ARM_M7_CLK_ROOT                 = 1,
@@ -284,6 +386,7 @@ enum clk_ccgr_index {
        CCGR_GPT2 = 17,
        CCGR_GPT3 = 18,
        CCGR_GPT4 = 19,
+       CCGR_AAM_8MP = 20,
        CCGR_GPT5 = 20,
        CCGR_GPT6 = 21,
        CCGR_HS = 22,
@@ -315,7 +418,9 @@ enum clk_ccgr_index {
        CCGR_RAWNAND = 48,
        CCGR_RDC = 49,
        CCGR_ROM = 50,
+       CCGR_I2C5_8MP = 51,
        CCGR_SAI1 = 51,
+       CCGR_I2C6_8MP = 52,
        CCGR_SAI2 = 52,
        CCGR_SAI3 = 53,
        CCGR_SAI4 = 54,
@@ -327,13 +432,16 @@ enum clk_ccgr_index {
        CCGR_SEC_DEBUG = 60,
        CCGR_SEMA1 = 61,
        CCGR_SEMA2 = 62,
+       CCGR_IRQ_STEER_8MP = 63,
        CCGR_SIM_DISPLAY = 63,
        CCGR_SIM_ENET = 64,
        CCGR_SIM_M = 65,
        CCGR_SIM_MAIN = 66,
        CCGR_SIM_S = 67,
        CCGR_SIM_WAKEUP = 68,
+       CCGR_GPU2D_8MP = 69,
        CCGR_SIM_HSIO = 69,
+       CCGR_GPU3D_8MP = 70,
        CCGR_SIM_VPU = 70,
        CCGR_SNVS = 71,
        CCGR_TRACE = 72,
@@ -342,6 +450,7 @@ enum clk_ccgr_index {
        CCGR_UART3 = 75,
        CCGR_UART4 = 76,
        CCGR_USB_MSCALE_PL301 = 77,
+       CCGR_USB_PHY_8MP = 79,
        CCGR_GPU3D = 79,
        CCGR_USDHC1 = 81,
        CCGR_USDHC2 = 82,
@@ -361,6 +470,7 @@ enum clk_ccgr_index {
        CCGR_PLL = 97,
        CCGR_TEMP_SENSOR = 98,
        CCGR_VPUMIX_BUS = 99,
+       CCGR_SAI7 = 101,
        CCGR_GPU2D = 102,
        CCGR_MAX
 };
diff --git a/arch/arm/include/asm/arch-imx8m/imx8mp_pins.h b/arch/arm/include/asm/arch-imx8m/imx8mp_pins.h
new file mode 100644 (file)
index 0000000..e7f3221
--- /dev/null
@@ -0,0 +1,1080 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
+/*
+ * Copyright 2019 NXP
+ */
+
+#ifndef __ASM_ARCH_IMX8MP_PINS_H__
+#define __ASM_ARCH_IMX8MP_PINS_H__
+
+#include <asm/mach-imx/iomux-v3.h>
+
+enum {
+       MX8MP_PAD_GPIO1_IO00__GPIO1_IO00                         = IOMUX_PAD(0x0274, 0x0014, 0, 0x0000, 0, 0),
+       MX8MP_PAD_GPIO1_IO00__CCMSRCGPCMIX_ENET_PHY_REF_CLK_ROOT = IOMUX_PAD(0x0274, 0x0014, 1, 0x0000, 0, 0),
+       MX8MP_PAD_GPIO1_IO00__MEDIAMIX_ISP_FL_TRIG_0             = IOMUX_PAD(0x0274, 0x0014, 3, 0x05D4, 0, 0),
+       MX8MP_PAD_GPIO1_IO00__ANAMIX_REF_CLK_32K                 = IOMUX_PAD(0x0274, 0x0014, 5, 0x0000, 0, 0),
+       MX8MP_PAD_GPIO1_IO00__CCMSRCGPCMIX_EXT_CLK1              = IOMUX_PAD(0x0274, 0x0014, 6, 0x0000, 0, 0),
+       MX8MP_PAD_GPIO1_IO00__SJC_FAIL                           = IOMUX_PAD(0x0274, 0x0014, 7, 0x0000, 0, 0),
+
+       MX8MP_PAD_GPIO1_IO01__GPIO1_IO01                         = IOMUX_PAD(0x0278, 0x0018, 0, 0x0000, 0, 0),
+       MX8MP_PAD_GPIO1_IO01__PWM1_OUT                           = IOMUX_PAD(0x0278, 0x0018, 1, 0x0000, 0, 0),
+       MX8MP_PAD_GPIO1_IO01__MEDIAMIX_ISP_SHUTTER_TRIG_0        = IOMUX_PAD(0x0278, 0x0018, 3, 0x05DC, 0, 0),
+       MX8MP_PAD_GPIO1_IO01__ANAMIX_REF_CLK_24M                 = IOMUX_PAD(0x0278, 0x0018, 5, 0x0000, 0, 0),
+       MX8MP_PAD_GPIO1_IO01__CCMSRCGPCMIX_EXT_CLK2              = IOMUX_PAD(0x0278, 0x0018, 6, 0x0000, 0, 0),
+       MX8MP_PAD_GPIO1_IO01__SJC_ACTIVE                         = IOMUX_PAD(0x0278, 0x0018, 7, 0x0000, 0, 0),
+
+       MX8MP_PAD_GPIO1_IO02__GPIO1_IO02                         = IOMUX_PAD(0x027C, 0x001C, 0, 0x0000, 0, 0),
+       MX8MP_PAD_GPIO1_IO02__WDOG1_WDOG_B                       = IOMUX_PAD(0x027C, 0x001C, 1, 0x0000, 0, 0),
+       MX8MP_PAD_GPIO1_IO02__MEDIAMIX_ISP_FLASH_TRIG_0          = IOMUX_PAD(0x027C, 0x001C, 3, 0x0000, 0, 0),
+       MX8MP_PAD_GPIO1_IO02__WDOG1_WDOG_ANY                     = IOMUX_PAD(0x027C, 0x001C, 5, 0x0000, 0, 0),
+       MX8MP_PAD_GPIO1_IO02__SJC_DE_B                           = IOMUX_PAD(0x027C, 0x001C, 7, 0x0000, 0, 0),
+
+       MX8MP_PAD_GPIO1_IO03__GPIO1_IO03                         = IOMUX_PAD(0x0280, 0x0020, 0, 0x0000, 0, 0),
+       MX8MP_PAD_GPIO1_IO03__USDHC1_VSELECT                     = IOMUX_PAD(0x0280, 0x0020, 1, 0x0000, 0, 0),
+       MX8MP_PAD_GPIO1_IO03__MEDIAMIX_ISP_PRELIGHT_TRIG_0       = IOMUX_PAD(0x0280, 0x0020, 3, 0x0000, 0, 0),
+       MX8MP_PAD_GPIO1_IO03__SDMA1_EXT_EVENT00                  = IOMUX_PAD(0x0280, 0x0020, 5, 0x0000, 0, 0),
+       MX8MP_PAD_GPIO1_IO03__ANAMIX_XTAL_OK                     = IOMUX_PAD(0x0280, 0x0020, 6, 0x0000, 0, 0),
+       MX8MP_PAD_GPIO1_IO03__SJC_DONE                           = IOMUX_PAD(0x0280, 0x0020, 7, 0x0000, 0, 0),
+
+       MX8MP_PAD_GPIO1_IO04__GPIO1_IO04                         = IOMUX_PAD(0x0284, 0x0024, 0, 0x0000, 0, 0),
+       MX8MP_PAD_GPIO1_IO04__USDHC2_VSELECT                     = IOMUX_PAD(0x0284, 0x0024, 1, 0x0000, 0, 0),
+       MX8MP_PAD_GPIO1_IO04__MEDIAMIX_ISP_SHUTTER_OPEN_0        = IOMUX_PAD(0x0284, 0x0024, 3, 0x0000, 0, 0),
+       MX8MP_PAD_GPIO1_IO04__SDMA1_EXT_EVENT01                  = IOMUX_PAD(0x0284, 0x0024, 5, 0x0000, 0, 0),
+       MX8MP_PAD_GPIO1_IO04__ANAMIX_XTAL_OK_LV                  = IOMUX_PAD(0x0284, 0x0024, 6, 0x0000, 0, 0),
+       MX8MP_PAD_GPIO1_IO04__USDHC1_TEST_TRIG                   = IOMUX_PAD(0x0284, 0x0024, 7, 0x0000, 0, 0),
+
+       MX8MP_PAD_GPIO1_IO05__GPIO1_IO05                         = IOMUX_PAD(0x0288, 0x0028, 0, 0x0000, 0, 0),
+       MX8MP_PAD_GPIO1_IO05__M7_NMI                             = IOMUX_PAD(0x0288, 0x0028, 1, 0x0000, 0, 0),
+       MX8MP_PAD_GPIO1_IO05__MEDIAMIX_ISP_FL_TRIG_1             = IOMUX_PAD(0x0288, 0x0028, 3, 0x05D8, 0, 0),
+       MX8MP_PAD_GPIO1_IO05__CCMSRCGPCMIX_PMIC_READY            = IOMUX_PAD(0x0288, 0x0028, 5, 0x0554, 0, 0),
+       MX8MP_PAD_GPIO1_IO05__CCMSRCGPCMIX_INT_BOOT              = IOMUX_PAD(0x0288, 0x0028, 6, 0x0000, 0, 0),
+       MX8MP_PAD_GPIO1_IO05__USDHC2_TEST_TRIG                   = IOMUX_PAD(0x0288, 0x0028, 7, 0x0000, 0, 0),
+
+       MX8MP_PAD_GPIO1_IO06__GPIO1_IO06                         = IOMUX_PAD(0x028C, 0x002C, 0, 0x0000, 0, 0),
+       MX8MP_PAD_GPIO1_IO06__ENET_QOS_MDC                       = IOMUX_PAD(0x028C, 0x002C, 1, 0x0000, 0, 0),
+       MX8MP_PAD_GPIO1_IO06__MEDIAMIX_ISP_SHUTTER_TRIG_1        = IOMUX_PAD(0x028C, 0x002C, 3, 0x05E0, 0, 0),
+       MX8MP_PAD_GPIO1_IO06__USDHC1_CD_B                        = IOMUX_PAD(0x028C, 0x002C, 5, 0x0000, 0, 0),
+       MX8MP_PAD_GPIO1_IO06__CCMSRCGPCMIX_EXT_CLK3              = IOMUX_PAD(0x028C, 0x002C, 6, 0x0000, 0, 0),
+       MX8MP_PAD_GPIO1_IO06__ECSPI1_TEST_TRIG                   = IOMUX_PAD(0x028C, 0x002C, 7, 0x0000, 0, 0),
+
+       MX8MP_PAD_GPIO1_IO07__GPIO1_IO07                         = IOMUX_PAD(0x0290, 0x0030, 0, 0x0000, 0, 0),
+       MX8MP_PAD_GPIO1_IO07__ENET_QOS_MDIO                      = IOMUX_PAD(0x0290, 0x0030, 1, 0x0590, 0, 0),
+       MX8MP_PAD_GPIO1_IO07__MEDIAMIX_ISP_FLASH_TRIG_1          = IOMUX_PAD(0x0290, 0x0030, 3, 0x0000, 0, 0),
+       MX8MP_PAD_GPIO1_IO07__USDHC1_WP                          = IOMUX_PAD(0x0290, 0x0030, 5, 0x0000, 0, 0),
+       MX8MP_PAD_GPIO1_IO07__CCMSRCGPCMIX_EXT_CLK4              = IOMUX_PAD(0x0290, 0x0030, 6, 0x0000, 0, 0),
+       MX8MP_PAD_GPIO1_IO07__ECSPI2_TEST_TRIG                   = IOMUX_PAD(0x0290, 0x0030, 7, 0x0000, 0, 0),
+
+       MX8MP_PAD_GPIO1_IO08__GPIO1_IO08                         = IOMUX_PAD(0x0294, 0x0034, 0, 0x0000, 0, 0),
+       MX8MP_PAD_GPIO1_IO08__ENET_QOS_1588_EVENT0_IN            = IOMUX_PAD(0x0294, 0x0034, 1, 0x0000, 0, 0),
+       MX8MP_PAD_GPIO1_IO08__PWM1_OUT                           = IOMUX_PAD(0x0294, 0x0034, 2, 0x0000, 0, 0),
+       MX8MP_PAD_GPIO1_IO08__MEDIAMIX_ISP_PRELIGHT_TRIG_1       = IOMUX_PAD(0x0294, 0x0034, 3, 0x0000, 0, 0),
+       MX8MP_PAD_GPIO1_IO08__ENET_QOS_1588_EVENT0_AUX_IN        = IOMUX_PAD(0x0294, 0x0034, 4, 0x0000, 0, 0),
+       MX8MP_PAD_GPIO1_IO08__USDHC2_RESET_B                     = IOMUX_PAD(0x0294, 0x0034, 5, 0x0000, 0, 0),
+       MX8MP_PAD_GPIO1_IO08__CCMSRCGPCMIX_WAIT                  = IOMUX_PAD(0x0294, 0x0034, 6, 0x0000, 0, 0),
+       MX8MP_PAD_GPIO1_IO08__FLEXSPI_TEST_TRIG                  = IOMUX_PAD(0x0294, 0x0034, 7, 0x0000, 0, 0),
+
+       MX8MP_PAD_GPIO1_IO09__GPIO1_IO09                         = IOMUX_PAD(0x0298, 0x0038, 0, 0x0000, 0, 0),
+       MX8MP_PAD_GPIO1_IO09__ENET_QOS_1588_EVENT0_OUT           = IOMUX_PAD(0x0298, 0x0038, 1, 0x0000, 0, 0),
+       MX8MP_PAD_GPIO1_IO09__PWM2_OUT                           = IOMUX_PAD(0x0298, 0x0038, 2, 0x0000, 0, 0),
+       MX8MP_PAD_GPIO1_IO09__MEDIAMIX_ISP_SHUTTER_OPEN_1        = IOMUX_PAD(0x0298, 0x0038, 3, 0x0000, 0, 0),
+       MX8MP_PAD_GPIO1_IO09__USDHC3_RESET_B                     = IOMUX_PAD(0x0298, 0x0038, 4, 0x0000, 0, 0),
+       MX8MP_PAD_GPIO1_IO09__AUDIOMIX_EXT_EVENT00               = IOMUX_PAD(0x0298, 0x0038, 5, 0x0000, 0, 0),
+       MX8MP_PAD_GPIO1_IO09__CCMSRCGPCMIX_STOP                  = IOMUX_PAD(0x0298, 0x0038, 6, 0x0000, 0, 0),
+       MX8MP_PAD_GPIO1_IO09__RAWNAND_TEST_TRIG                  = IOMUX_PAD(0x0298, 0x0038, 7, 0x0000, 0, 0),
+
+       MX8MP_PAD_GPIO1_IO10__GPIO1_IO10                         = IOMUX_PAD(0x029C, 0x003C, 0, 0x0000, 0, 0),
+       MX8MP_PAD_GPIO1_IO10__HSIOMIX_usb1_OTG_ID                = IOMUX_PAD(0x029C, 0x003C, 1, 0x0000, 0, 0),
+       MX8MP_PAD_GPIO1_IO10__PWM3_OUT                           = IOMUX_PAD(0x029C, 0x003C, 2, 0x0000, 0, 0),
+       MX8MP_PAD_GPIO1_IO10__OCOTP_FUSE_LATCHED                 = IOMUX_PAD(0x029C, 0x003C, 7, 0x0000, 0, 0),
+
+       MX8MP_PAD_GPIO1_IO11__GPIO1_IO11                         = IOMUX_PAD(0x02A0, 0x0040, 0, 0x0000, 0, 0),
+       MX8MP_PAD_GPIO1_IO11__HSIOMIX_usb2_OTG_ID                = IOMUX_PAD(0x02A0, 0x0040, 1, 0x0000, 0, 0),
+       MX8MP_PAD_GPIO1_IO11__PWM2_OUT                           = IOMUX_PAD(0x02A0, 0x0040, 2, 0x0000, 0, 0),
+       MX8MP_PAD_GPIO1_IO11__USDHC3_VSELECT                     = IOMUX_PAD(0x02A0, 0x0040, 4, 0x0000, 0, 0),
+       MX8MP_PAD_GPIO1_IO11__CCMSRCGPCMIX_PMIC_READY            = IOMUX_PAD(0x02A0, 0x0040, 5, 0x0554, 1, 0),
+       MX8MP_PAD_GPIO1_IO11__CCMSRCGPCMIX_OUT0                  = IOMUX_PAD(0x02A0, 0x0040, 6, 0x0000, 0, 0),
+       MX8MP_PAD_GPIO1_IO11__CAAM_RNG_OSC_OBS                   = IOMUX_PAD(0x02A0, 0x0040, 7, 0x0000, 0, 0),
+
+       MX8MP_PAD_GPIO1_IO12__GPIO1_IO12                         = IOMUX_PAD(0x02A4, 0x0044, 0, 0x0000, 0, 0),
+       MX8MP_PAD_GPIO1_IO12__HSIOMIX_usb1_OTG_PWR               = IOMUX_PAD(0x02A4, 0x0044, 1, 0x0000, 0, 0),
+       MX8MP_PAD_GPIO1_IO12__AUDIOMIX_EXT_EVENT01               = IOMUX_PAD(0x02A4, 0x0044, 5, 0x0000, 0, 0),
+       MX8MP_PAD_GPIO1_IO12__CCMSRCGPCMIX_OUT1                  = IOMUX_PAD(0x02A4, 0x0044, 6, 0x0000, 0, 0),
+       MX8MP_PAD_GPIO1_IO12__CSU_CSU_ALARM_AUT00                = IOMUX_PAD(0x02A4, 0x0044, 7, 0x0000, 0, 0),
+
+       MX8MP_PAD_GPIO1_IO13__GPIO1_IO13                         = IOMUX_PAD(0x02A8, 0x0048, 0, 0x0000, 0, 0),
+       MX8MP_PAD_GPIO1_IO13__HSIOMIX_usb1_OTG_OC                = IOMUX_PAD(0x02A8, 0x0048, 1, 0x0000, 0, 0),
+       MX8MP_PAD_GPIO1_IO13__PWM2_OUT                           = IOMUX_PAD(0x02A8, 0x0048, 5, 0x0000, 0, 0),
+       MX8MP_PAD_GPIO1_IO13__CCMSRCGPCMIX_OUT2                  = IOMUX_PAD(0x02A8, 0x0048, 6, 0x0000, 0, 0),
+       MX8MP_PAD_GPIO1_IO13__CSU_CSU_ALARM_AUT01                = IOMUX_PAD(0x02A8, 0x0048, 7, 0x0000, 0, 0),
+
+       MX8MP_PAD_GPIO1_IO14__GPIO1_IO14                         = IOMUX_PAD(0x02AC, 0x004C, 0, 0x0000, 0, 0),
+       MX8MP_PAD_GPIO1_IO14__HSIOMIX_usb2_OTG_PWR               = IOMUX_PAD(0x02AC, 0x004C, 1, 0x0000, 0, 0),
+       MX8MP_PAD_GPIO1_IO14__USDHC3_CD_B                        = IOMUX_PAD(0x02AC, 0x004C, 4, 0x0608, 0, 0),
+       MX8MP_PAD_GPIO1_IO14__PWM3_OUT                           = IOMUX_PAD(0x02AC, 0x004C, 5, 0x0000, 0, 0),
+       MX8MP_PAD_GPIO1_IO14__CCMSRCGPCMIX_CLKO1                 = IOMUX_PAD(0x02AC, 0x004C, 6, 0x0000, 0, 0),
+       MX8MP_PAD_GPIO1_IO14__CSU_CSU_ALARM_AUT02                = IOMUX_PAD(0x02AC, 0x004C, 7, 0x0000, 0, 0),
+
+       MX8MP_PAD_GPIO1_IO15__GPIO1_IO15                         = IOMUX_PAD(0x02B0, 0x0050, 0, 0x0000, 0, 0),
+       MX8MP_PAD_GPIO1_IO15__HSIOMIX_usb2_OTG_OC                = IOMUX_PAD(0x02B0, 0x0050, 1, 0x0000, 0, 0),
+       MX8MP_PAD_GPIO1_IO15__USDHC3_WP                          = IOMUX_PAD(0x02B0, 0x0050, 4, 0x0634, 0, 0),
+       MX8MP_PAD_GPIO1_IO15__PWM4_OUT                           = IOMUX_PAD(0x02B0, 0x0050, 5, 0x0000, 0, 0),
+       MX8MP_PAD_GPIO1_IO15__CCMSRCGPCMIX_CLKO2                 = IOMUX_PAD(0x02B0, 0x0050, 6, 0x0000, 0, 0),
+       MX8MP_PAD_GPIO1_IO15__CSU_CSU_INT_DEB                    = IOMUX_PAD(0x02B0, 0x0050, 7, 0x0000, 0, 0),
+
+       MX8MP_PAD_ENET_MDC__ENET_QOS_MDC                         = IOMUX_PAD(0x02B4, 0x0054, 0, 0x0000, 0, 0),
+       MX8MP_PAD_ENET_MDC__AUDIOMIX_SAI6_TX_DATA00              = IOMUX_PAD(0x02B4, 0x0054, 2, 0x0000, 0, 0),
+       MX8MP_PAD_ENET_MDC__GPIO1_IO16                           = IOMUX_PAD(0x02B4, 0x0054, 5, 0x0000, 0, 0),
+       MX8MP_PAD_ENET_MDC__USDHC3_STROBE                        = IOMUX_PAD(0x02B4, 0x0054, 6, 0x0630, 0, 0),
+       MX8MP_PAD_ENET_MDC__SIM_M_HADDR15                        = IOMUX_PAD(0x02B4, 0x0054, 7, 0x0000, 0, 0),
+
+       MX8MP_PAD_ENET_MDIO__ENET_QOS_MDIO                       = IOMUX_PAD(0x02B8, 0x0058, 0, 0x0590, 1, 0),
+       MX8MP_PAD_ENET_MDIO__AUDIOMIX_SAI6_TX_SYNC               = IOMUX_PAD(0x02B8, 0x0058, 2, 0x0528, 0, 0),
+       MX8MP_PAD_ENET_MDIO__GPIO1_IO17                          = IOMUX_PAD(0x02B8, 0x0058, 5, 0x0000, 0, 0),
+       MX8MP_PAD_ENET_MDIO__USDHC3_DATA5                        = IOMUX_PAD(0x02B8, 0x0058, 6, 0x0624, 0, 0),
+       MX8MP_PAD_ENET_MDIO__SIM_M_HADDR16                       = IOMUX_PAD(0x02B8, 0x0058, 7, 0x0000, 0, 0),
+
+       MX8MP_PAD_ENET_TD3__ENET_QOS_RGMII_TD3                   = IOMUX_PAD(0x02BC, 0x005C, 0, 0x0000, 0, 0),
+       MX8MP_PAD_ENET_TD3__AUDIOMIX_SAI6_TX_BCLK                = IOMUX_PAD(0x02BC, 0x005C, 2, 0x0524, 0, 0),
+       MX8MP_PAD_ENET_TD3__GPIO1_IO18                           = IOMUX_PAD(0x02BC, 0x005C, 5, 0x0000, 0, 0),
+       MX8MP_PAD_ENET_TD3__USDHC3_DATA6                         = IOMUX_PAD(0x02BC, 0x005C, 6, 0x0628, 0, 0),
+       MX8MP_PAD_ENET_TD3__SIM_M_HADDR17                        = IOMUX_PAD(0x02BC, 0x005C, 7, 0x0000, 0, 0),
+
+       MX8MP_PAD_ENET_TD2__ENET_QOS_RGMII_TD2                   = IOMUX_PAD(0x02C0, 0x0060, 0, 0x0000, 0, 0),
+       MX8MP_PAD_ENET_TD2__CCM_ENET_QOS_CLOCK_GENERATE_REF_CLK  = IOMUX_PAD(0x02C0, 0x0060, 1, 0x0000, 0, 0),
+       MX8MP_PAD_ENET_TD2__AUDIOMIX_SAI6_RX_DATA00              = IOMUX_PAD(0x02C0, 0x0060, 2, 0x051C, 0, 0),
+       MX8MP_PAD_ENET_TD2__GPIO1_IO19                           = IOMUX_PAD(0x02C0, 0x0060, 5, 0x0000, 0, 0),
+       MX8MP_PAD_ENET_TD2__USDHC3_DATA7                         = IOMUX_PAD(0x02C0, 0x0060, 6, 0x062C, 0, 0),
+       MX8MP_PAD_ENET_TD2__SIM_M_HADDR18                        = IOMUX_PAD(0x02C0, 0x0060, 7, 0x0000, 0, 0),
+
+       MX8MP_PAD_ENET_TD1__ENET_QOS_RGMII_TD1                   = IOMUX_PAD(0x02C4, 0x0064, 0, 0x0000, 0, 0),
+       MX8MP_PAD_ENET_TD1__AUDIOMIX_SAI6_RX_SYNC                = IOMUX_PAD(0x02C4, 0x0064, 2, 0x0520, 0, 0),
+       MX8MP_PAD_ENET_TD1__GPIO1_IO20                           = IOMUX_PAD(0x02C4, 0x0064, 5, 0x0000, 0, 0),
+       MX8MP_PAD_ENET_TD1__USDHC3_CD_B                          = IOMUX_PAD(0x02C4, 0x0064, 6, 0x0608, 1, 0),
+       MX8MP_PAD_ENET_TD1__SIM_M_HADDR19                        = IOMUX_PAD(0x02C4, 0x0064, 7, 0x0000, 0, 0),
+
+       MX8MP_PAD_ENET_TD0__ENET_QOS_RGMII_TD0                   = IOMUX_PAD(0x02C8, 0x0068, 0, 0x0000, 0, 0),
+       MX8MP_PAD_ENET_TD0__AUDIOMIX_SAI6_RX_BCLK                = IOMUX_PAD(0x02C8, 0x0068, 2, 0x0518, 0, 0),
+       MX8MP_PAD_ENET_TD0__GPIO1_IO21                           = IOMUX_PAD(0x02C8, 0x0068, 5, 0x0000, 0, 0),
+       MX8MP_PAD_ENET_TD0__USDHC3_WP                            = IOMUX_PAD(0x02C8, 0x0068, 6, 0x0634, 1, 0),
+       MX8MP_PAD_ENET_TD0__SIM_M_HADDR20                        = IOMUX_PAD(0x02C8, 0x0068, 7, 0x0000, 0, 0),
+
+       MX8MP_PAD_ENET_TX_CTL__ENET_QOS_RGMII_TX_CTL             = IOMUX_PAD(0x02CC, 0x006C, 0, 0x0000, 0, 0),
+       MX8MP_PAD_ENET_TX_CTL__AUDIOMIX_SAI6_MCLK                = IOMUX_PAD(0x02CC, 0x006C, 2, 0x0514, 0, 0),
+       MX8MP_PAD_ENET_TX_CTL__AUDIOMIX_SPDIF_OUT                = IOMUX_PAD(0x02CC, 0x006C, 3, 0x0000, 0, 0),
+       MX8MP_PAD_ENET_TX_CTL__GPIO1_IO22                        = IOMUX_PAD(0x02CC, 0x006C, 5, 0x0000, 0, 0),
+       MX8MP_PAD_ENET_TX_CTL__USDHC3_DATA0                      = IOMUX_PAD(0x02CC, 0x006C, 6, 0x0610, 0, 0),
+       MX8MP_PAD_ENET_TX_CTL__SIM_M_HADDR21                     = IOMUX_PAD(0x02CC, 0x006C, 7, 0x0000, 0, 0),
+
+       MX8MP_PAD_ENET_TXC__CCM_ENET_QOS_CLOCK_GENERATE_TX_CLK   = IOMUX_PAD(0x02D0, 0x0070, 0, 0x0000, 0, 0),
+       MX8MP_PAD_ENET_TXC__ENET_QOS_TX_ER                       = IOMUX_PAD(0x02D0, 0x0070, 1, 0x0000, 0, 0),
+       MX8MP_PAD_ENET_TXC__AUDIOMIX_SAI7_TX_DATA00              = IOMUX_PAD(0x02D0, 0x0070, 2, 0x0000, 0, 0),
+       MX8MP_PAD_ENET_TXC__GPIO1_IO23                           = IOMUX_PAD(0x02D0, 0x0070, 5, 0x0000, 0, 0),
+       MX8MP_PAD_ENET_TXC__USDHC3_DATA1                         = IOMUX_PAD(0x02D0, 0x0070, 6, 0x0614, 0, 0),
+       MX8MP_PAD_ENET_TXC__SIM_M_HADDR22                        = IOMUX_PAD(0x02D0, 0x0070, 7, 0x0000, 0, 0),
+
+       MX8MP_PAD_ENET_RX_CTL__ENET_QOS_RGMII_RX_CTL             = IOMUX_PAD(0x02D4, 0x0074, 0, 0x0000, 0, 0),
+       MX8MP_PAD_ENET_RX_CTL__AUDIOMIX_SAI7_TX_SYNC             = IOMUX_PAD(0x02D4, 0x0074, 2, 0x0540, 0, 0),
+       MX8MP_PAD_ENET_RX_CTL__AUDIOMIX_BIT_STREAM03             = IOMUX_PAD(0x02D4, 0x0074, 3, 0x04CC, 0, 0),
+       MX8MP_PAD_ENET_RX_CTL__GPIO1_IO24                        = IOMUX_PAD(0x02D4, 0x0074, 5, 0x0000, 0, 0),
+       MX8MP_PAD_ENET_RX_CTL__USDHC3_DATA2                      = IOMUX_PAD(0x02D4, 0x0074, 6, 0x0618, 0, 0),
+       MX8MP_PAD_ENET_RX_CTL__SIM_M_HADDR23                     = IOMUX_PAD(0x02D4, 0x0074, 7, 0x0000, 0, 0),
+
+       MX8MP_PAD_ENET_RXC__CCM_ENET_QOS_CLOCK_GENERATE_RX_CLK   = IOMUX_PAD(0x02D8, 0x0078, 0, 0x0000, 0, 0),
+       MX8MP_PAD_ENET_RXC__ENET_QOS_RX_ER                       = IOMUX_PAD(0x02D8, 0x0078, 1, 0x0000, 0, 0),
+       MX8MP_PAD_ENET_RXC__AUDIOMIX_SAI7_TX_BCLK                = IOMUX_PAD(0x02D8, 0x0078, 2, 0x053C, 0, 0),
+       MX8MP_PAD_ENET_RXC__AUDIOMIX_BIT_STREAM02                = IOMUX_PAD(0x02D8, 0x0078, 3, 0x04C8, 0, 0),
+       MX8MP_PAD_ENET_RXC__GPIO1_IO25                           = IOMUX_PAD(0x02D8, 0x0078, 5, 0x0000, 0, 0),
+       MX8MP_PAD_ENET_RXC__USDHC3_DATA3                         = IOMUX_PAD(0x02D8, 0x0078, 6, 0x061C, 0, 0),
+       MX8MP_PAD_ENET_RXC__SIM_M_HADDR24                        = IOMUX_PAD(0x02D8, 0x0078, 7, 0x0000, 0, 0),
+
+       MX8MP_PAD_ENET_RD0__ENET_QOS_RGMII_RD0                   = IOMUX_PAD(0x02DC, 0x007C, 0, 0x0000, 0, 0),
+       MX8MP_PAD_ENET_RD0__AUDIOMIX_SAI7_RX_DATA00              = IOMUX_PAD(0x02DC, 0x007C, 2, 0x0534, 0, 0),
+       MX8MP_PAD_ENET_RD0__AUDIOMIX_BIT_STREAM01                = IOMUX_PAD(0x02DC, 0x007C, 3, 0x04C4, 0, 0),
+       MX8MP_PAD_ENET_RD0__GPIO1_IO26                           = IOMUX_PAD(0x02DC, 0x007C, 5, 0x0000, 0, 0),
+       MX8MP_PAD_ENET_RD0__USDHC3_DATA4                         = IOMUX_PAD(0x02DC, 0x007C, 6, 0x0620, 0, 0),
+       MX8MP_PAD_ENET_RD0__SIM_M_HADDR25                        = IOMUX_PAD(0x02DC, 0x007C, 7, 0x0000, 0, 0),
+
+       MX8MP_PAD_ENET_RD1__ENET_QOS_RGMII_RD1                   = IOMUX_PAD(0x02E0, 0x0080, 0, 0x0000, 0, 0),
+       MX8MP_PAD_ENET_RD1__AUDIOMIX_SAI7_RX_SYNC                = IOMUX_PAD(0x02E0, 0x0080, 2, 0x0538, 0, 0),
+       MX8MP_PAD_ENET_RD1__AUDIOMIX_BIT_STREAM00                = IOMUX_PAD(0x02E0, 0x0080, 3, 0x04C0, 0, 0),
+       MX8MP_PAD_ENET_RD1__GPIO1_IO27                           = IOMUX_PAD(0x02E0, 0x0080, 5, 0x0000, 0, 0),
+       MX8MP_PAD_ENET_RD1__USDHC3_RESET_B                       = IOMUX_PAD(0x02E0, 0x0080, 6, 0x0000, 0, 0),
+       MX8MP_PAD_ENET_RD1__SIM_M_HADDR26                        = IOMUX_PAD(0x02E0, 0x0080, 7, 0x0000, 0, 0),
+
+       MX8MP_PAD_ENET_RD2__ENET_QOS_RGMII_RD2                   = IOMUX_PAD(0x02E4, 0x0084, 0, 0x0000, 0, 0),
+       MX8MP_PAD_ENET_RD2__AUDIOMIX_SAI7_RX_BCLK                = IOMUX_PAD(0x02E4, 0x0084, 2, 0x0530, 0, 0),
+       MX8MP_PAD_ENET_RD2__AUDIOMIX_CLK                         = IOMUX_PAD(0x02E4, 0x0084, 3, 0x0000, 0, 0),
+       MX8MP_PAD_ENET_RD2__GPIO1_IO28                           = IOMUX_PAD(0x02E4, 0x0084, 5, 0x0000, 0, 0),
+       MX8MP_PAD_ENET_RD2__USDHC3_CLK                           = IOMUX_PAD(0x02E4, 0x0084, 6, 0x0604, 0, 0),
+       MX8MP_PAD_ENET_RD2__SIM_M_HADDR27                        = IOMUX_PAD(0x02E4, 0x0084, 7, 0x0000, 0, 0),
+
+       MX8MP_PAD_ENET_RD3__ENET_QOS_RGMII_RD3                   = IOMUX_PAD(0x02E8, 0x0088, 0, 0x0000, 0, 0),
+       MX8MP_PAD_ENET_RD3__AUDIOMIX_SAI7_MCLK                   = IOMUX_PAD(0x02E8, 0x0088, 2, 0x052C, 0, 0),
+       MX8MP_PAD_ENET_RD3__AUDIOMIX_SPDIF_IN                    = IOMUX_PAD(0x02E8, 0x0088, 3, 0x0544, 0, 0),
+       MX8MP_PAD_ENET_RD3__GPIO1_IO29                           = IOMUX_PAD(0x02E8, 0x0088, 5, 0x0000, 0, 0),
+       MX8MP_PAD_ENET_RD3__USDHC3_CMD                           = IOMUX_PAD(0x02E8, 0x0088, 6, 0x060C, 0, 0),
+       MX8MP_PAD_ENET_RD3__SIM_M_HADDR28                        = IOMUX_PAD(0x02E8, 0x0088, 7, 0x0000, 0, 0),
+
+       MX8MP_PAD_SD1_CLK__USDHC1_CLK                            = IOMUX_PAD(0x02EC, 0x008C, 0, 0x0000, 0, 0),
+       MX8MP_PAD_SD1_CLK__ENET1_MDC                             = IOMUX_PAD(0x02EC, 0x008C, 1, 0x0000, 0, 0),
+       MX8MP_PAD_SD1_CLK__I2C5_SCL                              = IOMUX_PAD(0x02EC, 0x008C, 3 | IOMUX_CONFIG_SION, 0x05C4, 0, 0),
+       MX8MP_PAD_SD1_CLK__UART1_DCE_TX                          = IOMUX_PAD(0x02EC, 0x008C, 4, 0x0000, 0, 0),
+       MX8MP_PAD_SD1_CLK__UART1_DTE_RX                          = IOMUX_PAD(0x02EC, 0x008C, 4, 0x05E8, 0, 0),
+       MX8MP_PAD_SD1_CLK__GPIO2_IO00                            = IOMUX_PAD(0x02EC, 0x008C, 5, 0x0000, 0, 0),
+       MX8MP_PAD_SD1_CLK__SIM_M_HADDR29                         = IOMUX_PAD(0x02EC, 0x008C, 7, 0x0000, 0, 0),
+
+       MX8MP_PAD_SD1_CMD__USDHC1_CMD                            = IOMUX_PAD(0x02F0, 0x0090, 0, 0x0000, 0, 0),
+       MX8MP_PAD_SD1_CMD__ENET1_MDIO                            = IOMUX_PAD(0x02F0, 0x0090, 1, 0x057C, 0, 0),
+       MX8MP_PAD_SD1_CMD__I2C5_SDA                              = IOMUX_PAD(0x02F0, 0x0090, 3 | IOMUX_CONFIG_SION, 0x05C8, 0, 0),
+       MX8MP_PAD_SD1_CMD__UART1_DCE_RX                          = IOMUX_PAD(0x02F0, 0x0090, 4, 0x05E8, 1, 0),
+       MX8MP_PAD_SD1_CMD__UART1_DTE_TX                          = IOMUX_PAD(0x02F0, 0x0090, 4, 0x0000, 0, 0),
+       MX8MP_PAD_SD1_CMD__GPIO2_IO01                            = IOMUX_PAD(0x02F0, 0x0090, 5, 0x0000, 0, 0),
+       MX8MP_PAD_SD1_CMD__SIM_M_HADDR30                         = IOMUX_PAD(0x02F0, 0x0090, 7, 0x0000, 0, 0),
+
+       MX8MP_PAD_SD1_DATA0__USDHC1_DATA0                        = IOMUX_PAD(0x02F4, 0x0094, 0, 0x0000, 0, 0),
+       MX8MP_PAD_SD1_DATA0__ENET1_RGMII_TD1                     = IOMUX_PAD(0x02F4, 0x0094, 1, 0x0000, 0, 0),
+       MX8MP_PAD_SD1_DATA0__I2C6_SCL                            = IOMUX_PAD(0x02F4, 0x0094, 3 | IOMUX_CONFIG_SION, 0x05CC, 0, 0),
+       MX8MP_PAD_SD1_DATA0__UART1_DCE_RTS                       = IOMUX_PAD(0x02F4, 0x0094, 4, 0x05E4, 0, 0),
+       MX8MP_PAD_SD1_DATA0__UART1_DTE_CTS                       = IOMUX_PAD(0x02F4, 0x0094, 4, 0x0000, 0, 0),
+       MX8MP_PAD_SD1_DATA0__GPIO2_IO02                          = IOMUX_PAD(0x02F4, 0x0094, 5, 0x0000, 0, 0),
+       MX8MP_PAD_SD1_DATA0__SIM_M_HADDR31                       = IOMUX_PAD(0x02F4, 0x0094, 7, 0x0000, 0, 0),
+
+       MX8MP_PAD_SD1_DATA1__USDHC1_DATA1                        = IOMUX_PAD(0x02F8, 0x0098, 0, 0x0000, 0, 0),
+       MX8MP_PAD_SD1_DATA1__ENET1_RGMII_TD0                     = IOMUX_PAD(0x02F8, 0x0098, 1, 0x0000, 0, 0),
+       MX8MP_PAD_SD1_DATA1__I2C6_SDA                            = IOMUX_PAD(0x02F8, 0x0098, 3 | IOMUX_CONFIG_SION, 0x05D0, 0, 0),
+       MX8MP_PAD_SD1_DATA1__UART1_DCE_CTS                       = IOMUX_PAD(0x02F8, 0x0098, 4, 0x0000, 0, 0),
+       MX8MP_PAD_SD1_DATA1__UART1_DTE_RTS                       = IOMUX_PAD(0x02F8, 0x0098, 4, 0x05E4, 1, 0),
+       MX8MP_PAD_SD1_DATA1__GPIO2_IO03                          = IOMUX_PAD(0x02F8, 0x0098, 5, 0x0000, 0, 0),
+       MX8MP_PAD_SD1_DATA1__SIM_M_HBURST00                      = IOMUX_PAD(0x02F8, 0x0098, 7, 0x0000, 0, 0),
+
+       MX8MP_PAD_SD1_DATA2__USDHC1_DATA2                        = IOMUX_PAD(0x02FC, 0x009C, 0, 0x0000, 0, 0),
+       MX8MP_PAD_SD1_DATA2__ENET1_RGMII_RD0                     = IOMUX_PAD(0x02FC, 0x009C, 1, 0x0580, 0, 0),
+       MX8MP_PAD_SD1_DATA2__I2C4_SCL                            = IOMUX_PAD(0x02FC, 0x009C, 3 | IOMUX_CONFIG_SION, 0x05BC, 0, 0),
+       MX8MP_PAD_SD1_DATA2__UART2_DCE_TX                        = IOMUX_PAD(0x02FC, 0x009C, 4, 0x0000, 0, 0),
+       MX8MP_PAD_SD1_DATA2__UART2_DTE_RX                        = IOMUX_PAD(0x02FC, 0x009C, 4, 0x05F0, 0, 0),
+       MX8MP_PAD_SD1_DATA2__GPIO2_IO04                          = IOMUX_PAD(0x02FC, 0x009C, 5, 0x0000, 0, 0),
+       MX8MP_PAD_SD1_DATA2__SIM_M_HBURST01                      = IOMUX_PAD(0x02FC, 0x009C, 7, 0x0000, 0, 0),
+
+       MX8MP_PAD_SD1_DATA3__USDHC1_DATA3                        = IOMUX_PAD(0x0300, 0x00A0, 0, 0x0000, 0, 0),
+       MX8MP_PAD_SD1_DATA3__ENET1_RGMII_RD1                     = IOMUX_PAD(0x0300, 0x00A0, 1, 0x0584, 0, 0),
+       MX8MP_PAD_SD1_DATA3__I2C4_SDA                            = IOMUX_PAD(0x0300, 0x00A0, 3 | IOMUX_CONFIG_SION, 0x05C0, 0, 0),
+       MX8MP_PAD_SD1_DATA3__UART2_DCE_RX                        = IOMUX_PAD(0x0300, 0x00A0, 4, 0x05F0, 1, 0),
+       MX8MP_PAD_SD1_DATA3__UART2_DTE_TX                        = IOMUX_PAD(0x0300, 0x00A0, 4, 0x0000, 0, 0),
+       MX8MP_PAD_SD1_DATA3__GPIO2_IO05                          = IOMUX_PAD(0x0300, 0x00A0, 5, 0x0000, 0, 0),
+       MX8MP_PAD_SD1_DATA3__SIM_M_HBURST02                      = IOMUX_PAD(0x0300, 0x00A0, 7, 0x0000, 0, 0),
+
+       MX8MP_PAD_SD1_DATA4__USDHC1_DATA4                        = IOMUX_PAD(0x0304, 0x00A4, 0, 0x0000, 0, 0),
+       MX8MP_PAD_SD1_DATA4__ENET1_RGMII_TX_CTL                  = IOMUX_PAD(0x0304, 0x00A4, 1, 0x0000, 0, 0),
+       MX8MP_PAD_SD1_DATA4__I2C1_SCL                            = IOMUX_PAD(0x0304, 0x00A4, 3 | IOMUX_CONFIG_SION, 0x05A4, 0, 0),
+       MX8MP_PAD_SD1_DATA4__UART2_DCE_RTS                       = IOMUX_PAD(0x0304, 0x00A4, 4, 0x05EC, 0, 0),
+       MX8MP_PAD_SD1_DATA4__UART2_DTE_CTS                       = IOMUX_PAD(0x0304, 0x00A4, 4, 0x0000, 0, 0),
+       MX8MP_PAD_SD1_DATA4__GPIO2_IO06                          = IOMUX_PAD(0x0304, 0x00A4, 5, 0x0000, 0, 0),
+       MX8MP_PAD_SD1_DATA4__SIM_M_HRESP                         = IOMUX_PAD(0x0304, 0x00A4, 7, 0x0000, 0, 0),
+
+       MX8MP_PAD_SD1_DATA5__USDHC1_DATA5                        = IOMUX_PAD(0x0308, 0x00A8, 0, 0x0000, 0, 0),
+       MX8MP_PAD_SD1_DATA5__ENET1_TX_ER                         = IOMUX_PAD(0x0308, 0x00A8, 1, 0x0000, 0, 0),
+       MX8MP_PAD_SD1_DATA5__I2C1_SDA                            = IOMUX_PAD(0x0308, 0x00A8, 3 | IOMUX_CONFIG_SION, 0x05A8, 0, 0),
+       MX8MP_PAD_SD1_DATA5__UART2_DCE_CTS                       = IOMUX_PAD(0x0308, 0x00A8, 4, 0x0000, 0, 0),
+       MX8MP_PAD_SD1_DATA5__UART2_DTE_RTS                       = IOMUX_PAD(0x0308, 0x00A8, 4, 0x05EC, 1, 0),
+       MX8MP_PAD_SD1_DATA5__GPIO2_IO07                          = IOMUX_PAD(0x0308, 0x00A8, 5, 0x0000, 0, 0),
+       MX8MP_PAD_SD1_DATA5__TPSMP_HDATA05                       = IOMUX_PAD(0x0308, 0x00A8, 7, 0x0000, 0, 0),
+
+       MX8MP_PAD_SD1_DATA6__USDHC1_DATA6                        = IOMUX_PAD(0x030C, 0x00AC, 0, 0x0000, 0, 0),
+       MX8MP_PAD_SD1_DATA6__ENET1_RGMII_RX_CTL                  = IOMUX_PAD(0x030C, 0x00AC, 1, 0x0588, 0, 0),
+       MX8MP_PAD_SD1_DATA6__I2C2_SCL                            = IOMUX_PAD(0x030C, 0x00AC, 3 | IOMUX_CONFIG_SION, 0x05AC, 0, 0),
+       MX8MP_PAD_SD1_DATA6__UART3_DCE_TX                        = IOMUX_PAD(0x030C, 0x00AC, 4, 0x0000, 0, 0),
+       MX8MP_PAD_SD1_DATA6__UART3_DTE_RX                        = IOMUX_PAD(0x030C, 0x00AC, 4, 0x05F8, 0, 0),
+       MX8MP_PAD_SD1_DATA6__GPIO2_IO08                          = IOMUX_PAD(0x030C, 0x00AC, 5, 0x0000, 0, 0),
+       MX8MP_PAD_SD1_DATA6__TPSMP_HDATA06                       = IOMUX_PAD(0x030C, 0x00AC, 7, 0x0000, 0, 0),
+
+       MX8MP_PAD_SD1_DATA7__USDHC1_DATA7                        = IOMUX_PAD(0x0310, 0x00B0, 0, 0x0000, 0, 0),
+       MX8MP_PAD_SD1_DATA7__ENET1_RX_ER                         = IOMUX_PAD(0x0310, 0x00B0, 1, 0x058C, 0, 0),
+       MX8MP_PAD_SD1_DATA7__I2C2_SDA                            = IOMUX_PAD(0x0310, 0x00B0, 3 | IOMUX_CONFIG_SION, 0x05B0, 0, 0),
+       MX8MP_PAD_SD1_DATA7__UART3_DCE_RX                        = IOMUX_PAD(0x0310, 0x00B0, 4, 0x05F8, 1, 0),
+       MX8MP_PAD_SD1_DATA7__UART3_DTE_TX                        = IOMUX_PAD(0x0310, 0x00B0, 4, 0x0000, 0, 0),
+       MX8MP_PAD_SD1_DATA7__GPIO2_IO09                          = IOMUX_PAD(0x0310, 0x00B0, 5, 0x0000, 0, 0),
+       MX8MP_PAD_SD1_DATA7__TPSMP_HDATA07                       = IOMUX_PAD(0x0310, 0x00B0, 7, 0x0000, 0, 0),
+
+       MX8MP_PAD_SD1_RESET_B__USDHC1_RESET_B                    = IOMUX_PAD(0x0314, 0x00B4, 0, 0x0000, 0, 0),
+       MX8MP_PAD_SD1_RESET_B__ENET1_TX_CLK                      = IOMUX_PAD(0x0314, 0x00B4, 1, 0x0578, 0, 0),
+       MX8MP_PAD_SD1_RESET_B__I2C3_SCL                          = IOMUX_PAD(0x0314, 0x00B4, 3 | IOMUX_CONFIG_SION, 0x05B4, 0, 0),
+       MX8MP_PAD_SD1_RESET_B__UART3_DCE_RTS                     = IOMUX_PAD(0x0314, 0x00B4, 4, 0x05F4, 0, 0),
+       MX8MP_PAD_SD1_RESET_B__UART3_DTE_CTS                     = IOMUX_PAD(0x0314, 0x00B4, 4, 0x0000, 0, 0),
+       MX8MP_PAD_SD1_RESET_B__GPIO2_IO10                        = IOMUX_PAD(0x0314, 0x00B4, 5, 0x0000, 0, 0),
+       MX8MP_PAD_SD1_RESET_B__ECSPI3_TEST_TRIG                  = IOMUX_PAD(0x0314, 0x00B4, 7, 0x0000, 0, 0),
+
+       MX8MP_PAD_SD1_STROBE__USDHC1_STROBE                      = IOMUX_PAD(0x0318, 0x00B8, 0, 0x0000, 0, 0),
+       MX8MP_PAD_SD1_STROBE__I2C3_SDA                           = IOMUX_PAD(0x0318, 0x00B8, 3 | IOMUX_CONFIG_SION, 0x05B8, 0, 0),
+       MX8MP_PAD_SD1_STROBE__UART3_DCE_CTS                      = IOMUX_PAD(0x0318, 0x00B8, 4, 0x0000, 0, 0),
+       MX8MP_PAD_SD1_STROBE__UART3_DTE_RTS                      = IOMUX_PAD(0x0318, 0x00B8, 4, 0x05F4, 1, 0),
+       MX8MP_PAD_SD1_STROBE__GPIO2_IO11                         = IOMUX_PAD(0x0318, 0x00B8, 5, 0x0000, 0, 0),
+       MX8MP_PAD_SD1_STROBE__USDHC3_TEST_TRIG                   = IOMUX_PAD(0x0318, 0x00B8, 7, 0x0000, 0, 0),
+
+       MX8MP_PAD_SD2_CD_B__USDHC2_CD_B                          = IOMUX_PAD(0x031C, 0x00BC, 0, 0x0000, 0, 0),
+       MX8MP_PAD_SD2_CD_B__GPIO2_IO12                           = IOMUX_PAD(0x031C, 0x00BC, 5, 0x0000, 0, 0),
+       MX8MP_PAD_SD2_CD_B__CCMSRCGPCMIX_TESTER_ACK              = IOMUX_PAD(0x031C, 0x00BC, 6, 0x0000, 0, 0),
+
+       MX8MP_PAD_SD2_CLK__USDHC2_CLK                            = IOMUX_PAD(0x0320, 0x00C0, 0, 0x0000, 0, 0),
+       MX8MP_PAD_SD2_CLK__ECSPI2_SCLK                           = IOMUX_PAD(0x0320, 0x00C0, 2, 0x0568, 0, 0),
+       MX8MP_PAD_SD2_CLK__UART4_DCE_RX                          = IOMUX_PAD(0x0320, 0x00C0, 3, 0x0600, 0, 0),
+       MX8MP_PAD_SD2_CLK__UART4_DTE_TX                          = IOMUX_PAD(0x0320, 0x00C0, 3, 0x0000, 0, 0),
+       MX8MP_PAD_SD2_CLK__GPIO2_IO13                            = IOMUX_PAD(0x0320, 0x00C0, 5, 0x0000, 0, 0),
+       MX8MP_PAD_SD2_CLK__CCMSRCGPCMIX_OBSERVE0                 = IOMUX_PAD(0x0320, 0x00C0, 6, 0x0000, 0, 0),
+       MX8MP_PAD_SD2_CLK__OBSERVE_MUX_OUT00                     = IOMUX_PAD(0x0320, 0x00C0, 7, 0x0000, 0, 0),
+
+       MX8MP_PAD_SD2_CMD__USDHC2_CMD                            = IOMUX_PAD(0x0324, 0x00C4, 0, 0x0000, 0, 0),
+       MX8MP_PAD_SD2_CMD__ECSPI2_MOSI                           = IOMUX_PAD(0x0324, 0x00C4, 2, 0x0570, 0, 0),
+       MX8MP_PAD_SD2_CMD__UART4_DCE_TX                          = IOMUX_PAD(0x0324, 0x00C4, 3, 0x0000, 0, 0),
+       MX8MP_PAD_SD2_CMD__UART4_DTE_RX                          = IOMUX_PAD(0x0324, 0x00C4, 3, 0x0600, 1, 0),
+       MX8MP_PAD_SD2_CMD__AUDIOMIX_CLK                          = IOMUX_PAD(0x0324, 0x00C4, 4, 0x0000, 0, 0),
+       MX8MP_PAD_SD2_CMD__GPIO2_IO14                            = IOMUX_PAD(0x0324, 0x00C4, 5, 0x0000, 0, 0),
+       MX8MP_PAD_SD2_CMD__CCMSRCGPCMIX_OBSERVE1                 = IOMUX_PAD(0x0324, 0x00C4, 6, 0x0000, 0, 0),
+       MX8MP_PAD_SD2_CMD__OBSERVE_MUX_OUT01                     = IOMUX_PAD(0x0324, 0x00C4, 7, 0x0000, 0, 0),
+
+       MX8MP_PAD_SD2_DATA0__USDHC2_DATA0                        = IOMUX_PAD(0x0328, 0x00C8, 0, 0x0000, 0, 0),
+       MX8MP_PAD_SD2_DATA0__I2C4_SDA                            = IOMUX_PAD(0x0328, 0x00C8, 2 | IOMUX_CONFIG_SION, 0x05C0, 1, 0),
+       MX8MP_PAD_SD2_DATA0__UART2_DCE_RX                        = IOMUX_PAD(0x0328, 0x00C8, 3, 0x05F0, 2, 0),
+       MX8MP_PAD_SD2_DATA0__UART2_DTE_TX                        = IOMUX_PAD(0x0328, 0x00C8, 3, 0x0000, 0, 0),
+       MX8MP_PAD_SD2_DATA0__AUDIOMIX_BIT_STREAM00               = IOMUX_PAD(0x0328, 0x00C8, 4, 0x04C0, 1, 0),
+       MX8MP_PAD_SD2_DATA0__GPIO2_IO15                          = IOMUX_PAD(0x0328, 0x00C8, 5, 0x0000, 0, 0),
+       MX8MP_PAD_SD2_DATA0__CCMSRCGPCMIX_OBSERVE2               = IOMUX_PAD(0x0328, 0x00C8, 6, 0x0000, 0, 0),
+       MX8MP_PAD_SD2_DATA0__OBSERVE_MUX_OUT02                   = IOMUX_PAD(0x0328, 0x00C8, 7, 0x0000, 0, 0),
+
+       MX8MP_PAD_SD2_DATA1__USDHC2_DATA1                        = IOMUX_PAD(0x032C, 0x00CC, 0, 0x0000, 0, 0),
+       MX8MP_PAD_SD2_DATA1__I2C4_SCL                            = IOMUX_PAD(0x032C, 0x00CC, 2 | IOMUX_CONFIG_SION, 0x05BC, 1, 0),
+       MX8MP_PAD_SD2_DATA1__UART2_DCE_TX                        = IOMUX_PAD(0x032C, 0x00CC, 3, 0x0000, 0, 0),
+       MX8MP_PAD_SD2_DATA1__UART2_DTE_RX                        = IOMUX_PAD(0x032C, 0x00CC, 3, 0x05F0, 3, 0),
+       MX8MP_PAD_SD2_DATA1__AUDIOMIX_BIT_STREAM01               = IOMUX_PAD(0x032C, 0x00CC, 4, 0x04C4, 1, 0),
+       MX8MP_PAD_SD2_DATA1__GPIO2_IO16                          = IOMUX_PAD(0x032C, 0x00CC, 5, 0x0000, 0, 0),
+       MX8MP_PAD_SD2_DATA1__CCMSRCGPCMIX_WAIT                   = IOMUX_PAD(0x032C, 0x00CC, 6, 0x0000, 0, 0),
+       MX8MP_PAD_SD2_DATA1__OBSERVE_MUX_OUT03                   = IOMUX_PAD(0x032C, 0x00CC, 7, 0x0000, 0, 0),
+
+       MX8MP_PAD_SD2_DATA2__USDHC2_DATA2                        = IOMUX_PAD(0x0330, 0x00D0, 0, 0x0000, 0, 0),
+       MX8MP_PAD_SD2_DATA2__ECSPI2_SS0                          = IOMUX_PAD(0x0330, 0x00D0, 2, 0x0574, 0, 0),
+       MX8MP_PAD_SD2_DATA2__AUDIOMIX_SPDIF_OUT                  = IOMUX_PAD(0x0330, 0x00D0, 3, 0x0000, 0, 0),
+       MX8MP_PAD_SD2_DATA2__AUDIOMIX_BIT_STREAM02               = IOMUX_PAD(0x0330, 0x00D0, 4, 0x04C8, 1, 0),
+       MX8MP_PAD_SD2_DATA2__GPIO2_IO17                          = IOMUX_PAD(0x0330, 0x00D0, 5, 0x0000, 0, 0),
+       MX8MP_PAD_SD2_DATA2__CCMSRCGPCMIX_STOP                   = IOMUX_PAD(0x0330, 0x00D0, 6, 0x0000, 0, 0),
+       MX8MP_PAD_SD2_DATA2__OBSERVE_MUX_OUT04                   = IOMUX_PAD(0x0330, 0x00D0, 7, 0x0000, 0, 0),
+
+       MX8MP_PAD_SD2_DATA3__USDHC2_DATA3                        = IOMUX_PAD(0x0334, 0x00D4, 0, 0x0000, 0, 0),
+       MX8MP_PAD_SD2_DATA3__ECSPI2_MISO                         = IOMUX_PAD(0x0334, 0x00D4, 2, 0x056C, 0, 0),
+       MX8MP_PAD_SD2_DATA3__AUDIOMIX_SPDIF_IN                   = IOMUX_PAD(0x0334, 0x00D4, 3, 0x0544, 1, 0),
+       MX8MP_PAD_SD2_DATA3__AUDIOMIX_BIT_STREAM03               = IOMUX_PAD(0x0334, 0x00D4, 4, 0x04CC, 1, 0),
+       MX8MP_PAD_SD2_DATA3__GPIO2_IO18                          = IOMUX_PAD(0x0334, 0x00D4, 5, 0x0000, 0, 0),
+       MX8MP_PAD_SD2_DATA3__CCMSRCGPCMIX_EARLY_RESET            = IOMUX_PAD(0x0334, 0x00D4, 6, 0x0000, 0, 0),
+
+       MX8MP_PAD_SD2_RESET_B__USDHC2_RESET_B                    = IOMUX_PAD(0x0338, 0x00D8, 0, 0x0000, 0, 0),
+       MX8MP_PAD_SD2_RESET_B__GPIO2_IO19                        = IOMUX_PAD(0x0338, 0x00D8, 5, 0x0000, 0, 0),
+       MX8MP_PAD_SD2_RESET_B__CCMSRCGPCMIX_SYSTEM_RESET         = IOMUX_PAD(0x0338, 0x00D8, 6, 0x0000, 0, 0),
+
+       MX8MP_PAD_SD2_WP__USDHC2_WP                              = IOMUX_PAD(0x033C, 0x00DC, 0, 0x0000, 0, 0),
+       MX8MP_PAD_SD2_WP__GPIO2_IO20                             = IOMUX_PAD(0x033C, 0x00DC, 5, 0x0000, 0, 0),
+       MX8MP_PAD_SD2_WP__CORESIGHT_EVENTI                       = IOMUX_PAD(0x033C, 0x00DC, 6, 0x0000, 0, 0),
+       MX8MP_PAD_SD2_WP__SIM_M_HMASTLOCK                        = IOMUX_PAD(0x033C, 0x00DC, 7, 0x0000, 0, 0),
+
+       MX8MP_PAD_NAND_ALE__RAWNAND_ALE                          = IOMUX_PAD(0x0340, 0x00E0, 0, 0x0000, 0, 0),
+       MX8MP_PAD_NAND_ALE__FLEXSPI_A_SCLK                       = IOMUX_PAD(0x0340, 0x00E0, 1, 0x0000, 0, 0),
+       MX8MP_PAD_NAND_ALE__AUDIOMIX_SAI3_TX_BCLK                = IOMUX_PAD(0x0340, 0x00E0, 2, 0x04E8, 0, 0),
+       MX8MP_PAD_NAND_ALE__MEDIAMIX_ISP_FL_TRIG_0               = IOMUX_PAD(0x0340, 0x00E0, 3, 0x05D4, 1, 0),
+       MX8MP_PAD_NAND_ALE__UART3_DCE_RX                         = IOMUX_PAD(0x0340, 0x00E0, 4, 0x05F8, 2, 0),
+       MX8MP_PAD_NAND_ALE__UART3_DTE_TX                         = IOMUX_PAD(0x0340, 0x00E0, 4, 0x0000, 0, 0),
+       MX8MP_PAD_NAND_ALE__GPIO3_IO00                           = IOMUX_PAD(0x0340, 0x00E0, 5, 0x0000, 0, 0),
+       MX8MP_PAD_NAND_ALE__CORESIGHT_TRACE_CLK                  = IOMUX_PAD(0x0340, 0x00E0, 6, 0x0000, 0, 0),
+       MX8MP_PAD_NAND_ALE__SIM_M_HPROT00                        = IOMUX_PAD(0x0340, 0x00E0, 7, 0x0000, 0, 0),
+
+       MX8MP_PAD_NAND_CE0_B__RAWNAND_CE0_B                      = IOMUX_PAD(0x0344, 0x00E4, 0, 0x0000, 0, 0),
+       MX8MP_PAD_NAND_CE0_B__FLEXSPI_A_SS0_B                    = IOMUX_PAD(0x0344, 0x00E4, 1, 0x0000, 0, 0),
+       MX8MP_PAD_NAND_CE0_B__AUDIOMIX_SAI3_TX_DATA00            = IOMUX_PAD(0x0344, 0x00E4, 2, 0x0000, 0, 0),
+       MX8MP_PAD_NAND_CE0_B__MEDIAMIX_ISP_SHUTTER_TRIG_0        = IOMUX_PAD(0x0344, 0x00E4, 3, 0x05DC, 1, 0),
+       MX8MP_PAD_NAND_CE0_B__UART3_DCE_TX                       = IOMUX_PAD(0x0344, 0x00E4, 4, 0x0000, 0, 0),
+       MX8MP_PAD_NAND_CE0_B__UART3_DTE_RX                       = IOMUX_PAD(0x0344, 0x00E4, 4, 0x05F8, 3, 0),
+       MX8MP_PAD_NAND_CE0_B__GPIO3_IO01                         = IOMUX_PAD(0x0344, 0x00E4, 5, 0x0000, 0, 0),
+       MX8MP_PAD_NAND_CE0_B__CORESIGHT_TRACE_CTL                = IOMUX_PAD(0x0344, 0x00E4, 6, 0x0000, 0, 0),
+       MX8MP_PAD_NAND_CE0_B__SIM_M_HPROT01                      = IOMUX_PAD(0x0344, 0x00E4, 7, 0x0000, 0, 0),
+
+       MX8MP_PAD_NAND_CE1_B__RAWNAND_CE1_B                      = IOMUX_PAD(0x0348, 0x00E8, 0, 0x0000, 0, 0),
+       MX8MP_PAD_NAND_CE1_B__FLEXSPI_A_SS1_B                    = IOMUX_PAD(0x0348, 0x00E8, 1, 0x0000, 0, 0),
+       MX8MP_PAD_NAND_CE1_B__USDHC3_STROBE                      = IOMUX_PAD(0x0348, 0x00E8, 2, 0x0630, 1, 0),
+       MX8MP_PAD_NAND_CE1_B__I2C4_SCL                           = IOMUX_PAD(0x0348, 0x00E8, 4 | IOMUX_CONFIG_SION, 0x05BC, 2, 0),
+       MX8MP_PAD_NAND_CE1_B__GPIO3_IO02                         = IOMUX_PAD(0x0348, 0x00E8, 5, 0x0000, 0, 0),
+       MX8MP_PAD_NAND_CE1_B__CORESIGHT_TRACE00                  = IOMUX_PAD(0x0348, 0x00E8, 6, 0x0000, 0, 0),
+       MX8MP_PAD_NAND_CE1_B__SIM_M_HPROT02                      = IOMUX_PAD(0x0348, 0x00E8, 7, 0x0000, 0, 0),
+
+       MX8MP_PAD_NAND_CE2_B__RAWNAND_CE2_B                      = IOMUX_PAD(0x034C, 0x00EC, 0, 0x0000, 0, 0),
+       MX8MP_PAD_NAND_CE2_B__FLEXSPI_B_SS0_B                    = IOMUX_PAD(0x034C, 0x00EC, 1, 0x0000, 0, 0),
+       MX8MP_PAD_NAND_CE2_B__USDHC3_DATA5                       = IOMUX_PAD(0x034C, 0x00EC, 2, 0x0624, 1, 0),
+       MX8MP_PAD_NAND_CE2_B__I2C4_SDA                           = IOMUX_PAD(0x034C, 0x00EC, 4 | IOMUX_CONFIG_SION, 0x05C0, 2, 0),
+       MX8MP_PAD_NAND_CE2_B__GPIO3_IO03                         = IOMUX_PAD(0x034C, 0x00EC, 5, 0x0000, 0, 0),
+       MX8MP_PAD_NAND_CE2_B__CORESIGHT_TRACE01                  = IOMUX_PAD(0x034C, 0x00EC, 6, 0x0000, 0, 0),
+       MX8MP_PAD_NAND_CE2_B__SIM_M_HPROT03                      = IOMUX_PAD(0x034C, 0x00EC, 7, 0x0000, 0, 0),
+
+       MX8MP_PAD_NAND_CE3_B__RAWNAND_CE3_B                      = IOMUX_PAD(0x0350, 0x00F0, 0, 0x0000, 0, 0),
+       MX8MP_PAD_NAND_CE3_B__FLEXSPI_B_SS1_B                    = IOMUX_PAD(0x0350, 0x00F0, 1, 0x0000, 0, 0),
+       MX8MP_PAD_NAND_CE3_B__USDHC3_DATA6                       = IOMUX_PAD(0x0350, 0x00F0, 2, 0x0628, 1, 0),
+       MX8MP_PAD_NAND_CE3_B__I2C3_SDA                           = IOMUX_PAD(0x0350, 0x00F0, 4 | IOMUX_CONFIG_SION, 0x05B8, 1, 0),
+       MX8MP_PAD_NAND_CE3_B__GPIO3_IO04                         = IOMUX_PAD(0x0350, 0x00F0, 5, 0x0000, 0, 0),
+       MX8MP_PAD_NAND_CE3_B__CORESIGHT_TRACE02                  = IOMUX_PAD(0x0350, 0x00F0, 6, 0x0000, 0, 0),
+       MX8MP_PAD_NAND_CE3_B__SIM_M_HADDR00                      = IOMUX_PAD(0x0350, 0x00F0, 7, 0x0000, 0, 0),
+
+       MX8MP_PAD_NAND_CLE__RAWNAND_CLE                          = IOMUX_PAD(0x0354, 0x00F4, 0, 0x0000, 0, 0),
+       MX8MP_PAD_NAND_CLE__FLEXSPI_B_SCLK                       = IOMUX_PAD(0x0354, 0x00F4, 1, 0x0000, 0, 0),
+       MX8MP_PAD_NAND_CLE__USDHC3_DATA7                         = IOMUX_PAD(0x0354, 0x00F4, 2, 0x062C, 1, 0),
+       MX8MP_PAD_NAND_CLE__UART4_DCE_RX                         = IOMUX_PAD(0x0354, 0x00F4, 4, 0x0600, 2, 0),
+       MX8MP_PAD_NAND_CLE__UART4_DTE_TX                         = IOMUX_PAD(0x0354, 0x00F4, 4, 0x0000, 0, 0),
+       MX8MP_PAD_NAND_CLE__GPIO3_IO05                           = IOMUX_PAD(0x0354, 0x00F4, 5, 0x0000, 0, 0),
+       MX8MP_PAD_NAND_CLE__CORESIGHT_TRACE03                    = IOMUX_PAD(0x0354, 0x00F4, 6, 0x0000, 0, 0),
+       MX8MP_PAD_NAND_CLE__SIM_M_HADDR01                        = IOMUX_PAD(0x0354, 0x00F4, 7, 0x0000, 0, 0),
+
+       MX8MP_PAD_NAND_DATA00__RAWNAND_DATA00                    = IOMUX_PAD(0x0358, 0x00F8, 0, 0x0000, 0, 0),
+       MX8MP_PAD_NAND_DATA00__FLEXSPI_A_DATA00                  = IOMUX_PAD(0x0358, 0x00F8, 1, 0x0000, 0, 0),
+       MX8MP_PAD_NAND_DATA00__AUDIOMIX_SAI3_RX_DATA00           = IOMUX_PAD(0x0358, 0x00F8, 2, 0x04E4, 0, 0),
+       MX8MP_PAD_NAND_DATA00__MEDIAMIX_ISP_FLASH_TRIG_0         = IOMUX_PAD(0x0358, 0x00F8, 3, 0x0000, 0, 0),
+       MX8MP_PAD_NAND_DATA00__UART4_DCE_RX                      = IOMUX_PAD(0x0358, 0x00F8, 4, 0x0600, 3, 0),
+       MX8MP_PAD_NAND_DATA00__UART4_DTE_TX                      = IOMUX_PAD(0x0358, 0x00F8, 4, 0x0000, 0, 0),
+       MX8MP_PAD_NAND_DATA00__GPIO3_IO06                        = IOMUX_PAD(0x0358, 0x00F8, 5, 0x0000, 0, 0),
+       MX8MP_PAD_NAND_DATA00__CORESIGHT_TRACE04                 = IOMUX_PAD(0x0358, 0x00F8, 6, 0x0000, 0, 0),
+       MX8MP_PAD_NAND_DATA00__SIM_M_HADDR02                     = IOMUX_PAD(0x0358, 0x00F8, 7, 0x0000, 0, 0),
+
+       MX8MP_PAD_NAND_DATA01__RAWNAND_DATA01                    = IOMUX_PAD(0x035C, 0x00FC, 0, 0x0000, 0, 0),
+       MX8MP_PAD_NAND_DATA01__FLEXSPI_A_DATA01                  = IOMUX_PAD(0x035C, 0x00FC, 1, 0x0000, 0, 0),
+       MX8MP_PAD_NAND_DATA01__AUDIOMIX_SAI3_TX_SYNC             = IOMUX_PAD(0x035C, 0x00FC, 2, 0x04EC, 0, 0),
+       MX8MP_PAD_NAND_DATA01__MEDIAMIX_ISP_PRELIGHT_TRIG_0      = IOMUX_PAD(0x035C, 0x00FC, 3, 0x0000, 0, 0),
+       MX8MP_PAD_NAND_DATA01__UART4_DCE_TX                      = IOMUX_PAD(0x035C, 0x00FC, 4, 0x0000, 0, 0),
+       MX8MP_PAD_NAND_DATA01__UART4_DTE_RX                      = IOMUX_PAD(0x035C, 0x00FC, 4, 0x0600, 4, 0),
+       MX8MP_PAD_NAND_DATA01__GPIO3_IO07                        = IOMUX_PAD(0x035C, 0x00FC, 5, 0x0000, 0, 0),
+       MX8MP_PAD_NAND_DATA01__CORESIGHT_TRACE05                 = IOMUX_PAD(0x035C, 0x00FC, 6, 0x0000, 0, 0),
+       MX8MP_PAD_NAND_DATA01__SIM_M_HADDR03                     = IOMUX_PAD(0x035C, 0x00FC, 7, 0x0000, 0, 0),
+
+       MX8MP_PAD_NAND_DATA02__RAWNAND_DATA02                    = IOMUX_PAD(0x0360, 0x0100, 0, 0x0000, 0, 0),
+       MX8MP_PAD_NAND_DATA02__FLEXSPI_A_DATA02                  = IOMUX_PAD(0x0360, 0x0100, 1, 0x0000, 0, 0),
+       MX8MP_PAD_NAND_DATA02__USDHC3_CD_B                       = IOMUX_PAD(0x0360, 0x0100, 2, 0x0608, 2, 0),
+       MX8MP_PAD_NAND_DATA02__UART4_DCE_CTS                     = IOMUX_PAD(0x0360, 0x0100, 3, 0x0000, 0, 0),
+       MX8MP_PAD_NAND_DATA02__UART4_DTE_RTS                     = IOMUX_PAD(0x0360, 0x0100, 3, 0x05FC, 0, 0),
+       MX8MP_PAD_NAND_DATA02__I2C4_SDA                          = IOMUX_PAD(0x0360, 0x0100, 4 | IOMUX_CONFIG_SION, 0x05C0, 3, 0),
+       MX8MP_PAD_NAND_DATA02__GPIO3_IO08                        = IOMUX_PAD(0x0360, 0x0100, 5, 0x0000, 0, 0),
+       MX8MP_PAD_NAND_DATA02__CORESIGHT_TRACE06                 = IOMUX_PAD(0x0360, 0x0100, 6, 0x0000, 0, 0),
+       MX8MP_PAD_NAND_DATA02__SIM_M_HADDR04                     = IOMUX_PAD(0x0360, 0x0100, 7, 0x0000, 0, 0),
+
+       MX8MP_PAD_NAND_DATA03__RAWNAND_DATA03                    = IOMUX_PAD(0x0364, 0x0104, 0, 0x0000, 0, 0),
+       MX8MP_PAD_NAND_DATA03__FLEXSPI_A_DATA03                  = IOMUX_PAD(0x0364, 0x0104, 1, 0x0000, 0, 0),
+       MX8MP_PAD_NAND_DATA03__USDHC3_WP                         = IOMUX_PAD(0x0364, 0x0104, 2, 0x0634, 2, 0),
+       MX8MP_PAD_NAND_DATA03__UART4_DCE_RTS                     = IOMUX_PAD(0x0364, 0x0104, 3, 0x05FC, 1, 0),
+       MX8MP_PAD_NAND_DATA03__UART4_DTE_CTS                     = IOMUX_PAD(0x0364, 0x0104, 3, 0x0000, 0, 0),
+       MX8MP_PAD_NAND_DATA03__MEDIAMIX_ISP_FL_TRIG_1            = IOMUX_PAD(0x0364, 0x0104, 4, 0x05D8, 1, 0),
+       MX8MP_PAD_NAND_DATA03__GPIO3_IO09                        = IOMUX_PAD(0x0364, 0x0104, 5, 0x0000, 0, 0),
+       MX8MP_PAD_NAND_DATA03__CORESIGHT_TRACE07                 = IOMUX_PAD(0x0364, 0x0104, 6, 0x0000, 0, 0),
+       MX8MP_PAD_NAND_DATA03__SIM_M_HADDR05                     = IOMUX_PAD(0x0364, 0x0104, 7, 0x0000, 0, 0),
+
+       MX8MP_PAD_NAND_DATA04__RAWNAND_DATA04                    = IOMUX_PAD(0x0368, 0x0108, 0, 0x0000, 0, 0),
+       MX8MP_PAD_NAND_DATA04__FLEXSPI_B_DATA00                  = IOMUX_PAD(0x0368, 0x0108, 1, 0x0000, 0, 0),
+       MX8MP_PAD_NAND_DATA04__USDHC3_DATA0                      = IOMUX_PAD(0x0368, 0x0108, 2, 0x0610, 1, 0),
+       MX8MP_PAD_NAND_DATA04__FLEXSPI_A_DATA04                  = IOMUX_PAD(0x0368, 0x0108, 3, 0x0000, 0, 0),
+       MX8MP_PAD_NAND_DATA04__MEDIAMIX_ISP_SHUTTER_TRIG_1       = IOMUX_PAD(0x0368, 0x0108, 4, 0x05E0, 1, 0),
+       MX8MP_PAD_NAND_DATA04__GPIO3_IO10                        = IOMUX_PAD(0x0368, 0x0108, 5, 0x0000, 0, 0),
+       MX8MP_PAD_NAND_DATA04__CORESIGHT_TRACE08                 = IOMUX_PAD(0x0368, 0x0108, 6, 0x0000, 0, 0),
+       MX8MP_PAD_NAND_DATA04__SIM_M_HADDR06                     = IOMUX_PAD(0x0368, 0x0108, 7, 0x0000, 0, 0),
+
+       MX8MP_PAD_NAND_DATA05__RAWNAND_DATA05                    = IOMUX_PAD(0x036C, 0x010C, 0, 0x0000, 0, 0),
+       MX8MP_PAD_NAND_DATA05__FLEXSPI_B_DATA01                  = IOMUX_PAD(0x036C, 0x010C, 1, 0x0000, 0, 0),
+       MX8MP_PAD_NAND_DATA05__USDHC3_DATA1                      = IOMUX_PAD(0x036C, 0x010C, 2, 0x0614, 1, 0),
+       MX8MP_PAD_NAND_DATA05__FLEXSPI_A_DATA05                  = IOMUX_PAD(0x036C, 0x010C, 3, 0x0000, 0, 0),
+       MX8MP_PAD_NAND_DATA05__MEDIAMIX_ISP_FLASH_TRIG_1         = IOMUX_PAD(0x036C, 0x010C, 4, 0x0000, 0, 0),
+       MX8MP_PAD_NAND_DATA05__GPIO3_IO11                        = IOMUX_PAD(0x036C, 0x010C, 5, 0x0000, 0, 0),
+       MX8MP_PAD_NAND_DATA05__CORESIGHT_TRACE09                 = IOMUX_PAD(0x036C, 0x010C, 6, 0x0000, 0, 0),
+       MX8MP_PAD_NAND_DATA05__SIM_M_HADDR07                     = IOMUX_PAD(0x036C, 0x010C, 7, 0x0000, 0, 0),
+
+       MX8MP_PAD_NAND_DATA06__RAWNAND_DATA06                    = IOMUX_PAD(0x0370, 0x0110, 0, 0x0000, 0, 0),
+       MX8MP_PAD_NAND_DATA06__FLEXSPI_B_DATA02                  = IOMUX_PAD(0x0370, 0x0110, 1, 0x0000, 0, 0),
+       MX8MP_PAD_NAND_DATA06__USDHC3_DATA2                      = IOMUX_PAD(0x0370, 0x0110, 2, 0x0618, 1, 0),
+       MX8MP_PAD_NAND_DATA06__FLEXSPI_A_DATA06                  = IOMUX_PAD(0x0370, 0x0110, 3, 0x0000, 0, 0),
+       MX8MP_PAD_NAND_DATA06__MEDIAMIX_ISP_PRELIGHT_TRIG_1      = IOMUX_PAD(0x0370, 0x0110, 4, 0x0000, 0, 0),
+       MX8MP_PAD_NAND_DATA06__GPIO3_IO12                        = IOMUX_PAD(0x0370, 0x0110, 5, 0x0000, 0, 0),
+       MX8MP_PAD_NAND_DATA06__CORESIGHT_TRACE10                 = IOMUX_PAD(0x0370, 0x0110, 6, 0x0000, 0, 0),
+       MX8MP_PAD_NAND_DATA06__SIM_M_HADDR08                     = IOMUX_PAD(0x0370, 0x0110, 7, 0x0000, 0, 0),
+
+       MX8MP_PAD_NAND_DATA07__RAWNAND_DATA07                    = IOMUX_PAD(0x0374, 0x0114, 0, 0x0000, 0, 0),
+       MX8MP_PAD_NAND_DATA07__FLEXSPI_B_DATA03                  = IOMUX_PAD(0x0374, 0x0114, 1, 0x0000, 0, 0),
+       MX8MP_PAD_NAND_DATA07__USDHC3_DATA3                      = IOMUX_PAD(0x0374, 0x0114, 2, 0x061C, 1, 0),
+       MX8MP_PAD_NAND_DATA07__FLEXSPI_A_DATA07                  = IOMUX_PAD(0x0374, 0x0114, 3, 0x0000, 0, 0),
+       MX8MP_PAD_NAND_DATA07__MEDIAMIX_ISP_SHUTTER_OPEN_1       = IOMUX_PAD(0x0374, 0x0114, 4, 0x0000, 0, 0),
+       MX8MP_PAD_NAND_DATA07__GPIO3_IO13                        = IOMUX_PAD(0x0374, 0x0114, 5, 0x0000, 0, 0),
+       MX8MP_PAD_NAND_DATA07__CORESIGHT_TRACE11                 = IOMUX_PAD(0x0374, 0x0114, 6, 0x0000, 0, 0),
+       MX8MP_PAD_NAND_DATA07__SIM_M_HADDR09                     = IOMUX_PAD(0x0374, 0x0114, 7, 0x0000, 0, 0),
+
+       MX8MP_PAD_NAND_DQS__RAWNAND_DQS                          = IOMUX_PAD(0x0378, 0x0118, 0, 0x0000, 0, 0),
+       MX8MP_PAD_NAND_DQS__FLEXSPI_A_DQS                        = IOMUX_PAD(0x0378, 0x0118, 1, 0x0000, 0, 0),
+       MX8MP_PAD_NAND_DQS__AUDIOMIX_SAI3_MCLK                   = IOMUX_PAD(0x0378, 0x0118, 2, 0x04E0, 0, 0),
+       MX8MP_PAD_NAND_DQS__MEDIAMIX_ISP_SHUTTER_OPEN_0          = IOMUX_PAD(0x0378, 0x0118, 3, 0x0000, 0, 0),
+       MX8MP_PAD_NAND_DQS__I2C3_SCL                             = IOMUX_PAD(0x0378, 0x0118, 4 | IOMUX_CONFIG_SION, 0x05B4, 1, 0),
+       MX8MP_PAD_NAND_DQS__GPIO3_IO14                           = IOMUX_PAD(0x0378, 0x0118, 5, 0x0000, 0, 0),
+       MX8MP_PAD_NAND_DQS__CORESIGHT_TRACE12                    = IOMUX_PAD(0x0378, 0x0118, 6, 0x0000, 0, 0),
+       MX8MP_PAD_NAND_DQS__SIM_M_HADDR10                        = IOMUX_PAD(0x0378, 0x0118, 7, 0x0000, 0, 0),
+
+       MX8MP_PAD_NAND_RE_B__RAWNAND_RE_B                        = IOMUX_PAD(0x037C, 0x011C, 0, 0x0000, 0, 0),
+       MX8MP_PAD_NAND_RE_B__FLEXSPI_B_DQS                       = IOMUX_PAD(0x037C, 0x011C, 1, 0x0000, 0, 0),
+       MX8MP_PAD_NAND_RE_B__USDHC3_DATA4                        = IOMUX_PAD(0x037C, 0x011C, 2, 0x0620, 1, 0),
+       MX8MP_PAD_NAND_RE_B__UART4_DCE_TX                        = IOMUX_PAD(0x037C, 0x011C, 4, 0x0000, 0, 0),
+       MX8MP_PAD_NAND_RE_B__UART4_DTE_RX                        = IOMUX_PAD(0x037C, 0x011C, 4, 0x0600, 5, 0),
+       MX8MP_PAD_NAND_RE_B__GPIO3_IO15                          = IOMUX_PAD(0x037C, 0x011C, 5, 0x0000, 0, 0),
+       MX8MP_PAD_NAND_RE_B__CORESIGHT_TRACE13                   = IOMUX_PAD(0x037C, 0x011C, 6, 0x0000, 0, 0),
+       MX8MP_PAD_NAND_RE_B__SIM_M_HADDR11                       = IOMUX_PAD(0x037C, 0x011C, 7, 0x0000, 0, 0),
+
+       MX8MP_PAD_NAND_READY_B__RAWNAND_READY_B                  = IOMUX_PAD(0x0380, 0x0120, 0, 0x0000, 0, 0),
+       MX8MP_PAD_NAND_READY_B__USDHC3_RESET_B                   = IOMUX_PAD(0x0380, 0x0120, 2, 0x0000, 0, 0),
+       MX8MP_PAD_NAND_READY_B__I2C3_SCL                         = IOMUX_PAD(0x0380, 0x0120, 4 | IOMUX_CONFIG_SION, 0x05B4, 2, 0),
+       MX8MP_PAD_NAND_READY_B__GPIO3_IO16                       = IOMUX_PAD(0x0380, 0x0120, 5, 0x0000, 0, 0),
+       MX8MP_PAD_NAND_READY_B__CORESIGHT_TRACE14                = IOMUX_PAD(0x0380, 0x0120, 6, 0x0000, 0, 0),
+       MX8MP_PAD_NAND_READY_B__SIM_M_HADDR12                    = IOMUX_PAD(0x0380, 0x0120, 7, 0x0000, 0, 0),
+
+       MX8MP_PAD_NAND_WE_B__RAWNAND_WE_B                        = IOMUX_PAD(0x0384, 0x0124, 0, 0x0000, 0, 0),
+       MX8MP_PAD_NAND_WE_B__USDHC3_CLK                          = IOMUX_PAD(0x0384, 0x0124, 2, 0x0604, 1, 0),
+       MX8MP_PAD_NAND_WE_B__I2C3_SDA                            = IOMUX_PAD(0x0384, 0x0124, 4 | IOMUX_CONFIG_SION, 0x05B8, 2, 0),
+       MX8MP_PAD_NAND_WE_B__GPIO3_IO17                          = IOMUX_PAD(0x0384, 0x0124, 5, 0x0000, 0, 0),
+       MX8MP_PAD_NAND_WE_B__CORESIGHT_TRACE15                   = IOMUX_PAD(0x0384, 0x0124, 6, 0x0000, 0, 0),
+       MX8MP_PAD_NAND_WE_B__SIM_M_HADDR13                       = IOMUX_PAD(0x0384, 0x0124, 7, 0x0000, 0, 0),
+
+       MX8MP_PAD_NAND_WP_B__RAWNAND_WP_B                        = IOMUX_PAD(0x0388, 0x0128, 0, 0x0000, 0, 0),
+       MX8MP_PAD_NAND_WP_B__USDHC3_CMD                          = IOMUX_PAD(0x0388, 0x0128, 2, 0x060C, 1, 0),
+       MX8MP_PAD_NAND_WP_B__I2C4_SCL                            = IOMUX_PAD(0x0388, 0x0128, 4 | IOMUX_CONFIG_SION, 0x05BC, 3, 0),
+       MX8MP_PAD_NAND_WP_B__GPIO3_IO18                          = IOMUX_PAD(0x0388, 0x0128, 5, 0x0000, 0, 0),
+       MX8MP_PAD_NAND_WP_B__CORESIGHT_EVENTO                    = IOMUX_PAD(0x0388, 0x0128, 6, 0x0000, 0, 0),
+       MX8MP_PAD_NAND_WP_B__SIM_M_HADDR14                       = IOMUX_PAD(0x0388, 0x0128, 7, 0x0000, 0, 0),
+
+       MX8MP_PAD_SAI5_RXFS__AUDIOMIX_SAI5_RX_SYNC               = IOMUX_PAD(0x038C, 0x012C, 0, 0x0508, 0, 0),
+       MX8MP_PAD_SAI5_RXFS__AUDIOMIX_SAI1_TX_DATA00             = IOMUX_PAD(0x038C, 0x012C, 1, 0x0000, 0, 0),
+       MX8MP_PAD_SAI5_RXFS__PWM4_OUT                            = IOMUX_PAD(0x038C, 0x012C, 2, 0x0000, 0, 0),
+       MX8MP_PAD_SAI5_RXFS__I2C6_SCL                            = IOMUX_PAD(0x038C, 0x012C, 3 | IOMUX_CONFIG_SION, 0x05CC, 1, 0),
+       MX8MP_PAD_SAI5_RXFS__GPIO3_IO19                          = IOMUX_PAD(0x038C, 0x012C, 5, 0x0000, 0, 0),
+
+       MX8MP_PAD_SAI5_RXC__AUDIOMIX_SAI5_RX_BCLK                = IOMUX_PAD(0x0390, 0x0130, 0, 0x04F4, 0, 0),
+       MX8MP_PAD_SAI5_RXC__AUDIOMIX_SAI1_TX_DATA01              = IOMUX_PAD(0x0390, 0x0130, 1, 0x0000, 0, 0),
+       MX8MP_PAD_SAI5_RXC__PWM3_OUT                             = IOMUX_PAD(0x0390, 0x0130, 2, 0x0000, 0, 0),
+       MX8MP_PAD_SAI5_RXC__I2C6_SDA                             = IOMUX_PAD(0x0390, 0x0130, 3 | IOMUX_CONFIG_SION, 0x05D0, 1, 0),
+       MX8MP_PAD_SAI5_RXC__AUDIOMIX_CLK                         = IOMUX_PAD(0x0390, 0x0130, 4, 0x0000, 0, 0),
+       MX8MP_PAD_SAI5_RXC__GPIO3_IO20                           = IOMUX_PAD(0x0390, 0x0130, 5, 0x0000, 0, 0),
+
+       MX8MP_PAD_SAI5_RXD0__AUDIOMIX_SAI5_RX_DATA00             = IOMUX_PAD(0x0394, 0x0134, 0, 0x04F8, 0, 0),
+       MX8MP_PAD_SAI5_RXD0__AUDIOMIX_SAI1_TX_DATA02             = IOMUX_PAD(0x0394, 0x0134, 1, 0x0000, 0, 0),
+       MX8MP_PAD_SAI5_RXD0__PWM2_OUT                            = IOMUX_PAD(0x0394, 0x0134, 2, 0x0000, 0, 0),
+       MX8MP_PAD_SAI5_RXD0__I2C5_SCL                            = IOMUX_PAD(0x0394, 0x0134, 3 | IOMUX_CONFIG_SION, 0x05C4, 1, 0),
+       MX8MP_PAD_SAI5_RXD0__AUDIOMIX_BIT_STREAM00               = IOMUX_PAD(0x0394, 0x0134, 4, 0x04C0, 2, 0),
+       MX8MP_PAD_SAI5_RXD0__GPIO3_IO21                          = IOMUX_PAD(0x0394, 0x0134, 5, 0x0000, 0, 0),
+
+       MX8MP_PAD_SAI5_RXD1__AUDIOMIX_SAI5_RX_DATA01             = IOMUX_PAD(0x0398, 0x0138, 0, 0x04FC, 0, 0),
+       MX8MP_PAD_SAI5_RXD1__AUDIOMIX_SAI1_TX_DATA03             = IOMUX_PAD(0x0398, 0x0138, 1, 0x0000, 0, 0),
+       MX8MP_PAD_SAI5_RXD1__AUDIOMIX_SAI1_TX_SYNC               = IOMUX_PAD(0x0398, 0x0138, 2, 0x04D8, 0, 0),
+       MX8MP_PAD_SAI5_RXD1__AUDIOMIX_SAI5_TX_SYNC               = IOMUX_PAD(0x0398, 0x0138, 3, 0x0510, 0, 0),
+       MX8MP_PAD_SAI5_RXD1__AUDIOMIX_BIT_STREAM01               = IOMUX_PAD(0x0398, 0x0138, 4, 0x04C4, 2, 0),
+       MX8MP_PAD_SAI5_RXD1__GPIO3_IO22                          = IOMUX_PAD(0x0398, 0x0138, 5, 0x0000, 0, 0),
+       MX8MP_PAD_SAI5_RXD1__CAN1_TX                             = IOMUX_PAD(0x0398, 0x0138, 6, 0x0000, 0, 0),
+
+       MX8MP_PAD_SAI5_RXD2__AUDIOMIX_SAI5_RX_DATA02             = IOMUX_PAD(0x039C, 0x013C, 0, 0x0500, 0, 0),
+       MX8MP_PAD_SAI5_RXD2__AUDIOMIX_SAI1_TX_DATA04             = IOMUX_PAD(0x039C, 0x013C, 1, 0x0000, 0, 0),
+       MX8MP_PAD_SAI5_RXD2__AUDIOMIX_SAI1_TX_SYNC               = IOMUX_PAD(0x039C, 0x013C, 2, 0x04D8, 1, 0),
+       MX8MP_PAD_SAI5_RXD2__AUDIOMIX_SAI5_TX_BCLK               = IOMUX_PAD(0x039C, 0x013C, 3, 0x050C, 0, 0),
+       MX8MP_PAD_SAI5_RXD2__AUDIOMIX_BIT_STREAM02               = IOMUX_PAD(0x039C, 0x013C, 4, 0x04C8, 2, 0),
+       MX8MP_PAD_SAI5_RXD2__GPIO3_IO23                          = IOMUX_PAD(0x039C, 0x013C, 5, 0x0000, 0, 0),
+       MX8MP_PAD_SAI5_RXD2__CAN1_RX                             = IOMUX_PAD(0x039C, 0x013C, 6, 0x054C, 0, 0),
+
+       MX8MP_PAD_SAI5_RXD3__AUDIOMIX_SAI5_RX_DATA03             = IOMUX_PAD(0x03A0, 0x0140, 0, 0x0504, 0, 0),
+       MX8MP_PAD_SAI5_RXD3__AUDIOMIX_SAI1_TX_DATA05             = IOMUX_PAD(0x03A0, 0x0140, 1, 0x0000, 0, 0),
+       MX8MP_PAD_SAI5_RXD3__AUDIOMIX_SAI1_TX_SYNC               = IOMUX_PAD(0x03A0, 0x0140, 2, 0x04D8, 2, 0),
+       MX8MP_PAD_SAI5_RXD3__AUDIOMIX_SAI5_TX_DATA00             = IOMUX_PAD(0x03A0, 0x0140, 3, 0x0000, 0, 0),
+       MX8MP_PAD_SAI5_RXD3__AUDIOMIX_BIT_STREAM03               = IOMUX_PAD(0x03A0, 0x0140, 4, 0x04CC, 2, 0),
+       MX8MP_PAD_SAI5_RXD3__GPIO3_IO24                          = IOMUX_PAD(0x03A0, 0x0140, 5, 0x0000, 0, 0),
+       MX8MP_PAD_SAI5_RXD3__CAN2_TX                             = IOMUX_PAD(0x03A0, 0x0140, 6, 0x0000, 0, 0),
+
+       MX8MP_PAD_SAI5_MCLK__AUDIOMIX_SAI5_MCLK                  = IOMUX_PAD(0x03A4, 0x0144, 0, 0x04F0, 0, 0),
+       MX8MP_PAD_SAI5_MCLK__AUDIOMIX_SAI1_TX_BCLK               = IOMUX_PAD(0x03A4, 0x0144, 1, 0x04D4, 0, 0),
+       MX8MP_PAD_SAI5_MCLK__PWM1_OUT                            = IOMUX_PAD(0x03A4, 0x0144, 2, 0x0000, 0, 0),
+       MX8MP_PAD_SAI5_MCLK__I2C5_SDA                            = IOMUX_PAD(0x03A4, 0x0144, 3 | IOMUX_CONFIG_SION, 0x05C8, 1, 0),
+       MX8MP_PAD_SAI5_MCLK__GPIO3_IO25                          = IOMUX_PAD(0x03A4, 0x0144, 5, 0x0000, 0, 0),
+       MX8MP_PAD_SAI5_MCLK__CAN2_RX                             = IOMUX_PAD(0x03A4, 0x0144, 6, 0x0550, 0, 0),
+
+       MX8MP_PAD_SAI1_RXFS__AUDIOMIX_SAI1_RX_SYNC               = IOMUX_PAD(0x03A8, 0x0148, 0, 0x04D0, 0, 0),
+       MX8MP_PAD_SAI1_RXFS__AUDIOMIX_SAI5_RX_SYNC               = IOMUX_PAD(0x03A8, 0x0148, 1, 0x0508, 1, 0),
+       MX8MP_PAD_SAI1_RXFS__ENET1_1588_EVENT0_IN                = IOMUX_PAD(0x03A8, 0x0148, 4, 0x0000, 0, 0),
+       MX8MP_PAD_SAI1_RXFS__GPIO4_IO00                          = IOMUX_PAD(0x03A8, 0x0148, 5, 0x0000, 0, 0),
+
+       MX8MP_PAD_SAI1_RXC__AUDIOMIX_SAI1_RX_BCLK                = IOMUX_PAD(0x03AC, 0x014C, 0, 0x0000, 0, 0),
+       MX8MP_PAD_SAI1_RXC__AUDIOMIX_SAI5_RX_BCLK                = IOMUX_PAD(0x03AC, 0x014C, 1, 0x04F4, 1, 0),
+       MX8MP_PAD_SAI1_RXC__AUDIOMIX_CLK                         = IOMUX_PAD(0x03AC, 0x014C, 3, 0x0000, 0, 0),
+       MX8MP_PAD_SAI1_RXC__ENET1_1588_EVENT0_OUT                = IOMUX_PAD(0x03AC, 0x014C, 4, 0x0000, 0, 0),
+       MX8MP_PAD_SAI1_RXC__GPIO4_IO01                           = IOMUX_PAD(0x03AC, 0x014C, 5, 0x0000, 0, 0),
+
+       MX8MP_PAD_SAI1_RXD0__AUDIOMIX_SAI1_RX_DATA00             = IOMUX_PAD(0x03B0, 0x0150, 0, 0x0000, 0, 0),
+       MX8MP_PAD_SAI1_RXD0__AUDIOMIX_SAI5_RX_DATA00             = IOMUX_PAD(0x03B0, 0x0150, 1, 0x04F8, 1, 0),
+       MX8MP_PAD_SAI1_RXD0__AUDIOMIX_SAI1_TX_DATA01             = IOMUX_PAD(0x03B0, 0x0150, 2, 0x0000, 0, 0),
+       MX8MP_PAD_SAI1_RXD0__AUDIOMIX_BIT_STREAM00               = IOMUX_PAD(0x03B0, 0x0150, 3, 0x04C0, 3, 0),
+       MX8MP_PAD_SAI1_RXD0__ENET1_1588_EVENT1_IN                = IOMUX_PAD(0x03B0, 0x0150, 4, 0x0000, 0, 0),
+       MX8MP_PAD_SAI1_RXD0__GPIO4_IO02                          = IOMUX_PAD(0x03B0, 0x0150, 5, 0x0000, 0, 0),
+
+       MX8MP_PAD_SAI1_RXD1__AUDIOMIX_SAI1_RX_DATA01             = IOMUX_PAD(0x03B4, 0x0154, 0, 0x0000, 0, 0),
+       MX8MP_PAD_SAI1_RXD1__AUDIOMIX_SAI5_RX_DATA01             = IOMUX_PAD(0x03B4, 0x0154, 1, 0x04FC, 1, 0),
+       MX8MP_PAD_SAI1_RXD1__AUDIOMIX_BIT_STREAM01               = IOMUX_PAD(0x03B4, 0x0154, 3, 0x04C4, 3, 0),
+       MX8MP_PAD_SAI1_RXD1__ENET1_1588_EVENT1_OUT               = IOMUX_PAD(0x03B4, 0x0154, 4, 0x0000, 0, 0),
+       MX8MP_PAD_SAI1_RXD1__GPIO4_IO03                          = IOMUX_PAD(0x03B4, 0x0154, 5, 0x0000, 0, 0),
+
+       MX8MP_PAD_SAI1_RXD2__AUDIOMIX_SAI1_RX_DATA02             = IOMUX_PAD(0x03B8, 0x0158, 0, 0x0000, 0, 0),
+       MX8MP_PAD_SAI1_RXD2__AUDIOMIX_SAI5_RX_DATA02             = IOMUX_PAD(0x03B8, 0x0158, 1, 0x0500, 1, 0),
+       MX8MP_PAD_SAI1_RXD2__AUDIOMIX_BIT_STREAM02               = IOMUX_PAD(0x03B8, 0x0158, 3, 0x04C8, 3, 0),
+       MX8MP_PAD_SAI1_RXD2__ENET1_MDC                           = IOMUX_PAD(0x03B8, 0x0158, 4, 0x0000, 0, 0),
+       MX8MP_PAD_SAI1_RXD2__GPIO4_IO04                          = IOMUX_PAD(0x03B8, 0x0158, 5, 0x0000, 0, 0),
+
+       MX8MP_PAD_SAI1_RXD3__AUDIOMIX_SAI1_RX_DATA03             = IOMUX_PAD(0x03BC, 0x015C, 0, 0x0000, 0, 0),
+       MX8MP_PAD_SAI1_RXD3__AUDIOMIX_SAI5_RX_DATA03             = IOMUX_PAD(0x03BC, 0x015C, 1, 0x0504, 1, 0),
+       MX8MP_PAD_SAI1_RXD3__AUDIOMIX_BIT_STREAM03               = IOMUX_PAD(0x03BC, 0x015C, 3, 0x04CC, 3, 0),
+       MX8MP_PAD_SAI1_RXD3__ENET1_MDIO                          = IOMUX_PAD(0x03BC, 0x015C, 4, 0x057C, 1, 0),
+       MX8MP_PAD_SAI1_RXD3__GPIO4_IO05                          = IOMUX_PAD(0x03BC, 0x015C, 5, 0x0000, 0, 0),
+
+       MX8MP_PAD_SAI1_RXD4__AUDIOMIX_SAI1_RX_DATA04             = IOMUX_PAD(0x03C0, 0x0160, 0, 0x0000, 0, 0),
+       MX8MP_PAD_SAI1_RXD4__AUDIOMIX_SAI6_TX_BCLK               = IOMUX_PAD(0x03C0, 0x0160, 1, 0x0524, 1, 0),
+       MX8MP_PAD_SAI1_RXD4__AUDIOMIX_SAI6_RX_BCLK               = IOMUX_PAD(0x03C0, 0x0160, 2, 0x0518, 1, 0),
+       MX8MP_PAD_SAI1_RXD4__ENET1_RGMII_RD0                     = IOMUX_PAD(0x03C0, 0x0160, 4, 0x0580, 1, 0),
+       MX8MP_PAD_SAI1_RXD4__GPIO4_IO06                          = IOMUX_PAD(0x03C0, 0x0160, 5, 0x0000, 0, 0),
+
+       MX8MP_PAD_SAI1_RXD5__AUDIOMIX_SAI1_RX_DATA05             = IOMUX_PAD(0x03C4, 0x0164, 0, 0x0000, 0, 0),
+       MX8MP_PAD_SAI1_RXD5__AUDIOMIX_SAI6_TX_DATA00             = IOMUX_PAD(0x03C4, 0x0164, 1, 0x0000, 0, 0),
+       MX8MP_PAD_SAI1_RXD5__AUDIOMIX_SAI6_RX_DATA00             = IOMUX_PAD(0x03C4, 0x0164, 2, 0x051C, 1, 0),
+       MX8MP_PAD_SAI1_RXD5__AUDIOMIX_SAI1_RX_SYNC               = IOMUX_PAD(0x03C4, 0x0164, 3, 0x04D0, 1, 0),
+       MX8MP_PAD_SAI1_RXD5__ENET1_RGMII_RD1                     = IOMUX_PAD(0x03C4, 0x0164, 4, 0x0584, 1, 0),
+       MX8MP_PAD_SAI1_RXD5__GPIO4_IO07                          = IOMUX_PAD(0x03C4, 0x0164, 5, 0x0000, 0, 0),
+
+       MX8MP_PAD_SAI1_RXD6__AUDIOMIX_SAI1_RX_DATA06             = IOMUX_PAD(0x03C8, 0x0168, 0, 0x0000, 0, 0),
+       MX8MP_PAD_SAI1_RXD6__AUDIOMIX_SAI6_TX_SYNC               = IOMUX_PAD(0x03C8, 0x0168, 1, 0x0528, 1, 0),
+       MX8MP_PAD_SAI1_RXD6__AUDIOMIX_SAI6_RX_SYNC               = IOMUX_PAD(0x03C8, 0x0168, 2, 0x0520, 1, 0),
+       MX8MP_PAD_SAI1_RXD6__ENET1_RGMII_RD2                     = IOMUX_PAD(0x03C8, 0x0168, 4, 0x0000, 0, 0),
+       MX8MP_PAD_SAI1_RXD6__GPIO4_IO08                          = IOMUX_PAD(0x03C8, 0x0168, 5, 0x0000, 0, 0),
+
+       MX8MP_PAD_SAI1_RXD7__AUDIOMIX_SAI1_RX_DATA07             = IOMUX_PAD(0x03CC, 0x016C, 0, 0x0000, 0, 0),
+       MX8MP_PAD_SAI1_RXD7__AUDIOMIX_SAI6_MCLK                  = IOMUX_PAD(0x03CC, 0x016C, 1, 0x0514, 1, 0),
+       MX8MP_PAD_SAI1_RXD7__AUDIOMIX_SAI1_TX_SYNC               = IOMUX_PAD(0x03CC, 0x016C, 2, 0x04D8, 3, 0),
+       MX8MP_PAD_SAI1_RXD7__AUDIOMIX_SAI1_TX_DATA04             = IOMUX_PAD(0x03CC, 0x016C, 3, 0x0000, 0, 0),
+       MX8MP_PAD_SAI1_RXD7__ENET1_RGMII_RD3                     = IOMUX_PAD(0x03CC, 0x016C, 4, 0x0000, 0, 0),
+       MX8MP_PAD_SAI1_RXD7__GPIO4_IO09                          = IOMUX_PAD(0x03CC, 0x016C, 5, 0x0000, 0, 0),
+
+       MX8MP_PAD_SAI1_TXFS__AUDIOMIX_SAI1_TX_SYNC               = IOMUX_PAD(0x03D0, 0x0170, 0, 0x04D8, 4, 0),
+       MX8MP_PAD_SAI1_TXFS__AUDIOMIX_SAI5_TX_SYNC               = IOMUX_PAD(0x03D0, 0x0170, 1, 0x0510, 1, 0),
+       MX8MP_PAD_SAI1_TXFS__ENET1_RGMII_RX_CTL                  = IOMUX_PAD(0x03D0, 0x0170, 4, 0x0588, 1, 0),
+       MX8MP_PAD_SAI1_TXFS__GPIO4_IO10                          = IOMUX_PAD(0x03D0, 0x0170, 5, 0x0000, 0, 0),
+
+       MX8MP_PAD_SAI1_TXC__AUDIOMIX_SAI1_TX_BCLK                = IOMUX_PAD(0x03D4, 0x0174, 0, 0x04D4, 1, 0),
+       MX8MP_PAD_SAI1_TXC__AUDIOMIX_SAI5_TX_BCLK                = IOMUX_PAD(0x03D4, 0x0174, 1, 0x050C, 1, 0),
+       MX8MP_PAD_SAI1_TXC__ENET1_RGMII_RXC                      = IOMUX_PAD(0x03D4, 0x0174, 4, 0x0000, 0, 0),
+       MX8MP_PAD_SAI1_TXC__GPIO4_IO11                           = IOMUX_PAD(0x03D4, 0x0174, 5, 0x0000, 0, 0),
+
+       MX8MP_PAD_SAI1_TXD0__AUDIOMIX_SAI1_TX_DATA00             = IOMUX_PAD(0x03D8, 0x0178, 0, 0x0000, 0, 0),
+       MX8MP_PAD_SAI1_TXD0__AUDIOMIX_SAI5_TX_DATA00             = IOMUX_PAD(0x03D8, 0x0178, 1, 0x0000, 0, 0),
+       MX8MP_PAD_SAI1_TXD0__ENET1_RGMII_TD0                     = IOMUX_PAD(0x03D8, 0x0178, 4, 0x0000, 0, 0),
+       MX8MP_PAD_SAI1_TXD0__GPIO4_IO12                          = IOMUX_PAD(0x03D8, 0x0178, 5, 0x0000, 0, 0),
+
+       MX8MP_PAD_SAI1_TXD1__AUDIOMIX_SAI1_TX_DATA01             = IOMUX_PAD(0x03DC, 0x017C, 0, 0x0000, 0, 0),
+       MX8MP_PAD_SAI1_TXD1__AUDIOMIX_SAI5_TX_DATA01             = IOMUX_PAD(0x03DC, 0x017C, 1, 0x0000, 0, 0),
+       MX8MP_PAD_SAI1_TXD1__ENET1_RGMII_TD1                     = IOMUX_PAD(0x03DC, 0x017C, 4, 0x0000, 0, 0),
+       MX8MP_PAD_SAI1_TXD1__GPIO4_IO13                          = IOMUX_PAD(0x03DC, 0x017C, 5, 0x0000, 0, 0),
+
+       MX8MP_PAD_SAI1_TXD2__AUDIOMIX_SAI1_TX_DATA02             = IOMUX_PAD(0x03E0, 0x0180, 0, 0x0000, 0, 0),
+       MX8MP_PAD_SAI1_TXD2__AUDIOMIX_SAI5_TX_DATA02             = IOMUX_PAD(0x03E0, 0x0180, 1, 0x0000, 0, 0),
+       MX8MP_PAD_SAI1_TXD2__ENET1_RGMII_TD2                     = IOMUX_PAD(0x03E0, 0x0180, 4, 0x0000, 0, 0),
+       MX8MP_PAD_SAI1_TXD2__GPIO4_IO14                          = IOMUX_PAD(0x03E0, 0x0180, 5, 0x0000, 0, 0),
+
+       MX8MP_PAD_SAI1_TXD3__AUDIOMIX_SAI1_TX_DATA03             = IOMUX_PAD(0x03E4, 0x0184, 0, 0x0000, 0, 0),
+       MX8MP_PAD_SAI1_TXD3__AUDIOMIX_SAI5_TX_DATA03             = IOMUX_PAD(0x03E4, 0x0184, 1, 0x0000, 0, 0),
+       MX8MP_PAD_SAI1_TXD3__ENET1_RGMII_TD3                     = IOMUX_PAD(0x03E4, 0x0184, 4, 0x0000, 0, 0),
+       MX8MP_PAD_SAI1_TXD3__GPIO4_IO15                          = IOMUX_PAD(0x03E4, 0x0184, 5, 0x0000, 0, 0),
+
+       MX8MP_PAD_SAI1_TXD4__AUDIOMIX_SAI1_TX_DATA04             = IOMUX_PAD(0x03E8, 0x0188, 0, 0x0000, 0, 0),
+       MX8MP_PAD_SAI1_TXD4__AUDIOMIX_SAI6_RX_BCLK               = IOMUX_PAD(0x03E8, 0x0188, 1, 0x0518, 2, 0),
+       MX8MP_PAD_SAI1_TXD4__AUDIOMIX_SAI6_TX_BCLK               = IOMUX_PAD(0x03E8, 0x0188, 2, 0x0524, 2, 0),
+       MX8MP_PAD_SAI1_TXD4__ENET1_RGMII_TX_CTL                  = IOMUX_PAD(0x03E8, 0x0188, 4, 0x0000, 0, 0),
+       MX8MP_PAD_SAI1_TXD4__GPIO4_IO16                          = IOMUX_PAD(0x03E8, 0x0188, 5, 0x0000, 0, 0),
+
+       MX8MP_PAD_SAI1_TXD5__AUDIOMIX_SAI1_TX_DATA05             = IOMUX_PAD(0x03EC, 0x018C, 0, 0x0000, 0, 0),
+       MX8MP_PAD_SAI1_TXD5__AUDIOMIX_SAI6_RX_DATA00             = IOMUX_PAD(0x03EC, 0x018C, 1, 0x051C, 2, 0),
+       MX8MP_PAD_SAI1_TXD5__AUDIOMIX_SAI6_TX_DATA00             = IOMUX_PAD(0x03EC, 0x018C, 2, 0x0000, 0, 0),
+       MX8MP_PAD_SAI1_TXD5__ENET1_RGMII_TXC                     = IOMUX_PAD(0x03EC, 0x018C, 4, 0x0000, 0, 0),
+       MX8MP_PAD_SAI1_TXD5__GPIO4_IO17                          = IOMUX_PAD(0x03EC, 0x018C, 5, 0x0000, 0, 0),
+
+       MX8MP_PAD_SAI1_TXD6__AUDIOMIX_SAI1_TX_DATA06             = IOMUX_PAD(0x03F0, 0x0190, 0, 0x0000, 0, 0),
+       MX8MP_PAD_SAI1_TXD6__AUDIOMIX_SAI6_RX_SYNC               = IOMUX_PAD(0x03F0, 0x0190, 1, 0x0520, 2, 0),
+       MX8MP_PAD_SAI1_TXD6__AUDIOMIX_SAI6_TX_SYNC               = IOMUX_PAD(0x03F0, 0x0190, 2, 0x0528, 2, 0),
+       MX8MP_PAD_SAI1_TXD6__ENET1_RX_ER                         = IOMUX_PAD(0x03F0, 0x0190, 4, 0x058C, 1, 0),
+       MX8MP_PAD_SAI1_TXD6__GPIO4_IO18                          = IOMUX_PAD(0x03F0, 0x0190, 5, 0x0000, 0, 0),
+
+       MX8MP_PAD_SAI1_TXD7__AUDIOMIX_SAI1_TX_DATA07             = IOMUX_PAD(0x03F4, 0x0194, 0, 0x0000, 0, 0),
+       MX8MP_PAD_SAI1_TXD7__AUDIOMIX_SAI6_MCLK                  = IOMUX_PAD(0x03F4, 0x0194, 1, 0x0514, 2, 0),
+       MX8MP_PAD_SAI1_TXD7__AUDIOMIX_CLK                        = IOMUX_PAD(0x03F4, 0x0194, 3, 0x0000, 0, 0),
+       MX8MP_PAD_SAI1_TXD7__ENET1_TX_ER                         = IOMUX_PAD(0x03F4, 0x0194, 4, 0x0000, 0, 0),
+       MX8MP_PAD_SAI1_TXD7__GPIO4_IO19                          = IOMUX_PAD(0x03F4, 0x0194, 5, 0x0000, 0, 0),
+
+       MX8MP_PAD_SAI1_MCLK__AUDIOMIX_SAI1_MCLK                  = IOMUX_PAD(0x03F8, 0x0198, 0, 0x0000, 0, 0),
+       MX8MP_PAD_SAI1_MCLK__AUDIOMIX_SAI5_MCLK                  = IOMUX_PAD(0x03F8, 0x0198, 1, 0x04F0, 1, 0),
+       MX8MP_PAD_SAI1_MCLK__AUDIOMIX_SAI1_TX_BCLK               = IOMUX_PAD(0x03F8, 0x0198, 2, 0x04D4, 2, 0),
+       MX8MP_PAD_SAI1_MCLK__ENET1_TX_CLK                        = IOMUX_PAD(0x03F8, 0x0198, 4, 0x0578, 1, 0),
+       MX8MP_PAD_SAI1_MCLK__GPIO4_IO20                          = IOMUX_PAD(0x03F8, 0x0198, 5, 0x0000, 0, 0),
+
+       MX8MP_PAD_SAI2_RXFS__AUDIOMIX_SAI2_RX_SYNC               = IOMUX_PAD(0x03FC, 0x019C, 0, 0x0000, 0, 0),
+       MX8MP_PAD_SAI2_RXFS__AUDIOMIX_SAI5_TX_SYNC               = IOMUX_PAD(0x03FC, 0x019C, 1, 0x0510, 2, 0),
+       MX8MP_PAD_SAI2_RXFS__AUDIOMIX_SAI5_TX_DATA01             = IOMUX_PAD(0x03FC, 0x019C, 2, 0x0000, 0, 0),
+       MX8MP_PAD_SAI2_RXFS__AUDIOMIX_SAI2_RX_DATA01             = IOMUX_PAD(0x03FC, 0x019C, 3, 0x04DC, 0, 0),
+       MX8MP_PAD_SAI2_RXFS__UART1_DCE_TX                        = IOMUX_PAD(0x03FC, 0x019C, 4, 0x0000, 0, 0),
+       MX8MP_PAD_SAI2_RXFS__UART1_DTE_RX                        = IOMUX_PAD(0x03FC, 0x019C, 4, 0x05E8, 2, 0),
+       MX8MP_PAD_SAI2_RXFS__GPIO4_IO21                          = IOMUX_PAD(0x03FC, 0x019C, 5, 0x0000, 0, 0),
+       MX8MP_PAD_SAI2_RXFS__AUDIOMIX_BIT_STREAM02               = IOMUX_PAD(0x03FC, 0x019C, 6, 0x04C8, 4, 0),
+       MX8MP_PAD_SAI2_RXFS__SIM_M_HSIZE00                       = IOMUX_PAD(0x03FC, 0x019C, 7, 0x0000, 0, 0),
+
+       MX8MP_PAD_SAI2_RXC__AUDIOMIX_SAI2_RX_BCLK                = IOMUX_PAD(0x0400, 0x01A0, 0, 0x0000, 0, 0),
+       MX8MP_PAD_SAI2_RXC__AUDIOMIX_SAI5_TX_BCLK                = IOMUX_PAD(0x0400, 0x01A0, 1, 0x050C, 2, 0),
+       MX8MP_PAD_SAI2_RXC__CAN1_TX                              = IOMUX_PAD(0x0400, 0x01A0, 3, 0x0000, 0, 0),
+       MX8MP_PAD_SAI2_RXC__UART1_DCE_RX                         = IOMUX_PAD(0x0400, 0x01A0, 4, 0x05E8, 3, 0),
+       MX8MP_PAD_SAI2_RXC__UART1_DTE_TX                         = IOMUX_PAD(0x0400, 0x01A0, 4, 0x0000, 0, 0),
+       MX8MP_PAD_SAI2_RXC__GPIO4_IO22                           = IOMUX_PAD(0x0400, 0x01A0, 5, 0x0000, 0, 0),
+       MX8MP_PAD_SAI2_RXC__AUDIOMIX_BIT_STREAM01                = IOMUX_PAD(0x0400, 0x01A0, 6, 0x04C4, 4, 0),
+       MX8MP_PAD_SAI2_RXC__SIM_M_HSIZE01                        = IOMUX_PAD(0x0400, 0x01A0, 7, 0x0000, 0, 0),
+
+       MX8MP_PAD_SAI2_RXD0__AUDIOMIX_SAI2_RX_DATA00             = IOMUX_PAD(0x0404, 0x01A4, 0, 0x0000, 0, 0),
+       MX8MP_PAD_SAI2_RXD0__AUDIOMIX_SAI5_TX_DATA00             = IOMUX_PAD(0x0404, 0x01A4, 1, 0x0000, 0, 0),
+       MX8MP_PAD_SAI2_RXD0__ENET_QOS_1588_EVENT2_OUT            = IOMUX_PAD(0x0404, 0x01A4, 2, 0x0000, 0, 0),
+       MX8MP_PAD_SAI2_RXD0__AUDIOMIX_SAI2_TX_DATA01             = IOMUX_PAD(0x0404, 0x01A4, 3, 0x0000, 0, 0),
+       MX8MP_PAD_SAI2_RXD0__UART1_DCE_RTS                       = IOMUX_PAD(0x0404, 0x01A4, 4, 0x05E4, 2, 0),
+       MX8MP_PAD_SAI2_RXD0__UART1_DTE_CTS                       = IOMUX_PAD(0x0404, 0x01A4, 4, 0x0000, 0, 0),
+       MX8MP_PAD_SAI2_RXD0__GPIO4_IO23                          = IOMUX_PAD(0x0404, 0x01A4, 5, 0x0000, 0, 0),
+       MX8MP_PAD_SAI2_RXD0__AUDIOMIX_BIT_STREAM03               = IOMUX_PAD(0x0404, 0x01A4, 6, 0x04CC, 4, 0),
+       MX8MP_PAD_SAI2_RXD0__SIM_M_HSIZE02                       = IOMUX_PAD(0x0404, 0x01A4, 7, 0x0000, 0, 0),
+
+       MX8MP_PAD_SAI2_TXFS__AUDIOMIX_SAI2_TX_SYNC               = IOMUX_PAD(0x0408, 0x01A8, 0, 0x0000, 0, 0),
+       MX8MP_PAD_SAI2_TXFS__AUDIOMIX_SAI5_TX_DATA01             = IOMUX_PAD(0x0408, 0x01A8, 1, 0x0000, 0, 0),
+       MX8MP_PAD_SAI2_TXFS__ENET_QOS_1588_EVENT3_OUT            = IOMUX_PAD(0x0408, 0x01A8, 2, 0x0000, 0, 0),
+       MX8MP_PAD_SAI2_TXFS__AUDIOMIX_SAI2_TX_DATA01             = IOMUX_PAD(0x0408, 0x01A8, 3, 0x0000, 0, 0),
+       MX8MP_PAD_SAI2_TXFS__UART1_DCE_CTS                       = IOMUX_PAD(0x0408, 0x01A8, 4, 0x0000, 0, 0),
+       MX8MP_PAD_SAI2_TXFS__UART1_DTE_RTS                       = IOMUX_PAD(0x0408, 0x01A8, 4, 0x05E4, 3, 0),
+       MX8MP_PAD_SAI2_TXFS__GPIO4_IO24                          = IOMUX_PAD(0x0408, 0x01A8, 5, 0x0000, 0, 0),
+       MX8MP_PAD_SAI2_TXFS__AUDIOMIX_BIT_STREAM02               = IOMUX_PAD(0x0408, 0x01A8, 6, 0x04C8, 5, 0),
+       MX8MP_PAD_SAI2_TXFS__SIM_M_HWRITE                        = IOMUX_PAD(0x0408, 0x01A8, 7, 0x0000, 0, 0),
+
+       MX8MP_PAD_SAI2_TXC__AUDIOMIX_SAI2_TX_BCLK                = IOMUX_PAD(0x040C, 0x01AC, 0, 0x0000, 0, 0),
+       MX8MP_PAD_SAI2_TXC__AUDIOMIX_SAI5_TX_DATA02              = IOMUX_PAD(0x040C, 0x01AC, 1, 0x0000, 0, 0),
+       MX8MP_PAD_SAI2_TXC__CAN1_RX                              = IOMUX_PAD(0x040C, 0x01AC, 3, 0x054C, 1, 0),
+       MX8MP_PAD_SAI2_TXC__GPIO4_IO25                           = IOMUX_PAD(0x040C, 0x01AC, 5, 0x0000, 0, 0),
+       MX8MP_PAD_SAI2_TXC__AUDIOMIX_BIT_STREAM01                = IOMUX_PAD(0x040C, 0x01AC, 6, 0x04C4, 5, 0),
+       MX8MP_PAD_SAI2_TXC__SIM_M_HREADYOUT                      = IOMUX_PAD(0x040C, 0x01AC, 7, 0x0000, 0, 0),
+
+       MX8MP_PAD_SAI2_TXD0__AUDIOMIX_SAI2_TX_DATA00             = IOMUX_PAD(0x0410, 0x01B0, 0, 0x0000, 0, 0),
+       MX8MP_PAD_SAI2_TXD0__AUDIOMIX_SAI5_TX_DATA03             = IOMUX_PAD(0x0410, 0x01B0, 1, 0x0000, 0, 0),
+       MX8MP_PAD_SAI2_TXD0__ENET_QOS_1588_EVENT2_IN             = IOMUX_PAD(0x0410, 0x01B0, 2, 0x0000, 0, 0),
+       MX8MP_PAD_SAI2_TXD0__CAN2_TX                             = IOMUX_PAD(0x0410, 0x01B0, 3, 0x0000, 0, 0),
+       MX8MP_PAD_SAI2_TXD0__ENET_QOS_1588_EVENT2_AUX_IN         = IOMUX_PAD(0x0410, 0x01B0, 4, 0x0000, 0, 0),
+       MX8MP_PAD_SAI2_TXD0__GPIO4_IO26                          = IOMUX_PAD(0x0410, 0x01B0, 5, 0x0000, 0, 0),
+       MX8MP_PAD_SAI2_TXD0__CCMSRCGPCMIX_BOOT_MODE04            = IOMUX_PAD(0x0410, 0x01B0, 6, 0x0000, 0, 0),
+       MX8MP_PAD_SAI2_TXD0__TPSMP_CLK                           = IOMUX_PAD(0x0410, 0x01B0, 7, 0x0000, 0, 0),
+
+       MX8MP_PAD_SAI2_MCLK__AUDIOMIX_SAI2_MCLK                  = IOMUX_PAD(0x0414, 0x01B4, 0, 0x0000, 0, 0),
+       MX8MP_PAD_SAI2_MCLK__AUDIOMIX_SAI5_MCLK                  = IOMUX_PAD(0x0414, 0x01B4, 1, 0x04F0, 2, 0),
+       MX8MP_PAD_SAI2_MCLK__ENET_QOS_1588_EVENT3_IN             = IOMUX_PAD(0x0414, 0x01B4, 2, 0x0000, 0, 0),
+       MX8MP_PAD_SAI2_MCLK__CAN2_RX                             = IOMUX_PAD(0x0414, 0x01B4, 3, 0x0550, 1, 0),
+       MX8MP_PAD_SAI2_MCLK__ENET_QOS_1588_EVENT3_AUX_IN         = IOMUX_PAD(0x0414, 0x01B4, 4, 0x0000, 0, 0),
+       MX8MP_PAD_SAI2_MCLK__GPIO4_IO27                          = IOMUX_PAD(0x0414, 0x01B4, 5, 0x0000, 0, 0),
+       MX8MP_PAD_SAI2_MCLK__AUDIOMIX_SAI3_MCLK                  = IOMUX_PAD(0x0414, 0x01B4, 6, 0x04E0, 1, 0),
+       MX8MP_PAD_SAI2_MCLK__TPSMP_HDATA_DIR                     = IOMUX_PAD(0x0414, 0x01B4, 7, 0x0000, 0, 0),
+
+       MX8MP_PAD_SAI3_RXFS__AUDIOMIX_SAI3_RX_SYNC               = IOMUX_PAD(0x0418, 0x01B8, 0, 0x0000, 0, 0),
+       MX8MP_PAD_SAI3_RXFS__AUDIOMIX_SAI2_RX_DATA01             = IOMUX_PAD(0x0418, 0x01B8, 1, 0x04DC, 1, 0),
+       MX8MP_PAD_SAI3_RXFS__AUDIOMIX_SAI5_RX_SYNC               = IOMUX_PAD(0x0418, 0x01B8, 2, 0x0508, 2, 0),
+       MX8MP_PAD_SAI3_RXFS__AUDIOMIX_SAI3_RX_DATA01             = IOMUX_PAD(0x0418, 0x01B8, 3, 0x0000, 0, 0),
+       MX8MP_PAD_SAI3_RXFS__AUDIOMIX_SPDIF_IN                   = IOMUX_PAD(0x0418, 0x01B8, 4, 0x0544, 2, 0),
+       MX8MP_PAD_SAI3_RXFS__GPIO4_IO28                          = IOMUX_PAD(0x0418, 0x01B8, 5, 0x0000, 0, 0),
+       MX8MP_PAD_SAI3_RXFS__AUDIOMIX_BIT_STREAM00               = IOMUX_PAD(0x0418, 0x01B8, 6, 0x04C0, 4, 0),
+       MX8MP_PAD_SAI3_RXFS__TPSMP_HTRANS00                      = IOMUX_PAD(0x0418, 0x01B8, 7, 0x0000, 0, 0),
+
+       MX8MP_PAD_SAI3_RXC__AUDIOMIX_SAI3_RX_BCLK                = IOMUX_PAD(0x041C, 0x01BC, 0, 0x0000, 0, 0),
+       MX8MP_PAD_SAI3_RXC__AUDIOMIX_SAI2_RX_DATA02              = IOMUX_PAD(0x041C, 0x01BC, 1, 0x0000, 0, 0),
+       MX8MP_PAD_SAI3_RXC__AUDIOMIX_SAI5_RX_BCLK                = IOMUX_PAD(0x041C, 0x01BC, 2, 0x04F4, 2, 0),
+       MX8MP_PAD_SAI3_RXC__GPT1_CLK                             = IOMUX_PAD(0x041C, 0x01BC, 3, 0x059C, 0, 0),
+       MX8MP_PAD_SAI3_RXC__UART2_DCE_CTS                        = IOMUX_PAD(0x041C, 0x01BC, 4, 0x0000, 0, 0),
+       MX8MP_PAD_SAI3_RXC__UART2_DTE_RTS                        = IOMUX_PAD(0x041C, 0x01BC, 4, 0x05EC, 2, 0),
+       MX8MP_PAD_SAI3_RXC__GPIO4_IO29                           = IOMUX_PAD(0x041C, 0x01BC, 5, 0x0000, 0, 0),
+       MX8MP_PAD_SAI3_RXC__AUDIOMIX_CLK                         = IOMUX_PAD(0x041C, 0x01BC, 6, 0x0000, 0, 0),
+       MX8MP_PAD_SAI3_RXC__TPSMP_HTRANS01                       = IOMUX_PAD(0x041C, 0x01BC, 7, 0x0000, 0, 0),
+
+       MX8MP_PAD_SAI3_RXD__AUDIOMIX_SAI3_RX_DATA00              = IOMUX_PAD(0x0420, 0x01C0, 0, 0x04E4, 1, 0),
+       MX8MP_PAD_SAI3_RXD__AUDIOMIX_SAI2_RX_DATA03              = IOMUX_PAD(0x0420, 0x01C0, 1, 0x0000, 0, 0),
+       MX8MP_PAD_SAI3_RXD__AUDIOMIX_SAI5_RX_DATA00              = IOMUX_PAD(0x0420, 0x01C0, 2, 0x04F8, 2, 0),
+       MX8MP_PAD_SAI3_RXD__UART2_DCE_RTS                        = IOMUX_PAD(0x0420, 0x01C0, 4, 0x05EC, 3, 0),
+       MX8MP_PAD_SAI3_RXD__UART2_DTE_CTS                        = IOMUX_PAD(0x0420, 0x01C0, 4, 0x0000, 0, 0),
+       MX8MP_PAD_SAI3_RXD__GPIO4_IO30                           = IOMUX_PAD(0x0420, 0x01C0, 5, 0x0000, 0, 0),
+       MX8MP_PAD_SAI3_RXD__AUDIOMIX_BIT_STREAM01                = IOMUX_PAD(0x0420, 0x01C0, 6, 0x04C4, 6, 0),
+       MX8MP_PAD_SAI3_RXD__TPSMP_HDATA00                        = IOMUX_PAD(0x0420, 0x01C0, 7, 0x0000, 0, 0),
+
+       MX8MP_PAD_SAI3_TXFS__AUDIOMIX_SAI3_TX_SYNC               = IOMUX_PAD(0x0424, 0x01C4, 0, 0x04EC, 1, 0),
+       MX8MP_PAD_SAI3_TXFS__AUDIOMIX_SAI2_TX_DATA01             = IOMUX_PAD(0x0424, 0x01C4, 1, 0x0000, 0, 0),
+       MX8MP_PAD_SAI3_TXFS__AUDIOMIX_SAI5_RX_DATA01             = IOMUX_PAD(0x0424, 0x01C4, 2, 0x04FC, 2, 0),
+       MX8MP_PAD_SAI3_TXFS__AUDIOMIX_SAI3_TX_DATA01             = IOMUX_PAD(0x0424, 0x01C4, 3, 0x0000, 0, 0),
+       MX8MP_PAD_SAI3_TXFS__UART2_DCE_RX                        = IOMUX_PAD(0x0424, 0x01C4, 4, 0x05F0, 4, 0),
+       MX8MP_PAD_SAI3_TXFS__UART2_DTE_TX                        = IOMUX_PAD(0x0424, 0x01C4, 4, 0x0000, 0, 0),
+       MX8MP_PAD_SAI3_TXFS__GPIO4_IO31                          = IOMUX_PAD(0x0424, 0x01C4, 5, 0x0000, 0, 0),
+       MX8MP_PAD_SAI3_TXFS__AUDIOMIX_BIT_STREAM03               = IOMUX_PAD(0x0424, 0x01C4, 6, 0x04CC, 5, 0),
+       MX8MP_PAD_SAI3_TXFS__TPSMP_HDATA01                       = IOMUX_PAD(0x0424, 0x01C4, 7, 0x0000, 0, 0),
+
+       MX8MP_PAD_SAI3_TXC__AUDIOMIX_SAI3_TX_BCLK                = IOMUX_PAD(0x0428, 0x01C8, 0, 0x04E8, 1, 0),
+       MX8MP_PAD_SAI3_TXC__AUDIOMIX_SAI2_TX_DATA02              = IOMUX_PAD(0x0428, 0x01C8, 1, 0x0000, 0, 0),
+       MX8MP_PAD_SAI3_TXC__AUDIOMIX_SAI5_RX_DATA02              = IOMUX_PAD(0x0428, 0x01C8, 2, 0x0500, 2, 0),
+       MX8MP_PAD_SAI3_TXC__GPT1_CAPTURE1                        = IOMUX_PAD(0x0428, 0x01C8, 3, 0x0594, 0, 0),
+       MX8MP_PAD_SAI3_TXC__UART2_DCE_TX                         = IOMUX_PAD(0x0428, 0x01C8, 4, 0x0000, 0, 0),
+       MX8MP_PAD_SAI3_TXC__UART2_DTE_RX                         = IOMUX_PAD(0x0428, 0x01C8, 4, 0x05F0, 5, 0),
+       MX8MP_PAD_SAI3_TXC__GPIO5_IO00                           = IOMUX_PAD(0x0428, 0x01C8, 5, 0x0000, 0, 0),
+       MX8MP_PAD_SAI3_TXC__AUDIOMIX_BIT_STREAM02                = IOMUX_PAD(0x0428, 0x01C8, 6, 0x04C8, 6, 0),
+       MX8MP_PAD_SAI3_TXC__TPSMP_HDATA02                        = IOMUX_PAD(0x0428, 0x01C8, 7, 0x0000, 0, 0),
+
+       MX8MP_PAD_SAI3_TXD__AUDIOMIX_SAI3_TX_DATA00              = IOMUX_PAD(0x042C, 0x01CC, 0, 0x0000, 0, 0),
+       MX8MP_PAD_SAI3_TXD__AUDIOMIX_SAI2_TX_DATA03              = IOMUX_PAD(0x042C, 0x01CC, 1, 0x0000, 0, 0),
+       MX8MP_PAD_SAI3_TXD__AUDIOMIX_SAI5_RX_DATA03              = IOMUX_PAD(0x042C, 0x01CC, 2, 0x0504, 2, 0),
+       MX8MP_PAD_SAI3_TXD__GPT1_CAPTURE2                        = IOMUX_PAD(0x042C, 0x01CC, 3, 0x0598, 0, 0),
+       MX8MP_PAD_SAI3_TXD__AUDIOMIX_SPDIF_EXT_CLK               = IOMUX_PAD(0x042C, 0x01CC, 4, 0x0548, 0, 0),
+       MX8MP_PAD_SAI3_TXD__GPIO5_IO01                           = IOMUX_PAD(0x042C, 0x01CC, 5, 0x0000, 0, 0),
+       MX8MP_PAD_SAI3_TXD__CCMSRCGPCMIX_BOOT_MODE05             = IOMUX_PAD(0x042C, 0x01CC, 6, 0x0000, 0, 0),
+       MX8MP_PAD_SAI3_TXD__TPSMP_HDATA03                        = IOMUX_PAD(0x042C, 0x01CC, 7, 0x0000, 0, 0),
+
+       MX8MP_PAD_SAI3_MCLK__AUDIOMIX_SAI3_MCLK                  = IOMUX_PAD(0x0430, 0x01D0, 0, 0x04E0, 2, 0),
+       MX8MP_PAD_SAI3_MCLK__PWM4_OUT                            = IOMUX_PAD(0x0430, 0x01D0, 1, 0x0000, 0, 0),
+       MX8MP_PAD_SAI3_MCLK__AUDIOMIX_SAI5_MCLK                  = IOMUX_PAD(0x0430, 0x01D0, 2, 0x04F0, 3, 0),
+       MX8MP_PAD_SAI3_MCLK__AUDIOMIX_SPDIF_OUT                  = IOMUX_PAD(0x0430, 0x01D0, 4, 0x0000, 0, 0),
+       MX8MP_PAD_SAI3_MCLK__GPIO5_IO02                          = IOMUX_PAD(0x0430, 0x01D0, 5, 0x0000, 0, 0),
+       MX8MP_PAD_SAI3_MCLK__AUDIOMIX_SPDIF_IN                   = IOMUX_PAD(0x0430, 0x01D0, 6, 0x0544, 3, 0),
+       MX8MP_PAD_SAI3_MCLK__TPSMP_HDATA04                       = IOMUX_PAD(0x0430, 0x01D0, 7, 0x0000, 0, 0),
+
+       MX8MP_PAD_SPDIF_TX__AUDIOMIX_SPDIF_OUT                   = IOMUX_PAD(0x0434, 0x01D4, 0, 0x0000, 0, 0),
+       MX8MP_PAD_SPDIF_TX__PWM3_OUT                             = IOMUX_PAD(0x0434, 0x01D4, 1, 0x0000, 0, 0),
+       MX8MP_PAD_SPDIF_TX__I2C5_SCL                             = IOMUX_PAD(0x0434, 0x01D4, 2 | IOMUX_CONFIG_SION, 0x05C4, 2, 0),
+       MX8MP_PAD_SPDIF_TX__GPT1_COMPARE1                        = IOMUX_PAD(0x0434, 0x01D4, 3, 0x0000, 0, 0),
+       MX8MP_PAD_SPDIF_TX__CAN1_TX                              = IOMUX_PAD(0x0434, 0x01D4, 4, 0x0000, 0, 0),
+       MX8MP_PAD_SPDIF_TX__GPIO5_IO03                           = IOMUX_PAD(0x0434, 0x01D4, 5, 0x0000, 0, 0),
+
+       MX8MP_PAD_SPDIF_RX__AUDIOMIX_SPDIF_IN                    = IOMUX_PAD(0x0438, 0x01D8, 0, 0x0544, 4, 0),
+       MX8MP_PAD_SPDIF_RX__PWM2_OUT                             = IOMUX_PAD(0x0438, 0x01D8, 1, 0x0000, 0, 0),
+       MX8MP_PAD_SPDIF_RX__I2C5_SDA                             = IOMUX_PAD(0x0438, 0x01D8, 2 | IOMUX_CONFIG_SION, 0x05C8, 2, 0),
+       MX8MP_PAD_SPDIF_RX__GPT1_COMPARE2                        = IOMUX_PAD(0x0438, 0x01D8, 3, 0x0000, 0, 0),
+       MX8MP_PAD_SPDIF_RX__CAN1_RX                              = IOMUX_PAD(0x0438, 0x01D8, 4, 0x054C, 2, 0),
+       MX8MP_PAD_SPDIF_RX__GPIO5_IO04                           = IOMUX_PAD(0x0438, 0x01D8, 5, 0x0000, 0, 0),
+       MX8MP_PAD_SPDIF_EXT_CLK__GPT1_COMPARE3                   = IOMUX_PAD(0x043C, 0x01DC, 3, 0x0000, 0, 0),
+       MX8MP_PAD_SPDIF_EXT_CLK__GPIO5_IO05                      = IOMUX_PAD(0x043C, 0x01DC, 5, 0x0000, 0, 0),
+
+       MX8MP_PAD_SPDIF_EXT_CLK__AUDIOMIX_SPDIF_EXT_CLK          = IOMUX_PAD(0x043C, 0x01DC, 0, 0x0548, 1, 0),
+       MX8MP_PAD_SPDIF_EXT_CLK__PWM1_OUT                        = IOMUX_PAD(0x043C, 0x01DC, 1, 0x0000, 0, 0),
+
+       MX8MP_PAD_ECSPI1_SCLK__ECSPI1_SCLK                       = IOMUX_PAD(0x0440, 0x01E0, 0, 0x0558, 0, 0),
+       MX8MP_PAD_ECSPI1_SCLK__UART3_DCE_RX                      = IOMUX_PAD(0x0440, 0x01E0, 1, 0x05F8, 4, 0),
+       MX8MP_PAD_ECSPI1_SCLK__UART3_DTE_TX                      = IOMUX_PAD(0x0440, 0x01E0, 1, 0x0000, 0, 0),
+       MX8MP_PAD_ECSPI1_SCLK__I2C1_SCL                          = IOMUX_PAD(0x0440, 0x01E0, 2 | IOMUX_CONFIG_SION, 0x05A4, 1, 0),
+       MX8MP_PAD_ECSPI1_SCLK__AUDIOMIX_SAI7_RX_SYNC             = IOMUX_PAD(0x0440, 0x01E0, 3, 0x0538, 1, 0),
+       MX8MP_PAD_ECSPI1_SCLK__GPIO5_IO06                        = IOMUX_PAD(0x0440, 0x01E0, 5, 0x0000, 0, 0),
+       MX8MP_PAD_ECSPI1_SCLK__TPSMP_HDATA08                     = IOMUX_PAD(0x0440, 0x01E0, 7, 0x0000, 0, 0),
+
+       MX8MP_PAD_ECSPI1_MOSI__ECSPI1_MOSI                       = IOMUX_PAD(0x0444, 0x01E4, 0, 0x0560, 0, 0),
+       MX8MP_PAD_ECSPI1_MOSI__UART3_DCE_TX                      = IOMUX_PAD(0x0444, 0x01E4, 1, 0x0000, 0, 0),
+       MX8MP_PAD_ECSPI1_MOSI__UART3_DTE_RX                      = IOMUX_PAD(0x0444, 0x01E4, 1, 0x05F8, 5, 0),
+       MX8MP_PAD_ECSPI1_MOSI__I2C1_SDA                          = IOMUX_PAD(0x0444, 0x01E4, 2 | IOMUX_CONFIG_SION, 0x05A8, 1, 0),
+       MX8MP_PAD_ECSPI1_MOSI__AUDIOMIX_SAI7_RX_BCLK             = IOMUX_PAD(0x0444, 0x01E4, 3, 0x0530, 1, 0),
+       MX8MP_PAD_ECSPI1_MOSI__GPIO5_IO07                        = IOMUX_PAD(0x0444, 0x01E4, 5, 0x0000, 0, 0),
+       MX8MP_PAD_ECSPI1_MOSI__TPSMP_HDATA09                     = IOMUX_PAD(0x0444, 0x01E4, 7, 0x0000, 0, 0),
+
+       MX8MP_PAD_ECSPI1_MISO__ECSPI1_MISO                       = IOMUX_PAD(0x0448, 0x01E8, 0, 0x055C, 0, 0),
+       MX8MP_PAD_ECSPI1_MISO__UART3_DCE_CTS                     = IOMUX_PAD(0x0448, 0x01E8, 1, 0x0000, 0, 0),
+       MX8MP_PAD_ECSPI1_MISO__UART3_DTE_RTS                     = IOMUX_PAD(0x0448, 0x01E8, 1, 0x05F4, 2, 0),
+       MX8MP_PAD_ECSPI1_MISO__I2C2_SCL                          = IOMUX_PAD(0x0448, 0x01E8, 2 | IOMUX_CONFIG_SION, 0x05AC, 1, 0),
+       MX8MP_PAD_ECSPI1_MISO__AUDIOMIX_SAI7_RX_DATA00           = IOMUX_PAD(0x0448, 0x01E8, 3, 0x0534, 1, 0),
+       MX8MP_PAD_ECSPI1_MISO__GPIO5_IO08                        = IOMUX_PAD(0x0448, 0x01E8, 5, 0x0000, 0, 0),
+       MX8MP_PAD_ECSPI1_MISO__TPSMP_HDATA10                     = IOMUX_PAD(0x0448, 0x01E8, 7, 0x0000, 0, 0),
+
+       MX8MP_PAD_ECSPI1_SS0__ECSPI1_SS0                         = IOMUX_PAD(0x044C, 0x01EC, 0, 0x0564, 0, 0),
+       MX8MP_PAD_ECSPI1_SS0__UART3_DCE_RTS                      = IOMUX_PAD(0x044C, 0x01EC, 1, 0x05F4, 3, 0),
+       MX8MP_PAD_ECSPI1_SS0__UART3_DTE_CTS                      = IOMUX_PAD(0x044C, 0x01EC, 1, 0x0000, 0, 0),
+       MX8MP_PAD_ECSPI1_SS0__I2C2_SDA                           = IOMUX_PAD(0x044C, 0x01EC, 2 | IOMUX_CONFIG_SION, 0x05B0, 1, 0),
+       MX8MP_PAD_ECSPI1_SS0__AUDIOMIX_SAI7_TX_SYNC              = IOMUX_PAD(0x044C, 0x01EC, 3, 0x0540, 1, 0),
+       MX8MP_PAD_ECSPI1_SS0__GPIO5_IO09                         = IOMUX_PAD(0x044C, 0x01EC, 5, 0x0000, 0, 0),
+       MX8MP_PAD_ECSPI1_SS0__TPSMP_HDATA11                      = IOMUX_PAD(0x044C, 0x01EC, 7, 0x0000, 0, 0),
+
+       MX8MP_PAD_ECSPI2_SCLK__ECSPI2_SCLK                       = IOMUX_PAD(0x0450, 0x01F0, 0, 0x0568, 1, 0),
+       MX8MP_PAD_ECSPI2_SCLK__UART4_DCE_RX                      = IOMUX_PAD(0x0450, 0x01F0, 1, 0x0600, 6, 0),
+       MX8MP_PAD_ECSPI2_SCLK__UART4_DTE_TX                      = IOMUX_PAD(0x0450, 0x01F0, 1, 0x0000, 0, 0),
+       MX8MP_PAD_ECSPI2_SCLK__I2C3_SCL                          = IOMUX_PAD(0x0450, 0x01F0, 2 | IOMUX_CONFIG_SION, 0x05B4, 3, 0),
+       MX8MP_PAD_ECSPI2_SCLK__AUDIOMIX_SAI7_TX_BCLK             = IOMUX_PAD(0x0450, 0x01F0, 3, 0x053C, 1, 0),
+       MX8MP_PAD_ECSPI2_SCLK__GPIO5_IO10                        = IOMUX_PAD(0x0450, 0x01F0, 5, 0x0000, 0, 0),
+       MX8MP_PAD_ECSPI2_SCLK__TPSMP_HDATA12                     = IOMUX_PAD(0x0450, 0x01F0, 7, 0x0000, 0, 0),
+
+       MX8MP_PAD_ECSPI2_MOSI__ECSPI2_MOSI                       = IOMUX_PAD(0x0454, 0x01F4, 0, 0x0570, 1, 0),
+       MX8MP_PAD_ECSPI2_MOSI__UART4_DCE_TX                      = IOMUX_PAD(0x0454, 0x01F4, 1, 0x0000, 0, 0),
+       MX8MP_PAD_ECSPI2_MOSI__UART4_DTE_RX                      = IOMUX_PAD(0x0454, 0x01F4, 1, 0x0600, 7, 0),
+       MX8MP_PAD_ECSPI2_MOSI__I2C3_SDA                          = IOMUX_PAD(0x0454, 0x01F4, 2 | IOMUX_CONFIG_SION, 0x05B8, 3, 0),
+       MX8MP_PAD_ECSPI2_MOSI__AUDIOMIX_SAI7_TX_DATA00           = IOMUX_PAD(0x0454, 0x01F4, 3, 0x0000, 0, 0),
+       MX8MP_PAD_ECSPI2_MOSI__GPIO5_IO11                        = IOMUX_PAD(0x0454, 0x01F4, 5, 0x0000, 0, 0),
+       MX8MP_PAD_ECSPI2_MOSI__TPSMP_HDATA13                     = IOMUX_PAD(0x0454, 0x01F4, 7, 0x0000, 0, 0),
+       MX8MP_PAD_ECSPI2_MISO__GPIO5_IO12                        = IOMUX_PAD(0x0458, 0x01F8, 5, 0x0000, 0, 0),
+       MX8MP_PAD_ECSPI2_MISO__TPSMP_HDATA14                     = IOMUX_PAD(0x0458, 0x01F8, 7, 0x0000, 0, 0),
+
+       MX8MP_PAD_ECSPI2_MISO__ECSPI2_MISO                       = IOMUX_PAD(0x0458, 0x01F8, 0, 0x056C, 1, 0),
+       MX8MP_PAD_ECSPI2_MISO__UART4_DCE_CTS                     = IOMUX_PAD(0x0458, 0x01F8, 1, 0x0000, 0, 0),
+       MX8MP_PAD_ECSPI2_MISO__UART4_DTE_RTS                     = IOMUX_PAD(0x0458, 0x01F8, 1, 0x05FC, 2, 0),
+       MX8MP_PAD_ECSPI2_MISO__I2C4_SCL                          = IOMUX_PAD(0x0458, 0x01F8, 2 | IOMUX_CONFIG_SION, 0x05BC, 4, 0),
+       MX8MP_PAD_ECSPI2_MISO__AUDIOMIX_SAI7_MCLK                = IOMUX_PAD(0x0458, 0x01F8, 3, 0x052C, 1, 0),
+       MX8MP_PAD_ECSPI2_MISO__CCMSRCGPCMIX_CLKO1                = IOMUX_PAD(0x0458, 0x01F8, 4, 0x0000, 0, 0),
+
+       MX8MP_PAD_ECSPI2_SS0__ECSPI2_SS0                         = IOMUX_PAD(0x045C, 0x01FC, 0, 0x0574, 1, 0),
+       MX8MP_PAD_ECSPI2_SS0__UART4_DCE_RTS                      = IOMUX_PAD(0x045C, 0x01FC, 1, 0x05FC, 3, 0),
+       MX8MP_PAD_ECSPI2_SS0__UART4_DTE_CTS                      = IOMUX_PAD(0x045C, 0x01FC, 1, 0x0000, 0, 0),
+       MX8MP_PAD_ECSPI2_SS0__I2C4_SDA                           = IOMUX_PAD(0x045C, 0x01FC, 2 | IOMUX_CONFIG_SION, 0x05C0, 4, 0),
+       MX8MP_PAD_ECSPI2_SS0__CCMSRCGPCMIX_CLKO2                 = IOMUX_PAD(0x045C, 0x01FC, 4, 0x0000, 0, 0),
+       MX8MP_PAD_ECSPI2_SS0__GPIO5_IO13                         = IOMUX_PAD(0x045C, 0x01FC, 5, 0x0000, 0, 0),
+       MX8MP_PAD_ECSPI2_SS0__TPSMP_HDATA15                      = IOMUX_PAD(0x045C, 0x01FC, 7, 0x0000, 0, 0),
+
+       MX8MP_PAD_I2C1_SCL__I2C1_SCL                             = IOMUX_PAD(0x0460, 0x0200, 0 | IOMUX_CONFIG_SION, 0x05A4, 2, 0),
+       MX8MP_PAD_I2C1_SCL__ENET_QOS_MDC                         = IOMUX_PAD(0x0460, 0x0200, 1, 0x0000, 0, 0),
+       MX8MP_PAD_I2C1_SCL__ECSPI1_SCLK                          = IOMUX_PAD(0x0460, 0x0200, 3, 0x0558, 1, 0),
+       MX8MP_PAD_I2C1_SCL__GPIO5_IO14                           = IOMUX_PAD(0x0460, 0x0200, 5, 0x0000, 0, 0),
+       MX8MP_PAD_I2C1_SCL__TPSMP_HDATA16                        = IOMUX_PAD(0x0460, 0x0200, 7, 0x0000, 0, 0),
+
+       MX8MP_PAD_I2C1_SDA__I2C1_SDA                             = IOMUX_PAD(0x0464, 0x0204, 0 | IOMUX_CONFIG_SION, 0x05A8, 2, 0),
+       MX8MP_PAD_I2C1_SDA__ENET_QOS_MDIO                        = IOMUX_PAD(0x0464, 0x0204, 1, 0x0590, 2, 0),
+       MX8MP_PAD_I2C1_SDA__ECSPI1_MOSI                          = IOMUX_PAD(0x0464, 0x0204, 3, 0x0560, 1, 0),
+       MX8MP_PAD_I2C1_SDA__GPIO5_IO15                           = IOMUX_PAD(0x0464, 0x0204, 5, 0x0000, 0, 0),
+       MX8MP_PAD_I2C1_SDA__TPSMP_HDATA17                        = IOMUX_PAD(0x0464, 0x0204, 7, 0x0000, 0, 0),
+
+       MX8MP_PAD_I2C2_SCL__I2C2_SCL                             = IOMUX_PAD(0x0468, 0x0208, 0 | IOMUX_CONFIG_SION, 0x05AC, 2, 0),
+       MX8MP_PAD_I2C2_SCL__ENET_QOS_1588_EVENT1_IN              = IOMUX_PAD(0x0468, 0x0208, 1, 0x0000, 0, 0),
+       MX8MP_PAD_I2C2_SCL__USDHC3_CD_B                          = IOMUX_PAD(0x0468, 0x0208, 2, 0x0608, 3, 0),
+       MX8MP_PAD_I2C2_SCL__ECSPI1_MISO                          = IOMUX_PAD(0x0468, 0x0208, 3, 0x055C, 1, 0),
+       MX8MP_PAD_I2C2_SCL__ENET_QOS_1588_EVENT1_AUX_IN          = IOMUX_PAD(0x0468, 0x0208, 4, 0x0000, 0, 0),
+       MX8MP_PAD_I2C2_SCL__GPIO5_IO16                           = IOMUX_PAD(0x0468, 0x0208, 5, 0x0000, 0, 0),
+       MX8MP_PAD_I2C2_SCL__TPSMP_HDATA18                        = IOMUX_PAD(0x0468, 0x0208, 7, 0x0000, 0, 0),
+
+       MX8MP_PAD_I2C2_SDA__I2C2_SDA                             = IOMUX_PAD(0x046C, 0x020C, 0 | IOMUX_CONFIG_SION, 0x05B0, 2, 0),
+       MX8MP_PAD_I2C2_SDA__ENET_QOS_1588_EVENT1_OUT             = IOMUX_PAD(0x046C, 0x020C, 1, 0x0000, 0, 0),
+       MX8MP_PAD_I2C2_SDA__USDHC3_WP                            = IOMUX_PAD(0x046C, 0x020C, 2, 0x0634, 3, 0),
+       MX8MP_PAD_I2C2_SDA__ECSPI1_SS0                           = IOMUX_PAD(0x046C, 0x020C, 3, 0x0564, 1, 0),
+       MX8MP_PAD_I2C2_SDA__GPIO5_IO17                           = IOMUX_PAD(0x046C, 0x020C, 5, 0x0000, 0, 0),
+       MX8MP_PAD_I2C2_SDA__TPSMP_HDATA19                        = IOMUX_PAD(0x046C, 0x020C, 7, 0x0000, 0, 0),
+
+       MX8MP_PAD_I2C3_SCL__I2C3_SCL                             = IOMUX_PAD(0x0470, 0x0210, 0 | IOMUX_CONFIG_SION, 0x05B4, 4, 0),
+       MX8MP_PAD_I2C3_SCL__PWM4_OUT                             = IOMUX_PAD(0x0470, 0x0210, 1, 0x0000, 0, 0),
+       MX8MP_PAD_I2C3_SCL__GPT2_CLK                             = IOMUX_PAD(0x0470, 0x0210, 2, 0x0000, 0, 0),
+       MX8MP_PAD_I2C3_SCL__ECSPI2_SCLK                          = IOMUX_PAD(0x0470, 0x0210, 3, 0x0568, 2, 0),
+       MX8MP_PAD_I2C3_SCL__GPIO5_IO18                           = IOMUX_PAD(0x0470, 0x0210, 5, 0x0000, 0, 0),
+       MX8MP_PAD_I2C3_SCL__TPSMP_HDATA20                        = IOMUX_PAD(0x0470, 0x0210, 7, 0x0000, 0, 0),
+
+       MX8MP_PAD_I2C3_SDA__I2C3_SDA                             = IOMUX_PAD(0x0474, 0x0214, 0 | IOMUX_CONFIG_SION, 0x05B8, 4, 0),
+       MX8MP_PAD_I2C3_SDA__PWM3_OUT                             = IOMUX_PAD(0x0474, 0x0214, 1, 0x0000, 0, 0),
+       MX8MP_PAD_I2C3_SDA__GPT3_CLK                             = IOMUX_PAD(0x0474, 0x0214, 2, 0x0000, 0, 0),
+       MX8MP_PAD_I2C3_SDA__ECSPI2_MOSI                          = IOMUX_PAD(0x0474, 0x0214, 3, 0x0570, 2, 0),
+       MX8MP_PAD_I2C3_SDA__GPIO5_IO19                           = IOMUX_PAD(0x0474, 0x0214, 5, 0x0000, 0, 0),
+       MX8MP_PAD_I2C3_SDA__TPSMP_HDATA21                        = IOMUX_PAD(0x0474, 0x0214, 7, 0x0000, 0, 0),
+
+       MX8MP_PAD_I2C4_SCL__I2C4_SCL                             = IOMUX_PAD(0x0478, 0x0218, 0 | IOMUX_CONFIG_SION, 0x05BC, 5, 0),
+       MX8MP_PAD_I2C4_SCL__PWM2_OUT                             = IOMUX_PAD(0x0478, 0x0218, 1, 0x0000, 0, 0),
+       MX8MP_PAD_I2C4_SCL__HSIOMIX_PCIE_CLKREQ_B                = IOMUX_PAD(0x0478, 0x0218, 2, 0x05A0, 0, 0),
+       MX8MP_PAD_I2C4_SCL__ECSPI2_MISO                          = IOMUX_PAD(0x0478, 0x0218, 3, 0x056C, 2, 0),
+       MX8MP_PAD_I2C4_SCL__GPIO5_IO20                           = IOMUX_PAD(0x0478, 0x0218, 5, 0x0000, 0, 0),
+       MX8MP_PAD_I2C4_SCL__TPSMP_HDATA22                        = IOMUX_PAD(0x0478, 0x0218, 7, 0x0000, 0, 0),
+
+       MX8MP_PAD_I2C4_SDA__I2C4_SDA                             = IOMUX_PAD(0x047C, 0x021C, 0 | IOMUX_CONFIG_SION, 0x05C0, 5, 0),
+       MX8MP_PAD_I2C4_SDA__PWM1_OUT                             = IOMUX_PAD(0x047C, 0x021C, 1, 0x0000, 0, 0),
+       MX8MP_PAD_I2C4_SDA__ECSPI2_SS0                           = IOMUX_PAD(0x047C, 0x021C, 3, 0x0574, 2, 0),
+       MX8MP_PAD_I2C4_SDA__GPIO5_IO21                           = IOMUX_PAD(0x047C, 0x021C, 5, 0x0000, 0, 0),
+       MX8MP_PAD_I2C4_SDA__TPSMP_HDATA23                        = IOMUX_PAD(0x047C, 0x021C, 7, 0x0000, 0, 0),
+
+       MX8MP_PAD_UART1_RXD__UART1_DCE_RX                        = IOMUX_PAD(0x0480, 0x0220, 0, 0x05E8, 4, 0),
+
+       MX8MP_PAD_UART1_RXD__UART1_DTE_TX                        = IOMUX_PAD(0x0480, 0x0220, 0, 0x0000, 0, 0),
+       MX8MP_PAD_UART1_RXD__ECSPI3_SCLK                         = IOMUX_PAD(0x0480, 0x0220, 1, 0x0000, 0, 0),
+       MX8MP_PAD_UART1_RXD__GPIO5_IO22                          = IOMUX_PAD(0x0480, 0x0220, 5, 0x0000, 0, 0),
+       MX8MP_PAD_UART1_RXD__TPSMP_HDATA24                       = IOMUX_PAD(0x0480, 0x0220, 7, 0x0000, 0, 0),
+
+       MX8MP_PAD_UART1_TXD__UART1_DCE_TX                        = IOMUX_PAD(0x0484, 0x0224, 0, 0x0000, 0, 0),
+
+       MX8MP_PAD_UART1_TXD__UART1_DTE_RX                        = IOMUX_PAD(0x0484, 0x0224, 0, 0x05E8, 5, 0),
+       MX8MP_PAD_UART1_TXD__ECSPI3_MOSI                         = IOMUX_PAD(0x0484, 0x0224, 1, 0x0000, 0, 0),
+       MX8MP_PAD_UART1_TXD__GPIO5_IO23                          = IOMUX_PAD(0x0484, 0x0224, 5, 0x0000, 0, 0),
+       MX8MP_PAD_UART1_TXD__TPSMP_HDATA25                       = IOMUX_PAD(0x0484, 0x0224, 7, 0x0000, 0, 0),
+
+       MX8MP_PAD_UART2_RXD__UART2_DCE_RX                        = IOMUX_PAD(0x0488, 0x0228, 0, 0x05F0, 6, 0),
+
+       MX8MP_PAD_UART2_RXD__UART2_DTE_TX                        = IOMUX_PAD(0x0488, 0x0228, 0, 0x0000, 0, 0),
+       MX8MP_PAD_UART2_RXD__ECSPI3_MISO                         = IOMUX_PAD(0x0488, 0x0228, 1, 0x0000, 0, 0),
+       MX8MP_PAD_UART2_RXD__GPT1_COMPARE3                       = IOMUX_PAD(0x0488, 0x0228, 3, 0x0000, 0, 0),
+       MX8MP_PAD_UART2_RXD__GPIO5_IO24                          = IOMUX_PAD(0x0488, 0x0228, 5, 0x0000, 0, 0),
+       MX8MP_PAD_UART2_RXD__TPSMP_HDATA26                       = IOMUX_PAD(0x0488, 0x0228, 7, 0x0000, 0, 0),
+
+       MX8MP_PAD_UART2_TXD__UART2_DCE_TX                        = IOMUX_PAD(0x048C, 0x022C, 0, 0x0000, 0, 0),
+
+       MX8MP_PAD_UART2_TXD__UART2_DTE_RX                        = IOMUX_PAD(0x048C, 0x022C, 0, 0x05F0, 7, 0),
+       MX8MP_PAD_UART2_TXD__ECSPI3_SS0                          = IOMUX_PAD(0x048C, 0x022C, 1, 0x0000, 0, 0),
+       MX8MP_PAD_UART2_TXD__GPT1_COMPARE2                       = IOMUX_PAD(0x048C, 0x022C, 3, 0x0000, 0, 0),
+       MX8MP_PAD_UART2_TXD__GPIO5_IO25                          = IOMUX_PAD(0x048C, 0x022C, 5, 0x0000, 0, 0),
+       MX8MP_PAD_UART2_TXD__TPSMP_HDATA27                       = IOMUX_PAD(0x048C, 0x022C, 7, 0x0000, 0, 0),
+
+       MX8MP_PAD_UART3_RXD__UART3_DCE_RX                        = IOMUX_PAD(0x0490, 0x0230, 0, 0x05F8, 6, 0),
+
+       MX8MP_PAD_UART3_RXD__UART3_DTE_TX                        = IOMUX_PAD(0x0490, 0x0230, 0, 0x0000, 0, 0),
+       MX8MP_PAD_UART3_RXD__UART1_DCE_CTS                       = IOMUX_PAD(0x0490, 0x0230, 1, 0x0000, 0, 0),
+       MX8MP_PAD_UART3_RXD__UART1_DTE_RTS                       = IOMUX_PAD(0x0490, 0x0230, 1, 0x05E4, 4, 0),
+       MX8MP_PAD_UART3_RXD__USDHC3_RESET_B                      = IOMUX_PAD(0x0490, 0x0230, 2, 0x0000, 0, 0),
+       MX8MP_PAD_UART3_RXD__GPT1_CAPTURE2                       = IOMUX_PAD(0x0490, 0x0230, 3, 0x0598, 1, 0),
+       MX8MP_PAD_UART3_RXD__CAN2_TX                             = IOMUX_PAD(0x0490, 0x0230, 4, 0x0000, 0, 0),
+       MX8MP_PAD_UART3_RXD__GPIO5_IO26                          = IOMUX_PAD(0x0490, 0x0230, 5, 0x0000, 0, 0),
+       MX8MP_PAD_UART3_RXD__TPSMP_HDATA28                       = IOMUX_PAD(0x0490, 0x0230, 7, 0x0000, 0, 0),
+
+       MX8MP_PAD_UART3_TXD__UART3_DCE_TX                        = IOMUX_PAD(0x0494, 0x0234, 0, 0x0000, 0, 0),
+
+       MX8MP_PAD_UART3_TXD__UART3_DTE_RX                        = IOMUX_PAD(0x0494, 0x0234, 0, 0x05F8, 7, 0),
+       MX8MP_PAD_UART3_TXD__UART1_DCE_RTS                       = IOMUX_PAD(0x0494, 0x0234, 1, 0x05E4, 5, 0),
+       MX8MP_PAD_UART3_TXD__UART1_DTE_CTS                       = IOMUX_PAD(0x0494, 0x0234, 1, 0x0000, 0, 0),
+       MX8MP_PAD_UART3_TXD__USDHC3_VSELECT                      = IOMUX_PAD(0x0494, 0x0234, 2, 0x0000, 0, 0),
+       MX8MP_PAD_UART3_TXD__GPT1_CLK                            = IOMUX_PAD(0x0494, 0x0234, 3, 0x059C, 1, 0),
+       MX8MP_PAD_UART3_TXD__CAN2_RX                             = IOMUX_PAD(0x0494, 0x0234, 4, 0x0550, 2, 0),
+       MX8MP_PAD_UART3_TXD__GPIO5_IO27                          = IOMUX_PAD(0x0494, 0x0234, 5, 0x0000, 0, 0),
+       MX8MP_PAD_UART3_TXD__TPSMP_HDATA29                       = IOMUX_PAD(0x0494, 0x0234, 7, 0x0000, 0, 0),
+
+       MX8MP_PAD_UART4_RXD__UART4_DCE_RX                        = IOMUX_PAD(0x0498, 0x0238, 0, 0x0600, 8, 0),
+
+       MX8MP_PAD_UART4_RXD__UART4_DTE_TX                        = IOMUX_PAD(0x0498, 0x0238, 0, 0x0000, 0, 0),
+       MX8MP_PAD_UART4_RXD__UART2_DCE_CTS                       = IOMUX_PAD(0x0498, 0x0238, 1, 0x0000, 0, 0),
+       MX8MP_PAD_UART4_RXD__UART2_DTE_RTS                       = IOMUX_PAD(0x0498, 0x0238, 1, 0x05EC, 4, 0),
+       MX8MP_PAD_UART4_RXD__HSIOMIX_PCIE_CLKREQ_B               = IOMUX_PAD(0x0498, 0x0238, 2, 0x05A0, 1, 0),
+       MX8MP_PAD_UART4_RXD__GPT1_COMPARE1                       = IOMUX_PAD(0x0498, 0x0238, 3, 0x0000, 0, 0),
+       MX8MP_PAD_UART4_RXD__I2C6_SCL                            = IOMUX_PAD(0x0498, 0x0238, 4 | IOMUX_CONFIG_SION, 0x05CC, 2, 0),
+       MX8MP_PAD_UART4_RXD__GPIO5_IO28                          = IOMUX_PAD(0x0498, 0x0238, 5, 0x0000, 0, 0),
+       MX8MP_PAD_UART4_RXD__TPSMP_HDATA30                       = IOMUX_PAD(0x0498, 0x0238, 7, 0x0000, 0, 0),
+
+       MX8MP_PAD_UART4_TXD__UART4_DCE_TX                        = IOMUX_PAD(0x049C, 0x023C, 0, 0x0000, 0, 0),
+
+       MX8MP_PAD_UART4_TXD__UART4_DTE_RX                        = IOMUX_PAD(0x049C, 0x023C, 0, 0x0600, 9, 0),
+       MX8MP_PAD_UART4_TXD__UART2_DCE_RTS                       = IOMUX_PAD(0x049C, 0x023C, 1, 0x05EC, 5, 0),
+       MX8MP_PAD_UART4_TXD__UART2_DTE_CTS                       = IOMUX_PAD(0x049C, 0x023C, 1, 0x0000, 0, 0),
+       MX8MP_PAD_UART4_TXD__GPT1_CAPTURE1                       = IOMUX_PAD(0x049C, 0x023C, 3, 0x0594, 1, 0),
+       MX8MP_PAD_UART4_TXD__I2C6_SDA                            = IOMUX_PAD(0x049C, 0x023C, 4 | IOMUX_CONFIG_SION, 0x05D0, 2, 0),
+       MX8MP_PAD_UART4_TXD__GPIO5_IO29                          = IOMUX_PAD(0x049C, 0x023C, 5, 0x0000, 0, 0),
+       MX8MP_PAD_UART4_TXD__TPSMP_HDATA31                       = IOMUX_PAD(0x049C, 0x023C, 7, 0x0000, 0, 0),
+
+       MX8MP_PAD_HDMI_DDC_SCL__HDMIMIX_EARC_SCL                 = IOMUX_PAD(0x04A0, 0x0240, 0, 0x0000, 0, 0),
+       MX8MP_PAD_HDMI_DDC_SCL__I2C5_SCL                         = IOMUX_PAD(0x04A0, 0x0240, 3 | IOMUX_CONFIG_SION, 0x05C4, 3, 0),
+       MX8MP_PAD_HDMI_DDC_SCL__CAN1_TX                          = IOMUX_PAD(0x04A0, 0x0240, 4, 0x0000, 0, 0),
+       MX8MP_PAD_HDMI_DDC_SCL__GPIO3_IO26                       = IOMUX_PAD(0x04A0, 0x0240, 5, 0x0000, 0, 0),
+       MX8MP_PAD_HDMI_DDC_SCL__AUDIOMIX_test_out00              = IOMUX_PAD(0x04A0, 0x0240, 6, 0x0000, 0, 0),
+
+       MX8MP_PAD_HDMI_DDC_SDA__HDMIMIX_EARC_SDA                 = IOMUX_PAD(0x04A4, 0x0244, 0, 0x0000, 0, 0),
+       MX8MP_PAD_HDMI_DDC_SDA__I2C5_SDA                         = IOMUX_PAD(0x04A4, 0x0244, 3 | IOMUX_CONFIG_SION, 0x05C8, 3, 0),
+       MX8MP_PAD_HDMI_DDC_SDA__CAN1_RX                          = IOMUX_PAD(0x04A4, 0x0244, 4, 0x054C, 3, 0),
+       MX8MP_PAD_HDMI_DDC_SDA__GPIO3_IO27                       = IOMUX_PAD(0x04A4, 0x0244, 5, 0x0000, 0, 0),
+       MX8MP_PAD_HDMI_DDC_SDA__AUDIOMIX_test_out01              = IOMUX_PAD(0x04A4, 0x0244, 6, 0x0000, 0, 0),
+
+       MX8MP_PAD_HDMI_CEC__HDMIMIX_EARC_CEC                     = IOMUX_PAD(0x04A8, 0x0248, 0, 0x0000, 0, 0),
+       MX8MP_PAD_HDMI_CEC__I2C6_SCL                             = IOMUX_PAD(0x04A8, 0x0248, 3 | IOMUX_CONFIG_SION, 0x05CC, 3, 0),
+       MX8MP_PAD_HDMI_CEC__CAN2_TX                              = IOMUX_PAD(0x04A8, 0x0248, 4, 0x0000, 0, 0),
+       MX8MP_PAD_HDMI_CEC__GPIO3_IO28                           = IOMUX_PAD(0x04A8, 0x0248, 5, 0x0000, 0, 0),
+
+       MX8MP_PAD_HDMI_HPD__HDMIMIX_EARC_DC_HPD                  = IOMUX_PAD(0x04AC, 0x024C, 0, 0x0000, 0, 0),
+       MX8MP_PAD_HDMI_HPD__AUDIOMIX_EARC_HDMI_HPD_O             = IOMUX_PAD(0x04AC, 0x024C, 1, 0x0000, 0, 0),
+       MX8MP_PAD_HDMI_HPD__I2C6_SDA                             = IOMUX_PAD(0x04AC, 0x024C, 3 | IOMUX_CONFIG_SION, 0x05D0, 3, 0),
+       MX8MP_PAD_HDMI_HPD__CAN2_RX                              = IOMUX_PAD(0x04AC, 0x024C, 4, 0x0550, 3, 0),
+       MX8MP_PAD_HDMI_HPD__GPIO3_IO29                           = IOMUX_PAD(0x04AC, 0x024C, 5, 0x0000, 0, 0),
+};
+#endif  /* __ASM_ARCH_IMX8MP_PINS_H__ */
index 3d5586ed4f6508da7eb77ca3367fbb8d4bda2d5c..06dbd8d943a41d4bf3d2fa8dcd7af6d4b1a7fcde 100644 (file)
@@ -104,7 +104,7 @@ typedef u64 iomux_v3_cfg_t;
 #define PAD_CTL_ODE            (0x1 << 5)
 #define PAD_CTL_PUE            (0x1 << 6)
 #define PAD_CTL_HYS            (0x1 << 7)
-#if defined(CONFIG_IMX8MM) || defined(CONFIG_IMX8MN)
+#if defined(CONFIG_IMX8MM) || defined(CONFIG_IMX8MN) || defined(CONFIG_IMX8MP)
 #define PAD_CTL_PE             (0x1 << 8)
 #else
 #define PAD_CTL_LVTTL          (0x1 << 8)
index fff48008087a0abc007d27dc0b3800d71afe0f7f..35b39b1f86c05c8618a81c004575a7ebbe8ce13c 100644 (file)
@@ -54,6 +54,7 @@
 #define is_imx8mms() (is_cpu_type(MXC_CPU_IMX8MMS))
 #define is_imx8mmsl() (is_cpu_type(MXC_CPU_IMX8MMSL))
 #define is_imx8mn() (is_cpu_type(MXC_CPU_IMX8MN))
+#define is_imx8mp() (is_cpu_type(MXC_CPU_IMX8MP))
 
 #define is_imx8qxp() (is_cpu_type(MXC_CPU_IMX8QXP))
 
index 4ce2799b72a28601dbdc9fde49a4fca1b45869df..aa140c4798cde3f5acb5629c8c07b992c5b85de9 100644 (file)
@@ -112,7 +112,7 @@ config DDRMC_VF610_CALIBRATION
 
 config SPL_IMX_ROMAPI_LOADADDR
        hex "Default load address to load image through ROM API"
-       depends on IMX8MN
+       depends on IMX8MN || IMX8MP
 
 config IMX_DCD_ADDR
        hex "DCD Blocks location on the image"
@@ -123,4 +123,3 @@ config IMX_DCD_ADDR
          the ROM code to configure the device at early boot stage, is located.
          This information is shared with the user via mkimage -l just so the
          image can be signed.
-
index 51c7c05f04dac385c1a678e0e3e04e9f7107d4ab..bfa85c64c6afb68c295752a1373f4ac142e73bfb 100644 (file)
@@ -92,6 +92,8 @@ static char *get_reset_cause(void)
 const char *get_imx_type(u32 imxtype)
 {
        switch (imxtype) {
+       case MXC_CPU_IMX8MP:
+               return "8MP";   /* Quad-core version of the imx8mp */
        case MXC_CPU_IMX8MN:
                return "8MNano";/* Quad-core version of the imx8mn */
        case MXC_CPU_IMX8MM:
@@ -157,7 +159,7 @@ int print_cpuinfo(void)
        int cpu_tmp, minc, maxc, ret;
 
        printf("CPU:   Freescale i.MX%s rev%d.%d",
-              get_imx_type((cpurev & 0xFF000) >> 12),
+              get_imx_type((cpurev & 0x1FF000) >> 12),
               (cpurev & 0x000F0) >> 4,
               (cpurev & 0x0000F) >> 0);
        max_freq = get_cpu_speed_grade_hz();
@@ -169,7 +171,7 @@ int print_cpuinfo(void)
        }
 #else
        printf("CPU:   Freescale i.MX%s rev%d.%d at %d MHz\n",
-               get_imx_type((cpurev & 0xFF000) >> 12),
+               get_imx_type((cpurev & 0x1FF000) >> 12),
                (cpurev & 0x000F0) >> 4,
                (cpurev & 0x0000F) >> 0,
                mxc_get_clock(MXC_ARM_CLK) / 1000000);
index eb4a73b3e2822e005313d0245bd1f428daec79c8..72affb1bdc15f46f404bcda8736152627875f38a 100644 (file)
@@ -16,6 +16,10 @@ config IMX8MN
        bool
        select IMX8M
 
+config IMX8MP
+       bool
+       select IMX8M
+
 config SYS_SOC
        default "imx8m"
 
@@ -40,10 +44,17 @@ config TARGET_IMX8MN_EVK
        select SUPPORT_SPL
        select IMX8M_DDR4
 
+config TARGET_IMX8MP_EVK
+       bool "imx8mp LPDDR4 EVK board"
+       select IMX8MP
+       select SUPPORT_SPL
+       select IMX8M_LPDDR4
+
 endchoice
 
 source "board/freescale/imx8mq_evk/Kconfig"
 source "board/freescale/imx8mm_evk/Kconfig"
 source "board/freescale/imx8mn_evk/Kconfig"
+source "board/freescale/imx8mp_evk/Kconfig"
 
 endif
index db4ba30c24dde67001544b14536b4c8ce35dc669..d9dee894aae17c89badcc6056f33a443ca0dc6b0 100644 (file)
@@ -5,4 +5,4 @@
 obj-y += lowlevel_init.o
 obj-y += clock_slice.o soc.o
 obj-$(CONFIG_IMX8MQ) += clock_imx8mq.o
-obj-$(CONFIG_IMX8MM)$(CONFIG_IMX8MN) += clock_imx8mm.o
+obj-$(CONFIG_IMX8MM)$(CONFIG_IMX8MN)$(CONFIG_IMX8MP) += clock_imx8mm.o
index ee44ba75febe9de986412910da09f6f4d29fb22e..ca4b4c05abe28526b6c53b3c93f50381fd83117c 100644 (file)
@@ -10,9 +10,6 @@
 #include <asm/arch/imx-regs.h>
 #include <asm/arch/sys_proto.h>
 #include <asm/io.h>
-#include <clk.h>
-#include <clk-uclass.h>
-#include <dt-bindings/clock/imx8mm-clock.h>
 #include <div64.h>
 #include <errno.h>
 
@@ -22,34 +19,23 @@ static struct anamix_pll *ana_pll = (struct anamix_pll *)ANATOP_BASE_ADDR;
 
 void enable_ocotp_clk(unsigned char enable)
 {
-       struct clk *clkp;
-       int ret;
-
-       ret = clk_get_by_id(IMX8MM_CLK_OCOTP_ROOT, &clkp);
-       if (ret) {
-               printf("%s: err: %d\n", __func__, ret);
-               return;
-       }
-
-       enable ? clk_enable(clkp) : clk_disable(clkp);
+       clock_enable(CCGR_OCOTP, !!enable);
 }
 
 int enable_i2c_clk(unsigned char enable, unsigned i2c_num)
 {
-       struct clk *clkp;
-       int ret;
+       /* 0 - 3 is valid i2c num */
+       if (i2c_num > 3)
+               return -EINVAL;
 
-       ret = clk_get_by_id(IMX8MM_CLK_I2C1_ROOT + i2c_num, &clkp);
-       if (ret) {
-               printf("%s: err: %d\n", __func__, ret);
-               return ret;
-       }
+       clock_enable(CCGR_I2C1 + i2c_num, !!enable);
 
-       return enable ? clk_enable(clkp) : clk_disable(clkp);
+       return 0;
 }
 
 #ifdef CONFIG_SPL_BUILD
 static struct imx_int_pll_rate_table imx8mm_fracpll_tbl[] = {
+       PLL_1443X_RATE(1000000000U, 250, 3, 1, 0),
        PLL_1443X_RATE(800000000U, 300, 9, 0, 0),
        PLL_1443X_RATE(750000000U, 250, 8, 0, 0),
        PLL_1443X_RATE(650000000U, 325, 3, 2, 0),
@@ -282,24 +268,312 @@ u32 imx_get_uartclk(void)
        return 24000000U;
 }
 
+u32 decode_intpll(enum clk_root_src intpll)
+{
+       u32 pll_gnrl_ctl, pll_div_ctl, pll_clke_mask;
+       u32 main_div, pre_div, post_div, div;
+       u64 freq;
+
+       switch (intpll) {
+       case ARM_PLL_CLK:
+               pll_gnrl_ctl = readl(&ana_pll->arm_pll_gnrl_ctl);
+               pll_div_ctl = readl(&ana_pll->arm_pll_div_ctl);
+               break;
+       case GPU_PLL_CLK:
+               pll_gnrl_ctl = readl(&ana_pll->gpu_pll_gnrl_ctl);
+               pll_div_ctl = readl(&ana_pll->gpu_pll_div_ctl);
+               break;
+       case VPU_PLL_CLK:
+               pll_gnrl_ctl = readl(&ana_pll->vpu_pll_gnrl_ctl);
+               pll_div_ctl = readl(&ana_pll->vpu_pll_div_ctl);
+               break;
+       case SYSTEM_PLL1_800M_CLK:
+       case SYSTEM_PLL1_400M_CLK:
+       case SYSTEM_PLL1_266M_CLK:
+       case SYSTEM_PLL1_200M_CLK:
+       case SYSTEM_PLL1_160M_CLK:
+       case SYSTEM_PLL1_133M_CLK:
+       case SYSTEM_PLL1_100M_CLK:
+       case SYSTEM_PLL1_80M_CLK:
+       case SYSTEM_PLL1_40M_CLK:
+               pll_gnrl_ctl = readl(&ana_pll->sys_pll1_gnrl_ctl);
+               pll_div_ctl = readl(&ana_pll->sys_pll1_div_ctl);
+               break;
+       case SYSTEM_PLL2_1000M_CLK:
+       case SYSTEM_PLL2_500M_CLK:
+       case SYSTEM_PLL2_333M_CLK:
+       case SYSTEM_PLL2_250M_CLK:
+       case SYSTEM_PLL2_200M_CLK:
+       case SYSTEM_PLL2_166M_CLK:
+       case SYSTEM_PLL2_125M_CLK:
+       case SYSTEM_PLL2_100M_CLK:
+       case SYSTEM_PLL2_50M_CLK:
+               pll_gnrl_ctl = readl(&ana_pll->sys_pll2_gnrl_ctl);
+               pll_div_ctl = readl(&ana_pll->sys_pll2_div_ctl);
+               break;
+       case SYSTEM_PLL3_CLK:
+               pll_gnrl_ctl = readl(&ana_pll->sys_pll3_gnrl_ctl);
+               pll_div_ctl = readl(&ana_pll->sys_pll3_div_ctl);
+               break;
+       default:
+               return -EINVAL;
+       }
+
+       /* Only support SYS_XTAL 24M, PAD_CLK not take into consideration */
+       if ((pll_gnrl_ctl & INTPLL_REF_CLK_SEL_MASK) != 0)
+               return 0;
+
+       if ((pll_gnrl_ctl & INTPLL_RST_MASK) == 0)
+               return 0;
+
+       /*
+        * When BYPASS is equal to 1, PLL enters the bypass mode
+        * regardless of the values of RESETB
+        */
+       if (pll_gnrl_ctl & INTPLL_BYPASS_MASK)
+               return 24000000u;
+
+       if (!(pll_gnrl_ctl & INTPLL_LOCK_MASK)) {
+               puts("pll not locked\n");
+               return 0;
+       }
+
+       switch (intpll) {
+       case ARM_PLL_CLK:
+       case GPU_PLL_CLK:
+       case VPU_PLL_CLK:
+       case SYSTEM_PLL3_CLK:
+       case SYSTEM_PLL1_800M_CLK:
+       case SYSTEM_PLL2_1000M_CLK:
+               pll_clke_mask = INTPLL_CLKE_MASK;
+               div = 1;
+               break;
+
+       case SYSTEM_PLL1_400M_CLK:
+       case SYSTEM_PLL2_500M_CLK:
+               pll_clke_mask = INTPLL_DIV2_CLKE_MASK;
+               div = 2;
+               break;
+
+       case SYSTEM_PLL1_266M_CLK:
+       case SYSTEM_PLL2_333M_CLK:
+               pll_clke_mask = INTPLL_DIV3_CLKE_MASK;
+               div = 3;
+               break;
+
+       case SYSTEM_PLL1_200M_CLK:
+       case SYSTEM_PLL2_250M_CLK:
+               pll_clke_mask = INTPLL_DIV4_CLKE_MASK;
+               div = 4;
+               break;
+
+       case SYSTEM_PLL1_160M_CLK:
+       case SYSTEM_PLL2_200M_CLK:
+               pll_clke_mask = INTPLL_DIV5_CLKE_MASK;
+               div = 5;
+               break;
+
+       case SYSTEM_PLL1_133M_CLK:
+       case SYSTEM_PLL2_166M_CLK:
+               pll_clke_mask = INTPLL_DIV6_CLKE_MASK;
+               div = 6;
+               break;
+
+       case SYSTEM_PLL1_100M_CLK:
+       case SYSTEM_PLL2_125M_CLK:
+               pll_clke_mask = INTPLL_DIV8_CLKE_MASK;
+               div = 8;
+               break;
+
+       case SYSTEM_PLL1_80M_CLK:
+       case SYSTEM_PLL2_100M_CLK:
+               pll_clke_mask = INTPLL_DIV10_CLKE_MASK;
+               div = 10;
+               break;
+
+       case SYSTEM_PLL1_40M_CLK:
+       case SYSTEM_PLL2_50M_CLK:
+               pll_clke_mask = INTPLL_DIV20_CLKE_MASK;
+               div = 20;
+               break;
+       default:
+               return -EINVAL;
+       }
+
+       if ((pll_gnrl_ctl & pll_clke_mask) == 0)
+               return 0;
+
+       main_div = (pll_div_ctl & INTPLL_MAIN_DIV_MASK) >>
+               INTPLL_MAIN_DIV_SHIFT;
+       pre_div = (pll_div_ctl & INTPLL_PRE_DIV_MASK) >>
+               INTPLL_PRE_DIV_SHIFT;
+       post_div = (pll_div_ctl & INTPLL_POST_DIV_MASK) >>
+               INTPLL_POST_DIV_SHIFT;
+
+       /* FFVCO = (m * FFIN) / p, FFOUT = (m * FFIN) / (p * 2^s) */
+       freq = 24000000ULL * main_div;
+       return lldiv(freq, pre_div * (1 << post_div) * div);
+}
+
+u32 decode_fracpll(enum clk_root_src frac_pll)
+{
+       u32 pll_gnrl_ctl, pll_fdiv_ctl0, pll_fdiv_ctl1;
+       u32 main_div, pre_div, post_div, k;
+
+       switch (frac_pll) {
+       case DRAM_PLL1_CLK:
+               pll_gnrl_ctl = readl(&ana_pll->dram_pll_gnrl_ctl);
+               pll_fdiv_ctl0 = readl(&ana_pll->dram_pll_fdiv_ctl0);
+               pll_fdiv_ctl1 = readl(&ana_pll->dram_pll_fdiv_ctl1);
+               break;
+       case AUDIO_PLL1_CLK:
+               pll_gnrl_ctl = readl(&ana_pll->audio_pll1_gnrl_ctl);
+               pll_fdiv_ctl0 = readl(&ana_pll->audio_pll1_fdiv_ctl0);
+               pll_fdiv_ctl1 = readl(&ana_pll->audio_pll1_fdiv_ctl1);
+               break;
+       case AUDIO_PLL2_CLK:
+               pll_gnrl_ctl = readl(&ana_pll->audio_pll2_gnrl_ctl);
+               pll_fdiv_ctl0 = readl(&ana_pll->audio_pll2_fdiv_ctl0);
+               pll_fdiv_ctl1 = readl(&ana_pll->audio_pll2_fdiv_ctl1);
+               break;
+       case VIDEO_PLL_CLK:
+               pll_gnrl_ctl = readl(&ana_pll->video_pll1_gnrl_ctl);
+               pll_fdiv_ctl0 = readl(&ana_pll->video_pll1_fdiv_ctl0);
+               pll_fdiv_ctl1 = readl(&ana_pll->video_pll1_fdiv_ctl1);
+               break;
+       default:
+               printf("Not supported\n");
+               return 0;
+       }
+
+       /* Only support SYS_XTAL 24M, PAD_CLK not take into consideration */
+       if ((pll_gnrl_ctl & INTPLL_REF_CLK_SEL_MASK) != 0)
+               return 0;
+
+       if ((pll_gnrl_ctl & INTPLL_RST_MASK) == 0)
+               return 0;
+       /*
+        * When BYPASS is equal to 1, PLL enters the bypass mode
+        * regardless of the values of RESETB
+        */
+       if (pll_gnrl_ctl & INTPLL_BYPASS_MASK)
+               return 24000000u;
+
+       if (!(pll_gnrl_ctl & INTPLL_LOCK_MASK)) {
+               puts("pll not locked\n");
+               return 0;
+       }
+
+       if (!(pll_gnrl_ctl & INTPLL_CLKE_MASK))
+               return 0;
+
+       main_div = (pll_fdiv_ctl0 & INTPLL_MAIN_DIV_MASK) >>
+               INTPLL_MAIN_DIV_SHIFT;
+       pre_div = (pll_fdiv_ctl0 & INTPLL_PRE_DIV_MASK) >>
+               INTPLL_PRE_DIV_SHIFT;
+       post_div = (pll_fdiv_ctl0 & INTPLL_POST_DIV_MASK) >>
+               INTPLL_POST_DIV_SHIFT;
+
+       k = pll_fdiv_ctl1 & GENMASK(15, 0);
+
+       return lldiv((main_div * 65536 + k) * 24000000ULL,
+                    65536 * pre_div * (1 << post_div));
+}
+
+u32 get_root_src_clk(enum clk_root_src root_src)
+{
+       switch (root_src) {
+       case OSC_24M_CLK:
+               return 24000000u;
+       case OSC_HDMI_CLK:
+               return 26000000u;
+       case OSC_32K_CLK:
+               return 32000u;
+       case ARM_PLL_CLK:
+       case GPU_PLL_CLK:
+       case VPU_PLL_CLK:
+       case SYSTEM_PLL1_800M_CLK:
+       case SYSTEM_PLL1_400M_CLK:
+       case SYSTEM_PLL1_266M_CLK:
+       case SYSTEM_PLL1_200M_CLK:
+       case SYSTEM_PLL1_160M_CLK:
+       case SYSTEM_PLL1_133M_CLK:
+       case SYSTEM_PLL1_100M_CLK:
+       case SYSTEM_PLL1_80M_CLK:
+       case SYSTEM_PLL1_40M_CLK:
+       case SYSTEM_PLL2_1000M_CLK:
+       case SYSTEM_PLL2_500M_CLK:
+       case SYSTEM_PLL2_333M_CLK:
+       case SYSTEM_PLL2_250M_CLK:
+       case SYSTEM_PLL2_200M_CLK:
+       case SYSTEM_PLL2_166M_CLK:
+       case SYSTEM_PLL2_125M_CLK:
+       case SYSTEM_PLL2_100M_CLK:
+       case SYSTEM_PLL2_50M_CLK:
+       case SYSTEM_PLL3_CLK:
+               return decode_intpll(root_src);
+       case DRAM_PLL1_CLK:
+       case AUDIO_PLL1_CLK:
+       case AUDIO_PLL2_CLK:
+       case VIDEO_PLL_CLK:
+               return decode_fracpll(root_src);
+       default:
+               return 0;
+       }
+
+       return 0;
+}
+
+u32 get_root_clk(enum clk_root_index clock_id)
+{
+       enum clk_root_src root_src;
+       u32 post_podf, pre_podf, root_src_clk;
+
+       if (clock_root_enabled(clock_id) <= 0)
+               return 0;
+
+       if (clock_get_prediv(clock_id, &pre_podf) < 0)
+               return 0;
+
+       if (clock_get_postdiv(clock_id, &post_podf) < 0)
+               return 0;
+
+       if (clock_get_src(clock_id, &root_src) < 0)
+               return 0;
+
+       root_src_clk = get_root_src_clk(root_src);
+
+       return root_src_clk / (post_podf + 1) / (pre_podf + 1);
+}
+
 u32 mxc_get_clock(enum mxc_clock clk)
 {
-       struct clk *clkp;
-       int ret;
+       u32 val;
 
        switch (clk) {
-       case MXC_IPG_CLK:
-               ret = clk_get_by_id(IMX8MM_CLK_IPG_ROOT, &clkp);
-               if (ret)
-                       return 0;
-               return clk_get_rate(clkp);
        case MXC_ARM_CLK:
-               ret = clk_get_by_id(IMX8MM_CLK_A53_DIV, &clkp);
-               if (ret)
-                       return 0;
-               return clk_get_rate(clkp);
+               return get_root_clk(ARM_A53_CLK_ROOT);
+       case MXC_IPG_CLK:
+               clock_get_target_val(IPG_CLK_ROOT, &val);
+               val = val & 0x3;
+               return get_root_clk(AHB_CLK_ROOT) / 2 / (val + 1);
+       case MXC_CSPI_CLK:
+               return get_root_clk(ECSPI1_CLK_ROOT);
+       case MXC_ESDHC_CLK:
+               return get_root_clk(USDHC1_CLK_ROOT);
+       case MXC_ESDHC2_CLK:
+               return get_root_clk(USDHC2_CLK_ROOT);
+       case MXC_ESDHC3_CLK:
+               return get_root_clk(USDHC3_CLK_ROOT);
+       case MXC_I2C_CLK:
+               return get_root_clk(I2C1_CLK_ROOT);
+       case MXC_UART_CLK:
+               return get_root_clk(UART1_CLK_ROOT);
+       case MXC_QSPI_CLK:
+               return get_root_clk(QSPI_CLK_ROOT);
        default:
-               printf("%s: %d not supported\n", __func__, clk);
+               printf("Unsupported mxc_clock %d\n", clk);
+               break;
        }
 
        return 0;
index 2db5bde2116d7eb383134b69dccd390d2546f528..878f2be166f98bc097c52888bfe54b6d27b7cf9d 100644 (file)
@@ -326,16 +326,20 @@ unsigned int mxc_get_clock(enum mxc_clock clk)
 {
        u32 val;
 
-       if (clk == MXC_ARM_CLK)
+       switch(clk) {
+       case MXC_ARM_CLK:
                return get_root_clk(ARM_A53_CLK_ROOT);
-
-       if (clk == MXC_IPG_CLK) {
+       case MXC_IPG_CLK:
                clock_get_target_val(IPG_CLK_ROOT, &val);
                val = val & 0x3;
                return get_root_clk(AHB_CLK_ROOT) / (val + 1);
+       case MXC_ESDHC_CLK:
+               return get_root_clk(USDHC1_CLK_ROOT);
+       case MXC_ESDHC2_CLK:
+               return get_root_clk(USDHC2_CLK_ROOT);
+       default:
+               return get_root_clk(clk);
        }
-
-       return get_root_clk(clk);
 }
 
 u32 imx_get_uartclk(void)
index 09c5615004b4b8e22f487771c547a6ee95439a50..31925ccaba9fb94a35b69515e7fd4f925151e09f 100644 (file)
@@ -538,6 +538,278 @@ static struct clk_root_map root_array[] = {
         {DRAM_PLL1_CLK}
        },
 };
+#elif defined(CONFIG_IMX8MP)
+static struct clk_root_map root_array[] = {
+       {ARM_A53_CLK_ROOT, CORE_CLOCK_SLICE, 0,
+        {OSC_24M_CLK, ARM_PLL_CLK, SYSTEM_PLL2_500M_CLK,
+         SYSTEM_PLL2_1000M_CLK, SYSTEM_PLL1_800M_CLK,
+         SYSTEM_PLL1_400M_CLK, AUDIO_PLL1_CLK, SYSTEM_PLL3_CLK}
+       },
+       {ARM_M7_CLK_ROOT, CORE_CLOCK_SLICE, 1,
+        {OSC_24M_CLK, SYSTEM_PLL2_200M_CLK, SYSTEM_PLL2_250M_CLK,
+         VPU_PLL_CLK, SYSTEM_PLL1_800M_CLK,
+         AUDIO_PLL1_CLK, VIDEO_PLL_CLK, SYSTEM_PLL3_CLK}
+       },
+       {ML_CLK_ROOT, CORE_CLOCK_SLICE, 2,
+        {OSC_24M_CLK, SYSTEM_PLL2_200M_CLK, SYSTEM_PLL2_250M_CLK,
+         VPU_PLL_CLK, SYSTEM_PLL1_800M_CLK,
+         AUDIO_PLL1_CLK, VIDEO_PLL_CLK, SYSTEM_PLL3_CLK}
+       },
+       {HSIO_AXI_CLK_ROOT, CORE_CLOCK_SLICE, 7,
+        {OSC_24M_CLK, SYSTEM_PLL2_500M_CLK, SYSTEM_PLL1_800M_CLK,
+         SYSTEM_PLL2_100M_CLK, SYSTEM_PLL2_200M_CLK, EXT_CLK_2,
+         EXT_CLK_4, AUDIO_PLL2_CLK}
+       },
+       {MAIN_AXI_CLK_ROOT, BUS_CLOCK_SLICE, 0,
+        {OSC_24M_CLK, SYSTEM_PLL2_333M_CLK, SYSTEM_PLL1_800M_CLK,
+         SYSTEM_PLL2_250M_CLK, SYSTEM_PLL2_1000M_CLK, AUDIO_PLL1_CLK,
+         VIDEO_PLL_CLK, SYSTEM_PLL1_100M_CLK}
+       },
+       {ENET_AXI_CLK_ROOT, BUS_CLOCK_SLICE, 1,
+        {OSC_24M_CLK, SYSTEM_PLL1_266M_CLK, SYSTEM_PLL1_800M_CLK,
+         SYSTEM_PLL2_250M_CLK, SYSTEM_PLL2_200M_CLK, AUDIO_PLL1_CLK,
+         VIDEO_PLL_CLK, SYSTEM_PLL3_CLK}
+       },
+       {NAND_USDHC_BUS_CLK_ROOT, BUS_CLOCK_SLICE, 2,
+        {OSC_24M_CLK, SYSTEM_PLL1_266M_CLK, SYSTEM_PLL1_800M_CLK,
+         SYSTEM_PLL2_200M_CLK, SYSTEM_PLL1_133M_CLK,
+         SYSTEM_PLL3_CLK, SYSTEM_PLL2_250M_CLK, AUDIO_PLL1_CLK}
+       },
+       {NOC_CLK_ROOT, BUS_CLOCK_SLICE, 10,
+        {OSC_24M_CLK, SYSTEM_PLL1_800M_CLK, SYSTEM_PLL3_CLK,
+         SYSTEM_PLL2_1000M_CLK, SYSTEM_PLL2_500M_CLK,
+         AUDIO_PLL1_CLK, VIDEO_PLL_CLK, AUDIO_PLL2_CLK}
+       },
+       {NOC_IO_CLK_ROOT, BUS_CLOCK_SLICE, 11,
+        {OSC_24M_CLK, SYSTEM_PLL1_800M_CLK, SYSTEM_PLL3_CLK,
+         SYSTEM_PLL2_1000M_CLK, SYSTEM_PLL2_500M_CLK,
+         AUDIO_PLL1_CLK, VIDEO_PLL_CLK, AUDIO_PLL2_CLK}
+       },
+       {ML_AXI_CLK_ROOT, BUS_CLOCK_SLICE, 12,
+        {OSC_24M_CLK, SYSTEM_PLL1_800M_CLK, GPU_PLL_CLK,
+         SYSTEM_PLL3_CLK, SYSTEM_PLL2_1000M_CLK,
+         AUDIO_PLL1_CLK, VIDEO_PLL_CLK, AUDIO_PLL2_CLK}
+       },
+       {ML_AHB_CLK_ROOT, BUS_CLOCK_SLICE, 13,
+        {OSC_24M_CLK, SYSTEM_PLL1_800M_CLK, GPU_PLL_CLK,
+         SYSTEM_PLL3_CLK, SYSTEM_PLL2_1000M_CLK,
+         AUDIO_PLL1_CLK, VIDEO_PLL_CLK, AUDIO_PLL2_CLK}
+       },
+       {AHB_CLK_ROOT, AHB_CLOCK_SLICE, 0,
+        {OSC_24M_CLK, SYSTEM_PLL1_133M_CLK, SYSTEM_PLL1_800M_CLK,
+         SYSTEM_PLL1_400M_CLK, SYSTEM_PLL2_125M_CLK,
+         SYSTEM_PLL3_CLK, AUDIO_PLL1_CLK, VIDEO_PLL_CLK}
+       },
+       {DRAM_ALT_CLK_ROOT, IP_CLOCK_SLICE, 0,
+        {OSC_24M_CLK, SYSTEM_PLL1_800M_CLK, SYSTEM_PLL1_100M_CLK,
+         SYSTEM_PLL2_500M_CLK, SYSTEM_PLL2_1000M_CLK,
+         SYSTEM_PLL3_CLK, AUDIO_PLL1_CLK, SYSTEM_PLL1_266M_CLK}
+       },
+       {DRAM_APB_CLK_ROOT, IP_CLOCK_SLICE, 1,
+        {OSC_24M_CLK, SYSTEM_PLL2_200M_CLK, SYSTEM_PLL1_40M_CLK,
+         SYSTEM_PLL1_160M_CLK, SYSTEM_PLL1_800M_CLK,
+         SYSTEM_PLL3_CLK, SYSTEM_PLL2_250M_CLK, AUDIO_PLL2_CLK}
+       },
+       {MEMREPAIR_CLK_ROOT, IP_CLOCK_SLICE, 6,
+        {OSC_24M_CLK, SYSTEM_PLL1_160M_CLK, SYSTEM_PLL2_50M_CLK,
+         SYSTEM_PLL3_CLK, AUDIO_PLL1_CLK, VIDEO_PLL_CLK, AUDIO_PLL2_CLK,
+         SYSTEM_PLL1_133M_CLK}
+       },
+       {I2C5_CLK_ROOT, IP_CLOCK_SLICE, 9,
+        {OSC_24M_CLK, SYSTEM_PLL1_160M_CLK, SYSTEM_PLL2_50M_CLK,
+         SYSTEM_PLL3_CLK, AUDIO_PLL1_CLK, VIDEO_PLL_CLK, AUDIO_PLL2_CLK,
+         SYSTEM_PLL1_133M_CLK}
+       },
+       {I2C6_CLK_ROOT, IP_CLOCK_SLICE, 10,
+        {OSC_24M_CLK, SYSTEM_PLL1_160M_CLK, SYSTEM_PLL2_50M_CLK,
+         SYSTEM_PLL3_CLK, AUDIO_PLL1_CLK, VIDEO_PLL_CLK, AUDIO_PLL2_CLK,
+         SYSTEM_PLL1_133M_CLK}
+       },
+       {ENET_QOS_CLK_ROOT, IP_CLOCK_SLICE, 17,
+        {OSC_24M_CLK, SYSTEM_PLL2_125M_CLK, SYSTEM_PLL2_50M_CLK,
+         SYSTEM_PLL2_100M_CLK, SYSTEM_PLL1_160M_CLK,
+         AUDIO_PLL1_CLK, VIDEO_PLL_CLK, EXT_CLK_4}
+       },
+       {ENET_QOS_TIMER_CLK_ROOT, IP_CLOCK_SLICE, 18,
+        {OSC_24M_CLK, SYSTEM_PLL2_100M_CLK, AUDIO_PLL1_CLK, EXT_CLK_1,
+         EXT_CLK_2, EXT_CLK_3, EXT_CLK_4, VIDEO_PLL_CLK}
+       },
+       {ENET_REF_CLK_ROOT, IP_CLOCK_SLICE, 19,
+        {OSC_24M_CLK, SYSTEM_PLL2_125M_CLK, SYSTEM_PLL2_50M_CLK,
+         SYSTEM_PLL2_100M_CLK, SYSTEM_PLL1_160M_CLK,
+         AUDIO_PLL1_CLK, VIDEO_PLL_CLK, EXT_CLK_4}
+       },
+       {ENET_TIMER_CLK_ROOT, IP_CLOCK_SLICE, 20,
+        {OSC_24M_CLK, SYSTEM_PLL2_100M_CLK, AUDIO_PLL1_CLK, EXT_CLK_1,
+         EXT_CLK_2, EXT_CLK_3, EXT_CLK_4, VIDEO_PLL_CLK}
+       },
+       {ENET_PHY_REF_CLK_ROOT, IP_CLOCK_SLICE, 21,
+        {OSC_24M_CLK, SYSTEM_PLL2_50M_CLK, SYSTEM_PLL2_125M_CLK,
+         SYSTEM_PLL2_200M_CLK, SYSTEM_PLL2_500M_CLK, AUDIO_PLL1_CLK,
+         VIDEO_PLL_CLK, AUDIO_PLL2_CLK}
+       },
+       {NAND_CLK_ROOT, IP_CLOCK_SLICE, 22,
+        {OSC_24M_CLK, SYSTEM_PLL2_500M_CLK, AUDIO_PLL1_CLK,
+         SYSTEM_PLL1_400M_CLK, AUDIO_PLL2_CLK, SYSTEM_PLL3_CLK,
+         SYSTEM_PLL2_250M_CLK, VIDEO_PLL_CLK}
+       },
+       {QSPI_CLK_ROOT, IP_CLOCK_SLICE, 23,
+        {OSC_24M_CLK, SYSTEM_PLL1_400M_CLK, SYSTEM_PLL2_333M_CLK,
+         SYSTEM_PLL2_500M_CLK, AUDIO_PLL2_CLK,
+         SYSTEM_PLL1_266M_CLK, SYSTEM_PLL3_CLK, SYSTEM_PLL1_100M_CLK}
+       },
+       {USDHC1_CLK_ROOT, IP_CLOCK_SLICE, 24,
+        {OSC_24M_CLK, SYSTEM_PLL1_400M_CLK, SYSTEM_PLL1_800M_CLK,
+         SYSTEM_PLL2_500M_CLK, SYSTEM_PLL3_CLK,
+         SYSTEM_PLL1_266M_CLK, AUDIO_PLL2_CLK, SYSTEM_PLL1_100M_CLK}
+       },
+       {USDHC2_CLK_ROOT, IP_CLOCK_SLICE, 25,
+        {OSC_24M_CLK, SYSTEM_PLL1_400M_CLK, SYSTEM_PLL1_800M_CLK,
+         SYSTEM_PLL2_500M_CLK, SYSTEM_PLL3_CLK,
+         SYSTEM_PLL1_266M_CLK, AUDIO_PLL2_CLK, SYSTEM_PLL1_100M_CLK}
+       },
+       {I2C1_CLK_ROOT, IP_CLOCK_SLICE, 26,
+        {OSC_24M_CLK, SYSTEM_PLL1_160M_CLK, SYSTEM_PLL2_50M_CLK,
+         SYSTEM_PLL3_CLK, AUDIO_PLL1_CLK, VIDEO_PLL_CLK,
+         AUDIO_PLL2_CLK, SYSTEM_PLL1_133M_CLK}
+       },
+       {I2C2_CLK_ROOT, IP_CLOCK_SLICE, 27,
+        {OSC_24M_CLK, SYSTEM_PLL1_160M_CLK, SYSTEM_PLL2_50M_CLK,
+         SYSTEM_PLL3_CLK, AUDIO_PLL1_CLK, VIDEO_PLL_CLK,
+         AUDIO_PLL2_CLK, SYSTEM_PLL1_133M_CLK}
+       },
+       {I2C3_CLK_ROOT, IP_CLOCK_SLICE, 28,
+        {OSC_24M_CLK, SYSTEM_PLL1_160M_CLK, SYSTEM_PLL2_50M_CLK,
+         SYSTEM_PLL3_CLK, AUDIO_PLL1_CLK, VIDEO_PLL_CLK,
+         AUDIO_PLL2_CLK, SYSTEM_PLL1_133M_CLK}
+       },
+       {I2C4_CLK_ROOT, IP_CLOCK_SLICE, 29,
+        {OSC_24M_CLK, SYSTEM_PLL1_160M_CLK, SYSTEM_PLL2_50M_CLK,
+         SYSTEM_PLL3_CLK, AUDIO_PLL1_CLK, VIDEO_PLL_CLK,
+         AUDIO_PLL2_CLK, SYSTEM_PLL1_133M_CLK}
+       },
+       {UART1_CLK_ROOT, IP_CLOCK_SLICE, 30,
+        {OSC_24M_CLK, SYSTEM_PLL1_80M_CLK, SYSTEM_PLL2_200M_CLK,
+         SYSTEM_PLL2_100M_CLK, SYSTEM_PLL3_CLK,
+         EXT_CLK_2, EXT_CLK_4, AUDIO_PLL2_CLK}
+       },
+       {UART2_CLK_ROOT, IP_CLOCK_SLICE, 31,
+        {OSC_24M_CLK, SYSTEM_PLL1_80M_CLK, SYSTEM_PLL2_200M_CLK,
+         SYSTEM_PLL2_100M_CLK, SYSTEM_PLL3_CLK,
+         EXT_CLK_2, EXT_CLK_3, AUDIO_PLL2_CLK}
+       },
+       {UART3_CLK_ROOT, IP_CLOCK_SLICE, 32,
+        {OSC_24M_CLK, SYSTEM_PLL1_80M_CLK, SYSTEM_PLL2_200M_CLK,
+         SYSTEM_PLL2_100M_CLK, SYSTEM_PLL3_CLK,
+         EXT_CLK_2, EXT_CLK_4, AUDIO_PLL2_CLK}
+       },
+       {UART4_CLK_ROOT, IP_CLOCK_SLICE, 33,
+        {OSC_24M_CLK, SYSTEM_PLL1_80M_CLK, SYSTEM_PLL2_200M_CLK,
+         SYSTEM_PLL2_100M_CLK, SYSTEM_PLL3_CLK,
+         EXT_CLK_2, EXT_CLK_3, AUDIO_PLL2_CLK}
+       },
+       {USB_PHY_REF_CLK_ROOT, IP_CLOCK_SLICE, 35,
+        {OSC_24M_CLK, SYSTEM_PLL1_100M_CLK, SYSTEM_PLL1_40M_CLK,
+         SYSTEM_PLL2_100M_CLK, SYSTEM_PLL2_200M_CLK,
+         EXT_CLK_2, EXT_CLK_3, AUDIO_PLL2_CLK}
+       },
+       {GIC_CLK_ROOT, IP_CLOCK_SLICE, 36,
+        {OSC_24M_CLK, SYSTEM_PLL2_200M_CLK, SYSTEM_PLL1_40M_CLK,
+         SYSTEM_PLL2_100M_CLK, SYSTEM_PLL1_800M_CLK,
+         EXT_CLK_2, EXT_CLK_4, AUDIO_PLL2_CLK}
+       },
+       {ECSPI1_CLK_ROOT, IP_CLOCK_SLICE, 37,
+        {OSC_24M_CLK, SYSTEM_PLL2_200M_CLK, SYSTEM_PLL1_40M_CLK,
+         SYSTEM_PLL1_160M_CLK, SYSTEM_PLL1_800M_CLK,
+         SYSTEM_PLL3_CLK, SYSTEM_PLL2_250M_CLK, AUDIO_PLL2_CLK}
+       },
+       {ECSPI2_CLK_ROOT, IP_CLOCK_SLICE, 38,
+        {OSC_24M_CLK, SYSTEM_PLL2_200M_CLK, SYSTEM_PLL1_40M_CLK,
+         SYSTEM_PLL1_160M_CLK, SYSTEM_PLL1_800M_CLK,
+         SYSTEM_PLL3_CLK, SYSTEM_PLL2_250M_CLK, AUDIO_PLL2_CLK}
+       },
+       {PWM1_CLK_ROOT, IP_CLOCK_SLICE, 39,
+        {OSC_24M_CLK, SYSTEM_PLL2_100M_CLK, SYSTEM_PLL1_160M_CLK,
+         SYSTEM_PLL1_40M_CLK, SYSTEM_PLL3_CLK, EXT_CLK_1,
+         SYSTEM_PLL1_80M_CLK, VIDEO_PLL_CLK}
+       },
+       {PWM2_CLK_ROOT, IP_CLOCK_SLICE, 40,
+        {OSC_24M_CLK, SYSTEM_PLL2_100M_CLK, SYSTEM_PLL1_160M_CLK,
+         SYSTEM_PLL1_40M_CLK, SYSTEM_PLL3_CLK, EXT_CLK_1,
+         SYSTEM_PLL1_80M_CLK, VIDEO_PLL_CLK}
+       },
+       {PWM3_CLK_ROOT, IP_CLOCK_SLICE, 41,
+        {OSC_24M_CLK, SYSTEM_PLL2_100M_CLK, SYSTEM_PLL1_160M_CLK,
+         SYSTEM_PLL1_40M_CLK, SYSTEM_PLL3_CLK, EXT_CLK_2,
+         SYSTEM_PLL1_80M_CLK, VIDEO_PLL_CLK}
+       },
+       {PWM4_CLK_ROOT, IP_CLOCK_SLICE, 42,
+        {OSC_24M_CLK, SYSTEM_PLL2_100M_CLK, SYSTEM_PLL1_160M_CLK,
+         SYSTEM_PLL1_40M_CLK, SYSTEM_PLL3_CLK, EXT_CLK_2,
+         SYSTEM_PLL1_80M_CLK, VIDEO_PLL_CLK}
+       },
+       {GPT1_CLK_ROOT, IP_CLOCK_SLICE, 43,
+        {OSC_24M_CLK, SYSTEM_PLL2_100M_CLK, SYSTEM_PLL1_400M_CLK,
+         SYSTEM_PLL1_40M_CLK, VIDEO_PLL_CLK,
+         SYSTEM_PLL1_80M_CLK, AUDIO_PLL1_CLK, EXT_CLK_1}
+       },
+       {GPT2_CLK_ROOT, IP_CLOCK_SLICE, 44,
+        {OSC_24M_CLK, SYSTEM_PLL2_100M_CLK, SYSTEM_PLL1_400M_CLK,
+         SYSTEM_PLL1_40M_CLK, VIDEO_PLL_CLK,
+         SYSTEM_PLL1_80M_CLK, AUDIO_PLL1_CLK, EXT_CLK_2}
+       },
+       {GPT3_CLK_ROOT, IP_CLOCK_SLICE, 45,
+        {OSC_24M_CLK, SYSTEM_PLL2_100M_CLK, SYSTEM_PLL1_400M_CLK,
+         SYSTEM_PLL1_40M_CLK, VIDEO_PLL_CLK,
+         SYSTEM_PLL1_80M_CLK, AUDIO_PLL1_CLK, EXT_CLK_3}
+       },
+       {GPT4_CLK_ROOT, IP_CLOCK_SLICE, 46,
+        {OSC_24M_CLK, SYSTEM_PLL2_100M_CLK, SYSTEM_PLL1_400M_CLK,
+         SYSTEM_PLL1_40M_CLK, VIDEO_PLL_CLK,
+         SYSTEM_PLL1_80M_CLK, AUDIO_PLL1_CLK, EXT_CLK_1}
+       },
+       {GPT5_CLK_ROOT, IP_CLOCK_SLICE, 47,
+        {OSC_24M_CLK, SYSTEM_PLL2_100M_CLK, SYSTEM_PLL1_400M_CLK,
+         SYSTEM_PLL1_40M_CLK, VIDEO_PLL_CLK,
+         SYSTEM_PLL1_80M_CLK, AUDIO_PLL1_CLK, EXT_CLK_2}
+       },
+       {GPT6_CLK_ROOT, IP_CLOCK_SLICE, 48,
+        {OSC_24M_CLK, SYSTEM_PLL2_100M_CLK, SYSTEM_PLL1_400M_CLK,
+         SYSTEM_PLL1_40M_CLK, VIDEO_PLL_CLK,
+         SYSTEM_PLL1_80M_CLK, AUDIO_PLL1_CLK, EXT_CLK_3}
+       },
+       {TRACE_CLK_ROOT, IP_CLOCK_SLICE, 49,
+        {OSC_24M_CLK, SYSTEM_PLL1_133M_CLK, SYSTEM_PLL1_160M_CLK,
+         VPU_PLL_CLK, SYSTEM_PLL2_125M_CLK,
+         SYSTEM_PLL3_CLK, EXT_CLK_1, EXT_CLK_3}
+       },
+       {WDOG_CLK_ROOT, IP_CLOCK_SLICE, 50,
+        {OSC_24M_CLK, SYSTEM_PLL1_133M_CLK, SYSTEM_PLL1_160M_CLK,
+         VPU_PLL_CLK, SYSTEM_PLL2_125M_CLK,
+         SYSTEM_PLL3_CLK, SYSTEM_PLL1_80M_CLK, SYSTEM_PLL2_166M_CLK}
+       },
+       {WRCLK_CLK_ROOT, IP_CLOCK_SLICE, 51,
+        {OSC_24M_CLK, SYSTEM_PLL1_40M_CLK, VPU_PLL_CLK,
+         SYSTEM_PLL3_CLK, SYSTEM_PLL2_200M_CLK,
+         SYSTEM_PLL1_266M_CLK, SYSTEM_PLL2_500M_CLK, SYSTEM_PLL1_100M_CLK}
+       },
+       {USDHC3_CLK_ROOT, IP_CLOCK_SLICE, 57,
+        {OSC_24M_CLK, SYSTEM_PLL1_400M_CLK, SYSTEM_PLL1_800M_CLK,
+         SYSTEM_PLL2_500M_CLK, SYSTEM_PLL3_CLK,
+         SYSTEM_PLL1_266M_CLK, AUDIO_PLL2_CLK, SYSTEM_PLL1_100M_CLK}
+       },
+       {ECSPI3_CLK_ROOT, IP_CLOCK_SLICE, 67,
+        {OSC_24M_CLK, SYSTEM_PLL2_200M_CLK, SYSTEM_PLL1_40M_CLK,
+         SYSTEM_PLL1_160M_CLK, SYSTEM_PLL1_800M_CLK,
+         SYSTEM_PLL3_CLK, SYSTEM_PLL2_250M_CLK, AUDIO_PLL2_CLK}
+       },
+       {DRAM_SEL_CFG, DRAM_SEL_CLOCK_SLICE, 0,
+        {DRAM_PLL1_CLK}
+       },
+       {CORE_SEL_CFG, CORE_SEL_CLOCK_SLICE, 0,
+        {DRAM_PLL1_CLK}
+       },
+};
 #endif
 
 static int select(enum clk_root_index clock_id)
diff --git a/arch/arm/mach-imx/imx8m/imximage-8mp-lpddr4.cfg b/arch/arm/mach-imx/imx8m/imximage-8mp-lpddr4.cfg
new file mode 100644 (file)
index 0000000..586a5ff
--- /dev/null
@@ -0,0 +1,17 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
+/*
+ * Copyright 2019 NXP
+ */
+
+#define __ASSEMBLY__
+
+FIT
+ROM_VERSION    v2
+BOOT_FROM      sd
+LOADER         spl/u-boot-spl-ddr.bin  0x920000
+SECOND_LOADER  u-boot.itb              0x40200000 0x60000
+
+DDR_FW lpddr4_pmu_train_1d_imem.bin
+DDR_FW lpddr4_pmu_train_1d_dmem.bin
+DDR_FW lpddr4_pmu_train_2d_imem.bin
+DDR_FW lpddr4_pmu_train_2d_dmem.bin
index 5ce5a180e80148556a11d5909537a831b4f235b1..7fcbd53f3020644d422c0bf4b30317f430866b6b 100644 (file)
@@ -57,7 +57,7 @@ void enable_tzc380(void)
        /* Enable TZASC and lock setting */
        setbits_le32(&gpr->gpr[10], GPR_TZASC_EN);
        setbits_le32(&gpr->gpr[10], GPR_TZASC_EN_LOCK);
-       if (is_imx8mm() || is_imx8mn())
+       if (is_imx8mm() || is_imx8mn() || is_imx8mp())
                setbits_le32(&gpr->gpr[10], BIT(1));
        /*
         * set Region 0 attribute to allow secure and non-secure
@@ -197,8 +197,11 @@ u32 get_cpu_rev(void)
 
        reg &= 0xff;
 
-       /* i.MX8MM */
-       if (major_low == 0x42) {
+       /* iMX8MP */
+       if (major_low == 0x43) {
+               return (MXC_CPU_IMX8MP << 12) | reg;
+       } else if (major_low == 0x42) {
+               /* iMX8MN */
                return (MXC_CPU_IMX8MN << 12) | reg;
        } else if (major_low == 0x41) {
                type = get_cpu_variant_type(MXC_CPU_IMX8MM);
index dde1635a9da04c93b13f7350c2a0b2a8de1fd752..5a6493a6250a3819bf70f3172d365aa6a607dcaa 100644 (file)
@@ -135,7 +135,8 @@ u32 spl_boot_device(void)
 
        enum boot_device boot_device_spl = get_boot_device();
 
-       if (IS_ENABLED(CONFIG_IMX8MM) || IS_ENABLED(CONFIG_IMX8MN))
+       if (IS_ENABLED(CONFIG_IMX8MM) || IS_ENABLED(CONFIG_IMX8MN) ||
+           IS_ENABLED(CONFIG_IMX8MP))
                return spl_board_boot_device(boot_device_spl);
 
        switch (boot_device_spl) {
index e29e4c0acc06d0d843de16989a5ff80fe41d2f82..513a33dae2045f08829c8dd2af5c6a4ed1d210a7 100644 (file)
@@ -8,6 +8,7 @@ config MESON64_COMMON
        select DM_SERIAL
        select SYSCON
        select REGMAP
+       select PWRSEQ
        select BOARD_LATE_INIT
        imply CMD_DM
 
index 3770e0725857859c1606bccbc836c54e42304426..969698c83fa576fa8a8034aa8d95476049bd3df4 100644 (file)
@@ -29,6 +29,15 @@ config SYS_TEXT_BASE
        default 0x01000040 if TARGET_SOCFPGA_ARRIA10
        default 0x01000040 if TARGET_SOCFPGA_GEN5
 
+config TARGET_SOCFPGA_AGILEX
+       bool
+       select ARMV8_MULTIENTRY
+       select ARMV8_SET_SMPEN
+       select ARMV8_SPIN_TABLE
+       select CLK
+       select NCORE_CACHE
+       select SPL_CLK if SPL
+
 config TARGET_SOCFPGA_ARRIA5
        bool
        select TARGET_SOCFPGA_GEN5
@@ -75,6 +84,10 @@ choice
        prompt "Altera SOCFPGA board select"
        optional
 
+config TARGET_SOCFPGA_AGILEX_SOCDK
+       bool "Intel SOCFPGA SoCDK (Agilex)"
+       select TARGET_SOCFPGA_AGILEX
+
 config TARGET_SOCFPGA_ARIES_MCVEVK
        bool "Aries MCVEVK (Cyclone V)"
        select TARGET_SOCFPGA_CYCLONE5
@@ -135,6 +148,7 @@ config TARGET_SOCFPGA_TERASIC_SOCKIT
 endchoice
 
 config SYS_BOARD
+       default "agilex-socdk" if TARGET_SOCFPGA_AGILEX_SOCDK
        default "arria5-socdk" if TARGET_SOCFPGA_ARRIA5_SOCDK
        default "arria10-socdk" if TARGET_SOCFPGA_ARRIA10_SOCDK
        default "cyclone5-socdk" if TARGET_SOCFPGA_CYCLONE5_SOCDK
@@ -151,6 +165,7 @@ config SYS_BOARD
        default "vining_fpga" if TARGET_SOCFPGA_SOFTING_VINING_FPGA
 
 config SYS_VENDOR
+       default "intel" if TARGET_SOCFPGA_AGILEX_SOCDK
        default "altera" if TARGET_SOCFPGA_ARRIA5_SOCDK
        default "altera" if TARGET_SOCFPGA_ARRIA10_SOCDK
        default "altera" if TARGET_SOCFPGA_CYCLONE5_SOCDK
@@ -168,6 +183,7 @@ config SYS_SOC
        default "socfpga"
 
 config SYS_CONFIG_NAME
+       default "socfpga_agilex_socdk" if TARGET_SOCFPGA_AGILEX_SOCDK
        default "socfpga_arria5_socdk" if TARGET_SOCFPGA_ARRIA5_SOCDK
        default "socfpga_arria10_socdk" if TARGET_SOCFPGA_ARRIA10_SOCDK
        default "socfpga_cyclone5_socdk" if TARGET_SOCFPGA_CYCLONE5_SOCDK
index fc1181cb278b908937b25304e0936a6e8916c886..418f543b20fe850e6d552e76b671bc1e5f9a957f 100644 (file)
@@ -39,6 +39,18 @@ obj-y        += wrap_pinmux_config_s10.o
 obj-y  += wrap_pll_config_s10.o
 endif
 
+ifdef CONFIG_TARGET_SOCFPGA_AGILEX
+obj-y  += clock_manager_agilex.o
+obj-y  += mailbox_s10.o
+obj-y  += misc_s10.o
+obj-y  += mmu-arm64_s10.o
+obj-y  += reset_manager_s10.o
+obj-y  += system_manager_s10.o
+obj-y  += timer_s10.o
+obj-y  += wrap_pinmux_config_s10.o
+obj-y  += wrap_pll_config_s10.o
+endif
+
 ifdef CONFIG_SPL_BUILD
 ifdef CONFIG_TARGET_SOCFPGA_GEN5
 obj-y  += spl_gen5.o
@@ -51,8 +63,13 @@ ifdef CONFIG_TARGET_SOCFPGA_ARRIA10
 obj-y  += spl_a10.o
 endif
 ifdef CONFIG_TARGET_SOCFPGA_STRATIX10
+obj-y  += firewall.o
 obj-y  += spl_s10.o
 endif
+ifdef CONFIG_TARGET_SOCFPGA_AGILEX
+obj-y  += firewall.o
+obj-y  += spl_agilex.o
+endif
 endif
 
 ifdef CONFIG_TARGET_SOCFPGA_GEN5
index 9f3c643df88998fab2ef0871e5fa6db050666ab7..dbb10ecb681cec7795a88d15a32f9f9f35488e3c 100644 (file)
 
 DECLARE_GLOBAL_DATA_PTR;
 
-static const struct socfpga_clock_manager *clock_manager_base =
-       (struct socfpga_clock_manager *)SOCFPGA_CLKMGR_ADDRESS;
-
 void cm_wait_for_lock(u32 mask)
 {
        u32 inter_val;
        u32 retry = 0;
        do {
 #if defined(CONFIG_TARGET_SOCFPGA_GEN5)
-               inter_val = readl(&clock_manager_base->inter) & mask;
+               inter_val = readl(socfpga_get_clkmgr_addr() +
+                                 CLKMGR_INTER) & mask;
 #else
-               inter_val = readl(&clock_manager_base->stat) & mask;
+               inter_val = readl(socfpga_get_clkmgr_addr() +
+                                 CLKMGR_STAT) & mask;
 #endif
                /* Wait for stable lock */
                if (inter_val == mask)
@@ -36,8 +35,9 @@ void cm_wait_for_lock(u32 mask)
 /* function to poll in the fsm busy bit */
 int cm_wait_for_fsm(void)
 {
-       return wait_for_bit_le32(&clock_manager_base->stat,
-                                CLKMGR_STAT_BUSY, false, 20000, false);
+       return wait_for_bit_le32((const void *)(socfpga_get_clkmgr_addr() +
+                                CLKMGR_STAT), CLKMGR_STAT_BUSY, false, 20000,
+                                false);
 }
 
 int set_cpu_clk_info(void)
diff --git a/arch/arm/mach-socfpga/clock_manager_agilex.c b/arch/arm/mach-socfpga/clock_manager_agilex.c
new file mode 100644 (file)
index 0000000..791066d
--- /dev/null
@@ -0,0 +1,85 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (C) 2019 Intel Corporation <www.intel.com>
+ *
+ */
+
+#include <clk.h>
+#include <common.h>
+#include <dm.h>
+#include <asm/arch/clock_manager.h>
+#include <asm/arch/system_manager.h>
+#include <asm/io.h>
+#include <dt-bindings/clock/agilex-clock.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+static ulong cm_get_rate_dm(u32 id)
+{
+       struct udevice *dev;
+       struct clk clk;
+       ulong rate;
+       int ret;
+
+       ret = uclass_get_device_by_driver(UCLASS_CLK,
+                                         DM_GET_DRIVER(socfpga_agilex_clk),
+                                         &dev);
+       if (ret)
+               return 0;
+
+       clk.id = id;
+       ret = clk_request(dev, &clk);
+       if (ret < 0)
+               return 0;
+
+       rate = clk_get_rate(&clk);
+
+       clk_free(&clk);
+
+       if ((rate == (unsigned long)-ENOSYS) ||
+           (rate == (unsigned long)-ENXIO) ||
+           (rate == (unsigned long)-EIO)) {
+               debug("%s id %u: clk_get_rate err: %ld\n",
+                     __func__, id, rate);
+               return 0;
+       }
+
+       return rate;
+}
+
+static u32 cm_get_rate_dm_khz(u32 id)
+{
+       return cm_get_rate_dm(id) / 1000;
+}
+
+unsigned long cm_get_mpu_clk_hz(void)
+{
+       return cm_get_rate_dm(AGILEX_MPU_CLK);
+}
+
+unsigned int cm_get_l4_sys_free_clk_hz(void)
+{
+       return cm_get_rate_dm(AGILEX_L4_SYS_FREE_CLK);
+}
+
+u32 cm_get_qspi_controller_clk_hz(void)
+{
+       return readl(socfpga_get_sysmgr_addr() +
+                    SYSMGR_SOC64_BOOT_SCRATCH_COLD0);
+}
+
+void cm_print_clock_quick_summary(void)
+{
+       printf("MPU       %10d kHz\n",
+              cm_get_rate_dm_khz(AGILEX_MPU_CLK));
+       printf("L4 Main     %8d kHz\n",
+              cm_get_rate_dm_khz(AGILEX_L4_MAIN_CLK));
+       printf("L4 sys free %8d kHz\n",
+              cm_get_rate_dm_khz(AGILEX_L4_SYS_FREE_CLK));
+       printf("L4 MP       %8d kHz\n",
+              cm_get_rate_dm_khz(AGILEX_L4_MP_CLK));
+       printf("L4 SP       %8d kHz\n",
+              cm_get_rate_dm_khz(AGILEX_L4_SP_CLK));
+       printf("SDMMC       %8d kHz\n",
+              cm_get_rate_dm_khz(AGILEX_SDMMC_CLK));
+}
index 334a79fd9c0f6daf7c0961e0c5e63af13237bd87..392f2eb915a9e4e5e724826f3a7446c2acb84bc5 100644 (file)
@@ -231,9 +231,6 @@ static int of_get_clk_cfg(const void *blob, struct mainpll_cfg *main_cfg,
        return 0;
 }
 
-static const struct socfpga_clock_manager *clock_manager_base =
-       (struct socfpga_clock_manager *)SOCFPGA_CLKMGR_ADDRESS;
-
 /* calculate the intended main VCO frequency based on handoff */
 static unsigned int cm_calc_handoff_main_vco_clk_hz
                                        (struct mainpll_cfg *main_cfg)
@@ -551,12 +548,13 @@ static void cm_pll_ramp_main(struct mainpll_cfg *main_cfg,
                writel((main_cfg->vco1_denom <<
                        CLKMGR_MAINPLL_VCO1_DENOM_LSB) |
                        cm_calc_safe_pll_numer(0, main_cfg, per_cfg, clk_hz),
-                       &clock_manager_base->main_pll.vco1);
+                       socfpga_get_clkmgr_addr() + CLKMGR_A10_MAINPLL_VCO1);
                mdelay(1);
                cm_wait_for_lock(LOCKED_MASK);
        }
        writel((main_cfg->vco1_denom << CLKMGR_MAINPLL_VCO1_DENOM_LSB) |
-               main_cfg->vco1_numer, &clock_manager_base->main_pll.vco1);
+               main_cfg->vco1_numer,
+               socfpga_get_clkmgr_addr() + CLKMGR_A10_MAINPLL_VCO1);
        mdelay(1);
        cm_wait_for_lock(LOCKED_MASK);
 }
@@ -579,14 +577,18 @@ static void cm_pll_ramp_periph(struct mainpll_cfg *main_cfg,
        /* execute the ramping here */
        for (clk_hz = pll_ramp_periph_hz + clk_incr_hz;
             clk_hz < clk_final_hz; clk_hz += clk_incr_hz) {
-               writel((per_cfg->vco1_denom << CLKMGR_PERPLL_VCO1_DENOM_LSB) |
-                       cm_calc_safe_pll_numer(1, main_cfg, per_cfg, clk_hz),
-                       &clock_manager_base->per_pll.vco1);
+               writel((per_cfg->vco1_denom <<
+                             CLKMGR_PERPLL_VCO1_DENOM_LSB) |
+                             cm_calc_safe_pll_numer(1, main_cfg, per_cfg,
+                                                    clk_hz),
+                             socfpga_get_clkmgr_addr() +
+                             CLKMGR_A10_PERPLL_VCO1);
                mdelay(1);
                cm_wait_for_lock(LOCKED_MASK);
        }
        writel((per_cfg->vco1_denom << CLKMGR_PERPLL_VCO1_DENOM_LSB) |
-               per_cfg->vco1_numer, &clock_manager_base->per_pll.vco1);
+                     per_cfg->vco1_numer,
+                     socfpga_get_clkmgr_addr() + CLKMGR_A10_PERPLL_VCO1);
        mdelay(1);
        cm_wait_for_lock(LOCKED_MASK);
 }
@@ -638,16 +640,16 @@ static int cm_full_cfg(struct mainpll_cfg *main_cfg, struct perpll_cfg *per_cfg)
        /* gate off all mainpll clock excpet HW managed clock */
        writel(CLKMGR_MAINPLL_EN_S2FUSER0CLKEN_SET_MSK |
                CLKMGR_MAINPLL_EN_HMCPLLREFCLKEN_SET_MSK,
-               &clock_manager_base->main_pll.enr);
+               socfpga_get_clkmgr_addr() + CLKMGR_A10_MAINPLL_ENR);
 
        /* now we can gate off the rest of the peripheral clocks */
-       writel(0, &clock_manager_base->per_pll.en);
+       writel(0, socfpga_get_clkmgr_addr() + CLKMGR_A10_PERPLL_EN);
 
        /* Put all plls in external bypass */
        writel(CLKMGR_MAINPLL_BYPASS_RESET,
-              &clock_manager_base->main_pll.bypasss);
+              socfpga_get_clkmgr_addr() + CLKMGR_A10_MAINPLL_BYPASSS);
        writel(CLKMGR_PERPLL_BYPASS_RESET,
-              &clock_manager_base->per_pll.bypasss);
+              socfpga_get_clkmgr_addr() + CLKMGR_A10_PERPLL_BYPASSS);
 
        /*
         * Put all plls VCO registers back to reset value.
@@ -657,15 +659,17 @@ static int cm_full_cfg(struct mainpll_cfg *main_cfg, struct perpll_cfg *per_cfg)
        writel(CLKMGR_MAINPLL_VCO0_RESET |
               CLKMGR_MAINPLL_VCO0_REGEXTSEL_SET_MSK |
               (main_cfg->vco0_psrc << CLKMGR_MAINPLL_VCO0_PSRC_LSB),
-              &clock_manager_base->main_pll.vco0);
+              socfpga_get_clkmgr_addr() + CLKMGR_A10_MAINPLL_VCO0);
 
        writel(CLKMGR_PERPLL_VCO0_RESET |
               CLKMGR_PERPLL_VCO0_REGEXTSEL_SET_MSK |
               (per_cfg->vco0_psrc << CLKMGR_PERPLL_VCO0_PSRC_LSB),
-              &clock_manager_base->per_pll.vco0);
+              socfpga_get_clkmgr_addr() + CLKMGR_A10_PERPLL_VCO0);
 
-       writel(CLKMGR_MAINPLL_VCO1_RESET, &clock_manager_base->main_pll.vco1);
-       writel(CLKMGR_PERPLL_VCO1_RESET, &clock_manager_base->per_pll.vco1);
+       writel(CLKMGR_MAINPLL_VCO1_RESET,
+              socfpga_get_clkmgr_addr() + CLKMGR_A10_MAINPLL_VCO1);
+       writel(CLKMGR_PERPLL_VCO1_RESET,
+              socfpga_get_clkmgr_addr() + CLKMGR_A10_PERPLL_VCO1);
 
        /* clear the interrupt register status register */
        writel(CLKMGR_CLKMGR_INTR_MAINPLLLOST_SET_MSK |
@@ -676,7 +680,7 @@ static int cm_full_cfg(struct mainpll_cfg *main_cfg, struct perpll_cfg *per_cfg)
                CLKMGR_CLKMGR_INTR_PERPLLFBSLIP_SET_MSK |
                CLKMGR_CLKMGR_INTR_MAINPLLACHIEVED_SET_MSK |
                CLKMGR_CLKMGR_INTR_PERPLLACHIEVED_SET_MSK,
-               &clock_manager_base->intr);
+               socfpga_get_clkmgr_addr() + CLKMGR_A10_INTR);
 
        /* Program VCO Numerator and Denominator for main PLL */
        ramp_required = cm_is_pll_ramp_required(0, main_cfg, per_cfg);
@@ -687,14 +691,16 @@ static int cm_full_cfg(struct mainpll_cfg *main_cfg, struct perpll_cfg *per_cfg)
                else if (ramp_required == 2)
                        pll_ramp_main_hz = CLKMGR_PLL_RAMP_NOCCLK_THRESHOLD_HZ;
 
-               writel((main_cfg->vco1_denom << CLKMGR_MAINPLL_VCO1_DENOM_LSB) |
+               writel((main_cfg->vco1_denom <<
+                       CLKMGR_MAINPLL_VCO1_DENOM_LSB) |
                        cm_calc_safe_pll_numer(0, main_cfg, per_cfg,
                                               pll_ramp_main_hz),
-                       &clock_manager_base->main_pll.vco1);
+                       socfpga_get_clkmgr_addr() + CLKMGR_A10_MAINPLL_VCO1);
        } else
-               writel((main_cfg->vco1_denom << CLKMGR_MAINPLL_VCO1_DENOM_LSB) |
-                       main_cfg->vco1_numer,
-                       &clock_manager_base->main_pll.vco1);
+               writel((main_cfg->vco1_denom <<
+                      CLKMGR_MAINPLL_VCO1_DENOM_LSB) |
+                      main_cfg->vco1_numer,
+                      socfpga_get_clkmgr_addr() + CLKMGR_A10_MAINPLL_VCO1);
 
        /* Program VCO Numerator and Denominator for periph PLL */
        ramp_required = cm_is_pll_ramp_required(1, main_cfg, per_cfg);
@@ -707,23 +713,25 @@ static int cm_full_cfg(struct mainpll_cfg *main_cfg, struct perpll_cfg *per_cfg)
                        pll_ramp_periph_hz =
                                CLKMGR_PLL_RAMP_NOCCLK_THRESHOLD_HZ;
 
-               writel((per_cfg->vco1_denom << CLKMGR_PERPLL_VCO1_DENOM_LSB) |
+               writel((per_cfg->vco1_denom <<
+                       CLKMGR_PERPLL_VCO1_DENOM_LSB) |
                        cm_calc_safe_pll_numer(1, main_cfg, per_cfg,
                                               pll_ramp_periph_hz),
-                       &clock_manager_base->per_pll.vco1);
+                       socfpga_get_clkmgr_addr() + CLKMGR_A10_PERPLL_VCO1);
        } else
-               writel((per_cfg->vco1_denom << CLKMGR_PERPLL_VCO1_DENOM_LSB) |
+               writel((per_cfg->vco1_denom <<
+                       CLKMGR_PERPLL_VCO1_DENOM_LSB) |
                        per_cfg->vco1_numer,
-                       &clock_manager_base->per_pll.vco1);
+                       socfpga_get_clkmgr_addr() + CLKMGR_A10_PERPLL_VCO1);
 
        /* Wait for at least 5 us */
        udelay(5);
 
        /* Now deassert BGPWRDN and PWRDN */
-       clrbits_le32(&clock_manager_base->main_pll.vco0,
+       clrbits_le32(socfpga_get_clkmgr_addr() + CLKMGR_A10_MAINPLL_VCO0,
                     CLKMGR_MAINPLL_VCO0_BGPWRDN_SET_MSK |
                     CLKMGR_MAINPLL_VCO0_PWRDN_SET_MSK);
-       clrbits_le32(&clock_manager_base->per_pll.vco0,
+       clrbits_le32(socfpga_get_clkmgr_addr() + CLKMGR_A10_PERPLL_VCO0,
                     CLKMGR_PERPLL_VCO0_BGPWRDN_SET_MSK |
                     CLKMGR_PERPLL_VCO0_PWRDN_SET_MSK);
 
@@ -731,84 +739,92 @@ static int cm_full_cfg(struct mainpll_cfg *main_cfg, struct perpll_cfg *per_cfg)
        udelay(7);
 
        /* enable the VCO and disable the external regulator to PLL */
-       writel((readl(&clock_manager_base->main_pll.vco0) &
+       writel((readl(socfpga_get_clkmgr_addr() + CLKMGR_A10_MAINPLL_VCO0) &
                ~CLKMGR_MAINPLL_VCO0_REGEXTSEL_SET_MSK) |
                CLKMGR_MAINPLL_VCO0_EN_SET_MSK,
-               &clock_manager_base->main_pll.vco0);
-       writel((readl(&clock_manager_base->per_pll.vco0) &
+               socfpga_get_clkmgr_addr() + CLKMGR_A10_MAINPLL_VCO0);
+       writel((readl(socfpga_get_clkmgr_addr() + CLKMGR_A10_PERPLL_VCO0) &
                ~CLKMGR_PERPLL_VCO0_REGEXTSEL_SET_MSK) |
                CLKMGR_PERPLL_VCO0_EN_SET_MSK,
-               &clock_manager_base->per_pll.vco0);
+               socfpga_get_clkmgr_addr() + CLKMGR_A10_PERPLL_VCO0);
 
        /* setup all the main PLL counter and clock source */
        writel(main_cfg->nocclk,
-              SOCFPGA_CLKMGR_ADDRESS + CLKMGR_MAINPLL_NOC_CLK_OFFSET);
+              socfpga_get_clkmgr_addr() + CLKMGR_A10_ALTR_NOCCLK);
        writel(main_cfg->mpuclk,
-              SOCFPGA_CLKMGR_ADDRESS + CLKMGR_ALTERAGRP_MPU_CLK_OFFSET);
+              socfpga_get_clkmgr_addr() + CLKMGR_A10_ALTR_MPUCLK);
 
        /* main_emaca_clk divider */
-       writel(main_cfg->cntr2clk_cnt, &clock_manager_base->main_pll.cntr2clk);
+       writel(main_cfg->cntr2clk_cnt,
+              socfpga_get_clkmgr_addr() + CLKMGR_A10_MAINPLL_CNTR2CLK);
        /* main_emacb_clk divider */
-       writel(main_cfg->cntr3clk_cnt, &clock_manager_base->main_pll.cntr3clk);
+       writel(main_cfg->cntr3clk_cnt,
+              socfpga_get_clkmgr_addr() + CLKMGR_A10_MAINPLL_CNTR3CLK);
        /* main_emac_ptp_clk divider */
-       writel(main_cfg->cntr4clk_cnt, &clock_manager_base->main_pll.cntr4clk);
+       writel(main_cfg->cntr4clk_cnt,
+              socfpga_get_clkmgr_addr() + CLKMGR_A10_MAINPLL_CNTR4CLK);
        /* main_gpio_db_clk divider */
-       writel(main_cfg->cntr5clk_cnt, &clock_manager_base->main_pll.cntr5clk);
+       writel(main_cfg->cntr5clk_cnt,
+              socfpga_get_clkmgr_addr() + CLKMGR_A10_MAINPLL_CNTR5CLK);
        /* main_sdmmc_clk divider */
-       writel(main_cfg->cntr6clk_cnt, &clock_manager_base->main_pll.cntr6clk);
+       writel(main_cfg->cntr6clk_cnt,
+              socfpga_get_clkmgr_addr() + CLKMGR_A10_MAINPLL_CNTR6CLK);
        /* main_s2f_user0_clk divider */
        writel(main_cfg->cntr7clk_cnt |
               (main_cfg->cntr7clk_src << CLKMGR_MAINPLL_CNTR7CLK_SRC_LSB),
-              &clock_manager_base->main_pll.cntr7clk);
+              socfpga_get_clkmgr_addr() + CLKMGR_A10_MAINPLL_CNTR7CLK);
        /* main_s2f_user1_clk divider */
-       writel(main_cfg->cntr8clk_cnt, &clock_manager_base->main_pll.cntr8clk);
+       writel(main_cfg->cntr8clk_cnt,
+              socfpga_get_clkmgr_addr() + CLKMGR_A10_MAINPLL_CNTR8CLK);
        /* main_hmc_pll_clk divider */
        writel(main_cfg->cntr9clk_cnt |
               (main_cfg->cntr9clk_src << CLKMGR_MAINPLL_CNTR9CLK_SRC_LSB),
-              &clock_manager_base->main_pll.cntr9clk);
+              socfpga_get_clkmgr_addr() + CLKMGR_A10_MAINPLL_CNTR9CLK);
        /* main_periph_ref_clk divider */
        writel(main_cfg->cntr15clk_cnt,
-              &clock_manager_base->main_pll.cntr15clk);
+              socfpga_get_clkmgr_addr() + CLKMGR_A10_MAINPLL_CNTR15CLK);
 
        /* setup all the peripheral PLL counter and clock source */
        /* peri_emaca_clk divider */
        writel(per_cfg->cntr2clk_cnt |
               (per_cfg->cntr2clk_src << CLKMGR_PERPLL_CNTR2CLK_SRC_LSB),
-              &clock_manager_base->per_pll.cntr2clk);
+              socfpga_get_clkmgr_addr() + CLKMGR_A10_PERPLL_CNTR2CLK);
        /* peri_emacb_clk divider */
        writel(per_cfg->cntr3clk_cnt |
               (per_cfg->cntr3clk_src << CLKMGR_PERPLL_CNTR3CLK_SRC_LSB),
-              &clock_manager_base->per_pll.cntr3clk);
+              socfpga_get_clkmgr_addr() + CLKMGR_A10_PERPLL_CNTR3CLK);
        /* peri_emac_ptp_clk divider */
        writel(per_cfg->cntr4clk_cnt |
               (per_cfg->cntr4clk_src << CLKMGR_PERPLL_CNTR4CLK_SRC_LSB),
-              &clock_manager_base->per_pll.cntr4clk);
+              socfpga_get_clkmgr_addr() + CLKMGR_A10_PERPLL_CNTR4CLK);
        /* peri_gpio_db_clk divider */
        writel(per_cfg->cntr5clk_cnt |
               (per_cfg->cntr5clk_src << CLKMGR_PERPLL_CNTR5CLK_SRC_LSB),
-              &clock_manager_base->per_pll.cntr5clk);
+              socfpga_get_clkmgr_addr() + CLKMGR_A10_PERPLL_CNTR5CLK);
        /* peri_sdmmc_clk divider */
        writel(per_cfg->cntr6clk_cnt |
               (per_cfg->cntr6clk_src << CLKMGR_PERPLL_CNTR6CLK_SRC_LSB),
-              &clock_manager_base->per_pll.cntr6clk);
+              socfpga_get_clkmgr_addr() + CLKMGR_A10_PERPLL_CNTR6CLK);
        /* peri_s2f_user0_clk divider */
-       writel(per_cfg->cntr7clk_cnt, &clock_manager_base->per_pll.cntr7clk);
+       writel(per_cfg->cntr7clk_cnt,
+              socfpga_get_clkmgr_addr() + CLKMGR_A10_PERPLL_CNTR7CLK);
        /* peri_s2f_user1_clk divider */
        writel(per_cfg->cntr8clk_cnt |
               (per_cfg->cntr8clk_src << CLKMGR_PERPLL_CNTR8CLK_SRC_LSB),
-              &clock_manager_base->per_pll.cntr8clk);
+              socfpga_get_clkmgr_addr() + CLKMGR_A10_PERPLL_CNTR8CLK);
        /* peri_hmc_pll_clk divider */
-       writel(per_cfg->cntr9clk_cnt, &clock_manager_base->per_pll.cntr9clk);
+       writel(per_cfg->cntr9clk_cnt,
+              socfpga_get_clkmgr_addr() + CLKMGR_A10_PERPLL_CNTR9CLK);
 
        /* setup all the external PLL counter */
        /* mpu wrapper / external divider */
        writel(main_cfg->mpuclk_cnt |
               (main_cfg->mpuclk_src << CLKMGR_MAINPLL_MPUCLK_SRC_LSB),
-              &clock_manager_base->main_pll.mpuclk);
+              socfpga_get_clkmgr_addr() + CLKMGR_A10_MAINPLL_MPUCLK);
        /* NOC wrapper / external divider */
        writel(main_cfg->nocclk_cnt |
               (main_cfg->nocclk_src << CLKMGR_MAINPLL_NOCCLK_SRC_LSB),
-              &clock_manager_base->main_pll.nocclk);
+              socfpga_get_clkmgr_addr() + CLKMGR_A10_MAINPLL_NOCCLK);
        /* NOC subclock divider such as l4 */
        writel(main_cfg->nocdiv_l4mainclk |
               (main_cfg->nocdiv_l4mpclk <<
@@ -821,10 +837,10 @@ static int cm_full_cfg(struct mainpll_cfg *main_cfg, struct perpll_cfg *per_cfg)
                CLKMGR_MAINPLL_NOCDIV_CSTRACECLK_LSB) |
               (main_cfg->nocdiv_cspdbclk <<
                CLKMGR_MAINPLL_NOCDIV_CSPDBGCLK_LSB),
-               &clock_manager_base->main_pll.nocdiv);
+              socfpga_get_clkmgr_addr() + CLKMGR_A10_MAINPLL_NOCDIV);
        /* gpio_db external divider */
        writel(per_cfg->gpiodiv_gpiodbclk,
-              &clock_manager_base->per_pll.gpiodiv);
+              socfpga_get_clkmgr_addr() + CLKMGR_A10_PERPLL_GPIOFIV);
 
        /* setup the EMAC clock mux select */
        writel((per_cfg->emacctl_emac0sel <<
@@ -833,7 +849,7 @@ static int cm_full_cfg(struct mainpll_cfg *main_cfg, struct perpll_cfg *per_cfg)
                CLKMGR_PERPLL_EMACCTL_EMAC1SEL_LSB) |
               (per_cfg->emacctl_emac2sel <<
                CLKMGR_PERPLL_EMACCTL_EMAC2SEL_LSB),
-              &clock_manager_base->per_pll.emacctl);
+              socfpga_get_clkmgr_addr() + CLKMGR_A10_PERPLL_EMACCTL);
 
        /* at this stage, check for PLL lock status */
        cm_wait_for_lock(LOCKED_MASK);
@@ -843,33 +859,33 @@ static int cm_full_cfg(struct mainpll_cfg *main_cfg, struct perpll_cfg *per_cfg)
         * assert/deassert outresetall
         */
        /* assert mainpll outresetall */
-       setbits_le32(&clock_manager_base->main_pll.vco0,
+       setbits_le32(socfpga_get_clkmgr_addr() + CLKMGR_A10_MAINPLL_VCO0,
                     CLKMGR_MAINPLL_VCO0_OUTRSTALL_SET_MSK);
        /* assert perpll outresetall */
-       setbits_le32(&clock_manager_base->per_pll.vco0,
+       setbits_le32(socfpga_get_clkmgr_addr() + CLKMGR_A10_PERPLL_VCO0,
                     CLKMGR_PERPLL_VCO0_OUTRSTALL_SET_MSK);
        /* de-assert mainpll outresetall */
-       clrbits_le32(&clock_manager_base->main_pll.vco0,
+       clrbits_le32(socfpga_get_clkmgr_addr() + CLKMGR_A10_MAINPLL_VCO0,
                     CLKMGR_MAINPLL_VCO0_OUTRSTALL_SET_MSK);
        /* de-assert perpll outresetall */
-       clrbits_le32(&clock_manager_base->per_pll.vco0,
+       clrbits_le32(socfpga_get_clkmgr_addr() + CLKMGR_A10_PERPLL_VCO0,
                     CLKMGR_PERPLL_VCO0_OUTRSTALL_SET_MSK);
 
        /* Take all PLLs out of bypass when boot mode is cleared. */
        /* release mainpll from bypass */
        writel(CLKMGR_MAINPLL_BYPASS_RESET,
-              &clock_manager_base->main_pll.bypassr);
+              socfpga_get_clkmgr_addr() + CLKMGR_A10_MAINPLL_BYPASSR);
        /* wait till Clock Manager is not busy */
        cm_wait_for_fsm();
 
        /* release perpll from bypass */
        writel(CLKMGR_PERPLL_BYPASS_RESET,
-              &clock_manager_base->per_pll.bypassr);
+              socfpga_get_clkmgr_addr() + CLKMGR_A10_PERPLL_BYPASSR);
        /* wait till Clock Manager is not busy */
        cm_wait_for_fsm();
 
        /* clear boot mode */
-       clrbits_le32(&clock_manager_base->ctrl,
+       clrbits_le32(socfpga_get_clkmgr_addr() + CLKMGR_A10_CTRL,
                     CLKMGR_CLKMGR_CTL_BOOTMOD_SET_MSK);
        /* wait till Clock Manager is not busy */
        cm_wait_for_fsm();
@@ -882,9 +898,10 @@ static int cm_full_cfg(struct mainpll_cfg *main_cfg, struct perpll_cfg *per_cfg)
 
        /* Now ungate non-hw-managed clocks */
        writel(CLKMGR_MAINPLL_EN_S2FUSER0CLKEN_SET_MSK |
-               CLKMGR_MAINPLL_EN_HMCPLLREFCLKEN_SET_MSK,
-               &clock_manager_base->main_pll.ens);
-       writel(CLKMGR_PERPLL_EN_RESET, &clock_manager_base->per_pll.ens);
+              CLKMGR_MAINPLL_EN_HMCPLLREFCLKEN_SET_MSK,
+              socfpga_get_clkmgr_addr() + CLKMGR_A10_MAINPLL_ENS);
+       writel(CLKMGR_PERPLL_EN_RESET,
+              socfpga_get_clkmgr_addr() + CLKMGR_A10_PERPLL_ENS);
 
        /* Clear the loss lock and slip bits as they might set during
        clock reconfiguration */
@@ -894,14 +911,14 @@ static int cm_full_cfg(struct mainpll_cfg *main_cfg, struct perpll_cfg *per_cfg)
               CLKMGR_CLKMGR_INTR_PERPLLRFSLIP_SET_MSK |
               CLKMGR_CLKMGR_INTR_MAINPLLFBSLIP_SET_MSK |
               CLKMGR_CLKMGR_INTR_PERPLLFBSLIP_SET_MSK,
-              &clock_manager_base->intr);
+              socfpga_get_clkmgr_addr() + CLKMGR_A10_INTR);
 
        return 0;
 }
 
 static void cm_use_intosc(void)
 {
-       setbits_le32(&clock_manager_base->ctrl,
+       setbits_le32(socfpga_get_clkmgr_addr() + CLKMGR_A10_CTRL,
                     CLKMGR_CLKMGR_CTL_BOOTCLK_INTOSC_SET_MSK);
 }
 
index 54a821a27f715a221c845e54befbdfbcf9c4c1b6..8fa2760798b8de48e76cead37e9729a3f61721b6 100644 (file)
 #include <asm/arch/clock_manager.h>
 #include <wait_bit.h>
 
-static const struct socfpga_clock_manager *clock_manager_base =
-       (struct socfpga_clock_manager *)SOCFPGA_CLKMGR_ADDRESS;
-
 /*
  * function to write the bypass register which requires a poll of the
  * busy bit
  */
 static void cm_write_bypass(u32 val)
 {
-       writel(val, &clock_manager_base->bypass);
+       writel(val, socfpga_get_clkmgr_addr() + CLKMGR_GEN5_BYPASS);
        cm_wait_for_fsm();
 }
 
 /* function to write the ctrl register which requires a poll of the busy bit */
 static void cm_write_ctrl(u32 val)
 {
-       writel(val, &clock_manager_base->ctrl);
+       writel(val, socfpga_get_clkmgr_addr() + CLKMGR_GEN5_CTRL);
        cm_wait_for_fsm();
 }
 
@@ -80,8 +77,8 @@ int cm_basic_init(const struct cm_config * const cfg)
         * gatting off the rest of the periperal clocks.
         */
        writel(~CLKMGR_PERPLLGRP_EN_NANDCLK_MASK &
-               readl(&clock_manager_base->per_pll.en),
-               &clock_manager_base->per_pll.en);
+               readl(socfpga_get_clkmgr_addr() + CLKMGR_GEN5_PERPLL_EN),
+               socfpga_get_clkmgr_addr() + CLKMGR_GEN5_PERPLL_EN);
 
        /* DO NOT GATE OFF DEBUG CLOCKS & BRIDGE CLOCKS */
        writel(CLKMGR_MAINPLLGRP_EN_DBGTIMERCLK_MASK |
@@ -90,12 +87,12 @@ int cm_basic_init(const struct cm_config * const cfg)
                CLKMGR_MAINPLLGRP_EN_DBGATCLK_MASK |
                CLKMGR_MAINPLLGRP_EN_S2FUSER0CLK_MASK |
                CLKMGR_MAINPLLGRP_EN_L4MPCLK_MASK,
-               &clock_manager_base->main_pll.en);
+               socfpga_get_clkmgr_addr() + CLKMGR_GEN5_MAINPLL_EN);
 
-       writel(0, &clock_manager_base->sdr_pll.en);
+       writel(0, socfpga_get_clkmgr_addr() + CLKMGR_GEN5_SDRPLL_EN);
 
        /* now we can gate off the rest of the peripheral clocks */
-       writel(0, &clock_manager_base->per_pll.en);
+       writel(0, socfpga_get_clkmgr_addr() + CLKMGR_GEN5_PERPLL_EN);
 
        /* Put all plls in bypass */
        cm_write_bypass(CLKMGR_BYPASS_PERPLL | CLKMGR_BYPASS_SDRPLL |
@@ -104,13 +101,13 @@ int cm_basic_init(const struct cm_config * const cfg)
        /* Put all plls VCO registers back to reset value. */
        writel(CLKMGR_MAINPLLGRP_VCO_RESET_VALUE &
               ~CLKMGR_MAINPLLGRP_VCO_REGEXTSEL_MASK,
-              &clock_manager_base->main_pll.vco);
+              socfpga_get_clkmgr_addr() + CLKMGR_GEN5_MAINPLL_VCO);
        writel(CLKMGR_PERPLLGRP_VCO_RESET_VALUE &
               ~CLKMGR_PERPLLGRP_VCO_REGEXTSEL_MASK,
-              &clock_manager_base->per_pll.vco);
+              socfpga_get_clkmgr_addr() + CLKMGR_GEN5_PERPLL_VCO);
        writel(CLKMGR_SDRPLLGRP_VCO_RESET_VALUE &
               ~CLKMGR_SDRPLLGRP_VCO_REGEXTSEL_MASK,
-              &clock_manager_base->sdr_pll.vco);
+              socfpga_get_clkmgr_addr() + CLKMGR_GEN5_SDRPLL_VCO);
 
        /*
         * The clocks to the flash devices and the L4_MAIN clocks can
@@ -120,23 +117,26 @@ int cm_basic_init(const struct cm_config * const cfg)
         * after exiting safe mode but before ungating the clocks.
         */
        writel(CLKMGR_PERPLLGRP_SRC_RESET_VALUE,
-              &clock_manager_base->per_pll.src);
+                     socfpga_get_clkmgr_addr() + CLKMGR_GEN5_PERPLL_SRC);
        writel(CLKMGR_MAINPLLGRP_L4SRC_RESET_VALUE,
-              &clock_manager_base->main_pll.l4src);
+                     socfpga_get_clkmgr_addr() + CLKMGR_GEN5_MAINPLL_L4SRC);
 
        /* read back for the required 5 us delay. */
-       readl(&clock_manager_base->main_pll.vco);
-       readl(&clock_manager_base->per_pll.vco);
-       readl(&clock_manager_base->sdr_pll.vco);
+       readl(socfpga_get_clkmgr_addr() + CLKMGR_GEN5_MAINPLL_VCO);
+       readl(socfpga_get_clkmgr_addr() + CLKMGR_GEN5_PERPLL_VCO);
+       readl(socfpga_get_clkmgr_addr() + CLKMGR_GEN5_SDRPLL_VCO);
 
 
        /*
         * We made sure bgpwr down was assert for 5 us. Now deassert BG PWR DN
         * with numerator and denominator.
         */
-       writel(cfg->main_vco_base, &clock_manager_base->main_pll.vco);
-       writel(cfg->peri_vco_base, &clock_manager_base->per_pll.vco);
-       writel(cfg->sdram_vco_base, &clock_manager_base->sdr_pll.vco);
+       writel(cfg->main_vco_base,
+              socfpga_get_clkmgr_addr() + CLKMGR_GEN5_MAINPLL_VCO);
+       writel(cfg->peri_vco_base,
+              socfpga_get_clkmgr_addr() + CLKMGR_GEN5_PERPLL_VCO);
+       writel(cfg->sdram_vco_base,
+              socfpga_get_clkmgr_addr() + CLKMGR_GEN5_SDRPLL_VCO);
 
        /*
         * Time starts here. Must wait 7 us from
@@ -145,44 +145,55 @@ int cm_basic_init(const struct cm_config * const cfg)
        end = timer_get_us() + 7;
 
        /* main mpu */
-       writel(cfg->mpuclk, &clock_manager_base->main_pll.mpuclk);
+       writel(cfg->mpuclk,
+              socfpga_get_clkmgr_addr() + CLKMGR_GEN5_MAINPLL_MPUCLK);
 
        /* altera group mpuclk */
-       writel(cfg->altera_grp_mpuclk, &clock_manager_base->altera.mpuclk);
+       writel(cfg->altera_grp_mpuclk,
+              socfpga_get_clkmgr_addr() + CLKMGR_GEN5_ALTR_MPUCLK);
 
        /* main main clock */
-       writel(cfg->mainclk, &clock_manager_base->main_pll.mainclk);
+       writel(cfg->mainclk,
+              socfpga_get_clkmgr_addr() + CLKMGR_GEN5_MAINPLL_MAINCLK);
 
        /* main for dbg */
-       writel(cfg->dbgatclk, &clock_manager_base->main_pll.dbgatclk);
+       writel(cfg->dbgatclk,
+              socfpga_get_clkmgr_addr() + CLKMGR_GEN5_MAINPLL_DBGATCLK);
 
        /* main for cfgs2fuser0clk */
        writel(cfg->cfg2fuser0clk,
-              &clock_manager_base->main_pll.cfgs2fuser0clk);
+              socfpga_get_clkmgr_addr() + CLKMGR_GEN5_MAINPLL_CFGS2FUSER0CLK);
 
        /* Peri emac0 50 MHz default to RMII */
-       writel(cfg->emac0clk, &clock_manager_base->per_pll.emac0clk);
+       writel(cfg->emac0clk,
+              socfpga_get_clkmgr_addr() + CLKMGR_GEN5_PERPLL_EMAC0CLK);
 
        /* Peri emac1 50 MHz default to RMII */
-       writel(cfg->emac1clk, &clock_manager_base->per_pll.emac1clk);
+       writel(cfg->emac1clk,
+              socfpga_get_clkmgr_addr() + CLKMGR_GEN5_PERPLL_EMAC1CLK);
 
        /* Peri QSPI */
-       writel(cfg->mainqspiclk, &clock_manager_base->main_pll.mainqspiclk);
+       writel(cfg->mainqspiclk,
+              socfpga_get_clkmgr_addr() + CLKMGR_GEN5_MAINPLL_MAINQSPICLK);
 
-       writel(cfg->perqspiclk, &clock_manager_base->per_pll.perqspiclk);
+       writel(cfg->perqspiclk,
+              socfpga_get_clkmgr_addr() + CLKMGR_GEN5_PERPLL_PERQSPICLK);
 
        /* Peri pernandsdmmcclk */
        writel(cfg->mainnandsdmmcclk,
-              &clock_manager_base->main_pll.mainnandsdmmcclk);
+              socfpga_get_clkmgr_addr() +
+              CLKMGR_GEN5_MAINPLL_MAINNANDSDMMCCLK);
 
        writel(cfg->pernandsdmmcclk,
-              &clock_manager_base->per_pll.pernandsdmmcclk);
+              socfpga_get_clkmgr_addr() + CLKMGR_GEN5_PERPLL_PERNANDSDMMCCLK);
 
        /* Peri perbaseclk */
-       writel(cfg->perbaseclk, &clock_manager_base->per_pll.perbaseclk);
+       writel(cfg->perbaseclk,
+              socfpga_get_clkmgr_addr() + CLKMGR_GEN5_PERPLL_PERBASECLK);
 
        /* Peri s2fuser1clk */
-       writel(cfg->s2fuser1clk, &clock_manager_base->per_pll.s2fuser1clk);
+       writel(cfg->s2fuser1clk,
+              socfpga_get_clkmgr_addr() + CLKMGR_GEN5_PERPLL_S2FUSER1CLK);
 
        /* 7 us must have elapsed before we can enable the VCO */
        while (timer_get_us() < end)
@@ -191,101 +202,112 @@ int cm_basic_init(const struct cm_config * const cfg)
        /* Enable vco */
        /* main pll vco */
        writel(cfg->main_vco_base | CLKMGR_MAINPLLGRP_VCO_EN,
-              &clock_manager_base->main_pll.vco);
+              socfpga_get_clkmgr_addr() + CLKMGR_GEN5_MAINPLL_VCO);
 
        /* periferal pll */
        writel(cfg->peri_vco_base | CLKMGR_MAINPLLGRP_VCO_EN,
-              &clock_manager_base->per_pll.vco);
+              socfpga_get_clkmgr_addr() + CLKMGR_GEN5_PERPLL_VCO);
 
        /* sdram pll vco */
        writel(cfg->sdram_vco_base | CLKMGR_MAINPLLGRP_VCO_EN,
-              &clock_manager_base->sdr_pll.vco);
+              socfpga_get_clkmgr_addr() + CLKMGR_GEN5_SDRPLL_VCO);
 
        /* L3 MP and L3 SP */
-       writel(cfg->maindiv, &clock_manager_base->main_pll.maindiv);
+       writel(cfg->maindiv,
+              socfpga_get_clkmgr_addr() + CLKMGR_GEN5_MAINPLL_MAINDIV);
 
-       writel(cfg->dbgdiv, &clock_manager_base->main_pll.dbgdiv);
+       writel(cfg->dbgdiv,
+              socfpga_get_clkmgr_addr() + CLKMGR_GEN5_MAINPLL_DBGDIV);
 
-       writel(cfg->tracediv, &clock_manager_base->main_pll.tracediv);
+       writel(cfg->tracediv,
+              socfpga_get_clkmgr_addr() + CLKMGR_GEN5_MAINPLL_TRACEDIV);
 
        /* L4 MP, L4 SP, can0, and can1 */
-       writel(cfg->perdiv, &clock_manager_base->per_pll.div);
+       writel(cfg->perdiv,
+              socfpga_get_clkmgr_addr() + CLKMGR_GEN5_PERPLL_DIV);
 
-       writel(cfg->gpiodiv, &clock_manager_base->per_pll.gpiodiv);
+       writel(cfg->gpiodiv,
+              socfpga_get_clkmgr_addr() + CLKMGR_GEN5_PERPLL_GPIODIV);
 
        cm_wait_for_lock(LOCKED_MASK);
 
        /* write the sdram clock counters before toggling outreset all */
        writel(cfg->ddrdqsclk & CLKMGR_SDRPLLGRP_DDRDQSCLK_CNT_MASK,
-              &clock_manager_base->sdr_pll.ddrdqsclk);
+              socfpga_get_clkmgr_addr() + CLKMGR_GEN5_SDRPLL_DDRDQSCLK);
 
        writel(cfg->ddr2xdqsclk & CLKMGR_SDRPLLGRP_DDR2XDQSCLK_CNT_MASK,
-              &clock_manager_base->sdr_pll.ddr2xdqsclk);
+              socfpga_get_clkmgr_addr() + CLKMGR_GEN5_SDRPLL_DDR2XDQSCLK);
 
        writel(cfg->ddrdqclk & CLKMGR_SDRPLLGRP_DDRDQCLK_CNT_MASK,
-              &clock_manager_base->sdr_pll.ddrdqclk);
+              socfpga_get_clkmgr_addr() + CLKMGR_GEN5_SDRPLL_DDRDQCLK);
 
        writel(cfg->s2fuser2clk & CLKMGR_SDRPLLGRP_S2FUSER2CLK_CNT_MASK,
-              &clock_manager_base->sdr_pll.s2fuser2clk);
+              socfpga_get_clkmgr_addr() + CLKMGR_GEN5_SDRPLL_S2FUSER2CLK);
 
        /*
         * after locking, but before taking out of bypass
         * assert/deassert outresetall
         */
-       u32 mainvco = readl(&clock_manager_base->main_pll.vco);
+       u32 mainvco = readl(socfpga_get_clkmgr_addr() +
+                           CLKMGR_GEN5_MAINPLL_VCO);
 
        /* assert main outresetall */
        writel(mainvco | CLKMGR_MAINPLLGRP_VCO_OUTRESETALL_MASK,
-              &clock_manager_base->main_pll.vco);
+              socfpga_get_clkmgr_addr() + CLKMGR_GEN5_MAINPLL_VCO);
 
-       u32 periphvco = readl(&clock_manager_base->per_pll.vco);
+       u32 periphvco = readl(socfpga_get_clkmgr_addr() +
+                             CLKMGR_GEN5_PERPLL_VCO);
 
        /* assert pheriph outresetall */
        writel(periphvco | CLKMGR_PERPLLGRP_VCO_OUTRESETALL_MASK,
-              &clock_manager_base->per_pll.vco);
+              socfpga_get_clkmgr_addr() + CLKMGR_GEN5_PERPLL_VCO);
 
        /* assert sdram outresetall */
-       writel(cfg->sdram_vco_base | CLKMGR_MAINPLLGRP_VCO_EN|
-               CLKMGR_SDRPLLGRP_VCO_OUTRESETALL,
-               &clock_manager_base->sdr_pll.vco);
+       writel(cfg->sdram_vco_base | CLKMGR_MAINPLLGRP_VCO_EN |
+              CLKMGR_SDRPLLGRP_VCO_OUTRESETALL,
+              socfpga_get_clkmgr_addr() + CLKMGR_GEN5_SDRPLL_VCO);
 
        /* deassert main outresetall */
        writel(mainvco & ~CLKMGR_MAINPLLGRP_VCO_OUTRESETALL_MASK,
-              &clock_manager_base->main_pll.vco);
+              socfpga_get_clkmgr_addr() + CLKMGR_GEN5_MAINPLL_VCO);
 
        /* deassert pheriph outresetall */
        writel(periphvco & ~CLKMGR_PERPLLGRP_VCO_OUTRESETALL_MASK,
-              &clock_manager_base->per_pll.vco);
+              socfpga_get_clkmgr_addr() + CLKMGR_GEN5_PERPLL_VCO);
 
        /* deassert sdram outresetall */
        writel(cfg->sdram_vco_base | CLKMGR_MAINPLLGRP_VCO_EN,
-              &clock_manager_base->sdr_pll.vco);
+              socfpga_get_clkmgr_addr() + CLKMGR_GEN5_SDRPLL_VCO);
 
        /*
         * now that we've toggled outreset all, all the clocks
         * are aligned nicely; so we can change any phase.
         */
        ret = cm_write_with_phase(cfg->ddrdqsclk,
-                                 &clock_manager_base->sdr_pll.ddrdqsclk,
+                                 (const void *)(socfpga_get_clkmgr_addr() +
+                                 CLKMGR_GEN5_SDRPLL_DDRDQSCLK),
                                  CLKMGR_SDRPLLGRP_DDRDQSCLK_PHASE_MASK);
        if (ret)
                return ret;
 
        /* SDRAM DDR2XDQSCLK */
        ret = cm_write_with_phase(cfg->ddr2xdqsclk,
-                                 &clock_manager_base->sdr_pll.ddr2xdqsclk,
+                                 (const void *)(socfpga_get_clkmgr_addr() +
+                                 CLKMGR_GEN5_SDRPLL_DDR2XDQSCLK),
                                  CLKMGR_SDRPLLGRP_DDR2XDQSCLK_PHASE_MASK);
        if (ret)
                return ret;
 
        ret = cm_write_with_phase(cfg->ddrdqclk,
-                                 &clock_manager_base->sdr_pll.ddrdqclk,
+                                 (const void *)(socfpga_get_clkmgr_addr() +
+                                 CLKMGR_GEN5_SDRPLL_DDRDQCLK),
                                  CLKMGR_SDRPLLGRP_DDRDQCLK_PHASE_MASK);
        if (ret)
                return ret;
 
        ret = cm_write_with_phase(cfg->s2fuser2clk,
-                                 &clock_manager_base->sdr_pll.s2fuser2clk,
+                                 (const void *)(socfpga_get_clkmgr_addr() +
+                                 CLKMGR_GEN5_SDRPLL_S2FUSER2CLK),
                                  CLKMGR_SDRPLLGRP_S2FUSER2CLK_PHASE_MASK);
        if (ret)
                return ret;
@@ -294,24 +316,28 @@ int cm_basic_init(const struct cm_config * const cfg)
        cm_write_bypass(0);
 
        /* clear safe mode */
-       cm_write_ctrl(readl(&clock_manager_base->ctrl) | CLKMGR_CTRL_SAFEMODE);
+       cm_write_ctrl(readl(socfpga_get_clkmgr_addr() + CLKMGR_GEN5_CTRL) |
+                     CLKMGR_CTRL_SAFEMODE);
 
        /*
         * now that safe mode is clear with clocks gated
         * it safe to change the source mux for the flashes the the L4_MAIN
         */
-       writel(cfg->persrc, &clock_manager_base->per_pll.src);
-       writel(cfg->l4src, &clock_manager_base->main_pll.l4src);
+       writel(cfg->persrc,
+              socfpga_get_clkmgr_addr() + CLKMGR_GEN5_PERPLL_SRC);
+       writel(cfg->l4src,
+              socfpga_get_clkmgr_addr() + CLKMGR_GEN5_MAINPLL_L4SRC);
 
        /* Now ungate non-hw-managed clocks */
-       writel(~0, &clock_manager_base->main_pll.en);
-       writel(~0, &clock_manager_base->per_pll.en);
-       writel(~0, &clock_manager_base->sdr_pll.en);
+       writel(~0, socfpga_get_clkmgr_addr() + CLKMGR_GEN5_MAINPLL_EN);
+       writel(~0, socfpga_get_clkmgr_addr() + CLKMGR_GEN5_PERPLL_EN);
+       writel(~0, socfpga_get_clkmgr_addr() + CLKMGR_GEN5_SDRPLL_EN);
 
        /* Clear the loss of lock bits (write 1 to clear) */
-       writel(CLKMGR_INTER_SDRPLLLOST_MASK | CLKMGR_INTER_PERPLLLOST_MASK |
-              CLKMGR_INTER_MAINPLLLOST_MASK,
-              &clock_manager_base->inter);
+       writel(CLKMGR_INTER_SDRPLLLOST_MASK |
+                     CLKMGR_INTER_PERPLLLOST_MASK |
+                     CLKMGR_INTER_MAINPLLLOST_MASK,
+                     socfpga_get_clkmgr_addr() + CLKMGR_GEN5_INTER);
 
        return 0;
 }
@@ -321,7 +347,7 @@ static unsigned int cm_get_main_vco_clk_hz(void)
        u32 reg, clock;
 
        /* get the main VCO clock */
-       reg = readl(&clock_manager_base->main_pll.vco);
+       reg = readl(socfpga_get_clkmgr_addr() + CLKMGR_GEN5_MAINPLL_VCO);
        clock = cm_get_osc_clk_hz(1);
        clock /= ((reg & CLKMGR_MAINPLLGRP_VCO_DENOM_MASK) >>
                  CLKMGR_MAINPLLGRP_VCO_DENOM_OFFSET) + 1;
@@ -336,7 +362,7 @@ static unsigned int cm_get_per_vco_clk_hz(void)
        u32 reg, clock = 0;
 
        /* identify PER PLL clock source */
-       reg = readl(&clock_manager_base->per_pll.vco);
+       reg = readl(socfpga_get_clkmgr_addr() + CLKMGR_GEN5_PERPLL_VCO);
        reg = (reg & CLKMGR_PERPLLGRP_VCO_SSRC_MASK) >>
              CLKMGR_PERPLLGRP_VCO_SSRC_OFFSET;
        if (reg == CLKMGR_VCO_SSRC_EOSC1)
@@ -347,7 +373,7 @@ static unsigned int cm_get_per_vco_clk_hz(void)
                clock = cm_get_f2s_per_ref_clk_hz();
 
        /* get the PER VCO clock */
-       reg = readl(&clock_manager_base->per_pll.vco);
+       reg = readl(socfpga_get_clkmgr_addr() + CLKMGR_GEN5_PERPLL_VCO);
        clock /= ((reg & CLKMGR_PERPLLGRP_VCO_DENOM_MASK) >>
                  CLKMGR_PERPLLGRP_VCO_DENOM_OFFSET) + 1;
        clock *= ((reg & CLKMGR_PERPLLGRP_VCO_NUMER_MASK) >>
@@ -363,9 +389,9 @@ unsigned long cm_get_mpu_clk_hz(void)
        clock = cm_get_main_vco_clk_hz();
 
        /* get the MPU clock */
-       reg = readl(&clock_manager_base->altera.mpuclk);
+       reg = readl(socfpga_get_clkmgr_addr() + CLKMGR_GEN5_ALTR_MPUCLK);
        clock /= (reg + 1);
-       reg = readl(&clock_manager_base->main_pll.mpuclk);
+       reg = readl(socfpga_get_clkmgr_addr() + CLKMGR_GEN5_MAINPLL_MPUCLK);
        clock /= (reg + 1);
        return clock;
 }
@@ -375,7 +401,7 @@ unsigned long cm_get_sdram_clk_hz(void)
        u32 reg, clock = 0;
 
        /* identify SDRAM PLL clock source */
-       reg = readl(&clock_manager_base->sdr_pll.vco);
+       reg = readl(socfpga_get_clkmgr_addr() + CLKMGR_GEN5_SDRPLL_VCO);
        reg = (reg & CLKMGR_SDRPLLGRP_VCO_SSRC_MASK) >>
              CLKMGR_SDRPLLGRP_VCO_SSRC_OFFSET;
        if (reg == CLKMGR_VCO_SSRC_EOSC1)
@@ -386,14 +412,14 @@ unsigned long cm_get_sdram_clk_hz(void)
                clock = cm_get_f2s_sdr_ref_clk_hz();
 
        /* get the SDRAM VCO clock */
-       reg = readl(&clock_manager_base->sdr_pll.vco);
+       reg = readl(socfpga_get_clkmgr_addr() + CLKMGR_GEN5_SDRPLL_VCO);
        clock /= ((reg & CLKMGR_SDRPLLGRP_VCO_DENOM_MASK) >>
                  CLKMGR_SDRPLLGRP_VCO_DENOM_OFFSET) + 1;
        clock *= ((reg & CLKMGR_SDRPLLGRP_VCO_NUMER_MASK) >>
                  CLKMGR_SDRPLLGRP_VCO_NUMER_OFFSET) + 1;
 
        /* get the SDRAM (DDR_DQS) clock */
-       reg = readl(&clock_manager_base->sdr_pll.ddrdqsclk);
+       reg = readl(socfpga_get_clkmgr_addr() + CLKMGR_GEN5_SDRPLL_DDRDQSCLK);
        reg = (reg & CLKMGR_SDRPLLGRP_DDRDQSCLK_CNT_MASK) >>
              CLKMGR_SDRPLLGRP_DDRDQSCLK_CNT_OFFSET;
        clock /= (reg + 1);
@@ -406,7 +432,7 @@ unsigned int cm_get_l4_sp_clk_hz(void)
        u32 reg, clock = 0;
 
        /* identify the source of L4 SP clock */
-       reg = readl(&clock_manager_base->main_pll.l4src);
+       reg = readl(socfpga_get_clkmgr_addr() + CLKMGR_GEN5_MAINPLL_L4SRC);
        reg = (reg & CLKMGR_MAINPLLGRP_L4SRC_L4SP) >>
              CLKMGR_MAINPLLGRP_L4SRC_L4SP_OFFSET;
 
@@ -414,20 +440,23 @@ unsigned int cm_get_l4_sp_clk_hz(void)
                clock = cm_get_main_vco_clk_hz();
 
                /* get the clock prior L4 SP divider (main clk) */
-               reg = readl(&clock_manager_base->altera.mainclk);
+               reg = readl(socfpga_get_clkmgr_addr() +
+                           CLKMGR_GEN5_ALTR_MAINCLK);
                clock /= (reg + 1);
-               reg = readl(&clock_manager_base->main_pll.mainclk);
+               reg = readl(socfpga_get_clkmgr_addr() +
+                           CLKMGR_GEN5_MAINPLL_MAINCLK);
                clock /= (reg + 1);
        } else if (reg == CLKMGR_L4_SP_CLK_SRC_PERPLL) {
                clock = cm_get_per_vco_clk_hz();
 
                /* get the clock prior L4 SP divider (periph_base_clk) */
-               reg = readl(&clock_manager_base->per_pll.perbaseclk);
+               reg = readl(socfpga_get_clkmgr_addr() +
+                           CLKMGR_GEN5_PERPLL_PERBASECLK);
                clock /= (reg + 1);
        }
 
        /* get the L4 SP clock which supplied to UART */
-       reg = readl(&clock_manager_base->main_pll.maindiv);
+       reg = readl(socfpga_get_clkmgr_addr() + CLKMGR_GEN5_MAINPLL_MAINDIV);
        reg = (reg & CLKMGR_MAINPLLGRP_MAINDIV_L4SPCLK_MASK) >>
              CLKMGR_MAINPLLGRP_MAINDIV_L4SPCLK_OFFSET;
        clock = clock / (1 << reg);
@@ -440,7 +469,7 @@ unsigned int cm_get_mmc_controller_clk_hz(void)
        u32 reg, clock = 0;
 
        /* identify the source of MMC clock */
-       reg = readl(&clock_manager_base->per_pll.src);
+       reg = readl(socfpga_get_clkmgr_addr() + CLKMGR_GEN5_PERPLL_SRC);
        reg = (reg & CLKMGR_PERPLLGRP_SRC_SDMMC_MASK) >>
              CLKMGR_PERPLLGRP_SRC_SDMMC_OFFSET;
 
@@ -450,13 +479,15 @@ unsigned int cm_get_mmc_controller_clk_hz(void)
                clock = cm_get_main_vco_clk_hz();
 
                /* get the SDMMC clock */
-               reg = readl(&clock_manager_base->main_pll.mainnandsdmmcclk);
+               reg = readl(socfpga_get_clkmgr_addr() +
+                           CLKMGR_GEN5_MAINPLL_MAINNANDSDMMCCLK);
                clock /= (reg + 1);
        } else if (reg == CLKMGR_SDMMC_CLK_SRC_PER) {
                clock = cm_get_per_vco_clk_hz();
 
                /* get the SDMMC clock */
-               reg = readl(&clock_manager_base->per_pll.pernandsdmmcclk);
+               reg = readl(socfpga_get_clkmgr_addr() +
+                           CLKMGR_GEN5_PERPLL_PERNANDSDMMCCLK);
                clock /= (reg + 1);
        }
 
@@ -470,7 +501,7 @@ unsigned int cm_get_qspi_controller_clk_hz(void)
        u32 reg, clock = 0;
 
        /* identify the source of QSPI clock */
-       reg = readl(&clock_manager_base->per_pll.src);
+       reg = readl(socfpga_get_clkmgr_addr() + CLKMGR_GEN5_PERPLL_SRC);
        reg = (reg & CLKMGR_PERPLLGRP_SRC_QSPI_MASK) >>
              CLKMGR_PERPLLGRP_SRC_QSPI_OFFSET;
 
@@ -480,13 +511,15 @@ unsigned int cm_get_qspi_controller_clk_hz(void)
                clock = cm_get_main_vco_clk_hz();
 
                /* get the qspi clock */
-               reg = readl(&clock_manager_base->main_pll.mainqspiclk);
+               reg = readl(socfpga_get_clkmgr_addr() +
+                           CLKMGR_GEN5_MAINPLL_MAINQSPICLK);
                clock /= (reg + 1);
        } else if (reg == CLKMGR_QSPI_CLK_SRC_PER) {
                clock = cm_get_per_vco_clk_hz();
 
                /* get the qspi clock */
-               reg = readl(&clock_manager_base->per_pll.perqspiclk);
+               reg = readl(socfpga_get_clkmgr_addr() +
+                           CLKMGR_GEN5_PERPLL_PERQSPICLK);
                clock /= (reg + 1);
        }
 
@@ -500,7 +533,7 @@ unsigned int cm_get_spi_controller_clk_hz(void)
        clock = cm_get_per_vco_clk_hz();
 
        /* get the clock prior L4 SP divider (periph_base_clk) */
-       reg = readl(&clock_manager_base->per_pll.perbaseclk);
+       reg = readl(socfpga_get_clkmgr_addr() + CLKMGR_GEN5_PERPLL_PERBASECLK);
        clock /= (reg + 1);
 
        return clock;
index 3ba2a00c02a39f9d94bd64e5f2a21234736e89f9..05e42127b57b8e17cc6f5b3a3e8c50cebd054e19 100644 (file)
 
 DECLARE_GLOBAL_DATA_PTR;
 
-static const struct socfpga_clock_manager *clock_manager_base =
-       (struct socfpga_clock_manager *)SOCFPGA_CLKMGR_ADDRESS;
-static const struct socfpga_system_manager *sysmgr_regs =
-               (struct socfpga_system_manager *)SOCFPGA_SYSMGR_ADDRESS;
-
 /*
  * function to write the bypass register which requires a poll of the
  * busy bit
  */
 static void cm_write_bypass_mainpll(u32 val)
 {
-       writel(val, &clock_manager_base->main_pll.bypass);
+       writel(val, socfpga_get_clkmgr_addr() + CLKMGR_S10_MAINPLL_BYPASS);
        cm_wait_for_fsm();
 }
 
 static void cm_write_bypass_perpll(u32 val)
 {
-       writel(val, &clock_manager_base->per_pll.bypass);
+       writel(val, socfpga_get_clkmgr_addr() + CLKMGR_S10_PERPLL_BYPASS);
        cm_wait_for_fsm();
 }
 
 /* function to write the ctrl register which requires a poll of the busy bit */
 static void cm_write_ctrl(u32 val)
 {
-       writel(val, &clock_manager_base->ctrl);
+       writel(val, socfpga_get_clkmgr_addr() + CLKMGR_S10_CTRL);
        cm_wait_for_fsm();
 }
 
@@ -68,12 +63,17 @@ void cm_basic_init(const struct cm_config * const cfg)
 
        writel((cfg->main_pll_pllglob & ~CLKMGR_PLLGLOB_PD_MASK &
                ~CLKMGR_PLLGLOB_RST_MASK),
-               &clock_manager_base->main_pll.pllglob);
-       writel(cfg->main_pll_fdbck, &clock_manager_base->main_pll.fdbck);
-       writel(vcocalib, &clock_manager_base->main_pll.vcocalib);
-       writel(cfg->main_pll_pllc0, &clock_manager_base->main_pll.pllc0);
-       writel(cfg->main_pll_pllc1, &clock_manager_base->main_pll.pllc1);
-       writel(cfg->main_pll_nocdiv, &clock_manager_base->main_pll.nocdiv);
+               socfpga_get_clkmgr_addr() + CLKMGR_S10_MAINPLL_PLLGLOB);
+       writel(cfg->main_pll_fdbck,
+              socfpga_get_clkmgr_addr() + CLKMGR_S10_MAINPLL_FDBCK);
+       writel(vcocalib,
+              socfpga_get_clkmgr_addr() + CLKMGR_S10_MAINPLL_VCOCALIB);
+       writel(cfg->main_pll_pllc0,
+              socfpga_get_clkmgr_addr() + CLKMGR_S10_MAINPLL_PLLC0);
+       writel(cfg->main_pll_pllc1,
+              socfpga_get_clkmgr_addr() + CLKMGR_S10_MAINPLL_PLLC1);
+       writel(cfg->main_pll_nocdiv,
+              socfpga_get_clkmgr_addr() + CLKMGR_S10_MAINPLL_NOCDIV);
 
        /* setup peripheral PLL dividers */
        /* calculate the vcocalib value */
@@ -90,18 +90,24 @@ void cm_basic_init(const struct cm_config * const cfg)
 
        writel((cfg->per_pll_pllglob & ~CLKMGR_PLLGLOB_PD_MASK &
                ~CLKMGR_PLLGLOB_RST_MASK),
-               &clock_manager_base->per_pll.pllglob);
-       writel(cfg->per_pll_fdbck, &clock_manager_base->per_pll.fdbck);
-       writel(vcocalib, &clock_manager_base->per_pll.vcocalib);
-       writel(cfg->per_pll_pllc0, &clock_manager_base->per_pll.pllc0);
-       writel(cfg->per_pll_pllc1, &clock_manager_base->per_pll.pllc1);
-       writel(cfg->per_pll_emacctl, &clock_manager_base->per_pll.emacctl);
-       writel(cfg->per_pll_gpiodiv, &clock_manager_base->per_pll.gpiodiv);
+               socfpga_get_clkmgr_addr() + CLKMGR_S10_PERPLL_PLLGLOB);
+       writel(cfg->per_pll_fdbck,
+              socfpga_get_clkmgr_addr() + CLKMGR_S10_PERPLL_FDBCK);
+       writel(vcocalib,
+              socfpga_get_clkmgr_addr() + CLKMGR_S10_PERPLL_VCOCALIB);
+       writel(cfg->per_pll_pllc0,
+              socfpga_get_clkmgr_addr() + CLKMGR_S10_PERPLL_PLLC0);
+       writel(cfg->per_pll_pllc1,
+              socfpga_get_clkmgr_addr() + CLKMGR_S10_PERPLL_PLLC1);
+       writel(cfg->per_pll_emacctl,
+              socfpga_get_clkmgr_addr() + CLKMGR_S10_PERPLL_EMACCTL);
+       writel(cfg->per_pll_gpiodiv,
+              socfpga_get_clkmgr_addr() + CLKMGR_S10_PERPLL_GPIODIV);
 
        /* Take both PLL out of reset and power up */
-       setbits_le32(&clock_manager_base->main_pll.pllglob,
+       setbits_le32(socfpga_get_clkmgr_addr() + CLKMGR_S10_MAINPLL_PLLGLOB,
                     CLKMGR_PLLGLOB_PD_MASK | CLKMGR_PLLGLOB_RST_MASK);
-       setbits_le32(&clock_manager_base->per_pll.pllglob,
+       setbits_le32(socfpga_get_clkmgr_addr() + CLKMGR_S10_PERPLL_PLLGLOB,
                     CLKMGR_PLLGLOB_PD_MASK | CLKMGR_PLLGLOB_RST_MASK);
 
 #define LOCKED_MASK \
@@ -115,66 +121,85 @@ void cm_basic_init(const struct cm_config * const cfg)
         * only take effect upon value change, we shall set a maximum value as
         * default value.
         */
-       writel(0xff, &clock_manager_base->main_pll.mpuclk);
-       writel(0xff, &clock_manager_base->main_pll.nocclk);
-       writel(0xff, &clock_manager_base->main_pll.cntr2clk);
-       writel(0xff, &clock_manager_base->main_pll.cntr3clk);
-       writel(0xff, &clock_manager_base->main_pll.cntr4clk);
-       writel(0xff, &clock_manager_base->main_pll.cntr5clk);
-       writel(0xff, &clock_manager_base->main_pll.cntr6clk);
-       writel(0xff, &clock_manager_base->main_pll.cntr7clk);
-       writel(0xff, &clock_manager_base->main_pll.cntr8clk);
-       writel(0xff, &clock_manager_base->main_pll.cntr9clk);
-       writel(0xff, &clock_manager_base->per_pll.cntr2clk);
-       writel(0xff, &clock_manager_base->per_pll.cntr3clk);
-       writel(0xff, &clock_manager_base->per_pll.cntr4clk);
-       writel(0xff, &clock_manager_base->per_pll.cntr5clk);
-       writel(0xff, &clock_manager_base->per_pll.cntr6clk);
-       writel(0xff, &clock_manager_base->per_pll.cntr7clk);
-       writel(0xff, &clock_manager_base->per_pll.cntr8clk);
-       writel(0xff, &clock_manager_base->per_pll.cntr9clk);
-
-       writel(cfg->main_pll_mpuclk, &clock_manager_base->main_pll.mpuclk);
-       writel(cfg->main_pll_nocclk, &clock_manager_base->main_pll.nocclk);
-       writel(cfg->main_pll_cntr2clk, &clock_manager_base->main_pll.cntr2clk);
-       writel(cfg->main_pll_cntr3clk, &clock_manager_base->main_pll.cntr3clk);
-       writel(cfg->main_pll_cntr4clk, &clock_manager_base->main_pll.cntr4clk);
-       writel(cfg->main_pll_cntr5clk, &clock_manager_base->main_pll.cntr5clk);
-       writel(cfg->main_pll_cntr6clk, &clock_manager_base->main_pll.cntr6clk);
-       writel(cfg->main_pll_cntr7clk, &clock_manager_base->main_pll.cntr7clk);
-       writel(cfg->main_pll_cntr8clk, &clock_manager_base->main_pll.cntr8clk);
-       writel(cfg->main_pll_cntr9clk, &clock_manager_base->main_pll.cntr9clk);
-       writel(cfg->per_pll_cntr2clk, &clock_manager_base->per_pll.cntr2clk);
-       writel(cfg->per_pll_cntr3clk, &clock_manager_base->per_pll.cntr3clk);
-       writel(cfg->per_pll_cntr4clk, &clock_manager_base->per_pll.cntr4clk);
-       writel(cfg->per_pll_cntr5clk, &clock_manager_base->per_pll.cntr5clk);
-       writel(cfg->per_pll_cntr6clk, &clock_manager_base->per_pll.cntr6clk);
-       writel(cfg->per_pll_cntr7clk, &clock_manager_base->per_pll.cntr7clk);
-       writel(cfg->per_pll_cntr8clk, &clock_manager_base->per_pll.cntr8clk);
-       writel(cfg->per_pll_cntr9clk, &clock_manager_base->per_pll.cntr9clk);
+       writel(0xff, socfpga_get_clkmgr_addr() + CLKMGR_S10_MAINPLL_MPUCLK);
+       writel(0xff, socfpga_get_clkmgr_addr() + CLKMGR_S10_MAINPLL_NOCCLK);
+       writel(0xff, socfpga_get_clkmgr_addr() + CLKMGR_S10_MAINPLL_CNTR2CLK);
+       writel(0xff, socfpga_get_clkmgr_addr() + CLKMGR_S10_MAINPLL_CNTR3CLK);
+       writel(0xff, socfpga_get_clkmgr_addr() + CLKMGR_S10_MAINPLL_CNTR4CLK);
+       writel(0xff, socfpga_get_clkmgr_addr() + CLKMGR_S10_MAINPLL_CNTR5CLK);
+       writel(0xff, socfpga_get_clkmgr_addr() + CLKMGR_S10_MAINPLL_CNTR6CLK);
+       writel(0xff, socfpga_get_clkmgr_addr() + CLKMGR_S10_MAINPLL_CNTR7CLK);
+       writel(0xff, socfpga_get_clkmgr_addr() + CLKMGR_S10_MAINPLL_CNTR8CLK);
+       writel(0xff, socfpga_get_clkmgr_addr() + CLKMGR_S10_MAINPLL_CNTR9CLK);
+       writel(0xff, socfpga_get_clkmgr_addr() + CLKMGR_S10_PERPLL_CNTR2CLK);
+       writel(0xff, socfpga_get_clkmgr_addr() + CLKMGR_S10_PERPLL_CNTR3CLK);
+       writel(0xff, socfpga_get_clkmgr_addr() + CLKMGR_S10_PERPLL_CNTR4CLK);
+       writel(0xff, socfpga_get_clkmgr_addr() + CLKMGR_S10_PERPLL_CNTR5CLK);
+       writel(0xff, socfpga_get_clkmgr_addr() + CLKMGR_S10_PERPLL_CNTR6CLK);
+       writel(0xff, socfpga_get_clkmgr_addr() + CLKMGR_S10_PERPLL_CNTR7CLK);
+       writel(0xff, socfpga_get_clkmgr_addr() + CLKMGR_S10_PERPLL_CNTR8CLK);
+       writel(0xff, socfpga_get_clkmgr_addr() + CLKMGR_S10_PERPLL_CNTR9CLK);
+
+       writel(cfg->main_pll_mpuclk,
+              socfpga_get_clkmgr_addr() + CLKMGR_S10_MAINPLL_MPUCLK);
+       writel(cfg->main_pll_nocclk,
+              socfpga_get_clkmgr_addr() + CLKMGR_S10_MAINPLL_NOCCLK);
+       writel(cfg->main_pll_cntr2clk,
+              socfpga_get_clkmgr_addr() + CLKMGR_S10_MAINPLL_CNTR2CLK);
+       writel(cfg->main_pll_cntr3clk,
+              socfpga_get_clkmgr_addr() + CLKMGR_S10_MAINPLL_CNTR3CLK);
+       writel(cfg->main_pll_cntr4clk,
+              socfpga_get_clkmgr_addr() + CLKMGR_S10_MAINPLL_CNTR4CLK);
+       writel(cfg->main_pll_cntr5clk,
+              socfpga_get_clkmgr_addr() + CLKMGR_S10_MAINPLL_CNTR5CLK);
+       writel(cfg->main_pll_cntr6clk,
+              socfpga_get_clkmgr_addr() + CLKMGR_S10_MAINPLL_CNTR6CLK);
+       writel(cfg->main_pll_cntr7clk,
+              socfpga_get_clkmgr_addr() + CLKMGR_S10_MAINPLL_CNTR7CLK);
+       writel(cfg->main_pll_cntr8clk,
+              socfpga_get_clkmgr_addr() + CLKMGR_S10_MAINPLL_CNTR8CLK);
+       writel(cfg->main_pll_cntr9clk,
+              socfpga_get_clkmgr_addr() + CLKMGR_S10_MAINPLL_CNTR9CLK);
+       writel(cfg->per_pll_cntr2clk,
+              socfpga_get_clkmgr_addr() + CLKMGR_S10_PERPLL_CNTR2CLK);
+       writel(cfg->per_pll_cntr3clk,
+              socfpga_get_clkmgr_addr() + CLKMGR_S10_PERPLL_CNTR3CLK);
+       writel(cfg->per_pll_cntr4clk,
+              socfpga_get_clkmgr_addr() + CLKMGR_S10_PERPLL_CNTR4CLK);
+       writel(cfg->per_pll_cntr5clk,
+              socfpga_get_clkmgr_addr() + CLKMGR_S10_PERPLL_CNTR5CLK);
+       writel(cfg->per_pll_cntr6clk,
+              socfpga_get_clkmgr_addr() + CLKMGR_S10_PERPLL_CNTR6CLK);
+       writel(cfg->per_pll_cntr7clk,
+              socfpga_get_clkmgr_addr() + CLKMGR_S10_PERPLL_CNTR7CLK);
+       writel(cfg->per_pll_cntr8clk,
+              socfpga_get_clkmgr_addr() + CLKMGR_S10_PERPLL_CNTR8CLK);
+       writel(cfg->per_pll_cntr9clk,
+              socfpga_get_clkmgr_addr() + CLKMGR_S10_PERPLL_CNTR9CLK);
 
        /* Take all PLLs out of bypass */
        cm_write_bypass_mainpll(0);
        cm_write_bypass_perpll(0);
 
        /* clear safe mode / out of boot mode */
-       cm_write_ctrl(readl(&clock_manager_base->ctrl)
-                       & ~(CLKMGR_CTRL_SAFEMODE));
+       cm_write_ctrl(readl(socfpga_get_clkmgr_addr() + CLKMGR_S10_CTRL) &
+                     ~(CLKMGR_CTRL_SAFEMODE));
 
        /* Now ungate non-hw-managed clocks */
-       writel(~0, &clock_manager_base->main_pll.en);
-       writel(~0, &clock_manager_base->per_pll.en);
+       writel(~0, socfpga_get_clkmgr_addr() + CLKMGR_S10_MAINPLL_EN);
+       writel(~0, socfpga_get_clkmgr_addr() + CLKMGR_S10_PERPLL_EN);
 
        /* Clear the loss of lock bits (write 1 to clear) */
-       writel(CLKMGR_INTER_PERPLLLOST_MASK | CLKMGR_INTER_MAINPLLLOST_MASK,
-              &clock_manager_base->intrclr);
+       writel(CLKMGR_INTER_PERPLLLOST_MASK |
+                     CLKMGR_INTER_MAINPLLLOST_MASK,
+                     socfpga_get_clkmgr_addr() + CLKMGR_S10_INTRCLR);
 }
 
 static unsigned long cm_get_main_vco_clk_hz(void)
 {
         unsigned long fref, refdiv, mdiv, reg, vco;
 
-       reg = readl(&clock_manager_base->main_pll.pllglob);
+       reg = readl(socfpga_get_clkmgr_addr() + CLKMGR_S10_MAINPLL_PLLGLOB);
 
        fref = (reg >> CLKMGR_PLLGLOB_VCO_PSRC_OFFSET) &
                CLKMGR_PLLGLOB_VCO_PSRC_MASK;
@@ -193,7 +218,7 @@ static unsigned long cm_get_main_vco_clk_hz(void)
        refdiv = (reg >> CLKMGR_PLLGLOB_REFCLKDIV_OFFSET) &
                  CLKMGR_PLLGLOB_REFCLKDIV_MASK;
 
-       reg = readl(&clock_manager_base->main_pll.fdbck);
+       reg = readl(socfpga_get_clkmgr_addr() + CLKMGR_S10_MAINPLL_FDBCK);
        mdiv = (reg >> CLKMGR_FDBCK_MDIV_OFFSET) & CLKMGR_FDBCK_MDIV_MASK;
 
        vco = fref / refdiv;
@@ -205,7 +230,7 @@ static unsigned long cm_get_per_vco_clk_hz(void)
 {
        unsigned long fref, refdiv, mdiv, reg, vco;
 
-       reg = readl(&clock_manager_base->per_pll.pllglob);
+       reg = readl(socfpga_get_clkmgr_addr() + CLKMGR_S10_PERPLL_PLLGLOB);
 
        fref = (reg >> CLKMGR_PLLGLOB_VCO_PSRC_OFFSET) &
                CLKMGR_PLLGLOB_VCO_PSRC_MASK;
@@ -224,7 +249,7 @@ static unsigned long cm_get_per_vco_clk_hz(void)
        refdiv = (reg >> CLKMGR_PLLGLOB_REFCLKDIV_OFFSET) &
                  CLKMGR_PLLGLOB_REFCLKDIV_MASK;
 
-       reg = readl(&clock_manager_base->per_pll.fdbck);
+       reg = readl(socfpga_get_clkmgr_addr() + CLKMGR_S10_PERPLL_FDBCK);
        mdiv = (reg >> CLKMGR_FDBCK_MDIV_OFFSET) & CLKMGR_FDBCK_MDIV_MASK;
 
        vco = fref / refdiv;
@@ -234,20 +259,23 @@ static unsigned long cm_get_per_vco_clk_hz(void)
 
 unsigned long cm_get_mpu_clk_hz(void)
 {
-       unsigned long clock = readl(&clock_manager_base->main_pll.mpuclk);
+       unsigned long clock = readl(socfpga_get_clkmgr_addr() +
+                                   CLKMGR_S10_MAINPLL_MPUCLK);
 
        clock = (clock >> CLKMGR_CLKSRC_OFFSET) & CLKMGR_CLKSRC_MASK;
 
        switch (clock) {
        case CLKMGR_CLKSRC_MAIN:
                clock = cm_get_main_vco_clk_hz();
-               clock /= (readl(&clock_manager_base->main_pll.pllc0) &
+               clock /= (readl(socfpga_get_clkmgr_addr() +
+                               CLKMGR_S10_MAINPLL_PLLC0) &
                          CLKMGR_PLLC0_DIV_MASK);
                break;
 
        case CLKMGR_CLKSRC_PER:
                clock = cm_get_per_vco_clk_hz();
-               clock /= (readl(&clock_manager_base->per_pll.pllc0) &
+               clock /= (readl(socfpga_get_clkmgr_addr() +
+                               CLKMGR_S10_PERPLL_PLLC0) &
                          CLKMGR_CLKCNT_MSK);
                break;
 
@@ -264,28 +292,30 @@ unsigned long cm_get_mpu_clk_hz(void)
                break;
        }
 
-       clock /= 1 + (readl(&clock_manager_base->main_pll.mpuclk) &
-               CLKMGR_CLKCNT_MSK);
+       clock /= 1 + (readl(socfpga_get_clkmgr_addr() +
+                           CLKMGR_S10_MAINPLL_MPUCLK) & CLKMGR_CLKCNT_MSK);
        return clock;
 }
 
 unsigned int cm_get_l3_main_clk_hz(void)
 {
-       u32 clock = readl(&clock_manager_base->main_pll.nocclk);
+       u32 clock = readl(socfpga_get_clkmgr_addr() +
+                         CLKMGR_S10_MAINPLL_NOCCLK);
 
        clock = (clock >> CLKMGR_CLKSRC_OFFSET) & CLKMGR_CLKSRC_MASK;
 
        switch (clock) {
        case CLKMGR_CLKSRC_MAIN:
                clock = cm_get_main_vco_clk_hz();
-               clock /= (readl(&clock_manager_base->main_pll.pllc1) &
+               clock /= (readl(socfpga_get_clkmgr_addr() +
+                               CLKMGR_S10_MAINPLL_PLLC1) &
                          CLKMGR_PLLC0_DIV_MASK);
                break;
 
        case CLKMGR_CLKSRC_PER:
                clock = cm_get_per_vco_clk_hz();
-               clock /= (readl(&clock_manager_base->per_pll.pllc1) &
-                         CLKMGR_CLKCNT_MSK);
+               clock /= (readl(socfpga_get_clkmgr_addr() +
+                         CLKMGR_S10_PERPLL_PLLC1) & CLKMGR_CLKCNT_MSK);
                break;
 
        case CLKMGR_CLKSRC_OSC1:
@@ -301,28 +331,31 @@ unsigned int cm_get_l3_main_clk_hz(void)
                break;
        }
 
-       clock /= 1 + (readl(&clock_manager_base->main_pll.nocclk) &
-               CLKMGR_CLKCNT_MSK);
+       clock /= 1 + (readl(socfpga_get_clkmgr_addr() +
+                     CLKMGR_S10_MAINPLL_NOCCLK) & CLKMGR_CLKCNT_MSK);
        return clock;
 }
 
 unsigned int cm_get_mmc_controller_clk_hz(void)
 {
-       u32 clock = readl(&clock_manager_base->per_pll.cntr6clk);
+       u32 clock = readl(socfpga_get_clkmgr_addr() +
+                         CLKMGR_S10_PERPLL_CNTR6CLK);
 
        clock = (clock >> CLKMGR_CLKSRC_OFFSET) & CLKMGR_CLKSRC_MASK;
 
        switch (clock) {
        case CLKMGR_CLKSRC_MAIN:
                clock = cm_get_l3_main_clk_hz();
-               clock /= 1 + (readl(&clock_manager_base->main_pll.cntr6clk) &
-                       CLKMGR_CLKCNT_MSK);
+               clock /= 1 + (readl(socfpga_get_clkmgr_addr() +
+                                   CLKMGR_S10_MAINPLL_CNTR6CLK) &
+                             CLKMGR_CLKCNT_MSK);
                break;
 
        case CLKMGR_CLKSRC_PER:
                clock = cm_get_l3_main_clk_hz();
-               clock /= 1 + (readl(&clock_manager_base->per_pll.cntr6clk) &
-                       CLKMGR_CLKCNT_MSK);
+               clock /= 1 + (readl(socfpga_get_clkmgr_addr() +
+                                   CLKMGR_S10_PERPLL_CNTR6CLK) &
+                             CLKMGR_CLKCNT_MSK);
                break;
 
        case CLKMGR_CLKSRC_OSC1:
@@ -344,22 +377,25 @@ unsigned int cm_get_l4_sp_clk_hz(void)
 {
        u32 clock = cm_get_l3_main_clk_hz();
 
-       clock /= (1 << ((readl(&clock_manager_base->main_pll.nocdiv) >>
-                 CLKMGR_NOCDIV_L4SPCLK_OFFSET) & CLKMGR_CLKCNT_MSK));
+       clock /= (1 << ((readl(socfpga_get_clkmgr_addr() +
+                              CLKMGR_S10_MAINPLL_NOCDIV) >>
+                        CLKMGR_NOCDIV_L4SPCLK_OFFSET) & CLKMGR_CLKCNT_MSK));
        return clock;
 }
 
 unsigned int cm_get_qspi_controller_clk_hz(void)
 {
-       return readl(&sysmgr_regs->boot_scratch_cold0);
+       return readl(socfpga_get_sysmgr_addr() +
+                    SYSMGR_SOC64_BOOT_SCRATCH_COLD0);
 }
 
 unsigned int cm_get_spi_controller_clk_hz(void)
 {
        u32 clock = cm_get_l3_main_clk_hz();
 
-       clock /= (1 << ((readl(&clock_manager_base->main_pll.nocdiv) >>
-                 CLKMGR_NOCDIV_L4MAIN_OFFSET) & CLKMGR_CLKCNT_MSK));
+       clock /= (1 << ((readl(socfpga_get_clkmgr_addr() +
+                              CLKMGR_S10_MAINPLL_NOCDIV) >>
+                        CLKMGR_NOCDIV_L4MAIN_OFFSET) & CLKMGR_CLKCNT_MSK));
        return clock;
 }
 
diff --git a/arch/arm/mach-socfpga/firewall.c b/arch/arm/mach-socfpga/firewall.c
new file mode 100644 (file)
index 0000000..69229dc
--- /dev/null
@@ -0,0 +1,107 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (C) 2016-2019 Intel Corporation <www.intel.com>
+ *
+ */
+
+#include <asm/io.h>
+#include <common.h>
+#include <asm/arch/firewall.h>
+#include <asm/arch/system_manager.h>
+
+static void firewall_l4_per_disable(void)
+{
+       const struct socfpga_firwall_l4_per *firwall_l4_per_base =
+               (struct socfpga_firwall_l4_per *)SOCFPGA_FIREWALL_L4_PER;
+       u32 i;
+       const u32 *addr[] = {
+                       &firwall_l4_per_base->nand,
+                       &firwall_l4_per_base->nand_data,
+                       &firwall_l4_per_base->usb0,
+                       &firwall_l4_per_base->usb1,
+                       &firwall_l4_per_base->spim0,
+                       &firwall_l4_per_base->spim1,
+                       &firwall_l4_per_base->emac0,
+                       &firwall_l4_per_base->emac1,
+                       &firwall_l4_per_base->emac2,
+                       &firwall_l4_per_base->sdmmc,
+                       &firwall_l4_per_base->gpio0,
+                       &firwall_l4_per_base->gpio1,
+                       &firwall_l4_per_base->i2c0,
+                       &firwall_l4_per_base->i2c1,
+                       &firwall_l4_per_base->i2c2,
+                       &firwall_l4_per_base->i2c3,
+                       &firwall_l4_per_base->i2c4,
+                       &firwall_l4_per_base->timer0,
+                       &firwall_l4_per_base->timer1,
+                       &firwall_l4_per_base->uart0,
+                       &firwall_l4_per_base->uart1
+                       };
+
+       /*
+        * The following lines of code will enable non-secure access
+        * to nand, usb, spi, emac, sdmmc, gpio, i2c, timers and uart. This
+        * is needed as most OS run in non-secure mode. Thus we need to
+        * enable non-secure access to these peripherals in order for the
+        * OS to use these peripherals.
+        */
+       for (i = 0; i < ARRAY_SIZE(addr); i++)
+               writel(FIREWALL_L4_DISABLE_ALL, addr[i]);
+}
+
+static void firewall_l4_sys_disable(void)
+{
+       const struct socfpga_firwall_l4_sys *firwall_l4_sys_base =
+               (struct socfpga_firwall_l4_sys *)SOCFPGA_FIREWALL_L4_SYS;
+       u32 i;
+       const u32 *addr[] = {
+                       &firwall_l4_sys_base->dma_ecc,
+                       &firwall_l4_sys_base->emac0rx_ecc,
+                       &firwall_l4_sys_base->emac0tx_ecc,
+                       &firwall_l4_sys_base->emac1rx_ecc,
+                       &firwall_l4_sys_base->emac1tx_ecc,
+                       &firwall_l4_sys_base->emac2rx_ecc,
+                       &firwall_l4_sys_base->emac2tx_ecc,
+                       &firwall_l4_sys_base->nand_ecc,
+                       &firwall_l4_sys_base->nand_read_ecc,
+                       &firwall_l4_sys_base->nand_write_ecc,
+                       &firwall_l4_sys_base->ocram_ecc,
+                       &firwall_l4_sys_base->sdmmc_ecc,
+                       &firwall_l4_sys_base->usb0_ecc,
+                       &firwall_l4_sys_base->usb1_ecc,
+                       &firwall_l4_sys_base->clock_manager,
+                       &firwall_l4_sys_base->io_manager,
+                       &firwall_l4_sys_base->reset_manager,
+                       &firwall_l4_sys_base->system_manager,
+                       &firwall_l4_sys_base->watchdog0,
+                       &firwall_l4_sys_base->watchdog1,
+                       &firwall_l4_sys_base->watchdog2,
+                       &firwall_l4_sys_base->watchdog3
+               };
+
+       for (i = 0; i < ARRAY_SIZE(addr); i++)
+               writel(FIREWALL_L4_DISABLE_ALL, addr[i]);
+}
+
+static void firewall_bridge_disable(void)
+{
+       /* disable lwsocf2fpga and soc2fpga bridge security */
+       writel(FIREWALL_BRIDGE_DISABLE_ALL, SOCFPGA_FIREWALL_SOC2FPGA);
+       writel(FIREWALL_BRIDGE_DISABLE_ALL, SOCFPGA_FIREWALL_LWSOC2FPGA);
+}
+
+void firewall_setup(void)
+{
+       firewall_l4_per_disable();
+       firewall_l4_sys_disable();
+       firewall_bridge_disable();
+
+       /* disable SMMU security */
+       writel(FIREWALL_L4_DISABLE_ALL, SOCFPGA_FIREWALL_TCU);
+
+       /* enable non-secure interface to DMA330 DMA and peripherals */
+       writel(SYSMGR_DMA_IRQ_NS | SYSMGR_DMA_MGR_NS,
+              socfpga_get_sysmgr_addr() + SYSMGR_SOC64_DMA);
+       writel(SYSMGR_DMAPERIPH_ALL_NS,
+              socfpga_get_sysmgr_addr() + SYSMGR_SOC64_DMA_PERIPH);
+}
index 1f549d7e70f3ecbd5d412ab916096531a0c4bcc7..d3eca65e97c18b3fc86f57141a6fd8258f036aec 100644 (file)
 #define SOCFPGA_SDR_SCHEDULER_ADDRESS          0xf8000400
 #define SOCFPGA_HMC_MMR_IO48_ADDRESS           0xf8010000
 #define SOCFPGA_SDR_ADDRESS                    0xf8011000
+#ifdef CONFIG_TARGET_SOCFPGA_AGILEX
+#define SOCFPGA_FW_MPU_DDR_SCR_ADDRESS         0xf8020200
+#else
 #define SOCFPGA_FW_MPU_DDR_SCR_ADDRESS         0xf8020100
+#endif
 #define SOCFPGA_SMMU_ADDRESS                   0xfa000000
 #define SOCFPGA_MAILBOX_ADDRESS                        0xffa30000
 #define SOCFPGA_UART0_ADDRESS                  0xffc02000
index dd80e3a76720d323c2341c133b89c78deffa9867..c6830582a5ac99b849aa1db740ed9e1d6ce8ef02 100644 (file)
@@ -6,6 +6,8 @@
 #ifndef _CLOCK_MANAGER_H_
 #define _CLOCK_MANAGER_H_
 
+phys_addr_t socfpga_get_clkmgr_addr(void);
+
 #ifndef __ASSEMBLER__
 void cm_wait_for_lock(u32 mask);
 int cm_wait_for_fsm(void);
@@ -18,6 +20,8 @@ void cm_print_clock_quick_summary(void);
 #include <asm/arch/clock_manager_arria10.h>
 #elif defined(CONFIG_TARGET_SOCFPGA_STRATIX10)
 #include <asm/arch/clock_manager_s10.h>
+#elif defined(CONFIG_TARGET_SOCFPGA_AGILEX)
+#include <asm/arch/clock_manager_agilex.h>
 #endif
 
 #endif /* _CLOCK_MANAGER_H_ */
diff --git a/arch/arm/mach-socfpga/include/mach/clock_manager_agilex.h b/arch/arm/mach-socfpga/include/mach/clock_manager_agilex.h
new file mode 100644 (file)
index 0000000..386e82a
--- /dev/null
@@ -0,0 +1,14 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2019 Intel Corporation <www.intel.com>
+ */
+
+#ifndef _CLOCK_MANAGER_AGILEX_
+#define _CLOCK_MANAGER_AGILEX_
+
+unsigned long cm_get_mpu_clk_hz(void);
+
+#include <asm/arch/clock_manager_soc64.h>
+#include "../../../../../drivers/clk/altera/clk-agilex.h"
+
+#endif /* _CLOCK_MANAGER_AGILEX_ */
index de8c22540f3dde625524bf421f89dc41af5ce4e1..23f280df1b915149fe5dca9fb961655560b7966a 100644 (file)
@@ -8,86 +8,57 @@
 
 #ifndef __ASSEMBLER__
 
-struct socfpga_clock_manager_main_pll {
-       u32  vco0;
-       u32  vco1;
-       u32  en;
-       u32  ens;
-       u32  enr;
-       u32  bypass;
-       u32  bypasss;
-       u32  bypassr;
-       u32  mpuclk;
-       u32  nocclk;
-       u32  cntr2clk;
-       u32  cntr3clk;
-       u32  cntr4clk;
-       u32  cntr5clk;
-       u32  cntr6clk;
-       u32  cntr7clk;
-       u32  cntr8clk;
-       u32  cntr9clk;
-       u32  pad_0x48_0x5b[5];
-       u32  cntr15clk;
-       u32  outrst;
-       u32  outrststat;
-       u32  nocdiv;
-       u32  pad_0x6c_0x80[5];
-};
-
-struct socfpga_clock_manager_per_pll {
-       u32  vco0;
-       u32  vco1;
-       u32  en;
-       u32  ens;
-       u32  enr;
-       u32  bypass;
-       u32  bypasss;
-       u32  bypassr;
-       u32  pad_0x20_0x27[2];
-       u32  cntr2clk;
-       u32  cntr3clk;
-       u32  cntr4clk;
-       u32  cntr5clk;
-       u32  cntr6clk;
-       u32  cntr7clk;
-       u32  cntr8clk;
-       u32  cntr9clk;
-       u32  pad_0x48_0x5f[6];
-       u32  outrst;
-       u32  outrststat;
-       u32  emacctl;
-       u32  gpiodiv;
-       u32  pad_0x70_0x80[4];
-};
-
-struct socfpga_clock_manager_altera {
-       u32     mpuclk;
-       u32     nocclk;
-       u32     mainmisc0;
-       u32     mainmisc1;
-       u32     perimisc0;
-       u32     perimisc1;
-};
-
-struct socfpga_clock_manager {
-       /* clkmgr */
-       u32  ctrl;
-       u32  intr;
-       u32  intrs;
-       u32  intrr;
-       u32  intren;
-       u32  intrens;
-       u32  intrenr;
-       u32  stat;
-       u32  testioctrl;
-       u32  _pad_0x24_0x40[7];
-       /* mainpllgrp */
-       struct socfpga_clock_manager_main_pll main_pll;
-       /* perpllgrp */
-       struct socfpga_clock_manager_per_pll per_pll;
-       struct socfpga_clock_manager_altera altera;
-};
+/* Clock manager group */
+#define CLKMGR_A10_CTRL                                0x00
+#define CLKMGR_A10_INTR                                0x04
+#define CLKMGR_A10_STAT                                0x1c
+/* MainPLL group */
+#define CLKMGR_A10_MAINPLL_VCO0                        0x40
+#define CLKMGR_A10_MAINPLL_VCO1                        0x44
+#define CLKMGR_A10_MAINPLL_EN                  0x48
+#define CLKMGR_A10_MAINPLL_ENS                 0x4c
+#define CLKMGR_A10_MAINPLL_ENR                 0x50
+#define CLKMGR_A10_MAINPLL_BYPASS              0x54
+#define CLKMGR_A10_MAINPLL_BYPASSS             0x58
+#define CLKMGR_A10_MAINPLL_BYPASSR             0x5c
+#define CLKMGR_A10_MAINPLL_MPUCLK              0x60
+#define CLKMGR_A10_MAINPLL_NOCCLK              0x64
+#define CLKMGR_A10_MAINPLL_CNTR2CLK            0x68
+#define CLKMGR_A10_MAINPLL_CNTR3CLK            0x6c
+#define CLKMGR_A10_MAINPLL_CNTR4CLK            0x70
+#define CLKMGR_A10_MAINPLL_CNTR5CLK            0x74
+#define CLKMGR_A10_MAINPLL_CNTR6CLK            0x78
+#define CLKMGR_A10_MAINPLL_CNTR7CLK            0x7c
+#define CLKMGR_A10_MAINPLL_CNTR8CLK            0x80
+#define CLKMGR_A10_MAINPLL_CNTR9CLK            0x84
+#define CLKMGR_A10_MAINPLL_CNTR15CLK           0x9c
+#define CLKMGR_A10_MAINPLL_NOCDIV              0xa8
+/* Peripheral PLL group */
+#define CLKMGR_A10_PERPLL_VCO0                 0xc0
+#define CLKMGR_A10_PERPLL_VCO1                 0xc4
+#define CLKMGR_A10_PERPLL_EN                   0xc8
+#define CLKMGR_A10_PERPLL_ENS                  0xcc
+#define CLKMGR_A10_PERPLL_ENR                  0xd0
+#define CLKMGR_A10_PERPLL_BYPASS               0xd4
+#define CLKMGR_A10_PERPLL_BYPASSS              0xd8
+#define CLKMGR_A10_PERPLL_BYPASSR              0xdc
+#define CLKMGR_A10_PERPLL_CNTR2CLK             0xe8
+#define CLKMGR_A10_PERPLL_CNTR3CLK             0xec
+#define CLKMGR_A10_PERPLL_CNTR4CLK             0xf0
+#define CLKMGR_A10_PERPLL_CNTR5CLK             0xf4
+#define CLKMGR_A10_PERPLL_CNTR6CLK             0xf8
+#define CLKMGR_A10_PERPLL_CNTR7CLK             0xfc
+#define CLKMGR_A10_PERPLL_CNTR8CLK             0x100
+#define CLKMGR_A10_PERPLL_CNTR9CLK             0x104
+#define CLKMGR_A10_PERPLL_EMACCTL              0x128
+#define CLKMGR_A10_PERPLL_GPIOFIV              0x12c
+/* Altera group */
+#define CLKMGR_A10_ALTR_MPUCLK                 0x140
+#define CLKMGR_A10_ALTR_NOCCLK                 0x144
+
+#define CLKMGR_STAT                            CLKMGR_A10_STAT
+#define CLKMGR_INTER                           CLKMGR_A10_INTER
+#define CLKMGR_PERPLL_EN                       CLKMGR_A10_PERPLL_EN
 
 #ifdef CONFIG_SPL_BUILD
 int cm_basic_init(const void *blob);
@@ -100,8 +71,6 @@ unsigned int cm_get_qspi_controller_clk_hz(void);
 
 #endif /* __ASSEMBLER__ */
 
-#define CLKMGR_ALTERAGRP_MPU_CLK_OFFSET                        0x140
-#define CLKMGR_MAINPLL_NOC_CLK_OFFSET                  0x144
 #define LOCKED_MASK    (CLKMGR_CLKMGR_STAT_MAINPLLLOCKED_SET_MSK | \
                         CLKMGR_CLKMGR_STAT_PERPLLLOCKED_SET_MSK)
 
index 5bedf28cf1ad35f1c474e4dab89aafc4b94f2e7c..08655094ca3ac6141834609b4f538d566fb2bd4d 100644 (file)
@@ -45,71 +45,53 @@ struct cm_config {
        u32 altera_grp_mpuclk;
 };
 
-struct socfpga_clock_manager_main_pll {
-       u32     vco;
-       u32     misc;
-       u32     mpuclk;
-       u32     mainclk;
-       u32     dbgatclk;
-       u32     mainqspiclk;
-       u32     mainnandsdmmcclk;
-       u32     cfgs2fuser0clk;
-       u32     en;
-       u32     maindiv;
-       u32     dbgdiv;
-       u32     tracediv;
-       u32     l4src;
-       u32     stat;
-       u32     _pad_0x38_0x40[2];
-};
-
-struct socfpga_clock_manager_per_pll {
-       u32     vco;
-       u32     misc;
-       u32     emac0clk;
-       u32     emac1clk;
-       u32     perqspiclk;
-       u32     pernandsdmmcclk;
-       u32     perbaseclk;
-       u32     s2fuser1clk;
-       u32     en;
-       u32     div;
-       u32     gpiodiv;
-       u32     src;
-       u32     stat;
-       u32     _pad_0x34_0x40[3];
-};
-
-struct socfpga_clock_manager_sdr_pll {
-       u32     vco;
-       u32     ctrl;
-       u32     ddrdqsclk;
-       u32     ddr2xdqsclk;
-       u32     ddrdqclk;
-       u32     s2fuser2clk;
-       u32     en;
-       u32     stat;
-};
-
-struct socfpga_clock_manager_altera {
-       u32     mpuclk;
-       u32     mainclk;
-};
-
-struct socfpga_clock_manager {
-       u32     ctrl;
-       u32     bypass;
-       u32     inter;
-       u32     intren;
-       u32     dbctrl;
-       u32     stat;
-       u32     _pad_0x18_0x3f[10];
-       struct socfpga_clock_manager_main_pll main_pll;
-       struct socfpga_clock_manager_per_pll per_pll;
-       struct socfpga_clock_manager_sdr_pll sdr_pll;
-       struct socfpga_clock_manager_altera altera;
-       u32     _pad_0xe8_0x200[70];
-};
+/* Clock manager group */
+#define CLKMGR_GEN5_CTRL                       0x00
+#define CLKMGR_GEN5_BYPASS                     0x04
+#define CLKMGR_GEN5_INTER                      0x08
+#define CLKMGR_GEN5_STAT                       0x14
+/* MainPLL group */
+#define CLKMGR_GEN5_MAINPLL_VCO                        0x40
+#define CLKMGR_GEN5_MAINPLL_MISC               0x44
+#define CLKMGR_GEN5_MAINPLL_MPUCLK             0x48
+#define CLKMGR_GEN5_MAINPLL_MAINCLK            0x4c
+#define CLKMGR_GEN5_MAINPLL_DBGATCLK           0x50
+#define CLKMGR_GEN5_MAINPLL_MAINQSPICLK                0x54
+#define CLKMGR_GEN5_MAINPLL_MAINNANDSDMMCCLK   0x58
+#define CLKMGR_GEN5_MAINPLL_CFGS2FUSER0CLK     0x5c
+#define CLKMGR_GEN5_MAINPLL_EN                 0x60
+#define CLKMGR_GEN5_MAINPLL_MAINDIV            0x64
+#define CLKMGR_GEN5_MAINPLL_DBGDIV             0x68
+#define CLKMGR_GEN5_MAINPLL_TRACEDIV           0x6c
+#define CLKMGR_GEN5_MAINPLL_L4SRC              0x70
+/* Peripheral PLL group */
+#define CLKMGR_GEN5_PERPLL_VCO                 0x80
+#define CLKMGR_GEN5_PERPLL_MISC                        0x84
+#define CLKMGR_GEN5_PERPLL_EMAC0CLK            0x88
+#define CLKMGR_GEN5_PERPLL_EMAC1CLK            0x8c
+#define CLKMGR_GEN5_PERPLL_PERQSPICLK          0x90
+#define CLKMGR_GEN5_PERPLL_PERNANDSDMMCCLK     0x94
+#define CLKMGR_GEN5_PERPLL_PERBASECLK          0x98
+#define CLKMGR_GEN5_PERPLL_S2FUSER1CLK         0x9c
+#define CLKMGR_GEN5_PERPLL_EN                  0xa0
+#define CLKMGR_GEN5_PERPLL_DIV                 0xa4
+#define CLKMGR_GEN5_PERPLL_GPIODIV             0xa8
+#define CLKMGR_GEN5_PERPLL_SRC                 0xac
+/* SDRAM PLL group */
+#define CLKMGR_GEN5_SDRPLL_VCO                 0xc0
+#define CLKMGR_GEN5_SDRPLL_CTRL                        0xc4
+#define CLKMGR_GEN5_SDRPLL_DDRDQSCLK           0xc8
+#define CLKMGR_GEN5_SDRPLL_DDR2XDQSCLK         0xcc
+#define CLKMGR_GEN5_SDRPLL_DDRDQCLK            0xd0
+#define CLKMGR_GEN5_SDRPLL_S2FUSER2CLK         0xd4
+#define CLKMGR_GEN5_SDRPLL_EN                  0xd8
+/* Altera group */
+#define CLKMGR_GEN5_ALTR_MPUCLK                        0xe0
+#define CLKMGR_GEN5_ALTR_MAINCLK               0xe4
+
+#define CLKMGR_STAT                            CLKMGR_GEN5_STAT
+#define CLKMGR_INTER                           CLKMGR_GEN5_INTER
+#define CLKMGR_PERPLL_EN                       CLKMGR_GEN5_PERPLL_EN
 
 /* Clock speed accessors */
 unsigned long cm_get_mpu_clk_hz(void);
index 24b20de011d0693bfc174d1946a743d83dd4449f..e710aa2f94f0c78d31f43e1505db7cf0740127b0 100644 (file)
@@ -1,12 +1,14 @@
 /* SPDX-License-Identifier: GPL-2.0
  *
- * Copyright (C) 2016-2018 Intel Corporation <www.intel.com>
+ * Copyright (C) 2016-2019 Intel Corporation <www.intel.com>
  *
  */
 
 #ifndef        _CLOCK_MANAGER_S10_
 #define        _CLOCK_MANAGER_S10_
 
+#include <asm/arch/clock_manager_soc64.h>
+
 /* Clock speed accessors */
 unsigned long cm_get_mpu_clk_hz(void);
 unsigned long cm_get_sdram_clk_hz(void);
@@ -14,18 +16,6 @@ unsigned int cm_get_l4_sp_clk_hz(void);
 unsigned int cm_get_mmc_controller_clk_hz(void);
 unsigned int cm_get_qspi_controller_clk_hz(void);
 unsigned int cm_get_spi_controller_clk_hz(void);
-const unsigned int cm_get_osc_clk_hz(void);
-const unsigned int cm_get_f2s_per_ref_clk_hz(void);
-const unsigned int cm_get_f2s_sdr_ref_clk_hz(void);
-const unsigned int cm_get_intosc_clk_hz(void);
-const unsigned int cm_get_fpga_clk_hz(void);
-
-#define CLKMGR_EOSC1_HZ                25000000
-#define CLKMGR_INTOSC_HZ       460000000
-#define CLKMGR_FPGA_CLK_HZ     50000000
-
-/* Clock configuration accessors */
-const struct cm_config * const cm_get_default_config(void);
 
 struct cm_config {
        /* main group */
@@ -69,75 +59,54 @@ struct cm_config {
 
 void cm_basic_init(const struct cm_config * const cfg);
 
-struct socfpga_clock_manager_main_pll {
-       u32     en;
-       u32     ens;
-       u32     enr;
-       u32     bypass;
-       u32     bypasss;
-       u32     bypassr;
-       u32     mpuclk;
-       u32     nocclk;
-       u32     cntr2clk;
-       u32     cntr3clk;
-       u32     cntr4clk;
-       u32     cntr5clk;
-       u32     cntr6clk;
-       u32     cntr7clk;
-       u32     cntr8clk;
-       u32     cntr9clk;
-       u32     nocdiv;
-       u32     pllglob;
-       u32     fdbck;
-       u32     mem;
-       u32     memstat;
-       u32     pllc0;
-       u32     pllc1;
-       u32     vcocalib;
-       u32     _pad_0x90_0xA0[5];
-};
+/* Control status */
+#define CLKMGR_S10_CTRL                                        0x00
+#define CLKMGR_S10_STAT                                        0x04
+#define CLKMGR_S10_INTRCLR                             0x14
+/* Mainpll group */
+#define CLKMGR_S10_MAINPLL_EN                          0x30
+#define CLKMGR_S10_MAINPLL_BYPASS                      0x3c
+#define CLKMGR_S10_MAINPLL_MPUCLK                      0x48
+#define CLKMGR_S10_MAINPLL_NOCCLK                      0x4c
+#define CLKMGR_S10_MAINPLL_CNTR2CLK                    0x50
+#define CLKMGR_S10_MAINPLL_CNTR3CLK                    0x54
+#define CLKMGR_S10_MAINPLL_CNTR4CLK                    0x58
+#define CLKMGR_S10_MAINPLL_CNTR5CLK                    0x5c
+#define CLKMGR_S10_MAINPLL_CNTR6CLK                    0x60
+#define CLKMGR_S10_MAINPLL_CNTR7CLK                    0x64
+#define CLKMGR_S10_MAINPLL_CNTR8CLK                    0x68
+#define CLKMGR_S10_MAINPLL_CNTR9CLK                    0x6c
+#define CLKMGR_S10_MAINPLL_NOCDIV                      0x70
+#define CLKMGR_S10_MAINPLL_PLLGLOB                     0x74
+#define CLKMGR_S10_MAINPLL_FDBCK                       0x78
+#define CLKMGR_S10_MAINPLL_MEMSTAT                     0x80
+#define CLKMGR_S10_MAINPLL_PLLC0                       0x84
+#define CLKMGR_S10_MAINPLL_PLLC1                       0x88
+#define CLKMGR_S10_MAINPLL_VCOCALIB                    0x8c
+/* Periphpll group */
+#define CLKMGR_S10_PERPLL_EN                           0xa4
+#define CLKMGR_S10_PERPLL_BYPASS                       0xac
+#define CLKMGR_S10_PERPLL_CNTR2CLK                     0xbc
+#define CLKMGR_S10_PERPLL_CNTR3CLK                     0xc0
+#define CLKMGR_S10_PERPLL_CNTR4CLK                     0xc4
+#define CLKMGR_S10_PERPLL_CNTR5CLK                     0xc8
+#define CLKMGR_S10_PERPLL_CNTR6CLK                     0xcc
+#define CLKMGR_S10_PERPLL_CNTR7CLK                     0xd0
+#define CLKMGR_S10_PERPLL_CNTR8CLK                     0xd4
+#define CLKMGR_S10_PERPLL_CNTR9CLK                     0xd8
+#define CLKMGR_S10_PERPLL_EMACCTL                      0xdc
+#define CLKMGR_S10_PERPLL_GPIODIV                      0xe0
+#define CLKMGR_S10_PERPLL_PLLGLOB                      0xe4
+#define CLKMGR_S10_PERPLL_FDBCK                                0xe8
+#define CLKMGR_S10_PERPLL_MEMSTAT                      0xf0
+#define CLKMGR_S10_PERPLL_PLLC0                                0xf4
+#define CLKMGR_S10_PERPLL_PLLC1                                0xf8
+#define CLKMGR_S10_PERPLL_VCOCALIB                     0xfc
+
+#define CLKMGR_STAT                                    CLKMGR_S10_STAT
+#define CLKMGR_INTER                                   CLKMGR_S10_INTER
+#define CLKMGR_PERPLL_EN                               CLKMGR_S10_PERPLL_EN
 
-struct socfpga_clock_manager_per_pll {
-       u32     en;
-       u32     ens;
-       u32     enr;
-       u32     bypass;
-       u32     bypasss;
-       u32     bypassr;
-       u32     cntr2clk;
-       u32     cntr3clk;
-       u32     cntr4clk;
-       u32     cntr5clk;
-       u32     cntr6clk;
-       u32     cntr7clk;
-       u32     cntr8clk;
-       u32     cntr9clk;
-       u32     emacctl;
-       u32     gpiodiv;
-       u32     pllglob;
-       u32     fdbck;
-       u32     mem;
-       u32     memstat;
-       u32     pllc0;
-       u32     pllc1;
-       u32     vcocalib;
-       u32     _pad_0x100_0x124[10];
-};
-
-struct socfpga_clock_manager {
-       u32     ctrl;
-       u32     stat;
-       u32     testioctrl;
-       u32     intrgen;
-       u32     intrmsk;
-       u32     intrclr;
-       u32     intrsts;
-       u32     intrstk;
-       u32     intrraw;
-       u32     _pad_0x24_0x2c[3];
-       struct socfpga_clock_manager_main_pll main_pll;
-       struct socfpga_clock_manager_per_pll per_pll;
-};
 
 #define CLKMGR_CTRL_SAFEMODE                           BIT(0)
 #define CLKMGR_BYPASS_MAINPLL_ALL                      0x00000007
diff --git a/arch/arm/mach-socfpga/include/mach/clock_manager_soc64.h b/arch/arm/mach-socfpga/include/mach/clock_manager_soc64.h
new file mode 100644 (file)
index 0000000..71fbaa7
--- /dev/null
@@ -0,0 +1,21 @@
+/* SPDX-License-Identifier: GPL-2.0
+ *
+ * Copyright (C) 2016-2019 Intel Corporation <www.intel.com>
+ *
+ */
+
+#ifndef _CLOCK_MANAGER_SOC64_
+#define _CLOCK_MANAGER_SOC64_
+
+const unsigned int cm_get_osc_clk_hz(void);
+const unsigned int cm_get_f2s_per_ref_clk_hz(void);
+const unsigned int cm_get_f2s_sdr_ref_clk_hz(void);
+const unsigned int cm_get_intosc_clk_hz(void);
+const unsigned int cm_get_fpga_clk_hz(void);
+
+#define CLKMGR_INTOSC_HZ       400000000
+
+/* Clock configuration accessors */
+const struct cm_config * const cm_get_default_config(void);
+
+#endif /* _CLOCK_MANAGER_SOC64_ */
diff --git a/arch/arm/mach-socfpga/include/mach/firewall.h b/arch/arm/mach-socfpga/include/mach/firewall.h
new file mode 100644 (file)
index 0000000..430341b
--- /dev/null
@@ -0,0 +1,129 @@
+/* SPDX-License-Identifier: GPL-2.0
+ *
+ * Copyright (C) 2017-2019 Intel Corporation <www.intel.com>
+ *
+ */
+
+#ifndef        _FIREWALL_H_
+#define        _FIREWALL_H_
+
+struct socfpga_firwall_l4_per {
+       u32     nand;           /* 0x00 */
+       u32     nand_data;
+       u32     _pad_0x8;
+       u32     usb0;
+       u32     usb1;           /* 0x10 */
+       u32     _pad_0x14;
+       u32     _pad_0x18;
+       u32     spim0;
+       u32     spim1;          /* 0x20 */
+       u32     spis0;
+       u32     spis1;
+       u32     emac0;
+       u32     emac1;          /* 0x30 */
+       u32     emac2;
+       u32     _pad_0x38;
+       u32     _pad_0x3c;
+       u32     sdmmc;          /* 0x40 */
+       u32     gpio0;
+       u32     gpio1;
+       u32     _pad_0x4c;
+       u32     i2c0;           /* 0x50 */
+       u32     i2c1;
+       u32     i2c2;
+       u32     i2c3;
+       u32     i2c4;           /* 0x60 */
+       u32     timer0;
+       u32     timer1;
+       u32     uart0;
+       u32     uart1;          /* 0x70 */
+};
+
+struct socfpga_firwall_l4_sys {
+       u32     _pad_0x00;              /* 0x00 */
+       u32     _pad_0x04;
+       u32     dma_ecc;
+       u32     emac0rx_ecc;
+       u32     emac0tx_ecc;            /* 0x10 */
+       u32     emac1rx_ecc;
+       u32     emac1tx_ecc;
+       u32     emac2rx_ecc;
+       u32     emac2tx_ecc;            /* 0x20 */
+       u32     _pad_0x24;
+       u32     _pad_0x28;
+       u32     nand_ecc;
+       u32     nand_read_ecc;          /* 0x30 */
+       u32     nand_write_ecc;
+       u32     ocram_ecc;
+       u32     _pad_0x3c;
+       u32     sdmmc_ecc;              /* 0x40 */
+       u32     usb0_ecc;
+       u32     usb1_ecc;
+       u32     clock_manager;
+       u32     _pad_0x50;              /* 0x50 */
+       u32     io_manager;
+       u32     reset_manager;
+       u32     system_manager;
+       u32     osc0_timer;             /* 0x60 */
+       u32     osc1_timer;
+       u32     watchdog0;
+       u32     watchdog1;
+       u32     watchdog2;              /* 0x70 */
+       u32     watchdog3;
+};
+
+#define FIREWALL_L4_DISABLE_ALL                (BIT(0) | BIT(24) | BIT(16))
+#define FIREWALL_BRIDGE_DISABLE_ALL    (~0)
+
+/* Cache coherency unit (CCU) registers */
+#define CCU_CPU0_MPRT_ADBASE_DDRREG            0x4400
+#define CCU_CPU0_MPRT_ADBASE_MEMSPACE0         0x45c0
+#define CCU_CPU0_MPRT_ADBASE_MEMSPACE1A                0x45e0
+#define CCU_CPU0_MPRT_ADBASE_MEMSPACE1B                0x4600
+#define CCU_CPU0_MPRT_ADBASE_MEMSPACE1C                0x4620
+#define CCU_CPU0_MPRT_ADBASE_MEMSPACE1D                0x4640
+#define CCU_CPU0_MPRT_ADBASE_MEMSPACE1E                0x4660
+
+#define CCU_CPU0_MPRT_ADMASK_MEM_RAM0          0x4688
+
+#define CCU_IOM_MPRT_ADBASE_MEMSPACE0          0x18560
+#define CCU_IOM_MPRT_ADBASE_MEMSPACE1A         0x18580
+#define CCU_IOM_MPRT_ADBASE_MEMSPACE1B         0x185a0
+#define CCU_IOM_MPRT_ADBASE_MEMSPACE1C         0x185c0
+#define CCU_IOM_MPRT_ADBASE_MEMSPACE1D         0x185e0
+#define CCU_IOM_MPRT_ADBASE_MEMSPACE1E         0x18600
+
+#define CCU_IOM_MPRT_ADMASK_MEM_RAM0           0x18628
+
+#define CCU_TCU_MPRT_ADBASE_MEMSPACE0          0x2c520
+#define CCU_TCU_MPRT_ADBASE_MEMSPACE1A         0x2c540
+#define CCU_TCU_MPRT_ADBASE_MEMSPACE1B         0x2c560
+#define CCU_TCU_MPRT_ADBASE_MEMSPACE1C         0x2c580
+#define CCU_TCU_MPRT_ADBASE_MEMSPACE1D         0x2c5a0
+#define CCU_TCU_MPRT_ADBASE_MEMSPACE1E         0x2c5c0
+
+#define CCU_ADMASK_P_MASK                      BIT(0)
+#define CCU_ADMASK_NS_MASK                     BIT(1)
+
+#define CCU_ADBASE_DI_MASK                     BIT(4)
+
+#define CCU_REG_ADDR(reg)                      \
+       (SOCFPGA_CCU_ADDRESS + (reg))
+
+/* Firewall MPU DDR SCR registers */
+#define FW_MPU_DDR_SCR_EN                              0x00
+#define FW_MPU_DDR_SCR_EN_SET                          0x04
+#define FW_MPU_DDR_SCR_MPUREGION0ADDR_LIMIT            0x18
+#define FW_MPU_DDR_SCR_MPUREGION0ADDR_LIMITEXT         0x1c
+#define FW_MPU_DDR_SCR_NONMPUREGION0ADDR_LIMIT         0x98
+#define FW_MPU_DDR_SCR_NONMPUREGION0ADDR_LIMITEXT      0x9c
+
+#define MPUREGION0_ENABLE                              BIT(0)
+#define NONMPUREGION0_ENABLE                           BIT(8)
+
+#define FW_MPU_DDR_SCR_WRITEL(data, reg)               \
+       writel(data, SOCFPGA_FW_MPU_DDR_SCR_ADDRESS + (reg))
+
+void firewall_setup(void);
+
+#endif /* _FIREWALL_H_ */
diff --git a/arch/arm/mach-socfpga/include/mach/firewall_s10.h b/arch/arm/mach-socfpga/include/mach/firewall_s10.h
deleted file mode 100644 (file)
index b96f779..0000000
+++ /dev/null
@@ -1,120 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0
- *
- * Copyright (C) 2017-2018 Intel Corporation <www.intel.com>
- *
- */
-
-#ifndef        _FIREWALL_S10_
-#define        _FIREWALL_S10_
-
-struct socfpga_firwall_l4_per {
-       u32     nand;           /* 0x00 */
-       u32     nand_data;
-       u32     _pad_0x8;
-       u32     usb0;
-       u32     usb1;           /* 0x10 */
-       u32     _pad_0x14;
-       u32     _pad_0x18;
-       u32     spim0;
-       u32     spim1;          /* 0x20 */
-       u32     spis0;
-       u32     spis1;
-       u32     emac0;
-       u32     emac1;          /* 0x30 */
-       u32     emac2;
-       u32     _pad_0x38;
-       u32     _pad_0x3c;
-       u32     sdmmc;          /* 0x40 */
-       u32     gpio0;
-       u32     gpio1;
-       u32     _pad_0x4c;
-       u32     i2c0;           /* 0x50 */
-       u32     i2c1;
-       u32     i2c2;
-       u32     i2c3;
-       u32     i2c4;           /* 0x60 */
-       u32     timer0;
-       u32     timer1;
-       u32     uart0;
-       u32     uart1;          /* 0x70 */
-};
-
-struct socfpga_firwall_l4_sys {
-       u32     _pad_0x00;              /* 0x00 */
-       u32     _pad_0x04;
-       u32     dma_ecc;
-       u32     emac0rx_ecc;
-       u32     emac0tx_ecc;            /* 0x10 */
-       u32     emac1rx_ecc;
-       u32     emac1tx_ecc;
-       u32     emac2rx_ecc;
-       u32     emac2tx_ecc;            /* 0x20 */
-       u32     _pad_0x24;
-       u32     _pad_0x28;
-       u32     nand_ecc;
-       u32     nand_read_ecc;          /* 0x30 */
-       u32     nand_write_ecc;
-       u32     ocram_ecc;
-       u32     _pad_0x3c;
-       u32     sdmmc_ecc;              /* 0x40 */
-       u32     usb0_ecc;
-       u32     usb1_ecc;
-       u32     clock_manager;
-       u32     _pad_0x50;              /* 0x50 */
-       u32     io_manager;
-       u32     reset_manager;
-       u32     system_manager;
-       u32     osc0_timer;             /* 0x60 */
-       u32     osc1_timer;
-       u32     watchdog0;
-       u32     watchdog1;
-       u32     watchdog2;              /* 0x70 */
-       u32     watchdog3;
-};
-
-#define FIREWALL_L4_DISABLE_ALL                (BIT(0) | BIT(24) | BIT(16))
-#define FIREWALL_BRIDGE_DISABLE_ALL    (~0)
-
-/* Cache coherency unit (CCU) registers */
-#define CCU_CPU0_MPRT_ADBASE_DDRREG            0x4400
-#define CCU_CPU0_MPRT_ADBASE_MEMSPACE0         0x45c0
-#define CCU_CPU0_MPRT_ADBASE_MEMSPACE1A                0x45e0
-#define CCU_CPU0_MPRT_ADBASE_MEMSPACE1B                0x4600
-#define CCU_CPU0_MPRT_ADBASE_MEMSPACE1C                0x4620
-#define CCU_CPU0_MPRT_ADBASE_MEMSPACE1D                0x4640
-#define CCU_CPU0_MPRT_ADBASE_MEMSPACE1E                0x4660
-
-#define CCU_CPU0_MPRT_ADMASK_MEM_RAM0          0x4688
-
-#define CCU_IOM_MPRT_ADBASE_MEMSPACE0          0x18560
-#define CCU_IOM_MPRT_ADBASE_MEMSPACE1A         0x18580
-#define CCU_IOM_MPRT_ADBASE_MEMSPACE1B         0x185a0
-#define CCU_IOM_MPRT_ADBASE_MEMSPACE1C         0x185c0
-#define CCU_IOM_MPRT_ADBASE_MEMSPACE1D         0x185e0
-#define CCU_IOM_MPRT_ADBASE_MEMSPACE1E         0x18600
-
-#define CCU_IOM_MPRT_ADMASK_MEM_RAM0           0x18628
-
-#define CCU_ADMASK_P_MASK                      BIT(0)
-#define CCU_ADMASK_NS_MASK                     BIT(1)
-
-#define CCU_ADBASE_DI_MASK                     BIT(4)
-
-#define CCU_REG_ADDR(reg)                      \
-       (SOCFPGA_CCU_ADDRESS + (reg))
-
-/* Firewall MPU DDR SCR registers */
-#define FW_MPU_DDR_SCR_EN                              0x00
-#define FW_MPU_DDR_SCR_EN_SET                          0x04
-#define FW_MPU_DDR_SCR_MPUREGION0ADDR_LIMIT            0x18
-#define FW_MPU_DDR_SCR_MPUREGION0ADDR_LIMITEXT         0x1c
-#define FW_MPU_DDR_SCR_NONMPUREGION0ADDR_LIMIT         0x98
-#define FW_MPU_DDR_SCR_NONMPUREGION0ADDR_LIMITEXT      0x9c
-
-#define MPUREGION0_ENABLE                              BIT(0)
-#define NONMPUREGION0_ENABLE                           BIT(8)
-
-#define FW_MPU_DDR_SCR_WRITEL(data, reg)               \
-       writel(data, SOCFPGA_FW_MPU_DDR_SCR_ADDRESS + (reg))
-
-#endif /* _FIREWALL_S10_ */
index ba0f1fd1b2c3951f4335344816f9d08aec604cc2..3e9b606ce209086462e26f79fcc541a5e238ad07 100644 (file)
 #define S10_HANDOFF_OFFSET_LENGTH      0x4
 #define S10_HANDOFF_OFFSET_DATA        0x10
 
-#define S10_HANDOFF_CLOCK_OSC  (S10_HANDOFF_BASE + 0x608)
-#define S10_HANDOFF_CLOCK_FPGA (S10_HANDOFF_BASE + 0x60C)
+#ifdef CONFIG_TARGET_SOCFPGA_STRATIX10
+#define HANDOFF_CLOCK_OSC      (S10_HANDOFF_BASE + 0x608)
+#define HANDOFF_CLOCK_FPGA     (S10_HANDOFF_BASE + 0x60C)
+#else
+#define HANDOFF_CLOCK_OSC      (S10_HANDOFF_BASE + 0x5fc)
+#define HANDOFF_CLOCK_FPGA     (S10_HANDOFF_BASE + 0x600)
+#endif
 
 #define S10_HANDOFF_SIZE       4096
 
index f11f907e1ce2c579ea5fc43ddf0f74353943ec25..f6de1ccb4a010029baef9e217acbfb3ab7c46df6 100644 (file)
@@ -41,5 +41,6 @@ void socfpga_sdram_remap_zero(void);
 
 void do_bridge_reset(int enable, unsigned int mask);
 void socfpga_pl310_clear(void);
+void socfpga_get_managers_addr(void);
 
 #endif /* _SOCFPGA_MISC_H_ */
index 6ad037e325d0424a426c2d03f01b97e61eafd9e4..7844ad14cb66c3b60fc88efc2b12c9e70ccf54ef 100644 (file)
@@ -6,6 +6,8 @@
 #ifndef _RESET_MANAGER_H_
 #define _RESET_MANAGER_H_
 
+phys_addr_t socfpga_get_rstmgr_addr(void);
+
 void reset_cpu(ulong addr);
 
 void socfpga_per_reset(u32 reset, int set);
@@ -41,8 +43,9 @@ void socfpga_per_reset_all(void);
 #include <asm/arch/reset_manager_gen5.h>
 #elif defined(CONFIG_TARGET_SOCFPGA_ARRIA10)
 #include <asm/arch/reset_manager_arria10.h>
-#elif defined(CONFIG_TARGET_SOCFPGA_STRATIX10)
-#include <asm/arch/reset_manager_s10.h>
+#elif defined(CONFIG_TARGET_SOCFPGA_STRATIX10) || \
+       defined(CONFIG_TARGET_SOCFPGA_AGILEX)
+#include <asm/arch/reset_manager_soc64.h>
 #endif
 
 #endif /* _RESET_MANAGER_H_ */
index 6623ebee65f7ff2086ed1b186113bf3601e0f4f5..22e4eb33de88a99f23ae95f5cb505299eaf6cce9 100644 (file)
@@ -14,40 +14,15 @@ int socfpga_reset_deassert_bridges_handoff(void);
 void socfpga_reset_deassert_osc1wd0(void);
 int socfpga_bridges_reset(void);
 
-struct socfpga_reset_manager {
-       u32     stat;
-       u32     ramstat;
-       u32     miscstat;
-       u32     ctrl;
-       u32     hdsken;
-       u32     hdskreq;
-       u32     hdskack;
-       u32     counts;
-       u32     mpumodrst;
-       u32     per0modrst;
-       u32     per1modrst;
-       u32     brgmodrst;
-       u32     sysmodrst;
-       u32     coldmodrst;
-       u32     nrstmodrst;
-       u32     dbgmodrst;
-       u32     mpuwarmmask;
-       u32     per0warmmask;
-       u32     per1warmmask;
-       u32     brgwarmmask;
-       u32     syswarmmask;
-       u32     nrstwarmmask;
-       u32     l3warmmask;
-       u32     tststa;
-       u32     tstscratch;
-       u32     hdsktimeout;
-       u32     hmcintr;
-       u32     hmcintren;
-       u32     hmcintrens;
-       u32     hmcintrenr;
-       u32     hmcgpout;
-       u32     hmcgpin;
-};
+#define RSTMGR_A10_STATUS      0x00
+#define RSTMGR_A10_CTRL                0x0c
+#define RSTMGR_A10_MPUMODRST   0x20
+#define RSTMGR_A10_PER0MODRST  0x24
+#define RSTMGR_A10_PER1MODRST  0x28
+#define RSTMGR_A10_BRGMODRST   0x2c
+#define RSTMGR_A10_SYSMODRST   0x30
+
+#define RSTMGR_CTRL            RSTMGR_A10_CTRL
 
 /*
  * SocFPGA Arria10 reset IDs, bank mapping is as follows:
index f4dcb14623070dc8f97b175fec3722d27e0fdf89..d108eac1e21a89264364f5b7c258071aa55cb031 100644 (file)
 void socfpga_bridges_set_handoff_regs(bool h2f, bool lwh2f, bool f2h);
 void socfpga_bridges_reset(int enable);
 
-struct socfpga_reset_manager {
-       u32     status;
-       u32     ctrl;
-       u32     counts;
-       u32     padding1;
-       u32     mpu_mod_reset;
-       u32     per_mod_reset;
-       u32     per2_mod_reset;
-       u32     brg_mod_reset;
-       u32     misc_mod_reset;
-       u32     padding2[12];
-       u32     tstscratch;
-};
+#define RSTMGR_GEN5_STATUS     0x00
+#define RSTMGR_GEN5_CTRL       0x04
+#define RSTMGR_GEN5_MPUMODRST  0x10
+#define RSTMGR_GEN5_PERMODRST  0x14
+#define RSTMGR_GEN5_PER2MODRST 0x18
+#define RSTMGR_GEN5_BRGMODRST  0x1c
+#define RSTMGR_GEN5_MISCMODRST 0x20
+
+#define RSTMGR_CTRL            RSTMGR_GEN5_CTRL
 
 /*
  * SocFPGA Cyclone V/Arria V reset IDs, bank mapping is as follows:
diff --git a/arch/arm/mach-socfpga/include/mach/reset_manager_s10.h b/arch/arm/mach-socfpga/include/mach/reset_manager_s10.h
deleted file mode 100644 (file)
index 452147b..0000000
+++ /dev/null
@@ -1,118 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0
- *
- * Copyright (C) 2016-2018 Intel Corporation <www.intel.com>
- *
- */
-
-#ifndef        _RESET_MANAGER_S10_
-#define        _RESET_MANAGER_S10_
-
-void reset_cpu(ulong addr);
-int cpu_has_been_warmreset(void);
-
-void socfpga_bridges_reset(int enable);
-
-void socfpga_per_reset(u32 reset, int set);
-void socfpga_per_reset_all(void);
-
-struct socfpga_reset_manager {
-       u32     status;
-       u32     mpu_rst_stat;
-       u32     misc_stat;
-       u32     padding1;
-       u32     hdsk_en;
-       u32     hdsk_req;
-       u32     hdsk_ack;
-       u32     hdsk_stall;
-       u32     mpumodrst;
-       u32     per0modrst;
-       u32     per1modrst;
-       u32     brgmodrst;
-       u32     padding2;
-       u32     cold_mod_reset;
-       u32     padding3;
-       u32     dbg_mod_reset;
-       u32     tap_mod_reset;
-       u32     padding4;
-       u32     padding5;
-       u32     brg_warm_mask;
-       u32     padding6[3];
-       u32     tst_stat;
-       u32     padding7;
-       u32     hdsk_timeout;
-       u32     mpul2flushtimeout;
-       u32     dbghdsktimeout;
-};
-
-#define RSTMGR_MPUMODRST_CORE0         0
-#define RSTMGR_PER0MODRST_OCP_MASK     0x0020bf00
-#define RSTMGR_BRGMODRST_DDRSCH_MASK   0X00000040
-#define RSTMGR_BRGMODRST_FPGA2SOC_MASK 0x00000004
-
-/* Watchdogs and MPU warm reset mask */
-#define RSTMGR_L4WD_MPU_WARMRESET_MASK 0x000F0F00
-
-/*
- * Define a reset identifier, from which a permodrst bank ID
- * and reset ID can be extracted using the subsequent macros
- * RSTMGR_RESET() and RSTMGR_BANK().
- */
-#define RSTMGR_BANK_OFFSET     8
-#define RSTMGR_BANK_MASK       0x7
-#define RSTMGR_RESET_OFFSET    0
-#define RSTMGR_RESET_MASK      0x1f
-#define RSTMGR_DEFINE(_bank, _offset)          \
-       ((_bank) << RSTMGR_BANK_OFFSET) | ((_offset) << RSTMGR_RESET_OFFSET)
-
-/* Extract reset ID from the reset identifier. */
-#define RSTMGR_RESET(_reset)                   \
-       (((_reset) >> RSTMGR_RESET_OFFSET) & RSTMGR_RESET_MASK)
-
-/* Extract bank ID from the reset identifier. */
-#define RSTMGR_BANK(_reset)                    \
-       (((_reset) >> RSTMGR_BANK_OFFSET) & RSTMGR_BANK_MASK)
-
-/*
- * SocFPGA Stratix10 reset IDs, bank mapping is as follows:
- * 0 ... mpumodrst
- * 1 ... per0modrst
- * 2 ... per1modrst
- * 3 ... brgmodrst
- */
-#define RSTMGR_EMAC0           RSTMGR_DEFINE(1, 0)
-#define RSTMGR_EMAC1           RSTMGR_DEFINE(1, 1)
-#define RSTMGR_EMAC2           RSTMGR_DEFINE(1, 2)
-#define RSTMGR_USB0            RSTMGR_DEFINE(1, 3)
-#define RSTMGR_USB1            RSTMGR_DEFINE(1, 4)
-#define RSTMGR_NAND            RSTMGR_DEFINE(1, 5)
-#define RSTMGR_SDMMC           RSTMGR_DEFINE(1, 7)
-#define RSTMGR_EMAC0_OCP       RSTMGR_DEFINE(1, 8)
-#define RSTMGR_EMAC1_OCP       RSTMGR_DEFINE(1, 9)
-#define RSTMGR_EMAC2_OCP       RSTMGR_DEFINE(1, 10)
-#define RSTMGR_USB0_OCP                RSTMGR_DEFINE(1, 11)
-#define RSTMGR_USB1_OCP                RSTMGR_DEFINE(1, 12)
-#define RSTMGR_NAND_OCP                RSTMGR_DEFINE(1, 13)
-#define RSTMGR_SDMMC_OCP       RSTMGR_DEFINE(1, 15)
-#define RSTMGR_DMA             RSTMGR_DEFINE(1, 16)
-#define RSTMGR_SPIM0           RSTMGR_DEFINE(1, 17)
-#define RSTMGR_SPIM1           RSTMGR_DEFINE(1, 18)
-#define RSTMGR_L4WD0           RSTMGR_DEFINE(2, 0)
-#define RSTMGR_L4WD1           RSTMGR_DEFINE(2, 1)
-#define RSTMGR_L4WD2           RSTMGR_DEFINE(2, 2)
-#define RSTMGR_L4WD3           RSTMGR_DEFINE(2, 3)
-#define RSTMGR_OSC1TIMER0      RSTMGR_DEFINE(2, 4)
-#define RSTMGR_I2C0            RSTMGR_DEFINE(2, 8)
-#define RSTMGR_I2C1            RSTMGR_DEFINE(2, 9)
-#define RSTMGR_I2C2            RSTMGR_DEFINE(2, 10)
-#define RSTMGR_I2C3            RSTMGR_DEFINE(2, 11)
-#define RSTMGR_I2C4            RSTMGR_DEFINE(2, 12)
-#define RSTMGR_UART0           RSTMGR_DEFINE(2, 16)
-#define RSTMGR_UART1           RSTMGR_DEFINE(2, 17)
-#define RSTMGR_GPIO0           RSTMGR_DEFINE(2, 24)
-#define RSTMGR_GPIO1           RSTMGR_DEFINE(2, 25)
-#define RSTMGR_SDR             RSTMGR_DEFINE(3, 6)
-
-/* Create a human-readable reference to SoCFPGA reset. */
-#define SOCFPGA_RESET(_name)   RSTMGR_##_name
-
-#endif /* _RESET_MANAGER_S10_ */
diff --git a/arch/arm/mach-socfpga/include/mach/reset_manager_soc64.h b/arch/arm/mach-socfpga/include/mach/reset_manager_soc64.h
new file mode 100644 (file)
index 0000000..3f952bc
--- /dev/null
@@ -0,0 +1,38 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ *  Copyright (C) 2016-2019 Intel Corporation <www.intel.com>
+ */
+
+#ifndef _RESET_MANAGER_SOC64_H_
+#define _RESET_MANAGER_SOC64_H_
+
+void reset_deassert_peripherals_handoff(void);
+int cpu_has_been_warmreset(void);
+void socfpga_bridges_reset(int enable);
+
+#define RSTMGR_SOC64_STATUS    0x00
+#define RSTMGR_SOC64_MPUMODRST 0x20
+#define RSTMGR_SOC64_PER0MODRST        0x24
+#define RSTMGR_SOC64_PER1MODRST        0x28
+#define RSTMGR_SOC64_BRGMODRST 0x2c
+
+#define RSTMGR_MPUMODRST_CORE0         0
+#define RSTMGR_PER0MODRST_OCP_MASK     0x0020bf00
+#define RSTMGR_BRGMODRST_DDRSCH_MASK   0X00000040
+#define RSTMGR_BRGMODRST_FPGA2SOC_MASK 0x00000004
+
+/* Watchdogs and MPU warm reset mask */
+#define RSTMGR_L4WD_MPU_WARMRESET_MASK 0x000F0F00
+
+/*
+ * SocFPGA Stratix10 reset IDs, bank mapping is as follows:
+ * 0 ... mpumodrst
+ * 1 ... per0modrst
+ * 2 ... per1modrst
+ * 3 ... brgmodrst
+ */
+#define RSTMGR_L4WD0           RSTMGR_DEFINE(2, 0)
+#define RSTMGR_OSC1TIMER0      RSTMGR_DEFINE(2, 4)
+#define RSTMGR_UART0           RSTMGR_DEFINE(2, 16)
+
+#endif /* _RESET_MANAGER_SOC64_H_ */
index 7e76df74b7fefd628a1db48aab05423fcdad7af5..6de0a08131778f33517f72bf0d1e6bbd8f8265d6 100644 (file)
@@ -6,8 +6,11 @@
 #ifndef _SYSTEM_MANAGER_H_
 #define _SYSTEM_MANAGER_H_
 
-#if defined(CONFIG_TARGET_SOCFPGA_STRATIX10)
-#include <asm/arch/system_manager_s10.h>
+phys_addr_t socfpga_get_sysmgr_addr(void);
+
+#if defined(CONFIG_TARGET_SOCFPGA_STRATIX10) || \
+       defined(CONFIG_TARGET_SOCFPGA_AGILEX)
+#include <asm/arch/system_manager_soc64.h>
 #else
 #define SYSMGR_ROMCODEGRP_CTRL_WARMRSTCFGPINMUX        BIT(0)
 #define SYSMGR_ROMCODEGRP_CTRL_WARMRSTCFGIO    BIT(1)
index 14052b957ca63101f4a3257641669bd22ed28912..e4fc6d2e55ca906ae0fd0cd8d55ae57475fa76e2 100644 (file)
@@ -6,73 +6,33 @@
 #ifndef _SYSTEM_MANAGER_ARRIA10_H_
 #define _SYSTEM_MANAGER_ARRIA10_H_
 
-struct socfpga_system_manager {
-       u32  siliconid1;
-       u32  siliconid2;
-       u32  wddbg;
-       u32  bootinfo;
-       u32  mpu_ctrl_l2_ecc;
-       u32  _pad_0x14_0x1f[3];
-       u32  dma;
-       u32  dma_periph;
-       u32  sdmmcgrp_ctrl;
-       u32  sdmmc_l3master;
-       u32  nand_bootstrap;
-       u32  nand_l3master;
-       u32  usb0_l3master;
-       u32  usb1_l3master;
-       u32  emac_global;
-       u32  emac[3];
-       u32  _pad_0x50_0x5f[4];
-       u32  fpgaintf_en_global;
-       u32  fpgaintf_en_0;
-       u32  fpgaintf_en_1;
-       u32  fpgaintf_en_2;
-       u32  fpgaintf_en_3;
-       u32  _pad_0x74_0x7f[3];
-       u32  noc_addr_remap_value;
-       u32  noc_addr_remap_set;
-       u32  noc_addr_remap_clear;
-       u32  _pad_0x8c_0x8f;
-       u32  ecc_intmask_value;
-       u32  ecc_intmask_set;
-       u32  ecc_intmask_clr;
-       u32  ecc_intstatus_serr;
-       u32  ecc_intstatus_derr;
-       u32  mpu_status_l2_ecc;
-       u32  mpu_clear_l2_ecc;
-       u32  mpu_status_l1_parity;
-       u32  mpu_clear_l1_parity;
-       u32  mpu_set_l1_parity;
-       u32  _pad_0xb8_0xbf[2];
-       u32  noc_timeout;
-       u32  noc_idlereq_set;
-       u32  noc_idlereq_clr;
-       u32  noc_idlereq_value;
-       u32  noc_idleack;
-       u32  noc_idlestatus;
-       u32  fpga2soc_ctrl;
-       u32  _pad_0xdc_0xff[9];
-       u32  tsmc_tsel_0;
-       u32  tsmc_tsel_1;
-       u32  tsmc_tsel_2;
-       u32  tsmc_tsel_3;
-       u32  _pad_0x110_0x200[60];
-       u32  romhw_ctrl;
-       u32  romcode_ctrl;
-       u32  romcode_cpu1startaddr;
-       u32  romcode_initswstate;
-       u32  romcode_initswlastld;
-       u32  _pad_0x214_0x217;
-       u32  warmram_enable;
-       u32  warmram_datastart;
-       u32  warmram_length;
-       u32  warmram_execution;
-       u32  warmram_crc;
-       u32  _pad_0x22c_0x22f;
-       u32  isw_handoff[8];
-       u32  romcode_bootromswstate[8];
-};
+#define SYSMGR_A10_WDDBG                       0x08
+#define SYSMGR_A10_BOOTINFO                    0x0c
+#define SYSMGR_A10_DMA                         0x20
+#define SYSMGR_A10_DMA_PERIPH                  0x24
+#define SYSMGR_A10_SDMMC                       0x28
+#define SYSMGR_A10_SDMMC_L3MASTER              0x2c
+#define SYSMGR_A10_EMAC_GLOBAL                 0x40
+#define SYSMGR_A10_EMAC0                       0x44
+#define SYSMGR_A10_EMAC1                       0x48
+#define SYSMGR_A10_EMAC2                       0x4c
+#define SYSMGR_A10_FPGAINTF_EN_GLOBAL          0x60
+#define SYSMGR_A10_FPGAINTF_EN0                        0x64
+#define SYSMGR_A10_FPGAINTF_EN1                        0x68
+#define SYSMGR_A10_FPGAINTF_EN2                        0x6c
+#define SYSMGR_A10_FPGAINTF_EN3                        0x70
+#define SYSMGR_A10_ECC_INTMASK_VAL             0x90
+#define SYSMGR_A10_ECC_INTMASK_SET             0x94
+#define SYSMGR_A10_ECC_INTMASK_CLR             0x98
+#define SYSMGR_A10_NOC_TIMEOUT                 0xc0
+#define SYSMGR_A10_NOC_IDLEREQ_SET             0xc4
+#define SYSMGR_A10_NOC_IDLEREQ_CLR             0xc8
+#define SYSMGR_A10_NOC_IDLEREQ_VAL             0xcc
+#define SYSMGR_A10_NOC_IDLEACK                 0xd0
+#define SYSMGR_A10_NOC_IDLESTATUS              0xd4
+#define SYSMGR_A10_FPGA2SOC_CTRL               0xd8
+
+#define SYSMGR_SDMMC                           SYSMGR_A10_SDMMC
 
 #define SYSMGR_SDMMC_SMPLSEL_SHIFT     4
 #define SYSMGR_BOOTINFO_BSEL_SHIFT     12
index 52e59df513287c8e7ffd5c14c7d06fbce21206fe..90cb465d137098626e66bde1b1cb7be5626ce462 100644 (file)
@@ -13,106 +13,29 @@ void sysmgr_config_warmrstcfgio(int enable);
 
 void sysmgr_get_pinmux_table(const u8 **table, unsigned int *table_len);
 
-struct socfpga_system_manager {
-       /* System Manager Module */
-       u32     siliconid1;                     /* 0x00 */
-       u32     siliconid2;
-       u32     _pad_0x8_0xf[2];
-       u32     wddbg;                          /* 0x10 */
-       u32     bootinfo;
-       u32     hpsinfo;
-       u32     parityinj;
-       /* FPGA Interface Group */
-       u32     fpgaintfgrp_gbl;                /* 0x20 */
-       u32     fpgaintfgrp_indiv;
-       u32     fpgaintfgrp_module;
-       u32     _pad_0x2c_0x2f;
-       /* Scan Manager Group */
-       u32     scanmgrgrp_ctrl;                /* 0x30 */
-       u32     _pad_0x34_0x3f[3];
-       /* Freeze Control Group */
-       u32     frzctrl_vioctrl;                /* 0x40 */
-       u32     _pad_0x44_0x4f[3];
-       u32     frzctrl_hioctrl;                /* 0x50 */
-       u32     frzctrl_src;
-       u32     frzctrl_hwctrl;
-       u32     _pad_0x5c_0x5f;
-       /* EMAC Group */
-       u32     emacgrp_ctrl;                   /* 0x60 */
-       u32     emacgrp_l3master;
-       u32     _pad_0x68_0x6f[2];
-       /* DMA Controller Group */
-       u32     dmagrp_ctrl;                    /* 0x70 */
-       u32     dmagrp_persecurity;
-       u32     _pad_0x78_0x7f[2];
-       /* Preloader (initial software) Group */
-       u32     iswgrp_handoff[8];              /* 0x80 */
-       u32     _pad_0xa0_0xbf[8];              /* 0xa0 */
-       /* Boot ROM Code Register Group */
-       u32     romcodegrp_ctrl;                /* 0xc0 */
-       u32     romcodegrp_cpu1startaddr;
-       u32     romcodegrp_initswstate;
-       u32     romcodegrp_initswlastld;
-       u32     romcodegrp_bootromswstate;      /* 0xd0 */
-       u32     __pad_0xd4_0xdf[3];
-       /* Warm Boot from On-Chip RAM Group */
-       u32     romcodegrp_warmramgrp_enable;   /* 0xe0 */
-       u32     romcodegrp_warmramgrp_datastart;
-       u32     romcodegrp_warmramgrp_length;
-       u32     romcodegrp_warmramgrp_execution;
-       u32     romcodegrp_warmramgrp_crc;      /* 0xf0 */
-       u32     __pad_0xf4_0xff[3];
-       /* Boot ROM Hardware Register Group */
-       u32     romhwgrp_ctrl;                  /* 0x100 */
-       u32     _pad_0x104_0x107;
-       /* SDMMC Controller Group */
-       u32     sdmmcgrp_ctrl;
-       u32     sdmmcgrp_l3master;
-       /* NAND Flash Controller Register Group */
-       u32     nandgrp_bootstrap;              /* 0x110 */
-       u32     nandgrp_l3master;
-       /* USB Controller Group */
-       u32     usbgrp_l3master;
-       u32     _pad_0x11c_0x13f[9];
-       /* ECC Management Register Group */
-       u32     eccgrp_l2;                      /* 0x140 */
-       u32     eccgrp_ocram;
-       u32     eccgrp_usb0;
-       u32     eccgrp_usb1;
-       u32     eccgrp_emac0;                   /* 0x150 */
-       u32     eccgrp_emac1;
-       u32     eccgrp_dma;
-       u32     eccgrp_can0;
-       u32     eccgrp_can1;                    /* 0x160 */
-       u32     eccgrp_nand;
-       u32     eccgrp_qspi;
-       u32     eccgrp_sdmmc;
-       u32     _pad_0x170_0x3ff[164];
-       /* Pin Mux Control Group */
-       u32     emacio[20];                     /* 0x400 */
-       u32     flashio[12];                    /* 0x450 */
-       u32     generalio[28];                  /* 0x480 */
-       u32     _pad_0x4f0_0x4ff[4];
-       u32     mixed1io[22];                   /* 0x500 */
-       u32     mixed2io[8];                    /* 0x558 */
-       u32     gplinmux[23];                   /* 0x578 */
-       u32     gplmux[71];                     /* 0x5d4 */
-       u32     nandusefpga;                    /* 0x6f0 */
-       u32     _pad_0x6f4;
-       u32     rgmii1usefpga;                  /* 0x6f8 */
-       u32     _pad_0x6fc_0x700[2];
-       u32     i2c0usefpga;                    /* 0x704 */
-       u32     sdmmcusefpga;                   /* 0x708 */
-       u32     _pad_0x70c_0x710[2];
-       u32     rgmii0usefpga;                  /* 0x714 */
-       u32     _pad_0x718_0x720[3];
-       u32     i2c3usefpga;                    /* 0x724 */
-       u32     i2c2usefpga;                    /* 0x728 */
-       u32     i2c1usefpga;                    /* 0x72c */
-       u32     spim1usefpga;                   /* 0x730 */
-       u32     _pad_0x734;
-       u32     spim0usefpga;                   /* 0x738 */
-};
+#define SYSMGR_GEN5_WDDBG                      0x10
+#define SYSMGR_GEN5_BOOTINFO                   0x14
+#define SYSMGR_GEN5_FPGAINFGRP_GBL             0x20
+#define SYSMGR_GEN5_FPGAINFGRP_INDIV           0x24
+#define SYSMGR_GEN5_FPGAINFGRP_MODULE          0x28
+#define SYSMGR_GEN5_SCANMGRGRP_CTRL            0x30
+#define SYSMGR_GEN5_ISWGRP_HANDOFF             0x80
+#define SYSMGR_GEN5_ROMCODEGRP_CTRL            0xc0
+#define SYSMGR_GEN5_WARMRAMGRP_EN              0xe0
+#define SYSMGR_GEN5_SDMMC                      0x108
+#define SYSMGR_GEN5_ECCGRP_OCRAM               0x144
+#define SYSMGR_GEN5_EMACIO                     0x400
+#define SYSMGR_GEN5_NAND_USEFPGA               0x6f0
+#define SYSMGR_GEN5_RGMII0_USEFPGA             0x6f8
+#define SYSMGR_GEN5_SDMMC_USEFPGA              0x708
+#define SYSMGR_GEN5_RGMII1_USEFPGA             0x704
+#define SYSMGR_GEN5_SPIM1_USEFPGA              0x730
+#define SYSMGR_GEN5_SPIM0_USEFPGA              0x738
+
+#define SYSMGR_SDMMC                           SYSMGR_GEN5_SDMMC
+
+#define SYSMGR_ISWGRP_HANDOFF_OFFSET(i)        \
+       SYSMGR_GEN5_ISWGRP_HANDOFF + ((i) * sizeof(u32))
 #endif
 
 #define SYSMGR_SDMMC_SMPLSEL_SHIFT     3
diff --git a/arch/arm/mach-socfpga/include/mach/system_manager_s10.h b/arch/arm/mach-socfpga/include/mach/system_manager_s10.h
deleted file mode 100644 (file)
index 297f9e1..0000000
+++ /dev/null
@@ -1,176 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0
- *
- * Copyright (C) 2016-2018 Intel Corporation <www.intel.com>
- *
- */
-
-#ifndef        _SYSTEM_MANAGER_S10_
-#define        _SYSTEM_MANAGER_S10_
-
-void sysmgr_pinmux_init(void);
-void populate_sysmgr_fpgaintf_module(void);
-void populate_sysmgr_pinmux(void);
-void sysmgr_pinmux_table_sel(const u32 **table, unsigned int *table_len);
-void sysmgr_pinmux_table_ctrl(const u32 **table, unsigned int *table_len);
-void sysmgr_pinmux_table_fpga(const u32 **table, unsigned int *table_len);
-void sysmgr_pinmux_table_delay(const u32 **table, unsigned int *table_len);
-
-struct socfpga_system_manager {
-       /* System Manager Module */
-       u32     siliconid1;                     /* 0x00 */
-       u32     siliconid2;
-       u32     wddbg;
-       u32     _pad_0xc;
-       u32     mpu_status;                     /* 0x10 */
-       u32     mpu_ace;
-       u32     _pad_0x18_0x1c[2];
-       u32     dma;                            /* 0x20 */
-       u32     dma_periph;
-       /* SDMMC Controller Group */
-       u32     sdmmcgrp_ctrl;
-       u32     sdmmcgrp_l3master;
-       /* NAND Flash Controller Register Group */
-       u32     nandgrp_bootstrap;              /* 0x30 */
-       u32     nandgrp_l3master;
-       /* USB Controller Group */
-       u32     usb0_l3master;
-       u32     usb1_l3master;
-       /* EMAC Group */
-       u32     emac_gbl;                       /* 0x40 */
-       u32     emac0;
-       u32     emac1;
-       u32     emac2;
-       u32     emac0_ace;                      /* 0x50 */
-       u32     emac1_ace;
-       u32     emac2_ace;
-       u32     nand_axuser;
-       u32     _pad_0x60_0x64[2];              /* 0x60 */
-       /* FPGA interface Group */
-       u32     fpgaintf_en_1;
-       u32     fpgaintf_en_2;
-       u32     fpgaintf_en_3;                  /* 0x70 */
-       u32     dma_l3master;
-       u32     etr_l3master;
-       u32     _pad_0x7c;
-       u32     sec_ctrl_slt;                   /* 0x80 */
-       u32     osc_trim;
-       u32     _pad_0x88_0x8c[2];
-       /* ECC Group */
-       u32     ecc_intmask_value;              /* 0x90 */
-       u32     ecc_intmask_set;
-       u32     ecc_intmask_clr;
-       u32     ecc_intstatus_serr;
-       u32     ecc_intstatus_derr;             /* 0xa0 */
-       u32     _pad_0xa4_0xac[3];
-       u32     noc_addr_remap;                 /* 0xb0 */
-       u32     hmc_clk;
-       u32     io_pa_ctrl;
-       u32     _pad_0xbc;
-       /* NOC Group */
-       u32     noc_timeout;                    /* 0xc0 */
-       u32     noc_idlereq_set;
-       u32     noc_idlereq_clr;
-       u32     noc_idlereq_value;
-       u32     noc_idleack;                    /* 0xd0 */
-       u32     noc_idlestatus;
-       u32     fpga2soc_ctrl;
-       u32     fpga_config;
-       u32     iocsrclk_gate;                  /* 0xe0 */
-       u32     gpo;
-       u32     gpi;
-       u32     _pad_0xec;
-       u32     mpu;                            /* 0xf0 */
-       u32     sdm_hps_spare;
-       u32     hps_sdm_spare;
-       u32     _pad_0xfc_0x1fc[65];
-       /* Boot scratch register group */
-       u32     boot_scratch_cold0;             /* 0x200 */
-       u32     boot_scratch_cold1;
-       u32     boot_scratch_cold2;
-       u32     boot_scratch_cold3;
-       u32     boot_scratch_cold4;             /* 0x210 */
-       u32     boot_scratch_cold5;
-       u32     boot_scratch_cold6;
-       u32     boot_scratch_cold7;
-       u32     boot_scratch_cold8;             /* 0x220 */
-       u32     boot_scratch_cold9;
-       u32     _pad_0x228_0xffc[886];
-       /* Pin select and pin control group */
-       u32     pinsel0[40];                    /* 0x1000 */
-       u32     _pad_0x10a0_0x10fc[24];
-       u32     pinsel40[8];
-       u32     _pad_0x1120_0x112c[4];
-       u32     ioctrl0[28];
-       u32     _pad_0x11a0_0x11fc[24];
-       u32     ioctrl28[20];
-       u32     _pad_0x1250_0x12fc[44];
-       /* Use FPGA mux */
-       u32     rgmii0usefpga;                  /* 0x1300 */
-       u32     rgmii1usefpga;
-       u32     rgmii2usefpga;
-       u32     i2c0usefpga;
-       u32     i2c1usefpga;
-       u32     i2c_emac0_usefpga;
-       u32     i2c_emac1_usefpga;
-       u32     i2c_emac2_usefpga;
-       u32     nandusefpga;
-       u32     _pad_0x1324;
-       u32     spim0usefpga;
-       u32     spim1usefpga;
-       u32     spis0usefpga;
-       u32     spis1usefpga;
-       u32     uart0usefpga;
-       u32     uart1usefpga;
-       u32     mdio0usefpga;
-       u32     mdio1usefpga;
-       u32     mdio2usefpga;
-       u32     _pad_0x134c;
-       u32     jtagusefpga;
-       u32     sdmmcusefpga;
-       u32     hps_osc_clk;
-       u32     _pad_0x135c_0x13fc[41];
-       u32     iodelay0[40];
-       u32     _pad_0x14a0_0x14fc[24];
-       u32     iodelay40[8];
-
-};
-
-#define SYSMGR_ROMCODEGRP_CTRL_WARMRSTCFGPINMUX        BIT(0)
-#define SYSMGR_ROMCODEGRP_CTRL_WARMRSTCFGIO    BIT(1)
-#define SYSMGR_ECC_OCRAM_EN    BIT(0)
-#define SYSMGR_ECC_OCRAM_SERR  BIT(3)
-#define SYSMGR_ECC_OCRAM_DERR  BIT(4)
-#define SYSMGR_FPGAINTF_USEFPGA        0x1
-
-#define SYSMGR_FPGAINTF_NAND   BIT(4)
-#define SYSMGR_FPGAINTF_SDMMC  BIT(8)
-#define SYSMGR_FPGAINTF_SPIM0  BIT(16)
-#define SYSMGR_FPGAINTF_SPIM1  BIT(24)
-#define SYSMGR_FPGAINTF_EMAC0  BIT(0)
-#define SYSMGR_FPGAINTF_EMAC1  BIT(8)
-#define SYSMGR_FPGAINTF_EMAC2  BIT(16)
-
-#define SYSMGR_SDMMC_SMPLSEL_SHIFT     4
-#define SYSMGR_SDMMC_DRVSEL_SHIFT      0
-
-/* EMAC Group Bit definitions */
-#define SYSMGR_EMACGRP_CTRL_PHYSEL_ENUM_GMII_MII       0x0
-#define SYSMGR_EMACGRP_CTRL_PHYSEL_ENUM_RGMII          0x1
-#define SYSMGR_EMACGRP_CTRL_PHYSEL_ENUM_RMII           0x2
-
-#define SYSMGR_EMACGRP_CTRL_PHYSEL0_LSB                        0
-#define SYSMGR_EMACGRP_CTRL_PHYSEL1_LSB                        2
-#define SYSMGR_EMACGRP_CTRL_PHYSEL_MASK                        0x3
-
-#define SYSMGR_NOC_H2F_MSK             0x00000001
-#define SYSMGR_NOC_LWH2F_MSK           0x00000010
-#define SYSMGR_HMC_CLK_STATUS_MSK      0x00000001
-
-#define SYSMGR_DMA_IRQ_NS              0xFF000000
-#define SYSMGR_DMA_MGR_NS              0x00010000
-
-#define SYSMGR_DMAPERIPH_ALL_NS                0xFFFFFFFF
-
-#define SYSMGR_WDDBG_PAUSE_ALL_CPU     0x0F0F0F0F
-
-#endif /* _SYSTEM_MANAGER_S10_ */
diff --git a/arch/arm/mach-socfpga/include/mach/system_manager_soc64.h b/arch/arm/mach-socfpga/include/mach/system_manager_soc64.h
new file mode 100644 (file)
index 0000000..3a6c951
--- /dev/null
@@ -0,0 +1,123 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2019 Intel Corporation <www.intel.com>
+ */
+
+#ifndef _SYSTEM_MANAGER_SOC64_H_
+#define _SYSTEM_MANAGER_SOC64_H_
+
+void sysmgr_pinmux_init(void);
+void populate_sysmgr_fpgaintf_module(void);
+void populate_sysmgr_pinmux(void);
+void sysmgr_pinmux_table_sel(const u32 **table, unsigned int *table_len);
+void sysmgr_pinmux_table_ctrl(const u32 **table, unsigned int *table_len);
+void sysmgr_pinmux_table_fpga(const u32 **table, unsigned int *table_len);
+void sysmgr_pinmux_table_delay(const u32 **table, unsigned int *table_len);
+
+#define SYSMGR_SOC64_WDDBG                     0x08
+#define SYSMGR_SOC64_DMA                       0x20
+#define SYSMGR_SOC64_DMA_PERIPH                        0x24
+#define SYSMGR_SOC64_SDMMC                     0x28
+#define SYSMGR_SOC64_SDMMC_L3MASTER            0x2c
+#define SYSMGR_SOC64_EMAC_GLOBAL               0x40
+#define SYSMGR_SOC64_EMAC0                     0x44
+#define SYSMGR_SOC64_EMAC1                     0x48
+#define SYSMGR_SOC64_EMAC2                     0x4c
+#define SYSMGR_SOC64_EMAC0_ACE                 0x50
+#define SYSMGR_SOC64_EMAC1_ACE                 0x54
+#define SYSMGR_SOC64_EMAC2_ACE                 0x58
+#define SYSMGR_SOC64_NAND_AXUSER               0x5c
+#define SYSMGR_SOC64_FPGAINTF_EN1              0x68
+#define SYSMGR_SOC64_FPGAINTF_EN2              0x6c
+#define SYSMGR_SOC64_FPGAINTF_EN3              0x70
+#define SYSMGR_SOC64_DMA_L3MASTER              0x74
+#define SYSMGR_SOC64_HMC_CLK                   0xb4
+#define SYSMGR_SOC64_IO_PA_CTRL                        0xb8
+#define SYSMGR_SOC64_NOC_TIMEOUT               0xc0
+#define SYSMGR_SOC64_NOC_IDLEREQ_SET           0xc4
+#define SYSMGR_SOC64_NOC_IDLEREQ_CLR           0xc8
+#define SYSMGR_SOC64_NOC_IDLEREQ_VAL           0xcc
+#define SYSMGR_SOC64_NOC_IDLEACK               0xd0
+#define SYSMGR_SOC64_NOC_IDLESTATUS            0xd4
+#define SYSMGR_SOC64_FPGA2SOC_CTRL             0xd8
+#define SYSMGR_SOC64_FPGA_CONFIG               0xdc
+#define SYSMGR_SOC64_IOCSRCLK_GATE             0xe0
+#define SYSMGR_SOC64_GPO                       0xe4
+#define SYSMGR_SOC64_GPI                       0xe8
+#define SYSMGR_SOC64_MPU                       0xf0
+#define SYSMGR_SOC64_BOOT_SCRATCH_COLD0                0x200
+#define SYSMGR_SOC64_BOOT_SCRATCH_COLD1                0x204
+#define SYSMGR_SOC64_BOOT_SCRATCH_COLD2                0x208
+#define SYSMGR_SOC64_BOOT_SCRATCH_COLD3                0x20c
+#define SYSMGR_SOC64_BOOT_SCRATCH_COLD4                0x210
+#define SYSMGR_SOC64_BOOT_SCRATCH_COLD5                0x214
+#define SYSMGR_SOC64_BOOT_SCRATCH_COLD6                0x218
+#define SYSMGR_SOC64_BOOT_SCRATCH_COLD7                0x21c
+#define SYSMGR_SOC64_BOOT_SCRATCH_COLD8                0x220
+#define SYSMGR_SOC64_BOOT_SCRATCH_COLD9                0x224
+#define SYSMGR_SOC64_PINSEL0                   0x1000
+#define SYSMGR_SOC64_IOCTRL0                   0x1130
+#define SYSMGR_SOC64_EMAC0_USEFPGA             0x1300
+#define SYSMGR_SOC64_EMAC1_USEFPGA             0x1304
+#define SYSMGR_SOC64_EMAC2_USEFPGA             0x1308
+#define SYSMGR_SOC64_I2C0_USEFPGA              0x130c
+#define SYSMGR_SOC64_I2C1_USEFPGA              0x1310
+#define SYSMGR_SOC64_I2C_EMAC0_USEFPGA         0x1314
+#define SYSMGR_SOC64_I2C_EMAC1_USEFPGA         0x1318
+#define SYSMGR_SOC64_I2C_EMAC2_USEFPGA         0x131c
+#define SYSMGR_SOC64_NAND_USEFPGA              0x1320
+#define SYSMGR_SOC64_SPIM0_USEFPGA             0x1328
+#define SYSMGR_SOC64_SPIM1_USEFPGA             0x132c
+#define SYSMGR_SOC64_SPIS0_USEFPGA             0x1330
+#define SYSMGR_SOC64_SPIS1_USEFPGA             0x1334
+#define SYSMGR_SOC64_UART0_USEFPGA             0x1338
+#define SYSMGR_SOC64_UART1_USEFPGA             0x133c
+#define SYSMGR_SOC64_MDIO0_USEFPGA             0x1340
+#define SYSMGR_SOC64_MDIO1_USEFPGA             0x1344
+#define SYSMGR_SOC64_MDIO2_USEFPGA             0x1348
+#define SYSMGR_SOC64_JTAG_USEFPGA              0x1350
+#define SYSMGR_SOC64_SDMMC_USEFPGA             0x1354
+#define SYSMGR_SOC64_HPS_OSC_CLK               0x1358
+#define SYSMGR_SOC64_IODELAY0                  0x1400
+
+#define SYSMGR_SDMMC                           SYSMGR_SOC64_SDMMC
+
+#define SYSMGR_ROMCODEGRP_CTRL_WARMRSTCFGPINMUX        BIT(0)
+#define SYSMGR_ROMCODEGRP_CTRL_WARMRSTCFGIO    BIT(1)
+#define SYSMGR_ECC_OCRAM_EN    BIT(0)
+#define SYSMGR_ECC_OCRAM_SERR  BIT(3)
+#define SYSMGR_ECC_OCRAM_DERR  BIT(4)
+#define SYSMGR_FPGAINTF_USEFPGA        0x1
+
+#define SYSMGR_FPGAINTF_NAND   BIT(4)
+#define SYSMGR_FPGAINTF_SDMMC  BIT(8)
+#define SYSMGR_FPGAINTF_SPIM0  BIT(16)
+#define SYSMGR_FPGAINTF_SPIM1  BIT(24)
+#define SYSMGR_FPGAINTF_EMAC0  BIT(0)
+#define SYSMGR_FPGAINTF_EMAC1  BIT(8)
+#define SYSMGR_FPGAINTF_EMAC2  BIT(16)
+
+#define SYSMGR_SDMMC_SMPLSEL_SHIFT     4
+#define SYSMGR_SDMMC_DRVSEL_SHIFT      0
+
+/* EMAC Group Bit definitions */
+#define SYSMGR_EMACGRP_CTRL_PHYSEL_ENUM_GMII_MII       0x0
+#define SYSMGR_EMACGRP_CTRL_PHYSEL_ENUM_RGMII          0x1
+#define SYSMGR_EMACGRP_CTRL_PHYSEL_ENUM_RMII           0x2
+
+#define SYSMGR_EMACGRP_CTRL_PHYSEL0_LSB                        0
+#define SYSMGR_EMACGRP_CTRL_PHYSEL1_LSB                        2
+#define SYSMGR_EMACGRP_CTRL_PHYSEL_MASK                        0x3
+
+#define SYSMGR_NOC_H2F_MSK             0x00000001
+#define SYSMGR_NOC_LWH2F_MSK           0x00000010
+#define SYSMGR_HMC_CLK_STATUS_MSK      0x00000001
+
+#define SYSMGR_DMA_IRQ_NS              0xFF000000
+#define SYSMGR_DMA_MGR_NS              0x00010000
+
+#define SYSMGR_DMAPERIPH_ALL_NS                0xFFFFFFFF
+
+#define SYSMGR_WDDBG_PAUSE_ALL_CPU     0x0F0F0F0F
+
+#endif /* _SYSTEM_MANAGER_SOC64_H_ */
index 4498ab55dfa14603010dedbc2aa31206d2f2268b..3254bc1805a5903169f3e8759a9d00625aac48c1 100644 (file)
@@ -287,9 +287,6 @@ int mbox_qspi_close(void)
 
 int mbox_qspi_open(void)
 {
-       static const struct socfpga_system_manager *sysmgr_regs =
-               (struct socfpga_system_manager *)SOCFPGA_SYSMGR_ADDRESS;
-
        int ret;
        u32 resp_buf[1];
        u32 resp_buf_len;
@@ -318,7 +315,8 @@ int mbox_qspi_open(void)
 
        /* We are getting QSPI ref clock and set into sysmgr boot register */
        printf("QSPI: Reference clock at %d Hz\n", resp_buf[0]);
-       writel(resp_buf[0], &sysmgr_regs->boot_scratch_cold0);
+       writel(resp_buf[0],
+              socfpga_get_sysmgr_addr() + SYSMGR_SOC64_BOOT_SCRATCH_COLD0);
 
        return 0;
 
index 904b3d030ac71b7b4b2bef671410122e103604a5..db71105af34fd6bab4bc6ec00f6343b183277a18 100644 (file)
 
 DECLARE_GLOBAL_DATA_PTR;
 
+phys_addr_t socfpga_clkmgr_base __section(".data");
+phys_addr_t socfpga_rstmgr_base __section(".data");
+phys_addr_t socfpga_sysmgr_base __section(".data");
+
 #ifdef CONFIG_SYS_L2_PL310
 static const struct pl310_regs *const pl310 =
        (struct pl310_regs *)CONFIG_SYS_PL310_BASE;
@@ -146,6 +150,8 @@ void socfpga_fpga_add(void *fpga_desc)
 
 int arch_cpu_init(void)
 {
+       socfpga_get_managers_addr();
+
 #ifdef CONFIG_HW_WATCHDOG
        /*
         * In case the watchdog is enabled, make sure to (re-)configure it
@@ -203,3 +209,63 @@ U_BOOT_CMD(bridge, 3, 1, do_bridge,
 );
 
 #endif
+
+static int socfpga_get_base_addr(const char *compat, phys_addr_t *base)
+{
+       const void *blob = gd->fdt_blob;
+       struct fdt_resource r;
+       int node;
+       int ret;
+
+       node = fdt_node_offset_by_compatible(blob, -1, compat);
+       if (node < 0)
+               return node;
+
+       if (!fdtdec_get_is_enabled(blob, node))
+               return -ENODEV;
+
+       ret = fdt_get_resource(blob, node, "reg", 0, &r);
+       if (ret)
+               return ret;
+
+       *base = (phys_addr_t)r.start;
+
+       return 0;
+}
+
+void socfpga_get_managers_addr(void)
+{
+       int ret;
+
+       ret = socfpga_get_base_addr("altr,rst-mgr", &socfpga_rstmgr_base);
+       if (ret)
+               hang();
+
+       ret = socfpga_get_base_addr("altr,sys-mgr", &socfpga_sysmgr_base);
+       if (ret)
+               hang();
+
+#ifdef CONFIG_TARGET_SOCFPGA_AGILEX
+       ret = socfpga_get_base_addr("intel,agilex-clkmgr",
+                                   &socfpga_clkmgr_base);
+#else
+       ret = socfpga_get_base_addr("altr,clk-mgr", &socfpga_clkmgr_base);
+#endif
+       if (ret)
+               hang();
+}
+
+phys_addr_t socfpga_get_rstmgr_addr(void)
+{
+       return socfpga_rstmgr_base;
+}
+
+phys_addr_t socfpga_get_sysmgr_addr(void)
+{
+       return socfpga_sysmgr_base;
+}
+
+phys_addr_t socfpga_get_clkmgr_addr(void)
+{
+       return socfpga_clkmgr_base;
+}
index 2e2a40b65dc13dd7578150b795e630f3be9a8f16..d56349b7f3ead1ab92667ffcf654bafad600dee2 100644 (file)
@@ -28,9 +28,6 @@
 #define PINMUX_UART1_TX_SHARED_IO_OFFSET_Q3_7  0x78
 #define PINMUX_UART1_TX_SHARED_IO_OFFSET_Q4_3  0x98
 
-static struct socfpga_system_manager *sysmgr_regs =
-       (struct socfpga_system_manager *)SOCFPGA_SYSMGR_ADDRESS;
-
 /*
  * FPGA programming support for SoC FPGA Arria 10
  */
@@ -81,7 +78,8 @@ void socfpga_init_security_policies(void)
        writel(~0, SOCFPGA_NOC_FW_H2F_SCR_OFST);
        writel(~0, SOCFPGA_NOC_FW_H2F_SCR_OFST + 4);
 
-       writel(0x0007FFFF, &sysmgr_regs->ecc_intmask_set);
+       writel(0x0007FFFF,
+              socfpga_get_sysmgr_addr() + SYSMGR_A10_ECC_INTMASK_SET);
 }
 
 void socfpga_sdram_remap_zero(void)
@@ -105,8 +103,9 @@ int arch_early_init_r(void)
 #if defined(CONFIG_DISPLAY_CPUINFO)
 int print_cpuinfo(void)
 {
-       const u32 bsel =
-               SYSMGR_GET_BOOTINFO_BSEL(readl(&sysmgr_regs->bootinfo));
+       const u32 bootinfo = readl(socfpga_get_sysmgr_addr() +
+                                  SYSMGR_A10_BOOTINFO);
+       const u32 bsel = SYSMGR_GET_BOOTINFO_BSEL(bootinfo);
 
        puts("CPU:   Altera SoCFPGA Arria 10\n");
 
index 22042d0de09cb2ff4520b2b45f28e2b77610ea3c..35938b2dfc06df3e8cb0a92d1b4e7d42349d9083 100644 (file)
@@ -28,8 +28,6 @@ DECLARE_GLOBAL_DATA_PTR;
 
 static struct pl310_regs *const pl310 =
        (struct pl310_regs *)CONFIG_SYS_PL310_BASE;
-static struct socfpga_system_manager *sysmgr_regs =
-       (struct socfpga_system_manager *)SOCFPGA_SYSMGR_ADDRESS;
 static struct nic301_registers *nic301_regs =
        (struct nic301_registers *)SOCFPGA_L3REGS_ADDRESS;
 static struct scu_registers *scu_regs =
@@ -120,8 +118,9 @@ static int socfpga_fpga_id(const bool print_id)
 #if defined(CONFIG_DISPLAY_CPUINFO)
 int print_cpuinfo(void)
 {
-       const u32 bsel =
-               SYSMGR_GET_BOOTINFO_BSEL(readl(&sysmgr_regs->bootinfo));
+       const u32 bootinfo = readl(socfpga_get_sysmgr_addr() +
+                                  SYSMGR_GEN5_BOOTINFO);
+       const u32 bsel = SYSMGR_GET_BOOTINFO_BSEL(bootinfo);
 
        puts("CPU:   Altera SoCFPGA Platform\n");
        socfpga_fpga_id(1);
@@ -134,7 +133,8 @@ int print_cpuinfo(void)
 #ifdef CONFIG_ARCH_MISC_INIT
 int arch_misc_init(void)
 {
-       const u32 bsel = readl(&sysmgr_regs->bootinfo) & 0x7;
+       const u32 bsel = readl(socfpga_get_sysmgr_addr() +
+                              SYSMGR_GEN5_BOOTINFO) & 0x7;
        const int fpga_id = socfpga_fpga_id(0);
        env_set("bootmode", bsel_str[bsel].mode);
        if (fpga_id >= 0)
@@ -192,10 +192,12 @@ int arch_early_init_r(void)
         * to support that old code, we write it here instead of in the
         * reset_cpu() function just before resetting the CPU.
         */
-       writel(0xae9efebc, &sysmgr_regs->romcodegrp_warmramgrp_enable);
+       writel(0xae9efebc,
+              socfpga_get_sysmgr_addr() + SYSMGR_GEN5_WARMRAMGRP_EN);
 
        for (i = 0; i < 8; i++) /* Cache initial SW setting regs */
-               iswgrp_handoff[i] = readl(&sysmgr_regs->iswgrp_handoff[i]);
+               iswgrp_handoff[i] = readl(socfpga_get_sysmgr_addr() +
+                                         SYSMGR_ISWGRP_HANDOFF_OFFSET(i));
 
        socfpga_bridges_reset(1);
 
@@ -208,8 +210,6 @@ int arch_early_init_r(void)
 }
 
 #ifndef CONFIG_SPL_BUILD
-static struct socfpga_reset_manager *reset_manager_base =
-       (struct socfpga_reset_manager *)SOCFPGA_RSTMGR_ADDRESS;
 static struct socfpga_sdr_ctrl *sdr_ctrl =
        (struct socfpga_sdr_ctrl *)SDR_CTRLGRP_ADDRESS;
 
@@ -223,20 +223,26 @@ void do_bridge_reset(int enable, unsigned int mask)
                                                 !(mask & BIT(2)));
                for (i = 0; i < 2; i++) {       /* Reload SW setting cache */
                        iswgrp_handoff[i] =
-                               readl(&sysmgr_regs->iswgrp_handoff[i]);
+                               readl(socfpga_get_sysmgr_addr() +
+                                     SYSMGR_ISWGRP_HANDOFF_OFFSET(i));
                }
 
-               writel(iswgrp_handoff[2], &sysmgr_regs->fpgaintfgrp_module);
+               writel(iswgrp_handoff[2],
+                      socfpga_get_sysmgr_addr() +
+                      SYSMGR_GEN5_FPGAINFGRP_MODULE);
                writel(iswgrp_handoff[3], &sdr_ctrl->fpgaport_rst);
-               writel(iswgrp_handoff[0], &reset_manager_base->brg_mod_reset);
+               writel(iswgrp_handoff[0],
+                      socfpga_get_rstmgr_addr() + RSTMGR_GEN5_BRGMODRST);
                writel(iswgrp_handoff[1], &nic301_regs->remap);
 
-               writel(0x7, &reset_manager_base->brg_mod_reset);
-               writel(iswgrp_handoff[0], &reset_manager_base->brg_mod_reset);
+               writel(0x7, socfpga_get_rstmgr_addr() + RSTMGR_GEN5_BRGMODRST);
+               writel(iswgrp_handoff[0],
+                      socfpga_get_rstmgr_addr() + RSTMGR_GEN5_BRGMODRST);
        } else {
-               writel(0, &sysmgr_regs->fpgaintfgrp_module);
+               writel(0, socfpga_get_sysmgr_addr() +
+                      SYSMGR_GEN5_FPGAINFGRP_MODULE);
                writel(0, &sdr_ctrl->fpgaport_rst);
-               writel(0x7, &reset_manager_base->brg_mod_reset);
+               writel(0x7, socfpga_get_rstmgr_addr() + RSTMGR_GEN5_BRGMODRST);
                writel(1, &nic301_regs->remap);
        }
 }
index 0a5fab11c0de46384292dded0a960c91a2756175..a3f5b4364e5c02ae1431bc4fdfd7ae63bd51c8c7 100644 (file)
@@ -23,9 +23,6 @@
 
 DECLARE_GLOBAL_DATA_PTR;
 
-static struct socfpga_system_manager *sysmgr_regs =
-       (struct socfpga_system_manager *)SOCFPGA_SYSMGR_ADDRESS;
-
 /*
  * FPGA programming support for SoC FPGA Stratix 10
  */
@@ -68,9 +65,9 @@ static u32 socfpga_phymode_setup(u32 gmac_index, const char *phymode)
        else
                return -EINVAL;
 
-       clrsetbits_le32(&sysmgr_regs->emac0 + gmac_index,
-                       SYSMGR_EMACGRP_CTRL_PHYSEL_MASK,
-                       modereg);
+       clrsetbits_le32(socfpga_get_sysmgr_addr() + SYSMGR_SOC64_EMAC0 +
+                       gmac_index,
+                       SYSMGR_EMACGRP_CTRL_PHYSEL_MASK, modereg);
 
        return 0;
 }
index 471a3045af3400c7b915914d1750436610f284ed..aa5299415a74391b8347099ad62f743e94f08ddd 100644 (file)
 
 DECLARE_GLOBAL_DATA_PTR;
 
-static const struct socfpga_reset_manager *reset_manager_base =
-               (void *)SOCFPGA_RSTMGR_ADDRESS;
-static const struct socfpga_system_manager *sysmgr_regs =
-               (struct socfpga_system_manager *)SOCFPGA_SYSMGR_ADDRESS;
-
 struct bridge_cfg {
        int compat_id;
        u32  mask_noc;
@@ -63,14 +58,14 @@ static const struct bridge_cfg bridge_cfg_tbl[] = {
 void socfpga_watchdog_disable(void)
 {
        /* assert reset for watchdog */
-       setbits_le32(&reset_manager_base->per1modrst,
+       setbits_le32(socfpga_get_rstmgr_addr() + RSTMGR_A10_PER1MODRST,
                     ALT_RSTMGR_PER1MODRST_WD0_SET_MSK);
 }
 
 /* Release NOC ddr scheduler from reset */
 void socfpga_reset_deassert_noc_ddr_scheduler(void)
 {
-       clrbits_le32(&reset_manager_base->brgmodrst,
+       clrbits_le32(socfpga_get_rstmgr_addr() + RSTMGR_A10_BRGMODRST,
                     ALT_RSTMGR_BRGMODRST_DDRSCH_SET_MSK);
 }
 
@@ -100,20 +95,23 @@ int socfpga_reset_deassert_bridges_handoff(void)
        }
 
        /* clear idle request to all bridges */
-       setbits_le32(&sysmgr_regs->noc_idlereq_clr, mask_noc);
+       setbits_le32(socfpga_get_sysmgr_addr() + SYSMGR_A10_NOC_IDLEREQ_CLR,
+                    mask_noc);
 
        /* Release bridges from reset state per handoff value */
-       clrbits_le32(&reset_manager_base->brgmodrst, mask_rstmgr);
+       clrbits_le32(socfpga_get_rstmgr_addr() + RSTMGR_A10_BRGMODRST,
+                    mask_rstmgr);
 
        /* Poll until all idleack to 0, timeout at 1000ms */
-       return wait_for_bit_le32(&sysmgr_regs->noc_idleack, mask_noc,
-                                false, 1000, false);
+       return wait_for_bit_le32((const void *)(socfpga_get_sysmgr_addr() +
+                                SYSMGR_A10_NOC_IDLEACK),
+                                mask_noc, false, 1000, false);
 }
 
 /* Release L4 OSC1 Watchdog Timer 0 from reset through reset manager */
 void socfpga_reset_deassert_osc1wd0(void)
 {
-       clrbits_le32(&reset_manager_base->per1modrst,
+       clrbits_le32(socfpga_get_rstmgr_addr() + RSTMGR_A10_PER1MODRST,
                     ALT_RSTMGR_PER1MODRST_WD0_SET_MSK);
 }
 
@@ -122,24 +120,24 @@ void socfpga_reset_deassert_osc1wd0(void)
  */
 void socfpga_per_reset(u32 reset, int set)
 {
-       const u32 *reg;
+       unsigned long reg;
        u32 rstmgr_bank = RSTMGR_BANK(reset);
 
        switch (rstmgr_bank) {
        case 0:
-               reg = &reset_manager_base->mpumodrst;
+               reg = RSTMGR_A10_MPUMODRST;
                break;
        case 1:
-               reg = &reset_manager_base->per0modrst;
+               reg = RSTMGR_A10_PER0MODRST;
                break;
        case 2:
-               reg = &reset_manager_base->per1modrst;
+               reg = RSTMGR_A10_PER1MODRST;
                break;
        case 3:
-               reg = &reset_manager_base->brgmodrst;
+               reg = RSTMGR_A10_BRGMODRST;
                break;
        case 4:
-               reg = &reset_manager_base->sysmodrst;
+               reg = RSTMGR_A10_SYSMODRST;
                break;
 
        default:
@@ -147,9 +145,11 @@ void socfpga_per_reset(u32 reset, int set)
        }
 
        if (set)
-               setbits_le32(reg, 1 << RSTMGR_RESET(reset));
+               setbits_le32(socfpga_get_rstmgr_addr() + reg,
+                            1 << RSTMGR_RESET(reset));
        else
-               clrbits_le32(reg, 1 << RSTMGR_RESET(reset));
+               clrbits_le32(socfpga_get_rstmgr_addr() + reg,
+                            1 << RSTMGR_RESET(reset));
 }
 
 /*
@@ -174,11 +174,13 @@ void socfpga_per_reset_all(void)
                ALT_RSTMGR_PER0MODRST_SDMMCECC_SET_MSK;
 
        /* disable all components except ECC_OCP, L4 Timer0 and L4 WD0 */
-       writel(~l4wd0, &reset_manager_base->per1modrst);
-       setbits_le32(&reset_manager_base->per0modrst, ~mask_ecc_ocp);
+       writel(~l4wd0, socfpga_get_rstmgr_addr() + RSTMGR_A10_PER1MODRST);
+       setbits_le32(socfpga_get_rstmgr_addr() + RSTMGR_A10_PER0MODRST,
+                    ~mask_ecc_ocp);
 
        /* Finally disable the ECC_OCP */
-       setbits_le32(&reset_manager_base->per0modrst, mask_ecc_ocp);
+       setbits_le32(socfpga_get_rstmgr_addr() + RSTMGR_A10_PER0MODRST,
+                    mask_ecc_ocp);
 }
 
 int socfpga_bridges_reset(void)
@@ -194,13 +196,15 @@ int socfpga_bridges_reset(void)
                ALT_SYSMGR_NOC_F2SDR0_SET_MSK |
                ALT_SYSMGR_NOC_F2SDR1_SET_MSK |
                ALT_SYSMGR_NOC_F2SDR2_SET_MSK,
-               &sysmgr_regs->noc_idlereq_set);
+               socfpga_get_sysmgr_addr() + SYSMGR_A10_NOC_IDLEREQ_SET);
 
        /* Enable the NOC timeout */
-       writel(ALT_SYSMGR_NOC_TMO_EN_SET_MSK, &sysmgr_regs->noc_timeout);
+       writel(ALT_SYSMGR_NOC_TMO_EN_SET_MSK,
+              socfpga_get_sysmgr_addr() + SYSMGR_A10_NOC_TIMEOUT);
 
        /* Poll until all idleack to 1 */
-       ret = wait_for_bit_le32(&sysmgr_regs->noc_idleack,
+       ret = wait_for_bit_le32((const void *)(socfpga_get_sysmgr_addr() +
+                               SYSMGR_A10_NOC_IDLEACK),
                                ALT_SYSMGR_NOC_H2F_SET_MSK |
                                ALT_SYSMGR_NOC_LWH2F_SET_MSK |
                                ALT_SYSMGR_NOC_F2H_SET_MSK |
@@ -212,7 +216,8 @@ int socfpga_bridges_reset(void)
                return ret;
 
        /* Poll until all idlestatus to 1 */
-       ret = wait_for_bit_le32(&sysmgr_regs->noc_idlestatus,
+       ret = wait_for_bit_le32((const void *)(socfpga_get_sysmgr_addr() +
+                               SYSMGR_A10_NOC_IDLESTATUS),
                                ALT_SYSMGR_NOC_H2F_SET_MSK |
                                ALT_SYSMGR_NOC_LWH2F_SET_MSK |
                                ALT_SYSMGR_NOC_F2H_SET_MSK |
@@ -224,16 +229,16 @@ int socfpga_bridges_reset(void)
                return ret;
 
        /* Put all bridges (except NOR DDR scheduler) into reset state */
-       setbits_le32(&reset_manager_base->brgmodrst,
+       setbits_le32(socfpga_get_rstmgr_addr() + RSTMGR_A10_BRGMODRST,
                     (ALT_RSTMGR_BRGMODRST_H2F_SET_MSK |
-                    ALT_RSTMGR_BRGMODRST_LWH2F_SET_MSK |
-                    ALT_RSTMGR_BRGMODRST_F2H_SET_MSK |
-                    ALT_RSTMGR_BRGMODRST_F2SSDRAM0_SET_MSK |
-                    ALT_RSTMGR_BRGMODRST_F2SSDRAM1_SET_MSK |
-                    ALT_RSTMGR_BRGMODRST_F2SSDRAM2_SET_MSK));
+                     ALT_RSTMGR_BRGMODRST_LWH2F_SET_MSK |
+                     ALT_RSTMGR_BRGMODRST_F2H_SET_MSK |
+                     ALT_RSTMGR_BRGMODRST_F2SSDRAM0_SET_MSK |
+                     ALT_RSTMGR_BRGMODRST_F2SSDRAM1_SET_MSK |
+                     ALT_RSTMGR_BRGMODRST_F2SSDRAM2_SET_MSK));
 
        /* Disable NOC timeout */
-       writel(0, &sysmgr_regs->noc_timeout);
+       writel(0, socfpga_get_sysmgr_addr() + SYSMGR_A10_NOC_TIMEOUT);
 
        return 0;
 }
index 9a32f5abfee8bed145868bf14a6c49e35b47e607..1008a78dc8367dbae022fa779ea2ebccd727cbae 100644 (file)
 #include <asm/arch/reset_manager.h>
 #include <asm/arch/system_manager.h>
 
-static const struct socfpga_reset_manager *reset_manager_base =
-               (void *)SOCFPGA_RSTMGR_ADDRESS;
-static const struct socfpga_system_manager *sysmgr_regs =
-       (struct socfpga_system_manager *)SOCFPGA_SYSMGR_ADDRESS;
-
 /* Assert or de-assert SoCFPGA reset manager reset. */
 void socfpga_per_reset(u32 reset, int set)
 {
-       const u32 *reg;
+       unsigned long reg;
        u32 rstmgr_bank = RSTMGR_BANK(reset);
 
        switch (rstmgr_bank) {
        case 0:
-               reg = &reset_manager_base->mpu_mod_reset;
+               reg = RSTMGR_GEN5_MPUMODRST;
                break;
        case 1:
-               reg = &reset_manager_base->per_mod_reset;
+               reg = RSTMGR_GEN5_PERMODRST;
                break;
        case 2:
-               reg = &reset_manager_base->per2_mod_reset;
+               reg = RSTMGR_GEN5_PER2MODRST;
                break;
        case 3:
-               reg = &reset_manager_base->brg_mod_reset;
+               reg = RSTMGR_GEN5_BRGMODRST;
                break;
        case 4:
-               reg = &reset_manager_base->misc_mod_reset;
+               reg = RSTMGR_GEN5_MISCMODRST;
                break;
 
        default:
@@ -43,9 +38,11 @@ void socfpga_per_reset(u32 reset, int set)
        }
 
        if (set)
-               setbits_le32(reg, 1 << RSTMGR_RESET(reset));
+               setbits_le32(socfpga_get_rstmgr_addr() + reg,
+                            1 << RSTMGR_RESET(reset));
        else
-               clrbits_le32(reg, 1 << RSTMGR_RESET(reset));
+               clrbits_le32(socfpga_get_rstmgr_addr() + reg,
+                            1 << RSTMGR_RESET(reset));
 }
 
 /*
@@ -57,8 +54,8 @@ void socfpga_per_reset_all(void)
 {
        const u32 l4wd0 = 1 << RSTMGR_RESET(SOCFPGA_RESET(L4WD0));
 
-       writel(~l4wd0, &reset_manager_base->per_mod_reset);
-       writel(0xffffffff, &reset_manager_base->per2_mod_reset);
+       writel(~l4wd0, socfpga_get_rstmgr_addr() + RSTMGR_GEN5_PERMODRST);
+       writel(0xffffffff, socfpga_get_rstmgr_addr() + RSTMGR_GEN5_PER2MODRST);
 }
 
 #define L3REGS_REMAP_LWHPS2FPGA_MASK   0x10
@@ -83,8 +80,10 @@ void socfpga_bridges_set_handoff_regs(bool h2f, bool lwh2f, bool f2h)
        if (f2h)
                brgmask |= BIT(2);
 
-       writel(brgmask, &sysmgr_regs->iswgrp_handoff[0]);
-       writel(l3rmask, &sysmgr_regs->iswgrp_handoff[1]);
+       writel(brgmask,
+              socfpga_get_sysmgr_addr() + SYSMGR_ISWGRP_HANDOFF_OFFSET(0));
+       writel(l3rmask,
+              socfpga_get_sysmgr_addr() + SYSMGR_ISWGRP_HANDOFF_OFFSET(1));
 }
 
 void socfpga_bridges_reset(int enable)
@@ -95,7 +94,7 @@ void socfpga_bridges_reset(int enable)
 
        if (enable) {
                /* brdmodrst */
-               writel(0x7, &reset_manager_base->brg_mod_reset);
+               writel(0x7, socfpga_get_rstmgr_addr() + RSTMGR_GEN5_BRGMODRST);
                writel(L3REGS_REMAP_OCRAM_MASK, SOCFPGA_L3REGS_ADDRESS);
        } else {
                socfpga_bridges_set_handoff_regs(false, false, false);
@@ -109,7 +108,7 @@ void socfpga_bridges_reset(int enable)
                }
 
                /* brdmodrst */
-               writel(0, &reset_manager_base->brg_mod_reset);
+               writel(0, socfpga_get_rstmgr_addr() + RSTMGR_GEN5_BRGMODRST);
 
                /* Remap the bridges into memory map */
                writel(l3mask, SOCFPGA_L3REGS_ADDRESS);
index 499a84aff53f1eaed10d88c2c4e7ccf2b62d868e..c7430777b28ee599b3b58c8ca512f792395d314c 100644 (file)
 
 DECLARE_GLOBAL_DATA_PTR;
 
-static const struct socfpga_reset_manager *reset_manager_base =
-               (void *)SOCFPGA_RSTMGR_ADDRESS;
-static const struct socfpga_system_manager *system_manager_base =
-               (void *)SOCFPGA_SYSMGR_ADDRESS;
-
 /* Assert or de-assert SoCFPGA reset manager reset. */
 void socfpga_per_reset(u32 reset, int set)
 {
-       const void *reg;
+       unsigned long reg;
 
        if (RSTMGR_BANK(reset) == 0)
-               reg = &reset_manager_base->mpumodrst;
+               reg = RSTMGR_SOC64_MPUMODRST;
        else if (RSTMGR_BANK(reset) == 1)
-               reg = &reset_manager_base->per0modrst;
+               reg = RSTMGR_SOC64_PER0MODRST;
        else if (RSTMGR_BANK(reset) == 2)
-               reg = &reset_manager_base->per1modrst;
+               reg = RSTMGR_SOC64_PER1MODRST;
        else if (RSTMGR_BANK(reset) == 3)
-               reg = &reset_manager_base->brgmodrst;
+               reg = RSTMGR_SOC64_BRGMODRST;
        else    /* Invalid reset register, do nothing */
                return;
 
        if (set)
-               setbits_le32(reg, 1 << RSTMGR_RESET(reset));
+               setbits_le32(socfpga_get_rstmgr_addr() + reg,
+                            1 << RSTMGR_RESET(reset));
        else
-               clrbits_le32(reg, 1 << RSTMGR_RESET(reset));
+               clrbits_le32(socfpga_get_rstmgr_addr() + reg,
+                            1 << RSTMGR_RESET(reset));
 }
 
 /*
@@ -50,47 +47,52 @@ void socfpga_per_reset_all(void)
 
        /* disable all except OCP and l4wd0. OCP disable later */
        writel(~(l4wd0 | RSTMGR_PER0MODRST_OCP_MASK),
-              &reset_manager_base->per0modrst);
-       writel(~l4wd0, &reset_manager_base->per0modrst);
-       writel(0xffffffff, &reset_manager_base->per1modrst);
+                     socfpga_get_rstmgr_addr() + RSTMGR_SOC64_PER0MODRST);
+       writel(~l4wd0, socfpga_get_rstmgr_addr() + RSTMGR_SOC64_PER0MODRST);
+       writel(0xffffffff, socfpga_get_rstmgr_addr() + RSTMGR_SOC64_PER1MODRST);
 }
 
 void socfpga_bridges_reset(int enable)
 {
        if (enable) {
                /* clear idle request to all bridges */
-               setbits_le32(&system_manager_base->noc_idlereq_clr, ~0);
+               setbits_le32(socfpga_get_sysmgr_addr() +
+                            SYSMGR_SOC64_NOC_IDLEREQ_CLR, ~0);
 
                /* Release all bridges from reset state */
-               clrbits_le32(&reset_manager_base->brgmodrst, ~0);
+               clrbits_le32(socfpga_get_rstmgr_addr() + RSTMGR_SOC64_BRGMODRST,
+                            ~0);
 
                /* Poll until all idleack to 0 */
-               while (readl(&system_manager_base->noc_idleack))
+               while (readl(socfpga_get_sysmgr_addr() +
+                            SYSMGR_SOC64_NOC_IDLEACK))
                        ;
        } else {
                /* set idle request to all bridges */
-               writel(~0, &system_manager_base->noc_idlereq_set);
+               writel(~0,
+                      socfpga_get_sysmgr_addr() +
+                      SYSMGR_SOC64_NOC_IDLEREQ_SET);
 
                /* Enable the NOC timeout */
-               writel(1, &system_manager_base->noc_timeout);
+               writel(1, socfpga_get_sysmgr_addr() + SYSMGR_SOC64_NOC_TIMEOUT);
 
                /* Poll until all idleack to 1 */
-               while ((readl(&system_manager_base->noc_idleack) ^
+               while ((readl(socfpga_get_sysmgr_addr() + SYSMGR_SOC64_NOC_IDLEACK) ^
                        (SYSMGR_NOC_H2F_MSK | SYSMGR_NOC_LWH2F_MSK)))
                        ;
 
                /* Poll until all idlestatus to 1 */
-               while ((readl(&system_manager_base->noc_idlestatus) ^
+               while ((readl(socfpga_get_sysmgr_addr() + SYSMGR_SOC64_NOC_IDLESTATUS) ^
                        (SYSMGR_NOC_H2F_MSK | SYSMGR_NOC_LWH2F_MSK)))
                        ;
 
                /* Reset all bridges (except NOR DDR scheduler & F2S) */
-               setbits_le32(&reset_manager_base->brgmodrst,
+               setbits_le32(socfpga_get_rstmgr_addr() + RSTMGR_SOC64_BRGMODRST,
                             ~(RSTMGR_BRGMODRST_DDRSCH_MASK |
-                            RSTMGR_BRGMODRST_FPGA2SOC_MASK));
+                              RSTMGR_BRGMODRST_FPGA2SOC_MASK));
 
                /* Disable NOC timeout */
-               writel(0, &system_manager_base->noc_timeout);
+               writel(0, socfpga_get_sysmgr_addr() + SYSMGR_SOC64_NOC_TIMEOUT);
        }
 }
 
@@ -99,6 +101,6 @@ void socfpga_bridges_reset(int enable)
  */
 int cpu_has_been_warmreset(void)
 {
-       return readl(&reset_manager_base->status) &
-               RSTMGR_L4WD_MPU_WARMRESET_MASK;
+       return readl(socfpga_get_rstmgr_addr() + RSTMGR_SOC64_STATUS) &
+                       RSTMGR_L4WD_MPU_WARMRESET_MASK;
 }
index 52175af48b7dbd89af591263f1e04e393ec57472..f7ee28915ecd0e97e1351d158b98002c70f42701 100644 (file)
@@ -31,8 +31,6 @@ static const struct socfpga_scan_manager *scan_manager_base =
                (void *)(SOCFPGA_SCANMGR_ADDRESS);
 static const struct socfpga_freeze_controller *freeze_controller_base =
                (void *)(SOCFPGA_SYSMGR_ADDRESS + SYSMGR_FRZCTRL_ADDRESS);
-static struct socfpga_system_manager *sys_mgr_base =
-       (struct socfpga_system_manager *)SOCFPGA_SYSMGR_ADDRESS;
 
 /**
  * scan_chain_engine_is_idle() - Check if the JTAG scan chain is idle
@@ -218,7 +216,7 @@ u32 scan_mgr_get_fpga_id(void)
        int ret;
 
        /* Enable HPS to talk to JTAG in the FPGA through the System Manager */
-       writel(0x1, &sys_mgr_base->scanmgrgrp_ctrl);
+       writel(0x1, socfpga_get_sysmgr_addr() + SYSMGR_GEN5_SCANMGRGRP_CTRL);
 
        /* Enable port 7 */
        writel(0x80, &scan_manager_base->en);
@@ -253,7 +251,7 @@ u32 scan_mgr_get_fpga_id(void)
 
        /* Disable all port */
        writel(0, &scan_manager_base->en);
-       writel(0, &sys_mgr_base->scanmgrgrp_ctrl);
+       writel(0, socfpga_get_sysmgr_addr() + SYSMGR_GEN5_SCANMGRGRP_CTRL);
 
        return id;
 }
index d36732447b632ad02e6e6cbcd228f74fa292e1cd..7c38c5098169b92fd3c2d39d9038e7347bcbe15c 100644 (file)
 
 DECLARE_GLOBAL_DATA_PTR;
 
-static const struct socfpga_system_manager *sysmgr_regs =
-       (struct socfpga_system_manager *)SOCFPGA_SYSMGR_ADDRESS;
-
 u32 spl_boot_device(void)
 {
-       const u32 bsel = readl(&sysmgr_regs->bootinfo);
+       const u32 bsel = readl(socfpga_get_sysmgr_addr() + SYSMGR_A10_BOOTINFO);
 
        switch (SYSMGR_GET_BOOTINFO_BSEL(bsel)) {
        case 0x1:       /* FPGA (HPS2FPGA Bridge) */
@@ -107,6 +104,11 @@ void spl_board_init(void)
 
 void board_init_f(ulong dummy)
 {
+       if (spl_early_init())
+               hang();
+
+       socfpga_get_managers_addr();
+
        dcache_disable();
 
        socfpga_init_security_policies();
@@ -117,8 +119,6 @@ void board_init_f(ulong dummy)
        socfpga_per_reset_all();
        socfpga_watchdog_disable();
 
-       spl_early_init();
-
        /* Configure the clock based on handoff */
        cm_basic_init(gd->fdt_blob);
 
diff --git a/arch/arm/mach-socfpga/spl_agilex.c b/arch/arm/mach-socfpga/spl_agilex.c
new file mode 100644 (file)
index 0000000..c745d64
--- /dev/null
@@ -0,0 +1,98 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (C) 2019 Intel Corporation <www.intel.com>
+ *
+ */
+
+#include <asm/io.h>
+#include <asm/u-boot.h>
+#include <asm/utils.h>
+#include <common.h>
+#include <image.h>
+#include <spl.h>
+#include <asm/arch/clock_manager.h>
+#include <asm/arch/firewall.h>
+#include <asm/arch/mailbox_s10.h>
+#include <asm/arch/misc.h>
+#include <asm/arch/reset_manager.h>
+#include <asm/arch/system_manager.h>
+#include <watchdog.h>
+#include <dm/uclass.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+u32 spl_boot_device(void)
+{
+       return BOOT_DEVICE_MMC1;
+}
+
+#ifdef CONFIG_SPL_MMC_SUPPORT
+u32 spl_boot_mode(const u32 boot_device)
+{
+#if defined(CONFIG_SPL_FS_FAT) || defined(CONFIG_SPL_FS_EXT4)
+       return MMCSD_MODE_FS;
+#else
+       return MMCSD_MODE_RAW;
+#endif
+}
+#endif
+
+void board_init_f(ulong dummy)
+{
+       int ret;
+       struct udevice *dev;
+
+       ret = spl_early_init();
+       if (ret)
+               hang();
+
+       socfpga_get_managers_addr();
+
+#ifdef CONFIG_HW_WATCHDOG
+       /* Ensure watchdog is paused when debugging is happening */
+       writel(SYSMGR_WDDBG_PAUSE_ALL_CPU,
+              socfpga_get_sysmgr_addr() + SYSMGR_SOC64_WDDBG);
+
+       /* Enable watchdog before initializing the HW */
+       socfpga_per_reset(SOCFPGA_RESET(L4WD0), 1);
+       socfpga_per_reset(SOCFPGA_RESET(L4WD0), 0);
+       hw_watchdog_init();
+#endif
+
+       /* ensure all processors are not released prior Linux boot */
+       writeq(0, CPU_RELEASE_ADDR);
+
+       timer_init();
+
+       sysmgr_pinmux_init();
+
+       ret = uclass_get_device(UCLASS_CLK, 0, &dev);
+       if (ret) {
+               debug("Clock init failed: %d\n", ret);
+               hang();
+       }
+
+       preloader_console_init();
+       cm_print_clock_quick_summary();
+
+       firewall_setup();
+       ret = uclass_get_device(UCLASS_CACHE, 0, &dev);
+       if (ret) {
+               debug("CCU init failed: %d\n", ret);
+               hang();
+       }
+
+#if CONFIG_IS_ENABLED(ALTERA_SDRAM)
+       ret = uclass_get_device(UCLASS_RAM, 0, &dev);
+       if (ret) {
+               debug("DRAM init failed: %d\n", ret);
+               hang();
+       }
+#endif
+
+       mbox_init();
+
+#ifdef CONFIG_CADENCE_QSPI
+       mbox_qspi_open();
+#endif
+}
index 408e4093754ab5638f707ffdf6af8ac2da811a27..e19f55aa9b5e9fbfe85cb57aa441505c622002af 100644 (file)
 
 DECLARE_GLOBAL_DATA_PTR;
 
-static const struct socfpga_system_manager *sysmgr_regs =
-       (struct socfpga_system_manager *)SOCFPGA_SYSMGR_ADDRESS;
-
 u32 spl_boot_device(void)
 {
-       const u32 bsel = readl(&sysmgr_regs->bootinfo);
+       const u32 bsel = readl(socfpga_get_sysmgr_addr() +
+                              SYSMGR_GEN5_BOOTINFO);
 
        switch (SYSMGR_GET_BOOTINFO_BSEL(bsel)) {
        case 0x1:       /* FPGA (HPS2FPGA Bridge) */
@@ -67,17 +65,23 @@ void board_init_f(ulong dummy)
        int ret;
        struct udevice *dev;
 
+       ret = spl_early_init();
+       if (ret)
+               hang();
+
+       socfpga_get_managers_addr();
+
        /*
-        * First C code to run. Clear fake OCRAM ECC first as SBE
+        * Clear fake OCRAM ECC first as SBE
         * and DBE might triggered during power on
         */
-       reg = readl(&sysmgr_regs->eccgrp_ocram);
+       reg = readl(socfpga_get_sysmgr_addr() + SYSMGR_GEN5_ECCGRP_OCRAM);
        if (reg & SYSMGR_ECC_OCRAM_SERR)
                writel(SYSMGR_ECC_OCRAM_SERR | SYSMGR_ECC_OCRAM_EN,
-                      &sysmgr_regs->eccgrp_ocram);
+                      socfpga_get_sysmgr_addr() + SYSMGR_GEN5_ECCGRP_OCRAM);
        if (reg & SYSMGR_ECC_OCRAM_DERR)
                writel(SYSMGR_ECC_OCRAM_DERR  | SYSMGR_ECC_OCRAM_EN,
-                      &sysmgr_regs->eccgrp_ocram);
+                      socfpga_get_sysmgr_addr() + SYSMGR_GEN5_ECCGRP_OCRAM);
 
        socfpga_sdram_remap_zero();
        socfpga_pl310_clear();
@@ -128,12 +132,6 @@ void board_init_f(ulong dummy)
        debug_uart_init();
 #endif
 
-       ret = spl_early_init();
-       if (ret) {
-               debug("spl_early_init() failed: %d\n", ret);
-               hang();
-       }
-
        ret = uclass_get_device(UCLASS_RESET, 0, &dev);
        if (ret)
                debug("Reset init failed: %d\n", ret);
index ec65e1ce649a4ba1e8d9100a7311e8b0080f5c05..8d96918cb456b5c01bac606cb448368a54460126 100644 (file)
@@ -12,8 +12,9 @@
 #include <image.h>
 #include <spl.h>
 #include <asm/arch/clock_manager.h>
-#include <asm/arch/firewall_s10.h>
+#include <asm/arch/firewall.h>
 #include <asm/arch/mailbox_s10.h>
+#include <asm/arch/misc.h>
 #include <asm/arch/reset_manager.h>
 #include <asm/arch/system_manager.h>
 #include <watchdog.h>
@@ -21,9 +22,6 @@
 
 DECLARE_GLOBAL_DATA_PTR;
 
-static struct socfpga_system_manager *sysmgr_regs =
-       (struct socfpga_system_manager *)SOCFPGA_SYSMGR_ADDRESS;
-
 u32 spl_boot_device(void)
 {
        /* TODO: Get from SDM or handoff */
@@ -41,88 +39,21 @@ u32 spl_boot_mode(const u32 boot_device)
 }
 #endif
 
-void spl_disable_firewall_l4_per(void)
-{
-       const struct socfpga_firwall_l4_per *firwall_l4_per_base =
-               (struct socfpga_firwall_l4_per *)SOCFPGA_FIREWALL_L4_PER;
-       u32 i;
-       const u32 *addr[] = {
-                       &firwall_l4_per_base->nand,
-                       &firwall_l4_per_base->nand_data,
-                       &firwall_l4_per_base->usb0,
-                       &firwall_l4_per_base->usb1,
-                       &firwall_l4_per_base->spim0,
-                       &firwall_l4_per_base->spim1,
-                       &firwall_l4_per_base->emac0,
-                       &firwall_l4_per_base->emac1,
-                       &firwall_l4_per_base->emac2,
-                       &firwall_l4_per_base->sdmmc,
-                       &firwall_l4_per_base->gpio0,
-                       &firwall_l4_per_base->gpio1,
-                       &firwall_l4_per_base->i2c0,
-                       &firwall_l4_per_base->i2c1,
-                       &firwall_l4_per_base->i2c2,
-                       &firwall_l4_per_base->i2c3,
-                       &firwall_l4_per_base->i2c4,
-                       &firwall_l4_per_base->timer0,
-                       &firwall_l4_per_base->timer1,
-                       &firwall_l4_per_base->uart0,
-                       &firwall_l4_per_base->uart1
-                       };
-
-       /*
-        * The following lines of code will enable non-secure access
-        * to nand, usb, spi, emac, sdmmc, gpio, i2c, timers and uart. This
-        * is needed as most OS run in non-secure mode. Thus we need to
-        * enable non-secure access to these peripherals in order for the
-        * OS to use these peripherals.
-        */
-       for (i = 0; i < ARRAY_SIZE(addr); i++)
-               writel(FIREWALL_L4_DISABLE_ALL, addr[i]);
-}
-
-void spl_disable_firewall_l4_sys(void)
-{
-       const struct socfpga_firwall_l4_sys *firwall_l4_sys_base =
-               (struct socfpga_firwall_l4_sys *)SOCFPGA_FIREWALL_L4_SYS;
-       u32 i;
-       const u32 *addr[] = {
-                       &firwall_l4_sys_base->dma_ecc,
-                       &firwall_l4_sys_base->emac0rx_ecc,
-                       &firwall_l4_sys_base->emac0tx_ecc,
-                       &firwall_l4_sys_base->emac1rx_ecc,
-                       &firwall_l4_sys_base->emac1tx_ecc,
-                       &firwall_l4_sys_base->emac2rx_ecc,
-                       &firwall_l4_sys_base->emac2tx_ecc,
-                       &firwall_l4_sys_base->nand_ecc,
-                       &firwall_l4_sys_base->nand_read_ecc,
-                       &firwall_l4_sys_base->nand_write_ecc,
-                       &firwall_l4_sys_base->ocram_ecc,
-                       &firwall_l4_sys_base->sdmmc_ecc,
-                       &firwall_l4_sys_base->usb0_ecc,
-                       &firwall_l4_sys_base->usb1_ecc,
-                       &firwall_l4_sys_base->clock_manager,
-                       &firwall_l4_sys_base->io_manager,
-                       &firwall_l4_sys_base->reset_manager,
-                       &firwall_l4_sys_base->system_manager,
-                       &firwall_l4_sys_base->watchdog0,
-                       &firwall_l4_sys_base->watchdog1,
-                       &firwall_l4_sys_base->watchdog2,
-                       &firwall_l4_sys_base->watchdog3
-               };
-
-       for (i = 0; i < ARRAY_SIZE(addr); i++)
-               writel(FIREWALL_L4_DISABLE_ALL, addr[i]);
-}
-
 void board_init_f(ulong dummy)
 {
        const struct cm_config *cm_default_cfg = cm_get_default_config();
        int ret;
 
+       ret = spl_early_init();
+       if (ret)
+               hang();
+
+       socfpga_get_managers_addr();
+
 #ifdef CONFIG_HW_WATCHDOG
        /* Ensure watchdog is paused when debugging is happening */
-       writel(SYSMGR_WDDBG_PAUSE_ALL_CPU, &sysmgr_regs->wddbg);
+       writel(SYSMGR_WDDBG_PAUSE_ALL_CPU,
+              socfpga_get_sysmgr_addr() + SYSMGR_SOC64_WDDBG);
 
        /* Enable watchdog before initializing the HW */
        socfpga_per_reset(SOCFPGA_RESET(L4WD0), 1);
@@ -145,29 +76,11 @@ void board_init_f(ulong dummy)
        socfpga_per_reset(SOCFPGA_RESET(UART0), 0);
        debug_uart_init();
 #endif
-       ret = spl_early_init();
-       if (ret) {
-               debug("spl_early_init() failed: %d\n", ret);
-               hang();
-       }
 
        preloader_console_init();
        cm_print_clock_quick_summary();
 
-       /* enable non-secure interface to DMA330 DMA and peripherals */
-       writel(SYSMGR_DMA_IRQ_NS | SYSMGR_DMA_MGR_NS, &sysmgr_regs->dma);
-       writel(SYSMGR_DMAPERIPH_ALL_NS, &sysmgr_regs->dma_periph);
-
-       spl_disable_firewall_l4_per();
-
-       spl_disable_firewall_l4_sys();
-
-       /* disable lwsocf2fpga and soc2fpga bridge security */
-       writel(FIREWALL_BRIDGE_DISABLE_ALL, SOCFPGA_FIREWALL_SOC2FPGA);
-       writel(FIREWALL_BRIDGE_DISABLE_ALL, SOCFPGA_FIREWALL_LWSOC2FPGA);
-
-       /* disable SMMU security */
-       writel(FIREWALL_L4_DISABLE_ALL, SOCFPGA_FIREWALL_TCU);
+       firewall_setup();
 
        /* disable ocram security at CCU for non secure access */
        clrbits_le32(CCU_REG_ADDR(CCU_CPU0_MPRT_ADMASK_MEM_RAM0),
index 9d04aea2a8ebff4ea82cf3d83463159b3adf44a2..09caebb3c882a4cdd0bea9457a9564b6a16e84df 100644 (file)
@@ -8,9 +8,6 @@
 #include <asm/arch/system_manager.h>
 #include <asm/arch/fpga_manager.h>
 
-static struct socfpga_system_manager *sysmgr_regs =
-       (struct socfpga_system_manager *)SOCFPGA_SYSMGR_ADDRESS;
-
 /*
  * Populate the value for SYSMGR.FPGAINTF.MODULE based on pinmux setting.
  * The value is not wrote to SYSMGR.FPGAINTF.MODULE but
@@ -21,30 +18,41 @@ static void populate_sysmgr_fpgaintf_module(void)
        u32 handoff_val = 0;
 
        /* ISWGRP_HANDOFF_FPGAINTF */
-       writel(0, &sysmgr_regs->iswgrp_handoff[2]);
+       writel(0, socfpga_get_sysmgr_addr() + SYSMGR_ISWGRP_HANDOFF_OFFSET(2));
 
        /* Enable the signal for those HPS peripherals that use FPGA. */
-       if (readl(&sysmgr_regs->nandusefpga) == SYSMGR_FPGAINTF_USEFPGA)
+       if (readl(socfpga_get_sysmgr_addr() + SYSMGR_GEN5_NAND_USEFPGA) ==
+           SYSMGR_FPGAINTF_USEFPGA)
                handoff_val |= SYSMGR_FPGAINTF_NAND;
-       if (readl(&sysmgr_regs->rgmii1usefpga) == SYSMGR_FPGAINTF_USEFPGA)
+       if (readl(socfpga_get_sysmgr_addr() + SYSMGR_GEN5_RGMII1_USEFPGA) ==
+           SYSMGR_FPGAINTF_USEFPGA)
                handoff_val |= SYSMGR_FPGAINTF_EMAC1;
-       if (readl(&sysmgr_regs->sdmmcusefpga) == SYSMGR_FPGAINTF_USEFPGA)
+       if (readl(socfpga_get_sysmgr_addr() + SYSMGR_GEN5_SDMMC_USEFPGA) ==
+           SYSMGR_FPGAINTF_USEFPGA)
                handoff_val |= SYSMGR_FPGAINTF_SDMMC;
-       if (readl(&sysmgr_regs->rgmii0usefpga) == SYSMGR_FPGAINTF_USEFPGA)
+       if (readl(socfpga_get_sysmgr_addr() + SYSMGR_GEN5_RGMII0_USEFPGA) ==
+           SYSMGR_FPGAINTF_USEFPGA)
                handoff_val |= SYSMGR_FPGAINTF_EMAC0;
-       if (readl(&sysmgr_regs->spim0usefpga) == SYSMGR_FPGAINTF_USEFPGA)
+       if (readl(socfpga_get_sysmgr_addr() + SYSMGR_GEN5_SPIM0_USEFPGA) ==
+           SYSMGR_FPGAINTF_USEFPGA)
                handoff_val |= SYSMGR_FPGAINTF_SPIM0;
-       if (readl(&sysmgr_regs->spim1usefpga) == SYSMGR_FPGAINTF_USEFPGA)
+       if (readl(socfpga_get_sysmgr_addr() + SYSMGR_GEN5_SPIM1_USEFPGA) ==
+           SYSMGR_FPGAINTF_USEFPGA)
                handoff_val |= SYSMGR_FPGAINTF_SPIM1;
 
        /* populate (not writing) the value for SYSMGR.FPGAINTF.MODULE
        based on pinmux setting */
-       setbits_le32(&sysmgr_regs->iswgrp_handoff[2], handoff_val);
+       setbits_le32(socfpga_get_sysmgr_addr() +
+                    SYSMGR_ISWGRP_HANDOFF_OFFSET(2),
+                    handoff_val);
 
-       handoff_val = readl(&sysmgr_regs->iswgrp_handoff[2]);
+       handoff_val = readl(socfpga_get_sysmgr_addr() +
+                           SYSMGR_ISWGRP_HANDOFF_OFFSET(2));
        if (fpgamgr_test_fpga_ready()) {
                /* Enable the required signals only */
-               writel(handoff_val, &sysmgr_regs->fpgaintfgrp_module);
+               writel(handoff_val,
+                      socfpga_get_sysmgr_addr() +
+                      SYSMGR_GEN5_FPGAINFGRP_MODULE);
        }
 }
 
@@ -53,7 +61,7 @@ static void populate_sysmgr_fpgaintf_module(void)
  */
 void sysmgr_pinmux_init(void)
 {
-       u32 regs = (u32)&sysmgr_regs->emacio[0];
+       u32 regs = (u32)socfpga_get_sysmgr_addr() + SYSMGR_GEN5_EMACIO;
        const u8 *sys_mgr_init_table;
        unsigned int len;
        int i;
@@ -74,9 +82,11 @@ void sysmgr_pinmux_init(void)
 void sysmgr_config_warmrstcfgio(int enable)
 {
        if (enable)
-               setbits_le32(&sysmgr_regs->romcodegrp_ctrl,
+               setbits_le32(socfpga_get_sysmgr_addr() +
+                            SYSMGR_GEN5_ROMCODEGRP_CTRL,
                             SYSMGR_ROMCODEGRP_CTRL_WARMRSTCFGIO);
        else
-               clrbits_le32(&sysmgr_regs->romcodegrp_ctrl,
+               clrbits_le32(socfpga_get_sysmgr_addr() +
+                            SYSMGR_GEN5_ROMCODEGRP_CTRL,
                             SYSMGR_ROMCODEGRP_CTRL_WARMRSTCFGIO);
 }
index 122828c9ce47681aa6a6c07a92d576aef538e0fb..cdda881efd717bc6f77b5c8c0b597ad2f2b9dfb8 100644 (file)
@@ -10,9 +10,6 @@
 
 DECLARE_GLOBAL_DATA_PTR;
 
-static struct socfpga_system_manager *sysmgr_regs =
-       (struct socfpga_system_manager *)SOCFPGA_SYSMGR_ADDRESS;
-
 /*
  * Configure all the pin muxes
  */
@@ -32,24 +29,33 @@ void populate_sysmgr_fpgaintf_module(void)
        u32 handoff_val = 0;
 
        /* Enable the signal for those HPS peripherals that use FPGA. */
-       if (readl(&sysmgr_regs->nandusefpga) == SYSMGR_FPGAINTF_USEFPGA)
+       if (readl(socfpga_get_sysmgr_addr() + SYSMGR_SOC64_NAND_USEFPGA) ==
+           SYSMGR_FPGAINTF_USEFPGA)
                handoff_val |= SYSMGR_FPGAINTF_NAND;
-       if (readl(&sysmgr_regs->sdmmcusefpga) == SYSMGR_FPGAINTF_USEFPGA)
+       if (readl(socfpga_get_sysmgr_addr() + SYSMGR_SOC64_SDMMC_USEFPGA) ==
+           SYSMGR_FPGAINTF_USEFPGA)
                handoff_val |= SYSMGR_FPGAINTF_SDMMC;
-       if (readl(&sysmgr_regs->spim0usefpga) == SYSMGR_FPGAINTF_USEFPGA)
+       if (readl(socfpga_get_sysmgr_addr() + SYSMGR_SOC64_SPIM0_USEFPGA) ==
+           SYSMGR_FPGAINTF_USEFPGA)
                handoff_val |= SYSMGR_FPGAINTF_SPIM0;
-       if (readl(&sysmgr_regs->spim1usefpga) == SYSMGR_FPGAINTF_USEFPGA)
+       if (readl(socfpga_get_sysmgr_addr() + SYSMGR_SOC64_SPIM1_USEFPGA) ==
+           SYSMGR_FPGAINTF_USEFPGA)
                handoff_val |= SYSMGR_FPGAINTF_SPIM1;
-       writel(handoff_val, &sysmgr_regs->fpgaintf_en_2);
+       writel(handoff_val,
+              socfpga_get_sysmgr_addr() + SYSMGR_SOC64_FPGAINTF_EN2);
 
        handoff_val = 0;
-       if (readl(&sysmgr_regs->rgmii0usefpga) == SYSMGR_FPGAINTF_USEFPGA)
+       if (readl(socfpga_get_sysmgr_addr() + SYSMGR_SOC64_EMAC0_USEFPGA) ==
+           SYSMGR_FPGAINTF_USEFPGA)
                handoff_val |= SYSMGR_FPGAINTF_EMAC0;
-       if (readl(&sysmgr_regs->rgmii1usefpga) == SYSMGR_FPGAINTF_USEFPGA)
+       if (readl(socfpga_get_sysmgr_addr() + SYSMGR_SOC64_EMAC1_USEFPGA) ==
+           SYSMGR_FPGAINTF_USEFPGA)
                handoff_val |= SYSMGR_FPGAINTF_EMAC1;
-       if (readl(&sysmgr_regs->rgmii2usefpga) == SYSMGR_FPGAINTF_USEFPGA)
+       if (readl(socfpga_get_sysmgr_addr() + SYSMGR_SOC64_EMAC2_USEFPGA) ==
+           SYSMGR_FPGAINTF_USEFPGA)
                handoff_val |= SYSMGR_FPGAINTF_EMAC2;
-       writel(handoff_val, &sysmgr_regs->fpgaintf_en_3);
+       writel(handoff_val,
+              socfpga_get_sysmgr_addr() + SYSMGR_SOC64_FPGAINTF_EN3);
 }
 
 /*
@@ -64,14 +70,16 @@ void populate_sysmgr_pinmux(void)
        sysmgr_pinmux_table_sel(&sys_mgr_table_u32, &len);
        for (i = 0; i < len; i = i + 2) {
                writel(sys_mgr_table_u32[i + 1],
-                      sys_mgr_table_u32[i] + (u8 *)&sysmgr_regs->pinsel0[0]);
+                      sys_mgr_table_u32[i] +
+                      (u8 *)socfpga_get_sysmgr_addr() + SYSMGR_SOC64_PINSEL0);
        }
 
        /* setup the pin ctrl */
        sysmgr_pinmux_table_ctrl(&sys_mgr_table_u32, &len);
        for (i = 0; i < len; i = i + 2) {
                writel(sys_mgr_table_u32[i + 1],
-                      sys_mgr_table_u32[i] + (u8 *)&sysmgr_regs->ioctrl0[0]);
+                      sys_mgr_table_u32[i] +
+                      (u8 *)socfpga_get_sysmgr_addr() + SYSMGR_SOC64_IOCTRL0);
        }
 
        /* setup the fpga use */
@@ -79,13 +87,15 @@ void populate_sysmgr_pinmux(void)
        for (i = 0; i < len; i = i + 2) {
                writel(sys_mgr_table_u32[i + 1],
                       sys_mgr_table_u32[i] +
-                      (u8 *)&sysmgr_regs->rgmii0usefpga);
+                      (u8 *)socfpga_get_sysmgr_addr() +
+                      SYSMGR_SOC64_EMAC0_USEFPGA);
        }
 
        /* setup the IO delay */
        sysmgr_pinmux_table_delay(&sys_mgr_table_u32, &len);
        for (i = 0; i < len; i = i + 2) {
                writel(sys_mgr_table_u32[i + 1],
-                      sys_mgr_table_u32[i] + (u8 *)&sysmgr_regs->iodelay0[0]);
+                      sys_mgr_table_u32[i] +
+                      (u8 *)socfpga_get_sysmgr_addr() + SYSMGR_SOC64_IODELAY0);
        }
 }
index 7cafc7dcfc920fccfeebf73eb293c49dab74359b..3da85791a1ff7c792223af73bec7baa83a4527f8 100644 (file)
@@ -10,9 +10,6 @@
 #include <asm/arch/handoff_s10.h>
 #include <asm/arch/system_manager.h>
 
-static const struct socfpga_system_manager *sysmgr_regs =
-       (struct socfpga_system_manager *)SOCFPGA_SYSMGR_ADDRESS;
-
 const struct cm_config * const cm_get_default_config(void)
 {
        struct cm_config *cm_handoff_cfg = (struct cm_config *)
@@ -36,11 +33,14 @@ const struct cm_config * const cm_get_default_config(void)
 const unsigned int cm_get_osc_clk_hz(void)
 {
 #ifdef CONFIG_SPL_BUILD
-       u32 clock = readl(S10_HANDOFF_CLOCK_OSC);
 
-       writel(clock, &sysmgr_regs->boot_scratch_cold1);
+       u32 clock = readl(HANDOFF_CLOCK_OSC);
+
+       writel(clock,
+              socfpga_get_sysmgr_addr() + SYSMGR_SOC64_BOOT_SCRATCH_COLD1);
 #endif
-       return readl(&sysmgr_regs->boot_scratch_cold1);
+       return readl(socfpga_get_sysmgr_addr() +
+                    SYSMGR_SOC64_BOOT_SCRATCH_COLD1);
 }
 
 const unsigned int cm_get_intosc_clk_hz(void)
@@ -51,9 +51,11 @@ const unsigned int cm_get_intosc_clk_hz(void)
 const unsigned int cm_get_fpga_clk_hz(void)
 {
 #ifdef CONFIG_SPL_BUILD
-       u32 clock = readl(S10_HANDOFF_CLOCK_FPGA);
+       u32 clock = readl(HANDOFF_CLOCK_FPGA);
 
-       writel(clock, &sysmgr_regs->boot_scratch_cold2);
+       writel(clock,
+              socfpga_get_sysmgr_addr() + SYSMGR_SOC64_BOOT_SCRATCH_COLD2);
 #endif
-       return readl(&sysmgr_regs->boot_scratch_cold2);
+       return readl(socfpga_get_sysmgr_addr() +
+                    SYSMGR_SOC64_BOOT_SCRATCH_COLD2);
 }
index ed7d9f61dcd571386ef3bfd753c0dfe246d96f39..6a71465494b39e3bd9d4a80500cb0f33a245a922 100644 (file)
@@ -35,7 +35,9 @@
 #define TAMP_CR1               (STM32_TAMP_BASE + 0x00)
 
 #define PWR_CR1                        (STM32_PWR_BASE + 0x00)
+#define PWR_MCUCR              (STM32_PWR_BASE + 0x14)
 #define PWR_CR1_DBP            BIT(8)
+#define PWR_MCUCR_SBF          BIT(6)
 
 /* DBGMCU register */
 #define DBGMCU_IDC             (STM32_DBGMCU_BASE + 0x00)
@@ -206,6 +208,11 @@ int arch_cpu_init(void)
        security_init();
        update_bootmode();
 #endif
+       /* Reset Coprocessor state unless it wakes up from Standby power mode */
+       if (!(readl(PWR_MCUCR) & PWR_MCUCR_SBF)) {
+               writel(TAMP_COPRO_STATE_OFF, TAMP_COPRO_STATE);
+               writel(0, TAMP_COPRO_RSC_TBL_ADDRESS);
+       }
 #endif
 
        boot_mode = get_bootmode();
index b3e9ccc5d327bc370bbbbba9488eb0ecc2d2bb77..88126b8cdbad662deee0a6ead3045c718ff17afb 100644 (file)
@@ -86,9 +86,18 @@ enum boot_device {
 #define TAMP_BACKUP_REGISTER(x)                (STM32_TAMP_BASE + 0x100 + 4 * x)
 #define TAMP_BACKUP_MAGIC_NUMBER       TAMP_BACKUP_REGISTER(4)
 #define TAMP_BACKUP_BRANCH_ADDRESS     TAMP_BACKUP_REGISTER(5)
+#define TAMP_COPRO_RSC_TBL_ADDRESS     TAMP_BACKUP_REGISTER(17)
+#define TAMP_COPRO_STATE               TAMP_BACKUP_REGISTER(18)
 #define TAMP_BOOT_CONTEXT              TAMP_BACKUP_REGISTER(20)
 #define TAMP_BOOTCOUNT                 TAMP_BACKUP_REGISTER(21)
 
+#define TAMP_COPRO_STATE_OFF           0
+#define TAMP_COPRO_STATE_INIT          1
+#define TAMP_COPRO_STATE_CRUN          2
+#define TAMP_COPRO_STATE_CSTOP         3
+#define TAMP_COPRO_STATE_STANDBY       4
+#define TAMP_COPRO_STATE_CRASH         5
+
 #define TAMP_BOOT_MODE_MASK            GENMASK(15, 8)
 #define TAMP_BOOT_MODE_SHIFT           8
 #define TAMP_BOOT_DEVICE_MASK          GENMASK(7, 4)
index 3aef40d5ca135022495f7bc9ce713bbd63945641..e529c54d8de99ace4e37dedbe29465456cac87f9 100644 (file)
                reset-names = "other", "test";
        };
 
+       rng {
+               compatible = "sandbox,sandbox-rng";
+       };
+
        rproc_1: rproc@1 {
                compatible = "sandbox,test-processor";
                remoteproc-name = "remoteproc-test-dev1";
index 3b21f503677d41969daf6d61ce1e49b798815769..2ff90039ca218426467c273673402b4375af796b 100644 (file)
@@ -4,4 +4,5 @@ S:      Maintained
 L:     u-boot-amlogic@groups.io
 F:     board/amlogic/w400/
 F:     configs/khadas-vim3_defconfig
+F:     configs/khadas-vim3l_defconfig
 F:     configs/odroid-n2_defconfig
diff --git a/board/amlogic/w400/README.khadas-vim3l b/board/amlogic/w400/README.khadas-vim3l
new file mode 100644 (file)
index 0000000..0afff16
--- /dev/null
@@ -0,0 +1,132 @@
+U-Boot for Khadas VIM3L
+=======================
+
+Khadas VIM3L is a single board computer manufactured by Shenzhen Wesion
+Technology Co., Ltd. with the following specifications:
+
+ - Amlogic S905D3 Arm Cortex-A55 quad-core SoC
+ - 2GB LPDDR4 SDRAM
+ - Gigabit Ethernet
+ - HDMI 2.1 display
+ - 40-pin GPIO header
+ - 1 x USB 3.0 Host, 1 x USB 2.0 Host
+ - eMMC, microSD
+ - M.2
+ - Infrared receiver
+
+Schematics are available on the manufacturer website.
+
+Currently the U-Boot port supports the following devices:
+ - serial
+ - eMMC, microSD
+ - Ethernet
+ - I2C
+ - Regulators
+ - Reset controller
+ - Clock controller
+ - ADC
+
+u-boot compilation
+==================
+
+ > export ARCH=arm
+ > export CROSS_COMPILE=aarch64-none-elf-
+ > make khadas-vim3l_defconfig
+ > make
+
+Image creation
+==============
+
+Amlogic doesn't provide sources for the firmware and for tools needed
+to create the bootloader image, so it is necessary to obtain them from
+the git tree published by the board vendor:
+
+ > wget https://releases.linaro.org/archive/13.11/components/toolchain/binaries/gcc-linaro-aarch64-none-elf-4.8-2013.11_linux.tar.xz
+ > wget https://releases.linaro.org/archive/13.11/components/toolchain/binaries/gcc-linaro-arm-none-eabi-4.8-2013.11_linux.tar.xz
+ > tar xvfJ gcc-linaro-aarch64-none-elf-4.8-2013.11_linux.tar.xz
+ > tar xvfJ gcc-linaro-arm-none-eabi-4.8-2013.11_linux.tar.xz
+ > export PATH=$PWD/gcc-linaro-aarch64-none-elf-4.8-2013.11_linux/bin:$PWD/gcc-linaro-arm-none-eabi-4.8-2013.11_linux/bin:$PATH
+
+ > DIR=vim3l-u-boot
+ > git clone --depth 1 \
+       https://github.com/khadas/u-boot.git -b khadas-vims-v2015.01 \
+       $DIR
+
+ > cd vim3l-u-boot
+ > make kvim3l_defconfig
+ > make
+ > export UBOOTDIR=$PWD
+
+ Go back to mainline U-Boot source tree then :
+ > mkdir fip
+
+ > cp $UBOOTDIR/build/scp_task/bl301.bin fip/
+ > cp $UBOOTDIR/build/board/khadas/kvim3l/firmware/acs.bin fip/
+ > cp $UBOOTDIR/fip/g12a/bl2.bin fip/
+ > cp $UBOOTDIR/fip/g12a/bl30.bin fip/
+ > cp $UBOOTDIR/fip/g12a/bl31.img fip/
+ > cp $UBOOTDIR/fip/g12a/ddr3_1d.fw fip/
+ > cp $UBOOTDIR/fip/g12a/ddr4_1d.fw fip/
+ > cp $UBOOTDIR/fip/g12a/ddr4_2d.fw fip/
+ > cp $UBOOTDIR/fip/g12a/diag_lpddr4.fw fip/
+ > cp $UBOOTDIR/fip/g12a/lpddr3_1d.fw fip/
+ > cp $UBOOTDIR/fip/g12a/lpddr4_1d.fw fip/
+ > cp $UBOOTDIR/fip/g12a/lpddr4_2d.fw fip/
+ > cp $UBOOTDIR/fip/g12a/piei.fw fip/
+ > cp $UBOOTDIR/fip/g12a/aml_ddr.fw fip/
+ > cp u-boot.bin fip/bl33.bin
+
+ > sh fip/blx_fix.sh \
+       fip/bl30.bin \
+       fip/zero_tmp \
+       fip/bl30_zero.bin \
+       fip/bl301.bin \
+       fip/bl301_zero.bin \
+       fip/bl30_new.bin \
+       bl30
+
+ > sh fip/blx_fix.sh \
+       fip/bl2.bin \
+       fip/zero_tmp \
+       fip/bl2_zero.bin \
+       fip/acs.bin \
+       fip/bl21_zero.bin \
+       fip/bl2_new.bin \
+       bl2
+
+ > $UBOOTDIR/fip/g12a/aml_encrypt_g12a --bl30sig --input fip/bl30_new.bin \
+                                       --output fip/bl30_new.bin.g12a.enc \
+                                       --level v3
+ > $UBOOTDIR/fip/g12a/aml_encrypt_g12a --bl3sig --input fip/bl30_new.bin.g12a.enc \
+                                       --output fip/bl30_new.bin.enc \
+                                       --level v3 --type bl30
+ > $UBOOTDIR/fip/g12a/aml_encrypt_g12a --bl3sig --input fip/bl31.img \
+                                       --output fip/bl31.img.enc \
+                                       --level v3 --type bl31
+ > $UBOOTDIR/fip/g12a/aml_encrypt_g12a --bl3sig --input fip/bl33.bin --compress lz4 \
+                                       --output fip/bl33.bin.enc \
+                                       --level v3 --type bl33 --compress lz4
+ > $UBOOTDIR/fip/g12a/aml_encrypt_g12a --bl2sig --input fip/bl2_new.bin \
+                                       --output fip/bl2.n.bin.sig
+ > $UBOOTDIR/fip/g12a/aml_encrypt_g12a --bootmk \
+               --output fip/u-boot.bin \
+               --bl2 fip/bl2.n.bin.sig \
+               --bl30 fip/bl30_new.bin.enc \
+               --bl31 fip/bl31.img.enc \
+               --bl33 fip/bl33.bin.enc \
+               --ddrfw1 fip/ddr4_1d.fw \
+               --ddrfw2 fip/ddr4_2d.fw \
+               --ddrfw3 fip/ddr3_1d.fw \
+               --ddrfw4 fip/piei.fw \
+               --ddrfw5 fip/lpddr4_1d.fw \
+               --ddrfw6 fip/lpddr4_2d.fw \
+               --ddrfw7 fip/diag_lpddr4.fw \
+               --ddrfw8 fip/aml_ddr.fw \
+               --ddrfw9 fip/lpddr3_1d.fw \
+               --level v3
+
+and then write the image to SD with:
+
+ > DEV=/dev/your_sd_device
+ > dd if=fip/u-boot.bin.sd.bin of=$DEV conv=fsync,notrunc bs=512 skip=1 seek=1
+ > dd if=fip/u-boot.bin.sd.bin of=$DEV conv=fsync,notrunc bs=1 count=444
index e1f4709c4cfb981e90d8ed2f999cb328f5dded42..4e1873300142204e6ba61808cc0a33177f6bb497 100644 (file)
@@ -91,3 +91,45 @@ void *board_fdt_blob_setup(void)
        /* QEMU loads a generated DTB for us at the start of RAM. */
        return (void *)CONFIG_SYS_SDRAM_BASE;
 }
+
+#if defined(CONFIG_EFI_RNG_PROTOCOL)
+#include <efi_loader.h>
+#include <efi_rng.h>
+
+#include <dm/device-internal.h>
+
+efi_status_t platform_get_rng_device(struct udevice **dev)
+{
+       int ret;
+       efi_status_t status = EFI_DEVICE_ERROR;
+       struct udevice *bus, *devp;
+
+       for (uclass_first_device(UCLASS_VIRTIO, &bus); bus;
+            uclass_next_device(&bus)) {
+               for (device_find_first_child(bus, &devp); devp;
+                    device_find_next_child(&devp)) {
+                       if (device_get_uclass_id(devp) == UCLASS_RNG) {
+                               *dev = devp;
+                               status = EFI_SUCCESS;
+                               break;
+                       }
+               }
+       }
+
+       if (status != EFI_SUCCESS) {
+               debug("No rng device found\n");
+               return EFI_DEVICE_ERROR;
+       }
+
+       if (*dev) {
+               ret = device_probe(*dev);
+               if (ret)
+                       return EFI_DEVICE_ERROR;
+       } else {
+               debug("Couldn't get child device\n");
+               return EFI_DEVICE_ERROR;
+       }
+
+       return EFI_SUCCESS;
+}
+#endif /* CONFIG_EFI_RNG_PROTOCOL */
diff --git a/board/freescale/imx8mn_evk/README b/board/freescale/imx8mn_evk/README
new file mode 100644 (file)
index 0000000..ff3d15c
--- /dev/null
@@ -0,0 +1,37 @@
+U-Boot for the NXP i.MX8MN EVK board
+
+Quick Start
+===========
+- Build the ARM Trusted firmware binary
+- Get firmware-imx package
+- Build U-Boot
+- Boot
+
+Get and Build the ARM Trusted firmware
+======================================
+Note: srctree is U-Boot source directory
+Get ATF from: https://source.codeaurora.org/external/imx/imx-atf
+branch: imx_4.19.35_1.1.0
+$ make PLAT=imx8mn bl31
+$ cp build/imx8mn/release/bl31.bin $(srctree)
+
+Get the ddr firmware
+=============================
+$ wget https://www.nxp.com/lgfiles/NMG/MAD/YOCTO/firmware-imx-8.5.bin
+$ chmod +x firmware-imx-8.5.bin
+$ ./firmware-imx-8.5
+$ cp firmware-imx-8.5/firmware/ddr/synopsys/ddr4*.bin $(srctree)
+
+Build U-Boot
+============
+$ export CROSS_COMPILE=aarch64-poky-linux-
+$ make imx8mn_ddr4_evk_defconfig
+$ export ATF_LOAD_ADDR=0x960000
+$ make flash.bin
+
+Burn the flash.bin to MicroSD card offset 32KB
+$sudo dd if=flash.bin of=/dev/sd[x] bs=1024 seek=32
+
+Boot
+====
+Set Boot switch to SD boot
index b22a2a6bd15f0bb6d54640c1fd60c23cc7035269..4f33c0e7c9e032b81dacc9a5fa49db5d9c61aebf 100644 (file)
@@ -19,6 +19,11 @@ int board_init(void)
        return 0;
 }
 
+int board_mmc_get_env_dev(int devno)
+{
+       return devno;
+}
+
 int board_late_init(void)
 {
 #ifdef CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG
diff --git a/board/freescale/imx8mp_evk/Kconfig b/board/freescale/imx8mp_evk/Kconfig
new file mode 100644 (file)
index 0000000..49bb29a
--- /dev/null
@@ -0,0 +1,14 @@
+if TARGET_IMX8MP_EVK
+
+config SYS_BOARD
+       default "imx8mp_evk"
+
+config SYS_VENDOR
+       default "freescale"
+
+config SYS_CONFIG_NAME
+       default "imx8mp_evk"
+
+source "board/freescale/common/Kconfig"
+
+endif
diff --git a/board/freescale/imx8mp_evk/MAINTAINERS b/board/freescale/imx8mp_evk/MAINTAINERS
new file mode 100644 (file)
index 0000000..2759652
--- /dev/null
@@ -0,0 +1,6 @@
+i.MX8MP EVK BOARD
+M:     Peng Fan <peng.fan@nxp.com>
+S:     Maintained
+F:     board/freescale/imx8mp_evk/
+F:     include/configs/imx8mp_evk.h
+F:     configs/imx8mp_evk_defconfig
diff --git a/board/freescale/imx8mp_evk/Makefile b/board/freescale/imx8mp_evk/Makefile
new file mode 100644 (file)
index 0000000..106bf9a
--- /dev/null
@@ -0,0 +1,12 @@
+#
+# Copyright 2019 NXP
+#
+# SPDX-License-Identifier:      GPL-2.0+
+#
+
+obj-y += imx8mp_evk.o
+
+ifdef CONFIG_SPL_BUILD
+obj-y += spl.o
+obj-$(CONFIG_IMX8M_LPDDR4) += lpddr4_timing.o
+endif
diff --git a/board/freescale/imx8mp_evk/imx8mp_evk.c b/board/freescale/imx8mp_evk/imx8mp_evk.c
new file mode 100644 (file)
index 0000000..f004af6
--- /dev/null
@@ -0,0 +1,94 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright 2019 NXP
+ */
+
+#include <common.h>
+#include <errno.h>
+#include <asm/mach-imx/iomux-v3.h>
+#include <asm-generic/gpio.h>
+#include <asm/arch/imx8mp_pins.h>
+#include <asm/arch/sys_proto.h>
+#include <asm/mach-imx/gpio.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+#define UART_PAD_CTRL  (PAD_CTL_DSE6 | PAD_CTL_FSEL1)
+#define WDOG_PAD_CTRL  (PAD_CTL_DSE6 | PAD_CTL_ODE | PAD_CTL_PUE | PAD_CTL_PE)
+
+static iomux_v3_cfg_t const uart_pads[] = {
+       MX8MP_PAD_UART2_RXD__UART2_DCE_RX | MUX_PAD_CTRL(UART_PAD_CTRL),
+       MX8MP_PAD_UART2_TXD__UART2_DCE_TX | MUX_PAD_CTRL(UART_PAD_CTRL),
+};
+
+static iomux_v3_cfg_t const wdog_pads[] = {
+       MX8MP_PAD_GPIO1_IO02__WDOG1_WDOG_B  | MUX_PAD_CTRL(WDOG_PAD_CTRL),
+};
+
+int board_early_init_f(void)
+{
+       struct wdog_regs *wdog = (struct wdog_regs *)WDOG1_BASE_ADDR;
+
+       imx_iomux_v3_setup_multiple_pads(wdog_pads, ARRAY_SIZE(wdog_pads));
+
+       set_wdog_reset(wdog);
+
+       imx_iomux_v3_setup_multiple_pads(uart_pads, ARRAY_SIZE(uart_pads));
+
+       return 0;
+}
+
+int dram_init(void)
+{
+       /* rom_pointer[1] contains the size of TEE occupies */
+       if (rom_pointer[1])
+               gd->ram_size = PHYS_SDRAM_SIZE - rom_pointer[1];
+       else
+               gd->ram_size = PHYS_SDRAM_SIZE;
+
+#if CONFIG_NR_DRAM_BANKS > 1
+       gd->ram_size += PHYS_SDRAM_2_SIZE;
+#endif
+
+       return 0;
+}
+
+int dram_init_banksize(void)
+{
+       gd->bd->bi_dram[0].start = PHYS_SDRAM;
+       if (rom_pointer[1])
+
+               gd->bd->bi_dram[0].size = PHYS_SDRAM_SIZE - rom_pointer[1];
+       else
+               gd->bd->bi_dram[0].size = PHYS_SDRAM_SIZE;
+
+#if CONFIG_NR_DRAM_BANKS > 1
+       gd->bd->bi_dram[1].start = PHYS_SDRAM_2;
+       gd->bd->bi_dram[1].size = PHYS_SDRAM_2_SIZE;
+#endif
+
+       return 0;
+}
+
+phys_size_t get_effective_memsize(void)
+{
+       if (rom_pointer[1])
+               return (PHYS_SDRAM_SIZE - rom_pointer[1]);
+       else
+               return PHYS_SDRAM_SIZE;
+}
+
+int board_init(void)
+{
+       return 0;
+}
+
+int board_late_init(void)
+{
+#ifdef CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG
+       env_set("board_name", "EVK");
+       env_set("board_rev", "iMX8MP");
+#endif
+
+       return 0;
+}
diff --git a/board/freescale/imx8mp_evk/lpddr4_timing.c b/board/freescale/imx8mp_evk/lpddr4_timing.c
new file mode 100644 (file)
index 0000000..1454249
--- /dev/null
@@ -0,0 +1,1847 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright 2019 NXP
+ */
+
+#include <linux/kernel.h>
+#include <asm/arch/ddr.h>
+
+struct dram_cfg_param ddr_ddrc_cfg[] = {
+       /** Initialize DDRC registers **/
+       { 0x3d400304, 0x1 },
+       { 0x3d400030, 0x1 },
+       { 0x3d400000, 0xa3080020 },
+       { 0x3d400020, 0x323 },
+       { 0x3d400024, 0x1e84800 },
+       { 0x3d400064, 0x7a0118 },
+       { 0x3d4000d0, 0xc00307a3 },
+       { 0x3d4000d4, 0xc50000 },
+       { 0x3d4000dc, 0xf4003f },
+       { 0x3d4000e0, 0x330000 },
+       { 0x3d4000e8, 0x460048 },
+       { 0x3d4000ec, 0x150048 },
+       { 0x3d400100, 0x2028222a },
+       { 0x3d400104, 0x807bf },
+       { 0x3d40010c, 0xe0e000 },
+       { 0x3d400110, 0x12040a12 },
+       { 0x3d400114, 0x2050f0f },
+       { 0x3d400118, 0x1010009 },
+       { 0x3d40011c, 0x501 },
+       { 0x3d400130, 0x20800 },
+       { 0x3d400134, 0xe100002 },
+       { 0x3d400138, 0x120 },
+       { 0x3d400144, 0xc80064 },
+       { 0x3d400180, 0x3e8001e },
+       { 0x3d400184, 0x3207a12 },
+       { 0x3d400188, 0x0 },
+       { 0x3d400190, 0x49f820e },
+       { 0x3d400194, 0x80303 },
+       { 0x3d4001b4, 0x1f0e },
+       { 0x3d4001a0, 0xe0400018 },
+       { 0x3d4001a4, 0xdf00e4 },
+       { 0x3d4001a8, 0x80000000 },
+       { 0x3d4001b0, 0x11 },
+       { 0x3d4001c0, 0x1 },
+       { 0x3d4001c4, 0x1 },
+       { 0x3d4000f4, 0xc99 },
+       { 0x3d400108, 0x9121c1c },
+       { 0x3d400200, 0x16 },
+       { 0x3d40020c, 0x0 },
+       { 0x3d400210, 0x1f1f },
+       { 0x3d400204, 0x80808 },
+       { 0x3d400214, 0x7070707 },
+       { 0x3d400218, 0x68070707 },
+       { 0x3d40021c, 0xf08 },
+       { 0x3d400250, 0x29001701 },
+       { 0x3d400254, 0x2c },
+       { 0x3d40025c, 0x4000030 },
+       { 0x3d400264, 0x900093e7 },
+       { 0x3d40026c, 0x2005574 },
+       { 0x3d400400, 0x111 },
+       { 0x3d400408, 0x72ff },
+       { 0x3d400494, 0x2100e07 },
+       { 0x3d400498, 0x620096 },
+       { 0x3d40049c, 0x1100e07 },
+       { 0x3d4004a0, 0xc8012c },
+       { 0x3d402020, 0x21 },
+       { 0x3d402024, 0x7d00 },
+       { 0x3d402050, 0x20d040 },
+       { 0x3d402064, 0xc001c },
+       { 0x3d4020dc, 0x840000 },
+       { 0x3d4020e0, 0x310000 },
+       { 0x3d4020e8, 0x66004d },
+       { 0x3d4020ec, 0x16004d },
+       { 0x3d402100, 0xa040305 },
+       { 0x3d402104, 0x30407 },
+       { 0x3d402108, 0x203060b },
+       { 0x3d40210c, 0x505000 },
+       { 0x3d402110, 0x2040202 },
+       { 0x3d402114, 0x2030202 },
+       { 0x3d402118, 0x1010004 },
+       { 0x3d40211c, 0x301 },
+       { 0x3d402130, 0x20300 },
+       { 0x3d402134, 0xa100002 },
+       { 0x3d402138, 0x1d },
+       { 0x3d402144, 0x14000a },
+       { 0x3d402180, 0x640004 },
+       { 0x3d402190, 0x3818200 },
+       { 0x3d402194, 0x80303 },
+       { 0x3d4021b4, 0x100 },
+       { 0x3d4020f4, 0xc99 },
+       { 0x3d403020, 0x21 },
+       { 0x3d403024, 0x30d400 },
+       { 0x3d403050, 0x20d040 },
+       { 0x3d403064, 0x30007 },
+       { 0x3d4030dc, 0x840000 },
+       { 0x3d4030e0, 0x310000 },
+       { 0x3d4030e8, 0x66004d },
+       { 0x3d4030ec, 0x16004d },
+       { 0x3d403100, 0xa010102 },
+       { 0x3d403104, 0x30404 },
+       { 0x3d403108, 0x203060b },
+       { 0x3d40310c, 0x505000 },
+       { 0x3d403110, 0x2040202 },
+       { 0x3d403114, 0x2030202 },
+       { 0x3d403118, 0x1010004 },
+       { 0x3d40311c, 0x301 },
+       { 0x3d403130, 0x20300 },
+       { 0x3d403134, 0xa100002 },
+       { 0x3d403138, 0x8 },
+       { 0x3d403144, 0x50003 },
+       { 0x3d403180, 0x190004 },
+       { 0x3d403190, 0x3818200 },
+       { 0x3d403194, 0x80303 },
+       { 0x3d4031b4, 0x100 },
+       { 0x3d400028, 0x0 },
+};
+
+/* PHY Initialize Configuration */
+struct dram_cfg_param ddr_ddrphy_cfg[] = {
+       { 0x100a0, 0x0 },
+       { 0x100a1, 0x1 },
+       { 0x100a2, 0x2 },
+       { 0x100a3, 0x3 },
+       { 0x100a4, 0x4 },
+       { 0x100a5, 0x5 },
+       { 0x100a6, 0x6 },
+       { 0x100a7, 0x7 },
+       { 0x110a0, 0x0 },
+       { 0x110a1, 0x1 },
+       { 0x110a2, 0x3 },
+       { 0x110a3, 0x4 },
+       { 0x110a4, 0x5 },
+       { 0x110a5, 0x2 },
+       { 0x110a6, 0x7 },
+       { 0x110a7, 0x6 },
+       { 0x120a0, 0x0 },
+       { 0x120a1, 0x1 },
+       { 0x120a2, 0x3 },
+       { 0x120a3, 0x2 },
+       { 0x120a4, 0x5 },
+       { 0x120a5, 0x4 },
+       { 0x120a6, 0x7 },
+       { 0x120a7, 0x6 },
+       { 0x130a0, 0x0 },
+       { 0x130a1, 0x1 },
+       { 0x130a2, 0x2 },
+       { 0x130a3, 0x3 },
+       { 0x130a4, 0x4 },
+       { 0x130a5, 0x5 },
+       { 0x130a6, 0x6 },
+       { 0x130a7, 0x7 },
+       { 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, 0x18 },
+       { 0x1200c5, 0x7 },
+       { 0x2200c5, 0x7 },
+       { 0x2002e, 0x2 },
+       { 0x12002e, 0x2 },
+       { 0x22002e, 0x2 },
+       { 0x90204, 0x0 },
+       { 0x190204, 0x0 },
+       { 0x290204, 0x0 },
+       { 0x20024, 0x1e3 },
+       { 0x2003a, 0x2 },
+       { 0x120024, 0x1e3 },
+       { 0x2003a, 0x2 },
+       { 0x220024, 0x1e3 },
+       { 0x2003a, 0x2 },
+       { 0x20056, 0x3 },
+       { 0x120056, 0x3 },
+       { 0x220056, 0x3 },
+       { 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, 0xeba },
+       { 0x10149, 0xeba },
+       { 0x11049, 0xeba },
+       { 0x11149, 0xeba },
+       { 0x12049, 0xeba },
+       { 0x12149, 0xeba },
+       { 0x13049, 0xeba },
+       { 0x13149, 0xeba },
+       { 0x110049, 0xeba },
+       { 0x110149, 0xeba },
+       { 0x111049, 0xeba },
+       { 0x111149, 0xeba },
+       { 0x112049, 0xeba },
+       { 0x112149, 0xeba },
+       { 0x113049, 0xeba },
+       { 0x113149, 0xeba },
+       { 0x210049, 0xeba },
+       { 0x210149, 0xeba },
+       { 0x211049, 0xeba },
+       { 0x211149, 0xeba },
+       { 0x212049, 0xeba },
+       { 0x212149, 0xeba },
+       { 0x213049, 0xeba },
+       { 0x213149, 0xeba },
+       { 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, 0x3e8 },
+       { 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 },
+       { 0x2007d, 0x212 },
+       { 0x12007d, 0x212 },
+       { 0x22007d, 0x212 },
+       { 0x2007c, 0x61 },
+       { 0x12007c, 0x61 },
+       { 0x22007c, 0x61 },
+       { 0x1004a, 0x500 },
+       { 0x1104a, 0x500 },
+       { 0x1204a, 0x500 },
+       { 0x1304a, 0x500 },
+       { 0x2002c, 0x0 },
+};
+
+/* ddr phy trained csr */
+struct dram_cfg_param ddr_ddrphy_trained_csr[] = {
+       { 0x200b2, 0x0 },
+       { 0x1200b2, 0x0 },
+       { 0x2200b2, 0x0 },
+       { 0x200cb, 0x0 },
+       { 0x10043, 0x0 },
+       { 0x110043, 0x0 },
+       { 0x210043, 0x0 },
+       { 0x10143, 0x0 },
+       { 0x110143, 0x0 },
+       { 0x210143, 0x0 },
+       { 0x11043, 0x0 },
+       { 0x111043, 0x0 },
+       { 0x211043, 0x0 },
+       { 0x11143, 0x0 },
+       { 0x111143, 0x0 },
+       { 0x211143, 0x0 },
+       { 0x12043, 0x0 },
+       { 0x112043, 0x0 },
+       { 0x212043, 0x0 },
+       { 0x12143, 0x0 },
+       { 0x112143, 0x0 },
+       { 0x212143, 0x0 },
+       { 0x13043, 0x0 },
+       { 0x113043, 0x0 },
+       { 0x213043, 0x0 },
+       { 0x13143, 0x0 },
+       { 0x113143, 0x0 },
+       { 0x213143, 0x0 },
+       { 0x80, 0x0 },
+       { 0x100080, 0x0 },
+       { 0x200080, 0x0 },
+       { 0x1080, 0x0 },
+       { 0x101080, 0x0 },
+       { 0x201080, 0x0 },
+       { 0x2080, 0x0 },
+       { 0x102080, 0x0 },
+       { 0x202080, 0x0 },
+       { 0x3080, 0x0 },
+       { 0x103080, 0x0 },
+       { 0x203080, 0x0 },
+       { 0x4080, 0x0 },
+       { 0x104080, 0x0 },
+       { 0x204080, 0x0 },
+       { 0x5080, 0x0 },
+       { 0x105080, 0x0 },
+       { 0x205080, 0x0 },
+       { 0x6080, 0x0 },
+       { 0x106080, 0x0 },
+       { 0x206080, 0x0 },
+       { 0x7080, 0x0 },
+       { 0x107080, 0x0 },
+       { 0x207080, 0x0 },
+       { 0x8080, 0x0 },
+       { 0x108080, 0x0 },
+       { 0x208080, 0x0 },
+       { 0x9080, 0x0 },
+       { 0x109080, 0x0 },
+       { 0x209080, 0x0 },
+       { 0x10080, 0x0 },
+       { 0x110080, 0x0 },
+       { 0x210080, 0x0 },
+       { 0x10180, 0x0 },
+       { 0x110180, 0x0 },
+       { 0x210180, 0x0 },
+       { 0x11080, 0x0 },
+       { 0x111080, 0x0 },
+       { 0x211080, 0x0 },
+       { 0x11180, 0x0 },
+       { 0x111180, 0x0 },
+       { 0x211180, 0x0 },
+       { 0x12080, 0x0 },
+       { 0x112080, 0x0 },
+       { 0x212080, 0x0 },
+       { 0x12180, 0x0 },
+       { 0x112180, 0x0 },
+       { 0x212180, 0x0 },
+       { 0x13080, 0x0 },
+       { 0x113080, 0x0 },
+       { 0x213080, 0x0 },
+       { 0x13180, 0x0 },
+       { 0x113180, 0x0 },
+       { 0x213180, 0x0 },
+       { 0x10081, 0x0 },
+       { 0x110081, 0x0 },
+       { 0x210081, 0x0 },
+       { 0x10181, 0x0 },
+       { 0x110181, 0x0 },
+       { 0x210181, 0x0 },
+       { 0x11081, 0x0 },
+       { 0x111081, 0x0 },
+       { 0x211081, 0x0 },
+       { 0x11181, 0x0 },
+       { 0x111181, 0x0 },
+       { 0x211181, 0x0 },
+       { 0x12081, 0x0 },
+       { 0x112081, 0x0 },
+       { 0x212081, 0x0 },
+       { 0x12181, 0x0 },
+       { 0x112181, 0x0 },
+       { 0x212181, 0x0 },
+       { 0x13081, 0x0 },
+       { 0x113081, 0x0 },
+       { 0x213081, 0x0 },
+       { 0x13181, 0x0 },
+       { 0x113181, 0x0 },
+       { 0x213181, 0x0 },
+       { 0x100d0, 0x0 },
+       { 0x1100d0, 0x0 },
+       { 0x2100d0, 0x0 },
+       { 0x101d0, 0x0 },
+       { 0x1101d0, 0x0 },
+       { 0x2101d0, 0x0 },
+       { 0x110d0, 0x0 },
+       { 0x1110d0, 0x0 },
+       { 0x2110d0, 0x0 },
+       { 0x111d0, 0x0 },
+       { 0x1111d0, 0x0 },
+       { 0x2111d0, 0x0 },
+       { 0x120d0, 0x0 },
+       { 0x1120d0, 0x0 },
+       { 0x2120d0, 0x0 },
+       { 0x121d0, 0x0 },
+       { 0x1121d0, 0x0 },
+       { 0x2121d0, 0x0 },
+       { 0x130d0, 0x0 },
+       { 0x1130d0, 0x0 },
+       { 0x2130d0, 0x0 },
+       { 0x131d0, 0x0 },
+       { 0x1131d0, 0x0 },
+       { 0x2131d0, 0x0 },
+       { 0x100d1, 0x0 },
+       { 0x1100d1, 0x0 },
+       { 0x2100d1, 0x0 },
+       { 0x101d1, 0x0 },
+       { 0x1101d1, 0x0 },
+       { 0x2101d1, 0x0 },
+       { 0x110d1, 0x0 },
+       { 0x1110d1, 0x0 },
+       { 0x2110d1, 0x0 },
+       { 0x111d1, 0x0 },
+       { 0x1111d1, 0x0 },
+       { 0x2111d1, 0x0 },
+       { 0x120d1, 0x0 },
+       { 0x1120d1, 0x0 },
+       { 0x2120d1, 0x0 },
+       { 0x121d1, 0x0 },
+       { 0x1121d1, 0x0 },
+       { 0x2121d1, 0x0 },
+       { 0x130d1, 0x0 },
+       { 0x1130d1, 0x0 },
+       { 0x2130d1, 0x0 },
+       { 0x131d1, 0x0 },
+       { 0x1131d1, 0x0 },
+       { 0x2131d1, 0x0 },
+       { 0x10068, 0x0 },
+       { 0x10168, 0x0 },
+       { 0x10268, 0x0 },
+       { 0x10368, 0x0 },
+       { 0x10468, 0x0 },
+       { 0x10568, 0x0 },
+       { 0x10668, 0x0 },
+       { 0x10768, 0x0 },
+       { 0x10868, 0x0 },
+       { 0x11068, 0x0 },
+       { 0x11168, 0x0 },
+       { 0x11268, 0x0 },
+       { 0x11368, 0x0 },
+       { 0x11468, 0x0 },
+       { 0x11568, 0x0 },
+       { 0x11668, 0x0 },
+       { 0x11768, 0x0 },
+       { 0x11868, 0x0 },
+       { 0x12068, 0x0 },
+       { 0x12168, 0x0 },
+       { 0x12268, 0x0 },
+       { 0x12368, 0x0 },
+       { 0x12468, 0x0 },
+       { 0x12568, 0x0 },
+       { 0x12668, 0x0 },
+       { 0x12768, 0x0 },
+       { 0x12868, 0x0 },
+       { 0x13068, 0x0 },
+       { 0x13168, 0x0 },
+       { 0x13268, 0x0 },
+       { 0x13368, 0x0 },
+       { 0x13468, 0x0 },
+       { 0x13568, 0x0 },
+       { 0x13668, 0x0 },
+       { 0x13768, 0x0 },
+       { 0x13868, 0x0 },
+       { 0x10069, 0x0 },
+       { 0x10169, 0x0 },
+       { 0x10269, 0x0 },
+       { 0x10369, 0x0 },
+       { 0x10469, 0x0 },
+       { 0x10569, 0x0 },
+       { 0x10669, 0x0 },
+       { 0x10769, 0x0 },
+       { 0x10869, 0x0 },
+       { 0x11069, 0x0 },
+       { 0x11169, 0x0 },
+       { 0x11269, 0x0 },
+       { 0x11369, 0x0 },
+       { 0x11469, 0x0 },
+       { 0x11569, 0x0 },
+       { 0x11669, 0x0 },
+       { 0x11769, 0x0 },
+       { 0x11869, 0x0 },
+       { 0x12069, 0x0 },
+       { 0x12169, 0x0 },
+       { 0x12269, 0x0 },
+       { 0x12369, 0x0 },
+       { 0x12469, 0x0 },
+       { 0x12569, 0x0 },
+       { 0x12669, 0x0 },
+       { 0x12769, 0x0 },
+       { 0x12869, 0x0 },
+       { 0x13069, 0x0 },
+       { 0x13169, 0x0 },
+       { 0x13269, 0x0 },
+       { 0x13369, 0x0 },
+       { 0x13469, 0x0 },
+       { 0x13569, 0x0 },
+       { 0x13669, 0x0 },
+       { 0x13769, 0x0 },
+       { 0x13869, 0x0 },
+       { 0x1008c, 0x0 },
+       { 0x11008c, 0x0 },
+       { 0x21008c, 0x0 },
+       { 0x1018c, 0x0 },
+       { 0x11018c, 0x0 },
+       { 0x21018c, 0x0 },
+       { 0x1108c, 0x0 },
+       { 0x11108c, 0x0 },
+       { 0x21108c, 0x0 },
+       { 0x1118c, 0x0 },
+       { 0x11118c, 0x0 },
+       { 0x21118c, 0x0 },
+       { 0x1208c, 0x0 },
+       { 0x11208c, 0x0 },
+       { 0x21208c, 0x0 },
+       { 0x1218c, 0x0 },
+       { 0x11218c, 0x0 },
+       { 0x21218c, 0x0 },
+       { 0x1308c, 0x0 },
+       { 0x11308c, 0x0 },
+       { 0x21308c, 0x0 },
+       { 0x1318c, 0x0 },
+       { 0x11318c, 0x0 },
+       { 0x21318c, 0x0 },
+       { 0x1008d, 0x0 },
+       { 0x11008d, 0x0 },
+       { 0x21008d, 0x0 },
+       { 0x1018d, 0x0 },
+       { 0x11018d, 0x0 },
+       { 0x21018d, 0x0 },
+       { 0x1108d, 0x0 },
+       { 0x11108d, 0x0 },
+       { 0x21108d, 0x0 },
+       { 0x1118d, 0x0 },
+       { 0x11118d, 0x0 },
+       { 0x21118d, 0x0 },
+       { 0x1208d, 0x0 },
+       { 0x11208d, 0x0 },
+       { 0x21208d, 0x0 },
+       { 0x1218d, 0x0 },
+       { 0x11218d, 0x0 },
+       { 0x21218d, 0x0 },
+       { 0x1308d, 0x0 },
+       { 0x11308d, 0x0 },
+       { 0x21308d, 0x0 },
+       { 0x1318d, 0x0 },
+       { 0x11318d, 0x0 },
+       { 0x21318d, 0x0 },
+       { 0x100c0, 0x0 },
+       { 0x1100c0, 0x0 },
+       { 0x2100c0, 0x0 },
+       { 0x101c0, 0x0 },
+       { 0x1101c0, 0x0 },
+       { 0x2101c0, 0x0 },
+       { 0x102c0, 0x0 },
+       { 0x1102c0, 0x0 },
+       { 0x2102c0, 0x0 },
+       { 0x103c0, 0x0 },
+       { 0x1103c0, 0x0 },
+       { 0x2103c0, 0x0 },
+       { 0x104c0, 0x0 },
+       { 0x1104c0, 0x0 },
+       { 0x2104c0, 0x0 },
+       { 0x105c0, 0x0 },
+       { 0x1105c0, 0x0 },
+       { 0x2105c0, 0x0 },
+       { 0x106c0, 0x0 },
+       { 0x1106c0, 0x0 },
+       { 0x2106c0, 0x0 },
+       { 0x107c0, 0x0 },
+       { 0x1107c0, 0x0 },
+       { 0x2107c0, 0x0 },
+       { 0x108c0, 0x0 },
+       { 0x1108c0, 0x0 },
+       { 0x2108c0, 0x0 },
+       { 0x110c0, 0x0 },
+       { 0x1110c0, 0x0 },
+       { 0x2110c0, 0x0 },
+       { 0x111c0, 0x0 },
+       { 0x1111c0, 0x0 },
+       { 0x2111c0, 0x0 },
+       { 0x112c0, 0x0 },
+       { 0x1112c0, 0x0 },
+       { 0x2112c0, 0x0 },
+       { 0x113c0, 0x0 },
+       { 0x1113c0, 0x0 },
+       { 0x2113c0, 0x0 },
+       { 0x114c0, 0x0 },
+       { 0x1114c0, 0x0 },
+       { 0x2114c0, 0x0 },
+       { 0x115c0, 0x0 },
+       { 0x1115c0, 0x0 },
+       { 0x2115c0, 0x0 },
+       { 0x116c0, 0x0 },
+       { 0x1116c0, 0x0 },
+       { 0x2116c0, 0x0 },
+       { 0x117c0, 0x0 },
+       { 0x1117c0, 0x0 },
+       { 0x2117c0, 0x0 },
+       { 0x118c0, 0x0 },
+       { 0x1118c0, 0x0 },
+       { 0x2118c0, 0x0 },
+       { 0x120c0, 0x0 },
+       { 0x1120c0, 0x0 },
+       { 0x2120c0, 0x0 },
+       { 0x121c0, 0x0 },
+       { 0x1121c0, 0x0 },
+       { 0x2121c0, 0x0 },
+       { 0x122c0, 0x0 },
+       { 0x1122c0, 0x0 },
+       { 0x2122c0, 0x0 },
+       { 0x123c0, 0x0 },
+       { 0x1123c0, 0x0 },
+       { 0x2123c0, 0x0 },
+       { 0x124c0, 0x0 },
+       { 0x1124c0, 0x0 },
+       { 0x2124c0, 0x0 },
+       { 0x125c0, 0x0 },
+       { 0x1125c0, 0x0 },
+       { 0x2125c0, 0x0 },
+       { 0x126c0, 0x0 },
+       { 0x1126c0, 0x0 },
+       { 0x2126c0, 0x0 },
+       { 0x127c0, 0x0 },
+       { 0x1127c0, 0x0 },
+       { 0x2127c0, 0x0 },
+       { 0x128c0, 0x0 },
+       { 0x1128c0, 0x0 },
+       { 0x2128c0, 0x0 },
+       { 0x130c0, 0x0 },
+       { 0x1130c0, 0x0 },
+       { 0x2130c0, 0x0 },
+       { 0x131c0, 0x0 },
+       { 0x1131c0, 0x0 },
+       { 0x2131c0, 0x0 },
+       { 0x132c0, 0x0 },
+       { 0x1132c0, 0x0 },
+       { 0x2132c0, 0x0 },
+       { 0x133c0, 0x0 },
+       { 0x1133c0, 0x0 },
+       { 0x2133c0, 0x0 },
+       { 0x134c0, 0x0 },
+       { 0x1134c0, 0x0 },
+       { 0x2134c0, 0x0 },
+       { 0x135c0, 0x0 },
+       { 0x1135c0, 0x0 },
+       { 0x2135c0, 0x0 },
+       { 0x136c0, 0x0 },
+       { 0x1136c0, 0x0 },
+       { 0x2136c0, 0x0 },
+       { 0x137c0, 0x0 },
+       { 0x1137c0, 0x0 },
+       { 0x2137c0, 0x0 },
+       { 0x138c0, 0x0 },
+       { 0x1138c0, 0x0 },
+       { 0x2138c0, 0x0 },
+       { 0x100c1, 0x0 },
+       { 0x1100c1, 0x0 },
+       { 0x2100c1, 0x0 },
+       { 0x101c1, 0x0 },
+       { 0x1101c1, 0x0 },
+       { 0x2101c1, 0x0 },
+       { 0x102c1, 0x0 },
+       { 0x1102c1, 0x0 },
+       { 0x2102c1, 0x0 },
+       { 0x103c1, 0x0 },
+       { 0x1103c1, 0x0 },
+       { 0x2103c1, 0x0 },
+       { 0x104c1, 0x0 },
+       { 0x1104c1, 0x0 },
+       { 0x2104c1, 0x0 },
+       { 0x105c1, 0x0 },
+       { 0x1105c1, 0x0 },
+       { 0x2105c1, 0x0 },
+       { 0x106c1, 0x0 },
+       { 0x1106c1, 0x0 },
+       { 0x2106c1, 0x0 },
+       { 0x107c1, 0x0 },
+       { 0x1107c1, 0x0 },
+       { 0x2107c1, 0x0 },
+       { 0x108c1, 0x0 },
+       { 0x1108c1, 0x0 },
+       { 0x2108c1, 0x0 },
+       { 0x110c1, 0x0 },
+       { 0x1110c1, 0x0 },
+       { 0x2110c1, 0x0 },
+       { 0x111c1, 0x0 },
+       { 0x1111c1, 0x0 },
+       { 0x2111c1, 0x0 },
+       { 0x112c1, 0x0 },
+       { 0x1112c1, 0x0 },
+       { 0x2112c1, 0x0 },
+       { 0x113c1, 0x0 },
+       { 0x1113c1, 0x0 },
+       { 0x2113c1, 0x0 },
+       { 0x114c1, 0x0 },
+       { 0x1114c1, 0x0 },
+       { 0x2114c1, 0x0 },
+       { 0x115c1, 0x0 },
+       { 0x1115c1, 0x0 },
+       { 0x2115c1, 0x0 },
+       { 0x116c1, 0x0 },
+       { 0x1116c1, 0x0 },
+       { 0x2116c1, 0x0 },
+       { 0x117c1, 0x0 },
+       { 0x1117c1, 0x0 },
+       { 0x2117c1, 0x0 },
+       { 0x118c1, 0x0 },
+       { 0x1118c1, 0x0 },
+       { 0x2118c1, 0x0 },
+       { 0x120c1, 0x0 },
+       { 0x1120c1, 0x0 },
+       { 0x2120c1, 0x0 },
+       { 0x121c1, 0x0 },
+       { 0x1121c1, 0x0 },
+       { 0x2121c1, 0x0 },
+       { 0x122c1, 0x0 },
+       { 0x1122c1, 0x0 },
+       { 0x2122c1, 0x0 },
+       { 0x123c1, 0x0 },
+       { 0x1123c1, 0x0 },
+       { 0x2123c1, 0x0 },
+       { 0x124c1, 0x0 },
+       { 0x1124c1, 0x0 },
+       { 0x2124c1, 0x0 },
+       { 0x125c1, 0x0 },
+       { 0x1125c1, 0x0 },
+       { 0x2125c1, 0x0 },
+       { 0x126c1, 0x0 },
+       { 0x1126c1, 0x0 },
+       { 0x2126c1, 0x0 },
+       { 0x127c1, 0x0 },
+       { 0x1127c1, 0x0 },
+       { 0x2127c1, 0x0 },
+       { 0x128c1, 0x0 },
+       { 0x1128c1, 0x0 },
+       { 0x2128c1, 0x0 },
+       { 0x130c1, 0x0 },
+       { 0x1130c1, 0x0 },
+       { 0x2130c1, 0x0 },
+       { 0x131c1, 0x0 },
+       { 0x1131c1, 0x0 },
+       { 0x2131c1, 0x0 },
+       { 0x132c1, 0x0 },
+       { 0x1132c1, 0x0 },
+       { 0x2132c1, 0x0 },
+       { 0x133c1, 0x0 },
+       { 0x1133c1, 0x0 },
+       { 0x2133c1, 0x0 },
+       { 0x134c1, 0x0 },
+       { 0x1134c1, 0x0 },
+       { 0x2134c1, 0x0 },
+       { 0x135c1, 0x0 },
+       { 0x1135c1, 0x0 },
+       { 0x2135c1, 0x0 },
+       { 0x136c1, 0x0 },
+       { 0x1136c1, 0x0 },
+       { 0x2136c1, 0x0 },
+       { 0x137c1, 0x0 },
+       { 0x1137c1, 0x0 },
+       { 0x2137c1, 0x0 },
+       { 0x138c1, 0x0 },
+       { 0x1138c1, 0x0 },
+       { 0x2138c1, 0x0 },
+       { 0x10020, 0x0 },
+       { 0x110020, 0x0 },
+       { 0x210020, 0x0 },
+       { 0x11020, 0x0 },
+       { 0x111020, 0x0 },
+       { 0x211020, 0x0 },
+       { 0x12020, 0x0 },
+       { 0x112020, 0x0 },
+       { 0x212020, 0x0 },
+       { 0x13020, 0x0 },
+       { 0x113020, 0x0 },
+       { 0x213020, 0x0 },
+       { 0x20072, 0x0 },
+       { 0x20073, 0x0 },
+       { 0x20074, 0x0 },
+       { 0x100aa, 0x0 },
+       { 0x110aa, 0x0 },
+       { 0x120aa, 0x0 },
+       { 0x130aa, 0x0 },
+       { 0x20010, 0x0 },
+       { 0x120010, 0x0 },
+       { 0x220010, 0x0 },
+       { 0x20011, 0x0 },
+       { 0x120011, 0x0 },
+       { 0x220011, 0x0 },
+       { 0x100ae, 0x0 },
+       { 0x1100ae, 0x0 },
+       { 0x2100ae, 0x0 },
+       { 0x100af, 0x0 },
+       { 0x1100af, 0x0 },
+       { 0x2100af, 0x0 },
+       { 0x110ae, 0x0 },
+       { 0x1110ae, 0x0 },
+       { 0x2110ae, 0x0 },
+       { 0x110af, 0x0 },
+       { 0x1110af, 0x0 },
+       { 0x2110af, 0x0 },
+       { 0x120ae, 0x0 },
+       { 0x1120ae, 0x0 },
+       { 0x2120ae, 0x0 },
+       { 0x120af, 0x0 },
+       { 0x1120af, 0x0 },
+       { 0x2120af, 0x0 },
+       { 0x130ae, 0x0 },
+       { 0x1130ae, 0x0 },
+       { 0x2130ae, 0x0 },
+       { 0x130af, 0x0 },
+       { 0x1130af, 0x0 },
+       { 0x2130af, 0x0 },
+       { 0x20020, 0x0 },
+       { 0x120020, 0x0 },
+       { 0x220020, 0x0 },
+       { 0x100a0, 0x0 },
+       { 0x100a1, 0x0 },
+       { 0x100a2, 0x0 },
+       { 0x100a3, 0x0 },
+       { 0x100a4, 0x0 },
+       { 0x100a5, 0x0 },
+       { 0x100a6, 0x0 },
+       { 0x100a7, 0x0 },
+       { 0x110a0, 0x0 },
+       { 0x110a1, 0x0 },
+       { 0x110a2, 0x0 },
+       { 0x110a3, 0x0 },
+       { 0x110a4, 0x0 },
+       { 0x110a5, 0x0 },
+       { 0x110a6, 0x0 },
+       { 0x110a7, 0x0 },
+       { 0x120a0, 0x0 },
+       { 0x120a1, 0x0 },
+       { 0x120a2, 0x0 },
+       { 0x120a3, 0x0 },
+       { 0x120a4, 0x0 },
+       { 0x120a5, 0x0 },
+       { 0x120a6, 0x0 },
+       { 0x120a7, 0x0 },
+       { 0x130a0, 0x0 },
+       { 0x130a1, 0x0 },
+       { 0x130a2, 0x0 },
+       { 0x130a3, 0x0 },
+       { 0x130a4, 0x0 },
+       { 0x130a5, 0x0 },
+       { 0x130a6, 0x0 },
+       { 0x130a7, 0x0 },
+       { 0x2007c, 0x0 },
+       { 0x12007c, 0x0 },
+       { 0x22007c, 0x0 },
+       { 0x2007d, 0x0 },
+       { 0x12007d, 0x0 },
+       { 0x22007d, 0x0 },
+       { 0x400fd, 0x0 },
+       { 0x400c0, 0x0 },
+       { 0x90201, 0x0 },
+       { 0x190201, 0x0 },
+       { 0x290201, 0x0 },
+       { 0x90202, 0x0 },
+       { 0x190202, 0x0 },
+       { 0x290202, 0x0 },
+       { 0x90203, 0x0 },
+       { 0x190203, 0x0 },
+       { 0x290203, 0x0 },
+       { 0x90204, 0x0 },
+       { 0x190204, 0x0 },
+       { 0x290204, 0x0 },
+       { 0x90205, 0x0 },
+       { 0x190205, 0x0 },
+       { 0x290205, 0x0 },
+       { 0x90206, 0x0 },
+       { 0x190206, 0x0 },
+       { 0x290206, 0x0 },
+       { 0x90207, 0x0 },
+       { 0x190207, 0x0 },
+       { 0x290207, 0x0 },
+       { 0x90208, 0x0 },
+       { 0x190208, 0x0 },
+       { 0x290208, 0x0 },
+       { 0x10062, 0x0 },
+       { 0x10162, 0x0 },
+       { 0x10262, 0x0 },
+       { 0x10362, 0x0 },
+       { 0x10462, 0x0 },
+       { 0x10562, 0x0 },
+       { 0x10662, 0x0 },
+       { 0x10762, 0x0 },
+       { 0x10862, 0x0 },
+       { 0x11062, 0x0 },
+       { 0x11162, 0x0 },
+       { 0x11262, 0x0 },
+       { 0x11362, 0x0 },
+       { 0x11462, 0x0 },
+       { 0x11562, 0x0 },
+       { 0x11662, 0x0 },
+       { 0x11762, 0x0 },
+       { 0x11862, 0x0 },
+       { 0x12062, 0x0 },
+       { 0x12162, 0x0 },
+       { 0x12262, 0x0 },
+       { 0x12362, 0x0 },
+       { 0x12462, 0x0 },
+       { 0x12562, 0x0 },
+       { 0x12662, 0x0 },
+       { 0x12762, 0x0 },
+       { 0x12862, 0x0 },
+       { 0x13062, 0x0 },
+       { 0x13162, 0x0 },
+       { 0x13262, 0x0 },
+       { 0x13362, 0x0 },
+       { 0x13462, 0x0 },
+       { 0x13562, 0x0 },
+       { 0x13662, 0x0 },
+       { 0x13762, 0x0 },
+       { 0x13862, 0x0 },
+       { 0x20077, 0x0 },
+       { 0x10001, 0x0 },
+       { 0x11001, 0x0 },
+       { 0x12001, 0x0 },
+       { 0x13001, 0x0 },
+       { 0x10040, 0x0 },
+       { 0x10140, 0x0 },
+       { 0x10240, 0x0 },
+       { 0x10340, 0x0 },
+       { 0x10440, 0x0 },
+       { 0x10540, 0x0 },
+       { 0x10640, 0x0 },
+       { 0x10740, 0x0 },
+       { 0x10840, 0x0 },
+       { 0x10030, 0x0 },
+       { 0x10130, 0x0 },
+       { 0x10230, 0x0 },
+       { 0x10330, 0x0 },
+       { 0x10430, 0x0 },
+       { 0x10530, 0x0 },
+       { 0x10630, 0x0 },
+       { 0x10730, 0x0 },
+       { 0x10830, 0x0 },
+       { 0x11040, 0x0 },
+       { 0x11140, 0x0 },
+       { 0x11240, 0x0 },
+       { 0x11340, 0x0 },
+       { 0x11440, 0x0 },
+       { 0x11540, 0x0 },
+       { 0x11640, 0x0 },
+       { 0x11740, 0x0 },
+       { 0x11840, 0x0 },
+       { 0x11030, 0x0 },
+       { 0x11130, 0x0 },
+       { 0x11230, 0x0 },
+       { 0x11330, 0x0 },
+       { 0x11430, 0x0 },
+       { 0x11530, 0x0 },
+       { 0x11630, 0x0 },
+       { 0x11730, 0x0 },
+       { 0x11830, 0x0 },
+       { 0x12040, 0x0 },
+       { 0x12140, 0x0 },
+       { 0x12240, 0x0 },
+       { 0x12340, 0x0 },
+       { 0x12440, 0x0 },
+       { 0x12540, 0x0 },
+       { 0x12640, 0x0 },
+       { 0x12740, 0x0 },
+       { 0x12840, 0x0 },
+       { 0x12030, 0x0 },
+       { 0x12130, 0x0 },
+       { 0x12230, 0x0 },
+       { 0x12330, 0x0 },
+       { 0x12430, 0x0 },
+       { 0x12530, 0x0 },
+       { 0x12630, 0x0 },
+       { 0x12730, 0x0 },
+       { 0x12830, 0x0 },
+       { 0x13040, 0x0 },
+       { 0x13140, 0x0 },
+       { 0x13240, 0x0 },
+       { 0x13340, 0x0 },
+       { 0x13440, 0x0 },
+       { 0x13540, 0x0 },
+       { 0x13640, 0x0 },
+       { 0x13740, 0x0 },
+       { 0x13840, 0x0 },
+       { 0x13030, 0x0 },
+       { 0x13130, 0x0 },
+       { 0x13230, 0x0 },
+       { 0x13330, 0x0 },
+       { 0x13430, 0x0 },
+       { 0x13530, 0x0 },
+       { 0x13630, 0x0 },
+       { 0x13730, 0x0 },
+       { 0x13830, 0x0 },
+};
+
+/* P0 message block paremeter for training firmware */
+struct dram_cfg_param ddr_fsp0_cfg[] = {
+       { 0xd0000, 0x0 },
+       { 0x54003, 0xfa0 },
+       { 0x54004, 0x2 },
+       { 0x54005, 0x2228 },
+       { 0x54006, 0x14 },
+       { 0x54008, 0x131f },
+       { 0x54009, 0xc8 },
+       { 0x5400b, 0x2 },
+       { 0x5400f, 0x100 },
+       { 0x54012, 0x310 },
+       { 0x54019, 0x3ff4 },
+       { 0x5401a, 0x33 },
+       { 0x5401b, 0x4866 },
+       { 0x5401c, 0x4800 },
+       { 0x5401e, 0x16 },
+       { 0x5401f, 0x3ff4 },
+       { 0x54020, 0x33 },
+       { 0x54021, 0x4866 },
+       { 0x54022, 0x4800 },
+       { 0x54024, 0x16 },
+       { 0x5402b, 0x1000 },
+       { 0x5402c, 0x3 },
+       { 0x54032, 0xf400 },
+       { 0x54033, 0x333f },
+       { 0x54034, 0x6600 },
+       { 0x54035, 0x48 },
+       { 0x54036, 0x48 },
+       { 0x54037, 0x1600 },
+       { 0x54038, 0xf400 },
+       { 0x54039, 0x333f },
+       { 0x5403a, 0x6600 },
+       { 0x5403b, 0x48 },
+       { 0x5403c, 0x48 },
+       { 0x5403d, 0x1600 },
+       { 0xd0000, 0x1 },
+};
+
+/* P1 message block paremeter for training firmware */
+struct dram_cfg_param ddr_fsp1_cfg[] = {
+       { 0xd0000, 0x0 },
+       { 0x54002, 0x101 },
+       { 0x54003, 0x190 },
+       { 0x54004, 0x2 },
+       { 0x54005, 0x2228 },
+       { 0x54006, 0x14 },
+       { 0x54008, 0x121f },
+       { 0x54009, 0xc8 },
+       { 0x5400b, 0x2 },
+       { 0x5400f, 0x100 },
+       { 0x54012, 0x310 },
+       { 0x54019, 0x84 },
+       { 0x5401a, 0x33 },
+       { 0x5401b, 0x4846 },
+       { 0x5401c, 0x4800 },
+       { 0x5401e, 0x15 },
+       { 0x5401f, 0x84 },
+       { 0x54020, 0x33 },
+       { 0x54021, 0x4846 },
+       { 0x54022, 0x4800 },
+       { 0x54024, 0x15 },
+       { 0x5402b, 0x1000 },
+       { 0x5402c, 0x3 },
+       { 0x54032, 0x8400 },
+       { 0x54033, 0x3300 },
+       { 0x54034, 0x4600 },
+       { 0x54035, 0x48 },
+       { 0x54036, 0x48 },
+       { 0x54037, 0x1500 },
+       { 0x54038, 0x8400 },
+       { 0x54039, 0x3300 },
+       { 0x5403a, 0x4600 },
+       { 0x5403b, 0x48 },
+       { 0x5403c, 0x48 },
+       { 0x5403d, 0x1500 },
+       { 0xd0000, 0x1 },
+};
+
+/* P2 message block paremeter for training firmware */
+struct dram_cfg_param ddr_fsp2_cfg[] = {
+       { 0xd0000, 0x0 },
+       { 0x54002, 0x102 },
+       { 0x54003, 0x64 },
+       { 0x54004, 0x2 },
+       { 0x54005, 0x2228 },
+       { 0x54006, 0x14 },
+       { 0x54008, 0x121f },
+       { 0x54009, 0xc8 },
+       { 0x5400b, 0x2 },
+       { 0x5400f, 0x100 },
+       { 0x54012, 0x310 },
+       { 0x54019, 0x84 },
+       { 0x5401a, 0x33 },
+       { 0x5401b, 0x4846 },
+       { 0x5401c, 0x4800 },
+       { 0x5401e, 0x15 },
+       { 0x5401f, 0x84 },
+       { 0x54020, 0x33 },
+       { 0x54021, 0x4846 },
+       { 0x54022, 0x4800 },
+       { 0x54024, 0x15 },
+       { 0x5402b, 0x1000 },
+       { 0x5402c, 0x3 },
+       { 0x54032, 0x8400 },
+       { 0x54033, 0x3300 },
+       { 0x54034, 0x4600 },
+       { 0x54035, 0x48 },
+       { 0x54036, 0x48 },
+       { 0x54037, 0x1500 },
+       { 0x54038, 0x8400 },
+       { 0x54039, 0x3300 },
+       { 0x5403a, 0x4600 },
+       { 0x5403b, 0x48 },
+       { 0x5403c, 0x48 },
+       { 0x5403d, 0x1500 },
+       { 0xd0000, 0x1 },
+};
+
+/* P0 2D message block paremeter for training firmware */
+struct dram_cfg_param ddr_fsp0_2d_cfg[] = {
+       { 0xd0000, 0x0 },
+       { 0x54003, 0xfa0 },
+       { 0x54004, 0x2 },
+       { 0x54005, 0x2228 },
+       { 0x54006, 0x14 },
+       { 0x54008, 0x61 },
+       { 0x54009, 0xc8 },
+       { 0x5400b, 0x2 },
+       { 0x5400d, 0x100 },
+       { 0x5400f, 0x100 },
+       { 0x54010, 0x1f7f },
+       { 0x54012, 0x310 },
+       { 0x54019, 0x3ff4 },
+       { 0x5401a, 0x33 },
+       { 0x5401b, 0x4866 },
+       { 0x5401c, 0x4800 },
+       { 0x5401e, 0x16 },
+       { 0x5401f, 0x3ff4 },
+       { 0x54020, 0x33 },
+       { 0x54021, 0x4866 },
+       { 0x54022, 0x4800 },
+       { 0x54024, 0x16 },
+       { 0x5402b, 0x1000 },
+       { 0x5402c, 0x3 },
+       { 0x54032, 0xf400 },
+       { 0x54033, 0x333f },
+       { 0x54034, 0x6600 },
+       { 0x54035, 0x48 },
+       { 0x54036, 0x48 },
+       { 0x54037, 0x1600 },
+       { 0x54038, 0xf400 },
+       { 0x54039, 0x333f },
+       { 0x5403a, 0x6600 },
+       { 0x5403b, 0x48 },
+       { 0x5403c, 0x48 },
+       { 0x5403d, 0x1600 },
+       { 0xd0000, 0x1 },
+};
+
+/* DRAM PHY init engine image */
+struct dram_cfg_param ddr_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, 0x633 },
+       { 0x9003d, 0x159 },
+       { 0x9003e, 0x14f },
+       { 0x9003f, 0x630 },
+       { 0x90040, 0x159 },
+       { 0x90041, 0x47 },
+       { 0x90042, 0x633 },
+       { 0x90043, 0x149 },
+       { 0x90044, 0x4f },
+       { 0x90045, 0x633 },
+       { 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, 0x633 },
+       { 0x90058, 0x179 },
+       { 0x90059, 0x1 },
+       { 0x9005a, 0x618 },
+       { 0x9005b, 0x109 },
+       { 0x9005c, 0x40c0 },
+       { 0x9005d, 0x633 },
+       { 0x9005e, 0x149 },
+       { 0x9005f, 0x8 },
+       { 0x90060, 0x4 },
+       { 0x90061, 0x48 },
+       { 0x90062, 0x4040 },
+       { 0x90063, 0x633 },
+       { 0x90064, 0x149 },
+       { 0x90065, 0x0 },
+       { 0x90066, 0x4 },
+       { 0x90067, 0x48 },
+       { 0x90068, 0x40 },
+       { 0x90069, 0x633 },
+       { 0x9006a, 0x149 },
+       { 0x9006b, 0x10 },
+       { 0x9006c, 0x4 },
+       { 0x9006d, 0x18 },
+       { 0x9006e, 0x0 },
+       { 0x9006f, 0x4 },
+       { 0x90070, 0x78 },
+       { 0x90071, 0x549 },
+       { 0x90072, 0x633 },
+       { 0x90073, 0x159 },
+       { 0x90074, 0xd49 },
+       { 0x90075, 0x633 },
+       { 0x90076, 0x159 },
+       { 0x90077, 0x94a },
+       { 0x90078, 0x633 },
+       { 0x90079, 0x159 },
+       { 0x9007a, 0x441 },
+       { 0x9007b, 0x633 },
+       { 0x9007c, 0x149 },
+       { 0x9007d, 0x42 },
+       { 0x9007e, 0x633 },
+       { 0x9007f, 0x149 },
+       { 0x90080, 0x1 },
+       { 0x90081, 0x633 },
+       { 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, 0xb },
+       { 0x9009c, 0x10 },
+       { 0x9009d, 0x109 },
+       { 0x9009e, 0x1 },
+       { 0x9009f, 0x10 },
+       { 0x900a0, 0x109 },
+       { 0x900a1, 0x5 },
+       { 0x900a2, 0x7c0 },
+       { 0x900a3, 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, 0x625 },
+       { 0x4002b, 0x15 },
+       { 0x4004b, 0x0 },
+       { 0x4006b, 0x0 },
+       { 0x4000c, 0x4028 },
+       { 0x4002c, 0x80 },
+       { 0x4004c, 0x0 },
+       { 0x4006c, 0x0 },
+       { 0x4000d, 0xe08 },
+       { 0x4002d, 0xc1a },
+       { 0x4004d, 0x0 },
+       { 0x4006d, 0x0 },
+       { 0x4000e, 0x625 },
+       { 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 },
+       { 0x900a4, 0x0 },
+       { 0x900a5, 0x790 },
+       { 0x900a6, 0x11a },
+       { 0x900a7, 0x8 },
+       { 0x900a8, 0x7aa },
+       { 0x900a9, 0x2a },
+       { 0x900aa, 0x10 },
+       { 0x900ab, 0x7b2 },
+       { 0x900ac, 0x2a },
+       { 0x900ad, 0x0 },
+       { 0x900ae, 0x7c8 },
+       { 0x900af, 0x109 },
+       { 0x900b0, 0x10 },
+       { 0x900b1, 0x10 },
+       { 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, 0x1 },
+       { 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, 0xd },
+       { 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, 0x448 },
+       { 0x90169, 0x109 },
+       { 0x9016a, 0xf },
+       { 0x9016b, 0x7c0 },
+       { 0x9016c, 0x109 },
+       { 0x9016d, 0x0 },
+       { 0x9016e, 0xe8 },
+       { 0x9016f, 0x109 },
+       { 0x90170, 0x47 },
+       { 0x90171, 0x630 },
+       { 0x90172, 0x109 },
+       { 0x90173, 0x8 },
+       { 0x90174, 0x618 },
+       { 0x90175, 0x109 },
+       { 0x90176, 0x8 },
+       { 0x90177, 0xe0 },
+       { 0x90178, 0x109 },
+       { 0x90179, 0x0 },
+       { 0x9017a, 0x7c8 },
+       { 0x9017b, 0x109 },
+       { 0x9017c, 0x8 },
+       { 0x9017d, 0x8140 },
+       { 0x9017e, 0x10c },
+       { 0x9017f, 0x0 },
+       { 0x90180, 0x478 },
+       { 0x90181, 0x109 },
+       { 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, 0x29 },
+       { 0x90026, 0x6a },
+       { 0x400d0, 0x0 },
+       { 0x400d1, 0x101 },
+       { 0x400d2, 0x105 },
+       { 0x400d3, 0x107 },
+       { 0x400d4, 0x10f },
+       { 0x400d5, 0x202 },
+       { 0x400d6, 0x20a },
+       { 0x400d7, 0x20b },
+       { 0x2003a, 0x2 },
+       { 0x2000b, 0x7d },
+       { 0x2000c, 0xfa },
+       { 0x2000d, 0x9c4 },
+       { 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, 0x2060 },
+       { 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 }
+};
+
+struct dram_fsp_msg ddr_dram_fsp_msg[] = {
+       {
+               /* P0 4000mts 1D */
+               .drate = 4000,
+               .fw_type = FW_1D_IMAGE,
+               .fsp_cfg = ddr_fsp0_cfg,
+               .fsp_cfg_num = ARRAY_SIZE(ddr_fsp0_cfg),
+       },
+       {
+               /* P1 400mts 1D */
+               .drate = 400,
+               .fw_type = FW_1D_IMAGE,
+               .fsp_cfg = ddr_fsp1_cfg,
+               .fsp_cfg_num = ARRAY_SIZE(ddr_fsp1_cfg),
+       },
+       {
+               /* P2 100mts 1D */
+               .drate = 100,
+               .fw_type = FW_1D_IMAGE,
+               .fsp_cfg = ddr_fsp2_cfg,
+               .fsp_cfg_num = ARRAY_SIZE(ddr_fsp2_cfg),
+       },
+       {
+               /* P0 4000mts 2D */
+               .drate = 4000,
+               .fw_type = FW_2D_IMAGE,
+               .fsp_cfg = ddr_fsp0_2d_cfg,
+               .fsp_cfg_num = ARRAY_SIZE(ddr_fsp0_2d_cfg),
+       },
+};
+
+/* ddr timing config params */
+struct dram_timing_info dram_timing = {
+       .ddrc_cfg = ddr_ddrc_cfg,
+       .ddrc_cfg_num = ARRAY_SIZE(ddr_ddrc_cfg),
+       .ddrphy_cfg = ddr_ddrphy_cfg,
+       .ddrphy_cfg_num = ARRAY_SIZE(ddr_ddrphy_cfg),
+       .fsp_msg = ddr_dram_fsp_msg,
+       .fsp_msg_num = ARRAY_SIZE(ddr_dram_fsp_msg),
+       .ddrphy_trained_csr = ddr_ddrphy_trained_csr,
+       .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 = { 4000, 400, 100, },
+};
diff --git a/board/freescale/imx8mp_evk/spl.c b/board/freescale/imx8mp_evk/spl.c
new file mode 100644 (file)
index 0000000..3c689f2
--- /dev/null
@@ -0,0 +1,158 @@
+/*
+ * Copyright 2018-2019 NXP
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#include <common.h>
+#include <spl.h>
+#include <asm/io.h>
+#include <errno.h>
+#include <asm/io.h>
+#include <asm/mach-imx/iomux-v3.h>
+#include <asm/arch/imx8mp_pins.h>
+#include <asm/arch/sys_proto.h>
+#include <asm/mach-imx/boot_mode.h>
+#include <power/pmic.h>
+
+#include <power/pca9450.h>
+#include <asm/arch/clock.h>
+#include <asm/mach-imx/gpio.h>
+#include <asm/mach-imx/mxc_i2c.h>
+#include <fsl_esdhc.h>
+#include <mmc.h>
+#include <asm/arch/ddr.h>
+
+#include <dm/uclass.h>
+#include <dm/device.h>
+#include <dm/uclass-internal.h>
+#include <dm/device-internal.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+int spl_board_boot_device(enum boot_device boot_dev_spl)
+{
+       return BOOT_DEVICE_BOOTROM;
+}
+
+void spl_dram_init(void)
+{
+       ddr_init(&dram_timing);
+}
+
+void spl_board_init(void)
+{
+       struct udevice *dev;
+       int ret;
+
+       puts("Normal Boot\n");
+
+       ret = uclass_get_device_by_name(UCLASS_CLK,
+                                       "clock-controller@30380000",
+                                       &dev);
+       if (ret < 0)
+               printf("Failed to find clock node. Check device tree\n");
+}
+
+#define I2C_PAD_CTRL (PAD_CTL_DSE6 | PAD_CTL_HYS | PAD_CTL_PUE | PAD_CTL_PE)
+#define PC MUX_PAD_CTRL(I2C_PAD_CTRL)
+struct i2c_pads_info i2c_pad_info1 = {
+       .scl = {
+               .i2c_mode = MX8MP_PAD_I2C1_SCL__I2C1_SCL | PC,
+               .gpio_mode = MX8MP_PAD_I2C1_SCL__GPIO5_IO14 | PC,
+               .gp = IMX_GPIO_NR(5, 14),
+       },
+       .sda = {
+               .i2c_mode = MX8MP_PAD_I2C1_SDA__I2C1_SDA | PC,
+               .gpio_mode = MX8MP_PAD_I2C1_SDA__GPIO5_IO15 | PC,
+               .gp = IMX_GPIO_NR(5, 15),
+       },
+};
+
+#ifdef CONFIG_POWER
+#define I2C_PMIC       0
+int power_init_board(void)
+{
+       struct pmic *p;
+       int ret;
+
+       ret = power_pca9450b_init(I2C_PMIC);
+       if (ret)
+               printf("power init failed");
+       p = pmic_get("PCA9450");
+       pmic_probe(p);
+
+       /* BUCKxOUT_DVS0/1 control BUCK123 output */
+       pmic_reg_write(p, PCA9450_BUCK123_DVS, 0x29);
+
+       /*
+        * increase VDD_SOC to typical value 0.95V before first
+        * DRAM access, set DVS1 to 0.85v for suspend.
+        * Enable DVS control through PMIC_STBY_REQ and
+        * set B1_ENMODE=1 (ON by PMIC_ON_REQ=H)
+        */
+       pmic_reg_write(p, PCA9450_BUCK1OUT_DVS0, 0x1C);
+       pmic_reg_write(p, PCA9450_BUCK1OUT_DVS1, 0x14);
+       pmic_reg_write(p, PCA9450_BUCK1CTRL, 0x59);
+
+       /* set WDOG_B_CFG to cold reset */
+       pmic_reg_write(p, PCA9450_RESET_CTRL, 0xA1);
+
+       return 0;
+}
+#endif
+
+#ifdef CONFIG_SPL_LOAD_FIT
+int board_fit_config_name_match(const char *name)
+{
+       /* Just empty function now - can't decide what to choose */
+       debug("%s: %s\n", __func__, name);
+
+       return 0;
+}
+#endif
+
+void board_init_f(ulong dummy)
+{
+       int ret;
+
+       arch_cpu_init();
+
+       init_uart_clk(1);
+
+       board_early_init_f();
+
+       timer_init();
+
+       preloader_console_init();
+
+       /* Clear the BSS. */
+       memset(__bss_start, 0, __bss_end - __bss_start);
+
+       ret = spl_init();
+       if (ret) {
+               debug("spl_init() failed: %d\n", ret);
+               hang();
+       }
+
+       enable_tzc380();
+
+       /* Adjust pmic voltage to 1.0V for 800M */
+       setup_i2c(0, CONFIG_SYS_I2C_SPEED, 0x7f, &i2c_pad_info1);
+
+       power_init_board();
+
+       /* DDR initialization */
+       spl_dram_init();
+
+       board_init_r(NULL, 0);
+}
+
+int do_reset(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
+{
+       puts("resetting ...\n");
+
+       reset_cpu(WDOG1_BASE_ADDR);
+
+       return 0;
+}
diff --git a/board/intel/agilex-socdk/MAINTAINERS b/board/intel/agilex-socdk/MAINTAINERS
new file mode 100644 (file)
index 0000000..b8e28f0
--- /dev/null
@@ -0,0 +1,7 @@
+SOCFPGA BOARD
+M:     Ley Foon Tan <ley.foon.tan@intel.com>
+M:     Chee Hong Ang <chee.hong.ang@intel.com>
+S:     Maintained
+F:     board/intel/agilex-socdk/
+F:     include/configs/socfpga_agilex_socdk.h
+F:     configs/socfpga_agilex_defconfig
diff --git a/board/intel/agilex-socdk/Makefile b/board/intel/agilex-socdk/Makefile
new file mode 100644 (file)
index 0000000..b86223a
--- /dev/null
@@ -0,0 +1,7 @@
+#
+# Copyright (C) 2019 Intel Corporation <www.intel.com>
+#
+# SPDX-License-Identifier:     GPL-2.0
+#
+
+obj-y  := socfpga.o
diff --git a/board/intel/agilex-socdk/socfpga.c b/board/intel/agilex-socdk/socfpga.c
new file mode 100644 (file)
index 0000000..72a3e08
--- /dev/null
@@ -0,0 +1,7 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (C) 2019 Intel Corporation <www.intel.com>
+ *
+ */
+
+#include <common.h>
index cee3500737abaf6a9943ca3ba0ec323c2367f490..1d4a54c9026db6e616d7ca11411cf0250003951e 100644 (file)
@@ -1096,10 +1096,8 @@ static void board_copro_image_process(ulong fw_image, size_t fw_size)
        printf("Load Remote Processor %d with data@addr=0x%08lx %u bytes:%s\n",
               id, fw_image, fw_size, ret ? " Failed!" : " Success!");
 
-       if (!ret) {
+       if (!ret)
                rproc_start(id);
-               env_set("copro_state", "booted");
-       }
 }
 
 U_BOOT_FIT_LOADABLE_HANDLER(IH_TYPE_COPRO, board_copro_image_process);
index 6c1e4ef27dbf967e16e5a1704f3062b5b02bcf24..f4534dd3dc6274b788f49110e591a3fcc7c0b97e 100644 (file)
@@ -361,9 +361,7 @@ int power_init_board(void)
        struct udevice *dev;
        int reg, ret;
 
-       puts("PMIC:  ");
-
-       ret = pmic_get("pfuze100", &dev);
+       ret = pmic_get("pfuze100@8", &dev);
        if (ret < 0) {
                printf("pmic_get() ret %d\n", ret);
                return 0;
index 4e29e7b3c5467dd66436e5d1191d1ce142193507..26c6551ed6162273049cfd660b4b44c69d8bc23e 100644 (file)
@@ -259,6 +259,13 @@ config CMD_BOOTM
        help
          Boot an application image from the memory.
 
+config BOOTM_EFI
+       bool "Support booting UEFI FIT images"
+       depends on CMD_BOOTEFI && CMD_BOOTM && FIT
+       default y
+       help
+         Support booting UEFI FIT images via the bootm command.
+
 config CMD_BOOTZ
        bool "bootz"
        help
@@ -294,6 +301,7 @@ config BOOTM_OPENRTOS
 
 config BOOTM_OSE
        bool "Support booting Enea OSE images"
+       depends on (ARM && (ARM64 || CPU_V7A || CPU_V7R) || SANDBOX || PPC || X86)
        depends on CMD_BOOTM
        help
          Support booting Enea OSE images via the bootm command.
@@ -1665,6 +1673,13 @@ config CMD_GETTIME
          milliseconds. See also the 'bootstage' command which provides more
          flexibility for boot timing.
 
+config CMD_RNG
+       bool "rng command"
+       depends on DM_RNG
+       select HEXDUMP
+       help
+         Print bytes from the hardware random number generator.
+
 # TODO: rename to CMD_SLEEP
 config CMD_MISC
        bool "sleep"
index 12e898d96205d74523753e04147629f4697559ac..8df39f3a19f1737d84f8a966d40d8bb70197d50b 100644 (file)
@@ -117,6 +117,7 @@ obj-$(CONFIG_CMD_READ) += read.o
 obj-$(CONFIG_CMD_REGINFO) += reginfo.o
 obj-$(CONFIG_CMD_REISER) += reiser.o
 obj-$(CONFIG_CMD_REMOTEPROC) += remoteproc.o
+obj-$(CONFIG_CMD_RNG) += rng.o
 obj-$(CONFIG_CMD_ROCKUSB) += rockusb.o
 obj-$(CONFIG_SANDBOX) += host.o
 obj-$(CONFIG_CMD_SATA) += sata.o
index abd9151432ed945e161a50ac54107cad1b0232f9..d6a7175b37956e53c3270c714af6c97a3354bab2 100644 (file)
@@ -348,6 +348,9 @@ static int do_bdinfo(cmd_tbl_t *cmdtp, int flag, int argc,
 #if CONFIG_VAL(SYS_MALLOC_F_LEN)
        printf("Early malloc usage: %lx / %x\n", gd->malloc_ptr,
               CONFIG_VAL(SYS_MALLOC_F_LEN));
+#endif
+#if CONFIG_IS_ENABLED(MULTI_DTB_FIT)
+       print_num("multi_dtb_fit", (ulong)gd->multi_dtb_fit);
 #endif
        if (gd->fdt_blob)
                print_num("fdt_blob", (ulong)gd->fdt_blob);
index f613cce7e2628053e74b6f8f190cc6990a642060..56bdff33c64732fc6f6671b08478121133d9e742 100644 (file)
@@ -28,11 +28,13 @@ static struct efi_device_path *bootefi_device_path;
 /**
  * Set the load options of an image from an environment variable.
  *
- * @handle:    the image handle
- * @env_var:   name of the environment variable
- * Return:     status code
+ * @handle:            the image handle
+ * @env_var:           name of the environment variable
+ * @load_options:      pointer to load options (output)
+ * Return:             status code
  */
-static efi_status_t set_load_options(efi_handle_t handle, const char *env_var)
+static efi_status_t set_load_options(efi_handle_t handle, const char *env_var,
+                                    u16 **load_options)
 {
        struct efi_loaded_image *loaded_image_info;
        size_t size;
@@ -40,6 +42,7 @@ static efi_status_t set_load_options(efi_handle_t handle, const char *env_var)
        u16 *pos;
        efi_status_t ret;
 
+       *load_options = NULL;
        ret = EFI_CALL(systab.boottime->open_protocol(
                                        handle,
                                        &efi_guid_loaded_image,
@@ -64,6 +67,7 @@ static efi_status_t set_load_options(efi_handle_t handle, const char *env_var)
                return EFI_OUT_OF_RESOURCES;
        }
        pos = loaded_image_info->load_options;
+       *load_options = pos;
        utf8_utf16_strcpy(&pos, env);
        loaded_image_info->load_options_size = size * 2;
 
@@ -196,58 +200,63 @@ static void *get_config_table(const efi_guid_t *guid)
 #endif /* !CONFIG_IS_ENABLED(GENERATE_ACPI_TABLE) */
 
 /**
- * efi_install_fdt() - install fdt passed by a command argument
+ * efi_install_fdt() - install device tree
  *
- * If fdt_opt is available, the device tree located at that memory address will
+ * If fdt_addr is available, the device tree located at that memory address will
  * will be installed as configuration table, otherwise the device tree located
- * at the address indicated by environment variable fdtcontroladdr will be used.
+ * at the address indicated by environment variable fdt_addr or as fallback
+ * fdtcontroladdr will be used.
  *
- * On architectures (x86) using ACPI tables device trees shall not be installed
- * as configuration table.
+ * On architectures using ACPI tables device trees shall not be installed as
+ * configuration table.
  *
- * @fdt_opt:   pointer to argument
+ * @fdt_addr:  address of device tree or EFI_FDT_USE_INTERNAL to use the
+ *             the hardware device tree as indicated by environment variable
+ *             fdt_addr or as fallback the internal device tree as indicated by
+ *             the environment variable fdtcontroladdr
  * Return:     status code
  */
-static efi_status_t efi_install_fdt(const char *fdt_opt)
+efi_status_t efi_install_fdt(void *fdt)
 {
        /*
         * The EBBR spec requires that we have either an FDT or an ACPI table
         * but not both.
         */
 #if CONFIG_IS_ENABLED(GENERATE_ACPI_TABLE)
-       if (fdt_opt) {
+       if (fdt) {
                printf("ERROR: can't have ACPI table and device tree.\n");
                return EFI_LOAD_ERROR;
        }
 #else
-       unsigned long fdt_addr;
-       void *fdt;
        bootm_headers_t img = { 0 };
        efi_status_t ret;
 
-       if (fdt_opt) {
-               fdt_addr = simple_strtoul(fdt_opt, NULL, 16);
-               if (!fdt_addr)
-                       return EFI_INVALID_PARAMETER;
-       } else {
+       if (fdt == EFI_FDT_USE_INTERNAL) {
+               const char *fdt_opt;
+               uintptr_t fdt_addr;
+
                /* Look for device tree that is already installed */
                if (get_config_table(&efi_guid_fdt))
                        return EFI_SUCCESS;
-               /* Use our own device tree as default */
-               fdt_opt = env_get("fdtcontroladdr");
+               /* Check if there is a hardware device tree */
+               fdt_opt = env_get("fdt_addr");
+               /* Use our own device tree as fallback */
                if (!fdt_opt) {
-                       printf("ERROR: need device tree\n");
-                       return EFI_NOT_FOUND;
+                       fdt_opt = env_get("fdtcontroladdr");
+                       if (!fdt_opt) {
+                               printf("ERROR: need device tree\n");
+                               return EFI_NOT_FOUND;
+                       }
                }
                fdt_addr = simple_strtoul(fdt_opt, NULL, 16);
                if (!fdt_addr) {
-                       printf("ERROR: invalid $fdtcontroladdr\n");
+                       printf("ERROR: invalid $fdt_addr or $fdtcontroladdr\n");
                        return EFI_LOAD_ERROR;
                }
+               fdt = map_sysmem(fdt_addr, 0);
        }
 
        /* Install device tree */
-       fdt = map_sysmem(fdt_addr, 0);
        if (fdt_check_header(fdt)) {
                printf("ERROR: invalid device tree\n");
                return EFI_LOAD_ERROR;
@@ -293,9 +302,10 @@ static efi_status_t do_bootefi_exec(efi_handle_t handle)
        efi_status_t ret;
        efi_uintn_t exit_data_size = 0;
        u16 *exit_data = NULL;
+       u16 *load_options;
 
        /* Transfer environment variable as load options */
-       ret = set_load_options(handle, "bootargs");
+       ret = set_load_options(handle, "bootargs", &load_options);
        if (ret != EFI_SUCCESS)
                return ret;
 
@@ -309,12 +319,7 @@ static efi_status_t do_bootefi_exec(efi_handle_t handle)
 
        efi_restore_gd();
 
-       /*
-        * FIXME: Who is responsible for
-        *      free(loaded_image_info->load_options);
-        * Once efi_exit() is implemented correctly,
-        * handle itself doesn't exist here.
-        */
+       free(load_options);
 
        return ret;
 }
@@ -355,11 +360,8 @@ static int do_efibootmgr(void)
 static int do_bootefi_image(const char *image_opt)
 {
        void *image_buf;
-       struct efi_device_path *device_path, *image_path;
-       struct efi_device_path *file_path = NULL;
        unsigned long addr, size;
        const char *size_str;
-       efi_handle_t mem_handle = NULL, handle;
        efi_status_t ret;
 
 #ifdef CONFIG_CMD_BOOTEFI_HELLO
@@ -377,8 +379,10 @@ static int do_bootefi_image(const char *image_opt)
                image_buf = map_sysmem(addr, size);
                memcpy(image_buf, __efi_helloworld_begin, size);
 
-               device_path = NULL;
-               image_path = NULL;
+               efi_free_pool(bootefi_device_path);
+               efi_free_pool(bootefi_image_path);
+               bootefi_device_path = NULL;
+               bootefi_image_path = NULL;
        } else
 #endif
        {
@@ -394,19 +398,37 @@ static int do_bootefi_image(const char *image_opt)
                        return CMD_RET_USAGE;
 
                image_buf = map_sysmem(addr, size);
-
-               device_path = bootefi_device_path;
-               image_path = bootefi_image_path;
        }
+       ret = efi_run_image(image_buf, size);
+
+       if (ret != EFI_SUCCESS)
+               return CMD_RET_FAILURE;
+
+       return CMD_RET_SUCCESS;
+}
 
-       if (!device_path && !image_path) {
+/**
+ * efi_run_image() - run loaded UEFI image
+ *
+ * @source_buffer:     memory address of the UEFI image
+ * @source_size:       size of the UEFI image
+ * Return:             status code
+ */
+efi_status_t efi_run_image(void *source_buffer, efi_uintn_t source_size)
+{
+       efi_handle_t mem_handle = NULL, handle;
+       struct efi_device_path *file_path = NULL;
+       efi_status_t ret;
+
+       if (!bootefi_device_path || !bootefi_image_path) {
                /*
                 * Special case for efi payload not loaded from disk,
                 * such as 'bootefi hello' or for example payload
                 * loaded directly into memory via JTAG, etc:
                 */
                file_path = efi_dp_from_mem(EFI_RESERVED_MEMORY_TYPE,
-                                           (uintptr_t)image_buf, size);
+                                           (uintptr_t)source_buffer,
+                                           source_size);
                /*
                 * Make sure that device for device_path exist
                 * in load_image(). Otherwise, shell and grub will fail.
@@ -420,12 +442,12 @@ static int do_bootefi_image(const char *image_opt)
                if (ret != EFI_SUCCESS)
                        goto out;
        } else {
-               assert(device_path && image_path);
-               file_path = efi_dp_append(device_path, image_path);
+               file_path = efi_dp_append(bootefi_device_path,
+                                         bootefi_image_path);
        }
 
-       ret = EFI_CALL(efi_load_image(false, efi_root,
-                                     file_path, image_buf, size, &handle));
+       ret = EFI_CALL(efi_load_image(false, efi_root, file_path, source_buffer,
+                                     source_size, &handle));
        if (ret != EFI_SUCCESS)
                goto out;
 
@@ -436,11 +458,7 @@ out:
                efi_delete_handle(mem_handle);
        if (file_path)
                efi_free_pool(file_path);
-
-       if (ret != EFI_SUCCESS)
-               return CMD_RET_FAILURE;
-
-       return CMD_RET_SUCCESS;
+       return ret;
 }
 
 #ifdef CONFIG_CMD_BOOTEFI_SELFTEST
@@ -451,6 +469,7 @@ static efi_status_t bootefi_run_prepare(const char *load_options_path,
                struct efi_loaded_image **loaded_image_infop)
 {
        efi_status_t ret;
+       u16 *load_options;
 
        ret = efi_setup_loaded_image(device_path, image_path, image_objp,
                                     loaded_image_infop);
@@ -458,7 +477,8 @@ static efi_status_t bootefi_run_prepare(const char *load_options_path,
                return ret;
 
        /* Transfer environment variable as load options */
-       return set_load_options((efi_handle_t)*image_objp, load_options_path);
+       return set_load_options((efi_handle_t)*image_objp, load_options_path,
+                               &load_options);
 }
 
 /**
@@ -556,6 +576,7 @@ static int do_efi_selftest(void)
 static int do_bootefi(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
 {
        efi_status_t ret;
+       void *fdt;
 
        if (argc < 2)
                return CMD_RET_USAGE;
@@ -568,7 +589,15 @@ static int do_bootefi(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
                return CMD_RET_FAILURE;
        }
 
-       ret = efi_install_fdt(argc > 2 ? argv[2] : NULL);
+       if (argc > 2) {
+               uintptr_t fdt_addr;
+
+               fdt_addr = simple_strtoul(argv[2], NULL, 16);
+               fdt = map_sysmem(fdt_addr, 0);
+       } else {
+               fdt = EFI_FDT_USE_INTERNAL;
+       }
+       ret = efi_install_fdt(fdt);
        if (ret == EFI_INVALID_PARAMETER)
                return CMD_RET_USAGE;
        else if (ret != EFI_SUCCESS)
index 33491d0bc9c3ce0d1aa7d468c7d97a82c97e2f83..b30f8a566733a0a99b659d8417150de0baa9960d 100644 (file)
--- a/cmd/dfu.c
+++ b/cmd/dfu.c
@@ -30,28 +30,35 @@ static int do_dfu(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
 #if defined(CONFIG_DFU_OVER_USB) || defined(CONFIG_DFU_OVER_TFTP)
        char *interface = NULL;
        char *devstring = NULL;
+#if defined(CONFIG_DFU_TIMEOUT) || defined(CONFIG_DFU_OVER_TFTP)
+       unsigned long value = 0;
+#endif
 
        if (argc >= 4) {
                interface = argv[2];
                devstring = argv[3];
        }
+
+#if defined(CONFIG_DFU_TIMEOUT) || defined(CONFIG_DFU_OVER_TFTP)
+       if (argc == 5 || argc == 3)
+               value = simple_strtoul(argv[argc - 1], NULL, 0);
+#endif
 #endif
 
        int ret = 0;
 #ifdef CONFIG_DFU_OVER_TFTP
-       unsigned long addr = 0;
-       if (!strcmp(argv[1], "tftp")) {
-               if (argc == 5 || argc == 3)
-                       addr = simple_strtoul(argv[argc - 1], NULL, 0);
-
-               return update_tftp(addr, interface, devstring);
-       }
+       if (!strcmp(argv[1], "tftp"))
+               return update_tftp(value, interface, devstring);
 #endif
 #ifdef CONFIG_DFU_OVER_USB
        ret = dfu_init_env_entities(interface, devstring);
        if (ret)
                goto done;
 
+#ifdef CONFIG_DFU_TIMEOUT
+       dfu_set_timeout(value * 1000);
+#endif
+
        ret = CMD_RET_SUCCESS;
        if (strcmp(argv[argc - 1], "list") == 0) {
                dfu_show_entities();
@@ -72,10 +79,17 @@ U_BOOT_CMD(dfu, CONFIG_SYS_MAXARGS, 1, do_dfu,
        "Device Firmware Upgrade",
        ""
 #ifdef CONFIG_DFU_OVER_USB
+#ifdef CONFIG_DFU_TIMEOUT
+       "<USB_controller> [<interface> <dev>] [<timeout>] [list]\n"
+#else
        "<USB_controller> [<interface> <dev>] [list]\n"
+#endif
        "  - device firmware upgrade via <USB_controller>\n"
        "    on device <dev>, attached to interface\n"
        "    <interface>\n"
+#ifdef CONFIG_DFU_TIMEOUT
+       "    [<timeout>] - specify inactivity timeout in seconds\n"
+#endif
        "    [list] - list available alt settings\n"
 #endif
 #ifdef CONFIG_DFU_OVER_TFTP
index 1fff4390deae3edf95da847c0d31d7d8186cbf37..576e95b395dcd9f8efbb66967a292f163c108ee8 100644 (file)
@@ -251,27 +251,43 @@ static const struct {
                "PXE Base Code",
                EFI_PXE_BASE_CODE_PROTOCOL_GUID,
        },
+       /* Configuration table GUIDs */
+       {
+               "ACPI table",
+               EFI_ACPI_TABLE_GUID,
+       },
+       {
+               "device tree",
+               EFI_FDT_GUID,
+       },
+       {
+               "SMBIOS table",
+               SMBIOS_TABLE_GUID,
+       },
 };
 
 /**
- * get_guid_text - get string of protocol guid
- * @guid:      Protocol guid
- * Return:     String
+ * get_guid_text - get string of GUID
+ *
+ * Return description of GUID.
  *
- * Return string for display to represent the protocol.
+ * @guid:      GUID
+ * Return:     description of GUID or NULL
  */
-static const char *get_guid_text(const efi_guid_t *guid)
+static const char *get_guid_text(const void *guid)
 {
        int i;
 
-       for (i = 0; i < ARRAY_SIZE(guid_list); i++)
+       for (i = 0; i < ARRAY_SIZE(guid_list); i++) {
+               /*
+                * As guidcmp uses memcmp() we can safely accept unaligned
+                * GUIDs.
+                */
                if (!guidcmp(&guid_list[i].guid, guid))
-                       break;
+                       return guid_list[i].text;
+       }
 
-       if (i != ARRAY_SIZE(guid_list))
-               return guid_list[i].text;
-       else
-               return NULL;
+       return NULL;
 }
 
 /**
@@ -477,6 +493,34 @@ static int do_efi_show_memmap(cmd_tbl_t *cmdtp, int flag,
        return CMD_RET_SUCCESS;
 }
 
+/**
+ * do_efi_show_tables() - show UEFI configuration tables
+ *
+ * @cmdtp:     Command table
+ * @flag:      Command flag
+ * @argc:      Number of arguments
+ * @argv:      Argument array
+ * Return:     CMD_RET_SUCCESS on success, CMD_RET_RET_FAILURE on failure
+ *
+ * Implement efidebug "tables" sub-command.
+ * Show UEFI configuration tables.
+ */
+static int do_efi_show_tables(cmd_tbl_t *cmdtp, int flag,
+                             int argc, char * const argv[])
+{
+       efi_uintn_t i;
+       const char *guid_str;
+
+       for (i = 0; i < systab.nr_tables; ++i) {
+               guid_str = get_guid_text(&systab.tables[i].guid);
+               if (!guid_str)
+                       guid_str = "";
+               printf("%pUl %s\n", &systab.tables[i].guid, guid_str);
+       }
+
+       return CMD_RET_SUCCESS;
+}
+
 /**
  * do_efi_boot_add() - set UEFI load option
  *
@@ -1044,6 +1088,8 @@ static cmd_tbl_t cmd_efidebug_sub[] = {
                         "", ""),
        U_BOOT_CMD_MKENT(memmap, CONFIG_SYS_MAXARGS, 1, do_efi_show_memmap,
                         "", ""),
+       U_BOOT_CMD_MKENT(tables, CONFIG_SYS_MAXARGS, 1, do_efi_show_tables,
+                        "", ""),
 };
 
 /**
@@ -1103,15 +1149,17 @@ static char efidebug_help_text[] =
        "  - set/show UEFI boot order\n"
        "\n"
        "efidebug devices\n"
-       "  - show uefi devices\n"
+       "  - show UEFI devices\n"
        "efidebug drivers\n"
-       "  - show uefi drivers\n"
+       "  - show UEFI drivers\n"
        "efidebug dh\n"
-       "  - show uefi handles\n"
+       "  - show UEFI handles\n"
        "efidebug images\n"
        "  - show loaded images\n"
        "efidebug memmap\n"
-       "  - show uefi memory map\n";
+       "  - show UEFI memory map\n"
+       "efidebug tables\n"
+       "  - show UEFI configuration tables\n";
 #endif
 
 U_BOOT_CMD(
diff --git a/cmd/rng.c b/cmd/rng.c
new file mode 100644 (file)
index 0000000..36ca7a1
--- /dev/null
+++ b/cmd/rng.c
@@ -0,0 +1,56 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * The 'rng' command prints bytes from the hardware random number generator.
+ *
+ * Copyright (c) 2019, Heinrich Schuchardt <xypron.glpk@gmx.de>
+ */
+#include <common.h>
+#include <command.h>
+#include <dm.h>
+#include <hexdump.h>
+#include <rng.h>
+
+static int do_rng(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
+{
+       size_t n = 0x40;
+       struct udevice *dev;
+       void *buf;
+       int ret = CMD_RET_SUCCESS;
+
+       if (uclass_get_device(UCLASS_RNG, 0, &dev) || !dev) {
+               printf("No RNG device\n");
+               return CMD_RET_FAILURE;
+       }
+
+       if (argc >= 2)
+               n = simple_strtoul(argv[1], NULL, 16);
+
+       buf = malloc(n);
+       if (!buf) {
+               printf("Out of memory\n");
+               return CMD_RET_FAILURE;
+       }
+
+       if (dm_rng_read(dev, buf, n)) {
+               printf("Reading RNG failed\n");
+               ret = CMD_RET_FAILURE;
+       } else {
+               print_hex_dump_bytes("", DUMP_PREFIX_OFFSET, buf, n);
+       }
+
+       free(buf);
+
+       return ret;
+}
+
+#ifdef CONFIG_SYS_LONGHELP
+static char rng_help_text[] =
+       "[n]\n"
+       "  - print n random bytes\n";
+#endif
+
+U_BOOT_CMD(
+       rng, 2, 0, do_rng,
+       "print bytes from the hardware random number generator",
+       rng_help_text
+);
index d89ddc32b0d142831fa103476a97692b41d7942d..1d58462509cc07111c0eeadcd0029ffcee2b9705 100644 (file)
@@ -7,10 +7,12 @@
 #include <common.h>
 #include <bootm.h>
 #include <cpu_func.h>
+#include <efi_loader.h>
 #include <env.h>
 #include <fdt_support.h>
 #include <linux/libfdt.h>
 #include <malloc.h>
+#include <mapmem.h>
 #include <vxworks.h>
 #include <tee/optee.h>
 
@@ -498,6 +500,57 @@ static int do_bootm_tee(int flag, int argc, char * const argv[],
 }
 #endif
 
+#ifdef CONFIG_BOOTM_EFI
+static int do_bootm_efi(int flag, int argc, char * const argv[],
+                       bootm_headers_t *images)
+{
+       int ret;
+       efi_status_t efi_ret;
+       void *image_buf;
+
+       if (flag != BOOTM_STATE_OS_GO)
+               return 0;
+
+       /* Locate FDT, if provided */
+       ret = bootm_find_images(flag, argc, argv);
+       if (ret)
+               return ret;
+
+       /* Initialize EFI drivers */
+       efi_ret = efi_init_obj_list();
+       if (efi_ret != EFI_SUCCESS) {
+               printf("## Failed to initialize UEFI sub-system: r = %lu\n",
+                      efi_ret & ~EFI_ERROR_MASK);
+               return 1;
+       }
+
+       /* Install device tree */
+       efi_ret = efi_install_fdt(images->ft_len
+                                 ? images->ft_addr : EFI_FDT_USE_INTERNAL);
+       if (efi_ret != EFI_SUCCESS) {
+               printf("## Failed to install device tree: r = %lu\n",
+                      efi_ret & ~EFI_ERROR_MASK);
+               return 1;
+       }
+
+       /* Run EFI image */
+       printf("## Transferring control to EFI (at address %08lx) ...\n",
+              images->ep);
+       bootstage_mark(BOOTSTAGE_ID_RUN_OS);
+
+       image_buf = map_sysmem(images->ep, images->os.image_len);
+
+       efi_ret = efi_run_image(image_buf, images->os.image_len);
+       if (efi_ret != EFI_SUCCESS) {
+               printf("## Failed to run EFI image: r = %lu\n",
+                      efi_ret & ~EFI_ERROR_MASK);
+               return 1;
+       }
+
+       return 0;
+}
+#endif
+
 static boot_os_fn *boot_os[] = {
        [IH_OS_U_BOOT] = do_bootm_standalone,
 #ifdef CONFIG_BOOTM_LINUX
@@ -534,6 +587,9 @@ static boot_os_fn *boot_os[] = {
 #ifdef CONFIG_BOOTM_OPTEE
        [IH_OS_TEE] = do_bootm_tee,
 #endif
+#ifdef CONFIG_BOOTM_EFI
+       [IH_OS_EFI] = do_bootm_efi,
+#endif
 };
 
 /* Allow for arch specific config before we boot */
index 44d1484d3d277f5b17c4dce7c36d90ce78de6c51..da6289b218dd2aa66e1c6d91ee4b5bf25eedc637 100644 (file)
@@ -35,6 +35,10 @@ int run_usb_dnl_gadget(int usbctrl_index, char *usb_dnl_gadget)
                return CMD_RET_FAILURE;
        }
 
+#ifdef CONFIG_DFU_TIMEOUT
+       unsigned long start_time = get_timer(0);
+#endif
+
        while (1) {
                if (g_dnl_detach()) {
                        /*
@@ -79,6 +83,19 @@ int run_usb_dnl_gadget(int usbctrl_index, char *usb_dnl_gadget)
                        }
                }
 
+#ifdef CONFIG_DFU_TIMEOUT
+               unsigned long wait_time = dfu_get_timeout();
+
+               if (wait_time) {
+                       unsigned long current_time = get_timer(start_time);
+
+                       if (current_time > wait_time) {
+                               debug("Inactivity timeout, abort DFU\n");
+                               goto exit;
+                       }
+               }
+#endif
+
                WATCHDOG_RESET();
                usb_gadget_handle_interrupts(usbctrl_index);
        }
index c52f94512088dada17fd95bc4c47bfe9ec5c5d81..231612ff5f01a85c8b2efdf4c9d47dace10eccc1 100644 (file)
@@ -1926,7 +1926,8 @@ int fit_image_load(bootm_headers_t *images, ulong addr,
                image_type == IH_TYPE_FPGA ||
                fit_image_check_os(fit, noffset, IH_OS_LINUX) ||
                fit_image_check_os(fit, noffset, IH_OS_U_BOOT) ||
-               fit_image_check_os(fit, noffset, IH_OS_OPENRTOS);
+               fit_image_check_os(fit, noffset, IH_OS_OPENRTOS) ||
+               fit_image_check_os(fit, noffset, IH_OS_EFI);
 
        /*
         * If either of the checks fail, we should report an error, but
index eb626dcac92b0ad5b0a9ed7672b7e670756463a9..75d5dd944ff0487bb0d712b1388c149343ac30fc 100644 (file)
@@ -137,6 +137,7 @@ static const table_entry_t uimage_os[] = {
        {       IH_OS_OPENRTOS, "openrtos",     "OpenRTOS",             },
 #endif
        {       IH_OS_OPENSBI,  "opensbi",      "RISC-V OpenSBI",       },
+       {       IH_OS_EFI,      "efi",          "EFI Firmware" },
 
        {       -1,             "",             "",                     },
 };
index c527617e43402ffb65eaba6c80054e4eacd31e28..61488daa3c3df714a0b5e2a0cf1cd776296a7c84 100644 (file)
@@ -731,6 +731,12 @@ config SPL_UBI
          README.ubispl for more info.
 
 if SPL_DM
+config SPL_CACHE
+       depends on CACHE
+       bool "Support cache drivers in SPL"
+       help
+         Enable support for cache drivers in SPL.
+
 config SPL_DM_SPI
        bool "Support SPI DM drivers in SPL"
        help
index cbc00a4e7c5319c0b939ba0426ee57ae56a0b0f3..ac69d8312ee96aa46d718d82c032f80f8fae8651 100644 (file)
@@ -6,14 +6,20 @@
 
 #include <common.h>
 #include <errno.h>
+#include <board.h>
 #include <fpga.h>
 #include <gzip.h>
 #include <image.h>
-#include <linux/libfdt.h>
+#include <malloc.h>
 #include <spl.h>
+#include <linux/libfdt.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
+#ifndef CONFIG_SPL_LOAD_FIT_APPLY_OVERLAY_BUF_SZ
+#define CONFIG_SPL_LOAD_FIT_APPLY_OVERLAY_BUF_SZ (64 * 1024)
+#endif
+
 #ifndef CONFIG_SYS_BOOTM_LEN
 #define CONFIG_SYS_BOOTM_LEN   (64 << 20)
 #endif
@@ -27,6 +33,29 @@ __weak ulong board_spl_fit_size_align(ulong size)
        return size;
 }
 
+static int find_node_from_desc(const void *fit, int node, const char *str)
+{
+       int child;
+
+       if (node < 0)
+               return -EINVAL;
+
+       /* iterate the FIT nodes and find a matching description */
+       for (child = fdt_first_subnode(fit, node); child >= 0;
+            child = fdt_next_subnode(fit, child)) {
+               int len;
+               const char *desc = fdt_getprop(fit, child, "description", &len);
+
+               if (!desc)
+                       continue;
+
+               if (!strcmp(desc, str))
+                       return child;
+       }
+
+       return -ENOENT;
+}
+
 /**
  * spl_fit_get_image_name(): By using the matching configuration subnode,
  * retrieve the name of an image, specified by a property name and an index
@@ -41,12 +70,14 @@ __weak ulong board_spl_fit_size_align(ulong size)
  */
 static int spl_fit_get_image_name(const void *fit, int images,
                                  const char *type, int index,
-                                 char **outname)
+                                 const char **outname)
 {
+       struct udevice *board;
        const char *name, *str;
        __maybe_unused int node;
        int conf_node;
        int len, i;
+       bool found = true;
 
        conf_node = fit_find_config_node(fit);
        if (conf_node < 0) {
@@ -72,12 +103,45 @@ static int spl_fit_get_image_name(const void *fit, int images,
        for (i = 0; i < index; i++) {
                str = strchr(str, '\0') + 1;
                if (!str || (str - name >= len)) {
-                       debug("no string for index %d\n", index);
-                       return -E2BIG;
+                       found = false;
+                       break;
                }
        }
 
-       *outname = (char *)str;
+       if (!found && !board_get(&board)) {
+               int rc;
+               /*
+                * no string in the property for this index. Check if the board
+                * level code can supply one.
+                */
+               rc = board_get_fit_loadable(board, index - i - 1, type, &str);
+               if (rc && rc != -ENOENT)
+                       return rc;
+
+               if (!rc) {
+                       /*
+                        * The board provided a name for a loadable.
+                        * Try to match it against the description properties
+                        * first. If no matching node is found, use it as a
+                        * node name.
+                        */
+                       int node;
+                       int images = fdt_path_offset(fit, FIT_IMAGES_PATH);
+
+                       node = find_node_from_desc(fit, images, str);
+                       if (node > 0)
+                               str = fdt_get_name(fit, node, NULL);
+
+                       found = true;
+               }
+       }
+
+       if (!found) {
+               debug("no string for index %d\n", index);
+               return -E2BIG;
+       }
+
+       *outname = str;
        return 0;
 }
 
@@ -96,7 +160,7 @@ static int spl_fit_get_image_name(const void *fit, int images,
 static int spl_fit_get_image_node(const void *fit, int images,
                                  const char *type, int index)
 {
-       char *str;
+       const char *str;
        int err;
        int node;
 
@@ -108,7 +172,7 @@ static int spl_fit_get_image_node(const void *fit, int images,
 
        node = fdt_subnode_offset(fit, images, str);
        if (node < 0) {
-               debug("cannot find image node '%s': %d\n", str, node);
+               pr_err("cannot find image node '%s': %d\n", str, node);
                return -EINVAL;
        }
 
@@ -281,7 +345,7 @@ static int spl_fit_append_fdt(struct spl_image_info *spl_image,
                              void *fit, int images, ulong base_offset)
 {
        struct spl_image_info image_info;
-       int node, ret = 0;
+       int node, ret = 0, index = 0;
 
        /*
         * Use the address following the image as target address for the
@@ -290,7 +354,7 @@ static int spl_fit_append_fdt(struct spl_image_info *spl_image,
        image_info.load_addr = spl_image->load_addr + spl_image->size;
 
        /* Figure out which device tree the board wants to use */
-       node = spl_fit_get_image_node(fit, images, FIT_FDT_PROP, 0);
+       node = spl_fit_get_image_node(fit, images, FIT_FDT_PROP, index++);
        if (node < 0) {
                debug("%s: cannot find FDT node\n", __func__);
 
@@ -313,8 +377,65 @@ static int spl_fit_append_fdt(struct spl_image_info *spl_image,
        /* Make the load-address of the FDT available for the SPL framework */
        spl_image->fdt_addr = (void *)image_info.load_addr;
 #if !CONFIG_IS_ENABLED(FIT_IMAGE_TINY)
+       if (CONFIG_IS_ENABLED(LOAD_FIT_APPLY_OVERLAY)) {
+               void *tmpbuffer = NULL;
+
+               for (; ; index++) {
+                       node = spl_fit_get_image_node(fit, images, FIT_FDT_PROP,
+                                                     index);
+                       if (node == -E2BIG) {
+                               debug("%s: No additional FDT node\n", __func__);
+                               break;
+                       } else if (node < 0) {
+                               debug("%s: unable to find FDT node %d\n",
+                                     __func__, index);
+                               continue;
+                       }
+
+                       if (!tmpbuffer) {
+                               /*
+                                * allocate memory to store the DT overlay
+                                * before it is applied. It may not be used
+                                * depending on how the overlay is stored, so
+                                * don't fail yet if the allocation failed.
+                                */
+                               tmpbuffer = malloc(CONFIG_SPL_LOAD_FIT_APPLY_OVERLAY_BUF_SZ);
+                               if (!tmpbuffer)
+                                       debug("%s: unable to allocate space for overlays\n",
+                                             __func__);
+                       }
+                       image_info.load_addr = (ulong)tmpbuffer;
+                       ret = spl_load_fit_image(info, sector, fit, base_offset,
+                                                node, &image_info);
+                       if (ret < 0)
+                               break;
+
+                       /* Make room in FDT for changes from the overlay */
+                       ret = fdt_increase_size(spl_image->fdt_addr,
+                                               image_info.size);
+                       if (ret < 0)
+                               break;
+
+                       ret = fdt_overlay_apply_verbose(spl_image->fdt_addr,
+                                                       (void *)image_info.load_addr);
+                       if (ret) {
+                               pr_err("failed to apply DT overlay %s\n",
+                                      fit_get_name(fit, node, NULL));
+                               break;
+                       }
+
+                       debug("%s: DT overlay %s applied\n", __func__,
+                             fit_get_name(fit, node, NULL));
+               }
+               if (tmpbuffer)
+                       free(tmpbuffer);
+               if (ret)
+                       return ret;
+       }
        /* Try to make space, so we can inject details on the loadables */
        ret = fdt_shrink_to_minimum(spl_image->fdt_addr, 8192);
+       if (ret < 0)
+               return ret;
 #endif
 
        return ret;
@@ -325,7 +446,7 @@ static int spl_fit_record_loadable(const void *fit, int images, int index,
 {
        int ret = 0;
 #if !CONFIG_IS_ENABLED(FIT_IMAGE_TINY)
-       char *name;
+       const char *name;
        int node;
 
        ret = spl_fit_get_image_name(fit, images, "loadables",
@@ -373,6 +494,7 @@ int spl_load_simple_fit(struct spl_image_info *spl_image,
        int images, ret;
        int base_offset, hsize, align_len = ARCH_DMA_MINALIGN - 1;
        int index = 0;
+       int firmware_node;
 
        /*
         * For FIT with external data, figure out where the external images
@@ -502,6 +624,7 @@ int spl_load_simple_fit(struct spl_image_info *spl_image,
                spl_fit_append_fdt(spl_image, info, sector, fit,
                                   images, base_offset);
 
+       firmware_node = node;
        /* Now check if there are more images for us to load */
        for (; ; index++) {
                uint8_t os_type = IH_OS_INVALID;
@@ -510,6 +633,14 @@ int spl_load_simple_fit(struct spl_image_info *spl_image,
                if (node < 0)
                        break;
 
+               /*
+                * if the firmware is also a loadable, skip it because
+                * it already has been loaded. This is typically the case with
+                * u-boot.img generated by mkimage.
+                */
+               if (firmware_node == node)
+                       continue;
+
                ret = spl_load_fit_image(info, sector, fit, base_offset, node,
                                         &image_info);
                if (ret < 0)
index cccf1cca6f7e11b829c299ec327faf384c4f5ce2..14b2eec3ba99e8987945072e90f27c8019295e04 100644 (file)
@@ -33,6 +33,7 @@ CONFIG_SYS_REDUNDAND_ENVIRONMENT=y
 CONFIG_ENV_OFFSET_REDUND=0x600000
 CONFIG_SYS_RELOC_GD_ENV_ADDR=y
 CONFIG_CPU=y
+CONFIG_DFU_TIMEOUT=y
 CONFIG_DFU_MMC=y
 CONFIG_DFU_RAM=y
 CONFIG_SUPPORT_EMMC_BOOT=y
index 50b03d0763f501f964d6aa96b690dff0fae297bd..a63177e99d5efd2520a2b989e9aa3618d4375f25 100644 (file)
@@ -7,12 +7,15 @@ CONFIG_SPL_GPIO_SUPPORT=y
 CONFIG_SPL_LIBCOMMON_SUPPORT=y
 CONFIG_SPL_LIBGENERIC_SUPPORT=y
 CONFIG_SYS_MALLOC_F_LEN=0x10000
+CONFIG_SYS_I2C_MXC_I2C1=y
+CONFIG_SYS_I2C_MXC_I2C2=y
+CONFIG_SYS_I2C_MXC_I2C3=y
+CONFIG_ENV_SIZE=0x1000
+CONFIG_ENV_OFFSET=0x400000
 CONFIG_TARGET_IMX8MN_EVK=y
 CONFIG_SPL_MMC_SUPPORT=y
 CONFIG_SPL_SERIAL_SUPPORT=y
 CONFIG_SPL_DRIVERS_MISC_SUPPORT=y
-CONFIG_ENV_SIZE=0x1000
-CONFIG_ENV_OFFSET=0x400000
 CONFIG_SPL=y
 CONFIG_SPL_IMX_ROMAPI_LOADADDR=0x48000000
 CONFIG_SPL_TEXT_BASE=0x912000
@@ -32,6 +35,7 @@ CONFIG_HUSH_PARSER=y
 CONFIG_SYS_PROMPT="u-boot=> "
 # CONFIG_CMD_EXPORTENV is not set
 # CONFIG_CMD_IMPORTENV is not set
+CONFIG_CMD_ERASEENV=y
 # CONFIG_CMD_CRC32 is not set
 CONFIG_CMD_CLK=y
 CONFIG_CMD_FUSE=y
@@ -59,9 +63,6 @@ CONFIG_DM_GPIO=y
 CONFIG_MXC_GPIO=y
 CONFIG_DM_I2C=y
 CONFIG_SYS_I2C_MXC=y
-CONFIG_SYS_I2C_MXC_I2C1=y
-CONFIG_SYS_I2C_MXC_I2C2=y
-CONFIG_SYS_I2C_MXC_I2C3=y
 CONFIG_DM_MMC=y
 CONFIG_SUPPORT_EMMC_BOOT=y
 CONFIG_FSL_ESDHC_IMX=y
diff --git a/configs/imx8mp_evk_defconfig b/configs/imx8mp_evk_defconfig
new file mode 100644 (file)
index 0000000..61f0d91
--- /dev/null
@@ -0,0 +1,84 @@
+CONFIG_ARM=y
+CONFIG_SPL_SYS_ICACHE_OFF=y
+CONFIG_SPL_SYS_DCACHE_OFF=y
+CONFIG_ARCH_IMX8M=y
+CONFIG_SYS_TEXT_BASE=0x40200000
+CONFIG_SPL_GPIO_SUPPORT=y
+CONFIG_SPL_LIBCOMMON_SUPPORT=y
+CONFIG_SPL_LIBGENERIC_SUPPORT=y
+CONFIG_SYS_MALLOC_F_LEN=0x10000
+CONFIG_DM_GPIO=y
+CONFIG_TARGET_IMX8MP_EVK=y
+CONFIG_SPL_MMC_SUPPORT=y
+CONFIG_SPL_SERIAL_SUPPORT=y
+CONFIG_SPL_DRIVERS_MISC_SUPPORT=y
+CONFIG_ENV_SIZE=0x1000
+CONFIG_ENV_OFFSET=0x400000
+CONFIG_NR_DRAM_BANKS=2
+CONFIG_SPL=y
+CONFIG_SPL_IMX_ROMAPI_LOADADDR=0x48000000
+CONFIG_SPL_TEXT_BASE=0x920000
+CONFIG_FIT=y
+CONFIG_FIT_EXTERNAL_OFFSET=0x3000
+CONFIG_SPL_LOAD_FIT=y
+CONFIG_SPL_FIT_GENERATOR="arch/arm/mach-imx/mkimage_fit_atf.sh"
+CONFIG_OF_SYSTEM_SETUP=y
+CONFIG_SYS_EXTRA_OPTIONS="IMX_CONFIG=arch/arm/mach-imx/imx8m/imximage-8mp-lpddr4.cfg"
+CONFIG_DEFAULT_FDT_FILE="imx8mp-evk.dtb"
+CONFIG_BOARD_LATE_INIT=y
+CONFIG_BOARD_EARLY_INIT_F=y
+CONFIG_SPL_BOARD_INIT=y
+CONFIG_SPL_BOOTROM_SUPPORT=y
+CONFIG_SPL_SEPARATE_BSS=y
+CONFIG_SPL_I2C_SUPPORT=y
+CONFIG_SPL_POWER_SUPPORT=y
+CONFIG_SPL_WATCHDOG_SUPPORT=y
+CONFIG_HUSH_PARSER=y
+CONFIG_SYS_PROMPT="u-boot=> "
+# CONFIG_CMD_EXPORTENV is not set
+# CONFIG_CMD_IMPORTENV is not set
+# CONFIG_CMD_CRC32 is not set
+CONFIG_CMD_CLK=y
+CONFIG_CMD_FUSE=y
+CONFIG_CMD_GPIO=y
+CONFIG_CMD_I2C=y
+CONFIG_CMD_MMC=y
+CONFIG_CMD_CACHE=y
+CONFIG_CMD_REGULATOR=y
+CONFIG_CMD_EXT2=y
+CONFIG_CMD_EXT4=y
+CONFIG_CMD_EXT4_WRITE=y
+CONFIG_CMD_FAT=y
+CONFIG_OF_CONTROL=y
+CONFIG_SPL_OF_CONTROL=y
+CONFIG_DEFAULT_DEVICE_TREE="imx8mp-evk"
+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_CLK_COMPOSITE_CCF=y
+CONFIG_CLK_IMX8MP=y
+CONFIG_MXC_GPIO=y
+CONFIG_DM_PCA953X=y
+CONFIG_DM_I2C=y
+CONFIG_SYS_I2C_MXC=y
+CONFIG_SYS_I2C_MXC_I2C1=y
+CONFIG_SYS_I2C_MXC_I2C2=y
+CONFIG_SYS_I2C_MXC_I2C3=y
+CONFIG_LED=y
+CONFIG_LED_GPIO=y
+CONFIG_DM_MMC=y
+CONFIG_SUPPORT_EMMC_BOOT=y
+CONFIG_MMC_IO_VOLTAGE=y
+CONFIG_FSL_ESDHC_IMX=y
+CONFIG_PHYLIB=y
+CONFIG_DM_ETH=y
+CONFIG_PINCTRL=y
+CONFIG_SPL_PINCTRL=y
+CONFIG_PINCTRL_IMX8M=y
+CONFIG_DM_REGULATOR=y
+CONFIG_DM_REGULATOR_FIXED=y
+CONFIG_DM_REGULATOR_GPIO=y
+CONFIG_MXC_UART=y
+CONFIG_SYSRESET=y
+CONFIG_SYSRESET_PSCI=y
diff --git a/configs/khadas-vim3l_defconfig b/configs/khadas-vim3l_defconfig
new file mode 100644 (file)
index 0000000..51e0f80
--- /dev/null
@@ -0,0 +1,62 @@
+CONFIG_ARM=y
+CONFIG_SYS_BOARD="w400"
+CONFIG_ARCH_MESON=y
+CONFIG_SYS_TEXT_BASE=0x01000000
+CONFIG_MESON_G12A=y
+CONFIG_ENV_SIZE=0x2000
+CONFIG_NR_DRAM_BANKS=1
+CONFIG_DEBUG_UART_BASE=0xff803000
+CONFIG_DEBUG_UART_CLOCK=24000000
+CONFIG_IDENT_STRING=" khadas-vim3l"
+CONFIG_DEBUG_UART=y
+CONFIG_OF_BOARD_SETUP=y
+CONFIG_MISC_INIT_R=y
+# CONFIG_DISPLAY_CPUINFO is not set
+# CONFIG_CMD_BDI is not set
+# CONFIG_CMD_IMI is not set
+CONFIG_CMD_GPIO=y
+# CONFIG_CMD_LOADS is not set
+CONFIG_CMD_MMC=y
+CONFIG_CMD_USB=y
+CONFIG_CMD_USB_MASS_STORAGE=y
+# CONFIG_CMD_SETEXPR is not set
+CONFIG_CMD_REGULATOR=y
+CONFIG_OF_CONTROL=y
+CONFIG_DEFAULT_DEVICE_TREE="meson-sm1-khadas-vim3l"
+CONFIG_SYS_RELOC_GD_ENV_ADDR=y
+CONFIG_NET_RANDOM_ETHADDR=y
+CONFIG_DM_GPIO=y
+CONFIG_DM_MMC=y
+CONFIG_MMC_MESON_GX=y
+CONFIG_PHY_REALTEK=y
+CONFIG_DM_ETH=y
+CONFIG_ETH_DESIGNWARE=y
+CONFIG_MESON_G12A_USB_PHY=y
+CONFIG_PINCTRL=y
+CONFIG_PINCTRL_MESON_G12A=y
+CONFIG_POWER_DOMAIN=y
+CONFIG_MESON_EE_POWER_DOMAIN=y
+CONFIG_DM_REGULATOR=y
+CONFIG_DM_REGULATOR_FIXED=y
+CONFIG_DM_RESET=y
+CONFIG_DEBUG_UART_MESON=y
+CONFIG_DEBUG_UART_ANNOUNCE=y
+CONFIG_DEBUG_UART_SKIP_INIT=y
+CONFIG_MESON_SERIAL=y
+CONFIG_USB=y
+CONFIG_DM_USB=y
+CONFIG_USB_XHCI_HCD=y
+CONFIG_USB_XHCI_DWC3=y
+CONFIG_USB_DWC3=y
+# CONFIG_USB_DWC3_GADGET is not set
+CONFIG_USB_DWC3_MESON_G12A=y
+CONFIG_USB_GADGET=y
+CONFIG_USB_GADGET_VENDOR_NUM=0x1b8e
+CONFIG_USB_GADGET_PRODUCT_NUM=0xfada
+CONFIG_USB_GADGET_DWC2_OTG=y
+CONFIG_USB_GADGET_DWC2_OTG_PHY_BUS_WIDTH_8=y
+CONFIG_USB_GADGET_DOWNLOAD=y
+CONFIG_DM_VIDEO=y
+CONFIG_VIDEO_MESON=y
+CONFIG_VIDEO_DT_SIMPLEFB=y
+CONFIG_OF_LIBFDT_OVERLAY=y
index b7c320743a450a9b31041f70adf470e319d18f62..50d0aa5bf54dbef6a7957486d3eec5704443dce8 100644 (file)
@@ -6,6 +6,11 @@ CONFIG_NR_DRAM_BANKS=1
 CONFIG_ENV_SECT_SIZE=0x40000
 CONFIG_AHCI=y
 CONFIG_DISTRO_DEFAULTS=y
+CONFIG_FIT=y
+CONFIG_FIT_SIGNATURE=y
+CONFIG_FIT_VERBOSE=y
+CONFIG_FIT_BEST_MATCH=y
+CONFIG_LEGACY_IMAGE_FORMAT=y
 CONFIG_USE_PREBOOT=y
 CONFIG_PREBOOT="pci enum"
 # CONFIG_DISPLAY_CPUINFO is not set
index 521c6793a314ee6a6e87797cd41e9f607a41745a..ff97d6bd83f0595a911f44dc95d9e8dfe508af90 100644 (file)
@@ -7,6 +7,11 @@ CONFIG_NR_DRAM_BANKS=1
 CONFIG_ENV_SECT_SIZE=0x40000
 CONFIG_AHCI=y
 CONFIG_DISTRO_DEFAULTS=y
+CONFIG_FIT=y
+CONFIG_FIT_SIGNATURE=y
+CONFIG_FIT_VERBOSE=y
+CONFIG_FIT_BEST_MATCH=y
+CONFIG_LEGACY_IMAGE_FORMAT=y
 CONFIG_USE_PREBOOT=y
 CONFIG_PREBOOT="pci enum"
 # CONFIG_DISPLAY_CPUINFO is not set
index b06ffcec3a3c5a855a1164aceece556745b23e07..64d1d3102f67f4895449d7d357f37a02b4caedf0 100644 (file)
@@ -161,6 +161,8 @@ CONFIG_REGULATOR_RK8XX=y
 CONFIG_REGULATOR_S5M8767=y
 CONFIG_DM_REGULATOR_SANDBOX=y
 CONFIG_REGULATOR_TPS65090=y
+CONFIG_DM_RNG=y
+CONFIG_RNG_SANDBOX=y
 CONFIG_DM_PWM=y
 CONFIG_PWM_SANDBOX=y
 CONFIG_RAM=y
index 858ad04b10fcff3cc9cadcb72688047bf2aa540a..d8d8645425e68bad08d5b114b4caa9930e49d80c 100644 (file)
@@ -181,6 +181,8 @@ CONFIG_REGULATOR_RK8XX=y
 CONFIG_REGULATOR_S5M8767=y
 CONFIG_DM_REGULATOR_SANDBOX=y
 CONFIG_REGULATOR_TPS65090=y
+CONFIG_DM_RNG=y
+CONFIG_RNG_SANDBOX=y
 CONFIG_DM_PWM=y
 CONFIG_PWM_SANDBOX=y
 CONFIG_RAM=y
diff --git a/configs/socfpga_agilex_defconfig b/configs/socfpga_agilex_defconfig
new file mode 100644 (file)
index 0000000..cdb9396
--- /dev/null
@@ -0,0 +1,60 @@
+CONFIG_ARM=y
+CONFIG_ARCH_SOCFPGA=y
+CONFIG_SYS_TEXT_BASE=0x1000
+CONFIG_SYS_MALLOC_F_LEN=0x2000
+CONFIG_ENV_SIZE=0x1000
+CONFIG_ENV_OFFSET=0x200
+CONFIG_NR_DRAM_BANKS=2
+CONFIG_TARGET_SOCFPGA_AGILEX_SOCDK=y
+CONFIG_IDENT_STRING="socfpga_agilex"
+CONFIG_SPL_FS_FAT=y
+CONFIG_SPL_TEXT_BASE=0xFFE00000
+CONFIG_BOOTDELAY=5
+CONFIG_SPL_CACHE=y
+CONFIG_SPL_SPI_LOAD=y
+CONFIG_SYS_SPI_U_BOOT_OFFS=0x3c00000
+CONFIG_HUSH_PARSER=y
+CONFIG_SYS_PROMPT="SOCFPGA_AGILEX # "
+CONFIG_CMD_MEMTEST=y
+# CONFIG_CMD_FLASH is not set
+CONFIG_CMD_GPIO=y
+CONFIG_CMD_I2C=y
+CONFIG_CMD_MMC=y
+CONFIG_CMD_SPI=y
+CONFIG_CMD_USB=y
+CONFIG_CMD_DHCP=y
+CONFIG_CMD_MII=y
+CONFIG_CMD_PING=y
+CONFIG_CMD_CACHE=y
+CONFIG_CMD_EXT4=y
+CONFIG_CMD_FAT=y
+CONFIG_CMD_FS_GENERIC=y
+CONFIG_OF_EMBED=y
+CONFIG_DEFAULT_DEVICE_TREE="socfpga_agilex_socdk"
+CONFIG_ENV_IS_IN_MMC=y
+CONFIG_NET_RANDOM_ETHADDR=y
+CONFIG_SPL_DM_SEQ_ALIAS=y
+CONFIG_SPL_ALTERA_SDRAM=y
+CONFIG_DM_GPIO=y
+CONFIG_DWAPB_GPIO=y
+CONFIG_DM_I2C=y
+CONFIG_SYS_I2C_DW=y
+CONFIG_DM_MMC=y
+CONFIG_MMC_DW=y
+CONFIG_SF_DEFAULT_MODE=0x2003
+CONFIG_SPI_FLASH_SPANSION=y
+CONFIG_SPI_FLASH_STMICRO=y
+CONFIG_PHY_MICREL=y
+CONFIG_PHY_MICREL_KSZ90X1=y
+CONFIG_DM_ETH=y
+CONFIG_ETH_DESIGNWARE=y
+CONFIG_MII=y
+CONFIG_DM_RESET=y
+CONFIG_SPI=y
+CONFIG_CADENCE_QSPI=y
+CONFIG_DESIGNWARE_SPI=y
+CONFIG_USB=y
+CONFIG_DM_USB=y
+CONFIG_USB_DWC2=y
+CONFIG_USB_STORAGE=y
+# CONFIG_SPL_USE_TINY_PRINTF is not set
index 713a7e6c57155df22a3be91b2160e62449225e73..c85369ca0fb285296c8f3accacc4d9c5d4486864 100644 (file)
@@ -143,3 +143,5 @@ CONFIG_VIDEO_STM32_DSI=y
 CONFIG_VIDEO_STM32_MAX_XRES=1280
 CONFIG_VIDEO_STM32_MAX_YRES=800
 CONFIG_FDT_FIXUP_PARTITIONS=y
+CONFIG_DM_RNG=y
+CONFIG_RNG_STM32MP1=y
index f9161fd7d1d6c76f9e19e5cc822e02957f87a005..c192d8d441f0fb6d77ead0592c7a50c7b907eff0 100644 (file)
@@ -127,3 +127,5 @@ CONFIG_VIDEO_STM32_DSI=y
 CONFIG_VIDEO_STM32_MAX_XRES=1280
 CONFIG_VIDEO_STM32_MAX_YRES=800
 CONFIG_FDT_FIXUP_PARTITIONS=y
+CONFIG_DM_RNG=y
+CONFIG_RNG_STM32MP1=y
index a5ea528ae35923b582529e77c745882c2d330e59..a846962af503fe0fa5d2781aa5a14952580a19df 100644 (file)
@@ -126,3 +126,5 @@ CONFIG_VIDEO_STM32_DSI=y
 CONFIG_VIDEO_STM32_MAX_XRES=1280
 CONFIG_VIDEO_STM32_MAX_YRES=800
 CONFIG_FDT_FIXUP_PARTITIONS=y
+CONFIG_DM_RNG=y
+CONFIG_RNG_STM32MP1=y
index 112234df9fa16616426ca856d4f10638a90387fe..3a9290b7e9dfe8f478588c9d55bc73e2e8088844 100644 (file)
@@ -23,6 +23,7 @@ CONFIG_CMD_GPIO=y
 CONFIG_CMD_GPT=y
 CONFIG_CMD_I2C=y
 CONFIG_CMD_MMC=y
+CONFIG_CMD_SPI=y
 CONFIG_CMD_USB=y
 CONFIG_CMD_TFTPPUT=y
 CONFIG_CMD_CACHE=y
@@ -52,6 +53,9 @@ CONFIG_NAND_DENALI_SPARE_AREA_SKIP_BYTES=8
 CONFIG_SPL_NAND_DENALI=y
 CONFIG_DM_ETH=y
 CONFIG_SNI_AVE=y
+CONFIG_SPI=y
+CONFIG_DM_SPI=y
+CONFIG_UNIPHIER_SPI=y
 CONFIG_USB=y
 CONFIG_USB_XHCI_HCD=y
 CONFIG_USB_XHCI_DWC3=y
index 5acb1437bcfbf0e7f4b8008e764fa6e8b66ad736..b8f4a4ec6a5731b35ed228d4d2ce3a2effbb077b 100644 (file)
@@ -21,6 +21,7 @@ CONFIG_CMD_GPIO=y
 CONFIG_CMD_GPT=y
 CONFIG_CMD_I2C=y
 CONFIG_CMD_MMC=y
+CONFIG_CMD_SPI=y
 CONFIG_CMD_USB=y
 CONFIG_CMD_TFTPPUT=y
 CONFIG_CMD_CACHE=y
@@ -53,6 +54,9 @@ CONFIG_NAND_DENALI_SPARE_AREA_SKIP_BYTES=8
 CONFIG_DM_ETH=y
 CONFIG_SNI_AVE=y
 CONFIG_PINCONF=y
+CONFIG_SPI=y
+CONFIG_DM_SPI=y
+CONFIG_UNIPHIER_SPI=y
 CONFIG_SYSRESET=y
 CONFIG_SYSRESET_PSCI=y
 CONFIG_USB=y
index 558d347c267ef15aaaac0657c4fb5d9c04eba6ab..caf1c9998cf94ae26ad8c792c2b969fed9bb446a 100644 (file)
@@ -43,6 +43,7 @@ Configuration Options:
   CONFIG_DFU_RAM
   CONFIG_DFU_SF
   CONFIG_DFU_SF_PART
+  CONFIG_DFU_TIMEOUT
   CONFIG_DFU_VIRTUAL
   CONFIG_CMD_DFU
 
@@ -70,12 +71,15 @@ Commands:
   dfu <USB_controller> [<interface> <dev>] list
     list the alternate device defined in "dfu_alt_info"
 
-  dfu <USB_controller> [<interface> <dev>]
+  dfu <USB_controller> [<interface> <dev>] [<timeout>]
     start the dfu stack on the USB instance with the selected medium
     backend and use the "dfu_alt_info" variable to configure the
     alternate setting and link each one with the medium
     The dfu command continue until receive a ^C in console or
-    a DFU detach transaction from HOST.
+    a DFU detach transaction from HOST. If CONFIG_DFU_TIMEOUT option
+    is enabled and <timeout> parameter is present in the command line,
+    the DFU operation will be aborted automatically after <timeout>
+    seconds of waiting remote to initiate DFU session.
 
   The possible values of <interface> are :
   (with <USB controller> = 0 in the dfu command example)
diff --git a/doc/uImage.FIT/uefi.its b/doc/uImage.FIT/uefi.its
new file mode 100644 (file)
index 0000000..378ca4e
--- /dev/null
@@ -0,0 +1,67 @@
+/*
+ * Example FIT image description file demonstrating the usage of the
+ * bootm command to launch UEFI binaries.
+ *
+ * Two boot configurations are available to enable booting GRUB2 on QEMU,
+ * the former uses a FDT blob contained in the FIT image, while the later
+ * relies on the FDT provided by the board emulator.
+ */
+
+/dts-v1/;
+
+/ {
+       description = "GRUB2 EFI and QEMU FDT blob";
+       #address-cells = <1>;
+
+       images {
+               efi-grub {
+                       description = "GRUB EFI Firmware";
+                       data = /incbin/("bootarm.efi");
+                       type = "kernel_noload";
+                       arch = "arm";
+                       os = "efi";
+                       compression = "none";
+                       load = <0x0>;
+                       entry = <0x0>;
+                       hash-1 {
+                               algo = "sha256";
+                       };
+               };
+
+               fdt-qemu {
+                       description = "QEMU DTB";
+                       data = /incbin/("qemu-arm.dtb");
+                       type = "flat_dt";
+                       arch = "arm";
+                       compression = "none";
+                       hash-1 {
+                               algo = "sha256";
+                       };
+               };
+       };
+
+       configurations {
+               default = "config-grub-fdt";
+
+               config-grub-fdt {
+                       description = "GRUB EFI Boot w/ FDT";
+                       kernel = "efi-grub";
+                       fdt = "fdt-qemu";
+                       signature-1 {
+                               algo = "sha256,rsa2048";
+                               key-name-hint = "dev";
+                               sign-images = "kernel", "fdt";
+                       };
+               };
+
+               config-grub-nofdt {
+                       description = "GRUB EFI Boot w/o FDT";
+                       kernel = "efi-grub";
+                       signature-1 {
+                               algo = "sha256,rsa2048";
+                               key-name-hint = "dev";
+                               sign-images = "kernel";
+                       };
+               };
+       };
+};
index db942df694f9575e6c970dd8497c04d3fe34eb77..a8fd886d6b5ebd3d4516fc4033aee6e4f8db35d7 100644 (file)
@@ -63,6 +63,40 @@ The environment variable 'bootargs' is passed as load options in the UEFI system
 table. The Linux kernel EFI stub uses the load options as command line
 arguments.
 
+Launching a UEFI binary from a FIT image
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+A signed FIT image can be used to securely boot a UEFI image via the
+bootm command. This feature is available if U-Boot is configured with::
+
+    CONFIG_BOOTM_EFI=y
+
+A sample configuration is provided as file doc/uImage.FIT/uefi.its.
+
+Below you find the output of an example session starting GRUB::
+
+    => load mmc 0:1 ${kernel_addr_r} image.fit
+    4620426 bytes read in 83 ms (53.1 MiB/s)
+    => bootm ${kernel_addr_r}#config-grub-nofdt
+    ## Loading kernel from FIT Image at 40400000 ...
+       Using 'config-grub-nofdt' configuration
+       Verifying Hash Integrity ... sha256,rsa2048:dev+ OK
+       Trying 'efi-grub' kernel subimage
+         Description:  GRUB EFI Firmware
+         Created:      2019-11-20   8:18:16 UTC
+         Type:         Kernel Image (no loading done)
+         Compression:  uncompressed
+         Data Start:   0x404000d0
+         Data Size:    450560 Bytes = 440 KiB
+         Hash algo:    sha256
+         Hash value:   4dbee00021112df618f58b3f7cf5e1595533d543094064b9ce991e8b054a9eec
+       Verifying Hash Integrity ... sha256+ OK
+       XIP Kernel Image (no loading done)
+    ## Transferring control to EFI (at address 404000d0) ...
+    Welcome to GRUB!
+
+See doc/uImage.FIT/howto.txt for an introduction to FIT images.
+
 Executing the boot manager
 ~~~~~~~~~~~~~~~~~~~~~~~~~~
 
index 9d99ce022619bf23e7dbed668218613cc9d4722c..e34a22708c3ff08ceac7db2011c8dfbc1d323ea4 100644 (file)
@@ -90,6 +90,8 @@ source "drivers/remoteproc/Kconfig"
 
 source "drivers/reset/Kconfig"
 
+source "drivers/rng/Kconfig"
+
 source "drivers/rtc/Kconfig"
 
 source "drivers/scsi/Kconfig"
index cb8c215e76700b873ea331cb2ab47ce1bec48f2f..e7b5d22b1da13ff0f07d84d051ea85c54648cde7 100644 (file)
@@ -1,5 +1,6 @@
 # SPDX-License-Identifier: GPL-2.0+
 
+obj-$(CONFIG_$(SPL_TPL_)CACHE) += cache/
 obj-$(CONFIG_$(SPL_TPL_)CLK) += clk/
 obj-$(CONFIG_$(SPL_TPL_)DM) += core/
 obj-$(CONFIG_$(SPL_TPL_)DFU) += dfu/
@@ -26,6 +27,7 @@ obj-$(CONFIG_$(SPL_)DM_MAILBOX) += mailbox/
 obj-$(CONFIG_$(SPL_)REMOTEPROC) += remoteproc/
 obj-$(CONFIG_$(SPL_TPL_)TPM) += tpm/
 obj-$(CONFIG_$(SPL_TPL_)ACPI_PMC) += power/acpi_pmc/
+obj-$(CONFIG_$(SPL_)BOARD) += board/
 
 ifndef CONFIG_TPL_BUILD
 ifdef CONFIG_SPL_BUILD
@@ -75,7 +77,6 @@ obj-y += ata/
 obj-$(CONFIG_DM_DEMO) += demo/
 obj-$(CONFIG_BIOSEMU) += bios_emulator/
 obj-y += block/
-obj-y += board/
 obj-$(CONFIG_BOOTCOUNT_LIMIT) += bootcount/
 obj-y += cache/
 obj-$(CONFIG_CPU) += cpu/
@@ -116,4 +117,5 @@ obj-$(CONFIG_W1_EEPROM) += w1-eeprom/
 
 obj-$(CONFIG_MACH_PIC32) += ddr/microchip/
 obj-$(CONFIG_DM_HWSPINLOCK) += hwspinlock/
+obj-$(CONFIG_DM_RNG) += rng/
 endif
index 6609bf8a761e20999a0d938bf6a865173ca61268..c6680dc1c98f06c572ced5a371d0bf910b913a54 100644 (file)
@@ -22,6 +22,7 @@
 #include <dm.h>
 #include <ahci.h>
 #include <blk.h>
+#include <dm/device-internal.h>
 #else
 #ifndef CONFIG_SYS_SATA1_FLAGS
        #define CONFIG_SYS_SATA1_FLAGS  FLAGS_DMA
@@ -122,7 +123,7 @@ static int init_sata(struct fsl_ata_priv *priv, int dev)
        /* Zero all of the device driver struct */
        memset((void *)sata, 0, sizeof(fsl_sata_t));
 
-       snprintf(sata->name, 12, "SATA%d:\n", dev);
+       snprintf(sata->name, 12, "SATA%d:", dev);
 
        /* Set the controller register base address to device struct */
 #if !CONFIG_IS_ENABLED(BLK)
@@ -233,10 +234,7 @@ static int init_sata(struct fsl_ata_priv *priv, int dev)
        mdelay(100);
 
        /* print sata device name */
-       if (!dev)
-               printf("%s ", sata->name);
-       else
-               printf("       %s ", sata->name);
+       printf("%s ", sata->name);
 
        /* Wait PHY RDY signal changed for 500ms */
        ata_wait_register(&reg->hstatus, HSTATUS_PHY_RDY,
@@ -917,15 +915,32 @@ static int fsl_ata_ofdata_to_platdata(struct udevice *dev)
        return 0;
 }
 
+static int fsl_unbind_device(struct udevice *dev)
+{
+       int ret;
+
+       ret = device_remove(dev, DM_REMOVE_NORMAL);
+       if (ret)
+               return ret;
+
+       ret = device_unbind(dev);
+       if (ret)
+               return ret;
+
+       return 0;
+}
+
 static int fsl_ata_probe(struct udevice *dev)
 {
        struct fsl_ata_priv *blk_priv, *priv;
        struct udevice *blk;
+       int failed_number;
        char sata_name[10];
        int nr_ports;
        int ret;
        int i;
 
+       failed_number = 0;
        priv = dev_get_priv(dev);
        nr_ports = priv->number;
        nr_ports = min(nr_ports, CONFIG_SYS_SATA_MAX_DEVICE);
@@ -943,7 +958,12 @@ static int fsl_ata_probe(struct udevice *dev)
                ret = init_sata(priv, i);
                if (ret) {
                        debug("%s: Failed to init sata\n", __func__);
-                       return ret;
+                       ret = fsl_unbind_device(blk);
+                       if (ret)
+                               return ret;
+
+                       failed_number++;
+                       continue;
                }
 
                blk_priv = dev_get_platdata(blk);
@@ -952,10 +972,33 @@ static int fsl_ata_probe(struct udevice *dev)
                ret = scan_sata(blk);
                if (ret) {
                        debug("%s: Failed to scan bus\n", __func__);
-                       return ret;
+                       ret = fsl_unbind_device(blk);
+                       if (ret)
+                               return ret;
+
+                       failed_number++;
+                       continue;
                }
        }
 
+       if (failed_number == nr_ports)
+               return -ENODEV;
+       else
+               return 0;
+}
+
+static int fsl_ata_remove(struct udevice *dev)
+{
+       fsl_sata_t *sata;
+       struct fsl_ata_priv *priv;
+
+       priv = dev_get_priv(dev);
+       sata = priv->fsl_sata;
+
+       free(sata->cmd_hdr_tbl_offset);
+       free(sata->cmd_desc_offset);
+       free(sata);
+
        return 0;
 }
 
@@ -982,6 +1025,7 @@ U_BOOT_DRIVER(fsl_ahci) = {
        .ops = &sata_fsl_ahci_ops,
        .ofdata_to_platdata = fsl_ata_ofdata_to_platdata,
        .probe  = fsl_ata_probe,
+       .remove = fsl_ata_remove,
        .priv_auto_alloc_size = sizeof(struct fsl_ata_priv),
 };
 #endif
index 4a50460c5ac419196c69a20f3aa97bb213f9f711..71ee0c04efaf8e6b38f30c940abc4e8d02d16e06 100644 (file)
@@ -20,6 +20,7 @@
 #if CONFIG_IS_ENABLED(BLK)
 #include <dm.h>
 #include <blk.h>
+#include <dm/device-internal.h>
 #endif
 
 #include "sata_sil.h"
@@ -763,15 +764,33 @@ U_BOOT_DRIVER(sata_sil_driver) = {
        .platdata_auto_alloc_size = sizeof(struct sil_sata_priv),
 };
 
+static int sil_unbind_device(struct udevice *dev)
+{
+       int ret;
+
+       ret = device_remove(dev, DM_REMOVE_NORMAL);
+       if (ret)
+               return ret;
+
+       ret = device_unbind(dev);
+       if (ret)
+               return ret;
+
+       return 0;
+}
+
 static int sil_pci_probe(struct udevice *dev)
 {
        struct udevice *blk;
+       int failed_number;
        char sata_name[10];
        pci_dev_t devno;
        u16 word;
        int ret;
        int i;
 
+       failed_number = 0;
+
        /* Get PCI device number */
        devno = dm_pci_get_bdf(dev);
        if (devno == -1)
@@ -824,12 +843,44 @@ static int sil_pci_probe(struct udevice *dev)
                }
 
                ret = sil_init_sata(blk, i);
-               if (ret)
-                       return -ENODEV;
+               if (ret) {
+                       ret = sil_unbind_device(blk);
+                       if (ret)
+                               return ret;
+
+                       failed_number++;
+                       continue;
+               }
 
                ret = scan_sata(blk, i);
-               if (ret)
-                       return -ENODEV;
+               if (ret) {
+                       ret = sil_unbind_device(blk);
+                       if (ret)
+                               return ret;
+
+                       failed_number++;
+                       continue;
+               }
+       }
+
+       if (failed_number == sata_info.maxport)
+               return -ENODEV;
+       else
+               return 0;
+}
+
+static int sil_pci_remove(struct udevice *dev)
+{
+       int i;
+       struct sil_sata *sata;
+       struct sil_sata_priv *priv;
+
+       priv = dev_get_priv(dev);
+
+       for (i = sata_info.portbase; i < sata_info.maxport; i++) {
+               sata = priv->sil_sata_desc[i];
+               if (sata)
+                       free(sata);
        }
 
        return 0;
@@ -857,6 +908,7 @@ U_BOOT_DRIVER(sil_ahci_pci) = {
        .of_match = sil_pci_ids,
        .ops = &sata_sil_ops,
        .probe = sil_pci_probe,
+       .remove = sil_pci_remove,
        .priv_auto_alloc_size = sizeof(struct sil_sata_priv),
 };
 
index 2a3fc9c049be06eec89d29e1923fc16404d1cccc..254f657049df00eec9554ff69a7c0bee9634b510 100644 (file)
@@ -8,6 +8,9 @@ menuconfig BOARD
 
 if BOARD
 
+config SPL_BOARD
+       depends on SPL_DM
+       bool "Enable board driver support in SPL"
 
 config BOARD_GAZERBEAM
        bool "Enable board driver for the Gazerbeam board"
index c8dab4fa0bad0d71cbbc59cc173e8ad93206c85f..cc16361755a1704a74ff8175d6dc3ff4f732a6a9 100644 (file)
@@ -2,6 +2,6 @@
 #
 # (C) Copyright 2017
 # Mario Six,  Guntermann & Drunck GmbH, mario.six@gdsys.cc
-obj-$(CONFIG_BOARD) += board-uclass.o
+obj-y += board-uclass.o
 obj-$(CONFIG_BOARD_GAZERBEAM) += gazerbeam.o
 obj-$(CONFIG_BOARD_SANDBOX) += sandbox.o
index a516ba49629c6b868bd3b7ac22b2b0c2817cf0bd..b5485e9895b8b9a529bc617dcdddb14bc1931fd2 100644 (file)
@@ -23,6 +23,17 @@ int board_detect(struct udevice *dev)
        return ops->detect(dev);
 }
 
+int board_get_fit_loadable(struct udevice *dev, int index,
+                          const char *type, const char **strp)
+{
+       struct board_ops *ops = board_get_ops(dev);
+
+       if (!ops->get_fit_loadable)
+               return -ENOSYS;
+
+       return ops->get_fit_loadable(dev, index, type, strp);
+}
+
 int board_get_bool(struct udevice *dev, int id, bool *val)
 {
        struct board_ops *ops = board_get_ops(dev);
index 629039e7a88fb973aabe1289aebb0f4ca036ae34..1e452ad6d9f86b4fee096f47b5d86606201c6862 100644 (file)
@@ -31,4 +31,12 @@ config V5L2_CACHE
          It will configure tag and data ram timing control from the
          device tree and enable L2 cache.
 
+config NCORE_CACHE
+       bool "Arteris Ncore cache coherent unit driver"
+       select CACHE
+       help
+         This driver is for the Arteris Ncore cache coherent unit (CCU)
+         controller. The driver initializes cache directories and coherent
+         agent interfaces.
+
 endmenu
index 4a6458c6027b483842976896ed118e5a4b50bdc6..fed50be3f983a8577592be8f0b93b6cbcec30dd8 100644 (file)
@@ -1,5 +1,6 @@
 
-obj-$(CONFIG_CACHE) += cache-uclass.o
+obj-$(CONFIG_$(SPL_TPL_)CACHE) += cache-uclass.o
 obj-$(CONFIG_SANDBOX) += sandbox_cache.o
 obj-$(CONFIG_L2X0_CACHE) += cache-l2x0.o
+obj-$(CONFIG_NCORE_CACHE) += cache-ncore.o
 obj-$(CONFIG_V5L2_CACHE) += cache-v5l2.o
diff --git a/drivers/cache/cache-ncore.c b/drivers/cache/cache-ncore.c
new file mode 100644 (file)
index 0000000..e3aca36
--- /dev/null
@@ -0,0 +1,164 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (C) 2019 Intel Corporation <www.intel.com>
+ *
+ */
+#include <dm.h>
+#include <wait_bit.h>
+
+#include <asm/io.h>
+
+/* Directory */
+#define DIRUSFER               0x80010
+#define DIRUCASER0             0x80040
+#define DIRUSFMCR              0x80080
+#define DIRUSFMAR              0x80084
+
+#define DIRUSFMCR_SFID_SHIFT   16
+
+/* Coherent cache agent interface */
+#define CAIUIDR                        0x00ffc
+
+#define CAIUIDR_CA_GET(v)      (((v) & 0x00008000) >> 15)
+#define CAIUIDR_TYPE_GET(v)    (((v) & 0x000f0000) >> 16)
+#define CAIUIDR_TYPE_ACE_CAI_DVM_SUPPORT       0
+#define CAIUIDR_TYPE_ACELITE_CAI_DVM_SUPPORT   1
+
+/* Coherent subsystem */
+#define CSADSER0               0xff040
+#define CSUIDR                 0xffff8
+#define CSIDR                  0xffffc
+
+#define CSUIDR_NUMCAIUS_GET(v) (((v) & 0x0000007f) >> 0)
+#define CSUIDR_NUMDIRUS_GET(v) (((v) & 0x003f0000) >> 16)
+#define CSUIDR_NUMCMIUS_GET(v) (((v) & 0x3f000000) >> 24)
+
+#define CSIDR_NUMSFS_GET(v)    (((v) & 0x007c0000) >> 18)
+
+#define DIR_REG_SZ             0x1000
+#define CAIU_REG_SZ            0x1000
+
+#define CCU_DIR_REG_ADDR(base, reg, dir)       \
+               ((base) + (reg) + ((dir) * DIR_REG_SZ))
+
+/* OCRAM firewall register */
+#define OCRAM_FW_01                    0x100204
+#define OCRAM_SECURE_REGIONS           4
+
+#define OCRAM_PRIVILEGED_MASK          BIT(29)
+#define OCRAM_SECURE_MASK              BIT(30)
+
+static void ncore_ccu_init_dirs(void __iomem *base)
+{
+       ulong i, f;
+       int ret;
+       u32 num_of_dirs;
+       u32 num_of_snoop_filters;
+       u32 reg;
+
+       num_of_dirs = CSUIDR_NUMDIRUS_GET(readl(base + CSUIDR));
+       num_of_snoop_filters =
+               CSIDR_NUMSFS_GET(readl(base + CSIDR)) + 1;
+
+       /* Initialize each snoop filter in each directory */
+       for (f = 0; f < num_of_snoop_filters; f++) {
+               reg = f << DIRUSFMCR_SFID_SHIFT;
+               for (i = 0; i < num_of_dirs; i++) {
+                       /* Initialize all entries */
+                       writel(reg, CCU_DIR_REG_ADDR(base, DIRUSFMCR, i));
+
+                       /* Poll snoop filter maintenance operation active
+                        * bit become 0.
+                        */
+                       ret = wait_for_bit_le32((const void *)
+                                               CCU_DIR_REG_ADDR(base,
+                                                                DIRUSFMAR, i),
+                                               BIT(0), false, 1000, false);
+                       if (ret) {
+                               puts("CCU: Directory initialization failed!\n");
+                               hang();
+                       }
+
+                       /* Enable snoop filter, a bit per snoop filter */
+                       setbits_le32((ulong)CCU_DIR_REG_ADDR(base, DIRUSFER, i),
+                                    BIT(f));
+               }
+       }
+}
+
+static void ncore_ccu_init_coh_agent(void __iomem *base)
+{
+       u32 num_of_coh_agent_intf;
+       u32 num_of_dirs;
+       u32 reg;
+       u32 type;
+       u32 i, dir;
+
+       num_of_coh_agent_intf =
+               CSUIDR_NUMCAIUS_GET(readl(base + CSUIDR));
+       num_of_dirs = CSUIDR_NUMDIRUS_GET(readl(base + CSUIDR));
+
+       for (i = 0; i < num_of_coh_agent_intf; i++) {
+               reg = readl(base + CAIUIDR + (i * CAIU_REG_SZ));
+               if (CAIUIDR_CA_GET(reg)) {
+                       /* Caching agent bit is enabled, enable caching agent
+                        * snoop in each directory
+                        */
+                       for (dir = 0; dir < num_of_dirs; dir++) {
+                               setbits_le32((ulong)
+                                            CCU_DIR_REG_ADDR(base, DIRUCASER0,
+                                                             dir),
+                                            BIT(i));
+                       }
+               }
+
+               type = CAIUIDR_TYPE_GET(reg);
+               if (type == CAIUIDR_TYPE_ACE_CAI_DVM_SUPPORT ||
+                   type == CAIUIDR_TYPE_ACELITE_CAI_DVM_SUPPORT) {
+                       /* DVM support is enabled, enable ACE DVM snoop*/
+                       setbits_le32((ulong)(base + CSADSER0),
+                                    BIT(i));
+               }
+       }
+}
+
+static void ocram_bypass_firewall(void __iomem *base)
+{
+       int i;
+
+       for (i = 0; i < OCRAM_SECURE_REGIONS; i++) {
+               clrbits_le32(base + OCRAM_FW_01 + (i * sizeof(u32)),
+                            OCRAM_PRIVILEGED_MASK | OCRAM_SECURE_MASK);
+       }
+}
+
+static int ncore_ccu_probe(struct udevice *dev)
+{
+       void __iomem *base;
+       fdt_addr_t addr;
+
+       addr = dev_read_addr(dev);
+       if (addr == FDT_ADDR_T_NONE)
+               return -EINVAL;
+
+       base = (void __iomem *)addr;
+
+       ncore_ccu_init_dirs(base);
+       ncore_ccu_init_coh_agent(base);
+       ocram_bypass_firewall(base);
+
+       return 0;
+}
+
+static const struct udevice_id ncore_ccu_ids[] = {
+       { .compatible = "arteris,ncore-ccu" },
+       {}
+};
+
+U_BOOT_DRIVER(ncore_ccu) = {
+       .name   = "ncore_ccu",
+       .id     = UCLASS_CACHE,
+       .of_match = ncore_ccu_ids,
+       .probe  = ncore_ccu_probe,
+       .flags  = DM_FLAG_PRE_RELOC,
+};
index a3ae8b24b0dda40c765406771114c1fdf631761d..96215ad5c42052e179d389af6aefdf521ebf178b 100644 (file)
@@ -3,4 +3,5 @@
 # Copyright (C) 2018 Marek Vasut <marex@denx.de>
 #
 
+obj-$(CONFIG_TARGET_SOCFPGA_AGILEX) += clk-agilex.o
 obj-$(CONFIG_TARGET_SOCFPGA_ARRIA10) += clk-arria10.o
diff --git a/drivers/clk/altera/clk-agilex.c b/drivers/clk/altera/clk-agilex.c
new file mode 100644 (file)
index 0000000..5fedec5
--- /dev/null
@@ -0,0 +1,579 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (C) 2019 Intel Corporation <www.intel.com>
+ */
+
+#include <common.h>
+#include <asm/io.h>
+#include <clk-uclass.h>
+#include <dm.h>
+#include <dm/lists.h>
+#include <dm/util.h>
+#include <dt-bindings/clock/agilex-clock.h>
+
+#include <asm/arch/clock_manager.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+struct socfpga_clk_platdata {
+       void __iomem *regs;
+};
+
+/*
+ * function to write the bypass register which requires a poll of the
+ * busy bit
+ */
+static void clk_write_bypass_mainpll(struct socfpga_clk_platdata *plat, u32 val)
+{
+       CM_REG_WRITEL(plat, val, CLKMGR_MAINPLL_BYPASS);
+       cm_wait_for_fsm();
+}
+
+static void clk_write_bypass_perpll(struct socfpga_clk_platdata *plat, u32 val)
+{
+       CM_REG_WRITEL(plat, val, CLKMGR_PERPLL_BYPASS);
+       cm_wait_for_fsm();
+}
+
+/* function to write the ctrl register which requires a poll of the busy bit */
+static void clk_write_ctrl(struct socfpga_clk_platdata *plat, u32 val)
+{
+       CM_REG_WRITEL(plat, val, CLKMGR_CTRL);
+       cm_wait_for_fsm();
+}
+
+#define MEMBUS_MAINPLL                         0
+#define MEMBUS_PERPLL                          1
+#define MEMBUS_TIMEOUT                         1000
+#define MEMBUS_ADDR_CLKSLICE                   0x27
+#define MEMBUS_CLKSLICE_SYNC_MODE_EN           0x80
+
+static int membus_wait_for_req(struct socfpga_clk_platdata *plat, u32 pll,
+                              int timeout)
+{
+       int cnt = 0;
+       u32 req_status;
+
+       if (pll == MEMBUS_MAINPLL)
+               req_status = CM_REG_READL(plat, CLKMGR_MAINPLL_MEM);
+       else
+               req_status = CM_REG_READL(plat, CLKMGR_PERPLL_MEM);
+
+       while ((cnt < timeout) && (req_status & CLKMGR_MEM_REQ_SET_MSK)) {
+               if (pll == MEMBUS_MAINPLL)
+                       req_status = CM_REG_READL(plat, CLKMGR_MAINPLL_MEM);
+               else
+                       req_status = CM_REG_READL(plat, CLKMGR_PERPLL_MEM);
+               cnt++;
+       }
+
+       if (cnt >= timeout)
+               return -ETIMEDOUT;
+
+       return 0;
+}
+
+static int membus_write_pll(struct socfpga_clk_platdata *plat, u32 pll,
+                           u32 addr_offset, u32 wdat, int timeout)
+{
+       u32 addr;
+       u32 val;
+
+       addr = ((addr_offset | CLKMGR_MEM_ADDR_START) & CLKMGR_MEM_ADDR_MASK);
+
+       val = (CLKMGR_MEM_REQ_SET_MSK | CLKMGR_MEM_WR_SET_MSK |
+              (wdat << CLKMGR_MEM_WDAT_LSB_OFFSET) | addr);
+
+       if (pll == MEMBUS_MAINPLL)
+               CM_REG_WRITEL(plat, val, CLKMGR_MAINPLL_MEM);
+       else
+               CM_REG_WRITEL(plat, val, CLKMGR_PERPLL_MEM);
+
+       debug("MEMBUS: Write 0x%08x to addr = 0x%08x\n", wdat, addr);
+
+       return membus_wait_for_req(plat, pll, timeout);
+}
+
+static int membus_read_pll(struct socfpga_clk_platdata *plat, u32 pll,
+                          u32 addr_offset, u32 *rdata, int timeout)
+{
+       u32 addr;
+       u32 val;
+
+       addr = ((addr_offset | CLKMGR_MEM_ADDR_START) & CLKMGR_MEM_ADDR_MASK);
+
+       val = ((CLKMGR_MEM_REQ_SET_MSK & ~CLKMGR_MEM_WR_SET_MSK) | addr);
+
+       if (pll == MEMBUS_MAINPLL)
+               CM_REG_WRITEL(plat, val, CLKMGR_MAINPLL_MEM);
+       else
+               CM_REG_WRITEL(plat, val, CLKMGR_PERPLL_MEM);
+
+       *rdata = 0;
+
+       if (membus_wait_for_req(plat, pll, timeout))
+               return -ETIMEDOUT;
+
+       if (pll == MEMBUS_MAINPLL)
+               *rdata = CM_REG_READL(plat, CLKMGR_MAINPLL_MEMSTAT);
+       else
+               *rdata = CM_REG_READL(plat, CLKMGR_PERPLL_MEMSTAT);
+
+       debug("MEMBUS: Read 0x%08x from addr = 0x%08x\n", *rdata, addr);
+
+       return 0;
+}
+
+static u32 calc_vocalib_pll(u32 pllm, u32 pllglob)
+{
+       u32 mdiv, refclkdiv, arefclkdiv, drefclkdiv, mscnt, hscnt, vcocalib;
+
+       mdiv = pllm & CLKMGR_PLLM_MDIV_MASK;
+       arefclkdiv = (pllglob & CLKMGR_PLLGLOB_AREFCLKDIV_MASK) >>
+                     CLKMGR_PLLGLOB_AREFCLKDIV_OFFSET;
+       drefclkdiv = (pllglob & CLKMGR_PLLGLOB_DREFCLKDIV_MASK) >>
+                     CLKMGR_PLLGLOB_DREFCLKDIV_OFFSET;
+       refclkdiv = (pllglob & CLKMGR_PLLGLOB_REFCLKDIV_MASK) >>
+                    CLKMGR_PLLGLOB_REFCLKDIV_OFFSET;
+       mscnt = CLKMGR_VCOCALIB_MSCNT_CONST / (mdiv * BIT(drefclkdiv));
+       if (!mscnt)
+               mscnt = 1;
+       hscnt = (mdiv * mscnt * BIT(drefclkdiv) / refclkdiv) -
+               CLKMGR_VCOCALIB_HSCNT_CONST;
+       vcocalib = (hscnt & CLKMGR_VCOCALIB_HSCNT_MASK) |
+                  ((mscnt << CLKMGR_VCOCALIB_MSCNT_OFFSET) &
+                    CLKMGR_VCOCALIB_MSCNT_MASK);
+
+       /* Dump all the pll calibration settings for debug purposes */
+       debug("mdiv          : %d\n", mdiv);
+       debug("arefclkdiv    : %d\n", arefclkdiv);
+       debug("drefclkdiv    : %d\n", drefclkdiv);
+       debug("refclkdiv     : %d\n", refclkdiv);
+       debug("mscnt         : %d\n", mscnt);
+       debug("hscnt         : %d\n", hscnt);
+       debug("vcocalib      : 0x%08x\n", vcocalib);
+
+       return vcocalib;
+}
+
+/*
+ * Setup clocks while making no assumptions about previous state of the clocks.
+ */
+static void clk_basic_init(struct udevice *dev,
+                          const struct cm_config * const cfg)
+{
+       struct socfpga_clk_platdata *plat = dev_get_platdata(dev);
+       u32 vcocalib;
+       u32 rdata;
+
+       if (!cfg)
+               return;
+
+       /* Put both PLLs in bypass */
+       clk_write_bypass_mainpll(plat, CLKMGR_BYPASS_MAINPLL_ALL);
+       clk_write_bypass_perpll(plat, CLKMGR_BYPASS_PERPLL_ALL);
+
+       /* Put both PLLs in Reset and Power Down */
+       CM_REG_CLRBITS(plat, CLKMGR_MAINPLL_PLLGLOB,
+                      CLKMGR_PLLGLOB_PD_MASK | CLKMGR_PLLGLOB_RST_MASK);
+       CM_REG_CLRBITS(plat, CLKMGR_PERPLL_PLLGLOB,
+                      CLKMGR_PLLGLOB_PD_MASK | CLKMGR_PLLGLOB_RST_MASK);
+
+       /* setup main PLL dividers where calculate the vcocalib value */
+       vcocalib = calc_vocalib_pll(cfg->main_pll_pllm, cfg->main_pll_pllglob);
+       CM_REG_WRITEL(plat, cfg->main_pll_pllglob & ~CLKMGR_PLLGLOB_RST_MASK,
+                     CLKMGR_MAINPLL_PLLGLOB);
+       CM_REG_WRITEL(plat, cfg->main_pll_fdbck, CLKMGR_MAINPLL_FDBCK);
+       CM_REG_WRITEL(plat, vcocalib, CLKMGR_MAINPLL_VCOCALIB);
+       CM_REG_WRITEL(plat, cfg->main_pll_pllc0, CLKMGR_MAINPLL_PLLC0);
+       CM_REG_WRITEL(plat, cfg->main_pll_pllc1, CLKMGR_MAINPLL_PLLC1);
+       CM_REG_WRITEL(plat, cfg->main_pll_pllc2, CLKMGR_MAINPLL_PLLC2);
+       CM_REG_WRITEL(plat, cfg->main_pll_pllc3, CLKMGR_MAINPLL_PLLC3);
+       CM_REG_WRITEL(plat, cfg->main_pll_pllm, CLKMGR_MAINPLL_PLLM);
+       CM_REG_WRITEL(plat, cfg->main_pll_mpuclk, CLKMGR_MAINPLL_MPUCLK);
+       CM_REG_WRITEL(plat, cfg->main_pll_nocclk, CLKMGR_MAINPLL_NOCCLK);
+       CM_REG_WRITEL(plat, cfg->main_pll_nocdiv, CLKMGR_MAINPLL_NOCDIV);
+
+       /* setup peripheral PLL dividers where calculate the vcocalib value */
+       vcocalib = calc_vocalib_pll(cfg->per_pll_pllm, cfg->per_pll_pllglob);
+       CM_REG_WRITEL(plat, cfg->per_pll_pllglob & ~CLKMGR_PLLGLOB_RST_MASK,
+                     CLKMGR_PERPLL_PLLGLOB);
+       CM_REG_WRITEL(plat, cfg->per_pll_fdbck, CLKMGR_PERPLL_FDBCK);
+       CM_REG_WRITEL(plat, vcocalib, CLKMGR_PERPLL_VCOCALIB);
+       CM_REG_WRITEL(plat, cfg->per_pll_pllc0, CLKMGR_PERPLL_PLLC0);
+       CM_REG_WRITEL(plat, cfg->per_pll_pllc1, CLKMGR_PERPLL_PLLC1);
+       CM_REG_WRITEL(plat, cfg->per_pll_pllc2, CLKMGR_PERPLL_PLLC2);
+       CM_REG_WRITEL(plat, cfg->per_pll_pllc3, CLKMGR_PERPLL_PLLC3);
+       CM_REG_WRITEL(plat, cfg->per_pll_pllm, CLKMGR_PERPLL_PLLM);
+       CM_REG_WRITEL(plat, cfg->per_pll_emacctl, CLKMGR_PERPLL_EMACCTL);
+       CM_REG_WRITEL(plat, cfg->per_pll_gpiodiv, CLKMGR_PERPLL_GPIODIV);
+
+       /* Take both PLL out of reset and power up */
+       CM_REG_SETBITS(plat, CLKMGR_MAINPLL_PLLGLOB,
+                      CLKMGR_PLLGLOB_PD_MASK | CLKMGR_PLLGLOB_RST_MASK);
+       CM_REG_SETBITS(plat, CLKMGR_PERPLL_PLLGLOB,
+                      CLKMGR_PLLGLOB_PD_MASK | CLKMGR_PLLGLOB_RST_MASK);
+
+       /* Membus programming to set mainpll and perripll to
+        * source synchronous mode
+        */
+       membus_read_pll(plat, MEMBUS_MAINPLL, MEMBUS_ADDR_CLKSLICE, &rdata,
+                       MEMBUS_TIMEOUT);
+       membus_write_pll(plat, MEMBUS_MAINPLL, MEMBUS_ADDR_CLKSLICE,
+                        (rdata | MEMBUS_CLKSLICE_SYNC_MODE_EN),
+                        MEMBUS_TIMEOUT);
+       membus_read_pll(plat, MEMBUS_PERPLL, MEMBUS_ADDR_CLKSLICE, &rdata,
+                       MEMBUS_TIMEOUT);
+       membus_write_pll(plat, MEMBUS_PERPLL, MEMBUS_ADDR_CLKSLICE,
+                        (rdata | MEMBUS_CLKSLICE_SYNC_MODE_EN),
+                        MEMBUS_TIMEOUT);
+
+       cm_wait_for_lock(CLKMGR_STAT_ALLPLL_LOCKED_MASK);
+
+       /* Configure ping pong counters in altera group */
+       CM_REG_WRITEL(plat, cfg->alt_emacactr, CLKMGR_ALTR_EMACACTR);
+       CM_REG_WRITEL(plat, cfg->alt_emacbctr, CLKMGR_ALTR_EMACBCTR);
+       CM_REG_WRITEL(plat, cfg->alt_emacptpctr, CLKMGR_ALTR_EMACPTPCTR);
+       CM_REG_WRITEL(plat, cfg->alt_gpiodbctr, CLKMGR_ALTR_GPIODBCTR);
+       CM_REG_WRITEL(plat, cfg->alt_sdmmcctr, CLKMGR_ALTR_SDMMCCTR);
+       CM_REG_WRITEL(plat, cfg->alt_s2fuser0ctr, CLKMGR_ALTR_S2FUSER0CTR);
+       CM_REG_WRITEL(plat, cfg->alt_s2fuser1ctr, CLKMGR_ALTR_S2FUSER1CTR);
+       CM_REG_WRITEL(plat, cfg->alt_psirefctr, CLKMGR_ALTR_PSIREFCTR);
+
+       CM_REG_WRITEL(plat, CLKMGR_LOSTLOCK_SET_MASK, CLKMGR_MAINPLL_LOSTLOCK);
+       CM_REG_WRITEL(plat, CLKMGR_LOSTLOCK_SET_MASK, CLKMGR_PERPLL_LOSTLOCK);
+
+       CM_REG_WRITEL(plat, CM_REG_READL(plat, CLKMGR_MAINPLL_PLLGLOB) |
+                       CLKMGR_PLLGLOB_CLR_LOSTLOCK_BYPASS_MASK,
+                       CLKMGR_MAINPLL_PLLGLOB);
+       CM_REG_WRITEL(plat, CM_REG_READL(plat, CLKMGR_PERPLL_PLLGLOB) |
+                       CLKMGR_PLLGLOB_CLR_LOSTLOCK_BYPASS_MASK,
+                       CLKMGR_PERPLL_PLLGLOB);
+
+       /* Take all PLLs out of bypass */
+       clk_write_bypass_mainpll(plat, 0);
+       clk_write_bypass_perpll(plat, 0);
+
+       /* Clear the loss of lock bits (write 1 to clear) */
+       CM_REG_CLRBITS(plat, CLKMGR_INTRCLR,
+                      CLKMGR_INTER_PERPLLLOST_MASK |
+                      CLKMGR_INTER_MAINPLLLOST_MASK);
+
+       /* Take all ping pong counters out of reset */
+       CM_REG_CLRBITS(plat, CLKMGR_ALTR_EXTCNTRST,
+                      CLKMGR_ALT_EXTCNTRST_ALLCNTRST);
+
+       /* Out of boot mode */
+       clk_write_ctrl(plat,
+                      CM_REG_READL(plat, CLKMGR_CTRL) & ~CLKMGR_CTRL_BOOTMODE);
+}
+
+static u64 clk_get_vco_clk_hz(struct socfpga_clk_platdata *plat,
+                             u32 pllglob_reg, u32 pllm_reg)
+{
+        u64 fref, arefdiv, mdiv, reg, vco;
+
+       reg = CM_REG_READL(plat, pllglob_reg);
+
+       fref = (reg & CLKMGR_PLLGLOB_VCO_PSRC_MASK) >>
+               CLKMGR_PLLGLOB_VCO_PSRC_OFFSET;
+
+       switch (fref) {
+       case CLKMGR_VCO_PSRC_EOSC1:
+               fref = cm_get_osc_clk_hz();
+               break;
+       case CLKMGR_VCO_PSRC_INTOSC:
+               fref = cm_get_intosc_clk_hz();
+               break;
+       case CLKMGR_VCO_PSRC_F2S:
+               fref = cm_get_fpga_clk_hz();
+               break;
+       }
+
+       arefdiv = (reg & CLKMGR_PLLGLOB_AREFCLKDIV_MASK) >>
+                  CLKMGR_PLLGLOB_AREFCLKDIV_OFFSET;
+
+       mdiv = CM_REG_READL(plat, pllm_reg) & CLKMGR_PLLM_MDIV_MASK;
+
+       vco = fref / arefdiv;
+       vco = vco * mdiv;
+
+       return vco;
+}
+
+static u64 clk_get_main_vco_clk_hz(struct socfpga_clk_platdata *plat)
+{
+       return clk_get_vco_clk_hz(plat, CLKMGR_MAINPLL_PLLGLOB,
+                                CLKMGR_MAINPLL_PLLM);
+}
+
+static u64 clk_get_per_vco_clk_hz(struct socfpga_clk_platdata *plat)
+{
+       return clk_get_vco_clk_hz(plat, CLKMGR_PERPLL_PLLGLOB,
+                                CLKMGR_PERPLL_PLLM);
+}
+
+static u32 clk_get_5_1_clk_src(struct socfpga_clk_platdata *plat, u64 reg)
+{
+       u32 clksrc = CM_REG_READL(plat, reg);
+
+       return (clksrc & CLKMGR_CLKSRC_MASK) >> CLKMGR_CLKSRC_OFFSET;
+}
+
+static u64 clk_get_clksrc_hz(struct socfpga_clk_platdata *plat, u32 clksrc_reg,
+                            u32 main_reg, u32 per_reg)
+{
+       u64 clock;
+       u32 clklsrc = clk_get_5_1_clk_src(plat, clksrc_reg);
+
+       switch (clklsrc) {
+       case CLKMGR_CLKSRC_MAIN:
+               clock = clk_get_main_vco_clk_hz(plat);
+               clock /= (CM_REG_READL(plat, main_reg) &
+                         CLKMGR_CLKCNT_MSK);
+               break;
+
+       case CLKMGR_CLKSRC_PER:
+               clock = clk_get_per_vco_clk_hz(plat);
+               clock /= (CM_REG_READL(plat, per_reg) &
+                         CLKMGR_CLKCNT_MSK);
+               break;
+
+       case CLKMGR_CLKSRC_OSC1:
+               clock = cm_get_osc_clk_hz();
+               break;
+
+       case CLKMGR_CLKSRC_INTOSC:
+               clock = cm_get_intosc_clk_hz();
+               break;
+
+       case CLKMGR_CLKSRC_FPGA:
+               clock = cm_get_fpga_clk_hz();
+               break;
+       default:
+               return 0;
+       }
+
+       return clock;
+}
+
+static u64 clk_get_mpu_clk_hz(struct socfpga_clk_platdata *plat)
+{
+       u64 clock = clk_get_clksrc_hz(plat, CLKMGR_MAINPLL_MPUCLK,
+                                     CLKMGR_MAINPLL_PLLC0,
+                                     CLKMGR_PERPLL_PLLC0);
+
+       clock /= 1 + (CM_REG_READL(plat, CLKMGR_MAINPLL_MPUCLK) &
+                CLKMGR_CLKCNT_MSK);
+
+       return clock;
+}
+
+static u32 clk_get_l3_main_clk_hz(struct socfpga_clk_platdata *plat)
+{
+       return clk_get_clksrc_hz(plat, CLKMGR_MAINPLL_NOCCLK,
+                                     CLKMGR_MAINPLL_PLLC1,
+                                     CLKMGR_PERPLL_PLLC1);
+}
+
+static u32 clk_get_l4_main_clk_hz(struct socfpga_clk_platdata *plat)
+{
+       u64 clock = clk_get_l3_main_clk_hz(plat);
+
+       clock /= BIT((CM_REG_READL(plat, CLKMGR_MAINPLL_NOCDIV) >>
+             CLKMGR_NOCDIV_L4MAIN_OFFSET) &
+             CLKMGR_NOCDIV_DIVIDER_MASK);
+
+       return clock;
+}
+
+static u32 clk_get_sdmmc_clk_hz(struct socfpga_clk_platdata *plat)
+{
+       u64 clock = clk_get_clksrc_hz(plat, CLKMGR_ALTR_SDMMCCTR,
+                                     CLKMGR_MAINPLL_PLLC3,
+                                     CLKMGR_PERPLL_PLLC3);
+
+       clock /= 1 + (CM_REG_READL(plat, CLKMGR_ALTR_SDMMCCTR) &
+                CLKMGR_CLKCNT_MSK);
+
+       return clock / 4;
+}
+
+static u32 clk_get_l4_sp_clk_hz(struct socfpga_clk_platdata *plat)
+{
+       u64 clock = clk_get_l3_main_clk_hz(plat);
+
+       clock /= BIT((CM_REG_READL(plat, CLKMGR_MAINPLL_NOCDIV) >>
+                     CLKMGR_NOCDIV_L4SPCLK_OFFSET) &
+                     CLKMGR_NOCDIV_DIVIDER_MASK);
+
+       return clock;
+}
+
+static u32 clk_get_l4_mp_clk_hz(struct socfpga_clk_platdata *plat)
+{
+       u64 clock = clk_get_l3_main_clk_hz(plat);
+
+       clock /= BIT((CM_REG_READL(plat, CLKMGR_MAINPLL_NOCDIV) >>
+                     CLKMGR_NOCDIV_L4MPCLK_OFFSET) &
+                     CLKMGR_NOCDIV_DIVIDER_MASK);
+
+       return clock;
+}
+
+static u32 clk_get_l4_sys_free_clk_hz(struct socfpga_clk_platdata *plat)
+{
+       if (CM_REG_READL(plat, CLKMGR_STAT) & CLKMGR_STAT_BOOTMODE)
+               return clk_get_l3_main_clk_hz(plat) / 2;
+
+       return clk_get_l3_main_clk_hz(plat) / 4;
+}
+
+static u32 clk_get_emac_clk_hz(struct socfpga_clk_platdata *plat, u32 emac_id)
+{
+       bool emacsel_a;
+       u32 ctl;
+       u32 ctr_reg;
+       u32 clock;
+       u32 div;
+       u32 reg;
+
+       /* Get EMAC clock source */
+       ctl = CM_REG_READL(plat, CLKMGR_PERPLL_EMACCTL);
+       if (emac_id == AGILEX_EMAC0_CLK)
+               ctl = (ctl >> CLKMGR_PERPLLGRP_EMACCTL_EMAC0SELB_OFFSET) &
+                      CLKMGR_PERPLLGRP_EMACCTL_EMAC0SELB_MASK;
+       else if (emac_id == AGILEX_EMAC1_CLK)
+               ctl = (ctl >> CLKMGR_PERPLLGRP_EMACCTL_EMAC1SELB_OFFSET) &
+                      CLKMGR_PERPLLGRP_EMACCTL_EMAC1SELB_MASK;
+       else if (emac_id == AGILEX_EMAC2_CLK)
+               ctl = (ctl >> CLKMGR_PERPLLGRP_EMACCTL_EMAC2SELB_OFFSET) &
+                      CLKMGR_PERPLLGRP_EMACCTL_EMAC2SELB_MASK;
+       else
+               return 0;
+
+       if (ctl) {
+               /* EMAC B source */
+               emacsel_a = false;
+               ctr_reg = CLKMGR_ALTR_EMACBCTR;
+       } else {
+               /* EMAC A source */
+               emacsel_a = true;
+               ctr_reg = CLKMGR_ALTR_EMACACTR;
+       }
+
+       reg = CM_REG_READL(plat, ctr_reg);
+       clock = (reg & CLKMGR_ALT_EMACCTR_SRC_MASK)
+                >> CLKMGR_ALT_EMACCTR_SRC_OFFSET;
+       div = (reg & CLKMGR_ALT_EMACCTR_CNT_MASK)
+               >> CLKMGR_ALT_EMACCTR_CNT_OFFSET;
+
+       switch (clock) {
+       case CLKMGR_CLKSRC_MAIN:
+               clock = clk_get_main_vco_clk_hz(plat);
+               if (emacsel_a) {
+                       clock /= (CM_REG_READL(plat, CLKMGR_MAINPLL_PLLC2) &
+                                 CLKMGR_CLKCNT_MSK);
+               } else {
+                       clock /= (CM_REG_READL(plat, CLKMGR_MAINPLL_PLLC3) &
+                                 CLKMGR_CLKCNT_MSK);
+               }
+               break;
+
+       case CLKMGR_CLKSRC_PER:
+               clock = clk_get_per_vco_clk_hz(plat);
+               if (emacsel_a) {
+                       clock /= (CM_REG_READL(plat, CLKMGR_PERPLL_PLLC2) &
+                                 CLKMGR_CLKCNT_MSK);
+               } else {
+                       clock /= (CM_REG_READL(plat, CLKMGR_PERPLL_PLLC3) &
+                                 CLKMGR_CLKCNT_MSK);
+               }
+               break;
+
+       case CLKMGR_CLKSRC_OSC1:
+               clock = cm_get_osc_clk_hz();
+               break;
+
+       case CLKMGR_CLKSRC_INTOSC:
+               clock = cm_get_intosc_clk_hz();
+               break;
+
+       case CLKMGR_CLKSRC_FPGA:
+               clock = cm_get_fpga_clk_hz();
+               break;
+       }
+
+       clock /= 1 + div;
+
+       return clock;
+}
+
+static ulong socfpga_clk_get_rate(struct clk *clk)
+{
+       struct socfpga_clk_platdata *plat = dev_get_platdata(clk->dev);
+
+       switch (clk->id) {
+       case AGILEX_MPU_CLK:
+               return clk_get_mpu_clk_hz(plat);
+       case AGILEX_L4_MAIN_CLK:
+               return clk_get_l4_main_clk_hz(plat);
+       case AGILEX_L4_SYS_FREE_CLK:
+               return clk_get_l4_sys_free_clk_hz(plat);
+       case AGILEX_L4_MP_CLK:
+               return clk_get_l4_mp_clk_hz(plat);
+       case AGILEX_L4_SP_CLK:
+               return clk_get_l4_sp_clk_hz(plat);
+       case AGILEX_SDMMC_CLK:
+               return clk_get_sdmmc_clk_hz(plat);
+       case AGILEX_EMAC0_CLK:
+       case AGILEX_EMAC1_CLK:
+       case AGILEX_EMAC2_CLK:
+               return clk_get_emac_clk_hz(plat, clk->id);
+       case AGILEX_USB_CLK:
+               return clk_get_l4_mp_clk_hz(plat);
+       default:
+               return -ENXIO;
+       }
+}
+
+static int socfpga_clk_probe(struct udevice *dev)
+{
+       const struct cm_config *cm_default_cfg = cm_get_default_config();
+
+       clk_basic_init(dev, cm_default_cfg);
+
+       return 0;
+}
+
+static int socfpga_clk_ofdata_to_platdata(struct udevice *dev)
+{
+       struct socfpga_clk_platdata *plat = dev_get_platdata(dev);
+       fdt_addr_t addr;
+
+       addr = devfdt_get_addr(dev);
+       if (addr == FDT_ADDR_T_NONE)
+               return -EINVAL;
+       plat->regs = (void __iomem *)addr;
+
+       return 0;
+}
+
+static struct clk_ops socfpga_clk_ops = {
+       .get_rate       = socfpga_clk_get_rate,
+};
+
+static const struct udevice_id socfpga_clk_match[] = {
+       { .compatible = "intel,agilex-clkmgr" },
+       {}
+};
+
+U_BOOT_DRIVER(socfpga_agilex_clk) = {
+       .name           = "clk-agilex",
+       .id             = UCLASS_CLK,
+       .of_match       = socfpga_clk_match,
+       .ops            = &socfpga_clk_ops,
+       .probe          = socfpga_clk_probe,
+       .ofdata_to_platdata = socfpga_clk_ofdata_to_platdata,
+       .platdata_auto_alloc_size = sizeof(struct socfpga_clk_platdata),
+};
diff --git a/drivers/clk/altera/clk-agilex.h b/drivers/clk/altera/clk-agilex.h
new file mode 100644 (file)
index 0000000..d93328e
--- /dev/null
@@ -0,0 +1,237 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2019 Intel Corporation <www.intel.com>
+ */
+
+#ifndef        _CLK_AGILEX_
+#define        _CLK_AGILEX_
+
+#define CM_REG_READL(plat, reg)                                \
+       readl((plat)->regs + (reg))
+
+#define CM_REG_WRITEL(plat, data, reg)                 \
+       writel(data, (plat)->regs + (reg))
+
+#define CM_REG_CLRBITS(plat, reg, clear)               \
+       clrbits_le32((plat)->regs + (reg), (clear))
+
+#define CM_REG_SETBITS(plat, reg, set)                 \
+       setbits_le32((plat)->regs + (reg), (set))
+
+struct cm_config {
+       /* main group */
+       u32 main_pll_mpuclk;
+       u32 main_pll_nocclk;
+       u32 main_pll_nocdiv;
+       u32 main_pll_pllglob;
+       u32 main_pll_fdbck;
+       u32 main_pll_pllc0;
+       u32 main_pll_pllc1;
+       u32 main_pll_pllc2;
+       u32 main_pll_pllc3;
+       u32 main_pll_pllm;
+
+       /* peripheral group */
+       u32 per_pll_emacctl;
+       u32 per_pll_gpiodiv;
+       u32 per_pll_pllglob;
+       u32 per_pll_fdbck;
+       u32 per_pll_pllc0;
+       u32 per_pll_pllc1;
+       u32 per_pll_pllc2;
+       u32 per_pll_pllc3;
+       u32 per_pll_pllm;
+
+       /* altera group */
+       u32 alt_emacactr;
+       u32 alt_emacbctr;
+       u32 alt_emacptpctr;
+       u32 alt_gpiodbctr;
+       u32 alt_sdmmcctr;
+       u32 alt_s2fuser0ctr;
+       u32 alt_s2fuser1ctr;
+       u32 alt_psirefctr;
+
+       /* incoming clock */
+       u32 hps_osc_clk_hz;
+       u32 fpga_clk_hz;
+       u32 spare[3];
+};
+
+/* Clock Manager registers */
+#define CLKMGR_CTRL                            0
+#define CLKMGR_STAT                            4
+#define CLKMGR_TESTIOCTRL                      8
+#define CLKMGR_INTRGEN                         0x0c
+#define CLKMGR_INTRMSK                         0x10
+#define CLKMGR_INTRCLR                         0x14
+#define CLKMGR_INTRSTS                         0x18
+#define CLKMGR_INTRSTK                         0x1c
+#define CLKMGR_INTRRAW                         0x20
+
+/* Clock Manager Main PPL group registers */
+#define CLKMGR_MAINPLL_EN                      0x24
+#define CLKMGR_MAINPLL_ENS                     0x28
+#define CLKMGR_MAINPLL_ENR                     0x2c
+#define CLKMGR_MAINPLL_BYPASS                  0x30
+#define CLKMGR_MAINPLL_BYPASSS                 0x34
+#define CLKMGR_MAINPLL_BYPASSR                 0x38
+#define CLKMGR_MAINPLL_MPUCLK                  0x3c
+#define CLKMGR_MAINPLL_NOCCLK                  0x40
+#define CLKMGR_MAINPLL_NOCDIV                  0x44
+#define CLKMGR_MAINPLL_PLLGLOB                 0x48
+#define CLKMGR_MAINPLL_FDBCK                   0x4c
+#define CLKMGR_MAINPLL_MEM                     0x50
+#define CLKMGR_MAINPLL_MEMSTAT                 0x54
+#define CLKMGR_MAINPLL_PLLC0                   0x58
+#define CLKMGR_MAINPLL_PLLC1                   0x5c
+#define CLKMGR_MAINPLL_VCOCALIB                        0x60
+#define CLKMGR_MAINPLL_PLLC2                   0x64
+#define CLKMGR_MAINPLL_PLLC3                   0x68
+#define CLKMGR_MAINPLL_PLLM                    0x6c
+#define CLKMGR_MAINPLL_FHOP                    0x70
+#define CLKMGR_MAINPLL_SSC                     0x74
+#define CLKMGR_MAINPLL_LOSTLOCK                        0x78
+
+/* Clock Manager Peripheral PPL group registers */
+#define CLKMGR_PERPLL_EN                       0x7c
+#define CLKMGR_PERPLL_ENS                      0x80
+#define CLKMGR_PERPLL_ENR                      0x84
+#define CLKMGR_PERPLL_BYPASS                   0x88
+#define CLKMGR_PERPLL_BYPASSS                  0x8c
+#define CLKMGR_PERPLL_BYPASSR                  0x90
+#define CLKMGR_PERPLL_EMACCTL                  0x94
+#define CLKMGR_PERPLL_GPIODIV                  0x98
+#define CLKMGR_PERPLL_PLLGLOB                  0x9c
+#define CLKMGR_PERPLL_FDBCK                    0xa0
+#define CLKMGR_PERPLL_MEM                      0xa4
+#define CLKMGR_PERPLL_MEMSTAT                  0xa8
+#define CLKMGR_PERPLL_PLLC0                    0xac
+#define CLKMGR_PERPLL_PLLC1                    0xb0
+#define CLKMGR_PERPLL_VCOCALIB                 0xb4
+#define CLKMGR_PERPLL_PLLC2                    0xb8
+#define CLKMGR_PERPLL_PLLC3                    0xbc
+#define CLKMGR_PERPLL_PLLM                     0xc0
+#define CLKMGR_PERPLL_FHOP                     0xc4
+#define CLKMGR_PERPLL_SSC                      0xc8
+#define CLKMGR_PERPLL_LOSTLOCK                 0xcc
+
+/* Clock Manager Altera group registers */
+#define CLKMGR_ALTR_JTAG                       0xd0
+#define CLKMGR_ALTR_EMACACTR                   0xd4
+#define CLKMGR_ALTR_EMACBCTR                   0xd8
+#define CLKMGR_ALTR_EMACPTPCTR                 0xdc
+#define CLKMGR_ALTR_GPIODBCTR                  0xe0
+#define CLKMGR_ALTR_SDMMCCTR                   0xe4
+#define CLKMGR_ALTR_S2FUSER0CTR                        0xe8
+#define CLKMGR_ALTR_S2FUSER1CTR                        0xec
+#define CLKMGR_ALTR_PSIREFCTR                  0xf0
+#define CLKMGR_ALTR_EXTCNTRST                  0xf4
+
+#define CLKMGR_CTRL_BOOTMODE                   BIT(0)
+
+#define CLKMGR_STAT_BUSY                       BIT(0)
+#define CLKMGR_STAT_MAINPLL_LOCKED             BIT(8)
+#define CLKMGR_STAT_MAIN_TRANS                 BIT(9)
+#define CLKMGR_STAT_PERPLL_LOCKED              BIT(16)
+#define CLKMGR_STAT_PERF_TRANS                 BIT(17)
+#define CLKMGR_STAT_BOOTMODE                   BIT(24)
+#define CLKMGR_STAT_BOOTCLKSRC                 BIT(25)
+
+#define CLKMGR_STAT_ALLPLL_LOCKED_MASK         \
+       (CLKMGR_STAT_MAINPLL_LOCKED | CLKMGR_STAT_PERPLL_LOCKED)
+
+#define CLKMGR_INTER_MAINPLLLOCKED_MASK                0x00000001
+#define CLKMGR_INTER_PERPLLLOCKED_MASK         0x00000002
+#define CLKMGR_INTER_MAINPLLLOST_MASK          0x00000004
+#define CLKMGR_INTER_PERPLLLOST_MASK           0x00000008
+
+#define CLKMGR_CLKSRC_MASK                     GENMASK(18, 16)
+#define CLKMGR_CLKSRC_OFFSET                   16
+#define CLKMGR_CLKSRC_MAIN                     0
+#define CLKMGR_CLKSRC_PER                      1
+#define CLKMGR_CLKSRC_OSC1                     2
+#define CLKMGR_CLKSRC_INTOSC                   3
+#define CLKMGR_CLKSRC_FPGA                     4
+#define CLKMGR_CLKCNT_MSK                      GENMASK(10, 0)
+
+#define CLKMGR_BYPASS_MAINPLL_ALL              0x7
+#define CLKMGR_BYPASS_PERPLL_ALL               0x7f
+
+#define CLKMGR_NOCDIV_L4MAIN_OFFSET            0
+#define CLKMGR_NOCDIV_L4MPCLK_OFFSET           8
+#define CLKMGR_NOCDIV_L4SPCLK_OFFSET           16
+#define CLKMGR_NOCDIV_CSATCLK_OFFSET           24
+#define CLKMGR_NOCDIV_CSTRACECLK_OFFSET                26
+#define CLKMGR_NOCDIV_CSPDBGCLK_OFFSET         28
+#define CLKMGR_NOCDIV_DIVIDER_MASK             0x3
+
+#define CLKMGR_PLLGLOB_PD_MASK                         BIT(0)
+#define CLKMGR_PLLGLOB_RST_MASK                                BIT(1)
+#define CLKMGR_PLLGLOB_AREFCLKDIV_MASK                 GENMASK(11, 8)
+#define CLKMGR_PLLGLOB_DREFCLKDIV_MASK                 GENMASK(13, 12)
+#define CLKMGR_PLLGLOB_REFCLKDIV_MASK                  GENMASK(13, 8)
+#define CLKMGR_PLLGLOB_MODCLKDIV_MASK                  GENMASK(24, 27)
+#define CLKMGR_PLLGLOB_AREFCLKDIV_OFFSET               8
+#define CLKMGR_PLLGLOB_DREFCLKDIV_OFFSET               12
+#define CLKMGR_PLLGLOB_REFCLKDIV_OFFSET                        8
+#define CLKMGR_PLLGLOB_MODCLKDIV_OFFSET                        24
+#define CLKMGR_PLLGLOB_VCO_PSRC_MASK                   GENMASK(17, 16)
+#define CLKMGR_PLLGLOB_VCO_PSRC_OFFSET                 16
+#define CLKMGR_PLLGLOB_CLR_LOSTLOCK_BYPASS_MASK                BIT(29)
+
+#define CLKMGR_VCO_PSRC_EOSC1                  0
+#define CLKMGR_VCO_PSRC_INTOSC                 1
+#define CLKMGR_VCO_PSRC_F2S                    2
+
+#define CLKMGR_MEM_REQ_SET_MSK                 BIT(24)
+#define CLKMGR_MEM_WR_SET_MSK                  BIT(25)
+#define CLKMGR_MEM_ERR_MSK                     BIT(26)
+#define CLKMGR_MEM_WDAT_LSB_OFFSET             16
+#define CLKMGR_MEM_ADDR_MASK                   GENMASK(15, 0)
+#define CLKMGR_MEM_ADDR_START                  0x00004000
+
+#define CLKMGR_PLLCX_EN_SET_MSK                        BIT(27)
+#define CLKMGR_PLLCX_MUTE_SET_MSK              BIT(28)
+
+#define CLKMGR_VCOCALIB_MSCNT_MASK             GENMASK(23, 16)
+#define CLKMGR_VCOCALIB_MSCNT_OFFSET           16
+#define CLKMGR_VCOCALIB_HSCNT_MASK             GENMASK(9, 0)
+#define CLKMGR_VCOCALIB_MSCNT_CONST            100
+#define CLKMGR_VCOCALIB_HSCNT_CONST            4
+
+#define CLKMGR_PLLM_MDIV_MASK                  GENMASK(9, 0)
+
+#define CLKMGR_LOSTLOCK_SET_MASK               BIT(0)
+
+#define CLKMGR_PERPLLGRP_EN_SDMMCCLK_MASK              BIT(5)
+#define CLKMGR_PERPLLGRP_EMACCTL_EMAC0SELB_OFFSET      26
+#define CLKMGR_PERPLLGRP_EMACCTL_EMAC0SELB_MASK                BIT(26)
+#define CLKMGR_PERPLLGRP_EMACCTL_EMAC1SELB_OFFSET      27
+#define CLKMGR_PERPLLGRP_EMACCTL_EMAC1SELB_MASK                BIT(27)
+#define CLKMGR_PERPLLGRP_EMACCTL_EMAC2SELB_OFFSET      28
+#define CLKMGR_PERPLLGRP_EMACCTL_EMAC2SELB_MASK                BIT(28)
+
+#define CLKMGR_ALT_EMACCTR_SRC_OFFSET          16
+#define CLKMGR_ALT_EMACCTR_SRC_MASK            GENMASK(18, 16)
+#define CLKMGR_ALT_EMACCTR_CNT_OFFSET          0
+#define CLKMGR_ALT_EMACCTR_CNT_MASK            GENMASK(10, 0)
+
+#define CLKMGR_ALT_EXTCNTRST_EMACACNTRST       BIT(0)
+#define CLKMGR_ALT_EXTCNTRST_EMACBCNTRST       BIT(1)
+#define CLKMGR_ALT_EXTCNTRST_EMACPTPCNTRST     BIT(2)
+#define CLKMGR_ALT_EXTCNTRST_GPIODBCNTRST      BIT(3)
+#define CLKMGR_ALT_EXTCNTRST_SDMMCCNTRST       BIT(4)
+#define CLKMGR_ALT_EXTCNTRST_S2FUSER0CNTRST    BIT(5)
+#define CLKMGR_ALT_EXTCNTRST_S2FUSER1CNTRST    BIT(6)
+#define CLKMGR_ALT_EXTCNTRST_PSIREFCNTRST      BIT(7)
+#define CLKMGR_ALT_EXTCNTRST_ALLCNTRST         \
+       (CLKMGR_ALT_EXTCNTRST_EMACACNTRST |     \
+        CLKMGR_ALT_EXTCNTRST_EMACBCNTRST |     \
+        CLKMGR_ALT_EXTCNTRST_EMACPTPCNTRST |   \
+        CLKMGR_ALT_EXTCNTRST_GPIODBCNTRST |    \
+        CLKMGR_ALT_EXTCNTRST_SDMMCCNTRST |     \
+        CLKMGR_ALT_EXTCNTRST_S2FUSER0CNTRST |  \
+        CLKMGR_ALT_EXTCNTRST_S2FUSER1CNTRST |  \
+        CLKMGR_ALT_EXTCNTRST_PSIREFCNTRST)
+#endif /* _CLK_AGILEX_ */
index 3718970dc7c4d2754a936e2b7f9567d6ba3b1fcc..da66bde41b5fc9f1aea7692bc2b0a2d778b87fee 100644 (file)
@@ -563,6 +563,7 @@ static const struct stm32mp1_clk_gate stm32mp1_clk_gate[] = {
        STM32MP1_CLK_SET_CLR(RCC_MP_AHB4ENSETR, 10, GPIOK, _UNKNOWN_SEL),
 
        STM32MP1_CLK_SET_CLR(RCC_MP_AHB5ENSETR, 0, GPIOZ, _UNKNOWN_SEL),
+       STM32MP1_CLK_SET_CLR(RCC_MP_AHB5ENSETR, 6, RNG1_K, _UNKNOWN_SEL),
 
        STM32MP1_CLK_SET_CLR(RCC_MP_AHB6ENSETR, 7, ETHCK_K, _ETH_SEL),
        STM32MP1_CLK_SET_CLR(RCC_MP_AHB6ENSETR, 8, ETHTX, _UNKNOWN_SEL),
index 0ba8bc9f63f9ff62b9cd152082ac59c392ddf765..2f149ff6f8a8e0779c86ddf492721739905203de 100644 (file)
@@ -52,3 +52,19 @@ config CLK_IMX8MN
        select CLK_CCF
        help
          This enables support clock driver for i.MX8MN platforms.
+
+config SPL_CLK_IMX8MP
+       bool "SPL clock support for i.MX8MP"
+       depends on ARCH_IMX8M && SPL
+       select SPL_CLK
+       select SPL_CLK_CCF
+       help
+         This enables SPL DM/DTS support for clock driver in i.MX8MP
+
+config CLK_IMX8MP
+       bool "Clock support for i.MX8MP"
+       depends on ARCH_IMX8M
+       select CLK
+       select CLK_CCF
+       help
+         This enables support clock driver for i.MX8MP platforms.
index 222c5a4e08dc7ae8229be5a683e1fb4fa85b8b79..255a87b18e8d4fdcb339fbce258efc20de3a7302 100644 (file)
@@ -14,3 +14,5 @@ obj-$(CONFIG_$(SPL_TPL_)CLK_IMX8MM) += clk-imx8mm.o clk-pll14xx.o \
                                clk-composite-8m.o
 obj-$(CONFIG_$(SPL_TPL_)CLK_IMX8MN) += clk-imx8mn.o clk-pll14xx.o \
                                clk-composite-8m.o
+obj-$(CONFIG_$(SPL_TPL_)CLK_IMX8MP) += clk-imx8mp.o clk-pll14xx.o \
+                               clk-composite-8m.o
diff --git a/drivers/clk/imx/clk-imx8mp.c b/drivers/clk/imx/clk-imx8mp.c
new file mode 100644 (file)
index 0000000..a2693d2
--- /dev/null
@@ -0,0 +1,362 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright 2019 NXP
+ * Peng Fan <peng.fan@nxp.com>
+ */
+
+#include <common.h>
+#include <clk.h>
+#include <clk-uclass.h>
+#include <dm.h>
+#include <asm/arch/clock.h>
+#include <asm/arch/imx-regs.h>
+#include <dt-bindings/clock/imx8mp-clock.h>
+
+#include "clk.h"
+
+#define PLL_1416X_RATE(_rate, _m, _p, _s)              \
+       {                                               \
+               .rate   =       (_rate),                \
+               .mdiv   =       (_m),                   \
+               .pdiv   =       (_p),                   \
+               .sdiv   =       (_s),                   \
+       }
+
+#define PLL_1443X_RATE(_rate, _m, _p, _s, _k)          \
+       {                                               \
+               .rate   =       (_rate),                \
+               .mdiv   =       (_m),                   \
+               .pdiv   =       (_p),                   \
+               .sdiv   =       (_s),                   \
+               .kdiv   =       (_k),                   \
+       }
+
+static const struct imx_pll14xx_rate_table imx8mp_pll1416x_tbl[] = {
+       PLL_1416X_RATE(1800000000U, 225, 3, 0),
+       PLL_1416X_RATE(1600000000U, 200, 3, 0),
+       PLL_1416X_RATE(1200000000U, 300, 3, 1),
+       PLL_1416X_RATE(1000000000U, 250, 3, 1),
+       PLL_1416X_RATE(800000000U,  200, 3, 1),
+       PLL_1416X_RATE(750000000U,  250, 2, 2),
+       PLL_1416X_RATE(700000000U,  350, 3, 2),
+       PLL_1416X_RATE(600000000U,  300, 3, 2),
+};
+
+static const struct imx_pll14xx_rate_table imx8mp_drampll_tbl[] = {
+       PLL_1443X_RATE(650000000U, 325, 3, 2, 0),
+};
+
+static struct imx_pll14xx_clk imx8mp_dram_pll __initdata = {
+               .type = PLL_1443X,
+               .rate_table = imx8mp_drampll_tbl,
+               .rate_count = ARRAY_SIZE(imx8mp_drampll_tbl),
+};
+
+static struct imx_pll14xx_clk imx8mp_arm_pll __initdata = {
+               .type = PLL_1416X,
+               .rate_table = imx8mp_pll1416x_tbl,
+               .rate_count = ARRAY_SIZE(imx8mp_pll1416x_tbl),
+};
+
+static struct imx_pll14xx_clk imx8mp_sys_pll __initdata = {
+               .type = PLL_1416X,
+               .rate_table = imx8mp_pll1416x_tbl,
+               .rate_count = ARRAY_SIZE(imx8mp_pll1416x_tbl),
+};
+
+static const char *pll_ref_sels[] = { "clock-osc-24m", "dummy", "dummy", "dummy", };
+static const char *dram_pll_bypass_sels[] = {"dram_pll", "dram_pll_ref_sel", };
+static const char *arm_pll_bypass_sels[] = {"arm_pll", "arm_pll_ref_sel", };
+static const char *sys_pll1_bypass_sels[] = {"sys_pll1", "sys_pll1_ref_sel", };
+static const char *sys_pll2_bypass_sels[] = {"sys_pll2", "sys_pll2_ref_sel", };
+static const char *sys_pll3_bypass_sels[] = {"sys_pll3", "sys_pll3_ref_sel", };
+
+static const char *imx8mp_a53_sels[] = {"clock-osc-24m", "arm_pll_out", "sys_pll2_500m",
+                                       "sys_pll2_1000m", "sys_pll1_800m", "sys_pll1_400m",
+                                       "audio_pll1_out", "sys_pll3_out", };
+
+static const char *imx8mp_main_axi_sels[] = {"clock-osc-24m", "sys_pll2_333m", "sys_pll1_800m",
+                                            "sys_pll2_250m", "sys_pll2_1000m", "audio_pll1_out",
+                                            "video_pll1_out", "sys_pll1_100m",};
+
+static const char *imx8mp_nand_usdhc_sels[] = {"clock-osc-24m", "sys_pll1_266m", "sys_pll1_800m",
+                                              "sys_pll2_200m", "sys_pll1_133m", "sys_pll3_out",
+                                              "sys_pll2_250m", "audio_pll1_out", };
+
+static const char *imx8mp_noc_sels[] = {"clock-osc-24m", "sys_pll1_800m", "sys_pll3_out",
+                                       "sys_pll2_1000m", "sys_pll2_500m", "audio_pll1_out",
+                                       "video_pll1_out", "audio_pll2_out", };
+
+static const char *imx8mp_noc_io_sels[] = {"clock-osc-24m", "sys_pll1_800m", "sys_pll3_out",
+                                          "sys_pll2_1000m", "sys_pll2_500m", "audio_pll1_out",
+                                          "video_pll1_out", "audio_pll2_out", };
+
+static const char *imx8mp_ahb_sels[] = {"clock-osc-24m", "sys_pll1_133m", "sys_pll1_800m",
+                                       "sys_pll1_400m", "sys_pll2_125m", "sys_pll3_out",
+                                       "audio_pll1_out", "video_pll1_out", };
+
+static const char *imx8mp_dram_alt_sels[] = {"clock-osc-24m", "sys_pll1_800m", "sys_pll1_100m",
+                                            "sys_pll2_500m", "sys_pll2_1000m", "sys_pll3_out",
+                                            "audio_pll1_out", "sys_pll1_266m", };
+
+static const char *imx8mp_dram_apb_sels[] = {"clock-osc-24m", "sys_pll2_200m", "sys_pll1_40m",
+                                            "sys_pll1_160m", "sys_pll1_800m", "sys_pll3_out",
+                                            "sys_pll2_250m", "audio_pll2_out", };
+
+static const char *imx8mp_i2c5_sels[] = {"clock-osc-24m", "sys_pll1_160m", "sys_pll2_50m",
+                                        "sys_pll3_out", "audio_pll1_out", "video_pll1_out",
+                                        "audio_pll2_out", "sys_pll1_133m", };
+
+static const char *imx8mp_i2c6_sels[] = {"clock-osc-24m", "sys_pll1_160m", "sys_pll2_50m",
+                                        "sys_pll3_out", "audio_pll1_out", "video_pll1_out",
+                                        "audio_pll2_out", "sys_pll1_133m", };
+
+static const char *imx8mp_usdhc1_sels[] = {"clock-osc-24m", "sys_pll1_400m", "sys_pll1_800m",
+                                          "sys_pll2_500m", "sys_pll3_out", "sys_pll1_266m",
+                                          "audio_pll2_out", "sys_pll1_100m", };
+
+static const char *imx8mp_usdhc2_sels[] = {"clock-osc-24m", "sys_pll1_400m", "sys_pll1_800m",
+                                          "sys_pll2_500m", "sys_pll3_out", "sys_pll1_266m",
+                                          "audio_pll2_out", "sys_pll1_100m", };
+
+static const char *imx8mp_i2c1_sels[] = {"clock-osc-24m", "sys_pll1_160m", "sys_pll2_50m",
+                                        "sys_pll3_out", "audio_pll1_out", "video_pll1_out",
+                                        "audio_pll2_out", "sys_pll1_133m", };
+
+static const char *imx8mp_i2c2_sels[] = {"clock-osc-24m", "sys_pll1_160m", "sys_pll2_50m",
+                                        "sys_pll3_out", "audio_pll1_out", "video_pll1_out",
+                                        "audio_pll2_out", "sys_pll1_133m", };
+
+static const char *imx8mp_i2c3_sels[] = {"clock-osc-24m", "sys_pll1_160m", "sys_pll2_50m",
+                                        "sys_pll3_out", "audio_pll1_out", "video_pll1_out",
+                                        "audio_pll2_out", "sys_pll1_133m", };
+
+static const char *imx8mp_i2c4_sels[] = {"clock-osc-24m", "sys_pll1_160m", "sys_pll2_50m",
+                                        "sys_pll3_out", "audio_pll1_out", "video_pll1_out",
+                                        "audio_pll2_out", "sys_pll1_133m", };
+
+static const char *imx8mp_uart1_sels[] = {"clock-osc-24m", "sys_pll1_80m", "sys_pll2_200m",
+                                         "sys_pll2_100m", "sys_pll3_out", "clk_ext2",
+                                         "clk_ext4", "audio_pll2_out", };
+
+static const char *imx8mp_uart2_sels[] = {"clock-osc-24m", "sys_pll1_80m", "sys_pll2_200m",
+                                         "sys_pll2_100m", "sys_pll3_out", "clk_ext2",
+                                         "clk_ext3", "audio_pll2_out", };
+
+static const char *imx8mp_uart3_sels[] = {"clock-osc-24m", "sys_pll1_80m", "sys_pll2_200m",
+                                         "sys_pll2_100m", "sys_pll3_out", "clk_ext2",
+                                         "clk_ext4", "audio_pll2_out", };
+
+static const char *imx8mp_uart4_sels[] = {"clock-osc-24m", "sys_pll1_80m", "sys_pll2_200m",
+                                         "sys_pll2_100m", "sys_pll3_out", "clk_ext2",
+                                         "clk_ext3", "audio_pll2_out", };
+
+static const char *imx8mp_gic_sels[] = {"clock-osc-24m", "sys_pll2_200m", "sys_pll1_40m",
+                                       "sys_pll2_100m", "sys_pll1_800m",
+                                       "sys_pll2_500m", "clk_ext4", "audio_pll2_out" };
+
+static const char *imx8mp_wdog_sels[] = {"clock-osc-24m", "sys_pll1_133m", "sys_pll1_160m",
+                                        "vpu_pll_out", "sys_pll2_125m", "sys_pll3_out",
+                                        "sys_pll1_80m", "sys_pll2_166m" };
+
+static const char *imx8mp_usdhc3_sels[] = {"clock-osc-24m", "sys_pll1_400m", "sys_pll1_800m",
+                                          "sys_pll2_500m", "sys_pll3_out", "sys_pll1_266m",
+                                          "audio_pll2_out", "sys_pll1_100m", };
+
+static const char *imx8mp_dram_core_sels[] = {"dram_pll_out", "dram_alt_root", };
+
+
+static ulong imx8mp_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 imx8mp_clk_set_rate(struct clk *clk, unsigned long 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 __imx8mp_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 imx8mp_clk_disable(struct clk *clk)
+{
+       return __imx8mp_clk_enable(clk, 0);
+}
+
+static int imx8mp_clk_enable(struct clk *clk)
+{
+       return __imx8mp_clk_enable(clk, 1);
+}
+
+static struct clk_ops imx8mp_clk_ops = {
+       .set_rate = imx8mp_clk_set_rate,
+       .get_rate = imx8mp_clk_get_rate,
+       .enable = imx8mp_clk_enable,
+       .disable = imx8mp_clk_disable,
+};
+
+static int imx8mp_clk_probe(struct udevice *dev)
+{
+       void __iomem *base;
+
+       base = (void *)ANATOP_BASE_ADDR;
+
+       clk_dm(IMX8MP_DRAM_PLL_REF_SEL, imx_clk_mux("dram_pll_ref_sel", base + 0x50, 0, 2, pll_ref_sels, ARRAY_SIZE(pll_ref_sels)));
+       clk_dm(IMX8MP_ARM_PLL_REF_SEL, imx_clk_mux("arm_pll_ref_sel", base + 0x84, 0, 2, pll_ref_sels, ARRAY_SIZE(pll_ref_sels)));
+       clk_dm(IMX8MP_SYS_PLL1_REF_SEL, imx_clk_mux("sys_pll1_ref_sel", base + 0x94, 0, 2, pll_ref_sels, ARRAY_SIZE(pll_ref_sels)));
+       clk_dm(IMX8MP_SYS_PLL2_REF_SEL, imx_clk_mux("sys_pll2_ref_sel", base + 0x104, 0, 2, pll_ref_sels, ARRAY_SIZE(pll_ref_sels)));
+       clk_dm(IMX8MP_SYS_PLL3_REF_SEL, imx_clk_mux("sys_pll3_ref_sel", base + 0x114, 0, 2, pll_ref_sels, ARRAY_SIZE(pll_ref_sels)));
+
+       clk_dm(IMX8MP_DRAM_PLL, imx_clk_pll14xx("dram_pll", "dram_pll_ref_sel", base + 0x50, &imx8mp_dram_pll));
+       clk_dm(IMX8MP_ARM_PLL, imx_clk_pll14xx("arm_pll", "arm_pll_ref_sel", base + 0x84, &imx8mp_arm_pll));
+       clk_dm(IMX8MP_SYS_PLL1, imx_clk_pll14xx("sys_pll1", "sys_pll1_ref_sel", base + 0x94, &imx8mp_sys_pll));
+       clk_dm(IMX8MP_SYS_PLL2, imx_clk_pll14xx("sys_pll2", "sys_pll2_ref_sel", base + 0x104, &imx8mp_sys_pll));
+       clk_dm(IMX8MP_SYS_PLL3, imx_clk_pll14xx("sys_pll3", "sys_pll3_ref_sel", base + 0x114, &imx8mp_sys_pll));
+
+       clk_dm(IMX8MP_DRAM_PLL_BYPASS, imx_clk_mux_flags("dram_pll_bypass", base + 0x50, 4, 1, dram_pll_bypass_sels, ARRAY_SIZE(dram_pll_bypass_sels), CLK_SET_RATE_PARENT));
+       clk_dm(IMX8MP_ARM_PLL_BYPASS, imx_clk_mux_flags("arm_pll_bypass", base + 0x84, 4, 1, arm_pll_bypass_sels, ARRAY_SIZE(arm_pll_bypass_sels), CLK_SET_RATE_PARENT));
+       clk_dm(IMX8MP_SYS_PLL1_BYPASS, imx_clk_mux_flags("sys_pll1_bypass", base + 0x94, 4, 1, sys_pll1_bypass_sels, ARRAY_SIZE(sys_pll1_bypass_sels), CLK_SET_RATE_PARENT));
+       clk_dm(IMX8MP_SYS_PLL2_BYPASS, imx_clk_mux_flags("sys_pll2_bypass", base + 0x104, 4, 1, sys_pll2_bypass_sels, ARRAY_SIZE(sys_pll2_bypass_sels), CLK_SET_RATE_PARENT));
+       clk_dm(IMX8MP_SYS_PLL3_BYPASS, imx_clk_mux_flags("sys_pll3_bypass", base + 0x114, 4, 1, sys_pll3_bypass_sels, ARRAY_SIZE(sys_pll3_bypass_sels), CLK_SET_RATE_PARENT));
+
+       clk_dm(IMX8MP_DRAM_PLL_OUT, imx_clk_gate("dram_pll_out", "dram_pll_bypass", base + 0x50, 13));
+       clk_dm(IMX8MP_ARM_PLL_OUT, imx_clk_gate("arm_pll_out", "arm_pll_bypass", base + 0x84, 11));
+       clk_dm(IMX8MP_SYS_PLL1_OUT, imx_clk_gate("sys_pll1_out", "sys_pll1_bypass", base + 0x94, 11));
+       clk_dm(IMX8MP_SYS_PLL2_OUT, imx_clk_gate("sys_pll2_out", "sys_pll2_bypass", base + 0x104, 11));
+       clk_dm(IMX8MP_SYS_PLL3_OUT, imx_clk_gate("sys_pll3_out", "sys_pll3_bypass", base + 0x114, 11));
+
+       clk_dm(IMX8MP_SYS_PLL1_40M, imx_clk_fixed_factor("sys_pll1_40m", "sys_pll1_out", 1, 20));
+       clk_dm(IMX8MP_SYS_PLL1_80M, imx_clk_fixed_factor("sys_pll1_80m", "sys_pll1_out", 1, 10));
+       clk_dm(IMX8MP_SYS_PLL1_100M, imx_clk_fixed_factor("sys_pll1_100m", "sys_pll1_out", 1, 8));
+       clk_dm(IMX8MP_SYS_PLL1_133M, imx_clk_fixed_factor("sys_pll1_133m", "sys_pll1_out", 1, 6));
+       clk_dm(IMX8MP_SYS_PLL1_160M, imx_clk_fixed_factor("sys_pll1_160m", "sys_pll1_out", 1, 5));
+       clk_dm(IMX8MP_SYS_PLL1_200M, imx_clk_fixed_factor("sys_pll1_200m", "sys_pll1_out", 1, 4));
+       clk_dm(IMX8MP_SYS_PLL1_266M, imx_clk_fixed_factor("sys_pll1_266m", "sys_pll1_out", 1, 3));
+       clk_dm(IMX8MP_SYS_PLL1_400M, imx_clk_fixed_factor("sys_pll1_400m", "sys_pll1_out", 1, 2));
+       clk_dm(IMX8MP_SYS_PLL1_800M, imx_clk_fixed_factor("sys_pll1_800m", "sys_pll1_out", 1, 1));
+
+       clk_dm(IMX8MP_SYS_PLL2_50M, imx_clk_fixed_factor("sys_pll2_50m", "sys_pll2_out", 1, 20));
+       clk_dm(IMX8MP_SYS_PLL2_100M, imx_clk_fixed_factor("sys_pll2_100m", "sys_pll2_out", 1, 10));
+       clk_dm(IMX8MP_SYS_PLL2_125M, imx_clk_fixed_factor("sys_pll2_125m", "sys_pll2_out", 1, 8));
+       clk_dm(IMX8MP_SYS_PLL2_166M, imx_clk_fixed_factor("sys_pll2_166m", "sys_pll2_out", 1, 6));
+       clk_dm(IMX8MP_SYS_PLL2_200M, imx_clk_fixed_factor("sys_pll2_200m", "sys_pll2_out", 1, 5));
+       clk_dm(IMX8MP_SYS_PLL2_250M, imx_clk_fixed_factor("sys_pll2_250m", "sys_pll2_out", 1, 4));
+       clk_dm(IMX8MP_SYS_PLL2_333M, imx_clk_fixed_factor("sys_pll2_333m", "sys_pll2_out", 1, 3));
+       clk_dm(IMX8MP_SYS_PLL2_500M, imx_clk_fixed_factor("sys_pll2_500m", "sys_pll2_out", 1, 2));
+       clk_dm(IMX8MP_SYS_PLL2_1000M, imx_clk_fixed_factor("sys_pll2_1000m", "sys_pll2_out", 1, 1));
+
+       base = dev_read_addr_ptr(dev);
+       if (base == (void *)FDT_ADDR_T_NONE)
+               return -EINVAL;
+
+       clk_dm(IMX8MP_CLK_A53_SRC, imx_clk_mux2("arm_a53_src", base + 0x8000, 24, 3, imx8mp_a53_sels, ARRAY_SIZE(imx8mp_a53_sels)));
+       clk_dm(IMX8MP_CLK_A53_CG, imx_clk_gate3("arm_a53_cg", "arm_a53_src", base + 0x8000, 28));
+       clk_dm(IMX8MP_CLK_A53_DIV, imx_clk_divider2("arm_a53_div", "arm_a53_cg", base + 0x8000, 0, 3));
+
+       clk_dm(IMX8MP_CLK_MAIN_AXI, imx8m_clk_composite_critical("main_axi", imx8mp_main_axi_sels, base + 0x8800));
+       clk_dm(IMX8MP_CLK_NAND_USDHC_BUS, imx8m_clk_composite_critical("nand_usdhc_bus", imx8mp_nand_usdhc_sels, base + 0x8900));
+       clk_dm(IMX8MP_CLK_NOC, imx8m_clk_composite_critical("noc", imx8mp_noc_sels, base + 0x8d00));
+       clk_dm(IMX8MP_CLK_NOC_IO, imx8m_clk_composite_critical("noc_io", imx8mp_noc_io_sels, base + 0x8d80));
+
+       clk_dm(IMX8MP_CLK_AHB, imx8m_clk_composite_critical("ahb_root", imx8mp_ahb_sels, base + 0x9000));
+
+       clk_dm(IMX8MP_CLK_IPG_ROOT, imx_clk_divider2("ipg_root", "ahb_root", base + 0x9080, 0, 1));
+
+       clk_dm(IMX8MP_CLK_DRAM_ALT, imx8m_clk_composite("dram_alt", imx8mp_dram_alt_sels, base + 0xa000));
+       clk_dm(IMX8MP_CLK_DRAM_APB, imx8m_clk_composite_critical("dram_apb", imx8mp_dram_apb_sels, base + 0xa080));
+       clk_dm(IMX8MP_CLK_I2C5, imx8m_clk_composite("i2c5", imx8mp_i2c5_sels, base + 0xa480));
+       clk_dm(IMX8MP_CLK_I2C6, imx8m_clk_composite("i2c6", imx8mp_i2c6_sels, base + 0xa500));
+       clk_dm(IMX8MP_CLK_USDHC1, imx8m_clk_composite("usdhc1", imx8mp_usdhc1_sels, base + 0xac00));
+       clk_dm(IMX8MP_CLK_USDHC2, imx8m_clk_composite("usdhc2", imx8mp_usdhc2_sels, base + 0xac80));
+       clk_dm(IMX8MP_CLK_I2C1, imx8m_clk_composite("i2c1", imx8mp_i2c1_sels, base + 0xad00));
+       clk_dm(IMX8MP_CLK_I2C2, imx8m_clk_composite("i2c2", imx8mp_i2c2_sels, base + 0xad80));
+       clk_dm(IMX8MP_CLK_I2C3, imx8m_clk_composite("i2c3", imx8mp_i2c3_sels, base + 0xae00));
+       clk_dm(IMX8MP_CLK_I2C4, imx8m_clk_composite("i2c4", imx8mp_i2c4_sels, base + 0xae80));
+
+       clk_dm(IMX8MP_CLK_UART1, imx8m_clk_composite("uart1", imx8mp_uart1_sels, base + 0xaf00));
+       clk_dm(IMX8MP_CLK_UART2, imx8m_clk_composite("uart2", imx8mp_uart2_sels, base + 0xaf80));
+       clk_dm(IMX8MP_CLK_UART3, imx8m_clk_composite("uart3", imx8mp_uart3_sels, base + 0xb000));
+       clk_dm(IMX8MP_CLK_UART4, imx8m_clk_composite("uart4", imx8mp_uart4_sels, base + 0xb080));
+       clk_dm(IMX8MP_CLK_GIC, imx8m_clk_composite_critical("gic", imx8mp_gic_sels, base + 0xb200));
+
+       clk_dm(IMX8MP_CLK_WDOG, imx8m_clk_composite("wdog", imx8mp_wdog_sels, base + 0xb900));
+       clk_dm(IMX8MP_CLK_USDHC3, imx8m_clk_composite("usdhc3", imx8mp_usdhc3_sels, base + 0xbc80));
+
+       clk_dm(IMX8MP_CLK_DRAM_ALT_ROOT, imx_clk_fixed_factor("dram_alt_root", "dram_alt", 1, 4));
+       clk_dm(IMX8MP_CLK_DRAM_CORE, imx_clk_mux2_flags("dram_core_clk", base + 0x9800, 24, 1, imx8mp_dram_core_sels, ARRAY_SIZE(imx8mp_dram_core_sels), CLK_IS_CRITICAL));
+
+       clk_dm(IMX8MP_CLK_DRAM1_ROOT, imx_clk_gate4_flags("dram1_root_clk", "dram_core_clk", base + 0x4050, 0, CLK_IS_CRITICAL));
+       clk_dm(IMX8MP_CLK_GPIO1_ROOT, imx_clk_gate4("gpio1_root_clk", "ipg_root", base + 0x40b0, 0));
+       clk_dm(IMX8MP_CLK_GPIO2_ROOT, imx_clk_gate4("gpio2_root_clk", "ipg_root", base + 0x40c0, 0));
+       clk_dm(IMX8MP_CLK_GPIO3_ROOT, imx_clk_gate4("gpio3_root_clk", "ipg_root", base + 0x40d0, 0));
+       clk_dm(IMX8MP_CLK_GPIO4_ROOT, imx_clk_gate4("gpio4_root_clk", "ipg_root", base + 0x40e0, 0));
+       clk_dm(IMX8MP_CLK_GPIO5_ROOT, imx_clk_gate4("gpio5_root_clk", "ipg_root", base + 0x40f0, 0));
+       clk_dm(IMX8MP_CLK_I2C1_ROOT, imx_clk_gate4("i2c1_root_clk", "i2c1", base + 0x4170, 0));
+       clk_dm(IMX8MP_CLK_I2C2_ROOT, imx_clk_gate4("i2c2_root_clk", "i2c2", base + 0x4180, 0));
+       clk_dm(IMX8MP_CLK_I2C3_ROOT, imx_clk_gate4("i2c3_root_clk", "i2c3", base + 0x4190, 0));
+       clk_dm(IMX8MP_CLK_I2C4_ROOT, imx_clk_gate4("i2c4_root_clk", "i2c4", base + 0x41a0, 0));
+       clk_dm(IMX8MP_CLK_I2C5_ROOT, imx_clk_gate2("i2c5_root_clk", "i2c5", base + 0x4330, 0));
+       clk_dm(IMX8MP_CLK_I2C6_ROOT, imx_clk_gate2("i2c6_root_clk", "i2c6", base + 0x4340, 0));
+       clk_dm(IMX8MP_CLK_UART1_ROOT, imx_clk_gate4("uart1_root_clk", "uart1", base + 0x4490, 0));
+       clk_dm(IMX8MP_CLK_UART2_ROOT, imx_clk_gate4("uart2_root_clk", "uart2", base + 0x44a0, 0));
+       clk_dm(IMX8MP_CLK_UART3_ROOT, imx_clk_gate4("uart3_root_clk", "uart3", base + 0x44b0, 0));
+       clk_dm(IMX8MP_CLK_UART4_ROOT, imx_clk_gate4("uart4_root_clk", "uart4", base + 0x44c0, 0));
+       clk_dm(IMX8MP_CLK_USDHC1_ROOT, imx_clk_gate4("usdhc1_root_clk", "usdhc1", base + 0x4510, 0));
+       clk_dm(IMX8MP_CLK_USDHC2_ROOT, imx_clk_gate4("usdhc2_root_clk", "usdhc2", base + 0x4520, 0));
+       clk_dm(IMX8MP_CLK_WDOG1_ROOT, imx_clk_gate4("wdog1_root_clk", "wdog", base + 0x4530, 0));
+       clk_dm(IMX8MP_CLK_WDOG2_ROOT, imx_clk_gate4("wdog2_root_clk", "wdog", base + 0x4540, 0));
+       clk_dm(IMX8MP_CLK_WDOG3_ROOT, imx_clk_gate4("wdog3_root_clk", "wdog", base + 0x4550, 0));
+
+       clk_dm(IMX8MP_CLK_USDHC3_ROOT, imx_clk_gate4("usdhc3_root_clk", "usdhc3", base + 0x45e0, 0));
+
+       return 0;
+}
+
+static const struct udevice_id imx8mp_clk_ids[] = {
+       { .compatible = "fsl,imx8mp-ccm" },
+       { },
+};
+
+U_BOOT_DRIVER(imx8mp_clk) = {
+       .name = "clk_imx8mp",
+       .id = UCLASS_CLK,
+       .of_match = imx8mp_clk_ids,
+       .ops = &imx8mp_clk_ops,
+       .probe = imx8mp_clk_probe,
+       .flags = DM_FLAG_PRE_RELOC,
+};
index 07dcf94ea58668a4bded25a114ec6a2924120b56..60f287046b9ee102e97b4ad62c5753f75e9750b4 100644 (file)
@@ -125,6 +125,16 @@ static inline struct clk *imx_clk_mux_flags(const char *name,
                                width, 0);
 }
 
+static inline struct clk *imx_clk_mux2_flags(const char *name,
+               void __iomem *reg, u8 shift, u8 width,
+               const char * const *parents,
+               int num_parents, unsigned long flags)
+{
+       return clk_register_mux(NULL, name, parents, num_parents,
+                       flags | CLK_SET_RATE_NO_REPARENT | CLK_OPS_PARENT_ENABLE,
+                       reg, shift, width, 0);
+}
+
 static inline struct clk *imx_clk_mux(const char *name, void __iomem *reg,
                        u8 shift, u8 width, const char * const *parents,
                        int num_parents)
index 2b1c1be3b51295da37cc774e53f674d25cbec9a0..8f590dc5f611a36b88488ec3e1f3a9f097e322dd 100644 (file)
@@ -1,8 +1,8 @@
 config SPL_ALTERA_SDRAM
        bool "SoCFPGA DDR SDRAM driver in SPL"
        depends on SPL
-       depends on TARGET_SOCFPGA_GEN5 || TARGET_SOCFPGA_ARRIA10 || TARGET_SOCFPGA_STRATIX10
-       select RAM if TARGET_SOCFPGA_GEN5 || TARGET_SOCFPGA_STRATIX10
-       select SPL_RAM if TARGET_SOCFPGA_GEN5 || TARGET_SOCFPGA_STRATIX10
+       depends on TARGET_SOCFPGA_GEN5 || TARGET_SOCFPGA_ARRIA10 || TARGET_SOCFPGA_STRATIX10 || TARGET_SOCFPGA_AGILEX
+       select RAM if TARGET_SOCFPGA_GEN5 || TARGET_SOCFPGA_STRATIX10 || TARGET_SOCFPGA_AGILEX
+       select SPL_RAM if TARGET_SOCFPGA_GEN5 || TARGET_SOCFPGA_STRATIX10 || TARGET_SOCFPGA_AGILEX
        help
          Enable DDR SDRAM controller for the SoCFPGA devices.
index 341ac0d73b84c087d433be780d87338b0bbe8e7d..39dfee5d5a6c0204392852918bf20ffdd740302b 100644 (file)
@@ -9,5 +9,6 @@
 ifdef CONFIG_$(SPL_)ALTERA_SDRAM
 obj-$(CONFIG_TARGET_SOCFPGA_GEN5) += sdram_gen5.o sequencer.o
 obj-$(CONFIG_TARGET_SOCFPGA_ARRIA10) += sdram_arria10.o
-obj-$(CONFIG_TARGET_SOCFPGA_STRATIX10) += sdram_s10.o
+obj-$(CONFIG_TARGET_SOCFPGA_STRATIX10) += sdram_soc64.o sdram_s10.o
+obj-$(CONFIG_TARGET_SOCFPGA_AGILEX) += sdram_soc64.o sdram_agilex.o
 endif
diff --git a/drivers/ddr/altera/sdram_agilex.c b/drivers/ddr/altera/sdram_agilex.c
new file mode 100644 (file)
index 0000000..0cbcd14
--- /dev/null
@@ -0,0 +1,168 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (C) 2019 Intel Corporation <www.intel.com>
+ *
+ */
+
+#include <common.h>
+#include <dm.h>
+#include <errno.h>
+#include <div64.h>
+#include <fdtdec.h>
+#include <ram.h>
+#include <reset.h>
+#include "sdram_soc64.h"
+#include <wait_bit.h>
+#include <asm/arch/firewall.h>
+#include <asm/arch/reset_manager.h>
+#include <asm/arch/system_manager.h>
+#include <asm/io.h>
+#include <linux/sizes.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+int sdram_mmr_init_full(struct udevice *dev)
+{
+       struct altera_sdram_platdata *plat = dev->platdata;
+       struct altera_sdram_priv *priv = dev_get_priv(dev);
+       u32 i;
+       int ret;
+       phys_size_t hw_size;
+       bd_t bd = {0};
+
+       /* Ensure HMC clock is running */
+       if (poll_hmc_clock_status()) {
+               debug("DDR: Error as HMC clock was not running\n");
+               return -EPERM;
+       }
+
+       /* Trying 3 times to do a calibration */
+       for (i = 0; i < 3; i++) {
+               ret = wait_for_bit_le32((const void *)(plat->hmc +
+                                       DDRCALSTAT),
+                                       DDR_HMC_DDRCALSTAT_CAL_MSK, true, 1000,
+                                       false);
+               if (!ret)
+                       break;
+
+               emif_reset(plat);
+       }
+
+       if (ret) {
+               puts("DDR: Error as SDRAM calibration failed\n");
+               return -EPERM;
+       }
+       debug("DDR: Calibration success\n");
+
+       /*
+        * Configure the DDR IO size
+        * niosreserve0: Used to indicate DDR width &
+        *      bit[7:0] = Number of data bits (bit[6:5] 0x01=32bit, 0x10=64bit)
+        *      bit[8]   = 1 if user-mode OCT is present
+        *      bit[9]   = 1 if warm reset compiled into EMIF Cal Code
+        *      bit[10]  = 1 if warm reset is on during generation in EMIF Cal
+        * niosreserve1: IP ADCDS version encoded as 16 bit value
+        *      bit[2:0] = Variant (0=not special,1=FAE beta, 2=Customer beta,
+        *                          3=EAP, 4-6 are reserved)
+        *      bit[5:3] = Service Pack # (e.g. 1)
+        *      bit[9:6] = Minor Release #
+        *      bit[14:10] = Major Release #
+        */
+       /* Configure DDR IO size x16, x32 and x64 mode */
+       u32 update_value;
+
+       update_value = hmc_readl(plat, NIOSRESERVED0);
+       update_value = (update_value & 0xFF) >> 5;
+
+       /* Configure DDR data rate 0-HAlf-rate 1-Quarter-rate */
+       update_value |= (hmc_readl(plat, CTRLCFG3) & 0x4);
+       hmc_ecc_writel(plat, update_value, DDRIOCTRL);
+
+       /* Copy values MMR IOHMC dramaddrw to HMC adp DRAMADDRWIDTH */
+       hmc_ecc_writel(plat, hmc_readl(plat, DRAMADDRW), DRAMADDRWIDTH);
+
+       /* assigning the SDRAM size */
+       phys_size_t size = sdram_calculate_size(plat);
+
+       if (size <= 0)
+               hw_size = PHYS_SDRAM_1_SIZE;
+       else
+               hw_size = size;
+
+       /* Get bank configuration from devicetree */
+       ret = fdtdec_decode_ram_size(gd->fdt_blob, NULL, 0, NULL,
+                                    (phys_size_t *)&gd->ram_size, &bd);
+       if (ret) {
+               puts("DDR: Failed to decode memory node\n");
+               return -ENXIO;
+       }
+
+       if (gd->ram_size != hw_size) {
+               printf("DDR: Warning: DRAM size from device tree (%lld MiB)\n",
+                      gd->ram_size >> 20);
+               printf(" mismatch with hardware (%lld MiB).\n",
+                      hw_size >> 20);
+       }
+
+       if (gd->ram_size > hw_size) {
+               printf("DDR: Error: DRAM size from device tree is greater\n");
+               printf(" than hardware size.\n");
+               hang();
+       }
+
+       printf("DDR: %lld MiB\n", gd->ram_size >> 20);
+
+       /* This enables nonsecure access to DDR */
+       /* mpuregion0addr_limit */
+       FW_MPU_DDR_SCR_WRITEL(gd->ram_size - 1,
+                             FW_MPU_DDR_SCR_MPUREGION0ADDR_LIMIT);
+       FW_MPU_DDR_SCR_WRITEL(0x1F, FW_MPU_DDR_SCR_MPUREGION0ADDR_LIMITEXT);
+
+       /* nonmpuregion0addr_limit */
+       FW_MPU_DDR_SCR_WRITEL(gd->ram_size - 1,
+                             FW_MPU_DDR_SCR_NONMPUREGION0ADDR_LIMIT);
+
+       /* Enable mpuregion0enable and nonmpuregion0enable */
+       FW_MPU_DDR_SCR_WRITEL(MPUREGION0_ENABLE | NONMPUREGION0_ENABLE,
+                             FW_MPU_DDR_SCR_EN_SET);
+
+       u32 ctrlcfg1 = hmc_readl(plat, CTRLCFG1);
+
+       /* Enable or disable the DDR ECC */
+       if (CTRLCFG1_CFG_CTRL_EN_ECC(ctrlcfg1)) {
+               setbits_le32(plat->hmc + ECCCTRL1,
+                            (DDR_HMC_ECCCTL_AWB_CNT_RST_SET_MSK |
+                             DDR_HMC_ECCCTL_CNT_RST_SET_MSK |
+                             DDR_HMC_ECCCTL_ECC_EN_SET_MSK));
+               clrbits_le32(plat->hmc + ECCCTRL1,
+                            (DDR_HMC_ECCCTL_AWB_CNT_RST_SET_MSK |
+                             DDR_HMC_ECCCTL_CNT_RST_SET_MSK));
+               setbits_le32(plat->hmc + ECCCTRL2,
+                            (DDR_HMC_ECCCTL2_RMW_EN_SET_MSK |
+                             DDR_HMC_ECCCTL2_AWB_EN_SET_MSK));
+               setbits_le32(plat->hmc + ERRINTEN,
+                            DDR_HMC_ERRINTEN_DERRINTEN_EN_SET_MSK);
+
+               if (!cpu_has_been_warmreset())
+                       sdram_init_ecc_bits(&bd);
+       } else {
+               clrbits_le32(plat->hmc + ECCCTRL1,
+                            (DDR_HMC_ECCCTL_AWB_CNT_RST_SET_MSK |
+                             DDR_HMC_ECCCTL_CNT_RST_SET_MSK |
+                             DDR_HMC_ECCCTL_ECC_EN_SET_MSK));
+               clrbits_le32(plat->hmc + ECCCTRL2,
+                            (DDR_HMC_ECCCTL2_RMW_EN_SET_MSK |
+                             DDR_HMC_ECCCTL2_AWB_EN_SET_MSK));
+       }
+
+       /* Enable non-secure reads/writes to HMC Adapter for SDRAM ECC */
+       writel(FW_HMC_ADAPTOR_MPU_MASK, FW_HMC_ADAPTOR_REG_ADDR);
+
+       sdram_size_check(&bd);
+
+       priv->info.base = bd.bi_dram[0].start;
+       priv->info.size = gd->ram_size;
+
+       debug("DDR: HMC init success\n");
+       return 0;
+}
index 8c8ea19eb9cf3f534041ba61738d1f09f5f1b5fa..435f42bc0ab06525effd5a116bdbe6f06665ced2 100644 (file)
@@ -40,9 +40,6 @@ struct sdram_prot_rule {
        u32     hi_prot_id;
 };
 
-static struct socfpga_system_manager *sysmgr_regs =
-       (struct socfpga_system_manager *)SOCFPGA_SYSMGR_ADDRESS;
-
 static unsigned long sdram_calculate_size(struct socfpga_sdr_ctrl *sdr_ctrl);
 
 /**
@@ -455,12 +452,14 @@ int sdram_mmr_init_full(struct socfpga_sdr_ctrl *sdr_ctrl,
                        SDR_CTRLGRP_DRAMADDRW_ROWBITS_LSB;
        int ret;
 
-       writel(rows, &sysmgr_regs->iswgrp_handoff[4]);
+       writel(rows,
+              socfpga_get_sysmgr_addr() + SYSMGR_ISWGRP_HANDOFF_OFFSET(4));
 
        sdr_load_regs(sdr_ctrl, cfg);
 
        /* saving this value to SYSMGR.ISWGRP.HANDOFF.FPGA2SDR */
-       writel(cfg->fpgaport_rst, &sysmgr_regs->iswgrp_handoff[3]);
+       writel(cfg->fpgaport_rst,
+              socfpga_get_sysmgr_addr() + SYSMGR_ISWGRP_HANDOFF_OFFSET(3));
 
        /* only enable if the FPGA is programmed */
        if (fpgamgr_test_fpga_ready()) {
@@ -516,7 +515,8 @@ static unsigned long sdram_calculate_size(struct socfpga_sdr_ctrl *sdr_ctrl)
         * since the FB specifies we modify ROWBITs to work around SDRAM
         * controller issue.
         */
-       row = readl(&sysmgr_regs->iswgrp_handoff[4]);
+       row = readl(socfpga_get_sysmgr_addr() +
+                   SYSMGR_ISWGRP_HANDOFF_OFFSET(4));
        if (row == 0)
                row = rowbits;
        /*
index 82d9a13efad8b39bd11dc39705cb3849ff8e2654..93c15dd18b3a7ef61edd3b91f351ad8460a87f9b 100644 (file)
 #include <reset.h>
 #include "sdram_s10.h"
 #include <wait_bit.h>
-#include <asm/arch/firewall_s10.h>
-#include <asm/arch/system_manager.h>
+#include <asm/arch/firewall.h>
 #include <asm/arch/reset_manager.h>
 #include <asm/io.h>
 #include <linux/sizes.h>
 
-struct altera_sdram_priv {
-       struct ram_info info;
-       struct reset_ctl_bulk resets;
-};
-
-struct altera_sdram_platdata {
-       void __iomem *hmc;
-       void __iomem *ddr_sch;
-       void __iomem *iomhc;
-};
-
 DECLARE_GLOBAL_DATA_PTR;
 
-static const struct socfpga_system_manager *sysmgr_regs =
-               (void *)SOCFPGA_SYSMGR_ADDRESS;
-
 #define DDR_CONFIG(A, B, C, R) (((A) << 24) | ((B) << 16) | ((C) << 8) | (R))
 
-#define PGTABLE_OFF    0x4000
-
 /* The followring are the supported configurations */
 u32 ddr_config[] = {
        /* DDR_CONFIG(Address order,Bank,Column,Row) */
@@ -66,28 +49,6 @@ u32 ddr_config[] = {
        DDR_CONFIG(1, 4, 10, 17),
 };
 
-static u32 hmc_readl(struct altera_sdram_platdata *plat, u32 reg)
-{
-       return readl(plat->iomhc + reg);
-}
-
-static u32 hmc_ecc_readl(struct altera_sdram_platdata *plat, u32 reg)
-{
-       return readl(plat->hmc + reg);
-}
-
-static u32 hmc_ecc_writel(struct altera_sdram_platdata *plat,
-                         u32 data, u32 reg)
-{
-       return writel(data, plat->hmc + reg);
-}
-
-static u32 ddr_sch_writel(struct altera_sdram_platdata *plat, u32 data,
-                         u32 reg)
-{
-       return writel(data, plat->ddr_sch + reg);
-}
-
 int match_ddr_conf(u32 ddr_conf)
 {
        int i;
@@ -99,192 +60,12 @@ int match_ddr_conf(u32 ddr_conf)
        return 0;
 }
 
-static int emif_clear(struct altera_sdram_platdata *plat)
-{
-       hmc_ecc_writel(plat, 0, RSTHANDSHAKECTRL);
-
-       return wait_for_bit_le32((const void *)(plat->hmc +
-                                RSTHANDSHAKESTAT),
-                                DDR_HMC_RSTHANDSHAKE_MASK,
-                                false, 1000, false);
-}
-
-static int emif_reset(struct altera_sdram_platdata *plat)
-{
-       u32 c2s, s2c, ret;
-
-       c2s = hmc_ecc_readl(plat, RSTHANDSHAKECTRL) & DDR_HMC_RSTHANDSHAKE_MASK;
-       s2c = hmc_ecc_readl(plat, RSTHANDSHAKESTAT) & DDR_HMC_RSTHANDSHAKE_MASK;
-
-       debug("DDR: c2s=%08x s2c=%08x nr0=%08x nr1=%08x nr2=%08x dst=%08x\n",
-             c2s, s2c, hmc_readl(plat, NIOSRESERVED0),
-             hmc_readl(plat, NIOSRESERVED1), hmc_readl(plat, NIOSRESERVED2),
-             hmc_readl(plat, DRAMSTS));
-
-       if (s2c && emif_clear(plat)) {
-               printf("DDR: emif_clear() failed\n");
-               return -1;
-       }
-
-       debug("DDR: Triggerring emif reset\n");
-       hmc_ecc_writel(plat, DDR_HMC_CORE2SEQ_INT_REQ, RSTHANDSHAKECTRL);
-
-       /* if seq2core[3] = 0, we are good */
-       ret = wait_for_bit_le32((const void *)(plat->hmc +
-                                RSTHANDSHAKESTAT),
-                                DDR_HMC_SEQ2CORE_INT_RESP_MASK,
-                                false, 1000, false);
-       if (ret) {
-               printf("DDR: failed to get ack from EMIF\n");
-               return ret;
-       }
-
-       ret = emif_clear(plat);
-       if (ret) {
-               printf("DDR: emif_clear() failed\n");
-               return ret;
-       }
-
-       debug("DDR: %s triggered successly\n", __func__);
-       return 0;
-}
-
-static int poll_hmc_clock_status(void)
-{
-       return wait_for_bit_le32(&sysmgr_regs->hmc_clk,
-                                SYSMGR_HMC_CLK_STATUS_MSK, true, 1000, false);
-}
-
-static void sdram_clear_mem(phys_addr_t addr, phys_size_t size)
-{
-       phys_size_t i;
-
-       if (addr % CONFIG_SYS_CACHELINE_SIZE) {
-               printf("DDR: address 0x%llx is not cacheline size aligned.\n",
-                      addr);
-               hang();
-       }
-
-       if (size % CONFIG_SYS_CACHELINE_SIZE) {
-               printf("DDR: size 0x%llx is not multiple of cacheline size\n",
-                      size);
-               hang();
-       }
-
-       /* Use DC ZVA instruction to clear memory to zeros by a cache line */
-       for (i = 0; i < size; i = i + CONFIG_SYS_CACHELINE_SIZE) {
-               asm volatile("dc zva, %0"
-                    :
-                    : "r"(addr)
-                    : "memory");
-               addr += CONFIG_SYS_CACHELINE_SIZE;
-       }
-}
-
-static void sdram_init_ecc_bits(bd_t *bd)
-{
-       phys_size_t size, size_init;
-       phys_addr_t start_addr;
-       int bank = 0;
-       unsigned int start = get_timer(0);
-
-       icache_enable();
-
-       start_addr = bd->bi_dram[0].start;
-       size = bd->bi_dram[0].size;
-
-       /* Initialize small block for page table */
-       memset((void *)start_addr, 0, PGTABLE_SIZE + PGTABLE_OFF);
-       gd->arch.tlb_addr = start_addr + PGTABLE_OFF;
-       gd->arch.tlb_size = PGTABLE_SIZE;
-       start_addr += PGTABLE_SIZE + PGTABLE_OFF;
-       size -= (PGTABLE_OFF + PGTABLE_SIZE);
-       dcache_enable();
-
-       while (1) {
-               while (size) {
-                       size_init = min((phys_addr_t)SZ_1G, (phys_addr_t)size);
-                       sdram_clear_mem(start_addr, size_init);
-                       size -= size_init;
-                       start_addr += size_init;
-                       WATCHDOG_RESET();
-               }
-
-               bank++;
-               if (bank >= CONFIG_NR_DRAM_BANKS)
-                       break;
-
-               start_addr = bd->bi_dram[bank].start;
-               size = bd->bi_dram[bank].size;
-       }
-
-       dcache_disable();
-       icache_disable();
-
-       printf("SDRAM-ECC: Initialized success with %d ms\n",
-              (unsigned int)get_timer(start));
-}
-
-static void sdram_size_check(bd_t *bd)
-{
-       phys_size_t total_ram_check = 0;
-       phys_size_t ram_check = 0;
-       phys_addr_t start = 0;
-       int bank;
-
-       /* Sanity check ensure correct SDRAM size specified */
-       debug("DDR: Running SDRAM size sanity check\n");
-
-       for (bank = 0; bank < CONFIG_NR_DRAM_BANKS; bank++) {
-               start = bd->bi_dram[bank].start;
-               while (ram_check < bd->bi_dram[bank].size) {
-                       ram_check += get_ram_size((void *)(start + ram_check),
-                                                (phys_size_t)SZ_1G);
-               }
-               total_ram_check += ram_check;
-               ram_check = 0;
-       }
-
-       /* If the ram_size is 2GB smaller, we can assume the IO space is
-        * not mapped in.  gd->ram_size is the actual size of the dram
-        * not the accessible size.
-        */
-       if (total_ram_check != gd->ram_size) {
-               puts("DDR: SDRAM size check failed!\n");
-               hang();
-       }
-
-       debug("DDR: SDRAM size check passed!\n");
-}
-
-/**
- * sdram_calculate_size() - Calculate SDRAM size
- *
- * Calculate SDRAM device size based on SDRAM controller parameters.
- * Size is specified in bytes.
- */
-static phys_size_t sdram_calculate_size(struct altera_sdram_platdata *plat)
-{
-       u32 dramaddrw = hmc_readl(plat, DRAMADDRW);
-
-       phys_size_t size = 1 << (DRAMADDRW_CFG_CS_ADDR_WIDTH(dramaddrw) +
-                        DRAMADDRW_CFG_BANK_GRP_ADDR_WIDTH(dramaddrw) +
-                        DRAMADDRW_CFG_BANK_ADDR_WIDTH(dramaddrw) +
-                        DRAMADDRW_CFG_ROW_ADDR_WIDTH(dramaddrw) +
-                        DRAMADDRW_CFG_COL_ADDR_WIDTH(dramaddrw));
-
-       size *= (2 << (hmc_ecc_readl(plat, DDRIOCTRL) &
-                       DDR_HMC_DDRIOCTRL_IOSIZE_MSK));
-
-       return size;
-}
-
 /**
  * sdram_mmr_init_full() - Function to initialize SDRAM MMR
  *
  * Initialize the SDRAM MMR.
  */
-static int sdram_mmr_init_full(struct udevice *dev)
+int sdram_mmr_init_full(struct udevice *dev)
 {
        struct altera_sdram_platdata *plat = dev->platdata;
        struct altera_sdram_priv *priv = dev_get_priv(dev);
@@ -324,6 +105,20 @@ static int sdram_mmr_init_full(struct udevice *dev)
        clrbits_le32(CCU_REG_ADDR(CCU_IOM_MPRT_ADBASE_MEMSPACE1E),
                     CCU_ADBASE_DI_MASK);
 
+       /* Enable access to DDR from TCU */
+       clrbits_le32(CCU_REG_ADDR(CCU_TCU_MPRT_ADBASE_MEMSPACE0),
+                    CCU_ADBASE_DI_MASK);
+       clrbits_le32(CCU_REG_ADDR(CCU_TCU_MPRT_ADBASE_MEMSPACE1A),
+                    CCU_ADBASE_DI_MASK);
+       clrbits_le32(CCU_REG_ADDR(CCU_TCU_MPRT_ADBASE_MEMSPACE1B),
+                    CCU_ADBASE_DI_MASK);
+       clrbits_le32(CCU_REG_ADDR(CCU_TCU_MPRT_ADBASE_MEMSPACE1C),
+                    CCU_ADBASE_DI_MASK);
+       clrbits_le32(CCU_REG_ADDR(CCU_TCU_MPRT_ADBASE_MEMSPACE1D),
+                    CCU_ADBASE_DI_MASK);
+       clrbits_le32(CCU_REG_ADDR(CCU_TCU_MPRT_ADBASE_MEMSPACE1E),
+                    CCU_ADBASE_DI_MASK);
+
        /* this enables nonsecure access to DDR */
        /* mpuregion0addr_limit */
        FW_MPU_DDR_SCR_WRITEL(0xFFFF0000, FW_MPU_DDR_SCR_MPUREGION0ADDR_LIMIT);
@@ -512,9 +307,6 @@ static int sdram_mmr_init_full(struct udevice *dev)
                              DDR_HMC_ECCCTL2_AWB_EN_SET_MSK));
                hmc_ecc_writel(plat, DDR_HMC_ERRINTEN_INTMASK, ERRINTENS);
 
-               /* Enable non-secure writes to HMC Adapter for SDRAM ECC */
-               writel(FW_HMC_ADAPTOR_MPU_MASK, FW_HMC_ADAPTOR_REG_ADDR);
-
                /* Initialize memory content if not from warm reset */
                if (!cpu_has_been_warmreset())
                        sdram_init_ecc_bits(&bd);
@@ -528,6 +320,9 @@ static int sdram_mmr_init_full(struct udevice *dev)
                              DDR_HMC_ECCCTL2_AWB_EN_SET_MSK));
        }
 
+       /* Enable non-secure reads/writes to HMC Adapter for SDRAM ECC */
+       writel(FW_HMC_ADAPTOR_MPU_MASK, FW_HMC_ADAPTOR_REG_ADDR);
+
        sdram_size_check(&bd);
 
        priv->info.base = bd.bi_dram[0].start;
@@ -537,80 +332,3 @@ static int sdram_mmr_init_full(struct udevice *dev)
        return 0;
 }
 
-static int altera_sdram_ofdata_to_platdata(struct udevice *dev)
-{
-       struct altera_sdram_platdata *plat = dev->platdata;
-       fdt_addr_t addr;
-
-       addr = dev_read_addr_index(dev, 0);
-       if (addr == FDT_ADDR_T_NONE)
-               return -EINVAL;
-       plat->ddr_sch = (void __iomem *)addr;
-
-       addr = dev_read_addr_index(dev, 1);
-       if (addr == FDT_ADDR_T_NONE)
-               return -EINVAL;
-       plat->iomhc = (void __iomem *)addr;
-
-       addr = dev_read_addr_index(dev, 2);
-       if (addr == FDT_ADDR_T_NONE)
-               return -EINVAL;
-       plat->hmc = (void __iomem *)addr;
-
-       return 0;
-}
-
-static int altera_sdram_probe(struct udevice *dev)
-{
-       int ret;
-       struct altera_sdram_priv *priv = dev_get_priv(dev);
-
-       ret = reset_get_bulk(dev, &priv->resets);
-       if (ret) {
-               dev_err(dev, "Can't get reset: %d\n", ret);
-               return -ENODEV;
-       }
-       reset_deassert_bulk(&priv->resets);
-
-       if (sdram_mmr_init_full(dev) != 0) {
-               puts("SDRAM init failed.\n");
-               goto failed;
-       }
-
-       return 0;
-
-failed:
-       reset_release_bulk(&priv->resets);
-       return -ENODEV;
-}
-
-static int altera_sdram_get_info(struct udevice *dev,
-                                struct ram_info *info)
-{
-       struct altera_sdram_priv *priv = dev_get_priv(dev);
-
-       info->base = priv->info.base;
-       info->size = priv->info.size;
-
-       return 0;
-}
-
-static struct ram_ops altera_sdram_ops = {
-       .get_info = altera_sdram_get_info,
-};
-
-static const struct udevice_id altera_sdram_ids[] = {
-       { .compatible = "altr,sdr-ctl-s10" },
-       { /* sentinel */ }
-};
-
-U_BOOT_DRIVER(altera_sdram) = {
-       .name = "altr_sdr_ctl",
-       .id = UCLASS_RAM,
-       .of_match = altera_sdram_ids,
-       .ops = &altera_sdram_ops,
-       .ofdata_to_platdata = altera_sdram_ofdata_to_platdata,
-       .platdata_auto_alloc_size = sizeof(struct altera_sdram_platdata),
-       .probe = altera_sdram_probe,
-       .priv_auto_alloc_size = sizeof(struct altera_sdram_priv),
-};
index 096c06cba210dec463be1509013d17eecd3bb6c8..cca4cb35ec23d778717c9b02bd54844da7b78e1f 100644 (file)
 #define DDR_READ_LATENCY_DELAY         40
 #define DDR_ACTIVATE_FAWBANK           0x1
 
-/* ECC HMC registers */
-#define DDRIOCTRL                      0x8
-#define DDRCALSTAT                     0xc
-#define DRAMADDRWIDTH                  0xe0
-#define ECCCTRL1                       0x100
-#define ECCCTRL2                       0x104
-#define ERRINTEN                       0x110
-#define ERRINTENS                      0x114
-#define INTMODE                                0x11c
-#define INTSTAT                                0x120
-#define AUTOWB_CORRADDR                        0x138
-#define ECC_REG2WRECCDATABUS           0x144
-#define ECC_DIAGON                     0x150
-#define ECC_DECSTAT                    0x154
-#define HPSINTFCSEL                    0x210
-#define RSTHANDSHAKECTRL               0x214
-#define RSTHANDSHAKESTAT               0x218
-
-#define DDR_HMC_DDRIOCTRL_IOSIZE_MSK           0x00000003
-#define DDR_HMC_DDRCALSTAT_CAL_MSK             BIT(0)
-#define DDR_HMC_ECCCTL_AWB_CNT_RST_SET_MSK     BIT(16)
-#define DDR_HMC_ECCCTL_CNT_RST_SET_MSK         BIT(8)
-#define DDR_HMC_ECCCTL_ECC_EN_SET_MSK          BIT(0)
-#define DDR_HMC_ECCCTL2_RMW_EN_SET_MSK         BIT(8)
-#define DDR_HMC_ECCCTL2_AWB_EN_SET_MSK         BIT(0)
-#define DDR_HMC_ECC_DIAGON_ECCDIAGON_EN_SET_MSK        BIT(16)
-#define DDR_HMC_ECC_DIAGON_WRDIAGON_EN_SET_MSK BIT(0)
-#define DDR_HMC_ERRINTEN_SERRINTEN_EN_SET_MSK  BIT(0)
-#define DDR_HMC_ERRINTEN_DERRINTEN_EN_SET_MSK  BIT(1)
-#define DDR_HMC_INTSTAT_SERRPENA_SET_MSK       BIT(0)
-#define DDR_HMC_INTSTAT_DERRPENA_SET_MSK       BIT(1)
-#define DDR_HMC_INTSTAT_ADDRMTCFLG_SET_MSK     BIT(16)
-#define DDR_HMC_INTMODE_INTMODE_SET_MSK                BIT(0)
-#define DDR_HMC_RSTHANDSHAKE_MASK              0x000000ff
-#define DDR_HMC_CORE2SEQ_INT_REQ               0xF
-#define DDR_HMC_SEQ2CORE_INT_RESP_MASK         BIT(3)
-#define DDR_HMC_HPSINTFCSEL_ENABLE_MASK                0x001f1f1f
-
-#define        DDR_HMC_ERRINTEN_INTMASK                                \
-               (DDR_HMC_ERRINTEN_SERRINTEN_EN_SET_MSK |        \
-                DDR_HMC_ERRINTEN_DERRINTEN_EN_SET_MSK)
-
 /* NOC DDR scheduler */
 #define DDR_SCH_ID_COREID              0
 #define DDR_SCH_ID_REVID               0x4
 #define DDR_SCH_DEVTODEV_BUSRDTOWR_OFF         2
 #define DDR_SCH_DEVTODEV_BUSWRTORD_OFF         4
 
-/* HMC MMR IO48 registers */
-#define CTRLCFG0                       0x28
-#define CTRLCFG1                       0x2c
-#define DRAMTIMING0                    0x50
-#define CALTIMING0                     0x7c
-#define CALTIMING1                     0x80
-#define CALTIMING2                     0x84
-#define CALTIMING3                     0x88
-#define CALTIMING4                     0x8c
-#define CALTIMING9                     0xa0
-#define DRAMADDRW                      0xa8
-#define DRAMSTS                                0xec
-#define NIOSRESERVED0                  0x110
-#define NIOSRESERVED1                  0x114
-#define NIOSRESERVED2                  0x118
-
-#define DRAMADDRW_CFG_COL_ADDR_WIDTH(x)                        \
-       (((x) >> 0) & 0x1F)
-#define DRAMADDRW_CFG_ROW_ADDR_WIDTH(x)                        \
-       (((x) >> 5) & 0x1F)
-#define DRAMADDRW_CFG_BANK_ADDR_WIDTH(x)               \
-       (((x) >> 10) & 0xF)
-#define DRAMADDRW_CFG_BANK_GRP_ADDR_WIDTH(x)           \
-       (((x) >> 14) & 0x3)
-#define DRAMADDRW_CFG_CS_ADDR_WIDTH(x)                 \
-       (((x) >> 16) & 0x7)
-
-#define CTRLCFG0_CFG_MEMTYPE(x)                                \
-       (((x) >> 0) & 0xF)
-#define CTRLCFG0_CFG_DIMM_TYPE(x)                      \
-       (((x) >> 4) & 0x7)
-#define CTRLCFG0_CFG_AC_POS(x)                         \
-       (((x) >> 7) & 0x3)
-#define CTRLCFG0_CFG_CTRL_BURST_LEN(x)                 \
-       (((x) >> 9) & 0x1F)
-
-#define CTRLCFG1_CFG_DBC3_BURST_LEN(x)                 \
-       (((x) >> 0) & 0x1F)
-#define CTRLCFG1_CFG_ADDR_ORDER(x)                     \
-       (((x) >> 5) & 0x3)
-#define CTRLCFG1_CFG_CTRL_EN_ECC(x)                    \
-       (((x) >> 7) & 0x1)
-
-#define DRAMTIMING0_CFG_TCL(x)                         \
-       (((x) >> 0) & 0x7F)
-
-#define CALTIMING0_CFG_ACT_TO_RDWR(x)                  \
-       (((x) >> 0) & 0x3F)
-#define CALTIMING0_CFG_ACT_TO_PCH(x)                   \
-       (((x) >> 6) & 0x3F)
-#define CALTIMING0_CFG_ACT_TO_ACT(x)                   \
-       (((x) >> 12) & 0x3F)
-#define CALTIMING0_CFG_ACT_TO_ACT_DB(x)                        \
-       (((x) >> 18) & 0x3F)
-
-#define CALTIMING1_CFG_RD_TO_RD(x)                     \
-       (((x) >> 0) & 0x3F)
-#define CALTIMING1_CFG_RD_TO_RD_DC(x)                  \
-       (((x) >> 6) & 0x3F)
-#define CALTIMING1_CFG_RD_TO_RD_DB(x)                  \
-       (((x) >> 12) & 0x3F)
-#define CALTIMING1_CFG_RD_TO_WR(x)                     \
-       (((x) >> 18) & 0x3F)
-#define CALTIMING1_CFG_RD_TO_WR_DC(x)                  \
-       (((x) >> 24) & 0x3F)
-
-#define CALTIMING2_CFG_RD_TO_WR_DB(x)                  \
-       (((x) >> 0) & 0x3F)
-#define CALTIMING2_CFG_RD_TO_WR_PCH(x)                 \
-       (((x) >> 6) & 0x3F)
-#define CALTIMING2_CFG_RD_AP_TO_VALID(x)               \
-       (((x) >> 12) & 0x3F)
-#define CALTIMING2_CFG_WR_TO_WR(x)                     \
-       (((x) >> 18) & 0x3F)
-#define CALTIMING2_CFG_WR_TO_WR_DC(x)                  \
-       (((x) >> 24) & 0x3F)
-
-#define CALTIMING3_CFG_WR_TO_WR_DB(x)                  \
-       (((x) >> 0) & 0x3F)
-#define CALTIMING3_CFG_WR_TO_RD(x)                     \
-       (((x) >> 6) & 0x3F)
-#define CALTIMING3_CFG_WR_TO_RD_DC(x)                  \
-       (((x) >> 12) & 0x3F)
-#define CALTIMING3_CFG_WR_TO_RD_DB(x)                  \
-       (((x) >> 18) & 0x3F)
-#define CALTIMING3_CFG_WR_TO_PCH(x)                    \
-       (((x) >> 24) & 0x3F)
-
-#define CALTIMING4_CFG_WR_AP_TO_VALID(x)               \
-       (((x) >> 0) & 0x3F)
-#define CALTIMING4_CFG_PCH_TO_VALID(x)                 \
-       (((x) >> 6) & 0x3F)
-#define CALTIMING4_CFG_PCH_ALL_TO_VALID(x)             \
-       (((x) >> 12) & 0x3F)
-#define CALTIMING4_CFG_ARF_TO_VALID(x)                 \
-       (((x) >> 18) & 0xFF)
-#define CALTIMING4_CFG_PDN_TO_VALID(x)                 \
-       (((x) >> 26) & 0x3F)
-
-#define CALTIMING9_CFG_4_ACT_TO_ACT(x)                 \
-       (((x) >> 0) & 0xFF)
-
-/* Firewall DDR scheduler MPFE */
-#define FW_HMC_ADAPTOR_REG_ADDR                        0xf8020004
-#define FW_HMC_ADAPTOR_MPU_MASK                        BIT(0)
+#include "sdram_soc64.h"
 
 #endif /* _SDRAM_S10_H_ */
diff --git a/drivers/ddr/altera/sdram_soc64.c b/drivers/ddr/altera/sdram_soc64.c
new file mode 100644 (file)
index 0000000..985a108
--- /dev/null
@@ -0,0 +1,305 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (C) 2016-2019 Intel Corporation <www.intel.com>
+ *
+ */
+
+#include <common.h>
+#include <cpu_func.h>
+#include <dm.h>
+#include <errno.h>
+#include <div64.h>
+#include <fdtdec.h>
+#include <ram.h>
+#include <reset.h>
+#include "sdram_soc64.h"
+#include <wait_bit.h>
+#include <asm/arch/firewall.h>
+#include <asm/arch/system_manager.h>
+#include <asm/arch/reset_manager.h>
+#include <asm/io.h>
+#include <linux/sizes.h>
+
+#define PGTABLE_OFF    0x4000
+
+u32 hmc_readl(struct altera_sdram_platdata *plat, u32 reg)
+{
+       return readl(plat->iomhc + reg);
+}
+
+u32 hmc_ecc_readl(struct altera_sdram_platdata *plat, u32 reg)
+{
+       return readl(plat->hmc + reg);
+}
+
+u32 hmc_ecc_writel(struct altera_sdram_platdata *plat,
+                  u32 data, u32 reg)
+{
+       return writel(data, plat->hmc + reg);
+}
+
+u32 ddr_sch_writel(struct altera_sdram_platdata *plat, u32 data,
+                  u32 reg)
+{
+       return writel(data, plat->ddr_sch + reg);
+}
+
+int emif_clear(struct altera_sdram_platdata *plat)
+{
+       hmc_ecc_writel(plat, 0, RSTHANDSHAKECTRL);
+
+       return wait_for_bit_le32((const void *)(plat->hmc +
+                                RSTHANDSHAKESTAT),
+                                DDR_HMC_RSTHANDSHAKE_MASK,
+                                false, 1000, false);
+}
+
+int emif_reset(struct altera_sdram_platdata *plat)
+{
+       u32 c2s, s2c, ret;
+
+       c2s = hmc_ecc_readl(plat, RSTHANDSHAKECTRL) & DDR_HMC_RSTHANDSHAKE_MASK;
+       s2c = hmc_ecc_readl(plat, RSTHANDSHAKESTAT) & DDR_HMC_RSTHANDSHAKE_MASK;
+
+       debug("DDR: c2s=%08x s2c=%08x nr0=%08x nr1=%08x nr2=%08x dst=%08x\n",
+             c2s, s2c, hmc_readl(plat, NIOSRESERVED0),
+             hmc_readl(plat, NIOSRESERVED1), hmc_readl(plat, NIOSRESERVED2),
+             hmc_readl(plat, DRAMSTS));
+
+       if (s2c && emif_clear(plat)) {
+               printf("DDR: emif_clear() failed\n");
+               return -1;
+       }
+
+       debug("DDR: Triggerring emif reset\n");
+       hmc_ecc_writel(plat, DDR_HMC_CORE2SEQ_INT_REQ, RSTHANDSHAKECTRL);
+
+       /* if seq2core[3] = 0, we are good */
+       ret = wait_for_bit_le32((const void *)(plat->hmc +
+                                RSTHANDSHAKESTAT),
+                                DDR_HMC_SEQ2CORE_INT_RESP_MASK,
+                                false, 1000, false);
+       if (ret) {
+               printf("DDR: failed to get ack from EMIF\n");
+               return ret;
+       }
+
+       ret = emif_clear(plat);
+       if (ret) {
+               printf("DDR: emif_clear() failed\n");
+               return ret;
+       }
+
+       debug("DDR: %s triggered successly\n", __func__);
+       return 0;
+}
+
+int poll_hmc_clock_status(void)
+{
+       return wait_for_bit_le32((const void *)(socfpga_get_sysmgr_addr() +
+                                SYSMGR_SOC64_HMC_CLK),
+                                SYSMGR_HMC_CLK_STATUS_MSK, true, 1000, false);
+}
+
+void sdram_clear_mem(phys_addr_t addr, phys_size_t size)
+{
+       phys_size_t i;
+
+       if (addr % CONFIG_SYS_CACHELINE_SIZE) {
+               printf("DDR: address 0x%llx is not cacheline size aligned.\n",
+                      addr);
+               hang();
+       }
+
+       if (size % CONFIG_SYS_CACHELINE_SIZE) {
+               printf("DDR: size 0x%llx is not multiple of cacheline size\n",
+                      size);
+               hang();
+       }
+
+       /* Use DC ZVA instruction to clear memory to zeros by a cache line */
+       for (i = 0; i < size; i = i + CONFIG_SYS_CACHELINE_SIZE) {
+               asm volatile("dc zva, %0"
+                    :
+                    : "r"(addr)
+                    : "memory");
+               addr += CONFIG_SYS_CACHELINE_SIZE;
+       }
+}
+
+void sdram_init_ecc_bits(bd_t *bd)
+{
+       phys_size_t size, size_init;
+       phys_addr_t start_addr;
+       int bank = 0;
+       unsigned int start = get_timer(0);
+
+       icache_enable();
+
+       start_addr = bd->bi_dram[0].start;
+       size = bd->bi_dram[0].size;
+
+       /* Initialize small block for page table */
+       memset((void *)start_addr, 0, PGTABLE_SIZE + PGTABLE_OFF);
+       gd->arch.tlb_addr = start_addr + PGTABLE_OFF;
+       gd->arch.tlb_size = PGTABLE_SIZE;
+       start_addr += PGTABLE_SIZE + PGTABLE_OFF;
+       size -= (PGTABLE_OFF + PGTABLE_SIZE);
+       dcache_enable();
+
+       while (1) {
+               while (size) {
+                       size_init = min((phys_addr_t)SZ_1G, (phys_addr_t)size);
+                       sdram_clear_mem(start_addr, size_init);
+                       size -= size_init;
+                       start_addr += size_init;
+                       WATCHDOG_RESET();
+               }
+
+               bank++;
+               if (bank >= CONFIG_NR_DRAM_BANKS)
+                       break;
+
+               start_addr = bd->bi_dram[bank].start;
+               size = bd->bi_dram[bank].size;
+       }
+
+       dcache_disable();
+       icache_disable();
+
+       printf("SDRAM-ECC: Initialized success with %d ms\n",
+              (unsigned int)get_timer(start));
+}
+
+void sdram_size_check(bd_t *bd)
+{
+       phys_size_t total_ram_check = 0;
+       phys_size_t ram_check = 0;
+       phys_addr_t start = 0;
+       int bank;
+
+       /* Sanity check ensure correct SDRAM size specified */
+       debug("DDR: Running SDRAM size sanity check\n");
+
+       for (bank = 0; bank < CONFIG_NR_DRAM_BANKS; bank++) {
+               start = bd->bi_dram[bank].start;
+               while (ram_check < bd->bi_dram[bank].size) {
+                       ram_check += get_ram_size((void *)(start + ram_check),
+                                                (phys_size_t)SZ_1G);
+               }
+               total_ram_check += ram_check;
+               ram_check = 0;
+       }
+
+       /* If the ram_size is 2GB smaller, we can assume the IO space is
+        * not mapped in.  gd->ram_size is the actual size of the dram
+        * not the accessible size.
+        */
+       if (total_ram_check != gd->ram_size) {
+               puts("DDR: SDRAM size check failed!\n");
+               hang();
+       }
+
+       debug("DDR: SDRAM size check passed!\n");
+}
+
+/**
+ * sdram_calculate_size() - Calculate SDRAM size
+ *
+ * Calculate SDRAM device size based on SDRAM controller parameters.
+ * Size is specified in bytes.
+ */
+phys_size_t sdram_calculate_size(struct altera_sdram_platdata *plat)
+{
+       u32 dramaddrw = hmc_readl(plat, DRAMADDRW);
+
+       phys_size_t size = 1 << (DRAMADDRW_CFG_CS_ADDR_WIDTH(dramaddrw) +
+                        DRAMADDRW_CFG_BANK_GRP_ADDR_WIDTH(dramaddrw) +
+                        DRAMADDRW_CFG_BANK_ADDR_WIDTH(dramaddrw) +
+                        DRAMADDRW_CFG_ROW_ADDR_WIDTH(dramaddrw) +
+                        DRAMADDRW_CFG_COL_ADDR_WIDTH(dramaddrw));
+
+       size *= (2 << (hmc_ecc_readl(plat, DDRIOCTRL) &
+                       DDR_HMC_DDRIOCTRL_IOSIZE_MSK));
+
+       return size;
+}
+
+static int altera_sdram_ofdata_to_platdata(struct udevice *dev)
+{
+       struct altera_sdram_platdata *plat = dev->platdata;
+       fdt_addr_t addr;
+
+       addr = dev_read_addr_index(dev, 0);
+       if (addr == FDT_ADDR_T_NONE)
+               return -EINVAL;
+       plat->ddr_sch = (void __iomem *)addr;
+
+       addr = dev_read_addr_index(dev, 1);
+       if (addr == FDT_ADDR_T_NONE)
+               return -EINVAL;
+       plat->iomhc = (void __iomem *)addr;
+
+       addr = dev_read_addr_index(dev, 2);
+       if (addr == FDT_ADDR_T_NONE)
+               return -EINVAL;
+       plat->hmc = (void __iomem *)addr;
+
+       return 0;
+}
+
+static int altera_sdram_probe(struct udevice *dev)
+{
+       int ret;
+       struct altera_sdram_priv *priv = dev_get_priv(dev);
+
+       ret = reset_get_bulk(dev, &priv->resets);
+       if (ret) {
+               dev_err(dev, "Can't get reset: %d\n", ret);
+               return -ENODEV;
+       }
+       reset_deassert_bulk(&priv->resets);
+
+       if (sdram_mmr_init_full(dev) != 0) {
+               puts("SDRAM init failed.\n");
+               goto failed;
+       }
+
+       return 0;
+
+failed:
+       reset_release_bulk(&priv->resets);
+       return -ENODEV;
+}
+
+static int altera_sdram_get_info(struct udevice *dev,
+                                struct ram_info *info)
+{
+       struct altera_sdram_priv *priv = dev_get_priv(dev);
+
+       info->base = priv->info.base;
+       info->size = priv->info.size;
+
+       return 0;
+}
+
+static struct ram_ops altera_sdram_ops = {
+       .get_info = altera_sdram_get_info,
+};
+
+static const struct udevice_id altera_sdram_ids[] = {
+       { .compatible = "altr,sdr-ctl-s10" },
+       { .compatible = "intel,sdr-ctl-agilex" },
+       { /* sentinel */ }
+};
+
+U_BOOT_DRIVER(altera_sdram) = {
+       .name = "altr_sdr_ctl",
+       .id = UCLASS_RAM,
+       .of_match = altera_sdram_ids,
+       .ops = &altera_sdram_ops,
+       .ofdata_to_platdata = altera_sdram_ofdata_to_platdata,
+       .platdata_auto_alloc_size = sizeof(struct altera_sdram_platdata),
+       .probe = altera_sdram_probe,
+       .priv_auto_alloc_size = sizeof(struct altera_sdram_priv),
+};
diff --git a/drivers/ddr/altera/sdram_soc64.h b/drivers/ddr/altera/sdram_soc64.h
new file mode 100644 (file)
index 0000000..7b25a80
--- /dev/null
@@ -0,0 +1,187 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2017-2019 Intel Corporation <www.intel.com>
+ */
+
+#ifndef        _SDRAM_SOC64_H_
+#define        _SDRAM_SOC64_H_
+
+#include <common.h>
+#include <linux/sizes.h>
+
+struct altera_sdram_priv {
+       struct ram_info info;
+       struct reset_ctl_bulk resets;
+};
+
+struct altera_sdram_platdata {
+       void __iomem *hmc;
+       void __iomem *ddr_sch;
+       void __iomem *iomhc;
+};
+
+/* ECC HMC registers */
+#define DDRIOCTRL                      0x8
+#define DDRCALSTAT                     0xc
+#define DRAMADDRWIDTH                  0xe0
+#define ECCCTRL1                       0x100
+#define ECCCTRL2                       0x104
+#define ERRINTEN                       0x110
+#define ERRINTENS                      0x114
+#define INTMODE                                0x11c
+#define INTSTAT                                0x120
+#define AUTOWB_CORRADDR                        0x138
+#define ECC_REG2WRECCDATABUS           0x144
+#define ECC_DIAGON                     0x150
+#define ECC_DECSTAT                    0x154
+#define HPSINTFCSEL                    0x210
+#define RSTHANDSHAKECTRL               0x214
+#define RSTHANDSHAKESTAT               0x218
+
+#define DDR_HMC_DDRIOCTRL_IOSIZE_MSK           0x00000003
+#define DDR_HMC_DDRCALSTAT_CAL_MSK             BIT(0)
+#define DDR_HMC_ECCCTL_AWB_CNT_RST_SET_MSK     BIT(16)
+#define DDR_HMC_ECCCTL_CNT_RST_SET_MSK         BIT(8)
+#define DDR_HMC_ECCCTL_ECC_EN_SET_MSK          BIT(0)
+#define DDR_HMC_ECCCTL2_RMW_EN_SET_MSK         BIT(8)
+#define DDR_HMC_ECCCTL2_AWB_EN_SET_MSK         BIT(0)
+#define DDR_HMC_ECC_DIAGON_ECCDIAGON_EN_SET_MSK        BIT(16)
+#define DDR_HMC_ECC_DIAGON_WRDIAGON_EN_SET_MSK BIT(0)
+#define DDR_HMC_ERRINTEN_SERRINTEN_EN_SET_MSK  BIT(0)
+#define DDR_HMC_ERRINTEN_DERRINTEN_EN_SET_MSK  BIT(1)
+#define DDR_HMC_INTSTAT_SERRPENA_SET_MSK       BIT(0)
+#define DDR_HMC_INTSTAT_DERRPENA_SET_MSK       BIT(1)
+#define DDR_HMC_INTSTAT_ADDRMTCFLG_SET_MSK     BIT(16)
+#define DDR_HMC_INTMODE_INTMODE_SET_MSK                BIT(0)
+#define DDR_HMC_RSTHANDSHAKE_MASK              0x000000ff
+#define DDR_HMC_CORE2SEQ_INT_REQ               0xF
+#define DDR_HMC_SEQ2CORE_INT_RESP_MASK         BIT(3)
+#define DDR_HMC_HPSINTFCSEL_ENABLE_MASK                0x001f1f1f
+
+#define        DDR_HMC_ERRINTEN_INTMASK                                \
+               (DDR_HMC_ERRINTEN_SERRINTEN_EN_SET_MSK |        \
+                DDR_HMC_ERRINTEN_DERRINTEN_EN_SET_MSK)
+
+/* HMC MMR IO48 registers */
+#define CTRLCFG0                       0x28
+#define CTRLCFG1                       0x2c
+#define CTRLCFG3                        0x34
+#define DRAMTIMING0                    0x50
+#define CALTIMING0                     0x7c
+#define CALTIMING1                     0x80
+#define CALTIMING2                     0x84
+#define CALTIMING3                     0x88
+#define CALTIMING4                     0x8c
+#define CALTIMING9                     0xa0
+#define DRAMADDRW                      0xa8
+#define DRAMSTS                                0xec
+#define NIOSRESERVED0                  0x110
+#define NIOSRESERVED1                  0x114
+#define NIOSRESERVED2                  0x118
+
+#define DRAMADDRW_CFG_COL_ADDR_WIDTH(x)                        \
+       (((x) >> 0) & 0x1F)
+#define DRAMADDRW_CFG_ROW_ADDR_WIDTH(x)                        \
+       (((x) >> 5) & 0x1F)
+#define DRAMADDRW_CFG_BANK_ADDR_WIDTH(x)               \
+       (((x) >> 10) & 0xF)
+#define DRAMADDRW_CFG_BANK_GRP_ADDR_WIDTH(x)           \
+       (((x) >> 14) & 0x3)
+#define DRAMADDRW_CFG_CS_ADDR_WIDTH(x)                 \
+       (((x) >> 16) & 0x7)
+
+#define CTRLCFG0_CFG_MEMTYPE(x)                                \
+       (((x) >> 0) & 0xF)
+#define CTRLCFG0_CFG_DIMM_TYPE(x)                      \
+       (((x) >> 4) & 0x7)
+#define CTRLCFG0_CFG_AC_POS(x)                         \
+       (((x) >> 7) & 0x3)
+#define CTRLCFG0_CFG_CTRL_BURST_LEN(x)                 \
+       (((x) >> 9) & 0x1F)
+
+#define CTRLCFG1_CFG_DBC3_BURST_LEN(x)                 \
+       (((x) >> 0) & 0x1F)
+#define CTRLCFG1_CFG_ADDR_ORDER(x)                     \
+       (((x) >> 5) & 0x3)
+#define CTRLCFG1_CFG_CTRL_EN_ECC(x)                    \
+       (((x) >> 7) & 0x1)
+
+#define DRAMTIMING0_CFG_TCL(x)                         \
+       (((x) >> 0) & 0x7F)
+
+#define CALTIMING0_CFG_ACT_TO_RDWR(x)                  \
+       (((x) >> 0) & 0x3F)
+#define CALTIMING0_CFG_ACT_TO_PCH(x)                   \
+       (((x) >> 6) & 0x3F)
+#define CALTIMING0_CFG_ACT_TO_ACT(x)                   \
+       (((x) >> 12) & 0x3F)
+#define CALTIMING0_CFG_ACT_TO_ACT_DB(x)                        \
+       (((x) >> 18) & 0x3F)
+
+#define CALTIMING1_CFG_RD_TO_RD(x)                     \
+       (((x) >> 0) & 0x3F)
+#define CALTIMING1_CFG_RD_TO_RD_DC(x)                  \
+       (((x) >> 6) & 0x3F)
+#define CALTIMING1_CFG_RD_TO_RD_DB(x)                  \
+       (((x) >> 12) & 0x3F)
+#define CALTIMING1_CFG_RD_TO_WR(x)                     \
+       (((x) >> 18) & 0x3F)
+#define CALTIMING1_CFG_RD_TO_WR_DC(x)                  \
+       (((x) >> 24) & 0x3F)
+
+#define CALTIMING2_CFG_RD_TO_WR_DB(x)                  \
+       (((x) >> 0) & 0x3F)
+#define CALTIMING2_CFG_RD_TO_WR_PCH(x)                 \
+       (((x) >> 6) & 0x3F)
+#define CALTIMING2_CFG_RD_AP_TO_VALID(x)               \
+       (((x) >> 12) & 0x3F)
+#define CALTIMING2_CFG_WR_TO_WR(x)                     \
+       (((x) >> 18) & 0x3F)
+#define CALTIMING2_CFG_WR_TO_WR_DC(x)                  \
+       (((x) >> 24) & 0x3F)
+
+#define CALTIMING3_CFG_WR_TO_WR_DB(x)                  \
+       (((x) >> 0) & 0x3F)
+#define CALTIMING3_CFG_WR_TO_RD(x)                     \
+       (((x) >> 6) & 0x3F)
+#define CALTIMING3_CFG_WR_TO_RD_DC(x)                  \
+       (((x) >> 12) & 0x3F)
+#define CALTIMING3_CFG_WR_TO_RD_DB(x)                  \
+       (((x) >> 18) & 0x3F)
+#define CALTIMING3_CFG_WR_TO_PCH(x)                    \
+       (((x) >> 24) & 0x3F)
+
+#define CALTIMING4_CFG_WR_AP_TO_VALID(x)               \
+       (((x) >> 0) & 0x3F)
+#define CALTIMING4_CFG_PCH_TO_VALID(x)                 \
+       (((x) >> 6) & 0x3F)
+#define CALTIMING4_CFG_PCH_ALL_TO_VALID(x)             \
+       (((x) >> 12) & 0x3F)
+#define CALTIMING4_CFG_ARF_TO_VALID(x)                 \
+       (((x) >> 18) & 0xFF)
+#define CALTIMING4_CFG_PDN_TO_VALID(x)                 \
+       (((x) >> 26) & 0x3F)
+
+#define CALTIMING9_CFG_4_ACT_TO_ACT(x)                 \
+       (((x) >> 0) & 0xFF)
+
+/* Firewall DDR scheduler MPFE */
+#define FW_HMC_ADAPTOR_REG_ADDR                        0xf8020004
+#define FW_HMC_ADAPTOR_MPU_MASK                        BIT(0)
+
+u32 hmc_readl(struct altera_sdram_platdata *plat, u32 reg);
+u32 hmc_ecc_readl(struct altera_sdram_platdata *plat, u32 reg);
+u32 hmc_ecc_writel(struct altera_sdram_platdata *plat,
+                  u32 data, u32 reg);
+u32 ddr_sch_writel(struct altera_sdram_platdata *plat, u32 data,
+                  u32 reg);
+int emif_clear(struct altera_sdram_platdata *plat);
+int emif_reset(struct altera_sdram_platdata *plat);
+int poll_hmc_clock_status(void);
+void sdram_clear_mem(phys_addr_t addr, phys_size_t size);
+void sdram_init_ecc_bits(bd_t *bd);
+void sdram_size_check(bd_t *bd);
+phys_size_t sdram_calculate_size(struct altera_sdram_platdata *plat);
+int sdram_mmr_init_full(struct udevice *dev);
+
+#endif /* _SDRAM_SOC64_H_ */
index 863fb4389714ce34ad0ef36d9f09988012258e28..9ac7ca923c7b2f3201097e811decbf31a0354dd1 100644 (file)
@@ -106,6 +106,10 @@ int wait_ddrphy_training_complete(void)
 void ddrphy_init_set_dfi_clk(unsigned int drate)
 {
        switch (drate) {
+       case 4000:
+               dram_pll_init(MHZ(1000));
+               dram_disable_bypass();
+               break;
        case 3200:
                dram_pll_init(MHZ(800));
                dram_disable_bypass();
index 75fe0a12c61c31fd89048f2208846a4038676287..9709b6277d65d2c057bbfe6d1980037fc2c4b26e 100644 (file)
@@ -23,6 +23,12 @@ config DFU_TFTP
 
          Detailed description of this feature can be found at ./doc/README.dfutftp
 
+config DFU_TIMEOUT
+       bool "Timeout waiting for DFU"
+       help
+         This option adds an optional timeout parameter for DFU which, if set,
+         will cause DFU to only wait for that many seconds before exiting.
+
 config DFU_MMC
        bool "MMC back end for DFU"
        help
index 38aecd3a0586f42bb9c132398efecc8897d63255..df50196dfda5e16727724569bcb65d4fee7c57a5 100644 (file)
@@ -21,6 +21,9 @@ static LIST_HEAD(dfu_list);
 static int dfu_alt_num;
 static int alt_num_cnt;
 static struct hash_algo *dfu_hash_algo;
+#ifdef CONFIG_DFU_TIMEOUT
+static unsigned long dfu_timeout = 0;
+#endif
 
 /*
  * The purpose of the dfu_flush_callback() function is to
@@ -58,6 +61,18 @@ __weak bool dfu_usb_get_reset(void)
 #endif
 }
 
+#ifdef CONFIG_DFU_TIMEOUT
+void dfu_set_timeout(unsigned long timeout)
+{
+       dfu_timeout = timeout;
+}
+
+unsigned long dfu_get_timeout(void)
+{
+       return dfu_timeout;
+}
+#endif
+
 static int dfu_find_alt_num(const char *s)
 {
        int i = 0;
index 5fb9d6a1911a1148ef5a634759ae5a8ca2d45783..2853581b9756a255d300dfc5ba7ed1549863ff1b 100644 (file)
@@ -30,9 +30,6 @@ DECLARE_GLOBAL_DATA_PTR;
 static const struct socfpga_fpga_manager *fpga_manager_base =
                (void *)SOCFPGA_FPGAMGRREGS_ADDRESS;
 
-static const struct socfpga_system_manager *system_manager_base =
-               (void *)SOCFPGA_SYSMGR_ADDRESS;
-
 static void fpgamgr_set_cd_ratio(unsigned long ratio);
 
 static uint32_t fpgamgr_get_msel(void)
@@ -818,7 +815,7 @@ int socfpga_loadfs(fpga_fs_info *fpga_fsinfo, const void *buf, size_t bsize,
        }
 
        /* Disable all signals from HPS peripheral controller to FPGA */
-       writel(0, &system_manager_base->fpgaintf_en_global);
+       writel(0, socfpga_get_sysmgr_addr() + SYSMGR_A10_FPGAINTF_EN_GLOBAL);
 
        /* Disable all axi bridges (hps2fpga, lwhps2fpga & fpga2hps) */
        socfpga_bridges_reset();
@@ -910,7 +907,7 @@ int socfpga_load(Altera_desc *desc, const void *rbf_data, size_t rbf_size)
        memset(&rbfinfo, 0, sizeof(rbfinfo));
 
        /* Disable all signals from hps peripheral controller to fpga */
-       writel(0, &system_manager_base->fpgaintf_en_global);
+       writel(0, socfpga_get_sysmgr_addr() + SYSMGR_A10_FPGAINTF_EN_GLOBAL);
 
        /* Disable all axi bridge (hps2fpga, lwhps2fpga & fpga2hps) */
        socfpga_bridges_reset();
index 6d16e0b37fb0667accab4e6b620546f34a236377..d73474f29ee13f209066c6c0efaf701702bc2bc2 100644 (file)
@@ -15,8 +15,6 @@
 
 static struct socfpga_fpga_manager *fpgamgr_regs =
        (struct socfpga_fpga_manager *)SOCFPGA_FPGAMGRREGS_ADDRESS;
-static struct socfpga_system_manager *sysmgr_regs =
-       (struct socfpga_system_manager *)SOCFPGA_SYSMGR_ADDRESS;
 
 /* Set CD ratio */
 static void fpgamgr_set_cd_ratio(unsigned long ratio)
@@ -214,7 +212,7 @@ int socfpga_load(Altera_desc *desc, const void *rbf_data, size_t rbf_size)
        /* Prior programming the FPGA, all bridges need to be shut off */
 
        /* Disable all signals from hps peripheral controller to fpga */
-       writel(0, &sysmgr_regs->fpgaintfgrp_module);
+       writel(0, socfpga_get_sysmgr_addr() + SYSMGR_GEN5_FPGAINFGRP_MODULE);
 
        /* Disable all signals from FPGA to HPS SDRAM */
 #define SDR_CTRLGRP_FPGAPORTRST_ADDRESS        0x5080
index 1b945e9727acf7d34546be35a8a21ccd845dd838..80cd8dcedac5dd8f3be4a797976d41392068c164 100644 (file)
 #define BM_OUT_STATUS_LOCKED                   0x00000800
 #define BM_OUT_STATUS_PROGFAIL                 0x00001000
 #elif defined(CONFIG_IMX8M)
+#ifdef CONFIG_IMX8MP
+#undef BM_CTRL_ADDR
+#undef BM_CTRL_ERROR
+#undef BM_CTRL_BUSY
+#define BM_CTRL_ADDR                   0x000001ff
+#define BM_CTRL_ERROR                  0x00000400
+#define BM_CTRL_BUSY                   0x00000200
+#else
 #define BM_CTRL_ADDR                   0x000000ff
+#endif
 #else
 #define BM_CTRL_ADDR                   0x0000007f
 #endif
 #define FUSE_BANKS     31
 #elif defined(CONFIG_IMX8M)
 #define FUSE_BANK_SIZE 0x40
+#ifdef CONFIG_IMX8MP
+#define FUSE_BANKS     96
+#else
 #define FUSE_BANKS     64
+#endif
 #else
 #error "Unsupported architecture\n"
 #endif
index 739c1629a2711f2aa6b30f0cf5142a9fba994988..568a3e77d372d981d143085fb8c15c3f6a1ba169 100644 (file)
 
 DECLARE_GLOBAL_DATA_PTR;
 
-static const struct socfpga_clock_manager *clock_manager_base =
-               (void *)SOCFPGA_CLKMGR_ADDRESS;
-static const struct socfpga_system_manager *system_manager_base =
-               (void *)SOCFPGA_SYSMGR_ADDRESS;
-
 struct socfpga_dwmci_plat {
        struct mmc_config cfg;
        struct mmc mmc;
@@ -56,19 +51,19 @@ static void socfpga_dwmci_clksel(struct dwmci_host *host)
                         ((priv->drvsel & 0x7) << SYSMGR_SDMMC_DRVSEL_SHIFT);
 
        /* Disable SDMMC clock. */
-       clrbits_le32(&clock_manager_base->per_pll.en,
-               CLKMGR_PERPLLGRP_EN_SDMMCCLK_MASK);
+       clrbits_le32(socfpga_get_clkmgr_addr() + CLKMGR_PERPLL_EN,
+                    CLKMGR_PERPLLGRP_EN_SDMMCCLK_MASK);
 
        debug("%s: drvsel %d smplsel %d\n", __func__,
              priv->drvsel, priv->smplsel);
-       writel(sdmmc_mask, &system_manager_base->sdmmcgrp_ctrl);
+       writel(sdmmc_mask, socfpga_get_sysmgr_addr() + SYSMGR_SDMMC);
 
        debug("%s: SYSMGR_SDMMCGRP_CTRL_REG = 0x%x\n", __func__,
-               readl(&system_manager_base->sdmmcgrp_ctrl));
+               readl(socfpga_get_sysmgr_addr() + SYSMGR_SDMMC));
 
        /* Enable SDMMC clock */
-       setbits_le32(&clock_manager_base->per_pll.en,
-               CLKMGR_PERPLLGRP_EN_SDMMCCLK_MASK);
+       setbits_le32(socfpga_get_clkmgr_addr() + CLKMGR_PERPLL_EN,
+                    CLKMGR_PERPLLGRP_EN_SDMMCCLK_MASK);
 }
 
 static int socfpga_dwmmc_get_clk_rate(struct udevice *dev)
index b3844314b3dee3f1bcfda589d44265028a06fb6f..5b7cbb69ae882eacf63ee40829904c0c31b3162a 100644 (file)
@@ -22,6 +22,7 @@ static const struct udevice_id imx8m_pinctrl_match[] = {
        { .compatible = "fsl,imx8mq-iomuxc", .data = (ulong)&imx8mq_pinctrl_soc_info },
        { .compatible = "fsl,imx8mm-iomuxc", .data = (ulong)&imx8mq_pinctrl_soc_info },
        { .compatible = "fsl,imx8mn-iomuxc", .data = (ulong)&imx8mq_pinctrl_soc_info },
+       { .compatible = "fsl,imx8mp-iomuxc", .data = (ulong)&imx8mq_pinctrl_soc_info },
        { /* sentinel */ }
 };
 
index b4bf01867460e527e167271334e7701f16baf8e2..df9372c239e3af05f2e6d4e2de952973b7679bf0 100644 (file)
@@ -77,6 +77,13 @@ config DM_PMIC_FAN53555
          The driver implements read/write operations for use with the FAN53555
          regulator driver and binds the regulator driver to its node.
 
+config DM_PMIC_PCA9450
+       bool "Enable Driver Model for PMIC PCA9450"
+       depends on DM_PMIC
+       help
+         This config enables implementation of driver-model pmic uclass features
+         for PMIC PCA9450. The driver implements read/write operations.
+
 config DM_PMIC_PFUZE100
        bool "Enable Driver Model for PMIC PFUZE100"
        depends on DM_PMIC
index ec6432780564d3f2c86e0ac514e4a7125e6e744a..7b6cb0ee1bd2c7df81908e8386d530637ea465ec 100644 (file)
@@ -10,6 +10,7 @@ obj-$(CONFIG_DM_PMIC_MAX8998) += max8998.o
 obj-$(CONFIG_DM_PMIC_MC34708) += mc34708.o
 obj-$(CONFIG_$(SPL_)DM_PMIC_BD71837) += bd71837.o
 obj-$(CONFIG_$(SPL_)DM_PMIC_PFUZE100) += pfuze100.o
+obj-$(CONFIG_$(SPL_)DM_PMIC_PCA9450) += pca9450.o
 obj-$(CONFIG_PMIC_S2MPS11) += s2mps11.o
 obj-$(CONFIG_DM_PMIC_SANDBOX) += sandbox.o i2c_pmic_emul.o
 obj-$(CONFIG_PMIC_ACT8846) += act8846.o
@@ -31,6 +32,7 @@ obj-$(CONFIG_POWER_MAX77696) += pmic_max77696.o
 obj-$(CONFIG_POWER_MAX8998) += pmic_max8998.o
 obj-$(CONFIG_POWER_MAX8997) += pmic_max8997.o
 obj-$(CONFIG_POWER_MUIC_MAX8997) += muic_max8997.o
+obj-$(CONFIG_POWER_PCA9450) += pmic_pca9450.o
 obj-$(CONFIG_POWER_PFUZE100) += pmic_pfuze100.o
 obj-$(CONFIG_POWER_PFUZE3000) += pmic_pfuze3000.o
 obj-$(CONFIG_POWER_TPS65217) += pmic_tps65217.o
diff --git a/drivers/power/pmic/pca9450.c b/drivers/power/pmic/pca9450.c
new file mode 100644 (file)
index 0000000..77986c4
--- /dev/null
@@ -0,0 +1,93 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright 2019 NXP
+ */
+
+#include <common.h>
+#include <fdtdec.h>
+#include <errno.h>
+#include <dm.h>
+#include <i2c.h>
+#include <power/pmic.h>
+#include <power/regulator.h>
+#include <power/pca9450.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+static const struct pmic_child_info pmic_children_info[] = {
+       /* buck */
+       { .prefix = "b", .driver = PCA9450_REGULATOR_DRIVER},
+       /* ldo */
+       { .prefix = "l", .driver = PCA9450_REGULATOR_DRIVER},
+       { },
+};
+
+static int pca9450_reg_count(struct udevice *dev)
+{
+       return PCA9450_REG_NUM;
+}
+
+static int pca9450_write(struct udevice *dev, uint reg, const uint8_t *buff,
+                        int len)
+{
+       if (dm_i2c_write(dev, reg, buff, len)) {
+               pr_err("write error to device: %p register: %#x!", dev, reg);
+               return -EIO;
+       }
+
+       return 0;
+}
+
+static int pca9450_read(struct udevice *dev, uint reg, uint8_t *buff,
+                       int len)
+{
+       if (dm_i2c_read(dev, reg, buff, len)) {
+               pr_err("read error from device: %p register: %#x!", dev, reg);
+               return -EIO;
+       }
+
+       return 0;
+}
+
+static int pca9450_bind(struct udevice *dev)
+{
+       int children;
+       ofnode regulators_node;
+
+       regulators_node = dev_read_subnode(dev, "regulators");
+       if (!ofnode_valid(regulators_node)) {
+               debug("%s: %s regulators subnode not found!", __func__,
+                     dev->name);
+               return -ENXIO;
+       }
+
+       debug("%s: '%s' - found regulators subnode\n", __func__, dev->name);
+
+       children = pmic_bind_children(dev, regulators_node,
+                                     pmic_children_info);
+       if (!children)
+               debug("%s: %s - no child found\n", __func__, dev->name);
+
+       /* Always return success for this device */
+       return 0;
+}
+
+static struct dm_pmic_ops pca9450_ops = {
+       .reg_count = pca9450_reg_count,
+       .read = pca9450_read,
+       .write = pca9450_write,
+};
+
+static const struct udevice_id pca9450_ids[] = {
+       { .compatible = "nxp,pca9450a", .data = 0x35, },
+       { .compatible = "nxp,pca9450b", .data = 0x25, },
+       { }
+};
+
+U_BOOT_DRIVER(pmic_pca9450) = {
+       .name = "pca9450 pmic",
+       .id = UCLASS_PMIC,
+       .of_match = pca9450_ids,
+       .bind = pca9450_bind,
+       .ops = &pca9450_ops,
+};
diff --git a/drivers/power/pmic/pmic_pca9450.c b/drivers/power/pmic/pmic_pca9450.c
new file mode 100644 (file)
index 0000000..67a9090
--- /dev/null
@@ -0,0 +1,50 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright 2019 NXP
+ */
+
+#include <common.h>
+#include <errno.h>
+#include <i2c.h>
+#include <power/pmic.h>
+#include <power/pca9450.h>
+
+static const char pca9450_name[] = "PCA9450";
+
+int power_pca9450a_init(unsigned char bus)
+{
+       struct pmic *p = pmic_alloc();
+
+       if (!p) {
+               printf("%s: POWER allocation error!\n", __func__);
+               return -ENOMEM;
+       }
+
+       p->name = pca9450_name;
+       p->interface = PMIC_I2C;
+       p->number_of_regs = PCA9450_REG_NUM;
+       p->hw.i2c.addr = 0x35;
+       p->hw.i2c.tx_num = 1;
+       p->bus = bus;
+
+       return 0;
+}
+
+int power_pca9450b_init(unsigned char bus)
+{
+       struct pmic *p = pmic_alloc();
+
+       if (!p) {
+               printf("%s: POWER allocation error!\n", __func__);
+               return -ENOMEM;
+       }
+
+       p->name = pca9450_name;
+       p->interface = PMIC_I2C;
+       p->number_of_regs = PCA9450_REG_NUM;
+       p->hw.i2c.addr = 0x25;
+       p->hw.i2c.tx_num = 1;
+       p->bus = bus;
+
+       return 0;
+}
index 20410865672d9a78223f7d451282789132830a17..939efb2c0d0d9ace36e74b95e59da8479a71c183 100644 (file)
@@ -37,7 +37,11 @@ int regulator_common_ofdata_to_platdata(struct udevice *dev,
        dev_pdata->startup_delay_us = dev_read_u32_default(dev,
                                                        "startup-delay-us", 0);
        dev_pdata->off_on_delay_us =
+               dev_read_u32_default(dev, "off-on-delay-us", 0);
+       if (!dev_pdata->off_on_delay_us) {
+               dev_pdata->off_on_delay_us =
                        dev_read_u32_default(dev, "u-boot,off-on-delay-us", 0);
+       }
 
        return 0;
 }
index e8026cdfbb4631d122906afb2caa5cae76fb420d..538481241f8e071c0dda6d70974dfbff56ff4417 100644 (file)
@@ -8,6 +8,39 @@
 #include <elf.h>
 #include <remoteproc.h>
 
+/**
+ * struct resource_table - firmware resource table header
+ * @ver: version number
+ * @num: number of resource entries
+ * @reserved: reserved (must be zero)
+ * @offset: array of offsets pointing at the various resource entries
+ *
+ * A resource table is essentially a list of system resources required
+ * by the remote processor. It may also include configuration entries.
+ * If needed, the remote processor firmware should contain this table
+ * as a dedicated ".resource_table" ELF section.
+ *
+ * Some resources entries are mere announcements, where the host is informed
+ * of specific remoteproc configuration. Other entries require the host to
+ * do something (e.g. allocate a system resource). Sometimes a negotiation
+ * is expected, where the firmware requests a resource, and once allocated,
+ * the host should provide back its details (e.g. address of an allocated
+ * memory region).
+ *
+ * The header of the resource table, as expressed by this structure,
+ * contains a version number (should we need to change this format in the
+ * future), the number of available resource entries, and their offsets
+ * in the table.
+ *
+ * Immediately following this header are the resource entries themselves.
+ */
+struct resource_table {
+       u32 ver;
+       u32 num;
+       u32 reserved[2];
+       u32 offset[0];
+} __packed;
+
 /* Basic function to verify ELF32 image format */
 int rproc_elf32_sanity_check(ulong addr, ulong size)
 {
@@ -276,3 +309,239 @@ ulong rproc_elf_get_boot_addr(struct udevice *dev, ulong addr)
        else
                return rproc_elf32_get_boot_addr(addr);
 }
+
+/*
+ * Search for the resource table in an ELF32 image.
+ * Returns the address of the resource table section if found, NULL if there is
+ * no resource table section, or error pointer.
+ */
+static Elf32_Shdr *rproc_elf32_find_rsc_table(struct udevice *dev,
+                                             ulong fw_addr, ulong fw_size)
+{
+       int ret;
+       unsigned int i;
+       const char *name_table;
+       struct resource_table *table;
+       const u8 *elf_data = (void *)fw_addr;
+       Elf32_Ehdr *ehdr = (Elf32_Ehdr *)fw_addr;
+       Elf32_Shdr *shdr;
+
+       ret = rproc_elf32_sanity_check(fw_addr, fw_size);
+       if (ret) {
+               pr_debug("Invalid ELF32 Image %d\n", ret);
+               return ERR_PTR(ret);
+       }
+
+       /* look for the resource table and handle it */
+       shdr = (Elf32_Shdr *)(elf_data + ehdr->e_shoff);
+       name_table = (const char *)(elf_data +
+                                   shdr[ehdr->e_shstrndx].sh_offset);
+
+       for (i = 0; i < ehdr->e_shnum; i++, shdr++) {
+               u32 size = shdr->sh_size;
+               u32 offset = shdr->sh_offset;
+
+               if (strcmp(name_table + shdr->sh_name, ".resource_table"))
+                       continue;
+
+               table = (struct resource_table *)(elf_data + offset);
+
+               /* make sure we have the entire table */
+               if (offset + size > fw_size) {
+                       pr_debug("resource table truncated\n");
+                       return ERR_PTR(-ENOSPC);
+               }
+
+               /* make sure table has at least the header */
+               if (sizeof(*table) > size) {
+                       pr_debug("header-less resource table\n");
+                       return ERR_PTR(-ENOSPC);
+               }
+
+               /* we don't support any version beyond the first */
+               if (table->ver != 1) {
+                       pr_debug("unsupported fw ver: %d\n", table->ver);
+                       return ERR_PTR(-EPROTONOSUPPORT);
+               }
+
+               /* make sure reserved bytes are zeroes */
+               if (table->reserved[0] || table->reserved[1]) {
+                       pr_debug("non zero reserved bytes\n");
+                       return ERR_PTR(-EBADF);
+               }
+
+               /* make sure the offsets array isn't truncated */
+               if (table->num * sizeof(table->offset[0]) +
+                                sizeof(*table) > size) {
+                       pr_debug("resource table incomplete\n");
+                       return ERR_PTR(-ENOSPC);
+               }
+
+               return shdr;
+       }
+
+       return NULL;
+}
+
+/* Load the resource table from an ELF32 image */
+int rproc_elf32_load_rsc_table(struct udevice *dev, ulong fw_addr,
+                              ulong fw_size, ulong *rsc_addr, ulong *rsc_size)
+{
+       const struct dm_rproc_ops *ops;
+       Elf32_Shdr *shdr;
+       void *src, *dst;
+
+       shdr = rproc_elf32_find_rsc_table(dev, fw_addr, fw_size);
+       if (!shdr)
+               return -ENODATA;
+       if (IS_ERR(shdr))
+               return PTR_ERR(shdr);
+
+       ops = rproc_get_ops(dev);
+       *rsc_addr = (ulong)shdr->sh_addr;
+       *rsc_size = (ulong)shdr->sh_size;
+
+       src = (void *)fw_addr + shdr->sh_offset;
+       if (ops->device_to_virt)
+               dst = (void *)ops->device_to_virt(dev, *rsc_addr, *rsc_size);
+       else
+               dst = (void *)rsc_addr;
+
+       dev_dbg(dev, "Loading resource table to 0x%8lx (%ld bytes)\n",
+               (ulong)dst, *rsc_size);
+
+       memcpy(dst, src, *rsc_size);
+       flush_cache(rounddown((unsigned long)dst, ARCH_DMA_MINALIGN),
+                   roundup((unsigned long)dst + *rsc_size,
+                           ARCH_DMA_MINALIGN) -
+                   rounddown((unsigned long)dst, ARCH_DMA_MINALIGN));
+
+       return 0;
+}
+
+/*
+ * Search for the resource table in an ELF64 image.
+ * Returns the address of the resource table section if found, NULL if there is
+ * no resource table section, or error pointer.
+ */
+static Elf64_Shdr *rproc_elf64_find_rsc_table(struct udevice *dev,
+                                             ulong fw_addr, ulong fw_size)
+{
+       int ret;
+       unsigned int i;
+       const char *name_table;
+       struct resource_table *table;
+       const u8 *elf_data = (void *)fw_addr;
+       Elf64_Ehdr *ehdr = (Elf64_Ehdr *)fw_addr;
+       Elf64_Shdr *shdr;
+
+       ret = rproc_elf64_sanity_check(fw_addr, fw_size);
+       if (ret) {
+               pr_debug("Invalid ELF64 Image %d\n", ret);
+               return ERR_PTR(ret);
+       }
+
+       /* look for the resource table and handle it */
+       shdr = (Elf64_Shdr *)(elf_data + ehdr->e_shoff);
+       name_table = (const char *)(elf_data +
+                                   shdr[ehdr->e_shstrndx].sh_offset);
+
+       for (i = 0; i < ehdr->e_shnum; i++, shdr++) {
+               u64 size = shdr->sh_size;
+               u64 offset = shdr->sh_offset;
+
+               if (strcmp(name_table + shdr->sh_name, ".resource_table"))
+                       continue;
+
+               table = (struct resource_table *)(elf_data + offset);
+
+               /* make sure we have the entire table */
+               if (offset + size > fw_size) {
+                       pr_debug("resource table truncated\n");
+                       return ERR_PTR(-ENOSPC);
+               }
+
+               /* make sure table has at least the header */
+               if (sizeof(*table) > size) {
+                       pr_debug("header-less resource table\n");
+                       return ERR_PTR(-ENOSPC);
+               }
+
+               /* we don't support any version beyond the first */
+               if (table->ver != 1) {
+                       pr_debug("unsupported fw ver: %d\n", table->ver);
+                       return ERR_PTR(-EPROTONOSUPPORT);
+               }
+
+               /* make sure reserved bytes are zeroes */
+               if (table->reserved[0] || table->reserved[1]) {
+                       pr_debug("non zero reserved bytes\n");
+                       return ERR_PTR(-EBADF);
+               }
+
+               /* make sure the offsets array isn't truncated */
+               if (table->num * sizeof(table->offset[0]) +
+                                sizeof(*table) > size) {
+                       pr_debug("resource table incomplete\n");
+                       return ERR_PTR(-ENOSPC);
+               }
+
+               return shdr;
+       }
+
+       return NULL;
+}
+
+/* Load the resource table from an ELF64 image */
+int rproc_elf64_load_rsc_table(struct udevice *dev, ulong fw_addr,
+                              ulong fw_size, ulong *rsc_addr, ulong *rsc_size)
+{
+       const struct dm_rproc_ops *ops;
+       Elf64_Shdr *shdr;
+       void *src, *dst;
+
+       shdr = rproc_elf64_find_rsc_table(dev, fw_addr, fw_size);
+       if (!shdr)
+               return -ENODATA;
+       if (IS_ERR(shdr))
+               return PTR_ERR(shdr);
+
+       ops = rproc_get_ops(dev);
+       *rsc_addr = (ulong)shdr->sh_addr;
+       *rsc_size = (ulong)shdr->sh_size;
+
+       src = (void *)fw_addr + shdr->sh_offset;
+       if (ops->device_to_virt)
+               dst = (void *)ops->device_to_virt(dev, *rsc_addr, *rsc_size);
+       else
+               dst = (void *)rsc_addr;
+
+       dev_dbg(dev, "Loading resource table to 0x%8lx (%ld bytes)\n",
+               (ulong)dst, *rsc_size);
+
+       memcpy(dst, src, *rsc_size);
+       flush_cache(rounddown((unsigned long)dst, ARCH_DMA_MINALIGN),
+                   roundup((unsigned long)dst + *rsc_size,
+                           ARCH_DMA_MINALIGN) -
+                   rounddown((unsigned long)dst, ARCH_DMA_MINALIGN));
+
+       return 0;
+}
+
+/* Load the resource table from an ELF32 or ELF64 image */
+int rproc_elf_load_rsc_table(struct udevice *dev, ulong fw_addr,
+                            ulong fw_size, ulong *rsc_addr, ulong *rsc_size)
+
+{
+       Elf32_Ehdr *ehdr = (Elf32_Ehdr *)fw_addr;
+
+       if (!fw_addr)
+               return -EFAULT;
+
+       if (ehdr->e_ident[EI_CLASS] == ELFCLASS64)
+               return rproc_elf64_load_rsc_table(dev, fw_addr, fw_size,
+                                                 rsc_addr, rsc_size);
+       else
+               return rproc_elf32_load_rsc_table(dev, fw_addr, fw_size,
+                                                 rsc_addr, rsc_size);
+}
index 40bba3721192bd57bf1bd9c43131bbffa2959955..c25488f54d543636330b8197539608ad47305358 100644 (file)
  * @hold_boot_regmap:  regmap for remote processor reset hold boot
  * @hold_boot_offset:  offset of the register controlling the hold boot setting
  * @hold_boot_mask:    bitmask of the register for the hold boot field
- * @is_running:                is the remote processor running
+ * @rsc_table_addr:    resource table address
  */
 struct stm32_copro_privdata {
        struct reset_ctl reset_ctl;
        struct regmap *hold_boot_regmap;
        uint hold_boot_offset;
        uint hold_boot_mask;
-       bool is_running;
+       ulong rsc_table_addr;
 };
 
 /**
@@ -141,6 +141,7 @@ static void *stm32_copro_device_to_virt(struct udevice *dev, ulong da,
 static int stm32_copro_load(struct udevice *dev, ulong addr, ulong size)
 {
        struct stm32_copro_privdata *priv;
+       ulong rsc_table_size;
        int ret;
 
        priv = dev_get_priv(dev);
@@ -155,6 +156,12 @@ static int stm32_copro_load(struct udevice *dev, ulong addr, ulong size)
                return ret;
        }
 
+       if (rproc_elf32_load_rsc_table(dev, addr, size, &priv->rsc_table_addr,
+                                      &rsc_table_size)) {
+               priv->rsc_table_addr = 0;
+               dev_warn(dev, "No valid resource table for this firmware\n");
+       }
+
        return rproc_elf32_load_image(dev, addr, size);
 }
 
@@ -180,7 +187,12 @@ static int stm32_copro_start(struct udevice *dev)
         * rebooting autonomously
         */
        ret = stm32_copro_set_hold_boot(dev, true);
-       priv->is_running = !ret;
+       writel(ret ? TAMP_COPRO_STATE_OFF : TAMP_COPRO_STATE_CRUN,
+              TAMP_COPRO_STATE);
+       if (!ret)
+               /* Store rsc_address in bkp register */
+               writel(priv->rsc_table_addr, TAMP_COPRO_RSC_TBL_ADDRESS);
+
        return ret;
 }
 
@@ -206,7 +218,7 @@ static int stm32_copro_reset(struct udevice *dev)
                return ret;
        }
 
-       priv->is_running = false;
+       writel(TAMP_COPRO_STATE_OFF, TAMP_COPRO_STATE);
 
        return 0;
 }
@@ -224,14 +236,11 @@ static int stm32_copro_stop(struct udevice *dev)
 /**
  * stm32_copro_is_running() - Is the STM32 remote processor running
  * @dev:       corresponding STM32 remote processor device
- * @return 1 if the remote processor is running, 0 otherwise
+ * @return 0 if the remote processor is running, 1 otherwise
  */
 static int stm32_copro_is_running(struct udevice *dev)
 {
-       struct stm32_copro_privdata *priv;
-
-       priv = dev_get_priv(dev);
-       return priv->is_running;
+       return (readl(TAMP_COPRO_STATE) == TAMP_COPRO_STATE_OFF);
 }
 
 static const struct dm_rproc_ops stm32_copro_ops = {
diff --git a/drivers/rng/Kconfig b/drivers/rng/Kconfig
new file mode 100644 (file)
index 0000000..35a3bd1
--- /dev/null
@@ -0,0 +1,22 @@
+config DM_RNG
+       bool "Driver support for Random Number Generator devices"
+       depends on DM
+       help
+         Enable driver model for random number generator(rng) devices.
+         This interface is used to initialise the rng device and to
+         read the random seed from the device.
+
+config RNG_SANDBOX
+       bool "Sandbox random number generator"
+       depends on SANDBOX && DM_RNG
+       select CONFIG_LIB_RAND
+       help
+         Enable random number generator for sandbox. This is an
+         emulation of a rng device.
+
+config RNG_STM32MP1
+       bool "Enable random number generator for STM32MP1"
+       depends on ARCH_STM32MP && DM_RNG
+       default n
+       help
+         Enable STM32MP1 rng driver.
diff --git a/drivers/rng/Makefile b/drivers/rng/Makefile
new file mode 100644 (file)
index 0000000..3517005
--- /dev/null
@@ -0,0 +1,8 @@
+# SPDX-License-Identifier: GPL-2.0+
+#
+# Copyright (c) 2019, Linaro Limited
+#
+
+obj-$(CONFIG_DM_RNG) += rng-uclass.o
+obj-$(CONFIG_RNG_SANDBOX) += sandbox_rng.o
+obj-$(CONFIG_RNG_STM32MP1) += stm32mp1_rng.o
diff --git a/drivers/rng/rng-uclass.c b/drivers/rng/rng-uclass.c
new file mode 100644 (file)
index 0000000..b6af3b8
--- /dev/null
@@ -0,0 +1,23 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright (c) 2019, Linaro Limited
+ */
+
+#include <common.h>
+#include <dm.h>
+#include <rng.h>
+
+int dm_rng_read(struct udevice *dev, void *buffer, size_t size)
+{
+       const struct dm_rng_ops *ops = device_get_ops(dev);
+
+       if (!ops->read)
+               return -ENOSYS;
+
+       return ops->read(dev, buffer, size);
+}
+
+UCLASS_DRIVER(rng) = {
+       .name = "rng",
+       .id = UCLASS_RNG,
+};
diff --git a/drivers/rng/sandbox_rng.c b/drivers/rng/sandbox_rng.c
new file mode 100644 (file)
index 0000000..cd0b0ac
--- /dev/null
@@ -0,0 +1,56 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (c) 2019, Linaro Limited
+ */
+
+#include <common.h>
+#include <dm.h>
+#include <rng.h>
+
+#include <linux/string.h>
+
+static int sandbox_rng_read(struct udevice *dev, void *data, size_t len)
+{
+       unsigned int i, seed, random;
+       unsigned char *buf = data;
+       size_t nrem, nloops;
+
+       if (!len)
+               return 0;
+
+       nloops = len / sizeof(random);
+       seed = get_timer(0) ^ rand();
+       srand(seed);
+
+       for (i = 0, nrem = len; i < nloops; i++) {
+               random = rand();
+               memcpy(buf, &random, sizeof(random));
+               buf += sizeof(random);
+               nrem -= sizeof(random);
+       }
+
+       if (nrem) {
+               random = rand();
+               memcpy(buf, &random, nrem);
+       }
+
+       return 0;
+}
+
+static const struct dm_rng_ops sandbox_rng_ops = {
+       .read = sandbox_rng_read,
+};
+
+static const struct udevice_id sandbox_rng_match[] = {
+       {
+               .compatible = "sandbox,sandbox-rng",
+       },
+       {},
+};
+
+U_BOOT_DRIVER(sandbox_rng) = {
+       .name = "sandbox-rng",
+       .id = UCLASS_RNG,
+       .of_match = sandbox_rng_match,
+       .ops = &sandbox_rng_ops,
+};
diff --git a/drivers/rng/stm32mp1_rng.c b/drivers/rng/stm32mp1_rng.c
new file mode 100644 (file)
index 0000000..dab3b99
--- /dev/null
@@ -0,0 +1,160 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (c) 2019, Linaro Limited
+ */
+
+#include <common.h>
+#include <clk.h>
+#include <dm.h>
+#include <reset.h>
+#include <rng.h>
+
+#include <asm/io.h>
+#include <linux/iopoll.h>
+#include <linux/kernel.h>
+
+#define RNG_CR 0x00
+#define RNG_CR_RNGEN BIT(2)
+#define RNG_CR_CED BIT(5)
+
+#define RNG_SR 0x04
+#define RNG_SR_SEIS BIT(6)
+#define RNG_SR_CEIS BIT(5)
+#define RNG_SR_SECS BIT(2)
+#define RNG_SR_DRDY BIT(0)
+
+#define RNG_DR 0x08
+
+struct stm32_rng_platdata {
+       fdt_addr_t base;
+       struct clk clk;
+       struct reset_ctl rst;
+};
+
+static int stm32_rng_read(struct udevice *dev, void *data, size_t len)
+{
+       int retval = 0, i;
+       u32 sr, count, reg;
+       size_t increment;
+       struct stm32_rng_platdata *pdata = dev_get_platdata(dev);
+
+       while (len > 0) {
+               retval = readl_poll_timeout(pdata->base + RNG_SR, sr,
+                                           sr & RNG_SR_DRDY, 10000);
+               if (retval)
+                       return retval;
+
+               if (sr & (RNG_SR_SEIS | RNG_SR_SECS)) {
+                       /* As per SoC TRM */
+                       clrbits_le32(pdata->base + RNG_SR, RNG_SR_SEIS);
+                       for (i = 0; i < 12; i++)
+                               readl(pdata->base + RNG_DR);
+                       if (readl(pdata->base + RNG_SR) & RNG_SR_SEIS) {
+                               printf("RNG Noise");
+                               return -EIO;
+                       }
+                       /* start again */
+                       continue;
+               }
+
+               /*
+                * Once the DRDY bit is set, the RNG_DR register can
+                * be read four consecutive times.
+                */
+               count = 4;
+               while (len && count) {
+                       reg = readl(pdata->base + RNG_DR);
+                       memcpy(data, &reg, min(len, sizeof(u32)));
+                       increment = min(len, sizeof(u32));
+                       data += increment;
+                       len -= increment;
+                       count--;
+               }
+       }
+
+       return 0;
+}
+
+static int stm32_rng_init(struct stm32_rng_platdata *pdata)
+{
+       int err;
+
+       err = clk_enable(&pdata->clk);
+       if (err)
+               return err;
+
+       /* Disable CED */
+       writel(RNG_CR_RNGEN | RNG_CR_CED, pdata->base + RNG_CR);
+
+       /* clear error indicators */
+       writel(0, pdata->base + RNG_SR);
+
+       return 0;
+}
+
+static int stm32_rng_cleanup(struct stm32_rng_platdata *pdata)
+{
+       writel(0, pdata->base + RNG_CR);
+
+       return clk_disable(&pdata->clk);
+}
+
+static int stm32_rng_probe(struct udevice *dev)
+{
+       struct stm32_rng_platdata *pdata = dev_get_platdata(dev);
+
+       reset_assert(&pdata->rst);
+       udelay(20);
+       reset_deassert(&pdata->rst);
+
+       return stm32_rng_init(pdata);
+}
+
+static int stm32_rng_remove(struct udevice *dev)
+{
+       struct stm32_rng_platdata *pdata = dev_get_platdata(dev);
+
+       return stm32_rng_cleanup(pdata);
+}
+
+static int stm32_rng_ofdata_to_platdata(struct udevice *dev)
+{
+       struct stm32_rng_platdata *pdata = dev_get_platdata(dev);
+       int err;
+
+       pdata->base = dev_read_addr(dev);
+       if (!pdata->base)
+               return -ENOMEM;
+
+       err = clk_get_by_index(dev, 0, &pdata->clk);
+       if (err)
+               return err;
+
+       err = reset_get_by_index(dev, 0, &pdata->rst);
+       if (err)
+               return err;
+
+       return 0;
+}
+
+static const struct dm_rng_ops stm32_rng_ops = {
+       .read = stm32_rng_read,
+};
+
+static const struct udevice_id stm32_rng_match[] = {
+       {
+               .compatible = "st,stm32-rng",
+       },
+       {},
+};
+
+U_BOOT_DRIVER(stm32_rng) = {
+       .name = "stm32-rng",
+       .id = UCLASS_RNG,
+       .of_match = stm32_rng_match,
+       .ops = &stm32_rng_ops,
+       .probe = stm32_rng_probe,
+       .remove = stm32_rng_remove,
+       .platdata_auto_alloc_size = sizeof(struct stm32_rng_platdata),
+       .ofdata_to_platdata = stm32_rng_ofdata_to_platdata,
+};
index d6c26a5b235c4c835506978b93dea6b2a49a231b..3390b7bdc2c67b2e54304feac68a0fb3c90586fd 100644 (file)
@@ -12,7 +12,7 @@
 #include <asm/arch/reset_manager.h>
 
 struct socfpga_sysreset_data {
-       struct socfpga_reset_manager *rstmgr_base;
+       void __iomem *rstmgr_base;
 };
 
 static int socfpga_sysreset_request(struct udevice *dev,
@@ -23,11 +23,11 @@ static int socfpga_sysreset_request(struct udevice *dev,
        switch (type) {
        case SYSRESET_WARM:
                writel(BIT(RSTMGR_CTRL_SWWARMRSTREQ_LSB),
-                      &data->rstmgr_base->ctrl);
+                      data->rstmgr_base + RSTMGR_CTRL);
                break;
        case SYSRESET_COLD:
                writel(BIT(RSTMGR_CTRL_SWCOLDRSTREQ_LSB),
-                      &data->rstmgr_base->ctrl);
+                      data->rstmgr_base + RSTMGR_CTRL);
                break;
        default:
                return -EPROTONOSUPPORT;
index b71cbfcc0b0a530981a399952e657fbf0b1a7827..eccac2f8f24a4fd0866bdf3c7c1db0789cd88ba0 100644 (file)
@@ -6,6 +6,10 @@
  * Author: Neil Armstrong <narmstrong@baylibre.com>
  */
 
+#include <common.h>
+#include <dm.h>
+#include <asm/io.h>
+
 #include "meson_vpu.h"
 
 /* DMC Registers */
index 2bc9327e1e2b06b5da87b9e107703f9ff300ccb8..8edf451f13f2f9793b2f8f054a5f628903f97357 100644 (file)
@@ -6,6 +6,11 @@
  * Author: Neil Armstrong <narmstrong@baylibre.com>
  */
 
+#include <common.h>
+#include <dm.h>
+#include <asm/io.h>
+#include <linux/bitfield.h>
+
 #include "meson_vpu.h"
 
 /* OSDx_BLKx_CFG */
index 0f628e920ba3823203b8d08bd760de182c1092f2..01bfa4bcb8d618fd83d7d19d856819e0092d3bd9 100644 (file)
@@ -6,6 +6,8 @@
  * Author: Neil Armstrong <narmstrong@baylibre.com>
  */
 
+#include <common.h>
+#include <dm.h>
 #include <edid.h>
 #include "meson_vpu.h"
 #include <linux/iopoll.h>
index 5da4b3f0963aa60a8c5d20a35372e8d11e32fa94..89e859b02a76b335af74763b413b22e2d743d313 100644 (file)
@@ -6,7 +6,11 @@
  * Author: Neil Armstrong <narmstrong@baylibre.com>
  */
 
+#include <common.h>
+#include <dm.h>
 #include <edid.h>
+#include <fdtdec.h>
+#include <asm/io.h>
 #include "meson_vpu.h"
 
 enum {
index c3af9b013c625aa389c3ef18597d0716b203a70d..4eb66398d094d6597a3121c9f367582c2694a278 100644 (file)
@@ -6,13 +6,17 @@
  * Author: Neil Armstrong <narmstrong@baylibre.com>
  */
 
-#include "meson_vpu.h"
+#include <common.h>
+#include <display.h>
+#include <dm.h>
 #include <efi_loader.h>
-#include <dm/device-internal.h>
-#include <dm/uclass-internal.h>
 #include <fdt_support.h>
 #include <linux/sizes.h>
 #include <asm/arch/mem.h>
+#include <dm/device-internal.h>
+#include <dm/uclass-internal.h>
+
+#include "meson_vpu.h"
 #include "meson_registers.h"
 #include "simplefb_common.h"
 
@@ -27,6 +31,14 @@ static struct meson_framebuffer {
        bool is_cvbs;
 } meson_fb = { 0 };
 
+bool meson_vpu_is_compatible(struct meson_vpu_priv *priv,
+                            enum vpu_compatible family)
+{
+       enum vpu_compatible compat = dev_get_driver_data(priv->dev);
+
+       return compat == family;
+}
+
 static int meson_vpu_setup_mode(struct udevice *dev, struct udevice *disp)
 {
        struct video_uc_platdata *uc_plat = dev_get_uclass_platdata(dev);
index 0d9fddad2e7c433311220ddab2bcb94e17f9a7b8..d9588c3775c8aa9b6f7a18517ca30d6eec52a386 100644 (file)
@@ -9,14 +9,12 @@
 #ifndef __MESON_VPU_H__
 #define __MESON_VPU_H__
 
-#include <common.h>
-#include <dm.h>
 #include <video.h>
-#include <display.h>
-#include <linux/io.h>
-#include <linux/bitfield.h>
 #include "meson_registers.h"
 
+struct display_timing;
+struct udevice;
+
 enum {
        /* Maximum size we support */
        VPU_MAX_WIDTH           = 3840,
@@ -38,13 +36,8 @@ struct meson_vpu_priv {
        void __iomem *dmc_base;
 };
 
-static inline bool meson_vpu_is_compatible(struct meson_vpu_priv *priv,
-                                          enum vpu_compatible family)
-{
-       enum vpu_compatible compat = dev_get_driver_data(priv->dev);
-
-       return compat == family;
-}
+bool meson_vpu_is_compatible(struct meson_vpu_priv *priv,
+                            enum vpu_compatible family);
 
 #define hhi_update_bits(offset, mask, value) \
        writel_bits(mask, value, priv->hhi_base + offset)
index 12f8c4194ad744dcfd3d457f3db9dd0a8b321597..8408c59eaa103c7caf375eceb90d6c276468f45c 100644 (file)
@@ -8,6 +8,10 @@
 
 #define DEBUG
 
+#include <common.h>
+#include <dm.h>
+#include <asm/io.h>
+
 #include "meson_vpu.h"
 
 /* HHI Registers */
index a9d5fd07b775db571cb2586267182054642d671c..2e3dd3bad0735cbd894aa1aa3a61b368d173cc95 100644 (file)
@@ -59,4 +59,10 @@ config VIRTIO_BLK
          This is the virtual block driver for virtio. It can be used with
          QEMU based targets.
 
+config VIRTIO_RNG
+       bool "virtio rng driver"
+       depends on VIRTIO
+       help
+         This is the virtual random number generator driver. It can be used
+        with Qemu based targets.
 endmenu
index 4579044ae39fd1133a53a9c3b515ef1d976af5a2..dc8880937a84710cf359984f87c0b0acb26d0dd3 100644 (file)
@@ -9,3 +9,4 @@ obj-$(CONFIG_VIRTIO_PCI) += virtio_pci_legacy.o virtio_pci_modern.o
 obj-$(CONFIG_VIRTIO_SANDBOX) += virtio_sandbox.o
 obj-$(CONFIG_VIRTIO_NET) += virtio_net.o
 obj-$(CONFIG_VIRTIO_BLK) += virtio_blk.o
+obj-$(CONFIG_VIRTIO_RNG) += virtio_rng.o
index 34397d7dbb11f7fde56f4a224b221061cdb6eca7..436faa46eecffafffa67f7a22153c2d9c761cf42 100644 (file)
@@ -24,6 +24,7 @@
 static const char *const virtio_drv_name[VIRTIO_ID_MAX_NUM] = {
        [VIRTIO_ID_NET]         = VIRTIO_NET_DRV_NAME,
        [VIRTIO_ID_BLOCK]       = VIRTIO_BLK_DRV_NAME,
+       [VIRTIO_ID_RNG]         = VIRTIO_RNG_DRV_NAME,
 };
 
 int virtio_get_config(struct udevice *vdev, unsigned int offset,
diff --git a/drivers/virtio/virtio_rng.c b/drivers/virtio/virtio_rng.c
new file mode 100644 (file)
index 0000000..4edffa6
--- /dev/null
@@ -0,0 +1,88 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright (c) 2019, Linaro Limited
+ */
+
+#include <common.h>
+#include <dm.h>
+#include <rng.h>
+#include <virtio_types.h>
+#include <virtio.h>
+#include <virtio_ring.h>
+
+#define BUFFER_SIZE    16UL
+
+struct virtio_rng_priv {
+       struct virtqueue *rng_vq;
+};
+
+static int virtio_rng_read(struct udevice *dev, void *data, size_t len)
+{
+       int ret;
+       unsigned int rsize;
+       unsigned char buf[BUFFER_SIZE] __aligned(4);
+       unsigned char *ptr = data;
+       struct virtio_sg sg;
+       struct virtio_sg *sgs[1];
+       struct virtio_rng_priv *priv = dev_get_priv(dev);
+
+       while (len) {
+               sg.addr = buf;
+               sg.length = min(len, sizeof(buf));
+               sgs[0] = &sg;
+
+               ret = virtqueue_add(priv->rng_vq, sgs, 0, 1);
+               if (ret)
+                       return ret;
+
+               virtqueue_kick(priv->rng_vq);
+
+               while (!virtqueue_get_buf(priv->rng_vq, &rsize))
+                       ;
+
+               memcpy(ptr, buf, rsize);
+               len -= rsize;
+               ptr += rsize;
+       }
+
+       return 0;
+}
+
+static int virtio_rng_bind(struct udevice *dev)
+{
+       struct virtio_dev_priv *uc_priv = dev_get_uclass_priv(dev->parent);
+
+       /* Indicate what driver features we support */
+       virtio_driver_features_init(uc_priv, NULL, 0, NULL, 0);
+
+       return 0;
+}
+
+static int virtio_rng_probe(struct udevice *dev)
+{
+       struct virtio_rng_priv *priv = dev_get_priv(dev);
+       int ret;
+
+       ret = virtio_find_vqs(dev, 1, &priv->rng_vq);
+       if (ret < 0) {
+               debug("%s: virtio_find_vqs failed\n", __func__);
+               return ret;
+       }
+
+       return 0;
+}
+
+static const struct dm_rng_ops virtio_rng_ops = {
+       .read   = virtio_rng_read,
+};
+
+U_BOOT_DRIVER(virtio_rng) = {
+       .name   = VIRTIO_RNG_DRV_NAME,
+       .id     = UCLASS_RNG,
+       .bind   = virtio_rng_bind,
+       .probe  = virtio_rng_probe,
+       .remove = virtio_reset,
+       .ops    = &virtio_rng_ops,
+       .priv_auto_alloc_size = sizeof(struct virtio_rng_priv),
+       .flags  = DM_FLAG_ACTIVE_DMA,
+};
index 2bd959a7dc0c3ff82af1aadb6537ee79d8f276a1..64c98dd7237bf2a8dbf06da928336842d13d46c5 100644 (file)
@@ -130,6 +130,14 @@ config OF_LIST
          device tree files (without the directory or .dtb suffix)
          separated by <space>.
 
+config OF_OVERLAY_LIST
+       string "List of device tree overlays to include for DT control"
+       depends on SPL_LOAD_FIT_APPLY_OVERLAY
+       help
+         This option specifies a list of device tree overlays to use for DT
+         control. This option can then be used by a FIT generator to include
+         the overlays in the FIT image.
+
 choice
        prompt "OF LIST compression"
        depends on MULTI_DTB_FIT
index 9dc78684f8e0f6e49c77b941a32927491a44f2bc..678b652b0aa3fc547c01689f6f69cf6478a4504b 100644 (file)
@@ -31,6 +31,7 @@
  * to read the serial number.
  */
 
+#if CONFIG_IS_ENABLED(BOARD)
 struct board_ops {
        /**
         * detect() - Run the hardware info detection procedure for this
@@ -79,6 +80,24 @@ struct board_ops {
         * Return: 0 if OK, -ve on error.
         */
        int (*get_str)(struct udevice *dev, int id, size_t size, char *val);
+
+       /**
+        * get_fit_loadable - Get the name of an image to load from FIT
+        * This function can be used to provide the image names based on runtime
+        * detection. A classic use-case would when DTBOs are used to describe
+        * additionnal daughter cards.
+        *
+        * @dev:        The board instance to gather the data.
+        * @index:      Index of the image. Starts at 0 and gets incremented
+        *              after each call to this function.
+        * @type:       The type of image. For example, "fdt" for DTBs
+        * @strp:       A pointer to string. Untouched if the function fails
+        *
+        * Return: 0 if OK, -ENOENT if no loadable is available else -ve on
+        * error.
+        */
+       int (*get_fit_loadable)(struct udevice *dev, int index,
+                               const char *type, const char **strp);
 };
 
 #define board_get_ops(dev)     ((struct board_ops *)(dev)->driver->ops)
@@ -137,3 +156,58 @@ int board_get_str(struct udevice *dev, int id, size_t size, char *val);
  * Return: 0 if OK, -ve on error.
  */
 int board_get(struct udevice **devp);
+
+/**
+ * board_get_fit_loadable - Get the name of an image to load from FIT
+ * This function can be used to provide the image names based on runtime
+ * detection. A classic use-case would when DTBOs are used to describe
+ * additionnal daughter cards.
+ *
+ * @dev:       The board instance to gather the data.
+ * @index:     Index of the image. Starts at 0 and gets incremented
+ *             after each call to this function.
+ * @type:      The type of image. For example, "fdt" for DTBs
+ * @strp:      A pointer to string. Untouched if the function fails
+ *
+ *
+ * Return: 0 if OK, -ENOENT if no loadable is available else -ve on
+ * error.
+ */
+int board_get_fit_loadable(struct udevice *dev, int index,
+                          const char *type, const char **strp);
+
+#else
+
+static inline int board_detect(struct udevice *dev)
+{
+       return -ENOSYS;
+}
+
+static inline int board_get_bool(struct udevice *dev, int id, bool *val)
+{
+       return -ENOSYS;
+}
+
+static inline int board_get_int(struct udevice *dev, int id, int *val)
+{
+       return -ENOSYS;
+}
+
+static inline int board_get_str(struct udevice *dev, int id, size_t size,
+                               char *val)
+{
+       return -ENOSYS;
+}
+
+static inline int board_get(struct udevice **devp)
+{
+       return -ENOSYS;
+}
+
+static inline int board_get_fit_loadable(struct udevice *dev, int index,
+                                        const char *type, const char **strp)
+{
+       return -ENOSYS;
+}
+
+#endif
index 482e4714b1c4ddcf2800718acba6f291f64fe4e1..f5ee65cb8a02a90f105b2157893ed326f928f906 100644 (file)
@@ -64,7 +64,6 @@
 #define CONFIG_SPL_NAND_RAW_ONLY
 #define CONFIG_SYS_NAND_U_BOOT_OFFS    0x40000
 #define CONFIG_SYS_NAND_U_BOOT_SIZE    0xa0000
-#define        CONFIG_SYS_UBOOT_START          CONFIG_SYS_TEXT_BASE
 #define        CONFIG_SYS_NAND_U_BOOT_START    CONFIG_SYS_TEXT_BASE
 #define CONFIG_SYS_NAND_U_BOOT_DST     CONFIG_SYS_TEXT_BASE
 
diff --git a/include/configs/imx8mp_evk.h b/include/configs/imx8mp_evk.h
new file mode 100644 (file)
index 0000000..e91c710
--- /dev/null
@@ -0,0 +1,165 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
+/*
+ * Copyright 2019 NXP
+ */
+
+#ifndef __IMX8MP_EVK_H
+#define __IMX8MP_EVK_H
+
+#include <linux/sizes.h>
+#include <asm/arch/imx-regs.h>
+
+#ifdef CONFIG_SECURE_BOOT
+#define CONFIG_CSF_SIZE                        0x2000 /* 8K region */
+#endif
+
+#define CONFIG_SPL_MAX_SIZE            (152 * 1024)
+#define CONFIG_SYS_MONITOR_LEN         (512 * 1024)
+#define CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_USE_SECTOR
+#define CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR        0x300
+#define CONFIG_SYS_MMCSD_FS_BOOT_PARTITION     1
+#define CONFIG_SYS_UBOOT_BASE  (QSPI0_AMBA_BASE + CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR * 512)
+
+#ifdef CONFIG_SPL_BUILD
+/*#define CONFIG_ENABLE_DDR_TRAINING_DEBUG*/
+#define CONFIG_SPL_LDSCRIPT            "arch/arm/cpu/armv8/u-boot-spl.lds"
+#define CONFIG_SPL_STACK               0x990000
+#define CONFIG_SPL_BSS_START_ADDR      0x0095e000
+#define CONFIG_SPL_BSS_MAX_SIZE        0x2000  /* 8 KB */
+#define CONFIG_SYS_SPL_MALLOC_START    0x42200000
+#define CONFIG_SYS_SPL_MALLOC_SIZE     SZ_512K /* 512 KB */
+#define CONFIG_SYS_ICACHE_OFF
+#define CONFIG_SYS_DCACHE_OFF
+
+#define CONFIG_MALLOC_F_ADDR           0x940000
+
+#define CONFIG_SPL_ABORT_ON_RAW_IMAGE
+
+#undef CONFIG_DM_MMC
+#undef CONFIG_DM_PMIC
+#undef CONFIG_DM_PMIC_PFUZE100
+
+#define CONFIG_POWER
+#define CONFIG_POWER_I2C
+#define CONFIG_POWER_PCA9450
+
+#undef CONFIG_DM_I2C
+#define CONFIG_SYS_I2C
+
+#endif
+
+/* Initial environment variables */
+#define CONFIG_EXTRA_ENV_SETTINGS              \
+       "script=boot.scr\0" \
+       "image=Image\0" \
+       "console=ttymxc1,115200 earlycon=ec_imx6q,0x30890000,115200\0" \
+       "fdt_addr=0x43000000\0"                 \
+       "fdt_high=0xffffffffffffffff\0"         \
+       "boot_fdt=try\0" \
+       "fdt_file=" CONFIG_DEFAULT_FDT_FILE "\0" \
+       "initrd_addr=0x43800000\0"              \
+       "initrd_high=0xffffffffffffffff\0" \
+       "mmcdev="__stringify(CONFIG_SYS_MMC_ENV_DEV)"\0" \
+       "mmcpart=" __stringify(CONFIG_SYS_MMC_IMG_LOAD_PART) "\0" \
+       "mmcroot=" CONFIG_MMCROOT " rootwait rw\0" \
+       "mmcautodetect=yes\0" \
+       "mmcargs=setenv bootargs ${jh_clk} console=${console} root=${mmcroot}\0 " \
+       "loadbootscript=fatload mmc ${mmcdev}:${mmcpart} ${loadaddr} ${script};\0" \
+       "bootscript=echo Running bootscript from mmc ...; " \
+               "source\0" \
+       "loadimage=fatload mmc ${mmcdev}:${mmcpart} ${loadaddr} ${image}\0" \
+       "loadfdt=fatload mmc ${mmcdev}:${mmcpart} ${fdt_addr} ${fdt_file}\0" \
+       "mmcboot=echo Booting from mmc ...; " \
+               "run mmcargs; " \
+               "if test ${boot_fdt} = yes || test ${boot_fdt} = try; then " \
+                       "if run loadfdt; then " \
+                               "booti ${loadaddr} - ${fdt_addr}; " \
+                       "else " \
+                               "echo WARN: Cannot load the DT; " \
+                       "fi; " \
+               "else " \
+                       "echo wait for boot; " \
+               "fi;\0" \
+       "netargs=setenv bootargs ${jh_clk} console=${console} " \
+               "root=/dev/nfs " \
+               "ip=dhcp nfsroot=${serverip}:${nfsroot},v3,tcp\0" \
+       "netboot=echo Booting from net ...; " \
+               "run netargs;  " \
+               "if test ${ip_dyn} = yes; then " \
+                       "setenv get_cmd dhcp; " \
+               "else " \
+                       "setenv get_cmd tftp; " \
+               "fi; " \
+               "${get_cmd} ${loadaddr} ${image}; " \
+               "if test ${boot_fdt} = yes || test ${boot_fdt} = try; then " \
+                       "if ${get_cmd} ${fdt_addr} ${fdt_file}; then " \
+                               "booti ${loadaddr} - ${fdt_addr}; " \
+                       "else " \
+                               "echo WARN: Cannot load the DT; " \
+                       "fi; " \
+               "else " \
+                       "booti; " \
+               "fi;\0"
+
+#define CONFIG_BOOTCOMMAND \
+          "mmc dev ${mmcdev}; if mmc rescan; then " \
+                  "if run loadbootscript; then " \
+                          "run bootscript; " \
+                  "else " \
+                          "if run loadimage; then " \
+                                  "run mmcboot; " \
+                          "else run netboot; " \
+                          "fi; " \
+                  "fi; " \
+          "else booti ${loadaddr} - ${fdt_addr}; fi"
+
+/* Link Definitions */
+#define CONFIG_LOADADDR                        0x40480000
+
+#define CONFIG_SYS_LOAD_ADDR           CONFIG_LOADADDR
+
+#define CONFIG_SYS_INIT_RAM_ADDR       0x40000000
+#define CONFIG_SYS_INIT_RAM_SIZE       0x80000
+#define CONFIG_SYS_INIT_SP_OFFSET \
+       (CONFIG_SYS_INIT_RAM_SIZE - GENERATED_GBL_DATA_SIZE)
+#define CONFIG_SYS_INIT_SP_ADDR \
+       (CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_INIT_SP_OFFSET)
+
+#define CONFIG_ENV_OVERWRITE
+#define CONFIG_SYS_MMC_ENV_DEV         1   /* USDHC2 */
+#define CONFIG_MMCROOT                 "/dev/mmcblk1p2"  /* USDHC2 */
+
+/* Size of malloc() pool */
+#define CONFIG_SYS_MALLOC_LEN          SZ_32M
+
+/* Totally 6GB DDR */
+#define CONFIG_SYS_SDRAM_BASE          0x40000000
+#define PHYS_SDRAM                     0x40000000
+#define PHYS_SDRAM_SIZE                        0xC0000000      /* 3 GB */
+#define PHYS_SDRAM_2                   0x100000000
+#define PHYS_SDRAM_2_SIZE              0xC0000000      /* 3 GB */
+
+#define CONFIG_SYS_MEMTEST_START       PHYS_SDRAM
+#define CONFIG_SYS_MEMTEST_END         (CONFIG_SYS_MEMTEST_START + \
+                                       (PHYS_SDRAM_SIZE >> 1))
+
+#define CONFIG_MXC_UART_BASE           UART2_BASE_ADDR
+
+/* Monitor Command Prompt */
+#define CONFIG_SYS_PROMPT_HUSH_PS2     "> "
+#define CONFIG_SYS_CBSIZE              2048
+#define CONFIG_SYS_MAXARGS             64
+#define CONFIG_SYS_BARGSIZE CONFIG_SYS_CBSIZE
+#define CONFIG_SYS_PBSIZE              (CONFIG_SYS_CBSIZE + \
+                                       sizeof(CONFIG_SYS_PROMPT) + 16)
+
+#define CONFIG_FSL_USDHC
+
+#define CONFIG_SYS_FSL_USDHC_NUM       2
+#define CONFIG_SYS_FSL_ESDHC_ADDR      0
+
+#define CONFIG_SYS_MMC_IMG_LOAD_PART   1
+
+#define CONFIG_SYS_I2C_SPEED           100000
+
+#endif
index cc8f4c021062b6fbfa4a7595fa6a7bbbb5b74115..6543cfd868c7d4e0c5d3e5dd2d64773450b6a40d 100644 (file)
@@ -98,7 +98,6 @@
                                        CONFIG_SPL_BSS_MAX_SIZE)
 #define CONFIG_SYS_SPL_MALLOC_SIZE     0x100000
 #define CONFIG_SYS_MONITOR_LEN         0x100000
-#define CONFIG_SYS_UBOOT_START         CONFIG_SYS_TEXT_BASE
 #endif
 
 /* NAND SPL */
index 045a9f7bdf9d9bf0bc5bba3d24b168fbb2b9cb71..0aee1e1cf6b75863b22faa9b628736772044b0b0 100644 (file)
@@ -12,7 +12,6 @@
 #define CONFIG_SPL_LIBCOMMON_SUPPORT
 #include "imx6_spl.h"
 
-#define CONFIG_SYS_UBOOT_START CONFIG_SYS_TEXT_BASE
 #define CONFIG_SYS_UBOOT_BASE (CONFIG_SYS_FLASH_BASE + 0x80000)
 #define CONFIG_SYS_SPL_ARGS_ADDR       0x18000000
 
index 736081277d41bc1665301c69db25bc900709afee..50707a31978de69e10a8e52455c8419939da08b9 100644 (file)
@@ -8,7 +8,7 @@
 #define __MESON64_CONFIG_H
 
 /* Generic Interrupt Controller Definitions */
-#if defined(CONFIG_MESON_AXG)
+#if (defined(CONFIG_MESON_AXG) || defined(CONFIG_MESON_G12A))
 #define GICD_BASE                      0xffc01000
 #define GICC_BASE                      0xffc02000
 #else /* MESON GXL and GXBB */
index 385b30c99b759ab363e61a32ce72712915ad0995..8ca0e83c78336e90e9032843a686a1535c172bc9 100644 (file)
 /* Just for sure that there is a space for stack */
 #define CONFIG_SPL_STACK_SIZE          0x100
 
-#define CONFIG_SYS_UBOOT_START         CONFIG_SYS_TEXT_BASE
-
 #define CONFIG_SPL_MAX_FOOTPRINT       (CONFIG_SYS_INIT_RAM_SIZE - \
                                         CONFIG_SYS_INIT_RAM_ADDR - \
                                         CONFIG_SYS_MALLOC_F_LEN - \
index e5182aeea8723d079178b0b1ec5530c5509e44e9..faab0913fc9e65c599154b4d13a94d428ce745de 100644 (file)
@@ -31,7 +31,6 @@
 #define CONFIG_ENV_OVERWRITE
 
 /* Preloader -> Uboot */
-#define CONFIG_SYS_UBOOT_START         CONFIG_SYS_TEXT_BASE
 #define CONFIG_SYS_INIT_SP_ADDR                (CONFIG_SYS_TEXT_BASE + SZ_2M - \
                                         GENERATED_GBL_DATA_SIZE)
 
index 4aef894c6ebe94798de3c2f85210d237e93bf26d..6a6c2f2414dc05284d889edd578b09d04508a191 100644 (file)
@@ -40,7 +40,6 @@
 #define CONFIG_SYS_UBOOT_BASE          (CONFIG_SPI_ADDR + CONFIG_SPL_PAD_TO)
 
 /* SPL -> Uboot */
-#define CONFIG_SYS_UBOOT_START         CONFIG_SYS_TEXT_BASE
 #define CONFIG_SYS_INIT_SP_ADDR                (CONFIG_SYS_TEXT_BASE + SZ_2M - \
                                         GENERATED_GBL_DATA_SIZE)
 
index a7fe83a605d51602fa0e5f8efd91776885af3220..514722be99006cfa81745716e424b78dca3af7b4 100644 (file)
@@ -29,7 +29,6 @@
 #define CONFIG_SYS_BOOTM_LEN                   SZ_64M
 
 /* Uboot definition */
-#define CONFIG_SYS_UBOOT_START                 CONFIG_SYS_TEXT_BASE
 #define CONFIG_SYS_INIT_SP_ADDR                        (CONFIG_SYS_TEXT_BASE + \
                                                SZ_2M - \
                                                GENERATED_GBL_DATA_SIZE)
index 1b1a56d7cd42e3bd0ddc986333a401742f837503..c76c81ddd5b261a840c4a87f9ea0ca106ee87bf2 100644 (file)
@@ -26,7 +26,6 @@
  * other needs.  We use this rather than the inherited defines from
  * ti_armv7_common.h for backwards compatibility.
  */
-#define CONFIG_SYS_UBOOT_START         CONFIG_SYS_TEXT_BASE
 #define CONFIG_SPL_BSS_START_ADDR      0x80000000
 #define CONFIG_SPL_BSS_MAX_SIZE                (512 << 10)     /* 512 KB */
 #define CONFIG_SYS_SPL_MALLOC_START    0x80208000
index 35e28be950ca41d095e886b9aa518f49c85eac0f..9c52cae41d71d1bb7fd63d4ba71dcefdd24f56d3 100644 (file)
@@ -23,7 +23,6 @@
 #define CONFIG_SYS_NS16550_COM1                0x11005000
 #define CONFIG_SYS_NS16550_CLK         26000000
 
-#define CONFIG_SYS_UBOOT_START         CONFIG_SYS_TEXT_BASE
 #define CONFIG_SYS_INIT_SP_ADDR                (CONFIG_SYS_TEXT_BASE + SZ_2M - \
                                                 GENERATED_GBL_DATA_SIZE)
 
diff --git a/include/configs/socfpga_agilex_socdk.h b/include/configs/socfpga_agilex_socdk.h
new file mode 100644 (file)
index 0000000..4eede7c
--- /dev/null
@@ -0,0 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0
+ *
+ * Copyright (C) 2019 Intel Corporation <www.intel.com>
+ *
+ */
+
+#ifndef __CONFIG_SOCFGPA_AGILEX_H__
+#define __CONFIG_SOCFGPA_AGILEX_H__
+
+#include <configs/socfpga_soc64_common.h>
+
+#endif /* __CONFIG_SOCFGPA_AGILEX_H__ */
diff --git a/include/configs/socfpga_soc64_common.h b/include/configs/socfpga_soc64_common.h
new file mode 100644 (file)
index 0000000..4afadaf
--- /dev/null
@@ -0,0 +1,202 @@
+/* SPDX-License-Identifier: GPL-2.0
+ *
+ * Copyright (C) 2017-2019 Intel Corporation <www.intel.com>
+ *
+ */
+
+#ifndef __CONFIG_SOCFPGA_SOC64_COMMON_H__
+#define __CONFIG_SOCFPGA_SOC64_COMMON_H__
+
+#include <asm/arch/base_addr_s10.h>
+#include <asm/arch/handoff_s10.h>
+
+/*
+ * U-Boot general configurations
+ */
+#define CONFIG_SYS_MONITOR_BASE                CONFIG_SYS_TEXT_BASE
+#define CONFIG_LOADADDR                        0x2000000
+#define CONFIG_SYS_LOAD_ADDR           CONFIG_LOADADDR
+#define CONFIG_REMAKE_ELF
+/* sysmgr.boot_scratch_cold4 & 5 (64bit) will be used for PSCI_CPU_ON call */
+#define CPU_RELEASE_ADDR               0xFFD12210
+#define CONFIG_SYS_CACHELINE_SIZE      64
+#define CONFIG_SYS_MEM_RESERVE_SECURE  0       /* using OCRAM, not DDR */
+
+/*
+ * U-Boot console configurations
+ */
+#define CONFIG_SYS_MAXARGS             64
+#define CONFIG_SYS_CBSIZE              2048
+#define CONFIG_SYS_PBSIZE              (CONFIG_SYS_CBSIZE + \
+                                       sizeof(CONFIG_SYS_PROMPT) + 16)
+#define CONFIG_SYS_BARGSIZE            CONFIG_SYS_CBSIZE
+
+/* Extend size of kernel image for uncompression */
+#define CONFIG_SYS_BOOTM_LEN           (32 * 1024 * 1024)
+
+/*
+ * U-Boot run time memory configurations
+ */
+#define CONFIG_SYS_INIT_RAM_ADDR       0xFFE00000
+#define CONFIG_SYS_INIT_RAM_SIZE       0x40000
+#define CONFIG_SYS_INIT_SP_ADDR                (CONFIG_SYS_INIT_RAM_ADDR  \
+                                       + CONFIG_SYS_INIT_RAM_SIZE \
+                                       - S10_HANDOFF_SIZE)
+#define CONFIG_SYS_INIT_SP_OFFSET      (CONFIG_SYS_INIT_SP_ADDR)
+#define CONFIG_SYS_MALLOC_LEN          (5 * 1024 * 1024)
+
+/*
+ * U-Boot environment configurations
+ */
+#define CONFIG_SYS_MMC_ENV_DEV         0       /* device 0 */
+
+/*
+ * QSPI support
+ */
+ #ifdef CONFIG_CADENCE_QSPI
+/* Enable it if you want to use dual-stacked mode */
+/*#define CONFIG_QSPI_RBF_ADDR         0x720000*/
+
+/* Flash device info */
+
+/*#define CONFIG_ENV_IS_IN_SPI_FLASH*/
+
+#ifndef CONFIG_SPL_BUILD
+#define CONFIG_MTD_PARTITIONS
+#define MTDIDS_DEFAULT                 "nor0=ff705000.spi.0"
+#endif /* CONFIG_SPL_BUILD */
+
+#ifndef __ASSEMBLY__
+unsigned int cm_get_qspi_controller_clk_hz(void);
+#define CONFIG_CQSPI_REF_CLK           cm_get_qspi_controller_clk_hz()
+#endif
+
+#endif /* CONFIG_CADENCE_QSPI */
+
+/*
+ * Boot arguments passed to the boot command. The value of
+ * CONFIG_BOOTARGS goes into the environment value "bootargs".
+ * Do note the value will override also the chosen node in FDT blob.
+ */
+#define CONFIG_BOOTARGS "earlycon"
+#define CONFIG_BOOTCOMMAND "run fatscript; run mmcload;run linux_qspi_enable;" \
+                          "run mmcboot"
+
+#define CONFIG_EXTRA_ENV_SETTINGS \
+       "loadaddr=" __stringify(CONFIG_SYS_LOAD_ADDR) "\0" \
+       "bootfile=Image\0" \
+       "fdt_addr=8000000\0" \
+       "fdtimage=" CONFIG_DEFAULT_DEVICE_TREE ".dtb\0" \
+       "mmcroot=/dev/mmcblk0p2\0" \
+       "mmcboot=setenv bootargs " CONFIG_BOOTARGS \
+               " root=${mmcroot} rw rootwait;" \
+               "booti ${loadaddr} - ${fdt_addr}\0" \
+       "mmcload=mmc rescan;" \
+               "load mmc 0:1 ${loadaddr} ${bootfile};" \
+               "load mmc 0:1 ${fdt_addr} ${fdtimage}\0" \
+       "linux_qspi_enable=if sf probe; then " \
+               "echo Enabling QSPI at Linux DTB...;" \
+               "fdt addr ${fdt_addr}; fdt resize;" \
+               "fdt set /soc/spi@ff8d2000 status okay;" \
+               "fdt set /soc/clkmgr/clocks/qspi_clk clock-frequency " \
+               " ${qspi_clock}; fi; \0" \
+       "scriptaddr=0x02100000\0" \
+       "scriptfile=u-boot.scr\0" \
+       "fatscript=if fatload mmc 0:1 ${scriptaddr} ${scriptfile};" \
+                  "then source ${scriptaddr}; fi\0" \
+       "socfpga_legacy_reset_compat=1\0"
+
+/*
+ * Generic Interrupt Controller Definitions
+ */
+#define CONFIG_GICV2
+
+/*
+ * External memory configurations
+ */
+#define PHYS_SDRAM_1                   0x0
+#define PHYS_SDRAM_1_SIZE              (1 * 1024 * 1024 * 1024)
+#define CONFIG_SYS_SDRAM_BASE          0
+#define CONFIG_SYS_MEMTEST_START       0
+#define CONFIG_SYS_MEMTEST_END         PHYS_SDRAM_1_SIZE - 0x200000
+
+/*
+ * Serial / UART configurations
+ */
+#define CONFIG_SYS_NS16550_CLK         100000000
+#define CONFIG_SYS_NS16550_MEM32
+
+/*
+ * Timer & watchdog configurations
+ */
+#define COUNTER_FREQUENCY              400000000
+
+/*
+ * SDMMC configurations
+ */
+#ifdef CONFIG_CMD_MMC
+#define CONFIG_SYS_MMC_MAX_BLK_COUNT   256
+#endif
+/*
+ * Flash configurations
+ */
+#define CONFIG_SYS_MAX_FLASH_BANKS     1
+
+/* Ethernet on SoC (EMAC) */
+#if defined(CONFIG_CMD_NET)
+#define CONFIG_DW_ALTDESCRIPTOR
+#endif /* CONFIG_CMD_NET */
+
+/*
+ * L4 Watchdog
+ */
+#ifdef CONFIG_SPL_BUILD
+#define CONFIG_HW_WATCHDOG
+#define CONFIG_DESIGNWARE_WATCHDOG
+#define CONFIG_DW_WDT_BASE             SOCFPGA_L4WD0_ADDRESS
+#ifdef CONFIG_TARGET_SOCFPGA_STRATIX10
+#ifndef __ASSEMBLY__
+unsigned int cm_get_l4_sys_free_clk_hz(void);
+#define CONFIG_DW_WDT_CLOCK_KHZ                (cm_get_l4_sys_free_clk_hz() / 1000)
+#endif
+#else
+#define CONFIG_DW_WDT_CLOCK_KHZ                100000
+#endif
+#endif
+
+/*
+ * SPL memory layout
+ *
+ * On chip RAM
+ * 0xFFE0_0000 ...... Start of OCRAM
+ * SPL code, rwdata
+ * empty space
+ * 0xFFEx_xxxx ...... Top of stack (grows down)
+ * 0xFFEy_yyyy ...... Global Data
+ * 0xFFEz_zzzz ...... Malloc prior relocation (size CONFIG_SYS_MALLOC_F_LEN)
+ * 0xFFE3_F000 ...... Hardware handdoff blob (size 4KB)
+ * 0xFFE3_FFFF ...... End of OCRAM
+ *
+ * SDRAM
+ * 0x0000_0000 ...... Start of SDRAM_1
+ * unused / empty space for image loading
+ * Size 64MB   ...... MALLOC (size CONFIG_SYS_SPL_MALLOC_SIZE)
+ * Size 1MB    ...... BSS (size CONFIG_SPL_BSS_MAX_SIZE)
+ * 0x8000_0000 ...... End of SDRAM_1 (assume 2GB)
+ *
+ */
+#define CONFIG_SPL_TARGET              "spl/u-boot-spl.hex"
+#define CONFIG_SPL_MAX_SIZE            CONFIG_SYS_INIT_RAM_SIZE
+#define CONFIG_SPL_STACK               CONFIG_SYS_INIT_SP_ADDR
+#define CONFIG_SPL_BSS_MAX_SIZE                0x100000        /* 1 MB */
+#define CONFIG_SPL_BSS_START_ADDR      (PHYS_SDRAM_1 + PHYS_SDRAM_1_SIZE \
+                                       - CONFIG_SPL_BSS_MAX_SIZE)
+#define CONFIG_SYS_SPL_MALLOC_SIZE     (CONFIG_SYS_MALLOC_LEN)
+#define CONFIG_SYS_SPL_MALLOC_START    (CONFIG_SPL_BSS_START_ADDR \
+                                       - CONFIG_SYS_SPL_MALLOC_SIZE)
+
+/* SPL SDMMC boot support */
+#define CONFIG_SYS_MMCSD_FS_BOOT_PARTITION     1
+#define CONFIG_SPL_FS_LOAD_PAYLOAD_NAME                "u-boot.img"
+
+#endif /* __CONFIG_SOCFPGA_SOC64_COMMON_H__ */
index a10cbec17f2f691bbdd700fc8744b951e42e22b9..09b46ba013737b843edd16ab6d322c69420fae8a 100644 (file)
 /* SPDX-License-Identifier: GPL-2.0
  *
- * Copyright (C) 2017-2018 Intel Corporation <www.intel.com>
+ * Copyright (C) 2017-2019 Intel Corporation <www.intel.com>
  *
  */
 
 #ifndef __CONFIG_SOCFGPA_STRATIX10_H__
 #define __CONFIG_SOCFGPA_STRATIX10_H__
 
-#include <asm/arch/base_addr_s10.h>
-#include <asm/arch/handoff_s10.h>
+#include <configs/socfpga_soc64_common.h>
 
-/*
- * U-Boot general configurations
- */
-#define CONFIG_SYS_MONITOR_BASE                CONFIG_SYS_TEXT_BASE
-#define CONFIG_LOADADDR                        0x2000000
-#define CONFIG_SYS_LOAD_ADDR           CONFIG_LOADADDR
-#define CONFIG_REMAKE_ELF
-/* sysmgr.boot_scratch_cold4 & 5 (64bit) will be used for PSCI_CPU_ON call */
-#define CPU_RELEASE_ADDR               0xFFD12210
-#define CONFIG_SYS_CACHELINE_SIZE      64
-#define CONFIG_SYS_MEM_RESERVE_SECURE  0       /* using OCRAM, not DDR */
-
-/*
- * U-Boot console configurations
- */
-#define CONFIG_SYS_MAXARGS             64
-#define CONFIG_SYS_CBSIZE              2048
-#define CONFIG_SYS_PBSIZE              (CONFIG_SYS_CBSIZE + \
-                                       sizeof(CONFIG_SYS_PROMPT) + 16)
-#define CONFIG_SYS_BARGSIZE            CONFIG_SYS_CBSIZE
-
-/* Extend size of kernel image for uncompression */
-#define CONFIG_SYS_BOOTM_LEN           (32 * 1024 * 1024)
-
-/*
- * U-Boot run time memory configurations
- */
-#define CONFIG_SYS_INIT_RAM_ADDR       0xFFE00000
-#define CONFIG_SYS_INIT_RAM_SIZE       0x40000
-#define CONFIG_SYS_INIT_SP_ADDR                (CONFIG_SYS_INIT_RAM_ADDR  \
-                                       + CONFIG_SYS_INIT_RAM_SIZE \
-                                       - S10_HANDOFF_SIZE)
-#define CONFIG_SYS_INIT_SP_OFFSET      (CONFIG_SYS_INIT_SP_ADDR)
-#define CONFIG_SYS_MALLOC_LEN          (5 * 1024 * 1024)
-
-/*
- * U-Boot environment configurations
- */
-#define CONFIG_SYS_MMC_ENV_DEV         0       /* device 0 */
-
-/*
- * QSPI support
- */
- #ifdef CONFIG_CADENCE_QSPI
-/* Enable it if you want to use dual-stacked mode */
-/*#define CONFIG_QSPI_RBF_ADDR         0x720000*/
-
-/* Flash device info */
-
-/*#define CONFIG_ENV_IS_IN_SPI_FLASH*/
-
-#ifndef CONFIG_SPL_BUILD
-#define CONFIG_MTD_PARTITIONS
-#define MTDIDS_DEFAULT                 "nor0=ff705000.spi.0"
-#endif /* CONFIG_SPL_BUILD */
-
-#ifndef __ASSEMBLY__
-unsigned int cm_get_qspi_controller_clk_hz(void);
-#define CONFIG_CQSPI_REF_CLK           cm_get_qspi_controller_clk_hz()
-#endif
-
-#endif /* CONFIG_CADENCE_QSPI */
-
-/*
- * Boot arguments passed to the boot command. The value of
- * CONFIG_BOOTARGS goes into the environment value "bootargs".
- * Do note the value will override also the chosen node in FDT blob.
- */
-#define CONFIG_BOOTARGS "earlycon"
-#define CONFIG_BOOTCOMMAND "run fatscript; run mmcload;run linux_qspi_enable;" \
-                          "run mmcboot"
-
-#define CONFIG_EXTRA_ENV_SETTINGS \
-       "loadaddr=" __stringify(CONFIG_SYS_LOAD_ADDR) "\0" \
-       "bootfile=Image\0" \
-       "fdt_addr=8000000\0" \
-       "fdtimage=socfpga_stratix10_socdk.dtb\0" \
-       "mmcroot=/dev/mmcblk0p2\0" \
-       "mmcboot=setenv bootargs " CONFIG_BOOTARGS \
-               " root=${mmcroot} rw rootwait;" \
-               "booti ${loadaddr} - ${fdt_addr}\0" \
-       "mmcload=mmc rescan;" \
-               "load mmc 0:1 ${loadaddr} ${bootfile};" \
-               "load mmc 0:1 ${fdt_addr} ${fdtimage}\0" \
-       "linux_qspi_enable=if sf probe; then " \
-               "echo Enabling QSPI at Linux DTB...;" \
-               "fdt addr ${fdt_addr}; fdt resize;" \
-               "fdt set /soc/spi@ff8d2000 status okay;" \
-               "fdt set /soc/clkmgr/clocks/qspi_clk clock-frequency " \
-               " ${qspi_clock}; fi; \0" \
-       "scriptaddr=0x02100000\0" \
-       "scriptfile=u-boot.scr\0" \
-       "fatscript=if fatload mmc 0:1 ${scriptaddr} ${scriptfile};" \
-                  "then source ${scriptaddr}; fi\0" \
-       "socfpga_legacy_reset_compat=1\0"
-
-/*
- * Generic Interrupt Controller Definitions
- */
-#define CONFIG_GICV2
-
-/*
- * External memory configurations
- */
-#define PHYS_SDRAM_1                   0x0
-#define PHYS_SDRAM_1_SIZE              (1 * 1024 * 1024 * 1024)
-#define CONFIG_SYS_SDRAM_BASE          0
-#define CONFIG_SYS_MEMTEST_START       0
-#define CONFIG_SYS_MEMTEST_END         PHYS_SDRAM_1_SIZE - 0x200000
-
-/*
- * Serial / UART configurations
- */
-#define CONFIG_SYS_NS16550_CLK         100000000
-#define CONFIG_SYS_NS16550_MEM32
-
-/*
- * Timer & watchdog configurations
- */
-#define COUNTER_FREQUENCY              400000000
-
-/*
- * SDMMC configurations
- */
-#ifdef CONFIG_CMD_MMC
-#define CONFIG_SYS_MMC_MAX_BLK_COUNT   256
-#endif
-/*
- * Flash configurations
- */
-#define CONFIG_SYS_MAX_FLASH_BANKS     1
-
-/* Ethernet on SoC (EMAC) */
-#if defined(CONFIG_CMD_NET)
-#define CONFIG_DW_ALTDESCRIPTOR
-#endif /* CONFIG_CMD_NET */
-
-/*
- * L4 Watchdog
- */
-#ifdef CONFIG_SPL_BUILD
-#define CONFIG_HW_WATCHDOG
-#define CONFIG_DESIGNWARE_WATCHDOG
-#define CONFIG_DW_WDT_BASE             SOCFPGA_L4WD0_ADDRESS
-#ifndef __ASSEMBLY__
-unsigned int cm_get_l4_sys_free_clk_hz(void);
-#define CONFIG_DW_WDT_CLOCK_KHZ                (cm_get_l4_sys_free_clk_hz() / 1000)
-#endif
-#endif
-
-/*
- * SPL memory layout
- *
- * On chip RAM
- * 0xFFE0_0000 ...... Start of OCRAM
- * SPL code, rwdata
- * empty space
- * 0xFFEx_xxxx ...... Top of stack (grows down)
- * 0xFFEy_yyyy ...... Global Data
- * 0xFFEz_zzzz ...... Malloc prior relocation (size CONFIG_SYS_MALLOC_F_LEN)
- * 0xFFE3_F000 ...... Hardware handdoff blob (size 4KB)
- * 0xFFE3_FFFF ...... End of OCRAM
- *
- * SDRAM
- * 0x0000_0000 ...... Start of SDRAM_1
- * unused / empty space for image loading
- * Size 64MB   ...... MALLOC (size CONFIG_SYS_SPL_MALLOC_SIZE)
- * Size 1MB    ...... BSS (size CONFIG_SPL_BSS_MAX_SIZE)
- * 0x8000_0000 ...... End of SDRAM_1 (assume 2GB)
- *
- */
-#define CONFIG_SPL_TARGET              "spl/u-boot-spl.hex"
-#define CONFIG_SPL_MAX_SIZE            CONFIG_SYS_INIT_RAM_SIZE
-#define CONFIG_SPL_STACK               CONFIG_SYS_INIT_SP_ADDR
-#define CONFIG_SPL_BSS_MAX_SIZE                0x100000        /* 1 MB */
-#define CONFIG_SPL_BSS_START_ADDR      (PHYS_SDRAM_1 + PHYS_SDRAM_1_SIZE \
-                                       - CONFIG_SPL_BSS_MAX_SIZE)
-#define CONFIG_SYS_SPL_MALLOC_SIZE     (CONFIG_SYS_MALLOC_LEN)
-#define CONFIG_SYS_SPL_MALLOC_START    (CONFIG_SPL_BSS_START_ADDR \
-                                       - CONFIG_SYS_SPL_MALLOC_SIZE)
-
-/* SPL SDMMC boot support */
-#define CONFIG_SYS_MMCSD_FS_BOOT_PARTITION     1
-#define CONFIG_SPL_FS_LOAD_PAYLOAD_NAME                "u-boot.img"
-
-#endif /* __CONFIG_H */
+#endif /* __CONFIG_SOCFGPA_STRATIX10_H__ */
index b4da1f8428ca2411f3b36e00a55c87b40b39ecf9..f2cdd9c0194047c7fb5b5ba895d54851e22724f0 100644 (file)
@@ -61,7 +61,6 @@
 #define PHYS_SDRAM_1           NV_PA_SDRC_CS0
 #define PHYS_SDRAM_1_SIZE      0x20000000      /* 512M */
 
-#define CONFIG_SYS_UBOOT_START CONFIG_SYS_TEXT_BASE
 #define CONFIG_SYS_SDRAM_BASE  PHYS_SDRAM_1
 
 #define CONFIG_SYS_BOOTMAPSZ   (256 << 20)     /* 256M */
index 63092b24a53a6e48c8d4db7826b86e8bf044e2f8..8b6caae7be73190a6444db82996374be6eca94b1 100644 (file)
@@ -27,7 +27,6 @@
 #define CONFIG_SYS_SPL_LEN                     CONFIG_SPL_PAD_TO
 #define CONFIG_SYS_UBOOT_BASE                  (CONFIG_SYS_FLASH_BASE + \
                                                 CONFIG_SYS_SPL_LEN)
-#define CONFIG_SYS_UBOOT_START                 CONFIG_SYS_TEXT_BASE
 #define CONFIG_SYS_MONITOR_BASE                        CONFIG_SYS_FLASH_BASE
 #define CONFIG_SYS_MONITOR_LEN                 0x60000
 
index 38d952d0c0cc18589a5fe19b8f722994d78ffce7..155d7fe883f059bec431e4534400b7db63fbf97c 100644 (file)
@@ -35,8 +35,6 @@
 /* Extend size of kernel image for uncompression */
 #define CONFIG_SYS_BOOTM_LEN   (60 * 1024 * 1024)
 
-#define CONFIG_SYS_UBOOT_START CONFIG_SYS_TEXT_BASE
-
 #define CONFIG_SKIP_LOWLEVEL_INIT
 
 /* 0x0 - 0x40 is used for placing exception vectors */
index 274cc191128e01544146addb9b53a5b8c3003e57..189ca81bbe00506cdf8555f2cd3fbf608b2fdefd 100644 (file)
 
 #define CONFIG_SPL_LOAD_FIT_ADDRESS 0x10000000
 
-#define CONFIG_SYS_UBOOT_START CONFIG_SYS_TEXT_BASE
-
 #endif /* __CONFIG_ZYNQ_COMMON_H */
index 564966333f1228e5fd4530050e39817fe8e6f580..fb5260d903aaedf3fda1fcf4025a7be9a959a111 100644 (file)
@@ -171,7 +171,6 @@ const char *dfu_get_dev_type(enum dfu_device_type t);
 const char *dfu_get_layout(enum dfu_layout l);
 struct dfu_entity *dfu_get_entity(int alt);
 char *dfu_extract_token(char** e, int *n);
-void dfu_trigger_reset(void);
 int dfu_get_alt(char *name);
 int dfu_init_env_entities(char *interface, char *devstr);
 unsigned char *dfu_get_buf(struct dfu_entity *dfu);
@@ -179,6 +178,11 @@ unsigned char *dfu_free_buf(void);
 unsigned long dfu_get_buf_size(void);
 bool dfu_usb_get_reset(void);
 
+#ifdef CONFIG_DFU_TIMEOUT
+unsigned long dfu_get_timeout(void);
+void dfu_set_timeout(unsigned long);
+#endif
+
 int dfu_read(struct dfu_entity *de, void *buf, int size, int blk_seq_num);
 int dfu_write(struct dfu_entity *de, void *buf, int size, int blk_seq_num);
 int dfu_flush(struct dfu_entity *de, void *buf, int size, int blk_seq_num);
index c9f49df3f2683b9eab7a14f84b6507824ec2f4e9..598f65ea7a32ecc5eaada566e7c55284fbef3db9 100644 (file)
@@ -89,6 +89,7 @@ enum uclass_id {
        UCLASS_REGULATOR,       /* Regulator device */
        UCLASS_REMOTEPROC,      /* Remote Processor device */
        UCLASS_RESET,           /* Reset controller device */
+       UCLASS_RNG,             /* Random Number Generator */
        UCLASS_RTC,             /* Real time clock device */
        UCLASS_SCSI,            /* SCSI device */
        UCLASS_SERIAL,          /* Serial UART */
diff --git a/include/dt-bindings/clock/agilex-clock.h b/include/dt-bindings/clock/agilex-clock.h
new file mode 100644 (file)
index 0000000..f751aad
--- /dev/null
@@ -0,0 +1,71 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2019, Intel Corporation
+ */
+
+#ifndef __AGILEX_CLOCK_H
+#define __AGILEX_CLOCK_H
+
+/* fixed rate clocks */
+#define AGILEX_OSC1                    0
+#define AGILEX_CB_INTOSC_HS_DIV2_CLK   1
+#define AGILEX_CB_INTOSC_LS_CLK                2
+#define AGILEX_L4_SYS_FREE_CLK         3
+#define AGILEX_F2S_FREE_CLK            4
+
+/* PLL clocks */
+#define AGILEX_MAIN_PLL_CLK            5
+#define AGILEX_MAIN_PLL_C0_CLK         6
+#define AGILEX_MAIN_PLL_C1_CLK         7
+#define AGILEX_MAIN_PLL_C2_CLK         8
+#define AGILEX_MAIN_PLL_C3_CLK         9
+#define AGILEX_PERIPH_PLL_CLK          10
+#define AGILEX_PERIPH_PLL_C0_CLK       11
+#define AGILEX_PERIPH_PLL_C1_CLK       12
+#define AGILEX_PERIPH_PLL_C2_CLK       13
+#define AGILEX_PERIPH_PLL_C3_CLK       14
+#define AGILEX_MPU_FREE_CLK            15
+#define AGILEX_MPU_CCU_CLK             16
+#define AGILEX_BOOT_CLK                        17
+
+/* fixed factor clocks */
+#define AGILEX_L3_MAIN_FREE_CLK                18
+#define AGILEX_NOC_FREE_CLK            19
+#define AGILEX_S2F_USR0_CLK            20
+#define AGILEX_NOC_CLK                 21
+#define AGILEX_EMAC_A_FREE_CLK         22
+#define AGILEX_EMAC_B_FREE_CLK         23
+#define AGILEX_EMAC_PTP_FREE_CLK       24
+#define AGILEX_GPIO_DB_FREE_CLK                25
+#define AGILEX_SDMMC_FREE_CLK          26
+#define AGILEX_S2F_USER0_FREE_CLK      27
+#define AGILEX_S2F_USER1_FREE_CLK      28
+#define AGILEX_PSI_REF_FREE_CLK                29
+
+/* Gate clocks */
+#define AGILEX_MPU_CLK                 30
+#define AGILEX_MPU_PERIPH_CLK          31
+#define AGILEX_L4_MAIN_CLK             32
+#define AGILEX_L4_MP_CLK               33
+#define AGILEX_L4_SP_CLK               34
+#define AGILEX_CS_AT_CLK               35
+#define AGILEX_CS_TRACE_CLK            36
+#define AGILEX_CS_PDBG_CLK             37
+#define AGILEX_CS_TIMER_CLK            38
+#define AGILEX_S2F_USER0_CLK           39
+#define AGILEX_EMAC0_CLK               40
+#define AGILEX_EMAC1_CLK               41
+#define AGILEX_EMAC2_CLK               42
+#define AGILEX_EMAC_PTP_CLK            43
+#define AGILEX_GPIO_DB_CLK             44
+#define AGILEX_NAND_CLK                        45
+#define AGILEX_PSI_REF_CLK             46
+#define AGILEX_S2F_USER1_CLK           47
+#define AGILEX_SDMMC_CLK               48
+#define AGILEX_SPI_M_CLK               49
+#define AGILEX_USB_CLK                 50
+#define AGILEX_NAND_X_CLK              51
+#define AGILEX_NAND_ECC_CLK            52
+#define AGILEX_NUM_CLKS                        53
+
+#endif /* __AGILEX_CLOCK_H */
diff --git a/include/dt-bindings/clock/imx8mp-clock.h b/include/dt-bindings/clock/imx8mp-clock.h
new file mode 100644 (file)
index 0000000..2fab631
--- /dev/null
@@ -0,0 +1,300 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright 2019 NXP
+ */
+
+#ifndef __DT_BINDINGS_CLOCK_IMX8MP_H
+#define __DT_BINDINGS_CLOCK_IMX8MP_H
+
+#define IMX8MP_CLK_DUMMY                       0
+#define IMX8MP_CLK_32K                         1
+#define IMX8MP_CLK_24M                         2
+#define IMX8MP_OSC_HDMI_CLK                    3
+#define IMX8MP_CLK_EXT1                                4
+#define IMX8MP_CLK_EXT2                                5
+#define IMX8MP_CLK_EXT3                                6
+#define IMX8MP_CLK_EXT4                                7
+#define IMX8MP_AUDIO_PLL1_REF_SEL              8
+#define IMX8MP_AUDIO_PLL2_REF_SEL              9
+#define IMX8MP_VIDEO_PLL1_REF_SEL              10
+#define IMX8MP_DRAM_PLL_REF_SEL                        11
+#define IMX8MP_GPU_PLL_REF_SEL                 12
+#define IMX8MP_VPU_PLL_REF_SEL                 13
+#define IMX8MP_ARM_PLL_REF_SEL                 14
+#define IMX8MP_SYS_PLL1_REF_SEL                        15
+#define IMX8MP_SYS_PLL2_REF_SEL                        16
+#define IMX8MP_SYS_PLL3_REF_SEL                        17
+#define IMX8MP_AUDIO_PLL1                      18
+#define IMX8MP_AUDIO_PLL2                      19
+#define IMX8MP_VIDEO_PLL1                      20
+#define IMX8MP_DRAM_PLL                                21
+#define IMX8MP_GPU_PLL                         22
+#define IMX8MP_VPU_PLL                         23
+#define IMX8MP_ARM_PLL                         24
+#define IMX8MP_SYS_PLL1                                25
+#define IMX8MP_SYS_PLL2                                26
+#define IMX8MP_SYS_PLL3                                27
+#define IMX8MP_AUDIO_PLL1_BYPASS               28
+#define IMX8MP_AUDIO_PLL2_BYPASS               29
+#define IMX8MP_VIDEO_PLL1_BYPASS               30
+#define IMX8MP_DRAM_PLL_BYPASS                 31
+#define IMX8MP_GPU_PLL_BYPASS                  32
+#define IMX8MP_VPU_PLL_BYPASS                  33
+#define IMX8MP_ARM_PLL_BYPASS                  34
+#define IMX8MP_SYS_PLL1_BYPASS                 35
+#define IMX8MP_SYS_PLL2_BYPASS                 36
+#define IMX8MP_SYS_PLL3_BYPASS                 37
+#define IMX8MP_AUDIO_PLL1_OUT                  38
+#define IMX8MP_AUDIO_PLL2_OUT                  39
+#define IMX8MP_VIDEO_PLL1_OUT                  40
+#define IMX8MP_DRAM_PLL_OUT                    41
+#define IMX8MP_GPU_PLL_OUT                     42
+#define IMX8MP_VPU_PLL_OUT                     43
+#define IMX8MP_ARM_PLL_OUT                     44
+#define IMX8MP_SYS_PLL1_OUT                    45
+#define IMX8MP_SYS_PLL2_OUT                    46
+#define IMX8MP_SYS_PLL3_OUT                    47
+#define IMX8MP_SYS_PLL1_40M                    48
+#define IMX8MP_SYS_PLL1_80M                    49
+#define IMX8MP_SYS_PLL1_100M                   50
+#define IMX8MP_SYS_PLL1_133M                   51
+#define IMX8MP_SYS_PLL1_160M                   52
+#define IMX8MP_SYS_PLL1_200M                   53
+#define IMX8MP_SYS_PLL1_266M                   54
+#define IMX8MP_SYS_PLL1_400M                   55
+#define IMX8MP_SYS_PLL1_800M                   56
+#define IMX8MP_SYS_PLL2_50M                    57
+#define IMX8MP_SYS_PLL2_100M                   58
+#define IMX8MP_SYS_PLL2_125M                   59
+#define IMX8MP_SYS_PLL2_166M                   60
+#define IMX8MP_SYS_PLL2_200M                   61
+#define IMX8MP_SYS_PLL2_250M                   62
+#define IMX8MP_SYS_PLL2_333M                   63
+#define IMX8MP_SYS_PLL2_500M                   64
+#define IMX8MP_SYS_PLL2_1000M                  65
+#define IMX8MP_CLK_A53_SRC                     66
+#define IMX8MP_CLK_M7_SRC                      67
+#define IMX8MP_CLK_ML_SRC                      68
+#define IMX8MP_CLK_GPU3D_CORE_SRC              69
+#define IMX8MP_CLK_GPU3D_SHADER_SRC            70
+#define IMX8MP_CLK_GPU2D_SRC                   71
+#define IMX8MP_CLK_AUDIO_AXI_SRC               72
+#define IMX8MP_CLK_HSIO_AXI_SRC                        73
+#define IMX8MP_CLK_MEDIA_ISP_SRC               74
+#define IMX8MP_CLK_A53_CG                      75
+#define IMX8MP_CLK_M4_CG                       76
+#define IMX8MP_CLK_ML_CG                       77
+#define IMX8MP_CLK_GPU3D_CORE_CG               78
+#define IMX8MP_CLK_GPU3D_SHADER_CG             79
+#define IMX8MP_CLK_GPU2D_CG                    80
+#define IMX8MP_CLK_AUDIO_AXI_CG                        81
+#define IMX8MP_CLK_HSIO_AXI_CG                 82
+#define IMX8MP_CLK_MEDIA_ISP_CG                        83
+#define IMX8MP_CLK_A53_DIV                     84
+#define IMX8MP_CLK_M7_DIV                      85
+#define IMX8MP_CLK_ML_DIV                      86
+#define IMX8MP_CLK_GPU3D_CORE_DIV              87
+#define IMX8MP_CLK_GPU3D_SHADER_DIV            88
+#define IMX8MP_CLK_GPU2D_DIV                   89
+#define IMX8MP_CLK_AUDIO_AXI_DIV               90
+#define IMX8MP_CLK_HSIO_AXI_DIV                        91
+#define IMX8MP_CLK_MEDIA_ISP_DIV               92
+#define IMX8MP_CLK_MAIN_AXI                    93
+#define IMX8MP_CLK_ENET_AXI                    94
+#define IMX8MP_CLK_NAND_USDHC_BUS              95
+#define IMX8MP_CLK_VPU_BUS                     96
+#define IMX8MP_CLK_MEDIA_AXI                   97
+#define IMX8MP_CLK_MEDIA_APB                   98
+#define IMX8MP_CLK_HDMI_APB                    99
+#define IMX8MP_CLK_HDMI_AXI                    100
+#define IMX8MP_CLK_GPU_AXI                     101
+#define IMX8MP_CLK_GPU_AHB                     102
+#define IMX8MP_CLK_NOC                         103
+#define IMX8MP_CLK_NOC_IO                      104
+#define IMX8MP_CLK_ML_AXI                      105
+#define IMX8MP_CLK_ML_AHB                      106
+#define IMX8MP_CLK_AHB                         107
+#define IMX8MP_CLK_AUDIO_AHB                   108
+#define IMX8MP_CLK_MIPI_DSI_ESC_RX             109
+#define IMX8MP_CLK_IPG_ROOT                    110
+#define IMX8MP_CLK_IPG_AUDIO_ROOT              111
+#define IMX8MP_CLK_DRAM_ALT                    112
+#define IMX8MP_CLK_DRAM_APB                    113
+#define IMX8MP_CLK_VPU_G1                      114
+#define IMX8MP_CLK_VPU_G2                      115
+#define IMX8MP_CLK_CAN1                                116
+#define IMX8MP_CLK_CAN2                                117
+#define IMX8MP_CLK_MEMREPAIR                   118
+#define IMX8MP_CLK_PCIE_PHY                    119
+#define IMX8MP_CLK_PCIE_AUX                    120
+#define IMX8MP_CLK_I2C5                                121
+#define IMX8MP_CLK_I2C6                                122
+#define IMX8MP_CLK_SAI1                                123
+#define IMX8MP_CLK_SAI2                                124
+#define IMX8MP_CLK_SAI3                                125
+#define IMX8MP_CLK_SAI4                                126
+#define IMX8MP_CLK_SAI5                                127
+#define IMX8MP_CLK_SAI6                                128
+#define IMX8MP_CLK_ENET_QOS                    129
+#define IMX8MP_CLK_ENET_QOS_TIMER              130
+#define IMX8MP_CLK_ENET_REF                    131
+#define IMX8MP_CLK_ENET_TIMER                  132
+#define IMX8MP_CLK_ENET_PHY_REF                        133
+#define IMX8MP_CLK_NAND                                134
+#define IMX8MP_CLK_QSPI                                135
+#define IMX8MP_CLK_USDHC1                      136
+#define IMX8MP_CLK_USDHC2                      137
+#define IMX8MP_CLK_I2C1                                138
+#define IMX8MP_CLK_I2C2                                139
+#define IMX8MP_CLK_I2C3                                140
+#define IMX8MP_CLK_I2C4                                141
+#define IMX8MP_CLK_UART1                       142
+#define IMX8MP_CLK_UART2                       143
+#define IMX8MP_CLK_UART3                       144
+#define IMX8MP_CLK_UART4                       145
+#define IMX8MP_CLK_USB_CORE_REF                        146
+#define IMX8MP_CLK_USB_PHY_REF                 147
+#define IMX8MP_CLK_GIC                         148
+#define IMX8MP_CLK_ECSPI1                      149
+#define IMX8MP_CLK_ECSPI2                      150
+#define IMX8MP_CLK_PWM1                                151
+#define IMX8MP_CLK_PWM2                                152
+#define IMX8MP_CLK_PWM3                                153
+#define IMX8MP_CLK_PWM4                                154
+#define IMX8MP_CLK_GPT1                                155
+#define IMX8MP_CLK_GPT2                                156
+#define IMX8MP_CLK_GPT3                                157
+#define IMX8MP_CLK_GPT4                                158
+#define IMX8MP_CLK_GPT5                                159
+#define IMX8MP_CLK_GPT6                                160
+#define IMX8MP_CLK_TRACE                       161
+#define IMX8MP_CLK_WDOG                                162
+#define IMX8MP_CLK_WRCLK                       163
+#define IMX8MP_CLK_IPP_DO_CLKO1                        164
+#define IMX8MP_CLK_IPP_DO_CLKO2                        165
+#define IMX8MP_CLK_HDMI_FDCC_TST               166
+#define IMX8MP_CLK_HDMI_27M                    167
+#define IMX8MP_CLK_HDMI_REF_266M               168
+#define IMX8MP_CLK_USDHC3                      169
+#define IMX8MP_CLK_MEDIA_CAM1_PIX              170
+#define IMX8MP_CLK_MEDIA_MIPI_PHY1_REF         171
+#define IMX8MP_CLK_MEDIA_DISP1_PIX             172
+#define IMX8MP_CLK_MEDIA_CAM2_PIX              173
+#define IMX8MP_CLK_MEDIA_MIPI_PHY2_REF         174
+#define IMX8MP_CLK_MEDIA_MIPI_CSI2_ESC         175
+#define IMX8MP_CLK_PCIE2_CTRL                  176
+#define IMX8MP_CLK_PCIE2_PHY                   177
+#define IMX8MP_CLK_MEDIA_MIPI_TEST_BYTE                178
+#define IMX8MP_CLK_ECSPI3                      179
+#define IMX8MP_CLK_PDM                         180
+#define IMX8MP_CLK_VPU_VC8000E                 181
+#define IMX8MP_CLK_SAI7                                182
+#define IMX8MP_CLK_GPC_ROOT                    183
+#define IMX8MP_CLK_ANAMIX_ROOT                 184
+#define IMX8MP_CLK_CPU_ROOT                    185
+#define IMX8MP_CLK_CSU_ROOT                    186
+#define IMX8MP_CLK_DEBUG_ROOT                  187
+#define IMX8MP_CLK_DRAM1_ROOT                  188
+#define IMX8MP_CLK_ECSPI1_ROOT                 189
+#define IMX8MP_CLK_ECSPI2_ROOT                 190
+#define IMX8MP_CLK_ECSPI3_ROOT                 191
+#define IMX8MP_CLK_ENET1_ROOT                  192
+#define IMX8MP_CLK_GPIO1_ROOT                  193
+#define IMX8MP_CLK_GPIO2_ROOT                  194
+#define IMX8MP_CLK_GPIO3_ROOT                  195
+#define IMX8MP_CLK_GPIO4_ROOT                  196
+#define IMX8MP_CLK_GPIO5_ROOT                  197
+#define IMX8MP_CLK_GPT1_ROOT                   198
+#define IMX8MP_CLK_GPT2_ROOT                   199
+#define IMX8MP_CLK_GPT3_ROOT                   200
+#define IMX8MP_CLK_GPT4_ROOT                   201
+#define IMX8MP_CLK_GPT5_ROOT                   202
+#define IMX8MP_CLK_GPT6_ROOT                   203
+#define IMX8MP_CLK_HS_ROOT                     204
+#define IMX8MP_CLK_I2C1_ROOT                   205
+#define IMX8MP_CLK_I2C2_ROOT                   206
+#define IMX8MP_CLK_I2C3_ROOT                   207
+#define IMX8MP_CLK_I2C4_ROOT                   208
+#define IMX8MP_CLK_IOMUX_ROOT                  209
+#define IMX8MP_CLK_IPMUX1_ROOT                 210
+#define IMX8MP_CLK_IPMUX2_ROOT                 211
+#define IMX8MP_CLK_IPMUX3_ROOT                 212
+#define IMX8MP_CLK_MU_ROOT                     213
+#define IMX8MP_CLK_OCOTP_ROOT                  214
+#define IMX8MP_CLK_OCRAM_ROOT                  215
+#define IMX8MP_CLK_OCRAM_S_ROOT                        216
+#define IMX8MP_CLK_PCIE_ROOT                   217
+#define IMX8MP_CLK_PERFMON1_ROOT               218
+#define IMX8MP_CLK_PERFMON2_ROOT               219
+#define IMX8MP_CLK_PWM1_ROOT                   220
+#define IMX8MP_CLK_PWM2_ROOT                   221
+#define IMX8MP_CLK_PWM3_ROOT                   222
+#define IMX8MP_CLK_PWM4_ROOT                   223
+#define IMX8MP_CLK_QOS_ROOT                    224
+#define IMX8MP_CLK_QOS_ENET_ROOT               225
+#define IMX8MP_CLK_QSPI_ROOT                   226
+#define IMX8MP_CLK_NAND_ROOT                   227
+#define IMX8MP_CLK_NAND_USDHC_BUS_RAWNAND_CLK  228
+#define IMX8MP_CLK_RDC_ROOT                    229
+#define IMX8MP_CLK_ROM_ROOT                    230
+#define IMX8MP_CLK_I2C5_ROOT                   231
+#define IMX8MP_CLK_I2C6_ROOT                   232
+#define IMX8MP_CLK_CAN1_ROOT                   233
+#define IMX8MP_CLK_CAN2_ROOT                   234
+#define IMX8MP_CLK_SCTR_ROOT                   235
+#define IMX8MP_CLK_SDMA1_ROOT                  236
+#define IMX8MP_CLK_ENET_QOS_ROOT               237
+#define IMX8MP_CLK_SEC_DEBUG_ROOT              238
+#define IMX8MP_CLK_SEMA1_ROOT                  239
+#define IMX8MP_CLK_SEMA2_ROOT                  240
+#define IMX8MP_CLK_IRQ_STEER_ROOT              241
+#define IMX8MP_CLK_SIM_ENET_ROOT               242
+#define IMX8MP_CLK_SIM_M_ROOT                  243
+#define IMX8MP_CLK_SIM_MAIN_ROOT               244
+#define IMX8MP_CLK_SIM_S_ROOT                  245
+#define IMX8MP_CLK_SIM_WAKEUP_ROOT             246
+#define IMX8MP_CLK_GPU2D_ROOT                  247
+#define IMX8MP_CLK_GPU3D_ROOT                  248
+#define IMX8MP_CLK_SNVS_ROOT                   249
+#define IMX8MP_CLK_TRACE_ROOT                  250
+#define IMX8MP_CLK_UART1_ROOT                  251
+#define IMX8MP_CLK_UART2_ROOT                  252
+#define IMX8MP_CLK_UART3_ROOT                  253
+#define IMX8MP_CLK_UART4_ROOT                  254
+#define IMX8MP_CLK_USB_ROOT                    255
+#define IMX8MP_CLK_USB_PHY_ROOT                        256
+#define IMX8MP_CLK_USDHC1_ROOT                 257
+#define IMX8MP_CLK_USDHC2_ROOT                 258
+#define IMX8MP_CLK_WDOG1_ROOT                  259
+#define IMX8MP_CLK_WDOG2_ROOT                  260
+#define IMX8MP_CLK_WDOG3_ROOT                  261
+#define IMX8MP_CLK_VPU_G1_ROOT                 262
+#define IMX8MP_CLK_GPU_ROOT                    263
+#define IMX8MP_CLK_NOC_WRAPPER_ROOT            264
+#define IMX8MP_CLK_VPU_VC8KE_ROOT              265
+#define IMX8MP_CLK_VPU_G2_ROOT                 266
+#define IMX8MP_CLK_NPU_ROOT                    267
+#define IMX8MP_CLK_HSIO_ROOT                   268
+#define IMX8MP_CLK_MEDIA_APB_ROOT              269
+#define IMX8MP_CLK_MEDIA_AXI_ROOT              270
+#define IMX8MP_CLK_MEDIA_CAM1_PIX_ROOT         271
+#define IMX8MP_CLK_MEDIA_CAM2_PIX_ROOT         272
+#define IMX8MP_CLK_MEDIA_DISP1_PIX_ROOT                273
+#define IMX8MP_CLK_MEDIA_DISP2_PIX_ROOT                274
+#define IMX8MP_CLK_MEDIA_MIPI_PHY1_REF_ROOT    275
+#define IMX8MP_CLK_MEDIA_ISP_ROOT              276
+#define IMX8MP_CLK_USDHC3_ROOT                 277
+#define IMX8MP_CLK_HDMI_ROOT                   278
+#define IMX8MP_CLK_XTAL_ROOT                   279
+#define IMX8MP_CLK_PLL_ROOT                    280
+#define IMX8MP_CLK_TSENSOR_ROOT                        281
+#define IMX8MP_CLK_VPU_ROOT                    282
+#define IMX8MP_CLK_MRPR_ROOT                   283
+#define IMX8MP_CLK_AUDIO_ROOT                  284
+#define IMX8MP_CLK_DRAM_ALT_ROOT               285
+#define IMX8MP_CLK_DRAM_CORE                   286
+#define IMX8MP_CLK_ARM                         287
+
+#define IMX8MP_CLK_END                         288
+
+#endif
index 5f415a99cc9002413ce10f821c273b35e4186c04..e12697a5d5b0113924db550b4720b21697b2729c 100644 (file)
@@ -91,7 +91,13 @@ typedef struct {
 #define EFI_IP_ADDRESS_CONFLICT                (EFI_ERROR_MASK | 34)
 #define EFI_HTTP_ERROR                 (EFI_ERROR_MASK | 35)
 
-#define EFI_WARN_DELETE_FAILURE        2
+#define EFI_WARN_UNKNOWN_GLYPH         1
+#define EFI_WARN_DELETE_FAILURE                2
+#define EFI_WARN_WRITE_FAILURE         3
+#define EFI_WARN_BUFFER_TOO_SMALL      4
+#define EFI_WARN_STALE_DATA            5
+#define EFI_WARN_FILE_SYSTEM           6
+#define EFI_WARN_RESET_REQUIRED                7
 
 typedef unsigned long efi_status_t;
 typedef u64 efi_physical_addr_t;
index 16a1b258b17d5d0e12153d0ed7c6ce70057116ff..d4c59b54c48b4e53a456aed05b06ad0cf056bd55 100644 (file)
@@ -17,6 +17,11 @@ static inline int guidcmp(const void *g1, const void *g2)
        return memcmp(g1, g2, sizeof(efi_guid_t));
 }
 
+static inline void *guidcpy(void *dst, const void *src)
+{
+       return memcpy(dst, src, sizeof(efi_guid_t));
+}
+
 /* No need for efi loader support in SPL */
 #if CONFIG_IS_ENABLED(EFI_LOADER)
 
@@ -34,6 +39,9 @@ static inline int guidcmp(const void *g1, const void *g2)
        EFI_GUID(0xbbe4e671, 0x5773, 0x4ea1, \
                 0x9a, 0xab, 0x3a, 0x7d, 0xbf, 0x40, 0xc4, 0x82)
 
+/* Use internal device tree when starting UEFI application */
+#define EFI_FDT_USE_INTERNAL NULL
+
 /* Root node */
 extern efi_handle_t efi_root;
 
@@ -125,6 +133,7 @@ extern const struct efi_hii_config_routing_protocol efi_hii_config_routing;
 extern const struct efi_hii_config_access_protocol efi_hii_config_access;
 extern const struct efi_hii_database_protocol efi_hii_database;
 extern const struct efi_hii_string_protocol efi_hii_string;
+extern const struct efi_rng_protocol efi_rng_protocol;
 
 uint16_t *efi_dp_str(struct efi_device_path *dp);
 
@@ -170,6 +179,9 @@ extern const efi_guid_t efi_guid_hii_config_access_protocol;
 extern const efi_guid_t efi_guid_hii_database_protocol;
 extern const efi_guid_t efi_guid_hii_string_protocol;
 
+/* GUID of RNG protocol */
+extern const efi_guid_t efi_guid_rng_protocol;
+
 extern unsigned int __efi_runtime_start, __efi_runtime_stop;
 extern unsigned int __efi_runtime_rel_start, __efi_runtime_rel_stop;
 
@@ -338,6 +350,10 @@ extern struct list_head efi_register_notify_events;
 
 /* Initialize efi execution environment */
 efi_status_t efi_init_obj_list(void);
+/* Install device tree */
+efi_status_t efi_install_fdt(void *fdt);
+/* Run loaded UEFI image */
+efi_status_t efi_run_image(void *source_buffer, efi_uintn_t source_size);
 /* Initialize variable services */
 efi_status_t efi_init_variables(void);
 /* Notify ExitBootServices() is called */
diff --git a/include/efi_rng.h b/include/efi_rng.h
new file mode 100644 (file)
index 0000000..35f5967
--- /dev/null
@@ -0,0 +1,32 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
+/*
+ * Copyright (c) 2019, Linaro Limited
+ */
+
+#if !defined _EFI_RNG_H_
+#define _EFI_RNG_H_
+
+#include <efi.h>
+#include <efi_api.h>
+
+/* EFI random number generation protocol related GUID definitions */
+#define EFI_RNG_PROTOCOL_GUID \
+       EFI_GUID(0x3152bca5, 0xeade, 0x433d, 0x86, 0x2e, \
+                0xc0, 0x1c, 0xdc, 0x29, 0x1f, 0x44)
+
+#define EFI_RNG_ALGORITHM_RAW \
+       EFI_GUID(0xe43176d7, 0xb6e8, 0x4827, 0xb7, 0x84, \
+                0x7f, 0xfd, 0xc4, 0xb6, 0x85, 0x61)
+
+struct efi_rng_protocol {
+       efi_status_t (EFIAPI *get_info)(struct efi_rng_protocol *protocol,
+                                       efi_uintn_t *rng_algorithm_list_size,
+                                       efi_guid_t *rng_algorithm_list);
+       efi_status_t (EFIAPI *get_rng)(struct efi_rng_protocol *protocol,
+                                      efi_guid_t *rng_algorithm,
+                                      efi_uintn_t rng_value_length, uint8_t *rng_value);
+};
+
+efi_status_t platform_get_rng_device(struct udevice **dev);
+
+#endif /* _EFI_RNG_H_ */
index f4d2aaf53e87c11096644893f4227cc1d64d42ce..4a280b78e748ebe49f4c74a4ab60b160ec8b37e2 100644 (file)
@@ -157,6 +157,7 @@ enum {
        IH_OS_ARM_TRUSTED_FIRMWARE,     /* ARM Trusted Firmware */
        IH_OS_TEE,                      /* Trusted Execution Environment */
        IH_OS_OPENSBI,                  /* RISC-V OpenSBI */
+       IH_OS_EFI,                      /* EFI Firmware (e.g. GRUB2) */
 
        IH_OS_COUNT,
 };
index eb5797af7455232963d6de97812cda37c479b57d..1929e4400f1ea7ad6855331cfc16b59610f9fcb0 100644 (file)
@@ -24,7 +24,7 @@
 #define EFI_PMBR_OSTYPE_EFI 0xEF
 #define EFI_PMBR_OSTYPE_EFI_GPT 0xEE
 
-#define GPT_HEADER_SIGNATURE_UBOOT 0x5452415020494645ULL
+#define GPT_HEADER_SIGNATURE_UBOOT 0x5452415020494645ULL // 'EFI PART'
 #define GPT_HEADER_CHROMEOS_IGNORE 0x454d45524f4e4749ULL // 'IGNOREME'
 
 #define GPT_HEADER_REVISION_V1 0x00010000
index bff3b0aa7a6cd914184031091f6b24b0efe64160..086f2b860e99533c86b40fde1e887efaa04b69d1 100644 (file)
@@ -155,6 +155,8 @@ typedef struct _IMAGE_SECTION_HEADER {
        uint32_t Characteristics;
 } IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER;
 
+/* Indices for Optional Header Data Directories */
+#define IMAGE_DIRECTORY_ENTRY_SECURITY         4
 #define IMAGE_DIRECTORY_ENTRY_BASERELOC         5
 
 typedef struct _IMAGE_BASE_RELOCATION
@@ -252,4 +254,20 @@ typedef struct _IMAGE_RELOCATION
 #define IMAGE_REL_AMD64_PAIR            0x000F
 #define IMAGE_REL_AMD64_SSPAN32         0x0010
 
+/* certificate appended to PE image */
+typedef struct _WIN_CERTIFICATE {
+       uint32_t dwLength;
+       uint16_t wRevision;
+       uint16_t wCertificateType;
+       uint8_t bCertificate[];
+} WIN_CERTIFICATE, *LPWIN_CERTIFICATE;
+
+/* Definitions for the contents of the certs data block */
+#define WIN_CERT_TYPE_PKCS_SIGNED_DATA 0x0002
+#define WIN_CERT_TYPE_EFI_OKCS115      0x0EF0
+#define WIN_CERT_TYPE_EFI_GUID         0x0EF1
+
+#define WIN_CERT_REVISION_1_0          0x0100
+#define WIN_CERT_REVISION_2_0          0x0200
+
 #endif /* _PE_H */
diff --git a/include/power/pca9450.h b/include/power/pca9450.h
new file mode 100644 (file)
index 0000000..5d4f58c
--- /dev/null
@@ -0,0 +1,60 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
+/*
+ * Copyright 2019 NXP
+ */
+
+#ifndef PCA9450_H_
+#define PCA9450_H_
+
+#define PCA9450_REGULATOR_DRIVER "pca9450_regulator"
+
+enum {
+       PCA9450_REG_DEV_ID      = 0x00,
+       PCA9450_INT1            = 0x01,
+       PCA9450_INT1_MSK        = 0x02,
+       PCA9450_STATUS1         = 0x03,
+       PCA9450_STATUS2         = 0x04,
+       PCA9450_PWRON_STAT      = 0x05,
+       PCA9450_SW_RST          = 0x06,
+       PCA9450_PWR_CTRL        = 0x07,
+       PCA9450_RESET_CTRL      = 0x08,
+       PCA9450_CONFIG1         = 0x09,
+       PCA9450_CONFIG2         = 0x0A,
+       PCA9450_BUCK123_DVS     = 0x0C,
+       PCA9450_BUCK1OUT_LIMIT  = 0x0D,
+       PCA9450_BUCK2OUT_LIMIT  = 0x0E,
+       PCA9450_BUCK3OUT_LIMIT  = 0x0F,
+       PCA9450_BUCK1CTRL       = 0x10,
+       PCA9450_BUCK1OUT_DVS0   = 0x11,
+       PCA9450_BUCK1OUT_DVS1   = 0x12,
+       PCA9450_BUCK2CTRL       = 0x13,
+       PCA9450_BUCK2OUT_DVS0   = 0x14,
+       PCA9450_BUCK2OUT_DVS1   = 0x15,
+       PCA9450_BUCK3CTRL       = 0x16,
+       PCA9450_BUCK3OUT_DVS0   = 0x17,
+       PCA9450_BUCK3OUT_DVS1   = 0x18,
+       PCA9450_BUCK4CTRL       = 0x19,
+       PCA9450_BUCK4OUT        = 0x1A,
+       PCA9450_BUCK5CTRL       = 0x1B,
+       PCA9450_BUCK5OUT        = 0x1C,
+       PCA9450_BUCK6CTRL       = 0x1D,
+       PCA9450_BUCK6OUT        = 0x1E,
+       PCA9450_LDO_AD_CTRL     = 0x20,
+       PCA9450_LDO1CTRL        = 0x21,
+       PCA9450_LDO2CTRL        = 0x22,
+       PCA9450_LDO3CTRL        = 0x23,
+       PCA9450_LDO4CTRL        = 0x24,
+       PCA9450_LDO5CTRL_L      = 0x25,
+       PCA9450_LDO5CTRL_H      = 0x26,
+       PCA9450_LOADSW_CTRL     = 0x2A,
+       PCA9450_VRFLT1_STS      = 0x2B,
+       PCA9450_VRFLT2_STS      = 0x2C,
+       PCA9450_VRFLT1_MASK     = 0x2D,
+       PCA9450_VRFLT2_MASK     = 0x2E,
+       PCA9450_REG_NUM,
+};
+
+int power_pca9450a_init(unsigned char bus);
+int power_pca9450b_init(unsigned char bus);
+
+#endif
index 046cd9e54e0209939abe562ac5c017cfabf00468..a903acb9b24ffb9154758df2a480843082e30586 100644 (file)
@@ -277,6 +277,64 @@ int rproc_elf_load_image(struct udevice *dev, unsigned long addr, ulong size);
  * image.
  */
 ulong rproc_elf_get_boot_addr(struct udevice *dev, ulong addr);
+
+/**
+ * rproc_elf32_load_rsc_table() - load the resource table from an ELF32 image
+ *
+ * Search for the resource table in an ELF32 image, and if found, copy it to
+ * device memory.
+ *
+ * @dev:       device loading the resource table
+ * @fw_addr:   ELF image address
+ * @fw_size:   size of the ELF image
+ * @rsc_addr:  pointer to the found resource table address. Updated on
+ *             operation success
+ * @rsc_size:  pointer to the found resource table size. Updated on operation
+ *             success
+ *
+ * @return 0 if a valid resource table is successfully loaded, -ENODATA if there
+ * is no resource table (which is optional), or another appropriate error value.
+ */
+int rproc_elf32_load_rsc_table(struct udevice *dev, ulong fw_addr,
+                              ulong fw_size, ulong *rsc_addr, ulong *rsc_size);
+/**
+ * rproc_elf64_load_rsc_table() - load the resource table from an ELF64 image
+ *
+ * Search for the resource table in an ELF64 image, and if found, copy it to
+ * device memory.
+ *
+ * @dev:       device loading the resource table
+ * @fw_addr:   ELF image address
+ * @fw_size:   size of the ELF image
+ * @rsc_addr:  pointer to the found resource table address. Updated on
+ *             operation success
+ * @rsc_size:  pointer to the found resource table size. Updated on operation
+ *             success
+ *
+ * @return 0 if a valid resource table is successfully loaded, -ENODATA if there
+ * is no resource table (which is optional), or another appropriate error value.
+ */
+int rproc_elf64_load_rsc_table(struct udevice *dev, ulong fw_addr,
+                              ulong fw_size, ulong *rsc_addr, ulong *rsc_size);
+/**
+ * rproc_elf_load_rsc_table() - load the resource table from an ELF image
+ *
+ * Auto detects if the image is ELF32 or ELF64 image and search accordingly for
+ * the resource table, and if found, copy it to device memory.
+ *
+ * @dev:       device loading the resource table
+ * @fw_addr:   ELF image address
+ * @fw_size:   size of the ELF image
+ * @rsc_addr:  pointer to the found resource table address. Updated on
+ *             operation success
+ * @rsc_size:  pointer to the found resource table size. Updated on operation
+ *             success
+ *
+ * @return 0 if a valid resource table is successfully loaded, -ENODATA if there
+ * is no resource table (which is optional), or another appropriate error value.
+ */
+int rproc_elf_load_rsc_table(struct udevice *dev, ulong fw_addr,
+                            ulong fw_size, ulong *rsc_addr, ulong *rsc_size);
 #else
 static inline int rproc_init(void) { return -ENOSYS; }
 static inline int rproc_dev_init(int id) { return -ENOSYS; }
@@ -304,6 +362,18 @@ static inline int rproc_elf_load_image(struct udevice *dev, ulong addr,
 { return -ENOSYS; }
 static inline ulong rproc_elf_get_boot_addr(struct udevice *dev, ulong addr)
 { return 0; }
+static inline int rproc_elf32_load_rsc_table(struct udevice *dev, ulong fw_addr,
+                                            ulong fw_size, ulong *rsc_addr,
+                                            ulong *rsc_size)
+{ return -ENOSYS; }
+static inline int rproc_elf64_load_rsc_table(struct udevice *dev, ulong fw_addr,
+                                            ulong fw_size, ulong *rsc_addr,
+                                            ulong *rsc_size)
+{ return -ENOSYS; }
+static inline int rproc_elf_load_rsc_table(struct udevice *dev, ulong fw_addr,
+                                          ulong fw_size, ulong *rsc_addr,
+                                          ulong *rsc_size)
+{ return -ENOSYS; }
 #endif
 
 #endif /* _RPROC_H_ */
diff --git a/include/rng.h b/include/rng.h
new file mode 100644 (file)
index 0000000..d2c0f9a
--- /dev/null
@@ -0,0 +1,33 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright (c) 2019, Linaro Limited
+ */
+
+#if !defined _RNG_H_
+#define _RNG_H_
+
+struct udevice;
+
+/**
+ * dm_rng_read() - read a random number seed from the rng device
+ * @buffer:    input buffer to put the read random seed into
+ * @size:      number of bytes of random seed read
+ *
+ * Return: 0 if OK, -ve on error
+ */
+int dm_rng_read(struct udevice *dev, void *buffer, size_t size);
+
+/* struct dm_rng_ops - Operations for the hwrng uclass */
+struct dm_rng_ops {
+       /**
+        * @read() - read a random number seed
+        *
+        * @data:       input buffer to read the random seed
+        * @max:        total number of bytes to read
+        *
+        * Return: 0 if OK, -ve on error
+        */
+       int (*read)(struct udevice *dev, void *data, size_t max);
+};
+
+#endif /* _RNG_H_ */
index 20970f08d6646795ec7aaae24429f858dbd5ed88..0748185eaf75b05011ccc52b8474383e8ed298fe 100644 (file)
@@ -13,6 +13,7 @@ struct unit_test;
  * cmd_ut_category() - Run a category of unit tests
  *
  * @name:      Category name
+ * @prefix:    Prefix of test name
  * @tests:     List of tests to run
  * @n_ents:    Number of tests in @tests
  * @argc:      Argument count provided. Must be >= 1. If this is 1 then all
@@ -20,7 +21,8 @@ struct unit_test;
  * @argv:      Arguments: argv[1] is the test to run (if @argc >= 2)
  * @return 0 if OK, CMD_RET_FAILURE on failure
  */
-int cmd_ut_category(const char *name, struct unit_test *tests, int n_ents,
+int cmd_ut_category(const char *name, const char *prefix,
+                   struct unit_test *tests, int n_ents,
                    int argc, char * const argv[]);
 
 int do_ut_bloblist(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[]);
index 485071d0723356abe07ab48d31f0738333eea4f6..e7c58e86cb490ea503467d185dd0ab0f6ec3ddeb 100644 (file)
@@ -17,6 +17,8 @@
 
 #include <stdio_dev.h>
 
+struct udevice;
+
 struct video_uc_platdata {
        uint align;
        uint size;
index 654fdf154b6c9731daa35e303e3dc24a32eeb42a..561dcc34baf735783e21f793a54b06d20b89046d 100644 (file)
 
 #define VIRTIO_ID_NET          1 /* virtio net */
 #define VIRTIO_ID_BLOCK                2 /* virtio block */
-#define VIRTIO_ID_MAX_NUM      3
+#define VIRTIO_ID_RNG          4 /* virtio rng */
+#define VIRTIO_ID_MAX_NUM      5
 
 #define VIRTIO_NET_DRV_NAME    "virtio-net"
 #define VIRTIO_BLK_DRV_NAME    "virtio-blk"
+#define VIRTIO_RNG_DRV_NAME    "virtio-rng"
 
 /* Status byte for guest to report progress, and synchronize features */
 
index 634a600f847c3975d461ccfaa40c187e02c8769e..f2d7c144479b4461cea18c3316e112b121a7e3cc 100644 (file)
@@ -1,2 +1,3 @@
 *.efi
 *.so
+*.S
index 21ef440341473deb9c3e513f6634ffa2e12e82c8..6727336169c57188cdf76bfdd282d5194984da0f 100644 (file)
@@ -15,6 +15,7 @@ config EFI_LOADER
        select HAVE_BLOCK_DEVICE
        select REGEX
        imply CFB_CONSOLE_ANSI
+       imply USB_KEYBOARD_FN_KEYS
        help
          Select this option if you want to run UEFI applications (like GNU
          GRUB or iPXE) on top of U-Boot. If this option is enabled, U-Boot
@@ -120,4 +121,12 @@ config EFI_GRUB_ARM32_WORKAROUND
          GRUB prior to version 2.04 requires U-Boot to disable caches. This
          workaround currently is also needed on systems with caches that
          cannot be managed via CP15.
+
+config EFI_RNG_PROTOCOL
+       bool "EFI_RNG_PROTOCOL support"
+       depends on DM_RNG
+       help
+         "Support for EFI_RNG_PROTOCOL implementation. Uses the rng
+          device on the platform"
+
 endif
index 7db406028618b2023fadc231d6ea42969d1632f0..04dc8648512b0f3591c9687e1cdf62680530ca2e 100644 (file)
@@ -42,3 +42,4 @@ obj-$(CONFIG_PARTITIONS) += efi_disk.o
 obj-$(CONFIG_NET) += efi_net.o
 obj-$(CONFIG_GENERATE_ACPI_TABLE) += efi_acpi.o
 obj-$(CONFIG_GENERATE_SMBIOS_TABLE) += efi_smbios.o
+obj-$(CONFIG_EFI_RNG_PROTOCOL) += efi_rng.o
index 88a7604bbf33710da7ab7b255d181dc5ed97d957..3103a50158ad6bed852b7ed67aecdde7f4556302 100644 (file)
@@ -1401,7 +1401,7 @@ static efi_status_t EFIAPI efi_register_protocol_notify(
        }
 
        item->event = event;
-       memcpy(&item->protocol, protocol, sizeof(efi_guid_t));
+       guidcpy(&item->protocol, protocol);
        INIT_LIST_HEAD(&item->handles);
 
        list_add_tail(&item->link, &efi_register_notify_events);
@@ -1632,7 +1632,7 @@ efi_status_t efi_install_configuration_table(const efi_guid_t *guid,
                return EFI_OUT_OF_RESOURCES;
 
        /* Add a new entry */
-       memcpy(&systab.tables[i].guid, guid, sizeof(*guid));
+       guidcpy(&systab.tables[i].guid, guid);
        systab.tables[i].table = table;
        systab.nr_tables = i + 1;
 
index 218f7caa12f85051a099e00842d687d69c8f3011..8494044799a797c7f3ac2f76f6d200818afa40df 100644 (file)
@@ -360,12 +360,26 @@ static efi_status_t EFIAPI efi_cout_set_attribute(
        return EFI_EXIT(EFI_SUCCESS);
 }
 
+/**
+ * efi_cout_clear_screen() - clear screen
+ *
+ * This function implements the ClearScreen service of the
+ * EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL. See the Unified Extensible Firmware
+ * Interface (UEFI) specification for details.
+ *
+ * @this:      pointer to the protocol instance
+ * Return:     status code
+ */
 static efi_status_t EFIAPI efi_cout_clear_screen(
                        struct efi_simple_text_output_protocol *this)
 {
        EFI_ENTRY("%p", this);
 
-       printf(ESC"[2J");
+       /*
+        * The Linux console wants both a clear and a home command. The video
+        * uclass does not support <ESC>[H without coordinates, yet.
+        */
+       printf(ESC "[2J" ESC "[1;1H");
        efi_con_mode.cursor_column = 0;
        efi_con_mode.cursor_row = 0;
 
index 6d3f680e56ca2b4300666f02c40bda408af19190..140116ddc4ace7ccd2e1916aad62b9a1bb47c498 100644 (file)
@@ -656,9 +656,16 @@ static efi_status_t EFIAPI efi_file_getinfo(struct efi_file_handle *file,
                memset(info, 0, required_size);
 
                info->size = required_size;
-               info->read_only = true;
+               /*
+                * TODO: We cannot determine if the volume can be written to.
+                */
+               info->read_only = false;
                info->volume_size = part.size * part.blksz;
-               info->free_space = 0;
+               /*
+                * TODO: We currently have no function to determine the free
+                * space. The volume size is the best upper bound we have.
+                */
+               info->free_space = info->volume_size;
                info->block_size = part.blksz;
                /*
                 * TODO: The volume label is not available in U-Boot.
index bd9da5bbc867d4446f6283d9142f6709050bab61..dcf5d1c49a2d4433d27762c58eecb279db01c6bb 100644 (file)
@@ -88,3 +88,35 @@ void *memset(void *s, int c, size_t n)
                *d++ = c;
        return s;
 }
+
+/**
+ * __cyg_profile_func_enter() - record function entry
+ *
+ * This is called on every function entry when compiling with
+ * -finstrument-functions.
+ *
+ * We do nothing here.
+ *
+ * @param func_ptr     Pointer to function being entered
+ * @param caller       Pointer to function which called this function
+ */
+void __attribute__((no_instrument_function))
+__cyg_profile_func_enter(void *func_ptr, void *caller)
+{
+}
+
+/**
+ * __cyg_profile_func_exit() - record function exit
+ *
+ * This is called on every function exit when compiling with
+ * -finstrument-functions.
+ *
+ * We do nothing here.
+ *
+ * @param func_ptr     Pointer to function being entered
+ * @param caller       Pointer to function which called this function
+ */
+void __attribute__((no_instrument_function))
+__cyg_profile_func_exit(void *func_ptr, void *caller)
+{
+}
diff --git a/lib/efi_loader/efi_rng.c b/lib/efi_loader/efi_rng.c
new file mode 100644 (file)
index 0000000..432c986
--- /dev/null
@@ -0,0 +1,114 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright (c) 2019, Linaro Limited
+ */
+
+#include <common.h>
+#include <dm.h>
+#include <efi_loader.h>
+#include <efi_rng.h>
+#include <rng.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+const efi_guid_t efi_guid_rng_protocol = EFI_RNG_PROTOCOL_GUID;
+
+__weak efi_status_t platform_get_rng_device(struct udevice **dev)
+{
+       int ret;
+       struct udevice *devp;
+
+       ret = uclass_get_device(UCLASS_RNG, 0, &devp);
+       if (ret) {
+               debug("Unable to get rng device\n");
+               return EFI_DEVICE_ERROR;
+       }
+
+       *dev = devp;
+
+       return EFI_SUCCESS;
+}
+
+static efi_status_t EFIAPI rng_getinfo(struct efi_rng_protocol *this,
+                                      efi_uintn_t *rng_algorithm_list_size,
+                                      efi_guid_t *rng_algorithm_list)
+{
+       efi_status_t ret = EFI_SUCCESS;
+       efi_guid_t rng_algo_guid = EFI_RNG_ALGORITHM_RAW;
+
+       EFI_ENTRY("%p, %p, %p", this, rng_algorithm_list_size,
+                 rng_algorithm_list);
+
+       if (!this || !rng_algorithm_list_size) {
+               ret = EFI_INVALID_PARAMETER;
+               goto back;
+       }
+
+       if (!rng_algorithm_list ||
+           *rng_algorithm_list_size < sizeof(*rng_algorithm_list)) {
+               *rng_algorithm_list_size = sizeof(*rng_algorithm_list);
+               ret = EFI_BUFFER_TOO_SMALL;
+               goto back;
+       }
+
+       /*
+        * For now, use EFI_RNG_ALGORITHM_RAW as the default
+        * algorithm. If a new algorithm gets added in the
+        * future through a Kconfig, rng_algo_guid will be set
+        * based on that Kconfig option
+        */
+       *rng_algorithm_list_size = sizeof(*rng_algorithm_list);
+       guidcpy(rng_algorithm_list, &rng_algo_guid);
+
+back:
+       return EFI_EXIT(ret);
+}
+
+static efi_status_t EFIAPI getrng(struct efi_rng_protocol *this,
+                                 efi_guid_t *rng_algorithm,
+                                 efi_uintn_t rng_value_length,
+                                 uint8_t *rng_value)
+{
+       int ret;
+       efi_status_t status = EFI_SUCCESS;
+       struct udevice *dev;
+       const efi_guid_t rng_raw_guid = EFI_RNG_ALGORITHM_RAW;
+
+       EFI_ENTRY("%p, %p, %zu, %p", this, rng_algorithm, rng_value_length,
+                 rng_value);
+
+       if (!this || !rng_value || !rng_value_length) {
+               status = EFI_INVALID_PARAMETER;
+               goto back;
+       }
+
+       if (rng_algorithm) {
+               EFI_PRINT("RNG algorithm %pUl\n", rng_algorithm);
+               if (guidcmp(rng_algorithm, &rng_raw_guid)) {
+                       status = EFI_UNSUPPORTED;
+                       goto back;
+               }
+       }
+
+       ret = platform_get_rng_device(&dev);
+       if (ret != EFI_SUCCESS) {
+               EFI_PRINT("Rng device not found\n");
+               status = EFI_UNSUPPORTED;
+               goto back;
+       }
+
+       ret = dm_rng_read(dev, rng_value, rng_value_length);
+       if (ret < 0) {
+               EFI_PRINT("Rng device read failed\n");
+               status = EFI_DEVICE_ERROR;
+               goto back;
+       }
+
+back:
+       return EFI_EXIT(status);
+}
+
+const struct efi_rng_protocol efi_rng_protocol = {
+       .get_info = rng_getinfo,
+       .get_rng = getrng,
+};
index f68b0fdc610fc9577923c305cfb70cca3b8f0035..76d18fb1a4adeeefe3f14684c5644c11347feda4 100644 (file)
@@ -80,6 +80,10 @@ efi_status_t efi_root_node_register(void)
                         /* HII configuration routing protocol */
                         &efi_guid_hii_config_routing_protocol,
                         (void *)&efi_hii_config_routing,
+#endif
+#if CONFIG_IS_ENABLED(EFI_RNG_PROTOCOL)
+                        &efi_guid_rng_protocol,
+                        (void *)&efi_rng_protocol,
 #endif
                         NULL));
        efi_root->type = EFI_OBJECT_TYPE_U_BOOT_FIRMWARE;
index 293a17b818c5ac29f51c86085d307ed9ad36fcf2..5b25169e6e43f5946123acd0d5ac55d459e71c8e 100644 (file)
@@ -1,4 +1,3 @@
-efi_miniapp_file_image_exit.h
-efi_miniapp_file_image_return.h
+efi_miniapp_*.h
 *.efi
 *.so
index 487cb4c674006400faa00202c61e86a969d65ace..3ad96e1cbf084209cee54d33e8fa47bb2bdaa44e 100644 (file)
@@ -47,6 +47,7 @@ efi_selftest_unicode_collation.o
 
 obj-$(CONFIG_CPU_V7) += efi_selftest_unaligned.o
 obj-$(CONFIG_EFI_LOADER_HII) += efi_selftest_hii.o
+obj-$(CONFIG_EFI_RNG_PROTOCOL) += efi_selftest_rng.o
 obj-$(CONFIG_EFI_GET_TIME) += efi_selftest_rtc.o
 
 ifeq ($(CONFIG_GENERATE_ACPI_TABLE),)
diff --git a/lib/efi_selftest/efi_selftest_rng.c b/lib/efi_selftest/efi_selftest_rng.c
new file mode 100644 (file)
index 0000000..fca9749
--- /dev/null
@@ -0,0 +1,117 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * efi_selftest_rng
+ *
+ * Copyright (c) 2019 Heinrich Schuchardt <xypron.glpk@gmx.de>
+ *
+ * Test the random number generator service.
+ */
+
+#include <efi_selftest.h>
+#include <efi_rng.h>
+
+#define RNG_LEN 9
+
+static struct efi_boot_services *boottime;
+static efi_guid_t efi_rng_guid = EFI_RNG_PROTOCOL_GUID;
+
+/*
+ * Setup unit test.
+ *
+ * @handle:    handle of the loaded image
+ * @systable:  system table
+ * @return:    EFI_ST_SUCCESS for success
+ */
+static int setup(const efi_handle_t handle,
+                const struct efi_system_table *systable)
+{
+       boottime = systable->boottime;
+       return EFI_ST_SUCCESS;
+}
+
+/*
+ * Execute unit test.
+ *
+ * Retrieve available RNG algorithms.
+ * Retrieve two random values and compare them.
+ *
+ * @return:    EFI_ST_SUCCESS for success
+ */
+static int execute(void)
+{
+       efi_status_t ret;
+       efi_uintn_t size;
+       struct efi_rng_protocol *rng;
+       efi_guid_t *algo_list;
+       u8 rnd1[RNG_LEN] __aligned(4), rnd2[RNG_LEN] __aligned(4);
+       int r;
+
+       /* Get random number generator protocol */
+       ret = boottime->locate_protocol(&efi_rng_guid, NULL, (void **)&rng);
+       if (ret != EFI_SUCCESS) {
+               efi_st_error(
+                       "Random number generator protocol not available\n");
+               return EFI_ST_FAILURE;
+       }
+
+       ret = rng->get_info(rng, &size, NULL);
+       if (ret != EFI_BUFFER_TOO_SMALL) {
+               efi_st_error("Could not retrieve alorithm list size\n");
+               return EFI_ST_FAILURE;
+       }
+       if (size < sizeof(efi_guid_t)) {
+               efi_st_error("Empty alorithm list\n");
+               return EFI_ST_FAILURE;
+       }
+
+       ret = boottime->allocate_pool(EFI_LOADER_DATA, size,
+                                     (void **)&algo_list);
+       if (ret != EFI_SUCCESS) {
+               efi_st_error("Could not allocate pool memory\n");
+               return EFI_ST_FAILURE;
+       }
+
+       ret = rng->get_info(rng, &size, algo_list);
+       if (ret != EFI_SUCCESS) {
+               efi_st_error("Could not get info\n");
+               return EFI_ST_FAILURE;
+       }
+       if (size < sizeof(efi_guid_t)) {
+               efi_st_error("Empty alorithm list\n");
+               return EFI_ST_FAILURE;
+       }
+
+       memset(rnd1, 0, RNG_LEN);
+       memset(rnd2, 0, RNG_LEN);
+
+       ret = rng->get_rng(rng, NULL, RNG_LEN - 1, &rnd1[1]);
+       if (ret != EFI_SUCCESS) {
+               efi_st_error("Could not get random value\n");
+               return EFI_ST_FAILURE;
+       }
+       ret = rng->get_rng(rng, algo_list, RNG_LEN - 1, &rnd2[1]);
+       if (ret != EFI_SUCCESS) {
+               efi_st_error("Could not get random value\n");
+               return EFI_ST_FAILURE;
+       }
+       r = memcmp(rnd1, rnd2, RNG_LEN);
+       if (!r) {
+               efi_st_error("Two equal consecutive random numbers\n");
+               return EFI_ST_FAILURE;
+       }
+
+       ret = boottime->free_pool(algo_list);
+       if (ret != EFI_SUCCESS) {
+               efi_st_error("Could not free pool memory\n");
+               return EFI_ST_FAILURE;
+       }
+
+       return EFI_ST_SUCCESS;
+}
+
+EFI_UNIT_TEST(rng) = {
+       .name = "random number generator",
+       .phase = EFI_EXECUTE_BEFORE_BOOTTIME_EXIT,
+       .setup = setup,
+       .execute = execute,
+};
index c10cd83a0a3967f1499f48b8ee1a5c2c57adabef..4ea898a421ce488254b7ea57a973c8ae294980a5 100644 (file)
@@ -292,6 +292,10 @@ cmd_dt_S_dtb=                                              \
 $(obj)/%.dtb.S: $(obj)/%.dtb
        $(call cmd,dt_S_dtb)
 
+ifeq ($(CONFIG_SPL_LOAD_FIT_APPLY_OVERLAY),y)
+DTC_FLAGS += -@
+endif
+
 quiet_cmd_dtc = DTC     $@
 # Modified for U-Boot
 # Bring in any U-Boot-specific include at the end of the file
index 89bdb012e351e1bf23ecc91c33a61a29c8751ef8..d0f7296e0d89c40805f9dcb4d6220c1b038995c1 100644 (file)
@@ -183,5 +183,6 @@ int do_ut_bloblist(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
                                                 bloblist_test);
        const int n_ents = ll_entry_count(struct unit_test, bloblist_test);
 
-       return cmd_ut_category("bloblist", tests, n_ents, argc, argv);
+       return cmd_ut_category("bloblist", "bloblist_test_",
+                              tests, n_ents, argc, argv);
 }
index 2781f8bd5668cafdde519bb1653cdc3e8a7f8172..400719e7b67935af9c885cc53d44fbcbfa199fd8 100644 (file)
 
 static int do_ut_all(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]);
 
-int cmd_ut_category(const char *name, struct unit_test *tests, int n_ents,
+int cmd_ut_category(const char *name, const char *prefix,
+                   struct unit_test *tests, int n_ents,
                    int argc, char * const argv[])
 {
        struct unit_test_state uts = { .fail_count = 0 };
        struct unit_test *test;
+       int prefix_len = prefix ? strlen(prefix) : 0;
 
        if (argc == 1)
                printf("Running %d %s tests\n", n_ents, name);
 
        for (test = tests; test < tests + n_ents; test++) {
-               if (argc > 1 && strcmp(argv[1], test->name))
+               const char *test_name = test->name;
+
+               /* Remove the prefix */
+               if (!strncmp(test_name, prefix, prefix_len))
+                       test_name += prefix_len;
+
+               if (argc > 1 && strcmp(argv[1], test_name))
                        continue;
                printf("Test: %s\n", test->name);
 
index 48dccc0e891ba3734b6703559c3e1ce7ca5f61f3..cf040d7c8612eba2c8ebf96b1c8fc5bf8f1409f1 100644 (file)
@@ -540,5 +540,6 @@ int do_ut_compression(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
                                                 compression_test);
        const int n_ents = ll_entry_count(struct unit_test, compression_test);
 
-       return cmd_ut_category("compression", tests, n_ents, argc, argv);
+       return cmd_ut_category("compression", "compression_test_",
+                              tests, n_ents, argc, argv);
 }
index 85cc0f7fb87d20dc15649fd8e73eed5fa4f2346a..dd1ceff86c0cc4412d85ef736b221138045fe309 100644 (file)
@@ -69,4 +69,5 @@ obj-$(CONFIG_VIRTIO_SANDBOX) += virtio.o
 obj-$(CONFIG_DMA) += dma.o
 obj-$(CONFIG_DM_MDIO) += mdio.o
 obj-$(CONFIG_DM_MDIO_MUX) += mdio_mux.o
+obj-$(CONFIG_DM_RNG) += rng.o
 endif
index 1d9a9b32d550fc07040c0f61d6bac7cbe916393d..40675962d87241e32df9ab18a0db156e9bce1710 100644 (file)
@@ -103,8 +103,8 @@ static int dm_test_remoteproc_elf(struct unit_test_state *uts)
                0x00, 0x00, 0x00, 0x08,
                /* phoff (program header offset @ 0x40)*/
                0x40, 0x00, 0x00, 0x00,
-               /* shoff (section header offset : none) */
-               0x00, 0x00, 0x00, 0x00,
+               /* shoff (section header offset @ 0x90) */
+               0x90, 0x00, 0x00, 0x00,
                /* flags */
                0x00, 0x00, 0x00, 0x00,
                /* ehsize (elf header size = 0x34) */
@@ -113,16 +113,17 @@ static int dm_test_remoteproc_elf(struct unit_test_state *uts)
                0x20, 0x00,
                /* phnum (program header number : 1) */
                0x01, 0x00,
-               /* shentsize (section heade size : none) */
-               0x00, 0x00,
-               /* shnum (section header number: none) */
-               0x00, 0x00,
-               /* shstrndx (section header name section index: none) */
-               0x00, 0x00,
+               /* shentsize (section header size : 40 bytes) */
+               0x28, 0x00,
+               /* shnum (section header number: 3) */
+               0x02, 0x00,
+               /* shstrndx (section header name section index: 1) */
+               0x01, 0x00,
                /* padding */
                0x00, 0x00, 0x00, 0x00,
                0x00, 0x00, 0x00, 0x00,
                0x00, 0x00, 0x00, 0x00,
+
                /* @0x40 - PROGRAM HEADER TABLE - */
                /* type : PT_LOAD */
                0x01, 0x00, 0x00, 0x00,
@@ -140,14 +141,63 @@ static int dm_test_remoteproc_elf(struct unit_test_state *uts)
                0x05, 0x00, 0x00, 0x00,
                /* padding */
                0x00, 0x00, 0x00, 0x00,
+
+               /* @0x60 - RESOURCE TABLE SECTION - */
+               /* version */
+               0x01, 0x00, 0x00, 0x00,
+               /* num (0, no entries) */
+               0x00, 0x00, 0x00, 0x00,
+               /* Reserved */
+               0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+               /* @0x70 - SECTION'S NAMES SECTION - */
+               /* section 0 name (".shrtrtab") */
+               0x2e, 0x73, 0x68, 0x73, 0x74, 0x72, 0x74, 0x61, 0x62, 0x00,
+               /* section 1 name (".resource_table") */
+               0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f,
+               0x74, 0x61, 0x62, 0x6c, 0x65, 0x00,
+               /* padding */
+               0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+               /* @0x90 - SECTION HEADER TABLE - */
+               /* Section 0 : resource table header */
+               /* sh_name - index into section header string table section */
+               0x0a, 0x00, 0x00, 0x00,
+               /* sh_type and sh_flags */
+               0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
+               /* sh_addr = where the resource table has to be copied to */
+               0x00, 0x00, 0x00, 0x00,
+               /* sh_offset = 0x60 */
+               0x60, 0x00, 0x00, 0x00,
+               /* sh_size = 16 bytes */
+               0x10, 0x00, 0x00, 0x00,
+               /* sh_link, sh_info, sh_addralign, sh_entsize */
+               0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+               0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+               /* Section 1 : section's names section header */
+               /* sh_name - index into section header string table section */
+               0x00, 0x00, 0x00, 0x00,
+               /* sh_type and sh_flags */
+               0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+               /* sh_addr  */
+               0x00, 0x00, 0x00, 0x00,
+               /* sh_offset = 0x70 */
+               0x70, 0x00, 0x00, 0x00,
+               /* sh_size = 27 bytes */
+               0x1b, 0x00, 0x00, 0x00,
+               /* sh_link, sh_info, sh_addralign, sh_entsize */
+               0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+               0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        };
        unsigned int size = ARRAY_SIZE(valid_elf32);
        struct udevice *dev;
-       phys_addr_t loaded_firmware_paddr;
-       void *loaded_firmware;
-       u32 loaded_firmware_size;
+       phys_addr_t loaded_firmware_paddr, loaded_rsc_table_paddr;
+       void *loaded_firmware, *loaded_rsc_table;
+       u32 loaded_firmware_size, rsc_table_size;
+       ulong rsc_addr, rsc_size;
        Elf32_Ehdr *ehdr = (Elf32_Ehdr *)valid_elf32;
        Elf32_Phdr *phdr = (Elf32_Phdr *)(valid_elf32 + ehdr->e_phoff);
+       Elf32_Shdr *shdr = (Elf32_Shdr *)(valid_elf32 + ehdr->e_shoff);
 
        ut_assertok(uclass_get_device(UCLASS_REMOTEPROC, 0, &dev));
 
@@ -178,6 +228,25 @@ static int dm_test_remoteproc_elf(struct unit_test_state *uts)
                    0x08000000);
        unmap_physmem(loaded_firmware, MAP_NOCACHE);
 
+       /* Resource table */
+       shdr->sh_addr = CONFIG_SYS_SDRAM_BASE;
+       rsc_table_size = shdr->sh_size;
+
+       loaded_rsc_table_paddr = shdr->sh_addr + DEVICE_TO_PHYSICAL_OFFSET;
+       loaded_rsc_table = map_physmem(loaded_rsc_table_paddr,
+                                      rsc_table_size, MAP_NOCACHE);
+       ut_assertnonnull(loaded_rsc_table);
+       memset(loaded_rsc_table, 0, rsc_table_size);
+
+       /* Load and verify */
+       ut_assertok(rproc_elf32_load_rsc_table(dev, (ulong)valid_elf32, size,
+                                              &rsc_addr, &rsc_size));
+       ut_asserteq(rsc_addr, CONFIG_SYS_SDRAM_BASE);
+       ut_asserteq(rsc_size, rsc_table_size);
+       ut_assertok(memcmp(loaded_firmware, valid_elf32 + shdr->sh_offset,
+                          shdr->sh_size));
+       unmap_physmem(loaded_firmware, MAP_NOCACHE);
+
        /* Invalid ELF Magic */
        valid_elf32[0] = 0;
        ut_asserteq(-EPROTONOSUPPORT,
diff --git a/test/dm/rng.c b/test/dm/rng.c
new file mode 100644 (file)
index 0000000..ce20e2d
--- /dev/null
@@ -0,0 +1,26 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (c) 2019, Linaro Limited
+ */
+
+#include <common.h>
+#include <dm.h>
+#include <rng.h>
+#include <dm/test.h>
+#include <test/ut.h>
+
+/* Basic test of the rng uclass */
+static int dm_test_rng_read(struct unit_test_state *uts)
+{
+       unsigned long rand1 = 0, rand2 = 0;
+       struct udevice *dev;
+
+       ut_assertok(uclass_get_device(UCLASS_RNG, 0, &dev));
+       ut_assertnonnull(dev);
+       ut_assertok(dm_rng_read(dev, &rand1, sizeof(rand1)));
+       ut_assertok(dm_rng_read(dev, &rand2, sizeof(rand2)));
+       ut_assert(rand1 != rand2);
+
+       return 0;
+}
+DM_TEST(dm_test_rng_read, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);
index 54041a02197d500109f3c017944c2e4c2984c494..ad67dbe7929fdebc374c767f4d1a3c343d557d46 100644 (file)
@@ -15,5 +15,6 @@ int do_ut_env(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
        struct unit_test *tests = ll_entry_start(struct unit_test, env_test);
        const int n_ents = ll_entry_count(struct unit_test, env_test);
 
-       return cmd_ut_category("environment", tests, n_ents, argc, argv);
+       return cmd_ut_category("environment", "env_test_",
+                              tests, n_ents, argc, argv);
 }
index eb90e539148e880eb1217c6ef9632bbfcd338fde..c73e8d7b05a98c1b62377aeb819f1ac8f768ab35 100644 (file)
@@ -16,5 +16,5 @@ int do_ut_lib(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
        struct unit_test *tests = ll_entry_start(struct unit_test, lib_test);
        const int n_ents = ll_entry_count(struct unit_test, lib_test);
 
-       return cmd_ut_category("lib", tests, n_ents, argc, argv);
+       return cmd_ut_category("lib", "lib_test_", tests, n_ents, argc, argv);
 }
index 670682f3d41eddf32216d9012b1db4dda7808363..092710326a8be2fb8a544ef668bea0a677dc6564 100644 (file)
@@ -129,20 +129,20 @@ int do_ut_optee(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
        ut_assertok(optee_copy_fdt_nodes(fdt_no_optee, fdt));
 
        expect_success = false;
-       ret = cmd_ut_category("optee", tests, n_ents, argc, argv);
+       ret = cmd_ut_category("optee", "", tests, n_ents, argc, argv);
 
        /* (2) Try to copy optee nodes from prefilled dt */
        ut_assertok(optee_copy_fdt_nodes(fdt_optee, fdt));
 
        expect_success = true;
-       ret = cmd_ut_category("optee", tests, n_ents, argc, argv);
+       ret = cmd_ut_category("optee", "", tests, n_ents, argc, argv);
 
        /* (3) Try to copy OP-TEE nodes into a already filled DT */
        ut_assertok(fdt_open_into(fdt_optee, fdt, FDT_COPY_SIZE));
        ut_assertok(optee_copy_fdt_nodes(fdt_optee, fdt));
 
        expect_success = true;
-       ret = cmd_ut_category("optee", tests, n_ents, argc, argv);
+       ret = cmd_ut_category("optee", "", tests, n_ents, argc, argv);
 
        free(fdt);
        return ret;
index fc2491d0b4750d59246f7a98e15cda33c758d7d5..d0083fd6bee32bdb83ac5c084889b8e15e63b5c2 100644 (file)
@@ -272,7 +272,7 @@ int do_ut_overlay(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
        /* Apply the stacked overlay */
        ut_assertok(fdt_overlay_apply(fdt, fdt_overlay_stacked_copy));
 
-       ret = cmd_ut_category("overlay", tests, n_ents, argc, argv);
+       ret = cmd_ut_category("overlay", "", tests, n_ents, argc, argv);
 
        free(fdt_overlay_stacked_copy);
 err3:
index 472dd0545d34515ed568d143d612614db26d8f97..34ac4fb06247fcf6a56acb387c7e8c3e098bfce3 100644 (file)
@@ -472,7 +472,7 @@ def setup_buildconfigspec(item):
         option = options.args[0]
         if not ubconfig.buildconfig.get('config_' + option.lower(), None):
             pytest.skip('.config feature "%s" not enabled' % option.lower())
-    for option in item.iter_markers('notbuildconfigspec'):
+    for options in item.iter_markers('notbuildconfigspec'):
         option = options.args[0]
         if ubconfig.buildconfig.get('config_' + option.lower(), None):
             pytest.skip('.config feature "%s" enabled' % option.lower())
diff --git a/test/py/tests/test_efi_fit.py b/test/py/tests/test_efi_fit.py
new file mode 100644 (file)
index 0000000..6986b2d
--- /dev/null
@@ -0,0 +1,458 @@
+# SPDX-License-Identifier: GPL-2.0
+# Copyright (c) 2019, Cristian Ciocaltea <cristian.ciocaltea@gmail.com>
+#
+# Work based on:
+# - test_net.py
+# Copyright (c) 2016, NVIDIA CORPORATION. All rights reserved.
+# - test_fit.py
+# Copyright (c) 2013, Google Inc.
+#
+# Test launching UEFI binaries from FIT images.
+
+import os.path
+import pytest
+import u_boot_utils as util
+
+"""
+Note: This test relies on boardenv_* containing configuration values to define
+which network environment is available for testing. Without this, the parts
+that rely on network will be automatically skipped.
+
+For example:
+
+# Boolean indicating whether the Ethernet device is attached to USB, and hence
+# USB enumeration needs to be performed prior to network tests.
+# This variable may be omitted if its value is False.
+env__net_uses_usb = False
+
+# Boolean indicating whether the Ethernet device is attached to PCI, and hence
+# PCI enumeration needs to be performed prior to network tests.
+# This variable may be omitted if its value is False.
+env__net_uses_pci = True
+
+# True if a DHCP server is attached to the network, and should be tested.
+# If DHCP testing is not possible or desired, this variable may be omitted or
+# set to False.
+env__net_dhcp_server = True
+
+# A list of environment variables that should be set in order to configure a
+# static IP. If solely relying on DHCP, this variable may be omitted or set to
+# an empty list.
+env__net_static_env_vars = [
+    ('ipaddr', '10.0.0.100'),
+    ('netmask', '255.255.255.0'),
+    ('serverip', '10.0.0.1'),
+]
+
+# Details regarding a file that may be read from a TFTP server. This variable
+# may be omitted or set to None if TFTP testing is not possible or desired.
+# Additionally, when the 'size' is not available, the file will be generated
+# automatically in the TFTP root directory, as specified by the 'dn' field.
+env__efi_fit_tftp_file = {
+    'fn': 'test-efi-fit.img',   # File path relative to TFTP root
+    'size': 3831,               # File size
+    'crc32': '9fa3f79c',        # Checksum using CRC-32 algorithm, optional
+    'addr': 0x40400000,         # Loading address, integer, optional
+    'dn': 'tftp/root/dir',      # TFTP root directory path, optional
+}
+"""
+
+# Define the parametrized ITS data to be used for FIT images generation.
+its_data = '''
+/dts-v1/;
+
+/ {
+    description = "EFI image with FDT blob";
+    #address-cells = <1>;
+
+    images {
+        efi {
+            description = "Test EFI";
+            data = /incbin/("%(efi-bin)s");
+            type = "%(kernel-type)s";
+            arch = "%(sys-arch)s";
+            os = "efi";
+            compression = "%(efi-comp)s";
+            load = <0x0>;
+            entry = <0x0>;
+        };
+        fdt {
+            description = "Test FDT";
+            data = /incbin/("%(fdt-bin)s");
+            type = "flat_dt";
+            arch = "%(sys-arch)s";
+            compression = "%(fdt-comp)s";
+        };
+    };
+
+    configurations {
+        default = "config-efi-fdt";
+        config-efi-fdt {
+            description = "EFI FIT w/ FDT";
+            kernel = "efi";
+            fdt = "fdt";
+        };
+        config-efi-nofdt {
+            description = "EFI FIT w/o FDT";
+            kernel = "efi";
+        };
+    };
+};
+'''
+
+# Define the parametrized FDT data to be used for DTB images generation.
+fdt_data = '''
+/dts-v1/;
+
+/ {
+    #address-cells = <1>;
+    #size-cells = <0>;
+
+    model = "%(sys-arch)s %(fdt_type)s EFI FIT Boot Test";
+    compatible = "%(sys-arch)s";
+
+    reset@0 {
+        compatible = "%(sys-arch)s,reset";
+        reg = <0>;
+    };
+};
+'''
+
+@pytest.mark.buildconfigspec('bootm_efi')
+@pytest.mark.buildconfigspec('cmd_bootefi_hello_compile')
+@pytest.mark.buildconfigspec('fit')
+@pytest.mark.notbuildconfigspec('generate_acpi_table')
+@pytest.mark.requiredtool('dtc')
+def test_efi_fit_launch(u_boot_console):
+    """Test handling of UEFI binaries inside FIT images.
+
+    The tests are trying to launch U-Boot's helloworld.efi embedded into
+    FIT images, in uncompressed or gzip compressed format.
+
+    Additionally, a sample FDT blob is created and embedded into the above
+    mentioned FIT images, in uncompressed or gzip compressed format.
+
+    For more details, see launch_efi().
+
+    The following test cases are currently defined and enabled:
+     - Launch uncompressed FIT EFI & internal FDT
+     - Launch uncompressed FIT EFI & FIT FDT
+     - Launch compressed FIT EFI & internal FDT
+     - Launch compressed FIT EFI & FIT FDT
+    """
+
+    def net_pre_commands():
+        """Execute any commands required to enable network hardware.
+
+        These commands are provided by the boardenv_* file; see the comment
+        at the beginning of this file.
+        """
+
+        init_usb = cons.config.env.get('env__net_uses_usb', False)
+        if init_usb:
+            cons.run_command('usb start')
+
+        init_pci = cons.config.env.get('env__net_uses_pci', False)
+        if init_pci:
+            cons.run_command('pci enum')
+
+    def net_dhcp():
+        """Execute the dhcp command.
+
+        The boardenv_* file may be used to enable/disable DHCP; see the
+        comment at the beginning of this file.
+        """
+
+        has_dhcp = cons.config.buildconfig.get('config_cmd_dhcp', 'n') == 'y'
+        if not has_dhcp:
+            cons.log.warning('CONFIG_CMD_DHCP != y: Skipping DHCP network setup')
+            return False
+
+        test_dhcp = cons.config.env.get('env__net_dhcp_server', False)
+        if not test_dhcp:
+            cons.log.info('No DHCP server available')
+            return False
+
+        cons.run_command('setenv autoload no')
+        output = cons.run_command('dhcp')
+        assert 'DHCP client bound to address ' in output
+        return True
+
+    def net_setup_static():
+        """Set up a static IP configuration.
+
+        The configuration is provided by the boardenv_* file; see the comment at
+        the beginning of this file.
+        """
+
+        has_dhcp = cons.config.buildconfig.get('config_cmd_dhcp', 'n') == 'y'
+        if not has_dhcp:
+            cons.log.warning('CONFIG_NET != y: Skipping static network setup')
+            return False
+
+        env_vars = cons.config.env.get('env__net_static_env_vars', None)
+        if not env_vars:
+            cons.log.info('No static network configuration is defined')
+            return False
+
+        for (var, val) in env_vars:
+            cons.run_command('setenv %s %s' % (var, val))
+        return True
+
+    def make_fpath(fname):
+        """Compute the path of a given (temporary) file.
+
+        Args:
+            fname: The name of a file within U-Boot build dir.
+        Return:
+            The computed file path.
+        """
+
+        return os.path.join(cons.config.build_dir, fname)
+
+    def make_efi(fname, comp):
+        """Create an UEFI binary.
+
+        This simply copies lib/efi_loader/helloworld.efi into U-Boot
+        build dir and, optionally, compresses the file using gzip.
+
+        Args:
+            fname: The target file name within U-Boot build dir.
+            comp: Flag to enable gzip compression.
+        Return:
+            The path of the created file.
+        """
+
+        bin_path = make_fpath(fname)
+        util.run_and_log(cons,
+                ['cp', make_fpath('lib/efi_loader/helloworld.efi'), bin_path])
+        if comp:
+            util.run_and_log(cons, ['gzip', '-f', bin_path])
+            bin_path += '.gz'
+        return bin_path
+
+    def make_dtb(fdt_type, comp):
+        """Create a sample DTB file.
+
+        Creates a DTS file and compiles it to a DTB.
+
+        Args:
+            fdt_type: The type of the FDT, i.e. internal, user.
+            comp: Flag to enable gzip compression.
+        Return:
+            The path of the created file.
+        """
+
+        # Generate resources referenced by FDT.
+        fdt_params = {
+            'sys-arch': sys_arch,
+            'fdt_type': fdt_type,
+        }
+
+        # Generate a test FDT file.
+        dts = make_fpath('test-efi-fit-%s.dts' % fdt_type)
+        with open(dts, 'w') as fd:
+            fd.write(fdt_data % fdt_params)
+
+        # Build the test FDT.
+        dtb = make_fpath('test-efi-fit-%s.dtb' % fdt_type)
+        util.run_and_log(cons, ['dtc', '-I', 'dts', '-O', 'dtb', '-o', dtb, dts])
+        if comp:
+            util.run_and_log(cons, ['gzip', '-f', dtb])
+            dtb += '.gz'
+        return dtb
+
+    def make_fit(comp):
+        """Create a sample FIT image.
+
+        Runs 'mkimage' to create a FIT image within U-Boot build dir.
+        Args:
+            comp: Enable gzip compression for the EFI binary and FDT blob.
+        Return:
+            The path of the created file.
+        """
+
+        # Generate resources referenced by ITS.
+        its_params = {
+            'sys-arch': sys_arch,
+            'efi-bin': os.path.basename(make_efi('test-efi-fit-helloworld.efi', comp)),
+            'kernel-type': 'kernel' if comp else 'kernel_noload',
+            'efi-comp': 'gzip' if comp else 'none',
+            'fdt-bin': os.path.basename(make_dtb('user', comp)),
+            'fdt-comp': 'gzip' if comp else 'none',
+        }
+
+        # Generate a test ITS file.
+        its_path = make_fpath('test-efi-fit-helloworld.its')
+        with open(its_path, 'w') as fd:
+            fd.write(its_data % its_params)
+
+        # Build the test ITS.
+        fit_path = make_fpath('test-efi-fit-helloworld.fit')
+        util.run_and_log(
+                cons, [make_fpath('tools/mkimage'), '-f', its_path, fit_path])
+        return fit_path
+
+    def load_fit_from_host(f):
+        """Load the FIT image using the 'host load' command and return its address.
+
+        Args:
+            f: Dictionary describing the FIT image to load, see env__efi_fit_test_file
+                in the comment at the beginning of this file.
+        Return:
+            The address where the file has been loaded.
+        """
+
+        addr = f.get('addr', None)
+        if not addr:
+            addr = util.find_ram_base(cons)
+
+        output = cons.run_command(
+                    'host load hostfs - %x %s/%s' % (addr, f['dn'], f['fn']))
+        expected_text = ' bytes read'
+        sz = f.get('size', None)
+        if sz:
+            expected_text = '%d' % sz + expected_text
+        assert(expected_text in output)
+
+        return addr
+
+    def load_fit_from_tftp(f):
+        """Load the FIT image using the tftpboot command and return its address.
+
+        The file is downloaded from the TFTP server, its size and optionally its
+        CRC32 are validated.
+
+        Args:
+            f: Dictionary describing the FIT image to load, see env__efi_fit_tftp_file
+                in the comment at the beginning of this file.
+        Return:
+            The address where the file has been loaded.
+        """
+
+        addr = f.get('addr', None)
+        if not addr:
+            addr = util.find_ram_base(cons)
+
+        fn = f['fn']
+        output = cons.run_command('tftpboot %x %s' % (addr, fn))
+        expected_text = 'Bytes transferred = '
+        sz = f.get('size', None)
+        if sz:
+            expected_text += '%d' % sz
+        assert expected_text in output
+
+        expected_crc = f.get('crc32', None)
+        if not expected_crc:
+            return addr
+
+        if cons.config.buildconfig.get('config_cmd_crc32', 'n') != 'y':
+            return addr
+
+        output = cons.run_command('crc32 $fileaddr $filesize')
+        assert expected_crc in output
+
+        return addr
+
+    def launch_efi(enable_fdt, enable_comp):
+        """Launch U-Boot's helloworld.efi binary from a FIT image.
+
+        An external image file can be downloaded from TFTP, when related
+        details are provided by the boardenv_* file; see the comment at the
+        beginning of this file.
+
+        If the size of the TFTP file is not provided within env__efi_fit_tftp_file,
+        the test image is generated automatically and placed in the TFTP root
+        directory specified via the 'dn' field.
+
+        When running the tests on Sandbox, the image file is loaded directly
+        from the host filesystem.
+
+        Once the load address is available on U-Boot console, the 'bootm'
+        command is executed for either 'config-efi-fdt' or 'config-efi-nofdt'
+        FIT configuration, depending on the value of the 'enable_fdt' function
+        argument.
+
+        Eventually the 'Hello, world' message is expected in the U-Boot console.
+
+        Args:
+            enable_fdt: Flag to enable using the FDT blob inside FIT image.
+            enable_comp: Flag to enable GZIP compression on EFI and FDT
+                generated content.
+        """
+
+        with cons.log.section('FDT=%s;COMP=%s' % (enable_fdt, enable_comp)):
+            if is_sandbox:
+                fit = {
+                    'dn': cons.config.build_dir,
+                }
+            else:
+                # Init networking.
+                net_pre_commands()
+                net_set_up = net_dhcp()
+                net_set_up = net_setup_static() or net_set_up
+                if not net_set_up:
+                    pytest.skip('Network not initialized')
+
+                fit = cons.config.env.get('env__efi_fit_tftp_file', None)
+                if not fit:
+                    pytest.skip('No env__efi_fit_tftp_file binary specified in environment')
+
+            sz = fit.get('size', None)
+            if not sz:
+                if not fit.get('dn', None):
+                    pytest.skip('Neither "size", nor "dn" info provided in env__efi_fit_tftp_file')
+
+                # Create test FIT image.
+                fit_path = make_fit(enable_comp)
+                fit['fn'] = os.path.basename(fit_path)
+                fit['size'] = os.path.getsize(fit_path)
+
+                # Copy image to TFTP root directory.
+                if fit['dn'] != cons.config.build_dir:
+                    util.run_and_log(cons, ['mv', '-f', fit_path, '%s/' % fit['dn']])
+
+            # Load FIT image.
+            addr = load_fit_from_host(fit) if is_sandbox else load_fit_from_tftp(fit)
+
+            # Select boot configuration.
+            fit_config = 'config-efi-fdt' if enable_fdt else 'config-efi-nofdt'
+
+            # Try booting.
+            cons.run_command(
+                    'bootm %x#%s' % (addr, fit_config), wait_for_prompt=False)
+            if enable_fdt:
+                cons.wait_for('Booting using the fdt blob')
+            cons.wait_for('Hello, world')
+            cons.wait_for('## Application terminated, r = 0')
+            cons.restart_uboot();
+
+    cons = u_boot_console
+    # Array slice removes leading/trailing quotes.
+    sys_arch = cons.config.buildconfig.get('config_sys_arch', '"sandbox"')[1:-1]
+    is_sandbox = sys_arch == 'sandbox'
+
+    try:
+        if is_sandbox:
+            # Use our own device tree file, will be restored afterwards.
+            control_dtb = make_dtb('internal', False)
+            old_dtb = cons.config.dtb
+            cons.config.dtb = control_dtb
+
+        # Run tests
+        # - fdt OFF, gzip OFF
+        launch_efi(False, False)
+        # - fdt ON, gzip OFF
+        launch_efi(True, False)
+
+        if is_sandbox:
+            # - fdt OFF, gzip ON
+            launch_efi(False, True)
+            # - fdt ON, gzip ON
+            launch_efi(True, True)
+
+    finally:
+        if is_sandbox:
+            # Go back to the original U-Boot with the correct dtb.
+            cons.config.dtb = old_dtb
+            cons.restart_uboot()
index d6b214f845279ca703c6e6f1e01110dc3e98bb2a..adf9d7745299d2c5932d452acd91b93fccecbdb7 100644 (file)
@@ -43,9 +43,10 @@ env__net_static_env_vars = [
 # Details regarding a file that may be read from a TFTP server. This variable
 # may be omitted or set to None if TFTP testing is not possible or desired.
 env__efi_loader_helloworld_file = {
-    'fn': 'lib/efi_loader/helloworld.efi',
-    'size': 5058624,
-    'crc32': 'c2244b26',
+    'fn': 'lib/efi_loader/helloworld.efi', # file name
+    'size': 5058624,                       # file length in bytes
+    'crc32': 'c2244b26',                   # CRC32 check sum
+    'addr': 0x40400000,                    # load address
 }
 """
 
index 8875cdc6b2f5b6b8e419c54111cad669784bc576..47532a64df62b8409ac2dd8e8e716ee84ee15b4c 100644 (file)
@@ -585,5 +585,6 @@ int do_ut_unicode(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
        struct unit_test *tests = ll_entry_start(struct unit_test, unicode_test);
        const int n_ents = ll_entry_count(struct unit_test, unicode_test);
 
-       return cmd_ut_category("Unicode", tests, n_ents, argc, argv);
+       return cmd_ut_category("Unicode", "unicode_test_",
+                              tests, n_ents, argc, argv);
 }
index ee3d41dda4d4b2b0ed46f2b430c5d01ab95812d8..e5481435a7644add00810f7d6a7548762d2cb79a 100644 (file)
@@ -35,14 +35,23 @@ static int dumpimage_extract_subimage(struct image_type_params *tparams,
        if (tparams->verify_header) {
                retval = tparams->verify_header((unsigned char *)ptr,
                                sbuf->st_size, &params);
-               if (retval != 0)
+               if (retval != 0) {
+                       fprintf(stderr, "%s: failed to verify header of %s\n",
+                               params.cmdname, tparams->name);
                        return -1;
+               }
+
                /*
                 * Extract the file from the image
                 * if verify is successful
                 */
                if (tparams->extract_subimage) {
                        retval = tparams->extract_subimage(ptr, &params);
+                       if (retval != 0) {
+                               fprintf(stderr, "%s: extract_subimage failed for %s\n",
+                                       params.cmdname, tparams->name);
+                               return -3;
+                       }
                } else {
                        fprintf(stderr,
                                "%s: extract_subimage undefined for %s\n",
@@ -95,7 +104,6 @@ int main(int argc, char **argv)
                        printf("dumpimage version %s\n", PLAIN_VERSION);
                        exit(EXIT_SUCCESS);
                case 'h':
-                       usage();
                default:
                        usage();
                        break;
@@ -175,6 +183,9 @@ int main(int argc, char **argv)
                 * image type. Returns the error code if not matched
                 */
                retval = dumpimage_extract_subimage(tparams, ptr, &sbuf);
+               if (retval)
+                       fprintf(stderr, "%s: Can't extract subimage from %s\n",
+                               params.cmdname, params.imagefile);
        } else {
                /*
                 * Print the image information for matched image type
index 0201cc44d8fff52ad92cf3c1dd357bdef4be4eac..114df5af305ae73fa8d38152d0e1f5a4dca942e7 100644 (file)
@@ -741,9 +741,14 @@ static int fit_image_extract(
 {
        const void *file_data;
        size_t file_size = 0;
+       int ret;
 
-       /* get the "data" property of component at offset "image_noffset" */
-       fit_image_get_data(fit, image_noffset, &file_data, &file_size);
+       /* get the data address and size of component at offset "image_noffset" */
+       ret = fit_image_get_data_and_size(fit, image_noffset, &file_data, &file_size);
+       if (ret) {
+               fprintf(stderr, "Could not get component information\n");
+               return ret;
+       }
 
        /* save the "file_data" into the file specified by "file_name" */
        return imagetool_save_subimage(file_name, (ulong) file_data, file_size);