diff mbox

[U-Boot,04/15] net: mvneta: Add support for Armada 3700 SoC

Message ID 20160916130947.11367-4-sr@denx.de
State Superseded
Delegated to: Stefan Roese
Headers show

Commit Message

Stefan Roese Sept. 16, 2016, 1:09 p.m. UTC
This patch adds support for the Armada 3700 SoC to the Marvell mvneta
network driver.

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.

Signed-off-by: Stefan Roese <sr@denx.de>
Cc: Nadav Haklai <nadavh@marvell.com>
Cc: Kostya Porotchkin <kostap@marvell.com>
Cc: Wilson Ding <dingwei@marvell.com>
Cc: Victor Gu <xigu@marvell.com>
Cc: Hua Jing <jinghua@marvell.com>
Cc: Terry Zhou <bjzhou@marvell.com>
Cc: Hanna Hawa <hannah@marvell.com>
Cc: Haim Boot <hayim@marvell.com>
Cc: Joe Hershberger <joe.hershberger@ni.com>
---
 drivers/net/mvneta.c | 39 ++++++++++++++++++++++++++++++++++++++-
 1 file changed, 38 insertions(+), 1 deletion(-)

Comments

Joe Hershberger Sept. 16, 2016, 5:59 p.m. UTC | #1
On Fri, Sep 16, 2016 at 8:09 AM, Stefan Roese <sr@denx.de> wrote:
> This patch adds support for the Armada 3700 SoC to the Marvell mvneta
> network driver.
>
> 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.
>
> Signed-off-by: Stefan Roese <sr@denx.de>
> Cc: Nadav Haklai <nadavh@marvell.com>
> Cc: Kostya Porotchkin <kostap@marvell.com>
> Cc: Wilson Ding <dingwei@marvell.com>
> Cc: Victor Gu <xigu@marvell.com>
> Cc: Hua Jing <jinghua@marvell.com>
> Cc: Terry Zhou <bjzhou@marvell.com>
> Cc: Hanna Hawa <hannah@marvell.com>
> Cc: Haim Boot <hayim@marvell.com>
> Cc: Joe Hershberger <joe.hershberger@ni.com>
> ---
>  drivers/net/mvneta.c | 39 ++++++++++++++++++++++++++++++++++++++-
>  1 file changed, 38 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/net/mvneta.c b/drivers/net/mvneta.c
> index 433e186..2b98a92 100644
> --- a/drivers/net/mvneta.c
> +++ b/drivers/net/mvneta.c
> @@ -91,7 +91,10 @@ 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_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 +1244,36 @@ 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)
> +{
> +       u32 tmp_value;
> +
> +       /*
> +        * 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 */
> +       tmp_value = mvreg_read(pp, MVNETA_BASE_ADDR_ENABLE);
> +       tmp_value = tmp_value & ~(1);

It would be good to have a defined name for this bitfield above like the others.

Also, you could use:

#define MVNETA_BASE_ADDR_ENABLE_BIT 0
clear_bit(MVNETA_BASE_ADDR_ENABLE_BIT, pp->base + MVNETA_BASE_ADDR_ENABLE);

> +       mvreg_write(pp, MVNETA_BASE_ADDR_ENABLE, tmp_value);
> +
> +       /* Set GBE address decode window 0 to full Access (read or write) */
> +       tmp_value = mvreg_read(pp, MVNETA_PORT_ACCESS_PROTECT);
> +       tmp_value = tmp_value | MVNETA_PORT_ACCESS_PROTECT_WIN0_RW;
> +       mvreg_write(pp, MVNETA_PORT_ACCESS_PROTECT, tmp_value);

Or:

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 +1642,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 +1708,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" },
>         { }
>  };
>
> --
> 2.9.3
>
> _______________________________________________
> U-Boot mailing list
> U-Boot@lists.denx.de
> http://lists.denx.de/mailman/listinfo/u-boot
diff mbox

Patch

diff --git a/drivers/net/mvneta.c b/drivers/net/mvneta.c
index 433e186..2b98a92 100644
--- a/drivers/net/mvneta.c
+++ b/drivers/net/mvneta.c
@@ -91,7 +91,10 @@  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_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 +1244,36 @@  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)
+{
+	u32 tmp_value;
+
+	/*
+	 * 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 */
+	tmp_value = mvreg_read(pp, MVNETA_BASE_ADDR_ENABLE);
+	tmp_value = tmp_value & ~(1);
+	mvreg_write(pp, MVNETA_BASE_ADDR_ENABLE, tmp_value);
+
+	/* Set GBE address decode window 0 to full Access (read or write) */
+	tmp_value = mvreg_read(pp, MVNETA_PORT_ACCESS_PROTECT);
+	tmp_value = tmp_value | MVNETA_PORT_ACCESS_PROTECT_WIN0_RW;
+	mvreg_write(pp, MVNETA_PORT_ACCESS_PROTECT, tmp_value);
+}
+
 static void mvneta_conf_mbus_windows(struct mvneta_port *pp)
 {
 	const struct mbus_dram_target_info *dram;
@@ -1609,7 +1642,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 +1708,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" },
 	{ }
 };