1 // SPDX-License-Identifier: GPL-2.0+
3 * Copyright 2011-2012 Freescale Semiconductor, Inc.
9 #include <fdt_support.h>
15 #include <linux/compiler.h>
17 #include <asm/processor.h>
18 #include <linux/errno.h>
19 #include <asm/cache.h>
20 #include <asm/immap_85xx.h>
21 #include <asm/fsl_law.h>
22 #include <asm/fsl_serdes.h>
23 #include <asm/fsl_liodn.h>
27 #include "../common/qixis.h"
28 #include "../common/vsc3316_3308.h"
29 #include "../common/idt8t49n222a_serdes_clk.h"
30 #include "../common/zm7300.h"
32 #include "b4860qds_qixis.h"
33 #include "b4860qds_crossbar_con.h"
35 #define CLK_MUX_SEL_MASK 0x4
36 #define ETH_PHY_CLK_OUT 0x4
38 DECLARE_GLOBAL_DATA_PTR;
44 struct cpu_type *cpu = gd->arch.cpu;
45 static const char *const freq[] = {"100", "125", "156.25", "161.13",
46 "122.88", "122.88", "122.88"};
49 printf("Board: %sQDS, ", cpu->name);
50 printf("Sys ID: 0x%02x, Sys Ver: 0x%02x, ",
51 QIXIS_READ(id), QIXIS_READ(arch));
53 sw = QIXIS_READ(brdcfg[0]);
54 sw = (sw & QIXIS_LBMAP_MASK) >> QIXIS_LBMAP_SHIFT;
57 printf("vBank: %d\n", sw);
58 else if (sw >= 0x8 && sw <= 0xE)
61 printf("invalid setting of SW%u\n", QIXIS_LBMAP_SWITCH);
63 printf("FPGA: v%d (%s), build %d",
64 (int)QIXIS_READ(scver), qixis_read_tag(buf),
65 (int)qixis_read_minor());
66 /* the timestamp string contains "\n" at the end */
67 printf(" on %s", qixis_read_time(buf));
70 * Display the actual SERDES reference clocks as configured by the
71 * dip switches on the board. Note that the SWx registers could
72 * technically be set to force the reference clocks to match the
73 * values that the SERDES expects (or vice versa). For now, however,
74 * we just display both values and hope the user notices when they
77 puts("SERDES Reference Clocks: ");
78 sw = QIXIS_READ(brdcfg[2]);
79 clock = (sw >> 5) & 7;
80 printf("Bank1=%sMHz ", freq[clock]);
81 sw = QIXIS_READ(brdcfg[4]);
82 clock = (sw >> 6) & 3;
83 printf("Bank2=%sMHz\n", freq[clock]);
88 int select_i2c_ch_pca(u8 ch)
92 /* Selecting proper channel via PCA*/
93 ret = i2c_write(I2C_MUX_PCA_ADDR, 0x0, 1, &ch, 1);
95 printf("PCA: failed to select proper channel.\n");
103 * read_voltage from sensor on I2C bus
104 * We use average of 4 readings, waiting for 532us befor another reading
106 #define WAIT_FOR_ADC 532 /* wait for 532 microseconds for ADC */
107 #define NUM_READINGS 4 /* prefer to be power of 2 for efficiency */
109 static inline int read_voltage(void)
111 int i, ret, voltage_read = 0;
114 for (i = 0; i < NUM_READINGS; i++) {
115 ret = i2c_read(I2C_VOL_MONITOR_ADDR,
116 I2C_VOL_MONITOR_BUS_V_OFFSET, 1, (void *)&vol_mon, 2);
118 printf("VID: failed to read core voltage\n");
121 if (vol_mon & I2C_VOL_MONITOR_BUS_V_OVF) {
122 printf("VID: Core voltage sensor error\n");
125 debug("VID: bus voltage reads 0x%04x\n", vol_mon);
127 voltage_read += (vol_mon >> I2C_VOL_MONITOR_BUS_V_SHIFT) * 4;
128 udelay(WAIT_FOR_ADC);
130 /* calculate the average */
131 voltage_read /= NUM_READINGS;
136 static int adjust_vdd(ulong vdd_override)
138 int re_enable = disable_interrupts();
139 ccsr_gur_t __iomem *gur =
140 (void __iomem *)(CONFIG_SYS_MPC85xx_GUTS_ADDR);
143 int vdd_target, vdd_last;
144 int existing_voltage, temp_voltage, voltage; /* all in 1/10 mV */
146 unsigned int orig_i2c_speed;
147 unsigned long vdd_string_override;
149 static const uint16_t vdd[32] = {
182 ret = select_i2c_ch_pca(I2C_MUX_CH_VOL_MONITOR);
184 printf("VID: I2c failed to switch channel\n");
189 /* get the voltage ID from fuse status register */
190 fusesr = in_be32(&gur->dcfg_fusesr);
191 vid = (fusesr >> FSL_CORENET_DCFG_FUSESR_VID_SHIFT) &
192 FSL_CORENET_DCFG_FUSESR_VID_MASK;
193 if (vid == FSL_CORENET_DCFG_FUSESR_VID_MASK) {
194 vid = (fusesr >> FSL_CORENET_DCFG_FUSESR_ALTVID_SHIFT) &
195 FSL_CORENET_DCFG_FUSESR_ALTVID_MASK;
197 vdd_target = vdd[vid];
198 debug("VID:Reading from from fuse,vid=%x vdd is %dmV\n",
201 /* check override variable for overriding VDD */
202 vdd_string = env_get("b4qds_vdd_mv");
203 if (vdd_override == 0 && vdd_string &&
204 !strict_strtoul(vdd_string, 10, &vdd_string_override))
205 vdd_override = vdd_string_override;
206 if (vdd_override >= 819 && vdd_override <= 1212) {
207 vdd_target = vdd_override * 10; /* convert to 1/10 mV */
208 debug("VDD override is %lu\n", vdd_override);
209 } else if (vdd_override != 0) {
210 printf("Invalid value.\n");
213 if (vdd_target == 0) {
214 printf("VID: VID not used\n");
220 * Read voltage monitor to check real voltage.
221 * Voltage monitor LSB is 4mv.
223 vdd_last = read_voltage();
225 printf("VID: abort VID adjustment\n");
230 debug("VID: Core voltage is at %d mV\n", vdd_last);
231 ret = select_i2c_ch_pca(I2C_MUX_CH_DPM);
233 printf("VID: I2c failed to switch channel to DPM\n");
238 /* Round up to the value of step of Voltage regulator */
239 voltage = roundup(vdd_target, ZM_STEP);
240 debug("VID: rounded up voltage = %d\n", voltage);
242 /* lower the speed to 100kHz to access ZM7300 device */
243 debug("VID: Setting bus speed to 100KHz if not already set\n");
244 orig_i2c_speed = i2c_get_bus_speed();
245 if (orig_i2c_speed != 100000)
246 i2c_set_bus_speed(100000);
248 /* Read the existing level on board, if equal to requsted one,
250 existing_voltage = zm_read_voltage();
252 /* allowing the voltage difference of one step 0.0125V acceptable */
253 if ((existing_voltage >= voltage) &&
254 (existing_voltage < (voltage + ZM_STEP))) {
255 debug("VID: voltage already set as requested,returning\n");
256 ret = existing_voltage;
259 debug("VID: Changing voltage for board from %dmV to %dmV\n",
260 existing_voltage/10, voltage/10);
262 if (zm_disable_wp() < 0) {
266 /* Change Voltage: the change is done through all the steps in the
267 way, to avoid reset to the board due to power good signal fail
268 in big voltage change gap jump.
270 if (existing_voltage > voltage) {
271 temp_voltage = existing_voltage - ZM_STEP;
272 while (temp_voltage >= voltage) {
273 ret = zm_write_voltage(temp_voltage);
274 if (ret == temp_voltage) {
275 temp_voltage -= ZM_STEP;
277 /* ZM7300 device failed to set
280 ("VID:Stepping down vol failed:%dmV\n",
287 temp_voltage = existing_voltage + ZM_STEP;
288 while (temp_voltage < (voltage + ZM_STEP)) {
289 ret = zm_write_voltage(temp_voltage);
290 if (ret == temp_voltage) {
291 temp_voltage += ZM_STEP;
293 /* ZM7300 device failed to set
296 ("VID:Stepping up vol failed:%dmV\n",
304 if (zm_enable_wp() < 0)
307 /* restore the speed to 400kHz */
308 out: debug("VID: Restore the I2C bus speed to %dKHz\n",
309 orig_i2c_speed/1000);
310 i2c_set_bus_speed(orig_i2c_speed);
314 ret = select_i2c_ch_pca(I2C_MUX_CH_VOL_MONITOR);
316 printf("VID: I2c failed to switch channel\n");
320 vdd_last = read_voltage();
321 select_i2c_ch_pca(I2C_CH_DEFAULT);
324 printf("VID: Core voltage %d mV\n", vdd_last);
334 int configure_vsc3316_3308(void)
336 ccsr_gur_t *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR);
337 unsigned int num_vsc16_con, num_vsc08_con;
338 u32 serdes1_prtcl, serdes2_prtcl;
340 char buffer[HWCONFIG_BUFFER_SIZE];
343 serdes1_prtcl = in_be32(&gur->rcwsr[4]) &
344 FSL_CORENET2_RCWSR4_SRDS1_PRTCL;
345 if (!serdes1_prtcl) {
346 printf("SERDES1 is not enabled\n");
349 serdes1_prtcl >>= FSL_CORENET2_RCWSR4_SRDS1_PRTCL_SHIFT;
350 debug("Using SERDES1 Protocol: 0x%x:\n", serdes1_prtcl);
352 serdes2_prtcl = in_be32(&gur->rcwsr[4]) &
353 FSL_CORENET2_RCWSR4_SRDS2_PRTCL;
354 if (!serdes2_prtcl) {
355 printf("SERDES2 is not enabled\n");
358 serdes2_prtcl >>= FSL_CORENET2_RCWSR4_SRDS2_PRTCL_SHIFT;
359 debug("Using SERDES2 Protocol: 0x%x:\n", serdes2_prtcl);
361 switch (serdes1_prtcl) {
371 * Lanes: C,D,E,F,G,H: CPRI
373 debug("Configuring crossbar to use onboard SGMII PHYs:"
374 "srds_prctl:%x\n", serdes1_prtcl);
375 num_vsc16_con = NUM_CON_VSC3316;
376 /* Configure VSC3316 crossbar switch */
377 ret = select_i2c_ch_pca(I2C_CH_VSC3316);
379 ret = vsc3316_config(VSC3316_TX_ADDRESS,
380 vsc16_tx_4sfp_sgmii_12_56,
384 ret = vsc3316_config(VSC3316_RX_ADDRESS,
385 vsc16_rx_4sfp_sgmii_12_56,
421 * Lanes: E,F,G,H: CPRI
423 debug("Configuring crossbar for Aurora, SGMII 3 and 4,"
424 " and CPRI. srds_prctl:%x\n", serdes1_prtcl);
425 num_vsc16_con = NUM_CON_VSC3316;
426 /* Configure VSC3316 crossbar switch */
427 ret = select_i2c_ch_pca(I2C_CH_VSC3316);
429 ret = vsc3316_config(VSC3316_TX_ADDRESS,
430 vsc16_tx_sfp_sgmii_aurora,
434 ret = vsc3316_config(VSC3316_RX_ADDRESS,
435 vsc16_rx_sfp_sgmii_aurora,
444 #ifdef CONFIG_ARCH_B4420
450 * Lanes: A,B,C,D: SGMII
451 * Lanes: E,F,G,H: CPRI
453 debug("Configuring crossbar to use onboard SGMII PHYs:"
454 "srds_prctl:%x\n", serdes1_prtcl);
455 num_vsc16_con = NUM_CON_VSC3316;
456 /* Configure VSC3316 crossbar switch */
457 ret = select_i2c_ch_pca(I2C_CH_VSC3316);
459 ret = vsc3316_config(VSC3316_TX_ADDRESS,
460 vsc16_tx_sgmii_lane_cd, num_vsc16_con);
463 ret = vsc3316_config(VSC3316_RX_ADDRESS,
464 vsc16_rx_sgmii_lane_cd, num_vsc16_con);
477 num_vsc16_con = NUM_CON_VSC3316;
478 /* Configure VSC3316 crossbar switch */
479 ret = select_i2c_ch_pca(I2C_CH_VSC3316);
481 ret = vsc3316_config(VSC3316_TX_ADDRESS,
482 vsc16_tx_sfp, num_vsc16_con);
485 ret = vsc3316_config(VSC3316_RX_ADDRESS,
486 vsc16_rx_sfp, num_vsc16_con);
494 printf("WARNING:VSC crossbars programming not supported for:%x"
495 " SerDes1 Protocol.\n", serdes1_prtcl);
499 num_vsc08_con = NUM_CON_VSC3308;
500 /* Configure VSC3308 crossbar switch */
501 ret = select_i2c_ch_pca(I2C_CH_VSC3308);
502 switch (serdes2_prtcl) {
503 #ifdef CONFIG_ARCH_B4420
515 ret = vsc3308_config(VSC3308_TX_ADDRESS,
516 vsc08_tx_amc, num_vsc08_con);
519 ret = vsc3308_config(VSC3308_RX_ADDRESS,
520 vsc08_rx_amc, num_vsc08_con);
546 * Extract hwconfig from environment since environment
547 * is not setup properly yet
549 env_get_f("hwconfig", buffer, sizeof(buffer));
552 if (hwconfig_subarg_cmp_f("fsl_b4860_serdes2",
553 "sfp_amc", "sfp", buf)) {
554 #ifdef CONFIG_SYS_FSL_B4860QDS_XFI_ERR
555 /* change default VSC3308 for XFI erratum */
556 ret = vsc3308_config_adjust(VSC3308_TX_ADDRESS,
557 vsc08_tx_sfp, num_vsc08_con);
561 ret = vsc3308_config_adjust(VSC3308_RX_ADDRESS,
562 vsc08_rx_sfp, num_vsc08_con);
566 ret = vsc3308_config(VSC3308_TX_ADDRESS,
567 vsc08_tx_sfp, num_vsc08_con);
571 ret = vsc3308_config(VSC3308_RX_ADDRESS,
572 vsc08_rx_sfp, num_vsc08_con);
577 ret = vsc3308_config(VSC3308_TX_ADDRESS,
578 vsc08_tx_amc, num_vsc08_con);
582 ret = vsc3308_config(VSC3308_RX_ADDRESS,
583 vsc08_rx_amc, num_vsc08_con);
593 printf("WARNING:VSC crossbars programming not supported for: %x"
594 " SerDes2 Protocol.\n", serdes2_prtcl);
601 static int calibrate_pll(serdes_corenet_t *srds_regs, int pll_num)
605 /* Steps For SerDes PLLs reset and reconfiguration
606 * or PLL power-up procedure
608 debug("CALIBRATE PLL:%d\n", pll_num);
609 clrbits_be32(&srds_regs->bank[pll_num].rstctl,
610 SRDS_RSTCTL_SDRST_B);
612 clrbits_be32(&srds_regs->bank[pll_num].rstctl,
613 (SRDS_RSTCTL_SDEN | SRDS_RSTCTL_PLLRST_B));
615 setbits_be32(&srds_regs->bank[pll_num].rstctl,
617 setbits_be32(&srds_regs->bank[pll_num].rstctl,
618 (SRDS_RSTCTL_SDEN | SRDS_RSTCTL_PLLRST_B
619 | SRDS_RSTCTL_SDRST_B));
623 /* Check whether PLL has been locked or not */
624 rst_err = in_be32(&srds_regs->bank[pll_num].rstctl) &
626 rst_err >>= SRDS_RSTCTL_RSTERR_SHIFT;
627 debug("RST_ERR value for PLL %d is: 0x%x:\n", pll_num, rst_err);
634 static int check_pll_locks(serdes_corenet_t *srds_regs, int pll_num)
637 u32 fcap, dcbias, bcap, pllcr1, pllcr0;
639 if (calibrate_pll(srds_regs, pll_num)) {
641 /* Read fcap, dcbias and bcap value */
642 clrbits_be32(&srds_regs->bank[pll_num].pllcr0,
643 SRDS_PLLCR0_DCBIAS_OUT_EN);
644 fcap = in_be32(&srds_regs->bank[pll_num].pllsr2) &
646 fcap >>= SRDS_PLLSR2_FCAP_SHIFT;
647 bcap = in_be32(&srds_regs->bank[pll_num].pllsr2) &
649 bcap >>= SRDS_PLLSR2_BCAP_EN_SHIFT;
650 setbits_be32(&srds_regs->bank[pll_num].pllcr0,
651 SRDS_PLLCR0_DCBIAS_OUT_EN);
652 dcbias = in_be32(&srds_regs->bank[pll_num].pllsr2) &
654 dcbias >>= SRDS_PLLSR2_DCBIAS_SHIFT;
655 debug("values of bcap:%x, fcap:%x and dcbias:%x\n",
657 if (fcap == 0 && bcap == 1) {
659 clrbits_be32(&srds_regs->bank[pll_num].rstctl,
660 (SRDS_RSTCTL_SDEN | SRDS_RSTCTL_PLLRST_B
661 | SRDS_RSTCTL_SDRST_B));
662 clrbits_be32(&srds_regs->bank[pll_num].pllcr1,
663 SRDS_PLLCR1_BCAP_EN);
664 setbits_be32(&srds_regs->bank[pll_num].pllcr1,
665 SRDS_PLLCR1_BCAP_OVD);
666 if (calibrate_pll(srds_regs, pll_num)) {
667 /*save the fcap, dcbias and bcap values*/
668 clrbits_be32(&srds_regs->bank[pll_num].pllcr0,
669 SRDS_PLLCR0_DCBIAS_OUT_EN);
670 fcap = in_be32(&srds_regs->bank[pll_num].pllsr2)
672 fcap >>= SRDS_PLLSR2_FCAP_SHIFT;
673 bcap = in_be32(&srds_regs->bank[pll_num].pllsr2)
674 & SRDS_PLLSR2_BCAP_EN;
675 bcap >>= SRDS_PLLSR2_BCAP_EN_SHIFT;
676 setbits_be32(&srds_regs->bank[pll_num].pllcr0,
677 SRDS_PLLCR0_DCBIAS_OUT_EN);
679 (&srds_regs->bank[pll_num].pllsr2) &
681 dcbias >>= SRDS_PLLSR2_DCBIAS_SHIFT;
684 clrbits_be32(&srds_regs->bank[pll_num].rstctl,
685 (SRDS_RSTCTL_SDEN | SRDS_RSTCTL_PLLRST_B
686 | SRDS_RSTCTL_SDRST_B));
687 setbits_be32(&srds_regs->bank[pll_num].pllcr1,
688 SRDS_PLLCR1_BYP_CAL);
689 clrbits_be32(&srds_regs->bank[pll_num].pllcr1,
690 SRDS_PLLCR1_BCAP_EN);
691 setbits_be32(&srds_regs->bank[pll_num].pllcr1,
692 SRDS_PLLCR1_BCAP_OVD);
693 /* change the fcap and dcbias to the saved
694 * values from Step 3 */
695 clrbits_be32(&srds_regs->bank[pll_num].pllcr1,
696 SRDS_PLLCR1_PLL_FCAP);
698 (&srds_regs->bank[pll_num].pllcr1)|
699 (fcap << SRDS_PLLCR1_PLL_FCAP_SHIFT));
700 out_be32(&srds_regs->bank[pll_num].pllcr1,
702 clrbits_be32(&srds_regs->bank[pll_num].pllcr0,
703 SRDS_PLLCR0_DCBIAS_OVRD);
705 (&srds_regs->bank[pll_num].pllcr0)|
706 (dcbias << SRDS_PLLCR0_DCBIAS_OVRD_SHIFT));
707 out_be32(&srds_regs->bank[pll_num].pllcr0,
709 ret = calibrate_pll(srds_regs, pll_num);
715 } else { /* Step 5 */
716 clrbits_be32(&srds_regs->bank[pll_num].rstctl,
717 (SRDS_RSTCTL_SDEN | SRDS_RSTCTL_PLLRST_B
718 | SRDS_RSTCTL_SDRST_B));
720 /* Change the fcap, dcbias, and bcap to the
721 * values from Step 1 */
722 setbits_be32(&srds_regs->bank[pll_num].pllcr1,
723 SRDS_PLLCR1_BYP_CAL);
724 clrbits_be32(&srds_regs->bank[pll_num].pllcr1,
725 SRDS_PLLCR1_PLL_FCAP);
726 pllcr1 = (in_be32(&srds_regs->bank[pll_num].pllcr1)|
727 (fcap << SRDS_PLLCR1_PLL_FCAP_SHIFT));
728 out_be32(&srds_regs->bank[pll_num].pllcr1,
730 clrbits_be32(&srds_regs->bank[pll_num].pllcr0,
731 SRDS_PLLCR0_DCBIAS_OVRD);
732 pllcr0 = (in_be32(&srds_regs->bank[pll_num].pllcr0)|
733 (dcbias << SRDS_PLLCR0_DCBIAS_OVRD_SHIFT));
734 out_be32(&srds_regs->bank[pll_num].pllcr0,
736 clrbits_be32(&srds_regs->bank[pll_num].pllcr1,
737 SRDS_PLLCR1_BCAP_EN);
738 setbits_be32(&srds_regs->bank[pll_num].pllcr1,
739 SRDS_PLLCR1_BCAP_OVD);
740 ret = calibrate_pll(srds_regs, pll_num);
749 static int check_serdes_pll_locks(void)
751 serdes_corenet_t *srds1_regs =
752 (void *)CONFIG_SYS_FSL_CORENET_SERDES_ADDR;
753 serdes_corenet_t *srds2_regs =
754 (void *)CONFIG_SYS_FSL_CORENET_SERDES2_ADDR;
757 debug("\nSerDes1 Lock check\n");
758 for (i = 0; i < CONFIG_SYS_FSL_SRDS_NUM_PLLS; i++) {
759 ret1 = check_pll_locks(srds1_regs, i);
761 printf("SerDes1, PLL:%d didnt lock\n", i);
765 debug("\nSerDes2 Lock check\n");
766 for (i = 0; i < CONFIG_SYS_FSL_SRDS_NUM_PLLS; i++) {
767 ret2 = check_pll_locks(srds2_regs, i);
769 printf("SerDes2, PLL:%d didnt lock\n", i);
777 int config_serdes1_refclks(void)
779 ccsr_gur_t *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR);
780 serdes_corenet_t *srds_regs =
781 (void *)CONFIG_SYS_FSL_CORENET_SERDES_ADDR;
782 u32 serdes1_prtcl, lane;
783 unsigned int flag_sgmii_aurora_prtcl = 0;
787 serdes1_prtcl = in_be32(&gur->rcwsr[4]) &
788 FSL_CORENET2_RCWSR4_SRDS1_PRTCL;
789 if (!serdes1_prtcl) {
790 printf("SERDES1 is not enabled\n");
793 serdes1_prtcl >>= FSL_CORENET2_RCWSR4_SRDS1_PRTCL_SHIFT;
794 debug("Using SERDES1 Protocol: 0x%x:\n", serdes1_prtcl);
796 /* To prevent generation of reset request from SerDes
797 * while changing the refclks, By setting SRDS_RST_MSK bit,
798 * SerDes reset event cannot cause a reset request
800 setbits_be32(&gur->rstrqmr1, FSL_CORENET_RSTRQMR1_SRDS_RST_MSK);
802 /* Reconfigure IDT idt8t49n222a device for CPRI to work
803 * For this SerDes1's Refclk1 and refclk2 need to be set
806 switch (serdes1_prtcl) {
834 debug("Configuring idt8t49n222a for CPRI SerDes clks:"
835 " for srds_prctl:%x\n", serdes1_prtcl);
836 ret = select_i2c_ch_pca(I2C_CH_IDT);
838 ret = set_serdes_refclk(IDT_SERDES1_ADDRESS, 1,
839 SERDES_REFCLK_122_88,
840 SERDES_REFCLK_122_88, 0);
842 printf("IDT8T49N222A configuration failed.\n");
845 debug("IDT8T49N222A configured.\n");
849 select_i2c_ch_pca(I2C_CH_DEFAULT);
851 /* Change SerDes1's Refclk1 to 125MHz for on board
852 * SGMIIs or Aurora to work
854 for (lane = 0; lane < SRDS_MAX_LANES; lane++) {
855 enum srds_prtcl lane_prtcl = serdes_get_prtcl
856 (0, serdes1_prtcl, lane);
857 switch (lane_prtcl) {
858 case SGMII_FM1_DTSEC1:
859 case SGMII_FM1_DTSEC2:
860 case SGMII_FM1_DTSEC3:
861 case SGMII_FM1_DTSEC4:
862 case SGMII_FM1_DTSEC5:
863 case SGMII_FM1_DTSEC6:
865 flag_sgmii_aurora_prtcl++;
872 if (flag_sgmii_aurora_prtcl)
873 QIXIS_WRITE(brdcfg[4], QIXIS_SRDS1CLK_125);
875 /* Steps For SerDes PLLs reset and reconfiguration after
876 * changing SerDes's refclks
878 for (i = 0; i < CONFIG_SYS_FSL_SRDS_NUM_PLLS; i++) {
879 debug("For PLL%d reset and reconfiguration after"
880 " changing refclks\n", i+1);
881 clrbits_be32(&srds_regs->bank[i].rstctl,
882 SRDS_RSTCTL_SDRST_B);
884 clrbits_be32(&srds_regs->bank[i].rstctl,
885 (SRDS_RSTCTL_SDEN | SRDS_RSTCTL_PLLRST_B));
887 setbits_be32(&srds_regs->bank[i].rstctl,
889 setbits_be32(&srds_regs->bank[i].rstctl,
890 (SRDS_RSTCTL_SDEN | SRDS_RSTCTL_PLLRST_B
891 | SRDS_RSTCTL_SDRST_B));
895 printf("WARNING:IDT8T49N222A configuration not"
896 " supported for:%x SerDes1 Protocol.\n",
901 /* Clearing SRDS_RST_MSK bit as now
902 * SerDes reset event can cause a reset request
904 clrbits_be32(&gur->rstrqmr1, FSL_CORENET_RSTRQMR1_SRDS_RST_MSK);
908 int config_serdes2_refclks(void)
910 ccsr_gur_t *gur = (void __iomem *)(CONFIG_SYS_MPC85xx_GUTS_ADDR);
911 serdes_corenet_t *srds2_regs =
912 (void *)CONFIG_SYS_FSL_CORENET_SERDES2_ADDR;
917 serdes2_prtcl = in_be32(&gur->rcwsr[4]) &
918 FSL_CORENET2_RCWSR4_SRDS2_PRTCL;
919 if (!serdes2_prtcl) {
920 debug("SERDES2 is not enabled\n");
923 serdes2_prtcl >>= FSL_CORENET2_RCWSR4_SRDS2_PRTCL_SHIFT;
924 debug("Using SERDES2 Protocol: 0x%x:\n", serdes2_prtcl);
926 /* To prevent generation of reset request from SerDes
927 * while changing the refclks, By setting SRDS_RST_MSK bit,
928 * SerDes reset event cannot cause a reset request
930 setbits_be32(&gur->rstrqmr1, FSL_CORENET_RSTRQMR1_SRDS_RST_MSK);
932 /* Reconfigure IDT idt8t49n222a device for PCIe SATA to work
933 * For this SerDes2's Refclk1 need to be set to 100MHz
935 switch (serdes2_prtcl) {
936 #ifdef CONFIG_ARCH_B4420
944 debug("Configuring IDT for PCIe SATA for srds_prctl:%x\n",
946 ret = select_i2c_ch_pca(I2C_CH_IDT);
948 ret = set_serdes_refclk(IDT_SERDES2_ADDRESS, 2,
950 SERDES_REFCLK_156_25, 0);
952 printf("IDT8T49N222A configuration failed.\n");
955 debug("IDT8T49N222A configured.\n");
959 select_i2c_ch_pca(I2C_CH_DEFAULT);
961 /* Steps For SerDes PLLs reset and reconfiguration after
962 * changing SerDes's refclks
964 for (i = 0; i < CONFIG_SYS_FSL_SRDS_NUM_PLLS; i++) {
965 clrbits_be32(&srds2_regs->bank[i].rstctl,
966 SRDS_RSTCTL_SDRST_B);
968 clrbits_be32(&srds2_regs->bank[i].rstctl,
969 (SRDS_RSTCTL_SDEN | SRDS_RSTCTL_PLLRST_B));
971 setbits_be32(&srds2_regs->bank[i].rstctl,
973 setbits_be32(&srds2_regs->bank[i].rstctl,
974 (SRDS_RSTCTL_SDEN | SRDS_RSTCTL_PLLRST_B
975 | SRDS_RSTCTL_SDRST_B));
981 printf("IDT configuration not supported for:%x S2 Protocol.\n",
986 /* Clearing SRDS_RST_MSK bit as now
987 * SerDes reset event can cause a reset request
989 clrbits_be32(&gur->rstrqmr1, FSL_CORENET_RSTRQMR1_SRDS_RST_MSK);
993 int board_early_init_r(void)
995 const unsigned int flashbase = CONFIG_SYS_FLASH_BASE;
996 int flash_esel = find_tlb_idx((void *)flashbase, 1);
998 u32 svr = SVR_SOC_VER(get_svr());
1000 /* Create law for MAPLE only for personalities having MAPLE */
1001 if ((svr == SVR_B4860) || (svr == SVR_B4440) ||
1002 (svr == SVR_B4420) || (svr == SVR_B4220)) {
1003 set_next_law(CONFIG_SYS_MAPLE_MEM_PHYS, LAW_SIZE_16M,
1008 * Remap Boot flash + PROMJET region to caching-inhibited
1009 * so that flash can be erased properly.
1012 /* Flush d-cache and invalidate i-cache of any FLASH data */
1014 invalidate_icache();
1016 if (flash_esel == -1) {
1017 /* very unlikely unless something is messed up */
1018 puts("Error: Could not find TLB for FLASH BASE\n");
1019 flash_esel = 2; /* give our best effort to continue */
1021 /* invalidate existing TLB entry for flash + promjet */
1022 disable_tlb(flash_esel);
1025 set_tlb(1, flashbase, CONFIG_SYS_FLASH_BASE_PHYS,
1026 MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G,
1027 0, flash_esel, BOOKE_PAGESZ_256M, 1);
1030 * Adjust core voltage according to voltage ID
1031 * This function changes I2C mux to channel 2.
1033 if (adjust_vdd(0) < 0)
1034 printf("Warning: Adjusting core voltage failed\n");
1036 /* SerDes1 refclks need to be set again, as default clks
1037 * are not suitable for CPRI and onboard SGMIIs to work
1039 * This function will set SerDes1's Refclk1 and refclk2
1040 * as per SerDes1 protocols
1042 if (config_serdes1_refclks())
1043 printf("SerDes1 Refclks couldn't set properly.\n");
1045 printf("SerDes1 Refclks have been set.\n");
1047 /* SerDes2 refclks need to be set again, as default clks
1048 * are not suitable for PCIe SATA to work
1049 * This function will set SerDes2's Refclk1 and refclk2
1050 * for SerDes2 protocols having PCIe in them
1051 * for PCIe SATA to work
1053 ret = config_serdes2_refclks();
1055 printf("SerDes2 Refclks have been set.\n");
1056 else if (ret == -ENODEV)
1057 printf("SerDes disable, Refclks couldn't change.\n");
1059 printf("SerDes2 Refclk reconfiguring failed.\n");
1061 #if defined(CONFIG_SYS_FSL_ERRATUM_A006384) || \
1062 defined(CONFIG_SYS_FSL_ERRATUM_A006475)
1063 /* Rechecking the SerDes locks after all SerDes configurations
1064 * are done, As SerDes PLLs may not lock reliably at 5 G VCO
1065 * and at cold temperatures.
1066 * Following sequence ensure the proper locking of SerDes PLLs.
1068 if (SVR_MAJ(get_svr()) == 1) {
1069 if (check_serdes_pll_locks())
1070 printf("SerDes plls still not locked properly.\n");
1072 printf("SerDes plls have been locked well.\n");
1076 /* Configure VSC3316 and VSC3308 crossbar switches */
1077 if (configure_vsc3316_3308())
1078 printf("VSC:failed to configure VSC3316/3308.\n");
1080 printf("VSC:VSC3316/3308 successfully configured.\n");
1082 select_i2c_ch_pca(I2C_CH_DEFAULT);
1087 unsigned long get_board_sys_clk(void)
1089 u8 sysclk_conf = QIXIS_READ(brdcfg[1]);
1091 switch ((sysclk_conf & 0x0C) >> 2) {
1102 unsigned long get_board_ddr_clk(void)
1104 u8 ddrclk_conf = QIXIS_READ(brdcfg[1]);
1106 switch (ddrclk_conf & 0x03) {
1117 static int serdes_refclock(u8 sw, u8 sdclk)
1124 brdcfg4 = QIXIS_READ(brdcfg[4]);
1125 if ((brdcfg4 & CLK_MUX_SEL_MASK) == ETH_PHY_CLK_OUT)
1126 return SRDS_PLLCR0_RFCK_SEL_125;
1128 clock = (sw >> 5) & 7;
1130 clock = (sw >> 6) & 3;
1134 ret = SRDS_PLLCR0_RFCK_SEL_100;
1137 ret = SRDS_PLLCR0_RFCK_SEL_125;
1140 ret = SRDS_PLLCR0_RFCK_SEL_156_25;
1143 ret = SRDS_PLLCR0_RFCK_SEL_161_13;
1148 ret = SRDS_PLLCR0_RFCK_SEL_122_88;
1158 #define NUM_SRDS_BANKS 2
1160 int misc_init_r(void)
1163 serdes_corenet_t *srds_regs =
1164 (void *)CONFIG_SYS_FSL_CORENET_SERDES_ADDR;
1165 u32 actual[NUM_SRDS_BANKS];
1169 sw = QIXIS_READ(brdcfg[2]);
1170 clock = serdes_refclock(sw, 1);
1174 printf("Warning: SDREFCLK1 switch setting is unsupported\n");
1176 sw = QIXIS_READ(brdcfg[4]);
1177 clock = serdes_refclock(sw, 2);
1181 printf("Warning: SDREFCLK2 switch setting unsupported\n");
1183 for (i = 0; i < NUM_SRDS_BANKS; i++) {
1184 u32 pllcr0 = srds_regs->bank[i].pllcr0;
1185 u32 expected = pllcr0 & SRDS_PLLCR0_RFCK_SEL_MASK;
1186 if (expected != actual[i]) {
1187 printf("Warning: SERDES bank %u expects reference clock"
1188 " %sMHz, but actual is %sMHz\n", i + 1,
1189 serdes_clock_to_string(expected),
1190 serdes_clock_to_string(actual[i]));
1197 int ft_board_setup(void *blob, bd_t *bd)
1202 ft_cpu_setup(blob, bd);
1204 base = env_get_bootm_low();
1205 size = env_get_bootm_size();
1207 fdt_fixup_memory(blob, (u64)base, (u64)size);
1210 pci_of_setup(blob, bd);
1213 fdt_fixup_liodn(blob);
1215 #ifdef CONFIG_HAS_FSL_DR_USB
1216 fsl_fdt_fixup_dr_usb(blob, bd);
1219 #ifdef CONFIG_SYS_DPAA_FMAN
1220 fdt_fixup_fman_ethernet(blob);
1221 fdt_fixup_board_enet(blob);
1228 * Dump board switch settings.
1229 * The bits that cannot be read/sampled via some FPGA or some
1230 * registers, they will be displayed as
1231 * underscore in binary format. mask[] has those bits.
1232 * Some bits are calculated differently than the actual switches
1233 * if booting with overriding by FPGA.
1235 void qixis_dump_switch(void)
1241 * Any bit with 1 means that bit cannot be reverse engineered.
1242 * It will be displayed as _ in binary format.
1244 static const u8 mask[] = {0x07, 0, 0, 0xff, 0};
1246 u8 brdcfg[16], dutcfg[16];
1248 for (i = 0; i < 16; i++) {
1249 brdcfg[i] = qixis_read(offsetof(struct qixis, brdcfg[0]) + i);
1250 dutcfg[i] = qixis_read(offsetof(struct qixis, dutcfg[0]) + i);
1253 sw[0] = ((brdcfg[0] & 0x0f) << 4) | \
1255 sw[1] = ((dutcfg[1] & 0x01) << 7) | \
1256 ((dutcfg[2] & 0x07) << 4) | \
1257 ((dutcfg[6] & 0x10) >> 1) | \
1258 ((dutcfg[6] & 0x80) >> 5) | \
1259 ((dutcfg[1] & 0x40) >> 5) | \
1263 sw[4] = ((brdcfg[1] & 0x30) << 2) | \
1264 ((brdcfg[1] & 0xc0) >> 2) | \
1267 puts("DIP switch settings:\n");
1268 for (i = 0; i < 5; i++) {
1269 printf("SW%d = 0b%s (0x%02x)\n",
1270 i + 1, byte_to_binary_mask(sw[i], mask[i], buf), sw[i]);