All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH linux 0/4] Enable ftgmac100 driver on Aspeed g5 SoCs
@ 2016-06-10  4:44 Andrew Jeffery
  2016-06-10  4:44 ` [PATCH linux 1/4] aspeed: Use old MDC/MDIO interface for ftgmac100 driver compat Andrew Jeffery
                   ` (3 more replies)
  0 siblings, 4 replies; 11+ messages in thread
From: Andrew Jeffery @ 2016-06-10  4:44 UTC (permalink / raw)
  To: OpenBMC; +Cc: Joel Stanley, Gavin Shan, Andrew Jeffery

Hi all,

These patches are already applied to the dev-4.7 branch but hadn't been sent
anywhere for feedback.

The first patch is a work-around that gets the ftgmac100 driver probing on the
AST2500 EVB (or any non-NCSI configuration) in the short term. Longer term we
should probably implement the new MDC/MDIO register interface. Shouldn't (yet)
be sent upstream, but required in some cases around these parts.

Patches two and three had some queries from Joel regarding parameters I've
added to a number of functions. I've done some analysis on whether we can avoid
it, but it seems we cannot. Thoughts there would be appreciated.

Patch four is a trivial one for aspeed-g5.dtsi if you accept the general
approach of patch three.

Andrew Jeffery (4):
  aspeed: Use old MDC/MDIO interface for ftgmac100 driver compat
  ftgmac100: Separate rx page storage from rxdesc
  ftgmac100: Add devicetree option for the Aspeed g5 register interface
  aspeed-g5: Configure ftgmac100s for the Aspeed g5 register interface

 arch/arm/boot/dts/aspeed-g5.dtsi         |  2 +
 arch/arm/mach-aspeed/aspeed.c            |  8 ++++
 drivers/net/ethernet/faraday/ftgmac100.c | 76 +++++++++++++++++++++++---------
 drivers/net/ethernet/faraday/ftgmac100.h |  2 -
 4 files changed, 64 insertions(+), 24 deletions(-)

-- 
2.7.4

^ permalink raw reply	[flat|nested] 11+ messages in thread

* [PATCH linux 1/4] aspeed: Use old MDC/MDIO interface for ftgmac100 driver compat
  2016-06-10  4:44 [PATCH linux 0/4] Enable ftgmac100 driver on Aspeed g5 SoCs Andrew Jeffery
@ 2016-06-10  4:44 ` Andrew Jeffery
  2016-06-10  8:39   ` Joel Stanley
  2016-06-10  4:44 ` [PATCH linux 2/4] ftgmac100: Separate rx page storage from rxdesc Andrew Jeffery
                   ` (2 subsequent siblings)
  3 siblings, 1 reply; 11+ messages in thread
From: Andrew Jeffery @ 2016-06-10  4:44 UTC (permalink / raw)
  To: OpenBMC; +Cc: Joel Stanley, Gavin Shan, Andrew Jeffery

This is a work-around, and we should aim to move to the new interface.

Signed-off-by: Andrew Jeffery <andrew@aj.id.au>
---
 arch/arm/mach-aspeed/aspeed.c | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/arch/arm/mach-aspeed/aspeed.c b/arch/arm/mach-aspeed/aspeed.c
index 90c541f32ee8..12f3a044a03c 100644
--- a/arch/arm/mach-aspeed/aspeed.c
+++ b/arch/arm/mach-aspeed/aspeed.c
@@ -82,6 +82,7 @@ static void __init aspeed_dt_init(void)
 
 #define AST_BASE_LPC		0x1E789000 /* LPC Controller */
 #define AST_BASE_SPI		0x1E630000 /* SPI Memory Controller */
+#define AST_BASE_MAC1		0X1E660000 /* MAC 1 */
 #define AST_BASE_SCU		0x1E6E2000 /* System Control Unit (SCU) */
 #define AST_BASE_GPIO		0x1E780000 /* GPIO Controller */
 
@@ -186,8 +187,15 @@ static void __init do_garrison_setup(void)
 
 static void __init do_ast2500evb_setup(void)
 {
+	unsigned long reg;
+
 	/* Reset AHB bridges */
 	writel(0x02, AST_IO(AST_BASE_SCU | 0x04));
+
+	/* Set old MDIO interface */
+	reg = readl(AST_IO(AST_BASE_MAC1 | 0x40));
+	reg &= ~0x80000000;
+	writel(reg, AST_IO(AST_BASE_MAC1 | 0x40));
 }
 
 #define SCU_PASSWORD	0x1688A8A8
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH linux 2/4] ftgmac100: Separate rx page storage from rxdesc
  2016-06-10  4:44 [PATCH linux 0/4] Enable ftgmac100 driver on Aspeed g5 SoCs Andrew Jeffery
  2016-06-10  4:44 ` [PATCH linux 1/4] aspeed: Use old MDC/MDIO interface for ftgmac100 driver compat Andrew Jeffery
@ 2016-06-10  4:44 ` Andrew Jeffery
  2016-06-10  4:44 ` [PATCH linux 3/4] ftgmac100: Add devicetree option for the Aspeed g5 register interface Andrew Jeffery
  2016-06-10  4:44 ` [PATCH linux 4/4] aspeed-g5: Configure ftgmac100s " Andrew Jeffery
  3 siblings, 0 replies; 11+ messages in thread
From: Andrew Jeffery @ 2016-06-10  4:44 UTC (permalink / raw)
  To: OpenBMC; +Cc: Joel Stanley, Gavin Shan, Andrew Jeffery

