Hi Peng, On 07/12/2017 10:13, Peng Fan wrote: > Hi Stefano, > > On Thu, Dec 07, 2017 at 09:52:46AM +0100, Stefano Babic wrote: >> Hi Peng, >> >> On 04/12/2017 05:31, Peng Fan wrote: >>> Add i.MX8MQ EVK support. SPL will initialize ddr and load ddr phy >>> firmware. Then loading FIT image, ATF to OCRAM, U-Boot and DTB to >>> DRAM. >>> >>> The boot log: >>> " >>> U-Boot SPL 2017.11-00062-gd4c7c3ebb3-dirty (Dec 01 2017 - 14:49:31) >>> PMIC: PFUZE100 ID=0x10 >>> check ddr4_pmu_train_imem code >>> check ddr4_pmu_train_imem code pass >>> check ddr4_pmu_train_dmem code >>> check ddr4_pmu_train_dmem code pass >>> PLL bypass to 100MTS setting done >>> Training PASS >>> PLL bypass to 400MTS setting done >>> Training PASS >>> Training PASS >>> check ddr4_pmu_train_imem code >>> check ddr4_pmu_train_imem code pass >>> check ddr4_pmu_train_dmem code >>> check ddr4_pmu_train_dmem code pass >>> Training PASS >>> Normal Boot >>> Trying to boot from MMC2 >>> >>> U-Boot 2017.11-00062-gd4c7c3ebb3-dirty (Dec 01 2017 - 14:49:31 +0800) >>> >>> CPU: Freescale i.MX8MQ rev2.0 at 1000 MHz >>> Reset cause: POR >>> Model: Freescale i.MX8MQ EVK >>> DRAM: 3 GiB >>> MMC: FSL_SDHC: 0, FSL_SDHC: 1 >>> Using default environment >>> >>> In: serial >>> Out: serial >>> Err: serial >>> Net: No ethernet found. >>> Hit any key to stop autoboot: 0 >>> " >>> >>> Signed-off-by: Peng Fan <peng....@nxp.com> >>> --- >>> arch/arm/dts/Makefile | 2 + >>> arch/arm/dts/fsl-imx8mq-evk.dts | 424 >>> ++++++++++++++++++++++++++++++++++ >>> arch/arm/mach-imx/mx8m/Kconfig | 12 + >>> board/freescale/mx8mq_evk/Kconfig | 12 + >>> board/freescale/mx8mq_evk/Makefile | 11 + >>> board/freescale/mx8mq_evk/README | 38 +++ >>> board/freescale/mx8mq_evk/mx8mq_evk.c | 156 +++++++++++++ >>> board/freescale/mx8mq_evk/spl.c | 233 +++++++++++++++++++ >>> configs/mx8mq_evk_defconfig | 28 +++ >>> include/configs/mx8mq_evk.h | 265 +++++++++++++++++++++ >>> 10 files changed, 1181 insertions(+) >>> create mode 100644 arch/arm/dts/fsl-imx8mq-evk.dts >>> create mode 100644 board/freescale/mx8mq_evk/Kconfig >>> create mode 100644 board/freescale/mx8mq_evk/Makefile >>> create mode 100644 board/freescale/mx8mq_evk/README >>> create mode 100644 board/freescale/mx8mq_evk/mx8mq_evk.c >>> create mode 100644 board/freescale/mx8mq_evk/spl.c >>> create mode 100644 configs/mx8mq_evk_defconfig >>> create mode 100644 include/configs/mx8mq_evk.h >>> >>> diff --git a/arch/arm/dts/Makefile b/arch/arm/dts/Makefile >>> index cd540e99ea..d459755904 100644 >>> --- a/arch/arm/dts/Makefile >>> +++ b/arch/arm/dts/Makefile >>> @@ -381,6 +381,8 @@ dtb-$(CONFIG_MX7) += imx7-colibri.dtb \ >>> >>> dtb-$(CONFIG_ARCH_MX7ULP) += imx7ulp-evk.dtb >>> >>> +dtb-$(CONFIG_ARCH_MX8M) += fsl-imx8mq-evk.dtb >>> + >>> dtb-$(CONFIG_RCAR_GEN3) += \ >>> r8a7795-h3ulcb.dtb \ >>> r8a7795-salvator-x.dtb \ >>> diff --git a/arch/arm/dts/fsl-imx8mq-evk.dts >>> b/arch/arm/dts/fsl-imx8mq-evk.dts >>> new file mode 100644 >>> index 0000000000..f0aa3485e6 >>> --- /dev/null >>> +++ b/arch/arm/dts/fsl-imx8mq-evk.dts >>> @@ -0,0 +1,424 @@ >>> +/* >>> + * Copyright (C) 2016 Freescale Semiconductor, Inc. >>> + * Copyright 2017 NXP >>> + * >>> + * This program is free software; you can redistribute it and/or >>> + * modify it under the terms of the GNU General Public License >>> + * as published by the Free Software Foundation; either version 2 >>> + * of the License, or (at your option) any later version. >>> + * >>> + * This program is distributed in the hope that it will be useful, >>> + * but WITHOUT ANY WARRANTY; without even the implied warranty of >>> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the >>> + * GNU General Public License for more details. >>> + */ >>> + >>> +/dts-v1/; >>> + >>> +/* First 128KB is for PSCI ATF. */ >>> +/memreserve/ 0x40000000 0x00020000; >>> + >>> +#include "fsl-imx8mq.dtsi" >>> + >>> +/ { >>> + model = "Freescale i.MX8MQ EVK"; >>> + compatible = "fsl,imx8mq-evk", "fsl,imx8mq"; >>> + >>> + chosen { >>> + bootargs = "console=ttymxc0,115200 >>> earlycon=ec_imx6q,0x30860000,115200"; >>> + }; >>> + >>> + regulators { >>> + compatible = "simple-bus"; >>> + #address-cells = <1>; >>> + #size-cells = <0>; >>> + >>> + reg_usdhc2_vmmc: usdhc2_vmmc { >>> + compatible = "regulator-fixed"; >>> + regulator-name = "VSD_3V3"; >>> + regulator-min-microvolt = <3300000>; >>> + regulator-max-microvolt = <3300000>; >>> + gpio = <&gpio2 19 GPIO_ACTIVE_HIGH>; >>> + enable-active-high; >>> + }; >>> + }; >>> + >>> + pwmleds { >>> + compatible = "pwm-leds"; >>> + >>> + ledpwm2 { >>> + label = "PWM2"; >>> + pwms = <&pwm2 0 50000>; >>> + max-brightness = <255>; >>> + }; >>> + }; >>> +}; >>> + >>> +&iomuxc { >>> + pinctrl-names = "default"; >>> + >>> + imx8mq-evk { >>> + pinctrl_fec1: fec1grp { >>> + fsl,pins = < >>> + MX8MQ_IOMUXC_ENET_MDC_ENET1_MDC 0x3 >>> + MX8MQ_IOMUXC_ENET_MDIO_ENET1_MDIO 0x23 >>> + MX8MQ_IOMUXC_ENET_TD3_ENET1_RGMII_TD3 0x1f >>> + MX8MQ_IOMUXC_ENET_TD2_ENET1_RGMII_TD2 0x1f >>> + MX8MQ_IOMUXC_ENET_TD1_ENET1_RGMII_TD1 0x1f >>> + MX8MQ_IOMUXC_ENET_TD0_ENET1_RGMII_TD0 0x1f >>> + MX8MQ_IOMUXC_ENET_RD3_ENET1_RGMII_RD3 0x91 >>> + MX8MQ_IOMUXC_ENET_RD2_ENET1_RGMII_RD2 0x91 >>> + MX8MQ_IOMUXC_ENET_RD1_ENET1_RGMII_RD1 0x91 >>> + MX8MQ_IOMUXC_ENET_RD0_ENET1_RGMII_RD0 0x91 >>> + MX8MQ_IOMUXC_ENET_TXC_ENET1_RGMII_TXC 0x1f >>> + MX8MQ_IOMUXC_ENET_RXC_ENET1_RGMII_RXC 0x91 >>> + MX8MQ_IOMUXC_ENET_RX_CTL_ENET1_RGMII_RX_CTL >>> 0x91 >>> + MX8MQ_IOMUXC_ENET_TX_CTL_ENET1_RGMII_TX_CTL >>> 0x1f >>> + MX8MQ_IOMUXC_GPIO1_IO09_GPIO1_IO9 0x19 >>> + >; >>> + }; >>> + >>> + pinctrl_i2c1: i2c1grp { >>> + fsl,pins = < >>> + MX8MQ_IOMUXC_I2C1_SCL_I2C1_SCL 0x4000007f >>> + MX8MQ_IOMUXC_I2C1_SDA_I2C1_SDA 0x4000007f >>> + >; >>> + }; >>> + >>> + pinctrl_i2c2: i2c2grp { >>> + fsl,pins = < >>> + MX8MQ_IOMUXC_I2C2_SCL_I2C2_SCL 0x4000007f >>> + MX8MQ_IOMUXC_I2C2_SDA_I2C2_SDA 0x4000007f >>> + >; >>> + }; >>> + >>> + pinctrl_pwm2: pwm2grp { >>> + fsl,pins = < >>> + MX8MQ_IOMUXC_GPIO1_IO13_PWM2_OUT 0x16 >>> + >; >>> + }; >>> + >>> + pinctrl_qspi: qspigrp { >>> + fsl,pins = < >>> + MX8MQ_IOMUXC_NAND_ALE_QSPI_A_SCLK 0x82 >>> + MX8MQ_IOMUXC_NAND_CE0_B_QSPI_A_SS0_B 0x82 >>> + MX8MQ_IOMUXC_NAND_DATA00_QSPI_A_DATA0 0x82 >>> + MX8MQ_IOMUXC_NAND_DATA01_QSPI_A_DATA1 0x82 >>> + MX8MQ_IOMUXC_NAND_DATA02_QSPI_A_DATA2 0x82 >>> + MX8MQ_IOMUXC_NAND_DATA03_QSPI_A_DATA3 0x82 >>> + >>> + >; >>> + }; >>> + >>> + pinctrl_usdhc1: usdhc1grp { >>> + fsl,pins = < >>> + MX8MQ_IOMUXC_SD1_CLK_USDHC1_CLK 0x83 >>> + MX8MQ_IOMUXC_SD1_CMD_USDHC1_CMD 0xc3 >>> + MX8MQ_IOMUXC_SD1_DATA0_USDHC1_DATA0 0xc3 >>> + MX8MQ_IOMUXC_SD1_DATA1_USDHC1_DATA1 0xc3 >>> + MX8MQ_IOMUXC_SD1_DATA2_USDHC1_DATA2 0xc3 >>> + MX8MQ_IOMUXC_SD1_DATA3_USDHC1_DATA3 0xc3 >>> + MX8MQ_IOMUXC_SD1_DATA4_USDHC1_DATA4 0xc3 >>> + MX8MQ_IOMUXC_SD1_DATA5_USDHC1_DATA5 0xc3 >>> + MX8MQ_IOMUXC_SD1_DATA6_USDHC1_DATA6 0xc3 >>> + MX8MQ_IOMUXC_SD1_DATA7_USDHC1_DATA7 0xc3 >>> + MX8MQ_IOMUXC_SD1_STROBE_USDHC1_STROBE 0x83 >>> + MX8MQ_IOMUXC_SD1_RESET_B_USDHC1_RESET_B 0xc1 >>> + >; >>> + }; >>> + >>> + pinctrl_usdhc1_100mhz: usdhc1grp100mhz { >>> + fsl,pins = < >>> + MX8MQ_IOMUXC_SD1_CLK_USDHC1_CLK 0x85 >>> + MX8MQ_IOMUXC_SD1_CMD_USDHC1_CMD 0xc5 >>> + MX8MQ_IOMUXC_SD1_DATA0_USDHC1_DATA0 0xc5 >>> + MX8MQ_IOMUXC_SD1_DATA1_USDHC1_DATA1 0xc5 >>> + MX8MQ_IOMUXC_SD1_DATA2_USDHC1_DATA2 0xc5 >>> + MX8MQ_IOMUXC_SD1_DATA3_USDHC1_DATA3 0xc5 >>> + MX8MQ_IOMUXC_SD1_DATA4_USDHC1_DATA4 0xc5 >>> + MX8MQ_IOMUXC_SD1_DATA5_USDHC1_DATA5 0xc5 >>> + MX8MQ_IOMUXC_SD1_DATA6_USDHC1_DATA6 0xc5 >>> + MX8MQ_IOMUXC_SD1_DATA7_USDHC1_DATA7 0xc5 >>> + MX8MQ_IOMUXC_SD1_STROBE_USDHC1_STROBE 0x85 >>> + MX8MQ_IOMUXC_SD1_RESET_B_USDHC1_RESET_B 0xc1 >>> + >; >>> + }; >>> + >>> + pinctrl_usdhc1_200mhz: usdhc1grp200mhz { >>> + fsl,pins = < >>> + MX8MQ_IOMUXC_SD1_CLK_USDHC1_CLK 0x87 >>> + MX8MQ_IOMUXC_SD1_CMD_USDHC1_CMD 0xc7 >>> + MX8MQ_IOMUXC_SD1_DATA0_USDHC1_DATA0 0xc7 >>> + MX8MQ_IOMUXC_SD1_DATA1_USDHC1_DATA1 0xc7 >>> + MX8MQ_IOMUXC_SD1_DATA2_USDHC1_DATA2 0xc7 >>> + MX8MQ_IOMUXC_SD1_DATA3_USDHC1_DATA3 0xc7 >>> + MX8MQ_IOMUXC_SD1_DATA4_USDHC1_DATA4 0xc7 >>> + MX8MQ_IOMUXC_SD1_DATA5_USDHC1_DATA5 0xc7 >>> + MX8MQ_IOMUXC_SD1_DATA6_USDHC1_DATA6 0xc7 >>> + MX8MQ_IOMUXC_SD1_DATA7_USDHC1_DATA7 0xc7 >>> + MX8MQ_IOMUXC_SD1_STROBE_USDHC1_STROBE 0x87 >>> + MX8MQ_IOMUXC_SD1_RESET_B_USDHC1_RESET_B 0xc1 >>> + >; >>> + }; >>> + >>> + pinctrl_usdhc2_gpio: usdhc2grpgpio { >>> + fsl,pins = < >>> + MX8MQ_IOMUXC_SD2_CD_B_GPIO2_IO12 0x41 >>> + MX8MQ_IOMUXC_SD2_RESET_B_GPIO2_IO19 0x41 >>> + >; >>> + }; >>> + >>> + pinctrl_usdhc2: usdhc2grp { >>> + fsl,pins = < >>> + MX8MQ_IOMUXC_SD2_CLK_USDHC2_CLK 0x83 >>> + MX8MQ_IOMUXC_SD2_CMD_USDHC2_CMD 0xc3 >>> + MX8MQ_IOMUXC_SD2_DATA0_USDHC2_DATA0 0xc3 >>> + MX8MQ_IOMUXC_SD2_DATA1_USDHC2_DATA1 0xc3 >>> + MX8MQ_IOMUXC_SD2_DATA2_USDHC2_DATA2 0xc3 >>> + MX8MQ_IOMUXC_SD2_DATA3_USDHC2_DATA3 0xc3 >>> + MX8MQ_IOMUXC_GPIO1_IO04_USDHC2_VSELECT 0xc1 >>> + >; >>> + }; >>> + >>> + pinctrl_usdhc2_100mhz: usdhc2grp100mhz { >>> + fsl,pins = < >>> + MX8MQ_IOMUXC_SD2_CLK_USDHC2_CLK 0x85 >>> + MX8MQ_IOMUXC_SD2_CMD_USDHC2_CMD 0xc5 >>> + MX8MQ_IOMUXC_SD2_DATA0_USDHC2_DATA0 0xc5 >>> + MX8MQ_IOMUXC_SD2_DATA1_USDHC2_DATA1 0xc5 >>> + MX8MQ_IOMUXC_SD2_DATA2_USDHC2_DATA2 0xc5 >>> + MX8MQ_IOMUXC_SD2_DATA3_USDHC2_DATA3 0xc5 >>> + MX8MQ_IOMUXC_GPIO1_IO04_USDHC2_VSELECT 0xc1 >>> + >; >>> + }; >>> + >>> + pinctrl_usdhc2_200mhz: usdhc2grp200mhz { >>> + fsl,pins = < >>> + MX8MQ_IOMUXC_SD2_CLK_USDHC2_CLK 0x87 >>> + MX8MQ_IOMUXC_SD2_CMD_USDHC2_CMD 0xc7 >>> + MX8MQ_IOMUXC_SD2_DATA0_USDHC2_DATA0 0xc7 >>> + MX8MQ_IOMUXC_SD2_DATA1_USDHC2_DATA1 0xc7 >>> + MX8MQ_IOMUXC_SD2_DATA2_USDHC2_DATA2 0xc7 >>> + MX8MQ_IOMUXC_SD2_DATA3_USDHC2_DATA3 0xc7 >>> + MX8MQ_IOMUXC_GPIO1_IO04_USDHC2_VSELECT 0xc1 >>> + >; >>> + }; >>> + >>> + pinctrl_sai2: sai2grp { >>> + fsl,pins = < >>> + MX8MQ_IOMUXC_SAI2_TXFS_SAI2_TX_SYNC 0xd6 >>> + MX8MQ_IOMUXC_SAI2_TXC_SAI2_TX_BCLK 0xd6 >>> + MX8MQ_IOMUXC_SAI2_MCLK_SAI2_MCLK 0xd6 >>> + MX8MQ_IOMUXC_SAI2_TXD0_SAI2_TX_DATA0 0xd6 >>> + MX8MQ_IOMUXC_GPIO1_IO08_GPIO1_IO8 0xd6 >>> + >; >>> + }; >>> + >>> + pinctrl_wdog: wdoggrp { >>> + fsl,pins = < >>> + MX8MQ_IOMUXC_GPIO1_IO02_WDOG1_WDOG_B 0xc6 >>> + >; >>> + }; >>> + }; >>> +}; >>> + >>> +&fec1 { >>> + pinctrl-names = "default"; >>> + pinctrl-0 = <&pinctrl_fec1>; >>> + phy-mode = "rgmii-id"; >>> + phy-handle = <ðphy0>; >>> + fsl,magic-packet; >>> + status = "okay"; >>> + >>> + mdio { >>> + #address-cells = <1>; >>> + #size-cells = <0>; >>> + >>> + ethphy0: ethernet-phy@0 { >>> + compatible = "ethernet-phy-ieee802.3-c22"; >>> + reg = <0>; >>> + at803x,led-act-blind-workaround; >>> + at803x,eee-disabled; >>> + }; >>> + }; >>> +}; >>> + >>> +&i2c1 { >>> + clock-frequency = <100000>; >>> + pinctrl-names = "default"; >>> + pinctrl-0 = <&pinctrl_i2c1>; >>> + status = "okay"; >>> + >>> + pmic: pfuze100@08 { >>> + compatible = "fsl,pfuze100"; >>> + reg = <0x08>; >>> + >>> + regulators { >>> + sw1a_reg: sw1ab { >>> + regulator-min-microvolt = <300000>; >>> + regulator-max-microvolt = <1875000>; >>> + regulator-always-on; >>> + }; >>> + >>> + sw1c_reg: sw1c { >>> + regulator-min-microvolt = <300000>; >>> + regulator-max-microvolt = <1875000>; >>> + regulator-always-on; >>> + }; >>> + >>> + sw2_reg: sw2 { >>> + regulator-min-microvolt = <800000>; >>> + regulator-max-microvolt = <3300000>; >>> + regulator-always-on; >>> + }; >>> + >>> + sw3a_reg: sw3ab { >>> + regulator-min-microvolt = <400000>; >>> + regulator-max-microvolt = <1975000>; >>> + regulator-always-on; >>> + }; >>> + >>> + sw4_reg: sw4 { >>> + regulator-min-microvolt = <800000>; >>> + regulator-max-microvolt = <3300000>; >>> + regulator-always-on; >>> + }; >>> + >>> + swbst_reg: swbst { >>> + regulator-min-microvolt = <5000000>; >>> + regulator-max-microvolt = <5150000>; >>> + }; >>> + >>> + snvs_reg: vsnvs { >>> + regulator-min-microvolt = <1000000>; >>> + regulator-max-microvolt = <3000000>; >>> + regulator-always-on; >>> + }; >>> + >>> + vref_reg: vrefddr { >>> + regulator-always-on; >>> + }; >>> + >>> + vgen1_reg: vgen1 { >>> + regulator-min-microvolt = <800000>; >>> + regulator-max-microvolt = <1550000>; >>> + }; >>> + >>> + vgen2_reg: vgen2 { >>> + regulator-min-microvolt = <800000>; >>> + regulator-max-microvolt = <1550000>; >>> + regulator-always-on; >>> + }; >>> + >>> + vgen3_reg: vgen3 { >>> + regulator-min-microvolt = <1800000>; >>> + regulator-max-microvolt = <3300000>; >>> + regulator-always-on; >>> + }; >>> + >>> + vgen4_reg: vgen4 { >>> + regulator-min-microvolt = <1800000>; >>> + regulator-max-microvolt = <3300000>; >>> + regulator-always-on; >>> + }; >>> + >>> + vgen5_reg: vgen5 { >>> + regulator-min-microvolt = <1800000>; >>> + regulator-max-microvolt = <3300000>; >>> + regulator-always-on; >>> + }; >>> + >>> + vgen6_reg: vgen6 { >>> + regulator-min-microvolt = <1800000>; >>> + regulator-max-microvolt = <3300000>; >>> + }; >>> + }; >>> + }; >>> +}; >>> + >>> +&i2c2 { >>> + clock-frequency = <100000>; >>> + pinctrl-names = "default"; >>> + pinctrl-0 = <&pinctrl_i2c2>; >>> + status = "disabled"; >>> +}; >>> + >>> +&pwm2 { >>> + pinctrl-names = "default"; >>> + pinctrl-0 = <&pinctrl_pwm2>; >>> + status = "okay"; >>> +}; >>> + >>> +&lcdif { >>> + status = "okay"; >>> + disp-dev = "mipi_dsi_northwest"; >>> + display = <&display0>; >>> + >>> + display0: display@0 { >>> + bits-per-pixel = <24>; >>> + bus-width = <24>; >>> + >>> + display-timings { >>> + native-mode = <&timing0>; >>> + timing0: timing0 { >>> + clock-frequency = <9200000>; >>> + hactive = <480>; >>> + vactive = <272>; >>> + hfront-porch = <8>; >>> + hback-porch = <4>; >>> + hsync-len = <41>; >>> + vback-porch = <2>; >>> + vfront-porch = <4>; >>> + vsync-len = <10>; >>> + >>> + hsync-active = <0>; >>> + vsync-active = <0>; >>> + de-active = <1>; >>> + pixelclk-active = <0>; >>> + }; >>> + }; >>> + }; >>> +}; >>> + >>> +&qspi { >>> + pinctrl-names = "default"; >>> + pinctrl-0 = <&pinctrl_qspi>; >>> + status = "okay"; >>> + >>> + flash0: n25q256a@0 { >>> + reg = <0>; >>> + #address-cells = <1>; >>> + #size-cells = <1>; >>> + compatible = "micron,n25q256a"; >>> + spi-max-frequency = <29000000>; >>> + spi-nor,ddr-quad-read-dummy = <6>; >>> + }; >>> +}; >>> + >>> +&usdhc1 { >>> + pinctrl-names = "default", "state_100mhz", "state_200mhz"; >>> + pinctrl-0 = <&pinctrl_usdhc1>; >>> + pinctrl-1 = <&pinctrl_usdhc1_100mhz>; >>> + pinctrl-2 = <&pinctrl_usdhc1_200mhz>; >>> + bus-width = <8>; >>> + non-removable; >>> + status = "okay"; >>> +}; >>> + >>> +&usdhc2 { >>> + 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>; >>> + bus-width = <4>; >>> + cd-gpios = <&gpio2 12 GPIO_ACTIVE_LOW>; >>> + vmmc-supply = <®_usdhc2_vmmc>; >>> + status = "okay"; >>> +}; >>> + >>> +&wdog1 { >>> + pinctrl-names = "default"; >>> + pinctrl-0 = <&pinctrl_wdog>; >>> + fsl,ext-reset-output; >>> + status = "okay"; >>> +}; >>> diff --git a/arch/arm/mach-imx/mx8m/Kconfig b/arch/arm/mach-imx/mx8m/Kconfig >>> index 3a84c2f2b0..e3b57b7915 100644 >>> --- a/arch/arm/mach-imx/mx8m/Kconfig >>> +++ b/arch/arm/mach-imx/mx8m/Kconfig >>> @@ -7,4 +7,16 @@ config MX8M >>> config SYS_SOC >>> default "mx8m" >>> >>> +choice >>> + prompt "NXP i.MX8M board select" >>> + optional >>> + >>> +config TARGET_MX8MQ_EVK >>> + bool "mx8mq_evk" >>> + select MX8M >>> + >>> +endchoice >>> + >>> +source "board/freescale/mx8mq_evk/Kconfig" >>> + >>> endif >>> diff --git a/board/freescale/mx8mq_evk/Kconfig >>> b/board/freescale/mx8mq_evk/Kconfig >>> new file mode 100644 >>> index 0000000000..4e23002803 >>> --- /dev/null >>> +++ b/board/freescale/mx8mq_evk/Kconfig >>> @@ -0,0 +1,12 @@ >>> +if TARGET_MX8MQ_EVK >>> + >>> +config SYS_BOARD >>> + default "mx8mq_evk" >>> + >>> +config SYS_VENDOR >>> + default "freescale" >>> + >>> +config SYS_CONFIG_NAME >>> + default "mx8mq_evk" >>> + >>> +endif >>> diff --git a/board/freescale/mx8mq_evk/Makefile >>> b/board/freescale/mx8mq_evk/Makefile >>> new file mode 100644 >>> index 0000000000..60c99d4194 >>> --- /dev/null >>> +++ b/board/freescale/mx8mq_evk/Makefile >>> @@ -0,0 +1,11 @@ >>> +# >>> +# Copyright 2017 NXP >>> +# >>> +# SPDX-License-Identifier: GPL-2.0+ >>> +# >>> + >>> +obj-y += mx8mq_evk.o >>> + >>> +ifdef CONFIG_SPL_BUILD >>> +obj-y += spl.o >>> +endif >>> diff --git a/board/freescale/mx8mq_evk/README >>> b/board/freescale/mx8mq_evk/README >>> new file mode 100644 >>> index 0000000000..6be5f51a22 >>> --- /dev/null >>> +++ b/board/freescale/mx8mq_evk/README >>> @@ -0,0 +1,38 @@ >>> +U-Boot for the NXP i.MX8MQ EVK board >>> + >>> +Quick Start >>> +==================== >>> +- Build the ARM Trusted firmware binary >>> +- Build U-Boot >>> +- Generate flash.bin using imx-mkimage >>> +- Boot >>> + >>> +Build the ARM Trusted firmware >>> +==================== >>> +$ make PLAT=imx8mq bl31 >>> + >>> +Build U-Boot >>> +==================== >>> +$ export ARCH=arm64 >>> +$ export CROSS_COMPILE=aarch64-poky-linux- >>> +$ make mx8mq_evk_defconfig >>> +$ make >>> + >>> +Generate flash.bin using imx-mkimage >>> +==================== >>> +Copy bl31.bin u-boot-nodtb.bin u-boot-spl.bin fsl-imx8mq-evk.dtb to >>> + imx-mkimage/iMX8M >>> +Copy lpddr4_pmu_train_1d_dmem.bin lpddr4_pmu_train_1d_imem.bin >>> + lpddr4_pmu_train_2d_dmem.bin lpddr4_pmu_train_2d_imem.bin to >>> + imx-mkimage/iMX8M >>> +If you want to run with HDMI, copy signed_hdmi_imx8m.bin to >>> imx-mkimage/iMX8M >>> + >>> +make SOC=iMX8M flash_spl_uboot or make SOC=iMX8M flash_hdmi_spl_uboot to >>> +generate flash.bin. >>> + >>> +Burn the flash.bin to MicroSD card offset 33KB >>> +$sudo dd if=iMX8M/flash.bin of=/dev/sd[x] bs=1024 seek=33 >>> + >>> +Boot >>> +==================== >>> +Set Boot switch SW801: 1100 and Bmode: 10 to boot from Micro SD. >>> diff --git a/board/freescale/mx8mq_evk/mx8mq_evk.c >>> b/board/freescale/mx8mq_evk/mx8mq_evk.c >>> new file mode 100644 >>> index 0000000000..e31678efb7 >>> --- /dev/null >>> +++ b/board/freescale/mx8mq_evk/mx8mq_evk.c >>> @@ -0,0 +1,156 @@ >>> +/* >>> + * Copyright 2017 NXP >>> + * >>> + * SPDX-License-Identifier: GPL-2.0+ >>> + */ >>> + >>> +#include <common.h> >>> +#include <malloc.h> >>> +#include <errno.h> >>> +#include <asm/io.h> >>> +#include <miiphy.h> >>> +#include <netdev.h> >>> +#include <asm/mach-imx/iomux-v3.h> >>> +#include <asm-generic/gpio.h> >>> +#include <fsl_esdhc.h> >>> +#include <mmc.h> >>> +#include <asm/arch/mx8mq_pins.h> >>> +#include <asm/arch/sys_proto.h> >>> +#include <asm/mach-imx/gpio.h> >>> +#include <asm/mach-imx/mxc_i2c.h> >>> +#include <asm/arch/clock.h> >>> +#include <spl.h> >>> +#include <power/pmic.h> >>> +#include <power/pfuze100_pmic.h> >>> +#include "../common/pfuze.h" >>> + >>> +DECLARE_GLOBAL_DATA_PTR; >>> + >>> +#define QSPI_PAD_CTRL (PAD_CTL_DSE2 | PAD_CTL_HYS) >>> + >>> +#define UART_PAD_CTRL (PAD_CTL_DSE6 | PAD_CTL_FSEL1) >>> + >>> +#define WDOG_PAD_CTRL (PAD_CTL_DSE6 | PAD_CTL_HYS | PAD_CTL_PUE) >>> + >>> +static iomux_v3_cfg_t const wdog_pads[] = { >>> + IMX8MQ_PAD_GPIO1_IO02__WDOG1_WDOG_B | MUX_PAD_CTRL(WDOG_PAD_CTRL), >>> +}; >>> + >>> +#ifdef CONFIG_FSL_QSPI >>> +static iomux_v3_cfg_t const qspi_pads[] = { >>> + IMX8MQ_PAD_NAND_ALE__QSPI_A_SCLK | MUX_PAD_CTRL(QSPI_PAD_CTRL), >>> + IMX8MQ_PAD_NAND_CE0_B__QSPI_A_SS0_B | MUX_PAD_CTRL(QSPI_PAD_CTRL), >>> + >>> + IMX8MQ_PAD_NAND_DATA00__QSPI_A_DATA0 | MUX_PAD_CTRL(QSPI_PAD_CTRL), >>> + IMX8MQ_PAD_NAND_DATA01__QSPI_A_DATA1 | MUX_PAD_CTRL(QSPI_PAD_CTRL), >>> + IMX8MQ_PAD_NAND_DATA02__QSPI_A_DATA2 | MUX_PAD_CTRL(QSPI_PAD_CTRL), >>> + IMX8MQ_PAD_NAND_DATA03__QSPI_A_DATA3 | MUX_PAD_CTRL(QSPI_PAD_CTRL), >>> +}; >>> + >>> +int board_qspi_init(void) >>> +{ >>> + imx_iomux_v3_setup_multiple_pads(qspi_pads, ARRAY_SIZE(qspi_pads)); >>> + >>> + set_clk_qspi(); >>> + >>> + return 0; >>> +} >>> +#endif >>> + >>> +static iomux_v3_cfg_t const uart_pads[] = { >>> + IMX8MQ_PAD_UART1_RXD__UART1_RX | MUX_PAD_CTRL(UART_PAD_CTRL), >>> + IMX8MQ_PAD_UART1_TXD__UART1_TX | MUX_PAD_CTRL(UART_PAD_CTRL), >>> +}; >>> + >>> +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; >>> + >>> + return 0; >>> +} >>> + >>> +#ifdef CONFIG_FEC_MXC >>> +#define FEC_RST_PAD IMX_GPIO_NR(1, 9) >>> +static iomux_v3_cfg_t const fec1_rst_pads[] = { >>> + IMX8MQ_PAD_GPIO1_IO09__GPIO1_IO9 | MUX_PAD_CTRL(NO_PAD_CTRL), >>> +}; >>> + >>> +static void setup_iomux_fec(void) >>> +{ >>> + imx_iomux_v3_setup_multiple_pads(fec1_rst_pads, >>> + ARRAY_SIZE(fec1_rst_pads)); >>> + >>> + gpio_request(IMX_GPIO_NR(1, 9), "fec1_rst"); >>> + gpio_direction_output(IMX_GPIO_NR(1, 9), 0); >>> + udelay(500); >>> + gpio_direction_output(IMX_GPIO_NR(1, 9), 1); >>> +} >>> + >>> +static int setup_fec(void) >>> +{ >>> + struct iomuxc_gpr_base_regs *gpr = >>> + (struct iomuxc_gpr_base_regs *)IOMUXC_GPR_BASE_ADDR; >>> + >>> + setup_iomux_fec(); >>> + >>> + /* Use 125M anatop REF_CLK1 for ENET1, not from external */ >>> + clrsetbits_le32(&gpr->gpr[1], BIT(13) | BIT(17), 0); >>> + return set_clk_enet(ENET_125MHZ); >>> +} >>> + >>> +int board_phy_config(struct phy_device *phydev) >>> +{ >>> + /* enable rgmii rxc skew and phy mode select to RGMII copper */ >>> + phy_write(phydev, MDIO_DEVAD_NONE, 0x1d, 0x1f); >>> + phy_write(phydev, MDIO_DEVAD_NONE, 0x1e, 0x8); >>> + >>> + phy_write(phydev, MDIO_DEVAD_NONE, 0x1d, 0x05); >>> + phy_write(phydev, MDIO_DEVAD_NONE, 0x1e, 0x100); >>> + >>> + if (phydev->drv->config) >>> + phydev->drv->config(phydev); >>> + return 0; >>> +} >>> +#endif >>> + >>> +int board_init(void) >>> +{ >>> + board_qspi_init(); >>> + >>> +#ifdef CONFIG_FEC_MXC >>> + setup_fec(); >>> +#endif >>> + >>> + return 0; >>> +} >>> + >>> +int board_mmc_get_env_dev(int devno) >>> +{ >>> + return devno; >>> +} >>> + >>> +int board_late_init(void) >>> +{ >>> +#ifdef CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG >>> + env_set("board_name", "EVK"); >>> + env_set("board_rev", "iMX8MQ"); >>> +#endif >>> + >>> + return 0; >>> +} >>> diff --git a/board/freescale/mx8mq_evk/spl.c >>> b/board/freescale/mx8mq_evk/spl.c >>> new file mode 100644 >>> index 0000000000..522d076124 >>> --- /dev/null >>> +++ b/board/freescale/mx8mq_evk/spl.c >>> @@ -0,0 +1,233 @@ >>> +/* >>> + * Copyright 2017 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/mx8mq_pins.h> >>> +#include <asm/arch/sys_proto.h> >>> +#include <power/pmic.h> >>> +#include <power/pfuze100_pmic.h> >>> +#include "../common/pfuze.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> >>> + >>> +DECLARE_GLOBAL_DATA_PTR; >>> + >>> +__weak void ddr_init(void) >>> +{ >>> +}; >>> + >> >> This weak could be dropped, it was surely for test purpose :-) > > I understand patch 23/23 about the ddr script, it is hard to be accepted. > So I add a weak function here to avoid build failure if other 22 patches > could be accepted. It may take long time to convert the ddr script to > structure based.
Ok, understand. > > So would you like to me to drop it and keep 23/23 in V3, or keep the weak > ddr_init and drop 23/23 in V3? Thing is that this patch is dead code without DDR setup. I am ready to merge reviewed patch, even if they add MX8M and there is not yet any board using - theoretically, this is also dead code and I could not. But this simplifies the development and you can reduce the number of patches to be posted next time. But merging a board that is known to be broken due to a missing part, it is nonsense. Board will be merged when we have a suitable way to set the DDR controller. Regards, Stefano > >> >>> +void spl_dram_init(void) >>> +{ >>> + /* ddr init */ >>> + ddr_init(); >>> +} >>> + >>> +#define I2C_PAD_CTRL (PAD_CTL_DSE6 | PAD_CTL_HYS | PAD_CTL_PUE) >>> +#define PC MUX_PAD_CTRL(I2C_PAD_CTRL) >>> +struct i2c_pads_info i2c_pad_info1 = { >>> + .scl = { >>> + .i2c_mode = IMX8MQ_PAD_I2C1_SCL__I2C1_SCL | PC, >>> + .gpio_mode = IMX8MQ_PAD_I2C1_SCL__GPIO5_IO14 | PC, >>> + .gp = IMX_GPIO_NR(5, 14), >>> + }, >>> + .sda = { >>> + .i2c_mode = IMX8MQ_PAD_I2C1_SDA__I2C1_SDA | PC, >>> + .gpio_mode = IMX8MQ_PAD_I2C1_SDA__GPIO5_IO15 | PC, >>> + .gp = IMX_GPIO_NR(5, 15), >>> + }, >>> +}; >>> + >>> +#define USDHC2_CD_GPIO IMX_GPIO_NR(2, 12) >>> +#define USDHC1_PWR_GPIO IMX_GPIO_NR(2, 10) >>> +#define USDHC2_PWR_GPIO IMX_GPIO_NR(2, 19) >>> + >>> +int board_mmc_getcd(struct mmc *mmc) >>> +{ >>> + struct fsl_esdhc_cfg *cfg = (struct fsl_esdhc_cfg *)mmc->priv; >>> + int ret = 0; >>> + >>> + switch (cfg->esdhc_base) { >>> + case USDHC1_BASE_ADDR: >>> + ret = 1; >>> + break; >>> + case USDHC2_BASE_ADDR: >>> + ret = !gpio_get_value(USDHC2_CD_GPIO); >>> + return ret; >>> + } >>> + >>> + return 1; >>> +} >>> + >>> +#define USDHC_PAD_CTRL (PAD_CTL_DSE6 | PAD_CTL_HYS | PAD_CTL_PUE | \ >>> + PAD_CTL_FSEL2) >>> + >>> +static iomux_v3_cfg_t const usdhc1_pads[] = { >>> + IMX8MQ_PAD_SD1_CLK__USDHC1_CLK | MUX_PAD_CTRL(USDHC_PAD_CTRL), >>> + IMX8MQ_PAD_SD1_CMD__USDHC1_CMD | MUX_PAD_CTRL(USDHC_PAD_CTRL), >>> + IMX8MQ_PAD_SD1_DATA0__USDHC1_DATA0 | MUX_PAD_CTRL(USDHC_PAD_CTRL), >>> + IMX8MQ_PAD_SD1_DATA1__USDHC1_DATA1 | MUX_PAD_CTRL(USDHC_PAD_CTRL), >>> + IMX8MQ_PAD_SD1_DATA2__USDHC1_DATA2 | MUX_PAD_CTRL(USDHC_PAD_CTRL), >>> + IMX8MQ_PAD_SD1_DATA3__USDHC1_DATA3 | MUX_PAD_CTRL(USDHC_PAD_CTRL), >>> + IMX8MQ_PAD_SD1_DATA4__USDHC1_DATA4 | MUX_PAD_CTRL(USDHC_PAD_CTRL), >>> + IMX8MQ_PAD_SD1_DATA5__USDHC1_DATA5 | MUX_PAD_CTRL(USDHC_PAD_CTRL), >>> + IMX8MQ_PAD_SD1_DATA6__USDHC1_DATA6 | MUX_PAD_CTRL(USDHC_PAD_CTRL), >>> + IMX8MQ_PAD_SD1_DATA7__USDHC1_DATA7 | MUX_PAD_CTRL(USDHC_PAD_CTRL), >>> + IMX8MQ_PAD_SD1_RESET_B__GPIO2_IO10 | MUX_PAD_CTRL(NO_PAD_CTRL), >>> +}; >>> + >>> +static iomux_v3_cfg_t const usdhc2_pads[] = { >>> + IMX8MQ_PAD_SD2_CLK__USDHC2_CLK | MUX_PAD_CTRL(USDHC_PAD_CTRL), >>> + IMX8MQ_PAD_SD2_CMD__USDHC2_CMD | MUX_PAD_CTRL(USDHC_PAD_CTRL), >>> + IMX8MQ_PAD_SD2_DATA0__USDHC2_DATA0 | MUX_PAD_CTRL(USDHC_PAD_CTRL), >>> + IMX8MQ_PAD_SD2_DATA1__USDHC2_DATA1 | MUX_PAD_CTRL(USDHC_PAD_CTRL), >>> + IMX8MQ_PAD_SD2_DATA2__USDHC2_DATA2 | MUX_PAD_CTRL(USDHC_PAD_CTRL), >>> + IMX8MQ_PAD_SD2_DATA3__USDHC2_DATA3 | MUX_PAD_CTRL(USDHC_PAD_CTRL), >>> + IMX8MQ_PAD_SD2_CD_B__GPIO2_IO12 | MUX_PAD_CTRL(NO_PAD_CTRL), >>> + IMX8MQ_PAD_SD2_RESET_B__GPIO2_IO19 | MUX_PAD_CTRL(NO_PAD_CTRL), >>> +}; >>> + >>> +static struct fsl_esdhc_cfg usdhc_cfg[2] = { >>> + {USDHC1_BASE_ADDR, 0, 8}, >>> + {USDHC2_BASE_ADDR, 0, 4}, >>> +}; >>> + >>> +int board_mmc_init(bd_t *bis) >>> +{ >>> + int i, ret; >>> + /* >>> + * According to the board_mmc_init() the following map is done: >>> + * (U-Boot device node) (Physical Port) >>> + * mmc0 USDHC1 >>> + * mmc1 USDHC2 >>> + */ >>> + for (i = 0; i < CONFIG_SYS_FSL_USDHC_NUM; i++) { >>> + switch (i) { >>> + case 0: >>> + init_clk_usdhc(0); >>> + usdhc_cfg[0].sdhc_clk = mxc_get_clock(USDHC1_CLK_ROOT); >>> + imx_iomux_v3_setup_multiple_pads( >>> + usdhc1_pads, ARRAY_SIZE(usdhc1_pads)); >>> + gpio_request(USDHC1_PWR_GPIO, "usdhc1_reset"); >>> + gpio_direction_output(USDHC1_PWR_GPIO, 0); >>> + udelay(500); >>> + gpio_direction_output(USDHC1_PWR_GPIO, 1); >>> + break; >>> + case 1: >>> + init_clk_usdhc(1); >>> + usdhc_cfg[1].sdhc_clk = mxc_get_clock(USDHC2_CLK_ROOT); >>> + imx_iomux_v3_setup_multiple_pads( >>> + usdhc2_pads, ARRAY_SIZE(usdhc2_pads)); >>> + gpio_request(USDHC2_PWR_GPIO, "usdhc2_reset"); >>> + gpio_direction_output(USDHC2_PWR_GPIO, 0); >>> + udelay(500); >>> + gpio_direction_output(USDHC2_PWR_GPIO, 1); >>> + break; >>> + default: >>> + printf("Warning: you configured more USDHC >>> controllers(%d) than supported by the board\n", i + 1); >>> + return -EINVAL; >>> + } >>> + >>> + ret = fsl_esdhc_initialize(bis, &usdhc_cfg[i]); >>> + if (ret) >>> + return ret; >>> + } >>> + >>> + return 0; >>> +} >>> + >>> +#ifdef CONFIG_POWER >>> +#define I2C_PMIC 0 >>> +int power_init_board(void) >>> +{ >>> + struct pmic *p; >>> + int ret; >>> + unsigned int reg; >>> + >>> + ret = power_pfuze100_init(I2C_PMIC); >>> + if (ret) >>> + return -ENODEV; >>> + >>> + p = pmic_get("PFUZE100"); >>> + ret = pmic_probe(p); >>> + if (ret) >>> + return -ENODEV; >>> + >>> + pmic_reg_read(p, PFUZE100_DEVICEID, ®); >>> + printf("PMIC: PFUZE100 ID=0x%02x\n", reg); >>> + >>> + pmic_reg_read(p, PFUZE100_SW3AVOL, ®); >>> + if ((reg & 0x3f) != 0x18) { >>> + reg &= ~0x3f; >>> + reg |= 0x18; >>> + pmic_reg_write(p, PFUZE100_SW3AVOL, reg); >>> + } >>> + >>> + ret = pfuze_mode_init(p, APS_PFM); >>> + if (ret < 0) >>> + return ret; >>> + >>> + return 0; >>> +} >>> +#endif >>> + >>> +void spl_board_init(void) >>> +{ >>> + enable_tzc380(); >> >> Just for my understanding: is this board specific ? Enabling the >> TrustZone controller looks to me more general, but I am maybe wrong. Can >> you better explain me this ? Thanks ! > > If want to use TZC380 on i.MX, TZC380 needs to be enabled > before DDR initialization. So I put it in spl_board_init. > > TZC380 enablement is not a must for all boards. > > We will enable TEE on i.MX8MQ EVK board, so need to enable TZC380. > > Thanks, > Peng > -- ===================================================================== DENX Software Engineering GmbH, Managing Director: Wolfgang Denk HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany Phone: +49-8142-66989-53 Fax: +49-8142-66989-80 Email: sba...@denx.de ===================================================================== _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de https://lists.denx.de/listinfo/u-boot