1 // SPDX-License-Identifier: GPL-2.0+
3 * Copyright 2011-2012 Freescale Semiconductor, Inc.
9 #include <fdt_support.h>
14 #include <linux/compiler.h>
16 #include <asm/processor.h>
17 #include <linux/errno.h>
18 #include <asm/cache.h>
19 #include <asm/immap_85xx.h>
20 #include <asm/fsl_law.h>
21 #include <asm/fsl_serdes.h>
22 #include <asm/fsl_liodn.h>
26 #include "../common/qixis.h"
27 #include "../common/vsc3316_3308.h"
28 #include "../common/idt8t49n222a_serdes_clk.h"
29 #include "../common/zm7300.h"
31 #include "b4860qds_qixis.h"
32 #include "b4860qds_crossbar_con.h"
34 #define CLK_MUX_SEL_MASK 0x4
35 #define ETH_PHY_CLK_OUT 0x4
37 DECLARE_GLOBAL_DATA_PTR;
43 struct cpu_type *cpu = gd->arch.cpu;
44 static const char *const freq[] = {"100", "125", "156.25", "161.13",
45 "122.88", "122.88", "122.88"};
48 printf("Board: %sQDS, ", cpu->name);
49 printf("Sys ID: 0x%02x, Sys Ver: 0x%02x, ",
50 QIXIS_READ(id), QIXIS_READ(arch));
52 sw = QIXIS_READ(brdcfg[0]);
53 sw = (sw & QIXIS_LBMAP_MASK) >> QIXIS_LBMAP_SHIFT;
56 printf("vBank: %d\n", sw);
57 else if (sw >= 0x8 && sw <= 0xE)
60 printf("invalid setting of SW%u\n", QIXIS_LBMAP_SWITCH);
62 printf("FPGA: v%d (%s), build %d",
63 (int)QIXIS_READ(scver), qixis_read_tag(buf),
64 (int)qixis_read_minor());
65 /* the timestamp string contains "\n" at the end */
66 printf(" on %s", qixis_read_time(buf));
69 * Display the actual SERDES reference clocks as configured by the
70 * dip switches on the board. Note that the SWx registers could
71 * technically be set to force the reference clocks to match the
72 * values that the SERDES expects (or vice versa). For now, however,
73 * we just display both values and hope the user notices when they
76 puts("SERDES Reference Clocks: ");
77 sw = QIXIS_READ(brdcfg[2]);
78 clock = (sw >> 5) & 7;
79 printf("Bank1=%sMHz ", freq[clock]);
80 sw = QIXIS_READ(brdcfg[4]);
81 clock = (sw >> 6) & 3;
82 printf("Bank2=%sMHz\n", freq[clock]);
87 int select_i2c_ch_pca(u8 ch)
91 /* Selecting proper channel via PCA*/
92 ret = i2c_write(I2C_MUX_PCA_ADDR, 0x0, 1, &ch, 1);
94 printf("PCA: failed to select proper channel.\n");
102 * read_voltage from sensor on I2C bus
103 * We use average of 4 readings, waiting for 532us befor another reading
105 #define WAIT_FOR_ADC 532 /* wait for 532 microseconds for ADC */
106 #define NUM_READINGS 4 /* prefer to be power of 2 for efficiency */
108 static inline int read_voltage(void)
110 int i, ret, voltage_read = 0;
113 for (i = 0; i < NUM_READINGS; i++) {
114 ret = i2c_read(I2C_VOL_MONITOR_ADDR,
115 I2C_VOL_MONITOR_BUS_V_OFFSET, 1, (void *)&vol_mon, 2);
117 printf("VID: failed to read core voltage\n");
120 if (vol_mon & I2C_VOL_MONITOR_BUS_V_OVF) {
121 printf("VID: Core voltage sensor error\n");
124 debug("VID: bus voltage reads 0x%04x\n", vol_mon);
126 voltage_read += (vol_mon >> I2C_VOL_MONITOR_BUS_V_SHIFT) * 4;
127 udelay(WAIT_FOR_ADC);
129 /* calculate the average */
130 voltage_read /= NUM_READINGS;
135 static int adjust_vdd(ulong vdd_override)
137 int re_enable = disable_interrupts();
138 ccsr_gur_t __iomem *gur =
139 (void __iomem *)(CONFIG_SYS_MPC85xx_GUTS_ADDR);
142 int vdd_target, vdd_last;
143 int existing_voltage, temp_voltage, voltage; /* all in 1/10 mV */
145 unsigned int orig_i2c_speed;
146 unsigned long vdd_string_override;
148 static const uint16_t vdd[32] = {
181 ret = select_i2c_ch_pca(I2C_MUX_CH_VOL_MONITOR);
183 printf("VID: I2c failed to switch channel\n");
188 /* get the voltage ID from fuse status register */
189 fusesr = in_be32(&gur->dcfg_fusesr);
190 vid = (fusesr >> FSL_CORENET_DCFG_FUSESR_VID_SHIFT) &
191 FSL_CORENET_DCFG_FUSESR_VID_MASK;
192 if (vid == FSL_CORENET_DCFG_FUSESR_VID_MASK) {
193 vid = (fusesr >> FSL_CORENET_DCFG_FUSESR_ALTVID_SHIFT) &
194 FSL_CORENET_DCFG_FUSESR_ALTVID_MASK;
196 vdd_target = vdd[vid];
197 debug("VID:Reading from from fuse,vid=%x vdd is %dmV\n",
200 /* check override variable for overriding VDD */
201 vdd_string = env_get("b4qds_vdd_mv");
202 if (vdd_override == 0 && vdd_string &&
203 !strict_strtoul(vdd_string, 10, &vdd_string_override))
204 vdd_override = vdd_string_override;
205 if (vdd_override >= 819 && vdd_override <= 1212) {
206 vdd_target = vdd_override * 10; /* convert to 1/10 mV */
207 debug("VDD override is %lu\n", vdd_override);
208 } else if (vdd_override != 0) {
209 printf("Invalid value.\n");
212 if (vdd_target == 0) {
213 printf("VID: VID not used\n");
219 * Read voltage monitor to check real voltage.
220 * Voltage monitor LSB is 4mv.
222 vdd_last = read_voltage();
224 printf("VID: abort VID adjustment\n");
229 debug("VID: Core voltage is at %d mV\n", vdd_last);
230 ret = select_i2c_ch_pca(I2C_MUX_CH_DPM);
232 printf("VID: I2c failed to switch channel to DPM\n");
237 /* Round up to the value of step of Voltage regulator */
238 voltage = roundup(vdd_target, ZM_STEP);
239 debug("VID: rounded up voltage = %d\n", voltage);
241 /* lower the speed to 100kHz to access ZM7300 device */
242 debug("VID: Setting bus speed to 100KHz if not already set\n");
243 orig_i2c_speed = i2c_get_bus_speed();
244 if (orig_i2c_speed != 100000)
245 i2c_set_bus_speed(100000);
247 /* Read the existing level on board, if equal to requsted one,
249 existing_voltage = zm_read_voltage();
251 /* allowing the voltage difference of one step 0.0125V acceptable */
252 if ((existing_voltage >= voltage) &&
253 (existing_voltage < (voltage + ZM_STEP))) {
254 debug("VID: voltage already set as requested,returning\n");
255 ret = existing_voltage;
258 debug("VID: Changing voltage for board from %dmV to %dmV\n",
259 existing_voltage/10, voltage/10);
261 if (zm_disable_wp() < 0) {
265 /* Change Voltage: the change is done through all the steps in the
266 way, to avoid reset to the board due to power good signal fail
267 in big voltage change gap jump.
269 if (existing_voltage > voltage) {
270 temp_voltage = existing_voltage - ZM_STEP;
271 while (temp_voltage >= voltage) {
272 ret = zm_write_voltage(temp_voltage);
273 if (ret == temp_voltage) {
274 temp_voltage -= ZM_STEP;
276 /* ZM7300 device failed to set
279 ("VID:Stepping down vol failed:%dmV\n",
286 temp_voltage = existing_voltage + ZM_STEP;
287 while (temp_voltage < (voltage + ZM_STEP)) {
288 ret = zm_write_voltage(temp_voltage);
289 if (ret == temp_voltage) {
290 temp_voltage += ZM_STEP;
292 /* ZM7300 device failed to set
295 ("VID:Stepping up vol failed:%dmV\n",
303 if (zm_enable_wp() < 0)
306 /* restore the speed to 400kHz */
307 out: debug("VID: Restore the I2C bus speed to %dKHz\n",
308 orig_i2c_speed/1000);
309 i2c_set_bus_speed(orig_i2c_speed);
313 ret = select_i2c_ch_pca(I2C_MUX_CH_VOL_MONITOR);
315 printf("VID: I2c failed to switch channel\n");
319 vdd_last = read_voltage();
320 select_i2c_ch_pca(I2C_CH_DEFAULT);
323 printf("VID: Core voltage %d mV\n", vdd_last);
333 int configure_vsc3316_3308(void)
335 ccsr_gur_t *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR);
336 unsigned int num_vsc16_con, num_vsc08_con;
337 u32 serdes1_prtcl, serdes2_prtcl;
339 char buffer[HWCONFIG_BUFFER_SIZE];
342 serdes1_prtcl = in_be32(&gur->rcwsr[4]) &
343 FSL_CORENET2_RCWSR4_SRDS1_PRTCL;
344 if (!serdes1_prtcl) {
345 printf("SERDES1 is not enabled\n");
348 serdes1_prtcl >>= FSL_CORENET2_RCWSR4_SRDS1_PRTCL_SHIFT;
349 debug("Using SERDES1 Protocol: 0x%x:\n", serdes1_prtcl);
351 serdes2_prtcl = in_be32(&gur->rcwsr[4]) &
352 FSL_CORENET2_RCWSR4_SRDS2_PRTCL;
353 if (!serdes2_prtcl) {
354 printf("SERDES2 is not enabled\n");
357 serdes2_prtcl >>= FSL_CORENET2_RCWSR4_SRDS2_PRTCL_SHIFT;
358 debug("Using SERDES2 Protocol: 0x%x:\n", serdes2_prtcl);
360 switch (serdes1_prtcl) {
370 * Lanes: C,D,E,F,G,H: CPRI
372 debug("Configuring crossbar to use onboard SGMII PHYs:"
373 "srds_prctl:%x\n", serdes1_prtcl);
374 num_vsc16_con = NUM_CON_VSC3316;
375 /* Configure VSC3316 crossbar switch */
376 ret = select_i2c_ch_pca(I2C_CH_VSC3316);
378 ret = vsc3316_config(VSC3316_TX_ADDRESS,
379 vsc16_tx_4sfp_sgmii_12_56,
383 ret = vsc3316_config(VSC3316_RX_ADDRESS,
384 vsc16_rx_4sfp_sgmii_12_56,
420 * Lanes: E,F,G,H: CPRI
422 debug("Configuring crossbar for Aurora, SGMII 3 and 4,"
423 " and CPRI. srds_prctl:%x\n", serdes1_prtcl);
424 num_vsc16_con = NUM_CON_VSC3316;
425 /* Configure VSC3316 crossbar switch */
426 ret = select_i2c_ch_pca(I2C_CH_VSC3316);
428 ret = vsc3316_config(VSC3316_TX_ADDRESS,
429 vsc16_tx_sfp_sgmii_aurora,
433 ret = vsc3316_config(VSC3316_RX_ADDRESS,
434 vsc16_rx_sfp_sgmii_aurora,
443 #ifdef CONFIG_ARCH_B4420
449 * Lanes: A,B,C,D: SGMII
450 * Lanes: E,F,G,H: CPRI
452 debug("Configuring crossbar to use onboard SGMII PHYs:"
453 "srds_prctl:%x\n", serdes1_prtcl);
454 num_vsc16_con = NUM_CON_VSC3316;
455 /* Configure VSC3316 crossbar switch */
456 ret = select_i2c_ch_pca(I2C_CH_VSC3316);
458 ret = vsc3316_config(VSC3316_TX_ADDRESS,
459 vsc16_tx_sgmii_lane_cd, num_vsc16_con);
462 ret = vsc3316_config(VSC3316_RX_ADDRESS,
463 vsc16_rx_sgmii_lane_cd, num_vsc16_con);
476 num_vsc16_con = NUM_CON_VSC3316;
477 /* Configure VSC3316 crossbar switch */
478 ret = select_i2c_ch_pca(I2C_CH_VSC3316);
480 ret = vsc3316_config(VSC3316_TX_ADDRESS,
481 vsc16_tx_sfp, num_vsc16_con);
484 ret = vsc3316_config(VSC3316_RX_ADDRESS,
485 vsc16_rx_sfp, num_vsc16_con);
493 printf("WARNING:VSC crossbars programming not supported for:%x"
494 " SerDes1 Protocol.\n", serdes1_prtcl);
498 num_vsc08_con = NUM_CON_VSC3308;
499 /* Configure VSC3308 crossbar switch */
500 ret = select_i2c_ch_pca(I2C_CH_VSC3308);
501 switch (serdes2_prtcl) {
502 #ifdef CONFIG_ARCH_B4420
514 ret = vsc3308_config(VSC3308_TX_ADDRESS,
515 vsc08_tx_amc, num_vsc08_con);
518 ret = vsc3308_config(VSC3308_RX_ADDRESS,
519 vsc08_rx_amc, num_vsc08_con);
545 * Extract hwconfig from environment since environment
546 * is not setup properly yet
548 env_get_f("hwconfig", buffer, sizeof(buffer));
551 if (hwconfig_subarg_cmp_f("fsl_b4860_serdes2",
552 "sfp_amc", "sfp", buf)) {
553 #ifdef CONFIG_SYS_FSL_B4860QDS_XFI_ERR
554 /* change default VSC3308 for XFI erratum */
555 ret = vsc3308_config_adjust(VSC3308_TX_ADDRESS,
556 vsc08_tx_sfp, num_vsc08_con);
560 ret = vsc3308_config_adjust(VSC3308_RX_ADDRESS,
561 vsc08_rx_sfp, num_vsc08_con);
565 ret = vsc3308_config(VSC3308_TX_ADDRESS,
566 vsc08_tx_sfp, num_vsc08_con);
570 ret = vsc3308_config(VSC3308_RX_ADDRESS,
571 vsc08_rx_sfp, num_vsc08_con);
576 ret = vsc3308_config(VSC3308_TX_ADDRESS,
577 vsc08_tx_amc, num_vsc08_con);
581 ret = vsc3308_config(VSC3308_RX_ADDRESS,
582 vsc08_rx_amc, num_vsc08_con);
592 printf("WARNING:VSC crossbars programming not supported for: %x"
593 " SerDes2 Protocol.\n", serdes2_prtcl);
600 static int calibrate_pll(serdes_corenet_t *srds_regs, int pll_num)
604 /* Steps For SerDes PLLs reset and reconfiguration
605 * or PLL power-up procedure
607 debug("CALIBRATE PLL:%d\n", pll_num);
608 clrbits_be32(&srds_regs->bank[pll_num].rstctl,
609 SRDS_RSTCTL_SDRST_B);
611 clrbits_be32(&srds_regs->bank[pll_num].rstctl,
612 (SRDS_RSTCTL_SDEN | SRDS_RSTCTL_PLLRST_B));
614 setbits_be32(&srds_regs->bank[pll_num].rstctl,
616 setbits_be32(&srds_regs->bank[pll_num].rstctl,
617 (SRDS_RSTCTL_SDEN | SRDS_RSTCTL_PLLRST_B
618 | SRDS_RSTCTL_SDRST_B));
622 /* Check whether PLL has been locked or not */
623 rst_err = in_be32(&srds_regs->bank[pll_num].rstctl) &
625 rst_err >>= SRDS_RSTCTL_RSTERR_SHIFT;
626 debug("RST_ERR value for PLL %d is: 0x%x:\n", pll_num, rst_err);
633 static int check_pll_locks(serdes_corenet_t *srds_regs, int pll_num)
636 u32 fcap, dcbias, bcap, pllcr1, pllcr0;
638 if (calibrate_pll(srds_regs, pll_num)) {
640 /* Read fcap, dcbias and bcap value */
641 clrbits_be32(&srds_regs->bank[pll_num].pllcr0,
642 SRDS_PLLCR0_DCBIAS_OUT_EN);
643 fcap = in_be32(&srds_regs->bank[pll_num].pllsr2) &
645 fcap >>= SRDS_PLLSR2_FCAP_SHIFT;
646 bcap = in_be32(&srds_regs->bank[pll_num].pllsr2) &
648 bcap >>= SRDS_PLLSR2_BCAP_EN_SHIFT;
649 setbits_be32(&srds_regs->bank[pll_num].pllcr0,
650 SRDS_PLLCR0_DCBIAS_OUT_EN);
651 dcbias = in_be32(&srds_regs->bank[pll_num].pllsr2) &
653 dcbias >>= SRDS_PLLSR2_DCBIAS_SHIFT;
654 debug("values of bcap:%x, fcap:%x and dcbias:%x\n",
656 if (fcap == 0 && bcap == 1) {
658 clrbits_be32(&srds_regs->bank[pll_num].rstctl,
659 (SRDS_RSTCTL_SDEN | SRDS_RSTCTL_PLLRST_B
660 | SRDS_RSTCTL_SDRST_B));
661 clrbits_be32(&srds_regs->bank[pll_num].pllcr1,
662 SRDS_PLLCR1_BCAP_EN);
663 setbits_be32(&srds_regs->bank[pll_num].pllcr1,
664 SRDS_PLLCR1_BCAP_OVD);
665 if (calibrate_pll(srds_regs, pll_num)) {
666 /*save the fcap, dcbias and bcap values*/
667 clrbits_be32(&srds_regs->bank[pll_num].pllcr0,
668 SRDS_PLLCR0_DCBIAS_OUT_EN);
669 fcap = in_be32(&srds_regs->bank[pll_num].pllsr2)
671 fcap >>= SRDS_PLLSR2_FCAP_SHIFT;
672 bcap = in_be32(&srds_regs->bank[pll_num].pllsr2)
673 & SRDS_PLLSR2_BCAP_EN;
674 bcap >>= SRDS_PLLSR2_BCAP_EN_SHIFT;
675 setbits_be32(&srds_regs->bank[pll_num].pllcr0,
676 SRDS_PLLCR0_DCBIAS_OUT_EN);
678 (&srds_regs->bank[pll_num].pllsr2) &
680 dcbias >>= SRDS_PLLSR2_DCBIAS_SHIFT;
683 clrbits_be32(&srds_regs->bank[pll_num].rstctl,
684 (SRDS_RSTCTL_SDEN | SRDS_RSTCTL_PLLRST_B
685 | SRDS_RSTCTL_SDRST_B));
686 setbits_be32(&srds_regs->bank[pll_num].pllcr1,
687 SRDS_PLLCR1_BYP_CAL);
688 clrbits_be32(&srds_regs->bank[pll_num].pllcr1,
689 SRDS_PLLCR1_BCAP_EN);
690 setbits_be32(&srds_regs->bank[pll_num].pllcr1,
691 SRDS_PLLCR1_BCAP_OVD);
692 /* change the fcap and dcbias to the saved
693 * values from Step 3 */
694 clrbits_be32(&srds_regs->bank[pll_num].pllcr1,
695 SRDS_PLLCR1_PLL_FCAP);
697 (&srds_regs->bank[pll_num].pllcr1)|
698 (fcap << SRDS_PLLCR1_PLL_FCAP_SHIFT));
699 out_be32(&srds_regs->bank[pll_num].pllcr1,
701 clrbits_be32(&srds_regs->bank[pll_num].pllcr0,
702 SRDS_PLLCR0_DCBIAS_OVRD);
704 (&srds_regs->bank[pll_num].pllcr0)|
705 (dcbias << SRDS_PLLCR0_DCBIAS_OVRD_SHIFT));
706 out_be32(&srds_regs->bank[pll_num].pllcr0,
708 ret = calibrate_pll(srds_regs, pll_num);
714 } else { /* Step 5 */
715 clrbits_be32(&srds_regs->bank[pll_num].rstctl,
716 (SRDS_RSTCTL_SDEN | SRDS_RSTCTL_PLLRST_B
717 | SRDS_RSTCTL_SDRST_B));
719 /* Change the fcap, dcbias, and bcap to the
720 * values from Step 1 */
721 setbits_be32(&srds_regs->bank[pll_num].pllcr1,
722 SRDS_PLLCR1_BYP_CAL);
723 clrbits_be32(&srds_regs->bank[pll_num].pllcr1,
724 SRDS_PLLCR1_PLL_FCAP);
725 pllcr1 = (in_be32(&srds_regs->bank[pll_num].pllcr1)|
726 (fcap << SRDS_PLLCR1_PLL_FCAP_SHIFT));
727 out_be32(&srds_regs->bank[pll_num].pllcr1,
729 clrbits_be32(&srds_regs->bank[pll_num].pllcr0,
730 SRDS_PLLCR0_DCBIAS_OVRD);
731 pllcr0 = (in_be32(&srds_regs->bank[pll_num].pllcr0)|
732 (dcbias << SRDS_PLLCR0_DCBIAS_OVRD_SHIFT));
733 out_be32(&srds_regs->bank[pll_num].pllcr0,
735 clrbits_be32(&srds_regs->bank[pll_num].pllcr1,
736 SRDS_PLLCR1_BCAP_EN);
737 setbits_be32(&srds_regs->bank[pll_num].pllcr1,
738 SRDS_PLLCR1_BCAP_OVD);
739 ret = calibrate_pll(srds_regs, pll_num);
748 static int check_serdes_pll_locks(void)
750 serdes_corenet_t *srds1_regs =
751 (void *)CONFIG_SYS_FSL_CORENET_SERDES_ADDR;
752 serdes_corenet_t *srds2_regs =
753 (void *)CONFIG_SYS_FSL_CORENET_SERDES2_ADDR;
756 debug("\nSerDes1 Lock check\n");
757 for (i = 0; i < CONFIG_SYS_FSL_SRDS_NUM_PLLS; i++) {
758 ret1 = check_pll_locks(srds1_regs, i);
760 printf("SerDes1, PLL:%d didnt lock\n", i);
764 debug("\nSerDes2 Lock check\n");
765 for (i = 0; i < CONFIG_SYS_FSL_SRDS_NUM_PLLS; i++) {
766 ret2 = check_pll_locks(srds2_regs, i);
768 printf("SerDes2, PLL:%d didnt lock\n", i);
776 int config_serdes1_refclks(void)
778 ccsr_gur_t *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR);
779 serdes_corenet_t *srds_regs =
780 (void *)CONFIG_SYS_FSL_CORENET_SERDES_ADDR;
781 u32 serdes1_prtcl, lane;
782 unsigned int flag_sgmii_aurora_prtcl = 0;
786 serdes1_prtcl = in_be32(&gur->rcwsr[4]) &
787 FSL_CORENET2_RCWSR4_SRDS1_PRTCL;
788 if (!serdes1_prtcl) {
789 printf("SERDES1 is not enabled\n");
792 serdes1_prtcl >>= FSL_CORENET2_RCWSR4_SRDS1_PRTCL_SHIFT;
793 debug("Using SERDES1 Protocol: 0x%x:\n", serdes1_prtcl);
795 /* To prevent generation of reset request from SerDes
796 * while changing the refclks, By setting SRDS_RST_MSK bit,
797 * SerDes reset event cannot cause a reset request
799 setbits_be32(&gur->rstrqmr1, FSL_CORENET_RSTRQMR1_SRDS_RST_MSK);
801 /* Reconfigure IDT idt8t49n222a device for CPRI to work
802 * For this SerDes1's Refclk1 and refclk2 need to be set
805 switch (serdes1_prtcl) {
833 debug("Configuring idt8t49n222a for CPRI SerDes clks:"
834 " for srds_prctl:%x\n", serdes1_prtcl);
835 ret = select_i2c_ch_pca(I2C_CH_IDT);
837 ret = set_serdes_refclk(IDT_SERDES1_ADDRESS, 1,
838 SERDES_REFCLK_122_88,
839 SERDES_REFCLK_122_88, 0);
841 printf("IDT8T49N222A configuration failed.\n");
844 debug("IDT8T49N222A configured.\n");
848 select_i2c_ch_pca(I2C_CH_DEFAULT);
850 /* Change SerDes1's Refclk1 to 125MHz for on board
851 * SGMIIs or Aurora to work
853 for (lane = 0; lane < SRDS_MAX_LANES; lane++) {
854 enum srds_prtcl lane_prtcl = serdes_get_prtcl
855 (0, serdes1_prtcl, lane);
856 switch (lane_prtcl) {
857 case SGMII_FM1_DTSEC1:
858 case SGMII_FM1_DTSEC2:
859 case SGMII_FM1_DTSEC3:
860 case SGMII_FM1_DTSEC4:
861 case SGMII_FM1_DTSEC5:
862 case SGMII_FM1_DTSEC6:
864 flag_sgmii_aurora_prtcl++;
871 if (flag_sgmii_aurora_prtcl)
872 QIXIS_WRITE(brdcfg[4], QIXIS_SRDS1CLK_125);
874 /* Steps For SerDes PLLs reset and reconfiguration after
875 * changing SerDes's refclks
877 for (i = 0; i < CONFIG_SYS_FSL_SRDS_NUM_PLLS; i++) {
878 debug("For PLL%d reset and reconfiguration after"
879 " changing refclks\n", i+1);
880 clrbits_be32(&srds_regs->bank[i].rstctl,
881 SRDS_RSTCTL_SDRST_B);
883 clrbits_be32(&srds_regs->bank[i].rstctl,
884 (SRDS_RSTCTL_SDEN | SRDS_RSTCTL_PLLRST_B));
886 setbits_be32(&srds_regs->bank[i].rstctl,
888 setbits_be32(&srds_regs->bank[i].rstctl,
889 (SRDS_RSTCTL_SDEN | SRDS_RSTCTL_PLLRST_B
890 | SRDS_RSTCTL_SDRST_B));
894 printf("WARNING:IDT8T49N222A configuration not"
895 " supported for:%x SerDes1 Protocol.\n",
900 /* Clearing SRDS_RST_MSK bit as now
901 * SerDes reset event can cause a reset request
903 clrbits_be32(&gur->rstrqmr1, FSL_CORENET_RSTRQMR1_SRDS_RST_MSK);
907 int config_serdes2_refclks(void)
909 ccsr_gur_t *gur = (void __iomem *)(CONFIG_SYS_MPC85xx_GUTS_ADDR);
910 serdes_corenet_t *srds2_regs =
911 (void *)CONFIG_SYS_FSL_CORENET_SERDES2_ADDR;
916 serdes2_prtcl = in_be32(&gur->rcwsr[4]) &
917 FSL_CORENET2_RCWSR4_SRDS2_PRTCL;
918 if (!serdes2_prtcl) {
919 debug("SERDES2 is not enabled\n");
922 serdes2_prtcl >>= FSL_CORENET2_RCWSR4_SRDS2_PRTCL_SHIFT;
923 debug("Using SERDES2 Protocol: 0x%x:\n", serdes2_prtcl);
925 /* To prevent generation of reset request from SerDes
926 * while changing the refclks, By setting SRDS_RST_MSK bit,
927 * SerDes reset event cannot cause a reset request
929 setbits_be32(&gur->rstrqmr1, FSL_CORENET_RSTRQMR1_SRDS_RST_MSK);
931 /* Reconfigure IDT idt8t49n222a device for PCIe SATA to work
932 * For this SerDes2's Refclk1 need to be set to 100MHz
934 switch (serdes2_prtcl) {
935 #ifdef CONFIG_ARCH_B4420
943 debug("Configuring IDT for PCIe SATA for srds_prctl:%x\n",
945 ret = select_i2c_ch_pca(I2C_CH_IDT);
947 ret = set_serdes_refclk(IDT_SERDES2_ADDRESS, 2,
949 SERDES_REFCLK_156_25, 0);
951 printf("IDT8T49N222A configuration failed.\n");
954 debug("IDT8T49N222A configured.\n");
958 select_i2c_ch_pca(I2C_CH_DEFAULT);
960 /* Steps For SerDes PLLs reset and reconfiguration after
961 * changing SerDes's refclks
963 for (i = 0; i < CONFIG_SYS_FSL_SRDS_NUM_PLLS; i++) {
964 clrbits_be32(&srds2_regs->bank[i].rstctl,
965 SRDS_RSTCTL_SDRST_B);
967 clrbits_be32(&srds2_regs->bank[i].rstctl,
968 (SRDS_RSTCTL_SDEN | SRDS_RSTCTL_PLLRST_B));
970 setbits_be32(&srds2_regs->bank[i].rstctl,
972 setbits_be32(&srds2_regs->bank[i].rstctl,
973 (SRDS_RSTCTL_SDEN | SRDS_RSTCTL_PLLRST_B
974 | SRDS_RSTCTL_SDRST_B));
980 printf("IDT configuration not supported for:%x S2 Protocol.\n",
985 /* Clearing SRDS_RST_MSK bit as now
986 * SerDes reset event can cause a reset request
988 clrbits_be32(&gur->rstrqmr1, FSL_CORENET_RSTRQMR1_SRDS_RST_MSK);
992 int board_early_init_r(void)
994 const unsigned int flashbase = CONFIG_SYS_FLASH_BASE;
995 int flash_esel = find_tlb_idx((void *)flashbase, 1);
997 u32 svr = SVR_SOC_VER(get_svr());
999 /* Create law for MAPLE only for personalities having MAPLE */
1000 if ((svr == SVR_B4860) || (svr == SVR_B4440) ||
1001 (svr == SVR_B4420) || (svr == SVR_B4220)) {
1002 set_next_law(CONFIG_SYS_MAPLE_MEM_PHYS, LAW_SIZE_16M,
1007 * Remap Boot flash + PROMJET region to caching-inhibited
1008 * so that flash can be erased properly.
1011 /* Flush d-cache and invalidate i-cache of any FLASH data */
1013 invalidate_icache();
1015 if (flash_esel == -1) {
1016 /* very unlikely unless something is messed up */
1017 puts("Error: Could not find TLB for FLASH BASE\n");
1018 flash_esel = 2; /* give our best effort to continue */
1020 /* invalidate existing TLB entry for flash + promjet */
1021 disable_tlb(flash_esel);
1024 set_tlb(1, flashbase, CONFIG_SYS_FLASH_BASE_PHYS,
1025 MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G,
1026 0, flash_esel, BOOKE_PAGESZ_256M, 1);
1029 * Adjust core voltage according to voltage ID
1030 * This function changes I2C mux to channel 2.
1032 if (adjust_vdd(0) < 0)
1033 printf("Warning: Adjusting core voltage failed\n");
1035 /* SerDes1 refclks need to be set again, as default clks
1036 * are not suitable for CPRI and onboard SGMIIs to work
1038 * This function will set SerDes1's Refclk1 and refclk2
1039 * as per SerDes1 protocols
1041 if (config_serdes1_refclks())
1042 printf("SerDes1 Refclks couldn't set properly.\n");
1044 printf("SerDes1 Refclks have been set.\n");
1046 /* SerDes2 refclks need to be set again, as default clks
1047 * are not suitable for PCIe SATA to work
1048 * This function will set SerDes2's Refclk1 and refclk2
1049 * for SerDes2 protocols having PCIe in them
1050 * for PCIe SATA to work
1052 ret = config_serdes2_refclks();
1054 printf("SerDes2 Refclks have been set.\n");
1055 else if (ret == -ENODEV)
1056 printf("SerDes disable, Refclks couldn't change.\n");
1058 printf("SerDes2 Refclk reconfiguring failed.\n");
1060 #if defined(CONFIG_SYS_FSL_ERRATUM_A006384) || \
1061 defined(CONFIG_SYS_FSL_ERRATUM_A006475)
1062 /* Rechecking the SerDes locks after all SerDes configurations
1063 * are done, As SerDes PLLs may not lock reliably at 5 G VCO
1064 * and at cold temperatures.
1065 * Following sequence ensure the proper locking of SerDes PLLs.
1067 if (SVR_MAJ(get_svr()) == 1) {
1068 if (check_serdes_pll_locks())
1069 printf("SerDes plls still not locked properly.\n");
1071 printf("SerDes plls have been locked well.\n");
1075 /* Configure VSC3316 and VSC3308 crossbar switches */
1076 if (configure_vsc3316_3308())
1077 printf("VSC:failed to configure VSC3316/3308.\n");
1079 printf("VSC:VSC3316/3308 successfully configured.\n");
1081 select_i2c_ch_pca(I2C_CH_DEFAULT);
1086 unsigned long get_board_sys_clk(void)
1088 u8 sysclk_conf = QIXIS_READ(brdcfg[1]);
1090 switch ((sysclk_conf & 0x0C) >> 2) {
1101 unsigned long get_board_ddr_clk(void)
1103 u8 ddrclk_conf = QIXIS_READ(brdcfg[1]);
1105 switch (ddrclk_conf & 0x03) {
1116 static int serdes_refclock(u8 sw, u8 sdclk)
1123 brdcfg4 = QIXIS_READ(brdcfg[4]);
1124 if ((brdcfg4 & CLK_MUX_SEL_MASK) == ETH_PHY_CLK_OUT)
1125 return SRDS_PLLCR0_RFCK_SEL_125;
1127 clock = (sw >> 5) & 7;
1129 clock = (sw >> 6) & 3;
1133 ret = SRDS_PLLCR0_RFCK_SEL_100;
1136 ret = SRDS_PLLCR0_RFCK_SEL_125;
1139 ret = SRDS_PLLCR0_RFCK_SEL_156_25;
1142 ret = SRDS_PLLCR0_RFCK_SEL_161_13;
1147 ret = SRDS_PLLCR0_RFCK_SEL_122_88;
1157 #define NUM_SRDS_BANKS 2
1159 int misc_init_r(void)
1162 serdes_corenet_t *srds_regs =
1163 (void *)CONFIG_SYS_FSL_CORENET_SERDES_ADDR;
1164 u32 actual[NUM_SRDS_BANKS];
1168 sw = QIXIS_READ(brdcfg[2]);
1169 clock = serdes_refclock(sw, 1);
1173 printf("Warning: SDREFCLK1 switch setting is unsupported\n");
1175 sw = QIXIS_READ(brdcfg[4]);
1176 clock = serdes_refclock(sw, 2);
1180 printf("Warning: SDREFCLK2 switch setting unsupported\n");
1182 for (i = 0; i < NUM_SRDS_BANKS; i++) {
1183 u32 pllcr0 = srds_regs->bank[i].pllcr0;
1184 u32 expected = pllcr0 & SRDS_PLLCR0_RFCK_SEL_MASK;
1185 if (expected != actual[i]) {
1186 printf("Warning: SERDES bank %u expects reference clock"
1187 " %sMHz, but actual is %sMHz\n", i + 1,
1188 serdes_clock_to_string(expected),
1189 serdes_clock_to_string(actual[i]));
1196 int ft_board_setup(void *blob, bd_t *bd)
1201 ft_cpu_setup(blob, bd);
1203 base = env_get_bootm_low();
1204 size = env_get_bootm_size();
1206 fdt_fixup_memory(blob, (u64)base, (u64)size);
1209 pci_of_setup(blob, bd);
1212 fdt_fixup_liodn(blob);
1214 #ifdef CONFIG_HAS_FSL_DR_USB
1215 fsl_fdt_fixup_dr_usb(blob, bd);
1218 #ifdef CONFIG_SYS_DPAA_FMAN
1219 fdt_fixup_fman_ethernet(blob);
1220 fdt_fixup_board_enet(blob);
1227 * Dump board switch settings.
1228 * The bits that cannot be read/sampled via some FPGA or some
1229 * registers, they will be displayed as
1230 * underscore in binary format. mask[] has those bits.
1231 * Some bits are calculated differently than the actual switches
1232 * if booting with overriding by FPGA.
1234 void qixis_dump_switch(void)
1240 * Any bit with 1 means that bit cannot be reverse engineered.
1241 * It will be displayed as _ in binary format.
1243 static const u8 mask[] = {0x07, 0, 0, 0xff, 0};
1245 u8 brdcfg[16], dutcfg[16];
1247 for (i = 0; i < 16; i++) {
1248 brdcfg[i] = qixis_read(offsetof(struct qixis, brdcfg[0]) + i);
1249 dutcfg[i] = qixis_read(offsetof(struct qixis, dutcfg[0]) + i);
1252 sw[0] = ((brdcfg[0] & 0x0f) << 4) | \
1254 sw[1] = ((dutcfg[1] & 0x01) << 7) | \
1255 ((dutcfg[2] & 0x07) << 4) | \
1256 ((dutcfg[6] & 0x10) >> 1) | \
1257 ((dutcfg[6] & 0x80) >> 5) | \
1258 ((dutcfg[1] & 0x40) >> 5) | \
1262 sw[4] = ((brdcfg[1] & 0x30) << 2) | \
1263 ((brdcfg[1] & 0xc0) >> 2) | \
1266 puts("DIP switch settings:\n");
1267 for (i = 0; i < 5; i++) {
1268 printf("SW%d = 0b%s (0x%02x)\n",
1269 i + 1, byte_to_binary_mask(sw[i], mask[i], buf), sw[i]);