void board_ft_fman_fixup_port(void *fdt, char *compat, phys_addr_t addr, enum fm_port port, int offset) { struct fixed_link f_link; if (fm_info_get_enet_if(port) == PHY_INTERFACE_MODE_RGMII) { if (port == FM1_DTSEC3) { fdt_set_phy_handle(fdt, compat, addr, "rgmii_phy2"); fdt_setprop_string(fdt, offset, "phy-connection-type", "rgmii"); fdt_status_okay_by_alias(fdt, "emi1_rgmii1"); } } else if (fm_info_get_enet_if(port) == PHY_INTERFACE_MODE_SGMII) { if (port == FM1_DTSEC1) { fdt_set_phy_handle(fdt, compat, addr, "sgmii_vsc8234_phy_s5"); } else if (port == FM1_DTSEC2) { fdt_set_phy_handle(fdt, compat, addr, "sgmii_vsc8234_phy_s4"); } } else if (fm_info_get_enet_if(port) == PHY_INTERFACE_MODE_SGMII_2500) { if (port == FM1_DTSEC3) { fdt_set_phy_handle(fdt, compat, addr, "sgmii_aqr105_phy_s3"); } } else if (fm_info_get_enet_if(port) == PHY_INTERFACE_MODE_QSGMII) { switch (port) { case FM1_DTSEC1: fdt_set_phy_handle(fdt, compat, addr, "qsgmii_phy_p1"); break; case FM1_DTSEC2: fdt_set_phy_handle(fdt, compat, addr, "qsgmii_phy_p2"); break; case FM1_DTSEC3: fdt_set_phy_handle(fdt, compat, addr, "qsgmii_phy_p3"); break; case FM1_DTSEC4: fdt_set_phy_handle(fdt, compat, addr, "qsgmii_phy_p4"); break; default: break; } fdt_delprop(fdt, offset, "phy-connection-type"); fdt_setprop_string(fdt, offset, "phy-connection-type", "qsgmii"); fdt_status_okay_by_alias(fdt, "emi1_slot2"); } else if (fm_info_get_enet_if(port) == PHY_INTERFACE_MODE_XGMII) { /* XFI interface */ f_link.phy_id = port; f_link.duplex = 1; f_link.link_speed = 10000; f_link.pause = 0; f_link.asym_pause = 0; /* no PHY for XFI */ fdt_delprop(fdt, offset, "phy-handle"); fdt_setprop(fdt, offset, "fixed-link", &f_link, sizeof(f_link)); fdt_setprop_string(fdt, offset, "phy-connection-type", "xgmii"); } }
int board_eth_init(bd_t *bis) { #ifdef CONFIG_FMAN_ENET struct memac_mdio_info memac_mdio_info; unsigned int i; int phy_addr = 0; printf("Initializing Fman\n"); memac_mdio_info.regs = (struct memac_mdio_controller *)CONFIG_SYS_FM1_DTSEC_MDIO_ADDR; memac_mdio_info.name = DEFAULT_FM_MDIO_NAME; /* Register the real 1G MDIO bus */ fm_memac_mdio_init(bis, &memac_mdio_info); /* * Program on board RGMII, SGMII PHY addresses. */ for (i = FM1_DTSEC1; i < FM1_DTSEC1 + CONFIG_SYS_NUM_FM1_DTSEC; i++) { int idx = i - FM1_DTSEC1; switch (fm_info_get_enet_if(i)) { #ifdef CONFIG_T1040RDB case PHY_INTERFACE_MODE_SGMII: /* T1040RDB only supports SGMII on DTSEC3 */ fm_info_set_phy_address(FM1_DTSEC3, CONFIG_SYS_SGMII1_PHY_ADDR); break; #endif case PHY_INTERFACE_MODE_RGMII: if (FM1_DTSEC4 == i) phy_addr = CONFIG_SYS_RGMII1_PHY_ADDR; if (FM1_DTSEC5 == i) phy_addr = CONFIG_SYS_RGMII2_PHY_ADDR; fm_info_set_phy_address(i, phy_addr); break; case PHY_INTERFACE_MODE_QSGMII: fm_info_set_phy_address(i, 0); break; case PHY_INTERFACE_MODE_NONE: fm_info_set_phy_address(i, 0); break; default: printf("Fman1: DTSEC%u set to unknown interface %i\n", idx + 1, fm_info_get_enet_if(i)); fm_info_set_phy_address(i, 0); break; } fm_info_set_mdio(i, miiphy_get_dev_by_name(DEFAULT_FM_MDIO_NAME)); } cpu_eth_init(bis); #endif return pci_eth_init(bis); }
void board_ft_fman_fixup_port(void *fdt, char *compat, phys_addr_t addr, enum fm_port port, int offset) { #if defined(CONFIG_T1024RDB) if (((fm_info_get_enet_if(port) == PHY_INTERFACE_MODE_SGMII_2500) || (fm_info_get_enet_if(port) == PHY_INTERFACE_MODE_SGMII)) && (port == FM1_DTSEC3)) { fdt_set_phy_handle(fdt, compat, addr, "sg_2500_aqr105_phy4"); fdt_setprop_string(fdt, offset, "phy-connection-type", "sgmii-2500"); fdt_status_disabled_by_alias(fdt, "xg_aqr105_phy3"); } #endif }
/* * Configure the status for the virtual MDIO nodes * * Rather than create the virtual MDIO nodes from scratch for each active * virtual MDIO, we expect the DTS to have the nodes defined already, and we * only enable the ones that are actually active. * * We assume that the DTS already hard-codes the status for all the * virtual MDIO nodes to "disabled", so all we need to do is enable the * active ones. * * For SGMII, we also need to set the mux value in the node. */ void fdt_fixup_board_enet(void *fdt) { #ifdef CONFIG_FMAN_ENET unsigned int i; int lane; for (i = FM1_DTSEC1; i < FM1_DTSEC1 + CONFIG_SYS_NUM_FM1_DTSEC; i++) { int idx = i - FM1_DTSEC1; switch (fm_info_get_enet_if(i)) { case PHY_INTERFACE_MODE_SGMII: lane = serdes_get_first_lane(SGMII_FM1_DTSEC1 + idx); if (lane >= 0) { fdt_status_okay_by_alias(fdt, "emi1_sgmii"); /* Also set the MUX value */ fdt_set_mdio_mux(fdt, "emi1_sgmii", mdio_mux[i].val); } break; case PHY_INTERFACE_MODE_RGMII: fdt_status_okay_by_alias(fdt, "emi1_rgmii"); break; default: break; } } lane = serdes_get_first_lane(XAUI_FM1); if (lane >= 0) fdt_status_okay_by_alias(fdt, "emi2_xgmii"); #endif }
/* * Given the following ... * * 1) A pointer to an Fman Ethernet node (as identified by the 'compat' * compatible string and 'addr' physical address) * * 2) An Fman port * * ... update the phy-handle property of the Ethernet node to point to the * right PHY. This assumes that we already know the PHY for each port. * * The offset of the Fman Ethernet node is also passed in for convenience, but * it is not used, and we recalculate the offset anyway. * * Note that what we call "Fman ports" (enum fm_port) is really an Fman MAC. * Inside the Fman, "ports" are things that connect to MACs. We only call them * ports in U-Boot because on previous Ethernet devices (e.g. Gianfar), MACs * and ports are the same thing. * */ void board_ft_fman_fixup_port(void *fdt, char *compat, phys_addr_t addr, enum fm_port port, int offset) { phy_interface_t intf = fm_info_get_enet_if(port); char phy[16]; /* The RGMII PHY is identified by the MAC connected to it */ if (intf == PHY_INTERFACE_MODE_RGMII) { sprintf(phy, "rgmii_phy%u", port == FM1_DTSEC4 ? 1 : 2); fdt_set_phy_handle(fdt, compat, addr, phy); } /* The SGMII PHY is identified by the MAC connected to it */ if (intf == PHY_INTERFACE_MODE_SGMII) { int lane = serdes_get_first_lane(FSL_SRDS_1, SGMII_FM1_DTSEC1 + port); u8 slot; if (lane < 0) return; slot = lane_to_slot[lane]; if (slot) { /* Slot housing a SGMII riser card */ sprintf(phy, "phy_s%x_%02x", slot, (fm_info_get_phy_address(port - FM1_DTSEC1)- CONFIG_SYS_FM1_DTSEC1_RISER_PHY_ADDR + 1)); fdt_set_phy_handle(fdt, compat, addr, phy); } } }
void fdt_fixup_board_enet(void *fdt) { int i; for (i = FM1_DTSEC1; i < NUM_FM_PORTS; i++) { switch (fm_info_get_enet_if(i)) { case PHY_INTERFACE_MODE_SGMII: case PHY_INTERFACE_MODE_QSGMII: switch (mdio_mux[i]) { case EMI1_SLOT1: fdt_status_okay_by_alias(fdt, "emi1_slot1"); break; case EMI1_SLOT2: fdt_status_okay_by_alias(fdt, "emi1_slot2"); break; case EMI1_SLOT4: fdt_status_okay_by_alias(fdt, "emi1_slot4"); break; default: break; } break; default: break; } } }
void fdt_fixup_board_enet(void *fdt) { int i; ccsr_gur_t *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR); u32 prtcl2 = in_be32(&gur->rcwsr[4]) & FSL_CORENET2_RCWSR4_SRDS2_PRTCL; prtcl2 >>= FSL_CORENET2_RCWSR4_SRDS2_PRTCL_SHIFT; for (i = FM1_DTSEC1; i < NUM_FM_PORTS; i++) { switch (fm_info_get_enet_if(i)) { case PHY_INTERFACE_MODE_SGMII: case PHY_INTERFACE_MODE_QSGMII: switch (mdio_mux[i]) { case EMI1_SLOT1: fdt_status_okay_by_alias(fdt, "emi1_slot1"); break; case EMI1_SLOT2: fdt_status_okay_by_alias(fdt, "emi1_slot2"); break; case EMI1_SLOT3: fdt_status_okay_by_alias(fdt, "emi1_slot3"); break; case EMI1_SLOT4: fdt_status_okay_by_alias(fdt, "emi1_slot4"); break; default: break; } break; case PHY_INTERFACE_MODE_XGMII: /* check if it's XFI interface for 10g */ if ((prtcl2 == 56) || (prtcl2 == 57)) { fdt_status_okay_by_alias(fdt, "emi2_xfislot3"); break; } switch (i) { case FM1_10GEC1: fdt_status_okay_by_alias(fdt, "emi2_xauislot1"); break; case FM1_10GEC2: fdt_status_okay_by_alias(fdt, "emi2_xauislot2"); break; case FM2_10GEC1: fdt_status_okay_by_alias(fdt, "emi2_xauislot3"); break; case FM2_10GEC2: fdt_status_okay_by_alias(fdt, "emi2_xauislot4"); break; default: break; } break; default: break; } } }
/* * Set status to disabled for unused ethernet node */ void fdt_fixup_board_enet(void *fdt) { int i; char alias[32]; for (i = FM1_DTSEC1; i <= FM1_10GEC2; i++) { switch (fm_info_get_enet_if(i)) { case PHY_INTERFACE_MODE_NONE: sprintf(alias, "ethernet%u", i); fdt_status_disabled_by_alias(fdt, alias); break; default: break; } } }
/* * Given the following ... * * 1) A pointer to an Fman Ethernet node (as identified by the 'compat' * compatible string and 'addr' physical address) * * 2) An Fman port * * ... update the phy-handle property of the Ethernet node to point to the * right PHY. This assumes that we already know the PHY for each port. That * information is stored in mdio_mux[]. * * The offset of the Fman Ethernet node is also passed in for convenience, but * it is not used. * * Note that what we call "Fman ports" (enum fm_port) is really an Fman MAC. * Inside the Fman, "ports" are things that connect to MACs. We only call them * ports in U-Boot because on previous Ethernet devices (e.g. Gianfar), MACs * and ports are the same thing. */ void board_ft_fman_fixup_port(void *fdt, char *compat, phys_addr_t addr, enum fm_port port, int offset) { enum srds_prtcl device; int lane, slot, phy; char alias[32]; /* RGMII and XGMII are already mapped correctly in the DTS */ if (fm_info_get_enet_if(port) == PHY_INTERFACE_MODE_SGMII) { device = serdes_device_from_fm_port(port); lane = serdes_get_first_lane(device); slot = lane_to_slot[lane]; phy = fm_info_get_phy_address(port); sprintf(alias, "phy_sgmii_slot%u_%x", slot, phy); fdt_set_phy_handle(fdt, compat, addr, alias); } }
/* * Given the following ... * * 1) A pointer to an Fman Ethernet node (as identified by the 'compat' * compatible string and 'addr' physical address) * * 2) An Fman port * * ... update the phy-handle property of the Ethernet node to point to the * right PHY. This assumes that we already know the PHY for each port. * * The offset of the Fman Ethernet node is also passed in for convenience, but * it is not used, and we recalculate the offset anyway. * * Note that what we call "Fman ports" (enum fm_port) is really an Fman MAC. * Inside the Fman, "ports" are things that connect to MACs. We only call them * ports in U-Boot because on previous Ethernet devices (e.g. Gianfar), MACs * and ports are the same thing. * */ void board_ft_fman_fixup_port(void *fdt, char *compat, phys_addr_t addr, enum fm_port port, int offset) { phy_interface_t intf = fm_info_get_enet_if(port); char phy[16]; /* The RGMII PHY is identified by the MAC connected to it */ if (intf == PHY_INTERFACE_MODE_RGMII) { sprintf(phy, "phy_rgmii_%u", port == FM1_DTSEC5 ? 0 : 1); fdt_set_phy_handle(fdt, compat, addr, phy); } /* The SGMII PHY is identified by the MAC connected to it */ if (intf == PHY_INTERFACE_MODE_SGMII) { int lane = serdes_get_first_lane(SGMII_FM1_DTSEC1 + port); u8 slot; if (lane < 0) return; slot = lane_to_slot[lane]; if (slot) { sprintf(phy, "phy_sgmii_%x", CONFIG_SYS_FM1_DTSEC1_RISER_PHY_ADDR + (port - FM1_DTSEC1)); fdt_set_phy_handle(fdt, compat, addr, phy); } else { sprintf(phy, "phy_sgmii_%x", CONFIG_SYS_FM1_DTSEC1_PHY_ADDR + (port - FM1_DTSEC1)); fdt_set_phy_handle(fdt, compat, addr, phy); } } if (intf == PHY_INTERFACE_MODE_XGMII) { /* XAUI */ int lane = serdes_get_first_lane(XAUI_FM1); if (lane >= 0) { /* The XAUI PHY is identified by the slot */ sprintf(phy, "phy_xgmii_%u", lane_to_slot[lane]); fdt_set_phy_handle(fdt, compat, addr, phy); } } }
/*QSGMII Riser Card can work in SGMII mode, but the PHY address is different. *This function scans which Riser Card being used(QSGMII or SGMII Riser Card), *then set the correct PHY address */ void set_sgmii_phy(struct mii_dev *bus, enum fm_port base_port, unsigned int port_num, int phy_base_addr) { unsigned int regnum = 0; int qsgmii; int i; int phy_real_addr; qsgmii = is_qsgmii_riser_card(bus, phy_base_addr, port_num, regnum); if (!qsgmii) return; for (i = base_port; i < base_port + port_num; i++) { if (fm_info_get_enet_if(i) == PHY_INTERFACE_MODE_SGMII) { phy_real_addr = phy_base_addr + i - base_port; fm_info_set_phy_address(i, phy_real_addr); } } }
void fdt_fixup_board_enet(void *fdt) { int i, lane, idx; for (i = FM1_DTSEC1; i < FM1_DTSEC1 + CONFIG_SYS_NUM_FM1_DTSEC; i++) { idx = i - FM1_DTSEC1; switch (fm_info_get_enet_if(i)) { case PHY_INTERFACE_MODE_SGMII: lane = serdes_get_first_lane(FSL_SRDS_1, SGMII_FM1_DTSEC1 + idx); if (lane < 0) break; switch (mdio_mux[i]) { case EMI1_SLOT3: fdt_status_okay_by_alias(fdt, "emi1_slot3"); break; case EMI1_SLOT5: fdt_status_okay_by_alias(fdt, "emi1_slot5"); break; case EMI1_SLOT6: fdt_status_okay_by_alias(fdt, "emi1_slot6"); break; case EMI1_SLOT7: fdt_status_okay_by_alias(fdt, "emi1_slot7"); break; } break; case PHY_INTERFACE_MODE_RGMII: if (i == FM1_DTSEC4) fdt_status_okay_by_alias(fdt, "emi1_rgmii0"); if (i == FM1_DTSEC5) fdt_status_okay_by_alias(fdt, "emi1_rgmii1"); break; default: break; } } }
void fdt_fixup_board_enet(void *fdt) { int i; struct ccsr_gur *gur = (void *)(CONFIG_SYS_FSL_GUTS_ADDR); u32 srds_s1; srds_s1 = in_be32(&gur->rcwsr[4]) & FSL_CHASSIS2_RCWSR4_SRDS1_PRTCL_MASK; srds_s1 >>= FSL_CHASSIS2_RCWSR4_SRDS1_PRTCL_SHIFT; for (i = FM1_DTSEC1; i < NUM_FM_PORTS; i++) { switch (fm_info_get_enet_if(i)) { case PHY_INTERFACE_MODE_SGMII: case PHY_INTERFACE_MODE_QSGMII: switch (mdio_mux[i]) { case EMI1_SLOT1: fdt_status_okay_by_alias(fdt, "emi1_slot1"); break; case EMI1_SLOT2: fdt_status_okay_by_alias(fdt, "emi1_slot2"); break; case EMI1_SLOT3: fdt_status_okay_by_alias(fdt, "emi1_slot3"); break; case EMI1_SLOT4: fdt_status_okay_by_alias(fdt, "emi1_slot4"); break; default: break; } break; case PHY_INTERFACE_MODE_XGMII: break; default: break; } } }
int board_eth_init(bd_t *bis) { u8 *bcsr = (u8 *)BCSR_ACCESS_REG_ADDR; ccsr_gur_t *gur = (ccsr_gur_t *)CONFIG_SYS_MPC85xx_GUTS_ADDR; struct fsl_pq_mdio_info dtsec_mdio_info; /* * Need to set dTSEC 1 pin multiplexing to TSEC. The default setting * is not correct. */ setbits_be32(&gur->pmuxcr, MPC85xx_PMUXCR_TSEC1_1); dtsec_mdio_info.regs = (struct tsec_mii_mng *)CONFIG_SYS_FM1_DTSEC1_MDIO_ADDR; dtsec_mdio_info.name = DEFAULT_FM_MDIO_NAME; /* Register the 1G MDIO bus */ fsl_pq_mdio_init(bis, &dtsec_mdio_info); fm_info_set_phy_address(FM1_DTSEC1, CONFIG_SYS_FM1_DTSEC1_PHY_ADDR); fm_info_set_phy_address(FM1_DTSEC2, CONFIG_SYS_FM1_DTSEC2_PHY_ADDR); fm_info_set_mdio(FM1_DTSEC1, miiphy_get_dev_by_name(DEFAULT_FM_MDIO_NAME)); fm_info_set_mdio(FM1_DTSEC2, miiphy_get_dev_by_name(DEFAULT_FM_MDIO_NAME)); /* Make SERDES connected to SGMII by cleaing bcsr19[7] */ if (fm_info_get_enet_if(FM1_DTSEC1) == PHY_INTERFACE_MODE_SGMII) clrbits_8(&bcsr[19], BCSR19_SGMII_SEL_L); #ifdef CONFIG_FMAN_ENET cpu_eth_init(bis); #endif return pci_eth_init(bis); }
int board_eth_init(bd_t *bis) { #ifdef CONFIG_FMAN_ENET struct memac_mdio_info memac_mdio_info; unsigned int i; #ifdef CONFIG_VSC9953 int lane; int phy_addr; phy_interface_t phy_int; struct mii_dev *bus; #endif printf("Initializing Fman\n"); set_brdcfg9_for_gtx_clk(); initialize_lane_to_slot(); /* Initialize the mdio_mux array so we can recognize empty elements */ for (i = 0; i < NUM_FM_PORTS; i++) mdio_mux[i] = EMI_NONE; memac_mdio_info.regs = (struct memac_mdio_controller *)CONFIG_SYS_FM1_DTSEC_MDIO_ADDR; memac_mdio_info.name = DEFAULT_FM_MDIO_NAME; /* Register the real 1G MDIO bus */ fm_memac_mdio_init(bis, &memac_mdio_info); /* Register the muxing front-ends to the MDIO buses */ t1040_qds_mdio_init(DEFAULT_FM_MDIO_NAME, EMI1_RGMII0); t1040_qds_mdio_init(DEFAULT_FM_MDIO_NAME, EMI1_RGMII1); t1040_qds_mdio_init(DEFAULT_FM_MDIO_NAME, EMI1_SLOT1); t1040_qds_mdio_init(DEFAULT_FM_MDIO_NAME, EMI1_SLOT3); t1040_qds_mdio_init(DEFAULT_FM_MDIO_NAME, EMI1_SLOT4); t1040_qds_mdio_init(DEFAULT_FM_MDIO_NAME, EMI1_SLOT5); t1040_qds_mdio_init(DEFAULT_FM_MDIO_NAME, EMI1_SLOT6); t1040_qds_mdio_init(DEFAULT_FM_MDIO_NAME, EMI1_SLOT7); /* * Program on board RGMII PHY addresses. If the SGMII Riser * card used, we'll override the PHY address later. For any DTSEC that * is RGMII, we'll also override its PHY address later. We assume that * DTSEC4 and DTSEC5 are used for RGMII. */ fm_info_set_phy_address(FM1_DTSEC4, CONFIG_SYS_FM1_DTSEC4_PHY_ADDR); fm_info_set_phy_address(FM1_DTSEC5, CONFIG_SYS_FM1_DTSEC5_PHY_ADDR); for (i = FM1_DTSEC1; i < FM1_DTSEC1 + CONFIG_SYS_NUM_FM1_DTSEC; i++) { switch (fm_info_get_enet_if(i)) { case PHY_INTERFACE_MODE_QSGMII: fm_info_set_mdio(i, NULL); break; case PHY_INTERFACE_MODE_SGMII: t1040_handle_phy_interface_sgmii(i); break; case PHY_INTERFACE_MODE_RGMII: /* Only DTSEC4 and DTSEC5 can be routed to RGMII */ t1040_handle_phy_interface_rgmii(i); break; default: break; } } #ifdef CONFIG_VSC9953 for (i = 0; i < VSC9953_MAX_PORTS; i++) { lane = -1; phy_addr = 0; phy_int = PHY_INTERFACE_MODE_NONE; switch (i) { case 0: case 1: case 2: case 3: lane = serdes_get_first_lane(FSL_SRDS_1, QSGMII_SW1_A); /* PHYs connected over QSGMII */ if (lane >= 0) { phy_addr = CONFIG_SYS_FM1_QSGMII21_PHY_ADDR + i; phy_int = PHY_INTERFACE_MODE_QSGMII; break; } lane = serdes_get_first_lane(FSL_SRDS_1, SGMII_SW1_MAC1 + i); if (lane < 0) break; /* PHYs connected over QSGMII */ if (i != 3 || lane_to_slot[lane] == 7) phy_addr = CONFIG_SYS_FM1_DTSEC1_RISER_PHY_ADDR + i; else phy_addr = CONFIG_SYS_FM1_DTSEC1_RISER_PHY_ADDR; phy_int = PHY_INTERFACE_MODE_SGMII; break; case 4: case 5: case 6: case 7: lane = serdes_get_first_lane(FSL_SRDS_1, QSGMII_SW1_B); /* PHYs connected over QSGMII */ if (lane >= 0) { phy_addr = CONFIG_SYS_FM1_QSGMII11_PHY_ADDR + i - 4; phy_int = PHY_INTERFACE_MODE_QSGMII; break; } lane = serdes_get_first_lane(FSL_SRDS_1, SGMII_SW1_MAC1 + i); /* PHYs connected over SGMII */ if (lane >= 0) { phy_addr = CONFIG_SYS_FM1_DTSEC1_RISER_PHY_ADDR + i - 3; phy_int = PHY_INTERFACE_MODE_SGMII; } break; case 8: if (serdes_get_first_lane(FSL_SRDS_1, SGMII_FM1_DTSEC1) < 0) /* FM1@DTSEC1 is connected to SW1@PORT8 */ vsc9953_port_enable(i); break; case 9: if (serdes_get_first_lane(FSL_SRDS_1, SGMII_FM1_DTSEC2) < 0) { /* Enable L2 On MAC2 using SCFG */ struct ccsr_scfg *scfg = (struct ccsr_scfg *) CONFIG_SYS_MPC85xx_SCFG; out_be32(&scfg->esgmiiselcr, in_be32(&scfg->esgmiiselcr) | (0x80000000)); vsc9953_port_enable(i); } break; } if (lane >= 0) { bus = mii_dev_for_muxval(lane_to_slot[lane]); vsc9953_port_info_set_mdio(i, bus); vsc9953_port_enable(i); } vsc9953_port_info_set_phy_address(i, phy_addr); vsc9953_port_info_set_phy_int(i, phy_int); } #endif cpu_eth_init(bis); #endif return pci_eth_init(bis); }
int board_eth_init(bd_t *bis) { #ifdef CONFIG_FMAN_ENET int i, idx, lane, slot, interface; struct memac_mdio_info dtsec_mdio_info; struct ccsr_gur *gur = (void *)(CONFIG_SYS_FSL_GUTS_ADDR); u32 srds_s1, srds_s2; u8 brdcfg12; srds_s1 = in_be32(&gur->rcwsr[4]) & FSL_CHASSIS2_RCWSR4_SRDS1_PRTCL_MASK; srds_s1 >>= FSL_CHASSIS2_RCWSR4_SRDS1_PRTCL_SHIFT; srds_s2 = in_be32(&gur->rcwsr[4]) & FSL_CHASSIS2_RCWSR4_SRDS2_PRTCL_MASK; srds_s2 >>= FSL_CHASSIS2_RCWSR4_SRDS2_PRTCL_SHIFT; /* Initialize the mdio_mux array so we can recognize empty elements */ for (i = 0; i < NUM_FM_PORTS; i++) mdio_mux[i] = EMI_NONE; dtsec_mdio_info.regs = (struct memac_mdio_controller *)CONFIG_SYS_FM1_DTSEC_MDIO_ADDR; dtsec_mdio_info.name = DEFAULT_FM_MDIO_NAME; /* Register the 1G MDIO bus */ fm_memac_mdio_init(bis, &dtsec_mdio_info); /* Register the muxing front-ends to the MDIO buses */ ls1046aqds_mdio_init(DEFAULT_FM_MDIO_NAME, EMI1_RGMII1); ls1046aqds_mdio_init(DEFAULT_FM_MDIO_NAME, EMI1_RGMII2); ls1046aqds_mdio_init(DEFAULT_FM_MDIO_NAME, EMI1_SLOT1); ls1046aqds_mdio_init(DEFAULT_FM_MDIO_NAME, EMI1_SLOT2); ls1046aqds_mdio_init(DEFAULT_FM_MDIO_NAME, EMI1_SLOT4); /* Set the two on-board RGMII PHY address */ fm_info_set_phy_address(FM1_DTSEC3, RGMII_PHY1_ADDR); fm_info_set_phy_address(FM1_DTSEC4, RGMII_PHY2_ADDR); switch (srds_s1) { case 0x3333: /* SGMII on slot 1, MAC 9 */ fm_info_set_phy_address(FM1_DTSEC9, SGMII_CARD_PORT1_PHY_ADDR); case 0x1333: case 0x2333: /* SGMII on slot 1, MAC 10 */ fm_info_set_phy_address(FM1_DTSEC10, SGMII_CARD_PORT2_PHY_ADDR); case 0x1133: case 0x2233: /* SGMII on slot 1, MAC 5/6 */ fm_info_set_phy_address(FM1_DTSEC5, SGMII_CARD_PORT3_PHY_ADDR); fm_info_set_phy_address(FM1_DTSEC6, SGMII_CARD_PORT4_PHY_ADDR); break; case 0x1040: case 0x2040: /* QSGMII on lane B, MAC 6/5/10/1 */ fm_info_set_phy_address(FM1_DTSEC6, QSGMII_CARD_PORT1_PHY_ADDR_S2); fm_info_set_phy_address(FM1_DTSEC5, QSGMII_CARD_PORT2_PHY_ADDR_S2); fm_info_set_phy_address(FM1_DTSEC10, QSGMII_CARD_PORT3_PHY_ADDR_S2); fm_info_set_phy_address(FM1_DTSEC1, QSGMII_CARD_PORT4_PHY_ADDR_S2); break; case 0x3363: /* SGMII on slot 1, MAC 9/10 */ fm_info_set_phy_address(FM1_DTSEC9, SGMII_CARD_PORT1_PHY_ADDR); fm_info_set_phy_address(FM1_DTSEC10, SGMII_CARD_PORT2_PHY_ADDR); case 0x1163: case 0x2263: case 0x2223: /* SGMII on slot 1, MAC 6 */ fm_info_set_phy_address(FM1_DTSEC6, SGMII_CARD_PORT4_PHY_ADDR); break; default: printf("Invalid SerDes protocol 0x%x for LS1046AQDS\n", srds_s1); break; } if (srds_s2 == 0x5a59 || srds_s2 == 0x5a06) /* SGMII on slot 4, MAC 2 */ fm_info_set_phy_address(FM1_DTSEC2, SGMII_CARD_PORT1_PHY_ADDR); for (i = FM1_DTSEC1; i < FM1_DTSEC1 + CONFIG_SYS_NUM_FM1_DTSEC; i++) { idx = i - FM1_DTSEC1; interface = fm_info_get_enet_if(i); switch (interface) { case PHY_INTERFACE_MODE_SGMII: case PHY_INTERFACE_MODE_QSGMII: if (interface == PHY_INTERFACE_MODE_SGMII) { if (i == FM1_DTSEC5) { /* route lane 2 to slot1 so to have * one sgmii riser card supports * MAC5 and MAC6. */ brdcfg12 = QIXIS_READ(brdcfg[12]); QIXIS_WRITE(brdcfg[12], brdcfg12 | 0x80); } lane = serdes_get_first_lane(FSL_SRDS_1, SGMII_FM1_DTSEC1 + idx); } else { /* clear the bit 7 to route lane B on slot2. */ brdcfg12 = QIXIS_READ(brdcfg[12]); QIXIS_WRITE(brdcfg[12], brdcfg12 & 0x7f); lane = serdes_get_first_lane(FSL_SRDS_1, QSGMII_FM1_A); lane_to_slot[lane] = 2; } if (i == FM1_DTSEC2) lane = 5; if (lane < 0) break; slot = lane_to_slot[lane]; debug("FM1@DTSEC%u expects SGMII in slot %u\n", idx + 1, slot); if (QIXIS_READ(present2) & (1 << (slot - 1))) fm_disable_port(i); switch (slot) { case 1: mdio_mux[i] = EMI1_SLOT1; fm_info_set_mdio(i, mii_dev_for_muxval( mdio_mux[i])); break; case 2: mdio_mux[i] = EMI1_SLOT2; fm_info_set_mdio(i, mii_dev_for_muxval( mdio_mux[i])); break; case 4: mdio_mux[i] = EMI1_SLOT4; fm_info_set_mdio(i, mii_dev_for_muxval( mdio_mux[i])); break; default: break; } break; case PHY_INTERFACE_MODE_RGMII: case PHY_INTERFACE_MODE_RGMII_TXID: if (i == FM1_DTSEC3) mdio_mux[i] = EMI1_RGMII1; else if (i == FM1_DTSEC4) mdio_mux[i] = EMI1_RGMII2; fm_info_set_mdio(i, mii_dev_for_muxval(mdio_mux[i])); break; default: break; } } cpu_eth_init(bis); #endif /* CONFIG_FMAN_ENET */ return pci_eth_init(bis); }
void board_ft_fman_fixup_port(void *fdt, char *compat, phys_addr_t addr, enum fm_port port, int offset) { struct fixed_link f_link; const u32 *handle; const char *prop = NULL; int off; if (fm_info_get_enet_if(port) == PHY_INTERFACE_MODE_SGMII) { switch (port) { case FM1_DTSEC9: fdt_set_phy_handle(fdt, compat, addr, "sgmii_s1_p1"); break; case FM1_DTSEC10: fdt_set_phy_handle(fdt, compat, addr, "sgmii_s1_p2"); break; case FM1_DTSEC5: fdt_set_phy_handle(fdt, compat, addr, "sgmii_s1_p3"); break; case FM1_DTSEC6: fdt_set_phy_handle(fdt, compat, addr, "sgmii_s1_p4"); break; case FM1_DTSEC2: fdt_set_phy_handle(fdt, compat, addr, "sgmii_s4_p1"); break; default: break; } } else if (fm_info_get_enet_if(port) == PHY_INTERFACE_MODE_SGMII_2500) { /* 2.5G SGMII interface */ f_link.phy_id = cpu_to_fdt32(port); f_link.duplex = cpu_to_fdt32(1); f_link.link_speed = cpu_to_fdt32(1000); f_link.pause = 0; f_link.asym_pause = 0; /* no PHY for 2.5G SGMII on QDS */ fdt_delprop(fdt, offset, "phy-handle"); fdt_setprop(fdt, offset, "fixed-link", &f_link, sizeof(f_link)); fdt_setprop_string(fdt, offset, "phy-connection-type", "sgmii-2500"); } else if (fm_info_get_enet_if(port) == PHY_INTERFACE_MODE_QSGMII) { switch (port) { case FM1_DTSEC1: fdt_set_phy_handle(fdt, compat, addr, "qsgmii_s2_p4"); break; case FM1_DTSEC5: fdt_set_phy_handle(fdt, compat, addr, "qsgmii_s2_p2"); break; case FM1_DTSEC6: fdt_set_phy_handle(fdt, compat, addr, "qsgmii_s2_p1"); break; case FM1_DTSEC10: fdt_set_phy_handle(fdt, compat, addr, "qsgmii_s2_p3"); break; default: break; } fdt_delprop(fdt, offset, "phy-connection-type"); fdt_setprop_string(fdt, offset, "phy-connection-type", "qsgmii"); } else if (fm_info_get_enet_if(port) == PHY_INTERFACE_MODE_XGMII && (port == FM1_10GEC1 || port == FM1_10GEC2)) { handle = fdt_getprop(fdt, offset, "phy-handle", NULL); prop = NULL; if (handle) { off = fdt_node_offset_by_phandle(fdt, fdt32_to_cpu(*handle)); prop = fdt_getprop(fdt, off, "backplane-mode", NULL); } if (!prop || strcmp(prop, "10gbase-kr")) { /* XFI interface */ f_link.phy_id = cpu_to_fdt32(port); f_link.duplex = cpu_to_fdt32(1); f_link.link_speed = cpu_to_fdt32(10000); f_link.pause = 0; f_link.asym_pause = 0; /* no PHY for XFI */ fdt_delprop(fdt, offset, "phy-handle"); fdt_setprop(fdt, offset, "fixed-link", &f_link, sizeof(f_link)); fdt_setprop_string(fdt, offset, "phy-connection-type", "xgmii"); } } }
/* * Configure the status for the virtual MDIO nodes * * Rather than create the virtual MDIO nodes from scratch for each active * virtual MDIO, we expect the DTS to have the nodes defined already, and we * only enable the ones that are actually active. * * We assume that the DTS already hard-codes the status for all the * virtual MDIO nodes to "disabled", so all we need to do is enable the * active ones. */ void fdt_fixup_board_enet(void *fdt) { #ifdef CONFIG_FMAN_ENET enum fm_port i; int lane, slot; for (i = FM1_DTSEC1; i < FM1_DTSEC1 + CONFIG_SYS_NUM_FM1_DTSEC; i++) { int idx = i - FM1_DTSEC1; switch (fm_info_get_enet_if(i)) { case PHY_INTERFACE_MODE_SGMII: lane = serdes_get_first_lane(SGMII_FM1_DTSEC1 + idx); if (lane >= 0) { char alias[32]; slot = lane_to_slot[lane]; sprintf(alias, "hydra_sg_slot%u", slot); fdt_status_okay_by_alias(fdt, alias); debug("Enabled MDIO node %s (slot %i)\n", alias, slot); } break; case PHY_INTERFACE_MODE_RGMII: fdt_status_okay_by_alias(fdt, "hydra_rg"); debug("Enabled MDIO node hydra_rg\n"); break; default: break; } } lane = serdes_get_first_lane(XAUI_FM1); if (lane >= 0) { char alias[32]; slot = lane_to_slot[lane]; sprintf(alias, "hydra_xg_slot%u", slot); fdt_status_okay_by_alias(fdt, alias); debug("Enabled MDIO node %s (slot %i)\n", alias, slot); } #if CONFIG_SYS_NUM_FMAN == 2 for (i = FM2_DTSEC1; i < FM2_DTSEC1 + CONFIG_SYS_NUM_FM2_DTSEC; i++) { int idx = i - FM2_DTSEC1; switch (fm_info_get_enet_if(i)) { case PHY_INTERFACE_MODE_SGMII: lane = serdes_get_first_lane(SGMII_FM2_DTSEC1 + idx); if (lane >= 0) { char alias[32]; slot = lane_to_slot[lane]; sprintf(alias, "hydra_sg_slot%u", slot); fdt_status_okay_by_alias(fdt, alias); debug("Enabled MDIO node %s (slot %i)\n", alias, slot); } break; case PHY_INTERFACE_MODE_RGMII: fdt_status_okay_by_alias(fdt, "hydra_rg"); debug("Enabled MDIO node hydra_rg\n"); break; default: break; } } lane = serdes_get_first_lane(XAUI_FM2); if (lane >= 0) { char alias[32]; slot = lane_to_slot[lane]; sprintf(alias, "hydra_xg_slot%u", slot); fdt_status_okay_by_alias(fdt, alias); debug("Enabled MDIO node %s (slot %i)\n", alias, slot); } #endif /* CONFIG_SYS_NUM_FMAN == 2 */ #endif /* CONFIG_FMAN_ENET */ }
int board_eth_init(bd_t *bis) { #ifdef CONFIG_FMAN_ENET struct fsl_pq_mdio_info dtsec_mdio_info; struct tgec_mdio_info tgec_mdio_info; unsigned int i, slot; int lane; struct mii_dev *bus; int qsgmii; int phy_real_addr; ccsr_gur_t *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR); int srds_prtcl = (in_be32(&gur->rcwsr[4]) & FSL_CORENET_RCWSR4_SRDS_PRTCL) >> 26; printf("Initializing Fman\n"); initialize_lane_to_slot(); /* We want to use the PIXIS to configure MUX routing, not GPIOs. */ setbits_8(&pixis->brdcfg2, BRDCFG2_REG_GPIO_SEL); memset(mdio_mux, 0, sizeof(mdio_mux)); dtsec_mdio_info.regs = (struct tsec_mii_mng *)CONFIG_SYS_FM1_DTSEC1_MDIO_ADDR; dtsec_mdio_info.name = DEFAULT_FM_MDIO_NAME; /* Register the real 1G MDIO bus */ fsl_pq_mdio_init(bis, &dtsec_mdio_info); tgec_mdio_info.regs = (struct tgec_mdio_controller *)CONFIG_SYS_FM1_TGEC_MDIO_ADDR; tgec_mdio_info.name = DEFAULT_FM_TGEC_MDIO_NAME; /* Register the real 10G MDIO bus */ fm_tgec_mdio_init(bis, &tgec_mdio_info); /* Register the three virtual MDIO front-ends */ super_hydra_mdio_init(DEFAULT_FM_MDIO_NAME, "SUPER_HYDRA_RGMII_MDIO"); super_hydra_mdio_init(DEFAULT_FM_MDIO_NAME, "SUPER_HYDRA_FM1_SGMII_MDIO"); super_hydra_mdio_init(DEFAULT_FM_MDIO_NAME, "SUPER_HYDRA_FM2_SGMII_MDIO"); super_hydra_mdio_init(DEFAULT_FM_MDIO_NAME, "SUPER_HYDRA_FM3_SGMII_MDIO"); super_hydra_mdio_init(DEFAULT_FM_TGEC_MDIO_NAME, "SUPER_HYDRA_FM1_TGEC_MDIO"); super_hydra_mdio_init(DEFAULT_FM_TGEC_MDIO_NAME, "SUPER_HYDRA_FM2_TGEC_MDIO"); /* * Program the DTSEC PHY addresses assuming that they are all SGMII. * For any DTSEC that's RGMII, we'll override its PHY address later. * We assume that DTSEC5 is only used for RGMII. */ fm_info_set_phy_address(FM1_DTSEC1, CONFIG_SYS_FM1_DTSEC1_PHY_ADDR); fm_info_set_phy_address(FM1_DTSEC2, CONFIG_SYS_FM1_DTSEC2_PHY_ADDR); fm_info_set_phy_address(FM1_10GEC1, CONFIG_SYS_FM2_10GEC1_PHY_ADDR); #if (CONFIG_SYS_NUM_FMAN == 2) fm_info_set_phy_address(FM2_DTSEC1, CONFIG_SYS_FM2_DTSEC1_PHY_ADDR); fm_info_set_phy_address(FM2_DTSEC2, CONFIG_SYS_FM2_DTSEC2_PHY_ADDR); fm_info_set_phy_address(FM2_DTSEC3, CONFIG_SYS_FM2_DTSEC1_PHY_ADDR); fm_info_set_phy_address(FM2_DTSEC4, CONFIG_SYS_FM2_DTSEC2_PHY_ADDR); fm_info_set_phy_address(FM2_10GEC1, CONFIG_SYS_FM1_10GEC1_PHY_ADDR); #endif switch (srds_prtcl) { case 0: case 3: case 4: case 6: case 0x11: case 0x2a: case 0x34: case 0x36: fm_info_set_phy_address(FM1_DTSEC3, CONFIG_SYS_FM1_DTSEC3_PHY_ADDR); fm_info_set_phy_address(FM1_DTSEC4, CONFIG_SYS_FM1_DTSEC4_PHY_ADDR); break; case 1: case 2: case 5: case 7: case 0x35: fm_info_set_phy_address(FM1_DTSEC3, CONFIG_SYS_FM1_DTSEC1_PHY_ADDR); fm_info_set_phy_address(FM1_DTSEC4, CONFIG_SYS_FM1_DTSEC2_PHY_ADDR); break; default: printf("Fman: Unsupport SerDes Protocol 0x%02x\n", srds_prtcl); break; } for (i = FM1_DTSEC1; i < FM1_DTSEC1 + CONFIG_SYS_NUM_FM1_DTSEC; i++) { int idx = i - FM1_DTSEC1; switch (fm_info_get_enet_if(i)) { case PHY_INTERFACE_MODE_SGMII: lane = serdes_get_first_lane(SGMII_FM1_DTSEC1 + idx); if (lane < 0) break; slot = lane_to_slot[lane]; mdio_mux[i].mask = BRDCFG1_EMI1_SEL_MASK; debug("FM1@DTSEC%u expects SGMII in slot %u\n", idx + 1, slot); switch (slot) { case 1: mdio_mux[i].val = BRDCFG1_EMI1_SEL_SLOT1 | BRDCFG1_EMI1_EN; break; case 2: mdio_mux[i].val = BRDCFG1_EMI1_SEL_SLOT2 | BRDCFG1_EMI1_EN; break; case 3: mdio_mux[i].val = BRDCFG1_EMI1_SEL_SLOT3 | BRDCFG1_EMI1_EN; break; case 5: mdio_mux[i].val = BRDCFG1_EMI1_SEL_SLOT5 | BRDCFG1_EMI1_EN; break; case 6: mdio_mux[i].val = BRDCFG1_EMI1_SEL_SLOT6 | BRDCFG1_EMI1_EN; break; case 7: mdio_mux[i].val = BRDCFG1_EMI1_SEL_SLOT7 | BRDCFG1_EMI1_EN; break; }; super_hydra_mdio_set_mux("SUPER_HYDRA_FM1_SGMII_MDIO", mdio_mux[i].mask, mdio_mux[i].val); fm_info_set_mdio(i, miiphy_get_dev_by_name("SUPER_HYDRA_FM1_SGMII_MDIO")); break; case PHY_INTERFACE_MODE_RGMII: /* * FM1 DTSEC5 is routed via EC1 to the first on-board * RGMII port. FM2 DTSEC5 is routed via EC2 to the * second on-board RGMII port. The other DTSECs cannot * be routed to RGMII. */ debug("FM1@DTSEC%u is RGMII at address %u\n", idx + 1, 0); fm_info_set_phy_address(i, 0); mdio_mux[i].mask = BRDCFG1_EMI1_SEL_MASK; mdio_mux[i].val = BRDCFG1_EMI1_SEL_RGMII | BRDCFG1_EMI1_EN; super_hydra_mdio_set_mux("SUPER_HYDRA_RGMII_MDIO", mdio_mux[i].mask, mdio_mux[i].val); fm_info_set_mdio(i, miiphy_get_dev_by_name("SUPER_HYDRA_RGMII_MDIO")); break; case PHY_INTERFACE_MODE_NONE: fm_info_set_phy_address(i, 0); break; default: printf("Fman1: DTSEC%u set to unknown interface %i\n", idx + 1, fm_info_get_enet_if(i)); fm_info_set_phy_address(i, 0); break; } } bus = miiphy_get_dev_by_name("SUPER_HYDRA_FM1_SGMII_MDIO"); qsgmii = is_qsgmii_riser_card(bus, PHY_BASE_ADDR, PORT_NUM_FM1, REGNUM); if (qsgmii) { for (i = FM1_DTSEC1; i < FM1_DTSEC1 + PORT_NUM_FM1; i++) { if (fm_info_get_enet_if(i) == PHY_INTERFACE_MODE_SGMII) { phy_real_addr = PHY_BASE_ADDR + i - FM1_DTSEC1; fm_info_set_phy_address(i, phy_real_addr); } } switch (srds_prtcl) { case 0x00: case 0x03: case 0x04: case 0x06: case 0x11: case 0x2a: case 0x34: case 0x36: fm_info_set_phy_address(FM1_DTSEC3, PHY_BASE_ADDR + 2); fm_info_set_phy_address(FM1_DTSEC4, PHY_BASE_ADDR + 3); break; case 0x01: case 0x02: case 0x05: case 0x07: case 0x35: fm_info_set_phy_address(FM1_DTSEC3, PHY_BASE_ADDR + 0); fm_info_set_phy_address(FM1_DTSEC4, PHY_BASE_ADDR + 1); break; default: break; } } /* * For 10G, we only support one XAUI card per Fman. If present, then we * force its routing and never touch those bits again, which removes the * need for Linux to do any muxing. This works because of the way * BRDCFG1 is defined, but it's a bit hackish. * * The PHY address for the XAUI card depends on which slot it's in. The * macros we use imply that the PHY address is based on which FM, but * that's not true. On the P4080DS, FM1 could only use XAUI in slot 5, * and FM2 could only use a XAUI in slot 4. On the Hydra board, we * check the actual slot and just use the macros as-is, even though * the P3041 and P5020 only have one Fman. */ lane = serdes_get_first_lane(XAUI_FM1); if (lane >= 0) { debug("FM1@TGEC1 expects XAUI in slot %u\n", lane_to_slot[lane]); mdio_mux[i].mask = BRDCFG1_EMI2_SEL_MASK; mdio_mux[i].val = BRDCFG1_EMI2_SEL_SLOT2; super_hydra_mdio_set_mux("SUPER_HYDRA_FM1_TGEC_MDIO", mdio_mux[i].mask, mdio_mux[i].val); } fm_info_set_mdio(FM1_10GEC1, miiphy_get_dev_by_name("SUPER_HYDRA_FM1_TGEC_MDIO")); #if (CONFIG_SYS_NUM_FMAN == 2) for (i = FM2_DTSEC1; i < FM2_DTSEC1 + CONFIG_SYS_NUM_FM2_DTSEC; i++) { int idx = i - FM2_DTSEC1; switch (fm_info_get_enet_if(i)) { case PHY_INTERFACE_MODE_SGMII: lane = serdes_get_first_lane(SGMII_FM2_DTSEC1 + idx); if (lane < 0) break; slot = lane_to_slot[lane]; mdio_mux[i].mask = BRDCFG1_EMI1_SEL_MASK; debug("FM2@DTSEC%u expects SGMII in slot %u\n", idx + 1, slot); switch (slot) { case 1: mdio_mux[i].val = BRDCFG1_EMI1_SEL_SLOT1 | BRDCFG1_EMI1_EN; break; case 2: mdio_mux[i].val = BRDCFG1_EMI1_SEL_SLOT2 | BRDCFG1_EMI1_EN; break; case 3: mdio_mux[i].val = BRDCFG1_EMI1_SEL_SLOT3 | BRDCFG1_EMI1_EN; break; case 5: mdio_mux[i].val = BRDCFG1_EMI1_SEL_SLOT5 | BRDCFG1_EMI1_EN; break; case 6: mdio_mux[i].val = BRDCFG1_EMI1_SEL_SLOT6 | BRDCFG1_EMI1_EN; break; case 7: mdio_mux[i].val = BRDCFG1_EMI1_SEL_SLOT7 | BRDCFG1_EMI1_EN; break; }; if (i == FM2_DTSEC1 || i == FM2_DTSEC2) { super_hydra_mdio_set_mux( "SUPER_HYDRA_FM3_SGMII_MDIO", mdio_mux[i].mask, mdio_mux[i].val); fm_info_set_mdio(i, miiphy_get_dev_by_name( "SUPER_HYDRA_FM3_SGMII_MDIO")); } else { super_hydra_mdio_set_mux( "SUPER_HYDRA_FM2_SGMII_MDIO", mdio_mux[i].mask, mdio_mux[i].val); fm_info_set_mdio(i, miiphy_get_dev_by_name( "SUPER_HYDRA_FM2_SGMII_MDIO")); } break; case PHY_INTERFACE_MODE_RGMII: /* * FM1 DTSEC5 is routed via EC1 to the first on-board * RGMII port. FM2 DTSEC5 is routed via EC2 to the * second on-board RGMII port. The other DTSECs cannot * be routed to RGMII. */ debug("FM2@DTSEC%u is RGMII at address %u\n", idx + 1, 1); fm_info_set_phy_address(i, 1); mdio_mux[i].mask = BRDCFG1_EMI1_SEL_MASK; mdio_mux[i].val = BRDCFG1_EMI1_SEL_RGMII | BRDCFG1_EMI1_EN; super_hydra_mdio_set_mux("SUPER_HYDRA_RGMII_MDIO", mdio_mux[i].mask, mdio_mux[i].val); fm_info_set_mdio(i, miiphy_get_dev_by_name("SUPER_HYDRA_RGMII_MDIO")); break; case PHY_INTERFACE_MODE_NONE: fm_info_set_phy_address(i, 0); break; default: printf("Fman2: DTSEC%u set to unknown interface %i\n", idx + 1, fm_info_get_enet_if(i)); fm_info_set_phy_address(i, 0); break; } } bus = miiphy_get_dev_by_name("SUPER_HYDRA_FM2_SGMII_MDIO"); set_sgmii_phy(bus, FM2_DTSEC3, PORT_NUM_FM2, PHY_BASE_ADDR); bus = miiphy_get_dev_by_name("SUPER_HYDRA_FM3_SGMII_MDIO"); set_sgmii_phy(bus, FM2_DTSEC1, PORT_NUM_FM2, PHY_BASE_ADDR); /* * For 10G, we only support one XAUI card per Fman. If present, then we * force its routing and never touch those bits again, which removes the * need for Linux to do any muxing. This works because of the way * BRDCFG1 is defined, but it's a bit hackish. * * The PHY address for the XAUI card depends on which slot it's in. The * macros we use imply that the PHY address is based on which FM, but * that's not true. On the P4080DS, FM1 could only use XAUI in slot 5, * and FM2 could only use a XAUI in slot 4. On the Hydra board, we * check the actual slot and just use the macros as-is, even though * the P3041 and P5020 only have one Fman. */ lane = serdes_get_first_lane(XAUI_FM2); if (lane >= 0) { debug("FM2@TGEC1 expects XAUI in slot %u\n", lane_to_slot[lane]); mdio_mux[i].mask = BRDCFG1_EMI2_SEL_MASK; mdio_mux[i].val = BRDCFG1_EMI2_SEL_SLOT1; super_hydra_mdio_set_mux("SUPER_HYDRA_FM2_TGEC_MDIO", mdio_mux[i].mask, mdio_mux[i].val); } fm_info_set_mdio(FM2_10GEC1, miiphy_get_dev_by_name("SUPER_HYDRA_FM2_TGEC_MDIO")); #endif cpu_eth_init(bis); #endif return pci_eth_init(bis); }
int board_eth_init(bd_t *bis) { #ifdef CONFIG_FMAN_ENET ccsr_gpio_t *pgpio = (void *)(CONFIG_SYS_MPC85xx_GPIO_ADDR); struct dtsec *tsec = (void *)CONFIG_SYS_FSL_FM1_DTSEC1_ADDR; int i; struct fsl_pq_mdio_info dtsec_mdio_info; struct tgec_mdio_info tgec_mdio_info; u8 lane_to_slot[] = { SLOT1, /* 0 - Bank 1:A */ SLOT1, /* 1 - Bank 1:B */ SLOT2, /* 2 - Bank 1:C */ SLOT2, /* 3 - Bank 1:D */ SLOT3, /* 4 - Bank 1:E */ SLOT3, /* 5 - Bank 1:F */ SLOT3, /* 6 - Bank 1:G */ SLOT3, /* 7 - Bank 1:H */ SLOT6, /* 8 - Bank 1:I */ SLOT6, /* 9 - Bank 1:J */ SLOT4, /* 10 - Bank 2:A */ SLOT4, /* 11 - Bank 2:B */ SLOT4, /* 12 - Bank 2:C */ SLOT4, /* 13 - Bank 2:D */ SLOT5, /* 14 - Bank 3:A */ SLOT5, /* 15 - Bank 3:B */ SLOT5, /* 16 - Bank 3:C */ SLOT5, /* 17 - Bank 3:D */ }; /* * Set TBIPA on FM1@DTSEC1. This is needed for configurations * where FM1@DTSEC1 isn't used directly, since it provides * MDIO for other ports. */ out_be32(&tsec->tbipa, CONFIG_SYS_TBIPA_VALUE); /* Initialize the mdio_mux array so we can recognize empty elements */ for (i = 0; i < NUM_FM_PORTS; i++) mdio_mux[i] = EMI_NONE; /* The first 4 GPIOs are outputs to control MDIO bus muxing */ out_be32(&pgpio->gpdir, EMI_MASK); dtsec_mdio_info.regs = (struct tsec_mii_mng *)CONFIG_SYS_FM1_DTSEC1_MDIO_ADDR; dtsec_mdio_info.name = DEFAULT_FM_MDIO_NAME; /* Register the 1G MDIO bus */ fsl_pq_mdio_init(bis, &dtsec_mdio_info); tgec_mdio_info.regs = (struct tgec_mdio_controller *)CONFIG_SYS_FM1_TGEC_MDIO_ADDR; tgec_mdio_info.name = DEFAULT_FM_TGEC_MDIO_NAME; /* Register the 10G MDIO bus */ fm_tgec_mdio_init(bis, &tgec_mdio_info); /* Register the 6 muxing front-ends to the MDIO buses */ p4080ds_mdio_init(DEFAULT_FM_MDIO_NAME, EMI1_RGMII); p4080ds_mdio_init(DEFAULT_FM_MDIO_NAME, EMI1_SLOT3); p4080ds_mdio_init(DEFAULT_FM_MDIO_NAME, EMI1_SLOT4); p4080ds_mdio_init(DEFAULT_FM_MDIO_NAME, EMI1_SLOT5); p4080ds_mdio_init(DEFAULT_FM_TGEC_MDIO_NAME, EMI2_SLOT4); p4080ds_mdio_init(DEFAULT_FM_TGEC_MDIO_NAME, EMI2_SLOT5); fm_info_set_phy_address(FM1_DTSEC1, CONFIG_SYS_FM1_DTSEC1_PHY_ADDR); fm_info_set_phy_address(FM1_DTSEC2, CONFIG_SYS_FM1_DTSEC2_PHY_ADDR); fm_info_set_phy_address(FM1_DTSEC3, CONFIG_SYS_FM1_DTSEC3_PHY_ADDR); fm_info_set_phy_address(FM1_DTSEC4, CONFIG_SYS_FM1_DTSEC4_PHY_ADDR); fm_info_set_phy_address(FM1_10GEC1, CONFIG_SYS_FM1_10GEC1_PHY_ADDR); #if (CONFIG_SYS_NUM_FMAN == 2) fm_info_set_phy_address(FM2_DTSEC1, CONFIG_SYS_FM2_DTSEC1_PHY_ADDR); fm_info_set_phy_address(FM2_DTSEC2, CONFIG_SYS_FM2_DTSEC2_PHY_ADDR); fm_info_set_phy_address(FM2_DTSEC3, CONFIG_SYS_FM2_DTSEC3_PHY_ADDR); fm_info_set_phy_address(FM2_DTSEC4, CONFIG_SYS_FM2_DTSEC4_PHY_ADDR); fm_info_set_phy_address(FM2_10GEC1, CONFIG_SYS_FM2_10GEC1_PHY_ADDR); #endif for (i = FM1_DTSEC1; i < FM1_DTSEC1 + CONFIG_SYS_NUM_FM1_DTSEC; i++) { int idx = i - FM1_DTSEC1, lane, slot; switch (fm_info_get_enet_if(i)) { case PHY_INTERFACE_MODE_SGMII: lane = serdes_get_first_lane(SGMII_FM1_DTSEC1 + idx); if (lane < 0) break; slot = lane_to_slot[lane]; switch (slot) { case SLOT3: mdio_mux[i] = EMI1_SLOT3; fm_info_set_mdio(i, mii_dev_for_muxval(mdio_mux[i])); break; case SLOT4: mdio_mux[i] = EMI1_SLOT4; fm_info_set_mdio(i, mii_dev_for_muxval(mdio_mux[i])); break; case SLOT5: mdio_mux[i] = EMI1_SLOT5; fm_info_set_mdio(i, mii_dev_for_muxval(mdio_mux[i])); break; }; break; case PHY_INTERFACE_MODE_RGMII: fm_info_set_phy_address(i, 0); mdio_mux[i] = EMI1_RGMII; fm_info_set_mdio(i, mii_dev_for_muxval(mdio_mux[i])); break; default: break; } } for (i = FM1_10GEC1; i < FM1_10GEC1 + CONFIG_SYS_NUM_FM1_10GEC; i++) { int idx = i - FM1_10GEC1, lane, slot; switch (fm_info_get_enet_if(i)) { case PHY_INTERFACE_MODE_XGMII: lane = serdes_get_first_lane(XAUI_FM1 + idx); if (lane < 0) break; slot = lane_to_slot[lane]; switch (slot) { case SLOT4: mdio_mux[i] = EMI2_SLOT4; fm_info_set_mdio(i, mii_dev_for_muxval(mdio_mux[i])); break; case SLOT5: mdio_mux[i] = EMI2_SLOT5; fm_info_set_mdio(i, mii_dev_for_muxval(mdio_mux[i])); break; }; break; default: break; } } #if (CONFIG_SYS_NUM_FMAN == 2) for (i = FM2_DTSEC1; i < FM2_DTSEC1 + CONFIG_SYS_NUM_FM2_DTSEC; i++) { int idx = i - FM2_DTSEC1, lane, slot; switch (fm_info_get_enet_if(i)) { case PHY_INTERFACE_MODE_SGMII: lane = serdes_get_first_lane(SGMII_FM2_DTSEC1 + idx); if (lane < 0) break; slot = lane_to_slot[lane]; switch (slot) { case SLOT3: mdio_mux[i] = EMI1_SLOT3; fm_info_set_mdio(i, mii_dev_for_muxval(mdio_mux[i])); break; case SLOT4: mdio_mux[i] = EMI1_SLOT4; fm_info_set_mdio(i, mii_dev_for_muxval(mdio_mux[i])); break; case SLOT5: mdio_mux[i] = EMI1_SLOT5; fm_info_set_mdio(i, mii_dev_for_muxval(mdio_mux[i])); break; }; break; case PHY_INTERFACE_MODE_RGMII: fm_info_set_phy_address(i, 0); mdio_mux[i] = EMI1_RGMII; fm_info_set_mdio(i, mii_dev_for_muxval(mdio_mux[i])); break; default: break; } } for (i = FM2_10GEC1; i < FM2_10GEC1 + CONFIG_SYS_NUM_FM2_10GEC; i++) { int idx = i - FM2_10GEC1, lane, slot; switch (fm_info_get_enet_if(i)) { case PHY_INTERFACE_MODE_XGMII: lane = serdes_get_first_lane(XAUI_FM2 + idx); if (lane < 0) break; slot = lane_to_slot[lane]; switch (slot) { case SLOT4: mdio_mux[i] = EMI2_SLOT4; fm_info_set_mdio(i, mii_dev_for_muxval(mdio_mux[i])); break; case SLOT5: mdio_mux[i] = EMI2_SLOT5; fm_info_set_mdio(i, mii_dev_for_muxval(mdio_mux[i])); break; }; break; default: break; } } #endif cpu_eth_init(bis); #endif /* CONFIG_FMAN_ENET */ return pci_eth_init(bis); }
int board_eth_init(bd_t *bis) { #ifdef CONFIG_FMAN_ENET struct dtsec *tsec = (void *)CONFIG_SYS_FSL_FM1_DTSEC1_ADDR; struct fsl_pq_mdio_info dtsec_mdio_info; struct tgec_mdio_info tgec_mdio_info; unsigned int i, slot; int lane; printf("Initializing Fman\n"); initialize_lane_to_slot(); /* * Set TBIPA on FM1@DTSEC1. This is needed for configurations * where FM1@DTSEC1 isn't used directly, since it provides * MDIO for other ports. */ out_be32(&tsec->tbipa, CONFIG_SYS_TBIPA_VALUE); dtsec_mdio_info.regs = (struct tsec_mii_mng *)CONFIG_SYS_FM1_DTSEC1_MDIO_ADDR; dtsec_mdio_info.name = DEFAULT_FM_MDIO_NAME; /* Register the real 1G MDIO bus */ fsl_pq_mdio_init(bis, &dtsec_mdio_info); tgec_mdio_info.regs = (struct tgec_mdio_controller *)CONFIG_SYS_FM1_TGEC_MDIO_ADDR; tgec_mdio_info.name = DEFAULT_FM_TGEC_MDIO_NAME; /* Register the real 10G MDIO bus */ fm_tgec_mdio_init(bis, &tgec_mdio_info); /* * Program the three on-board SGMII PHY addresses. If the SGMII Riser * card used, we'll override the PHY address later. For any DTSEC that * is RGMII, we'll also override its PHY address later. We assume that * DTSEC4 and DTSEC5 are used for RGMII. */ fm_info_set_phy_address(FM1_DTSEC1, CONFIG_SYS_FM1_DTSEC1_PHY_ADDR); fm_info_set_phy_address(FM1_DTSEC2, CONFIG_SYS_FM1_DTSEC2_PHY_ADDR); fm_info_set_phy_address(FM1_DTSEC3, CONFIG_SYS_FM1_DTSEC3_PHY_ADDR); for (i = FM1_DTSEC1; i < FM1_DTSEC1 + CONFIG_SYS_NUM_FM1_DTSEC; i++) { int idx = i - FM1_DTSEC1; switch (fm_info_get_enet_if(i)) { case PHY_INTERFACE_MODE_SGMII: lane = serdes_get_first_lane(SGMII_FM1_DTSEC1 + idx); if (lane < 0) break; slot = lane_to_slot[lane]; if (slot) fm_info_set_phy_address(i, riser_phy_addr[i]); break; case PHY_INTERFACE_MODE_RGMII: /* Only DTSEC4 and DTSEC5 can be routed to RGMII */ fm_info_set_phy_address(i, i == FM1_DTSEC5 ? CONFIG_SYS_FM1_DTSEC5_PHY_ADDR : CONFIG_SYS_FM1_DTSEC4_PHY_ADDR); break; default: printf("Fman1: DTSEC%u set to unknown interface %i\n", idx + 1, fm_info_get_enet_if(i)); break; } fm_info_set_mdio(i, miiphy_get_dev_by_name(DEFAULT_FM_MDIO_NAME)); } lane = serdes_get_first_lane(XAUI_FM1); if (lane >= 0) { slot = lane_to_slot[lane]; if (slot) fm_info_set_phy_address(FM1_10GEC1, CONFIG_SYS_FM1_10GEC1_PHY_ADDR); } fm_info_set_mdio(FM1_10GEC1, miiphy_get_dev_by_name(DEFAULT_FM_TGEC_MDIO_NAME)); cpu_eth_init(bis); #endif return pci_eth_init(bis); }
void board_ft_fman_fixup_port(void *fdt, char *compat, phys_addr_t addr, enum fm_port port, int offset) { struct fixed_link f_link; if (fm_info_get_enet_if(port) == PHY_INTERFACE_MODE_SGMII) { if (port == FM1_DTSEC9) { fdt_set_phy_handle(fdt, compat, addr, "sgmii_riser_s1_p1"); } else if (port == FM1_DTSEC2) { fdt_set_phy_handle(fdt, compat, addr, "sgmii_riser_s2_p1"); } else if (port == FM1_DTSEC5) { fdt_set_phy_handle(fdt, compat, addr, "sgmii_riser_s3_p1"); } else if (port == FM1_DTSEC6) { fdt_set_phy_handle(fdt, compat, addr, "sgmii_riser_s4_p1"); } } else if (fm_info_get_enet_if(port) == PHY_INTERFACE_MODE_SGMII_2500) { /* 2.5G SGMII interface */ f_link.phy_id = cpu_to_fdt32(port); f_link.duplex = cpu_to_fdt32(1); f_link.link_speed = cpu_to_fdt32(1000); f_link.pause = 0; f_link.asym_pause = 0; /* no PHY for 2.5G SGMII */ fdt_delprop(fdt, offset, "phy-handle"); fdt_setprop(fdt, offset, "fixed-link", &f_link, sizeof(f_link)); fdt_setprop_string(fdt, offset, "phy-connection-type", "sgmii-2500"); } else if (fm_info_get_enet_if(port) == PHY_INTERFACE_MODE_QSGMII) { switch (mdio_mux[port]) { case EMI1_SLOT1: switch (port) { case FM1_DTSEC1: fdt_set_phy_handle(fdt, compat, addr, "qsgmii_s1_p1"); break; case FM1_DTSEC2: fdt_set_phy_handle(fdt, compat, addr, "qsgmii_s1_p2"); break; case FM1_DTSEC5: fdt_set_phy_handle(fdt, compat, addr, "qsgmii_s1_p3"); break; case FM1_DTSEC6: fdt_set_phy_handle(fdt, compat, addr, "qsgmii_s1_p4"); break; default: break; } break; case EMI1_SLOT2: switch (port) { case FM1_DTSEC1: fdt_set_phy_handle(fdt, compat, addr, "qsgmii_s2_p1"); break; case FM1_DTSEC2: fdt_set_phy_handle(fdt, compat, addr, "qsgmii_s2_p2"); break; case FM1_DTSEC5: fdt_set_phy_handle(fdt, compat, addr, "qsgmii_s2_p3"); break; case FM1_DTSEC6: fdt_set_phy_handle(fdt, compat, addr, "qsgmii_s2_p4"); break; default: break; } break; default: break; } fdt_delprop(fdt, offset, "phy-connection-type"); fdt_setprop_string(fdt, offset, "phy-connection-type", "qsgmii"); } else if (fm_info_get_enet_if(port) == PHY_INTERFACE_MODE_XGMII && port == FM1_10GEC1) { /* XFI interface */ f_link.phy_id = cpu_to_fdt32(port); f_link.duplex = cpu_to_fdt32(1); f_link.link_speed = cpu_to_fdt32(10000); f_link.pause = 0; f_link.asym_pause = 0; /* no PHY for XFI */ fdt_delprop(fdt, offset, "phy-handle"); fdt_setprop(fdt, offset, "fixed-link", &f_link, sizeof(f_link)); fdt_setprop_string(fdt, offset, "phy-connection-type", "xgmii"); } }
int board_eth_init(bd_t *bis) { #ifdef CONFIG_FMAN_ENET struct fsl_pq_mdio_info dtsec_mdio_info; struct tgec_mdio_info tgec_mdio_info; unsigned int i, slot; int lane; struct mii_dev *bus; printf("Initializing Fman\n"); initialize_lane_to_slot(); /* We want to use the PIXIS to configure MUX routing, not GPIOs. */ setbits_8(&pixis->brdcfg2, BRDCFG2_REG_GPIO_SEL); memset(mdio_mux, 0, sizeof(mdio_mux)); dtsec_mdio_info.regs = (struct tsec_mii_mng *)CONFIG_SYS_FM1_DTSEC1_MDIO_ADDR; dtsec_mdio_info.name = DEFAULT_FM_MDIO_NAME; /* Register the real 1G MDIO bus */ fsl_pq_mdio_init(bis, &dtsec_mdio_info); tgec_mdio_info.regs = (struct tgec_mdio_controller *)CONFIG_SYS_FM1_TGEC_MDIO_ADDR; tgec_mdio_info.name = DEFAULT_FM_TGEC_MDIO_NAME; /* Register the real 10G MDIO bus */ fm_tgec_mdio_init(bis, &tgec_mdio_info); /* Register the three virtual MDIO front-ends */ hydra_mdio_init(DEFAULT_FM_MDIO_NAME, "HYDRA_RGMII_MDIO"); hydra_mdio_init(DEFAULT_FM_MDIO_NAME, "HYDRA_SGMII_MDIO"); /* * Program the DTSEC PHY addresses assuming that they are all SGMII. * For any DTSEC that's RGMII, we'll override its PHY address later. * We assume that DTSEC5 is only used for RGMII. */ fm_info_set_phy_address(FM1_DTSEC1, CONFIG_SYS_FM1_DTSEC1_PHY_ADDR); fm_info_set_phy_address(FM1_DTSEC2, CONFIG_SYS_FM1_DTSEC2_PHY_ADDR); fm_info_set_phy_address(FM1_DTSEC3, CONFIG_SYS_FM1_DTSEC3_PHY_ADDR); fm_info_set_phy_address(FM1_DTSEC4, CONFIG_SYS_FM1_DTSEC4_PHY_ADDR); for (i = FM1_DTSEC1; i < FM1_DTSEC1 + CONFIG_SYS_NUM_FM1_DTSEC; i++) { int idx = i - FM1_DTSEC1; switch (fm_info_get_enet_if(i)) { case PHY_INTERFACE_MODE_SGMII: lane = serdes_get_first_lane(SGMII_FM1_DTSEC1 + idx); if (lane < 0) break; slot = lane_to_slot[lane]; mdio_mux[i].mask = BRDCFG1_EMI1_SEL_MASK; switch (slot) { case 1: /* Always DTSEC5 on Bank 3 */ mdio_mux[i].val = BRDCFG1_EMI1_SEL_SLOT1 | BRDCFG1_EMI1_EN; break; case 2: mdio_mux[i].val = BRDCFG1_EMI1_SEL_SLOT2 | BRDCFG1_EMI1_EN; break; case 5: mdio_mux[i].val = BRDCFG1_EMI1_SEL_SLOT5 | BRDCFG1_EMI1_EN; break; case 6: mdio_mux[i].val = BRDCFG1_EMI1_SEL_SLOT6 | BRDCFG1_EMI1_EN; break; case 7: mdio_mux[i].val = BRDCFG1_EMI1_SEL_SLOT7 | BRDCFG1_EMI1_EN; break; }; hydra_mdio_set_mux("HYDRA_SGMII_MDIO", mdio_mux[i].mask, mdio_mux[i].val); fm_info_set_mdio(i, miiphy_get_dev_by_name("HYDRA_SGMII_MDIO")); break; case PHY_INTERFACE_MODE_RGMII: /* * If DTSEC4 is RGMII, then it's routed via via EC1 to * the first on-board RGMII port. If DTSEC5 is RGMII, * then it's routed via via EC2 to the second on-board * RGMII port. The other DTSECs cannot be routed to * RGMII. */ fm_info_set_phy_address(i, i == FM1_DTSEC4 ? 0 : 1); mdio_mux[i].mask = BRDCFG1_EMI1_SEL_MASK; mdio_mux[i].val = BRDCFG1_EMI1_SEL_RGMII | BRDCFG1_EMI1_EN; hydra_mdio_set_mux("HYDRA_RGMII_MDIO", mdio_mux[i].mask, mdio_mux[i].val); fm_info_set_mdio(i, miiphy_get_dev_by_name("HYDRA_RGMII_MDIO")); break; case PHY_INTERFACE_MODE_NONE: fm_info_set_phy_address(i, 0); break; default: printf("Fman1: DTSEC%u set to unknown interface %i\n", idx + 1, fm_info_get_enet_if(i)); fm_info_set_phy_address(i, 0); break; } } bus = miiphy_get_dev_by_name("HYDRA_SGMII_MDIO"); set_sgmii_phy(bus, FM1_DTSEC1, CONFIG_SYS_NUM_FM1_DTSEC, PHY_BASE_ADDR); /* * For 10G, we only support one XAUI card per Fman. If present, then we * force its routing and never touch those bits again, which removes the * need for Linux to do any muxing. This works because of the way * BRDCFG1 is defined, but it's a bit hackish. * * The PHY address for the XAUI card depends on which slot it's in. The * macros we use imply that the PHY address is based on which FM, but * that's not true. On the P4080DS, FM1 could only use XAUI in slot 5, * and FM2 could only use a XAUI in slot 4. On the Hydra board, we * check the actual slot and just use the macros as-is, even though * the P3041 and P5020 only have one Fman. */ lane = serdes_get_first_lane(XAUI_FM1); if (lane >= 0) { slot = lane_to_slot[lane]; if (slot == 1) { /* XAUI card is in slot 1 */ clrsetbits_8(&pixis->brdcfg1, BRDCFG1_EMI2_SEL_MASK, BRDCFG1_EMI2_SEL_SLOT1); fm_info_set_phy_address(FM1_10GEC1, CONFIG_SYS_FM1_10GEC1_PHY_ADDR); } else { /* XAUI card is in slot 2 */ clrsetbits_8(&pixis->brdcfg1, BRDCFG1_EMI2_SEL_MASK, BRDCFG1_EMI2_SEL_SLOT2); fm_info_set_phy_address(FM1_10GEC1, CONFIG_SYS_FM2_10GEC1_PHY_ADDR); } } fm_info_set_mdio(FM1_10GEC1, miiphy_get_dev_by_name(DEFAULT_FM_TGEC_MDIO_NAME)); cpu_eth_init(bis); #endif return pci_eth_init(bis); }
int board_eth_init(bd_t *bis) { #if defined(CONFIG_FMAN_ENET) int i, idx, lane, slot, interface; struct memac_mdio_info dtsec_mdio_info; struct memac_mdio_info tgec_mdio_info; ccsr_gur_t *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR); u32 srds_s1; srds_s1 = in_be32(&gur->rcwsr[4]) & FSL_CORENET2_RCWSR4_SRDS1_PRTCL; srds_s1 >>= FSL_CORENET2_RCWSR4_SRDS1_PRTCL_SHIFT; initialize_lane_to_slot(); /* Initialize the mdio_mux array so we can recognize empty elements */ for (i = 0; i < NUM_FM_PORTS; i++) mdio_mux[i] = EMI_NONE; dtsec_mdio_info.regs = (struct memac_mdio_controller *)CONFIG_SYS_FM1_DTSEC_MDIO_ADDR; dtsec_mdio_info.name = DEFAULT_FM_MDIO_NAME; /* Register the 1G MDIO bus */ fm_memac_mdio_init(bis, &dtsec_mdio_info); tgec_mdio_info.regs = (struct memac_mdio_controller *)CONFIG_SYS_FM1_TGEC_MDIO_ADDR; tgec_mdio_info.name = DEFAULT_FM_TGEC_MDIO_NAME; /* Register the 10G MDIO bus */ fm_memac_mdio_init(bis, &tgec_mdio_info); /* Register the muxing front-ends to the MDIO buses */ t1024qds_mdio_init(DEFAULT_FM_MDIO_NAME, EMI1_RGMII1); t1024qds_mdio_init(DEFAULT_FM_MDIO_NAME, EMI1_RGMII2); t1024qds_mdio_init(DEFAULT_FM_MDIO_NAME, EMI1_SLOT1); t1024qds_mdio_init(DEFAULT_FM_MDIO_NAME, EMI1_SLOT2); t1024qds_mdio_init(DEFAULT_FM_MDIO_NAME, EMI1_SLOT3); t1024qds_mdio_init(DEFAULT_FM_MDIO_NAME, EMI1_SLOT4); t1024qds_mdio_init(DEFAULT_FM_MDIO_NAME, EMI1_SLOT5); t1024qds_mdio_init(DEFAULT_FM_TGEC_MDIO_NAME, EMI2); /* Set the two on-board RGMII PHY address */ fm_info_set_phy_address(FM1_DTSEC3, RGMII_PHY2_ADDR); fm_info_set_phy_address(FM1_DTSEC4, RGMII_PHY1_ADDR); switch (srds_s1) { case 0xd5: case 0xd6: /* QSGMII in Slot2 */ fm_info_set_phy_address(FM1_DTSEC1, 0x8); fm_info_set_phy_address(FM1_DTSEC2, 0x9); fm_info_set_phy_address(FM1_DTSEC3, 0xa); fm_info_set_phy_address(FM1_DTSEC4, 0xb); break; case 0x95: case 0x99: /* * XFI does not need a PHY to work, but to avoid U-boot use * default PHY address which is zero to a MAC when it found * a MAC has no PHY address, we give a PHY address to XFI * MAC, and should not use a real XAUI PHY address, since * MDIO can access it successfully, and then MDIO thinks the * XAUI card is used for the XFI MAC, which will cause error. */ fm_info_set_phy_address(FM1_10GEC1, 4); fm_info_set_phy_address(FM1_DTSEC2, SGMII_CARD_PORT1_PHY_ADDR); break; case 0x6f: /* SGMII in Slot3, Slot4, Slot5 */ fm_info_set_phy_address(FM1_DTSEC1, SGMII_CARD_AQ_PHY_ADDR_S5); fm_info_set_phy_address(FM1_DTSEC2, SGMII_CARD_AQ_PHY_ADDR_S4); fm_info_set_phy_address(FM1_DTSEC3, SGMII_CARD_PORT1_PHY_ADDR); break; case 0x7f: fm_info_set_phy_address(FM1_DTSEC1, SGMII_CARD_AQ_PHY_ADDR_S5); fm_info_set_phy_address(FM1_DTSEC2, SGMII_CARD_AQ_PHY_ADDR_S4); fm_info_set_phy_address(FM1_DTSEC3, SGMII_CARD_AQ_PHY_ADDR_S3); break; case 0x47: fm_info_set_phy_address(FM1_DTSEC1, SGMII_CARD_PORT1_PHY_ADDR); break; case 0x77: fm_info_set_phy_address(FM1_DTSEC1, SGMII_CARD_PORT1_PHY_ADDR); fm_info_set_phy_address(FM1_DTSEC3, SGMII_CARD_AQ_PHY_ADDR_S3); break; case 0x5a: fm_info_set_phy_address(FM1_DTSEC2, SGMII_CARD_PORT1_PHY_ADDR); break; case 0x6a: fm_info_set_phy_address(FM1_DTSEC2, SGMII_CARD_PORT1_PHY_ADDR); fm_info_set_phy_address(FM1_DTSEC3, SGMII_CARD_PORT1_PHY_ADDR); break; case 0x5b: fm_info_set_phy_address(FM1_DTSEC1, SGMII_CARD_PORT1_PHY_ADDR); fm_info_set_phy_address(FM1_DTSEC2, SGMII_CARD_PORT1_PHY_ADDR); break; case 0x6b: fm_info_set_phy_address(FM1_DTSEC1, SGMII_CARD_PORT1_PHY_ADDR); fm_info_set_phy_address(FM1_DTSEC2, SGMII_CARD_PORT1_PHY_ADDR); fm_info_set_phy_address(FM1_DTSEC3, SGMII_CARD_PORT1_PHY_ADDR); break; default: break; } for (i = FM1_DTSEC1; i < FM1_DTSEC1 + CONFIG_SYS_NUM_FM1_DTSEC; i++) { idx = i - FM1_DTSEC1; interface = fm_info_get_enet_if(i); switch (interface) { case PHY_INTERFACE_MODE_SGMII: case PHY_INTERFACE_MODE_SGMII_2500: case PHY_INTERFACE_MODE_QSGMII: if (interface == PHY_INTERFACE_MODE_SGMII) { lane = serdes_get_first_lane(FSL_SRDS_1, SGMII_FM1_DTSEC1 + idx); } else if (interface == PHY_INTERFACE_MODE_SGMII_2500) { lane = serdes_get_first_lane(FSL_SRDS_1, SGMII_2500_FM1_DTSEC1 + idx); } else { lane = serdes_get_first_lane(FSL_SRDS_1, QSGMII_FM1_A); } if (lane < 0) break; slot = lane_to_slot[lane]; debug("FM1@DTSEC%u expects SGMII in slot %u\n", idx + 1, slot); if (QIXIS_READ(present2) & (1 << (slot - 1))) fm_disable_port(i); switch (slot) { case 2: mdio_mux[i] = EMI1_SLOT2; fm_info_set_mdio(i, mii_dev_for_muxval( mdio_mux[i])); break; case 3: mdio_mux[i] = EMI1_SLOT3; fm_info_set_mdio(i, mii_dev_for_muxval( mdio_mux[i])); break; case 4: mdio_mux[i] = EMI1_SLOT4; fm_info_set_mdio(i, mii_dev_for_muxval( mdio_mux[i])); break; case 5: mdio_mux[i] = EMI1_SLOT5; fm_info_set_mdio(i, mii_dev_for_muxval( mdio_mux[i])); break; } break; case PHY_INTERFACE_MODE_RGMII: if (i == FM1_DTSEC3) mdio_mux[i] = EMI1_RGMII2; else if (i == FM1_DTSEC4) mdio_mux[i] = EMI1_RGMII1; fm_info_set_mdio(i, mii_dev_for_muxval(mdio_mux[i])); break; default: break; } } for (i = FM1_10GEC1; i < FM1_10GEC1 + CONFIG_SYS_NUM_FM1_10GEC; i++) { idx = i - FM1_10GEC1; switch (fm_info_get_enet_if(i)) { case PHY_INTERFACE_MODE_XGMII: lane = serdes_get_first_lane(FSL_SRDS_1, XFI_FM1_MAC1 + idx); if (lane < 0) break; mdio_mux[i] = EMI2; fm_info_set_mdio(i, mii_dev_for_muxval(mdio_mux[i])); break; default: break; } } cpu_eth_init(bis); #endif /* CONFIG_FMAN_ENET */ return pci_eth_init(bis); }
int board_eth_init(bd_t *bis) { #ifdef CONFIG_FMAN_ENET int i, idx, lane, slot, interface; struct memac_mdio_info dtsec_mdio_info; struct memac_mdio_info tgec_mdio_info; struct ccsr_gur *gur = (void *)(CONFIG_SYS_FSL_GUTS_ADDR); u32 srds_s1; srds_s1 = in_be32(&gur->rcwsr[4]) & FSL_CHASSIS2_RCWSR4_SRDS1_PRTCL_MASK; srds_s1 >>= FSL_CHASSIS2_RCWSR4_SRDS1_PRTCL_SHIFT; /* Initialize the mdio_mux array so we can recognize empty elements */ for (i = 0; i < NUM_FM_PORTS; i++) mdio_mux[i] = EMI_NONE; dtsec_mdio_info.regs = (struct memac_mdio_controller *)CONFIG_SYS_FM1_DTSEC_MDIO_ADDR; dtsec_mdio_info.name = DEFAULT_FM_MDIO_NAME; /* Register the 1G MDIO bus */ fm_memac_mdio_init(bis, &dtsec_mdio_info); tgec_mdio_info.regs = (struct memac_mdio_controller *)CONFIG_SYS_FM1_TGEC_MDIO_ADDR; tgec_mdio_info.name = DEFAULT_FM_TGEC_MDIO_NAME; /* Register the 10G MDIO bus */ fm_memac_mdio_init(bis, &tgec_mdio_info); /* Register the muxing front-ends to the MDIO buses */ ls1043aqds_mdio_init(DEFAULT_FM_MDIO_NAME, EMI1_RGMII1); ls1043aqds_mdio_init(DEFAULT_FM_MDIO_NAME, EMI1_RGMII2); ls1043aqds_mdio_init(DEFAULT_FM_MDIO_NAME, EMI1_SLOT1); ls1043aqds_mdio_init(DEFAULT_FM_MDIO_NAME, EMI1_SLOT2); ls1043aqds_mdio_init(DEFAULT_FM_MDIO_NAME, EMI1_SLOT3); ls1043aqds_mdio_init(DEFAULT_FM_MDIO_NAME, EMI1_SLOT4); ls1043aqds_mdio_init(DEFAULT_FM_TGEC_MDIO_NAME, EMI2); /* Set the two on-board RGMII PHY address */ fm_info_set_phy_address(FM1_DTSEC3, RGMII_PHY1_ADDR); fm_info_set_phy_address(FM1_DTSEC4, RGMII_PHY2_ADDR); switch (srds_s1) { case 0x2555: /* 2.5G SGMII on lane A, MAC 9 */ fm_info_set_phy_address(FM1_DTSEC9, 9); break; case 0x4555: case 0x4558: /* QSGMII on lane A, MAC 1/2/5/6 */ fm_info_set_phy_address(FM1_DTSEC1, QSGMII_CARD_PORT1_PHY_ADDR_S1); fm_info_set_phy_address(FM1_DTSEC2, QSGMII_CARD_PORT2_PHY_ADDR_S1); fm_info_set_phy_address(FM1_DTSEC5, QSGMII_CARD_PORT3_PHY_ADDR_S1); fm_info_set_phy_address(FM1_DTSEC6, QSGMII_CARD_PORT4_PHY_ADDR_S1); break; case 0x1355: /* SGMII on lane B, MAC 2*/ fm_info_set_phy_address(FM1_DTSEC2, SGMII_CARD_PORT1_PHY_ADDR); break; case 0x2355: /* 2.5G SGMII on lane A, MAC 9 */ fm_info_set_phy_address(FM1_DTSEC9, 9); /* SGMII on lane B, MAC 2*/ fm_info_set_phy_address(FM1_DTSEC2, SGMII_CARD_PORT1_PHY_ADDR); break; case 0x3335: /* SGMII on lane C, MAC 5 */ fm_info_set_phy_address(FM1_DTSEC5, SGMII_CARD_PORT1_PHY_ADDR); case 0x3355: case 0x3358: /* SGMII on lane B, MAC 2 */ fm_info_set_phy_address(FM1_DTSEC2, SGMII_CARD_PORT1_PHY_ADDR); case 0x3555: case 0x3558: /* SGMII on lane A, MAC 9 */ fm_info_set_phy_address(FM1_DTSEC9, SGMII_CARD_PORT1_PHY_ADDR); break; case 0x1455: /* QSGMII on lane B, MAC 1/2/5/6 */ fm_info_set_phy_address(FM1_DTSEC1, QSGMII_CARD_PORT1_PHY_ADDR_S2); fm_info_set_phy_address(FM1_DTSEC2, QSGMII_CARD_PORT2_PHY_ADDR_S2); fm_info_set_phy_address(FM1_DTSEC5, QSGMII_CARD_PORT3_PHY_ADDR_S2); fm_info_set_phy_address(FM1_DTSEC6, QSGMII_CARD_PORT4_PHY_ADDR_S2); break; case 0x2455: /* 2.5G SGMII on lane A, MAC 9 */ fm_info_set_phy_address(FM1_DTSEC9, 9); /* QSGMII on lane B, MAC 1/2/5/6 */ fm_info_set_phy_address(FM1_DTSEC1, QSGMII_CARD_PORT1_PHY_ADDR_S2); fm_info_set_phy_address(FM1_DTSEC2, QSGMII_CARD_PORT2_PHY_ADDR_S2); fm_info_set_phy_address(FM1_DTSEC5, QSGMII_CARD_PORT3_PHY_ADDR_S2); fm_info_set_phy_address(FM1_DTSEC6, QSGMII_CARD_PORT4_PHY_ADDR_S2); break; case 0x2255: /* 2.5G SGMII on lane A, MAC 9 */ fm_info_set_phy_address(FM1_DTSEC9, 9); /* 2.5G SGMII on lane B, MAC 2 */ fm_info_set_phy_address(FM1_DTSEC2, 2); break; case 0x3333: /* SGMII on lane A/B/C/D, MAC 9/2/5/6 */ fm_info_set_phy_address(FM1_DTSEC9, SGMII_CARD_PORT1_PHY_ADDR); fm_info_set_phy_address(FM1_DTSEC2, SGMII_CARD_PORT1_PHY_ADDR); fm_info_set_phy_address(FM1_DTSEC5, SGMII_CARD_PORT1_PHY_ADDR); fm_info_set_phy_address(FM1_DTSEC6, SGMII_CARD_PORT1_PHY_ADDR); break; default: printf("Invalid SerDes protocol 0x%x for LS1043AQDS\n", srds_s1); break; } for (i = FM1_DTSEC1; i < FM1_DTSEC1 + CONFIG_SYS_NUM_FM1_DTSEC; i++) { idx = i - FM1_DTSEC1; interface = fm_info_get_enet_if(i); switch (interface) { case PHY_INTERFACE_MODE_SGMII: case PHY_INTERFACE_MODE_SGMII_2500: case PHY_INTERFACE_MODE_QSGMII: if (interface == PHY_INTERFACE_MODE_SGMII) { lane = serdes_get_first_lane(FSL_SRDS_1, SGMII_FM1_DTSEC1 + idx); } else if (interface == PHY_INTERFACE_MODE_SGMII_2500) { lane = serdes_get_first_lane(FSL_SRDS_1, SGMII_2500_FM1_DTSEC1 + idx); } else { lane = serdes_get_first_lane(FSL_SRDS_1, QSGMII_FM1_A); } if (lane < 0) break; slot = lane_to_slot[lane]; debug("FM1@DTSEC%u expects SGMII in slot %u\n", idx + 1, slot); if (QIXIS_READ(present2) & (1 << (slot - 1))) fm_disable_port(i); switch (slot) { case 1: mdio_mux[i] = EMI1_SLOT1; fm_info_set_mdio(i, mii_dev_for_muxval( mdio_mux[i])); break; case 2: mdio_mux[i] = EMI1_SLOT2; fm_info_set_mdio(i, mii_dev_for_muxval( mdio_mux[i])); break; case 3: mdio_mux[i] = EMI1_SLOT3; fm_info_set_mdio(i, mii_dev_for_muxval( mdio_mux[i])); break; case 4: mdio_mux[i] = EMI1_SLOT4; fm_info_set_mdio(i, mii_dev_for_muxval( mdio_mux[i])); break; default: break; } break; case PHY_INTERFACE_MODE_RGMII: if (i == FM1_DTSEC3) mdio_mux[i] = EMI1_RGMII1; else if (i == FM1_DTSEC4) mdio_mux[i] = EMI1_RGMII2; fm_info_set_mdio(i, mii_dev_for_muxval(mdio_mux[i])); break; default: break; } } cpu_eth_init(bis); #endif /* CONFIG_FMAN_ENET */ return pci_eth_init(bis); }
int board_eth_init(bd_t *bis) { #ifdef CONFIG_FMAN_ENET struct memac_mdio_info memac_mdio_info; struct memac_mdio_info tg_memac_mdio_info; unsigned int i; unsigned int serdes1_prtcl, serdes2_prtcl; int qsgmii; struct mii_dev *bus; ccsr_gur_t *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR); serdes1_prtcl = in_be32(&gur->rcwsr[4]) & FSL_CORENET2_RCWSR4_SRDS1_PRTCL; if (!serdes1_prtcl) { printf("SERDES1 is not enabled\n"); return 0; } serdes1_prtcl >>= FSL_CORENET2_RCWSR4_SRDS1_PRTCL_SHIFT; debug("Using SERDES1 Protocol: 0x%x:\n", serdes1_prtcl); serdes2_prtcl = in_be32(&gur->rcwsr[4]) & FSL_CORENET2_RCWSR4_SRDS2_PRTCL; if (!serdes2_prtcl) { printf("SERDES2 is not enabled\n"); return 0; } serdes2_prtcl >>= FSL_CORENET2_RCWSR4_SRDS2_PRTCL_SHIFT; debug("Using SERDES2 Protocol: 0x%x:\n", serdes2_prtcl); printf("Initializing Fman\n"); initialize_lane_to_slot(); memac_mdio_info.regs = (struct memac_mdio_controller *)CONFIG_SYS_FM1_DTSEC_MDIO_ADDR; memac_mdio_info.name = DEFAULT_FM_MDIO_NAME; /* Register the real 1G MDIO bus */ fm_memac_mdio_init(bis, &memac_mdio_info); tg_memac_mdio_info.regs = (struct memac_mdio_controller *)CONFIG_SYS_FM1_TGEC_MDIO_ADDR; tg_memac_mdio_info.name = DEFAULT_FM_TGEC_MDIO_NAME; /* Register the real 10G MDIO bus */ fm_memac_mdio_init(bis, &tg_memac_mdio_info); /* * Program the two on board DTSEC PHY addresses assuming that they are * all SGMII. RGMII is not supported on this board. Setting SGMII 5 and * 6 to on board SGMII phys */ fm_info_set_phy_address(FM1_DTSEC5, CONFIG_SYS_FM1_ONBOARD_PHY1_ADDR); fm_info_set_phy_address(FM1_DTSEC6, CONFIG_SYS_FM1_ONBOARD_PHY2_ADDR); switch (serdes1_prtcl) { case 0x29: case 0x2a: /* Serdes 1: A-B SGMII, Configuring DTSEC 5 and 6 */ debug("Set phy addresses for FM1_DTSEC5:%x, FM1_DTSEC6:%x\n", CONFIG_SYS_FM1_ONBOARD_PHY1_ADDR, CONFIG_SYS_FM1_ONBOARD_PHY2_ADDR); fm_info_set_phy_address(FM1_DTSEC5, CONFIG_SYS_FM1_ONBOARD_PHY1_ADDR); fm_info_set_phy_address(FM1_DTSEC6, CONFIG_SYS_FM1_ONBOARD_PHY2_ADDR); break; #ifdef CONFIG_ARCH_B4420 case 0x17: case 0x18: /* Serdes 1: A-D SGMII, Configuring on board dual SGMII Phy */ debug("Set phy addresses for FM1_DTSEC3:%x, FM1_DTSEC4:%x\n", CONFIG_SYS_FM1_ONBOARD_PHY1_ADDR, CONFIG_SYS_FM1_ONBOARD_PHY2_ADDR); /* Fixing Serdes clock by programming FPGA register */ QIXIS_WRITE(brdcfg[4], QIXIS_SRDS1CLK_125); fm_info_set_phy_address(FM1_DTSEC3, CONFIG_SYS_FM1_ONBOARD_PHY1_ADDR); fm_info_set_phy_address(FM1_DTSEC4, CONFIG_SYS_FM1_ONBOARD_PHY2_ADDR); break; #endif default: printf("Fman: Unsupported SerDes1 Protocol 0x%02x\n", serdes1_prtcl); break; } switch (serdes2_prtcl) { case 0x17: case 0x18: debug("Set phy address on SGMII Riser for FM1_DTSEC1:%x\n", CONFIG_SYS_FM1_DTSEC1_RISER_PHY_ADDR); fm_info_set_phy_address(FM1_DTSEC1, CONFIG_SYS_FM1_DTSEC1_RISER_PHY_ADDR); fm_info_set_phy_address(FM1_DTSEC2, CONFIG_SYS_FM1_DTSEC2_RISER_PHY_ADDR); fm_info_set_phy_address(FM1_DTSEC3, CONFIG_SYS_FM1_DTSEC3_RISER_PHY_ADDR); fm_info_set_phy_address(FM1_DTSEC4, CONFIG_SYS_FM1_DTSEC4_RISER_PHY_ADDR); break; case 0x48: case 0x49: debug("Set phy address on SGMII Riser for FM1_DTSEC1:%x\n", CONFIG_SYS_FM1_DTSEC1_RISER_PHY_ADDR); fm_info_set_phy_address(FM1_DTSEC1, CONFIG_SYS_FM1_DTSEC1_RISER_PHY_ADDR); fm_info_set_phy_address(FM1_DTSEC2, CONFIG_SYS_FM1_DTSEC2_RISER_PHY_ADDR); fm_info_set_phy_address(FM1_DTSEC3, CONFIG_SYS_FM1_DTSEC3_RISER_PHY_ADDR); break; case 0xb1: case 0xb2: case 0x8c: case 0x8d: debug("Set phy addresses on SGMII Riser for FM1_DTSEC1:%x\n", CONFIG_SYS_FM1_DTSEC1_RISER_PHY_ADDR); fm_info_set_phy_address(FM1_DTSEC3, CONFIG_SYS_FM1_DTSEC1_RISER_PHY_ADDR); fm_info_set_phy_address(FM1_DTSEC4, CONFIG_SYS_FM1_DTSEC2_RISER_PHY_ADDR); /* * XFI does not need a PHY to work, but to make U-Boot * happy, assign a fake PHY address for a XFI port. */ fm_info_set_phy_address(FM1_10GEC1, 0); fm_info_set_phy_address(FM1_10GEC2, 1); break; case 0x98: /* XAUI in Slot1 and Slot2 */ debug("Set phy address of AMC2PEX-2S for FM1_10GEC1:%x\n", CONFIG_SYS_FM1_10GEC1_PHY_ADDR); fm_info_set_phy_address(FM1_10GEC1, CONFIG_SYS_FM1_10GEC1_PHY_ADDR); debug("Set phy address of AMC2PEX-2S for FM1_10GEC2:%x\n", CONFIG_SYS_FM1_10GEC2_PHY_ADDR); fm_info_set_phy_address(FM1_10GEC2, CONFIG_SYS_FM1_10GEC2_PHY_ADDR); break; case 0x9E: /* XAUI in Slot2 */ debug("Sett phy address of AMC2PEX-2S for FM1_10GEC2:%x\n", CONFIG_SYS_FM1_10GEC2_PHY_ADDR); fm_info_set_phy_address(FM1_10GEC2, CONFIG_SYS_FM1_10GEC2_PHY_ADDR); break; default: printf("Fman: Unsupported SerDes2 Protocol 0x%02x\n", serdes2_prtcl); break; } /*set PHY address for QSGMII Riser Card on slot2*/ bus = miiphy_get_dev_by_name(DEFAULT_FM_MDIO_NAME); qsgmii = is_qsgmii_riser_card(bus, PHY_BASE_ADDR, PORT_NUM, REGNUM); if (qsgmii) { switch (serdes2_prtcl) { case 0xb2: case 0x8d: fm_info_set_phy_address(FM1_DTSEC3, PHY_BASE_ADDR); fm_info_set_phy_address(FM1_DTSEC4, PHY_BASE_ADDR + 1); break; default: break; } } for (i = FM1_DTSEC1; i < FM1_DTSEC1 + CONFIG_SYS_NUM_FM1_DTSEC; i++) { int idx = i - FM1_DTSEC1; switch (fm_info_get_enet_if(i)) { case PHY_INTERFACE_MODE_SGMII: fm_info_set_mdio(i, miiphy_get_dev_by_name(DEFAULT_FM_MDIO_NAME)); break; case PHY_INTERFACE_MODE_NONE: fm_info_set_phy_address(i, 0); break; default: printf("Fman1: DTSEC%u set to unknown interface %i\n", idx + 1, fm_info_get_enet_if(i)); fm_info_set_phy_address(i, 0); break; } } for (i = FM1_10GEC1; i < FM1_10GEC1 + CONFIG_SYS_NUM_FM1_10GEC; i++) { int idx = i - FM1_10GEC1; switch (fm_info_get_enet_if(i)) { case PHY_INTERFACE_MODE_XGMII: fm_info_set_mdio(i, miiphy_get_dev_by_name (DEFAULT_FM_TGEC_MDIO_NAME)); break; case PHY_INTERFACE_MODE_NONE: fm_info_set_phy_address(i, 0); break; default: printf("Fman1: TGEC%u set to unknown interface %i\n", idx + 1, fm_info_get_enet_if(i)); fm_info_set_phy_address(i, 0); break; } } cpu_eth_init(bis); #endif return pci_eth_init(bis); }
int board_eth_init(bd_t *bis) { #ifdef CONFIG_FMAN_ENET struct memac_mdio_info memac_mdio_info; unsigned int i; int phy_addr = 0; #ifdef CONFIG_VSC9953 phy_interface_t phy_int; struct mii_dev *bus; #endif printf("Initializing Fman\n"); memac_mdio_info.regs = (struct memac_mdio_controller *)CONFIG_SYS_FM1_DTSEC_MDIO_ADDR; memac_mdio_info.name = DEFAULT_FM_MDIO_NAME; /* Register the real 1G MDIO bus */ fm_memac_mdio_init(bis, &memac_mdio_info); /* * Program on board RGMII, SGMII PHY addresses. */ for (i = FM1_DTSEC1; i < FM1_DTSEC1 + CONFIG_SYS_NUM_FM1_DTSEC; i++) { int idx = i - FM1_DTSEC1; switch (fm_info_get_enet_if(i)) { #if defined(CONFIG_T1040RDB) || defined(CONFIG_T1040D4RDB) case PHY_INTERFACE_MODE_SGMII: /* T1040RDB & T1040D4RDB only supports SGMII on * DTSEC3 */ fm_info_set_phy_address(FM1_DTSEC3, CONFIG_SYS_SGMII1_PHY_ADDR); break; #endif #ifdef CONFIG_T1042RDB case PHY_INTERFACE_MODE_SGMII: /* T1042RDB doesn't supports SGMII on DTSEC1 & DTSEC2 */ if ((FM1_DTSEC1 == i) || (FM1_DTSEC2 == i)) fm_info_set_phy_address(i, 0); /* T1042RDB only supports SGMII on DTSEC3 */ fm_info_set_phy_address(FM1_DTSEC3, CONFIG_SYS_SGMII1_PHY_ADDR); break; #endif #ifdef CONFIG_T1042D4RDB case PHY_INTERFACE_MODE_SGMII: /* T1042D4RDB supports SGMII on DTSEC1, DTSEC2 * & DTSEC3 */ if (FM1_DTSEC1 == i) phy_addr = CONFIG_SYS_SGMII1_PHY_ADDR; if (FM1_DTSEC2 == i) phy_addr = CONFIG_SYS_SGMII2_PHY_ADDR; if (FM1_DTSEC3 == i) phy_addr = CONFIG_SYS_SGMII3_PHY_ADDR; fm_info_set_phy_address(i, phy_addr); break; #endif case PHY_INTERFACE_MODE_RGMII: if (FM1_DTSEC4 == i) phy_addr = CONFIG_SYS_RGMII1_PHY_ADDR; if (FM1_DTSEC5 == i) phy_addr = CONFIG_SYS_RGMII2_PHY_ADDR; fm_info_set_phy_address(i, phy_addr); break; case PHY_INTERFACE_MODE_QSGMII: fm_info_set_phy_address(i, 0); break; case PHY_INTERFACE_MODE_NONE: fm_info_set_phy_address(i, 0); break; default: printf("Fman1: DTSEC%u set to unknown interface %i\n", idx + 1, fm_info_get_enet_if(i)); fm_info_set_phy_address(i, 0); break; } if (fm_info_get_enet_if(i) == PHY_INTERFACE_MODE_QSGMII || fm_info_get_enet_if(i) == PHY_INTERFACE_MODE_NONE) fm_info_set_mdio(i, NULL); else fm_info_set_mdio(i, miiphy_get_dev_by_name( DEFAULT_FM_MDIO_NAME)); } #ifdef CONFIG_VSC9953 /* SerDes configured for QSGMII */ if (serdes_get_first_lane(FSL_SRDS_1, QSGMII_SW1_A) >= 0) { for (i = 0; i < 4; i++) { bus = miiphy_get_dev_by_name(DEFAULT_FM_MDIO_NAME); phy_addr = CONFIG_SYS_FM1_QSGMII11_PHY_ADDR + i; phy_int = PHY_INTERFACE_MODE_QSGMII; vsc9953_port_info_set_mdio(i, bus); vsc9953_port_info_set_phy_address(i, phy_addr); vsc9953_port_info_set_phy_int(i, phy_int); vsc9953_port_enable(i); } } if (serdes_get_first_lane(FSL_SRDS_1, QSGMII_SW1_B) >= 0) { for (i = 4; i < 8; i++) { bus = miiphy_get_dev_by_name(DEFAULT_FM_MDIO_NAME); phy_addr = CONFIG_SYS_FM1_QSGMII21_PHY_ADDR + i - 4; phy_int = PHY_INTERFACE_MODE_QSGMII; vsc9953_port_info_set_mdio(i, bus); vsc9953_port_info_set_phy_address(i, phy_addr); vsc9953_port_info_set_phy_int(i, phy_int); vsc9953_port_enable(i); } } /* Connect DTSEC1 to L2 switch if it doesn't have a PHY */ if (serdes_get_first_lane(FSL_SRDS_1, SGMII_FM1_DTSEC1) < 0) vsc9953_port_enable(8); /* Connect DTSEC2 to L2 switch if it doesn't have a PHY */ if (serdes_get_first_lane(FSL_SRDS_1, SGMII_FM1_DTSEC2) < 0) { /* Enable L2 On MAC2 using SCFG */ struct ccsr_scfg *scfg = (struct ccsr_scfg *) CONFIG_SYS_MPC85xx_SCFG; out_be32(&scfg->esgmiiselcr, in_be32(&scfg->esgmiiselcr) | (0x80000000)); vsc9953_port_enable(9); } #endif cpu_eth_init(bis); #endif return pci_eth_init(bis); }
int board_eth_init(bd_t *bis) { #if defined(CONFIG_FMAN_ENET) int i, interface; struct memac_mdio_info dtsec_mdio_info; struct memac_mdio_info tgec_mdio_info; struct mii_dev *dev; ccsr_gur_t *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR); u32 srds_s1; srds_s1 = in_be32(&gur->rcwsr[4]) & FSL_CORENET2_RCWSR4_SRDS1_PRTCL; srds_s1 >>= FSL_CORENET2_RCWSR4_SRDS1_PRTCL_SHIFT; dtsec_mdio_info.regs = (struct memac_mdio_controller *)CONFIG_SYS_FM1_DTSEC_MDIO_ADDR; dtsec_mdio_info.name = DEFAULT_FM_MDIO_NAME; /* Register the 1G MDIO bus */ fm_memac_mdio_init(bis, &dtsec_mdio_info); tgec_mdio_info.regs = (struct memac_mdio_controller *)CONFIG_SYS_FM1_TGEC_MDIO_ADDR; tgec_mdio_info.name = DEFAULT_FM_TGEC_MDIO_NAME; /* Register the 10G MDIO bus */ fm_memac_mdio_init(bis, &tgec_mdio_info); /* Set the on-board RGMII PHY address */ fm_info_set_phy_address(FM1_DTSEC4, RGMII_PHY1_ADDR); switch (srds_s1) { #ifdef CONFIG_T1024RDB case 0x95: /* set the on-board RGMII2 PHY */ fm_info_set_phy_address(FM1_DTSEC3, RGMII_PHY2_ADDR); /* set 10G XFI with Aquantia AQR105 PHY */ fm_info_set_phy_address(FM1_10GEC1, FM1_10GEC1_PHY_ADDR); break; #endif case 0x6a: case 0x6b: case 0x77: case 0x135: /* set the on-board 2.5G SGMII AQR105 PHY */ fm_info_set_phy_address(FM1_DTSEC3, SGMII_AQR_PHY_ADDR); #ifdef CONFIG_T1023RDB /* set the on-board 1G SGMII RTL8211F PHY */ fm_info_set_phy_address(FM1_DTSEC1, SGMII_RTK_PHY_ADDR); #endif break; default: printf("SerDes protocol 0x%x is not supported on T102xRDB\n", srds_s1); break; } for (i = FM1_DTSEC1; i < FM1_DTSEC1 + CONFIG_SYS_NUM_FM1_DTSEC; i++) { interface = fm_info_get_enet_if(i); switch (interface) { case PHY_INTERFACE_MODE_RGMII: dev = miiphy_get_dev_by_name(DEFAULT_FM_MDIO_NAME); fm_info_set_mdio(i, dev); break; case PHY_INTERFACE_MODE_SGMII: #if defined(CONFIG_T1023RDB) dev = miiphy_get_dev_by_name(DEFAULT_FM_MDIO_NAME); #elif defined(CONFIG_T1024RDB) dev = miiphy_get_dev_by_name(DEFAULT_FM_TGEC_MDIO_NAME); #endif fm_info_set_mdio(i, dev); break; case PHY_INTERFACE_MODE_SGMII_2500: dev = miiphy_get_dev_by_name(DEFAULT_FM_TGEC_MDIO_NAME); fm_info_set_mdio(i, dev); break; default: break; } } for (i = FM1_10GEC1; i < FM1_10GEC1 + CONFIG_SYS_NUM_FM1_10GEC; i++) { switch (fm_info_get_enet_if(i)) { case PHY_INTERFACE_MODE_XGMII: dev = miiphy_get_dev_by_name(DEFAULT_FM_TGEC_MDIO_NAME); fm_info_set_mdio(i, dev); break; default: break; } } cpu_eth_init(bis); #endif /* CONFIG_FMAN_ENET */ return pci_eth_init(bis); }
void board_ft_fman_fixup_port(void *fdt, char *compat, phys_addr_t addr, enum fm_port port, int offset) { int phy; char alias[32]; struct fixed_link f_link; ccsr_gur_t *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR); u32 prtcl2 = in_be32(&gur->rcwsr[4]) & FSL_CORENET2_RCWSR4_SRDS2_PRTCL; prtcl2 >>= FSL_CORENET2_RCWSR4_SRDS2_PRTCL_SHIFT; if (fm_info_get_enet_if(port) == PHY_INTERFACE_MODE_SGMII) { phy = fm_info_get_phy_address(port); sprintf(alias, "phy_sgmii_%x", phy); fdt_set_phy_handle(fdt, compat, addr, alias); fdt_status_okay_by_alias(fdt, alias); } else if (fm_info_get_enet_if(port) == PHY_INTERFACE_MODE_XGMII) { /* check if it's XFI interface for 10g */ switch (prtcl2) { case 0x80: case 0x81: case 0x82: case 0x83: case 0x84: case 0x85: case 0x86: case 0x87: case 0x88: case 0x89: case 0x8a: case 0x8b: case 0x8c: case 0x8d: case 0x8e: case 0xb1: case 0xb2: f_link.phy_id = port; f_link.duplex = 1; f_link.link_speed = 10000; f_link.pause = 0; f_link.asym_pause = 0; fdt_delprop(fdt, offset, "phy-handle"); fdt_setprop(fdt, offset, "fixed-link", &f_link, sizeof(f_link)); break; case 0x98: /* XAUI interface */ strcpy(alias, "phy_xaui_slot1"); fdt_status_okay_by_alias(fdt, alias); strcpy(alias, "phy_xaui_slot2"); fdt_status_okay_by_alias(fdt, alias); break; case 0x9e: /* XAUI interface */ case 0x9a: case 0x93: case 0x91: strcpy(alias, "phy_xaui_slot1"); fdt_status_okay_by_alias(fdt, alias); break; case 0x97: /* XAUI interface */ case 0xc3: strcpy(alias, "phy_xaui_slot2"); fdt_status_okay_by_alias(fdt, alias); break; default: break; } } }
int board_eth_init(bd_t *bis) { #if defined(CONFIG_FMAN_ENET) int i, interface; struct memac_mdio_info dtsec_mdio_info; struct memac_mdio_info tgec_mdio_info; struct mii_dev *dev; ccsr_gur_t *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR); u32 srds_s1; srds_s1 = in_be32(&gur->rcwsr[4]) & FSL_CORENET2_RCWSR4_SRDS1_PRTCL; srds_s1 >>= FSL_CORENET2_RCWSR4_SRDS1_PRTCL_SHIFT; dtsec_mdio_info.regs = (struct memac_mdio_controller *)CONFIG_SYS_FM1_DTSEC_MDIO_ADDR; dtsec_mdio_info.name = DEFAULT_FM_MDIO_NAME; /* Register the 1G MDIO bus */ fm_memac_mdio_init(bis, &dtsec_mdio_info); tgec_mdio_info.regs = (struct memac_mdio_controller *)CONFIG_SYS_FM1_TGEC_MDIO_ADDR; tgec_mdio_info.name = DEFAULT_FM_TGEC_MDIO_NAME; /* Register the 10G MDIO bus */ fm_memac_mdio_init(bis, &tgec_mdio_info); /* Set the two on-board RGMII PHY address */ fm_info_set_phy_address(FM1_DTSEC3, RGMII_PHY1_ADDR); fm_info_set_phy_address(FM1_DTSEC4, RGMII_PHY2_ADDR); switch (srds_s1) { case 0x66: case 0x6b: fm_info_set_phy_address(FM1_10GEC1, CORTINA_PHY_ADDR1); fm_info_set_phy_address(FM1_10GEC2, CORTINA_PHY_ADDR2); fm_info_set_phy_address(FM1_10GEC3, FM1_10GEC3_PHY_ADDR); fm_info_set_phy_address(FM1_10GEC4, FM1_10GEC4_PHY_ADDR); break; default: printf("SerDes1 protocol 0x%x is not supported on T208xRDB\n", srds_s1); break; } for (i = FM1_DTSEC1; i < FM1_DTSEC1 + CONFIG_SYS_NUM_FM1_DTSEC; i++) { interface = fm_info_get_enet_if(i); switch (interface) { case PHY_INTERFACE_MODE_RGMII: dev = miiphy_get_dev_by_name(DEFAULT_FM_MDIO_NAME); fm_info_set_mdio(i, dev); break; default: break; } } for (i = FM1_10GEC1; i < FM1_10GEC1 + CONFIG_SYS_NUM_FM1_10GEC; i++) { switch (fm_info_get_enet_if(i)) { case PHY_INTERFACE_MODE_XGMII: dev = miiphy_get_dev_by_name(DEFAULT_FM_TGEC_MDIO_NAME); fm_info_set_mdio(i, dev); break; default: break; } } cpu_eth_init(bis); #endif /* CONFIG_FMAN_ENET */ return pci_eth_init(bis); }