2 * Copyright 2014-2015 Freescale Semiconductor, Inc.
4 * SPDX-License-Identifier: GPL-2.0+
8 #include <asm/arch/fsl_serdes.h>
10 struct serdes_config
{
12 u8 lanes
[SRDS_MAX_LANES
];
15 static struct serdes_config serdes1_cfg_tbl
[] = {
17 {0x03, {PCIE1
, PCIE1
, PCIE1
, PCIE1
, PCIE2
, PCIE2
, PCIE2
, PCIE2
} },
18 {0x05, {PCIE2
, PCIE2
, PCIE2
, PCIE2
, SGMII4
, SGMII3
, SGMII2
, SGMII1
} },
19 {0x07, {SGMII8
, SGMII7
, SGMII6
, SGMII5
, SGMII4
, SGMII3
, SGMII2
,
21 {0x09, {SGMII8
, SGMII7
, SGMII6
, SGMII5
, SGMII4
, SGMII3
, SGMII2
,
23 {0x0A, {SGMII8
, SGMII7
, SGMII6
, SGMII5
, SGMII4
, SGMII3
, SGMII2
,
25 {0x0C, {SGMII8
, SGMII7
, SGMII6
, SGMII5
, SGMII4
, SGMII3
, SGMII2
,
27 {0x0E, {SGMII8
, SGMII7
, SGMII6
, SGMII5
, SGMII4
, SGMII3
, SGMII2
,
29 {0x26, {SGMII8
, SGMII7
, SGMII6
, SGMII5
, SGMII4
, SGMII3
, XFI2
, XFI1
} },
30 {0x28, {SGMII8
, SGMII7
, SGMII6
, SGMII5
, XFI4
, XFI3
, XFI2
, XFI1
} },
31 {0x2A, {XFI8
, XFI7
, XFI6
, XFI5
, XFI4
, XFI3
, XFI2
, XFI1
} },
32 {0x2B, {SGMII8
, SGMII7
, SGMII6
, SGMII5
, XAUI1
, XAUI1
, XAUI1
, XAUI1
} },
33 {0x32, {XAUI2
, XAUI2
, XAUI2
, XAUI2
, XAUI1
, XAUI1
, XAUI1
, XAUI1
} },
34 {0x33, {PCIE2
, PCIE2
, PCIE2
, PCIE2
, QSGMII_C
, QSGMII_D
, QSGMII_A
,
36 {0x35, {QSGMII_C
, QSGMII_D
, QSGMII_A
, PCIE2
, XFI4
, XFI3
, XFI2
, XFI1
} },
39 static struct serdes_config serdes2_cfg_tbl
[] = {
41 {0x07, {SGMII9
, SGMII10
, SGMII11
, SGMII12
, SGMII13
, SGMII14
, SGMII15
,
43 {0x09, {SGMII9
, SGMII10
, SGMII11
, SGMII12
, SGMII13
, SGMII14
, SGMII15
,
45 {0x0A, {SGMII9
, SGMII10
, SGMII11
, SGMII12
, SGMII13
, SGMII14
, SGMII15
,
47 {0x0C, {SGMII9
, SGMII10
, SGMII11
, SGMII12
, SGMII13
, SGMII14
, SGMII15
,
49 {0x0E, {SGMII9
, SGMII10
, SGMII11
, SGMII12
, SGMII13
, SGMII14
, SGMII15
,
51 {0x3D, {PCIE3
, PCIE3
, PCIE3
, PCIE3
, PCIE3
, PCIE3
, PCIE3
, PCIE3
} },
52 {0x3E, {PCIE3
, PCIE3
, PCIE3
, PCIE3
, PCIE3
, PCIE3
, PCIE3
, PCIE3
} },
53 {0x3F, {PCIE3
, PCIE3
, PCIE3
, PCIE3
, PCIE4
, PCIE4
, PCIE4
, PCIE4
} },
54 {0x40, {PCIE3
, PCIE3
, PCIE3
, PCIE3
, PCIE4
, PCIE4
, PCIE4
, PCIE4
} },
55 {0x41, {PCIE3
, PCIE3
, PCIE3
, PCIE3
, PCIE4
, PCIE4
, SATA1
, SATA2
} },
56 {0x42, {PCIE3
, PCIE3
, PCIE3
, PCIE3
, PCIE4
, PCIE4
, SATA1
, SATA2
} },
57 {0x43, {PCIE3
, PCIE3
, PCIE3
, PCIE3
, NONE
, NONE
, SATA1
, SATA2
} },
58 {0x44, {PCIE3
, PCIE3
, PCIE3
, PCIE3
, NONE
, NONE
, SATA1
, SATA2
} },
59 {0x45, {PCIE3
, SGMII10
, SGMII11
, SGMII12
, PCIE4
, SGMII14
, SGMII15
,
61 {0x47, {SGMII9
, SGMII10
, SGMII11
, SGMII12
, PCIE4
, PCIE4
, PCIE4
,
63 {0x49, {SGMII9
, SGMII10
, SGMII11
, SGMII12
, PCIE4
, PCIE4
, SATA1
,
65 {0x4A, {SGMII9
, SGMII10
, SGMII11
, SGMII12
, PCIE4
, PCIE4
, SATA1
,
70 static struct serdes_config
*serdes_cfg_tbl
[] = {
75 enum srds_prtcl
serdes_get_prtcl(int serdes
, int cfg
, int lane
)
77 struct serdes_config
*ptr
;
79 if (serdes
>= ARRAY_SIZE(serdes_cfg_tbl
))
82 ptr
= serdes_cfg_tbl
[serdes
];
83 while (ptr
->protocol
) {
84 if (ptr
->protocol
== cfg
)
85 return ptr
->lanes
[lane
];
92 int is_serdes_prtcl_valid(int serdes
, u32 prtcl
)
95 struct serdes_config
*ptr
;
97 if (serdes
>= ARRAY_SIZE(serdes_cfg_tbl
))
100 ptr
= serdes_cfg_tbl
[serdes
];
101 while (ptr
->protocol
) {
102 if (ptr
->protocol
== prtcl
)
110 for (i
= 0; i
< SRDS_MAX_LANES
; i
++) {
111 if (ptr
->lanes
[i
] != NONE
)