The ftgmac100 hardware revision in e.g. the Aspeed AST2500 no longer
reserves all bits in RXDES#2 but instead uses the bottom 16 bits to
store MAC frame metadata. Avoid corruption by shifting struct page
pointers out to their own member in struct ftgmac100.

Signed-off-by: Andrew Jeffery <andrew@aj.id.au>
---

Joel asked if we could avoid passing both priv and rxdes to the get/set
helpers.  From a quick investigation the answer appears to be no: If we were to
do so we'd need a consistent way to determine the rxdes of interest.
ftgmac100_rxdes_get_page() has two call sites that do not have a common
approach to computing the rxdes of interest. ftgmac100_rxdes_set_page() has one
call site in ftgmac100_alloc_rx_page(), but the rxdes of interest is passed as
an argument to ftgmac100_alloc_rx_page() and so without cross-function analysis
I don't think we claim that there's a consistent means, or would be in the
future.

 drivers/net/ethernet/faraday/ftgmac100.c | 25 ++++++++++++++++++-------
 1 file changed, 18 insertions(+), 7 deletions(-)

diff --git a/drivers/net/ethernet/faraday/ftgmac100.c b/drivers/net/ethernet/faraday/ftgmac100.c
index 28fa52ebff31..f7d61c4703cf 100644
--- a/drivers/net/ethernet/faraday/ftgmac100.c
+++ b/drivers/net/ethernet/faraday/ftgmac100.c
@@ -60,6 +60,8 @@ struct ftgmac100 {
 	struct ftgmac100_descs *descs;
 	dma_addr_t descs_dma_addr;
 
+	struct page *rx_pages[RX_QUEUE_ENTRIES];
+
 	unsigned int rx_pointer;
 	unsigned int tx_clean_pointer;
 	unsigned int tx_pointer;
@@ -350,18 +352,27 @@ static bool ftgmac100_rxdes_ipcs_err(struct ftgmac100_rxdes *rxdes)
 	return rxdes->rxdes1 & cpu_to_le32(FTGMAC100_RXDES1_IP_CHKSUM_ERR);
 }
 
+static struct page **ftgmac100_rxdes_page_slot(struct ftgmac100 *priv,
+					       struct ftgmac100_rxdes *rxdes)
+{
+	return &priv->rx_pages[rxdes - priv->descs->rxdes];
+}
+
 /*
  * rxdes2 is not used by hardware. We use it to keep track of page.
  * Since hardware does not touch it, we can skip cpu_to_le32()/le32_to_cpu().
  */
-static void ftgmac100_rxdes_set_page(struct ftgmac100_rxdes *rxdes, struct page *page)
+static void ftgmac100_rxdes_set_page(struct ftgmac100 *priv,
+				     struct ftgmac100_rxdes *rxdes,
+				     struct page *page)
 {
-	rxdes->rxdes2 = (unsigned int)page;
+	*ftgmac100_rxdes_page_slot(priv, rxdes) = page;
 }
 
-static struct page *ftgmac100_rxdes_get_page(struct ftgmac100_rxdes *rxdes)
+static struct page *ftgmac100_rxdes_get_page(struct ftgmac100 *priv,
+					     struct ftgmac100_rxdes *rxdes)
 {
-	return (struct page *)rxdes->rxdes2;
+	return *ftgmac100_rxdes_page_slot(priv, rxdes);
 }
 
 /******************************************************************************
@@ -510,7 +521,7 @@ static bool ftgmac100_rx_packet(struct ftgmac100 *priv, int *processed)
 
 	do {
 		dma_addr_t map = ftgmac100_rxdes_get_dma_addr(rxdes);
-		struct page *page = ftgmac100_rxdes_get_page(rxdes);
+		struct page *page = ftgmac100_rxdes_get_page(priv, rxdes);
 		unsigned int size;
 
 		dma_unmap_page(priv->dev, map, RX_BUF_SIZE, DMA_FROM_DEVICE);
@@ -788,7 +799,7 @@ static int ftgmac100_alloc_rx_page(struct ftgmac100 *priv,
 		return -ENOMEM;
 	}
 
-	ftgmac100_rxdes_set_page(rxdes, page);
+	ftgmac100_rxdes_set_page(priv, rxdes, page);
 	ftgmac100_rxdes_set_dma_addr(rxdes, map);
 	ftgmac100_rxdes_set_dma_own(rxdes);
 	return 0;
@@ -800,7 +811,7 @@ static void ftgmac100_free_buffers(struct ftgmac100 *priv)
 
 	for (i = 0; i < RX_QUEUE_ENTRIES; i++) {
 		struct ftgmac100_rxdes *rxdes = &priv->descs->rxdes[i];
-		struct page *page = ftgmac100_rxdes_get_page(rxdes);
+		struct page *page = ftgmac100_rxdes_get_page(priv, rxdes);
 		dma_addr_t map = ftgmac100_rxdes_get_dma_addr(rxdes);
 
 		if (!page)
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH linux 3/4] ftgmac100: Add devicetree option for the Aspeed g5 register interface
  2016-06-10  4:44 [PATCH linux 0/4] Enable ftgmac100 driver on Aspeed g5 SoCs Andrew Jeffery
  2016-06-10  4:44 ` [PATCH linux 1/4] aspeed: Use old MDC/MDIO interface for ftgmac100 driver compat Andrew Jeffery
  2016-06-10  4:44 ` [PATCH linux 2/4] ftgmac100: Separate rx page storage from rxdesc Andrew Jeffery
@ 2016-06-10  4:44 ` Andrew Jeffery
  2016-06-10  8:46   ` Joel Stanley
  2016-06-10  4:44 ` [PATCH linux 4/4] aspeed-g5: Configure ftgmac100s " Andrew Jeffery
  3 siblings, 1 reply; 11+ messages in thread
From: Andrew Jeffery @ 2016-06-10  4:44 UTC (permalink / raw)
  To: OpenBMC; +Cc: Joel Stanley, Gavin Shan, Andrew Jeffery

Amongst other small changes, the g5 SoCs shift the bits used to signal
EDORR/EDOTR states. Abstract over the difference by making the masks
variable and configuring them from the device tree.

Signed-off-by: Andrew Jeffery <andrew@aj.id.au>
---

It's likely that Joel's query on passing both priv and rxdes/txdes also applied
to this patch. The functions of interest are:

ftgmac100_txdes_reset():

         We can use ftgmac100_current_clean_txdes() internally iff
         ftgmac100_tx_clean_pointer_advance() is not called before
         ftgmac100_txdes_reset(). It probably won't be, but it feels like a
         dangerous assumption.

ftgmac100_rxdes_set_dma_own():

         Has 3 call-sites, two use the current rxdes pointer, but one call-site
         is unclear; this is again in ftgmac100_alloc_rx_page(), where the
         rxdes of interest is passed in as a parameter.

ftgmac100_rxdes_set_end_of_ring():

         There's only one call-site, where the last descriptor in the array is
         marked as the end-of-ring. Here we could just pass priv.

ftgmac100_txdes_set_end_of_ring():

         There's only one call-site, where the last descriptor in the array is
         marked as the end-of-ring. Here we could just pass priv.

Overall, in some cases we can't accomodate the suggestion, in other cases it's
murky, and sometimes we could. However, for consistency, I think it's best we
take the one explicit approach.

 drivers/net/ethernet/faraday/ftgmac100.c | 51 ++++++++++++++++++++++----------
 drivers/net/ethernet/faraday/ftgmac100.h |  2 --
 2 files changed, 36 insertions(+), 17 deletions(-)

diff --git a/drivers/net/ethernet/faraday/ftgmac100.c b/drivers/net/ethernet/faraday/ftgmac100.c
index f7d61c4703cf..9f7ca81718fa 100644
--- a/drivers/net/ethernet/faraday/ftgmac100.c
+++ b/drivers/net/ethernet/faraday/ftgmac100.c
@@ -79,6 +79,9 @@ struct ftgmac100 {
 
 	bool use_ncsi;
 	bool enabled;
+
+	u32 rxdes0_edorr_mask;
+	u32 txdes0_edotr_mask;
 };
 
 static int ftgmac100_alloc_rx_page(struct ftgmac100 *priv,
@@ -268,10 +271,11 @@ static bool ftgmac100_rxdes_packet_ready(struct ftgmac100_rxdes *rxdes)
 	return rxdes->rxdes0 & cpu_to_le32(FTGMAC100_RXDES0_RXPKT_RDY);
 }
 
-static void ftgmac100_rxdes_set_dma_own(struct ftgmac100_rxdes *rxdes)
+static void ftgmac100_rxdes_set_dma_own(const struct ftgmac100 *priv,
+					struct ftgmac100_rxdes *rxdes)
 {
 	/* clear status bits */
-	rxdes->rxdes0 &= cpu_to_le32(FTGMAC100_RXDES0_EDORR);
+	rxdes->rxdes0 &= cpu_to_le32(priv->rxdes0_edorr_mask);
 }
 
 static bool ftgmac100_rxdes_rx_error(struct ftgmac100_rxdes *rxdes)
@@ -309,9 +313,10 @@ static bool ftgmac100_rxdes_multicast(struct ftgmac100_rxdes *rxdes)
 	return rxdes->rxdes0 & cpu_to_le32(FTGMAC100_RXDES0_MULTICAST);
 }
 
-static void ftgmac100_rxdes_set_end_of_ring(struct ftgmac100_rxdes *rxdes)
+static void ftgmac100_rxdes_set_end_of_ring(const struct ftgmac100 *priv,
+					    struct ftgmac100_rxdes *rxdes)
 {
-	rxdes->rxdes0 |= cpu_to_le32(FTGMAC100_RXDES0_EDORR);
+	rxdes->rxdes0 |= cpu_to_le32(priv->rxdes0_edorr_mask);
 }
 
 static void ftgmac100_rxdes_set_dma_addr(struct ftgmac100_rxdes *rxdes,
@@ -402,7 +407,7 @@ ftgmac100_rx_locate_first_segment(struct ftgmac100 *priv)
 		if (ftgmac100_rxdes_first_segment(rxdes))
 			return rxdes;
 
-		ftgmac100_rxdes_set_dma_own(rxdes);
+		ftgmac100_rxdes_set_dma_own(priv, rxdes);
 		ftgmac100_rx_pointer_advance(priv);
 		rxdes = ftgmac100_current_rxdes(priv);
 	}
@@ -473,7 +478,7 @@ static void ftgmac100_rx_drop_packet(struct ftgmac100 *priv)
 		if (ftgmac100_rxdes_last_segment(rxdes))
 			done = true;
 
-		ftgmac100_rxdes_set_dma_own(rxdes);
+		ftgmac100_rxdes_set_dma_own(priv, rxdes);
 		ftgmac100_rx_pointer_advance(priv);
 		rxdes = ftgmac100_current_rxdes(priv);
 	} while (!done && ftgmac100_rxdes_packet_ready(rxdes));
