stmmac: add mixed burst for DMA
In mixed burst (MB) mode, the AHB master always initiates the bursts with fixed-size when the DMA requests transfers of size less than or equal to 16 beats. This patch adds the MB support and the flag that can be passed from the platform to select it. MB mode can also give some benefits in terms of performances on some platforms. v2: fixed Coding Style Signed-off-by: Giuseppe Cavallaro <peppe.cavallaro@st.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
cffb13f4d6
commit
b9cde0a8be
|
@ -247,8 +247,8 @@ struct stmmac_desc_ops {
|
||||||
|
|
||||||
struct stmmac_dma_ops {
|
struct stmmac_dma_ops {
|
||||||
/* DMA core initialization */
|
/* DMA core initialization */
|
||||||
int (*init) (void __iomem *ioaddr, int pbl, int fb, int burst_len,
|
int (*init) (void __iomem *ioaddr, int pbl, int fb, int mb,
|
||||||
u32 dma_tx, u32 dma_rx);
|
int burst_len, u32 dma_tx, u32 dma_rx);
|
||||||
/* Dump DMA registers */
|
/* Dump DMA registers */
|
||||||
void (*dump_regs) (void __iomem *ioaddr);
|
void (*dump_regs) (void __iomem *ioaddr);
|
||||||
/* Set tx/rx threshold in the csr6 register
|
/* Set tx/rx threshold in the csr6 register
|
||||||
|
|
|
@ -141,6 +141,7 @@ enum rx_tx_priority_ratio {
|
||||||
};
|
};
|
||||||
|
|
||||||
#define DMA_BUS_MODE_FB 0x00010000 /* Fixed burst */
|
#define DMA_BUS_MODE_FB 0x00010000 /* Fixed burst */
|
||||||
|
#define DMA_BUS_MODE_MB 0x04000000 /* Mixed burst */
|
||||||
#define DMA_BUS_MODE_RPBL_MASK 0x003e0000 /* Rx-Programmable Burst Len */
|
#define DMA_BUS_MODE_RPBL_MASK 0x003e0000 /* Rx-Programmable Burst Len */
|
||||||
#define DMA_BUS_MODE_RPBL_SHIFT 17
|
#define DMA_BUS_MODE_RPBL_SHIFT 17
|
||||||
#define DMA_BUS_MODE_USP 0x00800000
|
#define DMA_BUS_MODE_USP 0x00800000
|
||||||
|
|
|
@ -31,7 +31,7 @@
|
||||||
#include "dwmac_dma.h"
|
#include "dwmac_dma.h"
|
||||||
|
|
||||||
static int dwmac1000_dma_init(void __iomem *ioaddr, int pbl, int fb,
|
static int dwmac1000_dma_init(void __iomem *ioaddr, int pbl, int fb,
|
||||||
int burst_len, u32 dma_tx, u32 dma_rx)
|
int mb, int burst_len, u32 dma_tx, u32 dma_rx)
|
||||||
{
|
{
|
||||||
u32 value = readl(ioaddr + DMA_BUS_MODE);
|
u32 value = readl(ioaddr + DMA_BUS_MODE);
|
||||||
int limit;
|
int limit;
|
||||||
|
@ -66,6 +66,10 @@ static int dwmac1000_dma_init(void __iomem *ioaddr, int pbl, int fb,
|
||||||
if (fb)
|
if (fb)
|
||||||
value |= DMA_BUS_MODE_FB;
|
value |= DMA_BUS_MODE_FB;
|
||||||
|
|
||||||
|
/* Mixed Burst has no effect when fb is set */
|
||||||
|
if (mb)
|
||||||
|
value |= DMA_BUS_MODE_MB;
|
||||||
|
|
||||||
#ifdef CONFIG_STMMAC_DA
|
#ifdef CONFIG_STMMAC_DA
|
||||||
value |= DMA_BUS_MODE_DA; /* Rx has priority over tx */
|
value |= DMA_BUS_MODE_DA; /* Rx has priority over tx */
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -33,7 +33,7 @@
|
||||||
#include "dwmac_dma.h"
|
#include "dwmac_dma.h"
|
||||||
|
|
||||||
static int dwmac100_dma_init(void __iomem *ioaddr, int pbl, int fb,
|
static int dwmac100_dma_init(void __iomem *ioaddr, int pbl, int fb,
|
||||||
int burst_len, u32 dma_tx, u32 dma_rx)
|
int mb, int burst_len, u32 dma_tx, u32 dma_rx)
|
||||||
{
|
{
|
||||||
u32 value = readl(ioaddr + DMA_BUS_MODE);
|
u32 value = readl(ioaddr + DMA_BUS_MODE);
|
||||||
int limit;
|
int limit;
|
||||||
|
|
|
@ -925,6 +925,7 @@ static void stmmac_check_ether_addr(struct stmmac_priv *priv)
|
||||||
static int stmmac_init_dma_engine(struct stmmac_priv *priv)
|
static int stmmac_init_dma_engine(struct stmmac_priv *priv)
|
||||||
{
|
{
|
||||||
int pbl = DEFAULT_DMA_PBL, fixed_burst = 0, burst_len = 0;
|
int pbl = DEFAULT_DMA_PBL, fixed_burst = 0, burst_len = 0;
|
||||||
|
int mixed_burst = 0;
|
||||||
|
|
||||||
/* Some DMA parameters can be passed from the platform;
|
/* Some DMA parameters can be passed from the platform;
|
||||||
* in case of these are not passed we keep a default
|
* in case of these are not passed we keep a default
|
||||||
|
@ -932,10 +933,11 @@ static int stmmac_init_dma_engine(struct stmmac_priv *priv)
|
||||||
if (priv->plat->dma_cfg) {
|
if (priv->plat->dma_cfg) {
|
||||||
pbl = priv->plat->dma_cfg->pbl;
|
pbl = priv->plat->dma_cfg->pbl;
|
||||||
fixed_burst = priv->plat->dma_cfg->fixed_burst;
|
fixed_burst = priv->plat->dma_cfg->fixed_burst;
|
||||||
|
mixed_burst = priv->plat->dma_cfg->mixed_burst;
|
||||||
burst_len = priv->plat->dma_cfg->burst_len;
|
burst_len = priv->plat->dma_cfg->burst_len;
|
||||||
}
|
}
|
||||||
|
|
||||||
return priv->hw->dma->init(priv->ioaddr, pbl, fixed_burst,
|
return priv->hw->dma->init(priv->ioaddr, pbl, fixed_burst, mixed_burst,
|
||||||
burst_len, priv->dma_tx_phy,
|
burst_len, priv->dma_tx_phy,
|
||||||
priv->dma_rx_phy);
|
priv->dma_rx_phy);
|
||||||
}
|
}
|
||||||
|
|
|
@ -86,6 +86,7 @@ struct stmmac_mdio_bus_data {
|
||||||
struct stmmac_dma_cfg {
|
struct stmmac_dma_cfg {
|
||||||
int pbl;
|
int pbl;
|
||||||
int fixed_burst;
|
int fixed_burst;
|
||||||
|
int mixed_burst;
|
||||||
int burst_len;
|
int burst_len;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue