diff mbox

[U-Boot,2/3] armv8/fsl_lsch2: Add LS1046A SoC support

Message ID 1467280854-5235-3-git-send-email-Qianyu.Gong@nxp.com
State Superseded
Delegated to: York Sun
Headers show

Commit Message

Gong Qianyu June 30, 2016, 10 a.m. UTC
From: Mingkai Hu <mingkai.hu@nxp.com>

The LS1046A processor is built on the QorIQ LS series architecture
combining four ARM A72 processor cores with DPAA 1.0 support.

Signed-off-by: Hou Zhiqiang <Zhiqiang.Hou@nxp.com>
Signed-off-by: Mihai Bantea <mihai.bantea@freescale.com>
Signed-off-by: Mingkai Hu <mingkai.hu@nxp.com>
Signed-off-by: Gong Qianyu <Qianyu.Gong@nxp.com>

Comments

Prabhakar Kushwaha June 30, 2016, 10:30 a.m. UTC | #1
> -----Original Message-----
> From: U-Boot [mailto:u-boot-bounces@lists.denx.de] On Behalf Of Gong
> Qianyu
> Sent: Thursday, June 30, 2016 3:31 PM
> To: york sun <york.sun@nxp.com>; u-boot@lists.denx.de
> Cc: Mihai Bantea <mihai.bantea@freescale.com>; Zhiqiang Hou
> <zhiqiang.hou@nxp.com>; Wenbin Song <wenbin.song@nxp.com>; Mingkai
> Hu <mingkai.hu@nxp.com>
> Subject: [U-Boot] [PATCH 2/3] armv8/fsl_lsch2: Add LS1046A SoC support
> 
> From: Mingkai Hu <mingkai.hu@nxp.com>
> 
> The LS1046A processor is built on the QorIQ LS series architecture combining
> four ARM A72 processor cores with DPAA 1.0 support.
> 

Please add SoC details in arch/arm/cpu/armv8/fsl-layerscape/doc/README.soc

> Signed-off-by: Hou Zhiqiang <Zhiqiang.Hou@nxp.com>
> Signed-off-by: Mihai Bantea <mihai.bantea@freescale.com>
> Signed-off-by: Mingkai Hu <mingkai.hu@nxp.com>
> Signed-off-by: Gong Qianyu <Qianyu.Gong@nxp.com>
> 

Strange missing list of file modified :)


> diff --git a/arch/arm/cpu/armv8/fsl-layerscape/Makefile
> b/arch/arm/cpu/armv8/fsl-layerscape/Makefile
> index eb2cbc3..4df467d 100644
> --- a/arch/arm/cpu/armv8/fsl-layerscape/Makefile
> +++ b/arch/arm/cpu/armv8/fsl-layerscape/Makefile
> @@ -32,3 +32,7 @@ endif
>  ifneq ($(CONFIG_LS1012A),)
>  obj-$(CONFIG_SYS_HAS_SERDES) += ls1012a_serdes.o  endif
> +
> +ifneq ($(CONFIG_LS1046A),)
> +obj-$(CONFIG_SYS_HAS_SERDES) += ls1046a_serdes.o endif
> diff --git a/arch/arm/cpu/armv8/fsl-layerscape/fsl_lsch2_serdes.c
> b/arch/arm/cpu/armv8/fsl-layerscape/fsl_lsch2_serdes.c
> index fe3444a..f73092a 100644
> --- a/arch/arm/cpu/armv8/fsl-layerscape/fsl_lsch2_serdes.c
> +++ b/arch/arm/cpu/armv8/fsl-layerscape/fsl_lsch2_serdes.c
> @@ -13,6 +13,9 @@
>  #ifdef CONFIG_SYS_FSL_SRDS_1
>  static u8 serdes1_prtcl_map[SERDES_PRCTL_COUNT];
>  #endif
> +#ifdef CONFIG_SYS_FSL_SRDS_2
> +static u8 serdes2_prtcl_map[SERDES_PRCTL_COUNT];
> +#endif
> 
>  int is_serdes_configured(enum srds_prtcl device)  { @@ -21,6 +24,9 @@ int
> is_serdes_configured(enum srds_prtcl device)  #ifdef
> CONFIG_SYS_FSL_SRDS_1
>  	ret |= serdes1_prtcl_map[device];
>  #endif
> +#ifdef CONFIG_SYS_FSL_SRDS_2
> +	ret |= serdes2_prtcl_map[device];
> +#endif
> 
>  	return !!ret;
>  }
> @@ -38,6 +44,12 @@ int serdes_get_first_lane(u32 sd, enum srds_prtcl
> device)
>  		cfg >>= FSL_CHASSIS2_RCWSR4_SRDS1_PRTCL_SHIFT;
>  		break;
>  #endif
> +#ifdef CONFIG_SYS_FSL_SRDS_2
> +	case FSL_SRDS_2:
> +		cfg &= FSL_CHASSIS2_RCWSR4_SRDS2_PRTCL_MASK;
> +		cfg >>= FSL_CHASSIS2_RCWSR4_SRDS2_PRTCL_SHIFT;
> +		break;
> +#endif
>  	default:
>  		printf("invalid SerDes%d\n", sd);
>  		break;
> @@ -114,4 +126,11 @@ void fsl_serdes_init(void)
>  		    FSL_CHASSIS2_RCWSR4_SRDS1_PRTCL_SHIFT,
>  		    serdes1_prtcl_map);
>  #endif
> +#ifdef CONFIG_SYS_FSL_SRDS_2
> +	serdes_init(FSL_SRDS_2,
> +		    CONFIG_SYS_FSL_SERDES_ADDR,
> +		    FSL_CHASSIS2_RCWSR4_SRDS2_PRTCL_MASK,
> +		    FSL_CHASSIS2_RCWSR4_SRDS2_PRTCL_SHIFT,
> +		    serdes2_prtcl_map);
> +#endif
>  }

Ideally this should be separate patch. Like Adding support of SerDes2 


