|
@@ -91,7 +91,11 @@ DECLARE_GLOBAL_DATA_PTR;
|
|
|
#define MVNETA_WIN_BASE(w) (0x2200 + ((w) << 3))
|
|
|
#define MVNETA_WIN_SIZE(w) (0x2204 + ((w) << 3))
|
|
|
#define MVNETA_WIN_REMAP(w) (0x2280 + ((w) << 2))
|
|
|
+#define MVNETA_WIN_SIZE_MASK (0xffff0000)
|
|
|
#define MVNETA_BASE_ADDR_ENABLE 0x2290
|
|
|
+#define MVNETA_BASE_ADDR_ENABLE_BIT 0x1
|
|
|
+#define MVNETA_PORT_ACCESS_PROTECT 0x2294
|
|
|
+#define MVNETA_PORT_ACCESS_PROTECT_WIN0_RW 0x3
|
|
|
#define MVNETA_PORT_CONFIG 0x2400
|
|
|
#define MVNETA_UNI_PROMISC_MODE BIT(0)
|
|
|
#define MVNETA_DEF_RXQ(q) ((q) << 1)
|
|
@@ -1241,6 +1245,32 @@ static int mvneta_init2(struct mvneta_port *pp)
|
|
|
}
|
|
|
|
|
|
/* platform glue : initialize decoding windows */
|
|
|
+
|
|
|
+/*
|
|
|
+ * Not like A380, in Armada3700, there are two layers of decode windows for GBE:
|
|
|
+ * First layer is: GbE Address window that resides inside the GBE unit,
|
|
|
+ * Second layer is: Fabric address window which is located in the NIC400
|
|
|
+ * (South Fabric).
|
|
|
+ * To simplify the address decode configuration for Armada3700, we bypass the
|
|
|
+ * first layer of GBE decode window by setting the first window to 4GB.
|
|
|
+ */
|
|
|
+static void mvneta_bypass_mbus_windows(struct mvneta_port *pp)
|
|
|
+{
|
|
|
+ /*
|
|
|
+ * Set window size to 4GB, to bypass GBE address decode, leave the
|
|
|
+ * work to MBUS decode window
|
|
|
+ */
|
|
|
+ mvreg_write(pp, MVNETA_WIN_SIZE(0), MVNETA_WIN_SIZE_MASK);
|
|
|
+
|
|
|
+ /* Enable GBE address decode window 0 by set bit 0 to 0 */
|
|
|
+ clrbits_le32(pp->base + MVNETA_BASE_ADDR_ENABLE,
|
|
|
+ MVNETA_BASE_ADDR_ENABLE_BIT);
|
|
|
+
|
|
|
+ /* Set GBE address decode window 0 to full Access (read or write) */
|
|
|
+ setbits_le32(pp->base + MVNETA_PORT_ACCESS_PROTECT,
|
|
|
+ MVNETA_PORT_ACCESS_PROTECT_WIN0_RW);
|
|
|
+}
|
|
|
+
|
|
|
static void mvneta_conf_mbus_windows(struct mvneta_port *pp)
|
|
|
{
|
|
|
const struct mbus_dram_target_info *dram;
|
|
@@ -1609,7 +1639,10 @@ static int mvneta_probe(struct udevice *dev)
|
|
|
pp->base = (void __iomem *)pdata->iobase;
|
|
|
|
|
|
/* Configure MBUS address windows */
|
|
|
- mvneta_conf_mbus_windows(pp);
|
|
|
+ if (of_device_is_compatible(dev, "marvell,armada-3700-neta"))
|
|
|
+ mvneta_bypass_mbus_windows(pp);
|
|
|
+ else
|
|
|
+ mvneta_conf_mbus_windows(pp);
|
|
|
|
|
|
/* PHY interface is already decoded in mvneta_ofdata_to_platdata() */
|
|
|
pp->phy_interface = pdata->phy_interface;
|
|
@@ -1672,6 +1705,7 @@ static int mvneta_ofdata_to_platdata(struct udevice *dev)
|
|
|
static const struct udevice_id mvneta_ids[] = {
|
|
|
{ .compatible = "marvell,armada-370-neta" },
|
|
|
{ .compatible = "marvell,armada-xp-neta" },
|
|
|
+ { .compatible = "marvell,armada-3700-neta" },
|
|
|
{ }
|
|
|
};
|
|
|
|