dmaengine: xilinx: xdma: Ease dma_pool alignment requirements
authorJan Kuliga <jankul@alatek.krakow.pl>
Mon, 18 Dec 2023 11:39:38 +0000 (12:39 +0100)
committerVinod Koul <vkoul@kernel.org>
Thu, 21 Dec 2023 16:21:54 +0000 (21:51 +0530)
According to the XDMA datasheet (PG195), the address of any descriptor
must be 32 byte aligned. The datasheet also states that a contiguous
block of descriptors must not cross a 4k address boundary. Therefore,
it is possible to ease the pressure put on the dma_pool allocator
just by requiring sufficient alignment and boundary values. Add proper
macro definition and change the values passed into the
dma_pool_create().

Signed-off-by: Jan Kuliga <jankul@alatek.krakow.pl>
Link: https://lore.kernel.org/r/20231218113943.9099-4-jankul@alatek.krakow.pl
Signed-off-by: Vinod Koul <vkoul@kernel.org>
drivers/dma/xilinx/xdma-regs.h
drivers/dma/xilinx/xdma.c

index 98117e8a466fa2c97e0bdfde24b1a550acf535e7..98f5f6fb9ff9c771270c64c364265f72fd7b216d 100644 (file)
@@ -64,9 +64,10 @@ struct xdma_hw_desc {
        __le64          next_desc;
 };
 
-#define XDMA_DESC_SIZE         sizeof(struct xdma_hw_desc)
-#define XDMA_DESC_BLOCK_SIZE   (XDMA_DESC_SIZE * XDMA_DESC_ADJACENT)
-#define XDMA_DESC_BLOCK_ALIGN  4096
+#define XDMA_DESC_SIZE                 sizeof(struct xdma_hw_desc)
+#define XDMA_DESC_BLOCK_SIZE           (XDMA_DESC_SIZE * XDMA_DESC_ADJACENT)
+#define XDMA_DESC_BLOCK_ALIGN          32
+#define XDMA_DESC_BLOCK_BOUNDARY       4096
 
 /*
  * Channel registers
index ddb9e7d07461652446bd47edae46d27534f037ff..c22701e76b693e7cb260cb359b526ab3fb3e22b2 100644 (file)
@@ -741,9 +741,8 @@ static int xdma_alloc_chan_resources(struct dma_chan *chan)
                return -EINVAL;
        }
 
-       xdma_chan->desc_pool = dma_pool_create(dma_chan_name(chan),
-                                              dev, XDMA_DESC_BLOCK_SIZE,
-                                              XDMA_DESC_BLOCK_ALIGN, 0);
+       xdma_chan->desc_pool = dma_pool_create(dma_chan_name(chan), dev, XDMA_DESC_BLOCK_SIZE,
+                                              XDMA_DESC_BLOCK_ALIGN, XDMA_DESC_BLOCK_BOUNDARY);
        if (!xdma_chan->desc_pool) {
                xdma_err(xdev, "unable to allocate descriptor pool");
                return -ENOMEM;