@@ -565,10 +570,11 @@ static bool ftgmac100_rx_packet(struct ftgmac100 *priv, int *processed)
 /******************************************************************************
  * internal functions (transmit descriptor)
  *****************************************************************************/
-static void ftgmac100_txdes_reset(struct ftgmac100_txdes *txdes)
+static void ftgmac100_txdes_reset(const struct ftgmac100 *priv,
+				  struct ftgmac100_txdes *txdes)
 {
 	/* clear all except end of ring bit */
-	txdes->txdes0 &= cpu_to_le32(FTGMAC100_TXDES0_EDOTR);
+	txdes->txdes0 &= cpu_to_le32(priv->txdes0_edotr_mask);
 	txdes->txdes1 = 0;
 	txdes->txdes2 = 0;
 	txdes->txdes3 = 0;
@@ -589,9 +595,10 @@ static void ftgmac100_txdes_set_dma_own(struct ftgmac100_txdes *txdes)
 	txdes->txdes0 |= cpu_to_le32(FTGMAC100_TXDES0_TXDMA_OWN);
 }
 
-static void ftgmac100_txdes_set_end_of_ring(struct ftgmac100_txdes *txdes)
+static void ftgmac100_txdes_set_end_of_ring(const struct ftgmac100 *priv,
+					    struct ftgmac100_txdes *txdes)
 {
-	txdes->txdes0 |= cpu_to_le32(FTGMAC100_TXDES0_EDOTR);
+	txdes->txdes0 |= cpu_to_le32(priv->txdes0_edotr_mask);
 }
 
 static void ftgmac100_txdes_set_first_segment(struct ftgmac100_txdes *txdes)
@@ -710,7 +717,7 @@ static bool ftgmac100_tx_complete_packet(struct ftgmac100 *priv)
 
 	dev_kfree_skb(skb);
 
-	ftgmac100_txdes_reset(txdes);
+	ftgmac100_txdes_reset(priv, txdes);
 
 	ftgmac100_tx_clean_pointer_advance(priv);
 
@@ -801,7 +808,7 @@ static int ftgmac100_alloc_rx_page(struct ftgmac100 *priv,
 
 	ftgmac100_rxdes_set_page(priv, rxdes, page);
 	ftgmac100_rxdes_set_dma_addr(rxdes, map);
-	ftgmac100_rxdes_set_dma_own(rxdes);
+	ftgmac100_rxdes_set_dma_own(priv, rxdes);
 	return 0;
 }
 
