From: Bo Shen <voice.shen@atmel.com>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH v2 1/3] net: macb: enable dcache in macb
Date: Tue, 20 May 2014 09:50:04 +0800 [thread overview]
Message-ID: <537AB4CC.5000505@atmel.com> (raw)
In-Reply-To: <1400500288-10263-2-git-send-email-josh.wu@atmel.com>
Hi Josh,
On 05/19/2014 07:51 PM, Josh Wu wrote:
> Add to code to flush the dcache after we writing in DMA buffer.
> Also we need invalidate the dcache before we check the status in the
> DMA buffer.
>
> Tested in SAMA5D3x-EK with gmac0. Tftp download speed shows in below:
> Disable DCache: 1.1 MiB/s
> Enable DCache: 1.6 MiB/s
> Increase speed with about 40%.
>
> The code should have no impact with the boards which are not
> enable_dcache().
> Tested in AT91SAM9M10G45EK.
>
> Signed-off-by: Josh Wu <josh.wu@atmel.com>
For this patch set, tested ok on sama5d3xek board.
Tested-by: Bo Shen <voice.shen@atmel.com>
Acked-by: Bo Shen <voice.shen@atmel.com>
Best Regards,
Bo Shen
> ---
> v1 -> v2:
> no change.
>
> drivers/net/macb.c | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 51 insertions(+)
>
> diff --git a/drivers/net/macb.c b/drivers/net/macb.c
> index 781a272..b18f07b 100644
> --- a/drivers/net/macb.c
> +++ b/drivers/net/macb.c
> @@ -194,6 +194,39 @@ int macb_miiphy_write(const char *devname, u8 phy_adr, u8 reg, u16 value)
> }
> #endif
>
> +#define IS_RX 1
> +#define IS_TX 0
> +static inline void macb_invalidate_ring_desc(struct macb_device *macb, bool is_rx)
> +{
> + if (is_rx)
> + invalidate_dcache_range(macb->rx_ring_dma, macb->rx_ring_dma +
> + CONFIG_SYS_MACB_RX_RING_SIZE * sizeof(struct macb_dma_desc));
> + else
> + invalidate_dcache_range(macb->tx_ring_dma, macb->tx_ring_dma +
> + CONFIG_SYS_MACB_TX_RING_SIZE * sizeof(struct macb_dma_desc));
> +}
> +
> +static inline void macb_flush_ring_desc(struct macb_device *macb, bool is_rx)
> +{
> + if (is_rx)
> + flush_dcache_range(macb->rx_ring_dma, macb->rx_ring_dma +
> + CONFIG_SYS_MACB_RX_RING_SIZE * sizeof(struct macb_dma_desc));
> + else
> + flush_dcache_range(macb->tx_ring_dma, macb->tx_ring_dma +
> + CONFIG_SYS_MACB_TX_RING_SIZE * sizeof(struct macb_dma_desc));
> +}
> +
> +static inline void macb_flush_rx_buffer(struct macb_device *macb)
> +{
> + flush_dcache_range(macb->rx_buffer_dma,
> + macb->rx_buffer_dma + CONFIG_SYS_MACB_RX_BUFFER_SIZE);
> +}
> +
> +static inline void macb_invalidate_rx_buffer(struct macb_device *macb)
> +{
> + invalidate_dcache_range(macb->rx_buffer_dma,
> + macb->rx_buffer_dma + CONFIG_SYS_MACB_RX_BUFFER_SIZE);
> +}
>
> #if defined(CONFIG_CMD_NET)
>
> @@ -217,6 +250,9 @@ static int macb_send(struct eth_device *netdev, void *packet, int length)
> macb->tx_ring[tx_head].ctrl = ctrl;
> macb->tx_ring[tx_head].addr = paddr;
> barrier();
> + macb_flush_ring_desc(macb, IS_TX);
> + /* Do we need check paddr and length is dcache line aligned? */
> + flush_dcache_range(paddr, paddr + length);
> macb_writel(macb, NCR, MACB_BIT(TE) | MACB_BIT(RE) | MACB_BIT(TSTART));
>
> /*
> @@ -225,6 +261,7 @@ static int macb_send(struct eth_device *netdev, void *packet, int length)
> */
> for (i = 0; i <= CONFIG_SYS_MACB_TX_TIMEOUT; i++) {
> barrier();
> + macb_invalidate_ring_desc(macb, IS_TX);
> ctrl = macb->tx_ring[tx_head].ctrl;
> if (ctrl & TXBUF_USED)
> break;
> @@ -253,6 +290,8 @@ static void reclaim_rx_buffers(struct macb_device *macb,
> unsigned int i;
>
> i = macb->rx_tail;
> +
> + macb_invalidate_ring_desc(macb, IS_RX);
> while (i > new_tail) {
> macb->rx_ring[i].addr &= ~RXADDR_USED;
> i++;
> @@ -266,6 +305,7 @@ static void reclaim_rx_buffers(struct macb_device *macb,
> }
>
> barrier();
> + macb_flush_ring_desc(macb, IS_RX);
> macb->rx_tail = new_tail;
> }
>
> @@ -279,6 +319,8 @@ static int macb_recv(struct eth_device *netdev)
> u32 status;
>
> for (;;) {
> + macb_invalidate_ring_desc(macb, IS_RX);
> +
> if (!(macb->rx_ring[rx_tail].addr & RXADDR_USED))
> return -1;
>
> @@ -292,6 +334,8 @@ static int macb_recv(struct eth_device *netdev)
> if (status & RXBUF_FRAME_END) {
> buffer = macb->rx_buffer + 128 * macb->rx_tail;
> length = status & RXBUF_FRMLEN_MASK;
> +
> + macb_invalidate_rx_buffer(macb);
> if (wrapped) {
> unsigned int headlen, taillen;
>
> @@ -506,6 +550,9 @@ static int macb_init(struct eth_device *netdev, bd_t *bd)
> macb->rx_ring[i].ctrl = 0;
> paddr += 128;
> }
> + macb_flush_ring_desc(macb, IS_RX);
> + macb_flush_rx_buffer(macb);
> +
> for (i = 0; i < CONFIG_SYS_MACB_TX_RING_SIZE; i++) {
> macb->tx_ring[i].addr = 0;
> if (i == (CONFIG_SYS_MACB_TX_RING_SIZE - 1))
> @@ -513,6 +560,8 @@ static int macb_init(struct eth_device *netdev, bd_t *bd)
> else
> macb->tx_ring[i].ctrl = TXBUF_USED;
> }
> + macb_flush_ring_desc(macb, IS_TX);
> +
> macb->rx_tail = macb->tx_head = macb->tx_tail = 0;
>
> macb_writel(macb, RBQP, macb->rx_ring_dma);
> @@ -663,6 +712,8 @@ int macb_eth_initialize(int id, void *regs, unsigned int phy_addr)
> * sizeof(struct macb_dma_desc),
> &macb->tx_ring_dma);
>
> + /* TODO: we need check the rx/tx_ring_dma is dcache line aligned */
> +
> macb->regs = regs;
> macb->phy_addr = phy_addr;
>
>
next prev parent reply other threads:[~2014-05-20 1:50 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-05-19 11:51 [U-Boot] [PATCH v2 0/3] Enable ICache and DCache for at91 armv7 Soc Josh Wu
2014-05-19 11:51 ` [U-Boot] [PATCH v2 1/3] net: macb: enable dcache in macb Josh Wu
2014-05-20 1:50 ` Bo Shen [this message]
2014-05-26 21:06 ` Andreas Bießmann
2014-05-27 8:20 ` Josh Wu
2014-05-27 8:31 ` [U-Boot] [RESEND][PATCH " Josh Wu
2014-06-14 16:14 ` [U-Boot] [U-Boot,RESEND,v2,1/3] " Andreas Bießmann
2014-05-19 11:51 ` [U-Boot] [PATCH v2 2/3] video: atmel_hlcdfb: enable dcache support Josh Wu
2014-05-19 14:38 ` Anatolij Gustschin
2014-06-14 16:14 ` [U-Boot] [U-Boot,v2,2/3] " Andreas Bießmann
2014-05-19 11:51 ` [U-Boot] [PATCH v2 3/3] ARMv7: at91: enable ICache and DCache Josh Wu
2014-06-14 16:14 ` [U-Boot] [U-Boot,v2,3/3] " Andreas Bießmann
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=537AB4CC.5000505@atmel.com \
--to=voice.shen@atmel.com \
--cc=u-boot@lists.denx.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox