From c13205f6916544c6f8bb2ade7ed5f2959ae6f173 Mon Sep 17 00:00:00 2001 From: Daniel Hellstrom Date: Fri, 26 Apr 2019 15:18:11 +0200 Subject: leon,greth: added support for variable sized descriptor table sizes The descriptor table size is equal to its alignment and set when configuring the HW IP through VHDL generics. This SW patch simply probes the HW how large the RX/TX descriptor tables are and adjusts accordingly. The number of descriptors actual used are controlled by other settings (rxDescs and txDescs) controlled by the user. Update #4308. --- bsps/include/grlib/greth.h | 1 + bsps/shared/grlib/net/greth.c | 22 +++++++++++++++------- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/bsps/include/grlib/greth.h b/bsps/include/grlib/greth.h index 1c42c99ddc..e7970a79f7 100644 --- a/bsps/include/grlib/greth.h +++ b/bsps/include/grlib/greth.h @@ -100,6 +100,7 @@ typedef struct _greth_regs { #define GRETH_STATUS_TXIRQ 0x00000008 /* Transmit Error IRQ */ #define GRETH_STATUS_RXAHBERR 0x00000010 /* Receiver AHB Error */ #define GRETH_STATUS_TXAHBERR 0x00000020 /* Transmitter AHB Error */ +#define GRETH_STATUS_NRD 0x0f000000 /* Number of descriptors */ /* MDIO Control */ #define GRETH_MDIO_WRITE 0x00000001 /* MDIO Write */ diff --git a/bsps/shared/grlib/net/greth.c b/bsps/shared/grlib/net/greth.c index bc4d3cc40f..09cfb325ba 100644 --- a/bsps/shared/grlib/net/greth.c +++ b/bsps/shared/grlib/net/greth.c @@ -186,6 +186,7 @@ struct greth_softc unsigned int advmodes; /* advertise ethernet speed modes. 0 = all modes. */ struct timespec auto_neg_time; int mc_available; + int num_descs; /* * Statistics @@ -422,7 +423,7 @@ greth_initialize_hardware (struct greth_softc *sc) int tmp2; struct timespec tstart, tnow; greth_regs *regs; - unsigned int advmodes, speed; + unsigned int advmodes, speed, tabsize; regs = sc->regs; @@ -616,8 +617,9 @@ auto_neg_done: /* Initialize rx/tx descriptor table pointers. Due to alignment we * always allocate maximum table size. */ - sc->txdesc = (greth_rxtxdesc *) almalloc(0x800, 0x400); - sc->rxdesc = (greth_rxtxdesc *) &sc->txdesc[128]; + tabsize = sc->num_descs * 8; + sc->txdesc = (greth_rxtxdesc *) almalloc(tabsize * 2, tabsize); + sc->rxdesc = (greth_rxtxdesc *) (tabsize + (void *)sc->txdesc); sc->tx_ptr = 0; sc->tx_dptr = 0; sc->tx_cnt = 0; @@ -631,8 +633,8 @@ auto_neg_done: CPUMEM_TO_DMA, (void *)sc->txdesc, (void **)&sc->txdesc_remote, - 0x800); - sc->rxdesc_remote = sc->txdesc_remote + 0x400; + tabsize * 2); + sc->rxdesc_remote = sc->txdesc_remote + tabsize; regs->txdesc = (int) sc->txdesc_remote; regs->rxdesc = (int) sc->rxdesc_remote; @@ -1555,6 +1557,7 @@ int greth_device_init(struct greth_softc *sc) struct ambapp_core *pnpinfo; union drvmgr_key_value *value; unsigned int speed; + int i, nrd; /* Get device information from AMBA PnP information */ ambadev = (struct amba_dev_info *)sc->dev->businfo; @@ -1608,12 +1611,17 @@ int greth_device_init(struct greth_softc *sc) sc->rxbufs = 32; sc->phyaddr = -1; + /* Probe the number of descriptors available the */ + nrd = (sc->regs->status & GRETH_STATUS_NRD) >> 24; + for (sc->num_descs = 128, i = 0; i < nrd; i++) + sc->num_descs = sc->num_descs * 2; + value = drvmgr_dev_key_get(sc->dev, "txDescs", DRVMGR_KT_INT); - if ( value && (value->i <= 128) ) + if ( value && (value->i <= sc->num_descs) ) sc->txbufs = value->i; value = drvmgr_dev_key_get(sc->dev, "rxDescs", DRVMGR_KT_INT); - if ( value && (value->i <= 128) ) + if ( value && (value->i <= sc->num_descs) ) sc->rxbufs = value->i; value = drvmgr_dev_key_get(sc->dev, "phyAdr", DRVMGR_KT_INT); -- cgit v1.2.3