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 "board_env_spec.h"
17 #define SERDES_VERION "2.1.5"
18 #define ENDED_OK "High speed PHY - Ended Successfully\n"
20 static const u8 serdes_cfg[][SERDES_LAST_UNIT] = BIN_SERDES_CFG;
22 extern MV_BIN_SERDES_CFG *serdes_info_tbl[];
24 extern u8 rd78460gp_twsi_dev[];
25 extern u8 db88f78xx0rev2_twsi_dev[];
27 u32 pex_cfg_read(u32 pex_if, u32 bus, u32 dev, u32 func, u32 offs);
28 int pex_local_bus_num_set(u32 pex_if, u32 bus_num);
29 int pex_local_dev_num_set(u32 pex_if, u32 dev_num);
31 #define MV_BOARD_PEX_MODULE_ADDR 0x23
32 #define MV_BOARD_PEX_MODULE_ID 1
33 #define MV_BOARD_ETM_MODULE_ID 2
35 #define PEX_MODULE_DETECT 1
36 #define ETM_MODULE_DETECT 2
38 #define PEX_MODE_GET(satr) ((satr & 0x6) >> 1)
39 #define PEX_CAPABILITY_GET(satr) (satr & 1)
40 #define MV_PEX_UNIT_TO_IF(pex_unit) ((pex_unit < 3) ? (pex_unit * 4) : 9)
42 /* Static parametes */
43 static int config_module;
44 static int switch_module;
47 static u32 board_id_get(void)
49 #if defined(CONFIG_DB_88F78X60)
50 return DB_88F78XX0_BP_ID;
51 #elif defined(CONFIG_RD_88F78460_SERVER)
52 return RD_78460_SERVER_ID;
53 #elif defined(CONFIG_RD_78460_SERVER_REV2)
54 return RD_78460_SERVER_REV2_ID;
55 #elif defined(CONFIG_DB_78X60_PCAC)
56 return DB_78X60_PCAC_ID;
57 #elif defined(CONFIG_DB_88F78X60_REV2)
58 return DB_88F78XX0_BP_REV2_ID;
59 #elif defined(CONFIG_RD_78460_NAS)
60 return RD_78460_NAS_ID;
61 #elif defined(CONFIG_DB_78X60_AMC)
62 return DB_78X60_AMC_ID;
63 #elif defined(CONFIG_DB_78X60_PCAC_REV2)
64 return DB_78X60_PCAC_REV2_ID;
65 #elif defined(CONFIG_DB_784MP_GP)
66 return DB_784MP_GP_ID;
67 #elif defined(CONFIG_RD_78460_CUSTOMER)
68 return RD_78460_CUSTOMER_ID;
71 * Return 0 here for custom board as this should not be used
78 __weak u8 board_sat_r_get(u8 dev_num, u8 reg)
82 u32 board_id = board_id_get();
87 case DB_78X60_PCAC_REV2_ID:
88 case RD_78460_CUSTOMER_ID:
89 case RD_78460_SERVER_ID:
90 case RD_78460_SERVER_REV2_ID:
91 case DB_78X60_PCAC_ID:
92 return (0x1 << 1) | 1;
93 case FPGA_88F78XX0_ID:
95 return (0x0 << 1) | 1;
97 dev = rd78460gp_twsi_dev;
100 case DB_88F78XX0_BP_ID:
101 case DB_88F78XX0_BP_REV2_ID:
102 dev = db88f78xx0rev2_twsi_dev;
109 /* Read MPP module ID */
110 i2c_init(CONFIG_SYS_I2C_SPEED, CONFIG_SYS_I2C_SLAVE);
111 ret = i2c_read(dev[dev_num], 0, 1, (u8 *)&data, 1);
118 static int board_modules_scan(void)
121 u32 board_id = board_id_get();
124 /* Perform scan only for DB board */
125 if ((board_id == DB_88F78XX0_BP_ID) ||
126 (board_id == DB_88F78XX0_BP_REV2_ID)) {
127 /* reset modules flags */
130 i2c_init(CONFIG_SYS_I2C_SPEED, CONFIG_SYS_I2C_SLAVE);
132 /* SERDES module (only PEX model is supported now) */
133 ret = i2c_read(MV_BOARD_PEX_MODULE_ADDR, 0, 1, (u8 *)&val, 1);
137 if (val == MV_BOARD_PEX_MODULE_ID)
138 config_module = PEX_MODULE_DETECT;
139 if (val == MV_BOARD_ETM_MODULE_ID)
140 config_module = ETM_MODULE_DETECT;
141 } else if (board_id == RD_78460_NAS_ID) {
143 if ((reg_read(GPP_DATA_IN_REG(2)) & MV_GPP66) == 0x0)
150 u32 pex_max_unit_get(void)
154 * Right now only MV78460 is supported. Other SoC's might need
155 * a different value here.
157 return MV_PEX_MAX_UNIT;
160 u32 pex_max_if_get(void)
164 * Right now only MV78460 is supported. Other SoC's might need
165 * a different value here.
167 return MV_PEX_MAX_IF;
170 u8 board_cpu_freq_get(void)
175 sar = reg_read(MPP_SAMPLE_AT_RESET(0));
176 sar_msb = reg_read(MPP_SAMPLE_AT_RESET(1));
177 return ((sar_msb & 0x100000) >> 17) | ((sar & 0xe00000) >> 21);
180 __weak MV_BIN_SERDES_CFG *board_serdes_cfg_get(u8 pex_mode)
183 u32 serdes_cfg_val = 0; /* default */
185 board_id = board_id_get();
193 return &serdes_info_tbl[board_id - BOARD_ID_BASE][serdes_cfg_val];
196 u16 ctrl_model_get(void)
199 * SoC version can't be autodetected. So we need to rely on a define
200 * from the config system here.
202 #if defined(CONFIG_MV78230)
203 return MV_78230_DEV_ID;
204 #elif defined(CONFIG_MV78260)
205 return MV_78260_DEV_ID;
207 return MV_78460_DEV_ID;
211 u32 get_line_cfg(u32 line_num, MV_BIN_SERDES_CFG *info)
214 return (info->line0_7 >> (line_num << 2)) & 0xF;
216 return (info->line8_15 >> ((line_num - 8) << 2)) & 0xF;
219 static int serdes_max_lines_get(void)
221 switch (ctrl_model_get()) {
222 case MV_78230_DEV_ID:
224 case MV_78260_DEV_ID:
226 case MV_78460_DEV_ID:
233 int serdes_phy_config(void)
238 /* addr/value for each line @ every setup step */
239 u32 addr[16][11], val[16][11];
240 u8 pex_unit, pex_line_num;
245 MV_BIN_SERDES_CFG *info;
250 u32 rx_high_imp_mode;
256 * Get max. serdes lines count
258 max_serdes_lines = serdes_max_lines_get();
259 if (max_serdes_lines == 0)
262 satr11 = board_sat_r_get(1, 1);
263 if ((u8) MV_ERROR == (u8) satr11)
266 board_modules_scan();
267 memset(addr, 0, sizeof(addr));
268 memset(val, 0, sizeof(val));
270 /* Check if DRAM is already initialized */
271 if (reg_read(REG_BOOTROM_ROUTINE_ADDR) &
272 (1 << REG_BOOTROM_ROUTINE_DRAM_INIT_OFFS)) {
273 DEBUG_INIT_S("High speed PHY - Version: ");
274 DEBUG_INIT_S(SERDES_VERION);
275 DEBUG_INIT_S(" - 2nd boot - Skip\n");
278 DEBUG_INIT_S("High speed PHY - Version: ");
279 DEBUG_INIT_S(SERDES_VERION);
280 DEBUG_INIT_S(" (COM-PHY-V20)\n");
283 * AVS : disable AVS for frequency less than 1333
285 freq = board_cpu_freq_get();
286 device_rev = mv_ctrl_rev_get();
288 if (device_rev == 2) { /* for B0 only */
291 cpu_avs = reg_read(CPU_AVS_CONTROL2_REG);
292 DEBUG_RD_REG(CPU_AVS_CONTROL2_REG, cpu_avs);
293 cpu_avs &= ~(1 << 9);
295 if ((0x4 == freq) || (0xB == freq)) {
298 tmp2 = reg_read(CPU_AVS_CONTROL0_REG);
299 DEBUG_RD_REG(CPU_AVS_CONTROL0_REG, tmp2);
300 /* cpu upper limit = 1.1V cpu lower limit = 0.9125V */
302 reg_write(CPU_AVS_CONTROL0_REG, tmp2);
303 DEBUG_WR_REG(CPU_AVS_CONTROL0_REG, tmp2);
304 cpu_avs |= (1 << 9); /* cpu avs enable */
305 cpu_avs |= (1 << 18); /* AvsAvddDetEn enable */
306 fabric_freq = (reg_read(MPP_SAMPLE_AT_RESET(0)) &
307 SAR0_FABRIC_FREQ_MASK) >> SAR0_FABRIC_FREQ_OFFSET;
308 if ((0xB == freq) && (5 == fabric_freq)) {
311 core_avs = reg_read(CORE_AVS_CONTROL_0REG);
312 DEBUG_RD_REG(CORE_AVS_CONTROL_0REG, core_avs);
315 * Set core lower limit = 0.9V &
316 * core upper limit = 0.9125V
320 reg_write(CORE_AVS_CONTROL_0REG, core_avs);
321 DEBUG_WR_REG(CORE_AVS_CONTROL_0REG, core_avs);
323 core_avs = reg_read(CORE_AVS_CONTROL_2REG);
324 DEBUG_RD_REG(CORE_AVS_CONTROL_2REG, core_avs);
325 core_avs |= (1 << 9); /* core AVS enable */
326 reg_write(CORE_AVS_CONTROL_2REG, core_avs);
327 DEBUG_WR_REG(CORE_AVS_CONTROL_2REG, core_avs);
329 tmp2 = reg_read(GENERAL_PURPOSE_RESERVED0_REG);
330 DEBUG_RD_REG(GENERAL_PURPOSE_RESERVED0_REG,
332 tmp2 |= 0x1; /* AvsCoreAvddDetEn enable */
333 reg_write(GENERAL_PURPOSE_RESERVED0_REG, tmp2);
334 DEBUG_WR_REG(GENERAL_PURPOSE_RESERVED0_REG,
338 reg_write(CPU_AVS_CONTROL2_REG, cpu_avs);
339 DEBUG_WR_REG(CPU_AVS_CONTROL2_REG, cpu_avs);
342 info = board_serdes_cfg_get(PEX_MODE_GET(satr11));
343 DEBUG_INIT_FULL_S("info->line0_7= 0x");
344 DEBUG_INIT_FULL_D(info->line0_7, 8);
345 DEBUG_INIT_FULL_S(" info->line8_15= 0x");
346 DEBUG_INIT_FULL_D(info->line8_15, 8);
347 DEBUG_INIT_FULL_S("\n");
350 DEBUG_INIT_S("Hight speed PHY Error #1\n");
354 if (config_module & ETM_MODULE_DETECT) { /* step 0.9 ETM */
355 DEBUG_INIT_FULL_S("ETM module detect Step 0.9:\n");
356 reg_write(SERDES_LINE_MUX_REG_0_7, 0x11111111);
357 DEBUG_WR_REG(SERDES_LINE_MUX_REG_0_7, 0x11111111);
358 info->pex_mode[1] = PEX_BUS_DISABLED; /* pex unit 1 is configure for ETM */
360 reg_write(PEX_PHY_ACCESS_REG(1), (0x002 << 16) | 0xf44d); /* SETM0 - start calibration */
361 DEBUG_WR_REG(PEX_PHY_ACCESS_REG(1), (0x002 << 16) | 0xf44d); /* SETM0 - start calibration */
362 reg_write(PEX_PHY_ACCESS_REG(1), (0x302 << 16) | 0xf44d); /* SETM1 - start calibration */
363 DEBUG_WR_REG(PEX_PHY_ACCESS_REG(1), (0x302 << 16) | 0xf44d); /* SETM1 - start calibration */
364 reg_write(PEX_PHY_ACCESS_REG(1), (0x001 << 16) | 0xf801); /* SETM0 - SATA mode & 25MHz ref clk */
365 DEBUG_WR_REG(PEX_PHY_ACCESS_REG(1), (0x001 << 16) | 0xf801); /* SETM0 - SATA mode & 25MHz ref clk */
366 reg_write(PEX_PHY_ACCESS_REG(1), (0x301 << 16) | 0xf801); /* SETM1 - SATA mode & 25MHz ref clk */
367 DEBUG_WR_REG(PEX_PHY_ACCESS_REG(1), (0x301 << 16) | 0xf801); /* SETM1 - SATA mode & 25MHz ref clk */
368 reg_write(PEX_PHY_ACCESS_REG(1), (0x011 << 16) | 0x0BFF); /* SETM0 - G3 full swing AMP */
369 DEBUG_WR_REG(PEX_PHY_ACCESS_REG(1), (0x011 << 16) | 0x0BFF); /* SETM0 - G3 full swing AMP */
370 reg_write(PEX_PHY_ACCESS_REG(1), (0x311 << 16) | 0x0BFF); /* SETM1 - G3 full swing AMP */
371 DEBUG_WR_REG(PEX_PHY_ACCESS_REG(1), (0x311 << 16) | 0x0BFF); /* SETM1 - G3 full swing AMP */
372 reg_write(PEX_PHY_ACCESS_REG(1), (0x023 << 16) | 0x0800); /* SETM0 - 40 data bit width */
373 DEBUG_WR_REG(PEX_PHY_ACCESS_REG(1), (0x023 << 16) | 0x0800); /* SETM0 - 40 data bit width */
374 reg_write(PEX_PHY_ACCESS_REG(1), (0x323 << 16) | 0x0800); /* SETM1 - 40 data bit width */
375 DEBUG_WR_REG(PEX_PHY_ACCESS_REG(1), (0x323 << 16) | 0x0800); /* SETM1 - 40 data bit width */
376 reg_write(PEX_PHY_ACCESS_REG(1), (0x046 << 16) | 0x0400); /* lane0(serdes4) */
377 DEBUG_WR_REG(PEX_PHY_ACCESS_REG(1), (0x046 << 16) | 0x0400); /* lane0(serdes4) */
378 reg_write(PEX_PHY_ACCESS_REG(1), (0x346 << 16) | 0x0400); /* lane3(serdes7) */
379 DEBUG_WR_REG(PEX_PHY_ACCESS_REG(1), (0x346 << 16) | 0x0400); /* lane3(serdes7) */
382 /* STEP -1 [PEX-Only] First phase of PEX-PIPE Configuration: */
383 DEBUG_INIT_FULL_S("Step 1: First phase of PEX-PIPE Configuration\n");
384 for (pex_unit = 0; pex_unit < pex_max_unit_get(); pex_unit++) {
385 if (info->pex_mode[pex_unit] == PEX_BUS_DISABLED)
388 /* 1. GLOB_CLK_CTRL Reset and Clock Control */
389 reg_write(PEX_PHY_ACCESS_REG(pex_unit), (0xC1 << 16) | 0x25);
390 DEBUG_WR_REG(PEX_PHY_ACCESS_REG(pex_unit), (0xC1 << 16) | 0x25);
392 /* 2. GLOB_TEST_CTRL Test Mode Control */
393 if (info->pex_mode[pex_unit] == PEX_BUS_MODE_X4) {
394 reg_write(PEX_PHY_ACCESS_REG(pex_unit),
395 (0xC2 << 16) | 0x200);
396 DEBUG_WR_REG(PEX_PHY_ACCESS_REG(pex_unit),
397 (0xC2 << 16) | 0x200);
400 /* 3. GLOB_CLK_SRC_LO Clock Source Low */
401 if (info->pex_mode[pex_unit] == PEX_BUS_MODE_X1) {
402 reg_write(PEX_PHY_ACCESS_REG(pex_unit),
403 (0xC3 << 16) | 0x0F);
404 DEBUG_WR_REG(PEX_PHY_ACCESS_REG(pex_unit),
405 (0xC3 << 16) | 0x0F);
408 reg_write(PEX_PHY_ACCESS_REG(pex_unit), (0xC5 << 16) | 0x11F);
409 DEBUG_WR_REG(PEX_PHY_ACCESS_REG(pex_unit),
410 (0xC5 << 16) | 0x11F);
414 * 2 Configure the desire PIN_PHY_GEN and do power down to the PU_PLL,
415 * PU_RX,PU_TX. (bits[12:5])
417 DEBUG_INIT_FULL_S("Step 2: Configure the desire PIN_PHY_GEN\n");
418 for (line_num = 0; line_num < max_serdes_lines; line_num++) {
419 line_cfg = get_line_cfg(line_num, info);
420 if (line_cfg == serdes_cfg[line_num][SERDES_UNIT_UNCONNECTED])
422 if (line_cfg == serdes_cfg[line_num][SERDES_UNIT_PEX])
424 if (line_cfg == serdes_cfg[line_num][SERDES_UNIT_SATA]) {
435 ("SATA port error for serdes line: ",
439 tmp = reg_read(SATA_LP_PHY_EXT_CTRL_REG(sata_port));
440 DEBUG_RD_REG(SATA_LP_PHY_EXT_CTRL_REG(sata_port), tmp);
441 tmp &= ~((0x1ff << 5) | 0x7);
442 tmp |= ((info->bus_speed & (1 << line_num)) != 0) ?
445 reg_write(SATA_LP_PHY_EXT_CTRL_REG(sata_port), tmp);
446 DEBUG_WR_REG(SATA_LP_PHY_EXT_CTRL_REG(sata_port), tmp);
449 if (line_cfg == serdes_cfg[line_num][SERDES_UNIT_QSGMII]) {
451 * 4) Configure the desire PIN_PHY_GEN and do power
452 * down to the PU_PLL,PU_RX,PU_TX. (bits[12:5])
454 tmp = reg_read(SGMII_SERDES_CFG_REG(0));
455 DEBUG_RD_REG(SGMII_SERDES_CFG_REG(0), tmp);
456 tmp &= ~((0x1ff << 5) | 0x7);
458 reg_write(SGMII_SERDES_CFG_REG(0), tmp);
459 DEBUG_WR_REG(SGMII_SERDES_CFG_REG(0), tmp);
463 if (line_cfg == serdes_cfg[line_num][SERDES_UNIT_SGMII0])
465 else if (line_cfg == serdes_cfg[line_num][SERDES_UNIT_SGMII1])
467 else if (line_cfg == serdes_cfg[line_num][SERDES_UNIT_SGMII2])
469 else if (line_cfg == serdes_cfg[line_num][SERDES_UNIT_SGMII3])
474 tmp = reg_read(SGMII_SERDES_CFG_REG(sgmii_port));
475 DEBUG_RD_REG(SGMII_SERDES_CFG_REG(sgmii_port), tmp);
476 tmp &= ~((0x1ff << 5) | 0x7);
477 tmp |= (((info->bus_speed & (1 << line_num)) != 0) ?
478 (0x88 << 5) : (0x66 << 5));
479 reg_write(SGMII_SERDES_CFG_REG(sgmii_port), tmp);
480 DEBUG_WR_REG(SGMII_SERDES_CFG_REG(sgmii_port), tmp);
483 /* Step 3 - QSGMII enable */
484 DEBUG_INIT_FULL_S("Step 3 QSGMII enable\n");
485 for (line_num = 0; line_num < max_serdes_lines; line_num++) {
486 line_cfg = get_line_cfg(line_num, info);
487 if (line_cfg == serdes_cfg[line_num][SERDES_UNIT_QSGMII]) {
488 /* QSGMII Active bit set to true */
489 tmp = reg_read(QSGMII_CONTROL_1_REG);
490 DEBUG_RD_REG(QSGMII_CONTROL_1_REG, tmp);
492 #ifdef ERRATA_GL_6572255
495 reg_write(QSGMII_CONTROL_1_REG, tmp);
496 DEBUG_WR_REG(QSGMII_CONTROL_1_REG, tmp);
500 /* Step 4 - configure SERDES MUXes */
501 DEBUG_INIT_FULL_S("Step 4: Configure SERDES MUXes\n");
502 if (config_module & ETM_MODULE_DETECT) {
503 reg_write(SERDES_LINE_MUX_REG_0_7, 0x40041111);
504 DEBUG_WR_REG(SERDES_LINE_MUX_REG_0_7, 0x40041111);
506 reg_write(SERDES_LINE_MUX_REG_0_7, info->line0_7);
507 DEBUG_WR_REG(SERDES_LINE_MUX_REG_0_7, info->line0_7);
509 reg_write(SERDES_LINE_MUX_REG_8_15, info->line8_15);
510 DEBUG_WR_REG(SERDES_LINE_MUX_REG_8_15, info->line8_15);
512 /* Step 5: Activate the RX High Impedance Mode */
513 DEBUG_INIT_FULL_S("Step 5: Activate the RX High Impedance Mode\n");
514 rx_high_imp_mode = 0x8080;
515 if (device_rev == 2) /* for B0 only */
516 rx_high_imp_mode |= 4;
518 for (line_num = 0; line_num < max_serdes_lines; line_num++) {
519 /* for each serdes lane */
520 DEBUG_INIT_FULL_S("SERDES ");
521 DEBUG_INIT_FULL_D_10(line_num, 2);
522 line_cfg = get_line_cfg(line_num, info);
523 if (line_cfg == serdes_cfg[line_num][SERDES_UNIT_UNCONNECTED]) {
524 DEBUG_INIT_FULL_S(" unconnected ***\n");
527 if (line_cfg == serdes_cfg[line_num][SERDES_UNIT_PEX]) {
528 pex_unit = line_num >> 2;
529 pex_line_num = line_num % 4;
530 DEBUG_INIT_FULL_S(" - PEX unit ");
531 DEBUG_INIT_FULL_D_10(pex_unit, 1);
532 DEBUG_INIT_FULL_S(" line= ");
533 DEBUG_INIT_FULL_D_10(pex_line_num, 1);
534 DEBUG_INIT_FULL_S("\n");
536 /* Needed for PEX_PHY_ACCESS_REG macro */
537 if ((line_num > 7) &&
538 (info->pex_mode[3] == PEX_BUS_MODE_X8))
539 /* lines 8 - 15 are belong to PEX3 in x8 mode */
542 if (info->pex_mode[pex_unit] == PEX_BUS_DISABLED)
546 * 8) Activate the RX High Impedance Mode field
547 * (bit [2]) in register /PCIe_USB Control (Each MAC
548 * contain different Access to reach its
550 * [PEX-Only] Set bit[12]: The analog part latches idle
551 * if PU_TX = 1 and PU_PLL =1.
554 /* Termination enable */
555 if (info->pex_mode[pex_unit] == PEX_BUS_MODE_X1) {
556 in_direct = (0x48 << 16) | (pex_line_num << 24) |
557 0x1000 | rx_high_imp_mode; /* x1 */
558 } else if ((info->pex_mode[pex_unit] ==
559 PEX_BUS_MODE_X4) && (pex_line_num == 0))
560 in_direct = (0x48 << 16) | (pex_line_num << 24) |
561 0x1000 | (rx_high_imp_mode & 0xff); /* x4 */
566 reg_write(PEX_PHY_ACCESS_REG(pex_unit),
568 DEBUG_WR_REG(PEX_PHY_ACCESS_REG(pex_unit),
575 if (line_cfg == serdes_cfg[line_num][SERDES_UNIT_SATA]) {
577 * port 0 for serdes lines 4,6, and port 1 for
580 sata_port = line_num & 1;
581 DEBUG_INIT_FULL_S(" - SATA port ");
582 DEBUG_INIT_FULL_D_10(sata_port, 2);
583 DEBUG_INIT_FULL_S("\n");
584 reg_write(SATA_COMPHY_CTRL_REG(sata_port),
586 DEBUG_WR_REG(SATA_COMPHY_CTRL_REG(sata_port),
591 if (line_cfg == serdes_cfg[line_num][SERDES_UNIT_QSGMII]) {
592 DEBUG_INIT_FULL_S(" - QSGMII\n");
593 reg_write(SGMII_COMPHY_CTRL_REG(0), rx_high_imp_mode);
594 DEBUG_WR_REG(SGMII_COMPHY_CTRL_REG(0),
599 if (line_cfg == serdes_cfg[line_num][SERDES_UNIT_SGMII0])
601 else if (line_cfg == serdes_cfg[line_num][SERDES_UNIT_SGMII1])
603 else if (line_cfg == serdes_cfg[line_num][SERDES_UNIT_SGMII2])
605 else if (line_cfg == serdes_cfg[line_num][SERDES_UNIT_SGMII3])
609 DEBUG_INIT_FULL_S(" - SGMII port ");
610 DEBUG_INIT_FULL_D_10(sgmii_port, 2);
611 DEBUG_INIT_FULL_S("\n");
612 reg_write(SGMII_COMPHY_CTRL_REG(sgmii_port), rx_high_imp_mode);
613 DEBUG_WR_REG(SGMII_COMPHY_CTRL_REG(sgmii_port),
615 } /* for each serdes lane */
617 /* Step 6 [PEX-Only] PEX-Main configuration (X4 or X1): */
618 DEBUG_INIT_FULL_S("Step 6: [PEX-Only] PEX-Main configuration (X4 or X1)\n");
619 tmp = reg_read(SOC_CTRL_REG);
620 DEBUG_RD_REG(SOC_CTRL_REG, tmp);
622 if (info->pex_mode[0] == PEX_BUS_MODE_X1)
623 tmp |= PCIE0_QUADX1_EN;
624 if (info->pex_mode[1] == PEX_BUS_MODE_X1)
625 tmp |= PCIE1_QUADX1_EN;
626 if (((reg_read(MPP_SAMPLE_AT_RESET(0)) & PEX_CLK_100MHZ_MASK) >>
627 PEX_CLK_100MHZ_OFFSET) == 0x1)
628 tmp |= (PCIE0_CLK_OUT_EN_MASK | PCIE1_CLK_OUT_EN_MASK);
630 reg_write(SOC_CTRL_REG, tmp);
631 DEBUG_WR_REG(SOC_CTRL_REG, tmp);
633 /* 6.2 PCI Express Link Capabilities */
634 DEBUG_INIT_FULL_S("Step 6.2: [PEX-Only] PCI Express Link Capabilities\n");
636 for (line_num = 0; line_num < max_serdes_lines; line_num++) {
637 line_cfg = get_line_cfg(line_num, info);
639 if (line_cfg == serdes_cfg[line_num][SERDES_UNIT_PEX]) {
641 * PCI Express Control
646 pex_unit = line_num >> 2;
647 pex_if = MV_SERDES_NUM_TO_PEX_NUM(line_num);
648 if (info->pex_mode[pex_unit] == PEX_BUS_DISABLED)
651 /* set Common Clock Configuration */
652 tmp = reg_read(PEX_LINK_CTRL_STATUS_REG(pex_if));
653 DEBUG_RD_REG(PEX_LINK_CTRL_STATUS_REG(pex_if), tmp);
655 reg_write(PEX_LINK_CTRL_STATUS_REG(pex_if), tmp);
656 DEBUG_WR_REG(PEX_LINK_CTRL_STATUS_REG(pex_if), tmp);
658 tmp = reg_read(PEX_LINK_CAPABILITIES_REG(pex_if));
659 DEBUG_RD_REG(PEX_LINK_CAPABILITIES_REG(pex_if), tmp);
661 if (info->pex_mode[pex_unit] == PEX_BUS_MODE_X1)
663 if (info->pex_mode[pex_unit] == PEX_BUS_MODE_X4)
665 if (0 == PEX_CAPABILITY_GET(satr11))
669 DEBUG_INIT_FULL_S("Step 6.2: PEX ");
670 DEBUG_INIT_FULL_D(pex_if, 1);
671 DEBUG_INIT_FULL_C(" set GEN", (tmp & 3), 1);
672 reg_write(PEX_LINK_CAPABILITIES_REG(pex_if), tmp);
673 DEBUG_WR_REG(PEX_LINK_CAPABILITIES_REG(pex_if), tmp);
676 * If pex is X4, no need to pass thru the other
679 if (info->pex_mode[pex_unit] == PEX_BUS_MODE_X4)
685 * Step 7 [PEX-X4 Only] To create PEX-Link that contain 4-lanes you
686 * need to config the register SOC_Misc/General Purpose2
689 DEBUG_INIT_FULL_S("Step 7: [PEX-X4 Only] To create PEX-Link\n");
690 tmp = reg_read(GEN_PURP_RES_2_REG);
691 DEBUG_RD_REG(GEN_PURP_RES_2_REG, tmp);
694 if (info->pex_mode[0] == PEX_BUS_MODE_X4)
697 if (info->pex_mode[1] == PEX_BUS_MODE_X4)
700 if (info->pex_mode[2] == PEX_BUS_MODE_X4)
703 if (info->pex_mode[3] == PEX_BUS_MODE_X4)
706 reg_write(GEN_PURP_RES_2_REG, tmp);
707 DEBUG_WR_REG(GEN_PURP_RES_2_REG, tmp);
709 /* Steps 8 , 9 ,10 - use prepared REG addresses and values */
710 DEBUG_INIT_FULL_S("Steps 7,8,9,10 and 11\n");
712 /* Prepare PHY parameters for each step according to MUX selection */
713 for (line_num = 0; line_num < max_serdes_lines; line_num++) {
714 /* for each serdes lane */
716 line_cfg = get_line_cfg(line_num, info);
718 if (line_cfg == serdes_cfg[line_num][SERDES_UNIT_UNCONNECTED])
721 if (line_cfg == serdes_cfg[line_num][SERDES_UNIT_PEX]) {
722 pex_unit = line_num >> 2;
723 pex_line_num = line_num % 4;
725 if (info->pex_mode[pex_unit] == PEX_BUS_DISABLED)
728 * 8) Configure the desire PHY_MODE (bits [7:5])
729 * and REF_FREF_SEL (bits[4:0]) in the register Power
730 * and PLL Control (Each MAC contain different Access
731 * to reach its Serdes-Regfile).
733 if (((info->pex_mode[pex_unit] == PEX_BUS_MODE_X4) &&
735 || ((info->pex_mode[pex_unit] == PEX_BUS_MODE_X1))) {
736 reg_write(PEX_PHY_ACCESS_REG(pex_unit),
737 (0x01 << 16) | (pex_line_num << 24) |
739 DEBUG_WR_REG(PEX_PHY_ACCESS_REG(pex_unit),
740 (0x01 << 16) | (pex_line_num << 24)
743 * Step 8.1: [PEX-Only] Configure Max PLL Rate
744 * (bit 8 in KVCO Calibration Control and
747 /* Use Maximum PLL Rate(Bit 8) */
748 reg_write(PEX_PHY_ACCESS_REG(pex_unit),
749 (0x02 << 16) | (1 << 31) |
750 (pex_line_num << 24)); /* read command */
751 DEBUG_WR_REG(PEX_PHY_ACCESS_REG(pex_unit),
752 (0x02 << 16) | (1 << 31) |
753 (pex_line_num << 24));
754 tmp = reg_read(PEX_PHY_ACCESS_REG(pex_unit));
755 DEBUG_RD_REG(PEX_PHY_ACCESS_REG(pex_unit), tmp);
758 reg_write(PEX_PHY_ACCESS_REG(pex_unit), tmp);
759 DEBUG_WR_REG(PEX_PHY_ACCESS_REG(pex_unit), tmp);
761 /* Use Maximum PLL Rate(Bits [10:9]) */
762 reg_write(PEX_PHY_ACCESS_REG(pex_unit),
763 (0x81 << 16) | (1 << 31) |
764 (pex_line_num << 24)); /* read command */
765 DEBUG_WR_REG(PEX_PHY_ACCESS_REG(pex_unit),
766 (0x81 << 16) | (1 << 31) |
767 (pex_line_num << 24));
768 tmp = reg_read(PEX_PHY_ACCESS_REG(pex_unit));
769 DEBUG_RD_REG(PEX_PHY_ACCESS_REG(pex_unit), tmp);
772 reg_write(PEX_PHY_ACCESS_REG(pex_unit), tmp);
773 DEBUG_WR_REG(PEX_PHY_ACCESS_REG(pex_unit), tmp);
779 if (line_cfg == serdes_cfg[line_num][SERDES_UNIT_SATA]) {
781 * Port 0 for serdes lines 4,6, and port 1 for serdes
784 sata_port = line_num & 1;
787 * 8) Configure the desire PHY_MODE (bits [7:5]) and
788 * REF_FREF_SEL (bits[4:0]) in the register Power
789 * and PLL Control (Each MAC contain different Access
790 * to reach its Serdes-Regfile).
792 reg_write(SATA_PWR_PLL_CTRL_REG(sata_port), 0xF801);
793 DEBUG_WR_REG(SATA_PWR_PLL_CTRL_REG(sata_port), 0xF801);
795 /* 9) Configure the desire SEL_BITS */
796 reg_write(SATA_DIG_LP_ENA_REG(sata_port), 0x400);
797 DEBUG_WR_REG(SATA_DIG_LP_ENA_REG(sata_port), 0x400);
799 /* 10) Configure the desire REFCLK_SEL */
801 reg_write(SATA_REF_CLK_SEL_REG(sata_port), 0x400);
802 DEBUG_WR_REG(SATA_REF_CLK_SEL_REG(sata_port), 0x400);
804 /* 11) Power up to the PU_PLL,PU_RX,PU_TX. */
805 tmp = reg_read(SATA_LP_PHY_EXT_CTRL_REG(sata_port));
806 DEBUG_RD_REG(SATA_LP_PHY_EXT_CTRL_REG(sata_port), tmp);
808 reg_write(SATA_LP_PHY_EXT_CTRL_REG(sata_port), tmp);
809 DEBUG_WR_REG(SATA_LP_PHY_EXT_CTRL_REG(sata_port), tmp);
814 if (line_cfg == serdes_cfg[line_num][SERDES_UNIT_QSGMII]) {
816 * 8) Configure the desire PHY_MODE (bits [7:5])
817 * and REF_FREF_SEL (bits[4:0]) in the register
819 reg_write(SGMII_PWR_PLL_CTRL_REG(0), 0xF881);
820 DEBUG_WR_REG(SGMII_PWR_PLL_CTRL_REG(0), 0xF881);
823 * 9) Configure the desire SEL_BITS (bits [11:0]
826 reg_write(SGMII_DIG_LP_ENA_REG(0), 0x400);
827 DEBUG_WR_REG(SGMII_DIG_LP_ENA_REG(0), 0x400);
830 * 10) Configure the desire REFCLK_SEL (bit [10])
833 reg_write(SGMII_REF_CLK_SEL_REG(0), 0x400);
834 DEBUG_WR_REG(SGMII_REF_CLK_SEL_REG(0), 0x400);
836 /* 11) Power up to the PU_PLL,PU_RX,PU_TX. */
837 tmp = reg_read(SGMII_SERDES_CFG_REG(0));
838 DEBUG_RD_REG(SGMII_SERDES_CFG_REG(0), tmp);
840 reg_write(SGMII_SERDES_CFG_REG(0), tmp);
841 DEBUG_WR_REG(SGMII_SERDES_CFG_REG(0), tmp);
845 if (line_cfg == serdes_cfg[line_num][SERDES_UNIT_SGMII0])
847 else if (line_cfg == serdes_cfg[line_num][SERDES_UNIT_SGMII1])
849 else if (line_cfg == serdes_cfg[line_num][SERDES_UNIT_SGMII2])
851 else if (line_cfg == serdes_cfg[line_num][SERDES_UNIT_SGMII3])
857 * 8) Configure the desire PHY_MODE (bits [7:5]) and
858 * REF_FREF_SEL (bits[4:0]) in the register
860 reg_write(SGMII_PWR_PLL_CTRL_REG(sgmii_port), 0xF881);
861 DEBUG_WR_REG(SGMII_PWR_PLL_CTRL_REG(sgmii_port), 0xF881);
863 /* 9) Configure the desire SEL_BITS (bits [11:0] in register */
864 reg_write(SGMII_DIG_LP_ENA_REG(sgmii_port), 0);
865 DEBUG_WR_REG(SGMII_DIG_LP_ENA_REG(sgmii_port), 0);
867 /* 10) Configure the desire REFCLK_SEL (bit [10]) in register */
868 reg_write(SGMII_REF_CLK_SEL_REG(sgmii_port), 0x400);
869 DEBUG_WR_REG(SGMII_REF_CLK_SEL_REG(sgmii_port), 0x400);
871 /* 11) Power up to the PU_PLL,PU_RX,PU_TX. */
872 tmp = reg_read(SGMII_SERDES_CFG_REG(sgmii_port));
873 DEBUG_RD_REG(SGMII_SERDES_CFG_REG(sgmii_port), tmp);
875 reg_write(SGMII_SERDES_CFG_REG(sgmii_port), tmp);
876 DEBUG_WR_REG(SGMII_SERDES_CFG_REG(sgmii_port), tmp);
878 } /* for each serdes lane */
880 /* Step 12 [PEX-Only] Last phase of PEX-PIPE Configuration */
881 DEBUG_INIT_FULL_S("Steps 12: [PEX-Only] Last phase of PEX-PIPE Configuration\n");
882 for (line_num = 0; line_num < max_serdes_lines; line_num++) {
883 /* for each serdes lane */
885 line_cfg = get_line_cfg(line_num, info);
887 if (line_cfg == serdes_cfg[line_num][SERDES_UNIT_UNCONNECTED])
890 if (line_cfg == serdes_cfg[line_num][SERDES_UNIT_PEX]) {
891 pex_unit = line_num >> 2;
892 pex_line_num = line_num % 4;
893 if (0 == pex_line_num) {
894 reg_write(PEX_PHY_ACCESS_REG(pex_unit),
895 (0xC1 << 16) | 0x24);
896 DEBUG_WR_REG(PEX_PHY_ACCESS_REG(pex_unit),
897 (0xC1 << 16) | 0x24);
902 /*--------------------------------------------------------------*/
903 /* Step 13: Wait 15ms before checking results */
904 DEBUG_INIT_FULL_S("Steps 13: Wait 15ms before checking results");
909 for (line_num = 0; line_num < max_serdes_lines; line_num++) {
911 line_cfg = get_line_cfg(line_num, info);
913 serdes_cfg[line_num][SERDES_UNIT_UNCONNECTED])
916 if (line_cfg == serdes_cfg[line_num][SERDES_UNIT_PEX])
919 if (line_cfg == serdes_cfg[line_num][SERDES_UNIT_SATA]) {
921 * Port 0 for serdes lines 4,6, and port 1
924 sata_port = line_num & 1;
927 reg_read(SATA_LP_PHY_EXT_STAT_REG
929 DEBUG_RD_REG(SATA_LP_PHY_EXT_STAT_REG
931 if ((tmp & 0x7) != 0x7)
937 serdes_cfg[line_num][SERDES_UNIT_QSGMII]) {
938 tmp = reg_read(SGMII_SERDES_STAT_REG(0));
939 DEBUG_RD_REG(SGMII_SERDES_STAT_REG(0), tmp);
940 if ((tmp & 0x7) != 0x7)
946 serdes_cfg[line_num][SERDES_UNIT_SGMII0])
949 serdes_cfg[line_num][SERDES_UNIT_SGMII1])
952 serdes_cfg[line_num][SERDES_UNIT_SGMII2])
955 serdes_cfg[line_num][SERDES_UNIT_SGMII3])
960 tmp = reg_read(SGMII_SERDES_STAT_REG(sgmii_port));
961 DEBUG_RD_REG(SGMII_SERDES_STAT_REG(sgmii_port), tmp);
962 if ((tmp & 0x7) != 0x7)
973 * Step14 [PEX-Only] In order to configure RC/EP mode please write
974 * to register 0x0060 bits
976 DEBUG_INIT_FULL_S("Steps 14: [PEX-Only] In order to configure\n");
977 for (pex_unit = 0; pex_unit < pex_max_unit_get(); pex_unit++) {
978 if (info->pex_mode[pex_unit] == PEX_BUS_DISABLED)
981 reg_read(PEX_CAPABILITIES_REG(MV_PEX_UNIT_TO_IF(pex_unit)));
982 DEBUG_RD_REG(PEX_CAPABILITIES_REG(MV_PEX_UNIT_TO_IF(pex_unit)),
985 if (info->pex_type == MV_PEX_ROOT_COMPLEX)
989 reg_write(PEX_CAPABILITIES_REG(MV_PEX_UNIT_TO_IF(pex_unit)),
991 DEBUG_WR_REG(PEX_CAPABILITIES_REG(MV_PEX_UNIT_TO_IF(pex_unit)),
996 * Step 15 [PEX-Only] Only for EP mode set to Zero bits 19 and 16 of
999 DEBUG_INIT_FULL_S("Steps 15: [PEX-Only] In order to configure\n");
1000 for (pex_unit = 0; pex_unit < pex_max_unit_get(); pex_unit++) {
1001 if (info->pex_mode[pex_unit] == PEX_BUS_DISABLED)
1003 if (info->pex_type == MV_PEX_END_POINT) {
1005 reg_read(PEX_DBG_CTRL_REG
1006 (MV_PEX_UNIT_TO_IF(pex_unit)));
1007 DEBUG_RD_REG(PEX_DBG_CTRL_REG
1008 (MV_PEX_UNIT_TO_IF(pex_unit)), tmp);
1010 reg_write(PEX_DBG_CTRL_REG(MV_PEX_UNIT_TO_IF(pex_unit)),
1012 DEBUG_WR_REG(PEX_DBG_CTRL_REG
1013 (MV_PEX_UNIT_TO_IF(pex_unit)), tmp);
1017 if (info->serdes_m_phy_change) {
1018 MV_SERDES_CHANGE_M_PHY *serdes_m_phy_change;
1020 for (line_num = 0; line_num < max_serdes_lines; line_num++) {
1021 line_cfg = get_line_cfg(line_num, info);
1023 serdes_cfg[line_num][SERDES_UNIT_UNCONNECTED])
1025 serdes_m_phy_change = info->serdes_m_phy_change;
1026 bus_speed = info->bus_speed & (1 << line_num);
1027 while (serdes_m_phy_change->type !=
1028 SERDES_UNIT_UNCONNECTED) {
1029 switch (serdes_m_phy_change->type) {
1030 case SERDES_UNIT_PEX:
1031 if (line_cfg != SERDES_UNIT_PEX)
1033 pex_unit = line_num >> 2;
1034 pex_line_num = line_num % 4;
1035 if (info->pex_mode[pex_unit] ==
1038 if ((info->pex_mode[pex_unit] ==
1039 PEX_BUS_MODE_X4) && pex_line_num)
1043 reg_write(PEX_PHY_ACCESS_REG
1045 (pex_line_num << 24) |
1046 serdes_m_phy_change->val_hi_speed);
1047 DEBUG_WR_REG(PEX_PHY_ACCESS_REG
1051 serdes_m_phy_change->val_hi_speed);
1053 reg_write(PEX_PHY_ACCESS_REG
1055 (pex_line_num << 24) |
1056 serdes_m_phy_change->val_low_speed);
1057 DEBUG_WR_REG(PEX_PHY_ACCESS_REG
1061 serdes_m_phy_change->val_low_speed);
1064 case SERDES_UNIT_SATA:
1065 if (line_cfg != SERDES_UNIT_SATA)
1068 * Port 0 for serdes lines 4,6, and
1069 * port 1 for serdes lines 5
1071 sata_port = line_num & 1;
1073 reg_write(SATA_BASE_REG
1075 serdes_m_phy_change->reg_hi_speed,
1076 serdes_m_phy_change->val_hi_speed);
1077 DEBUG_WR_REG(SATA_BASE_REG
1079 serdes_m_phy_change->reg_hi_speed,
1080 serdes_m_phy_change->val_hi_speed);
1082 reg_write(SATA_BASE_REG
1084 serdes_m_phy_change->reg_low_speed,
1085 serdes_m_phy_change->val_low_speed);
1086 DEBUG_WR_REG(SATA_BASE_REG
1088 serdes_m_phy_change->reg_low_speed,
1089 serdes_m_phy_change->val_low_speed);
1092 case SERDES_UNIT_SGMII0:
1093 case SERDES_UNIT_SGMII1:
1094 case SERDES_UNIT_SGMII2:
1095 case SERDES_UNIT_SGMII3:
1096 if (line_cfg == serdes_cfg[line_num]
1097 [SERDES_UNIT_SGMII0])
1099 else if (line_cfg ==
1100 serdes_cfg[line_num]
1101 [SERDES_UNIT_SGMII1])
1103 else if (line_cfg ==
1104 serdes_cfg[line_num]
1105 [SERDES_UNIT_SGMII2])
1107 else if (line_cfg ==
1108 serdes_cfg[line_num]
1109 [SERDES_UNIT_SGMII3])
1114 reg_write(MV_ETH_REGS_BASE
1116 serdes_m_phy_change->reg_hi_speed,
1117 serdes_m_phy_change->val_hi_speed);
1118 DEBUG_WR_REG(MV_ETH_REGS_BASE
1120 serdes_m_phy_change->reg_hi_speed,
1121 serdes_m_phy_change->val_hi_speed);
1123 reg_write(MV_ETH_REGS_BASE
1125 serdes_m_phy_change->reg_low_speed,
1126 serdes_m_phy_change->val_low_speed);
1127 DEBUG_WR_REG(MV_ETH_REGS_BASE
1129 serdes_m_phy_change->reg_low_speed,
1130 serdes_m_phy_change->val_low_speed);
1133 case SERDES_UNIT_QSGMII:
1134 if (line_cfg != SERDES_UNIT_QSGMII)
1138 (serdes_m_phy_change->reg_hi_speed,
1139 serdes_m_phy_change->val_hi_speed);
1141 (serdes_m_phy_change->reg_hi_speed,
1142 serdes_m_phy_change->val_hi_speed);
1145 (serdes_m_phy_change->reg_low_speed,
1146 serdes_m_phy_change->val_low_speed);
1148 (serdes_m_phy_change->reg_low_speed,
1149 serdes_m_phy_change->val_low_speed);
1155 serdes_m_phy_change++;
1160 /* Step 16 [PEX-Only] Training Enable */
1161 DEBUG_INIT_FULL_S("Steps 16: [PEX-Only] Training Enable");
1162 tmp = reg_read(SOC_CTRL_REG);
1163 DEBUG_RD_REG(SOC_CTRL_REG, tmp);
1165 for (pex_unit = 0; pex_unit < pex_max_unit_get(); pex_unit++) {
1166 reg_write(PEX_CAUSE_REG(pex_unit), 0);
1167 DEBUG_WR_REG(PEX_CAUSE_REG(pex_unit), 0);
1168 if (info->pex_mode[pex_unit] != PEX_BUS_DISABLED)
1169 tmp |= (0x1 << pex_unit);
1171 reg_write(SOC_CTRL_REG, tmp);
1172 DEBUG_WR_REG(SOC_CTRL_REG, tmp);
1174 /* Step 17: Speed change to target speed and width */
1176 u32 tmp_reg, tmp_pex_reg;
1178 u32 first_busno, next_busno;
1179 u32 max_link_width = 0;
1180 u32 neg_link_width = 0;
1181 pex_if_num = pex_max_if_get();
1183 DEBUG_INIT_FULL_C("step 17: max_if= 0x", pex_if_num, 1);
1185 for (pex_if = 0; pex_if < pex_if_num; pex_if++) {
1186 line_num = (pex_if <= 8) ? pex_if : 12;
1187 line_cfg = get_line_cfg(line_num, info);
1188 if (line_cfg != serdes_cfg[line_num][SERDES_UNIT_PEX])
1190 pex_unit = (pex_if < 9) ? (pex_if >> 2) : 3;
1191 DEBUG_INIT_FULL_S("step 17: PEX");
1192 DEBUG_INIT_FULL_D(pex_if, 1);
1193 DEBUG_INIT_FULL_C(" pex_unit= ", pex_unit, 1);
1195 if (info->pex_mode[pex_unit] == PEX_BUS_DISABLED) {
1196 DEBUG_INIT_FULL_C("PEX disabled interface ",
1202 first_busno = next_busno;
1203 if ((info->pex_type == MV_PEX_END_POINT) &&
1205 if ((pex_if < 8) && (info->pex_mode[pex_unit] ==
1211 tmp = reg_read(PEX_DBG_STATUS_REG(pex_if));
1212 DEBUG_RD_REG(PEX_DBG_STATUS_REG(pex_if), tmp);
1213 if ((tmp & 0x7f) == 0x7e) {
1215 tmp = reg_read(PEX_LINK_CAPABILITIES_REG(pex_if));
1216 max_link_width = tmp;
1217 DEBUG_RD_REG((PEX_LINK_CAPABILITIES_REG
1219 max_link_width = ((max_link_width >> 4) & 0x3F);
1221 reg_read(PEX_LINK_CTRL_STATUS_REG(pex_if));
1222 DEBUG_RD_REG((PEX_LINK_CTRL_STATUS_REG(pex_if)),
1224 neg_link_width = ((neg_link_width >> 20) & 0x3F);
1225 if (max_link_width > neg_link_width) {
1226 tmp &= ~(0x3F << 4);
1227 tmp |= (neg_link_width << 4);
1228 reg_write(PEX_LINK_CAPABILITIES_REG
1230 DEBUG_WR_REG((PEX_LINK_CAPABILITIES_REG
1232 mdelay(1); /* wait 1ms before reading capability for speed */
1233 DEBUG_INIT_S("PEX");
1234 DEBUG_INIT_D(pex_if, 1);
1235 DEBUG_INIT_C(": change width to X",
1239 reg_read((PEX_CFG_DIRECT_ACCESS
1241 PEX_LINK_CAPABILITY_REG)));
1242 DEBUG_RD_REG((PEX_CFG_DIRECT_ACCESS
1244 PEX_LINK_CAPABILITY_REG)),
1246 tmp_pex_reg &= (0xF);
1247 if (tmp_pex_reg == 0x2) {
1250 (PEX_CFG_DIRECT_ACCESS
1252 PEX_LINK_CTRL_STAT_REG)) &
1254 DEBUG_RD_REG(PEX_CFG_DIRECT_ACCESS
1256 PEX_LINK_CTRL_STAT_REG),
1258 /* check if the link established is GEN1 */
1259 if (tmp_reg == 0x1) {
1260 pex_local_bus_num_set(pex_if,
1262 pex_local_dev_num_set(pex_if,
1265 DEBUG_INIT_FULL_S("** Link is Gen1, check the EP capability\n");
1266 /* link is Gen1, check the EP capability */
1268 pex_cfg_read(pex_if,
1272 DEBUG_INIT_FULL_C("pex_cfg_read: return addr=0x%x",
1275 DEBUG_INIT_FULL_C("pex_cfg_read: return 0xff -->PEX (%d): Detected No Link.",
1279 while ((pex_cfg_read
1280 (pex_if, first_busno, 0,
1292 (pex_if, first_busno, 0, 0,
1293 addr + 0xC) & 0xF) >=
1297 (PEX_LINK_CTRL_STATUS2_REG
1300 (PEX_LINK_CTRL_STATUS2_REG
1302 tmp &= ~(0x1 | 1 << 1);
1305 (PEX_LINK_CTRL_STATUS2_REG
1308 (PEX_LINK_CTRL_STATUS2_REG
1319 reg_write(PEX_CTRL_REG
1325 mdelay(10); /* We need to wait 10ms before reading the PEX_DBG_STATUS_REG in order not to read the status of the former state */
1335 DEBUG_INIT_FULL_S("PEX");
1336 DEBUG_INIT_FULL_D(pex_if, 1);
1337 DEBUG_INIT_FULL_S(" : Detected No Link. Status Reg(0x");
1338 DEBUG_INIT_FULL_D(PEX_DBG_STATUS_REG(pex_if),
1340 DEBUG_INIT_FULL_C(") = 0x", tmp, 8);
1344 (info->pex_mode[pex_unit] == PEX_BUS_MODE_X4))
1349 /* Step 18: update pex DEVICE ID */
1352 pex_if_num = pex_max_if_get();
1353 ctrl_mode = ctrl_model_get();
1354 for (pex_if = 0; pex_if < pex_if_num; pex_if++) {
1355 pex_unit = (pex_if < 9) ? (pex_if >> 2) : 3;
1356 if (info->pex_mode[pex_unit] == PEX_BUS_DISABLED) {
1358 (info->pex_mode[pex_unit] == PEX_BUS_MODE_X4))
1363 devId = reg_read(PEX_CFG_DIRECT_ACCESS(
1364 pex_if, PEX_DEVICE_AND_VENDOR_ID));
1366 devId |= ((ctrl_mode << 16) & 0xffff0000);
1367 DEBUG_INIT_FULL_S("Update Device ID PEX");
1368 DEBUG_INIT_FULL_D(pex_if, 1);
1369 DEBUG_INIT_FULL_D(devId, 8);
1370 DEBUG_INIT_FULL_S("\n");
1371 reg_write(PEX_CFG_DIRECT_ACCESS
1372 (pex_if, PEX_DEVICE_AND_VENDOR_ID), devId);
1374 (info->pex_mode[pex_unit] == PEX_BUS_MODE_X4))
1377 DEBUG_INIT_FULL_S("Update PEX Device ID 0x");
1378 DEBUG_INIT_FULL_D(ctrl_mode, 4);
1379 DEBUG_INIT_FULL_S("0\n");
1381 tmp = reg_read(PEX_DBG_STATUS_REG(0));
1382 DEBUG_RD_REG(PEX_DBG_STATUS_REG(0), tmp);
1384 DEBUG_INIT_S(ENDED_OK);
1388 /* PEX configuration space read write */
1391 * pex_cfg_read - Read from configuration space
1394 * This function performs a 32 bit read from PEX configuration space.
1395 * It supports both type 0 and type 1 of Configuration Transactions
1396 * (local and over bridge). In order to read from local bus segment, use
1397 * bus number retrieved from mvPexLocalBusNumGet(). Other bus numbers
1398 * will result configuration transaction of type 1 (over bridge).
1401 * pex_if - PEX interface number.
1402 * bus - PEX segment bus number.
1403 * dev - PEX device number.
1404 * func - Function number.
1405 * offss - Register offset.
1411 * 32bit register data, 0xffffffff on error
1414 u32 pex_cfg_read(u32 pex_if, u32 bus, u32 dev, u32 func, u32 offs)
1417 u32 local_dev, local_bus;
1420 if (pex_if >= MV_PEX_MAX_IF)
1423 if (dev >= MAX_PEX_DEVICES) {
1424 DEBUG_INIT_C("pex_cfg_read: ERR. device number illigal ", dev,
1429 if (func >= MAX_PEX_FUNCS) {
1430 DEBUG_INIT_C("pex_cfg_read: ERR. function num illigal ", func,
1435 if (bus >= MAX_PEX_BUSSES) {
1436 DEBUG_INIT_C("pex_cfg_read: ERR. bus number illigal ", bus, 1);
1439 val = reg_read(PEX_STATUS_REG(pex_if));
1442 ((val & PXSR_PEX_DEV_NUM_MASK) >> PXSR_PEX_DEV_NUM_OFFS);
1444 ((val & PXSR_PEX_BUS_NUM_MASK) >> PXSR_PEX_BUS_NUM_OFFS);
1446 /* Speed up the process. In case on no link, return MV_ERROR */
1447 if ((dev != local_dev) || (bus != local_bus)) {
1448 pex_data = reg_read(PEX_STATUS_REG(pex_if));
1450 if ((pex_data & PXSR_DL_DOWN))
1455 * In PCI Express we have only one device number
1456 * and this number is the first number we encounter else that the
1457 * local_dev spec pex define return on config read/write on any device
1459 if (bus == local_bus) {
1460 if (local_dev == 0) {
1462 * If local dev is 0 then the first number we encounter
1465 if ((dev != 1) && (dev != local_dev))
1469 * If local dev is not 0 then the first number we
1472 if ((dev != 0) && (dev != local_dev))
1477 /* Creating PEX address to be passed */
1478 pex_data = (bus << PXCAR_BUS_NUM_OFFS);
1479 pex_data |= (dev << PXCAR_DEVICE_NUM_OFFS);
1480 pex_data |= (func << PXCAR_FUNC_NUM_OFFS);
1481 pex_data |= (offs & PXCAR_REG_NUM_MASK); /* lgacy register space */
1482 /* extended register space */
1483 pex_data |= (((offs & PXCAR_REAL_EXT_REG_NUM_MASK) >>
1484 PXCAR_REAL_EXT_REG_NUM_OFFS) << PXCAR_EXT_REG_NUM_OFFS);
1486 pex_data |= PXCAR_CONFIG_EN;
1488 /* Write the address to the PEX configuration address register */
1489 reg_write(PEX_CFG_ADDR_REG(pex_if), pex_data);
1492 * In order to let the PEX controller absorbed the address of the read
1493 * transaction we perform a validity check that the address was written
1495 if (pex_data != reg_read(PEX_CFG_ADDR_REG(pex_if)))
1498 /* cleaning Master Abort */
1499 reg_bit_set(PEX_CFG_DIRECT_ACCESS(pex_if, PEX_STATUS_AND_COMMAND),
1501 /* Read the Data returned in the PEX Data register */
1502 pex_data = reg_read(PEX_CFG_DATA_REG(pex_if));
1504 DEBUG_INIT_FULL_C(" --> ", pex_data, 4);
1510 * pex_local_bus_num_set - Set PEX interface local bus number.
1513 * This function sets given PEX interface its local bus number.
1514 * Note: In case the PEX interface is PEX-X, the information is read-only.
1517 * pex_if - PEX interface number.
1518 * bus_num - Bus number.
1524 * MV_NOT_ALLOWED in case PEX interface is PEX-X.
1525 * MV_BAD_PARAM on bad parameters ,
1529 int pex_local_bus_num_set(u32 pex_if, u32 bus_num)
1533 if (bus_num >= MAX_PEX_BUSSES) {
1534 DEBUG_INIT_C("pex_local_bus_num_set: ERR. bus number illigal %d\n",
1539 val = reg_read(PEX_STATUS_REG(pex_if));
1540 val &= ~PXSR_PEX_BUS_NUM_MASK;
1541 val |= (bus_num << PXSR_PEX_BUS_NUM_OFFS) & PXSR_PEX_BUS_NUM_MASK;
1542 reg_write(PEX_STATUS_REG(pex_if), val);
1548 * pex_local_dev_num_set - Set PEX interface local device number.
1551 * This function sets given PEX interface its local device number.
1552 * Note: In case the PEX interface is PEX-X, the information is read-only.
1555 * pex_if - PEX interface number.
1556 * dev_num - Device number.
1562 * MV_NOT_ALLOWED in case PEX interface is PEX-X.
1563 * MV_BAD_PARAM on bad parameters ,
1567 int pex_local_dev_num_set(u32 pex_if, u32 dev_num)
1571 if (pex_if >= MV_PEX_MAX_IF)
1572 return MV_BAD_PARAM;
1574 val = reg_read(PEX_STATUS_REG(pex_if));
1575 val &= ~PXSR_PEX_DEV_NUM_MASK;
1576 val |= (dev_num << PXSR_PEX_DEV_NUM_OFFS) & PXSR_PEX_DEV_NUM_MASK;
1577 reg_write(PEX_STATUS_REG(pex_if), val);