@@ -840,6 +847,8 @@ static void ftgmac100_free_buffers(struct ftgmac100 *priv)
 static int ftgmac100_alloc_buffers(struct ftgmac100 *priv)
 {
 	int i;
+	struct ftgmac100_rxdes *rxdes;
+	struct ftgmac100_txdes *txdes;
 
 	priv->descs = dma_zalloc_coherent(priv->dev,
 					  sizeof(struct ftgmac100_descs),
@@ -848,17 +857,19 @@ static int ftgmac100_alloc_buffers(struct ftgmac100 *priv)
 		return -ENOMEM;
 
 	/* initialize RX ring */
-	ftgmac100_rxdes_set_end_of_ring(&priv->descs->rxdes[RX_QUEUE_ENTRIES - 1]);
+	rxdes = &priv->descs->rxdes[RX_QUEUE_ENTRIES - 1];
+	ftgmac100_rxdes_set_end_of_ring(priv, rxdes);
 
 	for (i = 0; i < RX_QUEUE_ENTRIES; i++) {
-		struct ftgmac100_rxdes *rxdes = &priv->descs->rxdes[i];
+		rxdes = &priv->descs->rxdes[i];
 
 		if (ftgmac100_alloc_rx_page(priv, rxdes, GFP_KERNEL))
 			goto err;
 	}
 
 	/* initialize TX ring */
-	ftgmac100_txdes_set_end_of_ring(&priv->descs->txdes[TX_QUEUE_ENTRIES - 1]);
+	txdes = &priv->descs->txdes[TX_QUEUE_ENTRIES - 1];
+	ftgmac100_txdes_set_end_of_ring(priv, txdes);
 	return 0;
 
 err:
@@ -1346,6 +1358,15 @@ static int ftgmac100_probe(struct platform_device *pdev)
 		priv->use_ncsi = false;
 	}
 
+	if (pdev->dev.of_node &&
+	    of_get_property(pdev->dev.of_node, "aspeed-g5-interface", NULL)) {
+		priv->rxdes0_edorr_mask = (1 << 30);
+		priv->txdes0_edotr_mask = (1 << 30);
+	} else {
+		priv->rxdes0_edorr_mask = (1 << 15);
+		priv->txdes0_edotr_mask = (1 << 15);
+	}
+
 	netdev->ethtool_ops = &ftgmac100_ethtool_ops;
 	netdev->netdev_ops = &ftgmac100_netdev_ops;
 	if (pdev->dev.of_node &&
diff --git a/drivers/net/ethernet/faraday/ftgmac100.h b/drivers/net/ethernet/faraday/ftgmac100.h
index 13408d448b05..c258586ce4a4 100644
--- a/drivers/net/ethernet/faraday/ftgmac100.h
+++ b/drivers/net/ethernet/faraday/ftgmac100.h
@@ -189,7 +189,6 @@ struct ftgmac100_txdes {
 } __attribute__ ((aligned(16)));
 
 #define FTGMAC100_TXDES0_TXBUF_SIZE(x)	((x) & 0x3fff)
-#define FTGMAC100_TXDES0_EDOTR		(1 << 15)
 #define FTGMAC100_TXDES0_CRC_ERR	(1 << 19)
 #define FTGMAC100_TXDES0_LTS		(1 << 28)
 #define FTGMAC100_TXDES0_FTS		(1 << 29)
@@ -215,7 +214,6 @@ struct ftgmac100_rxdes {
 } __attribute__ ((aligned(16)));
 
 #define FTGMAC100_RXDES0_VDBC		0x3fff
-#define FTGMAC100_RXDES0_EDORR		(1 << 15)
 #define FTGMAC100_RXDES0_MULTICAST	(1 << 16)
 #define FTGMAC100_RXDES0_BROADCAST	(1 << 17)
 #define FTGMAC100_RXDES0_RX_ERR		(1 << 18)
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH linux 4/4] aspeed-g5: Configure ftgmac100s for the Aspeed g5 register interface
  2016-06-10  4:44 [PATCH linux 0/4] Enable ftgmac100 driver on Aspeed g5 SoCs Andrew Jeffery
                   ` (2 preceding siblings ...)
  2016-06-10  4:44 ` [PATCH linux 3/4] ftgmac100: Add devicetree option for the Aspeed g5 register interface Andrew Jeffery
@ 2016-06-10  4:44 ` Andrew Jeffery
  3 siblings, 0 replies; 11+ messages in thread
From: Andrew Jeffery @ 2016-06-10  4:44 UTC (permalink / raw)
  To: OpenBMC; +Cc: Joel Stanley, Gavin Shan, Andrew Jeffery

Signed-off-by: Andrew Jeffery <andrew@aj.id.au>
---
 arch/arm/boot/dts/aspeed-g5.dtsi | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/arch/arm/boot/dts/aspeed-g5.dtsi b/arch/arm/boot/dts/aspeed-g5.dtsi
index c86e3d5bfab1..afddbb8d28b4 100644
--- a/arch/arm/boot/dts/aspeed-g5.dtsi
+++ b/arch/arm/boot/dts/aspeed-g5.dtsi
@@ -41,6 +41,7 @@
 			compatible = "faraday,ftgmac100";
 			reg = <0x1e660000 0x180>;
 			interrupts = <2>;
+			aspeed-g5-interface;
 			no-hw-checksum;
 			status = "disabled";
 		};
@@ -49,6 +50,7 @@
 			compatible = "faraday,ftgmac100";
 			reg = <0x1e680000 0x180>;
 			interrupts = <3>;
+			aspeed-g5-interface;
 			no-hw-checksum;
 			status = "disabled";
 		};
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 11+ messages in thread

* Re: [PATCH linux 1/4] aspeed: Use old MDC/MDIO interface for ftgmac100 driver compat
  2016-06-10  4:44 ` [PATCH linux 1/4] aspeed: Use old MDC/MDIO interface for ftgmac100 driver compat Andrew Jeffery
@ 2016-06-10  8:39   ` Joel Stanley
  0 siblings, 0 replies; 11+ messages in thread
From: Joel Stanley @ 2016-06-10  8:39 UTC (permalink / raw)
  To: Andrew Jeffery; +Cc: OpenBMC, Gavin Shan

On Thu, Jun 9, 2016 at 11:44 PM, Andrew Jeffery <andrew@aj.id.au> wrote:
> This is a work-around, and we should aim to move to the new interface.
>
> Signed-off-by: Andrew Jeffery <andrew@aj.id.au>
> ---
>  arch/arm/mach-aspeed/aspeed.c | 8 ++++++++
>  1 file changed, 8 insertions(+)
>
> diff --git a/arch/arm/mach-aspeed/aspeed.c b/arch/arm/mach-aspeed/aspeed.c
> index 90c541f32ee8..12f3a044a03c 100644
> --- a/arch/arm/mach-aspeed/aspeed.c
> +++ b/arch/arm/mach-aspeed/aspeed.c
> @@ -82,6 +82,7 @@ static void __init aspeed_dt_init(void)
>
>  #define AST_BASE_LPC           0x1E789000 /* LPC Controller */
>  #define AST_BASE_SPI           0x1E630000 /* SPI Memory Controller */
> +#define AST_BASE_MAC1          0X1E660000 /* MAC 1 */
>  #define AST_BASE_SCU           0x1E6E2000 /* System Control Unit (SCU) */
>  #define AST_BASE_GPIO          0x1E780000 /* GPIO Controller */
>
> @@ -186,8 +187,15 @@ static void __init do_garrison_setup(void)
>
>  static void __init do_ast2500evb_setup(void)
>  {
> +       unsigned long reg;
> +
>         /* Reset AHB bridges */
>         writel(0x02, AST_IO(AST_BASE_SCU | 0x04));
> +
> +       /* Set old MDIO interface */
> +       reg = readl(AST_IO(AST_BASE_MAC1 | 0x40));
> +       reg &= ~0x80000000;
> +       writel(reg, AST_IO(AST_BASE_MAC1 | 0x40));

I think this is common to all ast2500 platforms. We should put it in a
function that matches on aspeed,ast2500.


>  }
>
>  #define SCU_PASSWORD   0x1688A8A8
> --
> 2.7.4
>

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH linux 3/4] ftgmac100: Add devicetree option for the Aspeed g5 register interface
  2016-06-10  4:44 ` [PATCH linux 3/4] ftgmac100: Add devicetree option for the Aspeed g5 register interface Andrew Jeffery
@ 2016-06-10  8:46   ` Joel Stanley
  2016-06-10 12:08     ` Cédric Le Goater
  0 siblings, 1 reply; 11+ messages in thread
From: Joel Stanley @ 2016-06-10  8:46 UTC (permalink / raw)
  To: Andrew Jeffery; +Cc: OpenBMC, Gavin Shan, Jeremy Kerr

On Thu, Jun 9, 2016 at 11:44 PM, Andrew Jeffery <andrew@aj.id.au> wrote:
> @@ -1346,6 +1358,15 @@ static int ftgmac100_probe(struct platform_device *pdev)
>                 priv->use_ncsi = false;
>         }
>
> +       if (pdev->dev.of_node &&
> +           of_get_property(pdev->dev.of_node, "aspeed-g5-interface", NULL)) {

We should get our device tree experts to chime in here.

An alternative could be to use
of_machine_is_compatible("aspeed,ast2500"). Then we don't need extra
properties.

> +               priv->rxdes0_edorr_mask = (1 << 30);
> +               priv->txdes0_edotr_mask = (1 << 30);
> +       } else {
> +               priv->rxdes0_edorr_mask = (1 << 15);
> +               priv->txdes0_edotr_mask = (1 << 15);
> +       }
> +
>         netdev->ethtool_ops = &ftgmac100_ethtool_ops;
>         netdev->netdev_ops = &ftgmac100_netdev_ops;
>         if (pdev->dev.of_node &&

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH linux 3/4] ftgmac100: Add devicetree option for the Aspeed g5 register interface
  2016-06-10  8:46   ` Joel Stanley
@ 2016-06-10 12:08     ` Cédric Le Goater
  2016-06-23 17:09       ` Cédric Le Goater
  0 siblings, 1 reply; 11+ messages in thread
From: Cédric Le Goater @ 2016-06-10 12:08 UTC (permalink / raw)
  To: Joel Stanley, Andrew Jeffery; +Cc: OpenBMC, Gavin Shan

Hello, 

On 06/10/2016 10:46 AM, Joel Stanley wrote:
> On Thu, Jun 9, 2016 at 11:44 PM, Andrew Jeffery <andrew@aj.id.au> wrote:
>> @@ -1346,6 +1358,15 @@ static int ftgmac100_probe(struct platform_device *pdev)
>>                 priv->use_ncsi = false;
>>         }
>>
>> +       if (pdev->dev.of_node &&
>> +           of_get_property(pdev->dev.of_node, "aspeed-g5-interface", NULL)) {
> 
> We should get our device tree experts to chime in here.
> 
> An alternative could be to use
> of_machine_is_compatible("aspeed,ast2500"). Then we don't need extra
> properties.

yes. That would be better.


So, given that there always has been fixes from Aspeed on the driver in
u-boot (see below), it seems that these EDO bits have been wrong since
the beginning in Linux.

I am wondering what how this was working. We should probably contact 
Aspeed to have some clarification.

C. 


Current SDK (fixed):

./u-boot-v2016.05-ast2500/drivers/net/ftgmac100.h://#define FTGMAC100_TXDES0_EDOTR		(1 << 15)
./u-boot-v2016.05-ast2500/drivers/net/ftgmac100.h:#define FTGMAC100_TXDES0_EDOTR		(1 << 30) //org is 15 ->30
./u-boot-v2016.05-ast2500/drivers/net/ftgmac100.h://#define FTGMAC100_RXDES0_EDORR		(1 << 15)
./u-boot-v2016.05-ast2500/drivers/net/ftgmac100.h:#define FTGMAC100_RXDES0_EDORR		(1 << 30)	//org 15->30
./u-boot-2013.01-aspeed/drivers/net/ftgmac100.h://#define FTGMAC100_TXDES0_EDOTR		(1 << 15)
./u-boot-2013.01-aspeed/drivers/net/ftgmac100.h:#define FTGMAC100_TXDES0_EDOTR		(1 << 30) //org is 15 ->30
./u-boot-2013.01-aspeed/drivers/net/ftgmac100.h://#define FTGMAC100_RXDES0_EDORR		(1 << 15)
./u-boot-2013.01-aspeed/drivers/net/ftgmac100.h:#define FTGMAC100_RXDES0_EDORR		(1 << 30)	//org 15->30

Older SDK (only aspeednic is fixed with a comment)

./u-boot-github-v2016.03-aspeed-openbmc/drivers/net/aspeednic.c://#define EDORR   0x00008000  /* Receive End Of Ring */
./u-boot-github-v2016.03-aspeed-openbmc/drivers/net/aspeednic.c:#define EDORR   0x40000000  /* Receive End Of Ring */
./u-boot-github-v2016.03-aspeed-openbmc/drivers/net/aspeednic.c://#define EDOTR   0x00008000  /* Transmit End Of Ring */
./u-boot-github-v2016.03-aspeed-openbmc/drivers/net/aspeednic.c:#define EDOTR   0x40000000  /* Transmit End Of Ring */
./u-boot-github-v2016.03-aspeed-openbmc/drivers/net/aspeednic.c:  rx_ring[rxRingSize - 1].status |= cpu_to_le32(EDORR);
./u-boot-github-v2016.03-aspeed-openbmc/drivers/net/aspeednic.c:  tx_ring[txRingSize - 1].status |= cpu_to_le32(EDOTR);

./u-boot-github-v2016.03-aspeed-openbmc/drivers/net/ftgmac100.h:#define FTGMAC100_TXDES0_EDOTR		(1 << 15)
./u-boot-github-v2016.03-aspeed-openbmc/drivers/net/ftgmac100.h:#define FTGMAC100_RXDES0_EDORR		(1 << 15)

Mainline (broken):

./u-boot/drivers/net/ftgmac100.h:#define FTGMAC100_TXDES0_EDOTR		(1 << 15)
./u-boot/drivers/net/ftgmac100.h:#define FTGMAC100_RXDES0_EDORR		(1 << 15)

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH linux 3/4] ftgmac100: Add devicetree option for the Aspeed g5 register interface
  2016-06-10 12:08     ` Cédric Le Goater
