diff mbox series

[U-Boot,8/8] Add support for the NXP LS1021A-TSN board

Message ID 20190623174818.12773-9-olteanv@gmail.com
State Superseded
Delegated to: Prabhakar Kushwaha
Headers show
Series NXP LS1021A-TSN Board | expand

Commit Message

Vladimir Oltean June 23, 2019, 5:48 p.m. UTC
From: Jianchao Wang <jianchao.wang@nxp.com>

The LS1021A-TSN is a development board built by VVDN/Argonboards in
partnership with NXP.

It features the LS1021A SoC and the first-generation SJA1105T Ethernet
switch for prototyping implementations of a subset of IEEE 802.1 TSN
standards.

Supported boot media: microSD card (via SPL), QSPI flash.

Rev. A of the board uses a Spansion S25FL512S_256K serial flash, which
is 64 MB in size and has an erase sector size of 256KB (therefore,
flashing the RCW would erase part of U-boot).

Rev. B and C of the board use a Spansion S25FL256S1 serial flash, which
is only 32 MB in size but has an erase sector size of 64KB (therefore
the RCW image can be flashed without erasing U-boot).

To avoid the problems above, the U-boot base address has been selected
at 0x100000 (the start of the 5th 256KB erase sector), which works for
all board revisions. Actually 0x40000 would have been enough, but
0x100000 is common for all Layerscape devices.

eTSEC3 is connecting directly to SJA1105 via an RGMII fixed-link, but
SJA1105 is currently not supported by uboot. Therefore, eTSEC3 is
disabled.

Signed-off-by: Xiaoliang Yang <xiaoliang.yang@nxp.com>
Signed-off-by: Mingkai Hu <mingkai.hu@nxp.com>
Signed-off-by: Jianchao Wang <jianchao.wang@nxp.com>
Signed-off-by: Changming Huang <jerry.huang@nxp.com>

[Vladimir] Code taken from https://github.com/openil/u-boot (which
itself is mostly copied from ls1021a-iot) and adapted with the following
changes:

- Add a008850 errata workaround
- Converted eTSEC, MMC to DM to avoid all build warnings
- Plugged in distro boot feature, including support for extlinux.conf
- Added defconfig for QSPI boot
- Added the board/freescale/ls1021atsn/README.rst for initial setup

Signed-off-by: Vladimir Oltean <olteanv@gmail.com>
---
 arch/arm/Kconfig                              |  14 +
 arch/arm/dts/Makefile                         |   2 +-
 arch/arm/dts/ls1021a-tsn.dts                  |  77 ++++
 board/freescale/ls1021atsn/Kconfig            |  18 +
 board/freescale/ls1021atsn/MAINTAINERS        |   8 +
 board/freescale/ls1021atsn/Makefile           |   3 +
 board/freescale/ls1021atsn/README.rst         |  96 +++++
 board/freescale/ls1021atsn/ls1021atsn.c       | 291 +++++++++++++++
 board/freescale/ls1021atsn/ls102xa_pbi.cfg    |  15 +
 board/freescale/ls1021atsn/ls102xa_rcw_sd.cfg |   8 +
 configs/ls1021atsn_qspi_defconfig             |  76 ++++
 configs/ls1021atsn_sdcard_defconfig           |  85 +++++
 include/configs/ls1021atsn.h                  | 346 ++++++++++++++++++
 13 files changed, 1038 insertions(+), 1 deletion(-)
 create mode 100644 arch/arm/dts/ls1021a-tsn.dts
 create mode 100644 board/freescale/ls1021atsn/Kconfig
 create mode 100644 board/freescale/ls1021atsn/MAINTAINERS
 create mode 100644 board/freescale/ls1021atsn/Makefile
 create mode 100644 board/freescale/ls1021atsn/README.rst
 create mode 100644 board/freescale/ls1021atsn/ls1021atsn.c
 create mode 100644 board/freescale/ls1021atsn/ls102xa_pbi.cfg
 create mode 100644 board/freescale/ls1021atsn/ls102xa_rcw_sd.cfg
 create mode 100644 configs/ls1021atsn_qspi_defconfig
 create mode 100644 configs/ls1021atsn_sdcard_defconfig
 create mode 100644 include/configs/ls1021atsn.h

Comments

Bin Meng July 13, 2019, 5:05 a.m. UTC | #1
Hi Vladimir,

On Mon, Jun 24, 2019 at 1:50 AM Vladimir Oltean <olteanv@gmail.com> wrote:
>
> From: Jianchao Wang <jianchao.wang@nxp.com>
>
> The LS1021A-TSN is a development board built by VVDN/Argonboards in
> partnership with NXP.
>
> It features the LS1021A SoC and the first-generation SJA1105T Ethernet
> switch for prototyping implementations of a subset of IEEE 802.1 TSN
> standards.
>
> Supported boot media: microSD card (via SPL), QSPI flash.
>
> Rev. A of the board uses a Spansion S25FL512S_256K serial flash, which
> is 64 MB in size and has an erase sector size of 256KB (therefore,
> flashing the RCW would erase part of U-boot).

nits: U-Boot

>
> Rev. B and C of the board use a Spansion S25FL256S1 serial flash, which
> is only 32 MB in size but has an erase sector size of 64KB (therefore
> the RCW image can be flashed without erasing U-boot).

ditto

>
> To avoid the problems above, the U-boot base address has been selected

ditto

> at 0x100000 (the start of the 5th 256KB erase sector), which works for
> all board revisions. Actually 0x40000 would have been enough, but
> 0x100000 is common for all Layerscape devices.
>
> eTSEC3 is connecting directly to SJA1105 via an RGMII fixed-link, but
> SJA1105 is currently not supported by uboot. Therefore, eTSEC3 is
> disabled.
>
> Signed-off-by: Xiaoliang Yang <xiaoliang.yang@nxp.com>
> Signed-off-by: Mingkai Hu <mingkai.hu@nxp.com>
> Signed-off-by: Jianchao Wang <jianchao.wang@nxp.com>
> Signed-off-by: Changming Huang <jerry.huang@nxp.com>
>
> [Vladimir] Code taken from https://github.com/openil/u-boot (which
> itself is mostly copied from ls1021a-iot) and adapted with the following
> changes:
>
> - Add a008850 errata workaround
> - Converted eTSEC, MMC to DM to avoid all build warnings
> - Plugged in distro boot feature, including support for extlinux.conf
> - Added defconfig for QSPI boot
> - Added the board/freescale/ls1021atsn/README.rst for initial setup
>
> Signed-off-by: Vladimir Oltean <olteanv@gmail.com>
> ---
>  arch/arm/Kconfig                              |  14 +
>  arch/arm/dts/Makefile                         |   2 +-
>  arch/arm/dts/ls1021a-tsn.dts                  |  77 ++++
>  board/freescale/ls1021atsn/Kconfig            |  18 +
>  board/freescale/ls1021atsn/MAINTAINERS        |   8 +
>  board/freescale/ls1021atsn/Makefile           |   3 +
>  board/freescale/ls1021atsn/README.rst         |  96 +++++
>  board/freescale/ls1021atsn/ls1021atsn.c       | 291 +++++++++++++++
>  board/freescale/ls1021atsn/ls102xa_pbi.cfg    |  15 +
>  board/freescale/ls1021atsn/ls102xa_rcw_sd.cfg |   8 +
>  configs/ls1021atsn_qspi_defconfig             |  76 ++++
>  configs/ls1021atsn_sdcard_defconfig           |  85 +++++
>  include/configs/ls1021atsn.h                  | 346 ++++++++++++++++++
>  13 files changed, 1038 insertions(+), 1 deletion(-)
>  create mode 100644 arch/arm/dts/ls1021a-tsn.dts
>  create mode 100644 board/freescale/ls1021atsn/Kconfig
>  create mode 100644 board/freescale/ls1021atsn/MAINTAINERS
>  create mode 100644 board/freescale/ls1021atsn/Makefile
>  create mode 100644 board/freescale/ls1021atsn/README.rst
>  create mode 100644 board/freescale/ls1021atsn/ls1021atsn.c
>  create mode 100644 board/freescale/ls1021atsn/ls102xa_pbi.cfg
>  create mode 100644 board/freescale/ls1021atsn/ls102xa_rcw_sd.cfg
>  create mode 100644 configs/ls1021atsn_qspi_defconfig
>  create mode 100644 configs/ls1021atsn_sdcard_defconfig
>  create mode 100644 include/configs/ls1021atsn.h
>
> diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
> index 01ff57cf1bec..5edac7ea2bd5 100644
> --- a/arch/arm/Kconfig
> +++ b/arch/arm/Kconfig
> @@ -1327,6 +1327,19 @@ config TARGET_LS1021ATWR
>         select SUPPORT_SPL
>         imply SCSI
>
> +config TARGET_LS1021ATSN
> +       bool "Support ls1021atsn"
> +       select ARCH_LS1021A
> +       select ARCH_SUPPORT_PSCI
> +       select BOARD_EARLY_INIT_F
> +       select BOARD_LATE_INIT
> +       select CPU_V7A
> +       select CPU_V7_HAS_NONSEC
> +       select CPU_V7_HAS_VIRT
> +       select LS1_DEEP_SLEEP
> +       select SUPPORT_SPL
> +       imply SCSI
> +
>  config TARGET_LS1021AIOT
>         bool "Support ls1021aiot"
>         select ARCH_LS1021A
> @@ -1693,6 +1706,7 @@ source "board/freescale/ls1028a/Kconfig"
>  source "board/freescale/ls1021aqds/Kconfig"
>  source "board/freescale/ls1043aqds/Kconfig"
>  source "board/freescale/ls1021atwr/Kconfig"
> +source "board/freescale/ls1021atsn/Kconfig"
>  source "board/freescale/ls1021aiot/Kconfig"
>  source "board/freescale/ls1046aqds/Kconfig"
>  source "board/freescale/ls1043ardb/Kconfig"
> diff --git a/arch/arm/dts/Makefile b/arch/arm/dts/Makefile
> index 528fb909d5b0..28590b0c5530 100644
> --- a/arch/arm/dts/Makefile
> +++ b/arch/arm/dts/Makefile
> @@ -325,7 +325,7 @@ dtb-$(CONFIG_TARGET_STV0991) += stv0991.dtb
>  dtb-$(CONFIG_ARCH_LS1021A) += ls1021a-qds-duart.dtb \
>         ls1021a-qds-lpuart.dtb \
>         ls1021a-twr-duart.dtb ls1021a-twr-lpuart.dtb \
> -       ls1021a-iot-duart.dtb
> +       ls1021a-iot-duart.dtb ls1021a-tsn.dtb
>  dtb-$(CONFIG_FSL_LSCH3) += fsl-ls2080a-qds.dtb \
>         fsl-ls2080a-rdb.dtb \
>         fsl-ls2081a-rdb.dtb \
> diff --git a/arch/arm/dts/ls1021a-tsn.dts b/arch/arm/dts/ls1021a-tsn.dts
> new file mode 100644
> index 000000000000..f633074099dc
> --- /dev/null
> +++ b/arch/arm/dts/ls1021a-tsn.dts
> @@ -0,0 +1,77 @@
> +// SPDX-License-Identifier: GPL-2.0
> +/* Copyright 2016-2018 NXP Semiconductors
> + * Copyright 2019 Vladimir Oltean <olteanv@gmail.com>
> + */
> +
> +/dts-v1/;
> +#include "ls1021a.dtsi"
> +
> +/ {
> +       model = "NXP LS1021A-TSN Board";
> +
> +       aliases {
> +               enet0-sgmii-phy = &sgmii_phy2;
> +               enet1-sgmii-phy = &sgmii_phy1;
> +               spi0 = &qspi;
> +               spi1 = &dspi1;
> +       };
> +};
> +
> +&enet0 {
> +       tbi-handle = <&tbi0>;
> +       phy-handle = <&sgmii_phy2>;
> +       phy-mode = "sgmii";
> +       status = "okay";
> +};
> +
> +&enet1 {
> +       tbi-handle = <&tbi1>;
> +       phy-handle = <&sgmii_phy1>;
> +       phy-mode = "sgmii";
> +       status = "okay";
> +};
> +
> +&i2c0 {
> +       status = "okay";
> +};
> +
> +&mdio0 {
> +       /* AR8031 */
> +       sgmii_phy1: ethernet-phy@1 {
> +               reg = <0x1>;
> +       };
> +
> +       /* AR8031 */
> +       sgmii_phy2: ethernet-phy@2 {
> +               reg = <0x2>;
> +       };
> +
> +       /* SGMII PCS for enet0 */
> +       tbi0: tbi-phy@1f {
> +               reg = <0x1f>;
> +               device_type = "tbi-phy";
> +       };
> +};
> +
> +&mdio1 {
> +       /* SGMII PCS for enet1 */
> +       tbi1: tbi-phy@1f {
> +               reg = <0x1f>;
> +               device_type = "tbi-phy";
> +       };
> +};
> +
> +&qspi {
> +       bus-num = <0>;
> +       status = "okay";
> +
> +       flash@0 {
> +               compatible = "spi-flash";
> +               spi-max-frequency = <20000000>;
> +               reg = <0>;
> +       };
> +};
> +
> +&uart0 {
> +       status = "okay";
> +};
> diff --git a/board/freescale/ls1021atsn/Kconfig b/board/freescale/ls1021atsn/Kconfig
> new file mode 100644
> index 000000000000..d999fa469002
> --- /dev/null
> +++ b/board/freescale/ls1021atsn/Kconfig
> @@ -0,0 +1,18 @@
> +# SPDX-License-Identifier: GPL-2.0
> +if TARGET_LS1021ATSN
> +
> +config SYS_BOARD
> +       default "ls1021atsn"
> +
> +config SYS_VENDOR
> +       default "freescale"
> +
> +config SYS_SOC
> +       default "ls102xa"
> +
> +config SYS_CONFIG_NAME
> +       default "ls1021atsn"
> +
> +source "board/freescale/common/Kconfig"
> +
> +endif
> diff --git a/board/freescale/ls1021atsn/MAINTAINERS b/board/freescale/ls1021atsn/MAINTAINERS
> new file mode 100644
> index 000000000000..560bb615d2fe
> --- /dev/null
> +++ b/board/freescale/ls1021atsn/MAINTAINERS
> @@ -0,0 +1,8 @@
> +NXP LS1021A-TSN Board
> +M:     Vladimir Oltean <olteanv@gmail.com>
> +S:     Maintained
> +F:     arch/arm/dts/ls1021a-tsn.dts
> +F:     board/freescale/ls1021atsn/
> +F:     include/configs/ls1021atsn.h
> +F:     configs/ls1021atsn_qspi_defconfig
> +F:     configs/ls1021atsn_sdcard_defconfig
> diff --git a/board/freescale/ls1021atsn/Makefile b/board/freescale/ls1021atsn/Makefile
> new file mode 100644
> index 000000000000..b4808f05e8e0
> --- /dev/null
> +++ b/board/freescale/ls1021atsn/Makefile
> @@ -0,0 +1,3 @@
> +# SPDX-License-Identifier: GPL-2.0
> +obj-y += ls1021atsn.o
> +obj-$(CONFIG_ARMV7_PSCI) += ../ls1021atwr/psci.o
> diff --git a/board/freescale/ls1021atsn/README.rst b/board/freescale/ls1021atsn/README.rst
> new file mode 100644
> index 000000000000..e986f460c4d4
> --- /dev/null
> +++ b/board/freescale/ls1021atsn/README.rst
> @@ -0,0 +1,96 @@
> +.. SPDX-License-Identifier: GPL-2.0
> +
> +LS1021A-TSN Board Overview
> +==========================
> +
> + - 1GB DDR3 at 800 MHz
> + - Spansion/Cypress 64 MB (Rev. A) / 32 MB (Rev. B and C) QSPI NOR flash
> + - Ethernet
> +     - 2 SGMII 10/100/1G Ethernet ports (Atheros AR8031)
> +     - One SJA1105T switch with 4 Ethernet ports (Broadcom BCM5464R)
> +     - One internal RGMII port connected to the switch
> + - SDHC
> +     - microSDHC/SDXC connector
> + - Other I/O
> +    - One Serial port
> +    - Arduino and expansion headers
> +    - mPCIE slot
> +    - SATA port
> +    - USB3.0 port
> +
> +LS1021A Memory map
> +==================
> +
> +The addresses in brackets are physical addresses.
> +
> +==============  ==============  ==============================  =======
> +Start Address   End Address     Description                     Size
> +==============  ==============  ==============================  =======
> +0x00_0000_0000  0x00_000F_FFFF  Secure Boot ROM                 1MB
> +0x00_0100_0000  0x00_0FFF_FFFF  CCSRBAR                         240MB
> +0x00_1000_0000  0x00_1000_FFFF  OCRAM0                          64KB
> +0x00_1001_0000  0x00_1001_FFFF  OCRAM1                          64KB
> +0x00_2000_0000  0x00_20FF_FFFF  DCSR                            16MB
> +0x00_4000_0000  0x00_5FFF_FFFF  QSPI                            512MB
> +0x00_6000_0000  0x00_67FF_FFFF  IFC - NOR Flash                 128MB
> +0x00_8000_0000  0x00_FFFF_FFFF  DRAM1                           2GB
> +==============  ==============  ==============================  =======
> +
> +Compiling and flashing
> +======================
> +
> +The LS1021A-TSN board comes along with a microSD card with OpenIL U-boot.

nits: U-Boot

> +That will be used to update the internal QSPI flash, as well as
> +
> +To compile and flash an SD card image::
> +
> +  make ls1021atsn_sdcard_defconfig && make -j 8 && sudo cp u-boot-with-spl-pbl.bin /srv/tftpboot/
> +  => tftp 0x82000000 u-boot-with-spl-pbl.bin && mmc rescan && mmc erase 8 0x1100 && mmc write 0x82000000 8 0x1100
> +
> +For the QSPI flash, first obtain the Reset Configuration Word binary for
> +bootimg from the QSPI flash from the rcw project
> +(https://source.codeaurora.org/external/qoriq/qoriq-components/rcw)::
> +
> +  make -j 8 && sudo cp ls1021atsn/SSR_PNS_30/rcw_1200_qspiboot.bin.swapped /srv/tftpboot/
> +
> +The above RCW binary takes care of swapping the QSPI AMBA memory, so that the
> +U-boot binary does not need to be swapped when flashing it.

nits: U-Boot

> +
> +To compile and flash a U-boot image for QSPI::

ditto

> +
> +  make ls1021atsn_qspi_defconfig && make -j 8 && sudo cp u-boot.bin /srv/tftpboot/
> +
> +Then optionally create a custom uboot-env.txt file (although the default
> +environment already supports distro boot) and convert it to binary format::
> +
> +  mkenvimage -s 2M -o /srv/tftpboot/uboot-env.bin uboot-env.txt
> +
> +To program the QSPI flash with the images::
> +
> +  => tftp 0x82000000 rcw_1000_qspiboot.bin.swapped && sf probe && sf erase 0x0 +${filesize} && sf write 0x82000000 0x0 ${filesize}
> +  => tftp 0x82000000 u-boot.bin && sf probe && sf erase 0x100000 +${filesize} && sf write 0x82000000 0x100000 ${filesize}
> +  => tftp 0x82000000 uboot-env.bin && sf probe && sf erase 0x400000 +${filesize} && sf write 0x82000000 0x400000 ${filesize}
> +
> +The boards contain an AT24 I2C EEPROM that is supposed to hold the MAC
> +addresses of the Ethernet interfaces, however the EEPROM comes blank out of
> +the factory, and the MAC addresses are printed on a label on the bottom of
> +the boards.
> +
> +To write the MAC addresses to the EEPROM, the following needs to be done once::
> +
> +  => mac id
> +  => mac 0 00:1F:7B:xx:xx:xx
> +  => mac 1 00:1F:7B:xx:xx:xx
> +  => mac 2 00:1F:7B:xx:xx:xx
> +  => mac save
> +
> +The switch ports do not have their own MAC address - they inherit it from the
> +master enet2 port.
> +
> +Known issues and limitations
> +============================
> +
> +- The 4 SJA1105 switch ports are not functional in U-boot for now.

nits: U-Boot

> +- Since the IFC pins are multiplexed with QSPI on LS1021A, currently there is
> +  no way to talk to the CPLD for e.g. running the "qixis_reset" command, or
> +  turning the fan on, etc.
> diff --git a/board/freescale/ls1021atsn/ls1021atsn.c b/board/freescale/ls1021atsn/ls1021atsn.c
> new file mode 100644
> index 000000000000..84c2af142956
> --- /dev/null
> +++ b/board/freescale/ls1021atsn/ls1021atsn.c
> @@ -0,0 +1,291 @@
> +// SPDX-License-Identifier: GPL-2.0
> +/* Copyright 2016-2019 NXP Semiconductors
> + */
> +#include <common.h>
> +#include <i2c.h>
> +#include <asm/io.h>
> +#include <asm/arch/immap_ls102xa.h>
> +#include <asm/arch/clock.h>
> +#include <asm/arch/fsl_serdes.h>
> +#include <asm/arch-ls102xa/ls102xa_soc.h>
> +#include <asm/arch/ls102xa_devdis.h>
> +#include <asm/arch/ls102xa_soc.h>
> +#include <hwconfig.h>
> +#include <mmc.h>
> +#include <fsl_csu.h>
> +#include <fsl_esdhc.h>
> +#include <fsl_ifc.h>
> +#include <fsl_immap.h>
> +#include <netdev.h>
> +#include <spl.h>
> +#include "../common/sleep.h"
> +#ifdef CONFIG_U_QE
> +#include <fsl_qe.h>
> +#endif
> +#include <fsl_validate.h>
> +
> +DECLARE_GLOBAL_DATA_PTR;
> +
> +void cpld_show(void)

This should be static.

> +{
> +       struct ccsr_gur *dcfg = (struct ccsr_gur *)CONFIG_SYS_FSL_GUTS_ADDR;
> +       u32 cpldrev;
> +       int major;
> +       int minor;
> +
> +       cpldrev = in_be32(&dcfg->gpporcr1);
> +       major = (cpldrev >> 28) & 0xf;
> +       minor = (cpldrev >> 24) & 0xf;
> +
> +       printf("CPLD:  V%d.%d\n", major, minor);
> +}
> +
> +int checkboard(void)
> +{
> +       puts("Board: LS1021ATSN\n");
> +       cpld_show();
> +       return 0;
> +}
> +
> +void ddrmc_init(void)

This should be static.

> +{
> +       struct ccsr_ddr *ddr = (struct ccsr_ddr *)CONFIG_SYS_FSL_DDR_ADDR;
> +       u32 temp_sdram_cfg, tmp;
> +
> +       out_be32(&ddr->sdram_cfg, DDR_SDRAM_CFG);
> +
> +       out_be32(&ddr->cs0_bnds, DDR_CS0_BNDS);
> +       out_be32(&ddr->cs0_config, DDR_CS0_CONFIG);
> +
> +       out_be32(&ddr->timing_cfg_0, DDR_TIMING_CFG_0);
> +       out_be32(&ddr->timing_cfg_1, DDR_TIMING_CFG_1);
> +       out_be32(&ddr->timing_cfg_2, DDR_TIMING_CFG_2);
> +       out_be32(&ddr->timing_cfg_3, DDR_TIMING_CFG_3);
> +       out_be32(&ddr->timing_cfg_4, DDR_TIMING_CFG_4);
> +       out_be32(&ddr->timing_cfg_5, DDR_TIMING_CFG_5);
> +
> +#ifdef CONFIG_DEEP_SLEEP
> +       if (is_warm_boot()) {
> +               out_be32(&ddr->sdram_cfg_2,
> +                        DDR_SDRAM_CFG_2 & ~SDRAM_CFG2_D_INIT);
> +               out_be32(&ddr->init_addr, CONFIG_SYS_SDRAM_BASE);
> +               out_be32(&ddr->init_ext_addr, (1 << 31));
> +
> +               /* DRAM VRef will not be trained */
> +               out_be32(&ddr->ddr_cdr2,
> +                        DDR_DDR_CDR2 & ~DDR_CDR2_VREF_TRAIN_EN);
> +       } else
> +#endif
> +       {
> +               out_be32(&ddr->sdram_cfg_2, DDR_SDRAM_CFG_2);
> +               out_be32(&ddr->ddr_cdr2, DDR_DDR_CDR2);
> +       }
> +
> +       out_be32(&ddr->sdram_mode, DDR_SDRAM_MODE);
> +       out_be32(&ddr->sdram_mode_2, DDR_SDRAM_MODE_2);
> +
> +       out_be32(&ddr->sdram_interval, DDR_SDRAM_INTERVAL);
> +
> +       out_be32(&ddr->ddr_wrlvl_cntl, DDR_DDR_WRLVL_CNTL);
> +
> +       out_be32(&ddr->ddr_wrlvl_cntl_2, DDR_DDR_WRLVL_CNTL_2);
> +       out_be32(&ddr->ddr_wrlvl_cntl_3, DDR_DDR_WRLVL_CNTL_3);
> +
> +       out_be32(&ddr->ddr_cdr1, DDR_DDR_CDR1);
> +
> +       out_be32(&ddr->sdram_clk_cntl, DDR_SDRAM_CLK_CNTL);
> +       out_be32(&ddr->ddr_zq_cntl, DDR_DDR_ZQ_CNTL);
> +
> +       out_be32(&ddr->cs0_config_2, DDR_CS0_CONFIG_2);
> +
> +       /* DDR erratum A-009942 */
> +       tmp = in_be32(&ddr->debug[28]);
> +       out_be32(&ddr->debug[28], tmp | 0x0070006f);
> +
> +       udelay(1);
> +
> +#ifdef CONFIG_DEEP_SLEEP
> +       if (is_warm_boot()) {
> +               /* enter self-refresh */
> +               temp_sdram_cfg = in_be32(&ddr->sdram_cfg_2);
> +               temp_sdram_cfg |= SDRAM_CFG2_FRC_SR;
> +               out_be32(&ddr->sdram_cfg_2, temp_sdram_cfg);
> +
> +               temp_sdram_cfg = (DDR_SDRAM_CFG_MEM_EN | SDRAM_CFG_BI);
> +       } else
> +#endif
> +               temp_sdram_cfg = (DDR_SDRAM_CFG_MEM_EN & ~SDRAM_CFG_BI);
> +
> +       out_be32(&ddr->sdram_cfg, DDR_SDRAM_CFG | temp_sdram_cfg);
> +
> +#ifdef CONFIG_DEEP_SLEEP
> +       if (is_warm_boot()) {
> +               /* exit self-refresh */
> +               temp_sdram_cfg = in_be32(&ddr->sdram_cfg_2);
> +               temp_sdram_cfg &= ~SDRAM_CFG2_FRC_SR;
> +               out_be32(&ddr->sdram_cfg_2, temp_sdram_cfg);
> +       }
> +#endif
> +}
> +
> +int dram_init(void)
> +{
> +#if (!defined(CONFIG_SPL) || defined(CONFIG_SPL_BUILD))
> +       ddrmc_init();
> +#endif
> +
> +       erratum_a008850_post();
> +
> +       gd->ram_size = get_ram_size((void *)PHYS_SDRAM, PHYS_SDRAM_SIZE);
> +
> +#if defined(CONFIG_DEEP_SLEEP) && !defined(CONFIG_SPL_BUILD)
> +       fsl_dp_resume();
> +#endif
> +
> +       return 0;
> +}
> +
> +int board_eth_init(bd_t *bis)
> +{
> +       return pci_eth_init(bis);
> +}
> +
> +int board_early_init_f(void)
> +{
> +       struct ccsr_scfg *scfg = (struct ccsr_scfg *)CONFIG_SYS_FSL_SCFG_ADDR;
> +
> +#ifdef CONFIG_TSEC_ENET
> +       /* Clear BD & FR bits for big endian BD's and frame data (aka set
> +        * correct eTSEC endianness). This is crucial in ensuring that it does
> +        * not report Data Parity Errors in its RX/TX FIFOs when attempting to
> +        * send traffic.
> +        */
> +       clrbits_be32(&scfg->etsecdmamcr, SCFG_ETSECDMAMCR_LE_BD_FR);
> +       /* EC3_GTX_CLK125 (of enet2) used for all RGMII interfaces */
> +       out_be32(&scfg->etsecmcr, SCFG_ETSECCMCR_GE2_CLK125);
> +#endif
> +
> +#ifdef CONFIG_FSL_IFC
> +       init_early_memctl_regs();
> +#endif
> +
> +       arch_soc_init();
> +
> +#if defined(CONFIG_DEEP_SLEEP)
> +       if (is_warm_boot()) {
> +               timer_init();
> +               dram_init();
> +       }
> +#endif
> +
> +       return 0;
> +}
> +
> +#ifdef CONFIG_SPL_BUILD
> +void board_init_f(ulong dummy)
> +{
> +       void (*second_uboot)(void);
> +
> +       /* Clear the BSS */
> +       memset(__bss_start, 0, __bss_end - __bss_start);
> +
> +       get_clocks();
> +
> +#if defined(CONFIG_DEEP_SLEEP)
> +       if (is_warm_boot())
> +               fsl_dp_disable_console();
> +#endif
> +
> +       preloader_console_init();
> +
> +       dram_init();
> +
> +       /* Allow OCRAM access permission as R/W */
> +#ifdef CONFIG_LAYERSCAPE_NS_ACCESS
> +       enable_layerscape_ns_access();
> +       enable_layerscape_ns_access();
> +#endif
> +
> +       /*
> +        * if it is woken up from deep sleep, then jump to second
> +        * stage uboot and continue executing without recopying
> +        * it from SD since it has already been reserved in memory
> +        * in last boot.
> +        */
> +       if (is_warm_boot()) {
> +               second_uboot = (void (*)(void))CONFIG_SYS_TEXT_BASE;
> +               second_uboot();
> +       }
> +
> +       board_init_r(NULL, 0);
> +}
> +#endif
> +
> +int board_init(void)
> +{
> +#ifndef CONFIG_SYS_FSL_NO_SERDES
> +       fsl_serdes_init();
> +#endif
> +       ls102xa_smmu_stream_id_init();
> +
> +#ifdef CONFIG_LAYERSCAPE_NS_ACCESS
> +       enable_layerscape_ns_access();
> +#endif
> +
> +#ifdef CONFIG_U_QE
> +       u_qe_init();
> +#endif
> +
> +       return 0;
> +}
> +
> +#if defined(CONFIG_SPL_BUILD)
> +void spl_board_init(void)
> +{
> +       ls102xa_smmu_stream_id_init();
> +}
> +#endif
> +
> +#ifdef CONFIG_BOARD_LATE_INIT
> +int board_late_init(void)
> +{
> +#ifdef CONFIG_CHAIN_OF_TRUST
> +       fsl_setenv_chain_of_trust();
> +#endif
> +
> +       return 0;
> +}
> +#endif
> +
> +#if defined(CONFIG_MISC_INIT_R)
> +int misc_init_r(void)
> +{
> +#ifdef CONFIG_FSL_DEVICE_DISABLE
> +       device_disable(devdis_tbl, ARRAY_SIZE(devdis_tbl));
> +#endif
> +
> +#ifdef CONFIG_FSL_CAAM
> +       return sec_init();
> +#endif
> +}
> +#endif
> +
> +#if defined(CONFIG_DEEP_SLEEP)
> +void board_sleep_prepare(void)
> +{
> +#ifdef CONFIG_LAYERSCAPE_NS_ACCESS
> +       enable_layerscape_ns_access();
> +#endif
> +}
> +#endif
> +
> +int ft_board_setup(void *blob, bd_t *bd)
> +{
> +       ft_cpu_setup(blob, bd);
> +
> +#ifdef CONFIG_PCI
> +       ft_pci_setup(blob, bd);
> +#endif
> +
> +       return 0;
> +}

[snip]

Regards,
Bin
Vladimir Oltean July 14, 2019, 8:04 p.m. UTC | #2
Hi Bin,

On Sat, 13 Jul 2019 at 08:05, Bin Meng <bmeng.cn@gmail.com> wrote:
>
> Hi Vladimir,
>
> On Mon, Jun 24, 2019 at 1:50 AM Vladimir Oltean <olteanv@gmail.com> wrote:
> >
> > From: Jianchao Wang <jianchao.wang@nxp.com>
> >
> > The LS1021A-TSN is a development board built by VVDN/Argonboards in
> > partnership with NXP.
> >
> > It features the LS1021A SoC and the first-generation SJA1105T Ethernet
> > switch for prototyping implementations of a subset of IEEE 802.1 TSN
> > standards.
> >
> > Supported boot media: microSD card (via SPL), QSPI flash.
> >
> > Rev. A of the board uses a Spansion S25FL512S_256K serial flash, which
> > is 64 MB in size and has an erase sector size of 256KB (therefore,
> > flashing the RCW would erase part of U-boot).
>
> nits: U-Boot
>

Why don't you add a rule to scripts/checkpatch.pl that warns on
improper spelling of U-Boot? It would save a lot of time on both ends.

> >
> > Rev. B and C of the board use a Spansion S25FL256S1 serial flash, which
> > is only 32 MB in size but has an erase sector size of 64KB (therefore
> > the RCW image can be flashed without erasing U-boot).
>
> ditto
>
> >
> > To avoid the problems above, the U-boot base address has been selected
>
> ditto
>

[snip]

> > +The LS1021A-TSN board comes along with a microSD card with OpenIL U-boot.
>
> nits: U-Boot
>
> > +That will be used to update the internal QSPI flash, as well as
> > +
> > +To compile and flash an SD card image::
> > +
> > +  make ls1021atsn_sdcard_defconfig && make -j 8 && sudo cp u-boot-with-spl-pbl.bin /srv/tftpboot/
> > +  => tftp 0x82000000 u-boot-with-spl-pbl.bin && mmc rescan && mmc erase 8 0x1100 && mmc write 0x82000000 8 0x1100
> > +
> > +For the QSPI flash, first obtain the Reset Configuration Word binary for
> > +bootimg from the QSPI flash from the rcw project
> > +(https://source.codeaurora.org/external/qoriq/qoriq-components/rcw)::
> > +
> > +  make -j 8 && sudo cp ls1021atsn/SSR_PNS_30/rcw_1200_qspiboot.bin.swapped /srv/tftpboot/
> > +
> > +The above RCW binary takes care of swapping the QSPI AMBA memory, so that the
> > +U-boot binary does not need to be swapped when flashing it.
>
> nits: U-Boot
>
> > +
> > +To compile and flash a U-boot image for QSPI::
>
> ditto
>
> > +
> > +  make ls1021atsn_qspi_defconfig && make -j 8 && sudo cp u-boot.bin /srv/tftpboot/
> > +
> > +Then optionally create a custom uboot-env.txt file (although the default
> > +environment already supports distro boot) and convert it to binary format::
> > +
> > +  mkenvimage -s 2M -o /srv/tftpboot/uboot-env.bin uboot-env.txt
> > +
> > +To program the QSPI flash with the images::
> > +
> > +  => tftp 0x82000000 rcw_1000_qspiboot.bin.swapped && sf probe && sf erase 0x0 +${filesize} && sf write 0x82000000 0x0 ${filesize}
> > +  => tftp 0x82000000 u-boot.bin && sf probe && sf erase 0x100000 +${filesize} && sf write 0x82000000 0x100000 ${filesize}
> > +  => tftp 0x82000000 uboot-env.bin && sf probe && sf erase 0x400000 +${filesize} && sf write 0x82000000 0x400000 ${filesize}
> > +
> > +The boards contain an AT24 I2C EEPROM that is supposed to hold the MAC
> > +addresses of the Ethernet interfaces, however the EEPROM comes blank out of
> > +the factory, and the MAC addresses are printed on a label on the bottom of
> > +the boards.
> > +
> > +To write the MAC addresses to the EEPROM, the following needs to be done once::
> > +
> > +  => mac id
> > +  => mac 0 00:1F:7B:xx:xx:xx
> > +  => mac 1 00:1F:7B:xx:xx:xx
> > +  => mac 2 00:1F:7B:xx:xx:xx
> > +  => mac save
> > +
> > +The switch ports do not have their own MAC address - they inherit it from the
> > +master enet2 port.
> > +
> > +Known issues and limitations
> > +============================
> > +
> > +- The 4 SJA1105 switch ports are not functional in U-boot for now.
>
> nits: U-Boot
>

[snip]

>
> Regards,
> Bin

Thanks,
-Vladimir
Bin Meng July 15, 2019, 2:18 a.m. UTC | #3
Hi Vladimir,

On Mon, Jul 15, 2019 at 4:04 AM Vladimir Oltean <olteanv@gmail.com> wrote:
>
> Hi Bin,
>
> On Sat, 13 Jul 2019 at 08:05, Bin Meng <bmeng.cn@gmail.com> wrote:
> >
> > Hi Vladimir,
> >
> > On Mon, Jun 24, 2019 at 1:50 AM Vladimir Oltean <olteanv@gmail.com> wrote:
> > >
> > > From: Jianchao Wang <jianchao.wang@nxp.com>
> > >
> > > The LS1021A-TSN is a development board built by VVDN/Argonboards in
> > > partnership with NXP.
> > >
> > > It features the LS1021A SoC and the first-generation SJA1105T Ethernet
> > > switch for prototyping implementations of a subset of IEEE 802.1 TSN
> > > standards.
> > >
> > > Supported boot media: microSD card (via SPL), QSPI flash.
> > >
> > > Rev. A of the board uses a Spansion S25FL512S_256K serial flash, which
> > > is 64 MB in size and has an erase sector size of 256KB (therefore,
> > > flashing the RCW would erase part of U-boot).
> >
> > nits: U-Boot
> >
>
> Why don't you add a rule to scripts/checkpatch.pl that warns on
> improper spelling of U-Boot? It would save a lot of time on both ends.
>

Yep, I once tried to add some misspelled word list of U-Boot to
spelling, but checkpatch would generate lots of false-positive
warnings (like u-boot.bin) so I gave it up. It seems that we need add
some special handling of U-Boot spelling in checkpatch? Do you have
better idea?

> > >
> > > Rev. B and C of the board use a Spansion S25FL256S1 serial flash, which
> > > is only 32 MB in size but has an erase sector size of 64KB (therefore
> > > the RCW image can be flashed without erasing U-boot).
> >
> > ditto
> >
> > >
> > > To avoid the problems above, the U-boot base address has been selected
> >
> > ditto
> >

[snip]

Regards,
Bin
Vladimir Oltean July 15, 2019, 9:46 a.m. UTC | #4
On Mon, 15 Jul 2019 at 05:18, Bin Meng <bmeng.cn@gmail.com> wrote:
>
> Hi Vladimir,
>
> On Mon, Jul 15, 2019 at 4:04 AM Vladimir Oltean <olteanv@gmail.com> wrote:
> >
> > Hi Bin,
> >
> > On Sat, 13 Jul 2019 at 08:05, Bin Meng <bmeng.cn@gmail.com> wrote:
> > >
> > > Hi Vladimir,
> > >
> > > On Mon, Jun 24, 2019 at 1:50 AM Vladimir Oltean <olteanv@gmail.com> wrote:
> > > >
> > > > From: Jianchao Wang <jianchao.wang@nxp.com>
> > > >
> > > > The LS1021A-TSN is a development board built by VVDN/Argonboards in
> > > > partnership with NXP.
> > > >
> > > > It features the LS1021A SoC and the first-generation SJA1105T Ethernet
> > > > switch for prototyping implementations of a subset of IEEE 802.1 TSN
> > > > standards.
> > > >
> > > > Supported boot media: microSD card (via SPL), QSPI flash.
> > > >
> > > > Rev. A of the board uses a Spansion S25FL512S_256K serial flash, which
> > > > is 64 MB in size and has an erase sector size of 256KB (therefore,
> > > > flashing the RCW would erase part of U-boot).
> > >
> > > nits: U-Boot
> > >
> >
> > Why don't you add a rule to scripts/checkpatch.pl that warns on
> > improper spelling of U-Boot? It would save a lot of time on both ends.
> >
>
> Yep, I once tried to add some misspelled word list of U-Boot to
> spelling, but checkpatch would generate lots of false-positive
> warnings (like u-boot.bin) so I gave it up. It seems that we need add
> some special handling of U-Boot spelling in checkpatch? Do you have
> better idea?
>

Ok, so I see that scripts/spelling.txt is case-insensitive, which
doesn't work for what you want. I guess it just doesn't matter that
much then?
If it does matter to you, one way would be to add explicit checks in
the checkpatch script itself.

> > > >
> > > > Rev. B and C of the board use a Spansion S25FL256S1 serial flash, which
> > > > is only 32 MB in size but has an erase sector size of 64KB (therefore
> > > > the RCW image can be flashed without erasing U-boot).
> > >
> > > ditto
> > >
> > > >
> > > > To avoid the problems above, the U-boot base address has been selected
> > >
> > > ditto
> > >
>
> [snip]
>
> Regards,
> Bin

Thanks,
-Vladimir
Bin Meng July 15, 2019, 9:56 a.m. UTC | #5
Hi Vladimir,

On Mon, Jul 15, 2019 at 5:46 PM Vladimir Oltean <olteanv@gmail.com> wrote:
>
> On Mon, 15 Jul 2019 at 05:18, Bin Meng <bmeng.cn@gmail.com> wrote:
> >
> > Hi Vladimir,
> >
> > On Mon, Jul 15, 2019 at 4:04 AM Vladimir Oltean <olteanv@gmail.com> wrote:
> > >
> > > Hi Bin,
> > >
> > > On Sat, 13 Jul 2019 at 08:05, Bin Meng <bmeng.cn@gmail.com> wrote:
> > > >
> > > > Hi Vladimir,
> > > >
> > > > On Mon, Jun 24, 2019 at 1:50 AM Vladimir Oltean <olteanv@gmail.com> wrote:
> > > > >
> > > > > From: Jianchao Wang <jianchao.wang@nxp.com>
> > > > >
> > > > > The LS1021A-TSN is a development board built by VVDN/Argonboards in
> > > > > partnership with NXP.
> > > > >
> > > > > It features the LS1021A SoC and the first-generation SJA1105T Ethernet
> > > > > switch for prototyping implementations of a subset of IEEE 802.1 TSN
> > > > > standards.
> > > > >
> > > > > Supported boot media: microSD card (via SPL), QSPI flash.
> > > > >
> > > > > Rev. A of the board uses a Spansion S25FL512S_256K serial flash, which
> > > > > is 64 MB in size and has an erase sector size of 256KB (therefore,
> > > > > flashing the RCW would erase part of U-boot).
> > > >
> > > > nits: U-Boot
> > > >
> > >
> > > Why don't you add a rule to scripts/checkpatch.pl that warns on
> > > improper spelling of U-Boot? It would save a lot of time on both ends.
> > >
> >
> > Yep, I once tried to add some misspelled word list of U-Boot to
> > spelling, but checkpatch would generate lots of false-positive
> > warnings (like u-boot.bin) so I gave it up. It seems that we need add
> > some special handling of U-Boot spelling in checkpatch? Do you have
> > better idea?
> >
>
> Ok, so I see that scripts/spelling.txt is case-insensitive, which
> doesn't work for what you want. I guess it just doesn't matter that
> much then?

Yes, it's case-insensitive, so it generates too many false-positive
warnings and I believe that may annoy people :)

> If it does matter to you, one way would be to add explicit checks in
> the checkpatch script itself.

I did not want to do that as the checkpath script is synced up from
Linux kernel upstream, and no U-Boot special handling should be
applied.

Regards,
Bin
Joe Hershberger July 15, 2019, 7:09 p.m. UTC | #6
On Sun, Jun 23, 2019 at 12:53 PM Vladimir Oltean <olteanv@gmail.com> wrote:
>
> From: Jianchao Wang <jianchao.wang@nxp.com>
>
> The LS1021A-TSN is a development board built by VVDN/Argonboards in
> partnership with NXP.
>
> It features the LS1021A SoC and the first-generation SJA1105T Ethernet
> switch for prototyping implementations of a subset of IEEE 802.1 TSN
> standards.
>
> Supported boot media: microSD card (via SPL), QSPI flash.
>
> Rev. A of the board uses a Spansion S25FL512S_256K serial flash, which
> is 64 MB in size and has an erase sector size of 256KB (therefore,
> flashing the RCW would erase part of U-boot).
>
> Rev. B and C of the board use a Spansion S25FL256S1 serial flash, which
> is only 32 MB in size but has an erase sector size of 64KB (therefore
> the RCW image can be flashed without erasing U-boot).
>
> To avoid the problems above, the U-boot base address has been selected
> at 0x100000 (the start of the 5th 256KB erase sector), which works for
> all board revisions. Actually 0x40000 would have been enough, but
> 0x100000 is common for all Layerscape devices.
>
> eTSEC3 is connecting directly to SJA1105 via an RGMII fixed-link, but
> SJA1105 is currently not supported by uboot. Therefore, eTSEC3 is
> disabled.
>
> Signed-off-by: Xiaoliang Yang <xiaoliang.yang@nxp.com>
> Signed-off-by: Mingkai Hu <mingkai.hu@nxp.com>
> Signed-off-by: Jianchao Wang <jianchao.wang@nxp.com>
> Signed-off-by: Changming Huang <jerry.huang@nxp.com>
>
> [Vladimir] Code taken from https://github.com/openil/u-boot (which
> itself is mostly copied from ls1021a-iot) and adapted with the following
> changes:
>
> - Add a008850 errata workaround
> - Converted eTSEC, MMC to DM to avoid all build warnings
> - Plugged in distro boot feature, including support for extlinux.conf
> - Added defconfig for QSPI boot
> - Added the board/freescale/ls1021atsn/README.rst for initial setup
>
> Signed-off-by: Vladimir Oltean <olteanv@gmail.com>
> ---
>  arch/arm/Kconfig                              |  14 +
>  arch/arm/dts/Makefile                         |   2 +-
>  arch/arm/dts/ls1021a-tsn.dts                  |  77 ++++
>  board/freescale/ls1021atsn/Kconfig            |  18 +
>  board/freescale/ls1021atsn/MAINTAINERS        |   8 +
>  board/freescale/ls1021atsn/Makefile           |   3 +
>  board/freescale/ls1021atsn/README.rst         |  96 +++++
>  board/freescale/ls1021atsn/ls1021atsn.c       | 291 +++++++++++++++
>  board/freescale/ls1021atsn/ls102xa_pbi.cfg    |  15 +
>  board/freescale/ls1021atsn/ls102xa_rcw_sd.cfg |   8 +
>  configs/ls1021atsn_qspi_defconfig             |  76 ++++
>  configs/ls1021atsn_sdcard_defconfig           |  85 +++++
>  include/configs/ls1021atsn.h                  | 346 ++++++++++++++++++
>  13 files changed, 1038 insertions(+), 1 deletion(-)
>  create mode 100644 arch/arm/dts/ls1021a-tsn.dts
>  create mode 100644 board/freescale/ls1021atsn/Kconfig
>  create mode 100644 board/freescale/ls1021atsn/MAINTAINERS
>  create mode 100644 board/freescale/ls1021atsn/Makefile
>  create mode 100644 board/freescale/ls1021atsn/README.rst
>  create mode 100644 board/freescale/ls1021atsn/ls1021atsn.c
>  create mode 100644 board/freescale/ls1021atsn/ls102xa_pbi.cfg
>  create mode 100644 board/freescale/ls1021atsn/ls102xa_rcw_sd.cfg
>  create mode 100644 configs/ls1021atsn_qspi_defconfig
>  create mode 100644 configs/ls1021atsn_sdcard_defconfig
>  create mode 100644 include/configs/ls1021atsn.h
>
> diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
> index 01ff57cf1bec..5edac7ea2bd5 100644
> --- a/arch/arm/Kconfig
> +++ b/arch/arm/Kconfig
> @@ -1327,6 +1327,19 @@ config TARGET_LS1021ATWR
>         select SUPPORT_SPL
>         imply SCSI
>
> +config TARGET_LS1021ATSN
> +       bool "Support ls1021atsn"
> +       select ARCH_LS1021A
> +       select ARCH_SUPPORT_PSCI
> +       select BOARD_EARLY_INIT_F
> +       select BOARD_LATE_INIT
> +       select CPU_V7A
> +       select CPU_V7_HAS_NONSEC
> +       select CPU_V7_HAS_VIRT
> +       select LS1_DEEP_SLEEP
> +       select SUPPORT_SPL
> +       imply SCSI
> +
>  config TARGET_LS1021AIOT
>         bool "Support ls1021aiot"
>         select ARCH_LS1021A
> @@ -1693,6 +1706,7 @@ source "board/freescale/ls1028a/Kconfig"
>  source "board/freescale/ls1021aqds/Kconfig"
>  source "board/freescale/ls1043aqds/Kconfig"
>  source "board/freescale/ls1021atwr/Kconfig"
> +source "board/freescale/ls1021atsn/Kconfig"
>  source "board/freescale/ls1021aiot/Kconfig"
>  source "board/freescale/ls1046aqds/Kconfig"
>  source "board/freescale/ls1043ardb/Kconfig"
> diff --git a/arch/arm/dts/Makefile b/arch/arm/dts/Makefile
> index 528fb909d5b0..28590b0c5530 100644
> --- a/arch/arm/dts/Makefile
> +++ b/arch/arm/dts/Makefile
> @@ -325,7 +325,7 @@ dtb-$(CONFIG_TARGET_STV0991) += stv0991.dtb
>  dtb-$(CONFIG_ARCH_LS1021A) += ls1021a-qds-duart.dtb \
>         ls1021a-qds-lpuart.dtb \
>         ls1021a-twr-duart.dtb ls1021a-twr-lpuart.dtb \
> -       ls1021a-iot-duart.dtb
> +       ls1021a-iot-duart.dtb ls1021a-tsn.dtb
>  dtb-$(CONFIG_FSL_LSCH3) += fsl-ls2080a-qds.dtb \
>         fsl-ls2080a-rdb.dtb \
>         fsl-ls2081a-rdb.dtb \
> diff --git a/arch/arm/dts/ls1021a-tsn.dts b/arch/arm/dts/ls1021a-tsn.dts
> new file mode 100644
> index 000000000000..f633074099dc
> --- /dev/null
> +++ b/arch/arm/dts/ls1021a-tsn.dts
> @@ -0,0 +1,77 @@
> +// SPDX-License-Identifier: GPL-2.0
> +/* Copyright 2016-2018 NXP Semiconductors
> + * Copyright 2019 Vladimir Oltean <olteanv@gmail.com>
> + */
> +
> +/dts-v1/;
> +#include "ls1021a.dtsi"
> +
> +/ {
> +       model = "NXP LS1021A-TSN Board";
> +
> +       aliases {
> +               enet0-sgmii-phy = &sgmii_phy2;
> +               enet1-sgmii-phy = &sgmii_phy1;
> +               spi0 = &qspi;
> +               spi1 = &dspi1;
> +       };
> +};
> +
> +&enet0 {
> +       tbi-handle = <&tbi0>;
> +       phy-handle = <&sgmii_phy2>;
> +       phy-mode = "sgmii";
> +       status = "okay";
> +};
> +
> +&enet1 {
> +       tbi-handle = <&tbi1>;
> +       phy-handle = <&sgmii_phy1>;
> +       phy-mode = "sgmii";
> +       status = "okay";
> +};
> +
> +&i2c0 {
> +       status = "okay";
> +};
> +
> +&mdio0 {
> +       /* AR8031 */
> +       sgmii_phy1: ethernet-phy@1 {
> +               reg = <0x1>;
> +       };
> +
> +       /* AR8031 */
> +       sgmii_phy2: ethernet-phy@2 {
> +               reg = <0x2>;
> +       };
> +
> +       /* SGMII PCS for enet0 */
> +       tbi0: tbi-phy@1f {
> +               reg = <0x1f>;
> +               device_type = "tbi-phy";
> +       };
> +};
> +
> +&mdio1 {
> +       /* SGMII PCS for enet1 */
> +       tbi1: tbi-phy@1f {
> +               reg = <0x1f>;
> +               device_type = "tbi-phy";
> +       };
> +};
> +
> +&qspi {
> +       bus-num = <0>;
> +       status = "okay";
> +
> +       flash@0 {
> +               compatible = "spi-flash";
> +               spi-max-frequency = <20000000>;
> +               reg = <0>;
> +       };
> +};
> +
> +&uart0 {
> +       status = "okay";
> +};
> diff --git a/board/freescale/ls1021atsn/Kconfig b/board/freescale/ls1021atsn/Kconfig
> new file mode 100644
> index 000000000000..d999fa469002
> --- /dev/null
> +++ b/board/freescale/ls1021atsn/Kconfig
> @@ -0,0 +1,18 @@
> +# SPDX-License-Identifier: GPL-2.0
> +if TARGET_LS1021ATSN
> +
> +config SYS_BOARD
> +       default "ls1021atsn"
> +
> +config SYS_VENDOR
> +       default "freescale"
> +
> +config SYS_SOC
> +       default "ls102xa"
> +
> +config SYS_CONFIG_NAME
> +       default "ls1021atsn"
> +
> +source "board/freescale/common/Kconfig"
> +
> +endif
> diff --git a/board/freescale/ls1021atsn/MAINTAINERS b/board/freescale/ls1021atsn/MAINTAINERS
> new file mode 100644
> index 000000000000..560bb615d2fe
> --- /dev/null
> +++ b/board/freescale/ls1021atsn/MAINTAINERS
> @@ -0,0 +1,8 @@
> +NXP LS1021A-TSN Board
> +M:     Vladimir Oltean <olteanv@gmail.com>
> +S:     Maintained
> +F:     arch/arm/dts/ls1021a-tsn.dts
> +F:     board/freescale/ls1021atsn/
> +F:     include/configs/ls1021atsn.h
> +F:     configs/ls1021atsn_qspi_defconfig
> +F:     configs/ls1021atsn_sdcard_defconfig
> diff --git a/board/freescale/ls1021atsn/Makefile b/board/freescale/ls1021atsn/Makefile
> new file mode 100644
> index 000000000000..b4808f05e8e0
> --- /dev/null
> +++ b/board/freescale/ls1021atsn/Makefile
> @@ -0,0 +1,3 @@
> +# SPDX-License-Identifier: GPL-2.0
> +obj-y += ls1021atsn.o
> +obj-$(CONFIG_ARMV7_PSCI) += ../ls1021atwr/psci.o
> diff --git a/board/freescale/ls1021atsn/README.rst b/board/freescale/ls1021atsn/README.rst
> new file mode 100644
> index 000000000000..e986f460c4d4
> --- /dev/null
> +++ b/board/freescale/ls1021atsn/README.rst
> @@ -0,0 +1,96 @@
> +.. SPDX-License-Identifier: GPL-2.0
> +
> +LS1021A-TSN Board Overview
> +==========================
> +
> + - 1GB DDR3 at 800 MHz
> + - Spansion/Cypress 64 MB (Rev. A) / 32 MB (Rev. B and C) QSPI NOR flash
> + - Ethernet
> +     - 2 SGMII 10/100/1G Ethernet ports (Atheros AR8031)
> +     - One SJA1105T switch with 4 Ethernet ports (Broadcom BCM5464R)
> +     - One internal RGMII port connected to the switch
> + - SDHC
> +     - microSDHC/SDXC connector
> + - Other I/O
> +    - One Serial port
> +    - Arduino and expansion headers
> +    - mPCIE slot
> +    - SATA port
> +    - USB3.0 port
> +
> +LS1021A Memory map
> +==================
> +
> +The addresses in brackets are physical addresses.
> +
> +==============  ==============  ==============================  =======
> +Start Address   End Address     Description                     Size
> +==============  ==============  ==============================  =======
> +0x00_0000_0000  0x00_000F_FFFF  Secure Boot ROM                 1MB
> +0x00_0100_0000  0x00_0FFF_FFFF  CCSRBAR                         240MB
> +0x00_1000_0000  0x00_1000_FFFF  OCRAM0                          64KB
> +0x00_1001_0000  0x00_1001_FFFF  OCRAM1                          64KB
> +0x00_2000_0000  0x00_20FF_FFFF  DCSR                            16MB
> +0x00_4000_0000  0x00_5FFF_FFFF  QSPI                            512MB
> +0x00_6000_0000  0x00_67FF_FFFF  IFC - NOR Flash                 128MB
> +0x00_8000_0000  0x00_FFFF_FFFF  DRAM1                           2GB
> +==============  ==============  ==============================  =======
> +
> +Compiling and flashing
> +======================
> +
> +The LS1021A-TSN board comes along with a microSD card with OpenIL U-boot.
> +That will be used to update the internal QSPI flash, as well as
> +
> +To compile and flash an SD card image::
> +
> +  make ls1021atsn_sdcard_defconfig && make -j 8 && sudo cp u-boot-with-spl-pbl.bin /srv/tftpboot/
> +  => tftp 0x82000000 u-boot-with-spl-pbl.bin && mmc rescan && mmc erase 8 0x1100 && mmc write 0x82000000 8 0x1100
> +
> +For the QSPI flash, first obtain the Reset Configuration Word binary for
> +bootimg from the QSPI flash from the rcw project
> +(https://source.codeaurora.org/external/qoriq/qoriq-components/rcw)::
> +
> +  make -j 8 && sudo cp ls1021atsn/SSR_PNS_30/rcw_1200_qspiboot.bin.swapped /srv/tftpboot/
> +
> +The above RCW binary takes care of swapping the QSPI AMBA memory, so that the
> +U-boot binary does not need to be swapped when flashing it.
> +
> +To compile and flash a U-boot image for QSPI::
> +
> +  make ls1021atsn_qspi_defconfig && make -j 8 && sudo cp u-boot.bin /srv/tftpboot/
> +
> +Then optionally create a custom uboot-env.txt file (although the default
> +environment already supports distro boot) and convert it to binary format::
> +
> +  mkenvimage -s 2M -o /srv/tftpboot/uboot-env.bin uboot-env.txt
> +
> +To program the QSPI flash with the images::
> +
> +  => tftp 0x82000000 rcw_1000_qspiboot.bin.swapped && sf probe && sf erase 0x0 +${filesize} && sf write 0x82000000 0x0 ${filesize}
> +  => tftp 0x82000000 u-boot.bin && sf probe && sf erase 0x100000 +${filesize} && sf write 0x82000000 0x100000 ${filesize}
> +  => tftp 0x82000000 uboot-env.bin && sf probe && sf erase 0x400000 +${filesize} && sf write 0x82000000 0x400000 ${filesize}
> +
> +The boards contain an AT24 I2C EEPROM that is supposed to hold the MAC
> +addresses of the Ethernet interfaces, however the EEPROM comes blank out of
> +the factory, and the MAC addresses are printed on a label on the bottom of
> +the boards.
> +
> +To write the MAC addresses to the EEPROM, the following needs to be done once::
> +
> +  => mac id
> +  => mac 0 00:1F:7B:xx:xx:xx
> +  => mac 1 00:1F:7B:xx:xx:xx
> +  => mac 2 00:1F:7B:xx:xx:xx
> +  => mac save
> +
> +The switch ports do not have their own MAC address - they inherit it from the
> +master enet2 port.
> +
> +Known issues and limitations
> +============================
> +
> +- The 4 SJA1105 switch ports are not functional in U-boot for now.
> +- Since the IFC pins are multiplexed with QSPI on LS1021A, currently there is
> +  no way to talk to the CPLD for e.g. running the "qixis_reset" command, or
> +  turning the fan on, etc.
> diff --git a/board/freescale/ls1021atsn/ls1021atsn.c b/board/freescale/ls1021atsn/ls1021atsn.c
> new file mode 100644
> index 000000000000..84c2af142956
> --- /dev/null
> +++ b/board/freescale/ls1021atsn/ls1021atsn.c
> @@ -0,0 +1,291 @@
> +// SPDX-License-Identifier: GPL-2.0
> +/* Copyright 2016-2019 NXP Semiconductors
> + */
> +#include <common.h>
> +#include <i2c.h>
> +#include <asm/io.h>
> +#include <asm/arch/immap_ls102xa.h>
> +#include <asm/arch/clock.h>
> +#include <asm/arch/fsl_serdes.h>
> +#include <asm/arch-ls102xa/ls102xa_soc.h>
> +#include <asm/arch/ls102xa_devdis.h>
> +#include <asm/arch/ls102xa_soc.h>
> +#include <hwconfig.h>
> +#include <mmc.h>
> +#include <fsl_csu.h>
> +#include <fsl_esdhc.h>
> +#include <fsl_ifc.h>
> +#include <fsl_immap.h>
> +#include <netdev.h>
> +#include <spl.h>
> +#include "../common/sleep.h"
> +#ifdef CONFIG_U_QE
> +#include <fsl_qe.h>
> +#endif
> +#include <fsl_validate.h>
> +
> +DECLARE_GLOBAL_DATA_PTR;
> +
> +void cpld_show(void)
> +{
> +       struct ccsr_gur *dcfg = (struct ccsr_gur *)CONFIG_SYS_FSL_GUTS_ADDR;
> +       u32 cpldrev;
> +       int major;
> +       int minor;
> +
> +       cpldrev = in_be32(&dcfg->gpporcr1);
> +       major = (cpldrev >> 28) & 0xf;
> +       minor = (cpldrev >> 24) & 0xf;
> +
> +       printf("CPLD:  V%d.%d\n", major, minor);
> +}
> +
> +int checkboard(void)
> +{
> +       puts("Board: LS1021ATSN\n");
> +       cpld_show();
> +       return 0;
> +}
> +
> +void ddrmc_init(void)
> +{
> +       struct ccsr_ddr *ddr = (struct ccsr_ddr *)CONFIG_SYS_FSL_DDR_ADDR;
> +       u32 temp_sdram_cfg, tmp;
> +
> +       out_be32(&ddr->sdram_cfg, DDR_SDRAM_CFG);
> +
> +       out_be32(&ddr->cs0_bnds, DDR_CS0_BNDS);
> +       out_be32(&ddr->cs0_config, DDR_CS0_CONFIG);
> +
> +       out_be32(&ddr->timing_cfg_0, DDR_TIMING_CFG_0);
> +       out_be32(&ddr->timing_cfg_1, DDR_TIMING_CFG_1);
> +       out_be32(&ddr->timing_cfg_2, DDR_TIMING_CFG_2);
> +       out_be32(&ddr->timing_cfg_3, DDR_TIMING_CFG_3);
> +       out_be32(&ddr->timing_cfg_4, DDR_TIMING_CFG_4);
> +       out_be32(&ddr->timing_cfg_5, DDR_TIMING_CFG_5);
> +
> +#ifdef CONFIG_DEEP_SLEEP
> +       if (is_warm_boot()) {
> +               out_be32(&ddr->sdram_cfg_2,
> +                        DDR_SDRAM_CFG_2 & ~SDRAM_CFG2_D_INIT);
> +               out_be32(&ddr->init_addr, CONFIG_SYS_SDRAM_BASE);
> +               out_be32(&ddr->init_ext_addr, (1 << 31));
> +
> +               /* DRAM VRef will not be trained */
> +               out_be32(&ddr->ddr_cdr2,
> +                        DDR_DDR_CDR2 & ~DDR_CDR2_VREF_TRAIN_EN);
> +       } else
> +#endif
> +       {
> +               out_be32(&ddr->sdram_cfg_2, DDR_SDRAM_CFG_2);
> +               out_be32(&ddr->ddr_cdr2, DDR_DDR_CDR2);
> +       }
> +
> +       out_be32(&ddr->sdram_mode, DDR_SDRAM_MODE);
> +       out_be32(&ddr->sdram_mode_2, DDR_SDRAM_MODE_2);
> +
> +       out_be32(&ddr->sdram_interval, DDR_SDRAM_INTERVAL);
> +
> +       out_be32(&ddr->ddr_wrlvl_cntl, DDR_DDR_WRLVL_CNTL);
> +
> +       out_be32(&ddr->ddr_wrlvl_cntl_2, DDR_DDR_WRLVL_CNTL_2);
> +       out_be32(&ddr->ddr_wrlvl_cntl_3, DDR_DDR_WRLVL_CNTL_3);
> +
> +       out_be32(&ddr->ddr_cdr1, DDR_DDR_CDR1);
> +
> +       out_be32(&ddr->sdram_clk_cntl, DDR_SDRAM_CLK_CNTL);
> +       out_be32(&ddr->ddr_zq_cntl, DDR_DDR_ZQ_CNTL);
> +
> +       out_be32(&ddr->cs0_config_2, DDR_CS0_CONFIG_2);
> +
> +       /* DDR erratum A-009942 */
> +       tmp = in_be32(&ddr->debug[28]);
> +       out_be32(&ddr->debug[28], tmp | 0x0070006f);
> +
> +       udelay(1);
> +
> +#ifdef CONFIG_DEEP_SLEEP
> +       if (is_warm_boot()) {
> +               /* enter self-refresh */
> +               temp_sdram_cfg = in_be32(&ddr->sdram_cfg_2);
> +               temp_sdram_cfg |= SDRAM_CFG2_FRC_SR;
> +               out_be32(&ddr->sdram_cfg_2, temp_sdram_cfg);
> +
> +               temp_sdram_cfg = (DDR_SDRAM_CFG_MEM_EN | SDRAM_CFG_BI);
> +       } else
> +#endif
> +               temp_sdram_cfg = (DDR_SDRAM_CFG_MEM_EN & ~SDRAM_CFG_BI);
> +
> +       out_be32(&ddr->sdram_cfg, DDR_SDRAM_CFG | temp_sdram_cfg);
> +
> +#ifdef CONFIG_DEEP_SLEEP
> +       if (is_warm_boot()) {
> +               /* exit self-refresh */
> +               temp_sdram_cfg = in_be32(&ddr->sdram_cfg_2);
> +               temp_sdram_cfg &= ~SDRAM_CFG2_FRC_SR;
> +               out_be32(&ddr->sdram_cfg_2, temp_sdram_cfg);
> +       }
> +#endif
> +}
> +
> +int dram_init(void)
> +{
> +#if (!defined(CONFIG_SPL) || defined(CONFIG_SPL_BUILD))
> +       ddrmc_init();
> +#endif
> +
> +       erratum_a008850_post();
> +
> +       gd->ram_size = get_ram_size((void *)PHYS_SDRAM, PHYS_SDRAM_SIZE);
> +
> +#if defined(CONFIG_DEEP_SLEEP) && !defined(CONFIG_SPL_BUILD)
> +       fsl_dp_resume();
> +#endif
> +
> +       return 0;
> +}
> +
> +int board_eth_init(bd_t *bis)
> +{
> +       return pci_eth_init(bis);
> +}
> +
> +int board_early_init_f(void)
> +{
> +       struct ccsr_scfg *scfg = (struct ccsr_scfg *)CONFIG_SYS_FSL_SCFG_ADDR;
> +
> +#ifdef CONFIG_TSEC_ENET
> +       /* Clear BD & FR bits for big endian BD's and frame data (aka set

Nit: Multi-line comment format.  I'm curious why checkpatch.pl doesn't
catch this sometimes.

> +        * correct eTSEC endianness). This is crucial in ensuring that it does
> +        * not report Data Parity Errors in its RX/TX FIFOs when attempting to
> +        * send traffic.
> +        */
> +       clrbits_be32(&scfg->etsecdmamcr, SCFG_ETSECDMAMCR_LE_BD_FR);
> +       /* EC3_GTX_CLK125 (of enet2) used for all RGMII interfaces */
> +       out_be32(&scfg->etsecmcr, SCFG_ETSECCMCR_GE2_CLK125);
> +#endif
> +
> +#ifdef CONFIG_FSL_IFC
> +       init_early_memctl_regs();
> +#endif
> +
> +       arch_soc_init();
> +
> +#if defined(CONFIG_DEEP_SLEEP)
> +       if (is_warm_boot()) {
> +               timer_init();
> +               dram_init();
> +       }
> +#endif
> +
> +       return 0;
> +}
> +
> +#ifdef CONFIG_SPL_BUILD
> +void board_init_f(ulong dummy)
> +{
> +       void (*second_uboot)(void);
> +
> +       /* Clear the BSS */
> +       memset(__bss_start, 0, __bss_end - __bss_start);
> +
> +       get_clocks();
> +
> +#if defined(CONFIG_DEEP_SLEEP)
> +       if (is_warm_boot())
> +               fsl_dp_disable_console();
> +#endif
> +
> +       preloader_console_init();
> +
> +       dram_init();
> +
> +       /* Allow OCRAM access permission as R/W */
> +#ifdef CONFIG_LAYERSCAPE_NS_ACCESS
> +       enable_layerscape_ns_access();
> +       enable_layerscape_ns_access();
> +#endif
> +
> +       /*
> +        * if it is woken up from deep sleep, then jump to second
> +        * stage uboot and continue executing without recopying

U-Boot

> +        * it from SD since it has already been reserved in memory
> +        * in last boot.
> +        */
> +       if (is_warm_boot()) {
> +               second_uboot = (void (*)(void))CONFIG_SYS_TEXT_BASE;
> +               second_uboot();
> +       }
> +
> +       board_init_r(NULL, 0);
> +}
> +#endif
> +
> +int board_init(void)
> +{
> +#ifndef CONFIG_SYS_FSL_NO_SERDES
> +       fsl_serdes_init();
> +#endif
> +       ls102xa_smmu_stream_id_init();
> +
> +#ifdef CONFIG_LAYERSCAPE_NS_ACCESS
> +       enable_layerscape_ns_access();
> +#endif
> +
> +#ifdef CONFIG_U_QE
> +       u_qe_init();
> +#endif
> +
> +       return 0;
> +}
> +
> +#if defined(CONFIG_SPL_BUILD)
> +void spl_board_init(void)
> +{
> +       ls102xa_smmu_stream_id_init();
> +}
> +#endif
> +
> +#ifdef CONFIG_BOARD_LATE_INIT
> +int board_late_init(void)
> +{
> +#ifdef CONFIG_CHAIN_OF_TRUST
> +       fsl_setenv_chain_of_trust();
> +#endif
> +
> +       return 0;
> +}
> +#endif
> +
> +#if defined(CONFIG_MISC_INIT_R)
> +int misc_init_r(void)
> +{
> +#ifdef CONFIG_FSL_DEVICE_DISABLE
> +       device_disable(devdis_tbl, ARRAY_SIZE(devdis_tbl));
> +#endif
> +
> +#ifdef CONFIG_FSL_CAAM
> +       return sec_init();
> +#endif
> +}
> +#endif
> +
> +#if defined(CONFIG_DEEP_SLEEP)
> +void board_sleep_prepare(void)
> +{
> +#ifdef CONFIG_LAYERSCAPE_NS_ACCESS
> +       enable_layerscape_ns_access();
> +#endif
> +}
> +#endif
> +
> +int ft_board_setup(void *blob, bd_t *bd)
> +{
> +       ft_cpu_setup(blob, bd);
> +
> +#ifdef CONFIG_PCI
> +       ft_pci_setup(blob, bd);
> +#endif
> +
> +       return 0;
> +}
> diff --git a/board/freescale/ls1021atsn/ls102xa_pbi.cfg b/board/freescale/ls1021atsn/ls102xa_pbi.cfg
> new file mode 100644
> index 000000000000..a8ba184c6684
> --- /dev/null
> +++ b/board/freescale/ls1021atsn/ls102xa_pbi.cfg

What is this file? Is it built by something?

> @@ -0,0 +1,15 @@
> +#PBI commands
> +
> +09570200 ffffffff
> +09570158 00000300
> +8940007c 21f47300
> +
> +# Configure Scratch register
> +09ee0200 10000000
> +# Configure alternate space
> +09570158 00001000
> +# Flush PBL data
> +096100c0 000FFFFF
> +
> +09ea085c 00502880
> +09ea0560 80800000
> diff --git a/board/freescale/ls1021atsn/ls102xa_rcw_sd.cfg b/board/freescale/ls1021atsn/ls102xa_rcw_sd.cfg
> new file mode 100644
> index 000000000000..67152dd2810e
> --- /dev/null
> +++ b/board/freescale/ls1021atsn/ls102xa_rcw_sd.cfg
> @@ -0,0 +1,8 @@
> +# PBL preamble and RCW header
> +aa55aa55 01ee0100
> +
> +# Disable IFC, enable QSPI and DSPI
> +0608000c 00000000 00000000 00000000
> +30000000 08007900 60040a00 21046000
> +00000000 00000000 00000000 20002000
> +20024800 8804b340 00000000 00000000
> diff --git a/configs/ls1021atsn_qspi_defconfig b/configs/ls1021atsn_qspi_defconfig
> new file mode 100644
> index 000000000000..427881fe0c52
> --- /dev/null
> +++ b/configs/ls1021atsn_qspi_defconfig
> @@ -0,0 +1,76 @@
> +CONFIG_ARM=y
> +CONFIG_TARGET_LS1021ATSN=y
> +CONFIG_SYS_TEXT_BASE=0x40100000
> +CONFIG_DEFAULT_DEVICE_TREE="ls1021a-tsn"
> +CONFIG_BOARD_EARLY_INIT_F=y
> +CONFIG_SYS_FSL_CLK=y
> +CONFIG_SYS_EXTRA_OPTIONS="QSPI_BOOT"
> +CONFIG_QSPI_BOOT=y
> +CONFIG_BOOTDELAY=3
> +CONFIG_HUSH_PARSER=y
> +CONFIG_CMD_GREPENV=y
> +CONFIG_CMD_MEMINFO=y
> +CONFIG_CMD_GPT=y
> +CONFIG_CMD_FAT=y
> +CONFIG_FSL_ESDHC=y
> +CONFIG_CMD_SF=y
> +CONFIG_OF_CONTROL=y
> +CONFIG_ENV_IS_IN_SPI_FLASH=y
> +CONFIG_DM=y
> +CONFIG_FSL_CAAM=y
> +CONFIG_SPI=y
> +CONFIG_SPI_FLASH=y
> +CONFIG_SPI_FLASH_ATMEL=y
> +CONFIG_SPI_FLASH_STMICRO=y
> +CONFIG_SPI_FLASH_BAR=y
> +CONFIG_SPI_FLASH_SPANSION=y
> +CONFIG_NETDEVICES=y
> +CONFIG_DM_ETH=y
> +CONFIG_TSEC_ENET=y
> +CONFIG_MII=y
> +CONFIG_SYS_NS16550=y
> +CONFIG_DM_SPI=y
> +CONFIG_DM_SPI_FLASH=y
> +CONFIG_SPI_FLASH_DATAFLASH=y
> +CONFIG_FSL_DSPI=y
> +CONFIG_FSL_QSPI=y
> +CONFIG_PCI=y
> +CONFIG_CMD_PCI=y
> +CONFIG_DM_PCI=y
> +CONFIG_DM_PCI_COMPAT=y
> +CONFIG_CMD_MMC=y
> +CONFIG_DM_MMC=y
> +CONFIG_FSL_SPI_ALIGNED_TXFIFO=y
> +CONFIG_USB=y
> +CONFIG_DM_USB=y
> +CONFIG_CMD_USB=y
> +CONFIG_USB_XHCI_HCD=y
> +CONFIG_USB_XHCI_FSL=y
> +CONFIG_USB_XHCI_DWC3=y
> +CONFIG_HAS_FSL_XHCI_USB=y
> +CONFIG_USB_STORAGE=y
> +CONFIG_CMD_EXT2=y
> +CONFIG_PCIE_LAYERSCAPE=y
> +CONFIG_PHYLIB=y
> +CONFIG_PHY_GIGE=y
> +CONFIG_PHY_ATHEROS=y
> +CONFIG_PHY_BROADCOM=y
> +CONFIG_PHY_FIXED=y
> +CONFIG_CMD_PING=y
> +CONFIG_CMD_DHCP=y
> +CONFIG_CMD_MII=y
> +CONFIG_CMDLINE_TAG=y
> +CONFIG_CMDLINE_EDITING=y
> +CONFIG_AUTO_COMPLETE=y
> +CONFIG_NR_DRAM_BANKS=1
> +CONFIG_CMD_BOOTZ=y
> +CONFIG_SYS_LONGHELP=y
> +CONFIG_FIT=y
> +CONFIG_CMD_DM=y
> +CONFIG_AHCI=y
> +CONFIG_CMD_I2C=y
> +CONFIG_BLK=y
> +CONFIG_CMD_PART=y
> +CONFIG_CMD_FS_GENERIC=y
> +CONFIG_CMD_FS_UUID=y
> +CONFIG_DISTRO_DEFAULTS=y
> diff --git a/configs/ls1021atsn_sdcard_defconfig b/configs/ls1021atsn_sdcard_defconfig
> new file mode 100644
> index 000000000000..b74e01206817
> --- /dev/null
> +++ b/configs/ls1021atsn_sdcard_defconfig
> @@ -0,0 +1,85 @@
> +CONFIG_ARM=y
> +CONFIG_TARGET_LS1021ATSN=y
> +CONFIG_SPL_TEXT_BASE=0x10000000
> +CONFIG_SYS_TEXT_BASE=0x82000000
> +CONFIG_DEFAULT_DEVICE_TREE="ls1021a-tsn"
> +CONFIG_BOARD_EARLY_INIT_F=y
> +CONFIG_SPL=y
> +CONFIG_SPL_FRAMEWORK=y
> +CONFIG_SYS_FSL_CLK=y
> +CONFIG_SYS_EXTRA_OPTIONS="RAMBOOT_PBL,SPL_FSL_PBL,SD_BOOT,SD_BOOT_QSPI"
> +CONFIG_SD_BOOT=y
> +CONFIG_BOOTDELAY=3
> +CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_USE_SECTOR=y
> +CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR=0xe8
> +CONFIG_HUSH_PARSER=y
> +CONFIG_CMD_GREPENV=y
> +CONFIG_CMD_MEMINFO=y
> +CONFIG_CMD_GPT=y
> +CONFIG_CMD_FAT=y
> +CONFIG_CMD_MMC=y
> +CONFIG_FSL_ESDHC=y
> +CONFIG_CMD_SF=y
> +CONFIG_OF_CONTROL=y
> +CONFIG_ENV_IS_IN_MMC=y
> +CONFIG_DM=y
> +CONFIG_FSL_CAAM=y
> +CONFIG_SPI=y
> +CONFIG_SPI_FLASH=y
> +CONFIG_SPI_FLASH_ATMEL=y
> +CONFIG_SPI_FLASH_STMICRO=y
> +CONFIG_SPI_FLASH_BAR=y
> +CONFIG_SPI_FLASH_SPANSION=y
> +CONFIG_NETDEVICES=y
> +CONFIG_DM_ETH=y
> +CONFIG_TSEC_ENET=y
> +CONFIG_MII=y
> +CONFIG_SYS_NS16550=y
> +CONFIG_DM_SPI=y
> +CONFIG_DM_SPI_FLASH=y
> +CONFIG_SPI_FLASH_DATAFLASH=y
> +CONFIG_FSL_DSPI=y
> +CONFIG_FSL_QSPI=y
> +CONFIG_PCI=y
> +CONFIG_CMD_PCI=y
> +CONFIG_DM_PCI=y
> +CONFIG_DM_PCI_COMPAT=y
> +CONFIG_USB=y
> +CONFIG_DM_USB=y
> +CONFIG_CMD_USB=y
> +CONFIG_USB_XHCI_HCD=y
> +CONFIG_USB_XHCI_FSL=y
> +CONFIG_USB_XHCI_DWC3=y
> +CONFIG_HAS_FSL_XHCI_USB=y
> +CONFIG_USB_STORAGE=y
> +CONFIG_CMD_EXT2=y
> +CONFIG_PCIE_LAYERSCAPE=y
> +CONFIG_PHYLIB=y
> +CONFIG_PHY_GIGE=y
> +CONFIG_PHY_ATHEROS=y
> +CONFIG_PHY_BROADCOM=y
> +CONFIG_PHY_FIXED=y
> +CONFIG_CMD_PING=y
> +CONFIG_CMD_DHCP=y
> +CONFIG_CMD_MII=y
> +CONFIG_CMDLINE_TAG=y
> +CONFIG_CMDLINE_EDITING=y
> +CONFIG_AUTO_COMPLETE=y
> +CONFIG_NR_DRAM_BANKS=1
> +CONFIG_CMD_BOOTZ=y
> +CONFIG_SYS_LONGHELP=y
> +CONFIG_FIT=y
> +CONFIG_SPL_MMC_SUPPORT=y
> +CONFIG_SPL_SERIAL_SUPPORT=y
> +CONFIG_SPL_I2C_SUPPORT=y
> +CONFIG_SPL_ENV_SUPPORT=y
> +CONFIG_SPL_LIBCOMMON_SUPPORT=y
> +CONFIG_CMD_DM=y
> +CONFIG_AHCI=y
> +CONFIG_CMD_I2C=y
> +CONFIG_BLK=y
> +CONFIG_DM_MMC=y
> +CONFIG_CMD_PART=y
> +CONFIG_CMD_FS_GENERIC=y
> +CONFIG_CMD_FS_UUID=y
> +CONFIG_DISTRO_DEFAULTS=y
> diff --git a/include/configs/ls1021atsn.h b/include/configs/ls1021atsn.h
> new file mode 100644
> index 000000000000..c8ec414afd39
> --- /dev/null
> +++ b/include/configs/ls1021atsn.h
> @@ -0,0 +1,346 @@
> +/* SPDX-License-Identifier: GPL-2.0
> + * Copyright 2016-2018 NXP Semiconductors
> + * Copyright 2019 Vladimir Oltean <olteanv@gmail.com>
> + */
> +
> +#ifndef __CONFIG_H
> +#define __CONFIG_H
> +
> +#define CONFIG_ARMV7_SECURE_BASE       OCRAM_BASE_S_ADDR
> +
> +#define CONFIG_SYS_FSL_CLK
> +
> +#define CONFIG_DEEP_SLEEP
> +#ifdef CONFIG_DEEP_SLEEP
> +#define CONFIG_SILENT_CONSOLE
> +#endif
> +
> +/*
> + * Size of malloc() pool
> + */
> +#define CONFIG_SYS_MALLOC_LEN          (CONFIG_ENV_SIZE + 16 * 1024 * 1024)
> +
> +#define CONFIG_SYS_INIT_RAM_ADDR       OCRAM_BASE_ADDR
> +#define CONFIG_SYS_INIT_RAM_SIZE       OCRAM_SIZE
> +
> +/* XHCI Support - enabled by default */
> +#define CONFIG_USB_MAX_CONTROLLER_COUNT        1
> +
> +#define CONFIG_SYS_CLK_FREQ            100000000
> +#define CONFIG_DDR_CLK_FREQ            100000000
> +
> +#define DDR_SDRAM_CFG                  0x470c0008
> +#define DDR_CS0_BNDS                   0x008000bf
> +#define DDR_CS0_CONFIG                 0x80014302
> +#define DDR_TIMING_CFG_0               0x50550004
> +#define DDR_TIMING_CFG_1               0xbcb38c56
> +#define DDR_TIMING_CFG_2               0x0040d120
> +#define DDR_TIMING_CFG_3               0x010e1000
> +#define DDR_TIMING_CFG_4               0x00000001
> +#define DDR_TIMING_CFG_5               0x03401400
> +#define DDR_SDRAM_CFG_2                        0x00401010
> +#define DDR_SDRAM_MODE                 0x00061c60
> +#define DDR_SDRAM_MODE_2               0x00180000
> +#define DDR_SDRAM_INTERVAL             0x18600618
> +#define DDR_DDR_WRLVL_CNTL             0x8655f605
> +#define DDR_DDR_WRLVL_CNTL_2           0x05060607
> +#define DDR_DDR_WRLVL_CNTL_3           0x05050505
> +#define DDR_DDR_CDR1                   0x80040000
> +#define DDR_DDR_CDR2                   0x00000001
> +#define DDR_SDRAM_CLK_CNTL             0x02000000
> +#define DDR_DDR_ZQ_CNTL                        0x89080600
> +#define DDR_CS0_CONFIG_2               0
> +#define DDR_SDRAM_CFG_MEM_EN           0x80000000
> +#define SDRAM_CFG2_D_INIT              0x00000010
> +#define DDR_CDR2_VREF_TRAIN_EN         0x00000080
> +#define SDRAM_CFG2_FRC_SR              0x80000000
> +#define SDRAM_CFG_BI                   0x00000001
> +
> +#define CONFIG_CHIP_SELECTS_PER_CTRL   4
> +
> +#ifdef CONFIG_RAMBOOT_PBL
> +#define CONFIG_SYS_FSL_PBL_PBI \
> +       "board/freescale/ls1021atsn/ls102xa_pbi.cfg"
> +#endif
> +
> +#ifdef CONFIG_SD_BOOT
> +#ifdef CONFIG_SD_BOOT_QSPI
> +#define CONFIG_SYS_FSL_PBL_RCW \
> +       "board/freescale/ls1021atsn/ls102xa_rcw_sd_qspi.cfg"
> +#else
> +#define CONFIG_SYS_FSL_PBL_RCW \
> +       "board/freescale/ls1021atsn/ls102xa_rcw_sd_ifc.cfg"
> +#endif
> +#define CONFIG_SPL_LDSCRIPT    "arch/$(ARCH)/cpu/u-boot-spl.lds"
> +#define CONFIG_SPL_LIBGENERIC_SUPPORT
> +#define CONFIG_SPL_MPC8XXX_INIT_DDR_SUPPORT
> +#define CONFIG_SPL_WATCHDOG_SUPPORT
> +#define CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR        0xe8
> +
> +#ifdef CONFIG_SECURE_BOOT
> +#define CONFIG_U_BOOT_HDR_SIZE         (16 << 10)
> +#endif /* ifdef CONFIG_SECURE_BOOT */
> +
> +#define CONFIG_SPL_MAX_SIZE            0x1a000
> +#define CONFIG_SPL_STACK               0x1001d000
> +#define CONFIG_SPL_PAD_TO              0x1c000
> +
> +#define CONFIG_SYS_SPL_MALLOC_START    (CONFIG_SYS_TEXT_BASE + \
> +               CONFIG_SYS_MONITOR_LEN)
> +#define CONFIG_SYS_SPL_MALLOC_SIZE     0x100000
> +#define CONFIG_SPL_BSS_START_ADDR      0x80100000
> +#define CONFIG_SPL_BSS_MAX_SIZE                0x80000
> +
> +#ifdef CONFIG_U_BOOT_HDR_SIZE
> +/*
> + * HDR would be appended at end of image and copied to DDR along
> + * with U-Boot image. Here u-boot max. size is 512K. So if binary

U-Boot (second one).

> + * size increases then increase this size in case of secure boot as
> + * it uses raw u-boot image instead of fit image.

U-Boot

> + */
> +#define CONFIG_SYS_MONITOR_LEN         (0x80000 + CONFIG_U_BOOT_HDR_SIZE)
> +#else
> +#define CONFIG_SYS_MONITOR_LEN         0x80000
> +#endif /* ifdef CONFIG_U_BOOT_HDR_SIZE */
> +#endif
> +
> +#define CONFIG_NR_DRAM_BANKS           1
> +#define PHYS_SDRAM                     0x80000000
> +#define PHYS_SDRAM_SIZE                        (1u * 1024 * 1024 * 1024)
> +
> +#define CONFIG_SYS_DDR_SDRAM_BASE      0x80000000UL
> +#define CONFIG_SYS_SDRAM_BASE          CONFIG_SYS_DDR_SDRAM_BASE
> +
> +#define CONFIG_CHIP_SELECTS_PER_CTRL   4
> +
> +#if !defined(CONFIG_SD_BOOT) && !defined(CONFIG_NAND_BOOT) && \
> +       !defined(CONFIG_QSPI_BOOT)
> +#define CONFIG_U_QE
> +#endif
> +
> +/*
> + * IFC Definitions
> + */
> +#if !defined(CONFIG_QSPI_BOOT) && !defined(CONFIG_SD_BOOT_QSPI)
> +#define CONFIG_FSL_IFC
> +#endif
> +
> +/* CPLD */
> +#define CONFIG_SYS_CPLD_BASE           0x7fb00000
> +#define CPLD_BASE_PHYS                 CONFIG_SYS_CPLD_BASE
> +
> +#define CONFIG_SYS_FPGA_CSPR_EXT        (0x0)
> +#define CONFIG_SYS_FPGA_CSPR           (CSPR_PHYS_ADDR(CPLD_BASE_PHYS) | \
> +                                       CSPR_PORT_SIZE_8 | \
> +                                       CSPR_MSEL_GPCM | \
> +                                       CSPR_V)
> +#define CONFIG_SYS_FPGA_AMASK          IFC_AMASK(64 * 1024)
> +#define CONFIG_SYS_FPGA_CSOR           (CSOR_NOR_ADM_SHIFT(4) | \
> +                                       CSOR_NOR_NOR_MODE_AVD_NOR | \
> +                                       CSOR_NOR_TRHZ_80)
> +
> +/* CPLD Timing parameters for IFC GPCM */
> +#define CONFIG_SYS_FPGA_FTIM0          (FTIM0_GPCM_TACSE(0xf) | \
> +                                       FTIM0_GPCM_TEADC(0xf) | \
> +                                       FTIM0_GPCM_TEAHC(0xf))
> +#define CONFIG_SYS_FPGA_FTIM1          (FTIM1_GPCM_TACO(0xff) | \
> +                                       FTIM1_GPCM_TRAD(0x3f))
> +#define CONFIG_SYS_FPGA_FTIM2          (FTIM2_GPCM_TCS(0xf) | \
> +                                       FTIM2_GPCM_TCH(0xf) | \
> +                                       FTIM2_GPCM_TWP(0xff))
> +#define CONFIG_SYS_FPGA_FTIM3           0x0
> +#define CONFIG_SYS_CSPR0_EXT           CONFIG_SYS_FPGA_CSPR_EXT
> +#define CONFIG_SYS_CSPR0               CONFIG_SYS_FPGA_CSPR
> +#define CONFIG_SYS_AMASK0              CONFIG_SYS_FPGA_AMASK
> +#define CONFIG_SYS_CSOR0               CONFIG_SYS_FPGA_CSOR
> +#define CONFIG_SYS_CS0_FTIM0           CONFIG_SYS_FPGA_FTIM0
> +#define CONFIG_SYS_CS0_FTIM1           CONFIG_SYS_FPGA_FTIM1
> +#define CONFIG_SYS_CS0_FTIM2           CONFIG_SYS_FPGA_FTIM2
> +#define CONFIG_SYS_CS0_FTIM3           CONFIG_SYS_FPGA_FTIM3
> +
> +/*
> + * Serial Port
> + */
> +#define CONFIG_CONS_INDEX              1
> +#define CONFIG_SYS_NS16550_SERIAL
> +#ifndef CONFIG_DM_SERIAL
> +#define CONFIG_SYS_NS16550_REG_SIZE    1
> +#endif
> +#define CONFIG_SYS_NS16550_CLK         get_serial_clock()
> +
> +#define CONFIG_BAUDRATE                        115200
> +
> +/*
> + * I2C
> + */
> +#define CONFIG_SYS_I2C
> +#define CONFIG_SYS_I2C_MXC
> +#define CONFIG_SYS_I2C_MXC_I2C1                /* enable I2C bus 1 */
> +#define CONFIG_SYS_I2C_MXC_I2C2                /* enable I2C bus 2 */
> +#define CONFIG_SYS_I2C_MXC_I2C3                /* enable I2C bus 3 */
> +
> +/* EEPROM */
> +#define CONFIG_ID_EEPROM
> +#define CONFIG_SYS_I2C_EEPROM_NXID
> +#define CONFIG_SYS_EEPROM_BUS_NUM      0
> +#define CONFIG_SYS_I2C_EEPROM_ADDR     0x51
> +#define CONFIG_SYS_I2C_EEPROM_ADDR_LEN 2
> +
> +/* SPI */
> +#if defined(CONFIG_QSPI_BOOT) || defined(CONFIG_SD_BOOT_QSPI)
> +/* QSPI */
> +#define FSL_QSPI_FLASH_SIZE            (1 << 24)
> +#define FSL_QSPI_FLASH_NUM             2
> +/* DSPI */
> +#endif
> +
> +#ifdef CONFIG_TSEC_ENET
> +#define CONFIG_ETHPRIME                        "ethernet@2d10000"

