]> git.kernelconcepts.de Git - karo-tx-uboot.git/blob - arch/arm/mach-mvebu/serdes/axp/high_speed_env_lib.c
arm: mvebu: serdes: Move Armada XP SERDES / PHY init code into new directory
[karo-tx-uboot.git] / arch / arm / mach-mvebu / serdes / axp / high_speed_env_lib.c
1 /*
2  * Copyright (C) Marvell International Ltd. and its affiliates
3  *
4  * SPDX-License-Identifier:     GPL-2.0
5  */
6
7 #include <common.h>
8 #include <i2c.h>
9 #include <spl.h>
10 #include <asm/io.h>
11 #include <asm/arch/cpu.h>
12 #include <asm/arch/soc.h>
13
14 #include "high_speed_env_spec.h"
15 #include "board_env_spec.h"
16
17 #define SERDES_VERION   "2.1.5"
18 #define ENDED_OK        "High speed PHY - Ended Successfully\n"
19
20 static const u8 serdes_cfg[][SERDES_LAST_UNIT] = BIN_SERDES_CFG;
21
22 extern MV_BIN_SERDES_CFG *serdes_info_tbl[];
23
24 extern u8 rd78460gp_twsi_dev[];
25 extern u8 db88f78xx0rev2_twsi_dev[];
26
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);
30
31 #define MV_BOARD_PEX_MODULE_ADDR                0x23
32 #define MV_BOARD_PEX_MODULE_ID                  1
33 #define MV_BOARD_ETM_MODULE_ID                  2
34
35 #define PEX_MODULE_DETECT               1
36 #define ETM_MODULE_DETECT               2
37
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)
41
42 /* Static parametes */
43 static int config_module;
44 static int switch_module;
45
46 /* Local function */
47 static u32 board_id_get(void)
48 {
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;
69 #else
70         /*
71          * Return 0 here for custom board as this should not be used
72          * for custom boards.
73          */
74         return 0;
75 #endif
76 }
77
78 static u8 board_sat_r_get(u8 dev_num, u8 reg)
79 {
80         u8 data;
81         u8 *dev;
82         u32 board_id = board_id_get();
83         int ret;
84
85         i2c_init(CONFIG_SYS_I2C_SPEED, CONFIG_SYS_I2C_SLAVE);
86
87         switch (board_id) {
88         case DB_784MP_GP_ID:
89                 dev = rd78460gp_twsi_dev;
90
91                 break;
92         case DB_88F78XX0_BP_ID:
93         case DB_88F78XX0_BP_REV2_ID:
94                 dev = db88f78xx0rev2_twsi_dev;
95                 break;
96
97         case DB_78X60_PCAC_ID:
98         case FPGA_88F78XX0_ID:
99         case DB_78X60_PCAC_REV2_ID:
100         case RD_78460_SERVER_REV2_ID:
101         default:
102                 return 0;
103         }
104
105         /* Read MPP module ID */
106         ret = i2c_read(dev[dev_num], 0, 1, (u8 *)&data, 1);
107         if (ret)
108                 return MV_ERROR;
109
110         return data;
111 }
112
113 static int board_modules_scan(void)
114 {
115         u8 val;
116         u32 board_id = board_id_get();
117         int ret;
118
119         /* Perform scan only for DB board */
120         if ((board_id == DB_88F78XX0_BP_ID) ||
121             (board_id == DB_88F78XX0_BP_REV2_ID)) {
122                 /* reset modules flags */
123                 config_module = 0;
124
125                 i2c_init(CONFIG_SYS_I2C_SPEED, CONFIG_SYS_I2C_SLAVE);
126
127                 /* SERDES module (only PEX model is supported now) */
128                 ret = i2c_read(MV_BOARD_PEX_MODULE_ADDR, 0, 1, (u8 *)&val, 1);
129                 if (ret)
130                         return MV_ERROR;
131
132                 if (val == MV_BOARD_PEX_MODULE_ID)
133                         config_module = PEX_MODULE_DETECT;
134                 if (val == MV_BOARD_ETM_MODULE_ID)
135                         config_module = ETM_MODULE_DETECT;
136         } else if (board_id == RD_78460_NAS_ID) {
137                 switch_module = 0;
138                 if ((reg_read(GPP_DATA_IN_REG(2)) & MV_GPP66) == 0x0)
139                         switch_module = 1;
140         }
141
142         return MV_OK;
143 }
144
145 u32 pex_max_unit_get(void)
146 {
147         /*
148          * TODO:
149          * Right now only MV78460 is supported. Other SoC's might need
150          * a different value here.
151          */
152         return MV_PEX_MAX_UNIT;
153 }
154
155 u32 pex_max_if_get(void)
156 {
157         /*
158          * TODO:
159          * Right now only MV78460 is supported. Other SoC's might need
160          * a different value here.
161          */
162         return MV_PEX_MAX_IF;
163 }
164
165 u8 board_cpu_freq_get(void)
166 {
167         u32 sar;
168         u32 sar_msb;
169
170         sar = reg_read(MPP_SAMPLE_AT_RESET(0));
171         sar_msb = reg_read(MPP_SAMPLE_AT_RESET(1));
172         return ((sar_msb & 0x100000) >> 17) | ((sar & 0xe00000) >> 21);
173 }
174
175 __weak MV_BIN_SERDES_CFG *board_serdes_cfg_get(u8 pex_mode)
176 {
177         u32 board_id;
178         u32 serdes_cfg_val = 0; /* default */
179
180         board_id = board_id_get();
181
182         switch (board_id) {
183         case DB_784MP_GP_ID:
184                 serdes_cfg_val = 0;
185                 break;
186         }
187
188         return &serdes_info_tbl[board_id - BOARD_ID_BASE][serdes_cfg_val];
189 }
190
191 u16 ctrl_model_get(void)
192 {
193         /* Right now only MV78460 supported */
194         return MV_78460_DEV_ID;
195 }
196
197 u32 get_line_cfg(u32 line_num, MV_BIN_SERDES_CFG *info)
198 {
199         if (line_num < 8)
200                 return (info->line0_7 >> (line_num << 2)) & 0xF;
201         else
202                 return (info->line8_15 >> ((line_num - 8) << 2)) & 0xF;
203 }
204
205 int serdes_phy_config(void)
206 {
207         int status = MV_OK;
208         u32 line_cfg;
209         u8 line_num;
210         /* addr/value for each line @ every setup step */
211         u32 addr[16][11], val[16][11];
212         u8 pex_unit, pex_line_num;
213         u8 sgmii_port = 0;
214         u32 tmp;
215         u32 in_direct;
216         u8 max_serdes_lines;
217         MV_BIN_SERDES_CFG *info;
218         u8 satr11;
219         u8 sata_port;
220         u8 freq;
221         u8 device_rev;
222         u32 rx_high_imp_mode;
223         u16 ctrl_mode;
224         u32 board_id = board_id_get();
225         u32 pex_if;
226         u32 pex_if_num;
227
228         /*
229          * TODO:
230          * Right now we only support the MV78460 with 16 serdes lines
231          */
232         max_serdes_lines = 16;
233         if (max_serdes_lines == 0)
234                 return MV_OK;
235
236         switch (board_id) {
237         case DB_78X60_AMC_ID:
238         case DB_78X60_PCAC_REV2_ID:
239         case RD_78460_CUSTOMER_ID:
240         case RD_78460_SERVER_ID:
241         case RD_78460_SERVER_REV2_ID:
242         case DB_78X60_PCAC_ID:
243                 satr11 = (0x1 << 1) | 1;
244                 break;
245         case FPGA_88F78XX0_ID:
246         case RD_78460_NAS_ID:
247                 satr11 = (0x0 << 1) | 1;
248                 break;
249         case DB_88F78XX0_BP_REV2_ID:
250         case DB_784MP_GP_ID:
251         case DB_88F78XX0_BP_ID:
252                 satr11 = board_sat_r_get(1, 1);
253                 if ((u8) MV_ERROR == (u8) satr11)
254                         return MV_ERROR;
255                 break;
256         }
257
258         board_modules_scan();
259         memset(addr, 0, sizeof(addr));
260         memset(val, 0, sizeof(val));
261
262         /* Check if DRAM is already initialized  */
263         if (reg_read(REG_BOOTROM_ROUTINE_ADDR) &
264             (1 << REG_BOOTROM_ROUTINE_DRAM_INIT_OFFS)) {
265                 DEBUG_INIT_S("High speed PHY - Version: ");
266                 DEBUG_INIT_S(SERDES_VERION);
267                 DEBUG_INIT_S(" - 2nd boot - Skip\n");
268                 return MV_OK;
269         }
270         DEBUG_INIT_S("High speed PHY - Version: ");
271         DEBUG_INIT_S(SERDES_VERION);
272         DEBUG_INIT_S(" (COM-PHY-V20)\n");
273
274         /*
275          * AVS :  disable AVS for frequency less than 1333
276          */
277         freq = board_cpu_freq_get();
278         device_rev = mv_ctrl_rev_get();
279
280         if (device_rev == 2) {  /*   for B0 only */
281                 u32 cpu_avs;
282                 u8 fabric_freq;
283                 cpu_avs = reg_read(CPU_AVS_CONTROL2_REG);
284                 DEBUG_RD_REG(CPU_AVS_CONTROL2_REG, cpu_avs);
285                 cpu_avs &= ~(1 << 9);
286
287                 if ((0x4 == freq) || (0xB == freq)) {
288                         u32 tmp2;
289
290                         tmp2 = reg_read(CPU_AVS_CONTROL0_REG);
291                         DEBUG_RD_REG(CPU_AVS_CONTROL0_REG, tmp2);
292                         /* cpu upper limit = 1.1V  cpu lower limit = 0.9125V  */
293                         tmp2 |= 0x0FF;
294                         reg_write(CPU_AVS_CONTROL0_REG, tmp2);
295                         DEBUG_WR_REG(CPU_AVS_CONTROL0_REG, tmp2);
296                         cpu_avs |= (1 << 9);    /* cpu avs enable */
297                         cpu_avs |= (1 << 18);   /* AvsAvddDetEn enable  */
298                         fabric_freq = (reg_read(MPP_SAMPLE_AT_RESET(0)) &
299                                        SAR0_FABRIC_FREQ_MASK) >> SAR0_FABRIC_FREQ_OFFSET;
300                         if ((0xB == freq) && (5 == fabric_freq)) {
301                                 u32 core_avs;
302
303                                 core_avs = reg_read(CORE_AVS_CONTROL_0REG);
304                                 DEBUG_RD_REG(CORE_AVS_CONTROL_0REG, core_avs);
305
306                                 /*
307                                  * Set core lower limit = 0.9V &
308                                  * core upper limit = 0.9125V
309                                  */
310                                 core_avs &= ~(0xff);
311                                 core_avs |= 0x0E;
312                                 reg_write(CORE_AVS_CONTROL_0REG, core_avs);
313                                 DEBUG_WR_REG(CORE_AVS_CONTROL_0REG, core_avs);
314
315                                 core_avs = reg_read(CORE_AVS_CONTROL_2REG);
316                                 DEBUG_RD_REG(CORE_AVS_CONTROL_2REG, core_avs);
317                                 core_avs |= (1 << 9);   /*  core AVS enable  */
318                                 reg_write(CORE_AVS_CONTROL_2REG, core_avs);
319                                 DEBUG_WR_REG(CORE_AVS_CONTROL_2REG, core_avs);
320
321                                 tmp2 = reg_read(GENERAL_PURPOSE_RESERVED0_REG);
322                                 DEBUG_RD_REG(GENERAL_PURPOSE_RESERVED0_REG,
323                                              tmp2);
324                                 tmp2 |= 0x1;    /*  AvsCoreAvddDetEn enable   */
325                                 reg_write(GENERAL_PURPOSE_RESERVED0_REG, tmp2);
326                                 DEBUG_WR_REG(GENERAL_PURPOSE_RESERVED0_REG,
327                                              tmp2);
328                         }
329                 }
330                 reg_write(CPU_AVS_CONTROL2_REG, cpu_avs);
331                 DEBUG_WR_REG(CPU_AVS_CONTROL2_REG, cpu_avs);
332         }
333
334         info = board_serdes_cfg_get(PEX_MODE_GET(satr11));
335         DEBUG_INIT_FULL_S("info->line0_7= 0x");
336         DEBUG_INIT_FULL_D(info->line0_7, 8);
337         DEBUG_INIT_FULL_S("   info->line8_15= 0x");
338         DEBUG_INIT_FULL_D(info->line8_15, 8);
339         DEBUG_INIT_FULL_S("\n");
340
341         if (info == NULL) {
342                 DEBUG_INIT_S("Hight speed PHY Error #1\n");
343                 return MV_ERROR;
344         }
345
346         if (config_module & ETM_MODULE_DETECT) {        /* step 0.9 ETM */
347                 DEBUG_INIT_FULL_S("ETM module detect Step 0.9:\n");
348                 reg_write(SERDES_LINE_MUX_REG_0_7, 0x11111111);
349                 DEBUG_WR_REG(SERDES_LINE_MUX_REG_0_7, 0x11111111);
350                 info->pex_mode[1] = PEX_BUS_DISABLED;   /* pex unit 1 is configure for ETM */
351                 mdelay(100);
352                 reg_write(PEX_PHY_ACCESS_REG(1), (0x002 << 16) | 0xf44d);       /* SETM0 - start calibration         */
353                 DEBUG_WR_REG(PEX_PHY_ACCESS_REG(1), (0x002 << 16) | 0xf44d);    /* SETM0 - start calibration         */
354                 reg_write(PEX_PHY_ACCESS_REG(1), (0x302 << 16) | 0xf44d);       /* SETM1 - start calibration         */
355                 DEBUG_WR_REG(PEX_PHY_ACCESS_REG(1), (0x302 << 16) | 0xf44d);    /* SETM1 - start calibration         */
356                 reg_write(PEX_PHY_ACCESS_REG(1), (0x001 << 16) | 0xf801);       /* SETM0 - SATA mode & 25MHz ref clk */
357                 DEBUG_WR_REG(PEX_PHY_ACCESS_REG(1), (0x001 << 16) | 0xf801);    /* SETM0 - SATA mode & 25MHz ref clk */
358                 reg_write(PEX_PHY_ACCESS_REG(1), (0x301 << 16) | 0xf801);       /* SETM1 - SATA mode & 25MHz ref clk */
359                 DEBUG_WR_REG(PEX_PHY_ACCESS_REG(1), (0x301 << 16) | 0xf801);    /* SETM1 - SATA mode & 25MHz ref clk */
360                 reg_write(PEX_PHY_ACCESS_REG(1), (0x011 << 16) | 0x0BFF);       /* SETM0 - G3 full swing AMP         */
361                 DEBUG_WR_REG(PEX_PHY_ACCESS_REG(1), (0x011 << 16) | 0x0BFF);    /* SETM0 - G3 full swing AMP         */
362                 reg_write(PEX_PHY_ACCESS_REG(1), (0x311 << 16) | 0x0BFF);       /* SETM1 - G3 full swing AMP         */
363                 DEBUG_WR_REG(PEX_PHY_ACCESS_REG(1), (0x311 << 16) | 0x0BFF);    /* SETM1 - G3 full swing AMP         */
364                 reg_write(PEX_PHY_ACCESS_REG(1), (0x023 << 16) | 0x0800);       /* SETM0 - 40 data bit width         */
365                 DEBUG_WR_REG(PEX_PHY_ACCESS_REG(1), (0x023 << 16) | 0x0800);    /* SETM0 - 40 data bit width         */
366                 reg_write(PEX_PHY_ACCESS_REG(1), (0x323 << 16) | 0x0800);       /* SETM1 - 40 data bit width         */
367                 DEBUG_WR_REG(PEX_PHY_ACCESS_REG(1), (0x323 << 16) | 0x0800);    /* SETM1 - 40 data bit width         */
368                 reg_write(PEX_PHY_ACCESS_REG(1), (0x046 << 16) | 0x0400);       /* lane0(serdes4)                    */
369                 DEBUG_WR_REG(PEX_PHY_ACCESS_REG(1), (0x046 << 16) | 0x0400);    /* lane0(serdes4)                    */
370                 reg_write(PEX_PHY_ACCESS_REG(1), (0x346 << 16) | 0x0400);       /* lane3(serdes7)                    */
371                 DEBUG_WR_REG(PEX_PHY_ACCESS_REG(1), (0x346 << 16) | 0x0400);    /* lane3(serdes7)                    */
372         }
373
374         /* STEP -1 [PEX-Only] First phase of PEX-PIPE Configuration: */
375         DEBUG_INIT_FULL_S("Step 1: First phase of PEX-PIPE Configuration\n");
376         for (pex_unit = 0; pex_unit < pex_max_unit_get(); pex_unit++) {
377                 if (info->pex_mode[pex_unit] == PEX_BUS_DISABLED)
378                         continue;
379
380                 /* 1.   GLOB_CLK_CTRL Reset and Clock Control */
381                 reg_write(PEX_PHY_ACCESS_REG(pex_unit), (0xC1 << 16) | 0x25);
382                 DEBUG_WR_REG(PEX_PHY_ACCESS_REG(pex_unit), (0xC1 << 16) | 0x25);
383
384                 /* 2.   GLOB_TEST_CTRL Test Mode Control */
385                 if (info->pex_mode[pex_unit] == PEX_BUS_MODE_X4) {
386                         reg_write(PEX_PHY_ACCESS_REG(pex_unit),
387                                   (0xC2 << 16) | 0x200);
388                         DEBUG_WR_REG(PEX_PHY_ACCESS_REG(pex_unit),
389                                      (0xC2 << 16) | 0x200);
390                 }
391
392                 /* 3.   GLOB_CLK_SRC_LO Clock Source Low */
393                 if (info->pex_mode[pex_unit] == PEX_BUS_MODE_X1) {
394                         reg_write(PEX_PHY_ACCESS_REG(pex_unit),
395                                   (0xC3 << 16) | 0x0F);
396                         DEBUG_WR_REG(PEX_PHY_ACCESS_REG(pex_unit),
397                                      (0xC3 << 16) | 0x0F);
398                 }
399
400                 reg_write(PEX_PHY_ACCESS_REG(pex_unit), (0xC5 << 16) | 0x11F);
401                 DEBUG_WR_REG(PEX_PHY_ACCESS_REG(pex_unit),
402                              (0xC5 << 16) | 0x11F);
403         }
404
405         /*
406          * 2 Configure the desire PIN_PHY_GEN and do power down to the PU_PLL,
407          * PU_RX,PU_TX. (bits[12:5])
408          */
409         DEBUG_INIT_FULL_S("Step 2: Configure the desire PIN_PHY_GEN\n");
410         for (line_num = 0; line_num < max_serdes_lines; line_num++) {
411                 line_cfg = get_line_cfg(line_num, info);
412                 if (line_cfg == serdes_cfg[line_num][SERDES_UNIT_UNCONNECTED])
413                         continue;
414                 if (line_cfg == serdes_cfg[line_num][SERDES_UNIT_PEX])
415                         continue;
416                 if (line_cfg == serdes_cfg[line_num][SERDES_UNIT_SATA]) {
417                         switch (line_num) {
418                         case 4:
419                         case 6:
420                                 sata_port = 0;
421                                 break;
422                         case 5:
423                                 sata_port = 1;
424                                 break;
425                         default:
426                                 DEBUG_INIT_C
427                                     ("SATA port error for serdes line: ",
428                                      line_num, 2);
429                                 return MV_ERROR;
430                         }
431                         tmp = reg_read(SATA_LP_PHY_EXT_CTRL_REG(sata_port));
432                         DEBUG_RD_REG(SATA_LP_PHY_EXT_CTRL_REG(sata_port), tmp);
433                         tmp &= ~((0x1ff << 5) | 0x7);
434                         tmp |= ((info->bus_speed & (1 << line_num)) != 0) ?
435                                 (0x11 << 5) : 0x0;
436
437                         reg_write(SATA_LP_PHY_EXT_CTRL_REG(sata_port), tmp);
438                         DEBUG_WR_REG(SATA_LP_PHY_EXT_CTRL_REG(sata_port), tmp);
439                 }
440
441                 if (line_cfg == serdes_cfg[line_num][SERDES_UNIT_QSGMII]) {
442                         /*
443                          * 4) Configure the desire PIN_PHY_GEN and do power
444                          * down to the PU_PLL,PU_RX,PU_TX. (bits[12:5])
445                          */
446                         tmp = reg_read(SGMII_SERDES_CFG_REG(0));
447                         DEBUG_RD_REG(SGMII_SERDES_CFG_REG(0), tmp);
448                         tmp &= ~((0x1ff << 5) | 0x7);
449                         tmp |= 0x660;
450                         reg_write(SGMII_SERDES_CFG_REG(0), tmp);
451                         DEBUG_WR_REG(SGMII_SERDES_CFG_REG(0), tmp);
452                         continue;
453                 }
454
455                 if (line_cfg == serdes_cfg[line_num][SERDES_UNIT_SGMII0])
456                         sgmii_port = 0;
457                 else if (line_cfg == serdes_cfg[line_num][SERDES_UNIT_SGMII1])
458                         sgmii_port = 1;
459                 else if (line_cfg == serdes_cfg[line_num][SERDES_UNIT_SGMII2])
460                         sgmii_port = 2;
461                 else if (line_cfg == serdes_cfg[line_num][SERDES_UNIT_SGMII3])
462                         sgmii_port = 3;
463                 else
464                         continue;
465
466                 tmp = reg_read(SGMII_SERDES_CFG_REG(sgmii_port));
467                 DEBUG_RD_REG(SGMII_SERDES_CFG_REG(sgmii_port), tmp);
468                 tmp &= ~((0x1ff << 5) | 0x7);
469                 tmp |= (((info->bus_speed & (1 << line_num)) != 0) ?
470                         (0x88 << 5) : (0x66 << 5));
471                 reg_write(SGMII_SERDES_CFG_REG(sgmii_port), tmp);
472                 DEBUG_WR_REG(SGMII_SERDES_CFG_REG(sgmii_port), tmp);
473         }
474
475         /* Step 3 - QSGMII enable */
476         DEBUG_INIT_FULL_S("Step 3 QSGMII enable\n");
477         for (line_num = 0; line_num < max_serdes_lines; line_num++) {
478                 line_cfg = get_line_cfg(line_num, info);
479                 if (line_cfg == serdes_cfg[line_num][SERDES_UNIT_QSGMII]) {
480                         /* QSGMII Active bit set to true */
481                         tmp = reg_read(QSGMII_CONTROL_1_REG);
482                         DEBUG_RD_REG(QSGMII_CONTROL_1_REG, tmp);
483                         tmp |= (1 << 30);
484 #ifdef ERRATA_GL_6572255
485                         tmp |= (1 << 27);
486 #endif
487                         reg_write(QSGMII_CONTROL_1_REG, tmp);
488                         DEBUG_WR_REG(QSGMII_CONTROL_1_REG, tmp);
489                 }
490         }
491
492         /* Step 4 - configure SERDES MUXes */
493         DEBUG_INIT_FULL_S("Step 4: Configure SERDES MUXes\n");
494         if (config_module & ETM_MODULE_DETECT) {
495                 reg_write(SERDES_LINE_MUX_REG_0_7, 0x40041111);
496                 DEBUG_WR_REG(SERDES_LINE_MUX_REG_0_7, 0x40041111);
497         } else {
498                 reg_write(SERDES_LINE_MUX_REG_0_7, info->line0_7);
499                 DEBUG_WR_REG(SERDES_LINE_MUX_REG_0_7, info->line0_7);
500         }
501         reg_write(SERDES_LINE_MUX_REG_8_15, info->line8_15);
502         DEBUG_WR_REG(SERDES_LINE_MUX_REG_8_15, info->line8_15);
503
504         /* Step 5: Activate the RX High Impedance Mode  */
505         DEBUG_INIT_FULL_S("Step 5: Activate the RX High Impedance Mode\n");
506         rx_high_imp_mode = 0x8080;
507         if (device_rev == 2)    /*   for B0 only */
508                 rx_high_imp_mode |= 4;
509
510         for (line_num = 0; line_num < max_serdes_lines; line_num++) {
511                 /* for each serdes lane */
512                 DEBUG_INIT_FULL_S("SERDES  ");
513                 DEBUG_INIT_FULL_D_10(line_num, 2);
514                 line_cfg = get_line_cfg(line_num, info);
515                 if (line_cfg == serdes_cfg[line_num][SERDES_UNIT_UNCONNECTED]) {
516                         DEBUG_INIT_FULL_S(" unconnected ***\n");
517                         continue;
518                 }
519                 if (line_cfg == serdes_cfg[line_num][SERDES_UNIT_PEX]) {
520                         pex_unit = line_num >> 2;
521                         pex_line_num = line_num % 4;
522                         DEBUG_INIT_FULL_S(" - PEX unit ");
523                         DEBUG_INIT_FULL_D_10(pex_unit, 1);
524                         DEBUG_INIT_FULL_S(" line=  ");
525                         DEBUG_INIT_FULL_D_10(pex_line_num, 1);
526                         DEBUG_INIT_FULL_S("\n");
527
528                         /* Needed for PEX_PHY_ACCESS_REG macro */
529                         if ((line_num > 7) &&
530                             (info->pex_mode[3] == PEX_BUS_MODE_X8))
531                                 /* lines 8 - 15 are belong to PEX3 in x8 mode */
532                                 pex_unit = 3;
533
534                         if (info->pex_mode[pex_unit] == PEX_BUS_DISABLED)
535                                 continue;
536
537                         /*
538                          * 8)  Activate the RX High Impedance Mode field
539                          * (bit [2]) in register /PCIe_USB Control (Each MAC
540                          * contain different Access to reach its
541                          * Serdes-Regfile).
542                          * [PEX-Only] Set bit[12]: The analog part latches idle
543                          * if PU_TX = 1 and PU_PLL =1.
544                          */
545
546                         /* Termination enable */
547                         if (info->pex_mode[pex_unit] == PEX_BUS_MODE_X1) {
548                                 in_direct = (0x48 << 16) | (pex_line_num << 24) |
549                                         0x1000 | rx_high_imp_mode;      /* x1 */
550                         } else if ((info->pex_mode[pex_unit] ==
551                                     PEX_BUS_MODE_X4) && (pex_line_num == 0))
552                                 in_direct = (0x48 << 16) | (pex_line_num << 24) |
553                                         0x1000 | (rx_high_imp_mode & 0xff);     /* x4 */
554                         else
555                                 in_direct = 0;
556
557                         if (in_direct) {
558                                 reg_write(PEX_PHY_ACCESS_REG(pex_unit),
559                                           in_direct);
560                                 DEBUG_WR_REG(PEX_PHY_ACCESS_REG(pex_unit),
561                                              in_direct);
562                         }
563
564                         continue;
565                 }
566
567                 if (line_cfg == serdes_cfg[line_num][SERDES_UNIT_SATA]) {
568                         /*
569                          * port 0 for serdes lines 4,6,  and port 1 for
570                          * serdes lines 5
571                          */
572                         sata_port = line_num & 1;
573                         DEBUG_INIT_FULL_S(" - SATA port  ");
574                         DEBUG_INIT_FULL_D_10(sata_port, 2);
575                         DEBUG_INIT_FULL_S("\n");
576                         reg_write(SATA_COMPHY_CTRL_REG(sata_port),
577                                   rx_high_imp_mode);
578                         DEBUG_WR_REG(SATA_COMPHY_CTRL_REG(sata_port),
579                                      rx_high_imp_mode);
580                         continue;
581                 }
582
583                 if (line_cfg == serdes_cfg[line_num][SERDES_UNIT_QSGMII]) {
584                         DEBUG_INIT_FULL_S(" - QSGMII\n");
585                         reg_write(SGMII_COMPHY_CTRL_REG(0), rx_high_imp_mode);
586                         DEBUG_WR_REG(SGMII_COMPHY_CTRL_REG(0),
587                                      rx_high_imp_mode);
588                         continue;
589                 }
590
591                 if (line_cfg == serdes_cfg[line_num][SERDES_UNIT_SGMII0])
592                         sgmii_port = 0;
593                 else if (line_cfg == serdes_cfg[line_num][SERDES_UNIT_SGMII1])
594                         sgmii_port = 1;
595                 else if (line_cfg == serdes_cfg[line_num][SERDES_UNIT_SGMII2])
596                         sgmii_port = 2;
597                 else if (line_cfg == serdes_cfg[line_num][SERDES_UNIT_SGMII3])
598                         sgmii_port = 3;
599                 else
600                         continue;
601                 DEBUG_INIT_FULL_S(" - SGMII port  ");
602                 DEBUG_INIT_FULL_D_10(sgmii_port, 2);
603                 DEBUG_INIT_FULL_S("\n");
604                 reg_write(SGMII_COMPHY_CTRL_REG(sgmii_port), rx_high_imp_mode);
605                 DEBUG_WR_REG(SGMII_COMPHY_CTRL_REG(sgmii_port),
606                              rx_high_imp_mode);
607         }                       /* for each serdes lane */
608
609         /* Step 6 [PEX-Only] PEX-Main configuration (X4 or X1): */
610         DEBUG_INIT_FULL_S("Step 6: [PEX-Only] PEX-Main configuration (X4 or X1)\n");
611         tmp = reg_read(SOC_CTRL_REG);
612         DEBUG_RD_REG(SOC_CTRL_REG, tmp);
613         tmp &= 0x200;
614         if (info->pex_mode[0] == PEX_BUS_MODE_X1)
615                 tmp |= PCIE0_QUADX1_EN;
616         if (info->pex_mode[1] == PEX_BUS_MODE_X1)
617                 tmp |= PCIE1_QUADX1_EN;
618         if (((reg_read(MPP_SAMPLE_AT_RESET(0)) & PEX_CLK_100MHZ_MASK) >>
619              PEX_CLK_100MHZ_OFFSET) == 0x1)
620                 tmp |= (PCIE0_CLK_OUT_EN_MASK | PCIE1_CLK_OUT_EN_MASK);
621
622         reg_write(SOC_CTRL_REG, tmp);
623         DEBUG_WR_REG(SOC_CTRL_REG, tmp);
624
625         /* 6.2 PCI Express Link Capabilities */
626         DEBUG_INIT_FULL_S("Step 6.2: [PEX-Only] PCI Express Link Capabilities\n");
627
628         for (line_num = 0; line_num < max_serdes_lines; line_num++) {
629                 line_cfg = get_line_cfg(line_num, info);
630
631                 if (line_cfg == serdes_cfg[line_num][SERDES_UNIT_PEX]) {
632                         /*
633                          * PCI Express Control
634                          * 0xX1A00 [0]:
635                          * 0x0 X4-Link.
636                          * 0x1 X1-Link
637                          */
638                         pex_unit = line_num >> 2;
639                         pex_if = MV_SERDES_NUM_TO_PEX_NUM(line_num);
640                         if (info->pex_mode[pex_unit] == PEX_BUS_DISABLED)
641                                 continue;
642
643                         /*  set Common Clock Configuration */
644                         tmp = reg_read(PEX_LINK_CTRL_STATUS_REG(pex_if));
645                         DEBUG_RD_REG(PEX_LINK_CTRL_STATUS_REG(pex_if), tmp);
646                         tmp |= (1 << 6);
647                         reg_write(PEX_LINK_CTRL_STATUS_REG(pex_if), tmp);
648                         DEBUG_WR_REG(PEX_LINK_CTRL_STATUS_REG(pex_if), tmp);
649
650                         tmp = reg_read(PEX_LINK_CAPABILITIES_REG(pex_if));
651                         DEBUG_RD_REG(PEX_LINK_CAPABILITIES_REG(pex_if), tmp);
652                         tmp &= ~(0x3FF);
653                         if (info->pex_mode[pex_unit] == PEX_BUS_MODE_X1)
654                                 tmp |= (0x1 << 4);
655                         if (info->pex_mode[pex_unit] == PEX_BUS_MODE_X4)
656                                 tmp |= (0x4 << 4);
657                         if (0 == PEX_CAPABILITY_GET(satr11))
658                                 tmp |= 0x1;
659                         else
660                                 tmp |= 0x2;
661                         DEBUG_INIT_FULL_S("Step 6.2: PEX ");
662                         DEBUG_INIT_FULL_D(pex_if, 1);
663                         DEBUG_INIT_FULL_C(" set GEN", (tmp & 3), 1);
664                         reg_write(PEX_LINK_CAPABILITIES_REG(pex_if), tmp);
665                         DEBUG_WR_REG(PEX_LINK_CAPABILITIES_REG(pex_if), tmp);
666
667                         /*
668                          * If pex is X4, no need to pass thru the other
669                          * 3X1 serdes lines
670                          */
671                         if (info->pex_mode[pex_unit] == PEX_BUS_MODE_X4)
672                                 line_num += 3;
673                 }
674         }
675
676         /*
677          * Step 7 [PEX-X4 Only] To create PEX-Link that contain 4-lanes you
678          * need to config the register SOC_Misc/General Purpose2
679          * (Address= 182F8)
680          */
681         DEBUG_INIT_FULL_S("Step 7: [PEX-X4 Only] To create PEX-Link\n");
682         tmp = reg_read(GEN_PURP_RES_2_REG);
683         DEBUG_RD_REG(GEN_PURP_RES_2_REG, tmp);
684
685         tmp &= 0xFFFF0000;
686         if (info->pex_mode[0] == PEX_BUS_MODE_X4)
687                 tmp |= 0x0000000F;
688
689         if (info->pex_mode[1] == PEX_BUS_MODE_X4)
690                 tmp |= 0x000000F0;
691
692         if (info->pex_mode[2] == PEX_BUS_MODE_X4)
693                 tmp |= 0x00000F00;
694
695         if (info->pex_mode[3] == PEX_BUS_MODE_X4)
696                 tmp |= 0x0000F000;
697
698         reg_write(GEN_PURP_RES_2_REG, tmp);
699         DEBUG_WR_REG(GEN_PURP_RES_2_REG, tmp);
700
701         /* Steps  8 , 9 ,10 - use prepared REG addresses and values */
702         DEBUG_INIT_FULL_S("Steps 7,8,9,10 and 11\n");
703
704         /* Prepare PHY parameters for each step according to  MUX selection */
705         for (line_num = 0; line_num < max_serdes_lines; line_num++) {
706                 /* for each serdes lane */
707
708                 line_cfg = get_line_cfg(line_num, info);
709
710                 if (line_cfg == serdes_cfg[line_num][SERDES_UNIT_UNCONNECTED])
711                         continue;
712
713                 if (line_cfg == serdes_cfg[line_num][SERDES_UNIT_PEX]) {
714                         pex_unit = line_num >> 2;
715                         pex_line_num = line_num % 4;
716
717                         if (info->pex_mode[pex_unit] == PEX_BUS_DISABLED)
718                                 continue;
719                         /*
720                          * 8)   Configure the desire PHY_MODE (bits [7:5])
721                          * and REF_FREF_SEL (bits[4:0]) in the register Power
722                          * and PLL Control (Each MAC contain different Access
723                          * to reach its Serdes-Regfile).
724                          */
725                         if (((info->pex_mode[pex_unit] == PEX_BUS_MODE_X4) &&
726                              (0 == pex_line_num))
727                             || ((info->pex_mode[pex_unit] == PEX_BUS_MODE_X1))) {
728                                 reg_write(PEX_PHY_ACCESS_REG(pex_unit),
729                                           (0x01 << 16) | (pex_line_num << 24) |
730                                           0xFC60);
731                                 DEBUG_WR_REG(PEX_PHY_ACCESS_REG(pex_unit),
732                                              (0x01 << 16) | (pex_line_num << 24)
733                                              | 0xFC60);
734                                 /*
735                                  * Step 8.1: [PEX-Only] Configure Max PLL Rate
736                                  * (bit 8 in  KVCO Calibration Control and
737                                  * bits[10:9] in
738                                  */
739                                 /* Use Maximum PLL Rate(Bit 8) */
740                                 reg_write(PEX_PHY_ACCESS_REG(pex_unit),
741                                           (0x02 << 16) | (1 << 31) |
742                                           (pex_line_num << 24)); /* read command */
743                                 DEBUG_WR_REG(PEX_PHY_ACCESS_REG(pex_unit),
744                                              (0x02 << 16) | (1 << 31) |
745                                              (pex_line_num << 24));
746                                 tmp = reg_read(PEX_PHY_ACCESS_REG(pex_unit));
747                                 DEBUG_RD_REG(PEX_PHY_ACCESS_REG(pex_unit), tmp);
748                                 tmp &= ~(1 << 31);
749                                 tmp |= (1 << 8);
750                                 reg_write(PEX_PHY_ACCESS_REG(pex_unit), tmp);
751                                 DEBUG_WR_REG(PEX_PHY_ACCESS_REG(pex_unit), tmp);
752
753                                 /* Use Maximum PLL Rate(Bits [10:9]) */
754                                 reg_write(PEX_PHY_ACCESS_REG(pex_unit),
755                                           (0x81 << 16) | (1 << 31) |
756                                           (pex_line_num << 24)); /* read command */
757                                 DEBUG_WR_REG(PEX_PHY_ACCESS_REG(pex_unit),
758                                              (0x81 << 16) | (1 << 31) |
759                                              (pex_line_num << 24));
760                                 tmp = reg_read(PEX_PHY_ACCESS_REG(pex_unit));
761                                 DEBUG_RD_REG(PEX_PHY_ACCESS_REG(pex_unit), tmp);
762                                 tmp &= ~(1 << 31);
763                                 tmp |= (3 << 9);
764                                 reg_write(PEX_PHY_ACCESS_REG(pex_unit), tmp);
765                                 DEBUG_WR_REG(PEX_PHY_ACCESS_REG(pex_unit), tmp);
766                         }
767
768                         continue;
769                 }
770
771                 if (line_cfg == serdes_cfg[line_num][SERDES_UNIT_SATA]) {
772                         /*
773                          * Port 0 for serdes lines 4,6,  and port 1 for serdes
774                          * lines 5
775                          */
776                         sata_port = line_num & 1;
777
778                         /*
779                          * 8) Configure the desire PHY_MODE (bits [7:5]) and
780                          * REF_FREF_SEL (bits[4:0]) in the register Power
781                          * and PLL Control (Each MAC contain different Access
782                          * to reach its Serdes-Regfile).
783                          */
784                         reg_write(SATA_PWR_PLL_CTRL_REG(sata_port), 0xF801);
785                         DEBUG_WR_REG(SATA_PWR_PLL_CTRL_REG(sata_port), 0xF801);
786
787                         /*  9)  Configure the desire SEL_BITS  */
788                         reg_write(SATA_DIG_LP_ENA_REG(sata_port), 0x400);
789                         DEBUG_WR_REG(SATA_DIG_LP_ENA_REG(sata_port), 0x400);
790
791                         /* 10)  Configure the desire REFCLK_SEL */
792
793                         reg_write(SATA_REF_CLK_SEL_REG(sata_port), 0x400);
794                         DEBUG_WR_REG(SATA_REF_CLK_SEL_REG(sata_port), 0x400);
795
796                         /* 11)  Power up to the PU_PLL,PU_RX,PU_TX.   */
797                         tmp = reg_read(SATA_LP_PHY_EXT_CTRL_REG(sata_port));
798                         DEBUG_RD_REG(SATA_LP_PHY_EXT_CTRL_REG(sata_port), tmp);
799                         tmp |= 7;
800                         reg_write(SATA_LP_PHY_EXT_CTRL_REG(sata_port), tmp);
801                         DEBUG_WR_REG(SATA_LP_PHY_EXT_CTRL_REG(sata_port), tmp);
802
803                         continue;
804                 }
805
806                 if (line_cfg == serdes_cfg[line_num][SERDES_UNIT_QSGMII]) {
807                         /*
808                          * 8)   Configure the desire PHY_MODE (bits [7:5])
809                          * and REF_FREF_SEL (bits[4:0]) in the register
810                          */
811                         reg_write(SGMII_PWR_PLL_CTRL_REG(0), 0xF881);
812                         DEBUG_WR_REG(SGMII_PWR_PLL_CTRL_REG(0), 0xF881);
813
814                         /*
815                          * 9)   Configure the desire SEL_BITS (bits [11:0]
816                          * in register
817                          */
818                         reg_write(SGMII_DIG_LP_ENA_REG(0), 0x400);
819                         DEBUG_WR_REG(SGMII_DIG_LP_ENA_REG(0), 0x400);
820
821                         /*
822                          * 10)  Configure the desire REFCLK_SEL (bit [10])
823                          * in register
824                          */
825                         reg_write(SGMII_REF_CLK_SEL_REG(0), 0x400);
826                         DEBUG_WR_REG(SGMII_REF_CLK_SEL_REG(0), 0x400);
827
828                         /* 11)  Power up to the PU_PLL,PU_RX,PU_TX.  */
829                         tmp = reg_read(SGMII_SERDES_CFG_REG(0));
830                         DEBUG_RD_REG(SGMII_SERDES_CFG_REG(0), tmp);
831                         tmp |= 7;
832                         reg_write(SGMII_SERDES_CFG_REG(0), tmp);
833                         DEBUG_WR_REG(SGMII_SERDES_CFG_REG(0), tmp);
834                         continue;
835                 }
836
837                 if (line_cfg == serdes_cfg[line_num][SERDES_UNIT_SGMII0])
838                         sgmii_port = 0;
839                 else if (line_cfg == serdes_cfg[line_num][SERDES_UNIT_SGMII1])
840                         sgmii_port = 1;
841                 else if (line_cfg == serdes_cfg[line_num][SERDES_UNIT_SGMII2])
842                         sgmii_port = 2;
843                 else if (line_cfg == serdes_cfg[line_num][SERDES_UNIT_SGMII3])
844                         sgmii_port = 3;
845                 else
846                         continue;
847
848                 /*
849                  * 8)   Configure the desire PHY_MODE (bits [7:5]) and
850                  * REF_FREF_SEL (bits[4:0]) in the register
851                  */
852                 reg_write(SGMII_PWR_PLL_CTRL_REG(sgmii_port), 0xF881);
853                 DEBUG_WR_REG(SGMII_PWR_PLL_CTRL_REG(sgmii_port), 0xF881);
854
855                 /* 9)   Configure the desire SEL_BITS (bits [11:0] in register */
856                 reg_write(SGMII_DIG_LP_ENA_REG(sgmii_port), 0);
857                 DEBUG_WR_REG(SGMII_DIG_LP_ENA_REG(sgmii_port), 0);
858
859                 /* 10)  Configure the desire REFCLK_SEL (bit [10]) in register  */
860                 reg_write(SGMII_REF_CLK_SEL_REG(sgmii_port), 0x400);
861                 DEBUG_WR_REG(SGMII_REF_CLK_SEL_REG(sgmii_port), 0x400);
862
863                 /* 11)  Power up to the PU_PLL,PU_RX,PU_TX.  */
864                 tmp = reg_read(SGMII_SERDES_CFG_REG(sgmii_port));
865                 DEBUG_RD_REG(SGMII_SERDES_CFG_REG(sgmii_port), tmp);
866                 tmp |= 7;
867                 reg_write(SGMII_SERDES_CFG_REG(sgmii_port), tmp);
868                 DEBUG_WR_REG(SGMII_SERDES_CFG_REG(sgmii_port), tmp);
869
870         }                       /* for each serdes lane */
871
872         /* Step 12 [PEX-Only] Last phase of PEX-PIPE Configuration */
873         DEBUG_INIT_FULL_S("Steps 12: [PEX-Only] Last phase of PEX-PIPE Configuration\n");
874         for (line_num = 0; line_num < max_serdes_lines; line_num++) {
875                 /* for each serdes lane */
876
877                 line_cfg = get_line_cfg(line_num, info);
878
879                 if (line_cfg == serdes_cfg[line_num][SERDES_UNIT_UNCONNECTED])
880                         continue;
881
882                 if (line_cfg == serdes_cfg[line_num][SERDES_UNIT_PEX]) {
883                         pex_unit = line_num >> 2;
884                         pex_line_num = line_num % 4;
885                         if (0 == pex_line_num) {
886                                 reg_write(PEX_PHY_ACCESS_REG(pex_unit),
887                                           (0xC1 << 16) | 0x24);
888                                 DEBUG_WR_REG(PEX_PHY_ACCESS_REG(pex_unit),
889                                              (0xC1 << 16) | 0x24);
890                         }
891                 }
892         }
893
894         /*--------------------------------------------------------------*/
895         /* Step 13: Wait 15ms before checking results */
896         DEBUG_INIT_FULL_S("Steps 13: Wait 15ms before checking results");
897         mdelay(15);
898         tmp = 20;
899         while (tmp) {
900                 status = MV_OK;
901                 for (line_num = 0; line_num < max_serdes_lines; line_num++) {
902                         u32 tmp;
903                         line_cfg = get_line_cfg(line_num, info);
904                         if (line_cfg ==
905                             serdes_cfg[line_num][SERDES_UNIT_UNCONNECTED])
906                                 continue;
907
908                         if (line_cfg == serdes_cfg[line_num][SERDES_UNIT_PEX])
909                                 continue;
910
911                         if (line_cfg == serdes_cfg[line_num][SERDES_UNIT_SATA]) {
912                                 /*
913                                  * Port 0 for serdes lines 4,6,  and port 1
914                                  * for serdes lines 5
915                                  */
916                                 sata_port = line_num & 1;
917
918                                 tmp =
919                                     reg_read(SATA_LP_PHY_EXT_STAT_REG
920                                              (sata_port));
921                                 DEBUG_RD_REG(SATA_LP_PHY_EXT_STAT_REG
922                                              (sata_port), tmp);
923                                 if ((tmp & 0x7) != 0x7)
924                                         status = MV_ERROR;
925                                 continue;
926                         }
927
928                         if (line_cfg ==
929                             serdes_cfg[line_num][SERDES_UNIT_QSGMII]) {
930                                 tmp = reg_read(SGMII_SERDES_STAT_REG(0));
931                                 DEBUG_RD_REG(SGMII_SERDES_STAT_REG(0), tmp);
932                                 if ((tmp & 0x7) != 0x7)
933                                         status = MV_ERROR;
934                                 continue;
935                         }
936
937                         if (line_cfg ==
938                             serdes_cfg[line_num][SERDES_UNIT_SGMII0])
939                                 sgmii_port = 0;
940                         else if (line_cfg ==
941                                  serdes_cfg[line_num][SERDES_UNIT_SGMII1])
942                                 sgmii_port = 1;
943                         else if (line_cfg ==
944                                  serdes_cfg[line_num][SERDES_UNIT_SGMII2])
945                                 sgmii_port = 2;
946                         else if (line_cfg ==
947                                  serdes_cfg[line_num][SERDES_UNIT_SGMII3])
948                                 sgmii_port = 3;
949                         else
950                                 continue;
951
952                         tmp = reg_read(SGMII_SERDES_STAT_REG(sgmii_port));
953                         DEBUG_RD_REG(SGMII_SERDES_STAT_REG(sgmii_port), tmp);
954                         if ((tmp & 0x7) != 0x7)
955                                 status = MV_ERROR;
956                 }
957
958                 if (status == MV_OK)
959                         break;
960                 mdelay(5);
961                 tmp--;
962         }
963
964         /*
965          * Step14 [PEX-Only]  In order to configure RC/EP mode please write
966          * to register 0x0060 bits
967          */
968         DEBUG_INIT_FULL_S("Steps 14: [PEX-Only]  In order to configure\n");
969         for (pex_unit = 0; pex_unit < pex_max_unit_get(); pex_unit++) {
970                 if (info->pex_mode[pex_unit] == PEX_BUS_DISABLED)
971                         continue;
972                 tmp =
973                     reg_read(PEX_CAPABILITIES_REG(MV_PEX_UNIT_TO_IF(pex_unit)));
974                 DEBUG_RD_REG(PEX_CAPABILITIES_REG(MV_PEX_UNIT_TO_IF(pex_unit)),
975                              tmp);
976                 tmp &= ~(0xf << 20);
977                 if (info->pex_type == MV_PEX_ROOT_COMPLEX)
978                         tmp |= (0x4 << 20);
979                 else
980                         tmp |= (0x1 << 20);
981                 reg_write(PEX_CAPABILITIES_REG(MV_PEX_UNIT_TO_IF(pex_unit)),
982                           tmp);
983                 DEBUG_WR_REG(PEX_CAPABILITIES_REG(MV_PEX_UNIT_TO_IF(pex_unit)),
984                              tmp);
985         }
986
987         /*
988          * Step 15 [PEX-Only] Only for EP mode set to Zero bits 19 and 16 of
989          * register 0x1a60
990          */
991         DEBUG_INIT_FULL_S("Steps 15: [PEX-Only]  In order to configure\n");
992         for (pex_unit = 0; pex_unit < pex_max_unit_get(); pex_unit++) {
993                 if (info->pex_mode[pex_unit] == PEX_BUS_DISABLED)
994                         continue;
995                 if (info->pex_type == MV_PEX_END_POINT) {
996                         tmp =
997                             reg_read(PEX_DBG_CTRL_REG
998                                      (MV_PEX_UNIT_TO_IF(pex_unit)));
999                         DEBUG_RD_REG(PEX_DBG_CTRL_REG
1000                                      (MV_PEX_UNIT_TO_IF(pex_unit)), tmp);
1001                         tmp &= 0xfff6ffff;
1002                         reg_write(PEX_DBG_CTRL_REG(MV_PEX_UNIT_TO_IF(pex_unit)),
1003                                   tmp);
1004                         DEBUG_WR_REG(PEX_DBG_CTRL_REG
1005                                      (MV_PEX_UNIT_TO_IF(pex_unit)), tmp);
1006                 }
1007         }
1008
1009         if (info->serdes_m_phy_change) {
1010                 MV_SERDES_CHANGE_M_PHY *serdes_m_phy_change;
1011                 u32 bus_speed;
1012                 for (line_num = 0; line_num < max_serdes_lines; line_num++) {
1013                         line_cfg = get_line_cfg(line_num, info);
1014                         if (line_cfg ==
1015                             serdes_cfg[line_num][SERDES_UNIT_UNCONNECTED])
1016                                 continue;
1017                         serdes_m_phy_change = info->serdes_m_phy_change;
1018                         bus_speed = info->bus_speed & (1 << line_num);
1019                         while (serdes_m_phy_change->type !=
1020                                SERDES_UNIT_UNCONNECTED) {
1021                                 switch (serdes_m_phy_change->type) {
1022                                 case SERDES_UNIT_PEX:
1023                                         if (line_cfg != SERDES_UNIT_PEX)
1024                                                 break;
1025                                         pex_unit = line_num >> 2;
1026                                         pex_line_num = line_num % 4;
1027                                         if (info->pex_mode[pex_unit] ==
1028                                             PEX_BUS_DISABLED)
1029                                                 break;
1030                                         if ((info->pex_mode[pex_unit] ==
1031                                              PEX_BUS_MODE_X4) && pex_line_num)
1032                                                 break;
1033
1034                                         if (bus_speed) {
1035                                                 reg_write(PEX_PHY_ACCESS_REG
1036                                                           (pex_unit),
1037                                                           (pex_line_num << 24) |
1038                                                           serdes_m_phy_change->val_hi_speed);
1039                                                 DEBUG_WR_REG(PEX_PHY_ACCESS_REG
1040                                                              (pex_unit),
1041                                                              (pex_line_num <<
1042                                                               24) |
1043                                                              serdes_m_phy_change->val_hi_speed);
1044                                         } else {
1045                                                 reg_write(PEX_PHY_ACCESS_REG
1046                                                           (pex_unit),
1047                                                           (pex_line_num << 24) |
1048                                                           serdes_m_phy_change->val_low_speed);
1049                                                 DEBUG_WR_REG(PEX_PHY_ACCESS_REG
1050                                                              (pex_unit),
1051                                                              (pex_line_num <<
1052                                                               24) |
1053                                                              serdes_m_phy_change->val_low_speed);
1054                                         }
1055                                         break;
1056                                 case SERDES_UNIT_SATA:
1057                                         if (line_cfg != SERDES_UNIT_SATA)
1058                                                 break;
1059                                         /*
1060                                          * Port 0 for serdes lines 4,6,  and
1061                                          * port 1 for serdes lines 5
1062                                          */
1063                                         sata_port = line_num & 1;
1064                                         if (bus_speed) {
1065                                                 reg_write(SATA_BASE_REG
1066                                                           (sata_port) |
1067                                                           serdes_m_phy_change->reg_hi_speed,
1068                                                           serdes_m_phy_change->val_hi_speed);
1069                                                 DEBUG_WR_REG(SATA_BASE_REG
1070                                                              (sata_port) |
1071                                                              serdes_m_phy_change->reg_hi_speed,
1072                                                              serdes_m_phy_change->val_hi_speed);
1073                                         } else {
1074                                                 reg_write(SATA_BASE_REG
1075                                                           (sata_port) |
1076                                                           serdes_m_phy_change->reg_low_speed,
1077                                                           serdes_m_phy_change->val_low_speed);
1078                                                 DEBUG_WR_REG(SATA_BASE_REG
1079                                                              (sata_port) |
1080                                                              serdes_m_phy_change->reg_low_speed,
1081                                                              serdes_m_phy_change->val_low_speed);
1082                                         }
1083                                         break;
1084                                 case SERDES_UNIT_SGMII0:
1085                                 case SERDES_UNIT_SGMII1:
1086                                 case SERDES_UNIT_SGMII2:
1087                                 case SERDES_UNIT_SGMII3:
1088                                         if (line_cfg == serdes_cfg[line_num]
1089                                             [SERDES_UNIT_SGMII0])
1090                                                 sgmii_port = 0;
1091                                         else if (line_cfg ==
1092                                                  serdes_cfg[line_num]
1093                                                  [SERDES_UNIT_SGMII1])
1094                                                 sgmii_port = 1;
1095                                         else if (line_cfg ==
1096                                                  serdes_cfg[line_num]
1097                                                  [SERDES_UNIT_SGMII2])
1098                                                 sgmii_port = 2;
1099                                         else if (line_cfg ==
1100                                                  serdes_cfg[line_num]
1101                                                  [SERDES_UNIT_SGMII3])
1102                                                 sgmii_port = 3;
1103                                         else
1104                                                 break;
1105                                         if (bus_speed) {
1106                                                 reg_write(MV_ETH_REGS_BASE
1107                                                           (sgmii_port) |
1108                                                           serdes_m_phy_change->reg_hi_speed,
1109                                                           serdes_m_phy_change->val_hi_speed);
1110                                                 DEBUG_WR_REG(MV_ETH_REGS_BASE
1111                                                              (sgmii_port) |
1112                                                              serdes_m_phy_change->reg_hi_speed,
1113                                                              serdes_m_phy_change->val_hi_speed);
1114                                         } else {
1115                                                 reg_write(MV_ETH_REGS_BASE
1116                                                           (sgmii_port) |
1117                                                           serdes_m_phy_change->reg_low_speed,
1118                                                           serdes_m_phy_change->val_low_speed);
1119                                                 DEBUG_WR_REG(MV_ETH_REGS_BASE
1120                                                              (sgmii_port) |
1121                                                              serdes_m_phy_change->reg_low_speed,
1122                                                              serdes_m_phy_change->val_low_speed);
1123                                         }
1124                                         break;
1125                                 case SERDES_UNIT_QSGMII:
1126                                         if (line_cfg != SERDES_UNIT_QSGMII)
1127                                                 break;
1128                                         if (bus_speed) {
1129                                                 reg_write
1130                                                     (serdes_m_phy_change->reg_hi_speed,
1131                                                      serdes_m_phy_change->val_hi_speed);
1132                                                 DEBUG_WR_REG
1133                                                     (serdes_m_phy_change->reg_hi_speed,
1134                                                      serdes_m_phy_change->val_hi_speed);
1135                                         } else {
1136                                                 reg_write
1137                                                     (serdes_m_phy_change->reg_low_speed,
1138                                                      serdes_m_phy_change->val_low_speed);
1139                                                 DEBUG_WR_REG
1140                                                     (serdes_m_phy_change->reg_low_speed,
1141                                                      serdes_m_phy_change->val_low_speed);
1142                                         }
1143                                         break;
1144                                 default:
1145                                         break;
1146                                 }
1147                                 serdes_m_phy_change++;
1148                         }
1149                 }
1150         }
1151
1152         /* Step 16 [PEX-Only] Training Enable */
1153         DEBUG_INIT_FULL_S("Steps 16: [PEX-Only] Training Enable");
1154         tmp = reg_read(SOC_CTRL_REG);
1155         DEBUG_RD_REG(SOC_CTRL_REG, tmp);
1156         tmp &= ~(0x0F);
1157         for (pex_unit = 0; pex_unit < pex_max_unit_get(); pex_unit++) {
1158                 reg_write(PEX_CAUSE_REG(pex_unit), 0);
1159                 DEBUG_WR_REG(PEX_CAUSE_REG(pex_unit), 0);
1160                 if (info->pex_mode[pex_unit] != PEX_BUS_DISABLED)
1161                         tmp |= (0x1 << pex_unit);
1162         }
1163         reg_write(SOC_CTRL_REG, tmp);
1164         DEBUG_WR_REG(SOC_CTRL_REG, tmp);
1165
1166         /* Step 17: Speed change to target speed and width */
1167         {
1168                 u32 tmp_reg, tmp_pex_reg;
1169                 u32 addr;
1170                 u32 first_busno, next_busno;
1171                 u32 max_link_width = 0;
1172                 u32 neg_link_width = 0;
1173                 pex_if_num = pex_max_if_get();
1174                 mdelay(150);
1175                 DEBUG_INIT_FULL_C("step 17: max_if= 0x", pex_if_num, 1);
1176                 next_busno = 0;
1177                 for (pex_if = 0; pex_if < pex_if_num; pex_if++) {
1178                         line_num = (pex_if <= 8) ? pex_if : 12;
1179                         line_cfg = get_line_cfg(line_num, info);
1180                         if (line_cfg != serdes_cfg[line_num][SERDES_UNIT_PEX])
1181                                 continue;
1182                         pex_unit = (pex_if < 9) ? (pex_if >> 2) : 3;
1183                         DEBUG_INIT_FULL_S("step 17:  PEX");
1184                         DEBUG_INIT_FULL_D(pex_if, 1);
1185                         DEBUG_INIT_FULL_C("  pex_unit= ", pex_unit, 1);
1186
1187                         if (info->pex_mode[pex_unit] == PEX_BUS_DISABLED) {
1188                                 DEBUG_INIT_FULL_C("PEX disabled interface ",
1189                                                   pex_if, 1);
1190                                 if (pex_if < 8)
1191                                         pex_if += 3;
1192                                 continue;
1193                         }
1194                         first_busno = next_busno;
1195                         if ((info->pex_type == MV_PEX_END_POINT) &&
1196                             (0 == pex_if)) {
1197                                 if ((pex_if < 8) && (info->pex_mode[pex_unit] ==
1198                                                      PEX_BUS_MODE_X4))
1199                                         pex_if += 3;
1200                                 continue;
1201                         }
1202
1203                         tmp = reg_read(PEX_DBG_STATUS_REG(pex_if));
1204                         DEBUG_RD_REG(PEX_DBG_STATUS_REG(pex_if), tmp);
1205                         if ((tmp & 0x7f) == 0x7e) {
1206                                 next_busno++;
1207                                 tmp = reg_read(PEX_LINK_CAPABILITIES_REG(pex_if));
1208                                 max_link_width = tmp;
1209                                 DEBUG_RD_REG((PEX_LINK_CAPABILITIES_REG
1210                                               (pex_if)), tmp);
1211                                 max_link_width = ((max_link_width >> 4) & 0x3F);
1212                                 neg_link_width =
1213                                     reg_read(PEX_LINK_CTRL_STATUS_REG(pex_if));
1214                                 DEBUG_RD_REG((PEX_LINK_CTRL_STATUS_REG(pex_if)),
1215                                              neg_link_width);
1216                                 neg_link_width = ((neg_link_width >> 20) & 0x3F);
1217                                 if (max_link_width > neg_link_width) {
1218                                         tmp &= ~(0x3F << 4);
1219                                         tmp |= (neg_link_width << 4);
1220                                         reg_write(PEX_LINK_CAPABILITIES_REG
1221                                                   (pex_if), tmp);
1222                                         DEBUG_WR_REG((PEX_LINK_CAPABILITIES_REG
1223                                                       (pex_if)), tmp);
1224                                         mdelay(1);      /* wait 1ms before reading  capability for speed */
1225                                         DEBUG_INIT_S("PEX");
1226                                         DEBUG_INIT_D(pex_if, 1);
1227                                         DEBUG_INIT_C(": change width to X",
1228                                                      neg_link_width, 1);
1229                                 }
1230                                 tmp_pex_reg =
1231                                     reg_read((PEX_CFG_DIRECT_ACCESS
1232                                               (pex_if,
1233                                                PEX_LINK_CAPABILITY_REG)));
1234                                 DEBUG_RD_REG((PEX_CFG_DIRECT_ACCESS
1235                                               (pex_if,
1236                                                PEX_LINK_CAPABILITY_REG)),
1237                                              tmp_pex_reg);
1238                                 tmp_pex_reg &= (0xF);
1239                                 if (tmp_pex_reg == 0x2) {
1240                                         tmp_reg =
1241                                             (reg_read
1242                                              (PEX_CFG_DIRECT_ACCESS
1243                                               (pex_if,
1244                                                PEX_LINK_CTRL_STAT_REG)) &
1245                                              0xF0000) >> 16;
1246                                         DEBUG_RD_REG(PEX_CFG_DIRECT_ACCESS
1247                                                      (pex_if,
1248                                                       PEX_LINK_CTRL_STAT_REG),
1249                                                      tmp_pex_reg);
1250                                         /* check if the link established is GEN1 */
1251                                         if (tmp_reg == 0x1) {
1252                                                 pex_local_bus_num_set(pex_if,
1253                                                                       first_busno);
1254                                                 pex_local_dev_num_set(pex_if,
1255                                                                       1);
1256
1257                                                 DEBUG_INIT_FULL_S("** Link is Gen1, check the EP capability\n");
1258                                                 /* link is Gen1, check the EP capability */
1259                                                 addr =
1260                                                     pex_cfg_read(pex_if,
1261                                                                  first_busno, 0,
1262                                                                  0,
1263                                                                  0x34) & 0xFF;
1264                                                 DEBUG_INIT_FULL_C("pex_cfg_read: return addr=0x%x",
1265                                                      addr, 4);
1266                                                 if (addr == 0xff) {
1267                                                         DEBUG_INIT_FULL_C("pex_cfg_read: return 0xff -->PEX (%d): Detected No Link.",
1268                                                                           pex_if, 1);
1269                                                         continue;
1270                                                 }
1271                                                 while ((pex_cfg_read
1272                                                         (pex_if, first_busno, 0,
1273                                                          0,
1274                                                          addr) & 0xFF) !=
1275                                                        0x10) {
1276                                                         addr =
1277                                                             (pex_cfg_read
1278                                                              (pex_if,
1279                                                               first_busno, 0, 0,
1280                                                               addr) & 0xFF00) >>
1281                                                             8;
1282                                                 }
1283                                                 if ((pex_cfg_read
1284                                                      (pex_if, first_busno, 0, 0,
1285                                                       addr + 0xC) & 0xF) >=
1286                                                     0x2) {
1287                                                         tmp =
1288                                                             reg_read
1289                                                             (PEX_LINK_CTRL_STATUS2_REG
1290                                                              (pex_if));
1291                                                         DEBUG_RD_REG
1292                                                             (PEX_LINK_CTRL_STATUS2_REG
1293                                                              (pex_if), tmp);
1294                                                         tmp &= ~(0x1 | 1 << 1);
1295                                                         tmp |= (1 << 1);
1296                                                         reg_write
1297                                                             (PEX_LINK_CTRL_STATUS2_REG
1298                                                              (pex_if), tmp);
1299                                                         DEBUG_WR_REG
1300                                                             (PEX_LINK_CTRL_STATUS2_REG
1301                                                              (pex_if), tmp);
1302
1303                                                         tmp =
1304                                                             reg_read
1305                                                             (PEX_CTRL_REG
1306                                                              (pex_if));
1307                                                         DEBUG_RD_REG
1308                                                             (PEX_CTRL_REG
1309                                                              (pex_if), tmp);
1310                                                         tmp |= (1 << 10);
1311                                                         reg_write(PEX_CTRL_REG
1312                                                                   (pex_if),
1313                                                                   tmp);
1314                                                         DEBUG_WR_REG
1315                                                             (PEX_CTRL_REG
1316                                                              (pex_if), tmp);
1317                                                         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 */
1318                                                         DEBUG_INIT_FULL_S
1319                                                             ("Gen2 client!\n");
1320                                                 } else {
1321                                                         DEBUG_INIT_FULL_S
1322                                                             ("GEN1 client!\n");
1323                                                 }
1324                                         }
1325                                 }
1326                         } else {
1327                                 DEBUG_INIT_FULL_S("PEX");
1328                                 DEBUG_INIT_FULL_D(pex_if, 1);
1329                                 DEBUG_INIT_FULL_S(" : Detected No Link. Status Reg(0x");
1330                                 DEBUG_INIT_FULL_D(PEX_DBG_STATUS_REG(pex_if),
1331                                                   8);
1332                                 DEBUG_INIT_FULL_C(") = 0x", tmp, 8);
1333                         }
1334
1335                         if ((pex_if < 8) &&
1336                             (info->pex_mode[pex_unit] == PEX_BUS_MODE_X4))
1337                                 pex_if += 3;
1338                 }
1339         }
1340
1341         /* Step 18: update pex DEVICE ID */
1342         {
1343                 u32 devId;
1344                 pex_if_num = pex_max_if_get();
1345                 ctrl_mode = ctrl_model_get();
1346                 for (pex_if = 0; pex_if < pex_if_num; pex_if++) {
1347                         pex_unit = (pex_if < 9) ? (pex_if >> 2) : 3;
1348                         if (info->pex_mode[pex_unit] == PEX_BUS_DISABLED) {
1349                                 if ((pex_if < 8) &&
1350                                     (info->pex_mode[pex_unit] == PEX_BUS_MODE_X4))
1351                                         pex_if += 3;
1352                                 continue;
1353                         }
1354
1355                         devId = reg_read(PEX_CFG_DIRECT_ACCESS(
1356                                                  pex_if, PEX_DEVICE_AND_VENDOR_ID));
1357                         devId &= 0xFFFF;
1358                         devId |= ((ctrl_mode << 16) & 0xffff0000);
1359                         DEBUG_INIT_S("Update Device ID PEX");
1360                         DEBUG_INIT_D(pex_if, 1);
1361                         DEBUG_INIT_D(devId, 8);
1362                         DEBUG_INIT_S("\n");
1363                         reg_write(PEX_CFG_DIRECT_ACCESS
1364                                   (pex_if, PEX_DEVICE_AND_VENDOR_ID), devId);
1365                         if ((pex_if < 8) &&
1366                             (info->pex_mode[pex_unit] == PEX_BUS_MODE_X4))
1367                                 pex_if += 3;
1368                 }
1369                 DEBUG_INIT_S("Update PEX Device ID 0x");
1370                 DEBUG_INIT_D(ctrl_mode, 4);
1371                 DEBUG_INIT_S("0\n");
1372         }
1373         tmp = reg_read(PEX_DBG_STATUS_REG(0));
1374         DEBUG_RD_REG(PEX_DBG_STATUS_REG(0), tmp);
1375
1376         DEBUG_INIT_S(ENDED_OK);
1377         return MV_OK;
1378 }
1379
1380 /* PEX configuration space read write */
1381
1382 /*
1383  * pex_cfg_read - Read from configuration space
1384  *
1385  * DESCRIPTION:
1386  *       This function performs a 32 bit read from PEX configuration space.
1387  *       It supports both type 0 and type 1 of Configuration Transactions
1388  *       (local and over bridge). In order to read from local bus segment, use
1389  *       bus number retrieved from mvPexLocalBusNumGet(). Other bus numbers
1390  *       will result configuration transaction of type 1 (over bridge).
1391  *
1392  * INPUT:
1393  *       pex_if   - PEX interface number.
1394  *       bus     - PEX segment bus number.
1395  *       dev     - PEX device number.
1396  *       func    - Function number.
1397  *       offss - Register offset.
1398  *
1399  * OUTPUT:
1400  *       None.
1401  *
1402  * RETURN:
1403  *       32bit register data, 0xffffffff on error
1404  *
1405  */
1406 u32 pex_cfg_read(u32 pex_if, u32 bus, u32 dev, u32 func, u32 offs)
1407 {
1408         u32 pex_data = 0;
1409         u32 local_dev, local_bus;
1410         u32 val;
1411
1412         if (pex_if >= MV_PEX_MAX_IF)
1413                 return 0xFFFFFFFF;
1414
1415         if (dev >= MAX_PEX_DEVICES) {
1416                 DEBUG_INIT_C("pex_cfg_read: ERR. device number illigal ", dev,
1417                              1);
1418                 return 0xFFFFFFFF;
1419         }
1420
1421         if (func >= MAX_PEX_FUNCS) {
1422                 DEBUG_INIT_C("pex_cfg_read: ERR. function num illigal ", func,
1423                              1);
1424                 return 0xFFFFFFFF;
1425         }
1426
1427         if (bus >= MAX_PEX_BUSSES) {
1428                 DEBUG_INIT_C("pex_cfg_read: ERR. bus number illigal ", bus, 1);
1429                 return MV_ERROR;
1430         }
1431         val = reg_read(PEX_STATUS_REG(pex_if));
1432
1433         local_dev =
1434             ((val & PXSR_PEX_DEV_NUM_MASK) >> PXSR_PEX_DEV_NUM_OFFS);
1435         local_bus =
1436             ((val & PXSR_PEX_BUS_NUM_MASK) >> PXSR_PEX_BUS_NUM_OFFS);
1437
1438         /* Speed up the process. In case on no link, return MV_ERROR */
1439         if ((dev != local_dev) || (bus != local_bus)) {
1440                 pex_data = reg_read(PEX_STATUS_REG(pex_if));
1441
1442                 if ((pex_data & PXSR_DL_DOWN))
1443                         return MV_ERROR;
1444         }
1445
1446         /*
1447          * In PCI Express we have only one device number
1448          * and this number is the first number we encounter else that the
1449          * local_dev spec pex define return on config read/write on any device
1450          */
1451         if (bus == local_bus) {
1452                 if (local_dev == 0) {
1453                         /*
1454                          * If local dev is 0 then the first number we encounter
1455                          * after 0 is 1
1456                          */
1457                         if ((dev != 1) && (dev != local_dev))
1458                                 return MV_ERROR;
1459                 } else {
1460                         /*
1461                          * If local dev is not 0 then the first number we
1462                          * encounter is 0
1463                          */
1464                         if ((dev != 0) && (dev != local_dev))
1465                                 return MV_ERROR;
1466                 }
1467         }
1468
1469         /* Creating PEX address to be passed */
1470         pex_data = (bus << PXCAR_BUS_NUM_OFFS);
1471         pex_data |= (dev << PXCAR_DEVICE_NUM_OFFS);
1472         pex_data |= (func << PXCAR_FUNC_NUM_OFFS);
1473         pex_data |= (offs & PXCAR_REG_NUM_MASK);        /* lgacy register space */
1474         /* extended register space */
1475         pex_data |= (((offs & PXCAR_REAL_EXT_REG_NUM_MASK) >>
1476                      PXCAR_REAL_EXT_REG_NUM_OFFS) << PXCAR_EXT_REG_NUM_OFFS);
1477
1478         pex_data |= PXCAR_CONFIG_EN;
1479
1480         /* Write the address to the PEX configuration address register */
1481         reg_write(PEX_CFG_ADDR_REG(pex_if), pex_data);
1482
1483         /*
1484          * In order to let the PEX controller absorbed the address of the read
1485          * transaction we perform a validity check that the address was written
1486          */
1487         if (pex_data != reg_read(PEX_CFG_ADDR_REG(pex_if)))
1488                 return MV_ERROR;
1489
1490         /* cleaning Master Abort */
1491         reg_bit_set(PEX_CFG_DIRECT_ACCESS(pex_if, PEX_STATUS_AND_COMMAND),
1492                     PXSAC_MABORT);
1493         /* Read the Data returned in the PEX Data register */
1494         pex_data = reg_read(PEX_CFG_DATA_REG(pex_if));
1495
1496         DEBUG_INIT_FULL_C(" --> ", pex_data, 4);
1497
1498         return pex_data;
1499 }
1500
1501 /*
1502  * pex_local_bus_num_set - Set PEX interface local bus number.
1503  *
1504  * DESCRIPTION:
1505  *       This function sets given PEX interface its local bus number.
1506  *       Note: In case the PEX interface is PEX-X, the information is read-only.
1507  *
1508  * INPUT:
1509  *       pex_if  - PEX interface number.
1510  *       bus_num - Bus number.
1511  *
1512  * OUTPUT:
1513  *       None.
1514  *
1515  * RETURN:
1516  *       MV_NOT_ALLOWED in case PEX interface is PEX-X.
1517  *              MV_BAD_PARAM on bad parameters ,
1518  *       otherwise MV_OK
1519  *
1520  */
1521 int pex_local_bus_num_set(u32 pex_if, u32 bus_num)
1522 {
1523         u32 val;
1524
1525         if (bus_num >= MAX_PEX_BUSSES) {
1526                 DEBUG_INIT_C("pex_local_bus_num_set: ERR. bus number illigal %d\n",
1527                      bus_num, 4);
1528                 return MV_ERROR;
1529         }
1530
1531         val = reg_read(PEX_STATUS_REG(pex_if));
1532         val &= ~PXSR_PEX_BUS_NUM_MASK;
1533         val |= (bus_num << PXSR_PEX_BUS_NUM_OFFS) & PXSR_PEX_BUS_NUM_MASK;
1534         reg_write(PEX_STATUS_REG(pex_if), val);
1535
1536         return MV_OK;
1537 }
1538
1539 /*
1540  * pex_local_dev_num_set - Set PEX interface local device number.
1541  *
1542  * DESCRIPTION:
1543  *       This function sets given PEX interface its local device number.
1544  *       Note: In case the PEX interface is PEX-X, the information is read-only.
1545  *
1546  * INPUT:
1547  *       pex_if  - PEX interface number.
1548  *       dev_num - Device number.
1549  *
1550  * OUTPUT:
1551  *       None.
1552  *
1553  * RETURN:
1554  *       MV_NOT_ALLOWED in case PEX interface is PEX-X.
1555  *              MV_BAD_PARAM on bad parameters ,
1556  *       otherwise MV_OK
1557  *
1558  */
1559 int pex_local_dev_num_set(u32 pex_if, u32 dev_num)
1560 {
1561         u32 val;
1562
1563         if (pex_if >= MV_PEX_MAX_IF)
1564                 return MV_BAD_PARAM;
1565
1566         val = reg_read(PEX_STATUS_REG(pex_if));
1567         val &= ~PXSR_PEX_DEV_NUM_MASK;
1568         val |= (dev_num << PXSR_PEX_DEV_NUM_OFFS) & PXSR_PEX_DEV_NUM_MASK;
1569         reg_write(PEX_STATUS_REG(pex_if), val);
1570
1571         return MV_OK;
1572 }