[U-Boot] [PATCH 0/4] dma-mapping: Add cache flush/invalidation to dma_{un}map_single

Drivers (especially frameworks ported from Linux such as USB) expect dma_{un}map_single() APIs to take care of cache maintenance. But this is not the case in U-Boot and few drivers take care of flushing caches locally. Instead add flush/invalidate calls to DMA APIs in arch specific dma-mapping.h file so that per driver implementation of these APIs can be avoided.
I don't have all the affected hardwares. Would greatly appreciate if these patches work fine on the affected platforms.
Vignesh Raghavendra (4): asm: dma-mapping.h: Fix dma mapping functions mmc: tmio-common: Drop custom dma mapping functions mtd: denali: Drop custom dma mapping functions net: macb: Drop local cache flush
arch/arm/include/asm/dma-mapping.h | 22 ++++++++++++++++-- arch/nds32/include/asm/dma-mapping.h | 22 ++++++++++++++++-- arch/riscv/include/asm/dma-mapping.h | 22 ++++++++++++++++-- arch/x86/include/asm/dma-mapping.h | 22 ++++++++++++++++-- drivers/mmc/tmio-common.c | 25 +++----------------- drivers/mtd/nand/raw/denali.c | 34 +++------------------------- drivers/net/macb.c | 4 +--- 7 files changed, 87 insertions(+), 64 deletions(-)

