xref: /rk3399_rockchip-uboot/arch/arm/cpu/armv8/fsl-layerscape/ls1043a_serdes.c (revision 5f5620ab2679608f94b3a77e51c77d0a770103bd)
1*f3a8e2b7SMingkai Hu /*
2*f3a8e2b7SMingkai Hu  * Copyright 2015 Freescale Semiconductor, Inc.
3*f3a8e2b7SMingkai Hu  *
4*f3a8e2b7SMingkai Hu  * SPDX-License-Identifier:	GPL-2.0+
5*f3a8e2b7SMingkai Hu  */
6*f3a8e2b7SMingkai Hu 
7*f3a8e2b7SMingkai Hu #include <common.h>
8*f3a8e2b7SMingkai Hu #include <asm/arch/fsl_serdes.h>
9*f3a8e2b7SMingkai Hu #include <asm/arch/immap_lsch2.h>
10*f3a8e2b7SMingkai Hu 
11*f3a8e2b7SMingkai Hu struct serdes_config {
12*f3a8e2b7SMingkai Hu 	u32 protocol;
13*f3a8e2b7SMingkai Hu 	u8 lanes[SRDS_MAX_LANES];
14*f3a8e2b7SMingkai Hu };
15*f3a8e2b7SMingkai Hu 
16*f3a8e2b7SMingkai Hu static struct serdes_config serdes1_cfg_tbl[] = {
17*f3a8e2b7SMingkai Hu 	/* SerDes 1 */
18*f3a8e2b7SMingkai Hu 	{0x1555, {XFI_FM1_MAC9, PCIE1, PCIE2, PCIE3} },
19*f3a8e2b7SMingkai Hu 	{0x2555, {SGMII_2500_FM1_DTSEC9, PCIE1, PCIE2, PCIE3} },
20*f3a8e2b7SMingkai Hu 	{0x4555, {QSGMII_FM1_A, PCIE1, PCIE2, PCIE3} },
21*f3a8e2b7SMingkai Hu 	{0x4558, {QSGMII_FM1_A, PCIE1, PCIE2, SATA1} },
22*f3a8e2b7SMingkai Hu 	{0x1355, {XFI_FM1_MAC9, SGMII_FM1_DTSEC2, PCIE2, PCIE3} },
23*f3a8e2b7SMingkai Hu 	{0x2355, {SGMII_2500_FM1_DTSEC9, SGMII_FM1_DTSEC2, PCIE2, PCIE3} },
24*f3a8e2b7SMingkai Hu 	{0x3335, {SGMII_FM1_DTSEC9, SGMII_FM1_DTSEC2, SGMII_FM1_DTSEC5,
25*f3a8e2b7SMingkai Hu 		  PCIE3} },
26*f3a8e2b7SMingkai Hu 	{0x3355, {SGMII_FM1_DTSEC9, SGMII_FM1_DTSEC2, PCIE2, PCIE3} },
27*f3a8e2b7SMingkai Hu 	{0x3358, {SGMII_FM1_DTSEC9, SGMII_FM1_DTSEC2, PCIE2, SATA1} },
28*f3a8e2b7SMingkai Hu 	{0x3555, {SGMII_FM1_DTSEC9, PCIE1, PCIE2, PCIE3} },
29*f3a8e2b7SMingkai Hu 	{0x3558, {SGMII_FM1_DTSEC9, PCIE1, PCIE2, SATA1} },
30*f3a8e2b7SMingkai Hu 	{0x7000, {PCIE1, PCIE1, PCIE1, PCIE1} },
31*f3a8e2b7SMingkai Hu 	{0x9998, {PCIE1, PCIE2, PCIE3, SATA1} },
32*f3a8e2b7SMingkai Hu 	{0x6058, {PCIE1, PCIE1, PCIE2, SATA1} },
33*f3a8e2b7SMingkai Hu 	{0x1455, {XFI_FM1_MAC9, QSGMII_FM1_A, PCIE2, PCIE3} },
34*f3a8e2b7SMingkai Hu 	{0x2455, {SGMII_2500_FM1_DTSEC9, QSGMII_FM1_A, PCIE2, PCIE3} },
35*f3a8e2b7SMingkai Hu 	{0x2255, {SGMII_2500_FM1_DTSEC9, SGMII_2500_FM1_DTSEC2, PCIE2, PCIE3} },
36*f3a8e2b7SMingkai Hu 	{0x3333, {SGMII_FM1_DTSEC9, SGMII_FM1_DTSEC2, SGMII_FM1_DTSEC5,
37*f3a8e2b7SMingkai Hu 		  SGMII_FM1_DTSEC6} },
38*f3a8e2b7SMingkai Hu 	{}
39*f3a8e2b7SMingkai Hu };
40*f3a8e2b7SMingkai Hu 
41*f3a8e2b7SMingkai Hu static struct serdes_config *serdes_cfg_tbl[] = {
42*f3a8e2b7SMingkai Hu 	serdes1_cfg_tbl,
43*f3a8e2b7SMingkai Hu };
44*f3a8e2b7SMingkai Hu 
serdes_get_prtcl(int serdes,int cfg,int lane)45*f3a8e2b7SMingkai Hu enum srds_prtcl serdes_get_prtcl(int serdes, int cfg, int lane)
46*f3a8e2b7SMingkai Hu {
47*f3a8e2b7SMingkai Hu 	struct serdes_config *ptr;
48*f3a8e2b7SMingkai Hu 
49*f3a8e2b7SMingkai Hu 	if (serdes >= ARRAY_SIZE(serdes_cfg_tbl))
50*f3a8e2b7SMingkai Hu 		return 0;
51*f3a8e2b7SMingkai Hu 
52*f3a8e2b7SMingkai Hu 	ptr = serdes_cfg_tbl[serdes];
53*f3a8e2b7SMingkai Hu 	while (ptr->protocol) {
54*f3a8e2b7SMingkai Hu 		if (ptr->protocol == cfg)
55*f3a8e2b7SMingkai Hu 			return ptr->lanes[lane];
56*f3a8e2b7SMingkai Hu 		ptr++;
57*f3a8e2b7SMingkai Hu 	}
58*f3a8e2b7SMingkai Hu 
59*f3a8e2b7SMingkai Hu 	return 0;
60*f3a8e2b7SMingkai Hu }
61*f3a8e2b7SMingkai Hu 
is_serdes_prtcl_valid(int serdes,u32 prtcl)62*f3a8e2b7SMingkai Hu int is_serdes_prtcl_valid(int serdes, u32 prtcl)
63*f3a8e2b7SMingkai Hu {
64*f3a8e2b7SMingkai Hu 	int i;
65*f3a8e2b7SMingkai Hu 	struct serdes_config *ptr;
66*f3a8e2b7SMingkai Hu 
67*f3a8e2b7SMingkai Hu 	if (serdes >= ARRAY_SIZE(serdes_cfg_tbl))
68*f3a8e2b7SMingkai Hu 		return 0;
69*f3a8e2b7SMingkai Hu 
70*f3a8e2b7SMingkai Hu 	ptr = serdes_cfg_tbl[serdes];
71*f3a8e2b7SMingkai Hu 	while (ptr->protocol) {
72*f3a8e2b7SMingkai Hu 		if (ptr->protocol == prtcl)
73*f3a8e2b7SMingkai Hu 			break;
74*f3a8e2b7SMingkai Hu 		ptr++;
75*f3a8e2b7SMingkai Hu 	}
76*f3a8e2b7SMingkai Hu 
77*f3a8e2b7SMingkai Hu 	if (!ptr->protocol)
78*f3a8e2b7SMingkai Hu 		return 0;
79*f3a8e2b7SMingkai Hu 
80*f3a8e2b7SMingkai Hu 	for (i = 0; i < SRDS_MAX_LANES; i++) {
81*f3a8e2b7SMingkai Hu 		if (ptr->lanes[i] != NONE)
82*f3a8e2b7SMingkai Hu 			return 1;
83*f3a8e2b7SMingkai Hu 	}
84*f3a8e2b7SMingkai Hu 
85*f3a8e2b7SMingkai Hu 	return 0;
86*f3a8e2b7SMingkai Hu }
87