2 * Copyright (C) Marvell International Ltd. and its affiliates
4 * SPDX-License-Identifier: GPL-2.0
11 #include <asm/arch/cpu.h>
12 #include <asm/arch/soc.h>
14 #include "high_speed_env_spec.h"
15 #include "high_speed_topology_spec.h"
16 #include "sys_env_lib.h"
19 #if defined(CONFIG_ARMADA_38X)
20 #elif defined(CONFIG_ARMADA_39X)
22 #error "No device is defined"
26 * The board topology map, initialized in the beginning of
27 * ctrl_high_speed_serdes_phy_config
29 struct serdes_map serdes_configuration_map[MAX_SERDES_LANES];
32 * serdes_seq_db - holds all serdes sequences, their size and the
33 * relevant index in the data array initialized in serdes_seq_init
35 struct cfg_seq serdes_seq_db[SERDES_LAST_SEQ];
37 #define SERDES_VERION "2.0"
38 #define ENDED_OK "High speed PHY - Ended Successfully\n"
40 #define LINK_WAIT_CNTR 100
41 #define LINK_WAIT_SLEEP 100
43 #define MAX_UNIT_NUMB 4
44 #define TOPOLOGY_TEST_OK 0
45 #define WRONG_NUMBER_OF_UNITS 1
46 #define SERDES_ALREADY_IN_USE 2
47 #define UNIT_NUMBER_VIOLATION 3
50 * serdes_lane_in_use_count contains the exact amount of serdes lanes
53 u8 serdes_lane_in_use_count[MAX_UNITS_ID][MAX_UNIT_NUMB] = {
55 { 1, 1, 1, 1 }, /* PEX */
56 { 1, 1, 1, 1 }, /* ETH_GIG */
57 { 1, 1, 0, 0 }, /* USB3H */
58 { 1, 1, 1, 0 }, /* USB3D */
59 { 1, 1, 1, 1 }, /* SATA */
60 { 1, 0, 0, 0 }, /* QSGMII */
61 { 4, 0, 0, 0 }, /* XAUI */
62 { 2, 0, 0, 0 } /* RXAUI */
66 * serdes_unit_count count unit number.
67 * (i.e a single XAUI is counted as 1 unit)
69 u8 serdes_unit_count[MAX_UNITS_ID] = { 0 };
71 /* Selector mapping for A380-A0 and A390-Z1 */
72 u8 selectors_serdes_rev2_map[LAST_SERDES_TYPE][MAX_SERDES_LANES] = {
74 { 0x1, 0x1, NA, NA, NA, NA, NA }, /* PEX0 */
75 { NA, NA, 0x1, NA, 0x1, NA, 0x1 }, /* PEX1 */
76 { NA, NA, NA, NA, 0x7, 0x1, NA }, /* PEX2 */
77 { NA, NA, NA, 0x1, NA, NA, NA }, /* PEX3 */
78 { 0x2, 0x3, NA, NA, NA, NA, NA }, /* SATA0 */
79 { NA, NA, 0x3, NA, NA, NA, NA }, /* SATA1 */
80 { NA, NA, NA, NA, 0x6, 0x2, NA }, /* SATA2 */
81 { NA, NA, NA, 0x3, NA, NA, NA }, /* SATA3 */
82 { 0x3, 0x4, NA, NA, NA, NA, NA }, /* SGMII0 */
83 { NA, 0x5, 0x4, NA, 0x3, NA, NA }, /* SGMII1 */
84 { NA, NA, NA, 0x4, NA, 0x3, NA }, /* SGMII2 */
85 { NA, 0x7, NA, NA, NA, NA, NA }, /* QSGMII */
86 { NA, 0x6, NA, NA, 0x4, NA, NA }, /* USB3_HOST0 */
87 { NA, NA, NA, 0x5, NA, 0x4, NA }, /* USB3_HOST1 */
88 { NA, NA, NA, 0x6, 0x5, 0x5, NA }, /* USB3_DEVICE */
89 #ifdef CONFIG_ARMADA_39X
90 { NA, NA, 0x5, NA, 0x8, NA, 0x2 }, /* SGMII3 */
91 { NA, NA, NA, 0x8, 0x9, 0x8, 0x4 }, /* XAUI */
92 { NA, NA, NA, NA, NA, 0x8, 0x4 }, /* RXAUI */
94 { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, NA } /* DEFAULT_SERDES */
97 /* Selector mapping for PEX by 4 confiuration */
98 u8 common_phys_selectors_pex_by4_lanes[] = { 0x1, 0x2, 0x2, 0x2 };
100 static const char *const serdes_type_to_string[] = {
123 struct serdes_unit_data {
128 static struct serdes_unit_data serdes_type_to_unit_info[] = {
137 {ETH_GIG_UNIT_ID, 0,},
138 {ETH_GIG_UNIT_ID, 1,},
139 {ETH_GIG_UNIT_ID, 2,},
140 {QSGMII_UNIT_ID, 0,},
144 {ETH_GIG_UNIT_ID, 3,},
155 struct op_params sata_port0_power_up_params[] = {
157 * unit_base_reg, unit_offset, mask, SATA data, wait_time,
160 /* Access to reg 0x48(OOB param 1) */
161 {SATA_VENDOR_PORT_0_REG_ADDR, 0x38000, 0xffffffff, {0x48,}, 0, 0},
162 /* OOB Com_wake and Com_reset spacing upper limit data */
163 {SATA_VENDOR_PORT_0_REG_DATA, 0x38000, 0xf03f, {0x6018,}, 0, 0},
164 /* Access to reg 0xa(PHY Control) */
165 {SATA_VENDOR_PORT_0_REG_ADDR, 0x38000, 0xffffffff, {0xa,}, 0, 0},
166 /* Rx clk and Tx clk select non-inverted mode */
167 {SATA_VENDOR_PORT_0_REG_DATA, 0x38000, 0x3000, {0x0,}, 0, 0},
168 /* Power Down Sata addr */
169 {SATA_CTRL_REG_IND_ADDR, 0x38000, 0xffffffff, {0x0,}, 0, 0},
170 /* Power Down Sata Port 0 */
171 {SATA_CTRL_REG_IND_DATA, 0x38000, 0xffff00ff, {0xc40040,}, 0, 0},
174 struct op_params sata_port1_power_up_params[] = {
176 * unit_base_reg, unit_offset, mask, SATA data, wait_time,
179 /* Access to reg 0x48(OOB param 1) */
180 {SATA_VENDOR_PORT_1_REG_ADDR, 0x38000, 0xffffffff, {0x48,}, 0, 0},
181 /* OOB Com_wake and Com_reset spacing upper limit data */
182 {SATA_VENDOR_PORT_1_REG_DATA, 0x38000, 0xf03f, {0x6018,}, 0, 0},
183 /* Access to reg 0xa(PHY Control) */
184 {SATA_VENDOR_PORT_1_REG_ADDR, 0x38000, 0xffffffff, {0xa,}, 0, 0},
185 /* Rx clk and Tx clk select non-inverted mode */
186 {SATA_VENDOR_PORT_1_REG_DATA, 0x38000, 0x3000, {0x0,}, 0, 0},
187 /* Power Down Sata addr */
188 {SATA_CTRL_REG_IND_ADDR, 0x38000, 0xffffffff, {0x0,}, 0, 0},
189 /* Power Down Sata Port 1 */
190 {SATA_CTRL_REG_IND_DATA, 0x38000, 0xffffff00, {0xc44000,}, 0, 0},
193 /* SATA and SGMII - power up seq */
194 struct op_params sata_and_sgmii_power_up_params[] = {
196 * unit_base_reg, unit_offset, mask, SATA data, SGMII data,
197 * wait_time, num_of_loops
200 {COMMON_PHY_CONFIGURATION1_REG, 0x28, 0x90006, {0x80002, 0x80002},
203 {COMMON_PHY_CONFIGURATION1_REG, 0x28, 0x7800, {0x6000, 0x6000}, 0, 0},
205 {POWER_AND_PLL_CTRL_REG, 0x800, 0x0e0, {0x0, 0x80}, 0, 0},
206 /* Ref clock source select */
207 {MISC_REG, 0x800, 0x440, {0x440, 0x400}, 0, 0}
210 /* SATA and SGMII - speed config seq */
211 struct op_params sata_and_sgmii_speed_config_params[] = {
213 * unit_base_reg, unit_offset, mask, SATA data,
214 * SGMII (1.25G), SGMII (3.125G), wait_time, num_of_loops
217 {COMMON_PHY_CONFIGURATION1_REG, 0x28, 0x3fc00000,
218 {0x8800000, 0x19800000, 0x22000000}, 0, 0},
219 /* Select Baud Rate for SATA only */
220 {INTERFACE_REG, 0x800, 0xc00, {0x800, NO_DATA, NO_DATA}, 0, 0},
221 /* Phy Gen RX and TX */
222 {ISOLATE_REG, 0x800, 0xff, {NO_DATA, 0x66, 0x66}, 0, 0},
224 {LOOPBACK_REG, 0x800, 0xe, {0x4, 0x2, 0x2}, 0, 0}
227 /* SATA and SGMII - TX config seq */
228 struct op_params sata_and_sgmii_tx_config_params1[] = {
230 * unitunit_base_reg, unit_offset, mask, SATA data, SGMII data,
231 * wait_time, num_of_loops
233 {GLUE_REG, 0x800, 0x1800, {NO_DATA, 0x800}, 0, 0},
234 /* Sft Reset pulse */
235 {RESET_DFE_REG, 0x800, 0x401, {0x401, 0x401}, 0, 0},
236 /* Sft Reset pulse */
237 {RESET_DFE_REG, 0x800, 0x401, {0x0, 0x0}, 0, 0},
238 /* Power up PLL, RX and TX */
239 {COMMON_PHY_CONFIGURATION1_REG, 0x28, 0xf0000, {0x70000, 0x70000},
243 struct op_params sata_port0_tx_config_params[] = {
245 * unit_base_reg, unit_offset, mask, SATA data, wait_time,
248 /* Power Down Sata addr */
249 {SATA_CTRL_REG_IND_ADDR, 0x38000, 0xffffffff, {0x0}, 0, 0},
250 /* Power Down Sata Port 0 */
251 {SATA_CTRL_REG_IND_DATA, 0x38000, 0xffff00ff, {0xc40000}, 0, 0},
252 /* Regret bit addr */
253 {SATA_CTRL_REG_IND_ADDR, 0x38000, 0xffffffff, {0x4}, 0, 0},
254 /* Regret bit data */
255 {SATA_CTRL_REG_IND_DATA, 0x38000, 0xffffffff, {0x80}, 0, 0}
258 struct op_params sata_port1_tx_config_params[] = {
260 * unit_base_reg, unit_offset, mask, SATA data, wait_time,
263 /* Power Down Sata addr */
264 {SATA_CTRL_REG_IND_ADDR, 0x38000, 0xffffffff, {0x0}, 0, 0},
265 /* Power Down Sata Port 1 */
266 {SATA_CTRL_REG_IND_DATA, 0x38000, 0xffffff00, {0xc40000}, 0, 0},
267 /* Regret bit addr */
268 {SATA_CTRL_REG_IND_ADDR, 0x38000, 0xffffffff, {0x4}, 0, 0},
269 /* Regret bit data */
270 {SATA_CTRL_REG_IND_DATA, 0x38000, 0xffffffff, {0x80}, 0, 0}
273 struct op_params sata_and_sgmii_tx_config_serdes_rev1_params2[] = {
275 * unit_base_reg, unit_offset, mask, SATA data, SGMII data,
276 * wait_time, num_of_loops
278 /* Wait for PHY power up sequence to finish */
279 {COMMON_PHY_STATUS1_REG, 0x28, 0xc, {0xc, 0xc}, 10, 1000},
280 /* Wait for PHY power up sequence to finish */
281 {COMMON_PHY_STATUS1_REG, 0x28, 0x1, {0x1, 0x1}, 1, 1000}
284 struct op_params sata_and_sgmii_tx_config_serdes_rev2_params2[] = {
286 * unit_base_reg, unit_offset, mask, SATA data, SGMII data,
287 * wait_time, num_of_loops
289 /* Wait for PHY power up sequence to finish */
290 {COMMON_PHY_STATUS1_REG, 0x28, 0xc, {0xc, 0xc}, 10, 1000},
291 /* Assert Rx Init for SGMII */
292 {COMMON_PHY_CONFIGURATION1_REG, 0x28, 0x40000000, {NA, 0x40000000},
294 /* Assert Rx Init for SATA */
295 {ISOLATE_REG, 0x800, 0x400, {0x400, NA}, 0, 0},
296 /* Wait for PHY power up sequence to finish */
297 {COMMON_PHY_STATUS1_REG, 0x28, 0x1, {0x1, 0x1}, 1, 1000},
298 /* De-assert Rx Init for SGMII */
299 {COMMON_PHY_CONFIGURATION1_REG, 0x28, 0x40000000, {NA, 0x0}, 0, 0},
300 /* De-assert Rx Init for SATA */
301 {ISOLATE_REG, 0x800, 0x400, {0x0, NA}, 0, 0},
302 /* os_ph_offset_force (align 90) */
303 {RX_REG3, 0x800, 0xff, {0xde, NO_DATA}, 0, 0},
304 /* Set os_ph_valid */
305 {RX_REG3, 0x800, 0x100, {0x100, NO_DATA}, 0, 0},
306 /* Unset os_ph_valid */
307 {RX_REG3, 0x800, 0x100, {0x0, NO_DATA}, 0, 0},
310 struct op_params sata_electrical_config_serdes_rev1_params[] = {
312 * unit_base_reg, unit_offset, mask, SATA data, wait_time,
315 /* enable SSC and DFE update enable */
316 {COMMON_PHY_CONFIGURATION4_REG, 0x28, 0x400008, {0x400000,}, 0, 0},
317 /* tximpcal_th and rximpcal_th */
318 {VTHIMPCAL_CTRL_REG, 0x800, 0xff00, {0x4000,}, 0, 0},
319 /* SQ_THRESH and FFE Setting */
320 {SQUELCH_FFE_SETTING_REG, 0x800, 0xfff, {0x6cf,}, 0, 0},
321 /* G1_TX SLEW, EMPH1 and AMP */
322 {G1_SETTINGS_0_REG, 0x800, 0xffff, {0x8a32,}, 0, 0},
323 /* G1_RX SELMUFF, SELMUFI, SELMUPF and SELMUPI */
324 {G1_SETTINGS_1_REG, 0x800, 0x3ff, {0x3c9,}, 0, 0},
325 /* G2_TX SLEW, EMPH1 and AMP */
326 {G2_SETTINGS_0_REG, 0x800, 0xffff, {0x8b5c,}, 0, 0},
327 /* G2_RX SELMUFF, SELMUFI, SELMUPF and SELMUPI */
328 {G2_SETTINGS_1_REG, 0x800, 0x3ff, {0x3d2,}, 0, 0},
329 /* G3_TX SLEW, EMPH1 and AMP */
330 {G3_SETTINGS_0_REG, 0x800, 0xffff, {0xe6e,}, 0, 0},
331 /* G3_RX SELMUFF, SELMUFI, SELMUPF and SELMUPI */
332 {G3_SETTINGS_1_REG, 0x800, 0x3ff, {0x3d2,}, 0, 0},
333 /* Cal rxclkalign90 ext enable and Cal os ph ext */
334 {CAL_REG6, 0x800, 0xff00, {0xdd00,}, 0, 0},
335 /* Dtl Clamping disable and Dtl clamping Sel(6000ppm) */
336 {RX_REG2, 0x800, 0xf0, {0x70,}, 0, 0},
339 struct op_params sata_electrical_config_serdes_rev2_params[] = {
341 * unit_base_reg, unit_offset, mask, SATA data, wait_time,
344 /* SQ_THRESH and FFE Setting */
345 {SQUELCH_FFE_SETTING_REG, 0x800, 0xf00, {0x600}, 0, 0},
346 /* enable SSC and DFE update enable */
347 {COMMON_PHY_CONFIGURATION4_REG, 0x28, 0x400008, {0x400000}, 0, 0},
348 /* G1_TX SLEW, EMPH1 and AMP */
349 {G1_SETTINGS_0_REG, 0x800, 0xffff, {0x8a32}, 0, 0},
350 /* G1_RX SELMUFF, SELMUFI, SELMUPF and SELMUPI */
351 {G1_SETTINGS_1_REG, 0x800, 0x3ff, {0x3c9}, 0, 0},
352 /* G2_TX SLEW, EMPH1 and AMP */
353 {G2_SETTINGS_0_REG, 0x800, 0xffff, {0x8b5c}, 0, 0},
354 /* G2_RX SELMUFF, SELMUFI, SELMUPF and SELMUPI */
355 {G2_SETTINGS_1_REG, 0x800, 0x3ff, {0x3d2}, 0, 0},
356 /* G3_TX SLEW, EMPH1 and AMP */
357 {G3_SETTINGS_0_REG, 0x800, 0xffff, {0xe6e}, 0, 0},
359 * G3_RX SELMUFF, SELMUFI, SELMUPF and SELMUPI & DFE_En Gen3,
360 * DC wander calibration dis
362 {G3_SETTINGS_1_REG, 0x800, 0x47ff, {0x7d2}, 0, 0},
363 /* Bit[12]=0x0 idle_sync_en */
364 {PCIE_REG0, 0x800, 0x1000, {0x0}, 0, 0},
365 /* Dtl Clamping disable and Dtl clamping Sel(6000ppm) */
366 {RX_REG2, 0x800, 0xf0, {0x70,}, 0, 0},
367 /* tximpcal_th and rximpcal_th */
368 {VTHIMPCAL_CTRL_REG, 0x800, 0xff00, {0x3000}, 0, 0},
369 /* DFE_STEP_FINE_FX[3:0] =0xa */
370 {DFE_REG0, 0x800, 0xa00f, {0x800a}, 0, 0},
371 /* DFE_EN and Dis Update control from pin disable */
372 {DFE_REG3, 0x800, 0xc000, {0x0}, 0, 0},
373 /* FFE Force FFE_REs and cap settings for Gen1 */
374 {G1_SETTINGS_3_REG, 0x800, 0xff, {0xcf}, 0, 0},
375 /* FFE Force FFE_REs and cap settings for Gen2 */
376 {G2_SETTINGS_3_REG, 0x800, 0xff, {0xbf}, 0, 0},
377 /* FE Force FFE_REs=4 and cap settings for Gen3n */
378 {G3_SETTINGS_3_REG, 0x800, 0xff, {0xcf}, 0, 0},
379 /* Set DFE Gen 3 Resolution to 3 */
380 {G3_SETTINGS_4_REG, 0x800, 0x300, {0x300}, 0, 0},
383 struct op_params sgmii_electrical_config_serdes_rev1_params[] = {
385 * unit_base_reg, unit_offset, mask, SGMII (1.25G), SGMII (3.125G),
386 * wait_time, num_of_loops
388 /* G1_RX SELMUFF, SELMUFI, SELMUPF and SELMUPI */
389 {G1_SETTINGS_1_REG, 0x800, 0x3ff, {0x3c9, 0x3c9}, 0, 0},
390 /* SQ_THRESH and FFE Setting */
391 {SQUELCH_FFE_SETTING_REG, 0x800, 0xfff, {0x8f, 0xbf}, 0, 0},
392 /* tximpcal_th and rximpcal_th */
393 {VTHIMPCAL_CTRL_REG, 0x800, 0xff00, {0x4000, 0x4000}, 0, 0},
396 struct op_params sgmii_electrical_config_serdes_rev2_params[] = {
398 * unit_base_reg, unit_offset, mask, SGMII (1.25G), SGMII (3.125G),
399 * wait_time, num_of_loops
401 /* Set Slew_rate, Emph and Amp */
402 {G1_SETTINGS_0_REG, 0x800, 0xffff, {0x8fa, 0x8fa}, 0, 0},
403 /* G1_RX SELMUFF, SELMUFI, SELMUPF and SELMUPI */
404 {G1_SETTINGS_1_REG, 0x800, 0x3ff, {0x3c9, 0x3c9}, 0, 0},
406 {RX_REG2, 0x800, 0x4, {0x0, 0x0}, 0, 0},
407 /* G1 FFE Setting Force, RES and CAP */
408 {G1_SETTINGS_3_REG, 0x800, 0xff, {0x8f, 0xbf}, 0, 0},
409 /* tximpcal_th and rximpcal_th */
410 {VTHIMPCAL_CTRL_REG, 0x800, 0xff00, {0x3000, 0x3000}, 0, 0},
417 /* PEX and USB3 - power up seq for Serdes Rev 1.2 */
418 struct op_params pex_and_usb3_power_up_serdes_rev1_params[] = {
420 * unit_base_reg, unit_offset, mask, PEX data, USB3 data,
421 * wait_time, num_of_loops
423 {COMMON_PHY_CONFIGURATION1_REG, 0x28, 0x3fc7f806,
424 {0x4471804, 0x4479804}, 0, 0},
425 {COMMON_PHY_CONFIGURATION2_REG, 0x28, 0x5c, {0x58, 0x58}, 0, 0},
426 {COMMON_PHY_CONFIGURATION4_REG, 0x28, 0x3, {0x1, 0x1}, 0, 0},
427 {COMMON_PHY_CONFIGURATION1_REG, 0x28, 0x7800, {0x6000, 0xe000}, 0, 0},
428 {GLOBAL_CLK_CTRL, 0x800, 0xd, {0x5, 0x1}, 0, 0},
429 /* Ref clock source select */
430 {MISC_REG, 0x800, 0x4c0, {0x80, 0x4c0}, 0, 0}
433 /* PEX and USB3 - power up seq for Serdes Rev 2.1 */
434 struct op_params pex_and_usb3_power_up_serdes_rev2_params[] = {
436 * unit_base_reg, unit_offset, mask, PEX data, USB3 data,
437 * wait_time, num_of_loops
439 {COMMON_PHY_CONFIGURATION1_REG, 0x28, 0x3fc7f806,
440 {0x4471804, 0x4479804}, 0, 0},
441 {COMMON_PHY_CONFIGURATION2_REG, 0x28, 0x5c, {0x58, 0x58}, 0, 0},
442 {COMMON_PHY_CONFIGURATION4_REG, 0x28, 0x3, {0x1, 0x1}, 0, 0},
443 {COMMON_PHY_CONFIGURATION1_REG, 0x28, 0x7800, {0x6000, 0xe000}, 0, 0},
444 {GLOBAL_CLK_CTRL, 0x800, 0xd, {0x5, 0x1}, 0, 0},
445 {GLOBAL_MISC_CTRL, 0x800, 0xc0, {0x0, NO_DATA}, 0, 0},
446 /* Ref clock source select */
447 {MISC_REG, 0x800, 0x4c0, {0x80, 0x4c0}, 0, 0}
450 /* PEX and USB3 - speed config seq */
451 struct op_params pex_and_usb3_speed_config_params[] = {
453 * unit_base_reg, unit_offset, mask, PEX data, USB3 data,
454 * wait_time, num_of_loops
456 /* Maximal PHY Generation Setting */
457 {INTERFACE_REG, 0x800, 0xc00, {0x400, 0x400, 0x400, 0x400, 0x400},
461 struct op_params usb3_electrical_config_serdes_rev1_params[] = {
462 /* Spread Spectrum Clock Enable */
463 {LANE_CFG4_REG, 0x800, 0x80, {0x80}, 0, 0},
464 /* G2_TX_SSC_AMP[6:0]=4.5k_p_pM and TX emphasis mode=m_v */
465 {G2_SETTINGS_2_REG, 0x800, 0xfe40, {0x4440}, 0, 0},
466 /* tximpcal_th and rximpcal_th */
467 {VTHIMPCAL_CTRL_REG, 0x800, 0xff00, {0x4000}, 0, 0},
468 /* G2_RX SELMUFF, SELMUFI, SELMUPF and SELMUPI */
469 {G2_SETTINGS_1_REG, 0x800, 0x3ff, {0x3d2}, 0, 0},
470 /* FFE Setting Force, RES and CAP */
471 {SQUELCH_FFE_SETTING_REG, 0x800, 0xff, {0xef}, 0, 0},
472 /* Dtl Clamping disable and Dtl-clamping-Sel(6000ppm) */
473 {RX_REG2, 0x800, 0xf0, {0x70}, 0, 0},
474 /* cal_rxclkalign90_ext_en and cal_os_ph_ext */
475 {CAL_REG6, 0x800, 0xff00, {0xd500}, 0, 0},
476 /* vco_cal_vth_sel */
477 {REF_REG0, 0x800, 0x38, {0x20}, 0, 0},
480 struct op_params usb3_electrical_config_serdes_rev2_params[] = {
481 /* Spread Spectrum Clock Enable */
482 {LANE_CFG4_REG, 0x800, 0x80, {0x80}, 0, 0},
483 /* G2_TX_SSC_AMP[6:0]=4.5k_p_pM and TX emphasis mode=m_v */
484 {G2_SETTINGS_2_REG, 0x800, 0xfe40, {0x4440}, 0, 0},
485 /* G2_RX SELMUFF, SELMUFI, SELMUPF and SELMUPI */
486 {G2_SETTINGS_1_REG, 0x800, 0x3ff, {0x3d2}, 0, 0},
487 /* Dtl Clamping disable and Dtl-clamping-Sel(6000ppm) */
488 {RX_REG2, 0x800, 0xf0, {0x70}, 0, 0},
489 /* vco_cal_vth_sel */
490 {REF_REG0, 0x800, 0x38, {0x20}, 0, 0},
491 /* Spread Spectrum Clock Enable */
492 {LANE_CFG5_REG, 0x800, 0x4, {0x4}, 0, 0},
495 /* PEX and USB3 - TX config seq */
498 * For PEXx1: the pex_and_usb3_tx_config_params1/2/3 configurations should run
499 * one by one on the lane.
500 * For PEXx4: the pex_and_usb3_tx_config_params1/2/3 configurations should run
501 * by setting each sequence for all 4 lanes.
503 struct op_params pex_and_usb3_tx_config_params1[] = {
505 * unit_base_reg, unit_offset, mask, PEX data, USB3 data,
506 * wait_time, num_of_loops
508 {GLOBAL_CLK_CTRL, 0x800, 0x1, {0x0, 0x0}, 0, 0},
510 {0x0, 0x0, 0x0, {0x0, 0x0}, 10, 0},
511 /* os_ph_offset_force (align 90) */
512 {RX_REG3, 0x800, 0xff, {0xdc, NO_DATA}, 0, 0},
513 /* Set os_ph_valid */
514 {RX_REG3, 0x800, 0x100, {0x100, NO_DATA}, 0, 0},
515 /* Unset os_ph_valid */
516 {RX_REG3, 0x800, 0x100, {0x0, NO_DATA}, 0, 0},
519 struct op_params pex_and_usb3_tx_config_params2[] = {
521 * unit_base_reg, unit_offset, mask, PEX data, USB3 data,
522 * wait_time, num_of_loops
524 /* Sft Reset pulse */
525 {RESET_DFE_REG, 0x800, 0x401, {0x401, 0x401}, 0, 0},
528 struct op_params pex_and_usb3_tx_config_params3[] = {
530 * unit_base_reg, unit_offset, mask, PEX data, USB3 data,
531 * wait_time, num_of_loops
533 /* Sft Reset pulse */
534 {RESET_DFE_REG, 0x800, 0x401, {0x0, 0x0}, 0, 0},
536 {0x0, 0x0, 0x0, {0x0, 0x0}, 10, 0}
539 /* PEX by 4 config seq */
540 struct op_params pex_by4_config_params[] = {
541 /* unit_base_reg, unit_offset, mask, data, wait_time, num_of_loops */
542 {GLOBAL_CLK_SRC_HI, 0x800, 0x7, {0x5, 0x0, 0x0, 0x2}, 0, 0},
543 /* Lane Alignement enable */
544 {LANE_ALIGN_REG0, 0x800, 0x1000, {0x0, 0x0, 0x0, 0x0}, 0, 0},
545 /* Max PLL phy config */
546 {CALIBRATION_CTRL_REG, 0x800, 0x1000, {0x1000, 0x1000, 0x1000, 0x1000},
548 /* Max PLL pipe config */
549 {LANE_CFG1_REG, 0x800, 0x600, {0x600, 0x600, 0x600, 0x600}, 0, 0},
552 /* USB3 device donfig seq */
553 struct op_params usb3_device_config_params[] = {
554 /* unit_base_reg, unit_offset, mask, data, wait_time, num_of_loops */
555 {LANE_CFG4_REG, 0x800, 0x200, {0x200}, 0, 0}
558 /* PEX - electrical configuration seq Rev 1.2 */
559 struct op_params pex_electrical_config_serdes_rev1_params[] = {
561 * unit_base_reg, unit_offset, mask, PEX data, wait_time,
564 /* G1_TX_SLEW_CTRL_EN and G1_TX_SLEW_RATE */
565 {G1_SETTINGS_0_REG, 0x800, 0xf000, {0xb000}, 0, 0},
566 /* G1_RX SELMUFF, SELMUFI, SELMUPF and SELMUPI */
567 {G1_SETTINGS_1_REG, 0x800, 0x3ff, {0x3c9}, 0, 0},
568 /* G2_RX SELMUFF, SELMUFI, SELMUPF and SELMUPI */
569 {G2_SETTINGS_1_REG, 0x800, 0x3ff, {0x3c9}, 0, 0},
571 {LANE_CFG4_REG, 0x800, 0x8, {0x8}, 0, 0},
572 /* FFE Setting Force, RES and CAP */
573 {SQUELCH_FFE_SETTING_REG, 0x800, 0xff, {0xaf}, 0, 0},
574 /* tximpcal_th and rximpcal_th */
575 {VTHIMPCAL_CTRL_REG, 0x800, 0xff00, {0x3000}, 0, 0},
576 /* cal_rxclkalign90_ext_en and cal_os_ph_ext */
577 {CAL_REG6, 0x800, 0xff00, {0xdc00}, 0, 0},
580 /* PEX - electrical configuration seq Rev 2.1 */
581 struct op_params pex_electrical_config_serdes_rev2_params[] = {
583 * unit_base_reg, unit_offset, mask, PEX data, wait_time,
586 /* G1_TX_SLEW_CTRL_EN and G1_TX_SLEW_RATE */
587 {G1_SETTINGS_0_REG, 0x800, 0xf000, {0xb000}, 0, 0},
588 /* G1_RX SELMUFF, SELMUFI, SELMUPF and SELMUPI */
589 {G1_SETTINGS_1_REG, 0x800, 0x3ff, {0x3c9}, 0, 0},
590 /* G1 FFE Setting Force, RES and CAP */
591 {G1_SETTINGS_3_REG, 0x800, 0xff, {0xcf}, 0, 0},
592 /* G2_RX SELMUFF, SELMUFI, SELMUPF and SELMUPI */
593 {G2_SETTINGS_1_REG, 0x800, 0x3ff, {0x3c9}, 0, 0},
594 /* G2 FFE Setting Force, RES and CAP */
595 {G2_SETTINGS_3_REG, 0x800, 0xff, {0xaf}, 0, 0},
596 /* G2 DFE resolution value */
597 {G2_SETTINGS_4_REG, 0x800, 0x300, {0x300}, 0, 0},
598 /* DFE resolution force */
599 {DFE_REG0, 0x800, 0x8000, {0x8000}, 0, 0},
600 /* Tx amplitude for Tx Margin 0 */
601 {PCIE_REG1, 0x800, 0xf80, {0xd00}, 0, 0},
602 /* Tx_Emph value for -3.5d_b and -6d_b */
603 {PCIE_REG3, 0x800, 0xff00, {0xaf00}, 0, 0},
605 {LANE_CFG4_REG, 0x800, 0x8, {0x8}, 0, 0},
606 /* tximpcal_th and rximpcal_th */
607 {VTHIMPCAL_CTRL_REG, 0x800, 0xff00, {0x3000}, 0, 0},
610 /* PEX - configuration seq for REF_CLOCK_25MHz */
611 struct op_params pex_config_ref_clock25_m_hz[] = {
613 * unit_base_reg, unit_offset, mask, PEX data, wait_time,
616 /* Bits[4:0]=0x2 - REF_FREF_SEL */
617 {POWER_AND_PLL_CTRL_REG, 0x800, 0x1f, {0x2}, 0, 0},
618 /* Bit[10]=0x1 - REFCLK_SEL */
619 {MISC_REG, 0x800, 0x400, {0x400}, 0, 0},
620 /* Bits[7:0]=0x7 - CFG_PM_RXDLOZ_WAIT */
621 {GLOBAL_PM_CTRL, 0x800, 0xff, {0x7}, 0, 0},
624 /* PEX - configuration seq for REF_CLOCK_40MHz */
625 struct op_params pex_config_ref_clock40_m_hz[] = {
627 * unit_base_reg, unit_offset, mask, PEX data, wait_time,
630 /* Bits[4:0]=0x3 - REF_FREF_SEL */
631 {POWER_AND_PLL_CTRL_REG, 0x800, 0x1f, {0x3}, 0, 0},
632 /* Bits[10]=0x1 - REFCLK_SEL */
633 {MISC_REG, 0x800, 0x400, {0x400}, 0, 0},
634 /* Bits[7:0]=0xc - CFG_PM_RXDLOZ_WAIT */
635 {GLOBAL_PM_CTRL, 0x800, 0xff, {0xc}, 0, 0},
638 /* PEX - configuration seq for REF_CLOCK_100MHz */
639 struct op_params pex_config_ref_clock100_m_hz[] = {
641 * unit_base_reg, unit_offset, mask, PEX data, wait_time,
644 /* Bits[4:0]=0x0 - REF_FREF_SEL */
645 {POWER_AND_PLL_CTRL_REG, 0x800, 0x1f, {0x0}, 0, 0},
646 /* Bit[10]=0x0 - REFCLK_SEL */
647 {MISC_REG, 0x800, 0x400, {0x0}, 0, 0},
648 /* Bits[7:0]=0x1e - CFG_PM_RXDLOZ_WAIT */
649 {GLOBAL_PM_CTRL, 0x800, 0xff, {0x1e}, 0, 0},
656 struct op_params usb2_power_up_params[] = {
658 * unit_base_reg, unit_offset, mask, USB2 data, wait_time,
662 {0x18440, 0x0 /*NA*/, 0xffffffff, {0x62}, 0, 0},
664 {0x18444, 0x0 /*NA*/, 0xffffffff, {0x62}, 0, 0},
666 {0x18448, 0x0 /*NA*/, 0xffffffff, {0x62}, 0, 0},
667 /* Phy offset 0x0 - PLL_CONTROL0 */
668 {0xc0000, 0x0 /*NA*/, 0xffffffff, {0x40605205}, 0, 0},
669 {0xc001c, 0x0 /*NA*/, 0xffffffff, {0x39f16ce}, 0, 0},
670 {0xc201c, 0x0 /*NA*/, 0xffffffff, {0x39f16ce}, 0, 0},
671 {0xc401c, 0x0 /*NA*/, 0xffffffff, {0x39f16ce}, 0, 0},
672 /* Phy offset 0x1 - PLL_CONTROL1 */
673 {0xc0004, 0x0 /*NA*/, 0x1, {0x1}, 0, 0},
674 /* Phy0 register 3 - TX Channel control 0 */
675 {0xc000c, 0x0 /*NA*/, 0x1000000, {0x1000000}, 0, 0},
676 /* Phy0 register 3 - TX Channel control 0 */
677 {0xc200c, 0x0 /*NA*/, 0x1000000, {0x1000000}, 0, 0},
678 /* Phy0 register 3 - TX Channel control 0 */
679 {0xc400c, 0x0 /*NA*/, 0x1000000, {0x1000000}, 0, 0},
680 /* check PLLCAL_DONE is set and IMPCAL_DONE is set */
681 {0xc0008, 0x0 /*NA*/, 0x80800000, {0x80800000}, 1, 1000},
682 /* check REG_SQCAL_DONE is set */
683 {0xc0018, 0x0 /*NA*/, 0x80000000, {0x80000000}, 1, 1000},
684 /* check PLL_READY is set */
685 {0xc0000, 0x0 /*NA*/, 0x80000000, {0x80000000}, 1, 1000}
692 /* QSGMII - power up seq */
693 struct op_params qsgmii_port_power_up_params[] = {
695 * unit_base_reg, unit_offset, mask, QSGMII data, wait_time,
698 /* Connect the QSGMII to Gigabit Ethernet units */
699 {QSGMII_CONTROL_REG1, 0x0, 0x40000000, {0x40000000}, 0, 0},
701 {COMMON_PHY_CONFIGURATION1_REG, 0x28, 0xf0006, {0x80002}, 0, 0},
703 {COMMON_PHY_CONFIGURATION1_REG, 0x28, 0x7800, {0x6000}, 0, 0},
705 {POWER_AND_PLL_CTRL_REG, 0x800, 0xff, {0xfc81}, 0, 0},
706 /* Ref clock source select */
707 {MISC_REG, 0x800, 0x4c0, {0x480}, 0, 0}
710 /* QSGMII - speed config seq */
711 struct op_params qsgmii_port_speed_config_params[] = {
713 * unit_base_reg, unit_offset, mask, QSGMII data, wait_time,
717 {COMMON_PHY_CONFIGURATION1_REG, 0x28, 0x3fc00000, {0xcc00000}, 0, 0},
718 /* Phy Gen RX and TX */
719 {ISOLATE_REG, 0x800, 0xff, {0x33}, 0, 0},
721 {LOOPBACK_REG, 0x800, 0xe, {0x2}, 0, 0}
724 /* QSGMII - Select electrical param seq */
725 struct op_params qsgmii_port_electrical_config_params[] = {
727 * unit_base_reg, unit_offset, mask, QSGMII data, wait_time,
730 /* Slew rate and emphasis */
731 {G1_SETTINGS_0_REG, 0x800, 0x8000, {0x0}, 0, 0}
734 /* QSGMII - TX config seq */
735 struct op_params qsgmii_port_tx_config_params1[] = {
737 * unit_base_reg, unit_offset, mask, QSGMII data, wait_time,
740 {GLUE_REG, 0x800, 0x1800, {0x800}, 0, 0},
741 /* Sft Reset pulse */
742 {RESET_DFE_REG, 0x800, 0x401, {0x401}, 0, 0},
743 /* Sft Reset pulse */
744 {RESET_DFE_REG, 0x800, 0x401, {0x0}, 0, 0},
746 {LANE_ALIGN_REG0, 0x800, 0x1000, {0x1000}, 0, 0},
747 /* Power up PLL, RX and TX */
748 {COMMON_PHY_CONFIGURATION1_REG, 0x28, 0x70000, {0x70000}, 0, 0},
749 /* Tx driver output idle */
750 {COMMON_PHY_CONFIGURATION1_REG, 0x28, 0x80000, {0x80000}, 0, 0}
753 struct op_params qsgmii_port_tx_config_params2[] = {
755 * unit_base_reg, unit_offset, mask, QSGMII data, wait_time,
758 /* Wait for PHY power up sequence to finish */
759 {COMMON_PHY_STATUS1_REG, 0x28, 0xc, {0xc}, 10, 1000},
760 /* Assert Rx Init and Tx driver output valid */
761 {COMMON_PHY_CONFIGURATION1_REG, 0x28, 0x40080000, {0x40000000}, 0, 0},
762 /* Wait for PHY power up sequence to finish */
763 {COMMON_PHY_STATUS1_REG, 0x28, 0x1, {0x1}, 1, 1000},
764 /* De-assert Rx Init */
765 {COMMON_PHY_CONFIGURATION1_REG, 0x28, 0x40000000, {0x0}, 0, 0}
768 /* SERDES_POWER_DOWN */
769 struct op_params serdes_power_down_params[] = {
770 {COMMON_PHY_CONFIGURATION1_REG, 0x28, (0xf << 11), {(0x3 << 11)},
772 {COMMON_PHY_CONFIGURATION1_REG, 0x28, (0x7 << 16), {0}, 0, 0}
776 * hws_ctrl_serdes_rev_get
778 * DESCRIPTION: Get the Serdes revision number
780 * INPUT: config_field - Field description enum
785 * 8bit Serdes revision number
787 u8 hws_ctrl_serdes_rev_get(void)
789 #ifdef CONFIG_ARMADA_38X
791 if (sys_env_device_rev_get() == MV_88F68XX_Z1_ID)
792 return MV_SERDES_REV_1_2;
795 /* for A39x-Z1, A38x-A0 */
796 return MV_SERDES_REV_2_1;
799 u32 hws_serdes_topology_verify(enum serdes_type serdes_type, u32 serdes_id,
800 enum serdes_mode serdes_mode)
803 u8 serd_max_num, unit_numb;
804 enum unit_id unit_id;
806 if (serdes_type > RXAUI) {
807 printf("%s: Warning: Wrong serdes type %s serdes#%d\n",
808 __func__, serdes_type_to_string[serdes_type], serdes_id);
812 unit_id = serdes_type_to_unit_info[serdes_type].serdes_unit_id;
813 unit_numb = serdes_type_to_unit_info[serdes_type].serdes_unit_num;
814 serd_max_num = sys_env_unit_max_num_get(unit_id);
816 /* if didn't exceed amount of required Serdes lanes for current type */
817 if (serdes_lane_in_use_count[unit_id][unit_numb] != 0) {
818 /* update amount of required Serdes lanes for current type */
819 serdes_lane_in_use_count[unit_id][unit_numb]--;
822 * If reached the exact amount of required Serdes lanes for
825 if (serdes_lane_in_use_count[unit_id][unit_numb] == 0) {
826 if (((serdes_type <= PEX3)) &&
827 ((serdes_mode == PEX_END_POINT_X4) ||
828 (serdes_mode == PEX_ROOT_COMPLEX_X4))) {
829 /* PCiex4 uses 2 SerDes */
830 serdes_unit_count[PEX_UNIT_ID] += 2;
832 serdes_unit_count[unit_id]++;
835 /* test SoC unit count limitation */
836 if (serdes_unit_count[unit_id] > serd_max_num) {
837 test_result = WRONG_NUMBER_OF_UNITS;
838 } else if (unit_numb >= serd_max_num) {
839 /* test SoC unit number limitation */
840 test_result = UNIT_NUMBER_VIOLATION;
844 test_result = SERDES_ALREADY_IN_USE;
845 if (test_result == SERDES_ALREADY_IN_USE) {
846 printf("%s: Error: serdes lane %d is configured to type %s: type already in use\n",
848 serdes_type_to_string[serdes_type]);
850 } else if (test_result == WRONG_NUMBER_OF_UNITS) {
851 printf("%s: Warning: serdes lane %d is set to type %s.\n",
853 serdes_type_to_string[serdes_type]);
854 printf("%s: Maximum supported lanes are already set to this type (limit = %d)\n",
855 __func__, serd_max_num);
857 } else if (test_result == UNIT_NUMBER_VIOLATION) {
858 printf("%s: Warning: serdes lane %d type is %s: current device support only %d units of this type.\n",
860 serdes_type_to_string[serdes_type],
869 void hws_serdes_xaui_topology_verify(void)
872 * If XAUI is in use - serdes_lane_in_use_count has to be = 0;
873 * if it is not in use hast be = 4
875 if ((serdes_lane_in_use_count[XAUI_UNIT_ID][0] != 0) &&
876 (serdes_lane_in_use_count[XAUI_UNIT_ID][0] != 4)) {
877 printf("%s: Warning: wrong number of lanes is set to XAUI - %d\n",
878 __func__, serdes_lane_in_use_count[XAUI_UNIT_ID][0]);
879 printf("%s: XAUI has to be defined on 4 lanes\n", __func__);
883 * If RXAUI is in use - serdes_lane_in_use_count has to be = 0;
884 * if it is not in use hast be = 2
886 if ((serdes_lane_in_use_count[RXAUI_UNIT_ID][0] != 0) &&
887 (serdes_lane_in_use_count[RXAUI_UNIT_ID][0] != 2)) {
888 printf("%s: Warning: wrong number of lanes is set to RXAUI - %d\n",
889 __func__, serdes_lane_in_use_count[RXAUI_UNIT_ID][0]);
890 printf("%s: RXAUI has to be defined on 2 lanes\n", __func__);
894 int hws_serdes_seq_db_init(void)
896 u8 serdes_rev = hws_ctrl_serdes_rev_get();
898 DEBUG_INIT_FULL_S("\n### serdes_seq38x_init ###\n");
900 if (serdes_rev == MV_SERDES_REV_NA) {
901 printf("hws_serdes_seq_db_init: serdes revision number is not supported\n");
902 return MV_NOT_SUPPORTED;
905 /* SATA_PORT_0_ONLY_POWER_UP_SEQ sequence init */
906 serdes_seq_db[SATA_PORT_0_ONLY_POWER_UP_SEQ].op_params_ptr =
907 sata_port0_power_up_params;
908 serdes_seq_db[SATA_PORT_0_ONLY_POWER_UP_SEQ].cfg_seq_size =
909 sizeof(sata_port0_power_up_params) / sizeof(struct op_params);
910 serdes_seq_db[SATA_PORT_0_ONLY_POWER_UP_SEQ].data_arr_idx = SATA;
912 /* SATA_PORT_1_ONLY_POWER_UP_SEQ sequence init */
913 serdes_seq_db[SATA_PORT_1_ONLY_POWER_UP_SEQ].op_params_ptr =
914 sata_port1_power_up_params;
915 serdes_seq_db[SATA_PORT_1_ONLY_POWER_UP_SEQ].cfg_seq_size =
916 sizeof(sata_port1_power_up_params) / sizeof(struct op_params);
917 serdes_seq_db[SATA_PORT_1_ONLY_POWER_UP_SEQ].data_arr_idx = SATA;
919 /* SATA_POWER_UP_SEQ sequence init */
920 serdes_seq_db[SATA_POWER_UP_SEQ].op_params_ptr =
921 sata_and_sgmii_power_up_params;
922 serdes_seq_db[SATA_POWER_UP_SEQ].cfg_seq_size =
923 sizeof(sata_and_sgmii_power_up_params) / sizeof(struct op_params);
924 serdes_seq_db[SATA_POWER_UP_SEQ].data_arr_idx = SATA;
926 /* SATA_1_5_SPEED_CONFIG_SEQ sequence init */
927 serdes_seq_db[SATA_1_5_SPEED_CONFIG_SEQ].op_params_ptr =
928 sata_and_sgmii_speed_config_params;
929 serdes_seq_db[SATA_1_5_SPEED_CONFIG_SEQ].cfg_seq_size =
930 sizeof(sata_and_sgmii_speed_config_params) /
931 sizeof(struct op_params);
932 serdes_seq_db[SATA_1_5_SPEED_CONFIG_SEQ].data_arr_idx = SATA;
934 /* SATA_3_SPEED_CONFIG_SEQ sequence init */
935 serdes_seq_db[SATA_3_SPEED_CONFIG_SEQ].op_params_ptr =
936 sata_and_sgmii_speed_config_params;
937 serdes_seq_db[SATA_3_SPEED_CONFIG_SEQ].cfg_seq_size =
938 sizeof(sata_and_sgmii_speed_config_params) /
939 sizeof(struct op_params);
940 serdes_seq_db[SATA_3_SPEED_CONFIG_SEQ].data_arr_idx = SATA;
942 /* SATA_6_SPEED_CONFIG_SEQ sequence init */
943 serdes_seq_db[SATA_6_SPEED_CONFIG_SEQ].op_params_ptr =
944 sata_and_sgmii_speed_config_params;
945 serdes_seq_db[SATA_6_SPEED_CONFIG_SEQ].cfg_seq_size =
946 sizeof(sata_and_sgmii_speed_config_params) /
947 sizeof(struct op_params);
948 serdes_seq_db[SATA_6_SPEED_CONFIG_SEQ].data_arr_idx = SATA;
950 /* SATA_ELECTRICAL_CONFIG_SEQ seq sequence init */
951 if (serdes_rev == MV_SERDES_REV_1_2) {
952 serdes_seq_db[SATA_ELECTRICAL_CONFIG_SEQ].op_params_ptr =
953 sata_electrical_config_serdes_rev1_params;
954 serdes_seq_db[SATA_ELECTRICAL_CONFIG_SEQ].cfg_seq_size =
955 sizeof(sata_electrical_config_serdes_rev1_params) /
956 sizeof(struct op_params);
958 serdes_seq_db[SATA_ELECTRICAL_CONFIG_SEQ].op_params_ptr =
959 sata_electrical_config_serdes_rev2_params;
960 serdes_seq_db[SATA_ELECTRICAL_CONFIG_SEQ].cfg_seq_size =
961 sizeof(sata_electrical_config_serdes_rev2_params) /
962 sizeof(struct op_params);
964 serdes_seq_db[SATA_ELECTRICAL_CONFIG_SEQ].data_arr_idx = SATA;
966 /* SATA_TX_CONFIG_SEQ sequence init */
967 serdes_seq_db[SATA_TX_CONFIG_SEQ1].op_params_ptr =
968 sata_and_sgmii_tx_config_params1;
969 serdes_seq_db[SATA_TX_CONFIG_SEQ1].cfg_seq_size =
970 sizeof(sata_and_sgmii_tx_config_params1) / sizeof(struct op_params);
971 serdes_seq_db[SATA_TX_CONFIG_SEQ1].data_arr_idx = SATA;
973 /* SATA_PORT_0_ONLY_TX_CONFIG_SEQ sequence init */
974 serdes_seq_db[SATA_PORT_0_ONLY_TX_CONFIG_SEQ].op_params_ptr =
975 sata_port0_tx_config_params;
976 serdes_seq_db[SATA_PORT_0_ONLY_TX_CONFIG_SEQ].cfg_seq_size =
977 sizeof(sata_port0_tx_config_params) / sizeof(struct op_params);
978 serdes_seq_db[SATA_PORT_0_ONLY_TX_CONFIG_SEQ].data_arr_idx = SATA;
980 /* SATA_PORT_1_ONLY_TX_CONFIG_SEQ sequence init */
981 serdes_seq_db[SATA_PORT_1_ONLY_TX_CONFIG_SEQ].op_params_ptr =
982 sata_port1_tx_config_params;
983 serdes_seq_db[SATA_PORT_1_ONLY_TX_CONFIG_SEQ].cfg_seq_size =
984 sizeof(sata_port1_tx_config_params) / sizeof(struct op_params);
985 serdes_seq_db[SATA_PORT_1_ONLY_TX_CONFIG_SEQ].data_arr_idx = SATA;
987 /* SATA_TX_CONFIG_SEQ2 sequence init */
988 if (serdes_rev == MV_SERDES_REV_1_2) {
989 serdes_seq_db[SATA_TX_CONFIG_SEQ2].op_params_ptr =
990 sata_and_sgmii_tx_config_serdes_rev1_params2;
991 serdes_seq_db[SATA_TX_CONFIG_SEQ2].cfg_seq_size =
992 sizeof(sata_and_sgmii_tx_config_serdes_rev1_params2) /
993 sizeof(struct op_params);
995 serdes_seq_db[SATA_TX_CONFIG_SEQ2].op_params_ptr =
996 sata_and_sgmii_tx_config_serdes_rev2_params2;
997 serdes_seq_db[SATA_TX_CONFIG_SEQ2].cfg_seq_size =
998 sizeof(sata_and_sgmii_tx_config_serdes_rev2_params2) /
999 sizeof(struct op_params);
1001 serdes_seq_db[SATA_TX_CONFIG_SEQ2].data_arr_idx = SATA;
1003 /* SGMII_POWER_UP_SEQ sequence init */
1004 serdes_seq_db[SGMII_POWER_UP_SEQ].op_params_ptr =
1005 sata_and_sgmii_power_up_params;
1006 serdes_seq_db[SGMII_POWER_UP_SEQ].cfg_seq_size =
1007 sizeof(sata_and_sgmii_power_up_params) / sizeof(struct op_params);
1008 serdes_seq_db[SGMII_POWER_UP_SEQ].data_arr_idx = SGMII;
1010 /* SGMII_1_25_SPEED_CONFIG_SEQ sequence init */
1011 serdes_seq_db[SGMII_1_25_SPEED_CONFIG_SEQ].op_params_ptr =
1012 sata_and_sgmii_speed_config_params;
1013 serdes_seq_db[SGMII_1_25_SPEED_CONFIG_SEQ].cfg_seq_size =
1014 sizeof(sata_and_sgmii_speed_config_params) /
1015 sizeof(struct op_params);
1016 serdes_seq_db[SGMII_1_25_SPEED_CONFIG_SEQ].data_arr_idx = SGMII;
1018 /* SGMII_3_125_SPEED_CONFIG_SEQ sequence init */
1019 serdes_seq_db[SGMII_3_125_SPEED_CONFIG_SEQ].op_params_ptr =
1020 sata_and_sgmii_speed_config_params;
1021 serdes_seq_db[SGMII_3_125_SPEED_CONFIG_SEQ].cfg_seq_size =
1022 sizeof(sata_and_sgmii_speed_config_params) /
1023 sizeof(struct op_params);
1024 serdes_seq_db[SGMII_3_125_SPEED_CONFIG_SEQ].data_arr_idx = SGMII_3_125;
1026 /* SGMII_ELECTRICAL_CONFIG_SEQ seq sequence init */
1027 if (serdes_rev == MV_SERDES_REV_1_2) {
1028 serdes_seq_db[SGMII_ELECTRICAL_CONFIG_SEQ].op_params_ptr =
1029 sgmii_electrical_config_serdes_rev1_params;
1030 serdes_seq_db[SGMII_ELECTRICAL_CONFIG_SEQ].cfg_seq_size =
1031 sizeof(sgmii_electrical_config_serdes_rev1_params) /
1032 sizeof(struct op_params);
1034 serdes_seq_db[SGMII_ELECTRICAL_CONFIG_SEQ].op_params_ptr =
1035 sgmii_electrical_config_serdes_rev2_params;
1036 serdes_seq_db[SGMII_ELECTRICAL_CONFIG_SEQ].cfg_seq_size =
1037 sizeof(sgmii_electrical_config_serdes_rev2_params) /
1038 sizeof(struct op_params);
1040 serdes_seq_db[SGMII_ELECTRICAL_CONFIG_SEQ].data_arr_idx = SGMII;
1042 /* SGMII_TX_CONFIG_SEQ sequence init */
1043 serdes_seq_db[SGMII_TX_CONFIG_SEQ1].op_params_ptr =
1044 sata_and_sgmii_tx_config_params1;
1045 serdes_seq_db[SGMII_TX_CONFIG_SEQ1].cfg_seq_size =
1046 sizeof(sata_and_sgmii_tx_config_params1) / sizeof(struct op_params);
1047 serdes_seq_db[SGMII_TX_CONFIG_SEQ1].data_arr_idx = SGMII;
1049 /* SGMII_TX_CONFIG_SEQ sequence init */
1050 if (serdes_rev == MV_SERDES_REV_1_2) {
1051 serdes_seq_db[SGMII_TX_CONFIG_SEQ2].op_params_ptr =
1052 sata_and_sgmii_tx_config_serdes_rev1_params2;
1053 serdes_seq_db[SGMII_TX_CONFIG_SEQ2].cfg_seq_size =
1054 sizeof(sata_and_sgmii_tx_config_serdes_rev1_params2) /
1055 sizeof(struct op_params);
1057 serdes_seq_db[SGMII_TX_CONFIG_SEQ2].op_params_ptr =
1058 sata_and_sgmii_tx_config_serdes_rev2_params2;
1059 serdes_seq_db[SGMII_TX_CONFIG_SEQ2].cfg_seq_size =
1060 sizeof(sata_and_sgmii_tx_config_serdes_rev2_params2) /
1061 sizeof(struct op_params);
1063 serdes_seq_db[SGMII_TX_CONFIG_SEQ2].data_arr_idx = SGMII;
1065 /* PEX_POWER_UP_SEQ sequence init */
1066 if (serdes_rev == MV_SERDES_REV_1_2) {
1067 serdes_seq_db[PEX_POWER_UP_SEQ].op_params_ptr =
1068 pex_and_usb3_power_up_serdes_rev1_params;
1069 serdes_seq_db[PEX_POWER_UP_SEQ].cfg_seq_size =
1070 sizeof(pex_and_usb3_power_up_serdes_rev1_params) /
1071 sizeof(struct op_params);
1073 serdes_seq_db[PEX_POWER_UP_SEQ].op_params_ptr =
1074 pex_and_usb3_power_up_serdes_rev2_params;
1075 serdes_seq_db[PEX_POWER_UP_SEQ].cfg_seq_size =
1076 sizeof(pex_and_usb3_power_up_serdes_rev2_params) /
1077 sizeof(struct op_params);
1079 serdes_seq_db[PEX_POWER_UP_SEQ].data_arr_idx = PEX;
1081 /* PEX_2_5_SPEED_CONFIG_SEQ sequence init */
1082 serdes_seq_db[PEX_2_5_SPEED_CONFIG_SEQ].op_params_ptr =
1083 pex_and_usb3_speed_config_params;
1084 serdes_seq_db[PEX_2_5_SPEED_CONFIG_SEQ].cfg_seq_size =
1085 sizeof(pex_and_usb3_speed_config_params) / sizeof(struct op_params);
1086 serdes_seq_db[PEX_2_5_SPEED_CONFIG_SEQ].data_arr_idx =
1087 PEXSERDES_SPEED_2_5_GBPS;
1089 /* PEX_5_SPEED_CONFIG_SEQ sequence init */
1090 serdes_seq_db[PEX_5_SPEED_CONFIG_SEQ].op_params_ptr =
1091 pex_and_usb3_speed_config_params;
1092 serdes_seq_db[PEX_5_SPEED_CONFIG_SEQ].cfg_seq_size =
1093 sizeof(pex_and_usb3_speed_config_params) / sizeof(struct op_params);
1094 serdes_seq_db[PEX_5_SPEED_CONFIG_SEQ].data_arr_idx =
1095 PEXSERDES_SPEED_5_GBPS;
1097 /* PEX_ELECTRICAL_CONFIG_SEQ seq sequence init */
1098 if (serdes_rev == MV_SERDES_REV_1_2) {
1099 serdes_seq_db[PEX_ELECTRICAL_CONFIG_SEQ].op_params_ptr =
1100 pex_electrical_config_serdes_rev1_params;
1101 serdes_seq_db[PEX_ELECTRICAL_CONFIG_SEQ].cfg_seq_size =
1102 sizeof(pex_electrical_config_serdes_rev1_params) /
1103 sizeof(struct op_params);
1105 serdes_seq_db[PEX_ELECTRICAL_CONFIG_SEQ].op_params_ptr =
1106 pex_electrical_config_serdes_rev2_params;
1107 serdes_seq_db[PEX_ELECTRICAL_CONFIG_SEQ].cfg_seq_size =
1108 sizeof(pex_electrical_config_serdes_rev2_params) /
1109 sizeof(struct op_params);
1111 serdes_seq_db[PEX_ELECTRICAL_CONFIG_SEQ].data_arr_idx = PEX;
1113 /* PEX_TX_CONFIG_SEQ1 sequence init */
1114 serdes_seq_db[PEX_TX_CONFIG_SEQ1].op_params_ptr =
1115 pex_and_usb3_tx_config_params1;
1116 serdes_seq_db[PEX_TX_CONFIG_SEQ1].cfg_seq_size =
1117 sizeof(pex_and_usb3_tx_config_params1) / sizeof(struct op_params);
1118 serdes_seq_db[PEX_TX_CONFIG_SEQ1].data_arr_idx = PEX;
1120 /* PEX_TX_CONFIG_SEQ2 sequence init */
1121 serdes_seq_db[PEX_TX_CONFIG_SEQ2].op_params_ptr =
1122 pex_and_usb3_tx_config_params2;
1123 serdes_seq_db[PEX_TX_CONFIG_SEQ2].cfg_seq_size =
1124 sizeof(pex_and_usb3_tx_config_params2) / sizeof(struct op_params);
1125 serdes_seq_db[PEX_TX_CONFIG_SEQ2].data_arr_idx = PEX;
1127 /* PEX_TX_CONFIG_SEQ3 sequence init */
1128 serdes_seq_db[PEX_TX_CONFIG_SEQ3].op_params_ptr =
1129 pex_and_usb3_tx_config_params3;
1130 serdes_seq_db[PEX_TX_CONFIG_SEQ3].cfg_seq_size =
1131 sizeof(pex_and_usb3_tx_config_params3) / sizeof(struct op_params);
1132 serdes_seq_db[PEX_TX_CONFIG_SEQ3].data_arr_idx = PEX;
1134 /* PEX_BY_4_CONFIG_SEQ sequence init */
1135 serdes_seq_db[PEX_BY_4_CONFIG_SEQ].op_params_ptr =
1136 pex_by4_config_params;
1137 serdes_seq_db[PEX_BY_4_CONFIG_SEQ].cfg_seq_size =
1138 sizeof(pex_by4_config_params) / sizeof(struct op_params);
1139 serdes_seq_db[PEX_BY_4_CONFIG_SEQ].data_arr_idx = PEX;
1141 /* PEX_CONFIG_REF_CLOCK_25MHZ_SEQ sequence init */
1142 serdes_seq_db[PEX_CONFIG_REF_CLOCK_25MHZ_SEQ].op_params_ptr =
1143 pex_config_ref_clock25_m_hz;
1144 serdes_seq_db[PEX_CONFIG_REF_CLOCK_25MHZ_SEQ].cfg_seq_size =
1145 sizeof(pex_config_ref_clock25_m_hz) / sizeof(struct op_params);
1146 serdes_seq_db[PEX_CONFIG_REF_CLOCK_25MHZ_SEQ].data_arr_idx = PEX;
1148 /* PEX_ELECTRICAL_CONFIG_REF_CLOCK_40MHZ_SEQ sequence init */
1149 serdes_seq_db[PEX_CONFIG_REF_CLOCK_40MHZ_SEQ].op_params_ptr =
1150 pex_config_ref_clock40_m_hz;
1151 serdes_seq_db[PEX_CONFIG_REF_CLOCK_40MHZ_SEQ].cfg_seq_size =
1152 sizeof(pex_config_ref_clock40_m_hz) / sizeof(struct op_params);
1153 serdes_seq_db[PEX_CONFIG_REF_CLOCK_40MHZ_SEQ].data_arr_idx = PEX;
1155 /* PEX_CONFIG_REF_CLOCK_100MHZ_SEQ sequence init */
1156 serdes_seq_db[PEX_CONFIG_REF_CLOCK_100MHZ_SEQ].op_params_ptr =
1157 pex_config_ref_clock100_m_hz;
1158 serdes_seq_db[PEX_CONFIG_REF_CLOCK_100MHZ_SEQ].cfg_seq_size =
1159 sizeof(pex_config_ref_clock100_m_hz) / sizeof(struct op_params);
1160 serdes_seq_db[PEX_CONFIG_REF_CLOCK_100MHZ_SEQ].data_arr_idx = PEX;
1162 /* USB3_POWER_UP_SEQ sequence init */
1163 if (serdes_rev == MV_SERDES_REV_1_2) {
1164 serdes_seq_db[USB3_POWER_UP_SEQ].op_params_ptr =
1165 pex_and_usb3_power_up_serdes_rev1_params;
1166 serdes_seq_db[USB3_POWER_UP_SEQ].cfg_seq_size =
1167 sizeof(pex_and_usb3_power_up_serdes_rev1_params) /
1168 sizeof(struct op_params);
1170 serdes_seq_db[USB3_POWER_UP_SEQ].op_params_ptr =
1171 pex_and_usb3_power_up_serdes_rev2_params;
1172 serdes_seq_db[USB3_POWER_UP_SEQ].cfg_seq_size =
1173 sizeof(pex_and_usb3_power_up_serdes_rev2_params) /
1174 sizeof(struct op_params);
1176 serdes_seq_db[USB3_POWER_UP_SEQ].data_arr_idx = USB3;
1178 /* USB3_HOST_SPEED_CONFIG_SEQ sequence init */
1179 serdes_seq_db[USB3_HOST_SPEED_CONFIG_SEQ].op_params_ptr =
1180 pex_and_usb3_speed_config_params;
1181 serdes_seq_db[USB3_HOST_SPEED_CONFIG_SEQ].cfg_seq_size =
1182 sizeof(pex_and_usb3_speed_config_params) / sizeof(struct op_params);
1183 serdes_seq_db[USB3_HOST_SPEED_CONFIG_SEQ].data_arr_idx =
1184 USB3SERDES_SPEED_5_GBPS_HOST;
1186 /* USB3_DEVICE_SPEED_CONFIG_SEQ sequence init */
1187 serdes_seq_db[USB3_DEVICE_SPEED_CONFIG_SEQ].op_params_ptr =
1188 pex_and_usb3_speed_config_params;
1189 serdes_seq_db[USB3_DEVICE_SPEED_CONFIG_SEQ].cfg_seq_size =
1190 sizeof(pex_and_usb3_speed_config_params) / sizeof(struct op_params);
1191 serdes_seq_db[USB3_DEVICE_SPEED_CONFIG_SEQ].data_arr_idx =
1192 USB3SERDES_SPEED_5_GBPS_DEVICE;
1194 /* USB3_ELECTRICAL_CONFIG_SEQ seq sequence init */
1195 if (serdes_rev == MV_SERDES_REV_1_2) {
1196 serdes_seq_db[USB3_ELECTRICAL_CONFIG_SEQ].op_params_ptr =
1197 usb3_electrical_config_serdes_rev1_params;
1198 serdes_seq_db[USB3_ELECTRICAL_CONFIG_SEQ].cfg_seq_size =
1199 sizeof(usb3_electrical_config_serdes_rev1_params) /
1200 sizeof(struct op_params);
1202 serdes_seq_db[USB3_ELECTRICAL_CONFIG_SEQ].op_params_ptr =
1203 usb3_electrical_config_serdes_rev2_params;
1204 serdes_seq_db[USB3_ELECTRICAL_CONFIG_SEQ].cfg_seq_size =
1205 sizeof(usb3_electrical_config_serdes_rev2_params) /
1206 sizeof(struct op_params);
1208 serdes_seq_db[USB3_ELECTRICAL_CONFIG_SEQ].data_arr_idx = USB3;
1210 /* USB3_TX_CONFIG_SEQ sequence init */
1211 serdes_seq_db[USB3_TX_CONFIG_SEQ1].op_params_ptr =
1212 pex_and_usb3_tx_config_params1;
1213 serdes_seq_db[USB3_TX_CONFIG_SEQ1].cfg_seq_size =
1214 sizeof(pex_and_usb3_tx_config_params1) / sizeof(struct op_params);
1215 serdes_seq_db[USB3_TX_CONFIG_SEQ1].data_arr_idx = USB3;
1217 /* USB3_TX_CONFIG_SEQ sequence init */
1218 serdes_seq_db[USB3_TX_CONFIG_SEQ2].op_params_ptr =
1219 pex_and_usb3_tx_config_params2;
1220 serdes_seq_db[USB3_TX_CONFIG_SEQ2].cfg_seq_size =
1221 sizeof(pex_and_usb3_tx_config_params2) / sizeof(struct op_params);
1222 serdes_seq_db[USB3_TX_CONFIG_SEQ2].data_arr_idx = USB3;
1224 /* USB3_TX_CONFIG_SEQ sequence init */
1225 serdes_seq_db[USB3_TX_CONFIG_SEQ3].op_params_ptr =
1226 pex_and_usb3_tx_config_params3;
1227 serdes_seq_db[USB3_TX_CONFIG_SEQ3].cfg_seq_size =
1228 sizeof(pex_and_usb3_tx_config_params3) / sizeof(struct op_params);
1229 serdes_seq_db[USB3_TX_CONFIG_SEQ3].data_arr_idx = USB3;
1231 /* USB2_POWER_UP_SEQ sequence init */
1232 serdes_seq_db[USB2_POWER_UP_SEQ].op_params_ptr = usb2_power_up_params;
1233 serdes_seq_db[USB2_POWER_UP_SEQ].cfg_seq_size =
1234 sizeof(usb2_power_up_params) / sizeof(struct op_params);
1235 serdes_seq_db[USB2_POWER_UP_SEQ].data_arr_idx = 0;
1237 /* USB3_DEVICE_CONFIG_SEQ sequence init */
1238 serdes_seq_db[USB3_DEVICE_CONFIG_SEQ].op_params_ptr =
1239 usb3_device_config_params;
1240 serdes_seq_db[USB3_DEVICE_CONFIG_SEQ].cfg_seq_size =
1241 sizeof(usb3_device_config_params) / sizeof(struct op_params);
1242 serdes_seq_db[USB3_DEVICE_CONFIG_SEQ].data_arr_idx = 0; /* Not relevant */
1244 /* SERDES_POWER_DOWN_SEQ sequence init */
1245 serdes_seq_db[SERDES_POWER_DOWN_SEQ].op_params_ptr =
1246 serdes_power_down_params;
1247 serdes_seq_db[SERDES_POWER_DOWN_SEQ].cfg_seq_size =
1248 sizeof(serdes_power_down_params) /
1249 sizeof(struct op_params);
1250 serdes_seq_db[SERDES_POWER_DOWN_SEQ].data_arr_idx = FIRST_CELL;
1252 if (serdes_rev == MV_SERDES_REV_2_1) {
1253 /* QSGMII_POWER_UP_SEQ sequence init */
1254 serdes_seq_db[QSGMII_POWER_UP_SEQ].op_params_ptr =
1255 qsgmii_port_power_up_params;
1256 serdes_seq_db[QSGMII_POWER_UP_SEQ].cfg_seq_size =
1257 sizeof(qsgmii_port_power_up_params) /
1258 sizeof(struct op_params);
1259 serdes_seq_db[QSGMII_POWER_UP_SEQ].data_arr_idx =
1262 /* QSGMII_5_SPEED_CONFIG_SEQ sequence init */
1263 serdes_seq_db[QSGMII_5_SPEED_CONFIG_SEQ].op_params_ptr =
1264 qsgmii_port_speed_config_params;
1265 serdes_seq_db[QSGMII_5_SPEED_CONFIG_SEQ].cfg_seq_size =
1266 sizeof(qsgmii_port_speed_config_params) /
1267 sizeof(struct op_params);
1268 serdes_seq_db[QSGMII_5_SPEED_CONFIG_SEQ].data_arr_idx =
1271 /* QSGMII_ELECTRICAL_CONFIG_SEQ seq sequence init */
1272 serdes_seq_db[QSGMII_ELECTRICAL_CONFIG_SEQ].op_params_ptr =
1273 qsgmii_port_electrical_config_params;
1274 serdes_seq_db[QSGMII_ELECTRICAL_CONFIG_SEQ].cfg_seq_size =
1275 sizeof(qsgmii_port_electrical_config_params) /
1276 sizeof(struct op_params);
1277 serdes_seq_db[QSGMII_ELECTRICAL_CONFIG_SEQ].data_arr_idx =
1280 /* QSGMII_TX_CONFIG_SEQ sequence init */
1281 serdes_seq_db[QSGMII_TX_CONFIG_SEQ1].op_params_ptr =
1282 qsgmii_port_tx_config_params1;
1283 serdes_seq_db[QSGMII_TX_CONFIG_SEQ1].cfg_seq_size =
1284 sizeof(qsgmii_port_tx_config_params1) /
1285 sizeof(struct op_params);
1286 serdes_seq_db[QSGMII_TX_CONFIG_SEQ1].data_arr_idx =
1289 /* QSGMII_TX_CONFIG_SEQ sequence init */
1290 serdes_seq_db[QSGMII_TX_CONFIG_SEQ2].op_params_ptr =
1291 qsgmii_port_tx_config_params2;
1292 serdes_seq_db[QSGMII_TX_CONFIG_SEQ2].cfg_seq_size =
1293 sizeof(qsgmii_port_tx_config_params2) /
1294 sizeof(struct op_params);
1295 serdes_seq_db[QSGMII_TX_CONFIG_SEQ2].data_arr_idx =
1302 enum serdes_seq serdes_type_and_speed_to_speed_seq(enum serdes_type serdes_type,
1303 enum serdes_speed baud_rate)
1305 enum serdes_seq seq_id = SERDES_LAST_SEQ;
1307 DEBUG_INIT_FULL_S("\n### serdes_type_and_speed_to_speed_seq ###\n");
1308 switch (serdes_type) {
1313 if (baud_rate == SERDES_SPEED_2_5_GBPS)
1314 seq_id = PEX_2_5_SPEED_CONFIG_SEQ;
1315 else if (baud_rate == SERDES_SPEED_5_GBPS)
1316 seq_id = PEX_5_SPEED_CONFIG_SEQ;
1320 if (baud_rate == SERDES_SPEED_5_GBPS)
1321 seq_id = USB3_HOST_SPEED_CONFIG_SEQ;
1324 if (baud_rate == SERDES_SPEED_5_GBPS)
1325 seq_id = USB3_DEVICE_SPEED_CONFIG_SEQ;
1331 if (baud_rate == SERDES_SPEED_1_5_GBPS)
1332 seq_id = SATA_1_5_SPEED_CONFIG_SEQ;
1333 else if (baud_rate == SERDES_SPEED_3_GBPS)
1334 seq_id = SATA_3_SPEED_CONFIG_SEQ;
1335 else if (baud_rate == SERDES_SPEED_6_GBPS)
1336 seq_id = SATA_6_SPEED_CONFIG_SEQ;
1341 #ifdef CONFIG_ARMADA_39X
1344 if (baud_rate == SERDES_SPEED_1_25_GBPS)
1345 seq_id = SGMII_1_25_SPEED_CONFIG_SEQ;
1346 else if (baud_rate == SERDES_SPEED_3_125_GBPS)
1347 seq_id = SGMII_3_125_SPEED_CONFIG_SEQ;
1350 seq_id = QSGMII_5_SPEED_CONFIG_SEQ;
1352 #ifdef CONFIG_ARMADA_39X
1354 seq_id = XAUI_3_125_SPEED_CONFIG_SEQ;
1357 seq_id = RXAUI_6_25_SPEED_CONFIG_SEQ;
1361 return SERDES_LAST_SEQ;
1368 * This is the weak default function for the Marvell evaluation or
1369 * development boarrds. Like the DB-88F6820-GP and others.
1370 * Custom boards should define this function in their board
1371 * code (board directory). And overwrite this default function
1372 * with this custom specific code.
1374 __weak int hws_board_topology_load(struct serdes_map *serdes_map_array)
1376 u32 board_id = mv_board_id_get();
1377 u32 board_id_index = mv_board_id_index_get(board_id);
1379 DEBUG_INIT_FULL_S("\n### hws_board_topology_load ###\n");
1380 /* getting board topology according to the board id */
1381 DEBUG_INIT_FULL_S("Getting board topology according to the board id\n");
1383 CHECK_STATUS(load_topology_func_arr[board_id_index] (serdes_map_array));
1388 void print_topology_details(struct serdes_map *serdes_map_array)
1392 DEBUG_INIT_S("board SerDes lanes topology details:\n");
1394 DEBUG_INIT_S(" | Lane # | Speed | Type |\n");
1395 DEBUG_INIT_S(" --------------------------------\n");
1396 for (lane_num = 0; lane_num < hws_serdes_get_max_lane(); lane_num++) {
1397 if (serdes_map_array[lane_num].serdes_type == DEFAULT_SERDES)
1399 DEBUG_INIT_S(" | ");
1400 DEBUG_INIT_D(hws_get_physical_serdes_num(lane_num), 1);
1401 DEBUG_INIT_S(" | ");
1402 DEBUG_INIT_D(serdes_map_array[lane_num].serdes_speed, 2);
1403 DEBUG_INIT_S(" | ");
1404 DEBUG_INIT_S((char *)
1405 serdes_type_to_string[serdes_map_array[lane_num].
1407 DEBUG_INIT_S("\t|\n");
1409 DEBUG_INIT_S(" --------------------------------\n");
1412 int hws_pre_serdes_init_config(void)
1417 * Configure Core PLL
1420 * set PLL parameters
1421 * bits[2:0] =0x3 (Core-PLL Kdiv)
1422 * bits[20:12]=0x9f (Core-PLL Ndiv)
1423 * bits[24:21]=0x7(Core-PLL VCO Band)
1424 * bits[28:25]=0x1(Core-PLL Rlf)
1425 * bits[31:29]=0x2(Core-PLL charge-pump adjust)
1427 reg_write(CORE_PLL_PARAMETERS_REG, 0x42e9f003);
1429 /* Enable PLL Configuration */
1430 data = reg_read(CORE_PLL_CONFIG_REG);
1431 data = SET_BIT(data, 9);
1432 reg_write(CORE_PLL_CONFIG_REG, data);
1437 int serdes_phy_config(void)
1439 DEBUG_INIT_FULL_S("\n### ctrl_high_speed_serdes_phy_config ###\n");
1441 DEBUG_INIT_S("High speed PHY - Version: ");
1442 DEBUG_INIT_S(SERDES_VERION);
1445 /* Init serdes sequences DB */
1446 if (hws_serdes_seq_init() != MV_OK) {
1447 printf("hws_ctrl_high_speed_serdes_phy_config: Error: Serdes initialization fail\n");
1452 i2c_init(CONFIG_SYS_I2C_SPEED, CONFIG_SYS_I2C_SLAVE);
1454 /* Board topology load */
1456 ("ctrl_high_speed_serdes_phy_config: Loading board topology..\n");
1457 CHECK_STATUS(hws_board_topology_load(serdes_configuration_map));
1459 /* print topology */
1460 print_topology_details(serdes_configuration_map);
1461 CHECK_STATUS(hws_pre_serdes_init_config());
1463 /* Power-Up sequence */
1465 ("ctrl_high_speed_serdes_phy_config: Starting serdes power up sequence\n");
1467 CHECK_STATUS(hws_power_up_serdes_lanes(serdes_configuration_map));
1470 ("\n### ctrl_high_speed_serdes_phy_config ended successfully ###\n");
1472 DEBUG_INIT_S(ENDED_OK);
1477 int serdes_polarity_config(u32 serdes_num, int is_rx)
1481 u8 bit_off = (is_rx) ? 11 : 10;
1483 reg_addr = SERDES_REGS_LANE_BASE_OFFSET(serdes_num) + SYNC_PATTERN_REG;
1484 data = reg_read(reg_addr);
1485 data = SET_BIT(data, bit_off);
1486 reg_write(reg_addr, data);
1491 int hws_power_up_serdes_lanes(struct serdes_map *serdes_config_map)
1493 u32 serdes_id, serdes_lane_num;
1494 enum ref_clock ref_clock;
1495 enum serdes_type serdes_type;
1496 enum serdes_speed serdes_speed;
1497 enum serdes_mode serdes_mode;
1498 int serdes_rx_polarity_swap;
1499 int serdes_tx_polarity_swap;
1500 int is_pex_enabled = 0;
1504 * Flag which indicates that one of the Serdes is of PEX.
1505 * In this case, PEX unit will be initialized after Serdes power-up
1508 DEBUG_INIT_FULL_S("\n### hws_power_up_serdes_lanes ###\n");
1510 /* COMMON PHYS SELECTORS register configuration */
1512 ("hws_power_up_serdes_lanes: Updating COMMON PHYS SELECTORS reg\n");
1513 CHECK_STATUS(hws_update_serdes_phy_selectors(serdes_configuration_map));
1515 /* per Serdes Power Up */
1516 for (serdes_id = 0; serdes_id < hws_serdes_get_max_lane();
1519 ("calling serdes_power_up_ctrl: serdes lane number ");
1520 DEBUG_INIT_FULL_D_10(serdes_lane_num, 1);
1521 DEBUG_INIT_FULL_S("\n");
1523 serdes_lane_num = hws_get_physical_serdes_num(serdes_id);
1524 serdes_type = serdes_config_map[serdes_id].serdes_type;
1525 serdes_speed = serdes_config_map[serdes_id].serdes_speed;
1526 serdes_mode = serdes_config_map[serdes_id].serdes_mode;
1527 serdes_rx_polarity_swap = serdes_config_map[serdes_id].swap_rx;
1528 serdes_tx_polarity_swap = serdes_config_map[serdes_id].swap_tx;
1530 /* serdes lane is not in use */
1531 if (serdes_type == DEFAULT_SERDES)
1533 else if (serdes_type <= PEX3) /* PEX type */
1536 ref_clock = hws_serdes_get_ref_clock_val(serdes_type);
1537 if (ref_clock == REF_CLOCK_UNSUPPORTED) {
1539 ("hws_power_up_serdes_lanes: unsupported ref clock\n");
1540 return MV_NOT_SUPPORTED;
1542 CHECK_STATUS(serdes_power_up_ctrl(serdes_lane_num,
1546 serdes_mode, ref_clock));
1548 /* RX Polarity config */
1549 if (serdes_rx_polarity_swap)
1550 CHECK_STATUS(serdes_polarity_config
1551 (serdes_lane_num, 1));
1553 /* TX Polarity config */
1554 if (serdes_tx_polarity_swap)
1555 CHECK_STATUS(serdes_polarity_config
1556 (serdes_lane_num, 0));
1559 if (is_pex_enabled) {
1560 /* Set PEX_TX_CONFIG_SEQ sequence for PEXx4 mode.
1561 After finish the Power_up sequence for all lanes,
1562 the lanes should be released from reset state. */
1563 CHECK_STATUS(hws_pex_tx_config_seq(serdes_config_map));
1565 /* PEX configuration */
1566 CHECK_STATUS(hws_pex_config(serdes_config_map));
1569 /* USB2 configuration */
1570 DEBUG_INIT_FULL_S("hws_power_up_serdes_lanes: init USB2 Phys\n");
1571 CHECK_STATUS(mv_seq_exec(0 /* not relevant */ , USB2_POWER_UP_SEQ));
1574 ("### hws_power_up_serdes_lanes ended successfully ###\n");
1579 int ctrl_high_speed_serdes_phy_config(void)
1581 return hws_ctrl_high_speed_serdes_phy_config();
1584 static int serdes_pex_usb3_pipe_delay_w_a(u32 serdes_num, u8 serdes_type)
1588 /* WA for A380 Z1 relevant for lanes 3,4,5 only */
1589 if (serdes_num >= 3) {
1590 reg_data = reg_read(GENERAL_PURPOSE_RESERVED0_REG);
1591 /* set delay on pipe -
1592 * When lane 3 is connected to a MAC of Pex -> set bit 7 to 1.
1593 * When lane 3 is connected to a MAC of USB3 -> set bit 7 to 0.
1594 * When lane 4 is connected to a MAC of Pex -> set bit 8 to 1.
1595 * When lane 4 is connected to a MAC of USB3 -> set bit 8 to 0.
1596 * When lane 5 is connected to a MAC of Pex -> set bit 8 to 1.
1597 * When lane 5 is connected to a MAC of USB3 -> set bit 8 to 0.
1599 if (serdes_type == PEX)
1600 reg_data |= 1 << (7 + (serdes_num - 3));
1601 if (serdes_type == USB3) {
1603 reg_data &= ~(1 << (7 + (serdes_num - 3)));
1605 reg_write(GENERAL_PURPOSE_RESERVED0_REG, reg_data);
1612 * hws_serdes_pex_ref_clock_satr_get -
1614 * DESCRIPTION: Get the reference clock value from DEVICE_SAMPLE_AT_RESET1_REG
1616 * bit[2] for PEX#0, bit[3] for PEX#1, bit[30] for PEX#2, bit[31]
1618 * If bit=0 --> REF_CLOCK_100MHz
1619 * If bit=1 && DEVICE_SAMPLE_AT_RESET2_REG bit[0]=0
1620 * --> REF_CLOCK_25MHz
1621 * If bit=1 && DEVICE_SAMPLE_AT_RESET2_REG bit[0]=1
1622 * --> REF_CLOCK_40MHz
1624 * INPUT: serdes_type - Type of Serdes
1626 * OUTPUT: pex_satr - Return the REF_CLOCK value:
1627 * REF_CLOCK_25MHz, REF_CLOCK_40MHz or REF_CLOCK_100MHz
1629 * RETURNS: MV_OK - for success
1630 * MV_BAD_PARAM - for fail
1632 int hws_serdes_pex_ref_clock_satr_get(enum serdes_type serdes_type, u32 *pex_satr)
1634 u32 data, reg_satr1;
1636 reg_satr1 = reg_read(DEVICE_SAMPLE_AT_RESET1_REG);
1638 switch (serdes_type) {
1640 data = REF_CLK_SELECTOR_VAL_PEX0(reg_satr1);
1643 data = REF_CLK_SELECTOR_VAL_PEX1(reg_satr1);
1646 data = REF_CLK_SELECTOR_VAL_PEX2(reg_satr1);
1649 data = REF_CLK_SELECTOR_VAL_PEX3(reg_satr1);
1652 printf("%s: Error: SerDes type %d is not supported\n",
1653 __func__, serdes_type);
1654 return MV_BAD_PARAM;
1662 u32 hws_serdes_get_ref_clock_val(enum serdes_type serdes_type)
1665 enum ref_clock ref_clock;
1667 DEBUG_INIT_FULL_S("\n### hws_serdes_get_ref_clock_val ###\n");
1669 if (serdes_type >= LAST_SERDES_TYPE)
1670 return REF_CLOCK_UNSUPPORTED;
1672 /* read ref clock from S@R */
1673 ref_clock = hws_serdes_silicon_ref_clock_get();
1675 if (serdes_type > PEX3) {
1676 /* for all Serdes types but PCIe */
1680 /* for PCIe, need also to check PCIe S@R */
1681 CHECK_STATUS(hws_serdes_pex_ref_clock_satr_get
1682 (serdes_type, &pex_satr));
1684 if (pex_satr == 0) {
1685 return REF_CLOCK_100MHZ;
1686 } else if (pex_satr == 1) {
1687 /* value of 1 means we can use ref clock from SoC (as other Serdes types) */
1691 ("%s: Error: REF_CLK_SELECTOR_VAL for SerDes type %d is wrong\n",
1692 __func__, serdes_type);
1693 return REF_CLOCK_UNSUPPORTED;
1697 int serdes_power_up_ctrl(u32 serdes_num, int serdes_power_up,
1698 enum serdes_type serdes_type,
1699 enum serdes_speed baud_rate,
1700 enum serdes_mode serdes_mode, enum ref_clock ref_clock)
1702 u32 sata_idx, pex_idx, sata_port;
1703 enum serdes_seq speed_seq_id;
1707 DEBUG_INIT_FULL_S("\n### serdes_power_up_ctrl ###\n");
1709 if (serdes_power_up == 1) { /* Serdes power up */
1711 ("serdes_power_up_ctrl: executing power up.. ");
1712 DEBUG_INIT_FULL_C("serdes num = ", serdes_num, 2);
1713 DEBUG_INIT_FULL_C("serdes type = ", serdes_type, 2);
1715 DEBUG_INIT_FULL_S("Going access 1");
1717 /* Getting the Speed Select sequence id */
1719 serdes_type_and_speed_to_speed_seq(serdes_type,
1721 if (speed_seq_id == SERDES_LAST_SEQ) {
1723 ("serdes_power_up_ctrl: serdes type %d and speed %d are not supported together\n",
1724 serdes_type, baud_rate);
1726 return MV_BAD_PARAM;
1729 /* Executing power up, ref clock set, speed config and TX config */
1730 switch (serdes_type) {
1735 if (hws_ctrl_serdes_rev_get() == MV_SERDES_REV_1_2) {
1736 CHECK_STATUS(serdes_pex_usb3_pipe_delay_w_a
1740 is_pex_by1 = (serdes_mode == PEX_ROOT_COMPLEX_X1) ||
1741 (serdes_mode == PEX_END_POINT_X1);
1742 pex_idx = serdes_type - PEX0;
1744 if ((is_pex_by1 == 1) || (serdes_type == PEX0)) {
1745 /* For PEX by 4, init only the PEX 0 */
1746 reg_data = reg_read(SOC_CONTROL_REG1);
1747 if (is_pex_by1 == 1)
1750 reg_data &= ~0x4000;
1751 reg_write(SOC_CONTROL_REG1, reg_data);
1754 reg_read(((PEX_IF_REGS_BASE(pex_idx)) +
1757 if (is_pex_by1 == 1)
1761 reg_write(((PEX_IF_REGS_BASE(pex_idx)) + 0x6c),
1765 reg_read(((PEX_IF_REGS_BASE(pex_idx)) +
1769 reg_write(((PEX_IF_REGS_BASE(pex_idx)) + 0x6c),
1773 reg_read(((PEX_IF_REGS_BASE(pex_idx)) +
1777 reg_write(((PEX_IF_REGS_BASE(pex_idx)) + 0x70),
1781 CHECK_STATUS(mv_seq_exec(serdes_num, PEX_POWER_UP_SEQ));
1782 if (is_pex_by1 == 0) {
1784 * for PEX by 4 - use the PEX index as the
1787 serdes_seq_db[PEX_BY_4_CONFIG_SEQ].
1788 data_arr_idx = pex_idx;
1789 CHECK_STATUS(mv_seq_exec
1790 (serdes_num, PEX_BY_4_CONFIG_SEQ));
1793 CHECK_STATUS(hws_ref_clock_set
1794 (serdes_num, serdes_type, ref_clock));
1795 CHECK_STATUS(mv_seq_exec(serdes_num, speed_seq_id));
1796 CHECK_STATUS(mv_seq_exec
1797 (serdes_num, PEX_ELECTRICAL_CONFIG_SEQ));
1799 if (is_pex_by1 == 1) {
1800 CHECK_STATUS(mv_seq_exec
1801 (serdes_num, PEX_TX_CONFIG_SEQ2));
1802 CHECK_STATUS(mv_seq_exec
1803 (serdes_num, PEX_TX_CONFIG_SEQ3));
1804 CHECK_STATUS(mv_seq_exec
1805 (serdes_num, PEX_TX_CONFIG_SEQ1));
1813 if (hws_ctrl_serdes_rev_get() == MV_SERDES_REV_1_2) {
1814 CHECK_STATUS(serdes_pex_usb3_pipe_delay_w_a
1815 (serdes_num, USB3));
1817 CHECK_STATUS(mv_seq_exec
1818 (serdes_num, USB3_POWER_UP_SEQ));
1819 CHECK_STATUS(hws_ref_clock_set
1820 (serdes_num, serdes_type, ref_clock));
1821 CHECK_STATUS(mv_seq_exec(serdes_num, speed_seq_id));
1822 if (serdes_type == USB3_DEVICE) {
1823 CHECK_STATUS(mv_seq_exec
1825 USB3_DEVICE_CONFIG_SEQ));
1827 CHECK_STATUS(mv_seq_exec
1828 (serdes_num, USB3_ELECTRICAL_CONFIG_SEQ));
1829 CHECK_STATUS(mv_seq_exec
1830 (serdes_num, USB3_TX_CONFIG_SEQ1));
1831 CHECK_STATUS(mv_seq_exec
1832 (serdes_num, USB3_TX_CONFIG_SEQ2));
1833 CHECK_STATUS(mv_seq_exec
1834 (serdes_num, USB3_TX_CONFIG_SEQ3));
1842 sata_idx = ((serdes_type == SATA0) ||
1843 (serdes_type == SATA1)) ? 0 : 1;
1844 sata_port = ((serdes_type == SATA0) ||
1845 (serdes_type == SATA2)) ? 0 : 1;
1847 CHECK_STATUS(mv_seq_exec
1848 (sata_idx, (sata_port == 0) ?
1849 SATA_PORT_0_ONLY_POWER_UP_SEQ :
1850 SATA_PORT_1_ONLY_POWER_UP_SEQ));
1851 CHECK_STATUS(mv_seq_exec
1852 (serdes_num, SATA_POWER_UP_SEQ));
1853 CHECK_STATUS(hws_ref_clock_set
1854 (serdes_num, serdes_type, ref_clock));
1855 CHECK_STATUS(mv_seq_exec(serdes_num, speed_seq_id));
1856 CHECK_STATUS(mv_seq_exec
1857 (serdes_num, SATA_ELECTRICAL_CONFIG_SEQ));
1858 CHECK_STATUS(mv_seq_exec
1859 (serdes_num, SATA_TX_CONFIG_SEQ1));
1860 CHECK_STATUS(mv_seq_exec
1861 (sata_idx, (sata_port == 0) ?
1862 SATA_PORT_0_ONLY_TX_CONFIG_SEQ :
1863 SATA_PORT_1_ONLY_TX_CONFIG_SEQ));
1864 CHECK_STATUS(mv_seq_exec
1865 (serdes_num, SATA_TX_CONFIG_SEQ2));
1872 CHECK_STATUS(mv_seq_exec
1873 (serdes_num, SGMII_POWER_UP_SEQ));
1874 CHECK_STATUS(hws_ref_clock_set
1875 (serdes_num, serdes_type, ref_clock));
1876 CHECK_STATUS(mv_seq_exec(serdes_num, speed_seq_id));
1877 CHECK_STATUS(mv_seq_exec
1878 (serdes_num, SGMII_ELECTRICAL_CONFIG_SEQ));
1879 CHECK_STATUS(mv_seq_exec
1880 (serdes_num, SGMII_TX_CONFIG_SEQ1));
1881 CHECK_STATUS(mv_seq_exec
1882 (serdes_num, SGMII_TX_CONFIG_SEQ2));
1884 /* GBE configuration */
1885 reg_data = reg_read(GBE_CONFIGURATION_REG);
1886 /* write the SGMII index */
1887 reg_data |= 0x1 << (serdes_type - SGMII0);
1888 reg_write(GBE_CONFIGURATION_REG, reg_data);
1892 if (hws_ctrl_serdes_rev_get() < MV_SERDES_REV_2_1)
1893 return MV_NOT_SUPPORTED;
1895 CHECK_STATUS(mv_seq_exec
1896 (serdes_num, QSGMII_POWER_UP_SEQ));
1897 CHECK_STATUS(hws_ref_clock_set
1898 (serdes_num, serdes_type, ref_clock));
1899 CHECK_STATUS(mv_seq_exec(serdes_num, speed_seq_id));
1900 CHECK_STATUS(mv_seq_exec
1902 QSGMII_ELECTRICAL_CONFIG_SEQ));
1903 CHECK_STATUS(mv_seq_exec
1904 (serdes_num, QSGMII_TX_CONFIG_SEQ1));
1905 CHECK_STATUS(mv_seq_exec
1906 (serdes_num, QSGMII_TX_CONFIG_SEQ2));
1911 CHECK_STATUS(serdes_power_up_ctrl_ext
1912 (serdes_num, serdes_power_up, serdes_type,
1913 baud_rate, serdes_mode, ref_clock));
1917 ("serdes_power_up_ctrl: bad serdes_type parameter\n");
1918 return MV_BAD_PARAM;
1920 } else { /* Serdes power down */
1921 DEBUG_INIT_FULL_S("serdes_power_up: executing power down.. ");
1922 DEBUG_INIT_FULL_C("serdes num = ", serdes_num, 1);
1924 CHECK_STATUS(mv_seq_exec(serdes_num, SERDES_POWER_DOWN_SEQ));
1928 "serdes_power_up_ctrl ended successfully for serdes ",
1934 int hws_update_serdes_phy_selectors(struct serdes_map *serdes_config_map)
1936 u32 lane_data, idx, serdes_lane_hw_num, reg_data = 0;
1937 enum serdes_type serdes_type;
1938 enum serdes_mode serdes_mode;
1941 int updated_topology_print = 0;
1943 DEBUG_INIT_FULL_S("\n### hws_update_serdes_phy_selectors ###\n");
1945 ("Updating the COMMON PHYS SELECTORS register with the serdes types\n");
1947 if (hws_ctrl_serdes_rev_get() == MV_SERDES_REV_1_2)
1953 * Updating bits 0-17 in the COMMON PHYS SELECTORS register
1954 * according to the serdes types
1956 for (idx = 0; idx < hws_serdes_get_max_lane();
1958 serdes_type = serdes_config_map[idx].serdes_type;
1959 serdes_mode = serdes_config_map[idx].serdes_mode;
1960 serdes_lane_hw_num = hws_get_physical_serdes_num(idx);
1963 hws_serdes_get_phy_selector_val(serdes_lane_hw_num,
1966 if (serdes_type == DEFAULT_SERDES)
1969 if (hws_serdes_topology_verify
1970 (serdes_type, idx, serdes_mode) != MV_OK) {
1971 serdes_config_map[idx].serdes_type =
1973 printf("%s: SerDes lane #%d is disabled\n", __func__,
1974 serdes_lane_hw_num);
1975 updated_topology_print = 1;
1980 * Checking if the board topology configuration includes
1981 * PEXx4 - for the next step
1983 if ((serdes_mode == PEX_END_POINT_X4) ||
1984 (serdes_mode == PEX_ROOT_COMPLEX_X4)) {
1985 /* update lane data to the 3 next SERDES lanes */
1987 common_phys_selectors_pex_by4_lanes
1988 [serdes_lane_hw_num];
1989 if (serdes_type == PEX0)
1993 if (lane_data == NA) {
1995 ("%s: Warning: SerDes lane #%d and type %d are not supported together\n",
1996 __func__, serdes_lane_hw_num, serdes_mode);
1997 serdes_config_map[idx].serdes_type =
1999 printf("%s: SerDes lane #%d is disabled\n", __func__,
2000 serdes_lane_hw_num);
2005 * Updating the data that will be written to
2006 * COMMON_PHYS_SELECTORS_REG
2008 reg_data |= (lane_data <<
2009 (select_bit_off * serdes_lane_hw_num));
2013 * Check that number of used lanes for XAUI and RXAUI
2014 * (if used) is right
2016 hws_serdes_xaui_topology_verify();
2018 /* Print topology */
2019 if (updated_topology_print)
2020 print_topology_details(serdes_config_map);
2023 * Updating the PEXx4 Enable bit in the COMMON PHYS SELECTORS
2024 * register for PEXx4 mode
2026 reg_data |= (is_pex_x4 == 1) ? (0x1 << PEX_X4_ENABLE_OFFS) : 0;
2028 /* Updating the COMMON PHYS SELECTORS register */
2029 reg_write(COMMON_PHYS_SELECTORS_REG, reg_data);
2034 int hws_ref_clock_set(u32 serdes_num, enum serdes_type serdes_type,
2035 enum ref_clock ref_clock)
2037 u32 data1 = 0, data2 = 0, data3 = 0, reg_data;
2039 DEBUG_INIT_FULL_S("\n### hws_ref_clock_set ###\n");
2041 if (hws_is_serdes_active(serdes_num) != 1) {
2042 printf("%s: SerDes lane #%d is not Active\n", __func__,
2044 return MV_BAD_PARAM;
2047 switch (serdes_type) {
2052 switch (ref_clock) {
2053 case REF_CLOCK_25MHZ:
2054 CHECK_STATUS(mv_seq_exec
2056 PEX_CONFIG_REF_CLOCK_25MHZ_SEQ));
2058 case REF_CLOCK_100MHZ:
2059 CHECK_STATUS(mv_seq_exec
2061 PEX_CONFIG_REF_CLOCK_100MHZ_SEQ));
2063 #ifdef CONFIG_ARMADA_39X
2064 case REF_CLOCK_40MHZ:
2065 CHECK_STATUS(mv_seq_exec
2067 PEX_CONFIG_REF_CLOCK_40MHZ_SEQ));
2072 ("%s: Error: ref_clock %d for SerDes lane #%d, type %d is not supported\n",
2073 __func__, ref_clock, serdes_num, serdes_type);
2074 return MV_BAD_PARAM;
2079 if (ref_clock == REF_CLOCK_25MHZ) {
2080 data1 = POWER_AND_PLL_CTRL_REG_25MHZ_VAL_2;
2081 data2 = GLOBAL_PM_CTRL_REG_25MHZ_VAL;
2082 data3 = LANE_CFG4_REG_25MHZ_VAL;
2083 } else if (ref_clock == REF_CLOCK_40MHZ) {
2084 data1 = POWER_AND_PLL_CTRL_REG_40MHZ_VAL;
2085 data2 = GLOBAL_PM_CTRL_REG_40MHZ_VAL;
2086 data3 = LANE_CFG4_REG_40MHZ_VAL;
2089 ("hws_ref_clock_set: ref clock is not valid for serdes type %d\n",
2091 return MV_BAD_PARAM;
2102 if (ref_clock == REF_CLOCK_25MHZ) {
2103 data1 = POWER_AND_PLL_CTRL_REG_25MHZ_VAL_1;
2104 } else if (ref_clock == REF_CLOCK_40MHZ) {
2105 data1 = POWER_AND_PLL_CTRL_REG_40MHZ_VAL;
2108 ("hws_ref_clock_set: ref clock is not valid for serdes type %d\n",
2110 return MV_BAD_PARAM;
2113 #ifdef CONFIG_ARMADA_39X
2117 if (ref_clock == REF_CLOCK_25MHZ) {
2118 data1 = POWER_AND_PLL_CTRL_REG_25MHZ_VAL_1;
2119 } else if (ref_clock == REF_CLOCK_40MHZ) {
2120 data1 = POWER_AND_PLL_CTRL_REG_40MHZ_VAL;
2123 ("hws_ref_clock_set: ref clock is not valid for serdes type %d\n",
2125 return MV_BAD_PARAM;
2130 DEBUG_INIT_S("hws_ref_clock_set: not supported serdes type\n");
2131 return MV_BAD_PARAM;
2135 * Write the ref_clock to relevant SELECT_REF_CLOCK_REG bits and
2138 reg_data = reg_read(POWER_AND_PLL_CTRL_REG +
2139 SERDES_REGS_LANE_BASE_OFFSET(serdes_num));
2140 reg_data &= POWER_AND_PLL_CTRL_REG_MASK;
2142 reg_write(POWER_AND_PLL_CTRL_REG +
2143 SERDES_REGS_LANE_BASE_OFFSET(serdes_num), reg_data);
2145 if ((serdes_type == USB3_HOST0) || (serdes_type == USB3_HOST1) ||
2146 (serdes_type == USB3_DEVICE)) {
2147 reg_data = reg_read(GLOBAL_PM_CTRL +
2148 SERDES_REGS_LANE_BASE_OFFSET(serdes_num));
2149 reg_data &= GLOBAL_PM_CTRL_REG_MASK;
2151 reg_write(GLOBAL_PM_CTRL +
2152 SERDES_REGS_LANE_BASE_OFFSET(serdes_num), reg_data);
2154 reg_data = reg_read(LANE_CFG4_REG +
2155 SERDES_REGS_LANE_BASE_OFFSET(serdes_num));
2156 reg_data &= LANE_CFG4_REG_MASK;
2158 reg_write(LANE_CFG4_REG +
2159 SERDES_REGS_LANE_BASE_OFFSET(serdes_num), reg_data);
2166 * hws_pex_tx_config_seq -
2168 * DESCRIPTION: Set PEX_TX_CONFIG_SEQ sequence init for PEXx4 mode
2169 * INPUT: serdes_map - The board topology map
2171 * RETURNS: MV_OK - for success
2172 * MV_BAD_PARAM - for fail
2174 int hws_pex_tx_config_seq(struct serdes_map *serdes_map)
2176 enum serdes_mode serdes_mode;
2177 u32 serdes_lane_id, serdes_lane_hw_num;
2179 DEBUG_INIT_FULL_S("\n### hws_pex_tx_config_seq ###\n");
2182 * For PEXx4: the pex_and_usb3_tx_config_params1/2/3
2183 * configurations should run by setting each sequence for
2187 /* relese pipe soft reset for all lanes */
2188 for (serdes_lane_id = 0; serdes_lane_id < hws_serdes_get_max_lane();
2190 serdes_mode = serdes_map[serdes_lane_id].serdes_mode;
2191 serdes_lane_hw_num =
2192 hws_get_physical_serdes_num(serdes_lane_id);
2194 if ((serdes_mode == PEX_ROOT_COMPLEX_X4) ||
2195 (serdes_mode == PEX_END_POINT_X4)) {
2196 CHECK_STATUS(mv_seq_exec
2197 (serdes_lane_hw_num, PEX_TX_CONFIG_SEQ1));
2201 /* set phy soft reset for all lanes */
2202 for (serdes_lane_id = 0; serdes_lane_id < hws_serdes_get_max_lane();
2204 serdes_mode = serdes_map[serdes_lane_id].serdes_mode;
2205 serdes_lane_hw_num =
2206 hws_get_physical_serdes_num(serdes_lane_id);
2207 if ((serdes_mode == PEX_ROOT_COMPLEX_X4) ||
2208 (serdes_mode == PEX_END_POINT_X4)) {
2209 CHECK_STATUS(mv_seq_exec
2210 (serdes_lane_hw_num, PEX_TX_CONFIG_SEQ2));
2214 /* set phy soft reset for all lanes */
2215 for (serdes_lane_id = 0; serdes_lane_id < hws_serdes_get_max_lane();
2217 serdes_mode = serdes_map[serdes_lane_id].serdes_mode;
2218 serdes_lane_hw_num =
2219 hws_get_physical_serdes_num(serdes_lane_id);
2220 if ((serdes_mode == PEX_ROOT_COMPLEX_X4) ||
2221 (serdes_mode == PEX_END_POINT_X4)) {
2222 CHECK_STATUS(mv_seq_exec
2223 (serdes_lane_hw_num, PEX_TX_CONFIG_SEQ3));