> diff --git a/arch/arm/cpu/armv8/fsl-layerscape/fsl_lsch2_speed.c
> b/arch/arm/cpu/armv8/fsl-layerscape/fsl_lsch2_speed.c
> index d0dc58d..8922197 100644
> --- a/arch/arm/cpu/armv8/fsl-layerscape/fsl_lsch2_speed.c
> +++ b/arch/arm/cpu/armv8/fsl-layerscape/fsl_lsch2_speed.c
> @@ -107,6 +107,12 @@ void get_sys_info(struct sys_info *sys_info)
>  	case 3:
>  		sys_info->freq_fman[0] = freq_c_pll[0] / 3;
>  		break;
> +	case 4:
> +		sys_info->freq_fman[0] = freq_c_pll[0] / 4;
> +		break;
> +	case 5:
> +		sys_info->freq_fman[0] = sys_info->freq_systembus;
> +		break;
>  	case 6:
>  		sys_info->freq_fman[0] = freq_c_pll[1] / 2;
>  		break;
> @@ -124,8 +130,23 @@ void get_sys_info(struct sys_info *sys_info)  #ifdef
> CONFIG_FSL_ESDHC  #ifdef CONFIG_FSL_ESDHC_USE_PERIPHERAL_CLK
>  	rcw_tmp = in_be32(&gur->rcwsr[15]);
> -	rcw_tmp = (rcw_tmp & HWA_CGA_M2_CLK_SEL) >>
> HWA_CGA_M2_CLK_SHIFT;
> -	sys_info->freq_sdhc = freq_c_pll[1] / rcw_tmp;
> +	switch ((rcw_tmp & HWA_CGA_M2_CLK_SEL) >>
> HWA_CGA_M2_CLK_SHIFT) {
> +	case 1:
> +		sys_info->freq_sdhc = freq_c_pll[1];
> +		break;
> +	case 2:
> +		sys_info->freq_sdhc = freq_c_pll[1] / 2;
> +		break;
> +	case 3:
> +		sys_info->freq_sdhc = freq_c_pll[1] / 3;
> +		break;
> +	case 6:
> +		sys_info->freq_sdhc = freq_c_pll[0] / 2;
> +		break;
> +	default:
> +		printf("Error: Unknown ESDHC clock select!\n");
> +		break;
> +	}
>  #else
>  	sys_info->freq_sdhc = sys_info->freq_systembus;  #endif diff --git
> a/arch/arm/cpu/armv8/fsl-layerscape/ls1046a_serdes.c
> b/arch/arm/cpu/armv8/fsl-layerscape/ls1046a_serdes.c
> new file mode 100644
> index 0000000..1da6b71
> --- /dev/null
> +++ b/arch/arm/cpu/armv8/fsl-layerscape/ls1046a_serdes.c
> @@ -0,0 +1,99 @@
> +/*
> + * Copyright 2016 Freescale Semiconductor, Inc.
> + *
> + * SPDX-License-Identifier:	GPL-2.0+
> + */
> +
> +#include <common.h>
> +#include <asm/arch/fsl_serdes.h>
> +#include <asm/arch/immap_lsch2.h>
> +
> +struct serdes_config {
> +	u32 protocol;
> +	u8 lanes[SRDS_MAX_LANES];
> +};
> +
> +static struct serdes_config serdes1_cfg_tbl[] = {
> +	/* SerDes 1 */
> +	{0x3333, {SGMII_FM1_DTSEC9, SGMII_FM1_DTSEC10,
> SGMII_FM1_DTSEC5,
> +		  SGMII_FM1_DTSEC6} },
> +	{0x1133, {XFI_FM1_MAC9, XFI_FM1_MAC10, SGMII_FM1_DTSEC5,
> +		  SGMII_FM1_DTSEC6} },
> +	{0x1333, {XFI_FM1_MAC9, SGMII_FM1_DTSEC10,
> SGMII_FM1_DTSEC5,
> +		  SGMII_FM1_DTSEC6} },
> +	{0x2333, {SGMII_2500_FM1_DTSEC9, SGMII_FM1_DTSEC10,
> SGMII_FM1_DTSEC5,
> +		  SGMII_FM1_DTSEC6} },
> +	{0x2233, {SGMII_2500_FM1_DTSEC9, SGMII_2500_FM1_DTSEC10,
> +		  SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6} },
> +	{0x1040, {XFI_FM1_MAC9, NONE, QSGMII_FM1_A, NONE} },
> +	{0x2040, {SGMII_2500_FM1_DTSEC9, NONE, QSGMII_FM1_A, NONE}
> },
> +	{0x1163, {XFI_FM1_MAC9, XFI_FM1_MAC10, PCIE1,
> SGMII_FM1_DTSEC6} },
> +	{0x2263, {SGMII_2500_FM1_DTSEC9, SGMII_2500_FM1_DTSEC10,
> PCIE1,
> +		  SGMII_FM1_DTSEC6} },
> +	{0x3363, {SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6, PCIE1,
> +		  SGMII_FM1_DTSEC6} },
> +	{0x2223, {SGMII_2500_FM1_DTSEC9, SGMII_2500_FM1_DTSEC10,
> +		  SGMII_2500_FM1_DTSEC5, SGMII_FM1_DTSEC6} },
> +	{}
> +};
> +
> +static struct serdes_config serdes2_cfg_tbl[] = {
> +	/* SerDes 2 */
> +	{0x8888, {PCIE1, PCIE1, PCIE1, PCIE1} },
> +	{0x5559, {PCIE1, PCIE2, PCIE3, SATA1} },
> +	{0x5577, {PCIE1, PCIE2, PCIE3, PCIE3} },
> +	{0x5506, {PCIE1, PCIE2, NONE, PCIE3} },
> +	{0x0506, {NONE, PCIE2, NONE, PCIE3} },
> +	{0x0559, {NONE, PCIE2, PCIE3, SATA1} },
> +	{0x5A59, {PCIE1, SGMII_FM1_DTSEC2, PCIE3, SATA1} },
> +	{0x5A06, {PCIE1, SGMII_FM1_DTSEC2, NONE, PCIE3} },
> +	{}
> +};
> +
> +static struct serdes_config *serdes_cfg_tbl[] = {
> +	serdes1_cfg_tbl,
> +	serdes2_cfg_tbl,
> +};
> +
> +enum srds_prtcl serdes_get_prtcl(int serdes, int cfg, int lane) {
> +	struct serdes_config *ptr;
> +
> +	if (serdes >= ARRAY_SIZE(serdes_cfg_tbl))
> +		return 0;
> +
> +	ptr = serdes_cfg_tbl[serdes];
> +	while (ptr->protocol) {
> +		if (ptr->protocol == cfg)
> +			return ptr->lanes[lane];
> +		ptr++;
> +	}
> +
> +	return 0;
> +}
> +
> +int is_serdes_prtcl_valid(int serdes, u32 prtcl) {
> +	int i;
> +	struct serdes_config *ptr;
> +
> +	if (serdes >= ARRAY_SIZE(serdes_cfg_tbl))
> +		return 0;
> +
> +	ptr = serdes_cfg_tbl[serdes];
> +	while (ptr->protocol) {
> +		if (ptr->protocol == prtcl)
> +			break;
> +		ptr++;
> +	}
> +
> +	if (!ptr->protocol)
> +		return 0;
> +
> +	for (i = 0; i < SRDS_MAX_LANES; i++) {
> +		if (ptr->lanes[i] != NONE)
> +			return 1;
> +	}
> +
> +	return 0;
> +}
> diff --git a/arch/arm/include/asm/arch-fsl-layerscape/config.h
> b/arch/arm/include/asm/arch-fsl-layerscape/config.h
> index 44fe0c0..85e21fc 100644
> --- a/arch/arm/include/asm/arch-fsl-layerscape/config.h
> +++ b/arch/arm/include/asm/arch-fsl-layerscape/config.h
> @@ -229,6 +229,52 @@
>  #define CONFIG_SYS_FSL_SRDS_1
>  #define CONFIG_SYS_FSL_PCIE_COMPAT		"fsl,qoriq-pcie-v2.4"
>  #define CONFIG_SYS_FSL_SEC_BE
> +#elif defined(CONFIG_LS1046A)
> +#define CONFIG_MAX_CPUS				4
> +#define CONFIG_SYS_CACHELINE_SIZE		64
> +#define CONFIG_SYS_FMAN_V3
> +#define CONFIG_SYS_NUM_FMAN			1
> +#define CONFIG_SYS_NUM_FM1_DTSEC		8
> +#define CONFIG_SYS_NUM_FM1_10GEC		2
> +#define CONFIG_SYS_FSL_IFC_BANK_COUNT		4

Does LS1046 support IFC?

> +#define CONFIG_NUM_DDR_CONTROLLERS		1
> +#define CONFIG_SYS_CCSRBAR_DEFAULT		0x01000000
> +#define CONFIG_SYS_FSL_SEC_COMPAT		5
> +#define CONFIG_SYS_FSL_OCRAM_BASE		0x10000000 /* initial
> RAM */
> +#define CONFIG_SYS_FSL_OCRAM_SIZE		0x200000 /* 2 MiB */
> +#define CONFIG_SYS_FSL_DDR_BE
> +#define CONFIG_SYS_DDR_BLOCK1_SIZE  ((phys_size_t)2 << 30)
> +#define CONFIG_MAX_MEM_MAPPED
> CONFIG_SYS_DDR_BLOCK1_SIZE
> +
> +#define CONFIG_SYS_FSL_CCSR_GUR_BE
> +#define CONFIG_SYS_FSL_CCSR_SCFG_BE
> +#define CONFIG_SYS_FSL_IFC_BE