Where does this name come from? Is this not the first mac, i.e. would
you get this without the explicit setting ethprime?

> +#endif
> +
> +/* PCIe */
> +#define CONFIG_PCIE1                   /* PCIE controller 1 */
> +#define CONFIG_PCIE2                   /* PCIE controller 2 */
> +#define FSL_PCIE_COMPAT                        "fsl,ls1021a-pcie"
> +#ifdef CONFIG_PCI
> +#define CONFIG_PCI_SCAN_SHOW
> +#endif
> +
> +#define CONFIG_PEN_ADDR_BIG_ENDIAN
> +#define CONFIG_LAYERSCAPE_NS_ACCESS
> +#define CONFIG_SMP_PEN_ADDR            0x01ee0200
> +#define COUNTER_FREQUENCY              12500000
> +
> +#define CONFIG_HWCONFIG
> +#define HWCONFIG_BUFFER_SIZE           256
> +
> +#define CONFIG_FSL_DEVICE_DISABLE
> +
> +#define BOOT_TARGET_DEVICES(func) \
> +       func(MMC, mmc, 0) \
> +       func(USB, usb, 0) \
> +       func(DHCP, dhcp, na)
> +#include <config_distro_bootcmd.h>
> +
> +#define CONFIG_EXTRA_ENV_SETTINGS                                      \
> +       "bootargs=root=/dev/ram0 rw console=ttyS0,115200\0"             \
> +       "initrd_high=0xffffffff\0"                                      \
> +       "fdt_high=0xffffffff\0"                                         \
> +       "fdt_addr=0x64f00000\0"                                         \
> +       "kernel_addr=0x61000000\0"                                      \
> +       "kernelheader_addr=0x60800000\0"                                \
> +       "scriptaddr=0x80000000\0"                                       \
> +       "scripthdraddr=0x80080000\0"                                    \
> +       "fdtheader_addr_r=0x80100000\0"                                 \
> +       "kernelheader_addr_r=0x80200000\0"                              \
> +       "kernel_addr_r=0x80008000\0"                                    \
> +       "kernelheader_size=0x40000\0"                                   \
> +       "fdt_addr_r=0x8f000000\0"                                       \
> +       "ramdisk_addr_r=0xa0000000\0"                                   \
> +       "load_addr=0x80008000\0"                                        \
> +       "kernel_size=0x2800000\0"                                       \
> +       "kernel_addr_sd=0x8000\0"                                       \
> +       "kernel_size_sd=0x14000\0"                                      \
> +       "kernelhdr_addr_sd=0x4000\0"                                    \
> +       "kernelhdr_size_sd=0x10\0"                                      \
> +       BOOTENV                                                         \
> +       "boot_scripts=ls1021atsn_boot.scr\0"                            \
> +       "boot_script_hdr=hdr_ls1021atsn_bs.out\0"                       \
> +               "scan_dev_for_boot_part="                               \
> +                       "part list ${devtype} ${devnum} devplist; "     \
> +                       "env exists devplist || setenv devplist 1; "    \
> +                       "for distro_bootpart in ${devplist}; do "       \
> +                       "if fstype ${devtype} "                         \
> +                               "${devnum}:${distro_bootpart} "         \
> +                               "bootfstype; then "                     \
> +                               "run scan_dev_for_boot; "               \
> +                       "fi; "                                          \
> +               "done\0"                                                \
> +       "scan_dev_for_boot="                                            \
> +               "echo Scanning ${devtype} "                             \
> +                               "${devnum}:${distro_bootpart}...; "     \
> +               "for prefix in ${boot_prefixes}; do "                   \
> +                       "run scan_dev_for_scripts; "                    \
> +                       "run scan_dev_for_extlinux; "                   \
> +               "done;"                                                 \
> +               "\0"                                                    \
> +       "boot_a_script="                                                \
> +               "load ${devtype} ${devnum}:${distro_bootpart} "         \
> +                       "${scriptaddr} ${prefix}${script}; "            \
> +               "env exists secureboot && load ${devtype} "             \
> +                       "${devnum}:${distro_bootpart} "                 \
> +                       "${scripthdraddr} ${prefix}${boot_script_hdr} " \
> +                       "&& esbc_validate ${scripthdraddr};"            \
> +               "source ${scriptaddr}\0"                                \
> +       "qspi_bootcmd=echo Trying load from qspi..;"                    \
> +               "sf probe && sf read $load_addr "                       \
> +               "$kernel_addr $kernel_size; env exists secureboot "     \
> +               "&& sf read $kernelheader_addr_r $kernelheader_addr "   \
> +               "$kernelheader_size && esbc_validate ${kernelheader_addr_r}; " \
> +               "bootm $load_addr#$board\0"                             \
> +       "sd_bootcmd=echo Trying load from SD ..;"                       \
> +               "mmcinfo && mmc read $load_addr "                       \
> +               "$kernel_addr_sd $kernel_size_sd && "                   \
> +               "env exists secureboot && mmc read $kernelheader_addr_r " \
> +               "$kernelhdr_addr_sd $kernelhdr_size_sd "                \
> +               " && esbc_validate ${kernelheader_addr_r};"             \
> +               "bootm $load_addr#$board\0"
> +
> +#undef CONFIG_BOOTCOMMAND
> +#if defined(CONFIG_QSPI_BOOT) || defined(CONFIG_SD_BOOT_QSPI)
> +#define CONFIG_BOOTCOMMAND "run distro_bootcmd; run qspi_bootcmd; "    \
> +                          "env exists secureboot && esbc_halt"
> +#elif defined(CONFIG_SD_BOOT)
> +#define CONFIG_BOOTCOMMAND "run distro_bootcmd; run sd_bootcmd; "      \
> +                          "env exists secureboot && esbc_halt;"
> +#endif
> +
> +/*
> + * Miscellaneous configurable options
> + */
> +#define CONFIG_SYS_CBSIZE              256     /* Console I/O Buffer Size */
> +#define CONFIG_SYS_PBSIZE              \
> +               (CONFIG_SYS_CBSIZE + sizeof(CONFIG_SYS_PROMPT) + 16)
> +#define CONFIG_SYS_MAXARGS             16      /* max number of command args */
> +#define CONFIG_SYS_BARGSIZE            CONFIG_SYS_CBSIZE
> +
> +#define CONFIG_SYS_LOAD_ADDR           0x82000000
> +
> +#define CONFIG_LS102XA_STREAM_ID
> +
> +#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)
> +
> +#ifdef CONFIG_SPL_BUILD
> +#define CONFIG_SYS_MONITOR_BASE CONFIG_SPL_TEXT_BASE
> +#else
> +#define CONFIG_SYS_MONITOR_BASE CONFIG_SYS_TEXT_BASE    /* start of monitor */
> +#endif
> +
> +#define CONFIG_SYS_QE_FW_ADDR          0x67f40000
> +
> +/*
> + * Environment
> + */
> +#define CONFIG_ENV_OVERWRITE
> +
> +#if defined(CONFIG_SD_BOOT)
> +#define CONFIG_ENV_OFFSET              0x300000
> +#define CONFIG_SYS_MMC_ENV_DEV         0
> +#define CONFIG_ENV_SIZE                        0x20000
> +#elif defined(CONFIG_QSPI_BOOT)
> +#define CONFIG_ENV_SIZE                        0x2000
> +#define CONFIG_ENV_OFFSET              0x300000
> +#define CONFIG_ENV_SECT_SIZE           0x40000
> +#endif
> +
> +#define CONFIG_OF_BOARD_SETUP
> +#define CONFIG_OF_STDOUT_VIA_ALIAS
> +#define CONFIG_MISC_INIT_R
> +
> +#include <asm/fsl_secure_boot.h>
> +#define CONFIG_SYS_BOOTM_LEN 0x8000000 /* 128 MB */
> +
> +#endif
> --
> 2.17.1
>
> _______________________________________________
> U-Boot mailing list
> U-Boot@lists.denx.de
> https://lists.denx.de/listinfo/u-boot
Vladimir Oltean July 15, 2019, 9:56 p.m. UTC | #7
Hi Joe,

