|
@@ -28,6 +28,7 @@
|
|
|
|
|
|
DECLARE_GLOBAL_DATA_PTR;
|
|
|
|
|
|
+#ifndef CONFIG_DM_ETH
|
|
|
#define EMI_NONE 0
|
|
|
#define EMI1 1 /* Mdio Bus 1 */
|
|
|
#define EMI2 2 /* Mdio Bus 2 */
|
|
@@ -442,9 +443,11 @@ static inline void do_dpmac_config(int dpmac, const char *arg_dpmacid,
|
|
|
}
|
|
|
|
|
|
#endif
|
|
|
+#endif /* !CONFIG_DM_ETH */
|
|
|
|
|
|
int board_eth_init(bd_t *bis)
|
|
|
{
|
|
|
+#ifndef CONFIG_DM_ETH
|
|
|
#if defined(CONFIG_FSL_MC_ENET)
|
|
|
struct memac_mdio_info mdio_info;
|
|
|
struct memac_mdio_controller *regs;
|
|
@@ -567,6 +570,7 @@ int board_eth_init(bd_t *bis)
|
|
|
|
|
|
cpu_eth_init(bis);
|
|
|
#endif /* CONFIG_FMAN_ENET */
|
|
|
+#endif /* !CONFIG_DM_ETH */
|
|
|
|
|
|
#ifdef CONFIG_PHY_AQUANTIA
|
|
|
/*
|
|
@@ -580,7 +584,12 @@ int board_eth_init(bd_t *bis)
|
|
|
gd->jt->mdio_phydev_for_ethname = mdio_phydev_for_ethname;
|
|
|
gd->jt->miiphy_set_current_dev = miiphy_set_current_dev;
|
|
|
#endif
|
|
|
+
|
|
|
+#ifdef CONFIG_DM_ETH
|
|
|
+ return 0;
|
|
|
+#else
|
|
|
return pci_eth_init(bis);
|
|
|
+#endif
|
|
|
}
|
|
|
|
|
|
#if defined(CONFIG_RESET_PHY_R)
|
|
@@ -592,6 +601,7 @@ void reset_phy(void)
|
|
|
}
|
|
|
#endif /* CONFIG_RESET_PHY_R */
|
|
|
|
|
|
+#ifndef CONFIG_DM_ETH
|
|
|
#if defined(CONFIG_FSL_MC_ENET)
|
|
|
int fdt_fixup_dpmac_phy_handle(void *fdt, int dpmac_id, int node_phandle)
|
|
|
{
|
|
@@ -840,4 +850,113 @@ int fdt_fixup_board_phy(void *fdt)
|
|
|
return ret;
|
|
|
}
|
|
|
#endif // CONFIG_FSL_MC_ENET
|
|
|
+#endif
|
|
|
+
|
|
|
+#if defined(CONFIG_DM_ETH) && defined(CONFIG_MULTI_DTB_FIT)
|
|
|
+
|
|
|
+/* Structure to hold SERDES protocols supported in case of
|
|
|
+ * CONFIG_DM_ETH enabled (network interfaces are described in the DTS).
|
|
|
+ *
|
|
|
+ * @serdes_block: the index of the SERDES block
|
|
|
+ * @serdes_protocol: the decimal value of the protocol supported
|
|
|
+ * @dts_needed: DTS notes describing the current configuration are needed
|
|
|
+ *
|
|
|
+ * When dts_needed is true, the board_fit_config_name_match() function
|
|
|
+ * will try to exactly match the current configuration of the block with a DTS
|
|
|
+ * name provided.
|
|
|
+ */
|
|
|
+static struct serdes_configuration {
|
|
|
+ u8 serdes_block;
|
|
|
+ u32 serdes_protocol;
|
|
|
+ bool dts_needed;
|
|
|
+} supported_protocols[] = {
|
|
|
+ /* Serdes block #1 */
|
|
|
+ {1, 3, true},
|
|
|
+ {1, 7, true},
|
|
|
+ {1, 19, true},
|
|
|
+ {1, 20, true},
|
|
|
+
|
|
|
+ /* Serdes block #2 */
|
|
|
+ {2, 2, false},
|
|
|
+ {2, 3, false},
|
|
|
+ {2, 5, false},
|
|
|
+ {2, 11, true},
|
|
|
+
|
|
|
+ /* Serdes block #3 */
|
|
|
+ {3, 2, false},
|
|
|
+ {3, 3, false},
|
|
|
+};
|
|
|
+
|
|
|
+#define SUPPORTED_SERDES_PROTOCOLS ARRAY_SIZE(supported_protocols)
|
|
|
+
|
|
|
+static bool protocol_supported(u8 serdes_block, u32 protocol)
|
|
|
+{
|
|
|
+ struct serdes_configuration serdes_conf;
|
|
|
+ int i;
|
|
|
+
|
|
|
+ for (i = 0; i < SUPPORTED_SERDES_PROTOCOLS; i++) {
|
|
|
+ serdes_conf = supported_protocols[i];
|
|
|
+ if (serdes_conf.serdes_block == serdes_block &&
|
|
|
+ serdes_conf.serdes_protocol == protocol)
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+ return false;
|
|
|
+}
|
|
|
|
|
|
+static void get_str_protocol(u8 serdes_block, u32 protocol, char *str)
|
|
|
+{
|
|
|
+ struct serdes_configuration serdes_conf;
|
|
|
+ int i;
|
|
|
+
|
|
|
+ for (i = 0; i < SUPPORTED_SERDES_PROTOCOLS; i++) {
|
|
|
+ serdes_conf = supported_protocols[i];
|
|
|
+ if (serdes_conf.serdes_block == serdes_block &&
|
|
|
+ serdes_conf.serdes_protocol == protocol) {
|
|
|
+ if (serdes_conf.dts_needed == true)
|
|
|
+ sprintf(str, "%u", protocol);
|
|
|
+ else
|
|
|
+ sprintf(str, "x");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+int board_fit_config_name_match(const char *name)
|
|
|
+{
|
|
|
+ struct ccsr_gur *gur = (void *)(CONFIG_SYS_FSL_GUTS_ADDR);
|
|
|
+ u32 rcw_status = in_le32(&gur->rcwsr[28]);
|
|
|
+ char srds_s1_str[2], srds_s2_str[2], srds_s3_str[2];
|
|
|
+ u32 srds_s1, srds_s2, srds_s3;
|
|
|
+ char expected_dts[100];
|
|
|
+
|
|
|
+ srds_s1 = rcw_status & FSL_CHASSIS3_RCWSR28_SRDS1_PRTCL_MASK;
|
|
|
+ srds_s1 >>= FSL_CHASSIS3_RCWSR28_SRDS1_PRTCL_SHIFT;
|
|
|
+
|
|
|
+ srds_s2 = rcw_status & FSL_CHASSIS3_RCWSR28_SRDS2_PRTCL_MASK;
|
|
|
+ srds_s2 >>= FSL_CHASSIS3_RCWSR28_SRDS2_PRTCL_SHIFT;
|
|
|
+
|
|
|
+ srds_s3 = rcw_status & FSL_CHASSIS3_RCWSR28_SRDS3_PRTCL_MASK;
|
|
|
+ srds_s3 >>= FSL_CHASSIS3_RCWSR28_SRDS3_PRTCL_SHIFT;
|
|
|
+
|
|
|
+ /* Check for supported protocols. The default DTS will be used
|
|
|
+ * in this case
|
|
|
+ */
|
|
|
+ if (!protocol_supported(1, srds_s1) ||
|
|
|
+ !protocol_supported(2, srds_s2) ||
|
|
|
+ !protocol_supported(3, srds_s3))
|
|
|
+ return -1;
|
|
|
+
|
|
|
+ get_str_protocol(1, srds_s1, srds_s1_str);
|
|
|
+ get_str_protocol(2, srds_s2, srds_s2_str);
|
|
|
+ get_str_protocol(3, srds_s3, srds_s3_str);
|
|
|
+
|
|
|
+ sprintf(expected_dts, "fsl-lx2160a-qds-%s-%s-%s",
|
|
|
+ srds_s1_str, srds_s2_str, srds_s3_str);
|
|
|
+
|
|
|
+ if (!strcmp(name, expected_dts))
|
|
|
+ return 0;
|
|
|
+
|
|
|
+ return -1;
|
|
|
+}
|
|
|
+#endif
|