Does LS1046 support IFC?

> +#define CONFIG_SYS_FSL_ESDHC_BE
> +#define CONFIG_SYS_FSL_WDOG_BE
> +#define CONFIG_SYS_FSL_DSPI_BE
> +#define CONFIG_SYS_FSL_QSPI_BE
> +#define CONFIG_SYS_FSL_PEX_LUT_BE
> +
> +#define SRDS_MAX_LANES				4
> +#define CONFIG_SYS_FSL_SRDS_1
> +#define CONFIG_SYS_FSL_SRDS_2
> +
> +#define CONFIG_SYS_FSL_SFP_VER_3_2
> +#define CONFIG_SYS_FSL_SNVS_LE
> +#define CONFIG_SYS_FSL_SEC_BE
> +#define CONFIG_SYS_FSL_SFP_BE
> +#define CONFIG_SYS_FSL_SRK_LE
> +#define CONFIG_KEY_REVOCATION
> +
> +/* SMMU Defintions */
> +#define SMMU_BASE		0x09000000
> +
> +/* Generic Interrupt Controller Definitions */
> +#define GICD_BASE		0x01410000
> +#define GICC_BASE		0x01420000
> +
> +#define CONFIG_SYS_FSL_ERRATUM_A009929

Is this errata confirmed for this SoC?

> +#define CONFIG_SYS_FSL_MAX_NUM_OF_SEC		1
>  #else
>  #error SoC not defined
>  #endif
> diff --git a/arch/arm/include/asm/arch-fsl-layerscape/cpu.h
> b/arch/arm/include/asm/arch-fsl-layerscape/cpu.h
> index 197b0eb..b9a3c19 100644
> --- a/arch/arm/include/asm/arch-fsl-layerscape/cpu.h
> +++ b/arch/arm/include/asm/arch-fsl-layerscape/cpu.h
> @@ -13,6 +13,7 @@ static struct cpu_type cpu_type_list[] = {
>  	CPU_TYPE_ENTRY(LS2045A, LS2045A, 4),
>  	CPU_TYPE_ENTRY(LS1043A, LS1043A, 4),
>  	CPU_TYPE_ENTRY(LS1023A, LS1023A, 2),
> +	CPU_TYPE_ENTRY(LS1046A, LS1046A, 4),

If possible, please add other personality also. 

>  	CPU_TYPE_ENTRY(LS2040A, LS2040A, 4),
>  	CPU_TYPE_ENTRY(LS1012A, LS1012A, 1),
>  };
> diff --git a/arch/arm/include/asm/arch-fsl-layerscape/fsl_serdes.h
> b/arch/arm/include/asm/arch-fsl-layerscape/fsl_serdes.h
> index 487cba8..bd8494a 100644
> --- a/arch/arm/include/asm/arch-fsl-layerscape/fsl_serdes.h
> +++ b/arch/arm/include/asm/arch-fsl-layerscape/fsl_serdes.h
> @@ -140,6 +140,7 @@ enum srds_prtcl {
> 
>  enum srds {
>  	FSL_SRDS_1  = 0,
> +	FSL_SRDS_2  = 1,
>  };
> 
>  #endif
> @@ -150,7 +151,7 @@ int serdes_get_first_lane(u32 sd, enum srds_prtcl
> device);  enum srds_prtcl serdes_get_prtcl(int serdes, int cfg, int lane);  int
> is_serdes_prtcl_valid(int serdes, u32 prtcl);
> 
> -#ifdef	CONFIG_LS1043A
> +#if defined(CONFIG_LS1043A) || defined(CONFIG_LS1046A)

Please try to use chassis specific define

>  const char *serdes_clock_to_string(u32 clock);  int
> get_serdes_protocol(void);  #endif diff --git a/arch/arm/include/asm/arch-
> fsl-layerscape/immap_lsch2.h b/arch/arm/include/asm/arch-fsl-
> layerscape/immap_lsch2.h
> index cbb252c..05f497c 100644
> --- a/arch/arm/include/asm/arch-fsl-layerscape/immap_lsch2.h
> +++ b/arch/arm/include/asm/arch-fsl-layerscape/immap_lsch2.h
> @@ -228,6 +228,8 @@ struct ccsr_gur {
>  #define FSL_CHASSIS2_RCWSR0_MEM_PLL_RAT_MASK	0x3f
>  #define FSL_CHASSIS2_RCWSR4_SRDS1_PRTCL_MASK	0xffff0000
>  #define FSL_CHASSIS2_RCWSR4_SRDS1_PRTCL_SHIFT	16
> +#define FSL_CHASSIS2_RCWSR4_SRDS2_PRTCL_MASK	0x0000ffff
> +#define FSL_CHASSIS2_RCWSR4_SRDS2_PRTCL_SHIFT	0
>  #define RCW_SB_EN_REG_INDEX	7
>  #define RCW_SB_EN_MASK		0x00200000
> 
> diff --git a/arch/arm/include/asm/arch-fsl-layerscape/soc.h
> b/arch/arm/include/asm/arch-fsl-layerscape/soc.h
> index 39e8c7a..5ea6205 100644
> --- a/arch/arm/include/asm/arch-fsl-layerscape/soc.h
> +++ b/arch/arm/include/asm/arch-fsl-layerscape/soc.h
> @@ -44,6 +44,7 @@ struct cpu_type {
>  #define SVR_LS1012A		0x870400
>  #define SVR_LS1043A		0x879200
>  #define SVR_LS1023A		0x879208
> +#define SVR_LS1046A		0x870704
>  #define SVR_LS2045A		0x870120
>  #define SVR_LS2080A		0x870110
>  #define SVR_LS2085A		0x870100

If possible, please add other personality also

--prabhakar
Gong Qianyu July 1, 2016, 8:52 a.m. UTC | #2
Hi Prabhakar,

> -----Original Message-----
> From: Prabhakar Kushwaha
> Sent: Thursday, June 30, 2016 6:30 PM
> To: Qianyu Gong <qianyu.gong@nxp.com>; york sun <york.sun@nxp.com>; u-
> boot@lists.denx.de
> Cc: Mihai Bantea <mihai.bantea@freescale.com>; Zhiqiang Hou
> <zhiqiang.hou@nxp.com>; Wenbin Song <wenbin.song@nxp.com>; Mingkai Hu
> <mingkai.hu@nxp.com>
> Subject: RE: [U-Boot] [PATCH 2/3] armv8/fsl_lsch2: Add LS1046A SoC support
> 
> 
> > -----Original Message-----
> > From: U-Boot [mailto:u-boot-bounces@lists.denx.de] On Behalf Of Gong
> > Qianyu
> > Sent: Thursday, June 30, 2016 3:31 PM
> > To: york sun <york.sun@nxp.com>; u-boot@lists.denx.de
> > Cc: Mihai Bantea <mihai.bantea@freescale.com>; Zhiqiang Hou
> > <zhiqiang.hou@nxp.com>; Wenbin Song <wenbin.song@nxp.com>; Mingkai Hu
> > <mingkai.hu@nxp.com>
> > Subject: [U-Boot] [PATCH 2/3] armv8/fsl_lsch2: Add LS1046A SoC support
> >
> > From: Mingkai Hu <mingkai.hu@nxp.com>
> >
> > The LS1046A processor is built on the QorIQ LS series architecture
> > combining four ARM A72 processor cores with DPAA 1.0 support.
> >
> 
> Please add SoC details in arch/arm/cpu/armv8/fsl-layerscape/doc/README.soc
> 

Ok.

> > Signed-off-by: Hou Zhiqiang <Zhiqiang.Hou@nxp.com>
> > Signed-off-by: Mihai Bantea <mihai.bantea@freescale.com>
> > Signed-off-by: Mingkai Hu <mingkai.hu@nxp.com>
> > Signed-off-by: Gong Qianyu <Qianyu.Gong@nxp.com>
> >
> 
> Strange missing list of file modified :)
> 
> 
> > diff --git a/arch/arm/cpu/armv8/fsl-layerscape/Makefile
> > b/arch/arm/cpu/armv8/fsl-layerscape/Makefile
> > index eb2cbc3..4df467d 100644
> > --- a/arch/arm/cpu/armv8/fsl-layerscape/Makefile
> > +++ b/arch/arm/cpu/armv8/fsl-layerscape/Makefile
> > @@ -32,3 +32,7 @@ endif
> >  ifneq ($(CONFIG_LS1012A),)
> >  obj-$(CONFIG_SYS_HAS_SERDES) += ls1012a_serdes.o  endif
> > +
> > +ifneq ($(CONFIG_LS1046A),)
> > +obj-$(CONFIG_SYS_HAS_SERDES) += ls1046a_serdes.o endif
> > diff --git a/arch/arm/cpu/armv8/fsl-layerscape/fsl_lsch2_serdes.c
> > b/arch/arm/cpu/armv8/fsl-layerscape/fsl_lsch2_serdes.c
> > index fe3444a..f73092a 100644
> > --- a/arch/arm/cpu/armv8/fsl-layerscape/fsl_lsch2_serdes.c
> > +++ b/arch/arm/cpu/armv8/fsl-layerscape/fsl_lsch2_serdes.c
> > @@ -13,6 +13,9 @@
> >  #ifdef CONFIG_SYS_FSL_SRDS_1
> >  static u8 serdes1_prtcl_map[SERDES_PRCTL_COUNT];
> >  #endif
> > +#ifdef CONFIG_SYS_FSL_SRDS_2
> > +static u8 serdes2_prtcl_map[SERDES_PRCTL_COUNT];
> > +#endif
> >
> >  int is_serdes_configured(enum srds_prtcl device)  { @@ -21,6 +24,9 @@
> > int is_serdes_configured(enum srds_prtcl device)  #ifdef
> > CONFIG_SYS_FSL_SRDS_1
> >  	ret |= serdes1_prtcl_map[device];
> >  #endif
> > +#ifdef CONFIG_SYS_FSL_SRDS_2
> > +	ret |= serdes2_prtcl_map[device];
> > +#endif
> >
> >  	return !!ret;
> >  }
> > @@ -38,6 +44,12 @@ int serdes_get_first_lane(u32 sd, enum srds_prtcl
> > device)
> >  		cfg >>= FSL_CHASSIS2_RCWSR4_SRDS1_PRTCL_SHIFT;
> >  		break;
> >  #endif
> > +#ifdef CONFIG_SYS_FSL_SRDS_2
> > +	case FSL_SRDS_2:
> > +		cfg &= FSL_CHASSIS2_RCWSR4_SRDS2_PRTCL_MASK;
> > +		cfg >>= FSL_CHASSIS2_RCWSR4_SRDS2_PRTCL_SHIFT;
> > +		break;
> > +#endif
> >  	default:
> >  		printf("invalid SerDes%d\n", sd);
> >  		break;
> > @@ -114,4 +126,11 @@ void fsl_serdes_init(void)
> >  		    FSL_CHASSIS2_RCWSR4_SRDS1_PRTCL_SHIFT,
> >  		    serdes1_prtcl_map);
> >  #endif
> > +#ifdef CONFIG_SYS_FSL_SRDS_2
> > +	serdes_init(FSL_SRDS_2,
> > +		    CONFIG_SYS_FSL_SERDES_ADDR,
> > +		    FSL_CHASSIS2_RCWSR4_SRDS2_PRTCL_MASK,
> > +		    FSL_CHASSIS2_RCWSR4_SRDS2_PRTCL_SHIFT,
> > +		    serdes2_prtcl_map);
> > +#endif
> >  }
> 
> Ideally this should be separate patch. Like Adding support of SerDes2
> 