On Mon, 15 Jul 2019 at 22:17, Joe Hershberger <joe.hershberger@ni.com> wrote:
>
> On Sun, Jun 23, 2019 at 12:53 PM Vladimir Oltean <olteanv@gmail.com> wrote:
> >
> > From: Jianchao Wang <jianchao.wang@nxp.com>
> >
> > The LS1021A-TSN is a development board built by VVDN/Argonboards in
> > partnership with NXP.
> >
> > It features the LS1021A SoC and the first-generation SJA1105T Ethernet
> > switch for prototyping implementations of a subset of IEEE 802.1 TSN
> > standards.
> >
> > Supported boot media: microSD card (via SPL), QSPI flash.
> >
> > Rev. A of the board uses a Spansion S25FL512S_256K serial flash, which
> > is 64 MB in size and has an erase sector size of 256KB (therefore,
> > flashing the RCW would erase part of U-boot).
> >
> > Rev. B and C of the board use a Spansion S25FL256S1 serial flash, which
> > is only 32 MB in size but has an erase sector size of 64KB (therefore
> > the RCW image can be flashed without erasing U-boot).
> >
> > To avoid the problems above, the U-boot base address has been selected
> > at 0x100000 (the start of the 5th 256KB erase sector), which works for
> > all board revisions. Actually 0x40000 would have been enough, but
> > 0x100000 is common for all Layerscape devices.
> >
> > eTSEC3 is connecting directly to SJA1105 via an RGMII fixed-link, but
> > SJA1105 is currently not supported by uboot. Therefore, eTSEC3 is
> > disabled.
> >
> > Signed-off-by: Xiaoliang Yang <xiaoliang.yang@nxp.com>
> > Signed-off-by: Mingkai Hu <mingkai.hu@nxp.com>
> > Signed-off-by: Jianchao Wang <jianchao.wang@nxp.com>
> > Signed-off-by: Changming Huang <jerry.huang@nxp.com>
> >
> > [Vladimir] Code taken from https://github.com/openil/u-boot (which
> > itself is mostly copied from ls1021a-iot) and adapted with the following
> > changes:
> >
> > - Add a008850 errata workaround
> > - Converted eTSEC, MMC to DM to avoid all build warnings
> > - Plugged in distro boot feature, including support for extlinux.conf
> > - Added defconfig for QSPI boot
> > - Added the board/freescale/ls1021atsn/README.rst for initial setup
> >
> > Signed-off-by: Vladimir Oltean <olteanv@gmail.com>
> > ---
> >  arch/arm/Kconfig                              |  14 +
> >  arch/arm/dts/Makefile                         |   2 +-
> >  arch/arm/dts/ls1021a-tsn.dts                  |  77 ++++
> >  board/freescale/ls1021atsn/Kconfig            |  18 +
> >  board/freescale/ls1021atsn/MAINTAINERS        |   8 +
> >  board/freescale/ls1021atsn/Makefile           |   3 +
> >  board/freescale/ls1021atsn/README.rst         |  96 +++++
> >  board/freescale/ls1021atsn/ls1021atsn.c       | 291 +++++++++++++++
> >  board/freescale/ls1021atsn/ls102xa_pbi.cfg    |  15 +
> >  board/freescale/ls1021atsn/ls102xa_rcw_sd.cfg |   8 +
> >  configs/ls1021atsn_qspi_defconfig             |  76 ++++
> >  configs/ls1021atsn_sdcard_defconfig           |  85 +++++
> >  include/configs/ls1021atsn.h                  | 346 ++++++++++++++++++
> >  13 files changed, 1038 insertions(+), 1 deletion(-)
> >  create mode 100644 arch/arm/dts/ls1021a-tsn.dts
> >  create mode 100644 board/freescale/ls1021atsn/Kconfig
> >  create mode 100644 board/freescale/ls1021atsn/MAINTAINERS
> >  create mode 100644 board/freescale/ls1021atsn/Makefile
> >  create mode 100644 board/freescale/ls1021atsn/README.rst
> >  create mode 100644 board/freescale/ls1021atsn/ls1021atsn.c
> >  create mode 100644 board/freescale/ls1021atsn/ls102xa_pbi.cfg
> >  create mode 100644 board/freescale/ls1021atsn/ls102xa_rcw_sd.cfg
> >  create mode 100644 configs/ls1021atsn_qspi_defconfig
> >  create mode 100644 configs/ls1021atsn_sdcard_defconfig
> >  create mode 100644 include/configs/ls1021atsn.h
> >
> > diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
> > index 01ff57cf1bec..5edac7ea2bd5 100644
> > --- a/arch/arm/Kconfig
> > +++ b/arch/arm/Kconfig
> > @@ -1327,6 +1327,19 @@ config TARGET_LS1021ATWR
> >         select SUPPORT_SPL
> >         imply SCSI
> >
> > +config TARGET_LS1021ATSN
> > +       bool "Support ls1021atsn"
> > +       select ARCH_LS1021A
> > +       select ARCH_SUPPORT_PSCI
> > +       select BOARD_EARLY_INIT_F
> > +       select BOARD_LATE_INIT
> > +       select CPU_V7A
> > +       select CPU_V7_HAS_NONSEC
> > +       select CPU_V7_HAS_VIRT
> > +       select LS1_DEEP_SLEEP
> > +       select SUPPORT_SPL
> > +       imply SCSI
> > +
> >  config TARGET_LS1021AIOT
> >         bool "Support ls1021aiot"
> >         select ARCH_LS1021A
> > @@ -1693,6 +1706,7 @@ source "board/freescale/ls1028a/Kconfig"
> >  source "board/freescale/ls1021aqds/Kconfig"
> >  source "board/freescale/ls1043aqds/Kconfig"
> >  source "board/freescale/ls1021atwr/Kconfig"
> > +source "board/freescale/ls1021atsn/Kconfig"
> >  source "board/freescale/ls1021aiot/Kconfig"
> >  source "board/freescale/ls1046aqds/Kconfig"
> >  source "board/freescale/ls1043ardb/Kconfig"
> > diff --git a/arch/arm/dts/Makefile b/arch/arm/dts/Makefile
> > index 528fb909d5b0..28590b0c5530 100644
> > --- a/arch/arm/dts/Makefile
> > +++ b/arch/arm/dts/Makefile
> > @@ -325,7 +325,7 @@ dtb-$(CONFIG_TARGET_STV0991) += stv0991.dtb
> >  dtb-$(CONFIG_ARCH_LS1021A) += ls1021a-qds-duart.dtb \
> >         ls1021a-qds-lpuart.dtb \
> >         ls1021a-twr-duart.dtb ls1021a-twr-lpuart.dtb \
> > -       ls1021a-iot-duart.dtb
> > +       ls1021a-iot-duart.dtb ls1021a-tsn.dtb
> >  dtb-$(CONFIG_FSL_LSCH3) += fsl-ls2080a-qds.dtb \
> >         fsl-ls2080a-rdb.dtb \
> >         fsl-ls2081a-rdb.dtb \
> > diff --git a/arch/arm/dts/ls1021a-tsn.dts b/arch/arm/dts/ls1021a-tsn.dts
> > new file mode 100644
> > index 000000000000..f633074099dc
> > --- /dev/null
> > +++ b/arch/arm/dts/ls1021a-tsn.dts
> > @@ -0,0 +1,77 @@
> > +// SPDX-License-Identifier: GPL-2.0
> > +/* Copyright 2016-2018 NXP Semiconductors
> > + * Copyright 2019 Vladimir Oltean <olteanv@gmail.com>
> > + */
> > +
> > +/dts-v1/;
> > +#include "ls1021a.dtsi"
> > +
> > +/ {
> > +       model = "NXP LS1021A-TSN Board";
> > +
> > +       aliases {
> > +               enet0-sgmii-phy = &sgmii_phy2;
> > +               enet1-sgmii-phy = &sgmii_phy1;
> > +               spi0 = &qspi;
> > +               spi1 = &dspi1;
> > +       };
> > +};
> > +
> > +&enet0 {
> > +       tbi-handle = <&tbi0>;
> > +       phy-handle = <&sgmii_phy2>;
> > +       phy-mode = "sgmii";
> > +       status = "okay";
> > +};
> > +
> > +&enet1 {
> > +       tbi-handle = <&tbi1>;
> > +       phy-handle = <&sgmii_phy1>;
> > +       phy-mode = "sgmii";
> > +       status = "okay";
> > +};
> > +
> > +&i2c0 {
> > +       status = "okay";
> > +};
> > +
> > +&mdio0 {
> > +       /* AR8031 */
> > +       sgmii_phy1: ethernet-phy@1 {
> > +               reg = <0x1>;
> > +       };
> > +
> > +       /* AR8031 */
> > +       sgmii_phy2: ethernet-phy@2 {
> > +               reg = <0x2>;
> > +       };
> > +
> > +       /* SGMII PCS for enet0 */
> > +       tbi0: tbi-phy@1f {
> > +               reg = <0x1f>;
> > +               device_type = "tbi-phy";
> > +       };
> > +};
> > +
> > +&mdio1 {
> > +       /* SGMII PCS for enet1 */
> > +       tbi1: tbi-phy@1f {
> > +               reg = <0x1f>;
> > +               device_type = "tbi-phy";
> > +       };
> > +};
> > +
> > +&qspi {
> > +       bus-num = <0>;
> > +       status = "okay";
> > +
> > +       flash@0 {
> > +               compatible = "spi-flash";
> > +               spi-max-frequency = <20000000>;
> > +               reg = <0>;
> > +       };
> > +};
> > +
> > +&uart0 {
> > +       status = "okay";
> > +};
> > diff --git a/board/freescale/ls1021atsn/Kconfig b/board/freescale/ls1021atsn/Kconfig
> > new file mode 100644
> > index 000000000000..d999fa469002
> > --- /dev/null
> > +++ b/board/freescale/ls1021atsn/Kconfig
> > @@ -0,0 +1,18 @@
> > +# SPDX-License-Identifier: GPL-2.0
> > +if TARGET_LS1021ATSN
> > +
> > +config SYS_BOARD
> > +       default "ls1021atsn"
> > +
> > +config SYS_VENDOR
> > +       default "freescale"
> > +
> > +config SYS_SOC
> > +       default "ls102xa"
> > +
> > +config SYS_CONFIG_NAME
> > +       default "ls1021atsn"
> > +
> > +source "board/freescale/common/Kconfig"
> > +
> > +endif
> > diff --git a/board/freescale/ls1021atsn/MAINTAINERS b/board/freescale/ls1021atsn/MAINTAINERS
> > new file mode 100644
> > index 000000000000..560bb615d2fe
> > --- /dev/null
> > +++ b/board/freescale/ls1021atsn/MAINTAINERS
> > @@ -0,0 +1,8 @@
> > +NXP LS1021A-TSN Board
> > +M:     Vladimir Oltean <olteanv@gmail.com>
> > +S:     Maintained
> > +F:     arch/arm/dts/ls1021a-tsn.dts
> > +F:     board/freescale/ls1021atsn/
> > +F:     include/configs/ls1021atsn.h
> > +F:     configs/ls1021atsn_qspi_defconfig
> > +F:     configs/ls1021atsn_sdcard_defconfig
> > diff --git a/board/freescale/ls1021atsn/Makefile b/board/freescale/ls1021atsn/Makefile
> > new file mode 100644
> > index 000000000000..b4808f05e8e0
> > --- /dev/null
> > +++ b/board/freescale/ls1021atsn/Makefile
> > @@ -0,0 +1,3 @@
> > +# SPDX-License-Identifier: GPL-2.0
> > +obj-y += ls1021atsn.o
> > +obj-$(CONFIG_ARMV7_PSCI) += ../ls1021atwr/psci.o
> > diff --git a/board/freescale/ls1021atsn/README.rst b/board/freescale/ls1021atsn/README.rst
> > new file mode 100644
> > index 000000000000..e986f460c4d4
> > --- /dev/null
> > +++ b/board/freescale/ls1021atsn/README.rst
> > @@ -0,0 +1,96 @@
> > +.. SPDX-License-Identifier: GPL-2.0
> > +
> > +LS1021A-TSN Board Overview
> > +==========================
> > +
> > + - 1GB DDR3 at 800 MHz
> > + - Spansion/Cypress 64 MB (Rev. A) / 32 MB (Rev. B and C) QSPI NOR flash
> > + - Ethernet
> > +     - 2 SGMII 10/100/1G Ethernet ports (Atheros AR8031)
> > +     - One SJA1105T switch with 4 Ethernet ports (Broadcom BCM5464R)
> > +     - One internal RGMII port connected to the switch
> > + - SDHC
> > +     - microSDHC/SDXC connector
> > + - Other I/O
> > +    - One Serial port
> > +    - Arduino and expansion headers
> > +    - mPCIE slot
> > +    - SATA port
> > +    - USB3.0 port
> > +
> > +LS1021A Memory map
> > +==================
> > +
> > +The addresses in brackets are physical addresses.
> > +
> > +==============  ==============  ==============================  =======
> > +Start Address   End Address     Description                     Size
> > +==============  ==============  ==============================  =======
> > +0x00_0000_0000  0x00_000F_FFFF  Secure Boot ROM                 1MB
> > +0x00_0100_0000  0x00_0FFF_FFFF  CCSRBAR                         240MB
> > +0x00_1000_0000  0x00_1000_FFFF  OCRAM0                          64KB
> > +0x00_1001_0000  0x00_1001_FFFF  OCRAM1                          64KB
> > +0x00_2000_0000  0x00_20FF_FFFF  DCSR                            16MB
> > +0x00_4000_0000  0x00_5FFF_FFFF  QSPI                            512MB
> > +0x00_6000_0000  0x00_67FF_FFFF  IFC - NOR Flash                 128MB
> > +0x00_8000_0000  0x00_FFFF_FFFF  DRAM1                           2GB
> > +==============  ==============  ==============================  =======
> > +
> > +Compiling and flashing
> > +======================
> > +
> > +The LS1021A-TSN board comes along with a microSD card with OpenIL U-boot.
> > +That will be used to update the internal QSPI flash, as well as
> > +
> > +To compile and flash an SD card image::
> > +
> > +  make ls1021atsn_sdcard_defconfig && make -j 8 && sudo cp u-boot-with-spl-pbl.bin /srv/tftpboot/
> > +  => tftp 0x82000000 u-boot-with-spl-pbl.bin && mmc rescan && mmc erase 8 0x1100 && mmc write 0x82000000 8 0x1100
> > +
> > +For the QSPI flash, first obtain the Reset Configuration Word binary for
> > +bootimg from the QSPI flash from the rcw project
> > +(https://source.codeaurora.org/external/qoriq/qoriq-components/rcw)::
> > +
> > +  make -j 8 && sudo cp ls1021atsn/SSR_PNS_30/rcw_1200_qspiboot.bin.swapped /srv/tftpboot/
> > +
> > +The above RCW binary takes care of swapping the QSPI AMBA memory, so that the
> > +U-boot binary does not need to be swapped when flashing it.
> > +
> > +To compile and flash a U-boot image for QSPI::
> > +
> > +  make ls1021atsn_qspi_defconfig && make -j 8 && sudo cp u-boot.bin /srv/tftpboot/
> > +
> > +Then optionally create a custom uboot-env.txt file (although the default
> > +environment already supports distro boot) and convert it to binary format::
> > +
> > +  mkenvimage -s 2M -o /srv/tftpboot/uboot-env.bin uboot-env.txt
> > +
> > +To program the QSPI flash with the images::
> > +
> > +  => tftp 0x82000000 rcw_1000_qspiboot.bin.swapped && sf probe && sf erase 0x0 +${filesize} && sf write 0x82000000 0x0 ${filesize}
> > +  => tftp 0x82000000 u-boot.bin && sf probe && sf erase 0x100000 +${filesize} && sf write 0x82000000 0x100000 ${filesize}
> > +  => tftp 0x82000000 uboot-env.bin && sf probe && sf erase 0x400000 +${filesize} && sf write 0x82000000 0x400000 ${filesize}
> > +
> > +The boards contain an AT24 I2C EEPROM that is supposed to hold the MAC
> > +addresses of the Ethernet interfaces, however the EEPROM comes blank out of
> > +the factory, and the MAC addresses are printed on a label on the bottom of
> > +the boards.
> > +
> > +To write the MAC addresses to the EEPROM, the following needs to be done once::
> > +
> > +  => mac id
> > +  => mac 0 00:1F:7B:xx:xx:xx
> > +  => mac 1 00:1F:7B:xx:xx:xx
> > +  => mac 2 00:1F:7B:xx:xx:xx
> > +  => mac save
> > +
> > +The switch ports do not have their own MAC address - they inherit it from the
> > +master enet2 port.
> > +
> > +Known issues and limitations
> > +============================
> > +
> > +- The 4 SJA1105 switch ports are not functional in U-boot for now.
> > +- Since the IFC pins are multiplexed with QSPI on LS1021A, currently there is
> > +  no way to talk to the CPLD for e.g. running the "qixis_reset" command, or
> > +  turning the fan on, etc.
> > diff --git a/board/freescale/ls1021atsn/ls1021atsn.c b/board/freescale/ls1021atsn/ls1021atsn.c
> > new file mode 100644
> > index 000000000000..84c2af142956
> > --- /dev/null
> > +++ b/board/freescale/ls1021atsn/ls1021atsn.c
> > @@ -0,0 +1,291 @@
> > +// SPDX-License-Identifier: GPL-2.0
> > +/* Copyright 2016-2019 NXP Semiconductors
> > + */
> > +#include <common.h>
> > +#include <i2c.h>
> > +#include <asm/io.h>
> > +#include <asm/arch/immap_ls102xa.h>
> > +#include <asm/arch/clock.h>
> > +#include <asm/arch/fsl_serdes.h>
> > +#include <asm/arch-ls102xa/ls102xa_soc.h>
> > +#include <asm/arch/ls102xa_devdis.h>
> > +#include <asm/arch/ls102xa_soc.h>
> > +#include <hwconfig.h>
> > +#include <mmc.h>
> > +#include <fsl_csu.h>
> > +#include <fsl_esdhc.h>
> > +#include <fsl_ifc.h>
> > +#include <fsl_immap.h>
> > +#include <netdev.h>
> > +#include <spl.h>
> > +#include "../common/sleep.h"
> > +#ifdef CONFIG_U_QE
> > +#include <fsl_qe.h>
> > +#endif
> > +#include <fsl_validate.h>
> > +
> > +DECLARE_GLOBAL_DATA_PTR;
> > +
> > +void cpld_show(void)
> > +{
> > +       struct ccsr_gur *dcfg = (struct ccsr_gur *)CONFIG_SYS_FSL_GUTS_ADDR;
> > +       u32 cpldrev;
> > +       int major;
> > +       int minor;
> > +
> > +       cpldrev = in_be32(&dcfg->gpporcr1);
> > +       major = (cpldrev >> 28) & 0xf;
> > +       minor = (cpldrev >> 24) & 0xf;
> > +
> > +       printf("CPLD:  V%d.%d\n", major, minor);
> > +}
> > +
> > +int checkboard(void)
> > +{
> > +       puts("Board: LS1021ATSN\n");
> > +       cpld_show();
> > +       return 0;
> > +}
> > +
> > +void ddrmc_init(void)
> > +{
> > +       struct ccsr_ddr *ddr = (struct ccsr_ddr *)CONFIG_SYS_FSL_DDR_ADDR;
> > +       u32 temp_sdram_cfg, tmp;
> > +
> > +       out_be32(&ddr->sdram_cfg, DDR_SDRAM_CFG);
> > +
> > +       out_be32(&ddr->cs0_bnds, DDR_CS0_BNDS);
> > +       out_be32(&ddr->cs0_config, DDR_CS0_CONFIG);
> > +
> > +       out_be32(&ddr->timing_cfg_0, DDR_TIMING_CFG_0);
> > +       out_be32(&ddr->timing_cfg_1, DDR_TIMING_CFG_1);
> > +       out_be32(&ddr->timing_cfg_2, DDR_TIMING_CFG_2);
> > +       out_be32(&ddr->timing_cfg_3, DDR_TIMING_CFG_3);
> > +       out_be32(&ddr->timing_cfg_4, DDR_TIMING_CFG_4);
> > +       out_be32(&ddr->timing_cfg_5, DDR_TIMING_CFG_5);
> > +
> > +#ifdef CONFIG_DEEP_SLEEP
> > +       if (is_warm_boot()) {
> > +               out_be32(&ddr->sdram_cfg_2,
> > +                        DDR_SDRAM_CFG_2 & ~SDRAM_CFG2_D_INIT);
> > +               out_be32(&ddr->init_addr, CONFIG_SYS_SDRAM_BASE);
> > +               out_be32(&ddr->init_ext_addr, (1 << 31));
> > +
> > +               /* DRAM VRef will not be trained */
> > +               out_be32(&ddr->ddr_cdr2,
> > +                        DDR_DDR_CDR2 & ~DDR_CDR2_VREF_TRAIN_EN);
> > +       } else
> > +#endif
> > +       {
> > +               out_be32(&ddr->sdram_cfg_2, DDR_SDRAM_CFG_2);
> > +               out_be32(&ddr->ddr_cdr2, DDR_DDR_CDR2);
> > +       }
> > +
> > +       out_be32(&ddr->sdram_mode, DDR_SDRAM_MODE);
> > +       out_be32(&ddr->sdram_mode_2, DDR_SDRAM_MODE_2);
> > +
> > +       out_be32(&ddr->sdram_interval, DDR_SDRAM_INTERVAL);
> > +
> > +       out_be32(&ddr->ddr_wrlvl_cntl, DDR_DDR_WRLVL_CNTL);
> > +
> > +       out_be32(&ddr->ddr_wrlvl_cntl_2, DDR_DDR_WRLVL_CNTL_2);
> > +       out_be32(&ddr->ddr_wrlvl_cntl_3, DDR_DDR_WRLVL_CNTL_3);
> > +
> > +       out_be32(&ddr->ddr_cdr1, DDR_DDR_CDR1);
> > +
> > +       out_be32(&ddr->sdram_clk_cntl, DDR_SDRAM_CLK_CNTL);
> > +       out_be32(&ddr->ddr_zq_cntl, DDR_DDR_ZQ_CNTL);
> > +
> > +       out_be32(&ddr->cs0_config_2, DDR_CS0_CONFIG_2);
> > +
> > +       /* DDR erratum A-009942 */
> > +       tmp = in_be32(&ddr->debug[28]);
> > +       out_be32(&ddr->debug[28], tmp | 0x0070006f);
> > +
> > +       udelay(1);
> > +
> > +#ifdef CONFIG_DEEP_SLEEP
> > +       if (is_warm_boot()) {
> > +               /* enter self-refresh */
> > +               temp_sdram_cfg = in_be32(&ddr->sdram_cfg_2);
> > +               temp_sdram_cfg |= SDRAM_CFG2_FRC_SR;
> > +               out_be32(&ddr->sdram_cfg_2, temp_sdram_cfg);
> > +
> > +               temp_sdram_cfg = (DDR_SDRAM_CFG_MEM_EN | SDRAM_CFG_BI);
> > +       } else
> > +#endif
> > +               temp_sdram_cfg = (DDR_SDRAM_CFG_MEM_EN & ~SDRAM_CFG_BI);
> > +
> > +       out_be32(&ddr->sdram_cfg, DDR_SDRAM_CFG | temp_sdram_cfg);
> > +
> > +#ifdef CONFIG_DEEP_SLEEP
> > +       if (is_warm_boot()) {
> > +               /* exit self-refresh */
> > +               temp_sdram_cfg = in_be32(&ddr->sdram_cfg_2);
> > +               temp_sdram_cfg &= ~SDRAM_CFG2_FRC_SR;
> > +               out_be32(&ddr->sdram_cfg_2, temp_sdram_cfg);
> > +       }
> > +#endif
> > +}
> > +
> > +int dram_init(void)
> > +{
> > +#if (!defined(CONFIG_SPL) || defined(CONFIG_SPL_BUILD))
> > +       ddrmc_init();
> > +#endif
> > +
> > +       erratum_a008850_post();
> > +
> > +       gd->ram_size = get_ram_size((void *)PHYS_SDRAM, PHYS_SDRAM_SIZE);
> > +
> > +#if defined(CONFIG_DEEP_SLEEP) && !defined(CONFIG_SPL_BUILD)
> > +       fsl_dp_resume();
> > +#endif
> > +
> > +       return 0;
> > +}
> > +
> > +int board_eth_init(bd_t *bis)
> > +{
> > +       return pci_eth_init(bis);
> > +}
> > +
> > +int board_early_init_f(void)
> > +{
> > +       struct ccsr_scfg *scfg = (struct ccsr_scfg *)CONFIG_SYS_FSL_SCFG_ADDR;
> > +
> > +#ifdef CONFIG_TSEC_ENET
> > +       /* Clear BD & FR bits for big endian BD's and frame data (aka set
>
> Nit: Multi-line comment format.  I'm curious why checkpatch.pl doesn't
> catch this sometimes.
>

What seems to be the problem with this? Do you prefer to see a first
line with just " /* "?

> > +        * correct eTSEC endianness). This is crucial in ensuring that it does
> > +        * not report Data Parity Errors in its RX/TX FIFOs when attempting to
> > +        * send traffic.
> > +        */
> > +       clrbits_be32(&scfg->etsecdmamcr, SCFG_ETSECDMAMCR_LE_BD_FR);
> > +       /* EC3_GTX_CLK125 (of enet2) used for all RGMII interfaces */
> > +       out_be32(&scfg->etsecmcr, SCFG_ETSECCMCR_GE2_CLK125);
> > +#endif
> > +
> > +#ifdef CONFIG_FSL_IFC
> > +       init_early_memctl_regs();
> > +#endif
> > +
> > +       arch_soc_init();
> > +
> > +#if defined(CONFIG_DEEP_SLEEP)
> > +       if (is_warm_boot()) {
> > +               timer_init();
> > +               dram_init();
> > +       }
> > +#endif
> > +
> > +       return 0;
> > +}
> > +
> > +#ifdef CONFIG_SPL_BUILD
> > +void board_init_f(ulong dummy)
> > +{
> > +       void (*second_uboot)(void);
> > +
> > +       /* Clear the BSS */
> > +       memset(__bss_start, 0, __bss_end - __bss_start);
> > +
> > +       get_clocks();
> > +
> > +#if defined(CONFIG_DEEP_SLEEP)
> > +       if (is_warm_boot())
> > +               fsl_dp_disable_console();
> > +#endif
> > +
> > +       preloader_console_init();
> > +
> > +       dram_init();
> > +
> > +       /* Allow OCRAM access permission as R/W */
> > +#ifdef CONFIG_LAYERSCAPE_NS_ACCESS
> > +       enable_layerscape_ns_access();
> > +       enable_layerscape_ns_access();
> > +#endif
> > +
> > +       /*
> > +        * if it is woken up from deep sleep, then jump to second
> > +        * stage uboot and continue executing without recopying
>
> U-Boot
>
> > +        * it from SD since it has already been reserved in memory
> > +        * in last boot.
> > +        */
> > +       if (is_warm_boot()) {
> > +               second_uboot = (void (*)(void))CONFIG_SYS_TEXT_BASE;
> > +               second_uboot();
> > +       }
> > +
> > +       board_init_r(NULL, 0);
> > +}
> > +#endif
> > +
> > +int board_init(void)
> > +{
> > +#ifndef CONFIG_SYS_FSL_NO_SERDES
> > +       fsl_serdes_init();
> > +#endif
> > +       ls102xa_smmu_stream_id_init();
> > +
> > +#ifdef CONFIG_LAYERSCAPE_NS_ACCESS
> > +       enable_layerscape_ns_access();
> > +#endif
> > +
> > +#ifdef CONFIG_U_QE
> > +       u_qe_init();
> > +#endif
> > +
> > +       return 0;
> > +}
> > +
> > +#if defined(CONFIG_SPL_BUILD)
> > +void spl_board_init(void)
> > +{
> > +       ls102xa_smmu_stream_id_init();
> > +}
> > +#endif
> > +
> > +#ifdef CONFIG_BOARD_LATE_INIT
> > +int board_late_init(void)
> > +{
> > +#ifdef CONFIG_CHAIN_OF_TRUST
> > +       fsl_setenv_chain_of_trust();
> > +#endif
> > +
> > +       return 0;
> > +}
> > +#endif
> > +
> > +#if defined(CONFIG_MISC_INIT_R)
> > +int misc_init_r(void)
> > +{
> > +#ifdef CONFIG_FSL_DEVICE_DISABLE
> > +       device_disable(devdis_tbl, ARRAY_SIZE(devdis_tbl));
> > +#endif
> > +
> > +#ifdef CONFIG_FSL_CAAM
> > +       return sec_init();
> > +#endif
> > +}
> > +#endif
> > +
> > +#if defined(CONFIG_DEEP_SLEEP)
> > +void board_sleep_prepare(void)
> > +{
> > +#ifdef CONFIG_LAYERSCAPE_NS_ACCESS
> > +       enable_layerscape_ns_access();
> > +#endif
> > +}
> > +#endif
> > +
> > +int ft_board_setup(void *blob, bd_t *bd)
> > +{
> > +       ft_cpu_setup(blob, bd);
> > +
> > +#ifdef CONFIG_PCI
> > +       ft_pci_setup(blob, bd);
> > +#endif
> > +
> > +       return 0;
> > +}
> > diff --git a/board/freescale/ls1021atsn/ls102xa_pbi.cfg b/board/freescale/ls1021atsn/ls102xa_pbi.cfg
> > new file mode 100644
> > index 000000000000..a8ba184c6684
> > --- /dev/null
> > +++ b/board/freescale/ls1021atsn/ls102xa_pbi.cfg
>
> What is this file? Is it built by something?
>

Yes, search for CONFIG_SYS_FSL_PBL_PBI in include/configs/ls1021atsn.h
and in the main Makefile.
So the boot ROM of the SoC searches for a 512-bit wide data structure
starting with sector 8 of the MMC called RCW (Reset Configuration
Word). This defines PLL frequencies, SerDes protocols, pinmuxing etc
on the SoC. The RCW can also have a sequence of PBL (Pre-Boot Loader)
commands appended to it - generally these are memory write operations
that do stuff such as errata workarounds before the execution
transfers to the boot loader. Actually I believe, but can't prove,
that it is the PBL who copies the U-Boot SPL from MMC into an internal
SRAM called OCRAM (on-chip RAM) before transferring the execution to
it. I say I can't prove this because I would have expected to
recognize this block copy command in the file you asked about.
The takeaway is that for MMC-based booting, the RCW and PBI commands
are packaged together in a file called u-boot-with-spl-pbl.bin. For
QSPI-based booting that is not the case - the SPL and the OCRAM are
not involved because the QSPI flash is memory-mapped so the CPU can
execute the U-Boot image directly. In the case of booting from QSPI
flash, the RCW and PBL commands are not packaged with the U-Boot
image, but instead you're supposed to flash them separately. To be
honest I don't know why it is like that - I'm not a big fan of keeping
a relatively opaque hex dump of the RCW and PBL commands in U-Boot
(let alone that the process is not the same for all boot sources).

> > @@ -0,0 +1,15 @@
> > +#PBI commands
> > +
> > +09570200 ffffffff
> > +09570158 00000300
> > +8940007c 21f47300
> > +
> > +# Configure Scratch register
> > +09ee0200 10000000
> > +# Configure alternate space
> > +09570158 00001000
> > +# Flush PBL data
> > +096100c0 000FFFFF
> > +
> > +09ea085c 00502880
> > +09ea0560 80800000
> > diff --git a/board/freescale/ls1021atsn/ls102xa_rcw_sd.cfg b/board/freescale/ls1021atsn/ls102xa_rcw_sd.cfg
> > new file mode 100644
> > index 000000000000..67152dd2810e
> > --- /dev/null
> > +++ b/board/freescale/ls1021atsn/ls102xa_rcw_sd.cfg
> > @@ -0,0 +1,8 @@
> > +# PBL preamble and RCW header
> > +aa55aa55 01ee0100
> > +
> > +# Disable IFC, enable QSPI and DSPI
> > +0608000c 00000000 00000000 00000000
> > +30000000 08007900 60040a00 21046000
> > +00000000 00000000 00000000 20002000
> > +20024800 8804b340 00000000 00000000
> > diff --git a/configs/ls1021atsn_qspi_defconfig b/configs/ls1021atsn_qspi_defconfig
> > new file mode 100644
> > index 000000000000..427881fe0c52
> > --- /dev/null
> > +++ b/configs/ls1021atsn_qspi_defconfig
> > @@ -0,0 +1,76 @@
> > +CONFIG_ARM=y
> > +CONFIG_TARGET_LS1021ATSN=y
> > +CONFIG_SYS_TEXT_BASE=0x40100000
> > +CONFIG_DEFAULT_DEVICE_TREE="ls1021a-tsn"
> > +CONFIG_BOARD_EARLY_INIT_F=y
> > +CONFIG_SYS_FSL_CLK=y
> > +CONFIG_SYS_EXTRA_OPTIONS="QSPI_BOOT"
> > +CONFIG_QSPI_BOOT=y
> > +CONFIG_BOOTDELAY=3
> > +CONFIG_HUSH_PARSER=y
> > +CONFIG_CMD_GREPENV=y
> > +CONFIG_CMD_MEMINFO=y
> > +CONFIG_CMD_GPT=y
> > +CONFIG_CMD_FAT=y
> > +CONFIG_FSL_ESDHC=y
> > +CONFIG_CMD_SF=y
> > +CONFIG_OF_CONTROL=y
> > +CONFIG_ENV_IS_IN_SPI_FLASH=y
> > +CONFIG_DM=y
> > +CONFIG_FSL_CAAM=y
> > +CONFIG_SPI=y
> > +CONFIG_SPI_FLASH=y
> > +CONFIG_SPI_FLASH_ATMEL=y
> > +CONFIG_SPI_FLASH_STMICRO=y
> > +CONFIG_SPI_FLASH_BAR=y
> > +CONFIG_SPI_FLASH_SPANSION=y
> > +CONFIG_NETDEVICES=y
> > +CONFIG_DM_ETH=y
> > +CONFIG_TSEC_ENET=y
> > +CONFIG_MII=y
> > +CONFIG_SYS_NS16550=y
> > +CONFIG_DM_SPI=y
> > +CONFIG_DM_SPI_FLASH=y
> > +CONFIG_SPI_FLASH_DATAFLASH=y
> > +CONFIG_FSL_DSPI=y
> > +CONFIG_FSL_QSPI=y
> > +CONFIG_PCI=y
> > +CONFIG_CMD_PCI=y
> > +CONFIG_DM_PCI=y
> > +CONFIG_DM_PCI_COMPAT=y
> > +CONFIG_CMD_MMC=y
> > +CONFIG_DM_MMC=y
> > +CONFIG_FSL_SPI_ALIGNED_TXFIFO=y
> > +CONFIG_USB=y
> > +CONFIG_DM_USB=y
> > +CONFIG_CMD_USB=y
> > +CONFIG_USB_XHCI_HCD=y
> > +CONFIG_USB_XHCI_FSL=y
> > +CONFIG_USB_XHCI_DWC3=y
> > +CONFIG_HAS_FSL_XHCI_USB=y
> > +CONFIG_USB_STORAGE=y
> > +CONFIG_CMD_EXT2=y
> > +CONFIG_PCIE_LAYERSCAPE=y
> > +CONFIG_PHYLIB=y
> > +CONFIG_PHY_GIGE=y
> > +CONFIG_PHY_ATHEROS=y
> > +CONFIG_PHY_BROADCOM=y
> > +CONFIG_PHY_FIXED=y
> > +CONFIG_CMD_PING=y
> > +CONFIG_CMD_DHCP=y
> > +CONFIG_CMD_MII=y
> > +CONFIG_CMDLINE_TAG=y
> > +CONFIG_CMDLINE_EDITING=y
> > +CONFIG_AUTO_COMPLETE=y
> > +CONFIG_NR_DRAM_BANKS=1
> > +CONFIG_CMD_BOOTZ=y
> > +CONFIG_SYS_LONGHELP=y
> > +CONFIG_FIT=y
> > +CONFIG_CMD_DM=y
> > +CONFIG_AHCI=y
> > +CONFIG_CMD_I2C=y
> > +CONFIG_BLK=y
> > +CONFIG_CMD_PART=y
> > +CONFIG_CMD_FS_GENERIC=y
> > +CONFIG_CMD_FS_UUID=y
> > +CONFIG_DISTRO_DEFAULTS=y
> > diff --git a/configs/ls1021atsn_sdcard_defconfig b/configs/ls1021atsn_sdcard_defconfig
> > new file mode 100644
> > index 000000000000..b74e01206817
> > --- /dev/null
> > +++ b/configs/ls1021atsn_sdcard_defconfig
> > @@ -0,0 +1,85 @@
> > +CONFIG_ARM=y
> > +CONFIG_TARGET_LS1021ATSN=y
> > +CONFIG_SPL_TEXT_BASE=0x10000000
> > +CONFIG_SYS_TEXT_BASE=0x82000000
> > +CONFIG_DEFAULT_DEVICE_TREE="ls1021a-tsn"
> > +CONFIG_BOARD_EARLY_INIT_F=y
> > +CONFIG_SPL=y
> > +CONFIG_SPL_FRAMEWORK=y
> > +CONFIG_SYS_FSL_CLK=y
> > +CONFIG_SYS_EXTRA_OPTIONS="RAMBOOT_PBL,SPL_FSL_PBL,SD_BOOT,SD_BOOT_QSPI"
> > +CONFIG_SD_BOOT=y
> > +CONFIG_BOOTDELAY=3
> > +CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_USE_SECTOR=y
> > +CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR=0xe8
> > +CONFIG_HUSH_PARSER=y
> > +CONFIG_CMD_GREPENV=y
> > +CONFIG_CMD_MEMINFO=y
> > +CONFIG_CMD_GPT=y
> > +CONFIG_CMD_FAT=y
> > +CONFIG_CMD_MMC=y
> > +CONFIG_FSL_ESDHC=y
> > +CONFIG_CMD_SF=y
> > +CONFIG_OF_CONTROL=y
> > +CONFIG_ENV_IS_IN_MMC=y
> > +CONFIG_DM=y
> > +CONFIG_FSL_CAAM=y
> > +CONFIG_SPI=y
> > +CONFIG_SPI_FLASH=y
> > +CONFIG_SPI_FLASH_ATMEL=y
> > +CONFIG_SPI_FLASH_STMICRO=y
> > +CONFIG_SPI_FLASH_BAR=y
> > +CONFIG_SPI_FLASH_SPANSION=y
> > +CONFIG_NETDEVICES=y
> > +CONFIG_DM_ETH=y
> > +CONFIG_TSEC_ENET=y
> > +CONFIG_MII=y
> > +CONFIG_SYS_NS16550=y
> > +CONFIG_DM_SPI=y
> > +CONFIG_DM_SPI_FLASH=y
> > +CONFIG_SPI_FLASH_DATAFLASH=y
> > +CONFIG_FSL_DSPI=y
> > +CONFIG_FSL_QSPI=y
> > +CONFIG_PCI=y
> > +CONFIG_CMD_PCI=y
> > +CONFIG_DM_PCI=y
> > +CONFIG_DM_PCI_COMPAT=y
> > +CONFIG_USB=y
> > +CONFIG_DM_USB=y
> > +CONFIG_CMD_USB=y
> > +CONFIG_USB_XHCI_HCD=y
> > +CONFIG_USB_XHCI_FSL=y
> > +CONFIG_USB_XHCI_DWC3=y
> > +CONFIG_HAS_FSL_XHCI_USB=y
> > +CONFIG_USB_STORAGE=y
> > +CONFIG_CMD_EXT2=y
> > +CONFIG_PCIE_LAYERSCAPE=y
> > +CONFIG_PHYLIB=y
> > +CONFIG_PHY_GIGE=y
> > +CONFIG_PHY_ATHEROS=y
> > +CONFIG_PHY_BROADCOM=y
> > +CONFIG_PHY_FIXED=y
> > +CONFIG_CMD_PING=y
> > +CONFIG_CMD_DHCP=y
> > +CONFIG_CMD_MII=y
> > +CONFIG_CMDLINE_TAG=y
> > +CONFIG_CMDLINE_EDITING=y
> > +CONFIG_AUTO_COMPLETE=y
> > +CONFIG_NR_DRAM_BANKS=1
> > +CONFIG_CMD_BOOTZ=y
> > +CONFIG_SYS_LONGHELP=y
> > +CONFIG_FIT=y
> > +CONFIG_SPL_MMC_SUPPORT=y
> > +CONFIG_SPL_SERIAL_SUPPORT=y
> > +CONFIG_SPL_I2C_SUPPORT=y
> > +CONFIG_SPL_ENV_SUPPORT=y
> > +CONFIG_SPL_LIBCOMMON_SUPPORT=y
> > +CONFIG_CMD_DM=y
> > +CONFIG_AHCI=y
> > +CONFIG_CMD_I2C=y
> > +CONFIG_BLK=y
> > +CONFIG_DM_MMC=y
> > +CONFIG_CMD_PART=y
> > +CONFIG_CMD_FS_GENERIC=y
> > +CONFIG_CMD_FS_UUID=y
> > +CONFIG_DISTRO_DEFAULTS=y
> > diff --git a/include/configs/ls1021atsn.h b/include/configs/ls1021atsn.h
> > new file mode 100644
> > index 000000000000..c8ec414afd39
> > --- /dev/null
> > +++ b/include/configs/ls1021atsn.h
> > @@ -0,0 +1,346 @@
> > +/* SPDX-License-Identifier: GPL-2.0
> > + * Copyright 2016-2018 NXP Semiconductors
> > + * Copyright 2019 Vladimir Oltean <olteanv@gmail.com>
> > + */
> > +
> > +#ifndef __CONFIG_H
> > +#define __CONFIG_H
> > +
> > +#define CONFIG_ARMV7_SECURE_BASE       OCRAM_BASE_S_ADDR
> > +
> > +#define CONFIG_SYS_FSL_CLK
> > +
> > +#define CONFIG_DEEP_SLEEP
> > +#ifdef CONFIG_DEEP_SLEEP
> > +#define CONFIG_SILENT_CONSOLE
> > +#endif
> > +
> > +/*
> > + * Size of malloc() pool
> > + */
> > +#define CONFIG_SYS_MALLOC_LEN          (CONFIG_ENV_SIZE + 16 * 1024 * 1024)
> > +
> > +#define CONFIG_SYS_INIT_RAM_ADDR       OCRAM_BASE_ADDR
> > +#define CONFIG_SYS_INIT_RAM_SIZE       OCRAM_SIZE
> > +
> > +/* XHCI Support - enabled by default */
> > +#define CONFIG_USB_MAX_CONTROLLER_COUNT        1
> > +
> > +#define CONFIG_SYS_CLK_FREQ            100000000
> > +#define CONFIG_DDR_CLK_FREQ            100000000
> > +
> > +#define DDR_SDRAM_CFG                  0x470c0008
> > +#define DDR_CS0_BNDS                   0x008000bf
> > +#define DDR_CS0_CONFIG                 0x80014302
> > +#define DDR_TIMING_CFG_0               0x50550004
> > +#define DDR_TIMING_CFG_1               0xbcb38c56
> > +#define DDR_TIMING_CFG_2               0x0040d120
> > +#define DDR_TIMING_CFG_3               0x010e1000
> > +#define DDR_TIMING_CFG_4               0x00000001
> > +#define DDR_TIMING_CFG_5               0x03401400
> > +#define DDR_SDRAM_CFG_2                        0x00401010
> > +#define DDR_SDRAM_MODE                 0x00061c60
> > +#define DDR_SDRAM_MODE_2               0x00180000
> > +#define DDR_SDRAM_INTERVAL             0x18600618
> > +#define DDR_DDR_WRLVL_CNTL             0x8655f605
> > +#define DDR_DDR_WRLVL_CNTL_2           0x05060607
> > +#define DDR_DDR_WRLVL_CNTL_3           0x05050505
> > +#define DDR_DDR_CDR1                   0x80040000
> > +#define DDR_DDR_CDR2                   0x00000001
> > +#define DDR_SDRAM_CLK_CNTL             0x02000000
> > +#define DDR_DDR_ZQ_CNTL                        0x89080600
> > +#define DDR_CS0_CONFIG_2               0
> > +#define DDR_SDRAM_CFG_MEM_EN           0x80000000
> > +#define SDRAM_CFG2_D_INIT              0x00000010
> > +#define DDR_CDR2_VREF_TRAIN_EN         0x00000080
> > +#define SDRAM_CFG2_FRC_SR              0x80000000
> > +#define SDRAM_CFG_BI                   0x00000001
> > +
> > +#define CONFIG_CHIP_SELECTS_PER_CTRL   4
> > +
> > +#ifdef CONFIG_RAMBOOT_PBL
> > +#define CONFIG_SYS_FSL_PBL_PBI \
> > +       "board/freescale/ls1021atsn/ls102xa_pbi.cfg"
> > +#endif
> > +
> > +#ifdef CONFIG_SD_BOOT
> > +#ifdef CONFIG_SD_BOOT_QSPI
> > +#define CONFIG_SYS_FSL_PBL_RCW \
> > +       "board/freescale/ls1021atsn/ls102xa_rcw_sd_qspi.cfg"
> > +#else
> > +#define CONFIG_SYS_FSL_PBL_RCW \
> > +       "board/freescale/ls1021atsn/ls102xa_rcw_sd_ifc.cfg"
> > +#endif
> > +#define CONFIG_SPL_LDSCRIPT    "arch/$(ARCH)/cpu/u-boot-spl.lds"
> > +#define CONFIG_SPL_LIBGENERIC_SUPPORT
> > +#define CONFIG_SPL_MPC8XXX_INIT_DDR_SUPPORT
> > +#define CONFIG_SPL_WATCHDOG_SUPPORT
> > +#define CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR        0xe8
> > +
> > +#ifdef CONFIG_SECURE_BOOT
> > +#define CONFIG_U_BOOT_HDR_SIZE         (16 << 10)
> > +#endif /* ifdef CONFIG_SECURE_BOOT */
> > +
> > +#define CONFIG_SPL_MAX_SIZE            0x1a000
> > +#define CONFIG_SPL_STACK               0x1001d000
> > +#define CONFIG_SPL_PAD_TO              0x1c000
> > +
> > +#define CONFIG_SYS_SPL_MALLOC_START    (CONFIG_SYS_TEXT_BASE + \
> > +               CONFIG_SYS_MONITOR_LEN)
> > +#define CONFIG_SYS_SPL_MALLOC_SIZE     0x100000
> > +#define CONFIG_SPL_BSS_START_ADDR      0x80100000
> > +#define CONFIG_SPL_BSS_MAX_SIZE                0x80000
> > +
> > +#ifdef CONFIG_U_BOOT_HDR_SIZE
> > +/*
> > + * HDR would be appended at end of image and copied to DDR along
> > + * with U-Boot image. Here u-boot max. size is 512K. So if binary
>
> U-Boot (second one).
>
> > + * size increases then increase this size in case of secure boot as
> > + * it uses raw u-boot image instead of fit image.
>
> U-Boot
>
> > + */
> > +#define CONFIG_SYS_MONITOR_LEN         (0x80000 + CONFIG_U_BOOT_HDR_SIZE)
> > +#else
> > +#define CONFIG_SYS_MONITOR_LEN         0x80000
> > +#endif /* ifdef CONFIG_U_BOOT_HDR_SIZE */
> > +#endif
> > +
> > +#define CONFIG_NR_DRAM_BANKS           1
> > +#define PHYS_SDRAM                     0x80000000
> > +#define PHYS_SDRAM_SIZE                        (1u * 1024 * 1024 * 1024)
> > +
> > +#define CONFIG_SYS_DDR_SDRAM_BASE      0x80000000UL
> > +#define CONFIG_SYS_SDRAM_BASE          CONFIG_SYS_DDR_SDRAM_BASE
> > +
> > +#define CONFIG_CHIP_SELECTS_PER_CTRL   4
> > +
> > +#if !defined(CONFIG_SD_BOOT) && !defined(CONFIG_NAND_BOOT) && \
> > +       !defined(CONFIG_QSPI_BOOT)
> > +#define CONFIG_U_QE
> > +#endif
> > +
> > +/*
> > + * IFC Definitions
> > + */
> > +#if !defined(CONFIG_QSPI_BOOT) && !defined(CONFIG_SD_BOOT_QSPI)
> > +#define CONFIG_FSL_IFC
> > +#endif
> > +
> > +/* CPLD */
> > +#define CONFIG_SYS_CPLD_BASE           0x7fb00000
> > +#define CPLD_BASE_PHYS                 CONFIG_SYS_CPLD_BASE
> > +
> > +#define CONFIG_SYS_FPGA_CSPR_EXT        (0x0)
> > +#define CONFIG_SYS_FPGA_CSPR           (CSPR_PHYS_ADDR(CPLD_BASE_PHYS) | \
> > +                                       CSPR_PORT_SIZE_8 | \
> > +                                       CSPR_MSEL_GPCM | \
> > +                                       CSPR_V)
> > +#define CONFIG_SYS_FPGA_AMASK          IFC_AMASK(64 * 1024)
> > +#define CONFIG_SYS_FPGA_CSOR           (CSOR_NOR_ADM_SHIFT(4) | \
> > +                                       CSOR_NOR_NOR_MODE_AVD_NOR | \
> > +                                       CSOR_NOR_TRHZ_80)
> > +
> > +/* CPLD Timing parameters for IFC GPCM */
> > +#define CONFIG_SYS_FPGA_FTIM0          (FTIM0_GPCM_TACSE(0xf) | \
> > +                                       FTIM0_GPCM_TEADC(0xf) | \
> > +                                       FTIM0_GPCM_TEAHC(0xf))
> > +#define CONFIG_SYS_FPGA_FTIM1          (FTIM1_GPCM_TACO(0xff) | \
> > +                                       FTIM1_GPCM_TRAD(0x3f))
> > +#define CONFIG_SYS_FPGA_FTIM2          (FTIM2_GPCM_TCS(0xf) | \
> > +                                       FTIM2_GPCM_TCH(0xf) | \
> > +                                       FTIM2_GPCM_TWP(0xff))
> > +#define CONFIG_SYS_FPGA_FTIM3           0x0
> > +#define CONFIG_SYS_CSPR0_EXT           CONFIG_SYS_FPGA_CSPR_EXT
> > +#define CONFIG_SYS_CSPR0               CONFIG_SYS_FPGA_CSPR
> > +#define CONFIG_SYS_AMASK0              CONFIG_SYS_FPGA_AMASK
> > +#define CONFIG_SYS_CSOR0               CONFIG_SYS_FPGA_CSOR
> > +#define CONFIG_SYS_CS0_FTIM0           CONFIG_SYS_FPGA_FTIM0
> > +#define CONFIG_SYS_CS0_FTIM1           CONFIG_SYS_FPGA_FTIM1
> > +#define CONFIG_SYS_CS0_FTIM2           CONFIG_SYS_FPGA_FTIM2
> > +#define CONFIG_SYS_CS0_FTIM3           CONFIG_SYS_FPGA_FTIM3
> > +
> > +/*
> > + * Serial Port
> > + */
> > +#define CONFIG_CONS_INDEX              1
> > +#define CONFIG_SYS_NS16550_SERIAL
> > +#ifndef CONFIG_DM_SERIAL
> > +#define CONFIG_SYS_NS16550_REG_SIZE    1
> > +#endif
> > +#define CONFIG_SYS_NS16550_CLK         get_serial_clock()
> > +
> > +#define CONFIG_BAUDRATE                        115200
> > +
> > +/*
> > + * I2C
> > + */
> > +#define CONFIG_SYS_I2C
> > +#define CONFIG_SYS_I2C_MXC
> > +#define CONFIG_SYS_I2C_MXC_I2C1                /* enable I2C bus 1 */
> > +#define CONFIG_SYS_I2C_MXC_I2C2                /* enable I2C bus 2 */
> > +#define CONFIG_SYS_I2C_MXC_I2C3                /* enable I2C bus 3 */
> > +
> > +/* EEPROM */
> > +#define CONFIG_ID_EEPROM
> > +#define CONFIG_SYS_I2C_EEPROM_NXID
> > +#define CONFIG_SYS_EEPROM_BUS_NUM      0
> > +#define CONFIG_SYS_I2C_EEPROM_ADDR     0x51
> > +#define CONFIG_SYS_I2C_EEPROM_ADDR_LEN 2
> > +
> > +/* SPI */
> > +#if defined(CONFIG_QSPI_BOOT) || defined(CONFIG_SD_BOOT_QSPI)
> > +/* QSPI */
> > +#define FSL_QSPI_FLASH_SIZE            (1 << 24)
> > +#define FSL_QSPI_FLASH_NUM             2
> > +/* DSPI */
> > +#endif
> > +
> > +#ifdef CONFIG_TSEC_ENET
> > +#define CONFIG_ETHPRIME                        "ethernet@2d10000"
>
> Where does this name come from? Is this not the first mac, i.e. would
> you get this without the explicit setting ethprime?
>

