[U-Boot] [PATCH V2 22/23] imx: add i.MX8MQ EVK support

Stefano Babic sbabic at denx.de
Thu Dec 7 09:27:03 UTC 2017


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.fan at 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 = <&ethphy0>;
>>> +	fsl,magic-packet;
>>> +	status = "okay";
>>> +
>>> +	mdio {
>>> +		#address-cells = <1>;
>>> +		#size-cells = <0>;
>>> +
>>> +		ethphy0: ethernet-phy at 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 at 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 at 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 at 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 = <&reg_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, &reg);
>>> +	printf("PMIC:  PFUZE100 ID=0x%02x\n", reg);
>>> +
>>> +	pmic_reg_read(p, PFUZE100_SW3AVOL, &reg);
>>> +	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: sbabic at denx.de
=====================================================================


More information about the U-Boot mailing list