Ok.

> 
> > diff --git a/arch/arm/cpu/armv8/fsl-layerscape/fsl_lsch2_speed.c
> > b/arch/arm/cpu/armv8/fsl-layerscape/fsl_lsch2_speed.c
> > index d0dc58d..8922197 100644
> > --- a/arch/arm/cpu/armv8/fsl-layerscape/fsl_lsch2_speed.c
> > +++ b/arch/arm/cpu/armv8/fsl-layerscape/fsl_lsch2_speed.c
> > @@ -107,6 +107,12 @@ void get_sys_info(struct sys_info *sys_info)
> >  	case 3:
> >  		sys_info->freq_fman[0] = freq_c_pll[0] / 3;
> >  		break;
> > +	case 4:
> > +		sys_info->freq_fman[0] = freq_c_pll[0] / 4;
> > +		break;
> > +	case 5:
> > +		sys_info->freq_fman[0] = sys_info->freq_systembus;
> > +		break;
> >  	case 6:
> >  		sys_info->freq_fman[0] = freq_c_pll[1] / 2;
> >  		break;
> > @@ -124,8 +130,23 @@ void get_sys_info(struct sys_info *sys_info)
> > #ifdef CONFIG_FSL_ESDHC  #ifdef CONFIG_FSL_ESDHC_USE_PERIPHERAL_CLK
> >  	rcw_tmp = in_be32(&gur->rcwsr[15]);
> > -	rcw_tmp = (rcw_tmp & HWA_CGA_M2_CLK_SEL) >>
> > HWA_CGA_M2_CLK_SHIFT;
> > -	sys_info->freq_sdhc = freq_c_pll[1] / rcw_tmp;
> > +	switch ((rcw_tmp & HWA_CGA_M2_CLK_SEL) >>
> > HWA_CGA_M2_CLK_SHIFT) {
> > +	case 1:
> > +		sys_info->freq_sdhc = freq_c_pll[1];
> > +		break;
> > +	case 2:
> > +		sys_info->freq_sdhc = freq_c_pll[1] / 2;
> > +		break;
> > +	case 3:
> > +		sys_info->freq_sdhc = freq_c_pll[1] / 3;
> > +		break;
> > +	case 6:
> > +		sys_info->freq_sdhc = freq_c_pll[0] / 2;
> > +		break;
> > +	default:
> > +		printf("Error: Unknown ESDHC clock select!\n");
> > +		break;
> > +	}
> >  #else
> >  	sys_info->freq_sdhc = sys_info->freq_systembus;  #endif diff --git
> > a/arch/arm/cpu/armv8/fsl-layerscape/ls1046a_serdes.c
> > b/arch/arm/cpu/armv8/fsl-layerscape/ls1046a_serdes.c
> > new file mode 100644
> > index 0000000..1da6b71
> > --- /dev/null
> > +++ b/arch/arm/cpu/armv8/fsl-layerscape/ls1046a_serdes.c
> > @@ -0,0 +1,99 @@
> > +/*
> > + * Copyright 2016 Freescale Semiconductor, Inc.
> > + *
> > + * SPDX-License-Identifier:	GPL-2.0+
> > + */
> > +
> > +#include <common.h>
> > +#include <asm/arch/fsl_serdes.h>
> > +#include <asm/arch/immap_lsch2.h>
> > +
> > +struct serdes_config {
> > +	u32 protocol;
> > +	u8 lanes[SRDS_MAX_LANES];
> > +};
> > +
> > +static struct serdes_config serdes1_cfg_tbl[] = {
> > +	/* SerDes 1 */
> > +	{0x3333, {SGMII_FM1_DTSEC9, SGMII_FM1_DTSEC10,
> > SGMII_FM1_DTSEC5,
> > +		  SGMII_FM1_DTSEC6} },
> > +	{0x1133, {XFI_FM1_MAC9, XFI_FM1_MAC10, SGMII_FM1_DTSEC5,
> > +		  SGMII_FM1_DTSEC6} },
> > +	{0x1333, {XFI_FM1_MAC9, SGMII_FM1_DTSEC10,
> > SGMII_FM1_DTSEC5,
> > +		  SGMII_FM1_DTSEC6} },
> > +	{0x2333, {SGMII_2500_FM1_DTSEC9, SGMII_FM1_DTSEC10,
> > SGMII_FM1_DTSEC5,
> > +		  SGMII_FM1_DTSEC6} },
> > +	{0x2233, {SGMII_2500_FM1_DTSEC9, SGMII_2500_FM1_DTSEC10,
> > +		  SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6} },
> > +	{0x1040, {XFI_FM1_MAC9, NONE, QSGMII_FM1_A, NONE} },
> > +	{0x2040, {SGMII_2500_FM1_DTSEC9, NONE, QSGMII_FM1_A, NONE}
> > },
> > +	{0x1163, {XFI_FM1_MAC9, XFI_FM1_MAC10, PCIE1,
> > SGMII_FM1_DTSEC6} },
> > +	{0x2263, {SGMII_2500_FM1_DTSEC9, SGMII_2500_FM1_DTSEC10,
> > PCIE1,
> > +		  SGMII_FM1_DTSEC6} },
> > +	{0x3363, {SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6, PCIE1,
> > +		  SGMII_FM1_DTSEC6} },
> > +	{0x2223, {SGMII_2500_FM1_DTSEC9, SGMII_2500_FM1_DTSEC10,
> > +		  SGMII_2500_FM1_DTSEC5, SGMII_FM1_DTSEC6} },
> > +	{}
> > +};
> > +
> > +static struct serdes_config serdes2_cfg_tbl[] = {
> > +	/* SerDes 2 */
> > +	{0x8888, {PCIE1, PCIE1, PCIE1, PCIE1} },
> > +	{0x5559, {PCIE1, PCIE2, PCIE3, SATA1} },
> > +	{0x5577, {PCIE1, PCIE2, PCIE3, PCIE3} },
> > +	{0x5506, {PCIE1, PCIE2, NONE, PCIE3} },
> > +	{0x0506, {NONE, PCIE2, NONE, PCIE3} },
> > +	{0x0559, {NONE, PCIE2, PCIE3, SATA1} },
> > +	{0x5A59, {PCIE1, SGMII_FM1_DTSEC2, PCIE3, SATA1} },
> > +	{0x5A06, {PCIE1, SGMII_FM1_DTSEC2, NONE, PCIE3} },
> > +	{}
> > +};
> > +
> > +static struct serdes_config *serdes_cfg_tbl[] = {
> > +	serdes1_cfg_tbl,
> > +	serdes2_cfg_tbl,
> > +};
> > +
> > +enum srds_prtcl serdes_get_prtcl(int serdes, int cfg, int lane) {
> > +	struct serdes_config *ptr;
> > +
> > +	if (serdes >= ARRAY_SIZE(serdes_cfg_tbl))
> > +		return 0;
> > +
> > +	ptr = serdes_cfg_tbl[serdes];
> > +	while (ptr->protocol) {
> > +		if (ptr->protocol == cfg)
> > +			return ptr->lanes[lane];
> > +		ptr++;
> > +	}
> > +
> > +	return 0;
> > +}
> > +
> > +int is_serdes_prtcl_valid(int serdes, u32 prtcl) {
> > +	int i;
> > +	struct serdes_config *ptr;
> > +
> > +	if (serdes >= ARRAY_SIZE(serdes_cfg_tbl))
> > +		return 0;
> > +
> > +	ptr = serdes_cfg_tbl[serdes];
> > +	while (ptr->protocol) {
> > +		if (ptr->protocol == prtcl)
> > +			break;
> > +		ptr++;
> > +	}
> > +
> > +	if (!ptr->protocol)
> > +		return 0;
> > +
> > +	for (i = 0; i < SRDS_MAX_LANES; i++) {
> > +		if (ptr->lanes[i] != NONE)
> > +			return 1;
> > +	}
> > +
> > +	return 0;
> > +}
> > diff --git a/arch/arm/include/asm/arch-fsl-layerscape/config.h
> > b/arch/arm/include/asm/arch-fsl-layerscape/config.h
> > index 44fe0c0..85e21fc 100644
> > --- a/arch/arm/include/asm/arch-fsl-layerscape/config.h
> > +++ b/arch/arm/include/asm/arch-fsl-layerscape/config.h
> > @@ -229,6 +229,52 @@
> >  #define CONFIG_SYS_FSL_SRDS_1
> >  #define CONFIG_SYS_FSL_PCIE_COMPAT		"fsl,qoriq-pcie-v2.4"
> >  #define CONFIG_SYS_FSL_SEC_BE
> > +#elif defined(CONFIG_LS1046A)
> > +#define CONFIG_MAX_CPUS				4
> > +#define CONFIG_SYS_CACHELINE_SIZE		64
> > +#define CONFIG_SYS_FMAN_V3
> > +#define CONFIG_SYS_NUM_FMAN			1
> > +#define CONFIG_SYS_NUM_FM1_DTSEC		8
> > +#define CONFIG_SYS_NUM_FM1_10GEC		2
> > +#define CONFIG_SYS_FSL_IFC_BANK_COUNT		4
> 
> Does LS1046 support IFC?
> 

Yes.

> > +#define CONFIG_NUM_DDR_CONTROLLERS		1
> > +#define CONFIG_SYS_CCSRBAR_DEFAULT		0x01000000
> > +#define CONFIG_SYS_FSL_SEC_COMPAT		5
> > +#define CONFIG_SYS_FSL_OCRAM_BASE		0x10000000 /* initial
> > RAM */
> > +#define CONFIG_SYS_FSL_OCRAM_SIZE		0x200000 /* 2 MiB */
> > +#define CONFIG_SYS_FSL_DDR_BE
> > +#define CONFIG_SYS_DDR_BLOCK1_SIZE  ((phys_size_t)2 << 30) #define
> > +CONFIG_MAX_MEM_MAPPED
> > CONFIG_SYS_DDR_BLOCK1_SIZE
> > +
> > +#define CONFIG_SYS_FSL_CCSR_GUR_BE
> > +#define CONFIG_SYS_FSL_CCSR_SCFG_BE
> > +#define CONFIG_SYS_FSL_IFC_BE
> 
> Does LS1046 support IFC?
> 
> > +#define CONFIG_SYS_FSL_ESDHC_BE
> > +#define CONFIG_SYS_FSL_WDOG_BE
> > +#define CONFIG_SYS_FSL_DSPI_BE
> > +#define CONFIG_SYS_FSL_QSPI_BE
> > +#define CONFIG_SYS_FSL_PEX_LUT_BE
> > +
> > +#define SRDS_MAX_LANES				4
> > +#define CONFIG_SYS_FSL_SRDS_1
> > +#define CONFIG_SYS_FSL_SRDS_2
> > +
> > +#define CONFIG_SYS_FSL_SFP_VER_3_2
> > +#define CONFIG_SYS_FSL_SNVS_LE
> > +#define CONFIG_SYS_FSL_SEC_BE
> > +#define CONFIG_SYS_FSL_SFP_BE
> > +#define CONFIG_SYS_FSL_SRK_LE
> > +#define CONFIG_KEY_REVOCATION
> > +
> > +/* SMMU Defintions */
> > +#define SMMU_BASE		0x09000000
> > +
> > +/* Generic Interrupt Controller Definitions */
> > +#define GICD_BASE		0x01410000
> > +#define GICC_BASE		0x01420000
> > +
> > +#define CONFIG_SYS_FSL_ERRATUM_A009929
> 
> Is this errata confirmed for this SoC?
> 

