2 * Copyright 2015 Freescale Semiconductor, Inc.
4 * SPDX-License-Identifier: GPL-2.0+
8 #include <asm/arch/fsl_serdes.h>
9 #include <asm/arch-fsl-lsch3/immap_lsch3.h>
11 struct serdes_config
{
13 u8 lanes
[SRDS_MAX_LANES
];
16 static struct serdes_config serdes1_cfg_tbl
[] = {
18 {0x03, {PCIE1
, PCIE1
, PCIE1
, PCIE1
, PCIE2
, PCIE2
, PCIE2
, PCIE2
} },
19 {0x05, {PCIE2
, PCIE2
, PCIE2
, PCIE2
, SGMII4
, SGMII3
, SGMII2
, SGMII1
} },
20 {0x07, {SGMII8
, SGMII7
, SGMII6
, SGMII5
, SGMII4
, SGMII3
, SGMII2
,
22 {0x09, {SGMII8
, SGMII7
, SGMII6
, SGMII5
, SGMII4
, SGMII3
, SGMII2
,
24 {0x0A, {SGMII8
, SGMII7
, SGMII6
, SGMII5
, SGMII4
, SGMII3
, SGMII2
,
26 {0x0C, {SGMII8
, SGMII7
, SGMII6
, SGMII5
, SGMII4
, SGMII3
, SGMII2
,
28 {0x0E, {SGMII8
, SGMII7
, SGMII6
, SGMII5
, SGMII4
, SGMII3
, SGMII2
,
30 {0x26, {SGMII8
, SGMII7
, SGMII6
, SGMII5
, SGMII4
, SGMII3
, XFI2
, XFI1
} },
31 {0x28, {SGMII8
, SGMII7
, SGMII6
, SGMII5
, XFI4
, XFI3
, XFI2
, XFI1
} },
32 {0x2A, {XFI8
, XFI7
, XFI6
, XFI5
, XFI4
, XFI3
, XFI2
, XFI1
} },
33 {0x2B, {SGMII8
, SGMII7
, SGMII6
, SGMII5
, XAUI1
, XAUI1
, XAUI1
, XAUI1
} },
34 {0x32, {XAUI2
, XAUI2
, XAUI2
, XAUI2
, XAUI1
, XAUI1
, XAUI1
, XAUI1
} },
35 {0x33, {PCIE2
, PCIE2
, PCIE2
, PCIE2
, QSGMII_C
, QSGMII_D
, QSGMII_A
,
37 {0x35, {QSGMII_C
, QSGMII_D
, QSGMII_A
, PCIE2
, XFI4
, XFI3
, XFI2
, XFI1
} },
40 static struct serdes_config serdes2_cfg_tbl
[] = {
42 {0x07, {SGMII9
, SGMII10
, SGMII11
, SGMII12
, SGMII13
, SGMII14
, SGMII15
,
44 {0x09, {SGMII9
, SGMII10
, SGMII11
, SGMII12
, SGMII13
, SGMII14
, SGMII15
,
46 {0x0A, {SGMII9
, SGMII10
, SGMII11
, SGMII12
, SGMII13
, SGMII14
, SGMII15
,
48 {0x0C, {SGMII9
, SGMII10
, SGMII11
, SGMII12
, SGMII13
, SGMII14
, SGMII15
,
50 {0x0E, {SGMII9
, SGMII10
, SGMII11
, SGMII12
, SGMII13
, SGMII14
, SGMII15
,
52 {0x3D, {PCIE3
, PCIE3
, PCIE3
, PCIE3
, PCIE3
, PCIE3
, PCIE3
, PCIE3
} },
53 {0x3E, {PCIE3
, PCIE3
, PCIE3
, PCIE3
, PCIE3
, PCIE3
, PCIE3
, PCIE3
} },
54 {0x3F, {PCIE3
, PCIE3
, PCIE3
, PCIE3
, PCIE4
, PCIE4
, PCIE4
, PCIE4
} },
55 {0x40, {PCIE3
, PCIE3
, PCIE3
, PCIE3
, PCIE4
, PCIE4
, PCIE4
, PCIE4
} },
56 {0x41, {PCIE3
, PCIE3
, PCIE3
, PCIE3
, PCIE4
, PCIE4
, SATA1
, SATA2
} },
57 {0x42, {PCIE3
, PCIE3
, PCIE3
, PCIE3
, PCIE4
, PCIE4
, SATA1
, SATA2
} },
58 {0x43, {PCIE3
, PCIE3
, PCIE3
, PCIE3
, NONE
, NONE
, SATA1
, SATA2
} },
59 {0x44, {PCIE3
, PCIE3
, PCIE3
, PCIE3
, NONE
, NONE
, SATA1
, SATA2
} },
60 {0x45, {PCIE3
, SGMII10
, SGMII11
, SGMII12
, PCIE4
, SGMII14
, SGMII15
,
62 {0x47, {SGMII9
, SGMII10
, SGMII11
, SGMII12
, PCIE4
, PCIE4
, PCIE4
,
64 {0x49, {SGMII9
, SGMII10
, SGMII11
, SGMII12
, PCIE4
, PCIE4
, SATA1
,
66 {0x4A, {SGMII9
, SGMII10
, SGMII11
, SGMII12
, PCIE4
, PCIE4
, SATA1
,
71 static struct serdes_config
*serdes_cfg_tbl
[] = {
76 enum srds_prtcl
serdes_get_prtcl(int serdes
, int cfg
, int lane
)
78 struct serdes_config
*ptr
;
80 if (serdes
>= ARRAY_SIZE(serdes_cfg_tbl
))
83 ptr
= serdes_cfg_tbl
[serdes
];
84 while (ptr
->protocol
) {
85 if (ptr
->protocol
== cfg
)
86 return ptr
->lanes
[lane
];
93 int is_serdes_prtcl_valid(int serdes
, u32 prtcl
)
96 struct serdes_config
*ptr
;
98 if (serdes
>= ARRAY_SIZE(serdes_cfg_tbl
))
101 ptr
= serdes_cfg_tbl
[serdes
];
102 while (ptr
->protocol
) {
103 if (ptr
->protocol
== prtcl
)
111 for (i
= 0; i
< SRDS_MAX_LANES
; i
++) {
112 if (ptr
->lanes
[i
] != NONE
)