clear-pkgs-linux-iot-lts2018/0739-Fix-iommu-dma-memory-m...

136 lines
4.5 KiB
Diff

From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: "Lee, Keerock" <keerock.lee@intel.com>
Date: Thu, 6 Dec 2018 19:12:15 +0000
Subject: [PATCH] Fix iommu dma memory mapping failure
Direction bit during dma mapping is not set properly under
iommu enabled and caused below error
DMAR: [DMA Read] Request device [06:00.0] fault addr ffxxxxxx
[fault reason 06] PTE Read access is not set
switched direction from DMA_FROM_DEVICE into DMA_BIDIRECTIONAL
Tracked-On: PKT-1588
Change-Id: I8c05cc3f2a706ac8191a8bb92f00437a3db75879
Signed-off-by: Keerock Lee <keerock.lee@intel.com>
---
drivers/staging/igb_avb/igb_main.c | 24 ++++++++++++------------
1 file changed, 12 insertions(+), 12 deletions(-)
diff --git a/drivers/staging/igb_avb/igb_main.c b/drivers/staging/igb_avb/igb_main.c
index ef1b3adcde3d..70219b0a2cd9 100644
--- a/drivers/staging/igb_avb/igb_main.c
+++ b/drivers/staging/igb_avb/igb_main.c
@@ -4297,7 +4297,7 @@ void igb_clean_rx_ring(struct igb_ring *rx_ring)
dma_unmap_single(rx_ring->dev,
buffer_info->dma,
rx_ring->rx_buffer_len,
- DMA_FROM_DEVICE);
+ DMA_BIDIRECTIONAL);
buffer_info->dma = 0;
}
@@ -4312,7 +4312,7 @@ void igb_clean_rx_ring(struct igb_ring *rx_ring)
dma_unmap_page(rx_ring->dev,
buffer_info->dma,
PAGE_SIZE,
- DMA_FROM_DEVICE);
+ DMA_BIDIRECTIONAL);
__free_page(buffer_info->page);
buffer_info->page = NULL;
@@ -7517,7 +7517,7 @@ static void igb_reuse_rx_page(struct igb_ring *rx_ring,
dma_sync_single_range_for_device(rx_ring->dev, old_buff->dma,
old_buff->page_offset,
IGB_RX_BUFSZ,
- DMA_FROM_DEVICE);
+ DMA_BIDIRECTIONAL);
}
static bool igb_can_reuse_rx_page(struct igb_rx_buffer *rx_buffer,
@@ -7649,7 +7649,7 @@ static struct sk_buff *igb_fetch_rx_buffer(struct igb_ring *rx_ring,
rx_buffer->dma,
rx_buffer->page_offset,
IGB_RX_BUFSZ,
- DMA_FROM_DEVICE);
+ DMA_BIDIRECTIONAL);
/* pull page into skb */
if (igb_add_rx_frag(rx_ring, rx_buffer, rx_desc, skb)) {
@@ -7658,7 +7658,7 @@ static struct sk_buff *igb_fetch_rx_buffer(struct igb_ring *rx_ring,
} else {
/* we are not reusing the buffer so unmap it */
dma_unmap_page(rx_ring->dev, rx_buffer->dma,
- PAGE_SIZE, DMA_FROM_DEVICE);
+ PAGE_SIZE, DMA_BIDIRECTIONAL);
}
/* clear contents of rx_buffer */
@@ -8333,7 +8333,7 @@ static bool igb_clean_rx_irq(struct igb_q_vector *q_vector, int budget)
dma_unmap_single(rx_ring->dev, rx_buffer->dma,
rx_ring->rx_buffer_len,
- DMA_FROM_DEVICE);
+ DMA_BIDIRECTIONAL);
rx_buffer->dma = 0;
if (igb_test_staterr(rx_desc,
@@ -8719,7 +8719,7 @@ static bool igb_alloc_mapped_skb(struct igb_ring *rx_ring,
}
dma = dma_map_single(rx_ring->dev, skb->data,
- rx_ring->rx_buffer_len, DMA_FROM_DEVICE);
+ rx_ring->rx_buffer_len, DMA_BIDIRECTIONAL);
/* if mapping failed free memory back to system since
* there isn't much point in holding memory we can't use
@@ -8755,7 +8755,7 @@ static bool igb_alloc_mapped_page(struct igb_ring *rx_ring,
}
/* map page for use */
- dma = dma_map_page(rx_ring->dev, page, 0, PAGE_SIZE, DMA_FROM_DEVICE);
+ dma = dma_map_page(rx_ring->dev, page, 0, PAGE_SIZE, DMA_BIDIRECTIONAL);
/*
* if mapping failed free memory back to system since
@@ -10438,7 +10438,7 @@ static long igb_mapbuf_user(struct file *file, void __user *arg, int ring)
}
page_dma = dma_map_page(pci_dev_to_dev(adapter->pdev), page,
- 0, PAGE_SIZE, DMA_FROM_DEVICE);
+ 0, PAGE_SIZE, DMA_BIDIRECTIONAL);
if (dma_mapping_error(pci_dev_to_dev(adapter->pdev), page_dma)) {
err = -ENOMEM;
@@ -10467,7 +10467,7 @@ static long igb_mapbuf_user(struct file *file, void __user *arg, int ring)
copy_failed:
dma_unmap_page(pci_dev_to_dev(adapter->pdev),
userpage->page_dma, PAGE_SIZE,
- DMA_FROM_DEVICE);
+ DMA_BIDIRECTIONAL);
map_failed:
put_page(userpage->page);
page_failed:
@@ -10693,7 +10693,7 @@ static long igb_unmapbuf(struct file *file, void __user *arg, int ring)
dma_unmap_page(pci_dev_to_dev(adapter->pdev),
userpage->page_dma,
PAGE_SIZE,
- DMA_FROM_DEVICE);
+ DMA_BIDIRECTIONAL);
put_page(userpage->page);
@@ -10801,7 +10801,7 @@ static int igb_close_file(struct inode *inode, struct file *file)
dma_unmap_page(pci_dev_to_dev(adapter->pdev),
userpage->page_dma,
PAGE_SIZE,
- DMA_FROM_DEVICE);
+ DMA_BIDIRECTIONAL);
put_page(userpage->page);
--
https://clearlinux.org