@ 2016-06-23 17:09       ` Cédric Le Goater
  2016-06-24  7:28         ` Joel Stanley
  0 siblings, 1 reply; 11+ messages in thread
From: Cédric Le Goater @ 2016-06-23 17:09 UTC (permalink / raw)
  To: Joel Stanley, Andrew Jeffery; +Cc: OpenBMC, Gavin Shan

On 06/10/2016 02:08 PM, Cédric Le Goater wrote:
> Hello, 
> 
> On 06/10/2016 10:46 AM, Joel Stanley wrote:
>> On Thu, Jun 9, 2016 at 11:44 PM, Andrew Jeffery <andrew@aj.id.au> wrote:
>>> @@ -1346,6 +1358,15 @@ static int ftgmac100_probe(struct platform_device *pdev)
>>>                 priv->use_ncsi = false;
>>>         }
>>>
>>> +       if (pdev->dev.of_node &&
>>> +           of_get_property(pdev->dev.of_node, "aspeed-g5-interface", NULL)) {
>>
>> We should get our device tree experts to chime in here.
>>
>> An alternative could be to use
>> of_machine_is_compatible("aspeed,ast2500"). Then we don't need extra
>> properties.
> 
> yes. That would be better.
> 
> 
> So, given that there always has been fixes from Aspeed on the driver in
> u-boot (see below), it seems that these EDO bits have been wrong since
> the beginning in Linux.
> 
> I am wondering what how this was working. We should probably contact 
> Aspeed to have some clarification.

Aspeed said that they have a different design than Faraday and we should 
be using :

	#define FTGMAC100_TXDES0_EDOTR		(1 << 30) 
	#define FTGMAC100_RXDES0_EDORR		(1 << 30)	

for all boards : ast2400 *and* ast2500. 

I gave it a try on a palmetto and indeed, network works fine with the 
Aspeed EDO{T,R}R bits. 
  
Cheers,

C.
 

> Current SDK (fixed):
> 
> ./u-boot-v2016.05-ast2500/drivers/net/ftgmac100.h://#define FTGMAC100_TXDES0_EDOTR		(1 << 15)
> ./u-boot-v2016.05-ast2500/drivers/net/ftgmac100.h:#define FTGMAC100_TXDES0_EDOTR		(1 << 30) //org is 15 ->30
> ./u-boot-v2016.05-ast2500/drivers/net/ftgmac100.h://#define FTGMAC100_RXDES0_EDORR		(1 << 15)
> ./u-boot-v2016.05-ast2500/drivers/net/ftgmac100.h:#define FTGMAC100_RXDES0_EDORR		(1 << 30)	//org 15->30
> ./u-boot-2013.01-aspeed/drivers/net/ftgmac100.h://#define FTGMAC100_TXDES0_EDOTR		(1 << 15)
> ./u-boot-2013.01-aspeed/drivers/net/ftgmac100.h:#define FTGMAC100_TXDES0_EDOTR		(1 << 30) //org is 15 ->30
> ./u-boot-2013.01-aspeed/drivers/net/ftgmac100.h://#define FTGMAC100_RXDES0_EDORR		(1 << 15)
> ./u-boot-2013.01-aspeed/drivers/net/ftgmac100.h:#define FTGMAC100_RXDES0_EDORR		(1 << 30)	//org 15->30
> 
> Older SDK (only aspeednic is fixed with a comment)
> 
> ./u-boot-github-v2016.03-aspeed-openbmc/drivers/net/aspeednic.c://#define EDORR   0x00008000  /* Receive End Of Ring */
> ./u-boot-github-v2016.03-aspeed-openbmc/drivers/net/aspeednic.c:#define EDORR   0x40000000  /* Receive End Of Ring */
> ./u-boot-github-v2016.03-aspeed-openbmc/drivers/net/aspeednic.c://#define EDOTR   0x00008000  /* Transmit End Of Ring */
> ./u-boot-github-v2016.03-aspeed-openbmc/drivers/net/aspeednic.c:#define EDOTR   0x40000000  /* Transmit End Of Ring */
> ./u-boot-github-v2016.03-aspeed-openbmc/drivers/net/aspeednic.c:  rx_ring[rxRingSize - 1].status |= cpu_to_le32(EDORR);
> ./u-boot-github-v2016.03-aspeed-openbmc/drivers/net/aspeednic.c:  tx_ring[txRingSize - 1].status |= cpu_to_le32(EDOTR);
> 
> ./u-boot-github-v2016.03-aspeed-openbmc/drivers/net/ftgmac100.h:#define FTGMAC100_TXDES0_EDOTR		(1 << 15)
> ./u-boot-github-v2016.03-aspeed-openbmc/drivers/net/ftgmac100.h:#define FTGMAC100_RXDES0_EDORR		(1 << 15)
> 
> Mainline (broken):
> 
> ./u-boot/drivers/net/ftgmac100.h:#define FTGMAC100_TXDES0_EDOTR		(1 << 15)
> ./u-boot/drivers/net/ftgmac100.h:#define FTGMAC100_RXDES0_EDORR		(1 << 15)
> 
> 
> 
> 

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH linux 3/4] ftgmac100: Add devicetree option for the Aspeed g5 register interface
  2016-06-23 17:09       ` Cédric Le Goater
@ 2016-06-24  7:28         ` Joel Stanley
  2016-06-24 17:18           ` Cédric Le Goater
  0 siblings, 1 reply; 11+ messages in thread
From: Joel Stanley @ 2016-06-24  7:28 UTC (permalink / raw)
  To: Cédric Le Goater; +Cc: Andrew Jeffery, OpenBMC, Gavin Shan

Hey Cedric,

On Fri, Jun 24, 2016 at 2:39 AM, Cédric Le Goater <clg@kaod.org> wrote:
>> So, given that there always has been fixes from Aspeed on the driver in
>> u-boot (see below), it seems that these EDO bits have been wrong since
>> the beginning in Linux.
>>
>> I am wondering what how this was working. We should probably contact
>> Aspeed to have some clarification.
>
> Aspeed said that they have a different design than Faraday and we should
> be using :
>
>         #define FTGMAC100_TXDES0_EDOTR          (1 << 30)
>         #define FTGMAC100_RXDES0_EDORR          (1 << 30)
>
> for all boards : ast2400 *and* ast2500.
>
> I gave it a try on a palmetto and indeed, network works fine with the
> Aspeed EDO{T,R}R bits.

Nice investigation. Thank you for doing that.

I have sent a revised patch for the kernel that incorporates Andrew's
work with your findings.

 https://lists.ozlabs.org/pipermail/openbmc/2016-June/003876.html
 https://lists.ozlabs.org/pipermail/openbmc/2016-June/003877.html

Please review and add your tags, and I'll update the branch with the fixes.

If you want to do something similar for u-boot then please go ahead.
Otherwise I'll do it on Monday.

Cheers,

Joel

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH linux 3/4] ftgmac100: Add devicetree option for the Aspeed g5 register interface
  2016-06-24  7:28         ` Joel Stanley
@ 2016-06-24 17:18           ` Cédric Le Goater
  0 siblings, 0 replies; 11+ messages in thread
From: Cédric Le Goater @ 2016-06-24 17:18 UTC (permalink / raw)
  To: Joel Stanley; +Cc: Andrew Jeffery, OpenBMC, Gavin Shan

On 06/24/2016 09:28 AM, Joel Stanley wrote:
> Hey Cedric,
> 
> On Fri, Jun 24, 2016 at 2:39 AM, Cédric Le Goater <clg@kaod.org> wrote:
>>> So, given that there always has been fixes from Aspeed on the driver in
>>> u-boot (see below), it seems that these EDO bits have been wrong since
>>> the beginning in Linux.
>>>
>>> I am wondering what how this was working. We should probably contact
>>> Aspeed to have some clarification.
>>
>> Aspeed said that they have a different design than Faraday and we should
>> be using :
>>
>>         #define FTGMAC100_TXDES0_EDOTR          (1 << 30)
>>         #define FTGMAC100_RXDES0_EDORR          (1 << 30)
>>
>> for all boards : ast2400 *and* ast2500.
>>
>> I gave it a try on a palmetto and indeed, network works fine with the
>> Aspeed EDO{T,R}R bits.
> 
> Nice investigation. Thank you for doing that.

Yes. Well, the Linux driver is consistent with U-Boot now.

> I have sent a revised patch for the kernel that incorporates Andrew's
> work with your findings.
> 
>  https://lists.ozlabs.org/pipermail/openbmc/2016-June/003876.html
>  https://lists.ozlabs.org/pipermail/openbmc/2016-June/003877.html
> 
> Please review and add your tags, and I'll update the branch with the fixes.

done.

> If you want to do something similar for u-boot then please go ahead.

yes. I would like first to revise the u-boot device model I could not
get working in both environment. With the kernel above, that should 
be better.

And then, U-Boot will get some aesthetic surgery, for sure :)

Thanks a lot,

C. 

> Otherwise I'll do it on Monday.
> 
> Cheers,
> 
> Joel
> 

^ permalink raw reply	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2016-06-24 17:34 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-06-10  4:44 [PATCH linux 0/4] Enable ftgmac100 driver on Aspeed g5 SoCs Andrew Jeffery
2016-06-10  4:44 ` [PATCH linux 1/4] aspeed: Use old MDC/MDIO interface for ftgmac100 driver compat Andrew Jeffery
2016-06-10  8:39   ` Joel Stanley
2016-06-10  4:44 ` [PATCH linux 2/4] ftgmac100: Separate rx page storage from rxdesc Andrew Jeffery
2016-06-10  4:44 ` [PATCH linux 3/4] ftgmac100: Add devicetree option for the Aspeed g5 register interface Andrew Jeffery
2016-06-10  8:46   ` Joel Stanley
2016-06-10 12:08     ` Cédric Le Goater
2016-06-23 17:09       ` Cédric Le Goater
2016-06-24  7:28         ` Joel Stanley
2016-06-24 17:18           ` Cédric Le Goater
2016-06-10  4:44 ` [PATCH linux 4/4] aspeed-g5: Configure ftgmac100s " Andrew Jeffery

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.