Commit bd2bf302 authored by Leonid Ravich's avatar Leonid Ravich Committed by Vinod Koul

dmaengine: ioat: fixing chunk sizing macros dependency

changing macros which assumption is chunk size of 2M,
which can be other size
prepare for changing allocation chunk size.
Acked-by: default avatarDave Jiang <dave.jiang@intel.com>
Signed-off-by: default avatarLeonid Ravich <Leonid.Ravich@emc.com>
Link: https://lore.kernel.org/r/20200416170628.16196-1-leonid.ravich@dell.comSigned-off-by: default avatarVinod Koul <vkoul@kernel.org>
parent 2fea2906
...@@ -332,8 +332,8 @@ ioat_alloc_ring_ent(struct dma_chan *chan, int idx, gfp_t flags) ...@@ -332,8 +332,8 @@ ioat_alloc_ring_ent(struct dma_chan *chan, int idx, gfp_t flags)
u8 *pos; u8 *pos;
off_t offs; off_t offs;
chunk = idx / IOAT_DESCS_PER_2M; chunk = idx / IOAT_DESCS_PER_CHUNK;
idx &= (IOAT_DESCS_PER_2M - 1); idx &= (IOAT_DESCS_PER_CHUNK - 1);
offs = idx * IOAT_DESC_SZ; offs = idx * IOAT_DESC_SZ;
pos = (u8 *)ioat_chan->descs[chunk].virt + offs; pos = (u8 *)ioat_chan->descs[chunk].virt + offs;
phys = ioat_chan->descs[chunk].hw + offs; phys = ioat_chan->descs[chunk].hw + offs;
...@@ -370,7 +370,8 @@ ioat_alloc_ring(struct dma_chan *c, int order, gfp_t flags) ...@@ -370,7 +370,8 @@ ioat_alloc_ring(struct dma_chan *c, int order, gfp_t flags)
if (!ring) if (!ring)
return NULL; 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++) { for (i = 0; i < chunks; i++) {
struct ioat_descs *descs = &ioat_chan->descs[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) ...@@ -382,8 +383,9 @@ ioat_alloc_ring(struct dma_chan *c, int order, gfp_t flags)
for (idx = 0; idx < i; idx++) { for (idx = 0; idx < i; idx++) {
descs = &ioat_chan->descs[idx]; descs = &ioat_chan->descs[idx];
dma_free_coherent(to_dev(ioat_chan), SZ_2M, dma_free_coherent(to_dev(ioat_chan),
descs->virt, descs->hw); IOAT_CHUNK_SIZE,
descs->virt, descs->hw);
descs->virt = NULL; descs->virt = NULL;
descs->hw = 0; descs->hw = 0;
} }
...@@ -404,7 +406,7 @@ ioat_alloc_ring(struct dma_chan *c, int order, gfp_t flags) ...@@ -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++) { for (idx = 0; idx < ioat_chan->desc_chunks; idx++) {
dma_free_coherent(to_dev(ioat_chan), dma_free_coherent(to_dev(ioat_chan),
SZ_2M, IOAT_CHUNK_SIZE,
ioat_chan->descs[idx].virt, ioat_chan->descs[idx].virt,
ioat_chan->descs[idx].hw); ioat_chan->descs[idx].hw);
ioat_chan->descs[idx].virt = NULL; ioat_chan->descs[idx].virt = NULL;
......
...@@ -81,6 +81,11 @@ struct ioatdma_device { ...@@ -81,6 +81,11 @@ struct ioatdma_device {
u32 msixpba; 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 { struct ioat_descs {
void *virt; void *virt;
dma_addr_t hw; dma_addr_t hw;
...@@ -128,7 +133,7 @@ struct ioatdma_chan { ...@@ -128,7 +133,7 @@ struct ioatdma_chan {
u16 produce; u16 produce;
struct ioat_ring_ent **ring; struct ioat_ring_ent **ring;
spinlock_t prep_lock; spinlock_t prep_lock;
struct ioat_descs descs[2]; struct ioat_descs descs[IOAT_MAX_DESCS / IOAT_DESCS_PER_CHUNK];
int desc_chunks; int desc_chunks;
int intr_coalesce; int intr_coalesce;
int prev_intr_coalesce; int prev_intr_coalesce;
...@@ -301,9 +306,6 @@ static inline bool is_ioat_bug(unsigned long err) ...@@ -301,9 +306,6 @@ static inline bool is_ioat_bug(unsigned long err)
return !!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) static inline u32 ioat_ring_size(struct ioatdma_chan *ioat_chan)
{ {
......
...@@ -651,7 +651,7 @@ static void ioat_free_chan_resources(struct dma_chan *c) ...@@ -651,7 +651,7 @@ static void ioat_free_chan_resources(struct dma_chan *c)
} }
for (i = 0; i < ioat_chan->desc_chunks; i++) { 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].virt,
ioat_chan->descs[i].hw); ioat_chan->descs[i].hw);
ioat_chan->descs[i].virt = NULL; ioat_chan->descs[i].virt = NULL;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment