2 * Copyright 2011-2012 Freescale Semiconductor, Inc.
4 * SPDX-License-Identifier: GPL-2.0+
11 #include <linux/compiler.h>
13 #include <asm/processor.h>
14 #include <asm/errno.h>
15 #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>
23 #include "../common/qixis.h"
24 #include "../common/vsc3316_3308.h"
25 #include "../common/idt8t49n222a_serdes_clk.h"
26 #include "../common/zm7300.h"
28 #include "b4860qds_qixis.h"
29 #include "b4860qds_crossbar_con.h"
31 #define CLK_MUX_SEL_MASK 0x4
32 #define ETH_PHY_CLK_OUT 0x4
34 DECLARE_GLOBAL_DATA_PTR;
40 struct cpu_type *cpu = gd->arch.cpu;
41 static const char *const freq[] = {"100", "125", "156.25", "161.13",
42 "122.88", "122.88", "122.88"};
45 printf("Board: %sQDS, ", cpu->name);
46 printf("Sys ID: 0x%02x, Sys Ver: 0x%02x, ",
47 QIXIS_READ(id), QIXIS_READ(arch));
49 sw = QIXIS_READ(brdcfg[0]);
50 sw = (sw & QIXIS_LBMAP_MASK) >> QIXIS_LBMAP_SHIFT;
53 printf("vBank: %d\n", sw);
54 else if (sw >= 0x8 && sw <= 0xE)
57 printf("invalid setting of SW%u\n", QIXIS_LBMAP_SWITCH);
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));
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
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]);
84 int select_i2c_ch_pca(u8 ch)
88 /* Selecting proper channel via PCA*/
89 ret = i2c_write(I2C_MUX_PCA_ADDR, 0x0, 1, &ch, 1);
91 printf("PCA: failed to select proper channel.\n");
99 * read_voltage from sensor on I2C bus
100 * We use average of 4 readings, waiting for 532us befor another reading
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 */
105 static inline int read_voltage(void)
107 int i, ret, voltage_read = 0;
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);
114 printf("VID: failed to read core voltage\n");
117 if (vol_mon & I2C_VOL_MONITOR_BUS_V_OVF) {
118 printf("VID: Core voltage sensor error\n");
121 debug("VID: bus voltage reads 0x%04x\n", vol_mon);
123 voltage_read += (vol_mon >> I2C_VOL_MONITOR_BUS_V_SHIFT) * 4;
124 udelay(WAIT_FOR_ADC);
126 /* calculate the average */
127 voltage_read /= NUM_READINGS;
132 static int adjust_vdd(ulong vdd_override)
134 int re_enable = disable_interrupts();
135 ccsr_gur_t __iomem *gur =
136 (void __iomem *)(CONFIG_SYS_MPC85xx_GUTS_ADDR);
139 int vdd_target, vdd_last;
140 int existing_voltage, temp_voltage, voltage; /* all in 1/10 mV */
142 unsigned int orig_i2c_speed;
143 unsigned long vdd_string_override;
145 static const uint16_t vdd[32] = {
178 ret = select_i2c_ch_pca(I2C_MUX_CH_VOL_MONITOR);
180 printf("VID: I2c failed to switch channel\n");
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;
193 vdd_target = vdd[vid];
194 debug("VID:Reading from from fuse,vid=%x vdd is %dmV\n",
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");
209 if (vdd_target == 0) {
210 printf("VID: VID not used\n");
216 * Read voltage monitor to check real voltage.
217 * Voltage monitor LSB is 4mv.
219 vdd_last = read_voltage();
221 printf("VID: abort VID adjustment\n");
226 debug("VID: Core voltage is at %d mV\n", vdd_last);
227 ret = select_i2c_ch_pca(I2C_MUX_CH_DPM);
229 printf("VID: I2c failed to switch channel to DPM\n");
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);
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);
244 /* Read the existing level on board, if equal to requsted one,
246 existing_voltage = zm_read_voltage();
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;
255 debug("VID: Changing voltage for board from %dmV to %dmV\n",
256 existing_voltage/10, voltage/10);
258 if (zm_disable_wp() < 0) {
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.
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;
273 /* ZM7300 device failed to set
276 ("VID:Stepping down vol failed:%dmV\n",
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;
289 /* ZM7300 device failed to set
292 ("VID:Stepping up vol failed:%dmV\n",
300 if (zm_enable_wp() < 0)
303 /* restore the speed to 400kHz */
304 out: debug("VID: Restore the I2C bus speed to %dKHz\n",
305 orig_i2c_speed/1000);
306 i2c_set_bus_speed(orig_i2c_speed);
310 ret = select_i2c_ch_pca(I2C_MUX_CH_VOL_MONITOR);
312 printf("VID: I2c failed to switch channel\n");
316 vdd_last = read_voltage();
317 select_i2c_ch_pca(I2C_CH_DEFAULT);
320 printf("VID: Core voltage %d mV\n", vdd_last);
330 int configure_vsc3316_3308(void)
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;
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");
343 serdes1_prtcl >>= FSL_CORENET2_RCWSR4_SRDS1_PRTCL_SHIFT;
344 debug("Using SERDES1 Protocol: 0x%x:\n", serdes1_prtcl);
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");
352 serdes2_prtcl >>= FSL_CORENET2_RCWSR4_SRDS2_PRTCL_SHIFT;
353 debug("Using SERDES2 Protocol: 0x%x:\n", serdes2_prtcl);
355 switch (serdes1_prtcl) {
365 * Lanes: C,D,E,F,G,H: CPRI
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);
373 ret = vsc3316_config(VSC3316_TX_ADDRESS,
374 vsc16_tx_4sfp_sgmii_12_56,
378 ret = vsc3316_config(VSC3316_RX_ADDRESS,
379 vsc16_rx_4sfp_sgmii_12_56,
415 * Lanes: E,F,G,H: CPRI
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);
423 ret = vsc3316_config(VSC3316_TX_ADDRESS,
424 vsc16_tx_sfp_sgmii_aurora,
428 ret = vsc3316_config(VSC3316_RX_ADDRESS,
429 vsc16_rx_sfp_sgmii_aurora,
438 #ifdef CONFIG_PPC_B4420
444 * Lanes: A,B,C,D: SGMII
445 * Lanes: E,F,G,H: CPRI
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);
453 ret = vsc3316_config(VSC3316_TX_ADDRESS,
454 vsc16_tx_sgmii_lane_cd, num_vsc16_con);
457 ret = vsc3316_config(VSC3316_RX_ADDRESS,
458 vsc16_rx_sgmii_lane_cd, num_vsc16_con);
471 num_vsc16_con = NUM_CON_VSC3316;
472 /* Configure VSC3316 crossbar switch */
473 ret = select_i2c_ch_pca(I2C_CH_VSC3316);
475 ret = vsc3316_config(VSC3316_TX_ADDRESS,
476 vsc16_tx_sfp, num_vsc16_con);
479 ret = vsc3316_config(VSC3316_RX_ADDRESS,
480 vsc16_rx_sfp, num_vsc16_con);
488 printf("WARNING:VSC crossbars programming not supported for:%x"
489 " SerDes1 Protocol.\n", serdes1_prtcl);
493 switch (serdes2_prtcl) {
494 #ifdef CONFIG_PPC_B4420
509 num_vsc08_con = NUM_CON_VSC3308;
510 /* Configure VSC3308 crossbar switch */
511 ret = select_i2c_ch_pca(I2C_CH_VSC3308);
513 ret = vsc3308_config(VSC3308_TX_ADDRESS,
514 vsc08_tx_amc, num_vsc08_con);
517 ret = vsc3308_config(VSC3308_RX_ADDRESS,
518 vsc08_rx_amc, num_vsc08_con);
526 printf("WARNING:VSC crossbars programming not supported for: %x"
527 " SerDes2 Protocol.\n", serdes2_prtcl);
534 static int calibrate_pll(serdes_corenet_t *srds_regs, int pll_num)
538 /* Steps For SerDes PLLs reset and reconfiguration
539 * or PLL power-up procedure
541 debug("CALIBRATE PLL:%d\n", pll_num);
542 clrbits_be32(&srds_regs->bank[pll_num].rstctl,
543 SRDS_RSTCTL_SDRST_B);
545 clrbits_be32(&srds_regs->bank[pll_num].rstctl,
546 (SRDS_RSTCTL_SDEN | SRDS_RSTCTL_PLLRST_B));
548 setbits_be32(&srds_regs->bank[pll_num].rstctl,
550 setbits_be32(&srds_regs->bank[pll_num].rstctl,
551 (SRDS_RSTCTL_SDEN | SRDS_RSTCTL_PLLRST_B
552 | SRDS_RSTCTL_SDRST_B));
556 /* Check whether PLL has been locked or not */
557 rst_err = in_be32(&srds_regs->bank[pll_num].rstctl) &
559 rst_err >>= SRDS_RSTCTL_RSTERR_SHIFT;
560 debug("RST_ERR value for PLL %d is: 0x%x:\n", pll_num, rst_err);
567 static int check_pll_locks(serdes_corenet_t *srds_regs, int pll_num)
570 u32 fcap, dcbias, bcap, pllcr1, pllcr0;
572 if (calibrate_pll(srds_regs, pll_num)) {
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) &
579 fcap >>= SRDS_PLLSR2_FCAP_SHIFT;
580 bcap = in_be32(&srds_regs->bank[pll_num].pllsr2) &
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) &
587 dcbias >>= SRDS_PLLSR2_DCBIAS_SHIFT;
588 debug("values of bcap:%x, fcap:%x and dcbias:%x\n",
590 if (fcap == 0 && bcap == 1) {
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)
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);
612 (&srds_regs->bank[pll_num].pllsr2) &
614 dcbias >>= SRDS_PLLSR2_DCBIAS_SHIFT;
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);
631 (&srds_regs->bank[pll_num].pllcr1)|
632 (fcap << SRDS_PLLCR1_PLL_FCAP_SHIFT));
633 out_be32(&srds_regs->bank[pll_num].pllcr1,
635 clrbits_be32(&srds_regs->bank[pll_num].pllcr0,
636 SRDS_PLLCR0_DCBIAS_OVRD);
638 (&srds_regs->bank[pll_num].pllcr0)|
639 (dcbias << SRDS_PLLCR0_DCBIAS_OVRD_SHIFT));
640 out_be32(&srds_regs->bank[pll_num].pllcr0,
642 ret = calibrate_pll(srds_regs, pll_num);
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));
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,
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,
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);
682 static int check_serdes_pll_locks(void)
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;
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);
694 printf("SerDes1, PLL:%d didnt lock\n", i);
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);
702 printf("SerDes2, PLL:%d didnt lock\n", i);
710 int config_serdes1_refclks(void)
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;
716 unsigned int flag_sgmii_aurora_prtcl = 0;
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");
726 serdes1_prtcl >>= FSL_CORENET2_RCWSR4_SRDS1_PRTCL_SHIFT;
727 debug("Using SERDES1 Protocol: 0x%x:\n", serdes1_prtcl);
729 /* 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
733 setbits_be32(&gur->rstrqmr1, FSL_CORENET_RSTRQMR1_SRDS_RST_MSK);
735 /* Reconfigure IDT idt8t49n222a device for CPRI to work
736 * For this SerDes1's Refclk1 and refclk2 need to be set
739 switch (serdes1_prtcl) {
767 debug("Configuring idt8t49n222a for CPRI SerDes clks:"
768 " for srds_prctl:%x\n", serdes1_prtcl);
769 ret = select_i2c_ch_pca(I2C_CH_IDT);
771 ret = set_serdes_refclk(IDT_SERDES1_ADDRESS, 1,
772 SERDES_REFCLK_122_88,
773 SERDES_REFCLK_122_88, 0);
775 printf("IDT8T49N222A configuration failed.\n");
778 debug("IDT8T49N222A configured.\n");
782 select_i2c_ch_pca(I2C_CH_DEFAULT);
784 /* Change SerDes1's Refclk1 to 125MHz for on board
785 * SGMIIs or Aurora to work
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:
798 flag_sgmii_aurora_prtcl++;
805 if (flag_sgmii_aurora_prtcl)
806 QIXIS_WRITE(brdcfg[4], QIXIS_SRDS1CLK_125);
808 /* Steps For SerDes PLLs reset and reconfiguration after
809 * changing SerDes's refclks
811 for (i = 0; i < CONFIG_SYS_FSL_SRDS_NUM_PLLS; i++) {
812 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);
817 clrbits_be32(&srds_regs->bank[i].rstctl,
818 (SRDS_RSTCTL_SDEN | SRDS_RSTCTL_PLLRST_B));
820 setbits_be32(&srds_regs->bank[i].rstctl,
822 setbits_be32(&srds_regs->bank[i].rstctl,
823 (SRDS_RSTCTL_SDEN | SRDS_RSTCTL_PLLRST_B
824 | SRDS_RSTCTL_SDRST_B));
828 printf("WARNING:IDT8T49N222A configuration not"
829 " supported for:%x SerDes1 Protocol.\n",
834 /* Clearing SRDS_RST_MSK bit as now
835 * SerDes reset event can cause a reset request
837 clrbits_be32(&gur->rstrqmr1, FSL_CORENET_RSTRQMR1_SRDS_RST_MSK);
841 int config_serdes2_refclks(void)
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;
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");
856 serdes2_prtcl >>= FSL_CORENET2_RCWSR4_SRDS2_PRTCL_SHIFT;
857 debug("Using SERDES2 Protocol: 0x%x:\n", serdes2_prtcl);
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
863 setbits_be32(&gur->rstrqmr1, FSL_CORENET_RSTRQMR1_SRDS_RST_MSK);
865 /* Reconfigure IDT idt8t49n222a device for PCIe SATA to work
866 * For this SerDes2's Refclk1 need to be set to 100MHz
868 switch (serdes2_prtcl) {
869 #ifdef CONFIG_PPC_B4420
877 debug("Configuring IDT for PCIe SATA for srds_prctl:%x\n",
879 ret = select_i2c_ch_pca(I2C_CH_IDT);
881 ret = set_serdes_refclk(IDT_SERDES2_ADDRESS, 2,
883 SERDES_REFCLK_156_25, 0);
885 printf("IDT8T49N222A configuration failed.\n");
888 debug("IDT8T49N222A configured.\n");
892 select_i2c_ch_pca(I2C_CH_DEFAULT);
894 /* Steps For SerDes PLLs reset and reconfiguration after
895 * changing SerDes's refclks
897 for (i = 0; i < CONFIG_SYS_FSL_SRDS_NUM_PLLS; i++) {
898 clrbits_be32(&srds2_regs->bank[i].rstctl,
899 SRDS_RSTCTL_SDRST_B);
901 clrbits_be32(&srds2_regs->bank[i].rstctl,
902 (SRDS_RSTCTL_SDEN | SRDS_RSTCTL_PLLRST_B));
904 setbits_be32(&srds2_regs->bank[i].rstctl,
906 setbits_be32(&srds2_regs->bank[i].rstctl,
907 (SRDS_RSTCTL_SDEN | SRDS_RSTCTL_PLLRST_B
908 | SRDS_RSTCTL_SDRST_B));
914 printf("IDT configuration not supported for:%x S2 Protocol.\n",
919 /* Clearing SRDS_RST_MSK bit as now
920 * SerDes reset event can cause a reset request
922 clrbits_be32(&gur->rstrqmr1, FSL_CORENET_RSTRQMR1_SRDS_RST_MSK);
926 int board_early_init_r(void)
928 const unsigned int flashbase = CONFIG_SYS_FLASH_BASE;
929 int flash_esel = find_tlb_idx((void *)flashbase, 1);
931 u32 svr = SVR_SOC_VER(get_svr());
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,
941 * Remap Boot flash + PROMJET region to caching-inhibited
942 * so that flash can be erased properly.
945 /* Flush d-cache and invalidate i-cache of any FLASH data */
949 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 */
954 /* invalidate existing TLB entry for flash + promjet */
955 disable_tlb(flash_esel);
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);
963 #ifdef CONFIG_SYS_DPAA_QBMAN
967 * Adjust core voltage according to voltage ID
968 * This function changes I2C mux to channel 2.
970 if (adjust_vdd(0) < 0)
971 printf("Warning: Adjusting core voltage failed\n");
973 /* SerDes1 refclks need to be set again, as default clks
974 * are not suitable for CPRI and onboard SGMIIs to work
976 * This function will set SerDes1's Refclk1 and refclk2
977 * as per SerDes1 protocols
979 if (config_serdes1_refclks())
980 printf("SerDes1 Refclks couldn't set properly.\n");
982 printf("SerDes1 Refclks have been set.\n");
984 /* 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
990 ret = config_serdes2_refclks();
992 printf("SerDes2 Refclks have been set.\n");
993 else if (ret == -ENODEV)
994 printf("SerDes disable, Refclks couldn't change.\n");
996 printf("SerDes2 Refclk reconfiguring failed.\n");
998 #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.
1005 if (SVR_MAJ(get_svr()) == 1) {
1006 if (check_serdes_pll_locks())
1007 printf("SerDes plls still not locked properly.\n");
1009 printf("SerDes plls have been locked well.\n");
1013 /* Configure VSC3316 and VSC3308 crossbar switches */
1014 if (configure_vsc3316_3308())
1015 printf("VSC:failed to configure VSC3316/3308.\n");
1017 printf("VSC:VSC3316/3308 successfully configured.\n");
1019 select_i2c_ch_pca(I2C_CH_DEFAULT);
1024 unsigned long get_board_sys_clk(void)
1026 u8 sysclk_conf = QIXIS_READ(brdcfg[1]);
1028 switch ((sysclk_conf & 0x0C) >> 2) {
1039 unsigned long get_board_ddr_clk(void)
1041 u8 ddrclk_conf = QIXIS_READ(brdcfg[1]);
1043 switch (ddrclk_conf & 0x03) {
1054 static int serdes_refclock(u8 sw, u8 sdclk)
1061 brdcfg4 = QIXIS_READ(brdcfg[4]);
1062 if ((brdcfg4 & CLK_MUX_SEL_MASK) == ETH_PHY_CLK_OUT)
1063 return SRDS_PLLCR0_RFCK_SEL_125;
1065 clock = (sw >> 5) & 7;
1067 clock = (sw >> 6) & 3;
1071 ret = SRDS_PLLCR0_RFCK_SEL_100;
1074 ret = SRDS_PLLCR0_RFCK_SEL_125;
1077 ret = SRDS_PLLCR0_RFCK_SEL_156_25;
1080 ret = SRDS_PLLCR0_RFCK_SEL_161_13;
1085 ret = SRDS_PLLCR0_RFCK_SEL_122_88;
1095 #define NUM_SRDS_BANKS 2
1097 int misc_init_r(void)
1100 serdes_corenet_t *srds_regs =
1101 (void *)CONFIG_SYS_FSL_CORENET_SERDES_ADDR;
1102 u32 actual[NUM_SRDS_BANKS];
1106 sw = QIXIS_READ(brdcfg[2]);
1107 clock = serdes_refclock(sw, 1);
1111 printf("Warning: SDREFCLK1 switch setting is unsupported\n");
1113 sw = QIXIS_READ(brdcfg[4]);
1114 clock = serdes_refclock(sw, 2);
1118 printf("Warning: SDREFCLK2 switch setting unsupported\n");
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]));
1134 int ft_board_setup(void *blob, bd_t *bd)
1139 ft_cpu_setup(blob, bd);
1141 base = getenv_bootm_low();
1142 size = getenv_bootm_size();
1144 fdt_fixup_memory(blob, (u64)base, (u64)size);
1147 pci_of_setup(blob, bd);
1150 fdt_fixup_liodn(blob);
1152 #ifdef CONFIG_HAS_FSL_DR_USB
1153 fdt_fixup_dr_usb(blob, bd);
1156 #ifdef CONFIG_SYS_DPAA_FMAN
1157 fdt_fixup_fman_ethernet(blob);
1158 fdt_fixup_board_enet(blob);
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.
1172 void qixis_dump_switch(void)
1178 * Any bit with 1 means that bit cannot be reverse engineered.
1179 * It will be displayed as _ in binary format.
1181 static const u8 mask[] = {0x07, 0, 0, 0xff, 0};
1183 u8 brdcfg[16], dutcfg[16];
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);
1190 sw[0] = ((brdcfg[0] & 0x0f) << 4) | \
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) | \
1200 sw[4] = ((brdcfg[1] & 0x30) << 2) | \
1201 ((brdcfg[1] & 0xc0) >> 2) | \
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]);