I don't know, I didn't try not setting this. It is the first MAC, yes.

> > +#endif
> > +
> > +/* PCIe */
> > +#define CONFIG_PCIE1                   /* PCIE controller 1 */
> > +#define CONFIG_PCIE2                   /* PCIE controller 2 */
> > +#define FSL_PCIE_COMPAT                        "fsl,ls1021a-pcie"
> > +#ifdef CONFIG_PCI
> > +#define CONFIG_PCI_SCAN_SHOW
> > +#endif
> > +
> > +#define CONFIG_PEN_ADDR_BIG_ENDIAN
> > +#define CONFIG_LAYERSCAPE_NS_ACCESS
> > +#define CONFIG_SMP_PEN_ADDR            0x01ee0200
> > +#define COUNTER_FREQUENCY              12500000
> > +
> > +#define CONFIG_HWCONFIG
> > +#define HWCONFIG_BUFFER_SIZE           256
> > +
> > +#define CONFIG_FSL_DEVICE_DISABLE
> > +
> > +#define BOOT_TARGET_DEVICES(func) \
> > +       func(MMC, mmc, 0) \
> > +       func(USB, usb, 0) \
> > +       func(DHCP, dhcp, na)
> > +#include <config_distro_bootcmd.h>
> > +
> > +#define CONFIG_EXTRA_ENV_SETTINGS                                      \
> > +       "bootargs=root=/dev/ram0 rw console=ttyS0,115200\0"             \
> > +       "initrd_high=0xffffffff\0"                                      \
> > +       "fdt_high=0xffffffff\0"                                         \
> > +       "fdt_addr=0x64f00000\0"                                         \
> > +       "kernel_addr=0x61000000\0"                                      \
> > +       "kernelheader_addr=0x60800000\0"                                \
> > +       "scriptaddr=0x80000000\0"                                       \
> > +       "scripthdraddr=0x80080000\0"                                    \
> > +       "fdtheader_addr_r=0x80100000\0"                                 \
> > +       "kernelheader_addr_r=0x80200000\0"                              \
> > +       "kernel_addr_r=0x80008000\0"                                    \
> > +       "kernelheader_size=0x40000\0"                                   \
> > +       "fdt_addr_r=0x8f000000\0"                                       \
> > +       "ramdisk_addr_r=0xa0000000\0"                                   \
> > +       "load_addr=0x80008000\0"                                        \
> > +       "kernel_size=0x2800000\0"                                       \
> > +       "kernel_addr_sd=0x8000\0"                                       \
> > +       "kernel_size_sd=0x14000\0"                                      \
> > +       "kernelhdr_addr_sd=0x4000\0"                                    \
> > +       "kernelhdr_size_sd=0x10\0"                                      \
> > +       BOOTENV                                                         \
> > +       "boot_scripts=ls1021atsn_boot.scr\0"                            \
> > +       "boot_script_hdr=hdr_ls1021atsn_bs.out\0"                       \
> > +               "scan_dev_for_boot_part="                               \
> > +                       "part list ${devtype} ${devnum} devplist; "     \
> > +                       "env exists devplist || setenv devplist 1; "    \
> > +                       "for distro_bootpart in ${devplist}; do "       \
> > +                       "if fstype ${devtype} "                         \
> > +                               "${devnum}:${distro_bootpart} "         \
> > +                               "bootfstype; then "                     \
> > +                               "run scan_dev_for_boot; "               \
> > +                       "fi; "                                          \
> > +               "done\0"                                                \
> > +       "scan_dev_for_boot="                                            \
> > +               "echo Scanning ${devtype} "                             \
> > +                               "${devnum}:${distro_bootpart}...; "     \
> > +               "for prefix in ${boot_prefixes}; do "                   \
> > +                       "run scan_dev_for_scripts; "                    \
> > +                       "run scan_dev_for_extlinux; "                   \
> > +               "done;"                                                 \
> > +               "\0"                                                    \
> > +       "boot_a_script="                                                \
> > +               "load ${devtype} ${devnum}:${distro_bootpart} "         \
> > +                       "${scriptaddr} ${prefix}${script}; "            \
> > +               "env exists secureboot && load ${devtype} "             \
> > +                       "${devnum}:${distro_bootpart} "                 \
> > +                       "${scripthdraddr} ${prefix}${boot_script_hdr} " \
> > +                       "&& esbc_validate ${scripthdraddr};"            \
> > +               "source ${scriptaddr}\0"                                \
> > +       "qspi_bootcmd=echo Trying load from qspi..;"                    \
> > +               "sf probe && sf read $load_addr "                       \
> > +               "$kernel_addr $kernel_size; env exists secureboot "     \
> > +               "&& sf read $kernelheader_addr_r $kernelheader_addr "   \
> > +               "$kernelheader_size && esbc_validate ${kernelheader_addr_r}; " \
> > +               "bootm $load_addr#$board\0"                             \
> > +       "sd_bootcmd=echo Trying load from SD ..;"                       \
> > +               "mmcinfo && mmc read $load_addr "                       \
> > +               "$kernel_addr_sd $kernel_size_sd && "                   \
> > +               "env exists secureboot && mmc read $kernelheader_addr_r " \
> > +               "$kernelhdr_addr_sd $kernelhdr_size_sd "                \
> > +               " && esbc_validate ${kernelheader_addr_r};"             \
> > +               "bootm $load_addr#$board\0"
> > +
> > +#undef CONFIG_BOOTCOMMAND
> > +#if defined(CONFIG_QSPI_BOOT) || defined(CONFIG_SD_BOOT_QSPI)
> > +#define CONFIG_BOOTCOMMAND "run distro_bootcmd; run qspi_bootcmd; "    \
> > +                          "env exists secureboot && esbc_halt"
> > +#elif defined(CONFIG_SD_BOOT)
> > +#define CONFIG_BOOTCOMMAND "run distro_bootcmd; run sd_bootcmd; "      \
> > +                          "env exists secureboot && esbc_halt;"
> > +#endif
> > +
> > +/*
> > + * Miscellaneous configurable options
> > + */
> > +#define CONFIG_SYS_CBSIZE              256     /* Console I/O Buffer Size */
> > +#define CONFIG_SYS_PBSIZE              \
> > +               (CONFIG_SYS_CBSIZE + sizeof(CONFIG_SYS_PROMPT) + 16)
> > +#define CONFIG_SYS_MAXARGS             16      /* max number of command args */
> > +#define CONFIG_SYS_BARGSIZE            CONFIG_SYS_CBSIZE
> > +
> > +#define CONFIG_SYS_LOAD_ADDR           0x82000000
> > +
> > +#define CONFIG_LS102XA_STREAM_ID
> > +
> > +#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)
> > +
> > +#ifdef CONFIG_SPL_BUILD
> > +#define CONFIG_SYS_MONITOR_BASE CONFIG_SPL_TEXT_BASE
> > +#else
> > +#define CONFIG_SYS_MONITOR_BASE CONFIG_SYS_TEXT_BASE    /* start of monitor */
> > +#endif
> > +
> > +#define CONFIG_SYS_QE_FW_ADDR          0x67f40000
> > +
> > +/*
> > + * Environment
> > + */
> > +#define CONFIG_ENV_OVERWRITE
> > +
> > +#if defined(CONFIG_SD_BOOT)
> > +#define CONFIG_ENV_OFFSET              0x300000
> > +#define CONFIG_SYS_MMC_ENV_DEV         0
> > +#define CONFIG_ENV_SIZE                        0x20000
> > +#elif defined(CONFIG_QSPI_BOOT)
> > +#define CONFIG_ENV_SIZE                        0x2000
> > +#define CONFIG_ENV_OFFSET              0x300000
> > +#define CONFIG_ENV_SECT_SIZE           0x40000
> > +#endif
> > +
> > +#define CONFIG_OF_BOARD_SETUP
> > +#define CONFIG_OF_STDOUT_VIA_ALIAS
> > +#define CONFIG_MISC_INIT_R
> > +
> > +#include <asm/fsl_secure_boot.h>
> > +#define CONFIG_SYS_BOOTM_LEN 0x8000000 /* 128 MB */
> > +
> > +#endif
> > --
> > 2.17.1
> >
> > _______________________________________________
> > U-Boot mailing list
> > U-Boot@lists.denx.de
> > https://lists.denx.de/listinfo/u-boot