Not yet. I'll remove it.

> > +#define CONFIG_SYS_FSL_MAX_NUM_OF_SEC		1
> >  #else
> >  #error SoC not defined
> >  #endif
> > diff --git a/arch/arm/include/asm/arch-fsl-layerscape/cpu.h
> > b/arch/arm/include/asm/arch-fsl-layerscape/cpu.h
> > index 197b0eb..b9a3c19 100644
> > --- a/arch/arm/include/asm/arch-fsl-layerscape/cpu.h
> > +++ b/arch/arm/include/asm/arch-fsl-layerscape/cpu.h
> > @@ -13,6 +13,7 @@ static struct cpu_type cpu_type_list[] = {
> >  	CPU_TYPE_ENTRY(LS2045A, LS2045A, 4),
> >  	CPU_TYPE_ENTRY(LS1043A, LS1043A, 4),
> >  	CPU_TYPE_ENTRY(LS1023A, LS1023A, 2),
> > +	CPU_TYPE_ENTRY(LS1046A, LS1046A, 4),
> 
> If possible, please add other personality also.
> 
> >  	CPU_TYPE_ENTRY(LS2040A, LS2040A, 4),
> >  	CPU_TYPE_ENTRY(LS1012A, LS1012A, 1),  }; diff --git
> > a/arch/arm/include/asm/arch-fsl-layerscape/fsl_serdes.h
> > b/arch/arm/include/asm/arch-fsl-layerscape/fsl_serdes.h
> > index 487cba8..bd8494a 100644
> > --- a/arch/arm/include/asm/arch-fsl-layerscape/fsl_serdes.h
> > +++ b/arch/arm/include/asm/arch-fsl-layerscape/fsl_serdes.h
> > @@ -140,6 +140,7 @@ enum srds_prtcl {
> >
> >  enum srds {
> >  	FSL_SRDS_1  = 0,
> > +	FSL_SRDS_2  = 1,
> >  };
> >
> >  #endif
> > @@ -150,7 +151,7 @@ int serdes_get_first_lane(u32 sd, enum srds_prtcl
> > device);  enum srds_prtcl serdes_get_prtcl(int serdes, int cfg, int
> > lane);  int is_serdes_prtcl_valid(int serdes, u32 prtcl);
> >
> > -#ifdef	CONFIG_LS1043A
> > +#if defined(CONFIG_LS1043A) || defined(CONFIG_LS1046A)
> 
> Please try to use chassis specific define
> 
> >  const char *serdes_clock_to_string(u32 clock);  int
> > get_serdes_protocol(void);  #endif diff --git
> > a/arch/arm/include/asm/arch- fsl-layerscape/immap_lsch2.h
> > b/arch/arm/include/asm/arch-fsl- layerscape/immap_lsch2.h index
> > cbb252c..05f497c 100644
> > --- a/arch/arm/include/asm/arch-fsl-layerscape/immap_lsch2.h
> > +++ b/arch/arm/include/asm/arch-fsl-layerscape/immap_lsch2.h
> > @@ -228,6 +228,8 @@ struct ccsr_gur {
> >  #define FSL_CHASSIS2_RCWSR0_MEM_PLL_RAT_MASK	0x3f
> >  #define FSL_CHASSIS2_RCWSR4_SRDS1_PRTCL_MASK	0xffff0000
> >  #define FSL_CHASSIS2_RCWSR4_SRDS1_PRTCL_SHIFT	16
> > +#define FSL_CHASSIS2_RCWSR4_SRDS2_PRTCL_MASK	0x0000ffff
> > +#define FSL_CHASSIS2_RCWSR4_SRDS2_PRTCL_SHIFT	0
> >  #define RCW_SB_EN_REG_INDEX	7
> >  #define RCW_SB_EN_MASK		0x00200000
> >
> > diff --git a/arch/arm/include/asm/arch-fsl-layerscape/soc.h
> > b/arch/arm/include/asm/arch-fsl-layerscape/soc.h
> > index 39e8c7a..5ea6205 100644
> > --- a/arch/arm/include/asm/arch-fsl-layerscape/soc.h
> > +++ b/arch/arm/include/asm/arch-fsl-layerscape/soc.h
> > @@ -44,6 +44,7 @@ struct cpu_type {
> >  #define SVR_LS1012A		0x870400
> >  #define SVR_LS1043A		0x879200
> >  #define SVR_LS1023A		0x879208
> > +#define SVR_LS1046A		0x870704
> >  #define SVR_LS2045A		0x870120
> >  #define SVR_LS2080A		0x870110
> >  #define SVR_LS2085A		0x870100
> 
> If possible, please add other personality also
> 

OK. I'll add LS1026A.

Thanks,
Qianyu
diff mbox

Patch

diff --git a/arch/arm/cpu/armv8/fsl-layerscape/Makefile b/arch/arm/cpu/armv8/fsl-layerscape/Makefile
index eb2cbc3..4df467d 100644
--- a/arch/arm/cpu/armv8/fsl-layerscape/Makefile
+++ b/arch/arm/cpu/armv8/fsl-layerscape/Makefile
@@ -32,3 +32,7 @@  endif
 ifneq ($(CONFIG_LS1012A),)
 obj-$(CONFIG_SYS_HAS_SERDES) += ls1012a_serdes.o
 endif
+
+ifneq ($(CONFIG_LS1046A),)
+obj-$(CONFIG_SYS_HAS_SERDES) += ls1046a_serdes.o
+endif
diff --git a/arch/arm/cpu/armv8/fsl-layerscape/fsl_lsch2_serdes.c b/arch/arm/cpu/armv8/fsl-layerscape/fsl_lsch2_serdes.c
index fe3444a..f73092a 100644
--- a/arch/arm/cpu/armv8/fsl-layerscape/fsl_lsch2_serdes.c
+++ b/arch/arm/cpu/armv8/fsl-layerscape/fsl_lsch2_serdes.c
@@ -13,6 +13,9 @@ 
 #ifdef CONFIG_SYS_FSL_SRDS_1
 static u8 serdes1_prtcl_map[SERDES_PRCTL_COUNT];
 #endif
+#ifdef CONFIG_SYS_FSL_SRDS_2
+static u8 serdes2_prtcl_map[SERDES_PRCTL_COUNT];
+#endif
 
 int is_serdes_configured(enum srds_prtcl device)
 {
@@ -21,6 +24,9 @@  int is_serdes_configured(enum srds_prtcl device)
 #ifdef CONFIG_SYS_FSL_SRDS_1
 	ret |= serdes1_prtcl_map[device];
 #endif
+#ifdef CONFIG_SYS_FSL_SRDS_2
+	ret |= serdes2_prtcl_map[device];
+#endif
 
 	return !!ret;
 }
@@ -38,6 +44,12 @@  int serdes_get_first_lane(u32 sd, enum srds_prtcl device)
 		cfg >>= FSL_CHASSIS2_RCWSR4_SRDS1_PRTCL_SHIFT;
 		break;
 #endif
+#ifdef CONFIG_SYS_FSL_SRDS_2
+	case FSL_SRDS_2:
+		cfg &= FSL_CHASSIS2_RCWSR4_SRDS2_PRTCL_MASK;
+		cfg >>= FSL_CHASSIS2_RCWSR4_SRDS2_PRTCL_SHIFT;
+		break;
+#endif
 	default:
 		printf("invalid SerDes%d\n", sd);
 		break;
@@ -114,4 +126,11 @@  void fsl_serdes_init(void)
 		    FSL_CHASSIS2_RCWSR4_SRDS1_PRTCL_SHIFT,
 		    serdes1_prtcl_map);
 #endif
+#ifdef CONFIG_SYS_FSL_SRDS_2
+	serdes_init(FSL_SRDS_2,
+		    CONFIG_SYS_FSL_SERDES_ADDR,
+		    FSL_CHASSIS2_RCWSR4_SRDS2_PRTCL_MASK,
+		    FSL_CHASSIS2_RCWSR4_SRDS2_PRTCL_SHIFT,
+		    serdes2_prtcl_map);
+#endif
 }
diff --git a/arch/arm/cpu/armv8/fsl-layerscape/fsl_lsch2_speed.c b/arch/arm/cpu/armv8/fsl-layerscape/fsl_lsch2_speed.c
index d0dc58d..8922197 100644
--- a/arch/arm/cpu/armv8/fsl-layerscape/fsl_lsch2_speed.c
+++ b/arch/arm/cpu/armv8/fsl-layerscape/fsl_lsch2_speed.c
@@ -107,6 +107,12 @@  void get_sys_info(struct sys_info *sys_info)
 	case 3:
 		sys_info->freq_fman[0] = freq_c_pll[0] / 3;
 		break;
+	case 4:
+		sys_info->freq_fman[0] = freq_c_pll[0] / 4;
+		break;
+	case 5:
+		sys_info->freq_fman[0] = sys_info->freq_systembus;
+		break;
 	case 6:
 		sys_info->freq_fman[0] = freq_c_pll[1] / 2;
 		break;
@@ -124,8 +130,23 @@  void get_sys_info(struct sys_info *sys_info)
 #ifdef CONFIG_FSL_ESDHC
 #ifdef CONFIG_FSL_ESDHC_USE_PERIPHERAL_CLK
 	rcw_tmp = in_be32(&gur->rcwsr[15]);
-	rcw_tmp = (rcw_tmp & HWA_CGA_M2_CLK_SEL) >> HWA_CGA_M2_CLK_SHIFT;
-	sys_info->freq_sdhc = freq_c_pll[1] / rcw_tmp;
+	switch ((rcw_tmp & HWA_CGA_M2_CLK_SEL) >> HWA_CGA_M2_CLK_SHIFT) {
+	case 1:
+		sys_info->freq_sdhc = freq_c_pll[1];
+		break;
+	case 2:
+		sys_info->freq_sdhc = freq_c_pll[1] / 2;
+		break;
+	case 3:
+		sys_info->freq_sdhc = freq_c_pll[1] / 3;
+		break;
+	case 6:
+		sys_info->freq_sdhc = freq_c_pll[0] / 2;
+		break;
+	default:
+		printf("Error: Unknown ESDHC clock select!\n");
+		break;
+	}
 #else
 	sys_info->freq_sdhc = sys_info->freq_systembus;
 #endif
diff --git a/arch/arm/cpu/armv8/fsl-layerscape/ls1046a_serdes.c b/arch/arm/cpu/armv8/fsl-layerscape/ls1046a_serdes.c
new file mode 100644
index 0000000..1da6b71
--- /dev/null
+++ b/arch/arm/cpu/armv8/fsl-layerscape/ls1046a_serdes.c
@@ -0,0 +1,99 @@ 
+/*
+ * Copyright 2016 Freescale Semiconductor, Inc.
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+#include <common.h>
+#include <asm/arch/fsl_serdes.h>
+#include <asm/arch/immap_lsch2.h>
+
+struct serdes_config {
+	u32 protocol;
+	u8 lanes[SRDS_MAX_LANES];
+};
+
+static struct serdes_config serdes1_cfg_tbl[] = {
+	/* SerDes 1 */
+	{0x3333, {SGMII_FM1_DTSEC9, SGMII_FM1_DTSEC10, SGMII_FM1_DTSEC5,
+		  SGMII_FM1_DTSEC6} },
+	{0x1133, {XFI_FM1_MAC9, XFI_FM1_MAC10, SGMII_FM1_DTSEC5,
+		  SGMII_FM1_DTSEC6} },
+	{0x1333, {XFI_FM1_MAC9, SGMII_FM1_DTSEC10, SGMII_FM1_DTSEC5,
+		  SGMII_FM1_DTSEC6} },
+	{0x2333, {SGMII_2500_FM1_DTSEC9, SGMII_FM1_DTSEC10, SGMII_FM1_DTSEC5,
+		  SGMII_FM1_DTSEC6} },
+	{0x2233, {SGMII_2500_FM1_DTSEC9, SGMII_2500_FM1_DTSEC10,
+		  SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6} },
+	{0x1040, {XFI_FM1_MAC9, NONE, QSGMII_FM1_A, NONE} },
+	{0x2040, {SGMII_2500_FM1_DTSEC9, NONE, QSGMII_FM1_A, NONE} },
+	{0x1163, {XFI_FM1_MAC9, XFI_FM1_MAC10, PCIE1, SGMII_FM1_DTSEC6} },
+	{0x2263, {SGMII_2500_FM1_DTSEC9, SGMII_2500_FM1_DTSEC10, PCIE1,
+		  SGMII_FM1_DTSEC6} },
+	{0x3363, {SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6, PCIE1,
+		  SGMII_FM1_DTSEC6} },
+	{0x2223, {SGMII_2500_FM1_DTSEC9, SGMII_2500_FM1_DTSEC10,
+		  SGMII_2500_FM1_DTSEC5, SGMII_FM1_DTSEC6} },
+	{}
+};
+
+static struct serdes_config serdes2_cfg_tbl[] = {
+	/* SerDes 2 */
+	{0x8888, {PCIE1, PCIE1, PCIE1, PCIE1} },
+	{0x5559, {PCIE1, PCIE2, PCIE3, SATA1} },
+	{0x5577, {PCIE1, PCIE2, PCIE3, PCIE3} },
+	{0x5506, {PCIE1, PCIE2, NONE, PCIE3} },
+	{0x0506, {NONE, PCIE2, NONE, PCIE3} },
+	{0x0559, {NONE, PCIE2, PCIE3, SATA1} },
+	{0x5A59, {PCIE1, SGMII_FM1_DTSEC2, PCIE3, SATA1} },
+	{0x5A06, {PCIE1, SGMII_FM1_DTSEC2, NONE, PCIE3} },
+	{}
+};
+
+static struct serdes_config *serdes_cfg_tbl[] = {
+	serdes1_cfg_tbl,
+	serdes2_cfg_tbl,
+};
+
+enum srds_prtcl serdes_get_prtcl(int serdes, int cfg, int lane)
+{
+	struct serdes_config *ptr;
+
+	if (serdes >= ARRAY_SIZE(serdes_cfg_tbl))
+		return 0;
+
+	ptr = serdes_cfg_tbl[serdes];
+	while (ptr->protocol) {
+		if (ptr->protocol == cfg)
+			return ptr->lanes[lane];
+		ptr++;
+	}
+
+	return 0;
+}
+
+int is_serdes_prtcl_valid(int serdes, u32 prtcl)
+{
+	int i;
+	struct serdes_config *ptr;
+
+	if (serdes >= ARRAY_SIZE(serdes_cfg_tbl))
+		return 0;
+
+	ptr = serdes_cfg_tbl[serdes];
+	while (ptr->protocol) {
+		if (ptr->protocol == prtcl)
+			break;
+		ptr++;
+	}
+
+	if (!ptr->protocol)
+		return 0;
+
+	for (i = 0; i < SRDS_MAX_LANES; i++) {
+		if (ptr->lanes[i] != NONE)
+			return 1;
+	}
+
+	return 0;
+}
diff --git a/arch/arm/include/asm/arch-fsl-layerscape/config.h b/arch/arm/include/asm/arch-fsl-layerscape/config.h
index 44fe0c0..85e21fc 100644
--- a/arch/arm/include/asm/arch-fsl-layerscape/config.h
+++ b/arch/arm/include/asm/arch-fsl-layerscape/config.h
@@ -229,6 +229,52 @@ 
 #define CONFIG_SYS_FSL_SRDS_1
 #define CONFIG_SYS_FSL_PCIE_COMPAT		"fsl,qoriq-pcie-v2.4"
 #define CONFIG_SYS_FSL_SEC_BE
