[U-Boot] [PATCH][v2] armv8: lx2160ardb : Add support for LX2160ARDB platform

Poonam Aggrwal poonam.aggrwal at nxp.com
Mon Oct 29 12:32:25 UTC 2018



> -----Original Message-----
> From: U-Boot [mailto:u-boot-bounces at lists.denx.de] On Behalf Of Priyanka
> Jain
> Sent: Monday, October 29, 2018 3:01 PM
> To: u-boot at lists.denx.de; York Sun <york.sun at nxp.com>
> Cc: Priyanka Jain <priyanka.jain at nxp.com>; Pankit Garg
> <pankit.garg at nxp.com>; Wasim Khan <wasim.khan at nxp.com>; Sriram Dash
> <sriram.dash at nxp.com>
> Subject: [U-Boot] [PATCH][v2] armv8: lx2160ardb : Add support for LX2160ARDB
> platform
> 
> LX2160ARDB is an evaluation board that supports LX2160A family SoCs. This
> patch add base support for this board.
You may like to change evaluation to Reference Development Platform
> 
> Signed-off-by: Wasim Khan <wasim.khan at nxp.com>
> Signed-off-by: Yogesh Gaur <yogeshnarayan.gaur at nxp.com>
> Signed-off-by: Meenakshi Aggarwal <meenakshi.aggarwal at nxp.com>
> Signed-off-by: Vabhav Sharma <vabhav.sharma at nxp.com>
> Signed-off-by: Sriram Dash <sriram.dash at nxp.com>
> Signed-off-by: Rajesh Bhagat <rajesh.bhagat at nxp.com>
> Signed-off-by: Pankit Garg <pankit.garg at nxp.com>
> Signed-off-by: Priyanka Jain <priyanka.jain at nxp.com>
> ---
> Changes for v2:
>  Rebased on top of test_qoriq branch of u-boot-fsl-qoriq.git
> 
>  Corrected line
> 	seria01.clock = get_serial_clock ->  serial1.clock = get_serial_clock();
> 
>  Corrected CONFIG_ENV_OFFSET to 0x500000 [Thanks to Ashish K for pointing
> this]
> 
>  Depends on below patches[sequence in increasing order]
> 
> 1)https://emea01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fpatc
> hwork.ozlabs.org%2Fpatch%2F982258%2F&data=02%7C01%7Cpoonam.ag
> grwal%40nxp.com%7C9a7856644931426b286108d63d8146d8%7C686ea1d3bc2
> b4c6fa92cd99c5c301635%7C0%7C0%7C636764022790690712&sdata=7Jb
> bI2lU7aoStZjmuKKtKpfxtKyzkDxCaHhxM3Jy2jQ%3D&reserved=0
> 
> 2)https://emea01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fpatc
> hwork.ozlabs.org%2Fpatch%2F975541%2F&data=02%7C01%7Cpoonam.ag
> grwal%40nxp.com%7C9a7856644931426b286108d63d8146d8%7C686ea1d3bc2
> b4c6fa92cd99c5c301635%7C0%7C0%7C636764022790690712&sdata=nH2
> xVXciHEbEZ1HePucpedytQL%2BqgBUc7gQGRCb0p%2F0%3D&reserved=0
> 
> 3)https://emea01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fpatc
> hwork.ozlabs.org%2Fpatch%2F962408%2F&data=02%7C01%7Cpoonam.ag
> grwal%40nxp.com%7C9a7856644931426b286108d63d8146d8%7C686ea1d3bc2
> b4c6fa92cd99c5c301635%7C0%7C0%7C636764022790690712&sdata=EeU
> TkyBjO0j9kjnHGkc0Abk4xGUWpWXQ0KB4IXGup%2BU%3D&reserved=0
> 
> 4)https://emea01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fpatc
> hwork.ozlabs.org%2Fpatch%2F982259%2F&data=02%7C01%7Cpoonam.ag
> grwal%40nxp.com%7C9a7856644931426b286108d63d8146d8%7C686ea1d3bc2
> b4c6fa92cd99c5c301635%7C0%7C0%7C636764022790690712&sdata=IvXB
> X%2FR%2B2sAr4aVGtbPWRV%2FZ381FDx%2BrXTXgDIByE98%3D&reserved
> =0
> 
> 5)https://emea01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fpatc
> hwork.ozlabs.org%2Fpatch%2F982237%2F&data=02%7C01%7Cpoonam.ag
> grwal%40nxp.com%7C9a7856644931426b286108d63d8146d8%7C686ea1d3bc2
> b4c6fa92cd99c5c301635%7C0%7C0%7C636764022790690712&sdata=6sB
> UducF4LFkBChRoD9ZUoPYfK6Yacfj99JbDJrcesg%3D&reserved=0
> 
> 6)https://emea01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fpatc
> hwork.ozlabs.org%2Fpatch%2F990088%2F&data=02%7C01%7Cpoonam.ag
> grwal%40nxp.com%7C9a7856644931426b286108d63d8146d8%7C686ea1d3bc2
> b4c6fa92cd99c5c301635%7C0%7C0%7C636764022790690712&sdata=amh
> IN7Dar2gvo5BrpTammgx5qdTrdH6%2FzVussfllahY%3D&reserved=0
> 
> 7)https://emea01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fpatc
> hwork.ozlabs.org%2Fpatch%2F990093%2F&data=02%7C01%7Cpoonam.ag
> grwal%40nxp.com%7C9a7856644931426b286108d63d8146d8%7C686ea1d3bc2
> b4c6fa92cd99c5c301635%7C0%7C0%7C636764022790690712&sdata=tx0S
> 8Siu6CTOfH%2B1VYpSAlS39g6NB2RgV75JVoqpF1I%3D&reserved=0
> 
>  arch/arm/Kconfig                         |  14 ++
>  arch/arm/cpu/armv8/Kconfig               |   2 +-
>  arch/arm/dts/Makefile                    |   3 +-
>  arch/arm/dts/fsl-lx2160a-rdb.dts         |  20 +++
>  board/freescale/common/qixis.c           |   4 +
>  board/freescale/lx2160a/Kconfig          |  16 ++
>  board/freescale/lx2160a/MAINTAINERS      |   8 +
>  board/freescale/lx2160a/Makefile         |   9 +
>  board/freescale/lx2160a/README           |  79 +++++++++
>  board/freescale/lx2160a/ddr.c            |  20 +++
>  board/freescale/lx2160a/eth_lx2160ardb.c | 210 +++++++++++++++++++++++
>  board/freescale/lx2160a/lx2160a.c        | 279
> +++++++++++++++++++++++++++++++
>  configs/lx2160ardb_tfa_defconfig         |  74 ++++++++
>  include/configs/lx2160a_common.h         | 214 ++++++++++++++++++++++++
>  include/configs/lx2160ardb.h             | 102 +++++++++++
>  15 files changed, 1052 insertions(+), 2 deletions(-)  create mode 100644
> arch/arm/dts/fsl-lx2160a-rdb.dts  create mode 100644
> board/freescale/lx2160a/Kconfig  create mode 100644
> board/freescale/lx2160a/MAINTAINERS
>  create mode 100644 board/freescale/lx2160a/Makefile  create mode 100644
> board/freescale/lx2160a/README  create mode 100644
> board/freescale/lx2160a/ddr.c  create mode 100644
> board/freescale/lx2160a/eth_lx2160ardb.c
>  create mode 100644 board/freescale/lx2160a/lx2160a.c  create mode 100644
> configs/lx2160ardb_tfa_defconfig  create mode 100644
> include/configs/lx2160a_common.h  create mode 100644
> include/configs/lx2160ardb.h
> 
> diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index ccf2a84..28a81e7
> 100644
> --- a/arch/arm/Kconfig
> +++ b/arch/arm/Kconfig
> @@ -1027,6 +1027,19 @@ config TARGET_LS2081ARDB
>  	  development platform that supports the QorIQ LS2081A/LS2041A
>  	  Layerscape Architecture processor.
> 
> +config TARGET_LX2160ARDB
> +	bool "Support lx2160ardb"
> +	select ARCH_LX2160A
> +	select ARCH_MISC_INIT
> +	select ARM64
> +	select ARMV8_MULTIENTRY
> +	select BOARD_LATE_INIT
> +	help
> +	  Support for NXP LX2160ARDB platform.
> +	  The lx2160ardb (LX2160A Reference design board (RDB)
> +	  is a high-performance development platform that supports the
> +	  QorIQ LX2160A/LX2120A/LX2080A Layerscape Architecture processor.
> +
>  config TARGET_HIKEY
>  	bool "Support HiKey 96boards Consumer Edition Platform"
>  	select ARM64
> @@ -1488,6 +1501,7 @@ source "board/freescale/ls1046ardb/Kconfig"
>  source "board/freescale/ls1012aqds/Kconfig"
>  source "board/freescale/ls1012ardb/Kconfig"
>  source "board/freescale/ls1012afrdm/Kconfig"
> +source "board/freescale/lx2160a/Kconfig"
>  source "board/freescale/mx35pdk/Kconfig"
>  source "board/freescale/s32v234evb/Kconfig"
>  source "board/grinn/chiliboard/Kconfig"
> diff --git a/arch/arm/cpu/armv8/Kconfig b/arch/arm/cpu/armv8/Kconfig index
> c8bebab..aac3aeb 100644
> --- a/arch/arm/cpu/armv8/Kconfig
> +++ b/arch/arm/cpu/armv8/Kconfig
> @@ -105,7 +105,7 @@ config PSCI_RESET
>  		   !TARGET_LS1012AFRWY && \
>  		   !TARGET_LS1043ARDB && !TARGET_LS1043AQDS && \
>  		   !TARGET_LS1046ARDB && !TARGET_LS1046AQDS && \
> -		   !TARGET_LS2081ARDB && \
> +		   !TARGET_LS2081ARDB && !TARGET_LX2160ARDB && \
>  		   !ARCH_UNIPHIER && !TARGET_S32V234EVB
>  	help
>  	  Most armv8 systems have PSCI support enabled in EL3, either through
> diff --git a/arch/arm/dts/Makefile b/arch/arm/dts/Makefile index
> 44ebc50..25cd773 100644
> --- a/arch/arm/dts/Makefile
> +++ b/arch/arm/dts/Makefile
> @@ -226,7 +226,8 @@ dtb-$(CONFIG_FSL_LSCH3) += fsl-ls2080a-qds.dtb \
>  	fsl-ls2081a-rdb.dtb \
>  	fsl-ls2088a-rdb-qspi.dtb \
>  	fsl-ls1088a-rdb.dtb \
> -	fsl-ls1088a-qds.dtb
> +	fsl-ls1088a-qds.dtb \
> +	fsl-lx2160a-rdb.dtb
>  dtb-$(CONFIG_FSL_LSCH2) += fsl-ls1043a-qds-duart.dtb \
>  	fsl-ls1043a-qds-lpuart.dtb \
>  	fsl-ls1043a-rdb.dtb \
> diff --git a/arch/arm/dts/fsl-lx2160a-rdb.dts b/arch/arm/dts/fsl-lx2160a-rdb.dts
> new file mode 100644
> index 0000000..08201b5
> --- /dev/null
> +++ b/arch/arm/dts/fsl-lx2160a-rdb.dts
> @@ -0,0 +1,20 @@
> +// SPDX-License-Identifier: GPL-2.0+ OR X11
> +/*
> + * NXP LX2160ARDB device tree source
> + *
> + * Author:	Priyanka Jain <priyanka.jain at nxp.com>
> + *		Sriram Dash <sriram.dash at nxp.com>
> + *
> + * Copyright 2018 NXP
> + *
> + */
> +
> +/dts-v1/;
> +
> +#include "fsl-lx2160a.dtsi"
> +
> +/ {
> +	model = "NXP Layerscape LX2160ARDB Board";
> +	compatible = "fsl,lx2160ardb", "fsl,lx2160a";
> +
> +};
> diff --git a/board/freescale/common/qixis.c b/board/freescale/common/qixis.c
> index af3dc59..f1b98bc 100644
> --- a/board/freescale/common/qixis.c
> +++ b/board/freescale/common/qixis.c
> @@ -227,8 +227,12 @@ static int qixis_reset_cmd(cmd_tbl_t *cmdtp, int flag,
> int argc, char * const ar  #ifdef QIXIS_LBMAP_SD
>  		QIXIS_WRITE(rst_ctl, 0x30);
>  		QIXIS_WRITE(rcfg_ctl, 0);
> +#ifdef NON_EXTENDED_DUTCFG
> +		QIXIS_WRITE(dutcfg[0], QIXIS_RCW_SRC_SD); #else
>  		set_lbmap(QIXIS_LBMAP_SD);
>  		set_rcw_src(QIXIS_RCW_SRC_SD);
> +#endif
>  		QIXIS_WRITE(rcfg_ctl, 0x20);
>  		QIXIS_WRITE(rcfg_ctl, 0x21);
>  #else
> diff --git a/board/freescale/lx2160a/Kconfig b/board/freescale/lx2160a/Kconfig
> new file mode 100644 index 0000000..5562c3e
> --- /dev/null
> +++ b/board/freescale/lx2160a/Kconfig
> @@ -0,0 +1,16 @@
> +if TARGET_LX2160ARDB
> +
> +config SYS_BOARD
> +	default "lx2160a"
> +
> +config SYS_VENDOR
> +	default "freescale"
> +
> +config SYS_SOC
> +	default "fsl-layerscape"
> +
> +config SYS_CONFIG_NAME
> +	default "lx2160ardb"
> +
> +source "board/freescale/common/Kconfig"
> +endif
> diff --git a/board/freescale/lx2160a/MAINTAINERS
> b/board/freescale/lx2160a/MAINTAINERS
> new file mode 100644
> index 0000000..b4dd842
> --- /dev/null
> +++ b/board/freescale/lx2160a/MAINTAINERS
> @@ -0,0 +1,8 @@
> +LX2160ARDB BOARD
> +M:	Priyanka Jain <priyanka.jain at nxp.com>
> +S:	Maintained
> +F:	board/freescale/lx2160a/
> +F:	include/configs/lx2160a_common.h
> +F:	include/configs/lx2160ardb.h
> +F:	configs/lx2160ardb_defconfig
> +F:	arch/arm/dts/fsl-lx2160a-rdb.dts
> diff --git a/board/freescale/lx2160a/Makefile
> b/board/freescale/lx2160a/Makefile
> new file mode 100644
> index 0000000..be3709d
> --- /dev/null
> +++ b/board/freescale/lx2160a/Makefile
> @@ -0,0 +1,9 @@
> +#
> +# Copyright 2018 Freescale Semiconductor #
> +# SPDX-License-Identifier:	GPL-2.0+
> +#
> +
> +obj-y += lx2160a.o
> +obj-y += ddr.o
> +obj-$(CONFIG_TARGET_LX2160ARDB) += eth_lx2160ardb.o
> diff --git a/board/freescale/lx2160a/README
> b/board/freescale/lx2160a/README new file mode 100644 index
> 0000000..618c40b
> --- /dev/null
> +++ b/board/freescale/lx2160a/README
> @@ -0,0 +1,79 @@
> +Overview
> +--------
> +The LX2160A Reference Design (RDB) is a high-performance computing,
> +evaluation, and development platform that supports the QorIQ LX2160A
> +Layerscape Architecture processor and its personalities.
> +
> +LX2160A SoC Overview
> +--------------------------------------
> +For details, please refer
> +arch/arm/cpu/armv8/fsl-layerscape/doc/README.soc
> +
> +LX2160ARDB board Overview
> +----------------------
> +DDR Memory
> +	Two ports of 72-bits (8-bits ECC) DDR4.
> +	Each port supports four chip-selects and two DIMM
> +	connectors. Data rate upto 3.2 GT/s.
> +
> +SERDES ports
> +	Thress serdes controllers (24 lanes)
> +	Serdes1: Supports two USXGMII connectors, each connected through
> +	Aquantia AQR107 phy, two 25GbE SFP+ modules connected through an
> Inphi
> +	IN112525 phy and one 40 GbE QSFP+ module connected through an
> Inphi
> +	CS4223 phy.
> +
> +	Serdes2: Supports one PCIe x4 (Gen1/2/3/4) connector, four SATA 3.0
> +	connectors
> +
> +	Serdes3: Supports one PCIe x8 (Gen1/2/3/4) connector
> +
> +eSDHC
> +	eSDHC1: Supports a SD connector for connecting SD cards
> +	eSDHC2: Supports 128GB Micron MTFC128GAJAECE-IT eMMC
> +
> +Octal SPI (XSPI)
> +	Supports two 64 MB onbpard octal SPI flash memories, one SPI
/s/onbpard/onboard
serial NOR flash memories connected through FlexSPI interface
> emulator
> +	for off-board emulation
> +
> +I2C	All system devices on I2C1 multiplexed using PCA9547 multiplexer
> +	Serial Ports
> +
> +USB 3.0
> +	Two high speed USB 3.0 ports. First USB 3.0 port configured as
> +	Host with Type-A connector, second USB 3.0 port configured as OTG
> +	with micro-AB connector
> +
> +Serial Ports	Two UART ports
> +Ethernet	Two RGMII interfaces
> +Debug		ARM JTAG support
> +
> +Booting Options
> +---------------
> +a) Flexspi boot
> +b) SD boot
> +
> +Memory map for Flexspi flash
> +----------------------------
> +Image							Flash Offset
> +bl2_flexspi_nor.pbl (RCW+PBI+bl2.pbl)			0x00000000
> +fip.bin (bl31 + bl33(u-boot) +
> +	 header for Secure-boot(secure-boot only))	0x00100000
> +Boot firmware Environment				0x00500000
> +DDR PHY Firmware (fip_ddr_all.bin)			0x00800000
> +DPAA2 MC Firmware					0x00A00000
> +DPAA2 DPL						0x00D00000
> +DPAA2 DPC						0x00E00000
> +Kernel.itb						0x01000000
> +
> +Memory map for sd card
> +----------------------------
> +Image							SD card Offset
> +bl2_sd.pbl (RCW+PBI+bl2.pbl)				0x00008
> +fip.bin (bl31 + bl33(u-boot) +
> +	 header for Secure-boot(secure-boot only))	0x00800
> +Boot firmware Environment				0x02800
> +DDR PHY Firmware (fip_ddr_all.bin)			0x04000
> +DPAA2 MC Firmware					0x05000
> +DPAA2 DPL						0x06800
> +DPAA2 DPC						0x07000
> +Kernel.itb						0x08000
> diff --git a/board/freescale/lx2160a/ddr.c b/board/freescale/lx2160a/ddr.c new
> file mode 100644 index 0000000..cd422bf
> --- /dev/null
> +++ b/board/freescale/lx2160a/ddr.c
> @@ -0,0 +1,20 @@
> +// SPDX-License-Identifier: GPL-2.0+
> +/*
> + * Copyright 2018 NXP
> + */
> +
> +#include <common.h>
> +#include <fsl_ddr_sdram.h>
> +#include <fsl_ddr_dimm_params.h>
> +
> +DECLARE_GLOBAL_DATA_PTR;
> +
> +int fsl_initdram(void)
> +{
> +	gd->ram_size = tfa_get_dram_size();
> +
In which cases tfa_get_dram_size return zero?
Probably a warning message may be good to put.
Is it okay to fall back to fsl_ddr_sdram_size in this case?
> +	if (!gd->ram_size)
> +		gd->ram_size = fsl_ddr_sdram_size();
> +
> +	return 0;
> +}
> diff --git a/board/freescale/lx2160a/eth_lx2160ardb.c
> b/board/freescale/lx2160a/eth_lx2160ardb.c
> new file mode 100644
> index 0000000..ab75582
> --- /dev/null
> +++ b/board/freescale/lx2160a/eth_lx2160ardb.c
> @@ -0,0 +1,210 @@
> +// SPDX-License-Identifier: GPL-2.0+
> +/*
> + * Copyright 2018 NXP
> + *
> + */
> +
> +#include <common.h>
> +#include <command.h>
> +#include <netdev.h>
> +#include <malloc.h>
> +#include <fsl_mdio.h>
> +#include <miiphy.h>
> +#include <phy.h>
> +#include <fm_eth.h>
> +#include <asm/io.h>
> +#include <exports.h>
> +#include <asm/arch/fsl_serdes.h>
> +#include <fsl-mc/fsl_mc.h>
> +#include <fsl-mc/ldpaa_wriop.h>
> +
> +DECLARE_GLOBAL_DATA_PTR;
> +
> +static bool get_inphi_phy_id(struct mii_dev *bus, int addr, int devad)
> +{
> +	int phy_reg;
> +	u32 phy_id;
> +
> +	phy_reg = bus->read(bus, addr, devad, MII_PHYSID1);
> +	phy_id = (phy_reg & 0xffff) << 16;
> +
> +	phy_reg = bus->read(bus, addr, devad, MII_PHYSID2);
> +	phy_id |= (phy_reg & 0xffff);
> +
> +	if (phy_id == PHY_UID_IN112525_S03)
> +		return true;
> +	else
> +		return false;
> +}
> +
> +int board_eth_init(bd_t *bis)
> +{
> +#if defined(CONFIG_FSL_MC_ENET)
> +	struct memac_mdio_info mdio_info;
> +	struct memac_mdio_controller *reg;
> +	int i, interface;
> +	struct mii_dev *dev;
> +	struct ccsr_gur *gur = (void *)(CONFIG_SYS_FSL_GUTS_ADDR);
> +	u32 srds_s1;
> +
> +	srds_s1 = in_le32(&gur->rcwsr[28]) &
> +				FSL_CHASSIS3_RCWSR28_SRDS1_PRTCL_MASK;
> +	srds_s1 >>= FSL_CHASSIS3_RCWSR28_SRDS1_PRTCL_SHIFT;
This seems to be SoC specific code, shouldn't this be out of the board file?
> +
> +	reg = (struct memac_mdio_controller
> *)CONFIG_SYS_FSL_WRIOP1_MDIO1;
> +	mdio_info.regs = reg;
> +	mdio_info.name = DEFAULT_WRIOP_MDIO1_NAME;
> +
> +	/* Register the EMI 1 */
> +	fm_memac_mdio_init(bis, &mdio_info);
> +
> +	reg = (struct memac_mdio_controller
> *)CONFIG_SYS_FSL_WRIOP1_MDIO2;
> +	mdio_info.regs = reg;
> +	mdio_info.name = DEFAULT_WRIOP_MDIO2_NAME;
> +
> +	/* Register the EMI 2 */
> +	fm_memac_mdio_init(bis, &mdio_info);
> +
> +	dev = miiphy_get_dev_by_name(DEFAULT_WRIOP_MDIO2_NAME);
> +	switch (srds_s1) {
> +	case 19:
> +		wriop_set_phy_address(WRIOP1_DPMAC2,
> +				      CORTINA_PHY_ADDR1);
> +		wriop_set_phy_address(WRIOP1_DPMAC3,
> +				      AQR107_PHY_ADDR1);
> +		wriop_set_phy_address(WRIOP1_DPMAC4,
> +				      AQR107_PHY_ADDR2);
> +		if (get_inphi_phy_id(dev, INPHI_PHY_ADDR1,
> MDIO_MMD_VEND1)) {
> +			wriop_set_phy_address(WRIOP1_DPMAC5,
> +					      INPHI_PHY_ADDR1);
> +			wriop_set_phy_address(WRIOP1_DPMAC6,
> +					      INPHI_PHY_ADDR1);
> +		}
> +		wriop_set_phy_address(WRIOP1_DPMAC17,
> +				      RGMII_PHY_ADDR1);
> +		wriop_set_phy_address(WRIOP1_DPMAC18,
> +				      RGMII_PHY_ADDR2);
> +		break;
> +
> +	case 18:
> +		wriop_set_phy_address(WRIOP1_DPMAC7,
> +				      CORTINA_PHY_ADDR1);
> +		wriop_set_phy_address(WRIOP1_DPMAC8,
> +				      CORTINA_PHY_ADDR1);
> +		wriop_set_phy_address(WRIOP1_DPMAC9,
> +				      CORTINA_PHY_ADDR1);
> +		wriop_set_phy_address(WRIOP1_DPMAC10,
> +				      CORTINA_PHY_ADDR1);
> +		wriop_set_phy_address(WRIOP1_DPMAC3,
> +				      AQR107_PHY_ADDR1);
> +		wriop_set_phy_address(WRIOP1_DPMAC4,
> +				      AQR107_PHY_ADDR2);
> +		if (get_inphi_phy_id(dev, INPHI_PHY_ADDR1,
> MDIO_MMD_VEND1)) {
> +			wriop_set_phy_address(WRIOP1_DPMAC5,
> +					      INPHI_PHY_ADDR1);
> +			wriop_set_phy_address(WRIOP1_DPMAC6,
> +					      INPHI_PHY_ADDR1);
> +		}
> +		wriop_set_phy_address(WRIOP1_DPMAC17,
> +				      RGMII_PHY_ADDR1);
> +		wriop_set_phy_address(WRIOP1_DPMAC18,
> +				      RGMII_PHY_ADDR2);
> +		break;
> +
> +	default:
> +		printf("SerDes1 protocol 0x%x is not supported on
> LX2160ARDB\n",
> +		       srds_s1);
> +		goto next;
> +	}
> +
> +	for (i = WRIOP1_DPMAC2; i <= WRIOP1_DPMAC10; i++) {
> +		interface = wriop_get_enet_if(i);
> +		switch (interface) {
> +		case PHY_INTERFACE_MODE_XGMII:
> +			dev =
> miiphy_get_dev_by_name(DEFAULT_WRIOP_MDIO1_NAME);
> +			wriop_set_mdio(i, dev);
> +			break;
> +		case PHY_INTERFACE_MODE_25G_AUI:
> +			dev =
> miiphy_get_dev_by_name(DEFAULT_WRIOP_MDIO2_NAME);
> +			wriop_set_mdio(i, dev);
> +			break;
> +		case PHY_INTERFACE_MODE_XLAUI:
> +			dev =
> miiphy_get_dev_by_name(DEFAULT_WRIOP_MDIO1_NAME);
> +			wriop_set_mdio(i, dev);
> +			break;
> +		default:
> +			break;
> +		}
> +	}
> +	for (i = WRIOP1_DPMAC17; i <= WRIOP1_DPMAC18; i++) {
> +		interface = wriop_get_enet_if(i);
> +		switch (interface) {
> +		case PHY_INTERFACE_MODE_RGMII:
> +		case PHY_INTERFACE_MODE_RGMII_ID:
> +			dev =
> miiphy_get_dev_by_name(DEFAULT_WRIOP_MDIO1_NAME);
> +			wriop_set_mdio(i, dev);
> +			break;
> +		default:
> +			break;
> +		}
> +	}
> +
> +next:
> +	cpu_eth_init(bis);
> +#endif /* CONFIG_FSL_MC_ENET */
> +
> +#ifdef CONFIG_PHY_AQUANTIA
> +	/*
> +	 * Export functions to be used by AQ firmware
> +	 * upload application
> +	 */
> +	gd->jt->strcpy = strcpy;
> +	gd->jt->mdelay = mdelay;
> +	gd->jt->mdio_get_current_dev = mdio_get_current_dev;
> +	gd->jt->phy_find_by_mask = phy_find_by_mask;
> +	gd->jt->mdio_phydev_for_ethname = mdio_phydev_for_ethname;
> +	gd->jt->miiphy_set_current_dev = miiphy_set_current_dev; #endif
> +	return pci_eth_init(bis);
> +}
> +
> +#if defined(CONFIG_RESET_PHY_R)
> +void reset_phy(void)
> +{
> +#if defined(CONFIG_FSL_MC_ENET)
> +	mc_env_boot();
> +#endif
> +}
> +#endif /* CONFIG_RESET_PHY_R */
> +
> +int fdt_fixup_board_phy(void *fdt)
> +{
> +	int mdio_offset;
> +	int ret;
> +	struct mii_dev *dev;
> +
> +	ret = 0;
> +
> +	dev = miiphy_get_dev_by_name(DEFAULT_WRIOP_MDIO2_NAME);
> +	if (!get_inphi_phy_id(dev, INPHI_PHY_ADDR1, MDIO_MMD_VEND1)) {
> +		mdio_offset = fdt_path_offset(fdt, "/soc/mdio at 0x8B97000");
Seems hardcoded path, is it possible to use a compat to search the device tree?
> +
> +		if (mdio_offset < 0)
> +			mdio_offset = fdt_path_offset(fdt,
> "/mdio at 0x8B97000");
> +
> +		if (mdio_offset < 0) {
> +			printf("mdio at 0x8B9700 node not found in dts\n");
> +			return mdio_offset;
> +		}
> +
> +		ret = fdt_setprop_string(fdt, mdio_offset, "status",
> +					 "disabled");
> +		if (ret) {
> +			printf("Could not set disable mdio at 0x8B97000 %s\n",
> +			       fdt_strerror(ret));
> +			return ret;
> +		}
> +	}
> +
> +	return ret;
> +}
> diff --git a/board/freescale/lx2160a/lx2160a.c
> b/board/freescale/lx2160a/lx2160a.c
> new file mode 100644
> index 0000000..a62222e
> --- /dev/null
> +++ b/board/freescale/lx2160a/lx2160a.c
> @@ -0,0 +1,279 @@
> +// SPDX-License-Identifier: GPL-2.0+
> +/*
> + * Copyright 2018 NXP
> + */
> +
> +#include <common.h>
> +#include <dm.h>
> +#include <dm/platform_data/serial_pl01x.h> #include <i2c.h> #include
> +<malloc.h> #include <errno.h> #include <netdev.h> #include <fsl_ddr.h>
> +#include <fsl_sec.h> #include <asm/io.h> #include <fdt_support.h>
> +#include <linux/libfdt.h> #include <fsl-mc/fsl_mc.h> #include
> +<environment.h> #include <efi_loader.h> #include <asm/arch/mmu.h>
> +#include <hwconfig.h> #include <asm/arch/fsl_serdes.h> #include
> +<asm/arch/soc.h> #include "../common/qixis.h"
> +#include "../common/vid.h"
> +#include <fsl_immap.h>
> +
> +DECLARE_GLOBAL_DATA_PTR;
> +
> +static struct pl01x_serial_platdata serial0 = { #if CONFIG_CONS_INDEX
> +== 0
> +	.base = CONFIG_SYS_SERIAL0,
> +#elif CONFIG_CONS_INDEX == 1
> +	.base = CONFIG_SYS_SERIAL1,
> +#else
> +#error "Unsupported console index value."
> +#endif
> +	.type = TYPE_PL011,
> +};
> +
> +U_BOOT_DEVICE(nxp_serial0) = {
> +	.name = "serial_pl01x",
> +	.platdata = &serial0,
> +};
> +
> +static struct pl01x_serial_platdata serial1 = {
> +	.base = CONFIG_SYS_SERIAL1,
> +	.type = TYPE_PL011,
> +};
> +
> +U_BOOT_DEVICE(nxp_serial1) = {
> +	.name = "serial_pl01x",
> +	.platdata = &serial1,
> +};
> +
> +int select_i2c_ch_pca9547(u8 ch)
> +{
> +	int ret;
> +
> +	ret = i2c_write(I2C_MUX_PCA_ADDR_PRI, 0, 1, &ch, 1);
> +	if (ret) {
> +		puts("PCA: failed to select proper channel\n");
> +		return ret;
> +	}
> +
> +	return 0;
> +}
> +
> +static void uart_get_clock(void)
> +{
> +	serial0.clock = get_serial_clock();
> +	serial1.clock = get_serial_clock();
> +}
> +
> +int board_early_init_f(void)
> +{
> +#ifdef CONFIG_SYS_I2C_EARLY_INIT
> +	i2c_early_init_f();
> +#endif
> +	/* get required clock for UART IP */
> +	uart_get_clock();
> +
> +	fsl_lsch3_early_init_f();
> +	return 0;
> +}
> +
> +int esdhc_status_fixup(void *blob, const char *compat) {
> +	/* Enable both esdhc DT nodes for LX2160ARDB */
> +	do_fixup_by_compat(blob, compat, "status", "okay",
> +			   sizeof("okay"), 1);
> +
> +	return 0;
> +}
> +
> +#if defined(CONFIG_VID)
> +int i2c_multiplexer_select_vid_channel(u8 channel) {
> +	return select_i2c_ch_pca9547(channel); }
> +
> +#endif
> +
> +int checkboard(void)
> +{
> +	enum boot_src src = get_boot_src();
> +	char buf[64];
> +	u8 sw;
> +
> +	cpu_name(buf);
> +	printf("Board: %s-RDB, ", buf);
> +
> +	sw = QIXIS_READ(arch);
> +	printf("Board version: %c, boot from ", (sw & 0xf) - 1 + 'A');
> +
> +	if (src == BOOT_SOURCE_SD_MMC) {
> +		puts("SD\n");
> +	} else {
> +		sw = QIXIS_READ(brdcfg[0]);
> +		sw = (sw >> QIXIS_XMAP_SHIFT) & QIXIS_XMAP_MASK;
> +		switch (sw) {
> +		case 0:
> +		case 4:
> +			puts("FlexSPI DEV#0\n");
> +			break;
> +		case 1:
> +			puts("FlexSPI DEV#1\n");
> +			break;
> +		case 2:
> +		case 3:
> +			puts("FlexSPI EMU\n");
> +			break;
> +		default:
> +			printf("invalid setting, xmap: %d\n", sw);
> +			break;
> +		}
> +	}
> +	printf("FPGA: v%d.%d\n", QIXIS_READ(scver), QIXIS_READ(tagdata));
> +
> +	puts("SERDES1 Reference: Clock1 = 161.13MHz Clock2 = 161.13MHz\n");
> +	puts("SERDES2 Reference: Clock1 = 100MHz Clock2 = 100MHz\n");
> +	puts("SERDES3 Reference: Clock1 = 100MHz Clock2 = 100Hz\n");

> +	return 0;
> +}
> +
> +unsigned long get_board_sys_clk(void)
> +{
> +	return 100000000;
> +}
> +
> +unsigned long get_board_ddr_clk(void)
> +{
> +	return 100000000;
> +}
> +
> +int board_init(void)
> +{
> +#ifdef CONFIG_ENV_IS_NOWHERE
> +	gd->env_addr = (ulong)&default_environment[0]; #endif
> +
> +	select_i2c_ch_pca9547(I2C_MUX_CH_DEFAULT);
> +
> +#ifdef CONFIG_FSL_CAAM
> +	sec_init();
> +#endif
> +
> +	return 0;
> +}
> +
> +void detail_board_ddr_info(void)
> +{
> +	int i;
> +	u64 ddr_size = 0;
> +
> +	puts("\nDDR    ");
> +	for (i = 0; i < CONFIG_NR_DRAM_BANKS; i++)
> +		ddr_size += gd->bd->bi_dram[i].size;
> +	print_size(ddr_size, "");
> +	print_ddr_info(0);
> +}
> +
> +#if defined(CONFIG_ARCH_MISC_INIT)
> +int arch_misc_init(void)
> +{
> +	return 0;
> +}
> +#endif
> +
> +#ifdef CONFIG_FSL_MC_ENET
> +extern int fdt_fixup_board_phy(void *fdt);
> +
> +void fdt_fixup_board_enet(void *fdt)
> +{
> +	int offset;
> +
> +	offset = fdt_path_offset(fdt, "/soc/fsl-mc");
Search by compat...
> +
> +	if (offset < 0)
> +		offset = fdt_path_offset(fdt, "/fsl-mc");
> +
> +	if (offset < 0) {
> +		printf("%s: fsl-mc node not found in device tree (error %d)\n",
> +		       __func__, offset);
> +		return;
> +	}
> +
> +	if ((get_mc_boot_status() == 0) && (get_dpl_apply_status() == 0)) {
> +		fdt_status_okay(fdt, offset);
> +		fdt_fixup_board_phy(fdt);
> +	} else {
> +		fdt_status_fail(fdt, offset);
> +	}
> +}
> +

Regards
Poonam
 
> _______________________________________________
> U-Boot mailing list
> U-Boot at lists.denx.de
> https://emea01.safelinks.protection.outlook.com/?url=https%3A%2F%2Flists.de
> nx.de%2Flistinfo%2Fu-
> boot&data=02%7C01%7Cpoonam.aggrwal%40nxp.com%7C9a7856644931
> 426b286108d63d8146d8%7C686ea1d3bc2b4c6fa92cd99c5c301635%7C0%7C0%
> 7C636764022790690712&sdata=qg3vB3xRzlQVvNfsNMr18Y2EFqae0YitIGjc
> Y1L9ma4%3D&reserved=0


More information about the U-Boot mailing list