xref: /rk3399_rockchip-uboot/arch/powerpc/cpu/mpc85xx/p5040_serdes.c (revision 57dc53a72460e8e301fa1cc7951b41db8e731485)
14905443fSTimur Tabi /*
24905443fSTimur Tabi  * Copyright 2009-2011 Freescale Semiconductor, Inc.
34905443fSTimur Tabi  *
41a459660SWolfgang Denk  * SPDX-License-Identifier:	GPL-2.0+
54905443fSTimur Tabi  */
64905443fSTimur Tabi 
74905443fSTimur Tabi #include <common.h>
84905443fSTimur Tabi #include <asm/fsl_serdes.h>
94905443fSTimur Tabi #include <asm/processor.h>
104905443fSTimur Tabi #include <asm/io.h>
114905443fSTimur Tabi #include "fsl_corenet_serdes.h"
124905443fSTimur Tabi 
134905443fSTimur Tabi /*
144905443fSTimur Tabi  * Note: For P5040, the fourth SerDes bank (with two lanes) is on SerDes2, but
15*a187559eSBin Meng  * U-Boot only supports one SerDes controller.  Therefore, we ignore bank 4 in
164905443fSTimur Tabi  * this table.  This works because most of the SerDes code is for errata
174905443fSTimur Tabi  * work-arounds, and there are no P5040 errata that effect bank 4.
184905443fSTimur Tabi  */
194905443fSTimur Tabi 
204905443fSTimur Tabi static u8 serdes_cfg_tbl[][SRDS_MAX_LANES] = {
214905443fSTimur Tabi 	[0x00] = {PCIE1, PCIE1, PCIE1, PCIE1, PCIE2, PCIE2, PCIE2, PCIE2,
224905443fSTimur Tabi 		SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4, SGMII_FM1_DTSEC1,
234905443fSTimur Tabi 		SGMII_FM1_DTSEC2, SGMII_FM1_DTSEC3, SGMII_FM1_DTSEC4,
244905443fSTimur Tabi 		XAUI_FM2, XAUI_FM2, XAUI_FM2, XAUI_FM2, /* SATA1, SATA2, */ },
254905443fSTimur Tabi 	[0x01] = {PCIE1, PCIE1, PCIE1, PCIE1, PCIE2, PCIE2, PCIE2, PCIE2,
264905443fSTimur Tabi 		SGMII_FM1_DTSEC3, SGMII_FM2_DTSEC4, XAUI_FM1, XAUI_FM1,
274905443fSTimur Tabi 		XAUI_FM1, XAUI_FM1, XAUI_FM2, XAUI_FM2, XAUI_FM2,
284905443fSTimur Tabi 		XAUI_FM2, /* SATA1, SATA2 */ },
294905443fSTimur Tabi 	[0x02] = {PCIE1, PCIE1, PCIE1, PCIE1, PCIE2, PCIE2, SGMII_FM1_DTSEC3,
304905443fSTimur Tabi 		SGMII_FM1_DTSEC4, SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4,
314905443fSTimur Tabi 		XAUI_FM1, XAUI_FM1, XAUI_FM1, XAUI_FM1, XAUI_FM2, XAUI_FM2,
324905443fSTimur Tabi 		XAUI_FM2, XAUI_FM2, /* SATA1, SATA2 */ },
334905443fSTimur Tabi 	[0x03] = {PCIE1, PCIE1, PCIE1, PCIE1, PCIE2, PCIE2, SGMII_FM2_DTSEC1,
344905443fSTimur Tabi 		SGMII_FM2_DTSEC2, SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4,
354905443fSTimur Tabi 		SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2, SGMII_FM1_DTSEC3,
364905443fSTimur Tabi 		SGMII_FM1_DTSEC4, XAUI_FM2, XAUI_FM2, XAUI_FM2, XAUI_FM2,
374905443fSTimur Tabi 		/* SATA1, SATA2 */ },
384905443fSTimur Tabi 	[0x04] = {PCIE1, PCIE1, PCIE1, PCIE1, PCIE2, PCIE3, SGMII_FM2_DTSEC1,
394905443fSTimur Tabi 		SGMII_FM2_DTSEC2, SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4,
404905443fSTimur Tabi 		SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2, SGMII_FM1_DTSEC3,
414905443fSTimur Tabi 		SGMII_FM1_DTSEC4, XAUI_FM2, XAUI_FM2, XAUI_FM2, XAUI_FM2,
424905443fSTimur Tabi 		/* SATA1, SATA2 */ },
434905443fSTimur Tabi 	[0x05] = {PCIE1, PCIE1, PCIE1, PCIE1, PCIE2, PCIE3, SGMII_FM1_DTSEC3,
444905443fSTimur Tabi 		SGMII_FM1_DTSEC4, SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4,
454905443fSTimur Tabi 		XAUI_FM1, XAUI_FM1, XAUI_FM1, XAUI_FM1, XAUI_FM2, XAUI_FM2,
464905443fSTimur Tabi 		XAUI_FM2, XAUI_FM2, /* SATA1, SATA2 */ },
474905443fSTimur Tabi 	[0x06] = {PCIE1, PCIE1, PCIE1, PCIE1, PCIE1, PCIE1, PCIE1, PCIE1,
484905443fSTimur Tabi 		SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4, SGMII_FM1_DTSEC1,
494905443fSTimur Tabi 		SGMII_FM1_DTSEC2, SGMII_FM1_DTSEC3, SGMII_FM1_DTSEC4,
504905443fSTimur Tabi 		XAUI_FM2, XAUI_FM2, XAUI_FM2, XAUI_FM2, /* SATA1, SATA2 */ },
514905443fSTimur Tabi 	[0x07] = {PCIE1, PCIE1, PCIE1, PCIE1, PCIE1, PCIE1, PCIE1, PCIE1,
524905443fSTimur Tabi 		SGMII_FM1_DTSEC3, SGMII_FM2_DTSEC4, XAUI_FM1, XAUI_FM1,
534905443fSTimur Tabi 		XAUI_FM1, XAUI_FM1, XAUI_FM2, XAUI_FM2, XAUI_FM2,
544905443fSTimur Tabi 		XAUI_FM2, /* SATA1, SATA2 */ },
554905443fSTimur Tabi 	[0x11] = {PCIE1, PCIE1, PCIE1, PCIE1, PCIE2, PCIE2, PCIE2, PCIE2,
564905443fSTimur Tabi 		AURORA, AURORA, SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2,
574905443fSTimur Tabi 		SGMII_FM1_DTSEC3, SGMII_FM1_DTSEC4, NONE, NONE, SATA1, SATA2,
584905443fSTimur Tabi 		/* NONE, NONE */ },
594905443fSTimur Tabi 	[0x15] = {PCIE1, PCIE1, PCIE1, PCIE1, PCIE2, PCIE2, PCIE2, PCIE2,
604905443fSTimur Tabi 		AURORA, AURORA, XAUI_FM1, XAUI_FM1, XAUI_FM1, XAUI_FM1,
614905443fSTimur Tabi 		NONE, NONE, SATA1, SATA2, /* NONE, NONE */ },
624905443fSTimur Tabi 	[0x2a] = {PCIE1, PCIE1, PCIE3, PCIE3, PCIE2, PCIE2, PCIE2, PCIE2,
634905443fSTimur Tabi 		AURORA, AURORA, SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2,
644905443fSTimur Tabi 		SGMII_FM1_DTSEC3, SGMII_FM1_DTSEC4, XAUI_FM2, XAUI_FM2,
654905443fSTimur Tabi 		XAUI_FM2, XAUI_FM2, /* NONE, NONE */ },
664905443fSTimur Tabi 	[0x34] = {PCIE1, PCIE1, PCIE1, PCIE1, SGMII_FM1_DTSEC1,
674905443fSTimur Tabi 		SGMII_FM1_DTSEC2, SGMII_FM1_DTSEC3, SGMII_FM1_DTSEC4, AURORA,
684905443fSTimur Tabi 		AURORA, XAUI_FM1, XAUI_FM1, XAUI_FM1, XAUI_FM1, NONE,
694905443fSTimur Tabi 		NONE, SATA1, SATA2, /* NONE, NONE */ },
704905443fSTimur Tabi 	[0x35] = {PCIE1, PCIE1, PCIE1, PCIE1, PCIE2, PCIE2,
714905443fSTimur Tabi 		SGMII_FM1_DTSEC3, SGMII_FM1_DTSEC4, AURORA, AURORA, XAUI_FM1,
724905443fSTimur Tabi 		XAUI_FM1, XAUI_FM1, XAUI_FM1, NONE, NONE, SATA1, SATA2,
734905443fSTimur Tabi 		/* NONE, NONE */ },
744905443fSTimur Tabi 	[0x36] = {PCIE1, PCIE1, PCIE3, PCIE3, SGMII_FM1_DTSEC1,
754905443fSTimur Tabi 		SGMII_FM1_DTSEC2, SGMII_FM1_DTSEC3, SGMII_FM1_DTSEC4, AURORA,
764905443fSTimur Tabi 		AURORA, XAUI_FM1, XAUI_FM1, XAUI_FM1, XAUI_FM1, NONE,
774905443fSTimur Tabi 		NONE, SATA1, SATA2, /* NONE, NONE */ },
784905443fSTimur Tabi };
794905443fSTimur Tabi 
serdes_get_prtcl(int cfg,int lane)804905443fSTimur Tabi enum srds_prtcl serdes_get_prtcl(int cfg, int lane)
814905443fSTimur Tabi {
824905443fSTimur Tabi 	if (!serdes_lane_enabled(lane))
834905443fSTimur Tabi 		return NONE;
844905443fSTimur Tabi 
854905443fSTimur Tabi 	return serdes_cfg_tbl[cfg][lane];
864905443fSTimur Tabi }
874905443fSTimur Tabi 
is_serdes_prtcl_valid(u32 prtcl)884905443fSTimur Tabi int is_serdes_prtcl_valid(u32 prtcl)
894905443fSTimur Tabi {
904905443fSTimur Tabi 	int i;
914905443fSTimur Tabi 
92e51e47d3SAxel Lin 	if (prtcl >= ARRAY_SIZE(serdes_cfg_tbl))
934905443fSTimur Tabi 		return 0;
944905443fSTimur Tabi 
954905443fSTimur Tabi 	for (i = 0; i < SRDS_MAX_LANES; i++) {
964905443fSTimur Tabi 		if (serdes_cfg_tbl[prtcl][i] != NONE)
974905443fSTimur Tabi 			return 1;
984905443fSTimur Tabi 	}
994905443fSTimur Tabi 
1004905443fSTimur Tabi 	return 0;
1014905443fSTimur Tabi }
102