Commit 5fff0151 authored by Andre Przywara's avatar Andre Przywara Committed by David S. Miller

net: axienet: Allow DMA to beyond 4GB

With all DMA address accesses wrapped, we can actually support 64-bit
DMA if this option was chosen at IP integration time.
If the IP has been configured for an address width greater than 32 bits,
we assume the full 64 bit DMA width is working. In practise this will be
limited by the actual system address bus width, which will ideally be the
same as the DMA IP address width.
If this is not the case, the actual width can still be configured using a
dma-ranges property in the parent of the MAC node.

This increases the DMA mask on those systems to let the kernel choose
buffers from memory at higher addresses.
Signed-off-by: default avatarAndre Przywara <andre.przywara@arm.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent f735c40e
...@@ -1780,6 +1780,7 @@ static int axienet_probe(struct platform_device *pdev) ...@@ -1780,6 +1780,7 @@ static int axienet_probe(struct platform_device *pdev)
struct net_device *ndev; struct net_device *ndev;
const void *mac_addr; const void *mac_addr;
struct resource *ethres; struct resource *ethres;
int addr_width = 32;
u32 value; u32 value;
ndev = alloc_etherdev(sizeof(*lp)); ndev = alloc_etherdev(sizeof(*lp));
...@@ -1947,6 +1948,7 @@ static int axienet_probe(struct platform_device *pdev) ...@@ -1947,6 +1948,7 @@ static int axienet_probe(struct platform_device *pdev)
iowrite32(0xffffffff, desc); iowrite32(0xffffffff, desc);
if (ioread32(desc) > 0) { if (ioread32(desc) > 0) {
lp->features |= XAE_FEATURE_DMA_64BIT; lp->features |= XAE_FEATURE_DMA_64BIT;
addr_width = 64;
dev_info(&pdev->dev, dev_info(&pdev->dev,
"autodetected 64-bit DMA range\n"); "autodetected 64-bit DMA range\n");
} }
...@@ -1954,6 +1956,12 @@ static int axienet_probe(struct platform_device *pdev) ...@@ -1954,6 +1956,12 @@ static int axienet_probe(struct platform_device *pdev)
} }
} }
ret = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(addr_width));
if (ret) {
dev_err(&pdev->dev, "No suitable DMA available\n");
goto free_netdev;
}
/* Check for Ethernet core IRQ (optional) */ /* Check for Ethernet core IRQ (optional) */
if (lp->eth_irq <= 0) if (lp->eth_irq <= 0)
dev_info(&pdev->dev, "Ethernet core IRQ not defined\n"); dev_info(&pdev->dev, "Ethernet core IRQ not defined\n");
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment