blob: b3a1e753f1c917b4820c27f5fca623c520b23ae0 [file] [log] [blame]
York Sunb5b06fb2012-12-23 19:25:27 +00001/*
2 * Copyright 2011-2012 Freescale Semiconductor, Inc.
3 *
Wolfgang Denk1a459662013-07-08 09:37:19 +02004 * SPDX-License-Identifier: GPL-2.0+
York Sunb5b06fb2012-12-23 19:25:27 +00005 */
6
7#include <common.h>
8#include <command.h>
9#include <i2c.h>
10#include <netdev.h>
11#include <linux/compiler.h>
12#include <asm/mmu.h>
13#include <asm/processor.h>
Shaveta Leekhafb07c0a2014-02-26 16:06:56 +053014#include <asm/errno.h>
York Sunb5b06fb2012-12-23 19:25:27 +000015#include <asm/cache.h>
16#include <asm/immap_85xx.h>
17#include <asm/fsl_law.h>
18#include <asm/fsl_serdes.h>
19#include <asm/fsl_portals.h>
20#include <asm/fsl_liodn.h>
21#include <fm_eth.h>
22
23#include "../common/qixis.h"
24#include "../common/vsc3316_3308.h"
Shaveta Leekhacb033742013-07-02 14:43:53 +053025#include "../common/idt8t49n222a_serdes_clk.h"
Shaveta Leekha652e29b2014-04-11 14:12:40 +053026#include "../common/zm7300.h"
York Sunb5b06fb2012-12-23 19:25:27 +000027#include "b4860qds.h"
28#include "b4860qds_qixis.h"
29#include "b4860qds_crossbar_con.h"
30
31#define CLK_MUX_SEL_MASK 0x4
32#define ETH_PHY_CLK_OUT 0x4
33
34DECLARE_GLOBAL_DATA_PTR;
35
36int checkboard(void)
37{
38 char buf[64];
39 u8 sw;
Simon Glass67ac13b2012-12-13 20:48:48 +000040 struct cpu_type *cpu = gd->arch.cpu;
York Sunb5b06fb2012-12-23 19:25:27 +000041 static const char *const freq[] = {"100", "125", "156.25", "161.13",
42 "122.88", "122.88", "122.88"};
43 int clock;
44
45 printf("Board: %sQDS, ", cpu->name);
46 printf("Sys ID: 0x%02x, Sys Ver: 0x%02x, ",
47 QIXIS_READ(id), QIXIS_READ(arch));
48
49 sw = QIXIS_READ(brdcfg[0]);
50 sw = (sw & QIXIS_LBMAP_MASK) >> QIXIS_LBMAP_SHIFT;
51
52 if (sw < 0x8)
53 printf("vBank: %d\n", sw);
54 else if (sw >= 0x8 && sw <= 0xE)
55 puts("NAND\n");
56 else
57 printf("invalid setting of SW%u\n", QIXIS_LBMAP_SWITCH);
58
59 printf("FPGA: v%d (%s), build %d",
60 (int)QIXIS_READ(scver), qixis_read_tag(buf),
61 (int)qixis_read_minor());
62 /* the timestamp string contains "\n" at the end */
63 printf(" on %s", qixis_read_time(buf));
64
York Sunb5b06fb2012-12-23 19:25:27 +000065 /*
66 * Display the actual SERDES reference clocks as configured by the
67 * dip switches on the board. Note that the SWx registers could
68 * technically be set to force the reference clocks to match the
69 * values that the SERDES expects (or vice versa). For now, however,
70 * we just display both values and hope the user notices when they
71 * don't match.
72 */
73 puts("SERDES Reference Clocks: ");
74 sw = QIXIS_READ(brdcfg[2]);
75 clock = (sw >> 5) & 7;
76 printf("Bank1=%sMHz ", freq[clock]);
77 sw = QIXIS_READ(brdcfg[4]);
78 clock = (sw >> 6) & 3;
79 printf("Bank2=%sMHz\n", freq[clock]);
80
81 return 0;
82}
83
84int select_i2c_ch_pca(u8 ch)
85{
86 int ret;
87
88 /* Selecting proper channel via PCA*/
89 ret = i2c_write(I2C_MUX_PCA_ADDR, 0x0, 1, &ch, 1);
90 if (ret) {
91 printf("PCA: failed to select proper channel.\n");
92 return ret;
93 }
94
95 return 0;
96}
97
Shaveta Leekha652e29b2014-04-11 14:12:40 +053098/*
99 * read_voltage from sensor on I2C bus
100 * We use average of 4 readings, waiting for 532us befor another reading
101 */
102#define WAIT_FOR_ADC 532 /* wait for 532 microseconds for ADC */
103#define NUM_READINGS 4 /* prefer to be power of 2 for efficiency */
104
105static inline int read_voltage(void)
106{
107 int i, ret, voltage_read = 0;
108 u16 vol_mon;
109
110 for (i = 0; i < NUM_READINGS; i++) {
111 ret = i2c_read(I2C_VOL_MONITOR_ADDR,
112 I2C_VOL_MONITOR_BUS_V_OFFSET, 1, (void *)&vol_mon, 2);
113 if (ret) {
114 printf("VID: failed to read core voltage\n");
115 return ret;
116 }
117 if (vol_mon & I2C_VOL_MONITOR_BUS_V_OVF) {
118 printf("VID: Core voltage sensor error\n");
119 return -1;
120 }
121 debug("VID: bus voltage reads 0x%04x\n", vol_mon);
122 /* LSB = 4mv */
123 voltage_read += (vol_mon >> I2C_VOL_MONITOR_BUS_V_SHIFT) * 4;
124 udelay(WAIT_FOR_ADC);
125 }
126 /* calculate the average */
127 voltage_read /= NUM_READINGS;
128
129 return voltage_read;
130}
131
132static int adjust_vdd(ulong vdd_override)
133{
134 int re_enable = disable_interrupts();
135 ccsr_gur_t __iomem *gur =
136 (void __iomem *)(CONFIG_SYS_MPC85xx_GUTS_ADDR);
137 u32 fusesr;
138 u8 vid;
139 int vdd_target, vdd_last;
140 int existing_voltage, temp_voltage, voltage; /* all in 1/10 mV */
141 int ret;
142 unsigned int orig_i2c_speed;
143 unsigned long vdd_string_override;
144 char *vdd_string;
145 static const uint16_t vdd[32] = {
146 0, /* unused */
147 9875, /* 0.9875V */
148 9750,
149 9625,
150 9500,
151 9375,
152 9250,
153 9125,
154 9000,
155 8875,
156 8750,
157 8625,
158 8500,
159 8375,
160 8250,
161 8125,
162 10000, /* 1.0000V */
163 10125,
164 10250,
165 10375,
166 10500,
167 10625,
168 10750,
169 10875,
170 11000,
171 0, /* reserved */
172 };
173 struct vdd_drive {
174 u8 vid;
175 unsigned voltage;
176 };
177
178 ret = select_i2c_ch_pca(I2C_MUX_CH_VOL_MONITOR);
179 if (ret) {
180 printf("VID: I2c failed to switch channel\n");
181 ret = -1;
182 goto exit;
183 }
184
185 /* get the voltage ID from fuse status register */
186 fusesr = in_be32(&gur->dcfg_fusesr);
187 vid = (fusesr >> FSL_CORENET_DCFG_FUSESR_VID_SHIFT) &
188 FSL_CORENET_DCFG_FUSESR_VID_MASK;
189 if (vid == FSL_CORENET_DCFG_FUSESR_VID_MASK) {
190 vid = (fusesr >> FSL_CORENET_DCFG_FUSESR_ALTVID_SHIFT) &
191 FSL_CORENET_DCFG_FUSESR_ALTVID_MASK;
192 }
193 vdd_target = vdd[vid];
194 debug("VID:Reading from from fuse,vid=%x vdd is %dmV\n",
195 vid, vdd_target/10);
196
197 /* check override variable for overriding VDD */
198 vdd_string = getenv("b4qds_vdd_mv");
199 if (vdd_override == 0 && vdd_string &&
200 !strict_strtoul(vdd_string, 10, &vdd_string_override))
201 vdd_override = vdd_string_override;
202 if (vdd_override >= 819 && vdd_override <= 1212) {
203 vdd_target = vdd_override * 10; /* convert to 1/10 mV */
204 debug("VDD override is %lu\n", vdd_override);
205 } else if (vdd_override != 0) {
206 printf("Invalid value.\n");
207 }
208
209 if (vdd_target == 0) {
210 printf("VID: VID not used\n");
211 ret = 0;
212 goto exit;
213 }
214
215 /*
216 * Read voltage monitor to check real voltage.
217 * Voltage monitor LSB is 4mv.
218 */
219 vdd_last = read_voltage();
220 if (vdd_last < 0) {
221 printf("VID: abort VID adjustment\n");
222 ret = -1;
223 goto exit;
224 }
225
226 debug("VID: Core voltage is at %d mV\n", vdd_last);
227 ret = select_i2c_ch_pca(I2C_MUX_CH_DPM);
228 if (ret) {
229 printf("VID: I2c failed to switch channel to DPM\n");
230 ret = -1;
231 goto exit;
232 }
233
234 /* Round up to the value of step of Voltage regulator */
235 voltage = roundup(vdd_target, ZM_STEP);
236 debug("VID: rounded up voltage = %d\n", voltage);
237
238 /* lower the speed to 100kHz to access ZM7300 device */
239 debug("VID: Setting bus speed to 100KHz if not already set\n");
240 orig_i2c_speed = i2c_get_bus_speed();
241 if (orig_i2c_speed != 100000)
242 i2c_set_bus_speed(100000);
243
244 /* Read the existing level on board, if equal to requsted one,
245 no need to re-set */
246 existing_voltage = zm_read_voltage();
247
248 /* allowing the voltage difference of one step 0.0125V acceptable */
249 if ((existing_voltage >= voltage) &&
250 (existing_voltage < (voltage + ZM_STEP))) {
251 debug("VID: voltage already set as requested,returning\n");
252 ret = existing_voltage;
253 goto out;
254 }
255 debug("VID: Changing voltage for board from %dmV to %dmV\n",
256 existing_voltage/10, voltage/10);
257
258 if (zm_disable_wp() < 0) {
259 ret = -1;
260 goto out;
261 }
262 /* Change Voltage: the change is done through all the steps in the
263 way, to avoid reset to the board due to power good signal fail
264 in big voltage change gap jump.
265 */
266 if (existing_voltage > voltage) {
267 temp_voltage = existing_voltage - ZM_STEP;
268 while (temp_voltage >= voltage) {
269 ret = zm_write_voltage(temp_voltage);
270 if (ret == temp_voltage) {
271 temp_voltage -= ZM_STEP;
272 } else {
273 /* ZM7300 device failed to set
274 * the voltage */
275 printf
276 ("VID:Stepping down vol failed:%dmV\n",
277 temp_voltage/10);
278 ret = -1;
279 goto out;
280 }
281 }
282 } else {
283 temp_voltage = existing_voltage + ZM_STEP;
284 while (temp_voltage < (voltage + ZM_STEP)) {
285 ret = zm_write_voltage(temp_voltage);
286 if (ret == temp_voltage) {
287 temp_voltage += ZM_STEP;
288 } else {
289 /* ZM7300 device failed to set
290 * the voltage */
291 printf
292 ("VID:Stepping up vol failed:%dmV\n",
293 temp_voltage/10);
294 ret = -1;
295 goto out;
296 }
297 }
298 }
299
300 if (zm_enable_wp() < 0)
301 ret = -1;
302
303 /* restore the speed to 400kHz */
304out: debug("VID: Restore the I2C bus speed to %dKHz\n",
305 orig_i2c_speed/1000);
306 i2c_set_bus_speed(orig_i2c_speed);
307 if (ret < 0)
308 goto exit;
309
310 ret = select_i2c_ch_pca(I2C_MUX_CH_VOL_MONITOR);
311 if (ret) {
312 printf("VID: I2c failed to switch channel\n");
313 ret = -1;
314 goto exit;
315 }
316 vdd_last = read_voltage();
317 select_i2c_ch_pca(I2C_CH_DEFAULT);
318
319 if (vdd_last > 0)
320 printf("VID: Core voltage %d mV\n", vdd_last);
321 else
322 ret = -1;
323
324exit:
325 if (re_enable)
326 enable_interrupts();
327 return ret;
328}
329
York Sunb5b06fb2012-12-23 19:25:27 +0000330int configure_vsc3316_3308(void)
331{
332 ccsr_gur_t *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR);
333 unsigned int num_vsc16_con, num_vsc08_con;
334 u32 serdes1_prtcl, serdes2_prtcl;
335 int ret;
336
337 serdes1_prtcl = in_be32(&gur->rcwsr[4]) &
338 FSL_CORENET2_RCWSR4_SRDS1_PRTCL;
339 if (!serdes1_prtcl) {
340 printf("SERDES1 is not enabled\n");
341 return 0;
342 }
343 serdes1_prtcl >>= FSL_CORENET2_RCWSR4_SRDS1_PRTCL_SHIFT;
344 debug("Using SERDES1 Protocol: 0x%x:\n", serdes1_prtcl);
345
346 serdes2_prtcl = in_be32(&gur->rcwsr[4]) &
347 FSL_CORENET2_RCWSR4_SRDS2_PRTCL;
348 if (!serdes2_prtcl) {
349 printf("SERDES2 is not enabled\n");
350 return 0;
351 }
352 serdes2_prtcl >>= FSL_CORENET2_RCWSR4_SRDS2_PRTCL_SHIFT;
353 debug("Using SERDES2 Protocol: 0x%x:\n", serdes2_prtcl);
354
355 switch (serdes1_prtcl) {
poonam aggrwalc7d506d2014-02-17 08:38:58 +0530356 case 0x29:
York Sunb5b06fb2012-12-23 19:25:27 +0000357 case 0x2a:
358 case 0x2C:
359 case 0x2D:
360 case 0x2E:
361 /*
362 * Configuration:
363 * SERDES: 1
364 * Lanes: A,B: SGMII
365 * Lanes: C,D,E,F,G,H: CPRI
366 */
367 debug("Configuring crossbar to use onboard SGMII PHYs:"
368 "srds_prctl:%x\n", serdes1_prtcl);
369 num_vsc16_con = NUM_CON_VSC3316;
370 /* Configure VSC3316 crossbar switch */
371 ret = select_i2c_ch_pca(I2C_CH_VSC3316);
372 if (!ret) {
373 ret = vsc3316_config(VSC3316_TX_ADDRESS,
Shaveta Leekha0fecbba2013-03-25 07:40:17 +0000374 vsc16_tx_4sfp_sgmii_12_56,
375 num_vsc16_con);
York Sunb5b06fb2012-12-23 19:25:27 +0000376 if (ret)
377 return ret;
378 ret = vsc3316_config(VSC3316_RX_ADDRESS,
Shaveta Leekha0fecbba2013-03-25 07:40:17 +0000379 vsc16_rx_4sfp_sgmii_12_56,
380 num_vsc16_con);
York Sunb5b06fb2012-12-23 19:25:27 +0000381 if (ret)
382 return ret;
383 } else {
384 return ret;
385 }
386 break;
387
Shaveta Leekha8c328c22014-11-12 16:00:44 +0530388 case 0x01:
Shaveta Leekha5e5097c2014-02-26 16:06:30 +0530389 case 0x02:
390 case 0x04:
391 case 0x05:
392 case 0x06:
Shaveta Leekha8c328c22014-11-12 16:00:44 +0530393 case 0x07:
Shaveta Leekha5e5097c2014-02-26 16:06:30 +0530394 case 0x08:
395 case 0x09:
396 case 0x0A:
397 case 0x0B:
398 case 0x0C:
Shaveta Leekha8c328c22014-11-12 16:00:44 +0530399 case 0x2F:
Shaveta Leekha5e5097c2014-02-26 16:06:30 +0530400 case 0x30:
401 case 0x32:
402 case 0x33:
403 case 0x34:
404 case 0x39:
405 case 0x3A:
406 case 0x3C:
407 case 0x3D:
408 case 0x5C:
409 case 0x5D:
410 /*
411 * Configuration:
412 * SERDES: 1
413 * Lanes: A,B: AURORA
414 * Lanes: C,d: SGMII
415 * Lanes: E,F,G,H: CPRI
416 */
417 debug("Configuring crossbar for Aurora, SGMII 3 and 4,"
418 " and CPRI. srds_prctl:%x\n", serdes1_prtcl);
419 num_vsc16_con = NUM_CON_VSC3316;
420 /* Configure VSC3316 crossbar switch */
421 ret = select_i2c_ch_pca(I2C_CH_VSC3316);
422 if (!ret) {
423 ret = vsc3316_config(VSC3316_TX_ADDRESS,
424 vsc16_tx_sfp_sgmii_aurora,
425 num_vsc16_con);
426 if (ret)
427 return ret;
428 ret = vsc3316_config(VSC3316_RX_ADDRESS,
429 vsc16_rx_sfp_sgmii_aurora,
430 num_vsc16_con);
431 if (ret)
432 return ret;
433 } else {
434 return ret;
435 }
436 break;
437
York Sunb5b06fb2012-12-23 19:25:27 +0000438#ifdef CONFIG_PPC_B4420
poonam aggrwalc7d506d2014-02-17 08:38:58 +0530439 case 0x17:
York Sunb5b06fb2012-12-23 19:25:27 +0000440 case 0x18:
441 /*
442 * Configuration:
443 * SERDES: 1
444 * Lanes: A,B,C,D: SGMII
445 * Lanes: E,F,G,H: CPRI
446 */
447 debug("Configuring crossbar to use onboard SGMII PHYs:"
448 "srds_prctl:%x\n", serdes1_prtcl);
449 num_vsc16_con = NUM_CON_VSC3316;
450 /* Configure VSC3316 crossbar switch */
451 ret = select_i2c_ch_pca(I2C_CH_VSC3316);
452 if (!ret) {
453 ret = vsc3316_config(VSC3316_TX_ADDRESS,
454 vsc16_tx_sgmii_lane_cd, num_vsc16_con);
455 if (ret)
456 return ret;
457 ret = vsc3316_config(VSC3316_RX_ADDRESS,
458 vsc16_rx_sgmii_lane_cd, num_vsc16_con);
459 if (ret)
460 return ret;
461 } else {
462 return ret;
463 }
464 break;
465#endif
466
467 case 0x3E:
468 case 0x0D:
469 case 0x0E:
470 case 0x12:
471 num_vsc16_con = NUM_CON_VSC3316;
472 /* Configure VSC3316 crossbar switch */
473 ret = select_i2c_ch_pca(I2C_CH_VSC3316);
474 if (!ret) {
475 ret = vsc3316_config(VSC3316_TX_ADDRESS,
476 vsc16_tx_sfp, num_vsc16_con);
477 if (ret)
478 return ret;
479 ret = vsc3316_config(VSC3316_RX_ADDRESS,
480 vsc16_rx_sfp, num_vsc16_con);
481 if (ret)
482 return ret;
483 } else {
484 return ret;
485 }
486 break;
487 default:
488 printf("WARNING:VSC crossbars programming not supported for:%x"
489 " SerDes1 Protocol.\n", serdes1_prtcl);
490 return -1;
491 }
492
493 switch (serdes2_prtcl) {
poonam aggrwalfa6e7422014-05-31 00:08:18 +0530494#ifdef CONFIG_PPC_B4420
495 case 0x9d:
496#endif
York Sunb5b06fb2012-12-23 19:25:27 +0000497 case 0x9E:
498 case 0x9A:
499 case 0x98:
Shaveta Leekha8c328c22014-11-12 16:00:44 +0530500 case 0xb1:
York Sunb5b06fb2012-12-23 19:25:27 +0000501 case 0xb2:
Shaveta Leekha8c328c22014-11-12 16:00:44 +0530502 case 0x48:
York Sunb5b06fb2012-12-23 19:25:27 +0000503 case 0x49:
504 case 0x4E:
Shaveta Leekha8c328c22014-11-12 16:00:44 +0530505 case 0x8C:
York Sunb5b06fb2012-12-23 19:25:27 +0000506 case 0x8D:
Shaveta Leekha8c328c22014-11-12 16:00:44 +0530507 case 0x79:
York Sunb5b06fb2012-12-23 19:25:27 +0000508 case 0x7A:
509 num_vsc08_con = NUM_CON_VSC3308;
510 /* Configure VSC3308 crossbar switch */
511 ret = select_i2c_ch_pca(I2C_CH_VSC3308);
512 if (!ret) {
513 ret = vsc3308_config(VSC3308_TX_ADDRESS,
514 vsc08_tx_amc, num_vsc08_con);
515 if (ret)
516 return ret;
517 ret = vsc3308_config(VSC3308_RX_ADDRESS,
518 vsc08_rx_amc, num_vsc08_con);
519 if (ret)
520 return ret;
521 } else {
522 return ret;
523 }
524 break;
525 default:
526 printf("WARNING:VSC crossbars programming not supported for: %x"
527 " SerDes2 Protocol.\n", serdes2_prtcl);
528 return -1;
529 }
530
531 return 0;
532}
533
Shaveta Leekha7af9a072014-02-26 16:08:22 +0530534static int calibrate_pll(serdes_corenet_t *srds_regs, int pll_num)
535{
536 u32 rst_err;
537
538 /* Steps For SerDes PLLs reset and reconfiguration
539 * or PLL power-up procedure
540 */
541 debug("CALIBRATE PLL:%d\n", pll_num);
542 clrbits_be32(&srds_regs->bank[pll_num].rstctl,
543 SRDS_RSTCTL_SDRST_B);
544 udelay(10);
545 clrbits_be32(&srds_regs->bank[pll_num].rstctl,
546 (SRDS_RSTCTL_SDEN | SRDS_RSTCTL_PLLRST_B));
547 udelay(10);
548 setbits_be32(&srds_regs->bank[pll_num].rstctl,
549 SRDS_RSTCTL_RST);
550 setbits_be32(&srds_regs->bank[pll_num].rstctl,
551 (SRDS_RSTCTL_SDEN | SRDS_RSTCTL_PLLRST_B
552 | SRDS_RSTCTL_SDRST_B));
553
554 udelay(20);
555
556 /* Check whether PLL has been locked or not */
557 rst_err = in_be32(&srds_regs->bank[pll_num].rstctl) &
558 SRDS_RSTCTL_RSTERR;
559 rst_err >>= SRDS_RSTCTL_RSTERR_SHIFT;
560 debug("RST_ERR value for PLL %d is: 0x%x:\n", pll_num, rst_err);
561 if (rst_err)
562 return rst_err;
563
564 return rst_err;
565}
566
567static int check_pll_locks(serdes_corenet_t *srds_regs, int pll_num)
568{
569 int ret = 0;
570 u32 fcap, dcbias, bcap, pllcr1, pllcr0;
571
572 if (calibrate_pll(srds_regs, pll_num)) {
573 /* STEP 1 */
574 /* Read fcap, dcbias and bcap value */
575 clrbits_be32(&srds_regs->bank[pll_num].pllcr0,
576 SRDS_PLLCR0_DCBIAS_OUT_EN);
577 fcap = in_be32(&srds_regs->bank[pll_num].pllsr2) &
578 SRDS_PLLSR2_FCAP;
579 fcap >>= SRDS_PLLSR2_FCAP_SHIFT;
580 bcap = in_be32(&srds_regs->bank[pll_num].pllsr2) &
581 SRDS_PLLSR2_BCAP_EN;
582 bcap >>= SRDS_PLLSR2_BCAP_EN_SHIFT;
583 setbits_be32(&srds_regs->bank[pll_num].pllcr0,
584 SRDS_PLLCR0_DCBIAS_OUT_EN);
585 dcbias = in_be32(&srds_regs->bank[pll_num].pllsr2) &
586 SRDS_PLLSR2_DCBIAS;
587 dcbias >>= SRDS_PLLSR2_DCBIAS_SHIFT;
588 debug("values of bcap:%x, fcap:%x and dcbias:%x\n",
589 bcap, fcap, dcbias);
590 if (fcap == 0 && bcap == 1) {
591 /* Step 3 */
592 clrbits_be32(&srds_regs->bank[pll_num].rstctl,
593 (SRDS_RSTCTL_SDEN | SRDS_RSTCTL_PLLRST_B
594 | SRDS_RSTCTL_SDRST_B));
595 clrbits_be32(&srds_regs->bank[pll_num].pllcr1,
596 SRDS_PLLCR1_BCAP_EN);
597 setbits_be32(&srds_regs->bank[pll_num].pllcr1,
598 SRDS_PLLCR1_BCAP_OVD);
599 if (calibrate_pll(srds_regs, pll_num)) {
600 /*save the fcap, dcbias and bcap values*/
601 clrbits_be32(&srds_regs->bank[pll_num].pllcr0,
602 SRDS_PLLCR0_DCBIAS_OUT_EN);
603 fcap = in_be32(&srds_regs->bank[pll_num].pllsr2)
604 & SRDS_PLLSR2_FCAP;
605 fcap >>= SRDS_PLLSR2_FCAP_SHIFT;
606 bcap = in_be32(&srds_regs->bank[pll_num].pllsr2)
607 & SRDS_PLLSR2_BCAP_EN;
608 bcap >>= SRDS_PLLSR2_BCAP_EN_SHIFT;
609 setbits_be32(&srds_regs->bank[pll_num].pllcr0,
610 SRDS_PLLCR0_DCBIAS_OUT_EN);
611 dcbias = in_be32
612 (&srds_regs->bank[pll_num].pllsr2) &
613 SRDS_PLLSR2_DCBIAS;
614 dcbias >>= SRDS_PLLSR2_DCBIAS_SHIFT;
615
616 /* Step 4*/
617 clrbits_be32(&srds_regs->bank[pll_num].rstctl,
618 (SRDS_RSTCTL_SDEN | SRDS_RSTCTL_PLLRST_B
619 | SRDS_RSTCTL_SDRST_B));
620 setbits_be32(&srds_regs->bank[pll_num].pllcr1,
621 SRDS_PLLCR1_BYP_CAL);
622 clrbits_be32(&srds_regs->bank[pll_num].pllcr1,
623 SRDS_PLLCR1_BCAP_EN);
624 setbits_be32(&srds_regs->bank[pll_num].pllcr1,
625 SRDS_PLLCR1_BCAP_OVD);
626 /* change the fcap and dcbias to the saved
627 * values from Step 3 */
628 clrbits_be32(&srds_regs->bank[pll_num].pllcr1,
629 SRDS_PLLCR1_PLL_FCAP);
630 pllcr1 = (in_be32
631 (&srds_regs->bank[pll_num].pllcr1)|
632 (fcap << SRDS_PLLCR1_PLL_FCAP_SHIFT));
633 out_be32(&srds_regs->bank[pll_num].pllcr1,
634 pllcr1);
635 clrbits_be32(&srds_regs->bank[pll_num].pllcr0,
636 SRDS_PLLCR0_DCBIAS_OVRD);
637 pllcr0 = (in_be32
638 (&srds_regs->bank[pll_num].pllcr0)|
639 (dcbias << SRDS_PLLCR0_DCBIAS_OVRD_SHIFT));
640 out_be32(&srds_regs->bank[pll_num].pllcr0,
641 pllcr0);
642 ret = calibrate_pll(srds_regs, pll_num);
643 if (ret)
644 return ret;
645 } else {
646 goto out;
647 }
648 } else { /* Step 5 */
649 clrbits_be32(&srds_regs->bank[pll_num].rstctl,
650 (SRDS_RSTCTL_SDEN | SRDS_RSTCTL_PLLRST_B
651 | SRDS_RSTCTL_SDRST_B));
652 udelay(10);
653 /* Change the fcap, dcbias, and bcap to the
654 * values from Step 1 */
655 setbits_be32(&srds_regs->bank[pll_num].pllcr1,
656 SRDS_PLLCR1_BYP_CAL);
657 clrbits_be32(&srds_regs->bank[pll_num].pllcr1,
658 SRDS_PLLCR1_PLL_FCAP);
659 pllcr1 = (in_be32(&srds_regs->bank[pll_num].pllcr1)|
660 (fcap << SRDS_PLLCR1_PLL_FCAP_SHIFT));
661 out_be32(&srds_regs->bank[pll_num].pllcr1,
662 pllcr1);
663 clrbits_be32(&srds_regs->bank[pll_num].pllcr0,
664 SRDS_PLLCR0_DCBIAS_OVRD);
665 pllcr0 = (in_be32(&srds_regs->bank[pll_num].pllcr0)|
666 (dcbias << SRDS_PLLCR0_DCBIAS_OVRD_SHIFT));
667 out_be32(&srds_regs->bank[pll_num].pllcr0,
668 pllcr0);
669 clrbits_be32(&srds_regs->bank[pll_num].pllcr1,
670 SRDS_PLLCR1_BCAP_EN);
671 setbits_be32(&srds_regs->bank[pll_num].pllcr1,
672 SRDS_PLLCR1_BCAP_OVD);
673 ret = calibrate_pll(srds_regs, pll_num);
674 if (ret)
675 return ret;
676 }
677 }
678out:
679 return 0;
680}
681
682static int check_serdes_pll_locks(void)
683{
684 serdes_corenet_t *srds1_regs =
685 (void *)CONFIG_SYS_FSL_CORENET_SERDES_ADDR;
686 serdes_corenet_t *srds2_regs =
687 (void *)CONFIG_SYS_FSL_CORENET_SERDES2_ADDR;
688 int i, ret1, ret2;
689
690 debug("\nSerDes1 Lock check\n");
691 for (i = 0; i < CONFIG_SYS_FSL_SRDS_NUM_PLLS; i++) {
692 ret1 = check_pll_locks(srds1_regs, i);
693 if (ret1) {
694 printf("SerDes1, PLL:%d didnt lock\n", i);
695 return ret1;
696 }
697 }
698 debug("\nSerDes2 Lock check\n");
699 for (i = 0; i < CONFIG_SYS_FSL_SRDS_NUM_PLLS; i++) {
700 ret2 = check_pll_locks(srds2_regs, i);
701 if (ret2) {
702 printf("SerDes2, PLL:%d didnt lock\n", i);
703 return ret2;
704 }
705 }
706
707 return 0;
708}
709
Shaveta Leekhacb033742013-07-02 14:43:53 +0530710int config_serdes1_refclks(void)
711{
712 ccsr_gur_t *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR);
713 serdes_corenet_t *srds_regs =
714 (void *)CONFIG_SYS_FSL_CORENET_SERDES_ADDR;
715 u32 serdes1_prtcl, lane;
Shaveta Leekha5e5097c2014-02-26 16:06:30 +0530716 unsigned int flag_sgmii_aurora_prtcl = 0;
Shaveta Leekhafb07c0a2014-02-26 16:06:56 +0530717 int i;
718 int ret = 0;
Shaveta Leekhacb033742013-07-02 14:43:53 +0530719
720 serdes1_prtcl = in_be32(&gur->rcwsr[4]) &
721 FSL_CORENET2_RCWSR4_SRDS1_PRTCL;
722 if (!serdes1_prtcl) {
723 printf("SERDES1 is not enabled\n");
724 return -1;
725 }
726 serdes1_prtcl >>= FSL_CORENET2_RCWSR4_SRDS1_PRTCL_SHIFT;
727 debug("Using SERDES1 Protocol: 0x%x:\n", serdes1_prtcl);
728
Shaveta Leekhafb07c0a2014-02-26 16:06:56 +0530729 /* To prevent generation of reset request from SerDes
730 * while changing the refclks, By setting SRDS_RST_MSK bit,
731 * SerDes reset event cannot cause a reset request
Shaveta Leekhacb033742013-07-02 14:43:53 +0530732 */
Shaveta Leekhafb07c0a2014-02-26 16:06:56 +0530733 setbits_be32(&gur->rstrqmr1, FSL_CORENET_RSTRQMR1_SRDS_RST_MSK);
734
Shaveta Leekhacb033742013-07-02 14:43:53 +0530735 /* Reconfigure IDT idt8t49n222a device for CPRI to work
736 * For this SerDes1's Refclk1 and refclk2 need to be set
737 * to 122.88MHz
738 */
739 switch (serdes1_prtcl) {
Shaveta Leekha8c328c22014-11-12 16:00:44 +0530740 case 0x29:
Shaveta Leekhacb033742013-07-02 14:43:53 +0530741 case 0x2A:
742 case 0x2C:
743 case 0x2D:
744 case 0x2E:
Shaveta Leekha8c328c22014-11-12 16:00:44 +0530745 case 0x01:
Shaveta Leekha5e5097c2014-02-26 16:06:30 +0530746 case 0x02:
747 case 0x04:
748 case 0x05:
749 case 0x06:
Shaveta Leekha8c328c22014-11-12 16:00:44 +0530750 case 0x07:
Shaveta Leekha5e5097c2014-02-26 16:06:30 +0530751 case 0x08:
752 case 0x09:
753 case 0x0A:
754 case 0x0B:
755 case 0x0C:
Shaveta Leekha8c328c22014-11-12 16:00:44 +0530756 case 0x2F:
Shaveta Leekha5e5097c2014-02-26 16:06:30 +0530757 case 0x30:
758 case 0x32:
759 case 0x33:
760 case 0x34:
761 case 0x39:
762 case 0x3A:
763 case 0x3C:
764 case 0x3D:
765 case 0x5C:
766 case 0x5D:
Shaveta Leekhacb033742013-07-02 14:43:53 +0530767 debug("Configuring idt8t49n222a for CPRI SerDes clks:"
768 " for srds_prctl:%x\n", serdes1_prtcl);
769 ret = select_i2c_ch_pca(I2C_CH_IDT);
770 if (!ret) {
771 ret = set_serdes_refclk(IDT_SERDES1_ADDRESS, 1,
772 SERDES_REFCLK_122_88,
773 SERDES_REFCLK_122_88, 0);
774 if (ret) {
775 printf("IDT8T49N222A configuration failed.\n");
Shaveta Leekhafb07c0a2014-02-26 16:06:56 +0530776 goto out;
Shaveta Leekhacb033742013-07-02 14:43:53 +0530777 } else
Shaveta Leekhafb07c0a2014-02-26 16:06:56 +0530778 debug("IDT8T49N222A configured.\n");
Shaveta Leekhacb033742013-07-02 14:43:53 +0530779 } else {
Shaveta Leekhafb07c0a2014-02-26 16:06:56 +0530780 goto out;
Shaveta Leekhacb033742013-07-02 14:43:53 +0530781 }
782 select_i2c_ch_pca(I2C_CH_DEFAULT);
783
784 /* Change SerDes1's Refclk1 to 125MHz for on board
Shaveta Leekha5e5097c2014-02-26 16:06:30 +0530785 * SGMIIs or Aurora to work
Shaveta Leekhacb033742013-07-02 14:43:53 +0530786 */
787 for (lane = 0; lane < SRDS_MAX_LANES; lane++) {
788 enum srds_prtcl lane_prtcl = serdes_get_prtcl
789 (0, serdes1_prtcl, lane);
790 switch (lane_prtcl) {
791 case SGMII_FM1_DTSEC1:
792 case SGMII_FM1_DTSEC2:
793 case SGMII_FM1_DTSEC3:
794 case SGMII_FM1_DTSEC4:
795 case SGMII_FM1_DTSEC5:
796 case SGMII_FM1_DTSEC6:
Shaveta Leekha5e5097c2014-02-26 16:06:30 +0530797 case AURORA:
798 flag_sgmii_aurora_prtcl++;
Shaveta Leekhacb033742013-07-02 14:43:53 +0530799 break;
800 default:
801 break;
802 }
803 }
804
Shaveta Leekha5e5097c2014-02-26 16:06:30 +0530805 if (flag_sgmii_aurora_prtcl)
Shaveta Leekhacb033742013-07-02 14:43:53 +0530806 QIXIS_WRITE(brdcfg[4], QIXIS_SRDS1CLK_125);
807
808 /* Steps For SerDes PLLs reset and reconfiguration after
809 * changing SerDes's refclks
810 */
Shaveta Leekhac4930b12014-02-26 16:07:51 +0530811 for (i = 0; i < CONFIG_SYS_FSL_SRDS_NUM_PLLS; i++) {
Shaveta Leekhacb033742013-07-02 14:43:53 +0530812 debug("For PLL%d reset and reconfiguration after"
813 " changing refclks\n", i+1);
814 clrbits_be32(&srds_regs->bank[i].rstctl,
815 SRDS_RSTCTL_SDRST_B);
816 udelay(10);
817 clrbits_be32(&srds_regs->bank[i].rstctl,
818 (SRDS_RSTCTL_SDEN | SRDS_RSTCTL_PLLRST_B));
819 udelay(10);
820 setbits_be32(&srds_regs->bank[i].rstctl,
821 SRDS_RSTCTL_RST);
822 setbits_be32(&srds_regs->bank[i].rstctl,
823 (SRDS_RSTCTL_SDEN | SRDS_RSTCTL_PLLRST_B
824 | SRDS_RSTCTL_SDRST_B));
825 }
826 break;
827 default:
828 printf("WARNING:IDT8T49N222A configuration not"
829 " supported for:%x SerDes1 Protocol.\n",
830 serdes1_prtcl);
Shaveta Leekhacb033742013-07-02 14:43:53 +0530831 }
832
Shaveta Leekhafb07c0a2014-02-26 16:06:56 +0530833out:
834 /* Clearing SRDS_RST_MSK bit as now
835 * SerDes reset event can cause a reset request
836 */
837 clrbits_be32(&gur->rstrqmr1, FSL_CORENET_RSTRQMR1_SRDS_RST_MSK);
838 return ret;
839}
840
841int config_serdes2_refclks(void)
842{
843 ccsr_gur_t *gur = (void __iomem *)(CONFIG_SYS_MPC85xx_GUTS_ADDR);
844 serdes_corenet_t *srds2_regs =
845 (void *)CONFIG_SYS_FSL_CORENET_SERDES2_ADDR;
846 u32 serdes2_prtcl;
847 int ret = 0;
848 int i;
849
850 serdes2_prtcl = in_be32(&gur->rcwsr[4]) &
851 FSL_CORENET2_RCWSR4_SRDS2_PRTCL;
852 if (!serdes2_prtcl) {
853 debug("SERDES2 is not enabled\n");
854 return -ENODEV;
855 }
856 serdes2_prtcl >>= FSL_CORENET2_RCWSR4_SRDS2_PRTCL_SHIFT;
857 debug("Using SERDES2 Protocol: 0x%x:\n", serdes2_prtcl);
858
859 /* To prevent generation of reset request from SerDes
860 * while changing the refclks, By setting SRDS_RST_MSK bit,
861 * SerDes reset event cannot cause a reset request
862 */
863 setbits_be32(&gur->rstrqmr1, FSL_CORENET_RSTRQMR1_SRDS_RST_MSK);
864
865 /* Reconfigure IDT idt8t49n222a device for PCIe SATA to work
866 * For this SerDes2's Refclk1 need to be set to 100MHz
867 */
868 switch (serdes2_prtcl) {
poonam aggrwalfa6e7422014-05-31 00:08:18 +0530869#ifdef CONFIG_PPC_B4420
870 case 0x9d:
871#endif
Shaveta Leekhafb07c0a2014-02-26 16:06:56 +0530872 case 0x9E:
873 case 0x9A:
Shaveta Leekha8c328c22014-11-12 16:00:44 +0530874 /* fallthrough */
875 case 0xb1:
Shaveta Leekhafb07c0a2014-02-26 16:06:56 +0530876 case 0xb2:
877 debug("Configuring IDT for PCIe SATA for srds_prctl:%x\n",
878 serdes2_prtcl);
879 ret = select_i2c_ch_pca(I2C_CH_IDT);
880 if (!ret) {
881 ret = set_serdes_refclk(IDT_SERDES2_ADDRESS, 2,
882 SERDES_REFCLK_100,
Shaveta Leekhac4930b12014-02-26 16:07:51 +0530883 SERDES_REFCLK_156_25, 0);
Shaveta Leekhafb07c0a2014-02-26 16:06:56 +0530884 if (ret) {
885 printf("IDT8T49N222A configuration failed.\n");
886 goto out;
887 } else
888 debug("IDT8T49N222A configured.\n");
889 } else {
890 goto out;
891 }
892 select_i2c_ch_pca(I2C_CH_DEFAULT);
893
894 /* Steps For SerDes PLLs reset and reconfiguration after
895 * changing SerDes's refclks
896 */
Shaveta Leekhac4930b12014-02-26 16:07:51 +0530897 for (i = 0; i < CONFIG_SYS_FSL_SRDS_NUM_PLLS; i++) {
Shaveta Leekhafb07c0a2014-02-26 16:06:56 +0530898 clrbits_be32(&srds2_regs->bank[i].rstctl,
899 SRDS_RSTCTL_SDRST_B);
900 udelay(10);
901 clrbits_be32(&srds2_regs->bank[i].rstctl,
902 (SRDS_RSTCTL_SDEN | SRDS_RSTCTL_PLLRST_B));
903 udelay(10);
904 setbits_be32(&srds2_regs->bank[i].rstctl,
905 SRDS_RSTCTL_RST);
906 setbits_be32(&srds2_regs->bank[i].rstctl,
907 (SRDS_RSTCTL_SDEN | SRDS_RSTCTL_PLLRST_B
908 | SRDS_RSTCTL_SDRST_B));
Shaveta Leekha7af9a072014-02-26 16:08:22 +0530909
910 udelay(10);
Shaveta Leekhafb07c0a2014-02-26 16:06:56 +0530911 }
912 break;
913 default:
914 printf("IDT configuration not supported for:%x S2 Protocol.\n",
915 serdes2_prtcl);
916 }
917
918out:
919 /* Clearing SRDS_RST_MSK bit as now
920 * SerDes reset event can cause a reset request
921 */
922 clrbits_be32(&gur->rstrqmr1, FSL_CORENET_RSTRQMR1_SRDS_RST_MSK);
923 return ret;
Shaveta Leekhacb033742013-07-02 14:43:53 +0530924}
925
York Sunb5b06fb2012-12-23 19:25:27 +0000926int board_early_init_r(void)
927{
928 const unsigned int flashbase = CONFIG_SYS_FLASH_BASE;
York Sun9d045682014-06-24 21:16:20 -0700929 int flash_esel = find_tlb_idx((void *)flashbase, 1);
Shaveta Leekhafb07c0a2014-02-26 16:06:56 +0530930 int ret;
Shaveta Leekhaf7c28aa2014-11-12 14:23:26 +0530931 u32 svr = SVR_SOC_VER(get_svr());
932
933 /* Create law for MAPLE only for personalities having MAPLE */
934 if ((svr == SVR_B4860) || (svr == SVR_B4440) ||
935 (svr == SVR_B4420) || (svr == SVR_B4220)) {
936 set_next_law(CONFIG_SYS_MAPLE_MEM_PHYS, LAW_SIZE_16M,
937 LAW_TRGT_IF_MAPLE);
938 }
York Sunb5b06fb2012-12-23 19:25:27 +0000939
940 /*
941 * Remap Boot flash + PROMJET region to caching-inhibited
942 * so that flash can be erased properly.
943 */
944
945 /* Flush d-cache and invalidate i-cache of any FLASH data */
946 flush_dcache();
947 invalidate_icache();
948
York Sun9d045682014-06-24 21:16:20 -0700949 if (flash_esel == -1) {
950 /* very unlikely unless something is messed up */
951 puts("Error: Could not find TLB for FLASH BASE\n");
952 flash_esel = 2; /* give our best effort to continue */
953 } else {
954 /* invalidate existing TLB entry for flash + promjet */
955 disable_tlb(flash_esel);
956 }
York Sunb5b06fb2012-12-23 19:25:27 +0000957
958 set_tlb(1, flashbase, CONFIG_SYS_FLASH_BASE_PHYS,
959 MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G,
960 0, flash_esel, BOOKE_PAGESZ_256M, 1);
961
962 set_liodns();
963#ifdef CONFIG_SYS_DPAA_QBMAN
964 setup_portals();
965#endif
Shaveta Leekha652e29b2014-04-11 14:12:40 +0530966 /*
967 * Adjust core voltage according to voltage ID
968 * This function changes I2C mux to channel 2.
969 */
970 if (adjust_vdd(0) < 0)
971 printf("Warning: Adjusting core voltage failed\n");
972
Shaveta Leekhacb033742013-07-02 14:43:53 +0530973 /* SerDes1 refclks need to be set again, as default clks
974 * are not suitable for CPRI and onboard SGMIIs to work
975 * simultaneously.
976 * This function will set SerDes1's Refclk1 and refclk2
977 * as per SerDes1 protocols
978 */
979 if (config_serdes1_refclks())
980 printf("SerDes1 Refclks couldn't set properly.\n");
981 else
982 printf("SerDes1 Refclks have been set.\n");
York Sunb5b06fb2012-12-23 19:25:27 +0000983
Shaveta Leekhafb07c0a2014-02-26 16:06:56 +0530984 /* SerDes2 refclks need to be set again, as default clks
985 * are not suitable for PCIe SATA to work
986 * This function will set SerDes2's Refclk1 and refclk2
987 * for SerDes2 protocols having PCIe in them
988 * for PCIe SATA to work
989 */
990 ret = config_serdes2_refclks();
991 if (!ret)
992 printf("SerDes2 Refclks have been set.\n");
993 else if (ret == -ENODEV)
994 printf("SerDes disable, Refclks couldn't change.\n");
995 else
996 printf("SerDes2 Refclk reconfiguring failed.\n");
997
Shaveta Leekha7af9a072014-02-26 16:08:22 +0530998#if defined(CONFIG_SYS_FSL_ERRATUM_A006384) || \
999 defined(CONFIG_SYS_FSL_ERRATUM_A006475)
1000 /* Rechecking the SerDes locks after all SerDes configurations
1001 * are done, As SerDes PLLs may not lock reliably at 5 G VCO
1002 * and at cold temperatures.
1003 * Following sequence ensure the proper locking of SerDes PLLs.
1004 */
1005 if (SVR_MAJ(get_svr()) == 1) {
1006 if (check_serdes_pll_locks())
1007 printf("SerDes plls still not locked properly.\n");
1008 else
1009 printf("SerDes plls have been locked well.\n");
1010 }
1011#endif
1012
York Sunb5b06fb2012-12-23 19:25:27 +00001013 /* Configure VSC3316 and VSC3308 crossbar switches */
1014 if (configure_vsc3316_3308())
1015 printf("VSC:failed to configure VSC3316/3308.\n");
1016 else
1017 printf("VSC:VSC3316/3308 successfully configured.\n");
1018
1019 select_i2c_ch_pca(I2C_CH_DEFAULT);
1020
1021 return 0;
1022}
1023
1024unsigned long get_board_sys_clk(void)
1025{
1026 u8 sysclk_conf = QIXIS_READ(brdcfg[1]);
1027
1028 switch ((sysclk_conf & 0x0C) >> 2) {
1029 case QIXIS_CLK_100:
1030 return 100000000;
1031 case QIXIS_CLK_125:
1032 return 125000000;
1033 case QIXIS_CLK_133:
1034 return 133333333;
1035 }
1036 return 66666666;
1037}
1038
1039unsigned long get_board_ddr_clk(void)
1040{
1041 u8 ddrclk_conf = QIXIS_READ(brdcfg[1]);
1042
1043 switch (ddrclk_conf & 0x03) {
1044 case QIXIS_CLK_100:
1045 return 100000000;
1046 case QIXIS_CLK_125:
1047 return 125000000;
1048 case QIXIS_CLK_133:
1049 return 133333333;
1050 }
1051 return 66666666;
1052}
1053
1054static int serdes_refclock(u8 sw, u8 sdclk)
1055{
1056 unsigned int clock;
1057 int ret = -1;
1058 u8 brdcfg4;
1059
1060 if (sdclk == 1) {
1061 brdcfg4 = QIXIS_READ(brdcfg[4]);
1062 if ((brdcfg4 & CLK_MUX_SEL_MASK) == ETH_PHY_CLK_OUT)
1063 return SRDS_PLLCR0_RFCK_SEL_125;
1064 else
1065 clock = (sw >> 5) & 7;
1066 } else
1067 clock = (sw >> 6) & 3;
1068
1069 switch (clock) {
1070 case 0:
1071 ret = SRDS_PLLCR0_RFCK_SEL_100;
1072 break;
1073 case 1:
1074 ret = SRDS_PLLCR0_RFCK_SEL_125;
1075 break;
1076 case 2:
1077 ret = SRDS_PLLCR0_RFCK_SEL_156_25;
1078 break;
1079 case 3:
1080 ret = SRDS_PLLCR0_RFCK_SEL_161_13;
1081 break;
1082 case 4:
1083 case 5:
1084 case 6:
1085 ret = SRDS_PLLCR0_RFCK_SEL_122_88;
1086 break;
1087 default:
1088 ret = -1;
1089 break;
1090 }
1091
1092 return ret;
1093}
1094
York Sunb5b06fb2012-12-23 19:25:27 +00001095#define NUM_SRDS_BANKS 2
1096
1097int misc_init_r(void)
1098{
1099 u8 sw;
1100 serdes_corenet_t *srds_regs =
1101 (void *)CONFIG_SYS_FSL_CORENET_SERDES_ADDR;
1102 u32 actual[NUM_SRDS_BANKS];
1103 unsigned int i;
1104 int clock;
1105
1106 sw = QIXIS_READ(brdcfg[2]);
1107 clock = serdes_refclock(sw, 1);
1108 if (clock >= 0)
1109 actual[0] = clock;
1110 else
1111 printf("Warning: SDREFCLK1 switch setting is unsupported\n");
1112
1113 sw = QIXIS_READ(brdcfg[4]);
1114 clock = serdes_refclock(sw, 2);
1115 if (clock >= 0)
1116 actual[1] = clock;
1117 else
1118 printf("Warning: SDREFCLK2 switch setting unsupported\n");
1119
1120 for (i = 0; i < NUM_SRDS_BANKS; i++) {
1121 u32 pllcr0 = srds_regs->bank[i].pllcr0;
1122 u32 expected = pllcr0 & SRDS_PLLCR0_RFCK_SEL_MASK;
1123 if (expected != actual[i]) {
1124 printf("Warning: SERDES bank %u expects reference clock"
1125 " %sMHz, but actual is %sMHz\n", i + 1,
1126 serdes_clock_to_string(expected),
1127 serdes_clock_to_string(actual[i]));
1128 }
1129 }
1130
1131 return 0;
1132}
1133
Simon Glasse895a4b2014-10-23 18:58:47 -06001134int ft_board_setup(void *blob, bd_t *bd)
York Sunb5b06fb2012-12-23 19:25:27 +00001135{
1136 phys_addr_t base;
1137 phys_size_t size;
1138
1139 ft_cpu_setup(blob, bd);
1140
1141 base = getenv_bootm_low();
1142 size = getenv_bootm_size();
1143
1144 fdt_fixup_memory(blob, (u64)base, (u64)size);
1145
1146#ifdef CONFIG_PCI
1147 pci_of_setup(blob, bd);
1148#endif
1149
1150 fdt_fixup_liodn(blob);
1151
1152#ifdef CONFIG_HAS_FSL_DR_USB
1153 fdt_fixup_dr_usb(blob, bd);
1154#endif
1155
1156#ifdef CONFIG_SYS_DPAA_FMAN
1157 fdt_fixup_fman_ethernet(blob);
1158 fdt_fixup_board_enet(blob);
1159#endif
Simon Glasse895a4b2014-10-23 18:58:47 -06001160
1161 return 0;
York Sunb5b06fb2012-12-23 19:25:27 +00001162}
Shaveta Leekha43548892012-12-23 19:25:42 +00001163
1164/*
1165 * Dump board switch settings.
1166 * The bits that cannot be read/sampled via some FPGA or some
1167 * registers, they will be displayed as
1168 * underscore in binary format. mask[] has those bits.
1169 * Some bits are calculated differently than the actual switches
1170 * if booting with overriding by FPGA.
1171 */
1172void qixis_dump_switch(void)
1173{
1174 int i;
1175 u8 sw[5];
1176
1177 /*
1178 * Any bit with 1 means that bit cannot be reverse engineered.
1179 * It will be displayed as _ in binary format.
1180 */
1181 static const u8 mask[] = {0x07, 0, 0, 0xff, 0};
1182 char buf[10];
1183 u8 brdcfg[16], dutcfg[16];
1184
1185 for (i = 0; i < 16; i++) {
1186 brdcfg[i] = qixis_read(offsetof(struct qixis, brdcfg[0]) + i);
1187 dutcfg[i] = qixis_read(offsetof(struct qixis, dutcfg[0]) + i);
1188 }
1189
1190 sw[0] = ((brdcfg[0] & 0x0f) << 4) | \
1191 (brdcfg[9] & 0x08);
1192 sw[1] = ((dutcfg[1] & 0x01) << 7) | \
1193 ((dutcfg[2] & 0x07) << 4) | \
1194 ((dutcfg[6] & 0x10) >> 1) | \
1195 ((dutcfg[6] & 0x80) >> 5) | \
1196 ((dutcfg[1] & 0x40) >> 5) | \
1197 (dutcfg[6] & 0x01);
1198 sw[2] = dutcfg[0];
1199 sw[3] = 0;
1200 sw[4] = ((brdcfg[1] & 0x30) << 2) | \
1201 ((brdcfg[1] & 0xc0) >> 2) | \
1202 (brdcfg[1] & 0x0f);
1203
1204 puts("DIP switch settings:\n");
1205 for (i = 0; i < 5; i++) {
1206 printf("SW%d = 0b%s (0x%02x)\n",
1207 i + 1, byte_to_binary_mask(sw[i], mask[i], buf), sw[i]);
1208 }
1209}