dmaengine: ioat: fixing chunk sizing macros dependency
authorLeonid Ravich <Leonid.Ravich@emc.com>
Thu, 16 Apr 2020 17:06:21 +0000 (20:06 +0300)
committerVinod Koul <vkoul@kernel.org>
Fri, 17 Apr 2020 11:58:39 +0000 (17:28 +0530)
changing macros which assumption is chunk size of 2M,
which can be other size
prepare for changing allocation chunk size.

Acked-by: Dave Jiang <dave.jiang@intel.com>
Signed-off-by: Leonid Ravich <Leonid.Ravich@emc.com>
Link: https://lore.kernel.org/r/20200416170628.16196-1-leonid.ravich@dell.com
Signed-off-by: Vinod Koul <vkoul@kernel.org>
drivers/dma/ioat/dma.c
drivers/dma/ioat/dma.h
drivers/dma/ioat/init.c

index 18c011e..1e0e6c1 100644 (file)
@@ -332,8 +332,8 @@ ioat_alloc_ring_ent(struct dma_chan *chan, int idx, gfp_t flags)
        u8 *pos;
        off_t offs;
 
-       chunk = idx / IOAT_DESCS_PER_2M;
-       idx &= (IOAT_DESCS_PER_2M - 1);
+       chunk = idx / IOAT_DESCS_PER_CHUNK;
+       idx &= (IOAT_DESCS_PER_CHUNK - 1);
        offs = idx * IOAT_DESC_SZ;
        pos = (u8 *)ioat_chan->descs[chunk].virt + offs;
        phys = ioat_chan->descs[chunk].hw + offs;
@@ -370,7 +370,8 @@ ioat_alloc_ring(struct dma_chan *c, int order, gfp_t flags)
        if (!ring)
                return NULL;
 
-       ioat_chan->desc_chunks = chunks = (total_descs * IOAT_DESC_SZ) / SZ_2M;
+       chunks = (total_descs * IOAT_DESC_SZ) / IOAT_CHUNK_SIZE;
+       ioat_chan->desc_chunks = chunks;
 
        for (i = 0; i < chunks; i++) {
                struct ioat_descs *descs = &ioat_chan->descs[i];
@@ -382,8 +383,9 @@ ioat_alloc_ring(struct dma_chan *c, int order, gfp_t flags)
 
                        for (idx = 0; idx < i; idx++) {
                                descs = &ioat_chan->descs[idx];
-                               dma_free_coherent(to_dev(ioat_chan), SZ_2M,
-                                                 descs->virt, descs->hw);
+                               dma_free_coherent(to_dev(ioat_chan),
+                                               IOAT_CHUNK_SIZE,
+                                               descs->virt, descs->hw);
                                descs->virt = NULL;
                                descs->hw = 0;
                        }
@@ -404,7 +406,7 @@ ioat_alloc_ring(struct dma_chan *c, int order, gfp_t flags)
 
                        for (idx = 0; idx < ioat_chan->desc_chunks; idx++) {
                                dma_free_coherent(to_dev(ioat_chan),
-                                                 SZ_2M,
+                                                 IOAT_CHUNK_SIZE,
                                                  ioat_chan->descs[idx].virt,
                                                  ioat_chan->descs[idx].hw);
                                ioat_chan->descs[idx].virt = NULL;
index b8e8e0b..5216c6b 100644 (file)
@@ -81,6 +81,11 @@ struct ioatdma_device {
        u32 msixpba;
 };
 
+#define IOAT_MAX_ORDER 16
+#define IOAT_MAX_DESCS (1 << IOAT_MAX_ORDER)
+#define IOAT_CHUNK_SIZE (SZ_2M)
+#define IOAT_DESCS_PER_CHUNK (IOAT_CHUNK_SIZE / IOAT_DESC_SZ)
+
 struct ioat_descs {
        void *virt;
        dma_addr_t hw;
@@ -128,7 +133,7 @@ struct ioatdma_chan {
        u16 produce;
        struct ioat_ring_ent **ring;
        spinlock_t prep_lock;
-       struct ioat_descs descs[2];
+       struct ioat_descs descs[IOAT_MAX_DESCS / IOAT_DESCS_PER_CHUNK];
        int desc_chunks;
        int intr_coalesce;
        int prev_intr_coalesce;
@@ -301,9 +306,6 @@ static inline bool is_ioat_bug(unsigned long err)
        return !!err;
 }
 
-#define IOAT_MAX_ORDER 16
-#define IOAT_MAX_DESCS 65536
-#define IOAT_DESCS_PER_2M 32768
 
 static inline u32 ioat_ring_size(struct ioatdma_chan *ioat_chan)
 {
index 60e9afb..58d1356 100644 (file)
@@ -651,7 +651,7 @@ static void ioat_free_chan_resources(struct dma_chan *c)
        }
 
        for (i = 0; i < ioat_chan->desc_chunks; i++) {
-               dma_free_coherent(to_dev(ioat_chan), SZ_2M,
+               dma_free_coherent(to_dev(ioat_chan), IOAT_CHUNK_SIZE,
                                  ioat_chan->descs[i].virt,
                                  ioat_chan->descs[i].hw);
                ioat_chan->descs[i].virt = NULL;