openbmc / u-boot

OpenBMC "Das U-Boot" Source Tree
13 stars 51 forks source link

CACHE: Misaligned operation in ftgmac100 with mainline #21

Closed shenki closed 5 years ago

shenki commented 5 years ago

When I enabled the dcache in the ast2600 u-boot port we got this message over and over:

CACHE: Misaligned operation at range [bd79d310, bd79d350]
#0  check_cache_range (start=3178877712, stop=3178877776) at arch/arm/lib/cache.c:58
#1  0xbf7a8560 in flush_dcache_range (start=3178877712, stop=3178877776) at arch/arm/cpu/armv7/cache_v7.c:133
#2  0xbf7c42b8 in ftgmac100_start (dev=<optimized out>) at drivers/net/ftgmac100.c:314
#3  0xbf7d1afc in eth_init () at net/eth-uclass.c:276
#4  0xbf7d2dc4 in net_loop (protocol=DHCP) at net/net.c:419
#5  0xbf7aef04 in netboot_common (proto=DHCP, cmdtp=0xbf7e9860, argc=<optimized out>, argv=0xbd79d3e8) at cmd/net.c:246
legoater commented 5 years ago

And this one should work ! Tested with the Aspeed u-boot aspeed-dev-v2019.04branch on a AST2600 EVB.

From 8a0067f378efff25547ffee84ef82924e87fbbaf Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?C=C3=A9dric=20Le=20Goater?= <clg@kaod.org>
Date: Thu, 21 Nov 2019 07:39:41 +0100
Subject: [PATCH] net: ftgmac100: align RX/TX descriptors on ARCH_DMA_MINALIGN
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Fixes: e766849713ff ("net: ftgmac100: convert the RX/TX descriptor arrays")
Signed-off-by: Cédric Le Goater <clg@kaod.org>
---
 drivers/net/ftgmac100.c | 16 ++++++++--------
 1 file changed, 8 insertions(+), 8 deletions(-)

diff --git a/drivers/net/ftgmac100.c b/drivers/net/ftgmac100.c
index dceeb8f109ed..242f57c0ef7b 100644
--- a/drivers/net/ftgmac100.c
+++ b/drivers/net/ftgmac100.c
@@ -74,8 +74,8 @@ struct ftgmac100_data {
    struct ftgmac100 *iobase;
    fdt_addr_t mdio_addr;   //for aspeed ast2600 new mdio

-   struct ftgmac100_txdes txdes[PKTBUFSTX];
-   struct ftgmac100_rxdes rxdes[PKTBUFSRX];
+   struct ftgmac100_txdes txdes[PKTBUFSTX] __aligned(ARCH_DMA_MINALIGN);
+   struct ftgmac100_rxdes rxdes[PKTBUFSRX] __aligned(ARCH_DMA_MINALIGN);
    int tx_index;
    int rx_index;

@@ -318,7 +318,7 @@ static int ftgmac100_start(struct udevice *dev)
    }
    priv->txdes[PKTBUFSTX - 1].txdes0 = priv->txdes0_edotr_mask;

-   start = (ulong)&priv->txdes[0];
+   start = ((ulong)&priv->txdes[0]) & ~(ARCH_DMA_MINALIGN - 1);
    end = start + roundup(sizeof(priv->txdes), ARCH_DMA_MINALIGN);
    flush_dcache_range(start, end);

@@ -328,7 +328,7 @@ static int ftgmac100_start(struct udevice *dev)
    }
    priv->rxdes[PKTBUFSRX - 1].rxdes0 = priv->rxdes0_edorr_mask;

-   start = (ulong)&priv->rxdes[0];
+   start = ((ulong)&priv->rxdes[0]) & ~(ARCH_DMA_MINALIGN - 1);
    end = start + roundup(sizeof(priv->rxdes), ARCH_DMA_MINALIGN);
    flush_dcache_range(start, end);

@@ -378,7 +378,7 @@ static int ftgmac100_free_pkt(struct udevice *dev, uchar *packet, int length)
 {
    struct ftgmac100_data *priv = dev_get_priv(dev);
    struct ftgmac100_rxdes *curr_des = &priv->rxdes[priv->rx_index];
-   ulong des_start = (ulong)curr_des;
+   ulong des_start = ((ulong)curr_des) & ~(ARCH_DMA_MINALIGN - 1);
    ulong des_end = des_start +
        roundup(sizeof(*curr_des), ARCH_DMA_MINALIGN);

@@ -400,7 +400,7 @@ static int ftgmac100_recv(struct udevice *dev, int flags, uchar **packetp)
    struct ftgmac100_data *priv = dev_get_priv(dev);
    struct ftgmac100_rxdes *curr_des = &priv->rxdes[priv->rx_index];
    unsigned short rxlen;
-   ulong des_start = (ulong)curr_des;
+   ulong des_start = ((ulong)curr_des) & ~(ARCH_DMA_MINALIGN - 1);
    ulong des_end = des_start +
        roundup(sizeof(*curr_des), ARCH_DMA_MINALIGN);
    ulong data_start = curr_des->rxdes3;
@@ -435,7 +435,7 @@ static int ftgmac100_recv(struct udevice *dev, int flags, uchar **packetp)
 static u32 ftgmac100_read_txdesc(const void *desc)
 {
    const struct ftgmac100_txdes *txdes = desc;
-   ulong des_start = (ulong)txdes;
+   ulong des_start = ((ulong)txdes) & ~(ARCH_DMA_MINALIGN - 1);
    ulong des_end = des_start + roundup(sizeof(*txdes), ARCH_DMA_MINALIGN);

    invalidate_dcache_range(des_start, des_end);
@@ -453,7 +453,7 @@ static int ftgmac100_send(struct udevice *dev, void *packet, int length)
    struct ftgmac100_data *priv = dev_get_priv(dev);
    struct ftgmac100 *ftgmac100 = priv->iobase;
    struct ftgmac100_txdes *curr_des = &priv->txdes[priv->tx_index];
-   ulong des_start = (ulong)curr_des;
+   ulong des_start = ((ulong)curr_des) & ~(ARCH_DMA_MINALIGN - 1);
    ulong des_end = des_start +
        roundup(sizeof(*curr_des), ARCH_DMA_MINALIGN);
    ulong data_start;
-- 
2.21.0
shenki commented 5 years ago

Thanks, this looks good to me. The fix is on the list and is reviewed https://patchwork.ozlabs.org/patch/1202027/