From: Tien Fong Chee <tien.fong.c...@intel.com>

This new DMA class function enables DMA being used for initializing
a range of destination such as memory to zeros. This is quite useful to
help accelerating the performance in scrubbing memory when ECC is enabled.

Signed-off-by: Tien Fong Chee <tien.fong.c...@intel.com>
---
 drivers/dma/dma-uclass.c | 15 +++++++++++++++
 include/dma.h            | 12 ++++++++++++
 2 files changed, 27 insertions(+)

diff --git a/drivers/dma/dma-uclass.c b/drivers/dma/dma-uclass.c
index a33f7d5..cb83c24 100644
--- a/drivers/dma/dma-uclass.c
+++ b/drivers/dma/dma-uclass.c
@@ -61,6 +61,21 @@ int dma_memcpy(void *dst, void *src, size_t len)
        return ops->transfer(dev, DMA_MEM_TO_MEM, dst, src, len);
 }
 
+int dma_memcpy_zeroes(struct udevice *dev, void *dst, size_t len)
+{
+       const struct dma_ops *ops;
+
+       ops = device_get_ops(dev);
+       if (!ops->transfer_zeroes)
+               return -ENOSYS;
+
+       /* Invalidate the area, so no writeback into the RAM races with DMA */
+       invalidate_dcache_range((unsigned long)dst, (unsigned long)dst +
+                               roundup(len, ARCH_DMA_MINALIGN));
+
+       return ops->transfer_zeroes(dev, dst, len);
+}
+
 UCLASS_DRIVER(dma) = {
        .id             = UCLASS_DMA,
        .name           = "dma",
diff --git a/include/dma.h b/include/dma.h
index 50e9652..6bad2264 100644
--- a/include/dma.h
+++ b/include/dma.h
@@ -46,6 +46,7 @@ struct dma_ops {
         */
        int (*transfer)(struct udevice *dev, int direction, void *dst,
                        void *src, size_t len);
+       int (*transfer_zeroes)(struct udevice *dev, void *dst, size_t len);
 };
 
 /*
@@ -82,4 +83,15 @@ int dma_get_device(u32 transfer_type, struct udevice **devp);
  */
 int dma_memcpy(void *dst, void *src, size_t len);
 
+/*
+ * dma_memcpy_zeroes - Fill up destination with zeros through DMA.
+ *
+ * @dev: The DMA device
+ * @dst: destination pointer
+ * @len: length to be copied with zero
+ * @return: on successful transfer returns zero.
+ *         on failure returns error code.
+ */
+int dma_memcpy_zeroes(struct udevice *dev, void *dst, size_t len);
+
 #endif /* _DMA_H_ */
-- 
2.2.0

_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
https://lists.denx.de/listinfo/u-boot

Reply via email to