Subsystems such as USB expect dma_map_single() and dma_unmap_single() to do dcache flush/invalidate operations as required. For example, see drivers/usb/gadget/udc/udc-core.c::usb_gadget_map_request(). Currently drivers do this locally, (see drivers/usb/dwc3/ep0.c, drivers/mtd/nand/raw/denali.c etc..) Update arch specific dma_map_single() and dma_unmap_single() APIs to do cache flush/invalidate operations, so that drivers need not implement them locally.
Signed-off-by: Vignesh Raghavendra vigneshr@ti.com --- arch/arm/include/asm/dma-mapping.h | 22 ++++++++++++++++++++-- arch/nds32/include/asm/dma-mapping.h | 22 ++++++++++++++++++++-- arch/riscv/include/asm/dma-mapping.h | 22 ++++++++++++++++++++-- arch/x86/include/asm/dma-mapping.h | 22 ++++++++++++++++++++-- 4 files changed, 80 insertions(+), 8 deletions(-)
diff --git a/arch/arm/include/asm/dma-mapping.h b/arch/arm/include/asm/dma-mapping.h index fc5b8f634d54..4b02320dfbd3 100644 --- a/arch/arm/include/asm/dma-mapping.h +++ b/arch/arm/include/asm/dma-mapping.h @@ -7,7 +7,10 @@ #ifndef __ASM_ARM_DMA_MAPPING_H #define __ASM_ARM_DMA_MAPPING_H
+#include <common.h> +#include <asm/cache.h> #include <linux/dma-direction.h> +#include <malloc.h>
#define dma_mapping_error(x, y) 0
@@ -25,12 +28,27 @@ static inline void dma_free_coherent(void *addr) static inline unsigned long dma_map_single(volatile void *vaddr, size_t len, enum dma_data_direction dir) { - return (unsigned long)vaddr; + unsigned long addr = (unsigned long)vaddr; + + len = ALIGN(len, ARCH_DMA_MINALIGN); + + if (dir == DMA_FROM_DEVICE) + invalidate_dcache_range(addr, addr + len); + else + flush_dcache_range(addr, addr + len); + + return addr; }
static inline void dma_unmap_single(volatile void *vaddr, size_t len, - unsigned long paddr) + enum dma_data_direction dir) { + unsigned long addr = (unsigned long)vaddr; + + len = ALIGN(len, ARCH_DMA_MINALIGN); + + if (dir != DMA_TO_DEVICE) + invalidate_dcache_range(addr, addr + len); }
#endif /* __ASM_ARM_DMA_MAPPING_H */ diff --git a/arch/nds32/include/asm/dma-mapping.h b/arch/nds32/include/asm/dma-mapping.h index e6808dc84089..33c4582f4614 100644 --- a/arch/nds32/include/asm/dma-mapping.h +++ b/arch/nds32/include/asm/dma-mapping.h @@ -6,7 +6,10 @@ #ifndef __ASM_NDS_DMA_MAPPING_H #define __ASM_NDS_DMA_MAPPING_H
+#include <common.h> +#include <asm/cache.h> #include <linux/dma-direction.h> +#include <malloc.h>
static void *dma_alloc_coherent(size_t len, unsigned long *handle) { @@ -17,12 +20,27 @@ static void *dma_alloc_coherent(size_t len, unsigned long *handle) static inline unsigned long dma_map_single(volatile void *vaddr, size_t len, enum dma_data_direction dir) { - return (unsigned long)vaddr; + unsigned long addr = (unsigned long)vaddr; + + len = ALIGN(len, ARCH_DMA_MINALIGN); + + if (dir == DMA_FROM_DEVICE) + invalidate_dcache_range(addr, addr + len); + else + flush_dcache_range(addr, addr + len); + + return addr; }
static inline void dma_unmap_single(volatile void *vaddr, size_t len, - unsigned long paddr) + enum dma_data_direction dir) { + unsigned long addr = (unsigned long)vaddr; + + len = ALIGN(len, ARCH_DMA_MINALIGN); + + if (dir != DMA_TO_DEVICE) + invalidate_dcache_range(addr, addr + len); }
#endif /* __ASM_NDS_DMA_MAPPING_H */ diff --git a/arch/riscv/include/asm/dma-mapping.h b/arch/riscv/include/asm/dma-mapping.h index 3d930c90eceb..01f8a9219a38 100644 --- a/arch/riscv/include/asm/dma-mapping.h +++ b/arch/riscv/include/asm/dma-mapping.h @@ -9,7 +9,10 @@ #ifndef __ASM_RISCV_DMA_MAPPING_H #define __ASM_RISCV_DMA_MAPPING_H
+#include <common.h> +#include <asm/cache.h> #include <linux/dma-direction.h> +#include <malloc.h>
#define dma_mapping_error(x, y) 0
@@ -27,12 +30,27 @@ static inline void dma_free_coherent(void *addr) static inline unsigned long dma_map_single(volatile void *vaddr, size_t len, enum dma_data_direction dir) { - return (unsigned long)vaddr; + unsigned long addr = (unsigned long)vaddr; + + len = ALIGN(len, ARCH_DMA_MINALIGN); + + if (dir == DMA_FROM_DEVICE) + invalidate_dcache_range(addr, addr + len); + else + flush_dcache_range(addr, addr + len); + + return addr; }
static inline void dma_unmap_single(volatile void *vaddr, size_t len, - unsigned long paddr) + enum dma_data_direction dir) { + unsigned long addr = (unsigned long)vaddr; + + len = ALIGN(len, ARCH_DMA_MINALIGN); + + if (dir != DMA_TO_DEVICE) + invalidate_dcache_range(addr, addr + len); }
#endif /* __ASM_RISCV_DMA_MAPPING_H */ diff --git a/arch/x86/include/asm/dma-mapping.h b/arch/x86/include/asm/dma-mapping.h index b353ff0bef59..c228f684665f 100644 --- a/arch/x86/include/asm/dma-mapping.h +++ b/arch/x86/include/asm/dma-mapping.h @@ -7,7 +7,10 @@ #ifndef __ASM_X86_DMA_MAPPING_H #define __ASM_X86_DMA_MAPPING_H
+#include <common.h> +#include <asm/cache.h> #include <linux/dma-direction.h> +#include <malloc.h>
#define dma_mapping_error(x, y) 0
@@ -25,12 +28,27 @@ static inline void dma_free_coherent(void *addr) static inline unsigned long dma_map_single(volatile void *vaddr, size_t len, enum dma_data_direction dir) { - return (unsigned long)vaddr; + unsigned long addr = (unsigned long)vaddr; + + len = ALIGN(len, ARCH_DMA_MINALIGN); + + if (dir == DMA_FROM_DEVICE) + invalidate_dcache_range(addr, addr + len); + else + flush_dcache_range(addr, addr + len); + + return addr; }
static inline void dma_unmap_single(volatile void *vaddr, size_t len, - unsigned long paddr) + enum dma_data_direction dir) { + unsigned long addr = (unsigned long)vaddr; + + len = ALIGN(len, ARCH_DMA_MINALIGN); + + if (dir != DMA_TO_DEVICE) + invalidate_dcache_range(addr, addr + len); }
#endif /* __ASM_X86_DMA_MAPPING_H */

On Fri, Nov 15, 2019 at 8:55 PM Vignesh Raghavendra vigneshr@ti.com wrote:
Subsystems such as USB expect dma_map_single() and dma_unmap_single() to do dcache flush/invalidate operations as required. For example, see drivers/usb/gadget/udc/udc-core.c::usb_gadget_map_request(). Currently drivers do this locally, (see drivers/usb/dwc3/ep0.c, drivers/mtd/nand/raw/denali.c etc..) Update arch specific dma_map_single() and dma_unmap_single() APIs to do cache flush/invalidate operations, so that drivers need not implement them locally.
Signed-off-by: Vignesh Raghavendra vigneshr@ti.com
Reviewed-by: Masahiro Yamada yamada.masahiro@socionext.com
arch/arm/include/asm/dma-mapping.h | 22 ++++++++++++++++++++-- arch/nds32/include/asm/dma-mapping.h | 22 ++++++++++++++++++++-- arch/riscv/include/asm/dma-mapping.h | 22 ++++++++++++++++++++-- arch/x86/include/asm/dma-mapping.h | 22 ++++++++++++++++++++-- 4 files changed, 80 insertions(+), 8 deletions(-)
diff --git a/arch/arm/include/asm/dma-mapping.h b/arch/arm/include/asm/dma-mapping.h index fc5b8f634d54..4b02320dfbd3 100644 --- a/arch/arm/include/asm/dma-mapping.h +++ b/arch/arm/include/asm/dma-mapping.h @@ -7,7 +7,10 @@ #ifndef __ASM_ARM_DMA_MAPPING_H #define __ASM_ARM_DMA_MAPPING_H
+#include <common.h> +#include <asm/cache.h> #include <linux/dma-direction.h> +#include <malloc.h>
#define dma_mapping_error(x, y) 0
@@ -25,12 +28,27 @@ static inline void dma_free_coherent(void *addr) static inline unsigned long dma_map_single(volatile void *vaddr, size_t len, enum dma_data_direction dir) {
return (unsigned long)vaddr;
unsigned long addr = (unsigned long)vaddr;
len = ALIGN(len, ARCH_DMA_MINALIGN);
if (dir == DMA_FROM_DEVICE)
invalidate_dcache_range(addr, addr + len);
else
flush_dcache_range(addr, addr + len);
return addr;
}
static inline void dma_unmap_single(volatile void *vaddr, size_t len,
unsigned long paddr)
enum dma_data_direction dir)
{
unsigned long addr = (unsigned long)vaddr;
len = ALIGN(len, ARCH_DMA_MINALIGN);
if (dir != DMA_TO_DEVICE)
invalidate_dcache_range(addr, addr + len);
}
#endif /* __ASM_ARM_DMA_MAPPING_H */ diff --git a/arch/nds32/include/asm/dma-mapping.h b/arch/nds32/include/asm/dma-mapping.h index e6808dc84089..33c4582f4614 100644 --- a/arch/nds32/include/asm/dma-mapping.h +++ b/arch/nds32/include/asm/dma-mapping.h @@ -6,7 +6,10 @@ #ifndef __ASM_NDS_DMA_MAPPING_H #define __ASM_NDS_DMA_MAPPING_H
+#include <common.h> +#include <asm/cache.h> #include <linux/dma-direction.h> +#include <malloc.h>
static void *dma_alloc_coherent(size_t len, unsigned long *handle) { @@ -17,12 +20,27 @@ static void *dma_alloc_coherent(size_t len, unsigned long *handle) static inline unsigned long dma_map_single(volatile void *vaddr, size_t len, enum dma_data_direction dir) {
return (unsigned long)vaddr;
unsigned long addr = (unsigned long)vaddr;
len = ALIGN(len, ARCH_DMA_MINALIGN);
if (dir == DMA_FROM_DEVICE)
invalidate_dcache_range(addr, addr + len);
else
flush_dcache_range(addr, addr + len);
return addr;
}
static inline void dma_unmap_single(volatile void *vaddr, size_t len,
unsigned long paddr)
enum dma_data_direction dir)
{
unsigned long addr = (unsigned long)vaddr;
len = ALIGN(len, ARCH_DMA_MINALIGN);
if (dir != DMA_TO_DEVICE)
invalidate_dcache_range(addr, addr + len);
}
#endif /* __ASM_NDS_DMA_MAPPING_H */ diff --git a/arch/riscv/include/asm/dma-mapping.h b/arch/riscv/include/asm/dma-mapping.h index 3d930c90eceb..01f8a9219a38 100644 --- a/arch/riscv/include/asm/dma-mapping.h +++ b/arch/riscv/include/asm/dma-mapping.h @@ -9,7 +9,10 @@ #ifndef __ASM_RISCV_DMA_MAPPING_H #define __ASM_RISCV_DMA_MAPPING_H
+#include <common.h> +#include <asm/cache.h> #include <linux/dma-direction.h> +#include <malloc.h>
#define dma_mapping_error(x, y) 0
@@ -27,12 +30,27 @@ static inline void dma_free_coherent(void *addr) static inline unsigned long dma_map_single(volatile void *vaddr, size_t len, enum dma_data_direction dir) {
return (unsigned long)vaddr;
unsigned long addr = (unsigned long)vaddr;
len = ALIGN(len, ARCH_DMA_MINALIGN);
if (dir == DMA_FROM_DEVICE)
invalidate_dcache_range(addr, addr + len);
else
flush_dcache_range(addr, addr + len);
return addr;
}
static inline void dma_unmap_single(volatile void *vaddr, size_t len,
unsigned long paddr)
enum dma_data_direction dir)
{
unsigned long addr = (unsigned long)vaddr;
len = ALIGN(len, ARCH_DMA_MINALIGN);
if (dir != DMA_TO_DEVICE)
invalidate_dcache_range(addr, addr + len);
}
#endif /* __ASM_RISCV_DMA_MAPPING_H */ diff --git a/arch/x86/include/asm/dma-mapping.h b/arch/x86/include/asm/dma-mapping.h index b353ff0bef59..c228f684665f 100644 --- a/arch/x86/include/asm/dma-mapping.h +++ b/arch/x86/include/asm/dma-mapping.h @@ -7,7 +7,10 @@ #ifndef __ASM_X86_DMA_MAPPING_H #define __ASM_X86_DMA_MAPPING_H
+#include <common.h> +#include <asm/cache.h> #include <linux/dma-direction.h> +#include <malloc.h>
#define dma_mapping_error(x, y) 0
@@ -25,12 +28,27 @@ static inline void dma_free_coherent(void *addr) static inline unsigned long dma_map_single(volatile void *vaddr, size_t len, enum dma_data_direction dir) {
return (unsigned long)vaddr;
unsigned long addr = (unsigned long)vaddr;
len = ALIGN(len, ARCH_DMA_MINALIGN);
if (dir == DMA_FROM_DEVICE)
invalidate_dcache_range(addr, addr + len);
else
flush_dcache_range(addr, addr + len);
return addr;
}
static inline void dma_unmap_single(volatile void *vaddr, size_t len,
unsigned long paddr)
enum dma_data_direction dir)
{
unsigned long addr = (unsigned long)vaddr;
len = ALIGN(len, ARCH_DMA_MINALIGN);
if (dir != DMA_TO_DEVICE)
invalidate_dcache_range(addr, addr + len);
}
#endif /* __ASM_X86_DMA_MAPPING_H */
2.24.0
U-Boot mailing list U-Boot@lists.denx.de https://lists.denx.de/listinfo/u-boot

On Fri, Nov 15, 2019 at 05:25:02PM +0530, Vignesh Raghavendra wrote:
Subsystems such as USB expect dma_map_single() and dma_unmap_single() to do dcache flush/invalidate operations as required. For example, see drivers/usb/gadget/udc/udc-core.c::usb_gadget_map_request(). Currently drivers do this locally, (see drivers/usb/dwc3/ep0.c, drivers/mtd/nand/raw/denali.c etc..) Update arch specific dma_map_single() and dma_unmap_single() APIs to do cache flush/invalidate operations, so that drivers need not implement them locally.
Signed-off-by: Vignesh Raghavendra vigneshr@ti.com Reviewed-by: Masahiro Yamada yamada.masahiro@socionext.com Reviewed-by: Rick Chen rick@andestech.com
arch/arm/include/asm/dma-mapping.h | 22 ++++++++++++++++++++-- arch/nds32/include/asm/dma-mapping.h | 22 ++++++++++++++++++++-- arch/riscv/include/asm/dma-mapping.h | 22 ++++++++++++++++++++-- arch/x86/include/asm/dma-mapping.h | 22 ++++++++++++++++++++-- 4 files changed, 80 insertions(+), 8 deletions(-)
This throws warnings on am335x_evm, please re-check and resubmit, thanks.

On 16/01/20 2:17 am, Tom Rini wrote:
On Fri, Nov 15, 2019 at 05:25:02PM +0530, Vignesh Raghavendra wrote:
Subsystems such as USB expect dma_map_single() and dma_unmap_single() to do dcache flush/invalidate operations as required. For example, see drivers/usb/gadget/udc/udc-core.c::usb_gadget_map_request(). Currently drivers do this locally, (see drivers/usb/dwc3/ep0.c, drivers/mtd/nand/raw/denali.c etc..) Update arch specific dma_map_single() and dma_unmap_single() APIs to do cache flush/invalidate operations, so that drivers need not implement them locally.
Signed-off-by: Vignesh Raghavendra vigneshr@ti.com Reviewed-by: Masahiro Yamada yamada.masahiro@socionext.com Reviewed-by: Rick Chen rick@andestech.com
arch/arm/include/asm/dma-mapping.h | 22 ++++++++++++++++++++-- arch/nds32/include/asm/dma-mapping.h | 22 ++++++++++++++++++++-- arch/riscv/include/asm/dma-mapping.h | 22 ++++++++++++++++++++-- arch/x86/include/asm/dma-mapping.h | 22 ++++++++++++++++++++-- 4 files changed, 80 insertions(+), 8 deletions(-)
This throws warnings on am335x_evm, please re-check and resubmit, thanks.
This is caused by recently merged changes in U-Boot tree. I have posted v2 with this issue fixed. Thanks!

Drop local dma_map_single() and dma_unmap_single() and use arch specific common implementation
Signed-off-by: Vignesh Raghavendra vigneshr@ti.com --- drivers/mmc/tmio-common.c | 25 +++---------------------- 1 file changed, 3 insertions(+), 22 deletions(-)
diff --git a/drivers/mmc/tmio-common.c b/drivers/mmc/tmio-common.c index 812205a21f6a..37c2b8555150 100644 --- a/drivers/mmc/tmio-common.c +++ b/drivers/mmc/tmio-common.c @@ -4,6 +4,7 @@ * Author: Masahiro Yamada yamada.masahiro@socionext.com */
+#include <asm/dma-mapping.h> #include <common.h> #include <clk.h> #include <fdtdec.h> @@ -75,26 +76,6 @@ void tmio_sd_writel(struct tmio_sd_priv *priv, writel(val, priv->regbase + reg); }
-static dma_addr_t __dma_map_single(void *ptr, size_t size, - enum dma_data_direction dir) -{ - unsigned long addr = (unsigned long)ptr; - - if (dir == DMA_FROM_DEVICE) - invalidate_dcache_range(addr, addr + size); - else - flush_dcache_range(addr, addr + size); - - return addr; -} - -static void __dma_unmap_single(dma_addr_t addr, size_t size, - enum dma_data_direction dir) -{ - if (dir != DMA_TO_DEVICE) - invalidate_dcache_range(addr, addr + size); -} - static int tmio_sd_check_error(struct udevice *dev, struct mmc_cmd *cmd) { struct tmio_sd_priv *priv = dev_get_priv(dev); @@ -361,7 +342,7 @@ static int tmio_sd_dma_xfer(struct udevice *dev, struct mmc_data *data)
tmio_sd_writel(priv, tmp, TMIO_SD_DMA_MODE);
- dma_addr = __dma_map_single(buf, len, dir); + dma_addr = dma_map_single(buf, len, dir);
tmio_sd_dma_start(priv, dma_addr);
@@ -370,7 +351,7 @@ static int tmio_sd_dma_xfer(struct udevice *dev, struct mmc_data *data) if (poll_flag == TMIO_SD_DMA_INFO1_END_RD) udelay(1);
- __dma_unmap_single(dma_addr, len, dir); + dma_unmap_single(buf, len, dir);
return ret; }

On Fri, Nov 15, 2019 at 8:56 PM Vignesh Raghavendra vigneshr@ti.com wrote:
Drop local dma_map_single() and dma_unmap_single() and use arch specific common implementation
Signed-off-by: Vignesh Raghavendra vigneshr@ti.com
Acked-by: Masahiro Yamada yamada.masahiro@socionext.com
drivers/mmc/tmio-common.c | 25 +++---------------------- 1 file changed, 3 insertions(+), 22 deletions(-)
diff --git a/drivers/mmc/tmio-common.c b/drivers/mmc/tmio-common.c index 812205a21f6a..37c2b8555150 100644 --- a/drivers/mmc/tmio-common.c +++ b/drivers/mmc/tmio-common.c @@ -4,6 +4,7 @@
- Author: Masahiro Yamada yamada.masahiro@socionext.com
*/
+#include <asm/dma-mapping.h> #include <common.h> #include <clk.h> #include <fdtdec.h> @@ -75,26 +76,6 @@ void tmio_sd_writel(struct tmio_sd_priv *priv, writel(val, priv->regbase + reg); }
-static dma_addr_t __dma_map_single(void *ptr, size_t size,
enum dma_data_direction dir)
-{
unsigned long addr = (unsigned long)ptr;
if (dir == DMA_FROM_DEVICE)
invalidate_dcache_range(addr, addr + size);
else
flush_dcache_range(addr, addr + size);
return addr;
-}
-static void __dma_unmap_single(dma_addr_t addr, size_t size,
enum dma_data_direction dir)
-{
if (dir != DMA_TO_DEVICE)
invalidate_dcache_range(addr, addr + size);
-}
static int tmio_sd_check_error(struct udevice *dev, struct mmc_cmd *cmd) { struct tmio_sd_priv *priv = dev_get_priv(dev); @@ -361,7 +342,7 @@ static int tmio_sd_dma_xfer(struct udevice *dev, struct mmc_data *data)
tmio_sd_writel(priv, tmp, TMIO_SD_DMA_MODE);
dma_addr = __dma_map_single(buf, len, dir);
dma_addr = dma_map_single(buf, len, dir); tmio_sd_dma_start(priv, dma_addr);
@@ -370,7 +351,7 @@ static int tmio_sd_dma_xfer(struct udevice *dev, struct mmc_data *data) if (poll_flag == TMIO_SD_DMA_INFO1_END_RD) udelay(1);
__dma_unmap_single(dma_addr, len, dir);
dma_unmap_single(buf, len, dir); return ret;
}
2.24.0
U-Boot mailing list U-Boot@lists.denx.de https://lists.denx.de/listinfo/u-boot

Drop local dma_map_single() and dma_unmap_single() and use arch specific common implementation
Signed-off-by: Vignesh Raghavendra vigneshr@ti.com --- drivers/mtd/nand/raw/denali.c | 34 +++------------------------------- 1 file changed, 3 insertions(+), 31 deletions(-)
diff --git a/drivers/mtd/nand/raw/denali.c b/drivers/mtd/nand/raw/denali.c index e0eb1339ecd2..8537c609fb62 100644 --- a/drivers/mtd/nand/raw/denali.c +++ b/drivers/mtd/nand/raw/denali.c @@ -5,6 +5,7 @@ * Copyright (C) 2009-2010, Intel Corporation and its suppliers. */
+#include <asm/dma-mapping.h> #include <dm.h> #include <nand.h> #include <linux/bitfield.h> @@ -16,35 +17,6 @@
#include "denali.h"
-static dma_addr_t dma_map_single(void *dev, void *ptr, size_t size, - enum dma_data_direction dir) -{ - unsigned long addr = (unsigned long)ptr; - - size = ALIGN(size, ARCH_DMA_MINALIGN); - - if (dir == DMA_FROM_DEVICE) - invalidate_dcache_range(addr, addr + size); - else - flush_dcache_range(addr, addr + size); - - return addr; -} - -static void dma_unmap_single(void *dev, dma_addr_t addr, size_t size, - enum dma_data_direction dir) -{ - size = ALIGN(size, ARCH_DMA_MINALIGN); - - if (dir != DMA_TO_DEVICE) - invalidate_dcache_range(addr, addr + size); -} - -static int dma_mapping_error(void *dev, dma_addr_t addr) -{ - return 0; -} - #define DENALI_NAND_NAME "denali-nand"
/* for Indexed Addressing */ @@ -564,7 +536,7 @@ static int denali_dma_xfer(struct denali_nand_info *denali, void *buf, enum dma_data_direction dir = write ? DMA_TO_DEVICE : DMA_FROM_DEVICE; int ret = 0;
- dma_addr = dma_map_single(denali->dev, buf, size, dir); + dma_addr = dma_map_single(buf, size, dir); if (dma_mapping_error(denali->dev, dma_addr)) { dev_dbg(denali->dev, "Failed to DMA-map buffer. Trying PIO.\n"); return denali_pio_xfer(denali, buf, size, page, raw, write); @@ -605,7 +577,7 @@ static int denali_dma_xfer(struct denali_nand_info *denali, void *buf,
iowrite32(0, denali->reg + DMA_ENABLE);
- dma_unmap_single(denali->dev, dma_addr, size, dir); + dma_unmap_single(buf, size, dir);
if (irq_status & INTR__ERASED_PAGE) memset(buf, 0xff, size);

On Fri, Nov 15, 2019 at 8:56 PM Vignesh Raghavendra vigneshr@ti.com wrote:
Drop local dma_map_single() and dma_unmap_single() and use arch specific common implementation
Signed-off-by: Vignesh Raghavendra vigneshr@ti.com
Acked-by: Masahiro Yamada yamada.masahiro@socionext.com
drivers/mtd/nand/raw/denali.c | 34 +++------------------------------- 1 file changed, 3 insertions(+), 31 deletions(-)
diff --git a/drivers/mtd/nand/raw/denali.c b/drivers/mtd/nand/raw/denali.c index e0eb1339ecd2..8537c609fb62 100644 --- a/drivers/mtd/nand/raw/denali.c +++ b/drivers/mtd/nand/raw/denali.c @@ -5,6 +5,7 @@
- Copyright (C) 2009-2010, Intel Corporation and its suppliers.
*/
+#include <asm/dma-mapping.h> #include <dm.h> #include <nand.h> #include <linux/bitfield.h> @@ -16,35 +17,6 @@
#include "denali.h"
-static dma_addr_t dma_map_single(void *dev, void *ptr, size_t size,
enum dma_data_direction dir)
-{
unsigned long addr = (unsigned long)ptr;
size = ALIGN(size, ARCH_DMA_MINALIGN);
if (dir == DMA_FROM_DEVICE)
invalidate_dcache_range(addr, addr + size);
else
flush_dcache_range(addr, addr + size);
return addr;
-}
-static void dma_unmap_single(void *dev, dma_addr_t addr, size_t size,
enum dma_data_direction dir)
-{
size = ALIGN(size, ARCH_DMA_MINALIGN);
if (dir != DMA_TO_DEVICE)
invalidate_dcache_range(addr, addr + size);
-}
-static int dma_mapping_error(void *dev, dma_addr_t addr) -{
return 0;
-}
#define DENALI_NAND_NAME "denali-nand"
/* for Indexed Addressing */ @@ -564,7 +536,7 @@ static int denali_dma_xfer(struct denali_nand_info *denali, void *buf, enum dma_data_direction dir = write ? DMA_TO_DEVICE : DMA_FROM_DEVICE; int ret = 0;
dma_addr = dma_map_single(denali->dev, buf, size, dir);
dma_addr = dma_map_single(buf, size, dir); if (dma_mapping_error(denali->dev, dma_addr)) { dev_dbg(denali->dev, "Failed to DMA-map buffer. Trying PIO.\n"); return denali_pio_xfer(denali, buf, size, page, raw, write);
@@ -605,7 +577,7 @@ static int denali_dma_xfer(struct denali_nand_info *denali, void *buf,
iowrite32(0, denali->reg + DMA_ENABLE);
dma_unmap_single(denali->dev, dma_addr, size, dir);
dma_unmap_single(buf, size, dir); if (irq_status & INTR__ERASED_PAGE) memset(buf, 0xff, size);
-- 2.24.0
U-Boot mailing list U-Boot@lists.denx.de https://lists.denx.de/listinfo/u-boot

Now that arch specific dma mapping APIs take care of cache flush/invalidate, drop local cache flush operation.
Signed-off-by: Vignesh Raghavendra vigneshr@ti.com --- drivers/net/macb.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-)
diff --git a/drivers/net/macb.c b/drivers/net/macb.c index 1a532b0e5a4f..1ded76b6d7b6 100644 --- a/drivers/net/macb.c +++ b/drivers/net/macb.c @@ -331,8 +331,6 @@ static int _macb_send(struct macb_device *macb, const char *name, void *packet, macb->tx_ring[tx_head].addr = paddr; barrier(); macb_flush_ring_desc(macb, TX); - /* Do we need check paddr and length is dcache line aligned? */ - flush_dcache_range(paddr, paddr + ALIGN(length, ARCH_DMA_MINALIGN)); macb_writel(macb, NCR, MACB_BIT(TE) | MACB_BIT(RE) | MACB_BIT(TSTART));
/* @@ -348,7 +346,7 @@ static int _macb_send(struct macb_device *macb, const char *name, void *packet, udelay(1); }
- dma_unmap_single(packet, length, paddr); + dma_unmap_single(packet, length, DMA_TO_DEVICE);
if (i <= MACB_TX_TIMEOUT) { if (ctrl & MACB_BIT(TX_UNDERRUN))
participants (3)
-
Masahiro Yamada
-
Tom Rini
-
Vignesh Raghavendra