aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/layerscape/patches-5.4/701-net-0094-dpaa_eth-fix-iova-handling-for-sg-frames.patch
diff options
context:
space:
mode:
authorYangbo Lu <yangbo.lu@nxp.com>2020-04-10 10:47:05 +0800
committerPetr Štetiar <ynezz@true.cz>2020-05-07 12:53:06 +0200
commitcddd4591404fb4c53dc0b3c0b15b942cdbed4356 (patch)
tree392c1179de46b0f804e3789edca19069b64e6b44 /target/linux/layerscape/patches-5.4/701-net-0094-dpaa_eth-fix-iova-handling-for-sg-frames.patch
parentd1d2c0b5579ea4f69a42246c9318539d61ba1999 (diff)
downloadupstream-cddd4591404fb4c53dc0b3c0b15b942cdbed4356.tar.gz
upstream-cddd4591404fb4c53dc0b3c0b15b942cdbed4356.tar.bz2
upstream-cddd4591404fb4c53dc0b3c0b15b942cdbed4356.zip
layerscape: add patches-5.4
Add patches for linux-5.4. The patches are from NXP LSDK-20.04 release which was tagged LSDK-20.04-V5.4. https://source.codeaurora.org/external/qoriq/qoriq-components/linux/ For boards LS1021A-IOT, and Traverse-LS1043 which are not involved in LSDK, port the dts patches from 4.14. The patches are sorted into the following categories: 301-arch-xxxx 302-dts-xxxx 303-core-xxxx 701-net-xxxx 801-audio-xxxx 802-can-xxxx 803-clock-xxxx 804-crypto-xxxx 805-display-xxxx 806-dma-xxxx 807-gpio-xxxx 808-i2c-xxxx 809-jailhouse-xxxx 810-keys-xxxx 811-kvm-xxxx 812-pcie-xxxx 813-pm-xxxx 814-qe-xxxx 815-sata-xxxx 816-sdhc-xxxx 817-spi-xxxx 818-thermal-xxxx 819-uart-xxxx 820-usb-xxxx 821-vfio-xxxx Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
Diffstat (limited to 'target/linux/layerscape/patches-5.4/701-net-0094-dpaa_eth-fix-iova-handling-for-sg-frames.patch')
-rw-r--r--target/linux/layerscape/patches-5.4/701-net-0094-dpaa_eth-fix-iova-handling-for-sg-frames.patch126
1 files changed, 126 insertions, 0 deletions
diff --git a/target/linux/layerscape/patches-5.4/701-net-0094-dpaa_eth-fix-iova-handling-for-sg-frames.patch b/target/linux/layerscape/patches-5.4/701-net-0094-dpaa_eth-fix-iova-handling-for-sg-frames.patch
new file mode 100644
index 0000000000..273d7e5ea8
--- /dev/null
+++ b/target/linux/layerscape/patches-5.4/701-net-0094-dpaa_eth-fix-iova-handling-for-sg-frames.patch
@@ -0,0 +1,126 @@
+From 73cc32aace5fe123182337c3abd769a1d6edd9fe Mon Sep 17 00:00:00 2001
+From: Laurentiu Tudor <laurentiu.tudor@nxp.com>
+Date: Wed, 4 Apr 2018 15:12:28 +0300
+Subject: [PATCH] dpaa_eth: fix iova handling for sg frames
+
+The driver relies on the no longer valid assumption that dma addresses
+(iovas) are identical to physical addressees and uses phys_to_virt() to
+make iova -> vaddr conversions. Fix this also for scatter-gather frames
+using the iova -> phys conversion function added in the previous patch.
+While at it, clean-up a redundant dpaa_bpid2pool() and pass the bp
+as parameter.
+
+Signed-off-by: Laurentiu Tudor <laurentiu.tudor@nxp.com>
+Acked-by: Madalin Bucur <madalin.bucur@nxp.com>
+[rebase]
+Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
+---
+ drivers/net/ethernet/freescale/dpaa/dpaa_eth.c | 41 +++++++++++++++-----------
+ 1 file changed, 24 insertions(+), 17 deletions(-)
+
+--- a/drivers/net/ethernet/freescale/dpaa/dpaa_eth.c
++++ b/drivers/net/ethernet/freescale/dpaa/dpaa_eth.c
+@@ -1656,14 +1656,17 @@ static struct sk_buff *dpaa_cleanup_tx_f
+
+ if (unlikely(qm_fd_get_format(fd) == qm_fd_sg)) {
+ nr_frags = skb_shinfo(skb)->nr_frags;
+- dma_unmap_single(dev, addr,
+- qm_fd_get_offset(fd) + DPAA_SGT_SIZE,
+- dma_dir);
+
+ /* The sgt buffer has been allocated with netdev_alloc_frag(),
+ * it's from lowmem.
+ */
+- sgt = phys_to_virt(addr + qm_fd_get_offset(fd));
++ sgt = phys_to_virt(dpaa_iova_to_phys(dev,
++ addr +
++ qm_fd_get_offset(fd)));
++
++ dma_unmap_single(dev, addr,
++ qm_fd_get_offset(fd) + DPAA_SGT_SIZE,
++ dma_dir);
+
+ /* sgt[0] is from lowmem, was dma_map_single()-ed */
+ dma_unmap_single(dev, qm_sg_addr(&sgt[0]),
+@@ -1702,7 +1705,7 @@ static struct sk_buff *dpaa_cleanup_tx_f
+ else
+ #endif
+ /* Free the page frag that we allocated on Tx */
+- skb_free_frag(phys_to_virt(addr));
++ skb_free_frag(phys_to_virt(skbh));
+ }
+
+ return skb;
+@@ -1760,14 +1763,14 @@ static struct sk_buff *contig_fd_to_skb(
+ * The page fragment holding the S/G Table is recycled here.
+ */
+ static struct sk_buff *sg_fd_to_skb(const struct dpaa_priv *priv,
+- const struct qm_fd *fd)
++ const struct qm_fd *fd,
++ struct dpaa_bp *dpaa_bp,
++ void *vaddr)
+ {
+ ssize_t fd_off = qm_fd_get_offset(fd);
+- dma_addr_t addr = qm_fd_addr(fd);
+ const struct qm_sg_entry *sgt;
+ struct page *page, *head_page;
+- struct dpaa_bp *dpaa_bp;
+- void *vaddr, *sg_vaddr;
++ void *sg_vaddr;
+ int frag_off, frag_len;
+ struct sk_buff *skb;
+ dma_addr_t sg_addr;
+@@ -1776,7 +1779,6 @@ static struct sk_buff *sg_fd_to_skb(cons
+ int *count_ptr;
+ int i;
+
+- vaddr = phys_to_virt(addr);
+ WARN_ON(!IS_ALIGNED((unsigned long)vaddr, SMP_CACHE_BYTES));
+
+ /* Iterate through the SGT entries and add data buffers to the skb */
+@@ -1787,14 +1789,18 @@ static struct sk_buff *sg_fd_to_skb(cons
+ WARN_ON(qm_sg_entry_is_ext(&sgt[i]));
+
+ sg_addr = qm_sg_addr(&sgt[i]);
+- sg_vaddr = phys_to_virt(sg_addr);
+- WARN_ON(!IS_ALIGNED((unsigned long)sg_vaddr,
+- SMP_CACHE_BYTES));
+
+ /* We may use multiple Rx pools */
+ dpaa_bp = dpaa_bpid2pool(sgt[i].bpid);
+- if (!dpaa_bp)
++ if (!dpaa_bp) {
++ pr_info("%s: fail to get dpaa_bp for sg bpid %d\n",
++ __func__, sgt[i].bpid);
+ goto free_buffers;
++ }
++ sg_vaddr = phys_to_virt(dpaa_iova_to_phys(dpaa_bp->dev,
++ sg_addr));
++ WARN_ON(!IS_ALIGNED((unsigned long)sg_vaddr,
++ SMP_CACHE_BYTES));
+
+ count_ptr = this_cpu_ptr(dpaa_bp->percpu_count);
+ dma_unmap_single(dpaa_bp->dev, sg_addr, dpaa_bp->size,
+@@ -1866,10 +1872,11 @@ free_buffers:
+ /* free all the SG entries */
+ for (i = 0; i < DPAA_SGT_MAX_ENTRIES ; i++) {
+ sg_addr = qm_sg_addr(&sgt[i]);
+- sg_vaddr = phys_to_virt(sg_addr);
+- skb_free_frag(sg_vaddr);
+ dpaa_bp = dpaa_bpid2pool(sgt[i].bpid);
+ if (dpaa_bp) {
++ sg_addr = dpaa_iova_to_phys(dpaa_bp->dev, sg_addr);
++ sg_vaddr = phys_to_virt(sg_addr);
++ skb_free_frag(sg_vaddr);
+ count_ptr = this_cpu_ptr(dpaa_bp->percpu_count);
+ (*count_ptr)--;
+ }
+@@ -2498,7 +2505,7 @@ static enum qman_cb_dqrr_result rx_defau
+ if (likely(fd_format == qm_fd_contig))
+ skb = contig_fd_to_skb(priv, fd, dpaa_bp, vaddr);
+ else
+- skb = sg_fd_to_skb(priv, fd);
++ skb = sg_fd_to_skb(priv, fd, dpaa_bp, vaddr);
+ if (!skb)
+ return qman_cb_dqrr_consume;
+