Thanks,
-Vladimir
Joe Hershberger July 15, 2019, 10:20 p.m. UTC | #8
On Mon, Jul 15, 2019 at 4:57 PM Vladimir Oltean <olteanv@gmail.com> wrote:
>
> Hi Joe,
>
> On Mon, 15 Jul 2019 at 22:17, Joe Hershberger <joe.hershberger@ni.com> wrote:
> >
> > On Sun, Jun 23, 2019 at 12:53 PM Vladimir Oltean <olteanv@gmail.com> wrote:
> > >
> > > From: Jianchao Wang <jianchao.wang@nxp.com>
> > >
> > > The LS1021A-TSN is a development board built by VVDN/Argonboards in
> > > partnership with NXP.
> > >
> > > It features the LS1021A SoC and the first-generation SJA1105T Ethernet
> > > switch for prototyping implementations of a subset of IEEE 802.1 TSN
> > > standards.
> > >
> > > Supported boot media: microSD card (via SPL), QSPI flash.
> > >
> > > Rev. A of the board uses a Spansion S25FL512S_256K serial flash, which
> > > is 64 MB in size and has an erase sector size of 256KB (therefore,
> > > flashing the RCW would erase part of U-boot).
> > >
> > > Rev. B and C of the board use a Spansion S25FL256S1 serial flash, which
> > > is only 32 MB in size but has an erase sector size of 64KB (therefore
> > > the RCW image can be flashed without erasing U-boot).
> > >
> > > To avoid the problems above, the U-boot base address has been selected
> > > at 0x100000 (the start of the 5th 256KB erase sector), which works for
> > > all board revisions. Actually 0x40000 would have been enough, but
> > > 0x100000 is common for all Layerscape devices.
> > >
> > > eTSEC3 is connecting directly to SJA1105 via an RGMII fixed-link, but
> > > SJA1105 is currently not supported by uboot. Therefore, eTSEC3 is
> > > disabled.
> > >
> > > Signed-off-by: Xiaoliang Yang <xiaoliang.yang@nxp.com>
> > > Signed-off-by: Mingkai Hu <mingkai.hu@nxp.com>
> > > Signed-off-by: Jianchao Wang <jianchao.wang@nxp.com>
> > > Signed-off-by: Changming Huang <jerry.huang@nxp.com>
> > >
> > > [Vladimir] Code taken from https://github.com/openil/u-boot (which
> > > itself is mostly copied from ls1021a-iot) and adapted with the following
> > > changes:
> > >
> > > - Add a008850 errata workaround
> > > - Converted eTSEC, MMC to DM to avoid all build warnings
> > > - Plugged in distro boot feature, including support for extlinux.conf
> > > - Added defconfig for QSPI boot
> > > - Added the board/freescale/ls1021atsn/README.rst for initial setup
> > >
> > > Signed-off-by: Vladimir Oltean <olteanv@gmail.com>
> > > ---

[ ... ]

> > > +int board_early_init_f(void)
> > > +{
> > > +       struct ccsr_scfg *scfg = (struct ccsr_scfg *)CONFIG_SYS_FSL_SCFG_ADDR;
> > > +
> > > +#ifdef CONFIG_TSEC_ENET
> > > +       /* Clear BD & FR bits for big endian BD's and frame data (aka set
> >
> > Nit: Multi-line comment format.  I'm curious why checkpatch.pl doesn't
> > catch this sometimes.
> >
>
> What seems to be the problem with this? Do you prefer to see a first
> line with just " /* "?

Yes. See [1] and [2]. I tried to make the intent more clear at [2].

[1] - https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/Documentation/process/coding-style.rst#n543
[2] - http://www.denx.de/wiki/U-Boot/CodingStyle

>
> > > +        * correct eTSEC endianness). This is crucial in ensuring that it does
> > > +        * not report Data Parity Errors in its RX/TX FIFOs when attempting to
> > > +        * send traffic.
> > > +        */
> > > +       clrbits_be32(&scfg->etsecdmamcr, SCFG_ETSECDMAMCR_LE_BD_FR);
> > > +       /* EC3_GTX_CLK125 (of enet2) used for all RGMII interfaces */
> > > +       out_be32(&scfg->etsecmcr, SCFG_ETSECCMCR_GE2_CLK125);
> > > +#endif
> > > +
> > > +#ifdef CONFIG_FSL_IFC
> > > +       init_early_memctl_regs();
> > > +#endif
> > > +
> > > +       arch_soc_init();
> > > +
> > > +#if defined(CONFIG_DEEP_SLEEP)
> > > +       if (is_warm_boot()) {
> > > +               timer_init();
> > > +               dram_init();
> > > +       }
> > > +#endif
> > > +
> > > +       return 0;
> > > +}
> > > +
> > > +#ifdef CONFIG_SPL_BUILD
> > > +void board_init_f(ulong dummy)
> > > +{
> > > +       void (*second_uboot)(void);
> > > +
> > > +       /* Clear the BSS */
> > > +       memset(__bss_start, 0, __bss_end - __bss_start);
> > > +
> > > +       get_clocks();
> > > +
> > > +#if defined(CONFIG_DEEP_SLEEP)
> > > +       if (is_warm_boot())
> > > +               fsl_dp_disable_console();
> > > +#endif
> > > +
> > > +       preloader_console_init();
> > > +
> > > +       dram_init();
> > > +
> > > +       /* Allow OCRAM access permission as R/W */
> > > +#ifdef CONFIG_LAYERSCAPE_NS_ACCESS
> > > +       enable_layerscape_ns_access();
> > > +       enable_layerscape_ns_access();
> > > +#endif
> > > +
> > > +       /*
> > > +        * if it is woken up from deep sleep, then jump to second
> > > +        * stage uboot and continue executing without recopying
> >
> > U-Boot
> >
> > > +        * it from SD since it has already been reserved in memory
> > > +        * in last boot.
> > > +        */
> > > +       if (is_warm_boot()) {
> > > +               second_uboot = (void (*)(void))CONFIG_SYS_TEXT_BASE;
> > > +               second_uboot();
> > > +       }
> > > +
> > > +       board_init_r(NULL, 0);
> > > +}
> > > +#endif
> > > +
> > > +int board_init(void)
> > > +{
> > > +#ifndef CONFIG_SYS_FSL_NO_SERDES
> > > +       fsl_serdes_init();
> > > +#endif
> > > +       ls102xa_smmu_stream_id_init();
> > > +
> > > +#ifdef CONFIG_LAYERSCAPE_NS_ACCESS
> > > +       enable_layerscape_ns_access();
> > > +#endif
> > > +
> > > +#ifdef CONFIG_U_QE
> > > +       u_qe_init();
> > > +#endif
> > > +
> > > +       return 0;
> > > +}
> > > +
> > > +#if defined(CONFIG_SPL_BUILD)
> > > +void spl_board_init(void)
> > > +{
> > > +       ls102xa_smmu_stream_id_init();
> > > +}
> > > +#endif
> > > +
> > > +#ifdef CONFIG_BOARD_LATE_INIT
> > > +int board_late_init(void)
> > > +{
> > > +#ifdef CONFIG_CHAIN_OF_TRUST
> > > +       fsl_setenv_chain_of_trust();
> > > +#endif
> > > +
> > > +       return 0;
> > > +}
> > > +#endif
> > > +
> > > +#if defined(CONFIG_MISC_INIT_R)
> > > +int misc_init_r(void)
> > > +{
> > > +#ifdef CONFIG_FSL_DEVICE_DISABLE
> > > +       device_disable(devdis_tbl, ARRAY_SIZE(devdis_tbl));
> > > +#endif
> > > +
> > > +#ifdef CONFIG_FSL_CAAM
> > > +       return sec_init();
> > > +#endif
> > > +}
> > > +#endif
> > > +
> > > +#if defined(CONFIG_DEEP_SLEEP)
> > > +void board_sleep_prepare(void)
> > > +{
> > > +#ifdef CONFIG_LAYERSCAPE_NS_ACCESS
> > > +       enable_layerscape_ns_access();
> > > +#endif
> > > +}
> > > +#endif
> > > +
> > > +int ft_board_setup(void *blob, bd_t *bd)
> > > +{
> > > +       ft_cpu_setup(blob, bd);
> > > +
> > > +#ifdef CONFIG_PCI
> > > +       ft_pci_setup(blob, bd);
> > > +#endif
> > > +
> > > +       return 0;
> > > +}
> > > diff --git a/board/freescale/ls1021atsn/ls102xa_pbi.cfg b/board/freescale/ls1021atsn/ls102xa_pbi.cfg
> > > new file mode 100644
> > > index 000000000000..a8ba184c6684
> > > --- /dev/null
> > > +++ b/board/freescale/ls1021atsn/ls102xa_pbi.cfg
> >
> > What is this file? Is it built by something?
> >
>
> Yes, search for CONFIG_SYS_FSL_PBL_PBI in include/configs/ls1021atsn.h
> and in the main Makefile.
> So the boot ROM of the SoC searches for a 512-bit wide data structure
> starting with sector 8 of the MMC called RCW (Reset Configuration
> Word). This defines PLL frequencies, SerDes protocols, pinmuxing etc
> on the SoC. The RCW can also have a sequence of PBL (Pre-Boot Loader)
> commands appended to it - generally these are memory write operations
> that do stuff such as errata workarounds before the execution
> transfers to the boot loader. Actually I believe, but can't prove,
> that it is the PBL who copies the U-Boot SPL from MMC into an internal
> SRAM called OCRAM (on-chip RAM) before transferring the execution to
> it. I say I can't prove this because I would have expected to
> recognize this block copy command in the file you asked about.
> The takeaway is that for MMC-based booting, the RCW and PBI commands
> are packaged together in a file called u-boot-with-spl-pbl.bin. For
> QSPI-based booting that is not the case - the SPL and the OCRAM are
> not involved because the QSPI flash is memory-mapped so the CPU can
> execute the U-Boot image directly. In the case of booting from QSPI
> flash, the RCW and PBL commands are not packaged with the U-Boot
> image, but instead you're supposed to flash them separately. To be
> honest I don't know why it is like that - I'm not a big fan of keeping
> a relatively opaque hex dump of the RCW and PBL commands in U-Boot
> (let alone that the process is not the same for all boot sources).

Thanks for the explanation.

>
> > > @@ -0,0 +1,15 @@
> > > +#PBI commands
> > > +
> > > +09570200 ffffffff
> > > +09570158 00000300
> > > +8940007c 21f47300
> > > +
> > > +# Configure Scratch register
> > > +09ee0200 10000000
> > > +# Configure alternate space
> > > +09570158 00001000
> > > +# Flush PBL data
> > > +096100c0 000FFFFF
> > > +
> > > +09ea085c 00502880
> > > +09ea0560 80800000

[ ... ]

> > > +/* SPI */
> > > +#if defined(CONFIG_QSPI_BOOT) || defined(CONFIG_SD_BOOT_QSPI)
> > > +/* QSPI */
> > > +#define FSL_QSPI_FLASH_SIZE            (1 << 24)
> > > +#define FSL_QSPI_FLASH_NUM             2
> > > +/* DSPI */
> > > +#endif
> > > +
> > > +#ifdef CONFIG_TSEC_ENET
> > > +#define CONFIG_ETHPRIME                        "ethernet@2d10000"
> >
> > Where does this name come from? Is this not the first mac, i.e. would
> > you get this without the explicit setting ethprime?
> >
>
> I don't know, I didn't try not setting this. It is the first MAC, yes.

I would recommend trying it without setting this. It's usually only
helpful of you need the second as default or something.

>
> > > +#endif
> > > +
> > > +/* PCIe */
> > > +#define CONFIG_PCIE1                   /* PCIE controller 1 */
> > > +#define CONFIG_PCIE2                   /* PCIE controller 2 */
> > > +#define FSL_PCIE_COMPAT                        "fsl,ls1021a-pcie"
> > > +#ifdef CONFIG_PCI
> > > +#define CONFIG_PCI_SCAN_SHOW
> > > +#endif
> > > +
> > > +#define CONFIG_PEN_ADDR_BIG_ENDIAN
> > > +#define CONFIG_LAYERSCAPE_NS_ACCESS
> > > +#define CONFIG_SMP_PEN_ADDR            0x01ee0200
> > > +#define COUNTER_FREQUENCY              12500000
> > > +
> > > +#define CONFIG_HWCONFIG
> > > +#define HWCONFIG_BUFFER_SIZE           256
> > > +
> > > +#define CONFIG_FSL_DEVICE_DISABLE
> > > +
> > > +#define BOOT_TARGET_DEVICES(func) \
> > > +       func(MMC, mmc, 0) \
> > > +       func(USB, usb, 0) \
> > > +       func(DHCP, dhcp, na)
> > > +#include <config_distro_bootcmd.h>
> > > +
> > > +#define CONFIG_EXTRA_ENV_SETTINGS                                      \
> > > +       "bootargs=root=/dev/ram0 rw console=ttyS0,115200\0"             \
> > > +       "initrd_high=0xffffffff\0"                                      \
> > > +       "fdt_high=0xffffffff\0"                                         \
> > > +       "fdt_addr=0x64f00000\0"                                         \
> > > +       "kernel_addr=0x61000000\0"                                      \
> > > +       "kernelheader_addr=0x60800000\0"                                \
> > > +       "scriptaddr=0x80000000\0"                                       \
> > > +       "scripthdraddr=0x80080000\0"                                    \
> > > +       "fdtheader_addr_r=0x80100000\0"                                 \
> > > +       "kernelheader_addr_r=0x80200000\0"                              \
> > > +       "kernel_addr_r=0x80008000\0"                                    \
> > > +       "kernelheader_size=0x40000\0"                                   \
> > > +       "fdt_addr_r=0x8f000000\0"                                       \
> > > +       "ramdisk_addr_r=0xa0000000\0"                                   \
> > > +       "load_addr=0x80008000\0"                                        \
> > > +       "kernel_size=0x2800000\0"                                       \
> > > +       "kernel_addr_sd=0x8000\0"                                       \
> > > +       "kernel_size_sd=0x14000\0"                                      \
> > > +       "kernelhdr_addr_sd=0x4000\0"                                    \
> > > +       "kernelhdr_size_sd=0x10\0"                                      \
> > > +       BOOTENV                                                         \
> > > +       "boot_scripts=ls1021atsn_boot.scr\0"                            \
> > > +       "boot_script_hdr=hdr_ls1021atsn_bs.out\0"                       \
> > > +               "scan_dev_for_boot_part="                               \
> > > +                       "part list ${devtype} ${devnum} devplist; "     \
> > > +                       "env exists devplist || setenv devplist 1; "    \
> > > +                       "for distro_bootpart in ${devplist}; do "       \
> > > +                       "if fstype ${devtype} "                         \
> > > +                               "${devnum}:${distro_bootpart} "         \
> > > +                               "bootfstype; then "                     \
> > > +                               "run scan_dev_for_boot; "               \
> > > +                       "fi; "                                          \
> > > +               "done\0"                                                \
> > > +       "scan_dev_for_boot="                                            \
> > > +               "echo Scanning ${devtype} "                             \
> > > +                               "${devnum}:${distro_bootpart}...; "     \
> > > +               "for prefix in ${boot_prefixes}; do "                   \
> > > +                       "run scan_dev_for_scripts; "                    \
> > > +                       "run scan_dev_for_extlinux; "                   \
> > > +               "done;"                                                 \
> > > +               "\0"                                                    \
> > > +       "boot_a_script="                                                \
> > > +               "load ${devtype} ${devnum}:${distro_bootpart} "         \
> > > +                       "${scriptaddr} ${prefix}${script}; "            \
> > > +               "env exists secureboot && load ${devtype} "             \
> > > +                       "${devnum}:${distro_bootpart} "                 \
> > > +                       "${scripthdraddr} ${prefix}${boot_script_hdr} " \
> > > +                       "&& esbc_validate ${scripthdraddr};"            \
> > > +               "source ${scriptaddr}\0"                                \
> > > +       "qspi_bootcmd=echo Trying load from qspi..;"                    \
> > > +               "sf probe && sf read $load_addr "                       \
> > > +               "$kernel_addr $kernel_size; env exists secureboot "     \
> > > +               "&& sf read $kernelheader_addr_r $kernelheader_addr "   \
> > > +               "$kernelheader_size && esbc_validate ${kernelheader_addr_r}; " \
> > > +               "bootm $load_addr#$board\0"                             \
> > > +       "sd_bootcmd=echo Trying load from SD ..;"                       \
> > > +               "mmcinfo && mmc read $load_addr "                       \
> > > +               "$kernel_addr_sd $kernel_size_sd && "                   \
> > > +               "env exists secureboot && mmc read $kernelheader_addr_r " \
> > > +               "$kernelhdr_addr_sd $kernelhdr_size_sd "                \
> > > +               " && esbc_validate ${kernelheader_addr_r};"             \
> > > +               "bootm $load_addr#$board\0"
> > > +
> > > +#undef CONFIG_BOOTCOMMAND
> > > +#if defined(CONFIG_QSPI_BOOT) || defined(CONFIG_SD_BOOT_QSPI)
> > > +#define CONFIG_BOOTCOMMAND "run distro_bootcmd; run qspi_bootcmd; "    \
> > > +                          "env exists secureboot && esbc_halt"
> > > +#elif defined(CONFIG_SD_BOOT)
> > > +#define CONFIG_BOOTCOMMAND "run distro_bootcmd; run sd_bootcmd; "      \
> > > +                          "env exists secureboot && esbc_halt;"
> > > +#endif
> > > +
> > > +/*
> > > + * Miscellaneous configurable options
> > > + */
> > > +#define CONFIG_SYS_CBSIZE              256     /* Console I/O Buffer Size */
> > > +#define CONFIG_SYS_PBSIZE              \
> > > +               (CONFIG_SYS_CBSIZE + sizeof(CONFIG_SYS_PROMPT) + 16)
> > > +#define CONFIG_SYS_MAXARGS             16      /* max number of command args */
> > > +#define CONFIG_SYS_BARGSIZE            CONFIG_SYS_CBSIZE
> > > +
> > > +#define CONFIG_SYS_LOAD_ADDR           0x82000000
> > > +
> > > +#define CONFIG_LS102XA_STREAM_ID
> > > +
> > > +#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)
> > > +
> > > +#ifdef CONFIG_SPL_BUILD
> > > +#define CONFIG_SYS_MONITOR_BASE CONFIG_SPL_TEXT_BASE
> > > +#else
> > > +#define CONFIG_SYS_MONITOR_BASE CONFIG_SYS_TEXT_BASE    /* start of monitor */
> > > +#endif
> > > +
> > > +#define CONFIG_SYS_QE_FW_ADDR          0x67f40000
> > > +
> > > +/*
> > > + * Environment
> > > + */
> > > +#define CONFIG_ENV_OVERWRITE
> > > +
> > > +#if defined(CONFIG_SD_BOOT)
> > > +#define CONFIG_ENV_OFFSET              0x300000
> > > +#define CONFIG_SYS_MMC_ENV_DEV         0
> > > +#define CONFIG_ENV_SIZE                        0x20000
> > > +#elif defined(CONFIG_QSPI_BOOT)
> > > +#define CONFIG_ENV_SIZE                        0x2000
> > > +#define CONFIG_ENV_OFFSET              0x300000
> > > +#define CONFIG_ENV_SECT_SIZE           0x40000
> > > +#endif
> > > +
> > > +#define CONFIG_OF_BOARD_SETUP
> > > +#define CONFIG_OF_STDOUT_VIA_ALIAS
> > > +#define CONFIG_MISC_INIT_R
> > > +
> > > +#include <asm/fsl_secure_boot.h>
> > > +#define CONFIG_SYS_BOOTM_LEN 0x8000000 /* 128 MB */
> > > +
> > > +#endif
> > > --
> > > 2.17.1
> > >
> > > _______________________________________________
> > > U-Boot mailing list
> > > U-Boot@lists.denx.de
> > > https://lists.denx.de/listinfo/u-boot
>
> Thanks,
> -Vladimir
> _______________________________________________
> U-Boot mailing list
> U-Boot@lists.denx.de
> https://lists.denx.de/listinfo/u-boot
Vladimir Oltean July 15, 2019, 10:26 p.m. UTC | #9
On Tue, 16 Jul 2019 at 01:20, Joe Hershberger <joe.hershberger@ni.com> wrote:
>
> On Mon, Jul 15, 2019 at 4:57 PM Vladimir Oltean <olteanv@gmail.com> wrote:
> >
> > Hi Joe,
> >
> > On Mon, 15 Jul 2019 at 22:17, Joe Hershberger <joe.hershberger@ni.com> wrote:
> > >
> > > On Sun, Jun 23, 2019 at 12:53 PM Vladimir Oltean <olteanv@gmail.com> wrote:
> > > >
> > > > From: Jianchao Wang <jianchao.wang@nxp.com>
> > > >
> > > > The LS1021A-TSN is a development board built by VVDN/Argonboards in
> > > > partnership with NXP.
> > > >
> > > > It features the LS1021A SoC and the first-generation SJA1105T Ethernet
> > > > switch for prototyping implementations of a subset of IEEE 802.1 TSN
> > > > standards.
> > > >
> > > > Supported boot media: microSD card (via SPL), QSPI flash.
> > > >
> > > > Rev. A of the board uses a Spansion S25FL512S_256K serial flash, which
> > > > is 64 MB in size and has an erase sector size of 256KB (therefore,
> > > > flashing the RCW would erase part of U-boot).
> > > >
> > > > Rev. B and C of the board use a Spansion S25FL256S1 serial flash, which
> > > > is only 32 MB in size but has an erase sector size of 64KB (therefore
> > > > the RCW image can be flashed without erasing U-boot).
> > > >
> > > > To avoid the problems above, the U-boot base address has been selected
> > > > at 0x100000 (the start of the 5th 256KB erase sector), which works for
> > > > all board revisions. Actually 0x40000 would have been enough, but
> > > > 0x100000 is common for all Layerscape devices.
> > > >
> > > > eTSEC3 is connecting directly to SJA1105 via an RGMII fixed-link, but
> > > > SJA1105 is currently not supported by uboot. Therefore, eTSEC3 is
> > > > disabled.
> > > >
> > > > Signed-off-by: Xiaoliang Yang <xiaoliang.yang@nxp.com>
> > > > Signed-off-by: Mingkai Hu <mingkai.hu@nxp.com>
> > > > Signed-off-by: Jianchao Wang <jianchao.wang@nxp.com>
> > > > Signed-off-by: Changming Huang <jerry.huang@nxp.com>
> > > >
> > > > [Vladimir] Code taken from https://github.com/openil/u-boot (which
> > > > itself is mostly copied from ls1021a-iot) and adapted with the following
> > > > changes:
> > > >
> > > > - Add a008850 errata workaround
> > > > - Converted eTSEC, MMC to DM to avoid all build warnings
> > > > - Plugged in distro boot feature, including support for extlinux.conf
> > > > - Added defconfig for QSPI boot
> > > > - Added the board/freescale/ls1021atsn/README.rst for initial setup
> > > >
> > > > Signed-off-by: Vladimir Oltean <olteanv@gmail.com>
> > > > ---
>
> [ ... ]
>
> > > > +int board_early_init_f(void)
> > > > +{
> > > > +       struct ccsr_scfg *scfg = (struct ccsr_scfg *)CONFIG_SYS_FSL_SCFG_ADDR;
> > > > +
> > > > +#ifdef CONFIG_TSEC_ENET
> > > > +       /* Clear BD & FR bits for big endian BD's and frame data (aka set
> > >
> > > Nit: Multi-line comment format.  I'm curious why checkpatch.pl doesn't
> > > catch this sometimes.
> > >
> >
> > What seems to be the problem with this? Do you prefer to see a first
> > line with just " /* "?
>
> Yes. See [1] and [2]. I tried to make the intent more clear at [2].
>
> [1] - https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/Documentation/process/coding-style.rst#n543
> [2] - http://www.denx.de/wiki/U-Boot/CodingStyle
>

Oh, I wasn't aware that the coding style for the Linux net-next
mailing list is the exception rather than the rule. Thanks for letting
me know.

> >
> > > > +        * correct eTSEC endianness). This is crucial in ensuring that it does
> > > > +        * not report Data Parity Errors in its RX/TX FIFOs when attempting to
> > > > +        * send traffic.
> > > > +        */
> > > > +       clrbits_be32(&scfg->etsecdmamcr, SCFG_ETSECDMAMCR_LE_BD_FR);
> > > > +       /* EC3_GTX_CLK125 (of enet2) used for all RGMII interfaces */
> > > > +       out_be32(&scfg->etsecmcr, SCFG_ETSECCMCR_GE2_CLK125);
> > > > +#endif
> > > > +
> > > > +#ifdef CONFIG_FSL_IFC
> > > > +       init_early_memctl_regs();
> > > > +#endif
> > > > +
> > > > +       arch_soc_init();
> > > > +
> > > > +#if defined(CONFIG_DEEP_SLEEP)
> > > > +       if (is_warm_boot()) {
> > > > +               timer_init();
> > > > +               dram_init();
> > > > +       }
> > > > +#endif
> > > > +
> > > > +       return 0;
> > > > +}
> > > > +
> > > > +#ifdef CONFIG_SPL_BUILD
> > > > +void board_init_f(ulong dummy)
> > > > +{
> > > > +       void (*second_uboot)(void);
> > > > +
> > > > +       /* Clear the BSS */
> > > > +       memset(__bss_start, 0, __bss_end - __bss_start);
> > > > +
> > > > +       get_clocks();
> > > > +
> > > > +#if defined(CONFIG_DEEP_SLEEP)
> > > > +       if (is_warm_boot())
> > > > +               fsl_dp_disable_console();
> > > > +#endif
> > > > +
> > > > +       preloader_console_init();
> > > > +
> > > > +       dram_init();
> > > > +
> > > > +       /* Allow OCRAM access permission as R/W */
> > > > +#ifdef CONFIG_LAYERSCAPE_NS_ACCESS
> > > > +       enable_layerscape_ns_access();
> > > > +       enable_layerscape_ns_access();
> > > > +#endif
> > > > +
> > > > +       /*
> > > > +        * if it is woken up from deep sleep, then jump to second
> > > > +        * stage uboot and continue executing without recopying
> > >
> > > U-Boot
> > >
> > > > +        * it from SD since it has already been reserved in memory
> > > > +        * in last boot.
> > > > +        */
> > > > +       if (is_warm_boot()) {
> > > > +               second_uboot = (void (*)(void))CONFIG_SYS_TEXT_BASE;
> > > > +               second_uboot();
> > > > +       }
> > > > +
> > > > +       board_init_r(NULL, 0);
> > > > +}
> > > > +#endif
> > > > +
> > > > +int board_init(void)
> > > > +{
> > > > +#ifndef CONFIG_SYS_FSL_NO_SERDES
> > > > +       fsl_serdes_init();
> > > > +#endif
> > > > +       ls102xa_smmu_stream_id_init();
> > > > +
> > > > +#ifdef CONFIG_LAYERSCAPE_NS_ACCESS
> > > > +       enable_layerscape_ns_access();
> > > > +#endif
> > > > +
> > > > +#ifdef CONFIG_U_QE
> > > > +       u_qe_init();
> > > > +#endif
> > > > +
> > > > +       return 0;
> > > > +}
> > > > +
> > > > +#if defined(CONFIG_SPL_BUILD)
> > > > +void spl_board_init(void)
> > > > +{
> > > > +       ls102xa_smmu_stream_id_init();
> > > > +}
> > > > +#endif
> > > > +
> > > > +#ifdef CONFIG_BOARD_LATE_INIT
> > > > +int board_late_init(void)
> > > > +{
> > > > +#ifdef CONFIG_CHAIN_OF_TRUST
> > > > +       fsl_setenv_chain_of_trust();
> > > > +#endif
> > > > +
> > > > +       return 0;
> > > > +}
> > > > +#endif
> > > > +
> > > > +#if defined(CONFIG_MISC_INIT_R)
> > > > +int misc_init_r(void)
> > > > +{
> > > > +#ifdef CONFIG_FSL_DEVICE_DISABLE
> > > > +       device_disable(devdis_tbl, ARRAY_SIZE(devdis_tbl));
> > > > +#endif
> > > > +
> > > > +#ifdef CONFIG_FSL_CAAM
> > > > +       return sec_init();
> > > > +#endif
> > > > +}
> > > > +#endif
> > > > +
> > > > +#if defined(CONFIG_DEEP_SLEEP)
> > > > +void board_sleep_prepare(void)
> > > > +{
> > > > +#ifdef CONFIG_LAYERSCAPE_NS_ACCESS
> > > > +       enable_layerscape_ns_access();
> > > > +#endif
> > > > +}
> > > > +#endif
> > > > +
> > > > +int ft_board_setup(void *blob, bd_t *bd)
> > > > +{
> > > > +       ft_cpu_setup(blob, bd);
> > > > +
> > > > +#ifdef CONFIG_PCI
> > > > +       ft_pci_setup(blob, bd);
> > > > +#endif
> > > > +
> > > > +       return 0;
> > > > +}
> > > > diff --git a/board/freescale/ls1021atsn/ls102xa_pbi.cfg b/board/freescale/ls1021atsn/ls102xa_pbi.cfg
> > > > new file mode 100644
> > > > index 000000000000..a8ba184c6684
> > > > --- /dev/null
> > > > +++ b/board/freescale/ls1021atsn/ls102xa_pbi.cfg
> > >
> > > What is this file? Is it built by something?
> > >
> >
> > Yes, search for CONFIG_SYS_FSL_PBL_PBI in include/configs/ls1021atsn.h
> > and in the main Makefile.
> > So the boot ROM of the SoC searches for a 512-bit wide data structure
> > starting with sector 8 of the MMC called RCW (Reset Configuration
> > Word). This defines PLL frequencies, SerDes protocols, pinmuxing etc
> > on the SoC. The RCW can also have a sequence of PBL (Pre-Boot Loader)
> > commands appended to it - generally these are memory write operations
> > that do stuff such as errata workarounds before the execution
> > transfers to the boot loader. Actually I believe, but can't prove,
> > that it is the PBL who copies the U-Boot SPL from MMC into an internal
> > SRAM called OCRAM (on-chip RAM) before transferring the execution to
> > it. I say I can't prove this because I would have expected to
> > recognize this block copy command in the file you asked about.
> > The takeaway is that for MMC-based booting, the RCW and PBI commands
> > are packaged together in a file called u-boot-with-spl-pbl.bin. For
> > QSPI-based booting that is not the case - the SPL and the OCRAM are
> > not involved because the QSPI flash is memory-mapped so the CPU can
> > execute the U-Boot image directly. In the case of booting from QSPI
> > flash, the RCW and PBL commands are not packaged with the U-Boot
> > image, but instead you're supposed to flash them separately. To be
> > honest I don't know why it is like that - I'm not a big fan of keeping
> > a relatively opaque hex dump of the RCW and PBL commands in U-Boot
> > (let alone that the process is not the same for all boot sources).
>
> Thanks for the explanation.
>
> >
> > > > @@ -0,0 +1,15 @@
> > > > +#PBI commands
> > > > +
> > > > +09570200 ffffffff
> > > > +09570158 00000300
> > > > +8940007c 21f47300
> > > > +
> > > > +# Configure Scratch register
> > > > +09ee0200 10000000
> > > > +# Configure alternate space
> > > > +09570158 00001000
> > > > +# Flush PBL data
> > > > +096100c0 000FFFFF
> > > > +
> > > > +09ea085c 00502880
> > > > +09ea0560 80800000
>
> [ ... ]
>
> > > > +/* SPI */
> > > > +#if defined(CONFIG_QSPI_BOOT) || defined(CONFIG_SD_BOOT_QSPI)
> > > > +/* QSPI */
> > > > +#define FSL_QSPI_FLASH_SIZE            (1 << 24)
> > > > +#define FSL_QSPI_FLASH_NUM             2
> > > > +/* DSPI */
> > > > +#endif
> > > > +
> > > > +#ifdef CONFIG_TSEC_ENET
> > > > +#define CONFIG_ETHPRIME                        "ethernet@2d10000"
> > >
> > > Where does this name come from? Is this not the first mac, i.e. would
> > > you get this without the explicit setting ethprime?
> > >
> >
> > I don't know, I didn't try not setting this. It is the first MAC, yes.
>
> I would recommend trying it without setting this. It's usually only
> helpful of you need the second as default or something.
>
> >
> > > > +#endif
> > > > +
> > > > +/* PCIe */
> > > > +#define CONFIG_PCIE1                   /* PCIE controller 1 */
> > > > +#define CONFIG_PCIE2                   /* PCIE controller 2 */
> > > > +#define FSL_PCIE_COMPAT                        "fsl,ls1021a-pcie"
> > > > +#ifdef CONFIG_PCI
> > > > +#define CONFIG_PCI_SCAN_SHOW
> > > > +#endif
> > > > +
> > > > +#define CONFIG_PEN_ADDR_BIG_ENDIAN
> > > > +#define CONFIG_LAYERSCAPE_NS_ACCESS
> > > > +#define CONFIG_SMP_PEN_ADDR            0x01ee0200
> > > > +#define COUNTER_FREQUENCY              12500000
> > > > +
> > > > +#define CONFIG_HWCONFIG
> > > > +#define HWCONFIG_BUFFER_SIZE           256
> > > > +
> > > > +#define CONFIG_FSL_DEVICE_DISABLE
> > > > +
> > > > +#define BOOT_TARGET_DEVICES(func) \
> > > > +       func(MMC, mmc, 0) \
> > > > +       func(USB, usb, 0) \
> > > > +       func(DHCP, dhcp, na)
> > > > +#include <config_distro_bootcmd.h>
> > > > +
> > > > +#define CONFIG_EXTRA_ENV_SETTINGS                                      \
> > > > +       "bootargs=root=/dev/ram0 rw console=ttyS0,115200\0"             \
> > > > +       "initrd_high=0xffffffff\0"                                      \
> > > > +       "fdt_high=0xffffffff\0"                                         \
> > > > +       "fdt_addr=0x64f00000\0"                                         \
> > > > +       "kernel_addr=0x61000000\0"                                      \
> > > > +       "kernelheader_addr=0x60800000\0"                                \
> > > > +       "scriptaddr=0x80000000\0"                                       \
> > > > +       "scripthdraddr=0x80080000\0"                                    \
> > > > +       "fdtheader_addr_r=0x80100000\0"                                 \
> > > > +       "kernelheader_addr_r=0x80200000\0"                              \
> > > > +       "kernel_addr_r=0x80008000\0"                                    \
> > > > +       "kernelheader_size=0x40000\0"                                   \
> > > > +       "fdt_addr_r=0x8f000000\0"                                       \
> > > > +       "ramdisk_addr_r=0xa0000000\0"                                   \
> > > > +       "load_addr=0x80008000\0"                                        \
> > > > +       "kernel_size=0x2800000\0"                                       \
> > > > +       "kernel_addr_sd=0x8000\0"                                       \
> > > > +       "kernel_size_sd=0x14000\0"                                      \
> > > > +       "kernelhdr_addr_sd=0x4000\0"                                    \
> > > > +       "kernelhdr_size_sd=0x10\0"                                      \
> > > > +       BOOTENV                                                         \
> > > > +       "boot_scripts=ls1021atsn_boot.scr\0"                            \
> > > > +       "boot_script_hdr=hdr_ls1021atsn_bs.out\0"                       \
> > > > +               "scan_dev_for_boot_part="                               \
> > > > +                       "part list ${devtype} ${devnum} devplist; "     \
> > > > +                       "env exists devplist || setenv devplist 1; "    \
> > > > +                       "for distro_bootpart in ${devplist}; do "       \
> > > > +                       "if fstype ${devtype} "                         \
> > > > +                               "${devnum}:${distro_bootpart} "         \
> > > > +                               "bootfstype; then "                     \
> > > > +                               "run scan_dev_for_boot; "               \
> > > > +                       "fi; "                                          \
> > > > +               "done\0"                                                \
> > > > +       "scan_dev_for_boot="                                            \
> > > > +               "echo Scanning ${devtype} "                             \
> > > > +                               "${devnum}:${distro_bootpart}...; "     \
> > > > +               "for prefix in ${boot_prefixes}; do "                   \
> > > > +                       "run scan_dev_for_scripts; "                    \
> > > > +                       "run scan_dev_for_extlinux; "                   \
> > > > +               "done;"                                                 \
> > > > +               "\0"                                                    \
> > > > +       "boot_a_script="                                                \
> > > > +               "load ${devtype} ${devnum}:${distro_bootpart} "         \
> > > > +                       "${scriptaddr} ${prefix}${script}; "            \
> > > > +               "env exists secureboot && load ${devtype} "             \
> > > > +                       "${devnum}:${distro_bootpart} "                 \
> > > > +                       "${scripthdraddr} ${prefix}${boot_script_hdr} " \
> > > > +                       "&& esbc_validate ${scripthdraddr};"            \
> > > > +               "source ${scriptaddr}\0"                                \
> > > > +       "qspi_bootcmd=echo Trying load from qspi..;"                    \
> > > > +               "sf probe && sf read $load_addr "                       \
> > > > +               "$kernel_addr $kernel_size; env exists secureboot "     \
> > > > +               "&& sf read $kernelheader_addr_r $kernelheader_addr "   \
> > > > +               "$kernelheader_size && esbc_validate ${kernelheader_addr_r}; " \
> > > > +               "bootm $load_addr#$board\0"                             \
> > > > +       "sd_bootcmd=echo Trying load from SD ..;"                       \
> > > > +               "mmcinfo && mmc read $load_addr "                       \
> > > > +               "$kernel_addr_sd $kernel_size_sd && "                   \
> > > > +               "env exists secureboot && mmc read $kernelheader_addr_r " \
> > > > +               "$kernelhdr_addr_sd $kernelhdr_size_sd "                \
> > > > +               " && esbc_validate ${kernelheader_addr_r};"             \
> > > > +               "bootm $load_addr#$board\0"
> > > > +
> > > > +#undef CONFIG_BOOTCOMMAND
> > > > +#if defined(CONFIG_QSPI_BOOT) || defined(CONFIG_SD_BOOT_QSPI)
> > > > +#define CONFIG_BOOTCOMMAND "run distro_bootcmd; run qspi_bootcmd; "    \
> > > > +                          "env exists secureboot && esbc_halt"
> > > > +#elif defined(CONFIG_SD_BOOT)
> > > > +#define CONFIG_BOOTCOMMAND "run distro_bootcmd; run sd_bootcmd; "      \
> > > > +                          "env exists secureboot && esbc_halt;"
> > > > +#endif
> > > > +
> > > > +/*
> > > > + * Miscellaneous configurable options
> > > > + */
> > > > +#define CONFIG_SYS_CBSIZE              256     /* Console I/O Buffer Size */
> > > > +#define CONFIG_SYS_PBSIZE              \
> > > > +               (CONFIG_SYS_CBSIZE + sizeof(CONFIG_SYS_PROMPT) + 16)
> > > > +#define CONFIG_SYS_MAXARGS             16      /* max number of command args */
> > > > +#define CONFIG_SYS_BARGSIZE            CONFIG_SYS_CBSIZE
> > > > +
> > > > +#define CONFIG_SYS_LOAD_ADDR           0x82000000
> > > > +
> > > > +#define CONFIG_LS102XA_STREAM_ID
> > > > +
> > > > +#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)
> > > > +
> > > > +#ifdef CONFIG_SPL_BUILD
> > > > +#define CONFIG_SYS_MONITOR_BASE CONFIG_SPL_TEXT_BASE
> > > > +#else
> > > > +#define CONFIG_SYS_MONITOR_BASE CONFIG_SYS_TEXT_BASE    /* start of monitor */
> > > > +#endif
> > > > +
> > > > +#define CONFIG_SYS_QE_FW_ADDR          0x67f40000
> > > > +
> > > > +/*
> > > > + * Environment
> > > > + */
> > > > +#define CONFIG_ENV_OVERWRITE
> > > > +
> > > > +#if defined(CONFIG_SD_BOOT)
> > > > +#define CONFIG_ENV_OFFSET              0x300000
> > > > +#define CONFIG_SYS_MMC_ENV_DEV         0
> > > > +#define CONFIG_ENV_SIZE                        0x20000
> > > > +#elif defined(CONFIG_QSPI_BOOT)
> > > > +#define CONFIG_ENV_SIZE                        0x2000
> > > > +#define CONFIG_ENV_OFFSET              0x300000
> > > > +#define CONFIG_ENV_SECT_SIZE           0x40000
> > > > +#endif
> > > > +
> > > > +#define CONFIG_OF_BOARD_SETUP
> > > > +#define CONFIG_OF_STDOUT_VIA_ALIAS
> > > > +#define CONFIG_MISC_INIT_R
> > > > +
> > > > +#include <asm/fsl_secure_boot.h>
> > > > +#define CONFIG_SYS_BOOTM_LEN 0x8000000 /* 128 MB */
> > > > +
> > > > +#endif
> > > > --
> > > > 2.17.1
> > > >
> > > > _______________________________________________
> > > > U-Boot mailing list
> > > > U-Boot@lists.denx.de
> > > > https://lists.denx.de/listinfo/u-boot
> >
> > Thanks,
> > -Vladimir
> > _______________________________________________
> > U-Boot mailing list
> > U-Boot@lists.denx.de
> > https://lists.denx.de/listinfo/u-boot

