amd-xgbe: Base AXI DMA cache settings on device tree
The default cache operations for ARM64 were changed during 3.15. To use coherent operations a "dma-coherent" device tree property is required. If that property is not present in the device tree node then the non-coherent operations are assigned for the device. Add support to the amd-xgbe driver to assign the AXI DMA cache settings based on whether the "dma-coherent" property is present in the device node. If present, use settings that work with the caches. If not present, use settings that do not look at the caches. Signed-off-by: Tom Lendacky <thomas.lendacky@amd.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:

committed by
David S. Miller

parent
9867e8fb2c
commit
cfa50c7811
@@ -1455,23 +1455,23 @@ static void xgbe_config_dma_cache(struct xgbe_prv_data *pdata)
|
|||||||
unsigned int arcache, awcache;
|
unsigned int arcache, awcache;
|
||||||
|
|
||||||
arcache = 0;
|
arcache = 0;
|
||||||
XGMAC_SET_BITS(arcache, DMA_AXIARCR, DRC, XGBE_DMA_ARCACHE);
|
XGMAC_SET_BITS(arcache, DMA_AXIARCR, DRC, pdata->arcache);
|
||||||
XGMAC_SET_BITS(arcache, DMA_AXIARCR, DRD, XGBE_DMA_ARDOMAIN);
|
XGMAC_SET_BITS(arcache, DMA_AXIARCR, DRD, pdata->axdomain);
|
||||||
XGMAC_SET_BITS(arcache, DMA_AXIARCR, TEC, XGBE_DMA_ARCACHE);
|
XGMAC_SET_BITS(arcache, DMA_AXIARCR, TEC, pdata->arcache);
|
||||||
XGMAC_SET_BITS(arcache, DMA_AXIARCR, TED, XGBE_DMA_ARDOMAIN);
|
XGMAC_SET_BITS(arcache, DMA_AXIARCR, TED, pdata->axdomain);
|
||||||
XGMAC_SET_BITS(arcache, DMA_AXIARCR, THC, XGBE_DMA_ARCACHE);
|
XGMAC_SET_BITS(arcache, DMA_AXIARCR, THC, pdata->arcache);
|
||||||
XGMAC_SET_BITS(arcache, DMA_AXIARCR, THD, XGBE_DMA_ARDOMAIN);
|
XGMAC_SET_BITS(arcache, DMA_AXIARCR, THD, pdata->axdomain);
|
||||||
XGMAC_IOWRITE(pdata, DMA_AXIARCR, arcache);
|
XGMAC_IOWRITE(pdata, DMA_AXIARCR, arcache);
|
||||||
|
|
||||||
awcache = 0;
|
awcache = 0;
|
||||||
XGMAC_SET_BITS(awcache, DMA_AXIAWCR, DWC, XGBE_DMA_AWCACHE);
|
XGMAC_SET_BITS(awcache, DMA_AXIAWCR, DWC, pdata->awcache);
|
||||||
XGMAC_SET_BITS(awcache, DMA_AXIAWCR, DWD, XGBE_DMA_AWDOMAIN);
|
XGMAC_SET_BITS(awcache, DMA_AXIAWCR, DWD, pdata->axdomain);
|
||||||
XGMAC_SET_BITS(awcache, DMA_AXIAWCR, RPC, XGBE_DMA_AWCACHE);
|
XGMAC_SET_BITS(awcache, DMA_AXIAWCR, RPC, pdata->awcache);
|
||||||
XGMAC_SET_BITS(awcache, DMA_AXIAWCR, RPD, XGBE_DMA_AWDOMAIN);
|
XGMAC_SET_BITS(awcache, DMA_AXIAWCR, RPD, pdata->axdomain);
|
||||||
XGMAC_SET_BITS(awcache, DMA_AXIAWCR, RHC, XGBE_DMA_AWCACHE);
|
XGMAC_SET_BITS(awcache, DMA_AXIAWCR, RHC, pdata->awcache);
|
||||||
XGMAC_SET_BITS(awcache, DMA_AXIAWCR, RHD, XGBE_DMA_AWDOMAIN);
|
XGMAC_SET_BITS(awcache, DMA_AXIAWCR, RHD, pdata->axdomain);
|
||||||
XGMAC_SET_BITS(awcache, DMA_AXIAWCR, TDC, XGBE_DMA_AWCACHE);
|
XGMAC_SET_BITS(awcache, DMA_AXIAWCR, TDC, pdata->awcache);
|
||||||
XGMAC_SET_BITS(awcache, DMA_AXIAWCR, TDD, XGBE_DMA_AWDOMAIN);
|
XGMAC_SET_BITS(awcache, DMA_AXIAWCR, TDD, pdata->axdomain);
|
||||||
XGMAC_IOWRITE(pdata, DMA_AXIAWCR, awcache);
|
XGMAC_IOWRITE(pdata, DMA_AXIAWCR, awcache);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -297,6 +297,16 @@ static int xgbe_probe(struct platform_device *pdev)
|
|||||||
*(dev->dma_mask) = DMA_BIT_MASK(40);
|
*(dev->dma_mask) = DMA_BIT_MASK(40);
|
||||||
dev->coherent_dma_mask = DMA_BIT_MASK(40);
|
dev->coherent_dma_mask = DMA_BIT_MASK(40);
|
||||||
|
|
||||||
|
if (of_property_read_bool(dev->of_node, "dma-coherent")) {
|
||||||
|
pdata->axdomain = XGBE_DMA_OS_AXDOMAIN;
|
||||||
|
pdata->arcache = XGBE_DMA_OS_ARCACHE;
|
||||||
|
pdata->awcache = XGBE_DMA_OS_AWCACHE;
|
||||||
|
} else {
|
||||||
|
pdata->axdomain = XGBE_DMA_SYS_AXDOMAIN;
|
||||||
|
pdata->arcache = XGBE_DMA_SYS_ARCACHE;
|
||||||
|
pdata->awcache = XGBE_DMA_SYS_AWCACHE;
|
||||||
|
}
|
||||||
|
|
||||||
ret = platform_get_irq(pdev, 0);
|
ret = platform_get_irq(pdev, 0);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
dev_err(dev, "platform_get_irq failed\n");
|
dev_err(dev, "platform_get_irq failed\n");
|
||||||
|
@@ -143,10 +143,14 @@
|
|||||||
#define XGBE_MAX_DMA_CHANNELS 16
|
#define XGBE_MAX_DMA_CHANNELS 16
|
||||||
|
|
||||||
/* DMA cache settings - Outer sharable, write-back, write-allocate */
|
/* DMA cache settings - Outer sharable, write-back, write-allocate */
|
||||||
#define XGBE_DMA_ARDOMAIN 0x2
|
#define XGBE_DMA_OS_AXDOMAIN 0x2
|
||||||
#define XGBE_DMA_ARCACHE 0xb
|
#define XGBE_DMA_OS_ARCACHE 0xb
|
||||||
#define XGBE_DMA_AWDOMAIN 0x2
|
#define XGBE_DMA_OS_AWCACHE 0xf
|
||||||
#define XGBE_DMA_AWCACHE 0xf
|
|
||||||
|
/* DMA cache settings - System, no caches used */
|
||||||
|
#define XGBE_DMA_SYS_AXDOMAIN 0x3
|
||||||
|
#define XGBE_DMA_SYS_ARCACHE 0x0
|
||||||
|
#define XGBE_DMA_SYS_AWCACHE 0x0
|
||||||
|
|
||||||
#define XGBE_DMA_INTERRUPT_MASK 0x31c7
|
#define XGBE_DMA_INTERRUPT_MASK 0x31c7
|
||||||
|
|
||||||
@@ -536,6 +540,11 @@ struct xgbe_prv_data {
|
|||||||
struct xgbe_hw_if hw_if;
|
struct xgbe_hw_if hw_if;
|
||||||
struct xgbe_desc_if desc_if;
|
struct xgbe_desc_if desc_if;
|
||||||
|
|
||||||
|
/* AXI DMA settings */
|
||||||
|
unsigned int axdomain;
|
||||||
|
unsigned int arcache;
|
||||||
|
unsigned int awcache;
|
||||||
|
|
||||||
/* Rings for Tx/Rx on a DMA channel */
|
/* Rings for Tx/Rx on a DMA channel */
|
||||||
struct xgbe_channel *channel;
|
struct xgbe_channel *channel;
|
||||||
unsigned int channel_count;
|
unsigned int channel_count;
|
||||||
|
Reference in New Issue
Block a user