+#elif defined(CONFIG_LS1046A)
+#define CONFIG_MAX_CPUS				4
+#define CONFIG_SYS_CACHELINE_SIZE		64
+#define CONFIG_SYS_FMAN_V3
+#define CONFIG_SYS_NUM_FMAN			1
+#define CONFIG_SYS_NUM_FM1_DTSEC		8
+#define CONFIG_SYS_NUM_FM1_10GEC		2
+#define CONFIG_SYS_FSL_IFC_BANK_COUNT		4
+#define CONFIG_NUM_DDR_CONTROLLERS		1
+#define CONFIG_SYS_CCSRBAR_DEFAULT		0x01000000
+#define CONFIG_SYS_FSL_SEC_COMPAT		5
+#define CONFIG_SYS_FSL_OCRAM_BASE		0x10000000 /* initial RAM */
+#define CONFIG_SYS_FSL_OCRAM_SIZE		0x200000 /* 2 MiB */
+#define CONFIG_SYS_FSL_DDR_BE
+#define CONFIG_SYS_DDR_BLOCK1_SIZE  ((phys_size_t)2 << 30)
+#define CONFIG_MAX_MEM_MAPPED           CONFIG_SYS_DDR_BLOCK1_SIZE
+
+#define CONFIG_SYS_FSL_CCSR_GUR_BE
+#define CONFIG_SYS_FSL_CCSR_SCFG_BE
+#define CONFIG_SYS_FSL_IFC_BE
+#define CONFIG_SYS_FSL_ESDHC_BE
+#define CONFIG_SYS_FSL_WDOG_BE
+#define CONFIG_SYS_FSL_DSPI_BE
+#define CONFIG_SYS_FSL_QSPI_BE
+#define CONFIG_SYS_FSL_PEX_LUT_BE
+
+#define SRDS_MAX_LANES				4
+#define CONFIG_SYS_FSL_SRDS_1
+#define CONFIG_SYS_FSL_SRDS_2
+
+#define CONFIG_SYS_FSL_SFP_VER_3_2
+#define CONFIG_SYS_FSL_SNVS_LE
+#define CONFIG_SYS_FSL_SEC_BE
+#define CONFIG_SYS_FSL_SFP_BE
+#define CONFIG_SYS_FSL_SRK_LE
+#define CONFIG_KEY_REVOCATION
+
+/* SMMU Defintions */
+#define SMMU_BASE		0x09000000
+
+/* Generic Interrupt Controller Definitions */
+#define GICD_BASE		0x01410000
+#define GICC_BASE		0x01420000
+
+#define CONFIG_SYS_FSL_ERRATUM_A009929
+#define CONFIG_SYS_FSL_MAX_NUM_OF_SEC		1
 #else
 #error SoC not defined
 #endif
diff --git a/arch/arm/include/asm/arch-fsl-layerscape/cpu.h b/arch/arm/include/asm/arch-fsl-layerscape/cpu.h
index 197b0eb..b9a3c19 100644
--- a/arch/arm/include/asm/arch-fsl-layerscape/cpu.h
+++ b/arch/arm/include/asm/arch-fsl-layerscape/cpu.h
@@ -13,6 +13,7 @@  static struct cpu_type cpu_type_list[] = {
 	CPU_TYPE_ENTRY(LS2045A, LS2045A, 4),
 	CPU_TYPE_ENTRY(LS1043A, LS1043A, 4),
 	CPU_TYPE_ENTRY(LS1023A, LS1023A, 2),
+	CPU_TYPE_ENTRY(LS1046A, LS1046A, 4),
 	CPU_TYPE_ENTRY(LS2040A, LS2040A, 4),
 	CPU_TYPE_ENTRY(LS1012A, LS1012A, 1),
 };
diff --git a/arch/arm/include/asm/arch-fsl-layerscape/fsl_serdes.h b/arch/arm/include/asm/arch-fsl-layerscape/fsl_serdes.h
index 487cba8..bd8494a 100644
--- a/arch/arm/include/asm/arch-fsl-layerscape/fsl_serdes.h
+++ b/arch/arm/include/asm/arch-fsl-layerscape/fsl_serdes.h
@@ -140,6 +140,7 @@  enum srds_prtcl {
 
 enum srds {
 	FSL_SRDS_1  = 0,
+	FSL_SRDS_2  = 1,
 };
 
 #endif
@@ -150,7 +151,7 @@  int serdes_get_first_lane(u32 sd, enum srds_prtcl device);
 enum srds_prtcl serdes_get_prtcl(int serdes, int cfg, int lane);
 int is_serdes_prtcl_valid(int serdes, u32 prtcl);
 
-#ifdef	CONFIG_LS1043A
+#if defined(CONFIG_LS1043A) || defined(CONFIG_LS1046A)
 const char *serdes_clock_to_string(u32 clock);
 int get_serdes_protocol(void);
 #endif
diff --git a/arch/arm/include/asm/arch-fsl-layerscape/immap_lsch2.h b/arch/arm/include/asm/arch-fsl-layerscape/immap_lsch2.h
index cbb252c..05f497c 100644
--- a/arch/arm/include/asm/arch-fsl-layerscape/immap_lsch2.h
+++ b/arch/arm/include/asm/arch-fsl-layerscape/immap_lsch2.h
@@ -228,6 +228,8 @@  struct ccsr_gur {
 #define FSL_CHASSIS2_RCWSR0_MEM_PLL_RAT_MASK	0x3f
 #define FSL_CHASSIS2_RCWSR4_SRDS1_PRTCL_MASK	0xffff0000
 #define FSL_CHASSIS2_RCWSR4_SRDS1_PRTCL_SHIFT	16
+#define FSL_CHASSIS2_RCWSR4_SRDS2_PRTCL_MASK	0x0000ffff
+#define FSL_CHASSIS2_RCWSR4_SRDS2_PRTCL_SHIFT	0
 #define RCW_SB_EN_REG_INDEX	7
 #define RCW_SB_EN_MASK		0x00200000
 
diff --git a/arch/arm/include/asm/arch-fsl-layerscape/soc.h b/arch/arm/include/asm/arch-fsl-layerscape/soc.h
index 39e8c7a..5ea6205 100644
--- a/arch/arm/include/asm/arch-fsl-layerscape/soc.h
+++ b/arch/arm/include/asm/arch-fsl-layerscape/soc.h
@@ -44,6 +44,7 @@  struct cpu_type {
 #define SVR_LS1012A		0x870400
 #define SVR_LS1043A		0x879200
 #define SVR_LS1023A		0x879208
+#define SVR_LS1046A		0x870704
 #define SVR_LS2045A		0x870120
 #define SVR_LS2080A		0x870110
 #define SVR_LS2085A		0x870100