From: Vamsi Attunuru <vattun...@marvell.com> last index value might lost the order when dma stats are reset in between copy operations. Patch adds a variable to track the completed count, that can be used to compute the last index, also patch adds misc other fixes.
Signed-off-by: Vamsi Attunuru <vattun...@marvell.com> --- v2: - Fix for bugs observed in v1. - Squashed few commits. v3: - Resolved review suggestions. - Code improvement. drivers/dma/cnxk/cnxk_dmadev.c | 17 ++++++++++------- drivers/dma/cnxk/cnxk_dmadev.h | 1 + 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/drivers/dma/cnxk/cnxk_dmadev.c b/drivers/dma/cnxk/cnxk_dmadev.c index 288606bb3d..7e728b943b 100644 --- a/drivers/dma/cnxk/cnxk_dmadev.c +++ b/drivers/dma/cnxk/cnxk_dmadev.c @@ -298,6 +298,7 @@ cnxk_dmadev_start(struct rte_dma_dev *dev) } cnxk_stats_reset(dev, i); + dpi_conf->completed_offset = 0; } roc_dpi_enable(&dpivf->rdpi); @@ -479,7 +480,7 @@ cnxk_dmadev_copy(void *dev_private, uint16_t vchan, rte_iova_t src, rte_iova_t d dpi_conf->pending++; } - return (dpi_conf->desc_idx++); + return dpi_conf->desc_idx++; } static int @@ -545,13 +546,13 @@ cnxk_dmadev_copy_sg(void *dev_private, uint16_t vchan, const struct rte_dma_sge if (flags & RTE_DMA_OP_FLAG_SUBMIT) { rte_wmb(); plt_write64(num_words, dpivf->rdpi.rbase + DPI_VDMA_DBELL); - dpi_conf->stats.submitted += nb_src; + dpi_conf->stats.submitted++; } else { dpi_conf->pnum_words += num_words; dpi_conf->pending++; } - return (dpi_conf->desc_idx++); + return dpi_conf->desc_idx++; } static int @@ -664,13 +665,13 @@ cn10k_dmadev_copy_sg(void *dev_private, uint16_t vchan, const struct rte_dma_sge if (flags & RTE_DMA_OP_FLAG_SUBMIT) { rte_wmb(); plt_write64(num_words, dpivf->rdpi.rbase + DPI_VDMA_DBELL); - dpi_conf->stats.submitted += nb_src; + dpi_conf->stats.submitted++; } else { dpi_conf->pnum_words += num_words; dpi_conf->pending++; } - return (dpi_conf->desc_idx++); + return dpi_conf->desc_idx++; } static uint16_t @@ -700,7 +701,7 @@ cnxk_dmadev_completed(void *dev_private, uint16_t vchan, const uint16_t nb_cpls, } dpi_conf->stats.completed += cnt; - *last_idx = dpi_conf->stats.completed - 1; + *last_idx = (dpi_conf->completed_offset + dpi_conf->stats.completed - 1) & 0xffff; return cnt; } @@ -729,7 +730,7 @@ cnxk_dmadev_completed_status(void *dev_private, uint16_t vchan, const uint16_t n } dpi_conf->stats.completed += cnt; - *last_idx = dpi_conf->stats.completed - 1; + *last_idx = (dpi_conf->completed_offset + dpi_conf->stats.completed - 1) & 0xffff; return cnt; } @@ -814,6 +815,7 @@ cnxk_stats_reset(struct rte_dma_dev *dev, uint16_t vchan) if (vchan == RTE_DMA_ALL_VCHAN) { for (i = 0; i < dpivf->num_vchans; i++) { dpi_conf = &dpivf->conf[i]; + dpi_conf->completed_offset += dpi_conf->stats.completed; dpi_conf->stats = (struct rte_dma_stats){0}; } @@ -824,6 +826,7 @@ cnxk_stats_reset(struct rte_dma_dev *dev, uint16_t vchan) return -EINVAL; dpi_conf = &dpivf->conf[vchan]; + dpi_conf->completed_offset += dpi_conf->stats.completed; dpi_conf->stats = (struct rte_dma_stats){0}; return 0; diff --git a/drivers/dma/cnxk/cnxk_dmadev.h b/drivers/dma/cnxk/cnxk_dmadev.h index 9c6c898d23..254e7fea20 100644 --- a/drivers/dma/cnxk/cnxk_dmadev.h +++ b/drivers/dma/cnxk/cnxk_dmadev.h @@ -41,6 +41,7 @@ struct cnxk_dpi_conf { uint16_t desc_idx; uint16_t pad0; struct rte_dma_stats stats; + uint64_t completed_offset; }; struct cnxk_dpi_vf_s { -- 2.25.1