Regards,
-Vladimir
diff mbox series

Patch

diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
index 01ff57cf1bec..5edac7ea2bd5 100644
--- a/arch/arm/Kconfig
+++ b/arch/arm/Kconfig
@@ -1327,6 +1327,19 @@  config TARGET_LS1021ATWR
 	select SUPPORT_SPL
 	imply SCSI
 
+config TARGET_LS1021ATSN
+	bool "Support ls1021atsn"
+	select ARCH_LS1021A
+	select ARCH_SUPPORT_PSCI
+	select BOARD_EARLY_INIT_F
+	select BOARD_LATE_INIT
+	select CPU_V7A
+	select CPU_V7_HAS_NONSEC
+	select CPU_V7_HAS_VIRT
+	select LS1_DEEP_SLEEP
+	select SUPPORT_SPL
+	imply SCSI
+
 config TARGET_LS1021AIOT
 	bool "Support ls1021aiot"
 	select ARCH_LS1021A
@@ -1693,6 +1706,7 @@  source "board/freescale/ls1028a/Kconfig"
 source "board/freescale/ls1021aqds/Kconfig"
 source "board/freescale/ls1043aqds/Kconfig"
 source "board/freescale/ls1021atwr/Kconfig"
+source "board/freescale/ls1021atsn/Kconfig"
 source "board/freescale/ls1021aiot/Kconfig"
 source "board/freescale/ls1046aqds/Kconfig"
 source "board/freescale/ls1043ardb/Kconfig"
diff --git a/arch/arm/dts/Makefile b/arch/arm/dts/Makefile
index 528fb909d5b0..28590b0c5530 100644
--- a/arch/arm/dts/Makefile
+++ b/arch/arm/dts/Makefile
@@ -325,7 +325,7 @@  dtb-$(CONFIG_TARGET_STV0991) += stv0991.dtb
 dtb-$(CONFIG_ARCH_LS1021A) += ls1021a-qds-duart.dtb \
 	ls1021a-qds-lpuart.dtb \
 	ls1021a-twr-duart.dtb ls1021a-twr-lpuart.dtb \
-	ls1021a-iot-duart.dtb
+	ls1021a-iot-duart.dtb ls1021a-tsn.dtb
 dtb-$(CONFIG_FSL_LSCH3) += fsl-ls2080a-qds.dtb \
 	fsl-ls2080a-rdb.dtb \
 	fsl-ls2081a-rdb.dtb \
