mips: octeon: Add octeon_qlm.c
[platform/kernel/u-boot.git] / arch / mips / mach-octeon / octeon_qlm.c
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * Copyright (C) 2020 Marvell International Ltd.
4  */
5
6 #include <dm.h>
7 #include <time.h>
8 #include <linux/delay.h>
9
10 #include <mach/cvmx-regs.h>
11 #include <mach/octeon-model.h>
12 #include <mach/cvmx-fuse.h>
13 #include <mach/cvmx-qlm.h>
14 #include <mach/octeon_qlm.h>
15 #include <mach/cvmx-pcie.h>
16
17 #include <mach/cvmx-bgxx-defs.h>
18 #include <mach/cvmx-ciu-defs.h>
19 #include <mach/cvmx-gmxx-defs.h>
20 #include <mach/cvmx-gserx-defs.h>
21 #include <mach/cvmx-mio-defs.h>
22 #include <mach/cvmx-pciercx-defs.h>
23 #include <mach/cvmx-pemx-defs.h>
24 #include <mach/cvmx-pexp-defs.h>
25 #include <mach/cvmx-rst-defs.h>
26 #include <mach/cvmx-sata-defs.h>
27 #include <mach/cvmx-sli-defs.h>
28 #include <mach/cvmx-sriomaintx-defs.h>
29 #include <mach/cvmx-sriox-defs.h>
30
31 DECLARE_GLOBAL_DATA_PTR;
32
33 /** 2.5GHz with 100MHz reference clock */
34 #define R_2_5G_REFCLK100 0x0
35 /** 5.0GHz with 100MHz reference clock */
36 #define R_5G_REFCLK100 0x1
37 /** 8.0GHz with 100MHz reference clock */
38 #define R_8G_REFCLK100 0x2
39 /** 1.25GHz with 156.25MHz reference clock */
40 #define R_125G_REFCLK15625_KX 0x3
41 /** 3.125Ghz with 156.25MHz reference clock (XAUI) */
42 #define R_3125G_REFCLK15625_XAUI 0x4
43 /** 10.3125GHz with 156.25MHz reference clock (XFI/XLAUI) */
44 #define R_103125G_REFCLK15625_KR 0x5
45 /** 1.25GHz with 156.25MHz reference clock (SGMII) */
46 #define R_125G_REFCLK15625_SGMII 0x6
47 /** 5GHz with 156.25MHz reference clock (QSGMII) */
48 #define R_5G_REFCLK15625_QSGMII 0x7
49 /** 6.25GHz with 156.25MHz reference clock (RXAUI/25G) */
50 #define R_625G_REFCLK15625_RXAUI 0x8
51 /** 2.5GHz with 125MHz reference clock */
52 #define R_2_5G_REFCLK125 0x9
53 /** 5GHz with 125MHz reference clock */
54 #define R_5G_REFCLK125 0xa
55 /** 8GHz with 125MHz reference clock */
56 #define R_8G_REFCLK125 0xb
57 /** Must be last, number of modes */
58 #define R_NUM_LANE_MODES 0xc
59
60 int cvmx_qlm_is_ref_clock(int qlm, int reference_mhz)
61 {
62         int ref_clock = cvmx_qlm_measure_clock(qlm);
63         int mhz = ref_clock / 1000000;
64         int range = reference_mhz / 10;
65
66         return ((mhz >= reference_mhz - range) && (mhz <= reference_mhz + range));
67 }
68
69 static int __get_qlm_spd(int qlm, int speed)
70 {
71         int qlm_spd = 0xf;
72
73         if (cvmx_qlm_is_ref_clock(qlm, 100)) {
74                 if (speed == 1250)
75                         qlm_spd = 0x3;
76                 else if (speed == 2500)
77                         qlm_spd = 0x2;
78                 else if (speed == 5000)
79                         qlm_spd = 0x0;
80                 else
81                         qlm_spd = 0xf;
82         } else if (cvmx_qlm_is_ref_clock(qlm, 125)) {
83                 if (speed == 1250)
84                         qlm_spd = 0xa;
85                 else if (speed == 2500)
86                         qlm_spd = 0x9;
87                 else if (speed == 3125)
88                         qlm_spd = 0x8;
89                 else if (speed == 5000)
90                         qlm_spd = 0x6;
91                 else if (speed == 6250)
92                         qlm_spd = 0x5;
93                 else
94                         qlm_spd = 0xf;
95         } else if (cvmx_qlm_is_ref_clock(qlm, 156)) {
96                 if (speed == 1250)
97                         qlm_spd = 0x4;
98                 else if (speed == 2500)
99                         qlm_spd = 0x7;
100                 else if (speed == 3125)
101                         qlm_spd = 0xe;
102                 else if (speed == 3750)
103                         qlm_spd = 0xd;
104                 else if (speed == 5000)
105                         qlm_spd = 0xb;
106                 else if (speed == 6250)
107                         qlm_spd = 0xc;
108                 else
109                         qlm_spd = 0xf;
110         } else if (cvmx_qlm_is_ref_clock(qlm, 161)) {
111                 if (speed == 6316)
112                         qlm_spd = 0xc;
113         }
114         return qlm_spd;
115 }
116
117 static void __set_qlm_pcie_mode_61xx(int pcie_port, int root_complex)
118 {
119         int rc = root_complex ? 1 : 0;
120         int ep = root_complex ? 0 : 1;
121         cvmx_ciu_soft_prst1_t soft_prst1;
122         cvmx_ciu_soft_prst_t soft_prst;
123         cvmx_mio_rst_ctlx_t rst_ctl;
124
125         if (pcie_port) {
126                 soft_prst1.u64 = csr_rd(CVMX_CIU_SOFT_PRST1);
127                 soft_prst1.s.soft_prst = 1;
128                 csr_wr(CVMX_CIU_SOFT_PRST1, soft_prst1.u64);
129         } else {
130                 soft_prst.u64 = csr_rd(CVMX_CIU_SOFT_PRST);
131                 soft_prst.s.soft_prst = 1;
132                 csr_wr(CVMX_CIU_SOFT_PRST, soft_prst.u64);
133         }
134
135         rst_ctl.u64 = csr_rd(CVMX_MIO_RST_CTLX(pcie_port));
136
137         rst_ctl.s.prst_link = rc;
138         rst_ctl.s.rst_link = ep;
139         rst_ctl.s.prtmode = rc;
140         rst_ctl.s.rst_drv = rc;
141         rst_ctl.s.rst_rcv = 0;
142         rst_ctl.s.rst_chip = ep;
143         csr_wr(CVMX_MIO_RST_CTLX(pcie_port), rst_ctl.u64);
144
145         if (root_complex == 0) {
146                 if (pcie_port) {
147                         soft_prst1.u64 = csr_rd(CVMX_CIU_SOFT_PRST1);
148                         soft_prst1.s.soft_prst = 0;
149                         csr_wr(CVMX_CIU_SOFT_PRST1, soft_prst1.u64);
150                 } else {
151                         soft_prst.u64 = csr_rd(CVMX_CIU_SOFT_PRST);
152                         soft_prst.s.soft_prst = 0;
153                         csr_wr(CVMX_CIU_SOFT_PRST, soft_prst.u64);
154                 }
155         }
156 }
157
158 /**
159  * Configure qlm speed and mode. MIO_QLMX_CFG[speed,mode] are not set
160  * for CN61XX.
161  *
162  * @param qlm     The QLM to configure
163  * @param speed   The speed the QLM needs to be configured in Mhz.
164  * @param mode    The QLM to be configured as SGMII/XAUI/PCIe.
165  *                  QLM 0: 0 = PCIe0 1X4, 1 = Reserved, 2 = SGMII1, 3 = XAUI1
166  *                  QLM 1: 0 = PCIe1 1x2, 1 = PCIe(0/1) 2x1, 2 - 3 = Reserved
167  *                  QLM 2: 0 - 1 = Reserved, 2 = SGMII0, 3 = XAUI0
168  * @param rc      Only used for PCIe, rc = 1 for root complex mode, 0 for EP
169  *                mode.
170  * @param pcie2x1 Only used when QLM1 is in PCIE2x1 mode.  The QLM_SPD has a
171  *                different value on how PEMx needs to be configured:
172  *                   0x0 - both PEM0 & PEM1 are in gen1 mode.
173  *                   0x1 - PEM0 in gen2 and PEM1 in gen1 mode.
174  *                   0x2 - PEM0 in gen1 and PEM1 in gen2 mode.
175  *                   0x3 - both PEM0 & PEM1 are in gen2 mode.
176  *               SPEED value is ignored in this mode. QLM_SPD is set based on
177  *               pcie2x1 value in this mode.
178  *
179  * @return       Return 0 on success or -1.
180  */
181 static int octeon_configure_qlm_cn61xx(int qlm, int speed, int mode, int rc, int pcie2x1)
182 {
183         cvmx_mio_qlmx_cfg_t qlm_cfg;
184
185         /* The QLM speed varies for SGMII/XAUI and PCIe mode. And depends on
186          * reference clock.
187          */
188         if (!OCTEON_IS_MODEL(OCTEON_CN61XX))
189                 return -1;
190
191         if (qlm < 3) {
192                 qlm_cfg.u64 = csr_rd(CVMX_MIO_QLMX_CFG(qlm));
193         } else {
194                 debug("WARNING: Invalid QLM(%d) passed\n", qlm);
195                 return -1;
196         }
197
198         switch (qlm) {
199                 /* SGMII/XAUI mode */
200         case 2: {
201                 if (mode < 2) {
202                         qlm_cfg.s.qlm_spd = 0xf;
203                         break;
204                 }
205                 qlm_cfg.s.qlm_spd = __get_qlm_spd(qlm, speed);
206                 qlm_cfg.s.qlm_cfg = mode;
207                 break;
208         }
209         case 1: {
210                 if (mode == 1) { /* 2x1 mode */
211                         cvmx_mio_qlmx_cfg_t qlm0;
212
213                         /* When QLM0 is configured as PCIe(QLM_CFG=0x0)
214                          * and enabled (QLM_SPD != 0xf), QLM1 cannot be
215                          * configured as PCIe 2x1 mode (QLM_CFG=0x1)
216                          * and enabled (QLM_SPD != 0xf).
217                          */
218                         qlm0.u64 = csr_rd(CVMX_MIO_QLMX_CFG(0));
219                         if (qlm0.s.qlm_spd != 0xf && qlm0.s.qlm_cfg == 0) {
220                                 debug("Invalid mode(%d) for QLM(%d) as QLM1 is PCIe mode\n",
221                                       mode, qlm);
222                                 qlm_cfg.s.qlm_spd = 0xf;
223                                 break;
224                         }
225
226                         /* Set QLM_SPD based on reference clock and mode */
227                         if (cvmx_qlm_is_ref_clock(qlm, 100)) {
228                                 if (pcie2x1 == 0x3)
229                                         qlm_cfg.s.qlm_spd = 0x0;
230                                 else if (pcie2x1 == 0x1)
231                                         qlm_cfg.s.qlm_spd = 0x2;
232                                 else if (pcie2x1 == 0x2)
233                                         qlm_cfg.s.qlm_spd = 0x1;
234                                 else if (pcie2x1 == 0x0)
235                                         qlm_cfg.s.qlm_spd = 0x3;
236                                 else
237                                         qlm_cfg.s.qlm_spd = 0xf;
238                         } else if (cvmx_qlm_is_ref_clock(qlm, 125)) {
239                                 if (pcie2x1 == 0x3)
240                                         qlm_cfg.s.qlm_spd = 0x4;
241                                 else if (pcie2x1 == 0x1)
242                                         qlm_cfg.s.qlm_spd = 0x6;
243                                 else if (pcie2x1 == 0x2)
244                                         qlm_cfg.s.qlm_spd = 0x9;
245                                 else if (pcie2x1 == 0x0)
246                                         qlm_cfg.s.qlm_spd = 0x7;
247                                 else
248                                         qlm_cfg.s.qlm_spd = 0xf;
249                         }
250                         qlm_cfg.s.qlm_cfg = mode;
251                         csr_wr(CVMX_MIO_QLMX_CFG(qlm), qlm_cfg.u64);
252
253                         /* Set PCIe mode bits */
254                         __set_qlm_pcie_mode_61xx(0, rc);
255                         __set_qlm_pcie_mode_61xx(1, rc);
256                         return 0;
257                 } else if (mode > 1) {
258                         debug("Invalid mode(%d) for QLM(%d).\n", mode, qlm);
259                         qlm_cfg.s.qlm_spd = 0xf;
260                         break;
261                 }
262
263                 /* Set speed and mode for PCIe 1x2 mode. */
264                 if (cvmx_qlm_is_ref_clock(qlm, 100)) {
265                         if (speed == 5000)
266                                 qlm_cfg.s.qlm_spd = 0x1;
267                         else if (speed == 2500)
268                                 qlm_cfg.s.qlm_spd = 0x2;
269                         else
270                                 qlm_cfg.s.qlm_spd = 0xf;
271                 } else if (cvmx_qlm_is_ref_clock(qlm, 125)) {
272                         if (speed == 5000)
273                                 qlm_cfg.s.qlm_spd = 0x4;
274                         else if (speed == 2500)
275                                 qlm_cfg.s.qlm_spd = 0x6;
276                         else
277                                 qlm_cfg.s.qlm_spd = 0xf;
278                 } else {
279                         qlm_cfg.s.qlm_spd = 0xf;
280                 }
281
282                 qlm_cfg.s.qlm_cfg = mode;
283                 csr_wr(CVMX_MIO_QLMX_CFG(qlm), qlm_cfg.u64);
284
285                 /* Set PCIe mode bits */
286                 __set_qlm_pcie_mode_61xx(1, rc);
287                 return 0;
288         }
289         case 0: {
290                 /* QLM_CFG = 0x1 - Reserved */
291                 if (mode == 1) {
292                         qlm_cfg.s.qlm_spd = 0xf;
293                         break;
294                 }
295                 /* QLM_CFG = 0x0 - PCIe 1x4(PEM0) */
296                 if (mode == 0 && speed != 5000 && speed != 2500) {
297                         qlm_cfg.s.qlm_spd = 0xf;
298                         break;
299                 }
300
301                 /* Set speed and mode */
302                 qlm_cfg.s.qlm_spd = __get_qlm_spd(qlm, speed);
303                 qlm_cfg.s.qlm_cfg = mode;
304                 csr_wr(CVMX_MIO_QLMX_CFG(qlm), qlm_cfg.u64);
305
306                 /* Set PCIe mode bits */
307                 if (mode == 0)
308                         __set_qlm_pcie_mode_61xx(0, rc);
309
310                 return 0;
311         }
312         default:
313                 debug("WARNING: Invalid QLM(%d) passed\n", qlm);
314                 qlm_cfg.s.qlm_spd = 0xf;
315         }
316         csr_wr(CVMX_MIO_QLMX_CFG(qlm), qlm_cfg.u64);
317         return 0;
318 }
319
320 /* qlm      : DLM to configure
321  * baud_mhz : speed of the DLM
322  * ref_clk_sel  :  reference clock speed selection where:
323  *                      0:      100MHz
324  *                      1:      125MHz
325  *                      2:      156.25MHz
326  *
327  * ref_clk_input:  reference clock input where:
328  *                      0:      DLMC_REF_CLK0_[P,N]
329  *                      1:      DLMC_REF_CLK1_[P,N]
330  *                      2:      DLM0_REF_CLK_[P,N] (only valid for QLM 0)
331  * is_sff7000_rxaui : boolean to indicate whether qlm is RXAUI on SFF7000
332  */
333 static int __dlm_setup_pll_cn70xx(int qlm, int baud_mhz, int ref_clk_sel, int ref_clk_input,
334                                   int is_sff7000_rxaui)
335 {
336         cvmx_gserx_dlmx_test_powerdown_t dlmx_test_powerdown;
337         cvmx_gserx_dlmx_ref_ssp_en_t dlmx_ref_ssp_en;
338         cvmx_gserx_dlmx_mpll_en_t dlmx_mpll_en;
339         cvmx_gserx_dlmx_phy_reset_t dlmx_phy_reset;
340         cvmx_gserx_dlmx_tx_amplitude_t tx_amplitude;
341         cvmx_gserx_dlmx_tx_preemph_t tx_preemph;
342         cvmx_gserx_dlmx_rx_eq_t rx_eq;
343         cvmx_gserx_dlmx_ref_clkdiv2_t ref_clkdiv2;
344         cvmx_gserx_dlmx_mpll_multiplier_t mpll_multiplier;
345         int gmx_ref_clk = 100;
346
347         debug("%s(%d, %d, %d, %d, %d)\n", __func__, qlm, baud_mhz, ref_clk_sel, ref_clk_input,
348               is_sff7000_rxaui);
349         if (ref_clk_sel == 1)
350                 gmx_ref_clk = 125;
351         else if (ref_clk_sel == 2)
352                 gmx_ref_clk = 156;
353
354         if (qlm != 0 && ref_clk_input == 2) {
355                 printf("%s: Error: can only use reference clock inputs 0 or 1 for DLM %d\n",
356                        __func__, qlm);
357                 return -1;
358         }
359
360         /* Hardware defaults are invalid */
361         tx_amplitude.u64 = csr_rd(CVMX_GSERX_DLMX_TX_AMPLITUDE(qlm, 0));
362         if (is_sff7000_rxaui) {
363                 tx_amplitude.s.tx0_amplitude = 100;
364                 tx_amplitude.s.tx1_amplitude = 100;
365         } else {
366                 tx_amplitude.s.tx0_amplitude = 65;
367                 tx_amplitude.s.tx1_amplitude = 65;
368         }
369
370         csr_wr(CVMX_GSERX_DLMX_TX_AMPLITUDE(qlm, 0), tx_amplitude.u64);
371
372         tx_preemph.u64 = csr_rd(CVMX_GSERX_DLMX_TX_PREEMPH(qlm, 0));
373
374         if (is_sff7000_rxaui) {
375                 tx_preemph.s.tx0_preemph = 0;
376                 tx_preemph.s.tx1_preemph = 0;
377         } else {
378                 tx_preemph.s.tx0_preemph = 22;
379                 tx_preemph.s.tx1_preemph = 22;
380         }
381         csr_wr(CVMX_GSERX_DLMX_TX_PREEMPH(qlm, 0), tx_preemph.u64);
382
383         rx_eq.u64 = csr_rd(CVMX_GSERX_DLMX_RX_EQ(qlm, 0));
384         rx_eq.s.rx0_eq = 0;
385         rx_eq.s.rx1_eq = 0;
386         csr_wr(CVMX_GSERX_DLMX_RX_EQ(qlm, 0), rx_eq.u64);
387
388         /* 1. Write GSER0_DLM0_REF_USE_PAD[REF_USE_PAD] = 1 (to select
389          *    reference-clock input)
390          *    The documentation for this register in the HRM is useless since
391          *    it says it selects between two different clocks that are not
392          *    documented anywhere.  What it really does is select between
393          *    DLM0_REF_CLK_[P,N] if 1 and DLMC_REF_CLK[0,1]_[P,N] if 0.
394          *
395          *    This register must be 0 for DLMs 1 and 2 and can only be 1 for
396          *    DLM 0.
397          */
398         csr_wr(CVMX_GSERX_DLMX_REF_USE_PAD(0, 0), ((ref_clk_input == 2) && (qlm == 0)) ? 1 : 0);
399
400         /* Reference clock was already chosen before we got here */
401
402         /* 2. Write GSER0_DLM0_REFCLK_SEL[REFCLK_SEL] if required for
403          *    reference-clock selection.
404          *
405          *    If GSERX_DLMX_REF_USE_PAD is 1 then this register is ignored.
406          */
407         csr_wr(CVMX_GSERX_DLMX_REFCLK_SEL(0, 0), ref_clk_input & 1);
408
409         /* Reference clock was already chosen before we got here */
410
411         /* 3. If required, write GSER0_DLM0_REF_CLKDIV2[REF_CLKDIV2] (must be
412          *    set if reference clock > 100 MHz)
413          */
414         /* Apply workaround for Errata (G-20669) MPLL may not come up. */
415         ref_clkdiv2.u64 = csr_rd(CVMX_GSERX_DLMX_REF_CLKDIV2(qlm, 0));
416         if (gmx_ref_clk == 100)
417                 ref_clkdiv2.s.ref_clkdiv2 = 0;
418         else
419                 ref_clkdiv2.s.ref_clkdiv2 = 1;
420         csr_wr(CVMX_GSERX_DLMX_REF_CLKDIV2(qlm, 0), ref_clkdiv2.u64);
421
422         /* 1. Ensure GSER(0)_DLM(0..2)_PHY_RESET[PHY_RESET] is set. */
423         dlmx_phy_reset.u64 = csr_rd(CVMX_GSERX_DLMX_PHY_RESET(qlm, 0));
424         dlmx_phy_reset.s.phy_reset = 1;
425         csr_wr(CVMX_GSERX_DLMX_PHY_RESET(qlm, 0), dlmx_phy_reset.u64);
426
427         /* 2. If SGMII or QSGMII or RXAUI (i.e. if DLM0) set
428          *    GSER(0)_DLM(0)_MPLL_EN[MPLL_EN] to one.
429          */
430         /* 7. Set GSER0_DLM0_MPLL_EN[MPLL_EN] = 1 */
431         dlmx_mpll_en.u64 = csr_rd(CVMX_GSERX_DLMX_MPLL_EN(0, 0));
432         dlmx_mpll_en.s.mpll_en = 1;
433         csr_wr(CVMX_GSERX_DLMX_MPLL_EN(0, 0), dlmx_mpll_en.u64);
434
435         /* 3. Set GSER(0)_DLM(0..2)_MPLL_MULTIPLIER[MPLL_MULTIPLIER]
436          *    to the value in the preceding table, which is different
437          *    than the desired setting prescribed by the HRM.
438          */
439         mpll_multiplier.u64 = csr_rd(CVMX_GSERX_DLMX_MPLL_MULTIPLIER(qlm, 0));
440         if (gmx_ref_clk == 100)
441                 mpll_multiplier.s.mpll_multiplier = 35;
442         else if (gmx_ref_clk == 125)
443                 mpll_multiplier.s.mpll_multiplier = 56;
444         else
445                 mpll_multiplier.s.mpll_multiplier = 45;
446         debug("%s: Setting mpll multiplier to %u for DLM%d, baud %d, clock rate %uMHz\n",
447               __func__, mpll_multiplier.s.mpll_multiplier, qlm, baud_mhz, gmx_ref_clk);
448
449         csr_wr(CVMX_GSERX_DLMX_MPLL_MULTIPLIER(qlm, 0), mpll_multiplier.u64);
450
451         /* 5. Clear GSER0_DLM0_TEST_POWERDOWN[TEST_POWERDOWN] */
452         dlmx_test_powerdown.u64 = csr_rd(CVMX_GSERX_DLMX_TEST_POWERDOWN(qlm, 0));
453         dlmx_test_powerdown.s.test_powerdown = 0;
454         csr_wr(CVMX_GSERX_DLMX_TEST_POWERDOWN(qlm, 0), dlmx_test_powerdown.u64);
455
456         /* 6. Set GSER0_DLM0_REF_SSP_EN[REF_SSP_EN] = 1 */
457         dlmx_ref_ssp_en.u64 = csr_rd(CVMX_GSERX_DLMX_REF_SSP_EN(qlm, 0));
458         dlmx_ref_ssp_en.s.ref_ssp_en = 1;
459         csr_wr(CVMX_GSERX_DLMX_REF_SSP_EN(0, 0), dlmx_ref_ssp_en.u64);
460
461         /* 8. Clear GSER0_DLM0_PHY_RESET[PHY_RESET] = 0 */
462         dlmx_phy_reset.u64 = csr_rd(CVMX_GSERX_DLMX_PHY_RESET(qlm, 0));
463         dlmx_phy_reset.s.phy_reset = 0;
464         csr_wr(CVMX_GSERX_DLMX_PHY_RESET(qlm, 0), dlmx_phy_reset.u64);
465
466         /* 5. If PCIe or SATA (i.e. if DLM1 or DLM2), set both MPLL_EN
467          * and MPLL_EN_OVRD to one in GSER(0)_PHY(1..2)_OVRD_IN_LO.
468          */
469
470         /* 6. Decrease MPLL_MULTIPLIER by one continually until it
471          * reaches the desired long-term setting, ensuring that each
472          * MPLL_MULTIPLIER value is constant for at least 1 msec before
473          * changing to the next value.  The desired long-term setting is
474          * as indicated in HRM tables 21-1, 21-2, and 21-3.  This is not
475          * required with the HRM sequence.
476          */
477         mpll_multiplier.u64 = csr_rd(CVMX_GSERX_DLMX_MPLL_MULTIPLIER(qlm, 0));
478         __cvmx_qlm_set_mult(qlm, baud_mhz, mpll_multiplier.s.mpll_multiplier);
479
480         /* 9. Poll until the MPLL locks. Wait for
481          *    GSER0_DLM0_MPLL_STATUS[MPLL_STATUS] = 1
482          */
483         if (CVMX_WAIT_FOR_FIELD64(CVMX_GSERX_DLMX_MPLL_STATUS(qlm, 0),
484                                   cvmx_gserx_dlmx_mpll_status_t, mpll_status, ==, 1, 10000)) {
485                 printf("PLL for DLM%d failed to lock\n", qlm);
486                 return -1;
487         }
488         return 0;
489 }
490
491 static int __dlm0_setup_tx_cn70xx(int speed, int ref_clk_sel)
492 {
493         int need0, need1;
494         cvmx_gmxx_inf_mode_t mode0, mode1;
495         cvmx_gserx_dlmx_tx_rate_t rate;
496         cvmx_gserx_dlmx_tx_en_t en;
497         cvmx_gserx_dlmx_tx_cm_en_t cm_en;
498         cvmx_gserx_dlmx_tx_data_en_t data_en;
499         cvmx_gserx_dlmx_tx_reset_t tx_reset;
500
501         debug("%s(%d, %d)\n", __func__, speed, ref_clk_sel);
502         mode0.u64 = csr_rd(CVMX_GMXX_INF_MODE(0));
503         mode1.u64 = csr_rd(CVMX_GMXX_INF_MODE(1));
504
505         /* Which lanes do we need? */
506         need0 = (mode0.s.mode != CVMX_GMX_INF_MODE_DISABLED);
507         need1 = (mode1.s.mode != CVMX_GMX_INF_MODE_DISABLED) ||
508                 (mode0.s.mode == CVMX_GMX_INF_MODE_RXAUI);
509
510         /* 1. Write GSER0_DLM0_TX_RATE[TXn_RATE] (Set according to required
511          *    data rate (see Table 21-1).
512          */
513         rate.u64 = csr_rd(CVMX_GSERX_DLMX_TX_RATE(0, 0));
514         debug("%s: speed: %d\n", __func__, speed);
515         switch (speed) {
516         case 1250:
517         case 2500:
518                 switch (ref_clk_sel) {
519                 case OCTEON_QLM_REF_CLK_100MHZ: /* 100MHz */
520                 case OCTEON_QLM_REF_CLK_125MHZ: /* 125MHz */
521                 case OCTEON_QLM_REF_CLK_156MHZ: /* 156.25MHz */
522                         rate.s.tx0_rate = (mode0.s.mode == CVMX_GMX_INF_MODE_SGMII) ? 2 : 0;
523                         rate.s.tx1_rate = (mode1.s.mode == CVMX_GMX_INF_MODE_SGMII) ? 2 : 0;
524                         break;
525                 default:
526                         printf("Invalid reference clock select %d\n", ref_clk_sel);
527                         return -1;
528                 }
529                 break;
530         case 3125:
531                 switch (ref_clk_sel) {
532                 case OCTEON_QLM_REF_CLK_125MHZ: /* 125MHz */
533                 case OCTEON_QLM_REF_CLK_156MHZ: /* 156.25MHz */
534                         rate.s.tx0_rate = (mode0.s.mode == CVMX_GMX_INF_MODE_SGMII) ? 1 : 0;
535                         rate.s.tx1_rate = (mode1.s.mode == CVMX_GMX_INF_MODE_SGMII) ? 1 : 0;
536                         break;
537                 default:
538                         printf("Invalid reference clock select %d\n", ref_clk_sel);
539                         return -1;
540                 }
541                 break;
542         case 5000: /* QSGMII only */
543                 switch (ref_clk_sel) {
544                 case OCTEON_QLM_REF_CLK_100MHZ: /* 100MHz */
545                         rate.s.tx0_rate = 0;
546                         rate.s.tx1_rate = 0;
547                         break;
548                 case OCTEON_QLM_REF_CLK_125MHZ: /* 125MHz */
549                 case OCTEON_QLM_REF_CLK_156MHZ: /* 156.25MHz */
550                         rate.s.tx0_rate = 0;
551                         rate.s.tx1_rate = 0;
552                         break;
553                 default:
554                         printf("Invalid reference clock select %d\n", ref_clk_sel);
555                         return -1;
556                 }
557                 break;
558         case 6250:
559                 switch (ref_clk_sel) {
560                 case OCTEON_QLM_REF_CLK_125MHZ: /* 125MHz */
561                 case OCTEON_QLM_REF_CLK_156MHZ: /* 156.25MHz */
562                         rate.s.tx0_rate = 0;
563                         rate.s.tx1_rate = 0;
564                         break;
565                 default:
566                         printf("Invalid reference clock select %d\n", ref_clk_sel);
567                         return -1;
568                 }
569                 break;
570         default:
571                 printf("%s: Invalid rate %d\n", __func__, speed);
572                 return -1;
573         }
574         debug("%s: tx 0 rate: %d, tx 1 rate: %d\n", __func__, rate.s.tx0_rate, rate.s.tx1_rate);
575         csr_wr(CVMX_GSERX_DLMX_TX_RATE(0, 0), rate.u64);
576
577         /* 2. Set GSER0_DLM0_TX_EN[TXn_EN] = 1 */
578         en.u64 = csr_rd(CVMX_GSERX_DLMX_TX_EN(0, 0));
579         en.s.tx0_en = need0;
580         en.s.tx1_en = need1;
581         csr_wr(CVMX_GSERX_DLMX_TX_EN(0, 0), en.u64);
582
583         /* 3 set GSER0_DLM0_TX_CM_EN[TXn_CM_EN] = 1 */
584         cm_en.u64 = csr_rd(CVMX_GSERX_DLMX_TX_CM_EN(0, 0));
585         cm_en.s.tx0_cm_en = need0;
586         cm_en.s.tx1_cm_en = need1;
587         csr_wr(CVMX_GSERX_DLMX_TX_CM_EN(0, 0), cm_en.u64);
588
589         /* 4. Set GSER0_DLM0_TX_DATA_EN[TXn_DATA_EN] = 1 */
590         data_en.u64 = csr_rd(CVMX_GSERX_DLMX_TX_DATA_EN(0, 0));
591         data_en.s.tx0_data_en = need0;
592         data_en.s.tx1_data_en = need1;
593         csr_wr(CVMX_GSERX_DLMX_TX_DATA_EN(0, 0), data_en.u64);
594
595         /* 5. Clear GSER0_DLM0_TX_RESET[TXn_DATA_EN] = 0 */
596         tx_reset.u64 = csr_rd(CVMX_GSERX_DLMX_TX_RESET(0, 0));
597         tx_reset.s.tx0_reset = !need0;
598         tx_reset.s.tx1_reset = !need1;
599         csr_wr(CVMX_GSERX_DLMX_TX_RESET(0, 0), tx_reset.u64);
600
601         /* 6. Poll GSER0_DLM0_TX_STATUS[TXn_STATUS, TXn_CM_STATUS] until both
602          *    are set to 1. This prevents GMX from transmitting until the DLM
603          *    is ready.
604          */
605         if (need0) {
606                 if (CVMX_WAIT_FOR_FIELD64(CVMX_GSERX_DLMX_TX_STATUS(0, 0),
607                                           cvmx_gserx_dlmx_tx_status_t, tx0_status, ==, 1, 10000)) {
608                         printf("DLM0 TX0 status fail\n");
609                         return -1;
610                 }
611                 if (CVMX_WAIT_FOR_FIELD64(CVMX_GSERX_DLMX_TX_STATUS(0, 0),
612                                           cvmx_gserx_dlmx_tx_status_t, tx0_cm_status, ==, 1,
613                                           10000)) {
614                         printf("DLM0 TX0 CM status fail\n");
615                         return -1;
616                 }
617         }
618         if (need1) {
619                 if (CVMX_WAIT_FOR_FIELD64(CVMX_GSERX_DLMX_TX_STATUS(0, 0),
620                                           cvmx_gserx_dlmx_tx_status_t, tx1_status, ==, 1, 10000)) {
621                         printf("DLM0 TX1 status fail\n");
622                         return -1;
623                 }
624                 if (CVMX_WAIT_FOR_FIELD64(CVMX_GSERX_DLMX_TX_STATUS(0, 0),
625                                           cvmx_gserx_dlmx_tx_status_t, tx1_cm_status, ==, 1,
626                                           10000)) {
627                         printf("DLM0 TX1 CM status fail\n");
628                         return -1;
629                 }
630         }
631         return 0;
632 }
633
634 static int __dlm0_setup_rx_cn70xx(int speed, int ref_clk_sel)
635 {
636         int need0, need1;
637         cvmx_gmxx_inf_mode_t mode0, mode1;
638         cvmx_gserx_dlmx_rx_rate_t rate;
639         cvmx_gserx_dlmx_rx_pll_en_t pll_en;
640         cvmx_gserx_dlmx_rx_data_en_t data_en;
641         cvmx_gserx_dlmx_rx_reset_t rx_reset;
642
643         debug("%s(%d, %d)\n", __func__, speed, ref_clk_sel);
644         mode0.u64 = csr_rd(CVMX_GMXX_INF_MODE(0));
645         mode1.u64 = csr_rd(CVMX_GMXX_INF_MODE(1));
646
647         /* Which lanes do we need? */
648         need0 = (mode0.s.mode != CVMX_GMX_INF_MODE_DISABLED);
649         need1 = (mode1.s.mode != CVMX_GMX_INF_MODE_DISABLED) ||
650                 (mode0.s.mode == CVMX_GMX_INF_MODE_RXAUI);
651
652         /* 1. Write GSER0_DLM0_RX_RATE[RXn_RATE] (must match the
653          * GER0_DLM0_TX_RATE[TXn_RATE] setting).
654          */
655         rate.u64 = csr_rd(CVMX_GSERX_DLMX_RX_RATE(0, 0));
656         switch (speed) {
657         case 1250:
658         case 2500:
659                 switch (ref_clk_sel) {
660                 case OCTEON_QLM_REF_CLK_100MHZ: /* 100MHz */
661                 case OCTEON_QLM_REF_CLK_125MHZ: /* 125MHz */
662                 case OCTEON_QLM_REF_CLK_156MHZ: /* 156.25MHz */
663                         rate.s.rx0_rate = (mode0.s.mode == CVMX_GMX_INF_MODE_SGMII) ? 2 : 0;
664                         rate.s.rx1_rate = (mode1.s.mode == CVMX_GMX_INF_MODE_SGMII) ? 2 : 0;
665                         break;
666                 default:
667                         printf("Invalid reference clock select %d\n", ref_clk_sel);
668                         return -1;
669                 }
670                 break;
671         case 3125:
672                 switch (ref_clk_sel) {
673                 case OCTEON_QLM_REF_CLK_125MHZ: /* 125MHz */
674                 case OCTEON_QLM_REF_CLK_156MHZ: /* 156.25MHz */
675                         rate.s.rx0_rate = (mode0.s.mode == CVMX_GMX_INF_MODE_SGMII) ? 1 : 0;
676                         rate.s.rx1_rate = (mode1.s.mode == CVMX_GMX_INF_MODE_SGMII) ? 1 : 0;
677                         break;
678                 default:
679                         printf("Invalid reference clock select %d\n", ref_clk_sel);
680                         return -1;
681                 }
682                 break;
683         case 5000: /* QSGMII only */
684                 switch (ref_clk_sel) {
685                 case OCTEON_QLM_REF_CLK_100MHZ: /* 100MHz */
686                 case OCTEON_QLM_REF_CLK_125MHZ: /* 125MHz */
687                 case OCTEON_QLM_REF_CLK_156MHZ: /* 156.25MHz */
688                         rate.s.rx0_rate = 0;
689                         rate.s.rx1_rate = 0;
690                         break;
691                 default:
692                         printf("Invalid reference clock select %d\n", ref_clk_sel);
693                         return -1;
694                 }
695                 break;
696         case 6250:
697                 switch (ref_clk_sel) {
698                 case OCTEON_QLM_REF_CLK_125MHZ: /* 125MHz */
699                 case OCTEON_QLM_REF_CLK_156MHZ: /* 156.25MHz */
700                         rate.s.rx0_rate = 0;
701                         rate.s.rx1_rate = 0;
702                         break;
703                 default:
704                         printf("Invalid reference clock select %d\n", ref_clk_sel);
705                         return -1;
706                 }
707                 break;
708         default:
709                 printf("%s: Invalid rate %d\n", __func__, speed);
710                 return -1;
711         }
712         debug("%s: rx 0 rate: %d, rx 1 rate: %d\n", __func__, rate.s.rx0_rate, rate.s.rx1_rate);
713         csr_wr(CVMX_GSERX_DLMX_RX_RATE(0, 0), rate.u64);
714
715         /* 2. Set GSER0_DLM0_RX_PLL_EN[RXn_PLL_EN] = 1 */
716         pll_en.u64 = csr_rd(CVMX_GSERX_DLMX_RX_PLL_EN(0, 0));
717         pll_en.s.rx0_pll_en = need0;
718         pll_en.s.rx1_pll_en = need1;
719         csr_wr(CVMX_GSERX_DLMX_RX_PLL_EN(0, 0), pll_en.u64);
720
721         /* 3. Set GSER0_DLM0_RX_DATA_EN[RXn_DATA_EN] = 1 */
722         data_en.u64 = csr_rd(CVMX_GSERX_DLMX_RX_DATA_EN(0, 0));
723         data_en.s.rx0_data_en = need0;
724         data_en.s.rx1_data_en = need1;
725         csr_wr(CVMX_GSERX_DLMX_RX_DATA_EN(0, 0), data_en.u64);
726
727         /* 4. Clear GSER0_DLM0_RX_RESET[RXn_DATA_EN] = 0. Now the GMX can be
728          * enabled: set GMX(0..1)_INF_MODE[EN] = 1
729          */
730         rx_reset.u64 = csr_rd(CVMX_GSERX_DLMX_RX_RESET(0, 0));
731         rx_reset.s.rx0_reset = !need0;
732         rx_reset.s.rx1_reset = !need1;
733         csr_wr(CVMX_GSERX_DLMX_RX_RESET(0, 0), rx_reset.u64);
734
735         return 0;
736 }
737
738 static int a_clk;
739
740 static int __dlm2_sata_uctl_init_cn70xx(void)
741 {
742         cvmx_sata_uctl_ctl_t uctl_ctl;
743         const int MAX_A_CLK = 333000000; /* Max of 333Mhz */
744         int divisor, a_clkdiv;
745
746         /* Wait for all voltages to reach a stable stable. Ensure the
747          * reference clock is up and stable.
748          */
749
750         /* 2. Wait for IOI reset to deassert. */
751
752         /* 3. Optionally program the GPIO CSRs for SATA features.
753          *    a. For cold-presence detect:
754          *       i. Select a GPIO for the input and program GPIO_SATA_CTL[sel]
755          *          for port0 and port1.
756          *       ii. Select a GPIO for the output and program
757          *           GPIO_BIT_CFG*[OUTPUT_SEL] for port0 and port1.
758          *    b. For mechanical-presence detect, select a GPIO for the input
759          *       and program GPIO_SATA_CTL[SEL] for port0/port1.
760          *    c. For LED activity, select a GPIO for the output and program
761          *       GPIO_BIT_CFG*[OUTPUT_SEL] for port0/port1.
762          */
763
764         /* 4. Assert all resets:
765          *    a. UAHC reset: SATA_UCTL_CTL[UAHC_RST] = 1
766          *    a. UCTL reset: SATA_UCTL_CTL[UCTL_RST] = 1
767          */
768
769         uctl_ctl.u64 = csr_rd(CVMX_SATA_UCTL_CTL);
770         uctl_ctl.s.sata_uahc_rst = 1;
771         uctl_ctl.s.sata_uctl_rst = 1;
772         csr_wr(CVMX_SATA_UCTL_CTL, uctl_ctl.u64);
773
774         /* 5. Configure the ACLK:
775          *    a. Reset the clock dividers: SATA_UCTL_CTL[A_CLKDIV_RST] = 1.
776          *    b. Select the ACLK frequency (400 MHz maximum)
777          *       i. SATA_UCTL_CTL[A_CLKDIV] = desired value,
778          *       ii. SATA_UCTL_CTL[A_CLKDIV_EN] = 1 to enable the ACLK,
779          *    c. Deassert the ACLK clock divider reset:
780          *       SATA_UCTL_CTL[A_CLKDIV_RST] = 0
781          */
782         uctl_ctl.u64 = csr_rd(CVMX_SATA_UCTL_CTL);
783         uctl_ctl.s.a_clkdiv_rst = 1;
784         csr_wr(CVMX_SATA_UCTL_CTL, uctl_ctl.u64);
785
786         uctl_ctl.u64 = csr_rd(CVMX_SATA_UCTL_CTL);
787
788         divisor = (gd->bus_clk + MAX_A_CLK - 1) / MAX_A_CLK;
789         if (divisor <= 4) {
790                 a_clkdiv = divisor - 1;
791         } else if (divisor <= 6) {
792                 a_clkdiv = 4;
793                 divisor = 6;
794         } else if (divisor <= 8) {
795                 a_clkdiv = 5;
796                 divisor = 8;
797         } else if (divisor <= 16) {
798                 a_clkdiv = 6;
799                 divisor = 16;
800         } else if (divisor <= 24) {
801                 a_clkdiv = 7;
802                 divisor = 24;
803         } else {
804                 printf("Unable to determine SATA clock divisor\n");
805                 return -1;
806         }
807
808         /* Calculate the final clock rate */
809         a_clk = gd->bus_clk / divisor;
810
811         uctl_ctl.s.a_clkdiv_sel = a_clkdiv;
812         uctl_ctl.s.a_clk_en = 1;
813         uctl_ctl.s.a_clk_byp_sel = 0;
814         csr_wr(CVMX_SATA_UCTL_CTL, uctl_ctl.u64);
815
816         uctl_ctl.u64 = csr_rd(CVMX_SATA_UCTL_CTL);
817         uctl_ctl.s.a_clkdiv_rst = 0;
818         csr_wr(CVMX_SATA_UCTL_CTL, uctl_ctl.u64);
819
820         udelay(1);
821
822         return 0;
823 }
824
825 static int __sata_dlm_init_cn70xx(int qlm, int baud_mhz, int ref_clk_sel, int ref_clk_input)
826 {
827         cvmx_gserx_sata_cfg_t sata_cfg;
828         cvmx_gserx_sata_lane_rst_t sata_lane_rst;
829         cvmx_gserx_dlmx_phy_reset_t dlmx_phy_reset;
830         cvmx_gserx_dlmx_test_powerdown_t dlmx_test_powerdown;
831         cvmx_gserx_sata_ref_ssp_en_t ref_ssp_en;
832         cvmx_gserx_dlmx_mpll_multiplier_t mpll_multiplier;
833         cvmx_gserx_dlmx_ref_clkdiv2_t ref_clkdiv2;
834         cvmx_sata_uctl_shim_cfg_t shim_cfg;
835         cvmx_gserx_phyx_ovrd_in_lo_t ovrd_in;
836         cvmx_sata_uctl_ctl_t uctl_ctl;
837         int sata_ref_clk;
838
839         debug("%s(%d, %d, %d, %d)\n", __func__, qlm, baud_mhz, ref_clk_sel, ref_clk_input);
840
841         switch (ref_clk_sel) {
842         case 0:
843                 sata_ref_clk = 100;
844                 break;
845         case 1:
846                 sata_ref_clk = 125;
847                 break;
848         case 2:
849                 sata_ref_clk = 156;
850                 break;
851         default:
852                 printf("%s: Invalid reference clock select %d for qlm %d\n", __func__,
853                        ref_clk_sel, qlm);
854                 return -1;
855         }
856
857         /* 5. Set GSERX0_SATA_CFG[SATA_EN] = 1 to configure DLM2 multiplexing.
858          */
859         sata_cfg.u64 = csr_rd(CVMX_GSERX_SATA_CFG(0));
860         sata_cfg.s.sata_en = 1;
861         csr_wr(CVMX_GSERX_SATA_CFG(0), sata_cfg.u64);
862
863         /* 1. Write GSER(0)_DLM2_REFCLK_SEL[REFCLK_SEL] if required for
864          *    reference-clock selection.
865          */
866         if (ref_clk_input < 2) {
867                 csr_wr(CVMX_GSERX_DLMX_REFCLK_SEL(qlm, 0), ref_clk_input);
868                 csr_wr(CVMX_GSERX_DLMX_REF_USE_PAD(qlm, 0), 0);
869         } else {
870                 csr_wr(CVMX_GSERX_DLMX_REF_USE_PAD(qlm, 0), 1);
871         }
872
873         ref_ssp_en.u64 = csr_rd(CVMX_GSERX_SATA_REF_SSP_EN(0));
874         ref_ssp_en.s.ref_ssp_en = 1;
875         csr_wr(CVMX_GSERX_SATA_REF_SSP_EN(0), ref_ssp_en.u64);
876
877         /* Apply workaround for Errata (G-20669) MPLL may not come up. */
878
879         /* Set REF_CLKDIV2 based on the Ref Clock */
880         ref_clkdiv2.u64 = csr_rd(CVMX_GSERX_DLMX_REF_CLKDIV2(qlm, 0));
881         if (sata_ref_clk == 100)
882                 ref_clkdiv2.s.ref_clkdiv2 = 0;
883         else
884                 ref_clkdiv2.s.ref_clkdiv2 = 1;
885         csr_wr(CVMX_GSERX_DLMX_REF_CLKDIV2(qlm, 0), ref_clkdiv2.u64);
886
887         /* 1. Ensure GSER(0)_DLM(0..2)_PHY_RESET[PHY_RESET] is set. */
888         dlmx_phy_reset.u64 = csr_rd(CVMX_GSERX_DLMX_PHY_RESET(qlm, 0));
889         dlmx_phy_reset.s.phy_reset = 1;
890         csr_wr(CVMX_GSERX_DLMX_PHY_RESET(qlm, 0), dlmx_phy_reset.u64);
891
892         /* 2. If SGMII or QSGMII or RXAUI (i.e. if DLM0) set
893          *    GSER(0)_DLM(0)_MPLL_EN[MPLL_EN] to one.
894          */
895
896         /* 3. Set GSER(0)_DLM(0..2)_MPLL_MULTIPLIER[MPLL_MULTIPLIER]
897          *    to the value in the preceding table, which is different
898          *    than the desired setting prescribed by the HRM.
899          */
900
901         mpll_multiplier.u64 = csr_rd(CVMX_GSERX_DLMX_MPLL_MULTIPLIER(qlm, 0));
902         if (sata_ref_clk == 100)
903                 mpll_multiplier.s.mpll_multiplier = 35;
904         else
905                 mpll_multiplier.s.mpll_multiplier = 56;
906         csr_wr(CVMX_GSERX_DLMX_MPLL_MULTIPLIER(qlm, 0), mpll_multiplier.u64);
907
908         /* 3. Clear GSER0_DLM2_TEST_POWERDOWN[TEST_POWERDOWN] = 0 */
909         dlmx_test_powerdown.u64 = csr_rd(CVMX_GSERX_DLMX_TEST_POWERDOWN(qlm, 0));
910         dlmx_test_powerdown.s.test_powerdown = 0;
911         csr_wr(CVMX_GSERX_DLMX_TEST_POWERDOWN(qlm, 0), dlmx_test_powerdown.u64);
912
913         /* 4. Clear either/both lane0 and lane1 resets:
914          *    GSER0_SATA_LANE_RST[L0_RST, L1_RST] = 0.
915          */
916         sata_lane_rst.u64 = csr_rd(CVMX_GSERX_SATA_LANE_RST(0));
917         sata_lane_rst.s.l0_rst = 0;
918         sata_lane_rst.s.l1_rst = 0;
919         csr_wr(CVMX_GSERX_SATA_LANE_RST(0), sata_lane_rst.u64);
920
921         udelay(1);
922
923         /* 5. Clear GSER0_DLM2_PHY_RESET */
924         dlmx_phy_reset.u64 = csr_rd(CVMX_GSERX_DLMX_PHY_RESET(qlm, 0));
925         dlmx_phy_reset.s.phy_reset = 0;
926         csr_wr(CVMX_GSERX_DLMX_PHY_RESET(qlm, 0), dlmx_phy_reset.u64);
927
928         /* 6. If PCIe or SATA (i.e. if DLM1 or DLM2), set both MPLL_EN
929          * and MPLL_EN_OVRD to one in GSER(0)_PHY(1..2)_OVRD_IN_LO.
930          */
931         ovrd_in.u64 = csr_rd(CVMX_GSERX_PHYX_OVRD_IN_LO(qlm, 0));
932         ovrd_in.s.mpll_en = 1;
933         ovrd_in.s.mpll_en_ovrd = 1;
934         csr_wr(CVMX_GSERX_PHYX_OVRD_IN_LO(qlm, 0), ovrd_in.u64);
935
936         /* 7. Decrease MPLL_MULTIPLIER by one continually until it reaches
937          *   the desired long-term setting, ensuring that each MPLL_MULTIPLIER
938          *   value is constant for at least 1 msec before changing to the next
939          *   value. The desired long-term setting is as indicated in HRM tables
940          *   21-1, 21-2, and 21-3. This is not required with the HRM
941          *   sequence.
942          */
943         mpll_multiplier.u64 = csr_rd(CVMX_GSERX_DLMX_MPLL_MULTIPLIER(qlm, 0));
944         if (sata_ref_clk == 100)
945                 mpll_multiplier.s.mpll_multiplier = 0x1e;
946         else
947                 mpll_multiplier.s.mpll_multiplier = 0x30;
948         csr_wr(CVMX_GSERX_DLMX_MPLL_MULTIPLIER(qlm, 0), mpll_multiplier.u64);
949
950         if (CVMX_WAIT_FOR_FIELD64(CVMX_GSERX_DLMX_MPLL_STATUS(qlm, 0),
951                                   cvmx_gserx_dlmx_mpll_status_t, mpll_status, ==, 1, 10000)) {
952                 printf("ERROR: SATA MPLL failed to set\n");
953                 return -1;
954         }
955
956         if (CVMX_WAIT_FOR_FIELD64(CVMX_GSERX_DLMX_RX_STATUS(qlm, 0), cvmx_gserx_dlmx_rx_status_t,
957                                   rx0_status, ==, 1, 10000)) {
958                 printf("ERROR: SATA RX0_STATUS failed to set\n");
959                 return -1;
960         }
961         if (CVMX_WAIT_FOR_FIELD64(CVMX_GSERX_DLMX_RX_STATUS(qlm, 0), cvmx_gserx_dlmx_rx_status_t,
962                                   rx1_status, ==, 1, 10000)) {
963                 printf("ERROR: SATA RX1_STATUS failed to set\n");
964                 return -1;
965         }
966
967         /* 8. Deassert UCTL and UAHC resets:
968          *    a. SATA_UCTL_CTL[UCTL_RST] = 0
969          *    b. SATA_UCTL_CTL[UAHC_RST] = 0
970          *    c. Wait 10 ACLK cycles before accessing any ACLK-only registers.
971          */
972         uctl_ctl.u64 = csr_rd(CVMX_SATA_UCTL_CTL);
973         uctl_ctl.s.sata_uctl_rst = 0;
974         uctl_ctl.s.sata_uahc_rst = 0;
975         csr_wr(CVMX_SATA_UCTL_CTL, uctl_ctl.u64);
976
977         udelay(1);
978
979         /* 9. Enable conditional SCLK of UCTL by writing
980          *    SATA_UCTL_CTL[CSCLK_EN] = 1
981          */
982         uctl_ctl.u64 = csr_rd(CVMX_SATA_UCTL_CTL);
983         uctl_ctl.s.csclk_en = 1;
984         csr_wr(CVMX_SATA_UCTL_CTL, uctl_ctl.u64);
985
986         /* 10. Initialize UAHC as described in the AHCI Specification (UAHC_*
987          *     registers
988          */
989
990         /* set-up endian mode */
991         shim_cfg.u64 = csr_rd(CVMX_SATA_UCTL_SHIM_CFG);
992         shim_cfg.s.dma_endian_mode = 1;
993         shim_cfg.s.csr_endian_mode = 3;
994         csr_wr(CVMX_SATA_UCTL_SHIM_CFG, shim_cfg.u64);
995
996         return 0;
997 }
998
999 /**
1000  * Initializes DLM 4 for SATA
1001  *
1002  * @param qlm           Must be 4.
1003  * @param baud_mhz      Baud rate for SATA
1004  * @param ref_clk_sel   Selects the speed of the reference clock where:
1005  *                      0 = 100MHz, 1 = 125MHz and 2 = 156.25MHz
1006  * @param ref_clk_input Reference clock input where 0 = external QLM clock,
1007  *                      1 = qlmc_ref_clk0 and 2 = qlmc_ref_clk1
1008  */
1009 static int __sata_dlm_init_cn73xx(int qlm, int baud_mhz, int ref_clk_sel, int ref_clk_input)
1010 {
1011         cvmx_sata_uctl_shim_cfg_t shim_cfg;
1012         cvmx_gserx_refclk_sel_t refclk_sel;
1013         cvmx_gserx_phy_ctl_t phy_ctl;
1014         cvmx_gserx_rx_pwr_ctrl_p2_t pwr_ctrl_p2;
1015         cvmx_gserx_lanex_misc_cfg_0_t misc_cfg_0;
1016         cvmx_gserx_sata_lane_rst_t lane_rst;
1017         cvmx_gserx_pll_px_mode_0_t pmode_0;
1018         cvmx_gserx_pll_px_mode_1_t pmode_1;
1019         cvmx_gserx_lane_px_mode_0_t lane_pmode_0;
1020         cvmx_gserx_lane_px_mode_1_t lane_pmode_1;
1021         cvmx_gserx_cfg_t gserx_cfg;
1022         cvmx_sata_uctl_ctl_t uctl_ctl;
1023         int l;
1024         int i;
1025
1026         /*
1027          * 1. Configure the SATA
1028          */
1029
1030         /*
1031          * 2. Configure the QLM Reference clock
1032          *    Set GSERX_REFCLK_SEL.COM_CLK_SEL to source reference clock
1033          *    from the external clock mux.
1034          *      GSERX_REFCLK_SEL.USE_COM1 to select qlmc_refclkn/p_1 or
1035          *      leave clear to select qlmc_refclkn/p_0
1036          */
1037         refclk_sel.u64 = 0;
1038         if (ref_clk_input == 0) { /* External ref clock */
1039                 refclk_sel.s.com_clk_sel = 0;
1040                 refclk_sel.s.use_com1 = 0;
1041         } else if (ref_clk_input == 1) { /* Common reference clock 0 */
1042                 refclk_sel.s.com_clk_sel = 1;
1043                 refclk_sel.s.use_com1 = 0;
1044         } else { /* Common reference clock 1 */
1045                 refclk_sel.s.com_clk_sel = 1;
1046                 refclk_sel.s.use_com1 = 1;
1047         }
1048
1049         if (ref_clk_sel != 0) {
1050                 printf("Wrong reference clock selected for QLM4\n");
1051                 return -1;
1052         }
1053
1054         csr_wr(CVMX_GSERX_REFCLK_SEL(qlm), refclk_sel.u64);
1055
1056         /* Reset the QLM after changing the reference clock */
1057         phy_ctl.u64 = csr_rd(CVMX_GSERX_PHY_CTL(qlm));
1058         phy_ctl.s.phy_reset = 1;
1059         csr_wr(CVMX_GSERX_PHY_CTL(qlm), phy_ctl.u64);
1060
1061         udelay(1);
1062
1063         /*
1064          * 3. Configure the QLM for SATA mode set GSERX_CFG.SATA
1065          */
1066         gserx_cfg.u64 = 0;
1067         gserx_cfg.s.sata = 1;
1068         csr_wr(CVMX_GSERX_CFG(qlm), gserx_cfg.u64);
1069
1070         /*
1071          * 12. Clear the appropriate lane resets
1072          *     clear GSERX_SATA_LANE_RST.LX_RST  where X is the lane number 0-1.
1073          */
1074         lane_rst.u64 = csr_rd(CVMX_GSERX_SATA_LANE_RST(qlm));
1075         lane_rst.s.l0_rst = 0;
1076         lane_rst.s.l1_rst = 0;
1077         csr_wr(CVMX_GSERX_SATA_LANE_RST(qlm), lane_rst.u64);
1078         csr_rd(CVMX_GSERX_SATA_LANE_RST(qlm));
1079
1080         udelay(1);
1081
1082         /*
1083          * 4. Take the PHY out of reset
1084          *    Write GSERX_PHY_CTL.PHY_RESET to a zero
1085          */
1086         phy_ctl.u64 = csr_rd(CVMX_GSERX_PHY_CTL(qlm));
1087         phy_ctl.s.phy_reset = 0;
1088         csr_wr(CVMX_GSERX_PHY_CTL(qlm), phy_ctl.u64);
1089
1090         /* Wait for reset to complete and the PLL to lock */
1091         /* PCIe mode doesn't become ready until the PEM block attempts to bring
1092          * the interface up. Skip this check for PCIe
1093          */
1094         if (CVMX_WAIT_FOR_FIELD64(CVMX_GSERX_QLM_STAT(qlm), cvmx_gserx_qlm_stat_t,
1095                                   rst_rdy, ==, 1, 10000)) {
1096                 printf("QLM%d: Timeout waiting for GSERX_QLM_STAT[rst_rdy]\n", qlm);
1097                 return -1;
1098         }
1099
1100         /* Workaround for errata GSER-30310: SATA HDD Not Ready due to
1101          * PHY SDLL/LDLL lockup at 3GHz
1102          */
1103         for (i = 0; i < 2; i++) {
1104                 cvmx_gserx_slicex_pcie1_mode_t pcie1;
1105                 cvmx_gserx_slicex_pcie2_mode_t pcie2;
1106                 cvmx_gserx_slicex_pcie3_mode_t pcie3;
1107
1108                 pcie1.u64 = csr_rd(CVMX_GSERX_SLICEX_PCIE1_MODE(i, qlm));
1109                 pcie1.s.rx_pi_bwsel = 1;
1110                 pcie1.s.rx_ldll_bwsel = 1;
1111                 pcie1.s.rx_sdll_bwsel = 1;
1112                 csr_wr(CVMX_GSERX_SLICEX_PCIE1_MODE(i, qlm), pcie1.u64);
1113
1114                 pcie2.u64 = csr_rd(CVMX_GSERX_SLICEX_PCIE2_MODE(i, qlm));
1115                 pcie2.s.rx_pi_bwsel = 1;
1116                 pcie2.s.rx_ldll_bwsel = 1;
1117                 pcie2.s.rx_sdll_bwsel = 1;
1118                 csr_wr(CVMX_GSERX_SLICEX_PCIE2_MODE(i, qlm), pcie2.u64);
1119
1120                 pcie3.u64 = csr_rd(CVMX_GSERX_SLICEX_PCIE3_MODE(i, qlm));
1121                 pcie3.s.rx_pi_bwsel = 1;
1122                 pcie3.s.rx_ldll_bwsel = 1;
1123                 pcie3.s.rx_sdll_bwsel = 1;
1124                 csr_wr(CVMX_GSERX_SLICEX_PCIE3_MODE(i, qlm), pcie3.u64);
1125         }
1126
1127         /*
1128          * 7. Change P2 termination
1129          *    Clear GSERX_RX_PWR_CTRL_P2.P2_RX_SUBBLK_PD[0] (Termination)
1130          */
1131         pwr_ctrl_p2.u64 = csr_rd(CVMX_GSERX_RX_PWR_CTRL_P2(qlm));
1132         pwr_ctrl_p2.s.p2_rx_subblk_pd &= 0x1e;
1133         csr_wr(CVMX_GSERX_RX_PWR_CTRL_P2(qlm), pwr_ctrl_p2.u64);
1134
1135         /*
1136          * 8. Modify the Electrical IDLE Detect on delay
1137          *    Change GSERX_LANE(0..3)_MISC_CFG_0.EIE_DET_STL_ON_TIME to a 0x4
1138          */
1139         for (i = 0; i < 2; i++) {
1140                 misc_cfg_0.u64 = csr_rd(CVMX_GSERX_LANEX_MISC_CFG_0(i, qlm));
1141                 misc_cfg_0.s.eie_det_stl_on_time = 4;
1142                 csr_wr(CVMX_GSERX_LANEX_MISC_CFG_0(i, qlm), misc_cfg_0.u64);
1143         }
1144
1145         /*
1146          * 9. Modify the PLL and Lane Protocol Mode registers to configure
1147          *    the PHY for SATA.
1148          *    (Configure all 3 PLLs, doesn't matter what speed it is configured)
1149          */
1150
1151         /* Errata (GSER-26724) SATA never indicates GSER QLM_STAT[RST_RDY]
1152          * We program PLL_PX_MODE_0 last due to this errata
1153          */
1154         for (l = 0; l < 3; l++) {
1155                 pmode_1.u64 = csr_rd(CVMX_GSERX_PLL_PX_MODE_1(l, qlm));
1156                 lane_pmode_0.u64 = csr_rd(CVMX_GSERX_LANE_PX_MODE_0(l, qlm));
1157                 lane_pmode_1.u64 = csr_rd(CVMX_GSERX_LANE_PX_MODE_1(l, qlm));
1158
1159                 pmode_1.s.pll_cpadj = 0x2;
1160                 pmode_1.s.pll_opr = 0x0;
1161                 pmode_1.s.pll_div = 0x1e;
1162                 pmode_1.s.pll_pcie3en = 0x0;
1163                 pmode_1.s.pll_16p5en = 0x0;
1164
1165                 lane_pmode_0.s.ctle = 0x0;
1166                 lane_pmode_0.s.pcie = 0x0;
1167                 lane_pmode_0.s.tx_ldiv = 0x0;
1168                 lane_pmode_0.s.srate = 0;
1169                 lane_pmode_0.s.tx_mode = 0x3;
1170                 lane_pmode_0.s.rx_mode = 0x3;
1171
1172                 lane_pmode_1.s.vma_mm = 1;
1173                 lane_pmode_1.s.vma_fine_cfg_sel = 0;
1174                 lane_pmode_1.s.cdr_fgain = 0xa;
1175                 lane_pmode_1.s.ph_acc_adj = 0x15;
1176
1177                 if (l == R_2_5G_REFCLK100)
1178                         lane_pmode_0.s.rx_ldiv = 0x2;
1179                 else if (l == R_5G_REFCLK100)
1180                         lane_pmode_0.s.rx_ldiv = 0x1;
1181                 else
1182                         lane_pmode_0.s.rx_ldiv = 0x0;
1183
1184                 csr_wr(CVMX_GSERX_PLL_PX_MODE_1(l, qlm), pmode_1.u64);
1185                 csr_wr(CVMX_GSERX_LANE_PX_MODE_0(l, qlm), lane_pmode_0.u64);
1186                 csr_wr(CVMX_GSERX_LANE_PX_MODE_1(l, qlm), lane_pmode_1.u64);
1187         }
1188
1189         for (l = 0; l < 3; l++) {
1190                 pmode_0.u64 = csr_rd(CVMX_GSERX_PLL_PX_MODE_0(l, qlm));
1191                 pmode_0.s.pll_icp = 0x1;
1192                 pmode_0.s.pll_rloop = 0x3;
1193                 pmode_0.s.pll_pcs_div = 0x5;
1194                 csr_wr(CVMX_GSERX_PLL_PX_MODE_0(l, qlm), pmode_0.u64);
1195         }
1196
1197         for (i = 0; i < 2; i++) {
1198                 cvmx_gserx_slicex_rx_sdll_ctrl_t rx_sdll;
1199
1200                 rx_sdll.u64 = csr_rd(CVMX_GSERX_SLICEX_RX_SDLL_CTRL(i, qlm));
1201                 rx_sdll.s.pcs_sds_oob_clk_ctrl = 2;
1202                 rx_sdll.s.pcs_sds_rx_sdll_tune = 0;
1203                 rx_sdll.s.pcs_sds_rx_sdll_swsel = 0;
1204                 csr_wr(CVMX_GSERX_SLICEX_RX_SDLL_CTRL(i, qlm), rx_sdll.u64);
1205         }
1206
1207         for (i = 0; i < 2; i++) {
1208                 cvmx_gserx_lanex_misc_cfg_0_t misc_cfg;
1209
1210                 misc_cfg.u64 = csr_rd(CVMX_GSERX_LANEX_MISC_CFG_0(i, qlm));
1211                 misc_cfg.s.use_pma_polarity = 0;
1212                 misc_cfg.s.cfg_pcs_loopback = 0;
1213                 misc_cfg.s.pcs_tx_mode_ovrrd_en = 0;
1214                 misc_cfg.s.pcs_rx_mode_ovrrd_en = 0;
1215                 misc_cfg.s.cfg_eie_det_cnt = 0;
1216                 misc_cfg.s.eie_det_stl_on_time = 4;
1217                 misc_cfg.s.eie_det_stl_off_time = 0;
1218                 misc_cfg.s.tx_bit_order = 1;
1219                 misc_cfg.s.rx_bit_order = 1;
1220                 csr_wr(CVMX_GSERX_LANEX_MISC_CFG_0(i, qlm), misc_cfg.u64);
1221         }
1222
1223         /* Wait for reset to complete and the PLL to lock */
1224         /* PCIe mode doesn't become ready until the PEM block attempts to bring
1225          * the interface up. Skip this check for PCIe
1226          */
1227         if (CVMX_WAIT_FOR_FIELD64(CVMX_GSERX_QLM_STAT(qlm), cvmx_gserx_qlm_stat_t,
1228                                   rst_rdy, ==, 1, 10000)) {
1229                 printf("QLM%d: Timeout waiting for GSERX_QLM_STAT[rst_rdy]\n", qlm);
1230                 return -1;
1231         }
1232
1233         /* Poll GSERX_SATA_STATUS for P0_RDY = 1 */
1234         if (CVMX_WAIT_FOR_FIELD64(CVMX_GSERX_SATA_STATUS(qlm), cvmx_gserx_sata_status_t,
1235                                   p0_rdy, ==, 1, 10000)) {
1236                 printf("QLM4: Timeout waiting for GSERX_SATA_STATUS[p0_rdy]\n");
1237                 return -1;
1238         }
1239
1240         /* Poll GSERX_SATA_STATUS for P1_RDY = 1 */
1241         if (CVMX_WAIT_FOR_FIELD64(CVMX_GSERX_SATA_STATUS(qlm), cvmx_gserx_sata_status_t,
1242                                   p1_rdy, ==, 1, 10000)) {
1243                 printf("QLM4: Timeout waiting for GSERX_SATA_STATUS[p1_rdy]\n");
1244                 return -1;
1245         }
1246
1247         udelay(2000);
1248
1249         /* 6. Deassert UCTL and UAHC resets:
1250          *    a. SATA_UCTL_CTL[UCTL_RST] = 0
1251          *    b. SATA_UCTL_CTL[UAHC_RST] = 0
1252          *    c. Wait 10 ACLK cycles before accessing any ACLK-only registers.
1253          */
1254         uctl_ctl.u64 = csr_rd(CVMX_SATA_UCTL_CTL);
1255         uctl_ctl.s.sata_uctl_rst = 0;
1256         uctl_ctl.s.sata_uahc_rst = 0;
1257         csr_wr(CVMX_SATA_UCTL_CTL, uctl_ctl.u64);
1258
1259         udelay(1);
1260
1261         /* 7. Enable conditional SCLK of UCTL by writing
1262          *    SATA_UCTL_CTL[CSCLK_EN] = 1
1263          */
1264         uctl_ctl.u64 = csr_rd(CVMX_SATA_UCTL_CTL);
1265         uctl_ctl.s.csclk_en = 1;
1266         csr_wr(CVMX_SATA_UCTL_CTL, uctl_ctl.u64);
1267
1268         /* set-up endian mode */
1269         shim_cfg.u64 = csr_rd(CVMX_SATA_UCTL_SHIM_CFG);
1270         shim_cfg.s.dma_endian_mode = 1;
1271         shim_cfg.s.csr_endian_mode = 3;
1272         csr_wr(CVMX_SATA_UCTL_SHIM_CFG, shim_cfg.u64);
1273
1274         return 0;
1275 }
1276
1277 static int __dlm2_sata_uahc_init_cn70xx(int baud_mhz)
1278 {
1279         cvmx_sata_uahc_gbl_cap_t gbl_cap;
1280         cvmx_sata_uahc_px_sctl_t sctl;
1281         cvmx_sata_uahc_gbl_pi_t pi;
1282         cvmx_sata_uahc_px_cmd_t cmd;
1283         cvmx_sata_uahc_px_sctl_t sctl0, sctl1;
1284         cvmx_sata_uahc_px_ssts_t ssts;
1285         cvmx_sata_uahc_px_tfd_t tfd;
1286         cvmx_sata_uahc_gbl_timer1ms_t gbl_timer1ms;
1287         u64 done;
1288         int result = -1;
1289         int retry_count = 0;
1290         int spd;
1291
1292         /* From the synopsis data book, SATA_UAHC_GBL_TIMER1MS is the
1293          * AMBA clock in MHz * 1000, which is a_clk(Hz) / 1000
1294          */
1295         gbl_timer1ms.u32 = csr_rd32(CVMX_SATA_UAHC_GBL_TIMER1MS);
1296         gbl_timer1ms.s.timv = a_clk / 1000;
1297         csr_wr32(CVMX_SATA_UAHC_GBL_TIMER1MS, gbl_timer1ms.u32);
1298         gbl_timer1ms.u32 = csr_rd32(CVMX_SATA_UAHC_GBL_TIMER1MS);
1299
1300         /* Set-u global capabilities reg (GBL_CAP) */
1301         gbl_cap.u32 = csr_rd32(CVMX_SATA_UAHC_GBL_CAP);
1302         debug("%s: SATA_UAHC_GBL_CAP before: 0x%x\n", __func__, gbl_cap.u32);
1303         gbl_cap.s.sss = 1;
1304         gbl_cap.s.smps = 1;
1305         csr_wr32(CVMX_SATA_UAHC_GBL_CAP, gbl_cap.u32);
1306         gbl_cap.u32 = csr_rd32(CVMX_SATA_UAHC_GBL_CAP);
1307         debug("%s: SATA_UAHC_GBL_CAP after: 0x%x\n", __func__, gbl_cap.u32);
1308
1309         /* Set-up global hba control reg (interrupt enables) */
1310         /* Set-up port SATA control registers (speed limitation) */
1311         if (baud_mhz == 1500)
1312                 spd = 1;
1313         else if (baud_mhz == 3000)
1314                 spd = 2;
1315         else
1316                 spd = 3;
1317
1318         sctl.u32 = csr_rd32(CVMX_SATA_UAHC_PX_SCTL(0));
1319         debug("%s: SATA_UAHC_P0_SCTL before: 0x%x\n", __func__, sctl.u32);
1320         sctl.s.spd = spd;
1321         csr_wr32(CVMX_SATA_UAHC_PX_SCTL(0), sctl.u32);
1322         sctl.u32 = csr_rd32(CVMX_SATA_UAHC_PX_SCTL(0));
1323         debug("%s: SATA_UAHC_P0_SCTL after: 0x%x\n", __func__, sctl.u32);
1324         sctl.u32 = csr_rd32(CVMX_SATA_UAHC_PX_SCTL(1));
1325         debug("%s: SATA_UAHC_P1_SCTL before: 0x%x\n", __func__, sctl.u32);
1326         sctl.s.spd = spd;
1327         csr_wr32(CVMX_SATA_UAHC_PX_SCTL(1), sctl.u32);
1328         sctl.u32 = csr_rd32(CVMX_SATA_UAHC_PX_SCTL(1));
1329         debug("%s: SATA_UAHC_P1_SCTL after: 0x%x\n", __func__, sctl.u32);
1330
1331         /* Set-up ports implemented reg. */
1332         pi.u32 = csr_rd32(CVMX_SATA_UAHC_GBL_PI);
1333         debug("%s: SATA_UAHC_GBL_PI before: 0x%x\n", __func__, pi.u32);
1334         pi.s.pi = 3;
1335         csr_wr32(CVMX_SATA_UAHC_GBL_PI, pi.u32);
1336         pi.u32 = csr_rd32(CVMX_SATA_UAHC_GBL_PI);
1337         debug("%s: SATA_UAHC_GBL_PI after: 0x%x\n", __func__, pi.u32);
1338
1339 retry0:
1340         /* Clear port SERR and IS registers */
1341         csr_wr32(CVMX_SATA_UAHC_PX_SERR(0), csr_rd32(CVMX_SATA_UAHC_PX_SERR(0)));
1342         csr_wr32(CVMX_SATA_UAHC_PX_IS(0), csr_rd32(CVMX_SATA_UAHC_PX_IS(0)));
1343
1344         /* Set spin-up, power on, FIS RX enable, start, active */
1345         cmd.u32 = csr_rd32(CVMX_SATA_UAHC_PX_CMD(0));
1346         debug("%s: SATA_UAHC_P0_CMD before: 0x%x\n", __func__, cmd.u32);
1347         cmd.s.fre = 1;
1348         cmd.s.sud = 1;
1349         cmd.s.pod = 1;
1350         cmd.s.st = 1;
1351         cmd.s.icc = 1;
1352         cmd.s.fbscp = 1; /* Enable FIS-based switching */
1353         csr_wr32(CVMX_SATA_UAHC_PX_CMD(0), cmd.u32);
1354         cmd.u32 = csr_rd32(CVMX_SATA_UAHC_PX_CMD(0));
1355         debug("%s: SATA_UAHC_P0_CMD after: 0x%x\n", __func__, cmd.u32);
1356
1357         sctl0.u32 = csr_rd32(CVMX_SATA_UAHC_PX_SCTL(0));
1358         sctl0.s.det = 1;
1359         csr_wr32(CVMX_SATA_UAHC_PX_SCTL(0), sctl0.u32);
1360
1361         /* check status */
1362         done = get_timer(0);
1363         while (1) {
1364                 ssts.u32 = csr_rd32(CVMX_SATA_UAHC_PX_SSTS(0));
1365
1366                 if (ssts.s.ipm == 1 && ssts.s.det == 3) {
1367                         result = 0;
1368                         break;
1369                 } else if (get_timer(done) > 100) {
1370                         result = -1;
1371                         break;
1372                 }
1373
1374                 udelay(100);
1375         }
1376
1377         if (result != -1) {
1378                 /* Clear the PxSERR Register, by writing '1s' to each
1379                  * implemented bit location
1380                  */
1381                 csr_wr32(CVMX_SATA_UAHC_PX_SERR(0), -1);
1382
1383                 /*
1384                  * Wait for indication that SATA drive is ready. This is
1385                  * determined via an examination of PxTFD.STS. If PxTFD.STS.BSY
1386                  * PxTFD.STS.DRQ, and PxTFD.STS.ERR are all '0', prior to the
1387                  * maximum allowed time as specified in the ATA/ATAPI-7
1388                  * specification, the device is ready.
1389                  */
1390                 /*
1391                  * Wait for the device to be ready. BSY(7), DRQ(3), and ERR(0)
1392                  * must be clear
1393                  */
1394                 done = get_timer(0);
1395                 while (1) {
1396                         tfd.u32 = csr_rd32(CVMX_SATA_UAHC_PX_TFD(0));
1397                         if ((tfd.s.sts & 0x89) == 0) {
1398                                 result = 0;
1399                                 break;
1400                         } else if (get_timer(done) > 500) {
1401                                 if (retry_count < 3) {
1402                                         sctl0.u32 = csr_rd32(CVMX_SATA_UAHC_PX_SCTL(0));
1403                                         sctl0.s.det = 1; /* Perform interface reset */
1404                                         csr_wr32(CVMX_SATA_UAHC_PX_SCTL(0), sctl0.u32);
1405                                         udelay(1000); /* 1ms dicated by AHCI 1.3 spec */
1406                                         sctl0.u32 = csr_rd32(CVMX_SATA_UAHC_PX_SCTL(0));
1407                                         sctl0.s.det = 0; /* Perform interface reset */
1408                                         csr_wr32(CVMX_SATA_UAHC_PX_SCTL(0), sctl0.u32);
1409                                         retry_count++;
1410                                         goto retry0;
1411                                 }
1412                                 result = -1;
1413                                 break;
1414                         }
1415
1416                         udelay(100);
1417                 }
1418         }
1419
1420         if (result == -1)
1421                 printf("SATA0: not available\n");
1422         else
1423                 printf("SATA0: available\n");
1424
1425         sctl1.u32 = csr_rd32(CVMX_SATA_UAHC_PX_SCTL(1));
1426         sctl1.s.det = 1;
1427         csr_wr32(CVMX_SATA_UAHC_PX_SCTL(1), sctl1.u32);
1428
1429         result = -1;
1430         retry_count = 0;
1431
1432 retry1:
1433         /* Clear port SERR and IS registers */
1434         csr_wr32(CVMX_SATA_UAHC_PX_SERR(1), csr_rd32(CVMX_SATA_UAHC_PX_SERR(1)));
1435         csr_wr32(CVMX_SATA_UAHC_PX_IS(1), csr_rd32(CVMX_SATA_UAHC_PX_IS(1)));
1436
1437         /* Set spin-up, power on, FIS RX enable, start, active */
1438         cmd.u32 = csr_rd32(CVMX_SATA_UAHC_PX_CMD(1));
1439         debug("%s: SATA_UAHC_P1_CMD before: 0x%x\n", __func__, cmd.u32);
1440         cmd.s.fre = 1;
1441         cmd.s.sud = 1;
1442         cmd.s.pod = 1;
1443         cmd.s.st = 1;
1444         cmd.s.icc = 1;
1445         cmd.s.fbscp = 1; /* Enable FIS-based switching */
1446         csr_wr32(CVMX_SATA_UAHC_PX_CMD(1), cmd.u32);
1447         cmd.u32 = csr_rd32(CVMX_SATA_UAHC_PX_CMD(1));
1448         debug("%s: SATA_UAHC_P1_CMD after: 0x%x\n", __func__, cmd.u32);
1449
1450         /* check status */
1451         done = get_timer(0);
1452         while (1) {
1453                 ssts.u32 = csr_rd32(CVMX_SATA_UAHC_PX_SSTS(1));
1454
1455                 if (ssts.s.ipm == 1 && ssts.s.det == 3) {
1456                         result = 0;
1457                         break;
1458                 } else if (get_timer(done) > 1000) {
1459                         result = -1;
1460                         break;
1461                 }
1462
1463                 udelay(100);
1464         }
1465
1466         if (result != -1) {
1467                 /* Clear the PxSERR Register, by writing '1s' to each
1468                  * implemented bit location
1469                  */
1470                 csr_wr32(CVMX_SATA_UAHC_PX_SERR(1), csr_rd32(CVMX_SATA_UAHC_PX_SERR(1)));
1471
1472                 /*
1473                  * Wait for indication that SATA drive is ready. This is
1474                  * determined via an examination of PxTFD.STS. If PxTFD.STS.BSY
1475                  * PxTFD.STS.DRQ, and PxTFD.STS.ERR are all '0', prior to the
1476                  * maximum allowed time as specified in the ATA/ATAPI-7
1477                  * specification, the device is ready.
1478                  */
1479                 /*
1480                  * Wait for the device to be ready. BSY(7), DRQ(3), and ERR(0)
1481                  * must be clear
1482                  */
1483                 done = get_timer(0);
1484                 while (1) {
1485                         tfd.u32 = csr_rd32(CVMX_SATA_UAHC_PX_TFD(1));
1486                         if ((tfd.s.sts & 0x89) == 0) {
1487                                 result = 0;
1488                                 break;
1489                         } else if (get_timer(done) > 500) {
1490                                 if (retry_count < 3) {
1491                                         sctl0.u32 = csr_rd32(CVMX_SATA_UAHC_PX_SCTL(1));
1492                                         sctl0.s.det = 1; /* Perform interface reset */
1493                                         csr_wr32(CVMX_SATA_UAHC_PX_SCTL(1), sctl0.u32);
1494                                         udelay(1000); /* 1ms dicated by AHCI 1.3 spec */
1495                                         sctl0.u32 = csr_rd32(CVMX_SATA_UAHC_PX_SCTL(1));
1496                                         sctl0.s.det = 0; /* Perform interface reset */
1497                                         csr_wr32(CVMX_SATA_UAHC_PX_SCTL(1), sctl0.u32);
1498                                         retry_count++;
1499                                         goto retry1;
1500                                 }
1501                                 result = -1;
1502                                 break;
1503                         }
1504
1505                         udelay(100);
1506                 }
1507         }
1508
1509         if (result == -1)
1510                 printf("SATA1: not available\n");
1511         else
1512                 printf("SATA1: available\n");
1513
1514         return 0;
1515 }
1516
1517 static int __sata_bist_cn70xx(int qlm, int baud_mhz, int ref_clk_sel, int ref_clk_input)
1518 {
1519         cvmx_sata_uctl_bist_status_t bist_status;
1520         cvmx_sata_uctl_ctl_t uctl_ctl;
1521         cvmx_sata_uctl_shim_cfg_t shim_cfg;
1522         u64 done;
1523         int result = -1;
1524
1525         debug("%s(%d, %d, %d, %d)\n", __func__, qlm, baud_mhz, ref_clk_sel, ref_clk_input);
1526         bist_status.u64 = csr_rd(CVMX_SATA_UCTL_BIST_STATUS);
1527
1528         {
1529                 if (__dlm2_sata_uctl_init_cn70xx()) {
1530                         printf("ERROR: Failed to initialize SATA UCTL CSRs\n");
1531                         return -1;
1532                 }
1533                 if (OCTEON_IS_MODEL(OCTEON_CN73XX))
1534                         result = __sata_dlm_init_cn73xx(qlm, baud_mhz, ref_clk_sel, ref_clk_input);
1535                 else
1536                         result = __sata_dlm_init_cn70xx(qlm, baud_mhz, ref_clk_sel, ref_clk_input);
1537                 if (result) {
1538                         printf("ERROR: Failed to initialize SATA GSER CSRs\n");
1539                         return -1;
1540                 }
1541
1542                 uctl_ctl.u64 = csr_rd(CVMX_SATA_UCTL_CTL);
1543                 uctl_ctl.s.start_bist = 1;
1544                 csr_wr(CVMX_SATA_UCTL_CTL, uctl_ctl.u64);
1545
1546                 /* Set-up for a 1 sec timer. */
1547                 done = get_timer(0);
1548                 while (1) {
1549                         bist_status.u64 = csr_rd(CVMX_SATA_UCTL_BIST_STATUS);
1550                         if ((bist_status.s.uctl_xm_r_bist_ndone |
1551                              bist_status.s.uctl_xm_w_bist_ndone |
1552                              bist_status.s.uahc_p0_rxram_bist_ndone |
1553                              bist_status.s.uahc_p1_rxram_bist_ndone |
1554                              bist_status.s.uahc_p0_txram_bist_ndone |
1555                              bist_status.s.uahc_p1_txram_bist_ndone) == 0) {
1556                                 result = 0;
1557                                 break;
1558                         } else if (get_timer(done) > 1000) {
1559                                 result = -1;
1560                                 break;
1561                         }
1562
1563                         udelay(100);
1564                 }
1565                 if (result == -1) {
1566                         printf("ERROR: SATA_UCTL_BIST_STATUS = 0x%llx\n",
1567                                (unsigned long long)bist_status.u64);
1568                         return -1;
1569                 }
1570
1571                 debug("%s: Initializing UAHC\n", __func__);
1572                 if (__dlm2_sata_uahc_init_cn70xx(baud_mhz)) {
1573                         printf("ERROR: Failed to initialize SATA UAHC CSRs\n");
1574                         return -1;
1575                 }
1576         }
1577
1578         /* Change CSR_ENDIAN_MODE to big endian to use Open Source AHCI SATA
1579          * driver
1580          */
1581         shim_cfg.u64 = csr_rd(CVMX_SATA_UCTL_SHIM_CFG);
1582         shim_cfg.s.csr_endian_mode = 1;
1583         csr_wr(CVMX_SATA_UCTL_SHIM_CFG, shim_cfg.u64);
1584
1585         return 0;
1586 }
1587
1588 static int __setup_sata(int qlm, int baud_mhz, int ref_clk_sel, int ref_clk_input)
1589 {
1590         debug("%s(%d, %d, %d, %d)\n", __func__, qlm, baud_mhz, ref_clk_sel, ref_clk_input);
1591         return __sata_bist_cn70xx(qlm, baud_mhz, ref_clk_sel, ref_clk_input);
1592 }
1593
1594 static int __dlmx_setup_pcie_cn70xx(int qlm, enum cvmx_qlm_mode mode, int gen2, int rc,
1595                                     int ref_clk_sel, int ref_clk_input)
1596 {
1597         cvmx_gserx_dlmx_phy_reset_t dlmx_phy_reset;
1598         cvmx_gserx_dlmx_test_powerdown_t dlmx_test_powerdown;
1599         cvmx_gserx_dlmx_mpll_multiplier_t mpll_multiplier;
1600         cvmx_gserx_dlmx_ref_clkdiv2_t ref_clkdiv2;
1601         static const u8 ref_clk_mult[2] = { 35, 56 }; /* 100 & 125 MHz ref clock supported. */
1602
1603         debug("%s(%d, %d, %d, %d, %d, %d)\n", __func__, qlm, mode, gen2, rc, ref_clk_sel,
1604               ref_clk_input);
1605         if (rc == 0) {
1606                 debug("Skipping initializing PCIe dlm %d in endpoint mode\n", qlm);
1607                 return 0;
1608         }
1609
1610         if (qlm > 0 && ref_clk_input > 1) {
1611                 printf("%s: Error: ref_clk_input can only be 0 or 1 for QLM %d\n",
1612                        __func__, qlm);
1613                 return -1;
1614         }
1615
1616         if (ref_clk_sel > OCTEON_QLM_REF_CLK_125MHZ) {
1617                 printf("%s: Error: ref_clk_sel can only be 100 or 125 MHZ.\n", __func__);
1618                 return -1;
1619         }
1620
1621         /* 1. Write GSER0_DLM(1..2)_REFCLK_SEL[REFCLK_SEL] if required for
1622          *    reference-clock selection
1623          */
1624
1625         csr_wr(CVMX_GSERX_DLMX_REFCLK_SEL(qlm, 0), ref_clk_input);
1626
1627         /* 2. If required, write GSER0_DLM(1..2)_REF_CLKDIV2[REF_CLKDIV2] = 1
1628          *    (must be set if reference clock >= 100 MHz)
1629          */
1630
1631         /* 4. Configure the PCIE PIPE:
1632          *  a. Write GSER0_PCIE_PIPE_PORT_SEL[PIPE_PORT_SEL] to configure the
1633          *     PCIE PIPE.
1634          *      0x0 = disables all pipes
1635          *      0x1 = enables pipe0 only (PEM0 4-lane)
1636          *      0x2 = enables pipes 0 and 1 (PEM0 and PEM1 2-lanes each)
1637          *      0x3 = enables pipes 0, 1, 2, and 3 (PEM0, PEM1, and PEM3 are
1638          *            one-lane each)
1639          *  b. Configure GSER0_PCIE_PIPE_PORT_SEL[CFG_PEM1_DLM2]. If PEM1 is
1640          *     to be configured, this bit must reflect which DLM it is logically
1641          *     tied to. This bit sets multiplexing logic in GSER, and it is used
1642          *     by the RST logic to determine when the MAC can come out of reset.
1643          *      0 = PEM1 is tied to DLM1 (for 3 x 1 PCIe mode).
1644          *      1 = PEM1 is tied to DLM2 (for all other PCIe modes).
1645          */
1646         if (qlm == 1) {
1647                 cvmx_gserx_pcie_pipe_port_sel_t pipe_port;
1648
1649                 pipe_port.u64 = csr_rd(CVMX_GSERX_PCIE_PIPE_PORT_SEL(0));
1650                 pipe_port.s.cfg_pem1_dlm2 = (mode == CVMX_QLM_MODE_PCIE_1X1) ? 1 : 0;
1651                 pipe_port.s.pipe_port_sel =
1652                                 (mode == CVMX_QLM_MODE_PCIE) ? 1 : /* PEM0 only */
1653                                 (mode == CVMX_QLM_MODE_PCIE_1X2) ? 2 : /* PEM0-1 */
1654                                 (mode == CVMX_QLM_MODE_PCIE_1X1) ? 3 : /* PEM0-2 */
1655                                 (mode == CVMX_QLM_MODE_PCIE_2X1) ? 3 : /* PEM0-1 */
1656                                 0; /* PCIe disabled */
1657                 csr_wr(CVMX_GSERX_PCIE_PIPE_PORT_SEL(0), pipe_port.u64);
1658         }
1659
1660         /* Apply workaround for Errata (G-20669) MPLL may not come up. */
1661
1662         /* Set REF_CLKDIV2 based on the Ref Clock */
1663         ref_clkdiv2.u64 = csr_rd(CVMX_GSERX_DLMX_REF_CLKDIV2(qlm, 0));
1664         ref_clkdiv2.s.ref_clkdiv2 = ref_clk_sel > 0;
1665         csr_wr(CVMX_GSERX_DLMX_REF_CLKDIV2(qlm, 0), ref_clkdiv2.u64);
1666
1667         /* 1. Ensure GSER(0)_DLM(0..2)_PHY_RESET[PHY_RESET] is set. */
1668         dlmx_phy_reset.u64 = csr_rd(CVMX_GSERX_DLMX_PHY_RESET(qlm, 0));
1669         dlmx_phy_reset.s.phy_reset = 1;
1670         csr_wr(CVMX_GSERX_DLMX_PHY_RESET(qlm, 0), dlmx_phy_reset.u64);
1671
1672         /* 2. If SGMII or QSGMII or RXAUI (i.e. if DLM0) set
1673          *    GSER(0)_DLM(0)_MPLL_EN[MPLL_EN] to one.
1674          */
1675
1676         /* 3. Set GSER(0)_DLM(0..2)_MPLL_MULTIPLIER[MPLL_MULTIPLIER]
1677          *    to the value in the preceding table, which is different
1678          *    than the desired setting prescribed by the HRM.
1679          */
1680         mpll_multiplier.u64 = csr_rd(CVMX_GSERX_DLMX_MPLL_MULTIPLIER(qlm, 0));
1681         mpll_multiplier.s.mpll_multiplier = ref_clk_mult[ref_clk_sel];
1682         debug("%s: Setting MPLL multiplier to %d\n", __func__,
1683               (int)mpll_multiplier.s.mpll_multiplier);
1684         csr_wr(CVMX_GSERX_DLMX_MPLL_MULTIPLIER(qlm, 0), mpll_multiplier.u64);
1685         /* 5. Clear GSER0_DLM(1..2)_TEST_POWERDOWN. Configurations that only
1686          *    use DLM1 need not clear GSER0_DLM2_TEST_POWERDOWN
1687          */
1688         dlmx_test_powerdown.u64 = csr_rd(CVMX_GSERX_DLMX_TEST_POWERDOWN(qlm, 0));
1689         dlmx_test_powerdown.s.test_powerdown = 0;
1690         csr_wr(CVMX_GSERX_DLMX_TEST_POWERDOWN(qlm, 0), dlmx_test_powerdown.u64);
1691
1692         /* 6. Clear GSER0_DLM(1..2)_PHY_RESET. Configurations that use only
1693          *    need DLM1 need not clear GSER0_DLM2_PHY_RESET
1694          */
1695         dlmx_phy_reset.u64 = csr_rd(CVMX_GSERX_DLMX_PHY_RESET(qlm, 0));
1696         dlmx_phy_reset.s.phy_reset = 0;
1697         csr_wr(CVMX_GSERX_DLMX_PHY_RESET(qlm, 0), dlmx_phy_reset.u64);
1698
1699         /* 6. Decrease MPLL_MULTIPLIER by one continually until it reaches
1700          *    the desired long-term setting, ensuring that each MPLL_MULTIPLIER
1701          *   value is constant for at least 1 msec before changing to the next
1702          *   value. The desired long-term setting is as indicated in HRM tables
1703          *   21-1, 21-2, and 21-3. This is not required with the HRM
1704          *   sequence.
1705          */
1706         /* This is set when initializing PCIe after soft reset is asserted. */
1707
1708         /* 7. Write the GSER0_PCIE_PIPE_RST register to take the appropriate
1709          *    PIPE out of reset. There is a PIPEn_RST bit for each PIPE. Clear
1710          *    the appropriate bits based on the configuration (reset is
1711          *     active high).
1712          */
1713         if (qlm == 1) {
1714                 cvmx_pemx_cfg_t pemx_cfg;
1715                 cvmx_pemx_on_t pemx_on;
1716                 cvmx_gserx_pcie_pipe_rst_t pipe_rst;
1717                 cvmx_rst_ctlx_t rst_ctl;
1718
1719                 switch (mode) {
1720                 case CVMX_QLM_MODE_PCIE:     /* PEM0 on DLM1 & DLM2 */
1721                 case CVMX_QLM_MODE_PCIE_1X2: /* PEM0 on DLM1 */
1722                 case CVMX_QLM_MODE_PCIE_1X1: /* PEM0 on DLM1 using lane 0 */
1723                         pemx_cfg.u64 = csr_rd(CVMX_PEMX_CFG(0));
1724                         pemx_cfg.cn70xx.hostmd = rc;
1725                         if (mode == CVMX_QLM_MODE_PCIE_1X1) {
1726                                 pemx_cfg.cn70xx.md =
1727                                         gen2 ? CVMX_PEM_MD_GEN2_1LANE : CVMX_PEM_MD_GEN1_1LANE;
1728                         } else if (mode == CVMX_QLM_MODE_PCIE) {
1729                                 pemx_cfg.cn70xx.md =
1730                                         gen2 ? CVMX_PEM_MD_GEN2_4LANE : CVMX_PEM_MD_GEN1_4LANE;
1731                         } else {
1732                                 pemx_cfg.cn70xx.md =
1733                                         gen2 ? CVMX_PEM_MD_GEN2_2LANE : CVMX_PEM_MD_GEN1_2LANE;
1734                         }
1735                         csr_wr(CVMX_PEMX_CFG(0), pemx_cfg.u64);
1736
1737                         rst_ctl.u64 = csr_rd(CVMX_RST_CTLX(0));
1738                         rst_ctl.s.rst_drv = 1;
1739                         csr_wr(CVMX_RST_CTLX(0), rst_ctl.u64);
1740
1741                         /* PEM0 is on DLM1&2 which is pipe0 */
1742                         pipe_rst.u64 = csr_rd(CVMX_GSERX_PCIE_PIPE_RST(0));
1743                         pipe_rst.s.pipe0_rst = 0;
1744                         csr_wr(CVMX_GSERX_PCIE_PIPE_RST(0), pipe_rst.u64);
1745
1746                         pemx_on.u64 = csr_rd(CVMX_PEMX_ON(0));
1747                         pemx_on.s.pemon = 1;
1748                         csr_wr(CVMX_PEMX_ON(0), pemx_on.u64);
1749                         break;
1750                 case CVMX_QLM_MODE_PCIE_2X1: /* PEM0 and PEM1 on DLM1 */
1751                         pemx_cfg.u64 = csr_rd(CVMX_PEMX_CFG(0));
1752                         pemx_cfg.cn70xx.hostmd = rc;
1753                         pemx_cfg.cn70xx.md = gen2 ? CVMX_PEM_MD_GEN2_1LANE : CVMX_PEM_MD_GEN1_1LANE;
1754                         csr_wr(CVMX_PEMX_CFG(0), pemx_cfg.u64);
1755
1756                         rst_ctl.u64 = csr_rd(CVMX_RST_CTLX(0));
1757                         rst_ctl.s.rst_drv = 1;
1758                         csr_wr(CVMX_RST_CTLX(0), rst_ctl.u64);
1759
1760                         /* PEM0 is on DLM1 which is pipe0 */
1761                         pipe_rst.u64 = csr_rd(CVMX_GSERX_PCIE_PIPE_RST(0));
1762                         pipe_rst.s.pipe0_rst = 0;
1763                         csr_wr(CVMX_GSERX_PCIE_PIPE_RST(0), pipe_rst.u64);
1764
1765                         pemx_on.u64 = csr_rd(CVMX_PEMX_ON(0));
1766                         pemx_on.s.pemon = 1;
1767                         csr_wr(CVMX_PEMX_ON(0), pemx_on.u64);
1768
1769                         pemx_cfg.u64 = csr_rd(CVMX_PEMX_CFG(1));
1770                         pemx_cfg.cn70xx.hostmd = 1;
1771                         pemx_cfg.cn70xx.md = gen2 ? CVMX_PEM_MD_GEN2_1LANE : CVMX_PEM_MD_GEN1_1LANE;
1772                         csr_wr(CVMX_PEMX_CFG(1), pemx_cfg.u64);
1773                         rst_ctl.u64 = csr_rd(CVMX_RST_CTLX(1));
1774                         rst_ctl.s.rst_drv = 1;
1775                         csr_wr(CVMX_RST_CTLX(1), rst_ctl.u64);
1776                         /* PEM1 is on DLM2 which is pipe1 */
1777                         pipe_rst.u64 = csr_rd(CVMX_GSERX_PCIE_PIPE_RST(0));
1778                         pipe_rst.s.pipe1_rst = 0;
1779                         csr_wr(CVMX_GSERX_PCIE_PIPE_RST(0), pipe_rst.u64);
1780                         pemx_on.u64 = csr_rd(CVMX_PEMX_ON(1));
1781                         pemx_on.s.pemon = 1;
1782                         csr_wr(CVMX_PEMX_ON(1), pemx_on.u64);
1783                         break;
1784                 default:
1785                         break;
1786                 }
1787         } else {
1788                 cvmx_pemx_cfg_t pemx_cfg;
1789                 cvmx_pemx_on_t pemx_on;
1790                 cvmx_gserx_pcie_pipe_rst_t pipe_rst;
1791                 cvmx_rst_ctlx_t rst_ctl;
1792
1793                 switch (mode) {
1794                 case CVMX_QLM_MODE_PCIE_1X2: /* PEM1 on DLM2 */
1795                         pemx_cfg.u64 = csr_rd(CVMX_PEMX_CFG(1));
1796                         pemx_cfg.cn70xx.hostmd = 1;
1797                         pemx_cfg.cn70xx.md = gen2 ? CVMX_PEM_MD_GEN2_2LANE : CVMX_PEM_MD_GEN1_2LANE;
1798                         csr_wr(CVMX_PEMX_CFG(1), pemx_cfg.u64);
1799
1800                         rst_ctl.u64 = csr_rd(CVMX_RST_CTLX(1));
1801                         rst_ctl.s.rst_drv = 1;
1802                         csr_wr(CVMX_RST_CTLX(1), rst_ctl.u64);
1803
1804                         /* PEM1 is on DLM1 lane 0, which is pipe1 */
1805                         pipe_rst.u64 = csr_rd(CVMX_GSERX_PCIE_PIPE_RST(0));
1806                         pipe_rst.s.pipe1_rst = 0;
1807                         csr_wr(CVMX_GSERX_PCIE_PIPE_RST(0), pipe_rst.u64);
1808
1809                         pemx_on.u64 = csr_rd(CVMX_PEMX_ON(1));
1810                         pemx_on.s.pemon = 1;
1811                         csr_wr(CVMX_PEMX_ON(1), pemx_on.u64);
1812                         break;
1813                 case CVMX_QLM_MODE_PCIE_2X1: /* PEM1 and PEM2 on DLM2 */
1814                         pemx_cfg.u64 = csr_rd(CVMX_PEMX_CFG(1));
1815                         pemx_cfg.cn70xx.hostmd = 1;
1816                         pemx_cfg.cn70xx.md = gen2 ? CVMX_PEM_MD_GEN2_1LANE : CVMX_PEM_MD_GEN1_1LANE;
1817                         csr_wr(CVMX_PEMX_CFG(1), pemx_cfg.u64);
1818
1819                         rst_ctl.u64 = csr_rd(CVMX_RST_CTLX(1));
1820                         rst_ctl.s.rst_drv = 1;
1821                         csr_wr(CVMX_RST_CTLX(1), rst_ctl.u64);
1822
1823                         /* PEM1 is on DLM2 lane 0, which is pipe2 */
1824                         pipe_rst.u64 = csr_rd(CVMX_GSERX_PCIE_PIPE_RST(0));
1825                         pipe_rst.s.pipe2_rst = 0;
1826                         csr_wr(CVMX_GSERX_PCIE_PIPE_RST(0), pipe_rst.u64);
1827
1828                         pemx_on.u64 = csr_rd(CVMX_PEMX_ON(1));
1829                         pemx_on.s.pemon = 1;
1830                         csr_wr(CVMX_PEMX_ON(1), pemx_on.u64);
1831
1832                         pemx_cfg.u64 = csr_rd(CVMX_PEMX_CFG(2));
1833                         pemx_cfg.cn70xx.hostmd = 1;
1834                         pemx_cfg.cn70xx.md = gen2 ? CVMX_PEM_MD_GEN2_1LANE : CVMX_PEM_MD_GEN1_1LANE;
1835                         csr_wr(CVMX_PEMX_CFG(2), pemx_cfg.u64);
1836
1837                         rst_ctl.u64 = csr_rd(CVMX_RST_CTLX(2));
1838                         rst_ctl.s.rst_drv = 1;
1839                         csr_wr(CVMX_RST_CTLX(2), rst_ctl.u64);
1840
1841                         /* PEM2 is on DLM2 lane 1, which is pipe3 */
1842                         pipe_rst.u64 = csr_rd(CVMX_GSERX_PCIE_PIPE_RST(0));
1843                         pipe_rst.s.pipe3_rst = 0;
1844                         csr_wr(CVMX_GSERX_PCIE_PIPE_RST(0), pipe_rst.u64);
1845
1846                         pemx_on.u64 = csr_rd(CVMX_PEMX_ON(2));
1847                         pemx_on.s.pemon = 1;
1848                         csr_wr(CVMX_PEMX_ON(2), pemx_on.u64);
1849                         break;
1850                 default:
1851                         break;
1852                 }
1853         }
1854         return 0;
1855 }
1856
1857 /**
1858  * Configure dlm speed and mode for cn70xx.
1859  *
1860  * @param qlm     The DLM to configure
1861  * @param speed   The speed the DLM needs to be configured in Mhz.
1862  * @param mode    The DLM to be configured as SGMII/XAUI/PCIe.
1863  *                  DLM 0: has 2 interfaces which can be configured as
1864  *                         SGMII/QSGMII/RXAUI. Need to configure both at the
1865  *                         same time. These are valid option
1866  *                              CVMX_QLM_MODE_QSGMII,
1867  *                              CVMX_QLM_MODE_SGMII_SGMII,
1868  *                              CVMX_QLM_MODE_SGMII_DISABLED,
1869  *                              CVMX_QLM_MODE_DISABLED_SGMII,
1870  *                              CVMX_QLM_MODE_SGMII_QSGMII,
1871  *                              CVMX_QLM_MODE_QSGMII_QSGMII,
1872  *                              CVMX_QLM_MODE_QSGMII_DISABLED,
1873  *                              CVMX_QLM_MODE_DISABLED_QSGMII,
1874  *                              CVMX_QLM_MODE_QSGMII_SGMII,
1875  *                              CVMX_QLM_MODE_RXAUI_1X2
1876  *
1877  *                  DLM 1: PEM0/1 in PCIE_1x4/PCIE_2x1/PCIE_1X1
1878  *                  DLM 2: PEM0/1/2 in PCIE_1x4/PCIE_1x2/PCIE_2x1/PCIE_1x1
1879  * @param rc      Only used for PCIe, rc = 1 for root complex mode, 0 for EP mode.
1880  * @param gen2    Only used for PCIe, gen2 = 1, in GEN2 mode else in GEN1 mode.
1881  *
1882  * @param ref_clk_input  The reference-clock input to use to configure QLM
1883  * @param ref_clk_sel    The reference-clock selection to use to configure QLM
1884  *
1885  * @return       Return 0 on success or -1.
1886  */
1887 static int octeon_configure_qlm_cn70xx(int qlm, int speed, int mode, int rc, int gen2,
1888                                        int ref_clk_sel, int ref_clk_input)
1889 {
1890         debug("%s(%d, %d, %d, %d, %d, %d, %d)\n", __func__, qlm, speed, mode, rc, gen2, ref_clk_sel,
1891               ref_clk_input);
1892         switch (qlm) {
1893         case 0: {
1894                 int is_sff7000_rxaui = 0;
1895                 cvmx_gmxx_inf_mode_t inf_mode0, inf_mode1;
1896
1897                 inf_mode0.u64 = csr_rd(CVMX_GMXX_INF_MODE(0));
1898                 inf_mode1.u64 = csr_rd(CVMX_GMXX_INF_MODE(1));
1899                 if (inf_mode0.s.en || inf_mode1.s.en) {
1900                         debug("DLM0 already configured\n");
1901                         return -1;
1902                 }
1903
1904                 switch (mode) {
1905                 case CVMX_QLM_MODE_SGMII_SGMII:
1906                         debug("  Mode SGMII SGMII\n");
1907                         inf_mode0.s.mode = CVMX_GMX_INF_MODE_SGMII;
1908                         inf_mode1.s.mode = CVMX_GMX_INF_MODE_SGMII;
1909                         break;
1910                 case CVMX_QLM_MODE_SGMII_QSGMII:
1911                         debug("  Mode SGMII QSGMII\n");
1912                         inf_mode0.s.mode = CVMX_GMX_INF_MODE_SGMII;
1913                         inf_mode1.s.mode = CVMX_GMX_INF_MODE_QSGMII;
1914                         break;
1915                 case CVMX_QLM_MODE_SGMII_DISABLED:
1916                         debug("  Mode SGMII Disabled\n");
1917                         inf_mode0.s.mode = CVMX_GMX_INF_MODE_SGMII;
1918                         inf_mode1.s.mode = CVMX_GMX_INF_MODE_DISABLED;
1919                         break;
1920                 case CVMX_QLM_MODE_DISABLED_SGMII:
1921                         debug("Mode Disabled SGMII\n");
1922                         inf_mode0.s.mode = CVMX_GMX_INF_MODE_DISABLED;
1923                         inf_mode1.s.mode = CVMX_GMX_INF_MODE_SGMII;
1924                         break;
1925                 case CVMX_QLM_MODE_QSGMII_SGMII:
1926                         debug("  Mode QSGMII SGMII\n");
1927                         inf_mode0.s.mode = CVMX_GMX_INF_MODE_QSGMII;
1928                         inf_mode1.s.mode = CVMX_GMX_INF_MODE_SGMII;
1929                         break;
1930                 case CVMX_QLM_MODE_QSGMII_QSGMII:
1931                         debug("  Mode QSGMII QSGMII\n");
1932                         inf_mode0.s.mode = CVMX_GMX_INF_MODE_QSGMII;
1933                         inf_mode1.s.mode = CVMX_GMX_INF_MODE_QSGMII;
1934                         break;
1935                 case CVMX_QLM_MODE_QSGMII_DISABLED:
1936                         debug("  Mode QSGMII Disabled\n");
1937                         inf_mode0.s.mode = CVMX_GMX_INF_MODE_QSGMII;
1938                         inf_mode1.s.mode = CVMX_GMX_INF_MODE_DISABLED;
1939                         break;
1940                 case CVMX_QLM_MODE_DISABLED_QSGMII:
1941                         debug("Mode Disabled QSGMII\n");
1942                         inf_mode0.s.mode = CVMX_GMX_INF_MODE_DISABLED;
1943                         inf_mode1.s.mode = CVMX_GMX_INF_MODE_QSGMII;
1944                         break;
1945                 case CVMX_QLM_MODE_RXAUI:
1946                         debug("  Mode RXAUI\n");
1947                         inf_mode0.s.mode = CVMX_GMX_INF_MODE_RXAUI;
1948                         inf_mode1.s.mode = CVMX_GMX_INF_MODE_DISABLED;
1949
1950                         break;
1951                 default:
1952                         debug("  Mode Disabled Disabled\n");
1953                         inf_mode0.s.mode = CVMX_GMX_INF_MODE_DISABLED;
1954                         inf_mode1.s.mode = CVMX_GMX_INF_MODE_DISABLED;
1955                         break;
1956                 }
1957                 csr_wr(CVMX_GMXX_INF_MODE(0), inf_mode0.u64);
1958                 csr_wr(CVMX_GMXX_INF_MODE(1), inf_mode1.u64);
1959
1960                 /* Bringup the PLL */
1961                 if (__dlm_setup_pll_cn70xx(qlm, speed, ref_clk_sel, ref_clk_input,
1962                                            is_sff7000_rxaui))
1963                         return -1;
1964
1965                 /* TX Lanes */
1966                 if (__dlm0_setup_tx_cn70xx(speed, ref_clk_sel))
1967                         return -1;
1968
1969                 /* RX Lanes */
1970                 if (__dlm0_setup_rx_cn70xx(speed, ref_clk_sel))
1971                         return -1;
1972
1973                 /* Enable the interface */
1974                 inf_mode0.u64 = csr_rd(CVMX_GMXX_INF_MODE(0));
1975                 if (inf_mode0.s.mode != CVMX_GMX_INF_MODE_DISABLED)
1976                         inf_mode0.s.en = 1;
1977                 csr_wr(CVMX_GMXX_INF_MODE(0), inf_mode0.u64);
1978                 inf_mode1.u64 = csr_rd(CVMX_GMXX_INF_MODE(1));
1979                 if (inf_mode1.s.mode != CVMX_GMX_INF_MODE_DISABLED)
1980                         inf_mode1.s.en = 1;
1981                 csr_wr(CVMX_GMXX_INF_MODE(1), inf_mode1.u64);
1982                 break;
1983         }
1984         case 1:
1985                 switch (mode) {
1986                 case CVMX_QLM_MODE_PCIE: /* PEM0 on DLM1 & DLM2 */
1987                         debug("  Mode PCIe\n");
1988                         if (__dlmx_setup_pcie_cn70xx(1, mode, gen2, rc, ref_clk_sel, ref_clk_input))
1989                                 return -1;
1990                         if (__dlmx_setup_pcie_cn70xx(2, mode, gen2, rc, ref_clk_sel, ref_clk_input))
1991                                 return -1;
1992                         break;
1993                 case CVMX_QLM_MODE_PCIE_1X2: /* PEM0 on DLM1 */
1994                 case CVMX_QLM_MODE_PCIE_2X1: /* PEM0 & PEM1 on DLM1 */
1995                 case CVMX_QLM_MODE_PCIE_1X1: /* PEM0 on DLM1, only 1 lane */
1996                         debug("  Mode PCIe 1x2, 2x1 or 1x1\n");
1997                         if (__dlmx_setup_pcie_cn70xx(qlm, mode, gen2, rc, ref_clk_sel,
1998                                                      ref_clk_input))
1999                                 return -1;
2000                         break;
2001                 case CVMX_QLM_MODE_DISABLED:
2002                         debug("  Mode disabled\n");
2003                         break;
2004                 default:
2005                         debug("DLM1 illegal mode specified\n");
2006                         return -1;
2007                 }
2008                 break;
2009         case 2:
2010                 switch (mode) {
2011                 case CVMX_QLM_MODE_SATA_2X1:
2012                         debug("%s: qlm 2, mode is SATA 2x1\n", __func__);
2013                         /* DLM2 is SATA, PCIE2 is disabled */
2014                         if (__setup_sata(qlm, speed, ref_clk_sel, ref_clk_input))
2015                                 return -1;
2016                         break;
2017                 case CVMX_QLM_MODE_PCIE:
2018                         debug("  Mode PCIe\n");
2019                         /* DLM2 is PCIE0, PCIE1-2 are disabled. */
2020                         /* Do nothing, its initialized in DLM1 */
2021                         break;
2022                 case CVMX_QLM_MODE_PCIE_1X2: /* PEM1 on DLM2 */
2023                 case CVMX_QLM_MODE_PCIE_2X1: /* PEM1 & PEM2 on DLM2 */
2024                         debug("  Mode PCIe 1x2 or 2x1\n");
2025                         if (__dlmx_setup_pcie_cn70xx(qlm, mode, gen2, rc, ref_clk_sel,
2026                                                      ref_clk_input))
2027                                 return -1;
2028                         break;
2029                 case CVMX_QLM_MODE_DISABLED:
2030                         debug("  Mode Disabled\n");
2031                         break;
2032                 default:
2033                         debug("DLM2 illegal mode specified\n");
2034                         return -1;
2035                 }
2036         default:
2037                 return -1;
2038         }
2039
2040         return 0;
2041 }
2042
2043 /**
2044  * Disables DFE for the specified QLM lane(s).
2045  * This function should only be called for low-loss channels.
2046  *
2047  * @param node     Node to configure
2048  * @param qlm      QLM to configure
2049  * @param lane     Lane to configure, or -1 all lanes
2050  * @param baud_mhz The speed the QLM needs to be configured in Mhz.
2051  * @param mode     The QLM to be configured as SGMII/XAUI/PCIe.
2052  */
2053 void octeon_qlm_dfe_disable(int node, int qlm, int lane, int baud_mhz, int mode)
2054 {
2055         int num_lanes = cvmx_qlm_get_lanes(qlm);
2056         int l;
2057         cvmx_gserx_lanex_rx_loop_ctrl_t loop_ctrl;
2058         cvmx_gserx_lanex_rx_valbbd_ctrl_0_t ctrl_0;
2059         cvmx_gserx_lanex_rx_valbbd_ctrl_1_t ctrl_1;
2060         cvmx_gserx_lanex_rx_valbbd_ctrl_2_t ctrl_2;
2061         cvmx_gserx_lane_vma_fine_ctrl_2_t lane_vma_fine_ctrl_2;
2062
2063         /* Interfaces below 5Gbaud are already manually tuned. */
2064         if (baud_mhz < 5000)
2065                 return;
2066
2067         /* Don't run on PCIe links, SATA or KR.  These interfaces use training */
2068         switch (mode) {
2069         case CVMX_QLM_MODE_10G_KR_1X2:
2070         case CVMX_QLM_MODE_10G_KR:
2071         case CVMX_QLM_MODE_40G_KR4:
2072                 return;
2073         case CVMX_QLM_MODE_PCIE_1X1:
2074         case CVMX_QLM_MODE_PCIE_2X1:
2075         case CVMX_QLM_MODE_PCIE_1X2:
2076         case CVMX_QLM_MODE_PCIE:
2077         case CVMX_QLM_MODE_PCIE_1X8:
2078                 return;
2079         case CVMX_QLM_MODE_SATA_2X1:
2080                 return;
2081         default:
2082                 break;
2083         }
2084
2085         /* Updating pre_ctle minimum to 0. This works best for short channels */
2086         lane_vma_fine_ctrl_2.u64 = csr_rd_node(node, CVMX_GSERX_LANE_VMA_FINE_CTRL_2(qlm));
2087         lane_vma_fine_ctrl_2.s.rx_prectle_gain_min_fine = 0;
2088         csr_wr_node(node, CVMX_GSERX_LANE_VMA_FINE_CTRL_2(qlm), lane_vma_fine_ctrl_2.u64);
2089
2090         for (l = 0; l < num_lanes; l++) {
2091                 if (lane != -1 && lane != l)
2092                         continue;
2093
2094                 /* 1. Write GSERX_LANEx_RX_LOOP_CTRL = 0x0270
2095                  * (var "loop_ctrl" with bits 8 & 1 cleared).
2096                  * bit<1> dfe_en_byp = 1'b0
2097                  */
2098                 loop_ctrl.u64 = csr_rd_node(node, CVMX_GSERX_LANEX_RX_LOOP_CTRL(l, qlm));
2099                 loop_ctrl.s.cfg_rx_lctrl = loop_ctrl.s.cfg_rx_lctrl & 0x3fd;
2100                 csr_wr_node(node, CVMX_GSERX_LANEX_RX_LOOP_CTRL(l, qlm), loop_ctrl.u64);
2101
2102                 /* 2. Write GSERX_LANEx_RX_VALBBD_CTRL_1 = 0x0000
2103                  * (var "ctrl1" with all bits cleared)
2104                  * bits<14:11> CFG_RX_DFE_C3_MVAL = 4'b0000
2105                  * bit<10> CFG_RX_DFE_C3_MSGN = 1'b0
2106                  * bits<9:6> CFG_RX_DFE_C2_MVAL = 4'b0000
2107                  * bit<5> CFG_RX_DFE_C2_MSGN = 1'b0
2108                  * bits<4:0> CFG_RX_DFE_C1_MVAL = 5'b00000
2109                  */
2110                 ctrl_1.u64 = csr_rd_node(node, CVMX_GSERX_LANEX_RX_VALBBD_CTRL_1(l, qlm));
2111                 ctrl_1.s.dfe_c3_mval = 0;
2112                 ctrl_1.s.dfe_c3_msgn = 0;
2113                 ctrl_1.s.dfe_c2_mval = 0;
2114                 ctrl_1.s.dfe_c2_msgn = 0;
2115                 ctrl_1.s.dfe_c2_mval = 0;
2116                 ctrl_1.s.dfe_c1_mval = 0;
2117                 ctrl_1.s.dfe_c1_msgn = 0;
2118                 csr_wr_node(node, CVMX_GSERX_LANEX_RX_VALBBD_CTRL_1(l, qlm), ctrl_1.u64);
2119
2120                 /* 3. Write GSERX_LANEx_RX_VALBBD_CTRL_0 = 0x2400
2121                  * (var "ctrl0" with following bits set/cleared)
2122                  * bits<11:10> CFG_RX_DFE_GAIN = 0x1
2123                  * bits<9:6> CFG_RX_DFE_C5_MVAL = 4'b0000
2124                  * bit<5> CFG_RX_DFE_C5_MSGN = 1'b0
2125                  * bits<4:1> CFG_RX_DFE_C4_MVAL = 4'b0000
2126                  * bit<0> CFG_RX_DFE_C4_MSGN = 1'b0
2127                  */
2128                 ctrl_0.u64 = csr_rd_node(node, CVMX_GSERX_LANEX_RX_VALBBD_CTRL_0(l, qlm));
2129                 ctrl_0.s.dfe_gain = 0x1;
2130                 ctrl_0.s.dfe_c5_mval = 0;
2131                 ctrl_0.s.dfe_c5_msgn = 0;
2132                 ctrl_0.s.dfe_c4_mval = 0;
2133                 ctrl_0.s.dfe_c4_msgn = 0;
2134                 csr_wr_node(node, CVMX_GSERX_LANEX_RX_VALBBD_CTRL_0(l, qlm), ctrl_0.u64);
2135
2136                 /* 4. Write GSER(0..13)_LANE(0..3)_RX_VALBBD_CTRL_2 = 0x003F
2137                  * //enable DFE tap overrides
2138                  * bit<5> dfe_ovrd_en = 1
2139                  * bit<4> dfe_c5_ovrd_val = 1
2140                  * bit<3> dfe_c4_ovrd_val = 1
2141                  * bit<2> dfe_c3_ovrd_val = 1
2142                  * bit<1> dfe_c2_ovrd_val = 1
2143                  * bit<0> dfe_c1_ovrd_val = 1
2144                  */
2145                 ctrl_2.u64 = csr_rd_node(node, CVMX_GSERX_LANEX_RX_VALBBD_CTRL_2(l, qlm));
2146                 ctrl_2.s.dfe_ovrd_en = 0x1;
2147                 ctrl_2.s.dfe_c5_ovrd_val = 0x1;
2148                 ctrl_2.s.dfe_c4_ovrd_val = 0x1;
2149                 ctrl_2.s.dfe_c3_ovrd_val = 0x1;
2150                 ctrl_2.s.dfe_c2_ovrd_val = 0x1;
2151                 ctrl_2.s.dfe_c1_ovrd_val = 0x1;
2152                 csr_wr_node(node, CVMX_GSERX_LANEX_RX_VALBBD_CTRL_2(l, qlm), ctrl_2.u64);
2153         }
2154 }
2155
2156 /**
2157  * Disables DFE, uses fixed CTLE Peak value and AGC settings
2158  * for the specified QLM lane(s).
2159  * This function should only be called for low-loss channels.
2160  * This function prevents Rx equalization from happening on all lanes in a QLM
2161  * This function should be called for all lanes being used in the QLM.
2162  *
2163  * @param  node           Node to configure
2164  * @param  qlm            QLM to configure
2165  * @param  lane           Lane to configure, or -1 all lanes
2166  * @param  baud_mhz       The speed the QLM needs to be configured in Mhz.
2167  * @param  mode           The QLM to be configured as SGMII/XAUI/PCIe.
2168  * @param  ctle_zero      Equalizer Peaking control
2169  * @param  agc_pre_ctle   Pre-CTLE gain
2170  * @param  agc_post_ctle  Post-CTLE gain
2171  * @return Zero on success, negative on failure
2172  */
2173
2174 int octeon_qlm_dfe_disable_ctle_agc(int node, int qlm, int lane, int baud_mhz, int mode,
2175                                     int ctle_zero, int agc_pre_ctle, int agc_post_ctle)
2176 {
2177         int num_lanes = cvmx_qlm_get_lanes(qlm);
2178         int l;
2179         cvmx_gserx_lanex_rx_loop_ctrl_t loop_ctrl;
2180         cvmx_gserx_lanex_rx_valbbd_ctrl_0_t ctrl_0;
2181         cvmx_gserx_lanex_pwr_ctrl_t lanex_pwr_ctrl;
2182         cvmx_gserx_lane_mode_t lmode;
2183         cvmx_gserx_lane_px_mode_1_t px_mode_1;
2184         cvmx_gserx_lanex_rx_cfg_5_t rx_cfg_5;
2185         cvmx_gserx_lanex_rx_cfg_2_t rx_cfg_2;
2186         cvmx_gserx_lanex_rx_ctle_ctrl_t ctle_ctrl;
2187
2188         /* Check tuning constraints */
2189         if (ctle_zero < 0 || ctle_zero > 15) {
2190                 printf("Error: N%d.QLM%d: Invalid CTLE_ZERO(%d).  Must be between -1 and 15.\n",
2191                        node, qlm, ctle_zero);
2192                 return -1;
2193         }
2194         if (agc_pre_ctle < 0 || agc_pre_ctle > 15) {
2195                 printf("Error: N%d.QLM%d: Invalid AGC_Pre_CTLE(%d)\n",
2196                        node, qlm, agc_pre_ctle);
2197                 return -1;
2198         }
2199
2200         if (agc_post_ctle < 0 || agc_post_ctle > 15) {
2201                 printf("Error: N%d.QLM%d: Invalid AGC_Post_CTLE(%d)\n",
2202                        node, qlm, agc_post_ctle);
2203                 return -1;
2204         }
2205
2206         /* Interfaces below 5Gbaud are already manually tuned. */
2207         if (baud_mhz < 5000)
2208                 return 0;
2209
2210         /* Don't run on PCIe links, SATA or KR.  These interfaces use training */
2211         switch (mode) {
2212         case CVMX_QLM_MODE_10G_KR_1X2:
2213         case CVMX_QLM_MODE_10G_KR:
2214         case CVMX_QLM_MODE_40G_KR4:
2215                 return 0;
2216         case CVMX_QLM_MODE_PCIE_1X1:
2217         case CVMX_QLM_MODE_PCIE_2X1:
2218         case CVMX_QLM_MODE_PCIE_1X2:
2219         case CVMX_QLM_MODE_PCIE:
2220         case CVMX_QLM_MODE_PCIE_1X8:
2221                 return 0;
2222         case CVMX_QLM_MODE_SATA_2X1:
2223                 return 0;
2224         default:
2225                 break;
2226         }
2227
2228         lmode.u64 = csr_rd_node(node, CVMX_GSERX_LANE_MODE(qlm));
2229
2230         /* 1. Enable VMA manual mode for the QLM's lane mode */
2231         px_mode_1.u64 = csr_rd_node(node, CVMX_GSERX_LANE_PX_MODE_1(lmode.s.lmode, qlm));
2232         px_mode_1.s.vma_mm = 1;
2233         csr_wr_node(node, CVMX_GSERX_LANE_PX_MODE_1(lmode.s.lmode, qlm), px_mode_1.u64);
2234
2235         /* 2. Disable DFE */
2236         octeon_qlm_dfe_disable(node, qlm, lane, baud_mhz, mode);
2237
2238         for (l = 0; l < num_lanes; l++) {
2239                 if (lane != -1 && lane != l)
2240                         continue;
2241
2242                 /* 3. Write GSERX_LANEx_RX_VALBBD_CTRL_0.CFG_RX_AGC_GAIN = 0x2 */
2243                 ctrl_0.u64 = csr_rd_node(node, CVMX_GSERX_LANEX_RX_VALBBD_CTRL_0(l, qlm));
2244                 ctrl_0.s.agc_gain = 0x2;
2245                 csr_wr_node(node, CVMX_GSERX_LANEX_RX_VALBBD_CTRL_0(l, qlm), ctrl_0.u64);
2246
2247                 /* 4. Write GSERX_LANEx_RX_LOOP_CTRL
2248                  * bit<8> lctrl_men = 1'b1
2249                  * bit<0> cdr_en_byp = 1'b1
2250                  */
2251                 loop_ctrl.u64 = csr_rd_node(node, CVMX_GSERX_LANEX_RX_LOOP_CTRL(l, qlm));
2252                 loop_ctrl.s.cfg_rx_lctrl = loop_ctrl.s.cfg_rx_lctrl | 0x101;
2253                 csr_wr_node(node, CVMX_GSERX_LANEX_RX_LOOP_CTRL(l, qlm), loop_ctrl.u64);
2254
2255                 /* 5. Write GSERX_LANEx_PWR_CTRL = 0x0040 (var "lanex_pwr_ctrl" with
2256                  * following bits set)
2257                  * bit<6> RX_LCTRL_OVRRD_EN = 1'b1
2258                  * all other bits cleared.
2259                  */
2260                 lanex_pwr_ctrl.u64 = csr_rd_node(node, CVMX_GSERX_LANEX_PWR_CTRL(l, qlm));
2261                 lanex_pwr_ctrl.s.rx_lctrl_ovrrd_en = 1;
2262                 csr_wr_node(node, CVMX_GSERX_LANEX_PWR_CTRL(l, qlm), lanex_pwr_ctrl.u64);
2263
2264                 /* --Setting AGC in manual mode and configuring CTLE-- */
2265                 rx_cfg_5.u64 = csr_rd_node(node, CVMX_GSERX_LANEX_RX_CFG_5(l, qlm));
2266                 rx_cfg_5.s.rx_agc_men_ovrrd_val = 1;
2267                 rx_cfg_5.s.rx_agc_men_ovrrd_en = 1;
2268                 csr_wr_node(node, CVMX_GSERX_LANEX_RX_CFG_5(l, qlm), rx_cfg_5.u64);
2269
2270                 ctle_ctrl.u64 = csr_rd_node(node, CVMX_GSERX_LANEX_RX_CTLE_CTRL(l, qlm));
2271                 ctle_ctrl.s.pcs_sds_rx_ctle_zero = ctle_zero;
2272                 csr_wr_node(node, CVMX_GSERX_LANEX_RX_CTLE_CTRL(l, qlm), ctle_ctrl.u64);
2273
2274                 rx_cfg_2.u64 = csr_rd_node(node, CVMX_GSERX_LANEX_RX_CFG_2(l, qlm));
2275                 rx_cfg_2.s.rx_sds_rx_agc_mval = (agc_pre_ctle << 4) | agc_post_ctle;
2276                 csr_wr_node(node, CVMX_GSERX_LANEX_RX_CFG_2(l, qlm), rx_cfg_2.u64);
2277         }
2278         return 0;
2279 }
2280
2281 /**
2282  * Some QLM speeds need to override the default tuning parameters
2283  *
2284  * @param node     Node to configure
2285  * @param qlm      QLM to configure
2286  * @param baud_mhz Desired speed in MHz
2287  * @param lane     Lane the apply the tuning parameters
2288  * @param tx_swing Voltage swing.  The higher the value the lower the voltage,
2289  *                 the default value is 7.
2290  * @param tx_pre   pre-cursor pre-emphasis
2291  * @param tx_post  post-cursor pre-emphasis.
2292  * @param tx_gain   Transmit gain. Range 0-7
2293  * @param tx_vboost Transmit voltage boost. Range 0-1
2294  */
2295 void octeon_qlm_tune_per_lane_v3(int node, int qlm, int baud_mhz, int lane, int tx_swing,
2296                                  int tx_pre, int tx_post, int tx_gain, int tx_vboost)
2297 {
2298         cvmx_gserx_cfg_t gserx_cfg;
2299         cvmx_gserx_lanex_tx_cfg_0_t tx_cfg0;
2300         cvmx_gserx_lanex_tx_pre_emphasis_t pre_emphasis;
2301         cvmx_gserx_lanex_tx_cfg_1_t tx_cfg1;
2302         cvmx_gserx_lanex_tx_cfg_3_t tx_cfg3;
2303         cvmx_bgxx_spux_br_pmd_control_t pmd_control;
2304         cvmx_gserx_lanex_pcs_ctlifc_0_t pcs_ctlifc_0;
2305         cvmx_gserx_lanex_pcs_ctlifc_2_t pcs_ctlifc_2;
2306         int bgx, lmac;
2307
2308         /* Do not apply QLM tuning to PCIe and KR interfaces. */
2309         gserx_cfg.u64 = csr_rd_node(node, CVMX_GSERX_CFG(qlm));
2310         if (gserx_cfg.s.pcie)
2311                 return;
2312
2313         /* Apply the QLM tuning only to cn73xx and cn78xx models only */
2314         if (OCTEON_IS_MODEL(OCTEON_CN78XX))
2315                 bgx = (qlm < 2) ? qlm : (qlm - 2);
2316         else if (OCTEON_IS_MODEL(OCTEON_CN73XX))
2317                 bgx = (qlm < 4) ? (qlm - 2) : 2;
2318         else if (OCTEON_IS_MODEL(OCTEON_CNF75XX))
2319                 bgx = 0;
2320         else
2321                 return;
2322
2323         if ((OCTEON_IS_MODEL(OCTEON_CN73XX) && qlm == 6) ||
2324             (OCTEON_IS_MODEL(OCTEON_CNF75XX) && qlm == 5))
2325                 lmac = 2;
2326         else
2327                 lmac = lane;
2328
2329         /* No need to tune 10G-KR and 40G-KR interfaces */
2330         pmd_control.u64 = csr_rd_node(node, CVMX_BGXX_SPUX_BR_PMD_CONTROL(lmac, bgx));
2331         if (pmd_control.s.train_en)
2332                 return;
2333
2334         if (tx_pre != -1 && tx_post == -1)
2335                 tx_post = 0;
2336
2337         if (tx_post != -1 && tx_pre == -1)
2338                 tx_pre = 0;
2339
2340         /* Check tuning constraints */
2341         if (tx_swing < -1 || tx_swing > 25) {
2342                 printf("ERROR: N%d:QLM%d: Lane %d: Invalid TX_SWING(%d). TX_SWING must be <= 25.\n",
2343                        node, qlm, lane, tx_swing);
2344                 return;
2345         }
2346
2347         if (tx_pre < -1 || tx_pre > 10) {
2348                 printf("ERROR: N%d:QLM%d: Lane %d: Invalid TX_PRE(%d). TX_PRE must be <= 10.\n",
2349                        node, qlm, lane, tx_swing);
2350                 return;
2351         }
2352
2353         if (tx_post < -1 || tx_post > 31) {
2354                 printf("ERROR: N%d:QLM%d: Lane %d: Invalid TX_POST(%d). TX_POST must be <= 15.\n",
2355                        node, qlm, lane, tx_swing);
2356                 return;
2357         }
2358
2359         if (tx_pre >= 0 && tx_post >= 0 && tx_swing >= 0 &&
2360             tx_pre + tx_post - tx_swing > 2) {
2361                 printf("ERROR: N%d.QLM%d: Lane %d: TX_PRE(%d) + TX_POST(%d) - TX_SWING(%d) must be <= 2\n",
2362                        node, qlm, lane, tx_pre, tx_post, tx_swing);
2363                 return;
2364         }
2365
2366         if (tx_pre >= 0 && tx_post >= 0 && tx_swing >= 0 &&
2367             tx_pre + tx_post + tx_swing > 35) {
2368                 printf("ERROR: N%d.QLM%d: Lane %d: TX_PRE(%d) + TX_POST(%d) + TX_SWING(%d) must be <= 35\n",
2369                        node, qlm, lane, tx_pre, tx_post, tx_swing);
2370                 return;
2371         }
2372
2373         if (tx_gain < -1 || tx_gain > 7) {
2374                 printf("ERROR: N%d.QLM%d: Lane %d: Invalid TX_GAIN(%d). TX_GAIN must be between 0 and 7\n",
2375                        node, qlm, lane, tx_gain);
2376                 return;
2377         }
2378
2379         if (tx_vboost < -1 || tx_vboost > 1) {
2380                 printf("ERROR: N%d.QLM%d: Lane %d: Invalid TX_VBOOST(%d).  TX_VBOOST must be 0 or 1.\n",
2381                        node, qlm, lane, tx_vboost);
2382                 return;
2383         }
2384
2385         debug("N%d.QLM%d: Lane %d: TX_SWING=%d, TX_PRE=%d, TX_POST=%d, TX_GAIN=%d, TX_VBOOST=%d\n",
2386               node, qlm, lane, tx_swing, tx_pre, tx_post, tx_gain, tx_vboost);
2387
2388         /* Complete the Tx swing and Tx equilization programming */
2389         /* 1) Enable Tx swing and Tx emphasis overrides */
2390         tx_cfg1.u64 = csr_rd_node(node, CVMX_GSERX_LANEX_TX_CFG_1(lane, qlm));
2391         tx_cfg1.s.tx_swing_ovrrd_en = (tx_swing != -1);
2392         tx_cfg1.s.tx_premptap_ovrrd_val = (tx_pre != -1) && (tx_post != -1);
2393         tx_cfg1.s.tx_vboost_en_ovrrd_en = (tx_vboost != -1); /* Vboost override */
2394         ;
2395         csr_wr_node(node, CVMX_GSERX_LANEX_TX_CFG_1(lane, qlm), tx_cfg1.u64);
2396         /* 2) Program the Tx swing and Tx emphasis Pre-cursor and Post-cursor values */
2397         /* CFG_TX_PREMPTAP[8:4] = Lane X's TX post-cursor value (C+1) */
2398         /* CFG_TX_PREMPTAP[3:0] = Lane X's TX pre-cursor value (C-1) */
2399         if (tx_swing != -1) {
2400                 tx_cfg0.u64 = csr_rd_node(node, CVMX_GSERX_LANEX_TX_CFG_0(lane, qlm));
2401                 tx_cfg0.s.cfg_tx_swing = tx_swing;
2402                 csr_wr_node(node, CVMX_GSERX_LANEX_TX_CFG_0(lane, qlm), tx_cfg0.u64);
2403         }
2404
2405         if ((tx_pre != -1) && (tx_post != -1)) {
2406                 pre_emphasis.u64 = csr_rd_node(node, CVMX_GSERX_LANEX_TX_PRE_EMPHASIS(lane, qlm));
2407                 pre_emphasis.s.cfg_tx_premptap = (tx_post << 4) | tx_pre;
2408                 csr_wr_node(node, CVMX_GSERX_LANEX_TX_PRE_EMPHASIS(lane, qlm), pre_emphasis.u64);
2409         }
2410
2411         /* Apply TX gain settings */
2412         if (tx_gain != -1) {
2413                 tx_cfg3.u64 = csr_rd_node(node, CVMX_GSERX_LANEX_TX_CFG_3(lane, qlm));
2414                 tx_cfg3.s.pcs_sds_tx_gain = tx_gain;
2415                 csr_wr_node(node, CVMX_GSERX_LANEX_TX_CFG_3(lane, qlm), tx_cfg3.u64);
2416         }
2417
2418         /* Apply TX vboot settings */
2419         if (tx_vboost != -1) {
2420                 tx_cfg3.u64 = csr_rd_node(node, CVMX_GSERX_LANEX_TX_CFG_3(lane, qlm));
2421                 tx_cfg3.s.cfg_tx_vboost_en = tx_vboost;
2422                 csr_wr_node(node, CVMX_GSERX_LANEX_TX_CFG_3(lane, qlm), tx_cfg3.u64);
2423         }
2424
2425         /* 3) Program override for the Tx coefficient request */
2426         pcs_ctlifc_0.u64 = csr_rd_node(node, CVMX_GSERX_LANEX_PCS_CTLIFC_0(lane, qlm));
2427         if (((tx_pre != -1) && (tx_post != -1)) || (tx_swing != -1))
2428                 pcs_ctlifc_0.s.cfg_tx_coeff_req_ovrrd_val = 0x1;
2429         if (tx_vboost != -1)
2430                 pcs_ctlifc_0.s.cfg_tx_vboost_en_ovrrd_val = 1;
2431         csr_wr_node(node, CVMX_GSERX_LANEX_PCS_CTLIFC_0(lane, qlm), pcs_ctlifc_0.u64);
2432
2433         /* 4) Enable the Tx coefficient request override enable */
2434         pcs_ctlifc_2.u64 = csr_rd_node(node, CVMX_GSERX_LANEX_PCS_CTLIFC_2(lane, qlm));
2435         if (((tx_pre != -1) && (tx_post != -1)) || (tx_swing != -1))
2436                 pcs_ctlifc_2.s.cfg_tx_coeff_req_ovrrd_en = 0x1;
2437         if (tx_vboost != -1)
2438                 pcs_ctlifc_2.s.cfg_tx_vboost_en_ovrrd_en = 1;
2439         csr_wr_node(node, CVMX_GSERX_LANEX_PCS_CTLIFC_2(lane, qlm), pcs_ctlifc_2.u64);
2440
2441         /* 5) Issue a Control Interface Configuration Override request to start the Tx equalizer */
2442         pcs_ctlifc_2.u64 = csr_rd_node(node, CVMX_GSERX_LANEX_PCS_CTLIFC_2(lane, qlm));
2443         pcs_ctlifc_2.s.ctlifc_ovrrd_req = 0x1;
2444         csr_wr_node(node, CVMX_GSERX_LANEX_PCS_CTLIFC_2(lane, qlm), pcs_ctlifc_2.u64);
2445
2446         /* 6) Wait 1 ms for the request to complete */
2447         udelay(1000);
2448
2449         /* Steps 7 & 8 required for subsequent Tx swing and Tx equilization adjustment */
2450         /* 7) Disable the Tx coefficient request override enable */
2451         pcs_ctlifc_2.u64 = csr_rd_node(node, CVMX_GSERX_LANEX_PCS_CTLIFC_2(lane, qlm));
2452         pcs_ctlifc_2.s.cfg_tx_coeff_req_ovrrd_en = 0;
2453         csr_wr_node(node, CVMX_GSERX_LANEX_PCS_CTLIFC_2(lane, qlm), pcs_ctlifc_2.u64);
2454         /* 8) Issue a Control Interface Configuration Override request */
2455         pcs_ctlifc_2.u64 = csr_rd_node(node, CVMX_GSERX_LANEX_PCS_CTLIFC_2(lane, qlm));
2456         pcs_ctlifc_2.s.ctlifc_ovrrd_req = 0x1;
2457         csr_wr_node(node, CVMX_GSERX_LANEX_PCS_CTLIFC_2(lane, qlm), pcs_ctlifc_2.u64);
2458 }
2459
2460 /**
2461  * Some QLM speeds need to override the default tuning parameters
2462  *
2463  * @param node     Node to configure
2464  * @param qlm      QLM to configure
2465  * @param baud_mhz Desired speed in MHz
2466  * @param tx_swing Voltage swing.  The higher the value the lower the voltage,
2467  *                 the default value is 7.
2468  * @param tx_premptap bits [0:3] pre-cursor pre-emphasis, bits[4:8] post-cursor
2469  *                    pre-emphasis.
2470  * @param tx_gain   Transmit gain. Range 0-7
2471  * @param tx_vboost Transmit voltage boost. Range 0-1
2472  *
2473  */
2474 void octeon_qlm_tune_v3(int node, int qlm, int baud_mhz, int tx_swing, int tx_premptap, int tx_gain,
2475                         int tx_vboost)
2476 {
2477         int lane;
2478         int num_lanes = cvmx_qlm_get_lanes(qlm);
2479
2480         for (lane = 0; lane < num_lanes; lane++) {
2481                 int tx_pre = (tx_premptap == -1) ? -1 : tx_premptap & 0xf;
2482                 int tx_post = (tx_premptap == -1) ? -1 : (tx_premptap >> 4) & 0x1f;
2483
2484                 octeon_qlm_tune_per_lane_v3(node, qlm, baud_mhz, lane, tx_swing, tx_pre, tx_post,
2485                                             tx_gain, tx_vboost);
2486         }
2487 }
2488
2489 /**
2490  * Some QLMs need to override the default pre-ctle for low loss channels.
2491  *
2492  * @param node     Node to configure
2493  * @param qlm      QLM to configure
2494  * @param pre_ctle pre-ctle settings for low loss channels
2495  */
2496 void octeon_qlm_set_channel_v3(int node, int qlm, int pre_ctle)
2497 {
2498         cvmx_gserx_lane_vma_fine_ctrl_2_t lane_vma_fine_ctrl_2;
2499
2500         lane_vma_fine_ctrl_2.u64 = csr_rd_node(node, CVMX_GSERX_LANE_VMA_FINE_CTRL_2(qlm));
2501         lane_vma_fine_ctrl_2.s.rx_prectle_gain_min_fine = pre_ctle;
2502         csr_wr_node(node, CVMX_GSERX_LANE_VMA_FINE_CTRL_2(qlm), lane_vma_fine_ctrl_2.u64);
2503 }
2504
2505 static void __qlm_init_errata_20844(int node, int qlm)
2506 {
2507         int lane;
2508
2509         /* Only applies to CN78XX pass 1.x */
2510         if (!OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_0))
2511                 return;
2512
2513         /* Errata GSER-20844: Electrical Idle logic can coast
2514          * 1) After the link first comes up write the following
2515          * register on each lane to prevent the application logic
2516          * from stomping on the Coast inputs. This is a one time write,
2517          * or if you prefer you could put it in the link up loop and
2518          * write it every time the link comes up.
2519          * 1a) Then write GSER(0..13)_LANE(0..3)_PCS_CTLIFC_2
2520          * Set CTLIFC_OVRRD_REQ (later)
2521          * Set CFG_RX_CDR_COAST_REQ_OVRRD_EN
2522          * Its not clear if #1 and #1a can be combined, lets try it
2523          * this way first.
2524          */
2525         for (lane = 0; lane < 4; lane++) {
2526                 cvmx_gserx_lanex_rx_misc_ovrrd_t misc_ovrrd;
2527                 cvmx_gserx_lanex_pcs_ctlifc_2_t ctlifc_2;
2528
2529                 ctlifc_2.u64 = csr_rd_node(node, CVMX_GSERX_LANEX_PCS_CTLIFC_2(lane, qlm));
2530                 ctlifc_2.s.cfg_rx_cdr_coast_req_ovrrd_en = 1;
2531                 csr_wr_node(node, CVMX_GSERX_LANEX_PCS_CTLIFC_2(lane, qlm), ctlifc_2.u64);
2532
2533                 misc_ovrrd.u64 = csr_rd_node(node, CVMX_GSERX_LANEX_RX_MISC_OVRRD(lane, qlm));
2534                 misc_ovrrd.s.cfg_rx_eie_det_ovrrd_en = 1;
2535                 misc_ovrrd.s.cfg_rx_eie_det_ovrrd_val = 0;
2536                 csr_wr_node(node, CVMX_GSERX_LANEX_RX_MISC_OVRRD(lane, qlm), misc_ovrrd.u64);
2537
2538                 udelay(1);
2539
2540                 misc_ovrrd.u64 = csr_rd_node(node, CVMX_GSERX_LANEX_RX_MISC_OVRRD(lane, qlm));
2541                 misc_ovrrd.s.cfg_rx_eie_det_ovrrd_en = 1;
2542                 misc_ovrrd.s.cfg_rx_eie_det_ovrrd_val = 1;
2543                 csr_wr_node(node, CVMX_GSERX_LANEX_RX_MISC_OVRRD(lane, qlm), misc_ovrrd.u64);
2544                 ctlifc_2.u64 = csr_rd_node(node, CVMX_GSERX_LANEX_PCS_CTLIFC_2(lane, qlm));
2545                 ctlifc_2.s.ctlifc_ovrrd_req = 1;
2546                 csr_wr_node(node, CVMX_GSERX_LANEX_PCS_CTLIFC_2(lane, qlm), ctlifc_2.u64);
2547         }
2548 }
2549
2550 /** CN78xx reference clock register settings */
2551 struct refclk_settings_cn78xx {
2552         bool valid; /** Reference clock speed supported */
2553         union cvmx_gserx_pll_px_mode_0 mode_0;
2554         union cvmx_gserx_pll_px_mode_1 mode_1;
2555         union cvmx_gserx_lane_px_mode_0 pmode_0;
2556         union cvmx_gserx_lane_px_mode_1 pmode_1;
2557 };
2558
2559 /** Default reference clock for various modes */
2560 static const u8 def_ref_clk_cn78xx[R_NUM_LANE_MODES] = { 0, 0, 0, 2, 2, 2, 2, 2, 2, 1, 1, 1 };
2561
2562 /**
2563  * This data structure stores the reference clock for each mode for each QLM.
2564  *
2565  * It is indexed first by the node number, then the QLM number and then the
2566  * lane mode.  It is initialized to the default values.
2567  */
2568 static u8 ref_clk_cn78xx[CVMX_MAX_NODES][8][R_NUM_LANE_MODES] = {
2569         { { 0, 0, 0, 2, 2, 2, 2, 2, 2, 1, 1, 1 },
2570           { 0, 0, 0, 2, 2, 2, 2, 2, 2, 1, 1, 1 },
2571           { 0, 0, 0, 2, 2, 2, 2, 2, 2, 1, 1, 1 },
2572           { 0, 0, 0, 2, 2, 2, 2, 2, 2, 1, 1, 1 },
2573           { 0, 0, 0, 2, 2, 2, 2, 2, 2, 1, 1, 1 },
2574           { 0, 0, 0, 2, 2, 2, 2, 2, 2, 1, 1, 1 },
2575           { 0, 0, 0, 2, 2, 2, 2, 2, 2, 1, 1, 1 },
2576           { 0, 0, 0, 2, 2, 2, 2, 2, 2, 1, 1, 1 } },
2577         { { 0, 0, 0, 2, 2, 2, 2, 2, 2, 1, 1, 1 },
2578           { 0, 0, 0, 2, 2, 2, 2, 2, 2, 1, 1, 1 },
2579           { 0, 0, 0, 2, 2, 2, 2, 2, 2, 1, 1, 1 },
2580           { 0, 0, 0, 2, 2, 2, 2, 2, 2, 1, 1, 1 },
2581           { 0, 0, 0, 2, 2, 2, 2, 2, 2, 1, 1, 1 },
2582           { 0, 0, 0, 2, 2, 2, 2, 2, 2, 1, 1, 1 },
2583           { 0, 0, 0, 2, 2, 2, 2, 2, 2, 1, 1, 1 },
2584           { 0, 0, 0, 2, 2, 2, 2, 2, 2, 1, 1, 1 } },
2585         { { 0, 0, 0, 2, 2, 2, 2, 2, 2, 1, 1, 1 },
2586           { 0, 0, 0, 2, 2, 2, 2, 2, 2, 1, 1, 1 },
2587           { 0, 0, 0, 2, 2, 2, 2, 2, 2, 1, 1, 1 },
2588           { 0, 0, 0, 2, 2, 2, 2, 2, 2, 1, 1, 1 },
2589           { 0, 0, 0, 2, 2, 2, 2, 2, 2, 1, 1, 1 },
2590           { 0, 0, 0, 2, 2, 2, 2, 2, 2, 1, 1, 1 },
2591           { 0, 0, 0, 2, 2, 2, 2, 2, 2, 1, 1, 1 },
2592           { 0, 0, 0, 2, 2, 2, 2, 2, 2, 1, 1, 1 } },
2593         { { 0, 0, 0, 2, 2, 2, 2, 2, 2, 1, 1, 1 },
2594           { 0, 0, 0, 2, 2, 2, 2, 2, 2, 1, 1, 1 },
2595           { 0, 0, 0, 2, 2, 2, 2, 2, 2, 1, 1, 1 },
2596           { 0, 0, 0, 2, 2, 2, 2, 2, 2, 1, 1, 1 },
2597           { 0, 0, 0, 2, 2, 2, 2, 2, 2, 1, 1, 1 },
2598           { 0, 0, 0, 2, 2, 2, 2, 2, 2, 1, 1, 1 },
2599           { 0, 0, 0, 2, 2, 2, 2, 2, 2, 1, 1, 1 },
2600           { 0, 0, 0, 2, 2, 2, 2, 2, 2, 1, 1, 1 } }
2601 };
2602
2603 /**
2604  * This data structure contains the register values for the cn78xx PLLs
2605  * It is indexed first by the reference clock and second by the mode.
2606  * Note that not all combinations are supported.
2607  */
2608 static const struct refclk_settings_cn78xx refclk_settings_cn78xx[R_NUM_LANE_MODES][4] = {
2609         {   /* 0        R_2_5G_REFCLK100 */
2610         { /* 100MHz reference clock */
2611             .valid = true,
2612             .mode_0.s = { .pll_icp = 0x4, .pll_rloop = 0x3, .pll_pcs_div = 0x5 },
2613             .mode_1.s = { .pll_16p5en = 0x0,
2614                           .pll_cpadj = 0x2,
2615                           .pll_pcie3en = 0x0,
2616                           .pll_opr = 0x0,
2617                           .pll_div = 0x19 },
2618             .pmode_0.s = { .ctle = 0x0,
2619                            .pcie = 0x1,
2620                            .tx_ldiv = 0x1,
2621                            .rx_ldiv = 0x1,
2622                            .srate = 0x0,
2623                            .tx_mode = 0x3,
2624                            .rx_mode = 0x3 },
2625             .pmode_1.s = { .vma_fine_cfg_sel = 0x0,
2626                            .vma_mm = 0x1,
2627                            .cdr_fgain = 0xa,
2628                            .ph_acc_adj = 0x14 } },
2629         { /* 125MHz reference clock */
2630             .valid = true,
2631             .mode_0.s = { .pll_icp = 0x3, .pll_rloop = 0x3, .pll_pcs_div = 0x5 },
2632             .mode_1.s = { .pll_16p5en = 0x0,
2633                           .pll_cpadj = 0x1,
2634                           .pll_pcie3en = 0x0,
2635                           .pll_opr = 0x0,
2636                           .pll_div = 0x14 },
2637             .pmode_0.s = { .ctle = 0x0,
2638                            .pcie = 0x1,
2639                            .tx_ldiv = 0x1,
2640                            .rx_ldiv = 0x1,
2641                            .srate = 0x0,
2642                            .tx_mode = 0x3,
2643                            .rx_mode = 0x3 },
2644             .pmode_1.s = { .vma_fine_cfg_sel = 0x0,
2645                            .vma_mm = 0x1,
2646                            .cdr_fgain = 0xa,
2647                            .ph_acc_adj = 0x14 } },
2648         { /* 156.25MHz reference clock */
2649             .valid = true,
2650             .mode_0.s = { .pll_icp = 0x3, .pll_rloop = 0x3, .pll_pcs_div = 0x5 },
2651             .mode_1.s = { .pll_16p5en = 0x0,
2652                           .pll_cpadj = 0x2,
2653                           .pll_pcie3en = 0x0,
2654                           .pll_opr = 0x0,
2655                           .pll_div = 0x10 },
2656             .pmode_0.s = { .ctle = 0x0,
2657                            .pcie = 0x1,
2658                            .tx_ldiv = 0x1,
2659                            .rx_ldiv = 0x1,
2660                            .srate = 0x0,
2661                            .tx_mode = 0x3,
2662                            .rx_mode = 0x3 },
2663             .pmode_1.s = { .vma_fine_cfg_sel = 0x0,
2664                            .vma_mm = 0x1,
2665                            .cdr_fgain = 0xa,
2666                            .ph_acc_adj = 0x14 } },
2667         {
2668                   /* 161.1328125MHz reference clock */
2669                   .valid = false,
2670           } },
2671         {
2672                 /* 1    R_5G_REFCLK100 */
2673                 { /* 100MHz reference clock */
2674                   .valid = true,
2675                   .mode_0.s = { .pll_icp = 0x4, .pll_rloop = 0x3, .pll_pcs_div = 0xa },
2676                   .mode_1.s = { .pll_16p5en = 0x0,
2677                                 .pll_cpadj = 0x2,
2678                                 .pll_pcie3en = 0x0,
2679                                 .pll_opr = 0x0,
2680                                 .pll_div = 0x19 },
2681                   .pmode_0.s = { .ctle = 0x0,
2682                                  .pcie = 0x1,
2683                                  .tx_ldiv = 0x0,
2684                                  .rx_ldiv = 0x0,
2685                                  .srate = 0x0,
2686                                  .tx_mode = 0x3,
2687                                  .rx_mode = 0x3 },
2688                   .pmode_1.s = { .vma_fine_cfg_sel = 0x0,
2689                                  .vma_mm = 0x0,
2690                                  .cdr_fgain = 0xa,
2691                                  .ph_acc_adj = 0x14 } },
2692                 { /* 125MHz reference clock */
2693                   .valid = true,
2694                   .mode_0.s = { .pll_icp = 0x3, .pll_rloop = 0x3, .pll_pcs_div = 0xa },
2695                   .mode_1.s = { .pll_16p5en = 0x0,
2696                                 .pll_cpadj = 0x1,
2697                                 .pll_pcie3en = 0x0,
2698                                 .pll_opr = 0x0,
2699                                 .pll_div = 0x14 },
2700                   .pmode_0.s = { .ctle = 0x0,
2701                                  .pcie = 0x1,
2702                                  .tx_ldiv = 0x0,
2703                                  .rx_ldiv = 0x0,
2704                                  .srate = 0x0,
2705                                  .tx_mode = 0x3,
2706                                  .rx_mode = 0x3 },
2707                   .pmode_1.s = { .vma_fine_cfg_sel = 0x0,
2708                                  .vma_mm = 0x0,
2709                                  .cdr_fgain = 0xa,
2710                                  .ph_acc_adj = 0x14 } },
2711                 { /* 156.25MHz reference clock */
2712                   .valid = true,
2713                   .mode_0.s = { .pll_icp = 0x3, .pll_rloop = 0x3, .pll_pcs_div = 0xa },
2714                   .mode_1.s = { .pll_16p5en = 0x0,
2715                                 .pll_cpadj = 0x2,
2716                                 .pll_pcie3en = 0x0,
2717                                 .pll_opr = 0x0,
2718                                 .pll_div = 0x10 },
2719                   .pmode_0.s = { .ctle = 0x0,
2720                                  .pcie = 0x1,
2721                                  .tx_ldiv = 0x0,
2722                                  .rx_ldiv = 0x0,
2723                                  .srate = 0x0,
2724                                  .tx_mode = 0x3,
2725                                  .rx_mode = 0x3 },
2726                   .pmode_1.s = { .vma_fine_cfg_sel = 0x0,
2727                                  .vma_mm = 0x0,
2728                                  .cdr_fgain = 0xa,
2729                                  .ph_acc_adj = 0x14 } },
2730                 {
2731                         /* 161.1328125MHz reference clock */
2732                         .valid = false,
2733                 },
2734         },
2735         {   /* 2        R_8G_REFCLK100 */
2736         { /* 100MHz reference clock */
2737             .valid = true,
2738             .mode_0.s = { .pll_icp = 0x3, .pll_rloop = 0x5, .pll_pcs_div = 0xa },
2739             .mode_1.s = { .pll_16p5en = 0x0,
2740                           .pll_cpadj = 0x2,
2741                           .pll_pcie3en = 0x1,
2742                           .pll_opr = 0x1,
2743                           .pll_div = 0x28 },
2744             .pmode_0.s = { .ctle = 0x3,
2745                            .pcie = 0x0,
2746                            .tx_ldiv = 0x0,
2747                            .rx_ldiv = 0x0,
2748                            .srate = 0x0,
2749                            .tx_mode = 0x3,
2750                            .rx_mode = 0x3 },
2751             .pmode_1.s = { .vma_fine_cfg_sel = 0x0,
2752                            .vma_mm = 0x0,
2753                            .cdr_fgain = 0xb,
2754                            .ph_acc_adj = 0x23 } },
2755         { /* 125MHz reference clock */
2756             .valid = true,
2757             .mode_0.s = { .pll_icp = 0x2, .pll_rloop = 0x5, .pll_pcs_div = 0xa },
2758             .mode_1.s = { .pll_16p5en = 0x0,
2759                           .pll_cpadj = 0x1,
2760                           .pll_pcie3en = 0x1,
2761                           .pll_opr = 0x1,
2762                           .pll_div = 0x20 },
2763             .pmode_0.s = { .ctle = 0x3,
2764                            .pcie = 0x0,
2765                            .tx_ldiv = 0x0,
2766                            .rx_ldiv = 0x0,
2767                            .srate = 0x0,
2768                            .tx_mode = 0x3,
2769                            .rx_mode = 0x3 },
2770             .pmode_1.s = { .vma_fine_cfg_sel = 0x0,
2771                            .vma_mm = 0x0,
2772                            .cdr_fgain = 0xb,
2773                            .ph_acc_adj = 0x23 } },
2774         { /* 156.25MHz reference clock not supported */
2775             .valid = false } },
2776         {
2777                 /* 3    R_125G_REFCLK15625_KX */
2778                 { /* 100MHz reference */
2779                   .valid = true,
2780                   .mode_0.s = { .pll_icp = 0x1, .pll_rloop = 0x3, .pll_pcs_div = 0x28 },
2781                   .mode_1.s = { .pll_16p5en = 0x1,
2782                                 .pll_cpadj = 0x2,
2783                                 .pll_pcie3en = 0x0,
2784                                 .pll_opr = 0x0,
2785                                 .pll_div = 0x19 },
2786                   .pmode_0.s = { .ctle = 0x0,
2787                                  .pcie = 0x0,
2788                                  .tx_ldiv = 0x2,
2789                                  .rx_ldiv = 0x2,
2790                                  .srate = 0x0,
2791                                  .tx_mode = 0x3,
2792                                  .rx_mode = 0x3 },
2793                   .pmode_1.s = { .vma_fine_cfg_sel = 0x0,
2794                                  .vma_mm = 0x1,
2795                                  .cdr_fgain = 0xc,
2796                                  .ph_acc_adj = 0x1e } },
2797                 { /* 125MHz reference */
2798                   .valid = true,
2799                   .mode_0.s = { .pll_icp = 0x1, .pll_rloop = 0x3, .pll_pcs_div = 0x28 },
2800                   .mode_1.s = { .pll_16p5en = 0x1,
2801                                 .pll_cpadj = 0x2,
2802                                 .pll_pcie3en = 0x0,
2803                                 .pll_opr = 0x0,
2804                                 .pll_div = 0x14 },
2805                   .pmode_0.s = { .ctle = 0x0,
2806                                  .pcie = 0x0,
2807                                  .tx_ldiv = 0x2,
2808                                  .rx_ldiv = 0x2,
2809                                  .srate = 0x0,
2810                                  .tx_mode = 0x3,
2811                                  .rx_mode = 0x3 },
2812                   .pmode_1.s = { .vma_fine_cfg_sel = 0x0,
2813                                  .vma_mm = 0x1,
2814                                  .cdr_fgain = 0xc,
2815                                  .ph_acc_adj = 0x1e } },
2816                 { /* 156.25MHz reference */
2817                   .valid = true,
2818                   .mode_0.s = { .pll_icp = 0x1, .pll_rloop = 0x3, .pll_pcs_div = 0x28 },
2819                   .mode_1.s = { .pll_16p5en = 0x1,
2820                                 .pll_cpadj = 0x3,
2821                                 .pll_pcie3en = 0x0,
2822                                 .pll_opr = 0x0,
2823                                 .pll_div = 0x10 },
2824                   .pmode_0.s = { .ctle = 0x0,
2825                                  .pcie = 0x0,
2826                                  .tx_ldiv = 0x2,
2827                                  .rx_ldiv = 0x2,
2828                                  .srate = 0x0,
2829                                  .tx_mode = 0x3,
2830                                  .rx_mode = 0x3 },
2831                   .pmode_1.s = { .vma_fine_cfg_sel = 0x0,
2832                                  .vma_mm = 0x1,
2833                                  .cdr_fgain = 0xc,
2834                                  .ph_acc_adj = 0x1e } },
2835                 {
2836                         /* 161.1328125MHz reference clock */
2837                         .valid = false,
2838                 },
2839         },
2840         {   /* 4        R_3125G_REFCLK15625_XAUI */
2841         { /* 100MHz reference */
2842             .valid = false },
2843         { /* 125MHz reference */
2844             .valid = true,
2845             .mode_0.s = { .pll_icp = 0x1, .pll_rloop = 0x3, .pll_pcs_div = 0x14 },
2846             .mode_1.s = { .pll_16p5en = 0x1,
2847                           .pll_cpadj = 0x2,
2848                           .pll_pcie3en = 0x0,
2849                           .pll_opr = 0x0,
2850                           .pll_div = 0x19 },
2851             .pmode_0.s = { .ctle = 0x0,
2852                            .pcie = 0x0,
2853                            .tx_ldiv = 0x1,
2854                            .rx_ldiv = 0x1,
2855                            .srate = 0x0,
2856                            .tx_mode = 0x3,
2857                            .rx_mode = 0x3 },
2858             .pmode_1.s = { .vma_fine_cfg_sel = 0x0,
2859                            .vma_mm = 0x1,
2860                            .cdr_fgain = 0xc,
2861                            .ph_acc_adj = 0x1e } },
2862         { /* 156.25MHz reference, default */
2863             .valid = true,
2864             .mode_0.s = { .pll_icp = 0x1, .pll_rloop = 0x3, .pll_pcs_div = 0x14 },
2865             .mode_1.s = { .pll_16p5en = 0x1,
2866                           .pll_cpadj = 0x2,
2867                           .pll_pcie3en = 0x0,
2868                           .pll_opr = 0x0,
2869                           .pll_div = 0x14 },
2870             .pmode_0.s = { .ctle = 0x0,
2871                            .pcie = 0x0,
2872                            .tx_ldiv = 0x1,
2873                            .rx_ldiv = 0x1,
2874                            .srate = 0x0,
2875                            .tx_mode = 0x3,
2876                            .rx_mode = 0x3 },
2877             .pmode_1.s = { .vma_fine_cfg_sel = 0x0,
2878                            .vma_mm = 0x1,
2879                            .cdr_fgain = 0xc,
2880                            .ph_acc_adj = 0x1e } },
2881         {
2882                   /* 161.1328125MHz reference clock */
2883                   .valid = false,
2884           } },
2885         {   /* 5        R_103125G_REFCLK15625_KR */
2886         { /* 100MHz reference */
2887             .valid = false },
2888         { /* 125MHz reference */
2889             .valid = false },
2890         { /* 156.25MHz reference */
2891             .valid = true,
2892             .mode_0.s = { .pll_icp = 0x1, .pll_rloop = 0x5, .pll_pcs_div = 0xa },
2893             .mode_1.s = { .pll_16p5en = 0x1,
2894                           .pll_cpadj = 0x2,
2895                           .pll_pcie3en = 0x0,
2896                           .pll_opr = 0x1,
2897                           .pll_div = 0x21 },
2898             .pmode_0.s = { .ctle = 0x3,
2899                            .pcie = 0x0,
2900                            .tx_ldiv = 0x0,
2901                            .rx_ldiv = 0x0,
2902                            .srate = 0x0,
2903                            .tx_mode = 0x3,
2904                            .rx_mode = 0x3 },
2905             .pmode_1.s = { .vma_fine_cfg_sel = 0x1,
2906                            .vma_mm = 0x0,
2907                            .cdr_fgain = 0xa,
2908                            .ph_acc_adj = 0xf } },
2909         { /* 161.1328125 reference */
2910             .valid = true,
2911             .mode_0.s = { .pll_icp = 0x1, .pll_rloop = 0x5, .pll_pcs_div = 0xa },
2912             .mode_1.s = { .pll_16p5en = 0x1,
2913                           .pll_cpadj = 0x2,
2914                           .pll_pcie3en = 0x0,
2915                           .pll_opr = 0x1,
2916                           .pll_div = 0x20 },
2917             .pmode_0.s = { .ctle = 0x3,
2918                            .pcie = 0x0,
2919                            .tx_ldiv = 0x0,
2920                            .rx_ldiv = 0x0,
2921                            .srate = 0x0,
2922                            .tx_mode = 0x3,
2923                            .rx_mode = 0x3 },
2924             .pmode_1.s = { .vma_fine_cfg_sel = 0x1,
2925                            .vma_mm = 0x0,
2926                            .cdr_fgain = 0xa,
2927                            .ph_acc_adj = 0xf } } },
2928         {   /* 6        R_125G_REFCLK15625_SGMII */
2929         { /* 100MHz reference clock */
2930             .valid = 1,
2931             .mode_0.s = { .pll_icp = 0x1, .pll_rloop = 0x3, .pll_pcs_div = 0x28 },
2932             .mode_1.s = { .pll_16p5en = 0x1,
2933                           .pll_cpadj = 0x2,
2934                           .pll_pcie3en = 0x0,
2935                           .pll_opr = 0x0,
2936                           .pll_div = 0x19 },
2937             .pmode_0.s = { .ctle = 0x0,
2938                            .pcie = 0x0,
2939                            .tx_ldiv = 0x2,
2940                            .rx_ldiv = 0x2,
2941                            .srate = 0x0,
2942                            .tx_mode = 0x3,
2943                            .rx_mode = 0x3 },
2944             .pmode_1.s = { .vma_fine_cfg_sel = 0x0,
2945                            .vma_mm = 0x1,
2946                            .cdr_fgain = 0xc,
2947                            .ph_acc_adj = 0x1e } },
2948         { /* 125MHz reference clock */
2949             .valid = 1,
2950             .mode_0.s = { .pll_icp = 0x1, .pll_rloop = 0x3, .pll_pcs_div = 0x28 },
2951             .mode_1.s = { .pll_16p5en = 0x1,
2952                           .pll_cpadj = 0x2,
2953                           .pll_pcie3en = 0x0,
2954                           .pll_opr = 0x0,
2955                           .pll_div = 0x14 },
2956             .pmode_0.s = { .ctle = 0x0,
2957                            .pcie = 0x0,
2958                            .tx_ldiv = 0x2,
2959                            .rx_ldiv = 0x2,
2960                            .srate = 0x0,
2961                            .tx_mode = 0x3,
2962                            .rx_mode = 0x3 },
2963             .pmode_1.s = { .vma_fine_cfg_sel = 0x0,
2964                            .vma_mm = 0x0,
2965                            .cdr_fgain = 0xc,
2966                            .ph_acc_adj = 0x1e } },
2967         { /* 156.25MHz reference clock */
2968             .valid = 1,
2969             .mode_0.s = { .pll_icp = 0x1, .pll_rloop = 0x3, .pll_pcs_div = 0x28 },
2970             .mode_1.s = { .pll_16p5en = 0x1,
2971                           .pll_cpadj = 0x3,
2972                           .pll_pcie3en = 0x0,
2973                           .pll_opr = 0x0,
2974                           .pll_div = 0x10 },
2975             .pmode_0.s = { .ctle = 0x0,
2976                            .pcie = 0x0,
2977                            .tx_ldiv = 0x2,
2978                            .rx_ldiv = 0x2,
2979                            .srate = 0x0,
2980                            .tx_mode = 0x3,
2981                            .rx_mode = 0x3 },
2982             .pmode_1.s = { .vma_fine_cfg_sel = 0x0,
2983                            .vma_mm = 0x1,
2984                            .cdr_fgain = 0xc,
2985                            .ph_acc_adj = 0x1e } } },
2986         {   /* 7        R_5G_REFCLK15625_QSGMII */
2987         { /* 100MHz reference */
2988             .valid = true,
2989             .mode_0.s = { .pll_icp = 0x4, .pll_rloop = 0x3, .pll_pcs_div = 0xa },
2990             .mode_1.s = { .pll_16p5en = 0x0, .pll_cpadj = 0x2, .pll_pcie3en = 0x0,
2991                           .pll_div = 0x19 },
2992             .pmode_0.s = { .ctle = 0x0,
2993                            .pcie = 0x0,
2994                            .tx_ldiv = 0x0,
2995                            .rx_ldiv = 0x0,
2996                            .srate = 0x0,
2997                            .tx_mode = 0x3,
2998                            .rx_mode = 0x3 },
2999             .pmode_1.s = { .vma_fine_cfg_sel = 0x0,
3000                            .vma_mm = 0x1,
3001                            .cdr_fgain = 0xc,
3002                            .ph_acc_adj = 0x1e } },
3003         { /* 125MHz reference */
3004             .valid = true,
3005             .mode_0.s = { .pll_icp = 0x3, .pll_rloop = 0x3, .pll_pcs_div = 0xa },
3006             .mode_1.s = { .pll_16p5en = 0x0, .pll_cpadj = 0x1, .pll_pcie3en = 0x0,
3007                           .pll_div = 0x14 },
3008             .pmode_0.s = { .ctle = 0x0,
3009                            .pcie = 0x0,
3010                            .tx_ldiv = 0x0,
3011                            .rx_ldiv = 0x0,
3012                            .srate = 0x0,
3013                            .tx_mode = 0x3,
3014                            .rx_mode = 0x3 },
3015             .pmode_1.s = { .vma_fine_cfg_sel = 0x0,
3016                            .vma_mm = 0x1,
3017                            .cdr_fgain = 0xc,
3018                            .ph_acc_adj = 0x1e } },
3019         { /* 156.25MHz reference */
3020             .valid = true,
3021             .mode_0.s = { .pll_icp = 0x3, .pll_rloop = 0x3, .pll_pcs_div = 0xa },
3022             .mode_1.s = { .pll_16p5en = 0x0, .pll_cpadj = 0x2, .pll_pcie3en = 0x0,
3023                           .pll_div = 0x10 },
3024             .pmode_0.s = { .ctle = 0x0,
3025                            .pcie = 0x0,
3026                            .tx_ldiv = 0x0,
3027                            .rx_ldiv = 0x0,
3028                            .srate = 0x0,
3029                            .tx_mode = 0x3,
3030                            .rx_mode = 0x3 },
3031             .pmode_1.s = { .vma_fine_cfg_sel = 0x0,
3032                            .vma_mm = 0x1,
3033                            .cdr_fgain = 0xc,
3034                            .ph_acc_adj = 0x1e } },
3035         {
3036                   /* 161.1328125MHz reference clock */
3037                   .valid = false,
3038           } },
3039         {   /* 8        R_625G_REFCLK15625_RXAUI */
3040         { /* 100MHz reference */
3041             .valid = false },
3042         { /* 125MHz reference */
3043             .valid = true,
3044             .mode_0.s = { .pll_icp = 0x1, .pll_rloop = 0x3, .pll_pcs_div = 0xa },
3045             .mode_1.s = { .pll_16p5en = 0x0,
3046                           .pll_cpadj = 0x2,
3047                           .pll_pcie3en = 0x0,
3048                           .pll_opr = 0x0,
3049                           .pll_div = 0x19 },
3050             .pmode_0.s = { .ctle = 0x0,
3051                            .pcie = 0x0,
3052                            .tx_ldiv = 0x0,
3053                            .rx_ldiv = 0x0,
3054                            .srate = 0x0,
3055                            .tx_mode = 0x3,
3056                            .rx_mode = 0x3 },
3057             .pmode_1.s = { .vma_fine_cfg_sel = 0x0,
3058                            .vma_mm = 0x0,
3059                            .cdr_fgain = 0xa,
3060                            .ph_acc_adj = 0x14 } },
3061         { /* 156.25MHz reference */
3062             .valid = true,
3063             .mode_0.s = { .pll_icp = 0x1, .pll_rloop = 0x3, .pll_pcs_div = 0xa },
3064             .mode_1.s = { .pll_16p5en = 0x0,
3065                           .pll_cpadj = 0x2,
3066                           .pll_pcie3en = 0x0,
3067                           .pll_opr = 0x0,
3068                           .pll_div = 0x14 },
3069             .pmode_0.s = { .ctle = 0x0,
3070                            .pcie = 0x0,
3071                            .tx_ldiv = 0x0,
3072                            .rx_ldiv = 0x0,
3073                            .srate = 0x0,
3074                            .tx_mode = 0x3,
3075                            .rx_mode = 0x3 },
3076             .pmode_1.s = { .vma_fine_cfg_sel = 0x0,
3077                            .vma_mm = 0x0,
3078                            .cdr_fgain = 0xa,
3079                            .ph_acc_adj = 0x14 } },
3080         { /* 161.1328125 reference */
3081             .valid = true,
3082             .mode_0.s = { .pll_icp = 0x1, .pll_rloop = 0x3, .pll_pcs_div = 0xa },
3083             .mode_1.s = { .pll_16p5en = 0x0,
3084                           .pll_cpadj = 0x2,
3085                           .pll_pcie3en = 0x0,
3086                           .pll_opr = 0x0,
3087                           .pll_div = 0x14 },
3088             .pmode_0.s = { .ctle = 0x0,
3089                            .pcie = 0x0,
3090                            .tx_ldiv = 0x0,
3091                            .rx_ldiv = 0x0,
3092                            .srate = 0x0,
3093                            .tx_mode = 0x3,
3094                            .rx_mode = 0x3 },
3095             .pmode_1.s = { .vma_fine_cfg_sel = 0x0,
3096                            .vma_mm = 0x0,
3097                            .cdr_fgain = 0xa,
3098                            .ph_acc_adj = 0x14 } } },
3099         {   /* 9        R_2_5G_REFCLK125 */
3100         { /* 100MHz reference */
3101             .valid = true,
3102             .mode_0.s = { .pll_icp = 0x4, .pll_rloop = 0x3, .pll_pcs_div = 0x5 },
3103             .mode_1.s = { .pll_16p5en = 0x0,
3104                           .pll_cpadj = 0x2,
3105                           .pll_pcie3en = 0x0,
3106                           .pll_opr = 0x0,
3107                           .pll_div = 0x19 },
3108             .pmode_0.s = { .ctle = 0x0,
3109                            .pcie = 0x1,
3110                            .tx_ldiv = 0x1,
3111                            .rx_ldiv = 0x1,
3112                            .srate = 0x0,
3113                            .tx_mode = 0x3,
3114                            .rx_mode = 0x3 },
3115             .pmode_1.s = { .vma_fine_cfg_sel = 0x0,
3116                            .vma_mm = 0x1,
3117                            .cdr_fgain = 0xa,
3118                            .ph_acc_adj = 0x14 } },
3119         { /* 125MHz reference */
3120             .valid = true,
3121             .mode_0.s = { .pll_icp = 0x3, .pll_rloop = 0x3, .pll_pcs_div = 0x5 },
3122             .mode_1.s = { .pll_16p5en = 0x0,
3123                           .pll_cpadj = 0x1,
3124                           .pll_pcie3en = 0x0,
3125                           .pll_opr = 0x0,
3126                           .pll_div = 0x14 },
3127             .pmode_0.s = { .ctle = 0x0,
3128                            .pcie = 0x1,
3129                            .tx_ldiv = 0x1,
3130                            .rx_ldiv = 0x1,
3131                            .srate = 0x0,
3132                            .tx_mode = 0x3,
3133                            .rx_mode = 0x3 },
3134             .pmode_1.s = { .vma_fine_cfg_sel = 0x0,
3135                            .vma_mm = 0x1,
3136                            .cdr_fgain = 0xa,
3137                            .ph_acc_adj = 0x14 } },
3138         { /* 156,25MHz reference */
3139             .valid = true,
3140             .mode_0.s = { .pll_icp = 0x3, .pll_rloop = 0x3, .pll_pcs_div = 0x5 },
3141             .mode_1.s = { .pll_16p5en = 0x0,
3142                           .pll_cpadj = 0x2,
3143                           .pll_pcie3en = 0x0,
3144                           .pll_opr = 0x0,
3145                           .pll_div = 0x10 },
3146             .pmode_0.s = { .ctle = 0x0,
3147                            .pcie = 0x1,
3148                            .tx_ldiv = 0x1,
3149                            .rx_ldiv = 0x1,
3150                            .srate = 0x0,
3151                            .tx_mode = 0x3,
3152                            .rx_mode = 0x3 },
3153             .pmode_1.s = { .vma_fine_cfg_sel = 0x0,
3154                            .vma_mm = 0x1,
3155                            .cdr_fgain = 0xa,
3156                            .ph_acc_adj = 0x14 } },
3157         {
3158                   /* 161.1328125MHz reference clock */
3159                   .valid = false,
3160           } },
3161         {   /* 0xa      R_5G_REFCLK125 */
3162         { /* 100MHz reference */
3163             .valid = true,
3164             .mode_0.s = { .pll_icp = 0x4, .pll_rloop = 0x3, .pll_pcs_div = 0xa },
3165             .mode_1.s = { .pll_16p5en = 0x0,
3166                           .pll_cpadj = 0x2,
3167                           .pll_pcie3en = 0x0,
3168                           .pll_opr = 0x0,
3169                           .pll_div = 0x19 },
3170             .pmode_0.s = { .ctle = 0x0,
3171                            .pcie = 0x1,
3172                            .tx_ldiv = 0x0,
3173                            .rx_ldiv = 0x0,
3174                            .srate = 0x0,
3175                            .tx_mode = 0x3,
3176                            .rx_mode = 0x3 },
3177             .pmode_1.s = { .vma_fine_cfg_sel = 0x0,
3178                            .vma_mm = 0x0,
3179                            .cdr_fgain = 0xa,
3180                            .ph_acc_adj = 0x14 } },
3181         { /* 125MHz reference */
3182             .valid = true,
3183             .mode_0.s = { .pll_icp = 0x3, .pll_rloop = 0x3, .pll_pcs_div = 0xa },
3184             .mode_1.s = { .pll_16p5en = 0x0,
3185                           .pll_cpadj = 0x1,
3186                           .pll_pcie3en = 0x0,
3187                           .pll_opr = 0x0,
3188                           .pll_div = 0x14 },
3189             .pmode_0.s = { .ctle = 0x0,
3190                            .pcie = 0x1,
3191                            .tx_ldiv = 0x0,
3192                            .rx_ldiv = 0x0,
3193                            .srate = 0x0,
3194                            .tx_mode = 0x3,
3195                            .rx_mode = 0x3 },
3196             .pmode_1.s = { .vma_fine_cfg_sel = 0x0,
3197                            .vma_mm = 0x0,
3198                            .cdr_fgain = 0xa,
3199                            .ph_acc_adj = 0x14 } },
3200         { /* 156.25MHz reference */
3201             .valid = true,
3202             .mode_0.s = { .pll_icp = 0x3, .pll_rloop = 0x3, .pll_pcs_div = 0xa },
3203             .mode_1.s = { .pll_16p5en = 0x0,
3204                           .pll_cpadj = 0x2,
3205                           .pll_pcie3en = 0x0,
3206                           .pll_opr = 0x0,
3207                           .pll_div = 0x10 },
3208             .pmode_0.s = { .ctle = 0x0,
3209                            .pcie = 0x1,
3210                            .tx_ldiv = 0x0,
3211                            .rx_ldiv = 0x0,
3212                            .srate = 0x0,
3213                            .tx_mode = 0x3,
3214                            .rx_mode = 0x3 },
3215             .pmode_1.s = { .vma_fine_cfg_sel = 0x0,
3216                            .vma_mm = 0x0,
3217                            .cdr_fgain = 0xa,
3218                            .ph_acc_adj = 0x14 } },
3219         {
3220                   /* 161.1328125MHz reference clock */
3221                   .valid = false,
3222           } },
3223         {   /* 0xb      R_8G_REFCLK125 */
3224         { /* 100MHz reference */
3225             .valid = true,
3226             .mode_0.s = { .pll_icp = 0x3, .pll_rloop = 0x5, .pll_pcs_div = 0xa },
3227             .mode_1.s = { .pll_16p5en = 0x0,
3228                           .pll_cpadj = 0x2,
3229                           .pll_pcie3en = 0x1,
3230                           .pll_opr = 0x1,
3231                           .pll_div = 0x28 },
3232             .pmode_0.s = { .ctle = 0x3,
3233                            .pcie = 0x0,
3234                            .tx_ldiv = 0x0,
3235                            .rx_ldiv = 0x0,
3236                            .srate = 0x0,
3237                            .tx_mode = 0x3,
3238                            .rx_mode = 0x3 },
3239             .pmode_1.s = { .vma_fine_cfg_sel = 0x0,
3240                            .vma_mm = 0x0,
3241                            .cdr_fgain = 0xb,
3242                            .ph_acc_adj = 0x23 } },
3243         { /* 125MHz reference */
3244             .valid = true,
3245             .mode_0.s = { .pll_icp = 0x2, .pll_rloop = 0x5, .pll_pcs_div = 0xa },
3246             .mode_1.s = { .pll_16p5en = 0x0,
3247                           .pll_cpadj = 0x1,
3248                           .pll_pcie3en = 0x1,
3249                           .pll_opr = 0x1,
3250                           .pll_div = 0x20 },
3251             .pmode_0.s = { .ctle = 0x3,
3252                            .pcie = 0x0,
3253                            .tx_ldiv = 0x0,
3254                            .rx_ldiv = 0x0,
3255                            .srate = 0x0,
3256                            .tx_mode = 0x3,
3257                            .rx_mode = 0x3 },
3258             .pmode_1.s = { .vma_fine_cfg_sel = 0x0,
3259                            .vma_mm = 0x0,
3260                            .cdr_fgain = 0xb,
3261                            .ph_acc_adj = 0x23 } },
3262         { /* 156.25MHz reference */
3263             .valid = false },
3264         {
3265                   /* 161.1328125MHz reference clock */
3266                   .valid = false,
3267           } }
3268 };
3269
3270 /**
3271  * Set a non-standard reference clock for a node, qlm and lane mode.
3272  *
3273  * @INTERNAL
3274  *
3275  * @param node          node number the reference clock is used with
3276  * @param qlm           qlm number the reference clock is hooked up to
3277  * @param lane_mode     current lane mode selected for the QLM
3278  * @param ref_clk_sel   0 = 100MHz, 1 = 125MHz, 2 = 156.25MHz,
3279  *                      3 = 161.1328125MHz
3280  *
3281  * @return 0 for success or -1 if the reference clock selector is not supported
3282  *
3283  * NOTE: This must be called before __qlm_setup_pll_cn78xx.
3284  */
3285 static int __set_qlm_ref_clk_cn78xx(int node, int qlm, int lane_mode, int ref_clk_sel)
3286 {
3287         if (ref_clk_sel > 3 || ref_clk_sel < 0 ||
3288             !refclk_settings_cn78xx[lane_mode][ref_clk_sel].valid) {
3289                 debug("%s: Invalid reference clock %d for lane mode %d for node %d, QLM %d\n",
3290                       __func__, ref_clk_sel, lane_mode, node, qlm);
3291                 return -1;
3292         }
3293         debug("%s(%d, %d, 0x%x, %d)\n", __func__, node, qlm, lane_mode, ref_clk_sel);
3294         ref_clk_cn78xx[node][qlm][lane_mode] = ref_clk_sel;
3295         return 0;
3296 }
3297
3298 /**
3299  * KR - Inverted Tx Coefficient Direction Change.  Changing Pre & Post Tap inc/dec direction
3300  *
3301  *
3302  * @INTERNAL
3303  *
3304  * @param node  Node number to configure
3305  * @param qlm   QLM number to configure
3306  */
3307 static void __qlm_kr_inc_dec_gser26636(int node, int qlm)
3308 {
3309         cvmx_gserx_rx_txdir_ctrl_1_t rx_txdir_ctrl;
3310
3311         /* Apply workaround for Errata GSER-26636,
3312          * KR training coefficient update inverted
3313          */
3314         rx_txdir_ctrl.u64 = csr_rd_node(node, CVMX_GSERX_RX_TXDIR_CTRL_1(qlm));
3315         rx_txdir_ctrl.s.rx_precorr_chg_dir = 1;
3316         rx_txdir_ctrl.s.rx_tap1_chg_dir = 1;
3317         csr_wr_node(node, CVMX_GSERX_RX_TXDIR_CTRL_1(qlm), rx_txdir_ctrl.u64);
3318 }
3319
3320 /**
3321  * Updating the RX EQ settings to support wider temperature range
3322  * @INTERNAL
3323  *
3324  * @param node  Node number to configure
3325  * @param qlm   QLM number to configure
3326  */
3327 static void __qlm_rx_eq_temp_gser27140(int node, int qlm)
3328 {
3329         int lane;
3330         int num_lanes = cvmx_qlm_get_lanes(qlm);
3331         cvmx_gserx_lanex_rx_valbbd_ctrl_0_t rx_valbbd_ctrl_0;
3332         cvmx_gserx_lane_vma_fine_ctrl_2_t lane_vma_fine_ctrl_2;
3333         cvmx_gserx_lane_vma_fine_ctrl_0_t lane_vma_fine_ctrl_0;
3334         cvmx_gserx_rx_txdir_ctrl_1_t rx_txdir_ctrl_1;
3335         cvmx_gserx_eq_wait_time_t eq_wait_time;
3336         cvmx_gserx_rx_txdir_ctrl_2_t rx_txdir_ctrl_2;
3337         cvmx_gserx_rx_txdir_ctrl_0_t rx_txdir_ctrl_0;
3338
3339         for (lane = 0; lane < num_lanes; lane++) {
3340                 rx_valbbd_ctrl_0.u64 =
3341                         csr_rd_node(node, CVMX_GSERX_LANEX_RX_VALBBD_CTRL_0(lane, qlm));
3342                 rx_valbbd_ctrl_0.s.agc_gain = 3;
3343                 rx_valbbd_ctrl_0.s.dfe_gain = 2;
3344                 csr_wr_node(node, CVMX_GSERX_LANEX_RX_VALBBD_CTRL_0(lane, qlm),
3345                             rx_valbbd_ctrl_0.u64);
3346         }
3347
3348         /* do_pre_ctle_limits_work_around: */
3349         lane_vma_fine_ctrl_2.u64 = csr_rd_node(node, CVMX_GSERX_LANE_VMA_FINE_CTRL_2(qlm));
3350         //lane_vma_fine_ctrl_2.s.rx_prectle_peak_max_fine = 11;
3351         lane_vma_fine_ctrl_2.s.rx_prectle_gain_max_fine = 11;
3352         //lane_vma_fine_ctrl_2.s.rx_prectle_peak_min_fine = 6;
3353         lane_vma_fine_ctrl_2.s.rx_prectle_gain_min_fine = 6;
3354         csr_wr_node(node, CVMX_GSERX_LANE_VMA_FINE_CTRL_2(qlm), lane_vma_fine_ctrl_2.u64);
3355
3356         /* do_inc_dec_thres_work_around: */
3357         rx_txdir_ctrl_0.u64 = csr_rd_node(node, CVMX_GSERX_RX_TXDIR_CTRL_0(qlm));
3358         rx_txdir_ctrl_0.s.rx_boost_hi_thrs = 11;
3359         rx_txdir_ctrl_0.s.rx_boost_lo_thrs = 4;
3360         rx_txdir_ctrl_0.s.rx_boost_hi_val = 15;
3361         csr_wr_node(node, CVMX_GSERX_RX_TXDIR_CTRL_0(qlm), rx_txdir_ctrl_0.u64);
3362
3363         /* do_sdll_iq_work_around: */
3364         lane_vma_fine_ctrl_0.u64 = csr_rd_node(node, CVMX_GSERX_LANE_VMA_FINE_CTRL_0(qlm));
3365         lane_vma_fine_ctrl_0.s.rx_sdll_iq_max_fine = 14;
3366         lane_vma_fine_ctrl_0.s.rx_sdll_iq_min_fine = 8;
3367         lane_vma_fine_ctrl_0.s.rx_sdll_iq_step_fine = 2;
3368
3369         /* do_vma_window_work_around_2: */
3370         lane_vma_fine_ctrl_0.s.vma_window_wait_fine = 5;
3371         lane_vma_fine_ctrl_0.s.lms_wait_time_fine = 5;
3372
3373         csr_wr_node(node, CVMX_GSERX_LANE_VMA_FINE_CTRL_0(qlm), lane_vma_fine_ctrl_0.u64);
3374
3375         /* Set dfe_tap_1_lo_thres_val: */
3376         rx_txdir_ctrl_1.u64 = csr_rd_node(node, CVMX_GSERX_RX_TXDIR_CTRL_1(qlm));
3377         rx_txdir_ctrl_1.s.rx_tap1_lo_thrs = 8;
3378         rx_txdir_ctrl_1.s.rx_tap1_hi_thrs = 0x17;
3379         csr_wr_node(node, CVMX_GSERX_RX_TXDIR_CTRL_1(qlm), rx_txdir_ctrl_1.u64);
3380
3381         /* do_rxeq_wait_cnt_work_around: */
3382         eq_wait_time.u64 = csr_rd_node(node, CVMX_GSERX_EQ_WAIT_TIME(qlm));
3383         eq_wait_time.s.rxeq_wait_cnt = 6;
3384         csr_wr_node(node, CVMX_GSERX_EQ_WAIT_TIME(qlm), eq_wait_time.u64);
3385
3386         /* do_write_rx_txdir_precorr_thresholds: */
3387         rx_txdir_ctrl_2.u64 = csr_rd_node(node, CVMX_GSERX_RX_TXDIR_CTRL_2(qlm));
3388         rx_txdir_ctrl_2.s.rx_precorr_hi_thrs = 0xc0;
3389         rx_txdir_ctrl_2.s.rx_precorr_lo_thrs = 0x40;
3390         csr_wr_node(node, CVMX_GSERX_RX_TXDIR_CTRL_2(qlm), rx_txdir_ctrl_2.u64);
3391 }
3392
3393 /* Errata GSER-26150: 10G PHY PLL Temperature Failure
3394  * This workaround must be completed after the final deassertion of
3395  * GSERx_PHY_CTL[PHY_RESET]
3396  */
3397 static int __qlm_errata_gser_26150(int node, int qlm, int is_pcie)
3398 {
3399         int num_lanes = 4;
3400         int i;
3401         cvmx_gserx_glbl_pll_cfg_3_t pll_cfg_3;
3402         cvmx_gserx_glbl_misc_config_1_t misc_config_1;
3403
3404         /* PCIe only requires the LC-VCO parameters to be updated */
3405         if (is_pcie) {
3406                 /* Update PLL parameters */
3407                 /* Step 1: Set GSER()_GLBL_PLL_CFG_3[PLL_VCTRL_SEL_LCVCO_VAL] = 0x2, and
3408                  * GSER()_GLBL_PLL_CFG_3[PCS_SDS_PLL_VCO_AMP] = 0
3409                  */
3410                 pll_cfg_3.u64 = csr_rd_node(node, CVMX_GSERX_GLBL_PLL_CFG_3(qlm));
3411                 pll_cfg_3.s.pcs_sds_pll_vco_amp = 0;
3412                 pll_cfg_3.s.pll_vctrl_sel_lcvco_val = 2;
3413                 csr_wr_node(node, CVMX_GSERX_GLBL_PLL_CFG_3(qlm), pll_cfg_3.u64);
3414
3415                 /* Step 2: Set GSER()_GLBL_MISC_CONFIG_1[PCS_SDS_TRIM_CHP_REG] = 0x2. */
3416                 misc_config_1.u64 = csr_rd_node(node, CVMX_GSERX_GLBL_MISC_CONFIG_1(qlm));
3417                 misc_config_1.s.pcs_sds_trim_chp_reg = 2;
3418                 csr_wr_node(node, CVMX_GSERX_GLBL_MISC_CONFIG_1(qlm), misc_config_1.u64);
3419                 return 0;
3420         }
3421
3422         /* Applying this errata twice causes problems */
3423         pll_cfg_3.u64 = csr_rd_node(node, CVMX_GSERX_GLBL_PLL_CFG_3(qlm));
3424         if (pll_cfg_3.s.pll_vctrl_sel_lcvco_val == 0x2)
3425                 return 0;
3426
3427         /* (GSER-26150) 10 Gb temperature excursions can cause lock failure */
3428         /* Change the calibration point of the VCO at start up to shift some
3429          * available range of the VCO from -deltaT direction to the +deltaT
3430          * ramp direction allowing a greater range of VCO temperatures before
3431          * experiencing the failure.
3432          */
3433
3434         /* Check for DLMs on CN73XX and CNF75XX */
3435         if (OCTEON_IS_MODEL(OCTEON_CN73XX) && (qlm == 5 || qlm == 6))
3436                 num_lanes = 2;
3437
3438         /* Put PHY in P2 Power-down state  Need to Power down all lanes in a
3439          * QLM/DLM to force PHY to P2 state
3440          */
3441         for (i = 0; i < num_lanes; i++) {
3442                 cvmx_gserx_lanex_pcs_ctlifc_0_t ctlifc0;
3443                 cvmx_gserx_lanex_pcs_ctlifc_1_t ctlifc1;
3444                 cvmx_gserx_lanex_pcs_ctlifc_2_t ctlifc2;
3445
3446                 /* Step 1: Set Set GSER()_LANE(lane_n)_PCS_CTLIFC_0[CFG_TX_PSTATE_REQ_OVERRD_VAL]
3447                  * = 0x3
3448                  * Select P2 power state for Tx lane
3449                  */
3450                 ctlifc0.u64 = csr_rd_node(node, CVMX_GSERX_LANEX_PCS_CTLIFC_0(i, qlm));
3451                 ctlifc0.s.cfg_tx_pstate_req_ovrrd_val = 0x3;
3452                 csr_wr_node(node, CVMX_GSERX_LANEX_PCS_CTLIFC_0(i, qlm), ctlifc0.u64);
3453                 /* Step 2: Set GSER()_LANE(lane_n)_PCS_CTLIFC_1[CFG_RX_PSTATE_REQ_OVERRD_VAL]
3454                  * = 0x3
3455                  * Select P2 power state for Rx lane
3456                  */
3457                 ctlifc1.u64 = csr_rd_node(node, CVMX_GSERX_LANEX_PCS_CTLIFC_1(i, qlm));
3458                 ctlifc1.s.cfg_rx_pstate_req_ovrrd_val = 0x3;
3459                 csr_wr_node(node, CVMX_GSERX_LANEX_PCS_CTLIFC_1(i, qlm), ctlifc1.u64);
3460                 /* Step 3: Set GSER()_LANE(lane_n)_PCS_CTLIFC_2[CFG_TX_PSTATE_REQ_OVRRD_EN] = 1
3461                  * Enable Tx power state override and Set
3462                  * GSER()_LANE(lane_n)_PCS_CTLIFC_2[CFG_RX_PSTATE_REQ_OVRRD_EN] = 1
3463                  * Enable Rx power state override
3464                  */
3465                 ctlifc2.u64 = csr_rd_node(node, CVMX_GSERX_LANEX_PCS_CTLIFC_2(i, qlm));
3466                 ctlifc2.s.cfg_tx_pstate_req_ovrrd_en = 0x1;
3467                 ctlifc2.s.cfg_rx_pstate_req_ovrrd_en = 0x1;
3468                 csr_wr_node(node, CVMX_GSERX_LANEX_PCS_CTLIFC_2(i, qlm), ctlifc2.u64);
3469                 /* Step 4: Set GSER()_LANE(lane_n)_PCS_CTLIFC_2[CTLIFC_OVRRD_REQ] = 1
3470                  * Start the CTLIFC override state machine
3471                  */
3472                 ctlifc2.u64 = csr_rd_node(node, CVMX_GSERX_LANEX_PCS_CTLIFC_2(i, qlm));
3473                 ctlifc2.s.ctlifc_ovrrd_req = 0x1;
3474                 csr_wr_node(node, CVMX_GSERX_LANEX_PCS_CTLIFC_2(i, qlm), ctlifc2.u64);
3475         }
3476
3477         /* Update PLL parameters */
3478         /* Step 5: Set GSER()_GLBL_PLL_CFG_3[PLL_VCTRL_SEL_LCVCO_VAL] = 0x2, and
3479          * GSER()_GLBL_PLL_CFG_3[PCS_SDS_PLL_VCO_AMP] = 0
3480          */
3481         pll_cfg_3.u64 = csr_rd_node(node, CVMX_GSERX_GLBL_PLL_CFG_3(qlm));
3482         pll_cfg_3.s.pcs_sds_pll_vco_amp = 0;
3483         pll_cfg_3.s.pll_vctrl_sel_lcvco_val = 2;
3484         csr_wr_node(node, CVMX_GSERX_GLBL_PLL_CFG_3(qlm), pll_cfg_3.u64);
3485
3486         /* Step 6: Set GSER()_GLBL_MISC_CONFIG_1[PCS_SDS_TRIM_CHP_REG] = 0x2. */
3487         misc_config_1.u64 = csr_rd_node(node, CVMX_GSERX_GLBL_MISC_CONFIG_1(qlm));
3488         misc_config_1.s.pcs_sds_trim_chp_reg = 2;
3489         csr_wr_node(node, CVMX_GSERX_GLBL_MISC_CONFIG_1(qlm), misc_config_1.u64);
3490
3491         /* Wake up PHY and transition to P0 Power-up state to bring-up the lanes,
3492          * need to wake up all PHY lanes
3493          */
3494         for (i = 0; i < num_lanes; i++) {
3495                 cvmx_gserx_lanex_pcs_ctlifc_0_t ctlifc0;
3496                 cvmx_gserx_lanex_pcs_ctlifc_1_t ctlifc1;
3497                 cvmx_gserx_lanex_pcs_ctlifc_2_t ctlifc2;
3498                 /* Step 7: Set GSER()_LANE(lane_n)_PCS_CTLIFC_0[CFG_TX_PSTATE_REQ_OVERRD_VAL] = 0x0
3499                  * Select P0 power state for Tx lane
3500                  */
3501                 ctlifc0.u64 = csr_rd_node(node, CVMX_GSERX_LANEX_PCS_CTLIFC_0(i, qlm));
3502                 ctlifc0.s.cfg_tx_pstate_req_ovrrd_val = 0x0;
3503                 csr_wr_node(node, CVMX_GSERX_LANEX_PCS_CTLIFC_0(i, qlm), ctlifc0.u64);
3504                 /* Step 8: Set GSER()_LANE(lane_n)_PCS_CTLIFC_1[CFG_RX_PSTATE_REQ_OVERRD_VAL] = 0x0
3505                  * Select P0 power state for Rx lane
3506                  */
3507                 ctlifc1.u64 = csr_rd_node(node, CVMX_GSERX_LANEX_PCS_CTLIFC_1(i, qlm));
3508                 ctlifc1.s.cfg_rx_pstate_req_ovrrd_val = 0x0;
3509                 csr_wr_node(node, CVMX_GSERX_LANEX_PCS_CTLIFC_1(i, qlm), ctlifc1.u64);
3510                 /* Step 9: Set GSER()_LANE(lane_n)_PCS_CTLIFC_2[CFG_TX_PSTATE_REQ_OVRRD_EN] = 1
3511                  * Enable Tx power state override and Set
3512                  * GSER()_LANE(lane_n)_PCS_CTLIFC_2[CFG_RX_PSTATE_REQ_OVRRD_EN] = 1
3513                  * Enable Rx power state override
3514                  */
3515                 ctlifc2.u64 = csr_rd_node(node, CVMX_GSERX_LANEX_PCS_CTLIFC_2(i, qlm));
3516                 ctlifc2.s.cfg_tx_pstate_req_ovrrd_en = 0x1;
3517                 ctlifc2.s.cfg_rx_pstate_req_ovrrd_en = 0x1;
3518                 csr_wr_node(node, CVMX_GSERX_LANEX_PCS_CTLIFC_2(i, qlm), ctlifc2.u64);
3519                 /* Step 10: Set GSER()_LANE(lane_n)_PCS_CTLIFC_2[CTLIFC_OVRRD_REQ] = 1
3520                  * Start the CTLIFC override state machine
3521                  */
3522                 ctlifc2.u64 = csr_rd_node(node, CVMX_GSERX_LANEX_PCS_CTLIFC_2(i, qlm));
3523                 ctlifc2.s.ctlifc_ovrrd_req = 0x1;
3524                 csr_wr_node(node, CVMX_GSERX_LANEX_PCS_CTLIFC_2(i, qlm), ctlifc2.u64);
3525         }
3526
3527         /* Step 11: Wait 10 msec */
3528         mdelay(10);
3529
3530         /* Release Lane Tx/Rx Power state override enables. */
3531         for (i = 0; i < num_lanes; i++) {
3532                 cvmx_gserx_lanex_pcs_ctlifc_2_t ctlifc2;
3533
3534                 ctlifc2.u64 = csr_rd_node(node, CVMX_GSERX_LANEX_PCS_CTLIFC_2(i, qlm));
3535                 ctlifc2.s.cfg_tx_pstate_req_ovrrd_en = 0x0;
3536                 ctlifc2.s.cfg_rx_pstate_req_ovrrd_en = 0x0;
3537                 csr_wr_node(node, CVMX_GSERX_LANEX_PCS_CTLIFC_2(i, qlm), ctlifc2.u64);
3538         }
3539
3540         /* Step 12:  Poll GSER()_PLL_STAT.[PLL_LOCK] = 1
3541          * Poll and check that PLL is locked
3542          */
3543         if (CVMX_WAIT_FOR_FIELD64_NODE(node, CVMX_GSERX_PLL_STAT(qlm), cvmx_gserx_pll_stat_t,
3544                                        pll_lock, ==, 1, 10000)) {
3545                 printf("%d:QLM%d: Timeout waiting for GSERX_PLL_STAT[pll_lock]\n", node, qlm);
3546                 return -1;
3547         }
3548
3549         /* Step 13:  Poll GSER()_QLM_STAT.[RST_RDY] = 1
3550          * Poll and check that QLM/DLM is Ready
3551          */
3552         if (is_pcie == 0 &&
3553             CVMX_WAIT_FOR_FIELD64_NODE(node, CVMX_GSERX_QLM_STAT(qlm), cvmx_gserx_qlm_stat_t,
3554                                        rst_rdy, ==, 1, 10000)) {
3555                 printf("%d:QLM%d: Timeout waiting for GSERX_QLM_STAT[rst_rdy]\n", node, qlm);
3556                 return -1;
3557         }
3558
3559         return 0;
3560 }
3561
3562 /**
3563  * Configure all of the PLLs for a particular node and qlm
3564  * @INTERNAL
3565  *
3566  * @param node  Node number to configure
3567  * @param qlm   QLM number to configure
3568  */
3569 static void __qlm_setup_pll_cn78xx(int node, int qlm)
3570 {
3571         cvmx_gserx_pll_px_mode_0_t mode_0;
3572         cvmx_gserx_pll_px_mode_1_t mode_1;
3573         cvmx_gserx_lane_px_mode_0_t pmode_0;
3574         cvmx_gserx_lane_px_mode_1_t pmode_1;
3575         int lane_mode;
3576         int ref_clk;
3577         const struct refclk_settings_cn78xx *clk_settings;
3578
3579         for (lane_mode = 0; lane_mode < R_NUM_LANE_MODES; lane_mode++) {
3580                 mode_0.u64 = csr_rd_node(node, CVMX_GSERX_PLL_PX_MODE_0(lane_mode, qlm));
3581                 mode_1.u64 = csr_rd_node(node, CVMX_GSERX_PLL_PX_MODE_1(lane_mode, qlm));
3582                 pmode_0.u64 = 0;
3583                 pmode_1.u64 = 0;
3584                 ref_clk = ref_clk_cn78xx[node][qlm][lane_mode];
3585                 clk_settings = &refclk_settings_cn78xx[lane_mode][ref_clk];
3586                 debug("%s(%d, %d): lane_mode: 0x%x, ref_clk: %d\n", __func__, node, qlm, lane_mode,
3587                       ref_clk);
3588
3589                 if (!clk_settings->valid) {
3590                         printf("%s: Error: reference clock %d is not supported for lane mode %d on qlm %d\n",
3591                                __func__, ref_clk, lane_mode, qlm);
3592                         continue;
3593                 }
3594
3595                 mode_0.s.pll_icp = clk_settings->mode_0.s.pll_icp;
3596                 mode_0.s.pll_rloop = clk_settings->mode_0.s.pll_rloop;
3597                 mode_0.s.pll_pcs_div = clk_settings->mode_0.s.pll_pcs_div;
3598
3599                 mode_1.s.pll_16p5en = clk_settings->mode_1.s.pll_16p5en;
3600                 mode_1.s.pll_cpadj = clk_settings->mode_1.s.pll_cpadj;
3601                 mode_1.s.pll_pcie3en = clk_settings->mode_1.s.pll_pcie3en;
3602                 mode_1.s.pll_opr = clk_settings->mode_1.s.pll_opr;
3603                 mode_1.s.pll_div = clk_settings->mode_1.s.pll_div;
3604
3605                 pmode_0.u64 = clk_settings->pmode_0.u64;
3606
3607                 pmode_1.u64 = clk_settings->pmode_1.u64;
3608
3609                 csr_wr_node(node, CVMX_GSERX_PLL_PX_MODE_1(lane_mode, qlm), mode_1.u64);
3610                 csr_wr_node(node, CVMX_GSERX_LANE_PX_MODE_0(lane_mode, qlm), pmode_0.u64);
3611                 csr_wr_node(node, CVMX_GSERX_LANE_PX_MODE_1(lane_mode, qlm), pmode_1.u64);
3612                 csr_wr_node(node, CVMX_GSERX_PLL_PX_MODE_0(lane_mode, qlm), mode_0.u64);
3613         }
3614 }
3615
3616 /**
3617  * Get the lane mode for the specified node and QLM.
3618  *
3619  * @param ref_clk_sel   The reference-clock selection to use to configure QLM
3620  *                       0 = REF_100MHZ
3621  *                       1 = REF_125MHZ
3622  *                       2 = REF_156MHZ
3623  * @param baud_mhz   The speed the QLM needs to be configured in Mhz.
3624  * @param[out] alt_pll_settings If non-NULL this will be set if non-default PLL
3625  *                              settings are required for the mode.
3626  *
3627  * @return lane mode to use or -1 on error
3628  *
3629  * NOTE: In some modes
3630  */
3631 static int __get_lane_mode_for_speed_and_ref_clk(int ref_clk_sel, int baud_mhz,
3632                                                  bool *alt_pll_settings)
3633 {
3634         if (alt_pll_settings)
3635                 *alt_pll_settings = false;
3636         switch (baud_mhz) {
3637         case 98304:
3638         case 49152:
3639         case 24576:
3640         case 12288:
3641                 if (ref_clk_sel != 3) {
3642                         printf("Error: Invalid ref clock\n");
3643                         return -1;
3644                 }
3645                 return 0x5;
3646         case 6144:
3647         case 3072:
3648                 if (ref_clk_sel != 3) {
3649                         printf("Error: Invalid ref clock\n");
3650                         return -1;
3651                 }
3652                 return 0x8;
3653         case 1250:
3654                 if (alt_pll_settings)
3655                         *alt_pll_settings = (ref_clk_sel != 2);
3656                 return R_125G_REFCLK15625_SGMII;
3657         case 2500:
3658                 if (ref_clk_sel == 0)
3659                         return R_2_5G_REFCLK100;
3660
3661                 if (alt_pll_settings)
3662                         *alt_pll_settings = (ref_clk_sel != 1);
3663                 return R_2_5G_REFCLK125;
3664         case 3125:
3665                 if (ref_clk_sel == 2) {
3666                         return R_3125G_REFCLK15625_XAUI;
3667                 } else if (ref_clk_sel == 1) {
3668                         if (alt_pll_settings)
3669                                 *alt_pll_settings = true;
3670                         return R_3125G_REFCLK15625_XAUI;
3671                 }
3672
3673                 printf("Error: Invalid speed\n");
3674                 return -1;
3675         case 5000:
3676                 if (ref_clk_sel == 0) {
3677                         return R_5G_REFCLK100;
3678                 } else if (ref_clk_sel == 1) {
3679                         if (alt_pll_settings)
3680                                 *alt_pll_settings = (ref_clk_sel != 1);
3681                         return R_5G_REFCLK125;
3682                 } else {
3683                         return R_5G_REFCLK15625_QSGMII;
3684                 }
3685         case 6250:
3686                 if (ref_clk_sel != 0) {
3687                         if (alt_pll_settings)
3688                                 *alt_pll_settings = (ref_clk_sel != 2);
3689                         return R_625G_REFCLK15625_RXAUI;
3690                 }
3691
3692                 printf("Error: Invalid speed\n");
3693                 return -1;
3694         case 6316:
3695                 if (ref_clk_sel != 3) {
3696                         printf("Error: Invalid speed\n");
3697                 } else {
3698                         *alt_pll_settings = true;
3699                         return R_625G_REFCLK15625_RXAUI;
3700                 }
3701         case 8000:
3702                 if (ref_clk_sel == 0)
3703                         return R_8G_REFCLK100;
3704                 else if (ref_clk_sel == 1)
3705                         return R_8G_REFCLK125;
3706
3707                 printf("Error: Invalid speed\n");
3708                 return -1;
3709         case 103125:
3710                 if (ref_clk_sel == 3 && alt_pll_settings)
3711                         *alt_pll_settings = true;
3712
3713                 if (ref_clk_sel == 2 || ref_clk_sel == 3)
3714                         return R_103125G_REFCLK15625_KR;
3715
3716         default:
3717                 printf("Error: Invalid speed\n");
3718                 return -1;
3719         }
3720
3721         return -1;
3722 }
3723
3724 /*
3725  * Errata PEM-31375 PEM RSL accesses to PCLK registers can timeout
3726  * during speed change. Change SLI_WINDOW_CTL[time] to 525us
3727  */
3728 static void __set_sli_window_ctl_errata_31375(int node)
3729 {
3730         if (OCTEON_IS_MODEL(OCTEON_CN78XX) || OCTEON_IS_MODEL(OCTEON_CN73XX) ||
3731             OCTEON_IS_MODEL(OCTEON_CNF75XX)) {
3732                 cvmx_sli_window_ctl_t window_ctl;
3733
3734                 window_ctl.u64 = csr_rd_node(node, CVMX_PEXP_SLI_WINDOW_CTL);
3735                 /* Configure SLI_WINDOW_CTL only once */
3736                 if (window_ctl.s.time != 8191)
3737                         return;
3738
3739                 window_ctl.s.time = gd->bus_clk * 525ull / 1000000;
3740                 csr_wr_node(node, CVMX_PEXP_SLI_WINDOW_CTL, window_ctl.u64);
3741         }
3742 }
3743
3744 static void __cvmx_qlm_pcie_errata_ep_cn78xx(int node, int pem)
3745 {
3746         cvmx_pciercx_cfg031_t cfg031;
3747         cvmx_pciercx_cfg032_t cfg032;
3748         cvmx_pciercx_cfg040_t cfg040;
3749         cvmx_pemx_cfg_t pemx_cfg;
3750         cvmx_pemx_on_t pemx_on;
3751         int low_qlm, high_qlm;
3752         int qlm, lane;
3753         u64 start_cycle;
3754
3755         pemx_on.u64 = csr_rd_node(node, CVMX_PEMX_ON(pem));
3756
3757         /* Errata (GSER-21178) PCIe gen3 doesn't work, continued */
3758
3759         /* Wait for the link to come up as Gen1 */
3760         printf("PCIe%d: Waiting for EP out of reset\n", pem);
3761         while (pemx_on.s.pemoor == 0) {
3762                 udelay(1000);
3763                 pemx_on.u64 = csr_rd_node(node, CVMX_PEMX_ON(pem));
3764         }
3765
3766         /* Enable gen3 speed selection */
3767         printf("PCIe%d: Enabling Gen3 for EP\n", pem);
3768         /* Force Gen1 for initial link bringup. We'll fix it later */
3769         pemx_cfg.u64 = csr_rd_node(node, CVMX_PEMX_CFG(pem));
3770         pemx_cfg.s.md = 2;
3771         csr_wr_node(node, CVMX_PEMX_CFG(pem), pemx_cfg.u64);
3772         cfg031.u32 = cvmx_pcie_cfgx_read_node(node, pem, CVMX_PCIERCX_CFG031(pem));
3773         cfg031.s.mls = 2;
3774         cvmx_pcie_cfgx_write_node(node, pem, CVMX_PCIERCX_CFG031(pem), cfg031.u32);
3775         cfg040.u32 = cvmx_pcie_cfgx_read_node(node, pem, CVMX_PCIERCX_CFG040(pem));
3776         cfg040.s.tls = 3;
3777         cvmx_pcie_cfgx_write_node(node, pem, CVMX_PCIERCX_CFG040(pem), cfg040.u32);
3778
3779         /* Wait up to 10ms for the link speed change to complete */
3780         start_cycle = get_timer(0);
3781         do {
3782                 if (get_timer(start_cycle) > 10)
3783                         return;
3784
3785                 mdelay(1);
3786                 cfg032.u32 = cvmx_pcie_cfgx_read_node(node, pem, CVMX_PCIERCX_CFG032(pem));
3787         } while (cfg032.s.ls != 3);
3788
3789         pemx_cfg.u64 = csr_rd_node(node, CVMX_PEMX_CFG(pem));
3790         low_qlm = pem; /* FIXME */
3791         high_qlm = (pemx_cfg.cn78xx.lanes8) ? low_qlm + 1 : low_qlm;
3792
3793         /* Toggle cfg_rx_dll_locken_ovrrd_en and rx_resetn_ovrrd_en across
3794          * all QM lanes in use
3795          */
3796         for (qlm = low_qlm; qlm <= high_qlm; qlm++) {
3797                 for (lane = 0; lane < 4; lane++) {
3798                         cvmx_gserx_lanex_rx_misc_ovrrd_t misc_ovrrd;
3799                         cvmx_gserx_lanex_pwr_ctrl_t pwr_ctrl;
3800
3801                         misc_ovrrd.u64 =
3802                                 csr_rd_node(node, CVMX_GSERX_LANEX_RX_MISC_OVRRD(lane, pem));
3803                         misc_ovrrd.s.cfg_rx_dll_locken_ovrrd_en = 1;
3804                         csr_wr_node(node, CVMX_GSERX_LANEX_RX_MISC_OVRRD(lane, pem),
3805                                     misc_ovrrd.u64);
3806                         pwr_ctrl.u64 = csr_rd_node(node, CVMX_GSERX_LANEX_PWR_CTRL(lane, pem));
3807                         pwr_ctrl.s.rx_resetn_ovrrd_en = 1;
3808                         csr_wr_node(node, CVMX_GSERX_LANEX_PWR_CTRL(lane, pem), pwr_ctrl.u64);
3809                 }
3810         }
3811         for (qlm = low_qlm; qlm <= high_qlm; qlm++) {
3812                 for (lane = 0; lane < 4; lane++) {
3813                         cvmx_gserx_lanex_rx_misc_ovrrd_t misc_ovrrd;
3814                         cvmx_gserx_lanex_pwr_ctrl_t pwr_ctrl;
3815
3816                         misc_ovrrd.u64 =
3817                                 csr_rd_node(node, CVMX_GSERX_LANEX_RX_MISC_OVRRD(lane, pem));
3818                         misc_ovrrd.s.cfg_rx_dll_locken_ovrrd_en = 0;
3819                         csr_wr_node(node, CVMX_GSERX_LANEX_RX_MISC_OVRRD(lane, pem),
3820                                     misc_ovrrd.u64);
3821                         pwr_ctrl.u64 = csr_rd_node(node, CVMX_GSERX_LANEX_PWR_CTRL(lane, pem));
3822                         pwr_ctrl.s.rx_resetn_ovrrd_en = 0;
3823                         csr_wr_node(node, CVMX_GSERX_LANEX_PWR_CTRL(lane, pem), pwr_ctrl.u64);
3824                 }
3825         }
3826
3827         //printf("PCIe%d: Waiting for EP link up at Gen3\n", pem);
3828         if (CVMX_WAIT_FOR_FIELD64_NODE(node, CVMX_PEMX_ON(pem), cvmx_pemx_on_t, pemoor, ==, 1,
3829                                        1000000)) {
3830                 printf("PCIe%d: Timeout waiting for EP link up at Gen3\n", pem);
3831                 return;
3832         }
3833 }
3834
3835 static void __cvmx_qlm_pcie_errata_cn78xx(int node, int qlm)
3836 {
3837         int pem, i, q;
3838         int is_8lanes;
3839         int is_high_lanes;
3840         int low_qlm, high_qlm, is_host;
3841         int need_ep_monitor;
3842         cvmx_pemx_cfg_t pem_cfg, pem3_cfg;
3843         cvmx_gserx_slice_cfg_t slice_cfg;
3844         cvmx_gserx_rx_pwr_ctrl_p1_t pwr_ctrl_p1;
3845         cvmx_rst_soft_prstx_t soft_prst;
3846
3847         /* Only applies to CN78XX pass 1.x */
3848         if (!OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
3849                 return;
3850
3851         /* Determine the PEM for this QLM, whether we're in 8 lane mode,
3852          * and whether these are the top lanes of the 8
3853          */
3854         switch (qlm) {
3855         case 0: /* First 4 lanes of PEM0 */
3856                 pem_cfg.u64 = csr_rd_node(node, CVMX_PEMX_CFG(0));
3857                 pem = 0;
3858                 is_8lanes = pem_cfg.cn78xx.lanes8;
3859                 is_high_lanes = 0;
3860                 break;
3861         case 1: /* Either last 4 lanes of PEM0, or PEM1 */
3862                 pem_cfg.u64 = csr_rd_node(node, CVMX_PEMX_CFG(0));
3863                 pem = (pem_cfg.cn78xx.lanes8) ? 0 : 1;
3864                 is_8lanes = pem_cfg.cn78xx.lanes8;
3865                 is_high_lanes = is_8lanes;
3866                 break;
3867         case 2: /* First 4 lanes of PEM2 */
3868                 pem_cfg.u64 = csr_rd_node(node, CVMX_PEMX_CFG(2));
3869                 pem = 2;
3870                 is_8lanes = pem_cfg.cn78xx.lanes8;
3871                 is_high_lanes = 0;
3872                 break;
3873         case 3: /* Either last 4 lanes of PEM2, or PEM3 */
3874                 pem_cfg.u64 = csr_rd_node(node, CVMX_PEMX_CFG(2));
3875                 pem3_cfg.u64 = csr_rd_node(node, CVMX_PEMX_CFG(3));
3876                 pem = (pem_cfg.cn78xx.lanes8) ? 2 : 3;
3877                 is_8lanes = (pem == 2) ? pem_cfg.cn78xx.lanes8 : pem3_cfg.cn78xx.lanes8;
3878                 is_high_lanes = (pem == 2) && is_8lanes;
3879                 break;
3880         case 4: /* Last 4 lanes of PEM3 */
3881                 pem = 3;
3882                 is_8lanes = 1;
3883                 is_high_lanes = 1;
3884                 break;
3885         default:
3886                 return;
3887         }
3888
3889         /* These workaround must be applied once per PEM. Since we're called per
3890          * QLM, wait for the 2nd half of 8 lane setups before doing the workaround
3891          */
3892         if (is_8lanes && !is_high_lanes)
3893                 return;
3894
3895         pem_cfg.u64 = csr_rd_node(node, CVMX_PEMX_CFG(pem));
3896         is_host = pem_cfg.cn78xx.hostmd;
3897         low_qlm = (is_8lanes) ? qlm - 1 : qlm;
3898         high_qlm = qlm;
3899         qlm = -1;
3900
3901         if (!is_host) {
3902                 /* Read the current slice config value. If its at the value we will
3903                  * program then skip doing the workaround. We're probably doing a
3904                  * hot reset and the workaround is already applied
3905                  */
3906                 slice_cfg.u64 = csr_rd_node(node, CVMX_GSERX_SLICE_CFG(low_qlm));
3907                 if (slice_cfg.s.tx_rx_detect_lvl_enc == 7 && OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_0))
3908                         return;
3909         }
3910
3911         if (is_host && OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_0)) {
3912                 /* (GSER-XXXX) GSER PHY needs to be reset at initialization */
3913                 cvmx_gserx_phy_ctl_t phy_ctl;
3914
3915                 for (q = low_qlm; q <= high_qlm; q++) {
3916                         phy_ctl.u64 = csr_rd_node(node, CVMX_GSERX_PHY_CTL(q));
3917                         phy_ctl.s.phy_reset = 1;
3918                         csr_wr_node(node, CVMX_GSERX_PHY_CTL(q), phy_ctl.u64);
3919                 }
3920                 udelay(5);
3921
3922                 for (q = low_qlm; q <= high_qlm; q++) {
3923                         phy_ctl.u64 = csr_rd_node(node, CVMX_GSERX_PHY_CTL(q));
3924                         phy_ctl.s.phy_reset = 0;
3925                         csr_wr_node(node, CVMX_GSERX_PHY_CTL(q), phy_ctl.u64);
3926                 }
3927                 udelay(5);
3928         }
3929
3930         if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_0)) {
3931                 /* (GSER-20936) GSER has wrong PCIe RX detect reset value */
3932                 for (q = low_qlm; q <= high_qlm; q++) {
3933                         slice_cfg.u64 = csr_rd_node(node, CVMX_GSERX_SLICE_CFG(q));
3934                         slice_cfg.s.tx_rx_detect_lvl_enc = 7;
3935                         csr_wr_node(node, CVMX_GSERX_SLICE_CFG(q), slice_cfg.u64);
3936                 }
3937
3938                 /* Clear the bit in GSERX_RX_PWR_CTRL_P1[p1_rx_subblk_pd]
3939                  * that coresponds to "Lane DLL"
3940                  */
3941                 for (q = low_qlm; q <= high_qlm; q++) {
3942                         pwr_ctrl_p1.u64 = csr_rd_node(node, CVMX_GSERX_RX_PWR_CTRL_P1(q));
3943                         pwr_ctrl_p1.s.p1_rx_subblk_pd &= ~4;
3944                         csr_wr_node(node, CVMX_GSERX_RX_PWR_CTRL_P1(q), pwr_ctrl_p1.u64);
3945                 }
3946
3947                 /* Errata (GSER-20888) GSER incorrect synchronizers hurts PCIe
3948                  * Override TX Power State machine TX reset control signal
3949                  */
3950                 for (q = low_qlm; q <= high_qlm; q++) {
3951                         for (i = 0; i < 4; i++) {
3952                                 cvmx_gserx_lanex_tx_cfg_0_t tx_cfg;
3953                                 cvmx_gserx_lanex_pwr_ctrl_t pwr_ctrl;
3954
3955                                 tx_cfg.u64 = csr_rd_node(node, CVMX_GSERX_LANEX_TX_CFG_0(i, q));
3956                                 tx_cfg.s.tx_resetn_ovrrd_val = 1;
3957                                 csr_wr_node(node, CVMX_GSERX_LANEX_TX_CFG_0(i, q), tx_cfg.u64);
3958                                 pwr_ctrl.u64 = csr_rd_node(node, CVMX_GSERX_LANEX_PWR_CTRL(i, q));
3959                                 pwr_ctrl.s.tx_p2s_resetn_ovrrd_en = 1;
3960                                 csr_wr_node(node, CVMX_GSERX_LANEX_PWR_CTRL(i, q), pwr_ctrl.u64);
3961                         }
3962                 }
3963         }
3964
3965         if (!is_host) {
3966                 cvmx_pciercx_cfg089_t cfg089;
3967                 cvmx_pciercx_cfg090_t cfg090;
3968                 cvmx_pciercx_cfg091_t cfg091;
3969                 cvmx_pciercx_cfg092_t cfg092;
3970                 cvmx_pciercx_cfg548_t cfg548;
3971                 cvmx_pciercx_cfg554_t cfg554;
3972
3973                 if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_0)) {
3974                         /* Errata (GSER-21178) PCIe gen3 doesn't work */
3975                         /* The starting equalization hints are incorrect on CN78XX pass 1.x. Fix
3976                          * them for the 8 possible lanes. It doesn't hurt to program them even
3977                          * for lanes not in use
3978                          */
3979                         cfg089.u32 = cvmx_pcie_cfgx_read_node(node, pem, CVMX_PCIERCX_CFG089(pem));
3980                         cfg089.s.l1urph = 2;
3981                         cfg089.s.l1utp = 7;
3982                         cfg089.s.l0urph = 2;
3983                         cfg089.s.l0utp = 7;
3984                         cvmx_pcie_cfgx_write_node(node, pem, CVMX_PCIERCX_CFG089(pem), cfg089.u32);
3985                         cfg090.u32 = cvmx_pcie_cfgx_read_node(node, pem, CVMX_PCIERCX_CFG090(pem));
3986                         cfg090.s.l3urph = 2;
3987                         cfg090.s.l3utp = 7;
3988                         cfg090.s.l2urph = 2;
3989                         cfg090.s.l2utp = 7;
3990                         cvmx_pcie_cfgx_write_node(node, pem, CVMX_PCIERCX_CFG090(pem), cfg090.u32);
3991                         cfg091.u32 = cvmx_pcie_cfgx_read_node(node, pem, CVMX_PCIERCX_CFG091(pem));
3992                         cfg091.s.l5urph = 2;
3993                         cfg091.s.l5utp = 7;
3994                         cfg091.s.l4urph = 2;
3995                         cfg091.s.l4utp = 7;
3996                         cvmx_pcie_cfgx_write_node(node, pem, CVMX_PCIERCX_CFG091(pem), cfg091.u32);
3997                         cfg092.u32 = cvmx_pcie_cfgx_read_node(node, pem, CVMX_PCIERCX_CFG092(pem));
3998                         cfg092.s.l7urph = 2;
3999                         cfg092.s.l7utp = 7;
4000                         cfg092.s.l6urph = 2;
4001                         cfg092.s.l6utp = 7;
4002                         cvmx_pcie_cfgx_write_node(node, pem, CVMX_PCIERCX_CFG092(pem), cfg092.u32);
4003                         /* FIXME: Disable phase 2 and phase 3 equalization */
4004                         cfg548.u32 = cvmx_pcie_cfgx_read_node(node, pem, CVMX_PCIERCX_CFG548(pem));
4005                         cfg548.s.ep2p3d = 1;
4006                         cvmx_pcie_cfgx_write_node(node, pem, CVMX_PCIERCX_CFG548(pem), cfg548.u32);
4007                 }
4008                 /* Errata (GSER-21331) GEN3 Equalization may fail */
4009                 /* Disable preset #10 and disable the 2ms timeout */
4010                 cfg554.u32 = cvmx_pcie_cfgx_read_node(node, pem, CVMX_PCIERCX_CFG554(pem));
4011                 if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_0))
4012                         cfg554.s.p23td = 1;
4013                 cfg554.s.prv = 0x3ff;
4014                 cvmx_pcie_cfgx_write_node(node, pem, CVMX_PCIERCX_CFG554(pem), cfg554.u32);
4015
4016                 if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_0)) {
4017                         need_ep_monitor = (pem_cfg.s.md == 2);
4018                         if (need_ep_monitor) {
4019                                 cvmx_pciercx_cfg031_t cfg031;
4020                                 cvmx_pciercx_cfg040_t cfg040;
4021
4022                                 /* Force Gen1 for initial link bringup. We'll
4023                                  * fix it later
4024                                  */
4025                                 pem_cfg.u64 = csr_rd_node(node, CVMX_PEMX_CFG(pem));
4026                                 pem_cfg.s.md = 0;
4027                                 csr_wr_node(node, CVMX_PEMX_CFG(pem), pem_cfg.u64);
4028                                 cfg031.u32 = cvmx_pcie_cfgx_read_node(node, pem,
4029                                                                       CVMX_PCIERCX_CFG031(pem));
4030                                 cfg031.s.mls = 0;
4031                                 cvmx_pcie_cfgx_write_node(node, pem, CVMX_PCIERCX_CFG031(pem),
4032                                                           cfg031.u32);
4033                                 cfg040.u32 = cvmx_pcie_cfgx_read_node(node, pem,
4034                                                                       CVMX_PCIERCX_CFG040(pem));
4035                                 cfg040.s.tls = 1;
4036                                 cvmx_pcie_cfgx_write_node(node, pem, CVMX_PCIERCX_CFG040(pem),
4037                                                           cfg040.u32);
4038                                 __cvmx_qlm_pcie_errata_ep_cn78xx(node, pem);
4039                         }
4040                         return;
4041                 }
4042         }
4043
4044         if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_0)) {
4045                 /* De-assert the SOFT_RST bit for this QLM (PEM), causing the PCIe
4046                  * workarounds code above to take effect.
4047                  */
4048                 soft_prst.u64 = csr_rd_node(node, CVMX_RST_SOFT_PRSTX(pem));
4049                 soft_prst.s.soft_prst = 0;
4050                 csr_wr_node(node, CVMX_RST_SOFT_PRSTX(pem), soft_prst.u64);
4051                 udelay(1);
4052
4053                 /* Assert the SOFT_RST bit for this QLM (PEM), putting the PCIe back into
4054                  * reset state with disturbing the workarounds.
4055                  */
4056                 soft_prst.u64 = csr_rd_node(node, CVMX_RST_SOFT_PRSTX(pem));
4057                 soft_prst.s.soft_prst = 1;
4058                 csr_wr_node(node, CVMX_RST_SOFT_PRSTX(pem), soft_prst.u64);
4059         }
4060         udelay(1);
4061 }
4062
4063 /**
4064  * Setup the PEM to either driver or receive reset from PRST based on RC or EP
4065  *
4066  * @param node   Node to use in a Numa setup
4067  * @param pem    Which PEM to setuo
4068  * @param is_endpoint
4069  *               Non zero if PEM is a EP
4070  */
4071 static void __setup_pem_reset(int node, int pem, int is_endpoint)
4072 {
4073         cvmx_rst_ctlx_t rst_ctl;
4074
4075         /* Make sure is_endpoint is either 0 or 1 */
4076         is_endpoint = (is_endpoint != 0);
4077         rst_ctl.u64 = csr_rd_node(node, CVMX_RST_CTLX(pem));
4078         rst_ctl.s.prst_link = 0;          /* Link down causes soft reset */
4079         rst_ctl.s.rst_link = is_endpoint; /* EP PERST causes a soft reset */
4080         rst_ctl.s.rst_drv = !is_endpoint; /* Drive if RC */
4081         rst_ctl.s.rst_rcv = is_endpoint;  /* Only read PERST in EP mode */
4082         rst_ctl.s.rst_chip = 0;           /* PERST doesn't pull CHIP_RESET */
4083         csr_wr_node(node, CVMX_RST_CTLX(pem), rst_ctl.u64);
4084 }
4085
4086 /**
4087  * Configure QLM speed and mode for cn78xx.
4088  *
4089  * @param node    Node to configure the QLM
4090  * @param qlm     The QLM to configure
4091  * @param baud_mhz   The speed the QLM needs to be configured in Mhz.
4092  * @param mode    The QLM to be configured as SGMII/XAUI/PCIe.
4093  * @param rc      Only used for PCIe, rc = 1 for root complex mode, 0 for EP mode.
4094  * @param gen3    Only used for PCIe
4095  *                      gen3 = 2 GEN3 mode
4096  *                      gen3 = 1 GEN2 mode
4097  *                      gen3 = 0 GEN1 mode
4098  *
4099  * @param ref_clk_sel    The reference-clock selection to use to configure QLM
4100  *                       0 = REF_100MHZ
4101  *                       1 = REF_125MHZ
4102  *                       2 = REF_156MHZ
4103  *                       3 = REF_161MHZ
4104  * @param ref_clk_input  The reference-clock input to use to configure QLM
4105  *
4106  * @return       Return 0 on success or -1.
4107  */
4108 int octeon_configure_qlm_cn78xx(int node, int qlm, int baud_mhz, int mode, int rc, int gen3,
4109                                 int ref_clk_sel, int ref_clk_input)
4110 {
4111         cvmx_gserx_phy_ctl_t phy_ctl;
4112         cvmx_gserx_lane_mode_t lmode;
4113         cvmx_gserx_cfg_t cfg;
4114         cvmx_gserx_refclk_sel_t refclk_sel;
4115
4116         int is_pcie = 0;
4117         int is_ilk = 0;
4118         int is_bgx = 0;
4119         int lane_mode = 0;
4120         int lmac_type = 0;
4121         bool alt_pll = false;
4122         int num_ports = 0;
4123         int lane_to_sds = 0;
4124
4125         debug("%s(node: %d, qlm: %d, baud_mhz: %d, mode: %d, rc: %d, gen3: %d, ref_clk_sel: %d, ref_clk_input: %d\n",
4126               __func__, node, qlm, baud_mhz, mode, rc, gen3, ref_clk_sel, ref_clk_input);
4127         if (OCTEON_IS_MODEL(OCTEON_CN76XX) && qlm > 4) {
4128                 debug("%s: qlm %d not present on CN76XX\n", __func__, qlm);
4129                 return -1;
4130         }
4131
4132         /* Errata PEM-31375 PEM RSL accesses to PCLK registers can timeout
4133          * during speed change. Change SLI_WINDOW_CTL[time] to 525us
4134          */
4135         __set_sli_window_ctl_errata_31375(node);
4136
4137         cfg.u64 = csr_rd_node(node, CVMX_GSERX_CFG(qlm));
4138         /* If PEM is in EP, no need to do anything */
4139
4140         if (cfg.s.pcie && rc == 0) {
4141                 debug("%s: node %d, qlm %d is in PCIe endpoint mode, returning\n",
4142                       __func__, node, qlm);
4143                 return 0;
4144         }
4145
4146         /* Set the reference clock to use */
4147         refclk_sel.u64 = 0;
4148         if (ref_clk_input == 0) { /* External ref clock */
4149                 refclk_sel.s.com_clk_sel = 0;
4150                 refclk_sel.s.use_com1 = 0;
4151         } else if (ref_clk_input == 1) {
4152                 refclk_sel.s.com_clk_sel = 1;
4153                 refclk_sel.s.use_com1 = 0;
4154         } else {
4155                 refclk_sel.s.com_clk_sel = 1;
4156                 refclk_sel.s.use_com1 = 1;
4157         }
4158
4159         csr_wr_node(node, CVMX_GSERX_REFCLK_SEL(qlm), refclk_sel.u64);
4160
4161         /* Reset the QLM after changing the reference clock */
4162         phy_ctl.u64 = csr_rd_node(node, CVMX_GSERX_PHY_CTL(qlm));
4163         phy_ctl.s.phy_reset = 1;
4164         phy_ctl.s.phy_pd = 1;
4165         csr_wr_node(node, CVMX_GSERX_PHY_CTL(qlm), phy_ctl.u64);
4166
4167         udelay(1000);
4168
4169         /* Always restore the reference clocks for a QLM */
4170         memcpy(ref_clk_cn78xx[node][qlm], def_ref_clk_cn78xx, sizeof(def_ref_clk_cn78xx));
4171         switch (mode) {
4172         case CVMX_QLM_MODE_PCIE:
4173         case CVMX_QLM_MODE_PCIE_1X8: {
4174                 cvmx_pemx_cfg_t pemx_cfg;
4175                 cvmx_pemx_on_t pemx_on;
4176
4177                 is_pcie = 1;
4178
4179                 if (ref_clk_sel == 0) {
4180                         refclk_sel.u64 = csr_rd_node(node, CVMX_GSERX_REFCLK_SEL(qlm));
4181                         refclk_sel.s.pcie_refclk125 = 0;
4182                         csr_wr_node(node, CVMX_GSERX_REFCLK_SEL(qlm), refclk_sel.u64);
4183                         if (gen3 == 0) /* Gen1 mode */
4184                                 lane_mode = R_2_5G_REFCLK100;
4185                         else if (gen3 == 1) /* Gen2 mode */
4186                                 lane_mode = R_5G_REFCLK100;
4187                         else
4188                                 lane_mode = R_8G_REFCLK100;
4189                 } else if (ref_clk_sel == 1) {
4190                         refclk_sel.u64 = csr_rd_node(node, CVMX_GSERX_REFCLK_SEL(qlm));
4191                         refclk_sel.s.pcie_refclk125 = 1;
4192                         csr_wr_node(node, CVMX_GSERX_REFCLK_SEL(qlm), refclk_sel.u64);
4193                         if (gen3 == 0) /* Gen1 mode */
4194                                 lane_mode = R_2_5G_REFCLK125;
4195                         else if (gen3 == 1) /* Gen2 mode */
4196                                 lane_mode = R_5G_REFCLK125;
4197                         else
4198                                 lane_mode = R_8G_REFCLK125;
4199                 } else {
4200                         printf("Invalid reference clock for PCIe on QLM%d\n", qlm);
4201                         return -1;
4202                 }
4203
4204                 switch (qlm) {
4205                 case 0: /* Either x4 or x8 based on PEM0 */
4206                 {
4207                         cvmx_rst_soft_prstx_t rst_prst;
4208
4209                         rst_prst.u64 = csr_rd_node(node, CVMX_RST_SOFT_PRSTX(0));
4210                         rst_prst.s.soft_prst = rc;
4211                         csr_wr_node(node, CVMX_RST_SOFT_PRSTX(0), rst_prst.u64);
4212                         __setup_pem_reset(node, 0, !rc);
4213
4214                         pemx_cfg.u64 = csr_rd_node(node, CVMX_PEMX_CFG(0));
4215                         pemx_cfg.cn78xx.lanes8 = (mode == CVMX_QLM_MODE_PCIE_1X8);
4216                         pemx_cfg.cn78xx.hostmd = rc;
4217                         pemx_cfg.cn78xx.md = gen3;
4218                         csr_wr_node(node, CVMX_PEMX_CFG(0), pemx_cfg.u64);
4219                         /* x8 mode waits for QLM1 setup before turning on the PEM */
4220                         if (mode == CVMX_QLM_MODE_PCIE) {
4221                                 pemx_on.u64 = csr_rd_node(node, CVMX_PEMX_ON(0));
4222                                 pemx_on.s.pemon = 1;
4223                                 csr_wr_node(node, CVMX_PEMX_ON(0), pemx_on.u64);
4224                         }
4225                         break;
4226                 }
4227                 case 1: /* Either PEM0 x8 or PEM1 x4 */
4228                 {
4229                         if (mode == CVMX_QLM_MODE_PCIE) {
4230                                 cvmx_rst_soft_prstx_t rst_prst;
4231                                 cvmx_pemx_cfg_t pemx_cfg;
4232
4233                                 rst_prst.u64 = csr_rd_node(node, CVMX_RST_SOFT_PRSTX(1));
4234                                 rst_prst.s.soft_prst = rc;
4235                                 csr_wr_node(node, CVMX_RST_SOFT_PRSTX(1), rst_prst.u64);
4236                                 __setup_pem_reset(node, 1, !rc);
4237
4238                                 pemx_cfg.u64 = csr_rd_node(node, CVMX_PEMX_CFG(1));
4239                                 pemx_cfg.cn78xx.lanes8 = 0;
4240                                 pemx_cfg.cn78xx.hostmd = rc;
4241                                 pemx_cfg.cn78xx.md = gen3;
4242                                 csr_wr_node(node, CVMX_PEMX_CFG(1), pemx_cfg.u64);
4243
4244                                 pemx_on.u64 = csr_rd_node(node, CVMX_PEMX_ON(1));
4245                                 pemx_on.s.pemon = 1;
4246                                 csr_wr_node(node, CVMX_PEMX_ON(1), pemx_on.u64);
4247                         } else {
4248                                 pemx_on.u64 = csr_rd_node(node, CVMX_PEMX_ON(0));
4249                                 pemx_on.s.pemon = 1;
4250                                 csr_wr_node(node, CVMX_PEMX_ON(0), pemx_on.u64);
4251                         }
4252                         break;
4253                 }
4254                 case 2: /* Either PEM2 x4 or PEM2 x8 */
4255                 {
4256                         cvmx_rst_soft_prstx_t rst_prst;
4257
4258                         rst_prst.u64 = csr_rd_node(node, CVMX_RST_SOFT_PRSTX(2));
4259                         rst_prst.s.soft_prst = rc;
4260                         csr_wr_node(node, CVMX_RST_SOFT_PRSTX(2), rst_prst.u64);
4261                         __setup_pem_reset(node, 2, !rc);
4262
4263                         pemx_cfg.u64 = csr_rd_node(node, CVMX_PEMX_CFG(2));
4264                         pemx_cfg.cn78xx.lanes8 = (mode == CVMX_QLM_MODE_PCIE_1X8);
4265                         pemx_cfg.cn78xx.hostmd = rc;
4266                         pemx_cfg.cn78xx.md = gen3;
4267                         csr_wr_node(node, CVMX_PEMX_CFG(2), pemx_cfg.u64);
4268                         /* x8 mode waits for QLM3 setup before turning on the PEM */
4269                         if (mode == CVMX_QLM_MODE_PCIE) {
4270                                 pemx_on.u64 = csr_rd_node(node, CVMX_PEMX_ON(2));
4271                                 pemx_on.s.pemon = 1;
4272                                 csr_wr_node(node, CVMX_PEMX_ON(2), pemx_on.u64);
4273                         }
4274                         break;
4275                 }
4276                 case 3: /* Either PEM2 x8 or PEM3 x4 */
4277                 {
4278                         pemx_cfg.u64 = csr_rd_node(node, CVMX_PEMX_CFG(2));
4279                         if (pemx_cfg.cn78xx.lanes8) {
4280                                 /* Last 4 lanes of PEM2 */
4281                                 /* PEMX_CFG already setup */
4282                                 pemx_on.u64 = csr_rd_node(node, CVMX_PEMX_ON(2));
4283                                 pemx_on.s.pemon = 1;
4284                                 csr_wr_node(node, CVMX_PEMX_ON(2), pemx_on.u64);
4285                         }
4286                         /* Check if PEM3 uses QLM3 and in x4 lane mode */
4287                         if (mode == CVMX_QLM_MODE_PCIE) {
4288                                 cvmx_rst_soft_prstx_t rst_prst;
4289
4290                                 rst_prst.u64 = csr_rd_node(node, CVMX_RST_SOFT_PRSTX(3));
4291                                 rst_prst.s.soft_prst = rc;
4292                                 csr_wr_node(node, CVMX_RST_SOFT_PRSTX(3), rst_prst.u64);
4293                                 __setup_pem_reset(node, 3, !rc);
4294
4295                                 pemx_cfg.u64 = csr_rd_node(node, CVMX_PEMX_CFG(3));
4296                                 pemx_cfg.cn78xx.lanes8 = 0;
4297                                 pemx_cfg.cn78xx.hostmd = rc;
4298                                 pemx_cfg.cn78xx.md = gen3;
4299                                 csr_wr_node(node, CVMX_PEMX_CFG(3), pemx_cfg.u64);
4300
4301                                 pemx_on.u64 = csr_rd_node(node, CVMX_PEMX_ON(3));
4302                                 pemx_on.s.pemon = 1;
4303                                 csr_wr_node(node, CVMX_PEMX_ON(3), pemx_on.u64);
4304                         }
4305                         break;
4306                 }
4307                 case 4: /* Either PEM3 x4 or PEM3 x8 */
4308                 {
4309                         if (mode == CVMX_QLM_MODE_PCIE_1X8) {
4310                                 /* Last 4 lanes of PEM3 */
4311                                 /* PEMX_CFG already setup */
4312                                 pemx_on.u64 = csr_rd_node(node, CVMX_PEMX_ON(3));
4313                                 pemx_on.s.pemon = 1;
4314                                 csr_wr_node(node, CVMX_PEMX_ON(3), pemx_on.u64);
4315                         } else {
4316                                 /* 4 lanes of PEM3 */
4317                                 cvmx_pemx_qlm_t pemx_qlm;
4318                                 cvmx_rst_soft_prstx_t rst_prst;
4319
4320                                 rst_prst.u64 = csr_rd_node(node, CVMX_RST_SOFT_PRSTX(3));
4321                                 rst_prst.s.soft_prst = rc;
4322                                 csr_wr_node(node, CVMX_RST_SOFT_PRSTX(3), rst_prst.u64);
4323                                 __setup_pem_reset(node, 3, !rc);
4324
4325                                 pemx_cfg.u64 = csr_rd_node(node, CVMX_PEMX_CFG(3));
4326                                 pemx_cfg.cn78xx.lanes8 = 0;
4327                                 pemx_cfg.cn78xx.hostmd = rc;
4328                                 pemx_cfg.cn78xx.md = gen3;
4329                                 csr_wr_node(node, CVMX_PEMX_CFG(3), pemx_cfg.u64);
4330                                 /* PEM3 is on QLM4 */
4331                                 pemx_qlm.u64 = csr_rd_node(node, CVMX_PEMX_QLM(3));
4332                                 pemx_qlm.cn78xx.pem3qlm = 1;
4333                                 csr_wr_node(node, CVMX_PEMX_QLM(3), pemx_qlm.u64);
4334                                 pemx_on.u64 = csr_rd_node(node, CVMX_PEMX_ON(3));
4335                                 pemx_on.s.pemon = 1;
4336                                 csr_wr_node(node, CVMX_PEMX_ON(3), pemx_on.u64);
4337                         }
4338                         break;
4339                 }
4340                 default:
4341                         break;
4342                 }
4343                 break;
4344         }
4345         case CVMX_QLM_MODE_ILK:
4346                 is_ilk = 1;
4347                 lane_mode = __get_lane_mode_for_speed_and_ref_clk(ref_clk_sel, baud_mhz, &alt_pll);
4348                 if (lane_mode == -1)
4349                         return -1;
4350                 /* FIXME: Set lane_mode for other speeds */
4351                 break;
4352         case CVMX_QLM_MODE_SGMII:
4353                 is_bgx = 1;
4354                 lmac_type = 0;
4355                 lane_to_sds = 1;
4356                 num_ports = 4;
4357                 lane_mode = __get_lane_mode_for_speed_and_ref_clk(ref_clk_sel, baud_mhz, &alt_pll);
4358                 debug("%s: SGMII lane mode: %d, alternate PLL: %s\n", __func__, lane_mode,
4359                       alt_pll ? "true" : "false");
4360                 if (lane_mode == -1)
4361                         return -1;
4362                 break;
4363         case CVMX_QLM_MODE_XAUI:
4364                 is_bgx = 5;
4365                 lmac_type = 1;
4366                 lane_to_sds = 0xe4;
4367                 num_ports = 1;
4368                 lane_mode = __get_lane_mode_for_speed_and_ref_clk(ref_clk_sel, baud_mhz, &alt_pll);
4369                 debug("%s: XAUI lane mode: %d\n", __func__, lane_mode);
4370                 if (lane_mode == -1)
4371                         return -1;
4372                 break;
4373         case CVMX_QLM_MODE_RXAUI:
4374                 is_bgx = 3;
4375                 lmac_type = 2;
4376                 lane_to_sds = 0;
4377                 num_ports = 2;
4378                 debug("%s: RXAUI lane mode: %d\n", __func__, lane_mode);
4379                 lane_mode = __get_lane_mode_for_speed_and_ref_clk(ref_clk_sel, baud_mhz, &alt_pll);
4380                 if (lane_mode == -1)
4381                         return -1;
4382                 break;
4383         case CVMX_QLM_MODE_XFI: /* 10GR_4X1 */
4384         case CVMX_QLM_MODE_10G_KR:
4385                 is_bgx = 1;
4386                 lmac_type = 3;
4387                 lane_to_sds = 1;
4388                 num_ports = 4;
4389                 lane_mode = __get_lane_mode_for_speed_and_ref_clk(ref_clk_sel, baud_mhz, &alt_pll);
4390                 debug("%s: XFI/10G_KR lane mode: %d\n", __func__, lane_mode);
4391                 if (lane_mode == -1)
4392                         return -1;
4393                 break;
4394         case CVMX_QLM_MODE_XLAUI: /* 40GR4_1X4 */
4395         case CVMX_QLM_MODE_40G_KR4:
4396                 is_bgx = 5;
4397                 lmac_type = 4;
4398                 lane_to_sds = 0xe4;
4399                 num_ports = 1;
4400                 lane_mode = __get_lane_mode_for_speed_and_ref_clk(ref_clk_sel, baud_mhz, &alt_pll);
4401                 debug("%s: XLAUI/40G_KR4 lane mode: %d\n", __func__, lane_mode);
4402                 if (lane_mode == -1)
4403                         return -1;
4404                 break;
4405         case CVMX_QLM_MODE_DISABLED:
4406                 /* Power down the QLM */
4407                 phy_ctl.u64 = csr_rd_node(node, CVMX_GSERX_PHY_CTL(qlm));
4408                 phy_ctl.s.phy_pd = 1;
4409                 phy_ctl.s.phy_reset = 1;
4410                 csr_wr_node(node, CVMX_GSERX_PHY_CTL(qlm), phy_ctl.u64);
4411                 /* Disable all modes */
4412                 csr_wr_node(node, CVMX_GSERX_CFG(qlm), 0);
4413                 /* Do nothing */
4414                 return 0;
4415         default:
4416                 break;
4417         }
4418
4419         if (alt_pll) {
4420                 debug("%s: alternate PLL settings used for node %d, qlm %d, lane mode %d, reference clock %d\n",
4421                       __func__, node, qlm, lane_mode, ref_clk_sel);
4422                 if (__set_qlm_ref_clk_cn78xx(node, qlm, lane_mode, ref_clk_sel)) {
4423                         printf("%s: Error: reference clock %d is not supported for node %d, qlm %d\n",
4424                                __func__, ref_clk_sel, node, qlm);
4425                         return -1;
4426                 }
4427         }
4428
4429         /* Power up PHY, but keep it in reset */
4430         phy_ctl.u64 = csr_rd_node(node, CVMX_GSERX_PHY_CTL(qlm));
4431         phy_ctl.s.phy_pd = 0;
4432         phy_ctl.s.phy_reset = 1;
4433         csr_wr_node(node, CVMX_GSERX_PHY_CTL(qlm), phy_ctl.u64);
4434
4435         /* Errata GSER-20788: GSER(0..13)_CFG[BGX_QUAD]=1 is broken. Force the
4436          * BGX_QUAD bit to be clear for CN78XX pass 1.x
4437          */
4438         if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X))
4439                 is_bgx &= 3;
4440
4441         /* Set GSER for the interface mode */
4442         cfg.u64 = csr_rd_node(node, CVMX_GSERX_CFG(qlm));
4443         cfg.s.ila = is_ilk;
4444         cfg.s.bgx = is_bgx & 1;
4445         cfg.s.bgx_quad = (is_bgx >> 2) & 1;
4446         cfg.s.bgx_dual = (is_bgx >> 1) & 1;
4447         cfg.s.pcie = is_pcie;
4448         csr_wr_node(node, CVMX_GSERX_CFG(qlm), cfg.u64);
4449
4450         /* Lane mode */
4451         lmode.u64 = csr_rd_node(node, CVMX_GSERX_LANE_MODE(qlm));
4452         lmode.s.lmode = lane_mode;
4453         csr_wr_node(node, CVMX_GSERX_LANE_MODE(qlm), lmode.u64);
4454
4455         /* BGX0-1 can connect to QLM0-1 or QLM 2-3. Program the select bit if we're
4456          * one of these QLMs and we're using BGX
4457          */
4458         if (qlm < 4 && is_bgx) {
4459                 int bgx = qlm & 1;
4460                 int use_upper = (qlm >> 1) & 1;
4461                 cvmx_bgxx_cmr_global_config_t global_cfg;
4462
4463                 global_cfg.u64 = csr_rd_node(node, CVMX_BGXX_CMR_GLOBAL_CONFIG(bgx));
4464                 global_cfg.s.pmux_sds_sel = use_upper;
4465                 csr_wr_node(node, CVMX_BGXX_CMR_GLOBAL_CONFIG(bgx), global_cfg.u64);
4466         }
4467
4468         /* Bring phy out of reset */
4469         phy_ctl.u64 = csr_rd_node(node, CVMX_GSERX_PHY_CTL(qlm));
4470         phy_ctl.s.phy_reset = 0;
4471         csr_wr_node(node, CVMX_GSERX_PHY_CTL(qlm), phy_ctl.u64);
4472         csr_rd_node(node, CVMX_GSERX_PHY_CTL(qlm));
4473
4474         /*
4475          * Wait 250 ns until the management interface is ready to accept
4476          * read/write commands.
4477          */
4478         udelay(1);
4479
4480         if (is_bgx) {
4481                 int bgx = (qlm < 2) ? qlm : qlm - 2;
4482                 cvmx_bgxx_cmrx_config_t cmr_config;
4483                 int index;
4484
4485                 for (index = 0; index < num_ports; index++) {
4486                         cmr_config.u64 = csr_rd_node(node, CVMX_BGXX_CMRX_CONFIG(index, bgx));
4487                         cmr_config.s.enable = 0;
4488                         cmr_config.s.data_pkt_tx_en = 0;
4489                         cmr_config.s.data_pkt_rx_en = 0;
4490                         cmr_config.s.lmac_type = lmac_type;
4491                         cmr_config.s.lane_to_sds = ((lane_to_sds == 1) ?
4492                                                     index : ((lane_to_sds == 0) ?
4493                                                              (index ? 0xe : 4) :
4494                                                              lane_to_sds));
4495                         csr_wr_node(node, CVMX_BGXX_CMRX_CONFIG(index, bgx), cmr_config.u64);
4496                 }
4497                 csr_wr_node(node, CVMX_BGXX_CMR_TX_LMACS(bgx), num_ports);
4498                 csr_wr_node(node, CVMX_BGXX_CMR_RX_LMACS(bgx), num_ports);
4499
4500                 /* Enable/disable training for 10G_KR/40G_KR4/XFI/XLAUI modes */
4501                 for (index = 0; index < num_ports; index++) {
4502                         cvmx_bgxx_spux_br_pmd_control_t spu_pmd_control;
4503
4504                         spu_pmd_control.u64 =
4505                                 csr_rd_node(node, CVMX_BGXX_SPUX_BR_PMD_CONTROL(index, bgx));
4506
4507                         if (mode == CVMX_QLM_MODE_10G_KR || mode == CVMX_QLM_MODE_40G_KR4)
4508                                 spu_pmd_control.s.train_en = 1;
4509                         else if (mode == CVMX_QLM_MODE_XFI || mode == CVMX_QLM_MODE_XLAUI)
4510                                 spu_pmd_control.s.train_en = 0;
4511
4512                         csr_wr_node(node, CVMX_BGXX_SPUX_BR_PMD_CONTROL(index, bgx),
4513                                     spu_pmd_control.u64);
4514                 }
4515         }
4516
4517         /* Configure the gser pll */
4518         if (!is_pcie)
4519                 __qlm_setup_pll_cn78xx(node, qlm);
4520
4521         /* Wait for reset to complete and the PLL to lock */
4522         if (CVMX_WAIT_FOR_FIELD64_NODE(node, CVMX_GSERX_PLL_STAT(qlm),
4523                                        cvmx_gserx_pll_stat_t,
4524                                        pll_lock, ==, 1, 10000)) {
4525                 printf("%d:QLM%d: Timeout waiting for GSERX_PLL_STAT[pll_lock]\n",
4526                        node, qlm);
4527                 return -1;
4528         }
4529
4530         /* Perform PCIe errata workaround */
4531         if (is_pcie)
4532                 __cvmx_qlm_pcie_errata_cn78xx(node, qlm);
4533         else
4534                 __qlm_init_errata_20844(node, qlm);
4535
4536         /* Wait for reset to complete and the PLL to lock */
4537         /* PCIe mode doesn't become ready until the PEM block attempts to bring
4538          * the interface up. Skip this check for PCIe
4539          */
4540         if (!is_pcie && CVMX_WAIT_FOR_FIELD64_NODE(node, CVMX_GSERX_QLM_STAT(qlm),
4541                                                    cvmx_gserx_qlm_stat_t, rst_rdy,
4542                                                    ==, 1, 10000)) {
4543                 printf("%d:QLM%d: Timeout waiting for GSERX_QLM_STAT[rst_rdy]\n",
4544                        node, qlm);
4545                 return -1;
4546         }
4547
4548         /* Errata GSER-26150: 10G PHY PLL Temperature Failure */
4549         /* This workaround must be completed after the final deassertion of
4550          * GSERx_PHY_CTL[PHY_RESET].
4551          * Apply the workaround to 10.3125Gbps and 8Gbps only.
4552          */
4553         if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X) &&
4554             (baud_mhz == 103125 || (is_pcie && gen3 == 2)))
4555                 __qlm_errata_gser_26150(0, qlm, is_pcie);
4556
4557         /* Errata GSER-26636: 10G-KR/40G-KR - Inverted Tx Coefficient Direction
4558          * Change. Applied to all 10G standards (required for KR) but also
4559          * applied to other standards in case software training is used
4560          */
4561         if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X) && baud_mhz == 103125)
4562                 __qlm_kr_inc_dec_gser26636(node, qlm);
4563
4564         /* Errata GSER-25992: RX EQ Default Settings Update (CTLE Bias) */
4565         /* This workaround will only be applied to Pass 1.x */
4566         /* It will also only be applied if the SERDES data-rate is 10G */
4567         /* or if PCIe Gen3 (gen3=2 is PCIe Gen3) */
4568         if (OCTEON_IS_MODEL(OCTEON_CN78XX_PASS1_X) &&
4569             (baud_mhz == 103125 || (is_pcie && gen3 == 2)))
4570                 cvmx_qlm_gser_errata_25992(node, qlm);
4571
4572         /* Errata GSER-27140: Updating the RX EQ settings due to temperature
4573          * drift sensitivities
4574          */
4575         /* This workaround will also only be applied if the SERDES data-rate is 10G */
4576         if (baud_mhz == 103125)
4577                 __qlm_rx_eq_temp_gser27140(node, qlm);
4578
4579         /* Reduce the voltage amplitude coming from Marvell PHY and also change
4580          * DFE threshold settings for RXAUI interface
4581          */
4582         if (is_bgx && mode == CVMX_QLM_MODE_RXAUI) {
4583                 int l;
4584
4585                 for (l = 0; l < 4; l++) {
4586                         cvmx_gserx_lanex_rx_cfg_4_t cfg4;
4587                         cvmx_gserx_lanex_tx_cfg_0_t cfg0;
4588                         /* Change the Q/QB error sampler 0 threshold from 0xD to 0xF */
4589                         cfg4.u64 = csr_rd_node(node, CVMX_GSERX_LANEX_RX_CFG_4(l, qlm));
4590                         cfg4.s.cfg_rx_errdet_ctrl = 0xcf6f;
4591                         csr_wr_node(node, CVMX_GSERX_LANEX_RX_CFG_4(l, qlm), cfg4.u64);
4592                         /* Reduce the voltage swing to roughly 460mV */
4593                         cfg0.u64 = csr_rd_node(node, CVMX_GSERX_LANEX_TX_CFG_0(l, qlm));
4594                         cfg0.s.cfg_tx_swing = 0x12;
4595                         csr_wr_node(node, CVMX_GSERX_LANEX_TX_CFG_0(l, qlm), cfg0.u64);
4596                 }
4597         }
4598
4599         return 0;
4600 }
4601
4602 static int __is_qlm_valid_bgx_cn73xx(int qlm)
4603 {
4604         if (qlm == 2 || qlm == 3 || qlm == 5 || qlm == 6)
4605                 return 0;
4606         return 1;
4607 }
4608
4609 /**
4610  * Configure QLM/DLM speed and mode for cn73xx.
4611  *
4612  * @param qlm     The QLM to configure
4613  * @param baud_mhz   The speed the QLM needs to be configured in Mhz.
4614  * @param mode    The QLM to be configured as SGMII/XAUI/PCIe.
4615  * @param rc      Only used for PCIe, rc = 1 for root complex mode, 0 for EP mode.
4616  * @param gen3    Only used for PCIe
4617  *                      gen3 = 2 GEN3 mode
4618  *                      gen3 = 1 GEN2 mode
4619  *                      gen3 = 0 GEN1 mode
4620  *
4621  * @param ref_clk_sel   The reference-clock selection to use to configure QLM
4622  *                      0 = REF_100MHZ
4623  *                      1 = REF_125MHZ
4624  *                      2 = REF_156MHZ
4625  *                      3 = REF_161MHZ
4626  *
4627  * @param ref_clk_input  The reference-clock input to use to configure QLM
4628  *                       0 = QLM/DLM reference clock input
4629  *                       1 = common reference clock input 0
4630  *                       2 = common reference clock input 1
4631  *
4632  * @return       Return 0 on success or -1.
4633  */
4634 static int octeon_configure_qlm_cn73xx(int qlm, int baud_mhz, int mode, int rc, int gen3,
4635                                        int ref_clk_sel, int ref_clk_input)
4636 {
4637         cvmx_gserx_phy_ctl_t phy_ctl;
4638         cvmx_gserx_lane_mode_t lmode;
4639         cvmx_gserx_cfg_t cfg;
4640         cvmx_gserx_refclk_sel_t refclk_sel;
4641         int is_pcie = 0;
4642         int is_bgx = 0;
4643         int lane_mode = 0;
4644         short lmac_type[4] = { 0 };
4645         short sds_lane[4] = { 0 };
4646         bool alt_pll = false;
4647         int enable_training = 0;
4648         int additional_lmacs = 0;
4649
4650         debug("%s(qlm: %d, baud_mhz: %d, mode: %d, rc: %d, gen3: %d, ref_clk_sel: %d, ref_clk_input: %d\n",
4651               __func__, qlm, baud_mhz, mode, rc, gen3, ref_clk_sel, ref_clk_input);
4652
4653         /* Don't configure QLM4 if it is not in SATA mode */
4654         if (qlm == 4) {
4655                 if (mode == CVMX_QLM_MODE_SATA_2X1)
4656                         return __setup_sata(qlm, baud_mhz, ref_clk_sel, ref_clk_input);
4657
4658                 printf("Invalid mode for QLM4\n");
4659                 return 0;
4660         }
4661
4662         cfg.u64 = csr_rd(CVMX_GSERX_CFG(qlm));
4663
4664         /* Errata PEM-31375 PEM RSL accesses to PCLK registers can timeout
4665          * during speed change. Change SLI_WINDOW_CTL[time] to 525us
4666          */
4667         __set_sli_window_ctl_errata_31375(0);
4668         /* If PEM is in EP, no need to do anything */
4669         if (cfg.s.pcie && rc == 0 &&
4670             (mode == CVMX_QLM_MODE_PCIE || mode == CVMX_QLM_MODE_PCIE_1X8 ||
4671              mode == CVMX_QLM_MODE_PCIE_1X2)) {
4672                 debug("%s: qlm %d is in PCIe endpoint mode, returning\n", __func__, qlm);
4673                 return 0;
4674         }
4675
4676         /* Set the reference clock to use */
4677         refclk_sel.u64 = 0;
4678         if (ref_clk_input == 0) { /* External ref clock */
4679                 refclk_sel.s.com_clk_sel = 0;
4680                 refclk_sel.s.use_com1 = 0;
4681         } else if (ref_clk_input == 1) {
4682                 refclk_sel.s.com_clk_sel = 1;
4683                 refclk_sel.s.use_com1 = 0;
4684         } else {
4685                 refclk_sel.s.com_clk_sel = 1;
4686                 refclk_sel.s.use_com1 = 1;
4687         }
4688
4689         csr_wr(CVMX_GSERX_REFCLK_SEL(qlm), refclk_sel.u64);
4690
4691         /* Reset the QLM after changing the reference clock */
4692         phy_ctl.u64 = csr_rd(CVMX_GSERX_PHY_CTL(qlm));
4693         phy_ctl.s.phy_reset = 1;
4694         phy_ctl.s.phy_pd = 1;
4695         csr_wr(CVMX_GSERX_PHY_CTL(qlm), phy_ctl.u64);
4696
4697         udelay(1000);
4698
4699         /* Check if QLM is a valid BGX interface */
4700         if (mode != CVMX_QLM_MODE_PCIE && mode != CVMX_QLM_MODE_PCIE_1X2 &&
4701             mode != CVMX_QLM_MODE_PCIE_1X8) {
4702                 if (__is_qlm_valid_bgx_cn73xx(qlm))
4703                         return -1;
4704         }
4705
4706         switch (mode) {
4707         case CVMX_QLM_MODE_PCIE:
4708         case CVMX_QLM_MODE_PCIE_1X2:
4709         case CVMX_QLM_MODE_PCIE_1X8: {
4710                 cvmx_pemx_cfg_t pemx_cfg;
4711                 cvmx_pemx_on_t pemx_on;
4712                 cvmx_pemx_qlm_t pemx_qlm;
4713                 cvmx_rst_soft_prstx_t rst_prst;
4714                 int port = 0;
4715
4716                 is_pcie = 1;
4717
4718                 if (qlm < 5 && mode == CVMX_QLM_MODE_PCIE_1X2) {
4719                         printf("Invalid PCIe mode(%d) for QLM%d\n", mode, qlm);
4720                         return -1;
4721                 }
4722
4723                 if (ref_clk_sel == 0) {
4724                         refclk_sel.u64 = csr_rd(CVMX_GSERX_REFCLK_SEL(qlm));
4725                         refclk_sel.s.pcie_refclk125 = 0;
4726                         csr_wr(CVMX_GSERX_REFCLK_SEL(qlm), refclk_sel.u64);
4727                         if (gen3 == 0) /* Gen1 mode */
4728                                 lane_mode = R_2_5G_REFCLK100;
4729                         else if (gen3 == 1) /* Gen2 mode */
4730                                 lane_mode = R_5G_REFCLK100;
4731                         else
4732                                 lane_mode = R_8G_REFCLK100;
4733                 } else if (ref_clk_sel == 1) {
4734                         refclk_sel.u64 = csr_rd(CVMX_GSERX_REFCLK_SEL(qlm));
4735                         refclk_sel.s.pcie_refclk125 = 1;
4736                         csr_wr(CVMX_GSERX_REFCLK_SEL(qlm), refclk_sel.u64);
4737                         if (gen3 == 0) /* Gen1 mode */
4738                                 lane_mode = R_2_5G_REFCLK125;
4739                         else if (gen3 == 1) /* Gen2 mode */
4740                                 lane_mode = R_5G_REFCLK125;
4741                         else
4742                                 lane_mode = R_8G_REFCLK125;
4743                 } else {
4744                         printf("Invalid reference clock for PCIe on QLM%d\n", qlm);
4745                         return -1;
4746                 }
4747
4748                 switch (qlm) {
4749                 case 0: /* Either x4 or x8 based on PEM0 */
4750                         rst_prst.u64 = csr_rd(CVMX_RST_SOFT_PRSTX(0));
4751                         rst_prst.s.soft_prst = rc;
4752                         csr_wr(CVMX_RST_SOFT_PRSTX(0), rst_prst.u64);
4753                         __setup_pem_reset(0, 0, !rc);
4754
4755                         pemx_cfg.u64 = csr_rd(CVMX_PEMX_CFG(0));
4756                         pemx_cfg.cn78xx.lanes8 = (mode == CVMX_QLM_MODE_PCIE_1X8);
4757                         pemx_cfg.cn78xx.hostmd = rc;
4758                         pemx_cfg.cn78xx.md = gen3;
4759                         csr_wr(CVMX_PEMX_CFG(0), pemx_cfg.u64);
4760                         /* x8 mode waits for QLM1 setup before turning on the PEM */
4761                         if (mode == CVMX_QLM_MODE_PCIE) {
4762                                 pemx_on.u64 = csr_rd(CVMX_PEMX_ON(0));
4763                                 pemx_on.s.pemon = 1;
4764                                 csr_wr(CVMX_PEMX_ON(0), pemx_on.u64);
4765                         }
4766                         break;
4767                 case 1: /* Either PEM0 x8 or PEM1 x4 */
4768                         if (mode == CVMX_QLM_MODE_PCIE) {
4769                                 rst_prst.u64 = csr_rd(CVMX_RST_SOFT_PRSTX(1));
4770                                 rst_prst.s.soft_prst = rc;
4771                                 csr_wr(CVMX_RST_SOFT_PRSTX(1), rst_prst.u64);
4772                                 __setup_pem_reset(0, 1, !rc);
4773
4774                                 pemx_cfg.u64 = csr_rd(CVMX_PEMX_CFG(1));
4775                                 pemx_cfg.cn78xx.lanes8 = 0;
4776                                 pemx_cfg.cn78xx.hostmd = rc;
4777                                 pemx_cfg.cn78xx.md = gen3;
4778                                 csr_wr(CVMX_PEMX_CFG(1), pemx_cfg.u64);
4779
4780                                 pemx_on.u64 = csr_rd(CVMX_PEMX_ON(1));
4781                                 pemx_on.s.pemon = 1;
4782                                 csr_wr(CVMX_PEMX_ON(1), pemx_on.u64);
4783                         } else { /* x8 mode */
4784                                 pemx_on.u64 = csr_rd(CVMX_PEMX_ON(0));
4785                                 pemx_on.s.pemon = 1;
4786                                 csr_wr(CVMX_PEMX_ON(0), pemx_on.u64);
4787                         }
4788                         break;
4789                 case 2: /* Either PEM2 x4 or PEM2 x8 or BGX0 */
4790                 {
4791                         pemx_qlm.u64 = csr_rd(CVMX_PEMX_QLM(2));
4792                         pemx_qlm.cn73xx.pemdlmsel = 0;
4793                         csr_wr(CVMX_PEMX_QLM(2), pemx_qlm.u64);
4794
4795                         rst_prst.u64 = csr_rd(CVMX_RST_SOFT_PRSTX(2));
4796                         rst_prst.s.soft_prst = rc;
4797                         csr_wr(CVMX_RST_SOFT_PRSTX(2), rst_prst.u64);
4798                         __setup_pem_reset(0, 2, !rc);
4799
4800                         pemx_cfg.u64 = csr_rd(CVMX_PEMX_CFG(2));
4801                         pemx_cfg.cn78xx.lanes8 = (mode == CVMX_QLM_MODE_PCIE_1X8);
4802                         pemx_cfg.cn78xx.hostmd = rc;
4803                         pemx_cfg.cn78xx.md = gen3;
4804                         csr_wr(CVMX_PEMX_CFG(2), pemx_cfg.u64);
4805                         /* x8 mode waits for QLM3 setup before turning on the PEM */
4806                         if (mode == CVMX_QLM_MODE_PCIE) {
4807                                 pemx_on.u64 = csr_rd(CVMX_PEMX_ON(2));
4808                                 pemx_on.s.pemon = 1;
4809                                 csr_wr(CVMX_PEMX_ON(2), pemx_on.u64);
4810                         }
4811                         break;
4812                 }
4813                 case 3: /* Either PEM2 x8 or PEM3 x4 or BGX1 */
4814                         /* PEM2/PEM3 are configured to use QLM2/3 */
4815                         pemx_cfg.u64 = csr_rd(CVMX_PEMX_CFG(2));
4816                         if (pemx_cfg.cn78xx.lanes8) {
4817                                 /* Last 4 lanes of PEM2 */
4818                                 /* PEMX_CFG already setup */
4819                                 pemx_on.u64 = csr_rd(CVMX_PEMX_ON(2));
4820                                 pemx_on.s.pemon = 1;
4821                                 csr_wr(CVMX_PEMX_ON(2), pemx_on.u64);
4822                         }
4823                         /* Check if PEM3 uses QLM3 and in x4 lane mode */
4824                         if (mode == CVMX_QLM_MODE_PCIE) {
4825                                 pemx_qlm.u64 = csr_rd(CVMX_PEMX_QLM(3));
4826                                 pemx_qlm.cn73xx.pemdlmsel = 0;
4827                                 csr_wr(CVMX_PEMX_QLM(3), pemx_qlm.u64);
4828
4829                                 rst_prst.u64 = csr_rd(CVMX_RST_SOFT_PRSTX(3));
4830                                 rst_prst.s.soft_prst = rc;
4831                                 csr_wr(CVMX_RST_SOFT_PRSTX(3), rst_prst.u64);
4832                                 __setup_pem_reset(0, 3, !rc);
4833
4834                                 pemx_cfg.u64 = csr_rd(CVMX_PEMX_CFG(3));
4835                                 pemx_cfg.cn78xx.lanes8 = 0;
4836                                 pemx_cfg.cn78xx.hostmd = rc;
4837                                 pemx_cfg.cn78xx.md = gen3;
4838                                 csr_wr(CVMX_PEMX_CFG(3), pemx_cfg.u64);
4839
4840                                 pemx_on.u64 = csr_rd(CVMX_PEMX_ON(3));
4841                                 pemx_on.s.pemon = 1;
4842                                 csr_wr(CVMX_PEMX_ON(3), pemx_on.u64);
4843                         }
4844                         break;
4845                 case 5: /* PEM2/PEM3 x2 or BGX2 */
4846                 case 6:
4847                         port = (qlm == 5) ? 2 : 3;
4848                         if (mode == CVMX_QLM_MODE_PCIE_1X2) {
4849                                 /* PEM2/PEM3 are configured to use DLM5/6 */
4850                                 pemx_qlm.u64 = csr_rd(CVMX_PEMX_QLM(port));
4851                                 pemx_qlm.cn73xx.pemdlmsel = 1;
4852                                 csr_wr(CVMX_PEMX_QLM(port), pemx_qlm.u64);
4853                                 /* 2 lanes of PEM3 */
4854                                 rst_prst.u64 = csr_rd(CVMX_RST_SOFT_PRSTX(port));
4855                                 rst_prst.s.soft_prst = rc;
4856                                 csr_wr(CVMX_RST_SOFT_PRSTX(port), rst_prst.u64);
4857                                 __setup_pem_reset(0, port, !rc);
4858
4859                                 pemx_cfg.u64 = csr_rd(CVMX_PEMX_CFG(port));
4860                                 pemx_cfg.cn78xx.lanes8 = 0;
4861                                 pemx_cfg.cn78xx.hostmd = rc;
4862                                 pemx_cfg.cn78xx.md = gen3;
4863                                 csr_wr(CVMX_PEMX_CFG(port), pemx_cfg.u64);
4864
4865                                 pemx_on.u64 = csr_rd(CVMX_PEMX_ON(port));
4866                                 pemx_on.s.pemon = 1;
4867                                 csr_wr(CVMX_PEMX_ON(port), pemx_on.u64);
4868                         }
4869                         break;
4870                 default:
4871                         break;
4872                 }
4873                 break;
4874         }
4875         case CVMX_QLM_MODE_SGMII:
4876                 is_bgx = 1;
4877                 lmac_type[0] = 0;
4878                 lmac_type[1] = 0;
4879                 lmac_type[2] = 0;
4880                 lmac_type[3] = 0;
4881                 sds_lane[0] = 0;
4882                 sds_lane[1] = 1;
4883                 sds_lane[2] = 2;
4884                 sds_lane[3] = 3;
4885                 break;
4886         case CVMX_QLM_MODE_SGMII_2X1:
4887                 if (qlm == 5) {
4888                         is_bgx = 1;
4889                         lmac_type[0] = 0;
4890                         lmac_type[1] = 0;
4891                         lmac_type[2] = -1;
4892                         lmac_type[3] = -1;
4893                         sds_lane[0] = 0;
4894                         sds_lane[1] = 1;
4895                 } else if (qlm == 6) {
4896                         is_bgx = 1;
4897                         lmac_type[0] = -1;
4898                         lmac_type[1] = -1;
4899                         lmac_type[2] = 0;
4900                         lmac_type[3] = 0;
4901                         sds_lane[2] = 2;
4902                         sds_lane[3] = 3;
4903                         additional_lmacs = 2;
4904                 }
4905                 break;
4906         case CVMX_QLM_MODE_XAUI:
4907                 is_bgx = 5;
4908                 lmac_type[0] = 1;
4909                 lmac_type[1] = -1;
4910                 lmac_type[2] = -1;
4911                 lmac_type[3] = -1;
4912                 sds_lane[0] = 0xe4;
4913                 break;
4914         case CVMX_QLM_MODE_RXAUI:
4915                 is_bgx = 3;
4916                 lmac_type[0] = 2;
4917                 lmac_type[1] = 2;
4918                 lmac_type[2] = -1;
4919                 lmac_type[3] = -1;
4920                 sds_lane[0] = 0x4;
4921                 sds_lane[1] = 0xe;
4922                 break;
4923         case CVMX_QLM_MODE_RXAUI_1X2:
4924                 if (qlm == 5) {
4925                         is_bgx = 3;
4926                         lmac_type[0] = 2;
4927                         lmac_type[1] = -1;
4928                         lmac_type[2] = -1;
4929                         lmac_type[3] = -1;
4930                         sds_lane[0] = 0x4;
4931                 }
4932                 if (qlm == 6) {
4933                         is_bgx = 3;
4934                         lmac_type[0] = -1;
4935                         lmac_type[1] = -1;
4936                         lmac_type[2] = 2;
4937                         lmac_type[3] = -1;
4938                         sds_lane[2] = 0xe;
4939                         additional_lmacs = 2;
4940                 }
4941                 break;
4942         case CVMX_QLM_MODE_10G_KR:
4943                 enable_training = 1;
4944         case CVMX_QLM_MODE_XFI: /* 10GR_4X1 */
4945                 is_bgx = 1;
4946                 lmac_type[0] = 3;
4947                 lmac_type[1] = 3;
4948                 lmac_type[2] = 3;
4949                 lmac_type[3] = 3;
4950                 sds_lane[0] = 0;
4951                 sds_lane[1] = 1;
4952                 sds_lane[2] = 2;
4953                 sds_lane[3] = 3;
4954                 break;
4955         case CVMX_QLM_MODE_10G_KR_1X2:
4956                 enable_training = 1;
4957         case CVMX_QLM_MODE_XFI_1X2:
4958                 if (qlm == 5) {
4959                         is_bgx = 1;
4960                         lmac_type[0] = 3;
4961                         lmac_type[1] = 3;
4962                         lmac_type[2] = -1;
4963                         lmac_type[3] = -1;
4964                         sds_lane[0] = 0;
4965                         sds_lane[1] = 1;
4966                 } else if (qlm == 6) {
4967                         is_bgx = 1;
4968                         lmac_type[0] = -1;
4969                         lmac_type[1] = -1;
4970                         lmac_type[2] = 3;
4971                         lmac_type[3] = 3;
4972                         sds_lane[2] = 2;
4973                         sds_lane[3] = 3;
4974                         additional_lmacs = 2;
4975                 }
4976                 break;
4977         case CVMX_QLM_MODE_40G_KR4:
4978                 enable_training = 1;
4979         case CVMX_QLM_MODE_XLAUI: /* 40GR4_1X4 */
4980                 is_bgx = 5;
4981                 lmac_type[0] = 4;
4982                 lmac_type[1] = -1;
4983                 lmac_type[2] = -1;
4984                 lmac_type[3] = -1;
4985                 sds_lane[0] = 0xe4;
4986                 break;
4987         case CVMX_QLM_MODE_RGMII_SGMII:
4988                 is_bgx = 1;
4989                 lmac_type[0] = 5;
4990                 lmac_type[1] = 0;
4991                 lmac_type[2] = 0;
4992                 lmac_type[3] = 0;
4993                 sds_lane[0] = 0;
4994                 sds_lane[1] = 1;
4995                 sds_lane[2] = 2;
4996                 sds_lane[3] = 3;
4997                 break;
4998         case CVMX_QLM_MODE_RGMII_SGMII_1X1:
4999                 if (qlm == 5) {
5000                         is_bgx = 1;
5001                         lmac_type[0] = 5;
5002                         lmac_type[1] = 0;
5003                         lmac_type[2] = -1;
5004                         lmac_type[3] = -1;
5005                         sds_lane[0] = 0;
5006                         sds_lane[1] = 1;
5007                 }
5008                 break;
5009         case CVMX_QLM_MODE_RGMII_SGMII_2X1:
5010                 if (qlm == 6) {
5011                         is_bgx = 1;
5012                         lmac_type[0] = 5;
5013                         lmac_type[1] = -1;
5014                         lmac_type[2] = 0;
5015                         lmac_type[3] = 0;
5016                         sds_lane[0] = 0;
5017                         sds_lane[2] = 0;
5018                         sds_lane[3] = 1;
5019                 }
5020                 break;
5021         case CVMX_QLM_MODE_RGMII_10G_KR:
5022                 enable_training = 1;
5023         case CVMX_QLM_MODE_RGMII_XFI:
5024                 is_bgx = 1;
5025                 lmac_type[0] = 5;
5026                 lmac_type[1] = 3;
5027                 lmac_type[2] = 3;
5028                 lmac_type[3] = 3;
5029                 sds_lane[0] = 0;
5030                 sds_lane[1] = 1;
5031                 sds_lane[2] = 2;
5032                 sds_lane[3] = 3;
5033                 break;
5034         case CVMX_QLM_MODE_RGMII_10G_KR_1X1:
5035                 enable_training = 1;
5036         case CVMX_QLM_MODE_RGMII_XFI_1X1:
5037                 if (qlm == 5) {
5038                         is_bgx = 3;
5039                         lmac_type[0] = 5;
5040                         lmac_type[1] = 3;
5041                         lmac_type[2] = -1;
5042                         lmac_type[3] = -1;
5043                         sds_lane[0] = 0;
5044                         sds_lane[1] = 1;
5045                 }
5046                 break;
5047         case CVMX_QLM_MODE_RGMII_40G_KR4:
5048                 enable_training = 1;
5049         case CVMX_QLM_MODE_RGMII_XLAUI:
5050                 is_bgx = 5;
5051                 lmac_type[0] = 5;
5052                 lmac_type[1] = 4;
5053                 lmac_type[2] = -1;
5054                 lmac_type[3] = -1;
5055                 sds_lane[0] = 0x0;
5056                 sds_lane[1] = 0xe4;
5057                 break;
5058         case CVMX_QLM_MODE_RGMII_RXAUI:
5059                 is_bgx = 3;
5060                 lmac_type[0] = 5;
5061                 lmac_type[1] = 2;
5062                 lmac_type[2] = 2;
5063                 lmac_type[3] = -1;
5064                 sds_lane[0] = 0x0;
5065                 sds_lane[1] = 0x4;
5066                 sds_lane[2] = 0xe;
5067                 break;
5068         case CVMX_QLM_MODE_RGMII_XAUI:
5069                 is_bgx = 5;
5070                 lmac_type[0] = 5;
5071                 lmac_type[1] = 1;
5072                 lmac_type[2] = -1;
5073                 lmac_type[3] = -1;
5074                 sds_lane[0] = 0;
5075                 sds_lane[1] = 0xe4;
5076                 break;
5077         default:
5078                 break;
5079         }
5080
5081         if (is_pcie == 0)
5082                 lane_mode = __get_lane_mode_for_speed_and_ref_clk(ref_clk_sel, baud_mhz, &alt_pll);
5083         debug("%s: %d lane mode: %d, alternate PLL: %s\n", __func__, mode, lane_mode,
5084               alt_pll ? "true" : "false");
5085         if (lane_mode == -1)
5086                 return -1;
5087
5088         if (alt_pll) {
5089                 debug("%s: alternate PLL settings used for qlm %d, lane mode %d, reference clock %d\n",
5090                       __func__, qlm, lane_mode, ref_clk_sel);
5091                 if (__set_qlm_ref_clk_cn78xx(0, qlm, lane_mode, ref_clk_sel)) {
5092                         printf("%s: Error: reference clock %d is not supported for qlm %d, lane mode: 0x%x\n",
5093                                __func__, ref_clk_sel, qlm, lane_mode);
5094                         return -1;
5095                 }
5096         }
5097
5098         /* Power up PHY, but keep it in reset */
5099         phy_ctl.u64 = csr_rd(CVMX_GSERX_PHY_CTL(qlm));
5100         phy_ctl.s.phy_pd = 0;
5101         phy_ctl.s.phy_reset = 1;
5102         csr_wr(CVMX_GSERX_PHY_CTL(qlm), phy_ctl.u64);
5103
5104         /* Set GSER for the interface mode */
5105         cfg.u64 = csr_rd(CVMX_GSERX_CFG(qlm));
5106         cfg.s.bgx = is_bgx & 1;
5107         cfg.s.bgx_quad = (is_bgx >> 2) & 1;
5108         cfg.s.bgx_dual = (is_bgx >> 1) & 1;
5109         cfg.s.pcie = is_pcie;
5110         csr_wr(CVMX_GSERX_CFG(qlm), cfg.u64);
5111
5112         /* Lane mode */
5113         lmode.u64 = csr_rd(CVMX_GSERX_LANE_MODE(qlm));
5114         lmode.s.lmode = lane_mode;
5115         csr_wr(CVMX_GSERX_LANE_MODE(qlm), lmode.u64);
5116
5117         /* Program lmac_type to figure out the type of BGX interface configured */
5118         if (is_bgx) {
5119                 int bgx = (qlm < 4) ? qlm - 2 : 2;
5120                 cvmx_bgxx_cmrx_config_t cmr_config;
5121                 cvmx_bgxx_cmr_rx_lmacs_t rx_lmacs;
5122                 cvmx_bgxx_spux_br_pmd_control_t spu_pmd_control;
5123                 int index, total_lmacs = 0;
5124
5125                 for (index = 0; index < 4; index++) {
5126                         cmr_config.u64 = csr_rd(CVMX_BGXX_CMRX_CONFIG(index, bgx));
5127                         cmr_config.s.enable = 0;
5128                         cmr_config.s.data_pkt_rx_en = 0;
5129                         cmr_config.s.data_pkt_tx_en = 0;
5130                         if (lmac_type[index] != -1) {
5131                                 cmr_config.s.lmac_type = lmac_type[index];
5132                                 cmr_config.s.lane_to_sds = sds_lane[index];
5133                                 total_lmacs++;
5134                                 /* RXAUI takes up 2 lmacs */
5135                                 if (lmac_type[index] == 2)
5136                                         total_lmacs += 1;
5137                         }
5138                         csr_wr(CVMX_BGXX_CMRX_CONFIG(index, bgx), cmr_config.u64);
5139
5140                         /* Errata (TBD) RGMII doesn't turn on clock if its by
5141                          * itself. Force them on
5142                          */
5143                         if (lmac_type[index] == 5) {
5144                                 cvmx_bgxx_cmr_global_config_t global_config;
5145
5146                                 global_config.u64 = csr_rd(CVMX_BGXX_CMR_GLOBAL_CONFIG(bgx));
5147                                 global_config.s.bgx_clk_enable = 1;
5148                                 csr_wr(CVMX_BGXX_CMR_GLOBAL_CONFIG(bgx), global_config.u64);
5149                         }
5150
5151                         /* Enable training for 10G_KR/40G_KR4 modes */
5152                         if (enable_training == 1 &&
5153                             (lmac_type[index] == 3 || lmac_type[index] == 4)) {
5154                                 spu_pmd_control.u64 =
5155                                         csr_rd(CVMX_BGXX_SPUX_BR_PMD_CONTROL(index, bgx));
5156                                 spu_pmd_control.s.train_en = 1;
5157                                 csr_wr(CVMX_BGXX_SPUX_BR_PMD_CONTROL(index, bgx),
5158                                        spu_pmd_control.u64);
5159                         }
5160                 }
5161
5162                 /* Update the total number of lmacs */
5163                 rx_lmacs.u64 = csr_rd(CVMX_BGXX_CMR_RX_LMACS(bgx));
5164                 rx_lmacs.s.lmacs = total_lmacs + additional_lmacs;
5165                 csr_wr(CVMX_BGXX_CMR_RX_LMACS(bgx), rx_lmacs.u64);
5166                 csr_wr(CVMX_BGXX_CMR_TX_LMACS(bgx), rx_lmacs.u64);
5167         }
5168
5169         /* Bring phy out of reset */
5170         phy_ctl.u64 = csr_rd(CVMX_GSERX_PHY_CTL(qlm));
5171         phy_ctl.s.phy_reset = 0;
5172         csr_wr(CVMX_GSERX_PHY_CTL(qlm), phy_ctl.u64);
5173
5174         /*
5175          * Wait 1us until the management interface is ready to accept
5176          * read/write commands.
5177          */
5178         udelay(1);
5179
5180         /* Wait for reset to complete and the PLL to lock */
5181         /* PCIe mode doesn't become ready until the PEM block attempts to bring
5182          * the interface up. Skip this check for PCIe
5183          */
5184         if (!is_pcie && CVMX_WAIT_FOR_FIELD64(CVMX_GSERX_QLM_STAT(qlm),
5185                                               cvmx_gserx_qlm_stat_t,
5186                                               rst_rdy, ==, 1, 10000)) {
5187                 printf("QLM%d: Timeout waiting for GSERX_QLM_STAT[rst_rdy]\n", qlm);
5188                 return -1;
5189         }
5190
5191         /* Configure the gser pll */
5192         if (!is_pcie)
5193                 __qlm_setup_pll_cn78xx(0, qlm);
5194
5195         /* Wait for reset to complete and the PLL to lock */
5196         if (CVMX_WAIT_FOR_FIELD64(CVMX_GSERX_PLL_STAT(qlm), cvmx_gserx_pll_stat_t,
5197                                   pll_lock, ==, 1, 10000)) {
5198                 printf("QLM%d: Timeout waiting for GSERX_PLL_STAT[pll_lock]\n", qlm);
5199                 return -1;
5200         }
5201
5202         /* Errata GSER-26150: 10G PHY PLL Temperature Failure */
5203         /* This workaround must be completed after the final deassertion of
5204          * GSERx_PHY_CTL[PHY_RESET].
5205          * Apply the workaround to 10.3125Gbps and 8Gbps only.
5206          */
5207         if (OCTEON_IS_MODEL(OCTEON_CN73XX_PASS1_0) &&
5208             (baud_mhz == 103125 || (is_pcie && gen3 == 2)))
5209                 __qlm_errata_gser_26150(0, qlm, is_pcie);
5210
5211         /* Errata GSER-26636: 10G-KR/40G-KR - Inverted Tx Coefficient Direction
5212          * Change. Applied to all 10G standards (required for KR) but also
5213          * applied to other standards in case software training is used
5214          */
5215         if (baud_mhz == 103125)
5216                 __qlm_kr_inc_dec_gser26636(0, qlm);
5217
5218         /* Errata GSER-25992: RX EQ Default Settings Update (CTLE Bias) */
5219         /* This workaround will only be applied to Pass 1.x */
5220         /* It will also only be applied if the SERDES data-rate is 10G */
5221         /* or if PCIe Gen3 (gen3=2 is PCIe Gen3) */
5222         if (baud_mhz == 103125 || (is_pcie && gen3 == 2))
5223                 cvmx_qlm_gser_errata_25992(0, qlm);
5224
5225         /* Errata GSER-27140: Updating the RX EQ settings due to temperature
5226          * drift sensitivities
5227          */
5228         /* This workaround will also only be applied if the SERDES data-rate is 10G */
5229         if (baud_mhz == 103125)
5230                 __qlm_rx_eq_temp_gser27140(0, qlm);
5231
5232         /* Reduce the voltage amplitude coming from Marvell PHY and also change
5233          * DFE threshold settings for RXAUI interface
5234          */
5235         if (is_bgx) {
5236                 int l;
5237
5238                 for (l = 0; l < 4; l++) {
5239                         cvmx_gserx_lanex_rx_cfg_4_t cfg4;
5240                         cvmx_gserx_lanex_tx_cfg_0_t cfg0;
5241
5242                         if (lmac_type[l] == 2) {
5243                                 /* Change the Q/QB error sampler 0 threshold from 0xD to 0xF */
5244                                 cfg4.u64 = csr_rd(CVMX_GSERX_LANEX_RX_CFG_4(l, qlm));
5245                                 cfg4.s.cfg_rx_errdet_ctrl = 0xcf6f;
5246                                 csr_wr(CVMX_GSERX_LANEX_RX_CFG_4(l, qlm), cfg4.u64);
5247                                 /* Reduce the voltage swing to roughly 460mV */
5248                                 cfg0.u64 = csr_rd(CVMX_GSERX_LANEX_TX_CFG_0(l, qlm));
5249                                 cfg0.s.cfg_tx_swing = 0x12;
5250                                 csr_wr(CVMX_GSERX_LANEX_TX_CFG_0(l, qlm), cfg0.u64);
5251                         }
5252                 }
5253         }
5254
5255         return 0;
5256 }
5257
5258 static int __rmac_pll_config(int baud_mhz, int qlm, int mode)
5259 {
5260         cvmx_gserx_pll_px_mode_0_t pmode0;
5261         cvmx_gserx_pll_px_mode_1_t pmode1;
5262         cvmx_gserx_lane_px_mode_0_t lmode0;
5263         cvmx_gserx_lane_px_mode_1_t lmode1;
5264         cvmx_gserx_lane_mode_t lmode;
5265
5266         switch (baud_mhz) {
5267         case 98304:
5268                 pmode0.u64 = 0x1a0a;
5269                 pmode1.u64 = 0x3228;
5270                 lmode0.u64 = 0x600f;
5271                 lmode1.u64 = 0xa80f;
5272                 break;
5273         case 49152:
5274                 if (mode == CVMX_QLM_MODE_SDL) {
5275                         pmode0.u64 = 0x3605;
5276                         pmode1.u64 = 0x0814;
5277                         lmode0.u64 = 0x000f;
5278                         lmode1.u64 = 0x6814;
5279                 } else {
5280                         pmode0.u64 = 0x1a0a;
5281                         pmode1.u64 = 0x3228;
5282                         lmode0.u64 = 0x650f;
5283                         lmode1.u64 = 0xe80f;
5284                 }
5285                 break;
5286         case 24576:
5287                 pmode0.u64 = 0x1a0a;
5288                 pmode1.u64 = 0x3228;
5289                 lmode0.u64 = 0x6a0f;
5290                 lmode1.u64 = 0xe80f;
5291                 break;
5292         case 12288:
5293                 pmode0.u64 = 0x1a0a;
5294                 pmode1.u64 = 0x3228;
5295                 lmode0.u64 = 0x6f0f;
5296                 lmode1.u64 = 0xe80f;
5297                 break;
5298         case 6144:
5299                 pmode0.u64 = 0x160a;
5300                 pmode1.u64 = 0x1019;
5301                 lmode0.u64 = 0x000f;
5302                 lmode1.u64 = 0x2814;
5303                 break;
5304         case 3072:
5305                 pmode0.u64 = 0x160a;
5306                 pmode1.u64 = 0x1019;
5307                 lmode0.u64 = 0x050f;
5308                 lmode1.u64 = 0x6814;
5309                 break;
5310         default:
5311                 printf("Invalid speed for CPRI/SDL configuration\n");
5312                 return -1;
5313         }
5314
5315         lmode.u64 = csr_rd(CVMX_GSERX_LANE_MODE(qlm));
5316         csr_wr(CVMX_GSERX_PLL_PX_MODE_0(lmode.s.lmode, qlm), pmode0.u64);
5317         csr_wr(CVMX_GSERX_PLL_PX_MODE_1(lmode.s.lmode, qlm), pmode1.u64);
5318         csr_wr(CVMX_GSERX_LANE_PX_MODE_0(lmode.s.lmode, qlm), lmode0.u64);
5319         csr_wr(CVMX_GSERX_LANE_PX_MODE_1(lmode.s.lmode, qlm), lmode1.u64);
5320         return 0;
5321 }
5322
5323 /**
5324  * Configure QLM/DLM speed and mode for cnf75xx.
5325  *
5326  * @param qlm     The QLM to configure
5327  * @param baud_mhz   The speed the QLM needs to be configured in Mhz.
5328  * @param mode    The QLM to be configured as SGMII/XAUI/PCIe.
5329  * @param rc      Only used for PCIe, rc = 1 for root complex mode, 0 for EP mode.
5330  * @param gen3    Only used for PCIe
5331  *                      gen3 = 2 GEN3 mode
5332  *                      gen3 = 1 GEN2 mode
5333  *                      gen3 = 0 GEN1 mode
5334  *
5335  * @param ref_clk_sel    The reference-clock selection to use to configure QLM
5336  *                       0 = REF_100MHZ
5337  *                       1 = REF_125MHZ
5338  *                       2 = REF_156MHZ
5339  *                       3 = REF_122MHZ
5340  * @param ref_clk_input  The reference-clock input to use to configure QLM
5341  *
5342  * @return       Return 0 on success or -1.
5343  */
5344 static int octeon_configure_qlm_cnf75xx(int qlm, int baud_mhz, int mode, int rc, int gen3,
5345                                         int ref_clk_sel, int ref_clk_input)
5346 {
5347         cvmx_gserx_phy_ctl_t phy_ctl;
5348         cvmx_gserx_lane_mode_t lmode;
5349         cvmx_gserx_cfg_t cfg;
5350         cvmx_gserx_refclk_sel_t refclk_sel;
5351         int is_pcie = 0;
5352         int is_bgx = 0;
5353         int is_srio = 0;
5354         int is_rmac = 0;
5355         int is_rmac_pipe = 0;
5356         int lane_mode = 0;
5357         short lmac_type[4] = { 0 };
5358         short sds_lane[4] = { 0 };
5359         bool alt_pll = false;
5360         int enable_training = 0;
5361         int additional_lmacs = 0;
5362         int port = (qlm == 3) ? 1 : 0;
5363         cvmx_sriox_status_reg_t status_reg;
5364
5365         debug("%s(qlm: %d, baud_mhz: %d, mode: %d, rc: %d, gen3: %d, ref_clk_sel: %d, ref_clk_input: %d\n",
5366               __func__, qlm, baud_mhz, mode, rc, gen3, ref_clk_sel, ref_clk_input);
5367         if (qlm > 8) {
5368                 printf("Invalid qlm%d passed\n", qlm);
5369                 return -1;
5370         }
5371
5372         /* Errata PEM-31375 PEM RSL accesses to PCLK registers can timeout
5373          *  during speed change. Change SLI_WINDOW_CTL[time] to 525us
5374          */
5375         __set_sli_window_ctl_errata_31375(0);
5376
5377         cfg.u64 = csr_rd(CVMX_GSERX_CFG(qlm));
5378
5379         /* If PEM is in EP, no need to do anything */
5380         if (cfg.s.pcie && rc == 0) {
5381                 debug("%s: qlm %d is in PCIe endpoint mode, returning\n", __func__, qlm);
5382                 return 0;
5383         }
5384
5385         if (cfg.s.srio && rc == 0) {
5386                 debug("%s: qlm %d is in SRIO endpoint mode, returning\n", __func__, qlm);
5387                 return 0;
5388         }
5389
5390         /* Set the reference clock to use */
5391         refclk_sel.u64 = 0;
5392         if (ref_clk_input == 0) { /* External ref clock */
5393                 refclk_sel.s.com_clk_sel = 0;
5394                 refclk_sel.s.use_com1 = 0;
5395         } else if (ref_clk_input == 1) {
5396                 refclk_sel.s.com_clk_sel = 1;
5397                 refclk_sel.s.use_com1 = 0;
5398         } else {
5399                 refclk_sel.s.com_clk_sel = 1;
5400                 refclk_sel.s.use_com1 = 1;
5401         }
5402
5403         csr_wr(CVMX_GSERX_REFCLK_SEL(qlm), refclk_sel.u64);
5404
5405         /* Reset the QLM after changing the reference clock */
5406         phy_ctl.u64 = csr_rd(CVMX_GSERX_PHY_CTL(qlm));
5407         phy_ctl.s.phy_reset = 1;
5408         phy_ctl.s.phy_pd = 1;
5409         csr_wr(CVMX_GSERX_PHY_CTL(qlm), phy_ctl.u64);
5410
5411         udelay(1000);
5412
5413         switch (mode) {
5414         case CVMX_QLM_MODE_PCIE:
5415         case CVMX_QLM_MODE_PCIE_1X2:
5416         case CVMX_QLM_MODE_PCIE_2X1: {
5417                 cvmx_pemx_cfg_t pemx_cfg;
5418                 cvmx_pemx_on_t pemx_on;
5419                 cvmx_rst_soft_prstx_t rst_prst;
5420
5421                 is_pcie = 1;
5422
5423                 if (qlm > 1) {
5424                         printf("Invalid PCIe mode for QLM%d\n", qlm);
5425                         return -1;
5426                 }
5427
5428                 if (ref_clk_sel == 0) {
5429                         refclk_sel.u64 = csr_rd(CVMX_GSERX_REFCLK_SEL(qlm));
5430                         refclk_sel.s.pcie_refclk125 = 0;
5431                         csr_wr(CVMX_GSERX_REFCLK_SEL(qlm), refclk_sel.u64);
5432                         if (gen3 == 0) /* Gen1 mode */
5433                                 lane_mode = R_2_5G_REFCLK100;
5434                         else if (gen3 == 1) /* Gen2 mode */
5435                                 lane_mode = R_5G_REFCLK100;
5436                         else
5437                                 lane_mode = R_8G_REFCLK100;
5438                 } else if (ref_clk_sel == 1) {
5439                         refclk_sel.u64 = csr_rd(CVMX_GSERX_REFCLK_SEL(qlm));
5440                         refclk_sel.s.pcie_refclk125 = 1;
5441                         csr_wr(CVMX_GSERX_REFCLK_SEL(qlm), refclk_sel.u64);
5442                         if (gen3 == 0) /* Gen1 mode */
5443                                 lane_mode = R_2_5G_REFCLK125;
5444                         else if (gen3 == 1) /* Gen2 mode */
5445                                 lane_mode = R_5G_REFCLK125;
5446                         else
5447                                 lane_mode = R_8G_REFCLK125;
5448                 } else {
5449                         printf("Invalid reference clock for PCIe on QLM%d\n", qlm);
5450                         return -1;
5451                 }
5452
5453                 switch (qlm) {
5454                 case 0: /* Either x4 or x2 based on PEM0 */
5455                         rst_prst.u64 = csr_rd(CVMX_RST_SOFT_PRSTX(0));
5456                         rst_prst.s.soft_prst = rc;
5457                         csr_wr(CVMX_RST_SOFT_PRSTX(0), rst_prst.u64);
5458                         __setup_pem_reset(0, 0, !rc);
5459
5460                         pemx_cfg.u64 = csr_rd(CVMX_PEMX_CFG(0));
5461                         pemx_cfg.cnf75xx.hostmd = rc;
5462                         pemx_cfg.cnf75xx.lanes8 = (mode == CVMX_QLM_MODE_PCIE);
5463                         pemx_cfg.cnf75xx.md = gen3;
5464                         csr_wr(CVMX_PEMX_CFG(0), pemx_cfg.u64);
5465                         /* x4 mode waits for QLM1 setup before turning on the PEM */
5466                         if (mode == CVMX_QLM_MODE_PCIE_1X2 || mode == CVMX_QLM_MODE_PCIE_2X1) {
5467                                 pemx_on.u64 = csr_rd(CVMX_PEMX_ON(0));
5468                                 pemx_on.s.pemon = 1;
5469                                 csr_wr(CVMX_PEMX_ON(0), pemx_on.u64);
5470                         }
5471                         break;
5472                 case 1: /* Either PEM0 x4 or PEM1 x2 */
5473                         if (mode == CVMX_QLM_MODE_PCIE_1X2 || mode == CVMX_QLM_MODE_PCIE_2X1) {
5474                                 rst_prst.u64 = csr_rd(CVMX_RST_SOFT_PRSTX(1));
5475                                 rst_prst.s.soft_prst = rc;
5476                                 csr_wr(CVMX_RST_SOFT_PRSTX(1), rst_prst.u64);
5477                                 __setup_pem_reset(0, 1, !rc);
5478
5479                                 pemx_cfg.u64 = csr_rd(CVMX_PEMX_CFG(1));
5480                                 pemx_cfg.cnf75xx.hostmd = rc;
5481                                 pemx_cfg.cnf75xx.md = gen3;
5482                                 csr_wr(CVMX_PEMX_CFG(1), pemx_cfg.u64);
5483
5484                                 pemx_on.u64 = csr_rd(CVMX_PEMX_ON(1));
5485                                 pemx_on.s.pemon = 1;
5486                                 csr_wr(CVMX_PEMX_ON(1), pemx_on.u64);
5487                         } else {
5488                                 pemx_on.u64 = csr_rd(CVMX_PEMX_ON(0));
5489                                 pemx_on.s.pemon = 1;
5490                                 csr_wr(CVMX_PEMX_ON(0), pemx_on.u64);
5491                         }
5492                         break;
5493                 default:
5494                         break;
5495                 }
5496                 break;
5497         }
5498         case CVMX_QLM_MODE_SRIO_1X4:
5499         case CVMX_QLM_MODE_SRIO_2X2:
5500         case CVMX_QLM_MODE_SRIO_4X1: {
5501                 int spd = 0xf;
5502
5503                 if (cvmx_fuse_read(1601)) {
5504                         debug("SRIO is not supported on cnf73xx model\n");
5505                         return -1;
5506                 }
5507
5508                 switch (baud_mhz) {
5509                 case 1250:
5510                         switch (ref_clk_sel) {
5511                         case 0: /* 100 MHz ref clock */
5512                                 spd = 0x3;
5513                                 break;
5514                         case 1: /* 125 MHz ref clock */
5515                                 spd = 0xa;
5516                                 break;
5517                         case 2: /* 156.25 MHz ref clock */
5518                                 spd = 0x4;
5519                                 break;
5520                         default:
5521                                 spd = 0xf; /* Disabled */
5522                                 break;
5523                         }
5524                         break;
5525                 case 2500:
5526                         switch (ref_clk_sel) {
5527                         case 0: /* 100 MHz ref clock */
5528                                 spd = 0x2;
5529                                 break;
5530                         case 1: /* 125 MHz ref clock */
5531                                 spd = 0x9;
5532                                 break;
5533                         case 2: /* 156.25 MHz ref clock */
5534                                 spd = 0x7;
5535                                 break;
5536                         default:
5537                                 spd = 0xf; /* Disabled */
5538                                 break;
5539                         }
5540                         break;
5541                 case 3125:
5542                         switch (ref_clk_sel) {
5543                         case 1: /* 125 MHz ref clock */
5544                                 spd = 0x8;
5545                                 break;
5546                         case 2: /* 156.25 MHz ref clock */
5547                                 spd = 0xe;
5548                                 break;
5549                         default:
5550                                 spd = 0xf; /* Disabled */
5551                                 break;
5552                         }
5553                         break;
5554                 case 5000:
5555                         switch (ref_clk_sel) {
5556                         case 0: /* 100 MHz ref clock */
5557                                 spd = 0x0;
5558                                 break;
5559                         case 1: /* 125 MHz ref clock */
5560                                 spd = 0x6;
5561                                 break;
5562                         case 2: /* 156.25 MHz ref clock */
5563                                 spd = 0xb;
5564                                 break;
5565                         default:
5566                                 spd = 0xf; /* Disabled */
5567                                 break;
5568                         }
5569                         break;
5570                 default:
5571                         spd = 0xf;
5572                         break;
5573                 }
5574
5575                 if (spd == 0xf) {
5576                         printf("ERROR: Invalid SRIO speed (%d) configured for QLM%d\n", baud_mhz,
5577                                qlm);
5578                         return -1;
5579                 }
5580
5581                 status_reg.u64 = csr_rd(CVMX_SRIOX_STATUS_REG(port));
5582                 status_reg.s.spd = spd;
5583                 csr_wr(CVMX_SRIOX_STATUS_REG(port), status_reg.u64);
5584                 is_srio = 1;
5585                 break;
5586         }
5587
5588         case CVMX_QLM_MODE_SGMII_2X1:
5589                 if (qlm == 4) {
5590                         is_bgx = 1;
5591                         lmac_type[0] = 0;
5592                         lmac_type[1] = 0;
5593                         lmac_type[2] = -1;
5594                         lmac_type[3] = -1;
5595                         sds_lane[0] = 0;
5596                         sds_lane[1] = 1;
5597                 } else if (qlm == 5) {
5598                         is_bgx = 1;
5599                         lmac_type[0] = -1;
5600                         lmac_type[1] = -1;
5601                         lmac_type[2] = 0;
5602                         lmac_type[3] = 0;
5603                         sds_lane[2] = 2;
5604                         sds_lane[3] = 3;
5605                         additional_lmacs = 2;
5606                 }
5607                 break;
5608         case CVMX_QLM_MODE_10G_KR_1X2:
5609                 enable_training = 1;
5610         case CVMX_QLM_MODE_XFI_1X2:
5611                 if (qlm == 5) {
5612                         is_bgx = 1;
5613                         lmac_type[0] = -1;
5614                         lmac_type[1] = -1;
5615                         lmac_type[2] = 3;
5616                         lmac_type[3] = 3;
5617                         sds_lane[2] = 2;
5618                         sds_lane[3] = 3;
5619                         additional_lmacs = 2;
5620                 }
5621                 break;
5622         case CVMX_QLM_MODE_CPRI: /* CPRI / JESD204B */
5623                 is_rmac = 1;
5624                 break;
5625         case CVMX_QLM_MODE_SDL: /* Serdes Lite (SDL) */
5626                 is_rmac = 1;
5627                 is_rmac_pipe = 1;
5628                 lane_mode = 1;
5629                 break;
5630         default:
5631                 break;
5632         }
5633
5634         if (is_rmac_pipe == 0 && is_pcie == 0) {
5635                 lane_mode = __get_lane_mode_for_speed_and_ref_clk(ref_clk_sel, baud_mhz,
5636                                                                   &alt_pll);
5637         }
5638
5639         debug("%s: %d lane mode: %d, alternate PLL: %s\n", __func__, mode, lane_mode,
5640               alt_pll ? "true" : "false");
5641         if (lane_mode == -1)
5642                 return -1;
5643
5644         if (alt_pll) {
5645                 debug("%s: alternate PLL settings used for qlm %d, lane mode %d, reference clock %d\n",
5646                       __func__, qlm, lane_mode, ref_clk_sel);
5647                 if (__set_qlm_ref_clk_cn78xx(0, qlm, lane_mode, ref_clk_sel)) {
5648                         printf("%s: Error: reference clock %d is not supported for qlm %d\n",
5649                                __func__, ref_clk_sel, qlm);
5650                         return -1;
5651                 }
5652         }
5653
5654         /* Power up PHY, but keep it in reset */
5655         phy_ctl.u64 = csr_rd(CVMX_GSERX_PHY_CTL(qlm));
5656         phy_ctl.s.phy_pd = 0;
5657         phy_ctl.s.phy_reset = 1;
5658         csr_wr(CVMX_GSERX_PHY_CTL(qlm), phy_ctl.u64);
5659
5660         /* Set GSER for the interface mode */
5661         cfg.u64 = csr_rd(CVMX_GSERX_CFG(qlm));
5662         cfg.s.bgx = is_bgx & 1;
5663         cfg.s.bgx_quad = (is_bgx >> 2) & 1;
5664         cfg.s.bgx_dual = (is_bgx >> 1) & 1;
5665         cfg.s.pcie = is_pcie;
5666         cfg.s.srio = is_srio;
5667         cfg.s.rmac = is_rmac;
5668         cfg.s.rmac_pipe = is_rmac_pipe;
5669         csr_wr(CVMX_GSERX_CFG(qlm), cfg.u64);
5670
5671         /* Lane mode */
5672         lmode.u64 = csr_rd(CVMX_GSERX_LANE_MODE(qlm));
5673         lmode.s.lmode = lane_mode;
5674         csr_wr(CVMX_GSERX_LANE_MODE(qlm), lmode.u64);
5675
5676         /* Because of the Errata where quad mode does not work, program
5677          * lmac_type to figure out the type of BGX interface configured
5678          */
5679         if (is_bgx) {
5680                 int bgx = 0;
5681                 cvmx_bgxx_cmrx_config_t cmr_config;
5682                 cvmx_bgxx_cmr_rx_lmacs_t rx_lmacs;
5683                 cvmx_bgxx_spux_br_pmd_control_t spu_pmd_control;
5684                 int index, total_lmacs = 0;
5685
5686                 for (index = 0; index < 4; index++) {
5687                         cmr_config.u64 = csr_rd(CVMX_BGXX_CMRX_CONFIG(index, bgx));
5688                         cmr_config.s.enable = 0;
5689                         cmr_config.s.data_pkt_rx_en = 0;
5690                         cmr_config.s.data_pkt_tx_en = 0;
5691                         if (lmac_type[index] != -1) {
5692                                 cmr_config.s.lmac_type = lmac_type[index];
5693                                 cmr_config.s.lane_to_sds = sds_lane[index];
5694                                 total_lmacs++;
5695                         }
5696                         csr_wr(CVMX_BGXX_CMRX_CONFIG(index, bgx), cmr_config.u64);
5697
5698                         /* Enable training for 10G_KR/40G_KR4 modes */
5699                         if (enable_training == 1 &&
5700                             (lmac_type[index] == 3 || lmac_type[index] == 4)) {
5701                                 spu_pmd_control.u64 =
5702                                         csr_rd(CVMX_BGXX_SPUX_BR_PMD_CONTROL(index, bgx));
5703                                 spu_pmd_control.s.train_en = 1;
5704                                 csr_wr(CVMX_BGXX_SPUX_BR_PMD_CONTROL(index, bgx),
5705                                        spu_pmd_control.u64);
5706                         }
5707                 }
5708
5709                 /* Update the total number of lmacs */
5710                 rx_lmacs.u64 = csr_rd(CVMX_BGXX_CMR_RX_LMACS(bgx));
5711                 rx_lmacs.s.lmacs = total_lmacs + additional_lmacs;
5712                 csr_wr(CVMX_BGXX_CMR_RX_LMACS(bgx), rx_lmacs.u64);
5713                 csr_wr(CVMX_BGXX_CMR_TX_LMACS(bgx), rx_lmacs.u64);
5714         }
5715
5716         /* Bring phy out of reset */
5717         phy_ctl.u64 = csr_rd(CVMX_GSERX_PHY_CTL(qlm));
5718         phy_ctl.s.phy_reset = 0;
5719         csr_wr(CVMX_GSERX_PHY_CTL(qlm), phy_ctl.u64);
5720
5721         /*
5722          * Wait 1us until the management interface is ready to accept
5723          * read/write commands.
5724          */
5725         udelay(1);
5726
5727         if (is_srio) {
5728                 status_reg.u64 = csr_rd(CVMX_SRIOX_STATUS_REG(port));
5729                 status_reg.s.srio = 1;
5730                 csr_wr(CVMX_SRIOX_STATUS_REG(port), status_reg.u64);
5731                 return 0;
5732         }
5733
5734         /* Wait for reset to complete and the PLL to lock */
5735         /* PCIe mode doesn't become ready until the PEM block attempts to bring
5736          * the interface up. Skip this check for PCIe
5737          */
5738         if (!is_pcie && CVMX_WAIT_FOR_FIELD64(CVMX_GSERX_QLM_STAT(qlm), cvmx_gserx_qlm_stat_t,
5739                                               rst_rdy, ==, 1, 10000)) {
5740                 printf("QLM%d: Timeout waiting for GSERX_QLM_STAT[rst_rdy]\n", qlm);
5741                 return -1;
5742         }
5743
5744         /* Configure the gser pll */
5745         if (is_rmac)
5746                 __rmac_pll_config(baud_mhz, qlm, mode);
5747         else if (!(is_pcie || is_srio))
5748                 __qlm_setup_pll_cn78xx(0, qlm);
5749
5750         /* Wait for reset to complete and the PLL to lock */
5751         if (CVMX_WAIT_FOR_FIELD64(CVMX_GSERX_PLL_STAT(qlm), cvmx_gserx_pll_stat_t,
5752                                   pll_lock, ==, 1, 10000)) {
5753                 printf("QLM%d: Timeout waiting for GSERX_PLL_STAT[pll_lock]\n", qlm);
5754                 return -1;
5755         }
5756
5757         /* Errata GSER-27140: Updating the RX EQ settings due to temperature
5758          * drift sensitivities
5759          */
5760         /* This workaround will also only be applied if the SERDES data-rate is 10G */
5761         if (baud_mhz == 103125)
5762                 __qlm_rx_eq_temp_gser27140(0, qlm);
5763
5764         return 0;
5765 }
5766
5767 /**
5768  * Configure qlm/dlm speed and mode.
5769  * @param qlm     The QLM or DLM to configure
5770  * @param speed   The speed the QLM needs to be configured in Mhz.
5771  * @param mode    The QLM to be configured as SGMII/XAUI/PCIe.
5772  * @param rc      Only used for PCIe, rc = 1 for root complex mode, 0 for EP
5773  *                mode.
5774  * @param pcie_mode Only used when qlm/dlm are in pcie mode.
5775  * @param ref_clk_sel Reference clock to use for 70XX where:
5776  *                      0: 100MHz
5777  *                      1: 125MHz
5778  *                      2: 156.25MHz
5779  *                      3: 122MHz (Used by RMAC)
5780  * @param ref_clk_input This selects which reference clock input to use.  For
5781  *                      cn70xx:
5782  *                              0: DLMC_REF_CLK0
5783  *                              1: DLMC_REF_CLK1
5784  *                              2: DLM0_REF_CLK
5785  *                      cn61xx: (not used)
5786  *                      cn78xx/cn76xx/cn73xx:
5787  *                              0: Internal clock (QLM[0-7]_REF_CLK)
5788  *                              1: QLMC_REF_CLK0
5789  *                              2: QLMC_REF_CLK1
5790  *
5791  * @return       Return 0 on success or -1.
5792  */
5793 int octeon_configure_qlm(int qlm, int speed, int mode, int rc, int pcie_mode, int ref_clk_sel,
5794                          int ref_clk_input)
5795 {
5796         int node = 0; // ToDo: corrently only node 0 is supported
5797
5798         debug("%s(%d, %d, %d, %d, %d, %d, %d)\n", __func__, qlm, speed, mode, rc, pcie_mode,
5799               ref_clk_sel, ref_clk_input);
5800         if (OCTEON_IS_MODEL(OCTEON_CN61XX) || OCTEON_IS_MODEL(OCTEON_CNF71XX))
5801                 return octeon_configure_qlm_cn61xx(qlm, speed, mode, rc, pcie_mode);
5802         else if (OCTEON_IS_MODEL(OCTEON_CN70XX))
5803                 return octeon_configure_qlm_cn70xx(qlm, speed, mode, rc, pcie_mode, ref_clk_sel,
5804                                                    ref_clk_input);
5805         else if (OCTEON_IS_MODEL(OCTEON_CN78XX))
5806                 return octeon_configure_qlm_cn78xx(node, qlm, speed, mode, rc, pcie_mode,
5807                                                    ref_clk_sel, ref_clk_input);
5808         else if (OCTEON_IS_MODEL(OCTEON_CN73XX))
5809                 return octeon_configure_qlm_cn73xx(qlm, speed, mode, rc, pcie_mode, ref_clk_sel,
5810                                                    ref_clk_input);
5811         else if (OCTEON_IS_MODEL(OCTEON_CNF75XX))
5812                 return octeon_configure_qlm_cnf75xx(qlm, speed, mode, rc, pcie_mode, ref_clk_sel,
5813                                                     ref_clk_input);
5814         else
5815                 return -1;
5816 }
5817
5818 void octeon_init_qlm(int node)
5819 {
5820         int qlm;
5821         cvmx_gserx_phy_ctl_t phy_ctl;
5822         cvmx_gserx_cfg_t cfg;
5823         int baud_mhz;
5824         int pem;
5825
5826         if (!OCTEON_IS_MODEL(OCTEON_CN78XX))
5827                 return;
5828
5829         for (qlm = 0; qlm < 8; qlm++) {
5830                 phy_ctl.u64 = csr_rd_node(node, CVMX_GSERX_PHY_CTL(qlm));
5831                 if (phy_ctl.s.phy_reset == 0) {
5832                         cfg.u64 = csr_rd_node(node, CVMX_GSERX_CFG(qlm));
5833                         if (cfg.s.pcie)
5834                                 __cvmx_qlm_pcie_errata_cn78xx(node, qlm);
5835                         else
5836                                 __qlm_init_errata_20844(node, qlm);
5837
5838                         baud_mhz = cvmx_qlm_get_gbaud_mhz_node(node, qlm);
5839                         if (baud_mhz == 6250 || baud_mhz == 6316)
5840                                 octeon_qlm_tune_v3(node, qlm, baud_mhz, 0xa, 0xa0, -1, -1);
5841                         else if (baud_mhz == 103125)
5842                                 octeon_qlm_tune_v3(node, qlm, baud_mhz, 0xd, 0xd0, -1, -1);
5843                 }
5844         }
5845
5846         /* Setup how each PEM drives the PERST lines */
5847         for (pem = 0; pem < 4; pem++) {
5848                 cvmx_rst_ctlx_t rst_ctl;
5849
5850                 rst_ctl.u64 = csr_rd_node(node, CVMX_RST_CTLX(pem));
5851                 __setup_pem_reset(node, pem, !rst_ctl.s.host_mode);
5852         }
5853 }