1 // SPDX-License-Identifier: GPL-2.0
3 * Copyright (C) Marvell International Ltd. and its affiliates
9 #include <asm/arch/cpu.h>
10 #include <asm/arch/soc.h>
12 #include "high_speed_env_spec.h"
13 #include "sys_env_lib.h"
15 u8 selectors_serdes_rev1_map
[LAST_SERDES_TYPE
][MAX_SERDES_LANES
] = {
17 {0x1, 0x1, NA
, NA
, NA
, NA
}, /* PEX0 */
18 {NA
, 0x2, 0x1, NA
, 0x1, NA
}, /* PEX1 */
19 {NA
, NA
, 0x2, NA
, NA
, 0x1}, /* PEX2 */
20 {NA
, NA
, NA
, 0x1, NA
, NA
}, /* PEX3 */
21 {0x2, 0x3, NA
, NA
, NA
, NA
}, /* SATA0 */
22 {NA
, NA
, 0x3, NA
, 0x2, NA
}, /* SATA1 */
23 {NA
, NA
, NA
, NA
, 0x6, 0x2}, /* SATA2 */
24 {NA
, NA
, NA
, 0x3, NA
, NA
}, /* SATA3 */
25 {0x3, 0x4, NA
, NA
, NA
, NA
}, /* SGMII0 */
26 {NA
, 0x5, 0x4, NA
, 0x3, NA
}, /* SGMII1 */
27 {NA
, NA
, NA
, 0x4, NA
, 0x3}, /* SGMII2 */
28 {NA
, 0x7, NA
, NA
, NA
, NA
}, /* QSGMII */
29 {NA
, 0x6, NA
, NA
, 0x4, NA
}, /* USB3_HOST0 */
30 {NA
, NA
, NA
, 0x5, NA
, 0x4}, /* USB3_HOST1 */
31 {NA
, NA
, NA
, 0x6, 0x5, 0x5}, /* USB3_DEVICE */
32 {0x0, 0x0, 0x0, 0x0, 0x0, 0x0} /* DEFAULT_SERDES */
35 int hws_serdes_seq_init(void)
37 DEBUG_INIT_FULL_S("\n### serdes_seq_init ###\n");
39 if (hws_serdes_seq_db_init() != MV_OK
) {
40 printf("hws_serdes_seq_init: Error: Serdes initialization fail\n");
47 int serdes_power_up_ctrl_ext(u32 serdes_num
, int serdes_power_up
,
48 enum serdes_type serdes_type
,
49 enum serdes_speed baud_rate
,
50 enum serdes_mode serdes_mode
,
51 enum ref_clock ref_clock
)
53 return MV_NOT_SUPPORTED
;
56 u32
hws_serdes_silicon_ref_clock_get(void)
58 DEBUG_INIT_FULL_S("\n### hws_serdes_silicon_ref_clock_get ###\n");
60 return REF_CLOCK_25MHZ
;
63 u32
hws_serdes_get_max_lane(void)
65 switch (sys_env_device_id_get()) {
66 case MV_6811
: /* A381/A3282: 6811/6821: single/dual cpu */
73 default: /* not the right module */
74 printf("%s: Device ID Error, using 4 SerDes lanes\n",
81 int hws_is_serdes_active(u8 lane_num
)
85 /* Maximum lane count for A388 (6828) is 6 */
89 /* 4th Lane (#4 on Device 6810 is not Active */
90 if (sys_env_device_id_get() == MV_6810
&& lane_num
== 4) {
91 printf("%s: Error: Lane#4 on Device 6810 is not Active.\n",
97 * 6th Lane (#5) on Device 6810 is Active, even though 6810
100 if (sys_env_device_id_get() == MV_6810
&& lane_num
== 5)
103 if (lane_num
>= hws_serdes_get_max_lane())
109 int hws_get_ext_base_addr(u32 serdes_num
, u32 base_addr
, u32 unit_base_offset
,
110 u32
*unit_base_reg
, u32
*unit_offset
)
112 *unit_base_reg
= base_addr
;
113 *unit_offset
= unit_base_offset
;
119 * hws_serdes_get_phy_selector_val
121 * DESCRIPTION: Get the mapping of Serdes Selector values according to the
122 * Serdes revision number
123 * INPUT: serdes_num - Serdes number
124 * serdes_type - Serdes type
127 * Mapping of Serdes Selector values
129 u32
hws_serdes_get_phy_selector_val(int serdes_num
,
130 enum serdes_type serdes_type
)
132 if (serdes_type
>= LAST_SERDES_TYPE
)
135 if (hws_ctrl_serdes_rev_get() == MV_SERDES_REV_1_2
) {
136 return selectors_serdes_rev1_map
137 [serdes_type
][serdes_num
];
139 return selectors_serdes_rev2_map
140 [serdes_type
][serdes_num
];
143 u32
hws_get_physical_serdes_num(u32 serdes_num
)
145 if ((serdes_num
== 4) && (sys_env_device_id_get() == MV_6810
)) {
147 * For 6810, there are 5 Serdes and Serdes Num 4 doesn't
148 * exist. Instead Serdes Num 5 is connected.