diff --git a/arch/arm/dts/ls1021a-tsn.dts b/arch/arm/dts/ls1021a-tsn.dts
new file mode 100644
index 000000000000..f633074099dc
--- /dev/null
+++ b/arch/arm/dts/ls1021a-tsn.dts
@@ -0,0 +1,77 @@ 
+// SPDX-License-Identifier: GPL-2.0
+/* Copyright 2016-2018 NXP Semiconductors
+ * Copyright 2019 Vladimir Oltean <olteanv@gmail.com>
+ */
+
+/dts-v1/;
+#include "ls1021a.dtsi"
+
+/ {
+	model = "NXP LS1021A-TSN Board";
+
+	aliases {
+		enet0-sgmii-phy = &sgmii_phy2;
+		enet1-sgmii-phy = &sgmii_phy1;
+		spi0 = &qspi;
+		spi1 = &dspi1;
+	};
+};
+
+&enet0 {
+	tbi-handle = <&tbi0>;
+	phy-handle = <&sgmii_phy2>;
+	phy-mode = "sgmii";
+	status = "okay";
+};
+
+&enet1 {
+	tbi-handle = <&tbi1>;
+	phy-handle = <&sgmii_phy1>;
+	phy-mode = "sgmii";
+	status = "okay";
+};
+
+&i2c0 {
+	status = "okay";
+};
+
+&mdio0 {
+	/* AR8031 */
+	sgmii_phy1: ethernet-phy@1 {
+		reg = <0x1>;
+	};
+
+	/* AR8031 */
+	sgmii_phy2: ethernet-phy@2 {
+		reg = <0x2>;
+	};
+
+	/* SGMII PCS for enet0 */
+	tbi0: tbi-phy@1f {
+		reg = <0x1f>;
+		device_type = "tbi-phy";
+	};
+};
+
+&mdio1 {
+	/* SGMII PCS for enet1 */
+	tbi1: tbi-phy@1f {
+		reg = <0x1f>;
+		device_type = "tbi-phy";
+	};
+};
+
+&qspi {
+	bus-num = <0>;
+	status = "okay";
+
+	flash@0 {
+		compatible = "spi-flash";
+		spi-max-frequency = <20000000>;
+		reg = <0>;
+	};
+};
+
+&uart0 {
+	status = "okay";
+};
diff --git a/board/freescale/ls1021atsn/Kconfig b/board/freescale/ls1021atsn/Kconfig
new file mode 100644
index 000000000000..d999fa469002
--- /dev/null
+++ b/board/freescale/ls1021atsn/Kconfig
@@ -0,0 +1,18 @@ 
+# SPDX-License-Identifier: GPL-2.0
+if TARGET_LS1021ATSN
+
+config SYS_BOARD
+	default "ls1021atsn"
+
+config SYS_VENDOR
+	default "freescale"
+
+config SYS_SOC
+	default "ls102xa"
+
+config SYS_CONFIG_NAME
+	default "ls1021atsn"
+
+source "board/freescale/common/Kconfig"
+
+endif
diff --git a/board/freescale/ls1021atsn/MAINTAINERS b/board/freescale/ls1021atsn/MAINTAINERS
new file mode 100644
index 000000000000..560bb615d2fe
--- /dev/null
+++ b/board/freescale/ls1021atsn/MAINTAINERS
@@ -0,0 +1,8 @@ 
+NXP LS1021A-TSN Board
+M:	Vladimir Oltean <olteanv@gmail.com>
+S:	Maintained
+F:	arch/arm/dts/ls1021a-tsn.dts
+F:	board/freescale/ls1021atsn/
+F:	include/configs/ls1021atsn.h
+F:	configs/ls1021atsn_qspi_defconfig
+F:	configs/ls1021atsn_sdcard_defconfig
diff --git a/board/freescale/ls1021atsn/Makefile b/board/freescale/ls1021atsn/Makefile
new file mode 100644
index 000000000000..b4808f05e8e0
--- /dev/null
+++ b/board/freescale/ls1021atsn/Makefile
@@ -0,0 +1,3 @@ 
+# SPDX-License-Identifier: GPL-2.0
+obj-y += ls1021atsn.o
+obj-$(CONFIG_ARMV7_PSCI) += ../ls1021atwr/psci.o
diff --git a/board/freescale/ls1021atsn/README.rst b/board/freescale/ls1021atsn/README.rst
new file mode 100644
index 000000000000..e986f460c4d4
--- /dev/null
+++ b/board/freescale/ls1021atsn/README.rst
@@ -0,0 +1,96 @@ 
+.. SPDX-License-Identifier: GPL-2.0
+
+LS1021A-TSN Board Overview
+==========================
+
+ - 1GB DDR3 at 800 MHz
+ - Spansion/Cypress 64 MB (Rev. A) / 32 MB (Rev. B and C) QSPI NOR flash
+ - Ethernet
+     - 2 SGMII 10/100/1G Ethernet ports (Atheros AR8031)
+     - One SJA1105T switch with 4 Ethernet ports (Broadcom BCM5464R)
+     - One internal RGMII port connected to the switch
+ - SDHC
+     - microSDHC/SDXC connector
+ - Other I/O
+    - One Serial port
+    - Arduino and expansion headers
+    - mPCIE slot
+    - SATA port
+    - USB3.0 port
+
+LS1021A Memory map
+==================
+
+The addresses in brackets are physical addresses.
+
+==============  ==============  ==============================  =======
+Start Address   End Address     Description                     Size
+==============  ==============  ==============================  =======
+0x00_0000_0000  0x00_000F_FFFF  Secure Boot ROM                 1MB
+0x00_0100_0000  0x00_0FFF_FFFF  CCSRBAR                         240MB
+0x00_1000_0000  0x00_1000_FFFF  OCRAM0                          64KB
+0x00_1001_0000  0x00_1001_FFFF  OCRAM1                          64KB
+0x00_2000_0000  0x00_20FF_FFFF  DCSR                            16MB
+0x00_4000_0000  0x00_5FFF_FFFF  QSPI                            512MB
+0x00_6000_0000  0x00_67FF_FFFF  IFC - NOR Flash                 128MB
+0x00_8000_0000  0x00_FFFF_FFFF  DRAM1                           2GB
+==============  ==============  ==============================  =======
+
+Compiling and flashing
+======================
+
+The LS1021A-TSN board comes along with a microSD card with OpenIL U-boot.
+That will be used to update the internal QSPI flash, as well as
+
+To compile and flash an SD card image::
+
+  make ls1021atsn_sdcard_defconfig && make -j 8 && sudo cp u-boot-with-spl-pbl.bin /srv/tftpboot/
+  => tftp 0x82000000 u-boot-with-spl-pbl.bin && mmc rescan && mmc erase 8 0x1100 && mmc write 0x82000000 8 0x1100
+
+For the QSPI flash, first obtain the Reset Configuration Word binary for
+bootimg from the QSPI flash from the rcw project
+(https://source.codeaurora.org/external/qoriq/qoriq-components/rcw)::
+
+  make -j 8 && sudo cp ls1021atsn/SSR_PNS_30/rcw_1200_qspiboot.bin.swapped /srv/tftpboot/
+
+The above RCW binary takes care of swapping the QSPI AMBA memory, so that the
+U-boot binary does not need to be swapped when flashing it.
+
+To compile and flash a U-boot image for QSPI::
+
+  make ls1021atsn_qspi_defconfig && make -j 8 && sudo cp u-boot.bin /srv/tftpboot/
+
+Then optionally create a custom uboot-env.txt file (although the default
+environment already supports distro boot) and convert it to binary format::
+
+  mkenvimage -s 2M -o /srv/tftpboot/uboot-env.bin uboot-env.txt
+
+To program the QSPI flash with the images::
+
+  => tftp 0x82000000 rcw_1000_qspiboot.bin.swapped && sf probe && sf erase 0x0 +${filesize} && sf write 0x82000000 0x0 ${filesize}
+  => tftp 0x82000000 u-boot.bin && sf probe && sf erase 0x100000 +${filesize} && sf write 0x82000000 0x100000 ${filesize}
+  => tftp 0x82000000 uboot-env.bin && sf probe && sf erase 0x400000 +${filesize} && sf write 0x82000000 0x400000 ${filesize}
+
+The boards contain an AT24 I2C EEPROM that is supposed to hold the MAC
+addresses of the Ethernet interfaces, however the EEPROM comes blank out of
+the factory, and the MAC addresses are printed on a label on the bottom of
+the boards.
+
+To write the MAC addresses to the EEPROM, the following needs to be done once::
+
+  => mac id
+  => mac 0 00:1F:7B:xx:xx:xx
+  => mac 1 00:1F:7B:xx:xx:xx
+  => mac 2 00:1F:7B:xx:xx:xx
+  => mac save
+
+The switch ports do not have their own MAC address - they inherit it from the
+master enet2 port.
+
+Known issues and limitations
+============================
+
+- The 4 SJA1105 switch ports are not functional in U-boot for now.
+- Since the IFC pins are multiplexed with QSPI on LS1021A, currently there is
+  no way to talk to the CPLD for e.g. running the "qixis_reset" command, or
+  turning the fan on, etc.
diff --git a/board/freescale/ls1021atsn/ls1021atsn.c b/board/freescale/ls1021atsn/ls1021atsn.c
new file mode 100644
index 000000000000..84c2af142956
--- /dev/null
+++ b/board/freescale/ls1021atsn/ls1021atsn.c
@@ -0,0 +1,291 @@ 
+// SPDX-License-Identifier: GPL-2.0
+/* Copyright 2016-2019 NXP Semiconductors
+ */
+#include <common.h>
+#include <i2c.h>
+#include <asm/io.h>
+#include <asm/arch/immap_ls102xa.h>
+#include <asm/arch/clock.h>
+#include <asm/arch/fsl_serdes.h>
+#include <asm/arch-ls102xa/ls102xa_soc.h>
+#include <asm/arch/ls102xa_devdis.h>
+#include <asm/arch/ls102xa_soc.h>
+#include <hwconfig.h>
+#include <mmc.h>
+#include <fsl_csu.h>
+#include <fsl_esdhc.h>
+#include <fsl_ifc.h>
+#include <fsl_immap.h>
+#include <netdev.h>
+#include <spl.h>
+#include "../common/sleep.h"
+#ifdef CONFIG_U_QE
+#include <fsl_qe.h>
+#endif
+#include <fsl_validate.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+void cpld_show(void)
+{
+	struct ccsr_gur *dcfg = (struct ccsr_gur *)CONFIG_SYS_FSL_GUTS_ADDR;
+	u32 cpldrev;
+	int major;
+	int minor;
+
+	cpldrev = in_be32(&dcfg->gpporcr1);
+	major = (cpldrev >> 28) & 0xf;
+	minor = (cpldrev >> 24) & 0xf;
+
+	printf("CPLD:  V%d.%d\n", major, minor);
+}
+
+int checkboard(void)
+{
+	puts("Board: LS1021ATSN\n");
+	cpld_show();
+	return 0;
+}
+
+void ddrmc_init(void)
+{
+	struct ccsr_ddr *ddr = (struct ccsr_ddr *)CONFIG_SYS_FSL_DDR_ADDR;
+	u32 temp_sdram_cfg, tmp;
+
+	out_be32(&ddr->sdram_cfg, DDR_SDRAM_CFG);
+
+	out_be32(&ddr->cs0_bnds, DDR_CS0_BNDS);
+	out_be32(&ddr->cs0_config, DDR_CS0_CONFIG);
+
+	out_be32(&ddr->timing_cfg_0, DDR_TIMING_CFG_0);
+	out_be32(&ddr->timing_cfg_1, DDR_TIMING_CFG_1);
+	out_be32(&ddr->timing_cfg_2, DDR_TIMING_CFG_2);
+	out_be32(&ddr->timing_cfg_3, DDR_TIMING_CFG_3);
+	out_be32(&ddr->timing_cfg_4, DDR_TIMING_CFG_4);
+	out_be32(&ddr->timing_cfg_5, DDR_TIMING_CFG_5);
+
+#ifdef CONFIG_DEEP_SLEEP
+	if (is_warm_boot()) {
+		out_be32(&ddr->sdram_cfg_2,
+			 DDR_SDRAM_CFG_2 & ~SDRAM_CFG2_D_INIT);
+		out_be32(&ddr->init_addr, CONFIG_SYS_SDRAM_BASE);
+		out_be32(&ddr->init_ext_addr, (1 << 31));
+
+		/* DRAM VRef will not be trained */
+		out_be32(&ddr->ddr_cdr2,
+			 DDR_DDR_CDR2 & ~DDR_CDR2_VREF_TRAIN_EN);
+	} else
+#endif
+	{
+		out_be32(&ddr->sdram_cfg_2, DDR_SDRAM_CFG_2);
+		out_be32(&ddr->ddr_cdr2, DDR_DDR_CDR2);
+	}
+
+	out_be32(&ddr->sdram_mode, DDR_SDRAM_MODE);
+	out_be32(&ddr->sdram_mode_2, DDR_SDRAM_MODE_2);
+
+	out_be32(&ddr->sdram_interval, DDR_SDRAM_INTERVAL);
+
+	out_be32(&ddr->ddr_wrlvl_cntl, DDR_DDR_WRLVL_CNTL);
+
+	out_be32(&ddr->ddr_wrlvl_cntl_2, DDR_DDR_WRLVL_CNTL_2);
+	out_be32(&ddr->ddr_wrlvl_cntl_3, DDR_DDR_WRLVL_CNTL_3);
+
+	out_be32(&ddr->ddr_cdr1, DDR_DDR_CDR1);
+
+	out_be32(&ddr->sdram_clk_cntl, DDR_SDRAM_CLK_CNTL);
+	out_be32(&ddr->ddr_zq_cntl, DDR_DDR_ZQ_CNTL);
+
+	out_be32(&ddr->cs0_config_2, DDR_CS0_CONFIG_2);
+
+	/* DDR erratum A-009942 */
+	tmp = in_be32(&ddr->debug[28]);
+	out_be32(&ddr->debug[28], tmp | 0x0070006f);
+
+	udelay(1);
+
+#ifdef CONFIG_DEEP_SLEEP
+	if (is_warm_boot()) {
+		/* enter self-refresh */
+		temp_sdram_cfg = in_be32(&ddr->sdram_cfg_2);
+		temp_sdram_cfg |= SDRAM_CFG2_FRC_SR;
+		out_be32(&ddr->sdram_cfg_2, temp_sdram_cfg);
+
+		temp_sdram_cfg = (DDR_SDRAM_CFG_MEM_EN | SDRAM_CFG_BI);
+	} else
+#endif
+		temp_sdram_cfg = (DDR_SDRAM_CFG_MEM_EN & ~SDRAM_CFG_BI);
+
+	out_be32(&ddr->sdram_cfg, DDR_SDRAM_CFG | temp_sdram_cfg);
+
+#ifdef CONFIG_DEEP_SLEEP
+	if (is_warm_boot()) {
+		/* exit self-refresh */
+		temp_sdram_cfg = in_be32(&ddr->sdram_cfg_2);
+		temp_sdram_cfg &= ~SDRAM_CFG2_FRC_SR;
+		out_be32(&ddr->sdram_cfg_2, temp_sdram_cfg);
+	}
+#endif
+}
+
+int dram_init(void)
+{
+#if (!defined(CONFIG_SPL) || defined(CONFIG_SPL_BUILD))
+	ddrmc_init();
+#endif
+
+	erratum_a008850_post();
+
+	gd->ram_size = get_ram_size((void *)PHYS_SDRAM, PHYS_SDRAM_SIZE);
+
+#if defined(CONFIG_DEEP_SLEEP) && !defined(CONFIG_SPL_BUILD)
+	fsl_dp_resume();
+#endif
+
+	return 0;
+}
+
+int board_eth_init(bd_t *bis)
+{
+	return pci_eth_init(bis);
+}
+
+int board_early_init_f(void)
+{
+	struct ccsr_scfg *scfg = (struct ccsr_scfg *)CONFIG_SYS_FSL_SCFG_ADDR;
+
+#ifdef CONFIG_TSEC_ENET
+	/* Clear BD & FR bits for big endian BD's and frame data (aka set
+	 * correct eTSEC endianness). This is crucial in ensuring that it does
+	 * not report Data Parity Errors in its RX/TX FIFOs when attempting to
+	 * send traffic.
+	 */
+	clrbits_be32(&scfg->etsecdmamcr, SCFG_ETSECDMAMCR_LE_BD_FR);
+	/* EC3_GTX_CLK125 (of enet2) used for all RGMII interfaces */
+	out_be32(&scfg->etsecmcr, SCFG_ETSECCMCR_GE2_CLK125);
+#endif
+
+#ifdef CONFIG_FSL_IFC
+	init_early_memctl_regs();
+#endif
+
+	arch_soc_init();
+
+#if defined(CONFIG_DEEP_SLEEP)
+	if (is_warm_boot()) {
+		timer_init();
+		dram_init();
+	}
+#endif
+
+	return 0;
+}
+
+#ifdef CONFIG_SPL_BUILD
+void board_init_f(ulong dummy)
+{
+	void (*second_uboot)(void);
+
+	/* Clear the BSS */
+	memset(__bss_start, 0, __bss_end - __bss_start);
+
+	get_clocks();
+
+#if defined(CONFIG_DEEP_SLEEP)
+	if (is_warm_boot())
+		fsl_dp_disable_console();
+#endif
+
+	preloader_console_init();
+
+	dram_init();
+
+	/* Allow OCRAM access permission as R/W */
+#ifdef CONFIG_LAYERSCAPE_NS_ACCESS
+	enable_layerscape_ns_access();
+	enable_layerscape_ns_access();
+#endif
+
+	/*
+	 * if it is woken up from deep sleep, then jump to second
+	 * stage uboot and continue executing without recopying
+	 * it from SD since it has already been reserved in memory
+	 * in last boot.
+	 */
+	if (is_warm_boot()) {
+		second_uboot = (void (*)(void))CONFIG_SYS_TEXT_BASE;
+		second_uboot();
+	}
+
+	board_init_r(NULL, 0);
+}
+#endif
+
+int board_init(void)
+{
+#ifndef CONFIG_SYS_FSL_NO_SERDES
+	fsl_serdes_init();
+#endif
+	ls102xa_smmu_stream_id_init();
+
+#ifdef CONFIG_LAYERSCAPE_NS_ACCESS
+	enable_layerscape_ns_access();
+#endif
+
+#ifdef CONFIG_U_QE
+	u_qe_init();
+#endif
+
+	return 0;
+}
+
+#if defined(CONFIG_SPL_BUILD)
+void spl_board_init(void)
+{
+	ls102xa_smmu_stream_id_init();
+}
+#endif
+
+#ifdef CONFIG_BOARD_LATE_INIT
+int board_late_init(void)
+{
+#ifdef CONFIG_CHAIN_OF_TRUST
+	fsl_setenv_chain_of_trust();
+#endif
+
+	return 0;
+}
+#endif
+
+#if defined(CONFIG_MISC_INIT_R)
+int misc_init_r(void)
+{
+#ifdef CONFIG_FSL_DEVICE_DISABLE
+	device_disable(devdis_tbl, ARRAY_SIZE(devdis_tbl));
+#endif
+
+#ifdef CONFIG_FSL_CAAM
+	return sec_init();
+#endif
+}
+#endif
+
+#if defined(CONFIG_DEEP_SLEEP)
+void board_sleep_prepare(void)
+{
+#ifdef CONFIG_LAYERSCAPE_NS_ACCESS
+	enable_layerscape_ns_access();
+#endif
+}
+#endif
+
+int ft_board_setup(void *blob, bd_t *bd)
+{
+	ft_cpu_setup(blob, bd);
+
+#ifdef CONFIG_PCI
+	ft_pci_setup(blob, bd);
+#endif
+
+	return 0;
+}
diff --git a/board/freescale/ls1021atsn/ls102xa_pbi.cfg b/board/freescale/ls1021atsn/ls102xa_pbi.cfg
new file mode 100644
index 000000000000..a8ba184c6684
--- /dev/null
+++ b/board/freescale/ls1021atsn/ls102xa_pbi.cfg
@@ -0,0 +1,15 @@ 
+#PBI commands
+
+09570200 ffffffff
+09570158 00000300
+8940007c 21f47300
+
+# Configure Scratch register
+09ee0200 10000000
+# Configure alternate space
+09570158 00001000
+# Flush PBL data
+096100c0 000FFFFF
+
+09ea085c 00502880
+09ea0560 80800000
diff --git a/board/freescale/ls1021atsn/ls102xa_rcw_sd.cfg b/board/freescale/ls1021atsn/ls102xa_rcw_sd.cfg
new file mode 100644
index 000000000000..67152dd2810e
--- /dev/null
+++ b/board/freescale/ls1021atsn/ls102xa_rcw_sd.cfg
@@ -0,0 +1,8 @@ 
+# PBL preamble and RCW header
+aa55aa55 01ee0100
+
+# Disable IFC, enable QSPI and DSPI
+0608000c 00000000 00000000 00000000
+30000000 08007900 60040a00 21046000
+00000000 00000000 00000000 20002000
+20024800 8804b340 00000000 00000000
diff --git a/configs/ls1021atsn_qspi_defconfig b/configs/ls1021atsn_qspi_defconfig
new file mode 100644
index 000000000000..427881fe0c52
--- /dev/null
+++ b/configs/ls1021atsn_qspi_defconfig
@@ -0,0 +1,76 @@ 
+CONFIG_ARM=y
+CONFIG_TARGET_LS1021ATSN=y
+CONFIG_SYS_TEXT_BASE=0x40100000
+CONFIG_DEFAULT_DEVICE_TREE="ls1021a-tsn"
+CONFIG_BOARD_EARLY_INIT_F=y
+CONFIG_SYS_FSL_CLK=y
+CONFIG_SYS_EXTRA_OPTIONS="QSPI_BOOT"
+CONFIG_QSPI_BOOT=y
+CONFIG_BOOTDELAY=3
+CONFIG_HUSH_PARSER=y
+CONFIG_CMD_GREPENV=y
+CONFIG_CMD_MEMINFO=y
+CONFIG_CMD_GPT=y
+CONFIG_CMD_FAT=y
+CONFIG_FSL_ESDHC=y
+CONFIG_CMD_SF=y
+CONFIG_OF_CONTROL=y
+CONFIG_ENV_IS_IN_SPI_FLASH=y
+CONFIG_DM=y
+CONFIG_FSL_CAAM=y
+CONFIG_SPI=y
+CONFIG_SPI_FLASH=y
+CONFIG_SPI_FLASH_ATMEL=y
+CONFIG_SPI_FLASH_STMICRO=y
+CONFIG_SPI_FLASH_BAR=y
+CONFIG_SPI_FLASH_SPANSION=y
+CONFIG_NETDEVICES=y
+CONFIG_DM_ETH=y
+CONFIG_TSEC_ENET=y
+CONFIG_MII=y
+CONFIG_SYS_NS16550=y
+CONFIG_DM_SPI=y
+CONFIG_DM_SPI_FLASH=y
+CONFIG_SPI_FLASH_DATAFLASH=y
+CONFIG_FSL_DSPI=y
+CONFIG_FSL_QSPI=y
+CONFIG_PCI=y
+CONFIG_CMD_PCI=y
+CONFIG_DM_PCI=y
+CONFIG_DM_PCI_COMPAT=y
+CONFIG_CMD_MMC=y
+CONFIG_DM_MMC=y
+CONFIG_FSL_SPI_ALIGNED_TXFIFO=y
+CONFIG_USB=y
+CONFIG_DM_USB=y
+CONFIG_CMD_USB=y
+CONFIG_USB_XHCI_HCD=y
+CONFIG_USB_XHCI_FSL=y
+CONFIG_USB_XHCI_DWC3=y
+CONFIG_HAS_FSL_XHCI_USB=y
+CONFIG_USB_STORAGE=y
+CONFIG_CMD_EXT2=y
+CONFIG_PCIE_LAYERSCAPE=y
+CONFIG_PHYLIB=y
+CONFIG_PHY_GIGE=y
+CONFIG_PHY_ATHEROS=y
+CONFIG_PHY_BROADCOM=y
+CONFIG_PHY_FIXED=y
+CONFIG_CMD_PING=y
+CONFIG_CMD_DHCP=y
+CONFIG_CMD_MII=y
+CONFIG_CMDLINE_TAG=y
+CONFIG_CMDLINE_EDITING=y
+CONFIG_AUTO_COMPLETE=y
+CONFIG_NR_DRAM_BANKS=1
+CONFIG_CMD_BOOTZ=y
+CONFIG_SYS_LONGHELP=y
+CONFIG_FIT=y
+CONFIG_CMD_DM=y
+CONFIG_AHCI=y
+CONFIG_CMD_I2C=y
+CONFIG_BLK=y
+CONFIG_CMD_PART=y
+CONFIG_CMD_FS_GENERIC=y
+CONFIG_CMD_FS_UUID=y
+CONFIG_DISTRO_DEFAULTS=y
diff --git a/configs/ls1021atsn_sdcard_defconfig b/configs/ls1021atsn_sdcard_defconfig
new file mode 100644
index 000000000000..b74e01206817
--- /dev/null
+++ b/configs/ls1021atsn_sdcard_defconfig
@@ -0,0 +1,85 @@ 
+CONFIG_ARM=y
+CONFIG_TARGET_LS1021ATSN=y
+CONFIG_SPL_TEXT_BASE=0x10000000
+CONFIG_SYS_TEXT_BASE=0x82000000
+CONFIG_DEFAULT_DEVICE_TREE="ls1021a-tsn"
+CONFIG_BOARD_EARLY_INIT_F=y
+CONFIG_SPL=y
+CONFIG_SPL_FRAMEWORK=y
+CONFIG_SYS_FSL_CLK=y
+CONFIG_SYS_EXTRA_OPTIONS="RAMBOOT_PBL,SPL_FSL_PBL,SD_BOOT,SD_BOOT_QSPI"
+CONFIG_SD_BOOT=y
+CONFIG_BOOTDELAY=3
+CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_USE_SECTOR=y
+CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR=0xe8
+CONFIG_HUSH_PARSER=y
+CONFIG_CMD_GREPENV=y
+CONFIG_CMD_MEMINFO=y
+CONFIG_CMD_GPT=y
+CONFIG_CMD_FAT=y
+CONFIG_CMD_MMC=y
+CONFIG_FSL_ESDHC=y
+CONFIG_CMD_SF=y
+CONFIG_OF_CONTROL=y
+CONFIG_ENV_IS_IN_MMC=y
+CONFIG_DM=y
+CONFIG_FSL_CAAM=y
+CONFIG_SPI=y
+CONFIG_SPI_FLASH=y
+CONFIG_SPI_FLASH_ATMEL=y
+CONFIG_SPI_FLASH_STMICRO=y
+CONFIG_SPI_FLASH_BAR=y
+CONFIG_SPI_FLASH_SPANSION=y
+CONFIG_NETDEVICES=y
+CONFIG_DM_ETH=y
+CONFIG_TSEC_ENET=y
+CONFIG_MII=y
+CONFIG_SYS_NS16550=y
+CONFIG_DM_SPI=y
+CONFIG_DM_SPI_FLASH=y
+CONFIG_SPI_FLASH_DATAFLASH=y
+CONFIG_FSL_DSPI=y
+CONFIG_FSL_QSPI=y
+CONFIG_PCI=y
+CONFIG_CMD_PCI=y
+CONFIG_DM_PCI=y
+CONFIG_DM_PCI_COMPAT=y
+CONFIG_USB=y
+CONFIG_DM_USB=y
+CONFIG_CMD_USB=y
+CONFIG_USB_XHCI_HCD=y
+CONFIG_USB_XHCI_FSL=y
+CONFIG_USB_XHCI_DWC3=y
+CONFIG_HAS_FSL_XHCI_USB=y
+CONFIG_USB_STORAGE=y
+CONFIG_CMD_EXT2=y
+CONFIG_PCIE_LAYERSCAPE=y
+CONFIG_PHYLIB=y
+CONFIG_PHY_GIGE=y
+CONFIG_PHY_ATHEROS=y
+CONFIG_PHY_BROADCOM=y
+CONFIG_PHY_FIXED=y
+CONFIG_CMD_PING=y
+CONFIG_CMD_DHCP=y
+CONFIG_CMD_MII=y
+CONFIG_CMDLINE_TAG=y
+CONFIG_CMDLINE_EDITING=y
+CONFIG_AUTO_COMPLETE=y
+CONFIG_NR_DRAM_BANKS=1
+CONFIG_CMD_BOOTZ=y
+CONFIG_SYS_LONGHELP=y
+CONFIG_FIT=y
+CONFIG_SPL_MMC_SUPPORT=y
+CONFIG_SPL_SERIAL_SUPPORT=y
+CONFIG_SPL_I2C_SUPPORT=y
+CONFIG_SPL_ENV_SUPPORT=y
+CONFIG_SPL_LIBCOMMON_SUPPORT=y
+CONFIG_CMD_DM=y
+CONFIG_AHCI=y
+CONFIG_CMD_I2C=y
+CONFIG_BLK=y
+CONFIG_DM_MMC=y
+CONFIG_CMD_PART=y
+CONFIG_CMD_FS_GENERIC=y
+CONFIG_CMD_FS_UUID=y
+CONFIG_DISTRO_DEFAULTS=y
diff --git a/include/configs/ls1021atsn.h b/include/configs/ls1021atsn.h
new file mode 100644
index 000000000000..c8ec414afd39
--- /dev/null
+++ b/include/configs/ls1021atsn.h
@@ -0,0 +1,346 @@ 
+/* SPDX-License-Identifier: GPL-2.0
+ * Copyright 2016-2018 NXP Semiconductors
+ * Copyright 2019 Vladimir Oltean <olteanv@gmail.com>
+ */
+
+#ifndef __CONFIG_H
+#define __CONFIG_H
+
+#define CONFIG_ARMV7_SECURE_BASE	OCRAM_BASE_S_ADDR
+
+#define CONFIG_SYS_FSL_CLK
+
+#define CONFIG_DEEP_SLEEP
+#ifdef CONFIG_DEEP_SLEEP
+#define CONFIG_SILENT_CONSOLE
+#endif
+
+/*
+ * Size of malloc() pool
+ */
+#define CONFIG_SYS_MALLOC_LEN		(CONFIG_ENV_SIZE + 16 * 1024 * 1024)
+
+#define CONFIG_SYS_INIT_RAM_ADDR	OCRAM_BASE_ADDR
+#define CONFIG_SYS_INIT_RAM_SIZE	OCRAM_SIZE
+
+/* XHCI Support - enabled by default */
+#define CONFIG_USB_MAX_CONTROLLER_COUNT	1
+
+#define CONFIG_SYS_CLK_FREQ		100000000
+#define CONFIG_DDR_CLK_FREQ		100000000
+
+#define DDR_SDRAM_CFG			0x470c0008
+#define DDR_CS0_BNDS			0x008000bf
+#define DDR_CS0_CONFIG			0x80014302
+#define DDR_TIMING_CFG_0		0x50550004
+#define DDR_TIMING_CFG_1		0xbcb38c56
+#define DDR_TIMING_CFG_2		0x0040d120
+#define DDR_TIMING_CFG_3		0x010e1000
+#define DDR_TIMING_CFG_4		0x00000001
+#define DDR_TIMING_CFG_5		0x03401400
+#define DDR_SDRAM_CFG_2			0x00401010
+#define DDR_SDRAM_MODE			0x00061c60
+#define DDR_SDRAM_MODE_2		0x00180000
+#define DDR_SDRAM_INTERVAL		0x18600618
+#define DDR_DDR_WRLVL_CNTL		0x8655f605
+#define DDR_DDR_WRLVL_CNTL_2		0x05060607
+#define DDR_DDR_WRLVL_CNTL_3		0x05050505
+#define DDR_DDR_CDR1			0x80040000
+#define DDR_DDR_CDR2			0x00000001
+#define DDR_SDRAM_CLK_CNTL		0x02000000
+#define DDR_DDR_ZQ_CNTL			0x89080600
+#define DDR_CS0_CONFIG_2		0
+#define DDR_SDRAM_CFG_MEM_EN		0x80000000
+#define SDRAM_CFG2_D_INIT		0x00000010
+#define DDR_CDR2_VREF_TRAIN_EN		0x00000080
+#define SDRAM_CFG2_FRC_SR		0x80000000
+#define SDRAM_CFG_BI			0x00000001
+
+#define CONFIG_CHIP_SELECTS_PER_CTRL	4
+
+#ifdef CONFIG_RAMBOOT_PBL
+#define CONFIG_SYS_FSL_PBL_PBI	\
+	"board/freescale/ls1021atsn/ls102xa_pbi.cfg"
+#endif
+
+#ifdef CONFIG_SD_BOOT
+#ifdef CONFIG_SD_BOOT_QSPI
+#define CONFIG_SYS_FSL_PBL_RCW	\
+	"board/freescale/ls1021atsn/ls102xa_rcw_sd_qspi.cfg"
+#else
+#define CONFIG_SYS_FSL_PBL_RCW	\
+	"board/freescale/ls1021atsn/ls102xa_rcw_sd_ifc.cfg"
+#endif
+#define CONFIG_SPL_LDSCRIPT	"arch/$(ARCH)/cpu/u-boot-spl.lds"
+#define CONFIG_SPL_LIBGENERIC_SUPPORT
+#define CONFIG_SPL_MPC8XXX_INIT_DDR_SUPPORT
+#define CONFIG_SPL_WATCHDOG_SUPPORT
+#define CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR	0xe8
+
+#ifdef CONFIG_SECURE_BOOT
+#define CONFIG_U_BOOT_HDR_SIZE		(16 << 10)
+#endif /* ifdef CONFIG_SECURE_BOOT */
+
+#define CONFIG_SPL_MAX_SIZE		0x1a000
+#define CONFIG_SPL_STACK		0x1001d000
+#define CONFIG_SPL_PAD_TO		0x1c000
+
+#define CONFIG_SYS_SPL_MALLOC_START	(CONFIG_SYS_TEXT_BASE + \
+		CONFIG_SYS_MONITOR_LEN)
+#define CONFIG_SYS_SPL_MALLOC_SIZE	0x100000
+#define CONFIG_SPL_BSS_START_ADDR	0x80100000
+#define CONFIG_SPL_BSS_MAX_SIZE		0x80000
+
+#ifdef CONFIG_U_BOOT_HDR_SIZE
+/*
+ * HDR would be appended at end of image and copied to DDR along
+ * with U-Boot image. Here u-boot max. size is 512K. So if binary
+ * size increases then increase this size in case of secure boot as
+ * it uses raw u-boot image instead of fit image.
+ */
+#define CONFIG_SYS_MONITOR_LEN		(0x80000 + CONFIG_U_BOOT_HDR_SIZE)
+#else
+#define CONFIG_SYS_MONITOR_LEN		0x80000
+#endif /* ifdef CONFIG_U_BOOT_HDR_SIZE */
+#endif
+
+#define CONFIG_NR_DRAM_BANKS		1
+#define PHYS_SDRAM			0x80000000
+#define PHYS_SDRAM_SIZE			(1u * 1024 * 1024 * 1024)
+
+#define CONFIG_SYS_DDR_SDRAM_BASE	0x80000000UL
+#define CONFIG_SYS_SDRAM_BASE		CONFIG_SYS_DDR_SDRAM_BASE
+
+#define CONFIG_CHIP_SELECTS_PER_CTRL	4
+
+#if !defined(CONFIG_SD_BOOT) && !defined(CONFIG_NAND_BOOT) && \
+	!defined(CONFIG_QSPI_BOOT)
+#define CONFIG_U_QE
+#endif
+
+/*
+ * IFC Definitions
+ */
+#if !defined(CONFIG_QSPI_BOOT) && !defined(CONFIG_SD_BOOT_QSPI)
+#define CONFIG_FSL_IFC
+#endif
+
+/* CPLD */
+#define CONFIG_SYS_CPLD_BASE		0x7fb00000
+#define CPLD_BASE_PHYS			CONFIG_SYS_CPLD_BASE
+
+#define CONFIG_SYS_FPGA_CSPR_EXT        (0x0)
+#define CONFIG_SYS_FPGA_CSPR		(CSPR_PHYS_ADDR(CPLD_BASE_PHYS) | \
+					CSPR_PORT_SIZE_8 | \
+					CSPR_MSEL_GPCM | \
+					CSPR_V)
+#define CONFIG_SYS_FPGA_AMASK		IFC_AMASK(64 * 1024)
+#define CONFIG_SYS_FPGA_CSOR		(CSOR_NOR_ADM_SHIFT(4) | \
+					CSOR_NOR_NOR_MODE_AVD_NOR | \
+					CSOR_NOR_TRHZ_80)
+
+/* CPLD Timing parameters for IFC GPCM */
+#define CONFIG_SYS_FPGA_FTIM0		(FTIM0_GPCM_TACSE(0xf) | \
+					FTIM0_GPCM_TEADC(0xf) | \
+					FTIM0_GPCM_TEAHC(0xf))
+#define CONFIG_SYS_FPGA_FTIM1		(FTIM1_GPCM_TACO(0xff) | \
+					FTIM1_GPCM_TRAD(0x3f))
+#define CONFIG_SYS_FPGA_FTIM2		(FTIM2_GPCM_TCS(0xf) | \
+					FTIM2_GPCM_TCH(0xf) | \
+					FTIM2_GPCM_TWP(0xff))
+#define CONFIG_SYS_FPGA_FTIM3           0x0
+#define CONFIG_SYS_CSPR0_EXT		CONFIG_SYS_FPGA_CSPR_EXT
+#define CONFIG_SYS_CSPR0		CONFIG_SYS_FPGA_CSPR
+#define CONFIG_SYS_AMASK0		CONFIG_SYS_FPGA_AMASK
+#define CONFIG_SYS_CSOR0		CONFIG_SYS_FPGA_CSOR
+#define CONFIG_SYS_CS0_FTIM0		CONFIG_SYS_FPGA_FTIM0
+#define CONFIG_SYS_CS0_FTIM1		CONFIG_SYS_FPGA_FTIM1
+#define CONFIG_SYS_CS0_FTIM2		CONFIG_SYS_FPGA_FTIM2
+#define CONFIG_SYS_CS0_FTIM3		CONFIG_SYS_FPGA_FTIM3
+
+/*
+ * Serial Port
+ */
+#define CONFIG_CONS_INDEX		1
+#define CONFIG_SYS_NS16550_SERIAL
+#ifndef CONFIG_DM_SERIAL
+#define CONFIG_SYS_NS16550_REG_SIZE	1
+#endif
+#define CONFIG_SYS_NS16550_CLK		get_serial_clock()
+
+#define CONFIG_BAUDRATE			115200
+
+/*
+ * I2C
+ */
+#define CONFIG_SYS_I2C
+#define CONFIG_SYS_I2C_MXC
+#define CONFIG_SYS_I2C_MXC_I2C1		/* enable I2C bus 1 */
+#define CONFIG_SYS_I2C_MXC_I2C2		/* enable I2C bus 2 */
+#define CONFIG_SYS_I2C_MXC_I2C3		/* enable I2C bus 3 */
+
+/* EEPROM */
+#define CONFIG_ID_EEPROM
+#define CONFIG_SYS_I2C_EEPROM_NXID
+#define CONFIG_SYS_EEPROM_BUS_NUM	0
+#define CONFIG_SYS_I2C_EEPROM_ADDR	0x51
+#define CONFIG_SYS_I2C_EEPROM_ADDR_LEN	2
+
+/* SPI */
+#if defined(CONFIG_QSPI_BOOT) || defined(CONFIG_SD_BOOT_QSPI)
+/* QSPI */
+#define FSL_QSPI_FLASH_SIZE		(1 << 24)
+#define FSL_QSPI_FLASH_NUM		2
+/* DSPI */
+#endif
+
+#ifdef CONFIG_TSEC_ENET
+#define CONFIG_ETHPRIME			"ethernet@2d10000"
+#endif
+
+/* PCIe */
+#define CONFIG_PCIE1			/* PCIE controller 1 */
+#define CONFIG_PCIE2			/* PCIE controller 2 */
+#define FSL_PCIE_COMPAT			"fsl,ls1021a-pcie"
+#ifdef CONFIG_PCI
+#define CONFIG_PCI_SCAN_SHOW
+#endif
+
+#define CONFIG_PEN_ADDR_BIG_ENDIAN
+#define CONFIG_LAYERSCAPE_NS_ACCESS
+#define CONFIG_SMP_PEN_ADDR		0x01ee0200
+#define COUNTER_FREQUENCY		12500000
+
+#define CONFIG_HWCONFIG
+#define HWCONFIG_BUFFER_SIZE		256
+
+#define CONFIG_FSL_DEVICE_DISABLE
+
+#define BOOT_TARGET_DEVICES(func) \
+	func(MMC, mmc, 0) \
+	func(USB, usb, 0) \
+	func(DHCP, dhcp, na)
+#include <config_distro_bootcmd.h>
+
+#define CONFIG_EXTRA_ENV_SETTINGS					\
+	"bootargs=root=/dev/ram0 rw console=ttyS0,115200\0"		\
+	"initrd_high=0xffffffff\0"					\
+	"fdt_high=0xffffffff\0"						\
+	"fdt_addr=0x64f00000\0"						\
+	"kernel_addr=0x61000000\0"					\
+	"kernelheader_addr=0x60800000\0"				\
+	"scriptaddr=0x80000000\0"					\
+	"scripthdraddr=0x80080000\0"					\
+	"fdtheader_addr_r=0x80100000\0"					\
+	"kernelheader_addr_r=0x80200000\0"				\
+	"kernel_addr_r=0x80008000\0"					\
+	"kernelheader_size=0x40000\0"					\
+	"fdt_addr_r=0x8f000000\0"					\
+	"ramdisk_addr_r=0xa0000000\0"					\
+	"load_addr=0x80008000\0"					\
+	"kernel_size=0x2800000\0"					\
+	"kernel_addr_sd=0x8000\0"					\
+	"kernel_size_sd=0x14000\0"					\
+	"kernelhdr_addr_sd=0x4000\0"					\
+	"kernelhdr_size_sd=0x10\0"					\
+	BOOTENV								\
+	"boot_scripts=ls1021atsn_boot.scr\0"				\
+	"boot_script_hdr=hdr_ls1021atsn_bs.out\0"			\
+		"scan_dev_for_boot_part="				\
+			"part list ${devtype} ${devnum} devplist; "	\
+			"env exists devplist || setenv devplist 1; "	\
+			"for distro_bootpart in ${devplist}; do "	\
+			"if fstype ${devtype} "				\
+				"${devnum}:${distro_bootpart} "		\
+				"bootfstype; then "			\
+				"run scan_dev_for_boot; "		\
+			"fi; "						\
+		"done\0"						\
+	"scan_dev_for_boot="						\
+		"echo Scanning ${devtype} "				\
+				"${devnum}:${distro_bootpart}...; "	\
+		"for prefix in ${boot_prefixes}; do "			\
+			"run scan_dev_for_scripts; "			\
+			"run scan_dev_for_extlinux; "			\
+		"done;"							\
+		"\0"							\
+	"boot_a_script="						\
+		"load ${devtype} ${devnum}:${distro_bootpart} "		\
+			"${scriptaddr} ${prefix}${script}; "		\
+		"env exists secureboot && load ${devtype} "		\
+			"${devnum}:${distro_bootpart} "			\
+			"${scripthdraddr} ${prefix}${boot_script_hdr} "	\
+			"&& esbc_validate ${scripthdraddr};"		\
+		"source ${scriptaddr}\0"				\
+	"qspi_bootcmd=echo Trying load from qspi..;"			\
+		"sf probe && sf read $load_addr "			\
+		"$kernel_addr $kernel_size; env exists secureboot "	\
+		"&& sf read $kernelheader_addr_r $kernelheader_addr "	\
+		"$kernelheader_size && esbc_validate ${kernelheader_addr_r}; " \
+		"bootm $load_addr#$board\0"				\
+	"sd_bootcmd=echo Trying load from SD ..;"			\
+		"mmcinfo && mmc read $load_addr "			\
+		"$kernel_addr_sd $kernel_size_sd && "			\
+		"env exists secureboot && mmc read $kernelheader_addr_r " \
+		"$kernelhdr_addr_sd $kernelhdr_size_sd "		\
+		" && esbc_validate ${kernelheader_addr_r};"		\
+		"bootm $load_addr#$board\0"
+
+#undef CONFIG_BOOTCOMMAND
+#if defined(CONFIG_QSPI_BOOT) || defined(CONFIG_SD_BOOT_QSPI)
+#define CONFIG_BOOTCOMMAND "run distro_bootcmd; run qspi_bootcmd; "	\
+			   "env exists secureboot && esbc_halt"
+#elif defined(CONFIG_SD_BOOT)
+#define CONFIG_BOOTCOMMAND "run distro_bootcmd; run sd_bootcmd; "	\
+			   "env exists secureboot && esbc_halt;"
+#endif
+
+/*
+ * Miscellaneous configurable options
+ */
+#define CONFIG_SYS_CBSIZE		256	/* Console I/O Buffer Size */
+#define CONFIG_SYS_PBSIZE		\
+		(CONFIG_SYS_CBSIZE + sizeof(CONFIG_SYS_PROMPT) + 16)
+#define CONFIG_SYS_MAXARGS		16	/* max number of command args */
+#define CONFIG_SYS_BARGSIZE		CONFIG_SYS_CBSIZE
+
+#define CONFIG_SYS_LOAD_ADDR		0x82000000
+
+#define CONFIG_LS102XA_STREAM_ID
+
+#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)
+
+#ifdef CONFIG_SPL_BUILD
+#define CONFIG_SYS_MONITOR_BASE CONFIG_SPL_TEXT_BASE
+#else
+#define CONFIG_SYS_MONITOR_BASE CONFIG_SYS_TEXT_BASE    /* start of monitor */
+#endif
+
+#define CONFIG_SYS_QE_FW_ADDR		0x67f40000
+
+/*
+ * Environment
+ */
+#define CONFIG_ENV_OVERWRITE
+
+#if defined(CONFIG_SD_BOOT)
+#define CONFIG_ENV_OFFSET		0x300000
+#define CONFIG_SYS_MMC_ENV_DEV		0
+#define CONFIG_ENV_SIZE			0x20000
+#elif defined(CONFIG_QSPI_BOOT)
+#define CONFIG_ENV_SIZE			0x2000
+#define CONFIG_ENV_OFFSET		0x300000
+#define CONFIG_ENV_SECT_SIZE		0x40000
+#endif
+
+#define CONFIG_OF_BOARD_SETUP
+#define CONFIG_OF_STDOUT_VIA_ALIAS
+#define CONFIG_MISC_INIT_R
+
+#include <asm/fsl_secure_boot.h>
+#define CONFIG_SYS_BOOTM_LEN 0x8000000 /* 128 MB */
+
+#endif