DPDK patches and discussions
 help / color / mirror / Atom feed
* [PATCH 1/7] dma/cnxk: changes for dmadev autotest
@ 2023-06-28 17:18 Amit Prakash Shukla
  2023-06-28 17:18 ` [PATCH 2/7] drivers: changes for dmadev driver Amit Prakash Shukla
                   ` (6 more replies)
  0 siblings, 7 replies; 46+ messages in thread
From: Amit Prakash Shukla @ 2023-06-28 17:18 UTC (permalink / raw)
  To: Vamsi Attunuru; +Cc: dev, jerinj, Amit Prakash Shukla

Code changes to fix issues observed during dmadev_autotest.

Signed-off-by: Amit Prakash Shukla <amitprakashs@marvell.com>
---
 drivers/dma/cnxk/cnxk_dmadev.c | 120 +++++++++++++++++++++++++--------
 drivers/dma/cnxk/cnxk_dmadev.h |  12 ++--
 2 files changed, 99 insertions(+), 33 deletions(-)

diff --git a/drivers/dma/cnxk/cnxk_dmadev.c b/drivers/dma/cnxk/cnxk_dmadev.c
index a6f4a31e0e..77daa64b32 100644
--- a/drivers/dma/cnxk/cnxk_dmadev.c
+++ b/drivers/dma/cnxk/cnxk_dmadev.c
@@ -45,8 +45,6 @@ cnxk_dmadev_configure(struct rte_dma_dev *dev,
 	int rc = 0;
 
 	RTE_SET_USED(conf);
-	RTE_SET_USED(conf);
-	RTE_SET_USED(conf_sz);
 	RTE_SET_USED(conf_sz);
 	dpivf = dev->fp_obj->dev_private;
 	rc = roc_dpi_configure(&dpivf->rdpi);
@@ -105,9 +103,11 @@ cnxk_dmadev_vchan_setup(struct rte_dma_dev *dev, uint16_t vchan,
 		comp_data->cdata = DPI_REQ_CDATA;
 		dpivf->conf.c_desc.compl_ptr[i] = comp_data;
 	};
-	dpivf->conf.c_desc.max_cnt = DPI_MAX_DESC;
+	dpivf->conf.c_desc.max_cnt = conf->nb_desc;
 	dpivf->conf.c_desc.head = 0;
 	dpivf->conf.c_desc.tail = 0;
+	dpivf->pending_num_words = 0;
+	dpivf->pending = 0;
 
 	return 0;
 }
@@ -161,9 +161,11 @@ cn10k_dmadev_vchan_setup(struct rte_dma_dev *dev, uint16_t vchan,
 		comp_data->cdata = DPI_REQ_CDATA;
 		dpivf->conf.c_desc.compl_ptr[i] = comp_data;
 	};
-	dpivf->conf.c_desc.max_cnt = DPI_MAX_DESC;
+	dpivf->conf.c_desc.max_cnt = conf->nb_desc;
 	dpivf->conf.c_desc.head = 0;
 	dpivf->conf.c_desc.tail = 0;
+	dpivf->pending_num_words = 0;
+	dpivf->pending = 0;
 
 	return 0;
 }
@@ -175,6 +177,8 @@ cnxk_dmadev_start(struct rte_dma_dev *dev)
 
 	dpivf->desc_idx = 0;
 	dpivf->num_words = 0;
+	dpivf->pending = 0;
+	dpivf->pending_num_words = 0;
 	roc_dpi_enable(&dpivf->rdpi);
 
 	return 0;
@@ -294,7 +298,7 @@ cnxk_dmadev_copy(void *dev_private, uint16_t vchan, rte_iova_t src,
 	comp_ptr = dpivf->conf.c_desc.compl_ptr[dpivf->conf.c_desc.tail];
 	comp_ptr->cdata = DPI_REQ_CDATA;
 	header->cn9k.ptr = (uint64_t)comp_ptr;
-	STRM_INC(dpivf->conf.c_desc);
+	STRM_INC(dpivf->conf.c_desc, tail);
 
 	header->cn9k.nfst = 1;
 	header->cn9k.nlst = 1;
@@ -325,10 +329,13 @@ cnxk_dmadev_copy(void *dev_private, uint16_t vchan, rte_iova_t src,
 	if (!rc) {
 		if (flags & RTE_DMA_OP_FLAG_SUBMIT) {
 			rte_wmb();
-			plt_write64(num_words,
-				    dpivf->rdpi.rbase + DPI_VDMA_DBELL);
+			plt_write64(num_words, dpivf->rdpi.rbase + DPI_VDMA_DBELL);
 			dpivf->stats.submitted++;
+		} else {
+			dpivf->pending_num_words += num_words;
+			dpivf->pending++;
 		}
+
 		dpivf->num_words += num_words;
 	}
 
@@ -353,7 +360,7 @@ cnxk_dmadev_copy_sg(void *dev_private, uint16_t vchan,
 	comp_ptr = dpivf->conf.c_desc.compl_ptr[dpivf->conf.c_desc.tail];
 	comp_ptr->cdata = DPI_REQ_CDATA;
 	header->cn9k.ptr = (uint64_t)comp_ptr;
-	STRM_INC(dpivf->conf.c_desc);
+	STRM_INC(dpivf->conf.c_desc, tail);
 
 	/*
 	 * For inbound case, src pointers are last pointers.
@@ -391,10 +398,13 @@ cnxk_dmadev_copy_sg(void *dev_private, uint16_t vchan,
 	if (!rc) {
 		if (flags & RTE_DMA_OP_FLAG_SUBMIT) {
 			rte_wmb();
-			plt_write64(num_words,
-				    dpivf->rdpi.rbase + DPI_VDMA_DBELL);
+			plt_write64(num_words, dpivf->rdpi.rbase + DPI_VDMA_DBELL);
 			dpivf->stats.submitted += nb_src;
+		} else {
+			dpivf->pending_num_words += num_words;
+			dpivf->pending++;
 		}
+
 		dpivf->num_words += num_words;
 	}
 
@@ -417,7 +427,7 @@ cn10k_dmadev_copy(void *dev_private, uint16_t vchan, rte_iova_t src,
 	comp_ptr = dpivf->conf.c_desc.compl_ptr[dpivf->conf.c_desc.tail];
 	comp_ptr->cdata = DPI_REQ_CDATA;
 	header->cn10k.ptr = (uint64_t)comp_ptr;
-	STRM_INC(dpivf->conf.c_desc);
+	STRM_INC(dpivf->conf.c_desc, tail);
 
 	header->cn10k.nfst = 1;
 	header->cn10k.nlst = 1;
@@ -439,10 +449,13 @@ cn10k_dmadev_copy(void *dev_private, uint16_t vchan, rte_iova_t src,
 	if (!rc) {
 		if (flags & RTE_DMA_OP_FLAG_SUBMIT) {
 			rte_wmb();
-			plt_write64(num_words,
-				    dpivf->rdpi.rbase + DPI_VDMA_DBELL);
+			plt_write64(num_words, dpivf->rdpi.rbase + DPI_VDMA_DBELL);
 			dpivf->stats.submitted++;
+		} else {
+			dpivf->pending_num_words += num_words;
+			dpivf->pending++;
 		}
+
 		dpivf->num_words += num_words;
 	}
 
@@ -467,7 +480,7 @@ cn10k_dmadev_copy_sg(void *dev_private, uint16_t vchan,
 	comp_ptr = dpivf->conf.c_desc.compl_ptr[dpivf->conf.c_desc.tail];
 	comp_ptr->cdata = DPI_REQ_CDATA;
 	header->cn10k.ptr = (uint64_t)comp_ptr;
-	STRM_INC(dpivf->conf.c_desc);
+	STRM_INC(dpivf->conf.c_desc, tail);
 
 	header->cn10k.nfst = nb_src & 0xf;
 	header->cn10k.nlst = nb_dst & 0xf;
@@ -495,10 +508,13 @@ cn10k_dmadev_copy_sg(void *dev_private, uint16_t vchan,
 	if (!rc) {
 		if (flags & RTE_DMA_OP_FLAG_SUBMIT) {
 			rte_wmb();
-			plt_write64(num_words,
-				    dpivf->rdpi.rbase + DPI_VDMA_DBELL);
+			plt_write64(num_words, dpivf->rdpi.rbase + DPI_VDMA_DBELL);
 			dpivf->stats.submitted += nb_src;
+		} else {
+			dpivf->pending_num_words += num_words;
+			dpivf->pending++;
 		}
+
 		dpivf->num_words += num_words;
 	}
 
@@ -506,33 +522,41 @@ cn10k_dmadev_copy_sg(void *dev_private, uint16_t vchan,
 }
 
 static uint16_t
-cnxk_dmadev_completed(void *dev_private, uint16_t vchan, const uint16_t nb_cpls,
-		      uint16_t *last_idx, bool *has_error)
+cnxk_dmadev_completed(void *dev_private, uint16_t vchan, const uint16_t nb_cpls, uint16_t *last_idx,
+		      bool *has_error)
 {
 	struct cnxk_dpi_vf_s *dpivf = dev_private;
+	struct cnxk_dpi_compl_s *comp_ptr;
 	int cnt;
 
 	RTE_SET_USED(vchan);
 
-	if (dpivf->stats.submitted == dpivf->stats.completed)
+	if (dpivf->stats.submitted == dpivf->stats.completed) {
+		*last_idx = dpivf->stats.completed - 1;
 		return 0;
+	}
 
 	for (cnt = 0; cnt < nb_cpls; cnt++) {
-		struct cnxk_dpi_compl_s *comp_ptr =
-			dpivf->conf.c_desc.compl_ptr[cnt];
+		comp_ptr = dpivf->conf.c_desc.compl_ptr[dpivf->conf.c_desc.head];
 
 		if (comp_ptr->cdata) {
 			if (comp_ptr->cdata == DPI_REQ_CDATA)
 				break;
 			*has_error = 1;
 			dpivf->stats.errors++;
+			STRM_INC(dpivf->conf.c_desc, head);
 			break;
 		}
+
+		comp_ptr->cdata = DPI_REQ_CDATA;
+		STRM_INC(dpivf->conf.c_desc, head);
 	}
 
-	*last_idx = cnt - 1;
-	dpivf->conf.c_desc.tail = cnt;
+	if (*has_error)
+		cnt = cnt - 1;
+
 	dpivf->stats.completed += cnt;
+	*last_idx = dpivf->stats.completed - 1;
 
 	return cnt;
 }
@@ -547,9 +571,15 @@ cnxk_dmadev_completed_status(void *dev_private, uint16_t vchan,
 
 	RTE_SET_USED(vchan);
 	RTE_SET_USED(last_idx);
+
+	if (dpivf->stats.submitted == dpivf->stats.completed) {
+		*last_idx = dpivf->stats.completed - 1;
+		return 0;
+	}
+
 	for (cnt = 0; cnt < nb_cpls; cnt++) {
 		struct cnxk_dpi_compl_s *comp_ptr =
-			dpivf->conf.c_desc.compl_ptr[cnt];
+			dpivf->conf.c_desc.compl_ptr[dpivf->conf.c_desc.head];
 		status[cnt] = comp_ptr->cdata;
 		if (status[cnt]) {
 			if (status[cnt] == DPI_REQ_CDATA)
@@ -557,23 +587,54 @@ cnxk_dmadev_completed_status(void *dev_private, uint16_t vchan,
 
 			dpivf->stats.errors++;
 		}
+		comp_ptr->cdata = DPI_REQ_CDATA;
+		STRM_INC(dpivf->conf.c_desc, head);
 	}
 
-	*last_idx = cnt - 1;
-	dpivf->conf.c_desc.tail = 0;
 	dpivf->stats.completed += cnt;
+	*last_idx = dpivf->stats.completed - 1;
 
 	return cnt;
 }
 
+static uint16_t
+cnxk_damdev_burst_capacity(const void *dev_private, uint16_t vchan)
+{
+	const struct cnxk_dpi_vf_s *dpivf = (const struct cnxk_dpi_vf_s *)dev_private;
+
+	RTE_SET_USED(vchan);
+
+	if (dpivf->conf.c_desc.head == dpivf->conf.c_desc.tail)
+		return dpivf->conf.c_desc.max_cnt;
+
+	if ((dpivf->conf.c_desc.head == (dpivf->conf.c_desc.tail + 1)) ||
+	    (dpivf->conf.c_desc.tail == 0 && dpivf->conf.c_desc.head == dpivf->conf.c_desc.max_cnt))
+		return 0;
+
+	if (dpivf->conf.c_desc.head < dpivf->conf.c_desc.tail)
+		return (dpivf->conf.c_desc.max_cnt -
+			(dpivf->conf.c_desc.tail - dpivf->conf.c_desc.head));
+
+	if (dpivf->conf.c_desc.head > dpivf->conf.c_desc.tail)
+		return (((dpivf->conf.c_desc.max_cnt + dpivf->conf.c_desc.head) %
+			 dpivf->conf.c_desc.max_cnt) -
+			dpivf->conf.c_desc.tail);
+
+	return 0;
+}
+
 static int
 cnxk_dmadev_submit(void *dev_private, uint16_t vchan __rte_unused)
 {
 	struct cnxk_dpi_vf_s *dpivf = dev_private;
+	uint32_t num_words = dpivf->pending_num_words;
 
 	rte_wmb();
-	plt_write64(dpivf->num_words, dpivf->rdpi.rbase + DPI_VDMA_DBELL);
-	dpivf->stats.submitted++;
+	plt_write64(num_words, dpivf->rdpi.rbase + DPI_VDMA_DBELL);
+
+	dpivf->stats.submitted += dpivf->pending;
+	dpivf->pending_num_words = 0;
+	dpivf->pending = 0;
 
 	return 0;
 }
@@ -666,6 +727,7 @@ cnxk_dmadev_probe(struct rte_pci_driver *pci_drv __rte_unused,
 	dmadev->fp_obj->submit = cnxk_dmadev_submit;
 	dmadev->fp_obj->completed = cnxk_dmadev_completed;
 	dmadev->fp_obj->completed_status = cnxk_dmadev_completed_status;
+	dmadev->fp_obj->burst_capacity = cnxk_damdev_burst_capacity;
 
 	if (pci_dev->id.subsystem_device_id == PCI_SUBSYSTEM_DEVID_CN10KA ||
 	    pci_dev->id.subsystem_device_id == PCI_SUBSYSTEM_DEVID_CNF10KA ||
@@ -682,6 +744,8 @@ cnxk_dmadev_probe(struct rte_pci_driver *pci_drv __rte_unused,
 	if (rc < 0)
 		goto err_out_free;
 
+	dmadev->state = RTE_DMA_DEV_READY;
+
 	return 0;
 
 err_out_free:
diff --git a/drivers/dma/cnxk/cnxk_dmadev.h b/drivers/dma/cnxk/cnxk_dmadev.h
index e1f5694f50..24ce94b9c1 100644
--- a/drivers/dma/cnxk/cnxk_dmadev.h
+++ b/drivers/dma/cnxk/cnxk_dmadev.h
@@ -4,11 +4,11 @@
 #ifndef CNXK_DMADEV_H
 #define CNXK_DMADEV_H
 
-#define DPI_MAX_POINTER		15
-#define DPI_QUEUE_STOP		0x0
-#define DPI_QUEUE_START		0x1
-#define STRM_INC(s)		((s).tail = ((s).tail + 1) % (s).max_cnt)
-#define DPI_MAX_DESC		1024
+#define DPI_MAX_POINTER	 15
+#define DPI_QUEUE_STOP	 0x0
+#define DPI_QUEUE_START	 0x1
+#define STRM_INC(s, var) ((s).var = ((s).var + 1) % (s).max_cnt)
+#define DPI_MAX_DESC	 1024
 
 /* Set Completion data to 0xFF when request submitted,
  * upon successful request completion engine reset to completion status
@@ -38,6 +38,8 @@ struct cnxk_dpi_vf_s {
 	struct rte_dma_stats stats;
 	uint64_t cmd[DPI_MAX_CMD_SIZE];
 	uint32_t num_words;
+	uint16_t pending;
+	uint16_t pending_num_words;
 	uint16_t desc_idx;
 };
 
-- 
2.25.1


^ permalink raw reply	[flat|nested] 46+ messages in thread

* [PATCH 2/7] drivers: changes for dmadev driver
  2023-06-28 17:18 [PATCH 1/7] dma/cnxk: changes for dmadev autotest Amit Prakash Shukla
@ 2023-06-28 17:18 ` Amit Prakash Shukla
  2023-06-28 17:18 ` [PATCH 3/7] dma/cnxk: add DMA devops for all models of cn10xxx Amit Prakash Shukla
                   ` (5 subsequent siblings)
  6 siblings, 0 replies; 46+ messages in thread
From: Amit Prakash Shukla @ 2023-06-28 17:18 UTC (permalink / raw)
  To: Vamsi Attunuru; +Cc: dev, jerinj, Amit Prakash Shukla

Dmadev driver changes to align with dpdk spec.

Signed-off-by: Amit Prakash Shukla <amitprakashs@marvell.com>
---
 drivers/dma/cnxk/cnxk_dmadev.c | 454 ++++++++++++++++++---------------
 drivers/dma/cnxk/cnxk_dmadev.h |  20 +-
 2 files changed, 254 insertions(+), 220 deletions(-)

diff --git a/drivers/dma/cnxk/cnxk_dmadev.c b/drivers/dma/cnxk/cnxk_dmadev.c
index 77daa64b32..a0152fc6df 100644
--- a/drivers/dma/cnxk/cnxk_dmadev.c
+++ b/drivers/dma/cnxk/cnxk_dmadev.c
@@ -7,66 +7,76 @@
 
 #include <bus_pci_driver.h>
 #include <rte_common.h>
+#include <rte_dmadev.h>
+#include <rte_dmadev_pmd.h>
 #include <rte_eal.h>
 #include <rte_lcore.h>
 #include <rte_mempool.h>
 #include <rte_pci.h>
-#include <rte_dmadev.h>
-#include <rte_dmadev_pmd.h>
 
-#include <roc_api.h>
 #include <cnxk_dmadev.h>
 
 static int
-cnxk_dmadev_info_get(const struct rte_dma_dev *dev,
-		     struct rte_dma_info *dev_info, uint32_t size)
+cnxk_dmadev_info_get(const struct rte_dma_dev *dev, struct rte_dma_info *dev_info, uint32_t size)
 {
 	RTE_SET_USED(dev);
 	RTE_SET_USED(size);
 
 	dev_info->max_vchans = 1;
 	dev_info->nb_vchans = 1;
-	dev_info->dev_capa = RTE_DMA_CAPA_MEM_TO_MEM |
-		RTE_DMA_CAPA_MEM_TO_DEV | RTE_DMA_CAPA_DEV_TO_MEM |
-		RTE_DMA_CAPA_DEV_TO_DEV | RTE_DMA_CAPA_OPS_COPY |
-		RTE_DMA_CAPA_OPS_COPY_SG;
+	dev_info->dev_capa = RTE_DMA_CAPA_MEM_TO_MEM | RTE_DMA_CAPA_MEM_TO_DEV |
+			     RTE_DMA_CAPA_DEV_TO_MEM | RTE_DMA_CAPA_DEV_TO_DEV |
+			     RTE_DMA_CAPA_OPS_COPY | RTE_DMA_CAPA_OPS_COPY_SG;
 	dev_info->max_desc = DPI_MAX_DESC;
-	dev_info->min_desc = 1;
+	dev_info->min_desc = 2;
 	dev_info->max_sges = DPI_MAX_POINTER;
 
 	return 0;
 }
 
 static int
-cnxk_dmadev_configure(struct rte_dma_dev *dev,
-		      const struct rte_dma_conf *conf, uint32_t conf_sz)
+cnxk_dmadev_configure(struct rte_dma_dev *dev, const struct rte_dma_conf *conf, uint32_t conf_sz)
 {
 	struct cnxk_dpi_vf_s *dpivf = NULL;
 	int rc = 0;
 
 	RTE_SET_USED(conf);
 	RTE_SET_USED(conf_sz);
+
 	dpivf = dev->fp_obj->dev_private;
+
+	if (dpivf->flag & CNXK_DPI_DEV_CONFIG)
+		return rc;
+
 	rc = roc_dpi_configure(&dpivf->rdpi);
-	if (rc < 0)
+	if (rc < 0) {
 		plt_err("DMA configure failed err = %d", rc);
+		goto done;
+	}
 
+	dpivf->flag |= CNXK_DPI_DEV_CONFIG;
+
+done:
 	return rc;
 }
 
 static int
 cnxk_dmadev_vchan_setup(struct rte_dma_dev *dev, uint16_t vchan,
-			const struct rte_dma_vchan_conf *conf,
-			uint32_t conf_sz)
+			const struct rte_dma_vchan_conf *conf, uint32_t conf_sz)
 {
 	struct cnxk_dpi_vf_s *dpivf = dev->fp_obj->dev_private;
-	struct cnxk_dpi_compl_s *comp_data;
-	union dpi_instr_hdr_s *header = &dpivf->conf.hdr;
+	struct cnxk_dpi_conf *dpi_conf = &dpivf->conf;
+	union dpi_instr_hdr_s *header = &dpi_conf->hdr;
+	uint16_t max_desc;
+	uint32_t size;
 	int i;
 
 	RTE_SET_USED(vchan);
 	RTE_SET_USED(conf_sz);
 
+	if (dpivf->flag & CNXK_DPI_VCHAN_CONFIG)
+		return 0;
+
 	header->cn9k.pt = DPI_HDR_PT_ZBW_CA;
 
 	switch (conf->direction) {
@@ -94,37 +104,54 @@ cnxk_dmadev_vchan_setup(struct rte_dma_dev *dev, uint16_t vchan,
 		header->cn9k.fport = conf->dst_port.pcie.coreid;
 	};
 
-	for (i = 0; i < conf->nb_desc; i++) {
-		comp_data = rte_zmalloc(NULL, sizeof(*comp_data), 0);
-		if (comp_data == NULL) {
-			plt_err("Failed to allocate for comp_data");
-			return -ENOMEM;
-		}
-		comp_data->cdata = DPI_REQ_CDATA;
-		dpivf->conf.c_desc.compl_ptr[i] = comp_data;
-	};
-	dpivf->conf.c_desc.max_cnt = conf->nb_desc;
-	dpivf->conf.c_desc.head = 0;
-	dpivf->conf.c_desc.tail = 0;
-	dpivf->pending_num_words = 0;
+	max_desc = conf->nb_desc;
+	if (!rte_is_power_of_2(max_desc))
+		max_desc = rte_align32pow2(max_desc);
+
+	if (max_desc > DPI_MAX_DESC)
+		max_desc = DPI_MAX_DESC;
+
+	size = (max_desc * sizeof(struct cnxk_dpi_compl_s *));
+	dpi_conf->c_desc.compl_ptr = rte_zmalloc(NULL, size, 0);
+
+	if (dpi_conf->c_desc.compl_ptr == NULL) {
+		plt_err("Failed to allocate for comp_data");
+		return -ENOMEM;
+	}
+
+	for (i = 0; i < max_desc; i++) {
+		dpi_conf->c_desc.compl_ptr[i] =
+			rte_zmalloc(NULL, sizeof(struct cnxk_dpi_compl_s), 0);
+		dpi_conf->c_desc.compl_ptr[i]->cdata = DPI_REQ_CDATA;
+	}
+
+	dpi_conf->c_desc.max_cnt = (max_desc - 1);
+	dpi_conf->c_desc.head = 0;
+	dpi_conf->c_desc.tail = 0;
+	dpivf->pnum_words = 0;
 	dpivf->pending = 0;
+	dpivf->flag |= CNXK_DPI_VCHAN_CONFIG;
 
 	return 0;
 }
 
 static int
 cn10k_dmadev_vchan_setup(struct rte_dma_dev *dev, uint16_t vchan,
-			 const struct rte_dma_vchan_conf *conf,
-			 uint32_t conf_sz)
+			 const struct rte_dma_vchan_conf *conf, uint32_t conf_sz)
 {
 	struct cnxk_dpi_vf_s *dpivf = dev->fp_obj->dev_private;
-	struct cnxk_dpi_compl_s *comp_data;
-	union dpi_instr_hdr_s *header = &dpivf->conf.hdr;
+	struct cnxk_dpi_conf *dpi_conf = &dpivf->conf;
+	union dpi_instr_hdr_s *header = &dpi_conf->hdr;
+	uint16_t max_desc;
+	uint32_t size;
 	int i;
 
 	RTE_SET_USED(vchan);
 	RTE_SET_USED(conf_sz);
 
+	if (dpivf->flag & CNXK_DPI_VCHAN_CONFIG)
+		return 0;
+
 	header->cn10k.pt = DPI_HDR_PT_ZBW_CA;
 
 	switch (conf->direction) {
@@ -152,20 +179,33 @@ cn10k_dmadev_vchan_setup(struct rte_dma_dev *dev, uint16_t vchan,
 		header->cn10k.fport = conf->dst_port.pcie.coreid;
 	};
 
-	for (i = 0; i < conf->nb_desc; i++) {
-		comp_data = rte_zmalloc(NULL, sizeof(*comp_data), 0);
-		if (comp_data == NULL) {
-			plt_err("Failed to allocate for comp_data");
-			return -ENOMEM;
-		}
-		comp_data->cdata = DPI_REQ_CDATA;
-		dpivf->conf.c_desc.compl_ptr[i] = comp_data;
-	};
-	dpivf->conf.c_desc.max_cnt = conf->nb_desc;
-	dpivf->conf.c_desc.head = 0;
-	dpivf->conf.c_desc.tail = 0;
-	dpivf->pending_num_words = 0;
+	max_desc = conf->nb_desc;
+	if (!rte_is_power_of_2(max_desc))
+		max_desc = rte_align32pow2(max_desc);
+
+	if (max_desc > DPI_MAX_DESC)
+		max_desc = DPI_MAX_DESC;
+
+	size = (max_desc * sizeof(struct cnxk_dpi_compl_s *));
+	dpi_conf->c_desc.compl_ptr = rte_zmalloc(NULL, size, 0);
+
+	if (dpi_conf->c_desc.compl_ptr == NULL) {
+		plt_err("Failed to allocate for comp_data");
+		return -ENOMEM;
+	}
+
+	for (i = 0; i < max_desc; i++) {
+		dpi_conf->c_desc.compl_ptr[i] =
+			rte_zmalloc(NULL, sizeof(struct cnxk_dpi_compl_s), 0);
+		dpi_conf->c_desc.compl_ptr[i]->cdata = DPI_REQ_CDATA;
+	}
+
+	dpi_conf->c_desc.max_cnt = (max_desc - 1);
+	dpi_conf->c_desc.head = 0;
+	dpi_conf->c_desc.tail = 0;
+	dpivf->pnum_words = 0;
 	dpivf->pending = 0;
+	dpivf->flag |= CNXK_DPI_VCHAN_CONFIG;
 
 	return 0;
 }
@@ -175,12 +215,16 @@ cnxk_dmadev_start(struct rte_dma_dev *dev)
 {
 	struct cnxk_dpi_vf_s *dpivf = dev->fp_obj->dev_private;
 
+	if (dpivf->flag & CNXK_DPI_DEV_START)
+		return 0;
+
 	dpivf->desc_idx = 0;
-	dpivf->num_words = 0;
 	dpivf->pending = 0;
-	dpivf->pending_num_words = 0;
+	dpivf->pnum_words = 0;
 	roc_dpi_enable(&dpivf->rdpi);
 
+	dpivf->flag |= CNXK_DPI_DEV_START;
+
 	return 0;
 }
 
@@ -191,6 +235,8 @@ cnxk_dmadev_stop(struct rte_dma_dev *dev)
 
 	roc_dpi_disable(&dpivf->rdpi);
 
+	dpivf->flag &= ~CNXK_DPI_DEV_START;
+
 	return 0;
 }
 
@@ -202,6 +248,8 @@ cnxk_dmadev_close(struct rte_dma_dev *dev)
 	roc_dpi_disable(&dpivf->rdpi);
 	roc_dpi_dev_fini(&dpivf->rdpi);
 
+	dpivf->flag = 0;
+
 	return 0;
 }
 
@@ -210,8 +258,7 @@ __dpi_queue_write(struct roc_dpi *dpi, uint64_t *cmds, int cmd_count)
 {
 	uint64_t *ptr = dpi->chunk_base;
 
-	if ((cmd_count < DPI_MIN_CMD_SIZE) || (cmd_count > DPI_MAX_CMD_SIZE) ||
-	    cmds == NULL)
+	if ((cmd_count < DPI_MIN_CMD_SIZE) || (cmd_count > DPI_MAX_CMD_SIZE) || cmds == NULL)
 		return -EINVAL;
 
 	/*
@@ -227,11 +274,15 @@ __dpi_queue_write(struct roc_dpi *dpi, uint64_t *cmds, int cmd_count)
 		int count;
 		uint64_t *new_buff = dpi->chunk_next;
 
-		dpi->chunk_next =
-			(void *)roc_npa_aura_op_alloc(dpi->aura_handle, 0);
+		dpi->chunk_next = (void *)roc_npa_aura_op_alloc(dpi->aura_handle, 0);
 		if (!dpi->chunk_next) {
-			plt_err("Failed to alloc next buffer from NPA");
-			return -ENOMEM;
+			plt_dp_dbg("Failed to alloc next buffer from NPA");
+
+			/* NPA failed to allocate a buffer. Restoring chunk_next
+			 * to its original address.
+			 */
+			dpi->chunk_next = new_buff;
+			return -ENOSPC;
 		}
 
 		/*
@@ -265,13 +316,17 @@ __dpi_queue_write(struct roc_dpi *dpi, uint64_t *cmds, int cmd_count)
 		/* queue index may be greater than pool size */
 		if (dpi->chunk_head >= dpi->pool_size_m1) {
 			new_buff = dpi->chunk_next;
-			dpi->chunk_next =
-				(void *)roc_npa_aura_op_alloc(dpi->aura_handle,
-							      0);
+			dpi->chunk_next = (void *)roc_npa_aura_op_alloc(dpi->aura_handle, 0);
 			if (!dpi->chunk_next) {
-				plt_err("Failed to alloc next buffer from NPA");
-				return -ENOMEM;
+				plt_dp_dbg("Failed to alloc next buffer from NPA");
+
+				/* NPA failed to allocate a buffer. Restoring chunk_next
+				 * to its original address.
+				 */
+				dpi->chunk_next = new_buff;
+				return -ENOSPC;
 			}
+
 			/* Write next buffer address */
 			*ptr = (uint64_t)new_buff;
 			dpi->chunk_base = new_buff;
@@ -283,12 +338,13 @@ __dpi_queue_write(struct roc_dpi *dpi, uint64_t *cmds, int cmd_count)
 }
 
 static int
-cnxk_dmadev_copy(void *dev_private, uint16_t vchan, rte_iova_t src,
-		 rte_iova_t dst, uint32_t length, uint64_t flags)
+cnxk_dmadev_copy(void *dev_private, uint16_t vchan, rte_iova_t src, rte_iova_t dst, uint32_t length,
+		 uint64_t flags)
 {
 	struct cnxk_dpi_vf_s *dpivf = dev_private;
 	union dpi_instr_hdr_s *header = &dpivf->conf.hdr;
 	struct cnxk_dpi_compl_s *comp_ptr;
+	uint64_t cmd[DPI_MAX_CMD_SIZE];
 	rte_iova_t fptr, lptr;
 	int num_words = 0;
 	int rc;
@@ -296,7 +352,6 @@ cnxk_dmadev_copy(void *dev_private, uint16_t vchan, rte_iova_t src,
 	RTE_SET_USED(vchan);
 
 	comp_ptr = dpivf->conf.c_desc.compl_ptr[dpivf->conf.c_desc.tail];
-	comp_ptr->cdata = DPI_REQ_CDATA;
 	header->cn9k.ptr = (uint64_t)comp_ptr;
 	STRM_INC(dpivf->conf.c_desc, tail);
 
@@ -315,50 +370,49 @@ cnxk_dmadev_copy(void *dev_private, uint16_t vchan, rte_iova_t src,
 		lptr = dst;
 	}
 
-	dpivf->cmd[0] = header->u[0];
-	dpivf->cmd[1] = header->u[1];
-	dpivf->cmd[2] = header->u[2];
+	cmd[0] = header->u[0];
+	cmd[1] = header->u[1];
+	cmd[2] = header->u[2];
 	/* word3 is always 0 */
 	num_words += 4;
-	dpivf->cmd[num_words++] = length;
-	dpivf->cmd[num_words++] = fptr;
-	dpivf->cmd[num_words++] = length;
-	dpivf->cmd[num_words++] = lptr;
-
-	rc = __dpi_queue_write(&dpivf->rdpi, dpivf->cmd, num_words);
-	if (!rc) {
-		if (flags & RTE_DMA_OP_FLAG_SUBMIT) {
-			rte_wmb();
-			plt_write64(num_words, dpivf->rdpi.rbase + DPI_VDMA_DBELL);
-			dpivf->stats.submitted++;
-		} else {
-			dpivf->pending_num_words += num_words;
-			dpivf->pending++;
-		}
+	cmd[num_words++] = length;
+	cmd[num_words++] = fptr;
+	cmd[num_words++] = length;
+	cmd[num_words++] = lptr;
+
+	rc = __dpi_queue_write(&dpivf->rdpi, cmd, num_words);
+	if (unlikely(rc)) {
+		STRM_DEC(dpivf->conf.c_desc, tail);
+		return rc;
+	}
 
-		dpivf->num_words += num_words;
+	rte_wmb();
+	if (flags & RTE_DMA_OP_FLAG_SUBMIT) {
+		plt_write64(num_words, dpivf->rdpi.rbase + DPI_VDMA_DBELL);
+		dpivf->stats.submitted++;
+	} else {
+		dpivf->pnum_words += num_words;
+		dpivf->pending++;
 	}
 
-	return dpivf->desc_idx++;
+	return (dpivf->desc_idx++);
 }
 
 static int
-cnxk_dmadev_copy_sg(void *dev_private, uint16_t vchan,
-		    const struct rte_dma_sge *src,
-		    const struct rte_dma_sge *dst,
-		    uint16_t nb_src, uint16_t nb_dst, uint64_t flags)
+cnxk_dmadev_copy_sg(void *dev_private, uint16_t vchan, const struct rte_dma_sge *src,
+		    const struct rte_dma_sge *dst, uint16_t nb_src, uint16_t nb_dst, uint64_t flags)
 {
 	struct cnxk_dpi_vf_s *dpivf = dev_private;
 	union dpi_instr_hdr_s *header = &dpivf->conf.hdr;
 	const struct rte_dma_sge *fptr, *lptr;
 	struct cnxk_dpi_compl_s *comp_ptr;
+	uint64_t cmd[DPI_MAX_CMD_SIZE];
 	int num_words = 0;
 	int i, rc;
 
 	RTE_SET_USED(vchan);
 
 	comp_ptr = dpivf->conf.c_desc.compl_ptr[dpivf->conf.c_desc.tail];
-	comp_ptr->cdata = DPI_REQ_CDATA;
 	header->cn9k.ptr = (uint64_t)comp_ptr;
 	STRM_INC(dpivf->conf.c_desc, tail);
 
@@ -367,57 +421,59 @@ cnxk_dmadev_copy_sg(void *dev_private, uint16_t vchan,
 	 * For all other cases, src pointers are first pointers.
 	 */
 	if (header->cn9k.xtype == DPI_XTYPE_INBOUND) {
-		header->cn9k.nfst = nb_dst & 0xf;
-		header->cn9k.nlst = nb_src & 0xf;
+		header->cn9k.nfst = nb_dst & DPI_MAX_POINTER;
+		header->cn9k.nlst = nb_src & DPI_MAX_POINTER;
 		fptr = &dst[0];
 		lptr = &src[0];
 	} else {
-		header->cn9k.nfst = nb_src & 0xf;
-		header->cn9k.nlst = nb_dst & 0xf;
+		header->cn9k.nfst = nb_src & DPI_MAX_POINTER;
+		header->cn9k.nlst = nb_dst & DPI_MAX_POINTER;
 		fptr = &src[0];
 		lptr = &dst[0];
 	}
 
-	dpivf->cmd[0] = header->u[0];
-	dpivf->cmd[1] = header->u[1];
-	dpivf->cmd[2] = header->u[2];
+	cmd[0] = header->u[0];
+	cmd[1] = header->u[1];
+	cmd[2] = header->u[2];
 	num_words += 4;
 	for (i = 0; i < header->cn9k.nfst; i++) {
-		dpivf->cmd[num_words++] = (uint64_t)fptr->length;
-		dpivf->cmd[num_words++] = fptr->addr;
+		cmd[num_words++] = (uint64_t)fptr->length;
+		cmd[num_words++] = fptr->addr;
 		fptr++;
 	}
 
 	for (i = 0; i < header->cn9k.nlst; i++) {
-		dpivf->cmd[num_words++] = (uint64_t)lptr->length;
-		dpivf->cmd[num_words++] = lptr->addr;
+		cmd[num_words++] = (uint64_t)lptr->length;
+		cmd[num_words++] = lptr->addr;
 		lptr++;
 	}
 
-	rc = __dpi_queue_write(&dpivf->rdpi, dpivf->cmd, num_words);
-	if (!rc) {
-		if (flags & RTE_DMA_OP_FLAG_SUBMIT) {
-			rte_wmb();
-			plt_write64(num_words, dpivf->rdpi.rbase + DPI_VDMA_DBELL);
-			dpivf->stats.submitted += nb_src;
-		} else {
-			dpivf->pending_num_words += num_words;
-			dpivf->pending++;
-		}
+	rc = __dpi_queue_write(&dpivf->rdpi, cmd, num_words);
+	if (unlikely(rc)) {
+		STRM_DEC(dpivf->conf.c_desc, tail);
+		return rc;
+	}
 
-		dpivf->num_words += num_words;
+	if (flags & RTE_DMA_OP_FLAG_SUBMIT) {
+		rte_wmb();
+		plt_write64(num_words, dpivf->rdpi.rbase + DPI_VDMA_DBELL);
+		dpivf->stats.submitted += nb_src;
+	} else {
+		dpivf->pnum_words += num_words;
+		dpivf->pending++;
 	}
 
-	return (rc < 0) ? rc : dpivf->desc_idx++;
+	return (dpivf->desc_idx++);
 }
 
 static int
-cn10k_dmadev_copy(void *dev_private, uint16_t vchan, rte_iova_t src,
-		  rte_iova_t dst, uint32_t length, uint64_t flags)
+cn10k_dmadev_copy(void *dev_private, uint16_t vchan, rte_iova_t src, rte_iova_t dst,
+		  uint32_t length, uint64_t flags)
 {
 	struct cnxk_dpi_vf_s *dpivf = dev_private;
 	union dpi_instr_hdr_s *header = &dpivf->conf.hdr;
 	struct cnxk_dpi_compl_s *comp_ptr;
+	uint64_t cmd[DPI_MAX_CMD_SIZE];
 	rte_iova_t fptr, lptr;
 	int num_words = 0;
 	int rc;
@@ -425,7 +481,6 @@ cn10k_dmadev_copy(void *dev_private, uint16_t vchan, rte_iova_t src,
 	RTE_SET_USED(vchan);
 
 	comp_ptr = dpivf->conf.c_desc.compl_ptr[dpivf->conf.c_desc.tail];
-	comp_ptr->cdata = DPI_REQ_CDATA;
 	header->cn10k.ptr = (uint64_t)comp_ptr;
 	STRM_INC(dpivf->conf.c_desc, tail);
 
@@ -435,90 +490,91 @@ cn10k_dmadev_copy(void *dev_private, uint16_t vchan, rte_iova_t src,
 	fptr = src;
 	lptr = dst;
 
-	dpivf->cmd[0] = header->u[0];
-	dpivf->cmd[1] = header->u[1];
-	dpivf->cmd[2] = header->u[2];
+	cmd[0] = header->u[0];
+	cmd[1] = header->u[1];
+	cmd[2] = header->u[2];
 	/* word3 is always 0 */
 	num_words += 4;
-	dpivf->cmd[num_words++] = length;
-	dpivf->cmd[num_words++] = fptr;
-	dpivf->cmd[num_words++] = length;
-	dpivf->cmd[num_words++] = lptr;
-
-	rc = __dpi_queue_write(&dpivf->rdpi, dpivf->cmd, num_words);
-	if (!rc) {
-		if (flags & RTE_DMA_OP_FLAG_SUBMIT) {
-			rte_wmb();
-			plt_write64(num_words, dpivf->rdpi.rbase + DPI_VDMA_DBELL);
-			dpivf->stats.submitted++;
-		} else {
-			dpivf->pending_num_words += num_words;
-			dpivf->pending++;
-		}
+	cmd[num_words++] = length;
+	cmd[num_words++] = fptr;
+	cmd[num_words++] = length;
+	cmd[num_words++] = lptr;
+
+	rc = __dpi_queue_write(&dpivf->rdpi, cmd, num_words);
+	if (unlikely(rc)) {
+		STRM_DEC(dpivf->conf.c_desc, tail);
+		return rc;
+	}
 
-		dpivf->num_words += num_words;
+	if (flags & RTE_DMA_OP_FLAG_SUBMIT) {
+		rte_wmb();
+		plt_write64(num_words, dpivf->rdpi.rbase + DPI_VDMA_DBELL);
+		dpivf->stats.submitted++;
+	} else {
+		dpivf->pnum_words += num_words;
+		dpivf->pending++;
 	}
 
 	return dpivf->desc_idx++;
 }
 
 static int
-cn10k_dmadev_copy_sg(void *dev_private, uint16_t vchan,
-		     const struct rte_dma_sge *src,
-		     const struct rte_dma_sge *dst, uint16_t nb_src,
-		     uint16_t nb_dst, uint64_t flags)
+cn10k_dmadev_copy_sg(void *dev_private, uint16_t vchan, const struct rte_dma_sge *src,
+		     const struct rte_dma_sge *dst, uint16_t nb_src, uint16_t nb_dst,
+		     uint64_t flags)
 {
 	struct cnxk_dpi_vf_s *dpivf = dev_private;
 	union dpi_instr_hdr_s *header = &dpivf->conf.hdr;
 	const struct rte_dma_sge *fptr, *lptr;
 	struct cnxk_dpi_compl_s *comp_ptr;
+	uint64_t cmd[DPI_MAX_CMD_SIZE];
 	int num_words = 0;
 	int i, rc;
 
 	RTE_SET_USED(vchan);
 
 	comp_ptr = dpivf->conf.c_desc.compl_ptr[dpivf->conf.c_desc.tail];
-	comp_ptr->cdata = DPI_REQ_CDATA;
 	header->cn10k.ptr = (uint64_t)comp_ptr;
 	STRM_INC(dpivf->conf.c_desc, tail);
 
-	header->cn10k.nfst = nb_src & 0xf;
-	header->cn10k.nlst = nb_dst & 0xf;
+	header->cn10k.nfst = nb_src & DPI_MAX_POINTER;
+	header->cn10k.nlst = nb_dst & DPI_MAX_POINTER;
 	fptr = &src[0];
 	lptr = &dst[0];
 
-	dpivf->cmd[0] = header->u[0];
-	dpivf->cmd[1] = header->u[1];
-	dpivf->cmd[2] = header->u[2];
+	cmd[0] = header->u[0];
+	cmd[1] = header->u[1];
+	cmd[2] = header->u[2];
 	num_words += 4;
 
 	for (i = 0; i < header->cn10k.nfst; i++) {
-		dpivf->cmd[num_words++] = (uint64_t)fptr->length;
-		dpivf->cmd[num_words++] = fptr->addr;
+		cmd[num_words++] = (uint64_t)fptr->length;
+		cmd[num_words++] = fptr->addr;
 		fptr++;
 	}
 
 	for (i = 0; i < header->cn10k.nlst; i++) {
-		dpivf->cmd[num_words++] = (uint64_t)lptr->length;
-		dpivf->cmd[num_words++] = lptr->addr;
+		cmd[num_words++] = (uint64_t)lptr->length;
+		cmd[num_words++] = lptr->addr;
 		lptr++;
 	}
 
-	rc = __dpi_queue_write(&dpivf->rdpi, dpivf->cmd, num_words);
-	if (!rc) {
-		if (flags & RTE_DMA_OP_FLAG_SUBMIT) {
-			rte_wmb();
-			plt_write64(num_words, dpivf->rdpi.rbase + DPI_VDMA_DBELL);
-			dpivf->stats.submitted += nb_src;
-		} else {
-			dpivf->pending_num_words += num_words;
-			dpivf->pending++;
-		}
+	rc = __dpi_queue_write(&dpivf->rdpi, cmd, num_words);
+	if (unlikely(rc)) {
+		STRM_DEC(dpivf->conf.c_desc, tail);
+		return rc;
+	}
 
-		dpivf->num_words += num_words;
+	if (flags & RTE_DMA_OP_FLAG_SUBMIT) {
+		rte_wmb();
+		plt_write64(num_words, dpivf->rdpi.rbase + DPI_VDMA_DBELL);
+		dpivf->stats.submitted += nb_src;
+	} else {
+		dpivf->pnum_words += num_words;
+		dpivf->pending++;
 	}
 
-	return (rc < 0) ? rc : dpivf->desc_idx++;
+	return (dpivf->desc_idx++);
 }
 
 static uint16_t
@@ -526,35 +582,28 @@ cnxk_dmadev_completed(void *dev_private, uint16_t vchan, const uint16_t nb_cpls,
 		      bool *has_error)
 {
 	struct cnxk_dpi_vf_s *dpivf = dev_private;
+	struct cnxk_dpi_cdesc_data_s *c_desc = &dpivf->conf.c_desc;
 	struct cnxk_dpi_compl_s *comp_ptr;
 	int cnt;
 
 	RTE_SET_USED(vchan);
 
-	if (dpivf->stats.submitted == dpivf->stats.completed) {
-		*last_idx = dpivf->stats.completed - 1;
-		return 0;
-	}
-
 	for (cnt = 0; cnt < nb_cpls; cnt++) {
-		comp_ptr = dpivf->conf.c_desc.compl_ptr[dpivf->conf.c_desc.head];
+		comp_ptr = c_desc->compl_ptr[c_desc->head];
 
 		if (comp_ptr->cdata) {
 			if (comp_ptr->cdata == DPI_REQ_CDATA)
 				break;
 			*has_error = 1;
 			dpivf->stats.errors++;
-			STRM_INC(dpivf->conf.c_desc, head);
+			STRM_INC(*c_desc, head);
 			break;
 		}
 
 		comp_ptr->cdata = DPI_REQ_CDATA;
-		STRM_INC(dpivf->conf.c_desc, head);
+		STRM_INC(*c_desc, head);
 	}
 
-	if (*has_error)
-		cnt = cnt - 1;
-
 	dpivf->stats.completed += cnt;
 	*last_idx = dpivf->stats.completed - 1;
 
@@ -562,24 +611,19 @@ cnxk_dmadev_completed(void *dev_private, uint16_t vchan, const uint16_t nb_cpls,
 }
 
 static uint16_t
-cnxk_dmadev_completed_status(void *dev_private, uint16_t vchan,
-			     const uint16_t nb_cpls, uint16_t *last_idx,
-			     enum rte_dma_status_code *status)
+cnxk_dmadev_completed_status(void *dev_private, uint16_t vchan, const uint16_t nb_cpls,
+			     uint16_t *last_idx, enum rte_dma_status_code *status)
 {
 	struct cnxk_dpi_vf_s *dpivf = dev_private;
+	struct cnxk_dpi_cdesc_data_s *c_desc = &dpivf->conf.c_desc;
+	struct cnxk_dpi_compl_s *comp_ptr;
 	int cnt;
 
 	RTE_SET_USED(vchan);
 	RTE_SET_USED(last_idx);
 
-	if (dpivf->stats.submitted == dpivf->stats.completed) {
-		*last_idx = dpivf->stats.completed - 1;
-		return 0;
-	}
-
 	for (cnt = 0; cnt < nb_cpls; cnt++) {
-		struct cnxk_dpi_compl_s *comp_ptr =
-			dpivf->conf.c_desc.compl_ptr[dpivf->conf.c_desc.head];
+		comp_ptr = c_desc->compl_ptr[c_desc->head];
 		status[cnt] = comp_ptr->cdata;
 		if (status[cnt]) {
 			if (status[cnt] == DPI_REQ_CDATA)
@@ -588,7 +632,7 @@ cnxk_dmadev_completed_status(void *dev_private, uint16_t vchan,
 			dpivf->stats.errors++;
 		}
 		comp_ptr->cdata = DPI_REQ_CDATA;
-		STRM_INC(dpivf->conf.c_desc, head);
+		STRM_INC(*c_desc, head);
 	}
 
 	dpivf->stats.completed += cnt;
@@ -601,47 +645,38 @@ static uint16_t
 cnxk_damdev_burst_capacity(const void *dev_private, uint16_t vchan)
 {
 	const struct cnxk_dpi_vf_s *dpivf = (const struct cnxk_dpi_vf_s *)dev_private;
+	uint16_t burst_cap;
 
 	RTE_SET_USED(vchan);
 
-	if (dpivf->conf.c_desc.head == dpivf->conf.c_desc.tail)
-		return dpivf->conf.c_desc.max_cnt;
-
-	if ((dpivf->conf.c_desc.head == (dpivf->conf.c_desc.tail + 1)) ||
-	    (dpivf->conf.c_desc.tail == 0 && dpivf->conf.c_desc.head == dpivf->conf.c_desc.max_cnt))
-		return 0;
-
-	if (dpivf->conf.c_desc.head < dpivf->conf.c_desc.tail)
-		return (dpivf->conf.c_desc.max_cnt -
-			(dpivf->conf.c_desc.tail - dpivf->conf.c_desc.head));
-
-	if (dpivf->conf.c_desc.head > dpivf->conf.c_desc.tail)
-		return (((dpivf->conf.c_desc.max_cnt + dpivf->conf.c_desc.head) %
-			 dpivf->conf.c_desc.max_cnt) -
-			dpivf->conf.c_desc.tail);
+	burst_cap = dpivf->conf.c_desc.max_cnt -
+		    ((dpivf->stats.submitted - dpivf->stats.completed) + dpivf->pending) + 1;
 
-	return 0;
+	return burst_cap;
 }
 
 static int
 cnxk_dmadev_submit(void *dev_private, uint16_t vchan __rte_unused)
 {
 	struct cnxk_dpi_vf_s *dpivf = dev_private;
-	uint32_t num_words = dpivf->pending_num_words;
+	uint32_t num_words = dpivf->pnum_words;
+
+	if (!dpivf->pnum_words)
+		return 0;
 
 	rte_wmb();
 	plt_write64(num_words, dpivf->rdpi.rbase + DPI_VDMA_DBELL);
 
 	dpivf->stats.submitted += dpivf->pending;
-	dpivf->pending_num_words = 0;
+	dpivf->pnum_words = 0;
 	dpivf->pending = 0;
 
 	return 0;
 }
 
 static int
-cnxk_stats_get(const struct rte_dma_dev *dev, uint16_t vchan,
-	       struct rte_dma_stats *rte_stats, uint32_t size)
+cnxk_stats_get(const struct rte_dma_dev *dev, uint16_t vchan, struct rte_dma_stats *rte_stats,
+	       uint32_t size)
 {
 	struct cnxk_dpi_vf_s *dpivf = dev->fp_obj->dev_private;
 	struct rte_dma_stats *stats = &dpivf->stats;
@@ -689,8 +724,7 @@ static const struct rte_dma_dev_ops cnxk_dmadev_ops = {
 };
 
 static int
-cnxk_dmadev_probe(struct rte_pci_driver *pci_drv __rte_unused,
-		  struct rte_pci_device *pci_dev)
+cnxk_dmadev_probe(struct rte_pci_driver *pci_drv __rte_unused, struct rte_pci_device *pci_dev)
 {
 	struct cnxk_dpi_vf_s *dpivf = NULL;
 	char name[RTE_DEV_NAME_MAX_LEN];
@@ -709,8 +743,7 @@ cnxk_dmadev_probe(struct rte_pci_driver *pci_drv __rte_unused,
 	memset(name, 0, sizeof(name));
 	rte_pci_device_name(&pci_dev->addr, name, sizeof(name));
 
-	dmadev = rte_dma_pmd_allocate(name, pci_dev->device.numa_node,
-				      sizeof(*dpivf));
+	dmadev = rte_dma_pmd_allocate(name, pci_dev->device.numa_node, sizeof(*dpivf));
 	if (dmadev == NULL) {
 		plt_err("dma device allocation failed for %s", name);
 		return -ENOMEM;
@@ -767,20 +800,17 @@ cnxk_dmadev_remove(struct rte_pci_device *pci_dev)
 }
 
 static const struct rte_pci_id cnxk_dma_pci_map[] = {
-	{
-		RTE_PCI_DEVICE(PCI_VENDOR_ID_CAVIUM,
-			       PCI_DEVID_CNXK_DPI_VF)
-	},
+	{RTE_PCI_DEVICE(PCI_VENDOR_ID_CAVIUM, PCI_DEVID_CNXK_DPI_VF)},
 	{
 		.vendor_id = 0,
 	},
 };
 
 static struct rte_pci_driver cnxk_dmadev = {
-	.id_table  = cnxk_dma_pci_map,
+	.id_table = cnxk_dma_pci_map,
 	.drv_flags = RTE_PCI_DRV_NEED_MAPPING | RTE_PCI_DRV_NEED_IOVA_AS_VA,
-	.probe     = cnxk_dmadev_probe,
-	.remove    = cnxk_dmadev_remove,
+	.probe = cnxk_dmadev_probe,
+	.remove = cnxk_dmadev_remove,
 };
 
 RTE_PMD_REGISTER_PCI(cnxk_dmadev_pci_driver, cnxk_dmadev);
diff --git a/drivers/dma/cnxk/cnxk_dmadev.h b/drivers/dma/cnxk/cnxk_dmadev.h
index 24ce94b9c1..9563295af0 100644
--- a/drivers/dma/cnxk/cnxk_dmadev.h
+++ b/drivers/dma/cnxk/cnxk_dmadev.h
@@ -4,16 +4,21 @@
 #ifndef CNXK_DMADEV_H
 #define CNXK_DMADEV_H
 
+#include <roc_api.h>
+
 #define DPI_MAX_POINTER	 15
-#define DPI_QUEUE_STOP	 0x0
-#define DPI_QUEUE_START	 0x1
-#define STRM_INC(s, var) ((s).var = ((s).var + 1) % (s).max_cnt)
+#define STRM_INC(s, var) ((s).var = ((s).var + 1) & (s).max_cnt)
+#define STRM_DEC(s, var) ((s).var = ((s).var - 1) == -1 ? (s).max_cnt : ((s).var - 1))
 #define DPI_MAX_DESC	 1024
 
 /* Set Completion data to 0xFF when request submitted,
  * upon successful request completion engine reset to completion status
  */
-#define DPI_REQ_CDATA		0xFF
+#define DPI_REQ_CDATA 0xFF
+
+#define CNXK_DPI_DEV_CONFIG   (1ULL << 0)
+#define CNXK_DPI_VCHAN_CONFIG (1ULL << 1)
+#define CNXK_DPI_DEV_START    (1ULL << 2)
 
 struct cnxk_dpi_compl_s {
 	uint64_t cdata;
@@ -21,7 +26,7 @@ struct cnxk_dpi_compl_s {
 };
 
 struct cnxk_dpi_cdesc_data_s {
-	struct cnxk_dpi_compl_s *compl_ptr[DPI_MAX_DESC];
+	struct cnxk_dpi_compl_s **compl_ptr;
 	uint16_t max_cnt;
 	uint16_t head;
 	uint16_t tail;
@@ -36,11 +41,10 @@ struct cnxk_dpi_vf_s {
 	struct roc_dpi rdpi;
 	struct cnxk_dpi_conf conf;
 	struct rte_dma_stats stats;
-	uint64_t cmd[DPI_MAX_CMD_SIZE];
-	uint32_t num_words;
 	uint16_t pending;
-	uint16_t pending_num_words;
+	uint16_t pnum_words;
 	uint16_t desc_idx;
+	uint16_t flag;
 };
 
 #endif
-- 
2.25.1


^ permalink raw reply	[flat|nested] 46+ messages in thread

* [PATCH 3/7] dma/cnxk: add DMA devops for all models of cn10xxx
  2023-06-28 17:18 [PATCH 1/7] dma/cnxk: changes for dmadev autotest Amit Prakash Shukla
  2023-06-28 17:18 ` [PATCH 2/7] drivers: changes for dmadev driver Amit Prakash Shukla
@ 2023-06-28 17:18 ` Amit Prakash Shukla
  2023-06-28 17:18 ` [PATCH 4/7] dma/cnxk: update func field based on transfer type Amit Prakash Shukla
                   ` (4 subsequent siblings)
  6 siblings, 0 replies; 46+ messages in thread
From: Amit Prakash Shukla @ 2023-06-28 17:18 UTC (permalink / raw)
  To: Vamsi Attunuru; +Cc: dev, jerinj, Amit Prakash Shukla, Radha Mohan Chintakuntla

Valid function pointers are set for DMA device operations
i.e. cn10k_dmadev_ops are used for all cn10k devices.

Signed-off-by: Radha Mohan Chintakuntla <radhac@marvell.com>
Signed-off-by: Amit Prakash Shukla <amitprakashs@marvell.com>
---
 drivers/dma/cnxk/cnxk_dmadev.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/drivers/dma/cnxk/cnxk_dmadev.c b/drivers/dma/cnxk/cnxk_dmadev.c
index a0152fc6df..1dc124e68f 100644
--- a/drivers/dma/cnxk/cnxk_dmadev.c
+++ b/drivers/dma/cnxk/cnxk_dmadev.c
@@ -763,7 +763,9 @@ cnxk_dmadev_probe(struct rte_pci_driver *pci_drv __rte_unused, struct rte_pci_de
 	dmadev->fp_obj->burst_capacity = cnxk_damdev_burst_capacity;
 
 	if (pci_dev->id.subsystem_device_id == PCI_SUBSYSTEM_DEVID_CN10KA ||
+	    pci_dev->id.subsystem_device_id == PCI_SUBSYSTEM_DEVID_CN10KAS ||
 	    pci_dev->id.subsystem_device_id == PCI_SUBSYSTEM_DEVID_CNF10KA ||
+	    pci_dev->id.subsystem_device_id == PCI_SUBSYSTEM_DEVID_CNF10KB ||
 	    pci_dev->id.subsystem_device_id == PCI_SUBSYSTEM_DEVID_CN10KB) {
 		dmadev->dev_ops = &cn10k_dmadev_ops;
 		dmadev->fp_obj->copy = cn10k_dmadev_copy;
-- 
2.25.1


^ permalink raw reply	[flat|nested] 46+ messages in thread

* [PATCH 4/7] dma/cnxk: update func field based on transfer type
  2023-06-28 17:18 [PATCH 1/7] dma/cnxk: changes for dmadev autotest Amit Prakash Shukla
  2023-06-28 17:18 ` [PATCH 2/7] drivers: changes for dmadev driver Amit Prakash Shukla
  2023-06-28 17:18 ` [PATCH 3/7] dma/cnxk: add DMA devops for all models of cn10xxx Amit Prakash Shukla
@ 2023-06-28 17:18 ` Amit Prakash Shukla
  2023-06-28 17:18 ` [PATCH 5/7] dma/cnxk: increase vchan per queue to max 4 Amit Prakash Shukla
                   ` (3 subsequent siblings)
  6 siblings, 0 replies; 46+ messages in thread
From: Amit Prakash Shukla @ 2023-06-28 17:18 UTC (permalink / raw)
  To: Vamsi Attunuru; +Cc: dev, jerinj, Amit Prakash Shukla, Radha Mohan Chintakuntla

Use pfid and vfid of src_port for incoming DMA transfers and dst_port
for outgoing DMA transfers.

Signed-off-by: Radha Mohan Chintakuntla <radhac@marvell.com>
Signed-off-by: Amit Prakash Shukla <amitprakashs@marvell.com>
---
 drivers/dma/cnxk/cnxk_dmadev.c | 26 ++++++++++++++++++++++----
 1 file changed, 22 insertions(+), 4 deletions(-)

diff --git a/drivers/dma/cnxk/cnxk_dmadev.c b/drivers/dma/cnxk/cnxk_dmadev.c
index 1dc124e68f..d8cfb98cd7 100644
--- a/drivers/dma/cnxk/cnxk_dmadev.c
+++ b/drivers/dma/cnxk/cnxk_dmadev.c
@@ -84,13 +84,21 @@ cnxk_dmadev_vchan_setup(struct rte_dma_dev *dev, uint16_t vchan,
 		header->cn9k.xtype = DPI_XTYPE_INBOUND;
 		header->cn9k.lport = conf->src_port.pcie.coreid;
 		header->cn9k.fport = 0;
-		header->cn9k.pvfe = 1;
+		header->cn9k.pvfe = conf->src_port.pcie.vfen;
+		if (header->cn9k.pvfe) {
+			header->cn9k.func = conf->src_port.pcie.pfid << 12;
+			header->cn9k.func |= conf->src_port.pcie.vfid;
+		}
 		break;
 	case RTE_DMA_DIR_MEM_TO_DEV:
 		header->cn9k.xtype = DPI_XTYPE_OUTBOUND;
 		header->cn9k.lport = 0;
 		header->cn9k.fport = conf->dst_port.pcie.coreid;
-		header->cn9k.pvfe = 1;
+		header->cn9k.pvfe = conf->dst_port.pcie.vfen;
+		if (header->cn9k.pvfe) {
+			header->cn9k.func = conf->dst_port.pcie.pfid << 12;
+			header->cn9k.func |= conf->dst_port.pcie.vfid;
+		}
 		break;
 	case RTE_DMA_DIR_MEM_TO_MEM:
 		header->cn9k.xtype = DPI_XTYPE_INTERNAL_ONLY;
@@ -102,6 +110,7 @@ cnxk_dmadev_vchan_setup(struct rte_dma_dev *dev, uint16_t vchan,
 		header->cn9k.xtype = DPI_XTYPE_EXTERNAL_ONLY;
 		header->cn9k.lport = conf->src_port.pcie.coreid;
 		header->cn9k.fport = conf->dst_port.pcie.coreid;
+		header->cn9k.pvfe = 0;
 	};
 
 	max_desc = conf->nb_desc;
@@ -159,13 +168,21 @@ cn10k_dmadev_vchan_setup(struct rte_dma_dev *dev, uint16_t vchan,
 		header->cn10k.xtype = DPI_XTYPE_INBOUND;
 		header->cn10k.lport = conf->src_port.pcie.coreid;
 		header->cn10k.fport = 0;
-		header->cn10k.pvfe = 1;
+		header->cn10k.pvfe = conf->src_port.pcie.vfen;
+		if (header->cn10k.pvfe) {
+			header->cn10k.func = conf->src_port.pcie.pfid << 12;
+			header->cn10k.func |= conf->src_port.pcie.vfid;
+		}
 		break;
 	case RTE_DMA_DIR_MEM_TO_DEV:
 		header->cn10k.xtype = DPI_XTYPE_OUTBOUND;
 		header->cn10k.lport = 0;
 		header->cn10k.fport = conf->dst_port.pcie.coreid;
-		header->cn10k.pvfe = 1;
+		header->cn10k.pvfe = conf->dst_port.pcie.vfen;
+		if (header->cn10k.pvfe) {
+			header->cn10k.func = conf->dst_port.pcie.pfid << 12;
+			header->cn10k.func |= conf->dst_port.pcie.vfid;
+		}
 		break;
 	case RTE_DMA_DIR_MEM_TO_MEM:
 		header->cn10k.xtype = DPI_XTYPE_INTERNAL_ONLY;
@@ -177,6 +194,7 @@ cn10k_dmadev_vchan_setup(struct rte_dma_dev *dev, uint16_t vchan,
 		header->cn10k.xtype = DPI_XTYPE_EXTERNAL_ONLY;
 		header->cn10k.lport = conf->src_port.pcie.coreid;
 		header->cn10k.fport = conf->dst_port.pcie.coreid;
+		header->cn10k.pvfe = 0;
 	};
 
 	max_desc = conf->nb_desc;
-- 
2.25.1


^ permalink raw reply	[flat|nested] 46+ messages in thread

* [PATCH 5/7] dma/cnxk: increase vchan per queue to max 4
  2023-06-28 17:18 [PATCH 1/7] dma/cnxk: changes for dmadev autotest Amit Prakash Shukla
                   ` (2 preceding siblings ...)
  2023-06-28 17:18 ` [PATCH 4/7] dma/cnxk: update func field based on transfer type Amit Prakash Shukla
@ 2023-06-28 17:18 ` Amit Prakash Shukla
  2023-06-28 17:18 ` [PATCH 6/7] dma/cnxk: vchan support enhancement Amit Prakash Shukla
                   ` (2 subsequent siblings)
  6 siblings, 0 replies; 46+ messages in thread
From: Amit Prakash Shukla @ 2023-06-28 17:18 UTC (permalink / raw)
  To: Vamsi Attunuru; +Cc: dev, jerinj, Amit Prakash Shukla, Radha Mohan Chintakuntla

To support multiple directions in same queue make use of multiple vchan
per queue. Each vchan can be configured in some direction and used.

Signed-off-by: Amit Prakash Shukla <amitprakashs@marvell.com>
Signed-off-by: Radha Mohan Chintakuntla <radhac@marvell.com>
---
 drivers/dma/cnxk/cnxk_dmadev.c | 68 +++++++++++++++-------------------
 drivers/dma/cnxk/cnxk_dmadev.h | 11 +++---
 2 files changed, 36 insertions(+), 43 deletions(-)

diff --git a/drivers/dma/cnxk/cnxk_dmadev.c b/drivers/dma/cnxk/cnxk_dmadev.c
index d8cfb98cd7..7d83b70e8b 100644
--- a/drivers/dma/cnxk/cnxk_dmadev.c
+++ b/drivers/dma/cnxk/cnxk_dmadev.c
@@ -22,8 +22,8 @@ cnxk_dmadev_info_get(const struct rte_dma_dev *dev, struct rte_dma_info *dev_inf
 	RTE_SET_USED(dev);
 	RTE_SET_USED(size);
 
-	dev_info->max_vchans = 1;
-	dev_info->nb_vchans = 1;
+	dev_info->max_vchans = MAX_VCHANS_PER_QUEUE;
+	dev_info->nb_vchans = MAX_VCHANS_PER_QUEUE;
 	dev_info->dev_capa = RTE_DMA_CAPA_MEM_TO_MEM | RTE_DMA_CAPA_MEM_TO_DEV |
 			     RTE_DMA_CAPA_DEV_TO_MEM | RTE_DMA_CAPA_DEV_TO_DEV |
 			     RTE_DMA_CAPA_OPS_COPY | RTE_DMA_CAPA_OPS_COPY_SG;
@@ -65,13 +65,12 @@ cnxk_dmadev_vchan_setup(struct rte_dma_dev *dev, uint16_t vchan,
 			const struct rte_dma_vchan_conf *conf, uint32_t conf_sz)
 {
 	struct cnxk_dpi_vf_s *dpivf = dev->fp_obj->dev_private;
-	struct cnxk_dpi_conf *dpi_conf = &dpivf->conf;
+	struct cnxk_dpi_conf *dpi_conf = &dpivf->conf[vchan];
 	union dpi_instr_hdr_s *header = &dpi_conf->hdr;
 	uint16_t max_desc;
 	uint32_t size;
 	int i;
 
-	RTE_SET_USED(vchan);
 	RTE_SET_USED(conf_sz);
 
 	if (dpivf->flag & CNXK_DPI_VCHAN_CONFIG)
@@ -149,13 +148,12 @@ cn10k_dmadev_vchan_setup(struct rte_dma_dev *dev, uint16_t vchan,
 			 const struct rte_dma_vchan_conf *conf, uint32_t conf_sz)
 {
 	struct cnxk_dpi_vf_s *dpivf = dev->fp_obj->dev_private;
-	struct cnxk_dpi_conf *dpi_conf = &dpivf->conf;
+	struct cnxk_dpi_conf *dpi_conf = &dpivf->conf[vchan];
 	union dpi_instr_hdr_s *header = &dpi_conf->hdr;
 	uint16_t max_desc;
 	uint32_t size;
 	int i;
 
-	RTE_SET_USED(vchan);
 	RTE_SET_USED(conf_sz);
 
 	if (dpivf->flag & CNXK_DPI_VCHAN_CONFIG)
@@ -360,18 +358,17 @@ cnxk_dmadev_copy(void *dev_private, uint16_t vchan, rte_iova_t src, rte_iova_t d
 		 uint64_t flags)
 {
 	struct cnxk_dpi_vf_s *dpivf = dev_private;
-	union dpi_instr_hdr_s *header = &dpivf->conf.hdr;
+	struct cnxk_dpi_conf *dpi_conf = &dpivf->conf[vchan];
+	union dpi_instr_hdr_s *header = &dpi_conf->hdr;
 	struct cnxk_dpi_compl_s *comp_ptr;
 	uint64_t cmd[DPI_MAX_CMD_SIZE];
 	rte_iova_t fptr, lptr;
 	int num_words = 0;
 	int rc;
 
-	RTE_SET_USED(vchan);
-
-	comp_ptr = dpivf->conf.c_desc.compl_ptr[dpivf->conf.c_desc.tail];
+	comp_ptr = dpi_conf->c_desc.compl_ptr[dpi_conf->c_desc.tail];
 	header->cn9k.ptr = (uint64_t)comp_ptr;
-	STRM_INC(dpivf->conf.c_desc, tail);
+	STRM_INC(dpi_conf->c_desc, tail);
 
 	header->cn9k.nfst = 1;
 	header->cn9k.nlst = 1;
@@ -400,7 +397,7 @@ cnxk_dmadev_copy(void *dev_private, uint16_t vchan, rte_iova_t src, rte_iova_t d
 
 	rc = __dpi_queue_write(&dpivf->rdpi, cmd, num_words);
 	if (unlikely(rc)) {
-		STRM_DEC(dpivf->conf.c_desc, tail);
+		STRM_DEC(dpi_conf->c_desc, tail);
 		return rc;
 	}
 
@@ -421,18 +418,17 @@ cnxk_dmadev_copy_sg(void *dev_private, uint16_t vchan, const struct rte_dma_sge
 		    const struct rte_dma_sge *dst, uint16_t nb_src, uint16_t nb_dst, uint64_t flags)
 {
 	struct cnxk_dpi_vf_s *dpivf = dev_private;
-	union dpi_instr_hdr_s *header = &dpivf->conf.hdr;
+	struct cnxk_dpi_conf *dpi_conf = &dpivf->conf[vchan];
+	union dpi_instr_hdr_s *header = &dpi_conf->hdr;
 	const struct rte_dma_sge *fptr, *lptr;
 	struct cnxk_dpi_compl_s *comp_ptr;
 	uint64_t cmd[DPI_MAX_CMD_SIZE];
 	int num_words = 0;
 	int i, rc;
 
-	RTE_SET_USED(vchan);
-
-	comp_ptr = dpivf->conf.c_desc.compl_ptr[dpivf->conf.c_desc.tail];
+	comp_ptr = dpi_conf->c_desc.compl_ptr[dpi_conf->c_desc.tail];
 	header->cn9k.ptr = (uint64_t)comp_ptr;
-	STRM_INC(dpivf->conf.c_desc, tail);
+	STRM_INC(dpi_conf->c_desc, tail);
 
 	/*
 	 * For inbound case, src pointers are last pointers.
@@ -468,7 +464,7 @@ cnxk_dmadev_copy_sg(void *dev_private, uint16_t vchan, const struct rte_dma_sge
 
 	rc = __dpi_queue_write(&dpivf->rdpi, cmd, num_words);
 	if (unlikely(rc)) {
-		STRM_DEC(dpivf->conf.c_desc, tail);
+		STRM_DEC(dpi_conf->c_desc, tail);
 		return rc;
 	}
 
@@ -489,18 +485,17 @@ cn10k_dmadev_copy(void *dev_private, uint16_t vchan, rte_iova_t src, rte_iova_t
 		  uint32_t length, uint64_t flags)
 {
 	struct cnxk_dpi_vf_s *dpivf = dev_private;
-	union dpi_instr_hdr_s *header = &dpivf->conf.hdr;
+	struct cnxk_dpi_conf *dpi_conf = &dpivf->conf[vchan];
+	union dpi_instr_hdr_s *header = &dpi_conf->hdr;
 	struct cnxk_dpi_compl_s *comp_ptr;
 	uint64_t cmd[DPI_MAX_CMD_SIZE];
 	rte_iova_t fptr, lptr;
 	int num_words = 0;
 	int rc;
 
-	RTE_SET_USED(vchan);
-
-	comp_ptr = dpivf->conf.c_desc.compl_ptr[dpivf->conf.c_desc.tail];
+	comp_ptr = dpi_conf->c_desc.compl_ptr[dpi_conf->c_desc.tail];
 	header->cn10k.ptr = (uint64_t)comp_ptr;
-	STRM_INC(dpivf->conf.c_desc, tail);
+	STRM_INC(dpi_conf->c_desc, tail);
 
 	header->cn10k.nfst = 1;
 	header->cn10k.nlst = 1;
@@ -520,7 +515,7 @@ cn10k_dmadev_copy(void *dev_private, uint16_t vchan, rte_iova_t src, rte_iova_t
 
 	rc = __dpi_queue_write(&dpivf->rdpi, cmd, num_words);
 	if (unlikely(rc)) {
-		STRM_DEC(dpivf->conf.c_desc, tail);
+		STRM_DEC(dpi_conf->c_desc, tail);
 		return rc;
 	}
 
@@ -542,18 +537,17 @@ cn10k_dmadev_copy_sg(void *dev_private, uint16_t vchan, const struct rte_dma_sge
 		     uint64_t flags)
 {
 	struct cnxk_dpi_vf_s *dpivf = dev_private;
-	union dpi_instr_hdr_s *header = &dpivf->conf.hdr;
+	struct cnxk_dpi_conf *dpi_conf = &dpivf->conf[vchan];
+	union dpi_instr_hdr_s *header = &dpi_conf->hdr;
 	const struct rte_dma_sge *fptr, *lptr;
 	struct cnxk_dpi_compl_s *comp_ptr;
 	uint64_t cmd[DPI_MAX_CMD_SIZE];
 	int num_words = 0;
 	int i, rc;
 
-	RTE_SET_USED(vchan);
-
-	comp_ptr = dpivf->conf.c_desc.compl_ptr[dpivf->conf.c_desc.tail];
+	comp_ptr = dpi_conf->c_desc.compl_ptr[dpi_conf->c_desc.tail];
 	header->cn10k.ptr = (uint64_t)comp_ptr;
-	STRM_INC(dpivf->conf.c_desc, tail);
+	STRM_INC(dpi_conf->c_desc, tail);
 
 	header->cn10k.nfst = nb_src & DPI_MAX_POINTER;
 	header->cn10k.nlst = nb_dst & DPI_MAX_POINTER;
@@ -579,7 +573,7 @@ cn10k_dmadev_copy_sg(void *dev_private, uint16_t vchan, const struct rte_dma_sge
 
 	rc = __dpi_queue_write(&dpivf->rdpi, cmd, num_words);
 	if (unlikely(rc)) {
-		STRM_DEC(dpivf->conf.c_desc, tail);
+		STRM_DEC(dpi_conf->c_desc, tail);
 		return rc;
 	}
 
@@ -600,12 +594,11 @@ cnxk_dmadev_completed(void *dev_private, uint16_t vchan, const uint16_t nb_cpls,
 		      bool *has_error)
 {
 	struct cnxk_dpi_vf_s *dpivf = dev_private;
-	struct cnxk_dpi_cdesc_data_s *c_desc = &dpivf->conf.c_desc;
+	struct cnxk_dpi_conf *dpi_conf = &dpivf->conf[vchan];
+	struct cnxk_dpi_cdesc_data_s *c_desc = &dpi_conf->c_desc;
 	struct cnxk_dpi_compl_s *comp_ptr;
 	int cnt;
 
-	RTE_SET_USED(vchan);
-
 	for (cnt = 0; cnt < nb_cpls; cnt++) {
 		comp_ptr = c_desc->compl_ptr[c_desc->head];
 
@@ -633,11 +626,11 @@ cnxk_dmadev_completed_status(void *dev_private, uint16_t vchan, const uint16_t n
 			     uint16_t *last_idx, enum rte_dma_status_code *status)
 {
 	struct cnxk_dpi_vf_s *dpivf = dev_private;
-	struct cnxk_dpi_cdesc_data_s *c_desc = &dpivf->conf.c_desc;
+	struct cnxk_dpi_conf *dpi_conf = &dpivf->conf[vchan];
+	struct cnxk_dpi_cdesc_data_s *c_desc = &dpi_conf->c_desc;
 	struct cnxk_dpi_compl_s *comp_ptr;
 	int cnt;
 
-	RTE_SET_USED(vchan);
 	RTE_SET_USED(last_idx);
 
 	for (cnt = 0; cnt < nb_cpls; cnt++) {
@@ -663,11 +656,10 @@ static uint16_t
 cnxk_damdev_burst_capacity(const void *dev_private, uint16_t vchan)
 {
 	const struct cnxk_dpi_vf_s *dpivf = (const struct cnxk_dpi_vf_s *)dev_private;
+	const struct cnxk_dpi_conf *dpi_conf = &dpivf->conf[vchan];
 	uint16_t burst_cap;
 
-	RTE_SET_USED(vchan);
-
-	burst_cap = dpivf->conf.c_desc.max_cnt -
+	burst_cap = dpi_conf->c_desc.max_cnt -
 		    ((dpivf->stats.submitted - dpivf->stats.completed) + dpivf->pending) + 1;
 
 	return burst_cap;
diff --git a/drivers/dma/cnxk/cnxk_dmadev.h b/drivers/dma/cnxk/cnxk_dmadev.h
index 9563295af0..4693960a19 100644
--- a/drivers/dma/cnxk/cnxk_dmadev.h
+++ b/drivers/dma/cnxk/cnxk_dmadev.h
@@ -6,10 +6,11 @@
 
 #include <roc_api.h>
 
-#define DPI_MAX_POINTER	 15
-#define STRM_INC(s, var) ((s).var = ((s).var + 1) & (s).max_cnt)
-#define STRM_DEC(s, var) ((s).var = ((s).var - 1) == -1 ? (s).max_cnt : ((s).var - 1))
-#define DPI_MAX_DESC	 1024
+#define DPI_MAX_POINTER	     15
+#define STRM_INC(s, var)     ((s).var = ((s).var + 1) & (s).max_cnt)
+#define STRM_DEC(s, var)     ((s).var = ((s).var - 1) == -1 ? (s).max_cnt : ((s).var - 1))
+#define DPI_MAX_DESC	     1024
+#define MAX_VCHANS_PER_QUEUE 4
 
 /* Set Completion data to 0xFF when request submitted,
  * upon successful request completion engine reset to completion status
@@ -39,7 +40,7 @@ struct cnxk_dpi_conf {
 
 struct cnxk_dpi_vf_s {
 	struct roc_dpi rdpi;
-	struct cnxk_dpi_conf conf;
+	struct cnxk_dpi_conf conf[MAX_VCHANS_PER_QUEUE];
 	struct rte_dma_stats stats;
 	uint16_t pending;
 	uint16_t pnum_words;
-- 
2.25.1


^ permalink raw reply	[flat|nested] 46+ messages in thread

* [PATCH 6/7] dma/cnxk: vchan support enhancement
  2023-06-28 17:18 [PATCH 1/7] dma/cnxk: changes for dmadev autotest Amit Prakash Shukla
                   ` (3 preceding siblings ...)
  2023-06-28 17:18 ` [PATCH 5/7] dma/cnxk: increase vchan per queue to max 4 Amit Prakash Shukla
@ 2023-06-28 17:18 ` Amit Prakash Shukla
  2023-06-28 17:18 ` [PATCH 7/7] common/cnxk: use unique name for DPI memzone Amit Prakash Shukla
  2023-07-31 12:12 ` [PATCH v2 1/7] drivers: changes for dmadev driver Amit Prakash Shukla
  6 siblings, 0 replies; 46+ messages in thread
From: Amit Prakash Shukla @ 2023-06-28 17:18 UTC (permalink / raw)
  To: Vamsi Attunuru; +Cc: dev, jerinj, Amit Prakash Shukla

Code changes to align dpi private structure based on vchan.

Signed-off-by: Amit Prakash Shukla <amitprakashs@marvell.com>
---
 drivers/dma/cnxk/cnxk_dmadev.c | 198 ++++++++++++++++++++++++---------
 drivers/dma/cnxk/cnxk_dmadev.h |  18 +--
 2 files changed, 157 insertions(+), 59 deletions(-)

diff --git a/drivers/dma/cnxk/cnxk_dmadev.c b/drivers/dma/cnxk/cnxk_dmadev.c
index 7d83b70e8b..166c898302 100644
--- a/drivers/dma/cnxk/cnxk_dmadev.c
+++ b/drivers/dma/cnxk/cnxk_dmadev.c
@@ -19,32 +19,64 @@
 static int
 cnxk_dmadev_info_get(const struct rte_dma_dev *dev, struct rte_dma_info *dev_info, uint32_t size)
 {
-	RTE_SET_USED(dev);
+	struct cnxk_dpi_vf_s *dpivf = dev->fp_obj->dev_private;
 	RTE_SET_USED(size);
 
 	dev_info->max_vchans = MAX_VCHANS_PER_QUEUE;
-	dev_info->nb_vchans = MAX_VCHANS_PER_QUEUE;
+	dev_info->nb_vchans = dpivf->num_vchans;
 	dev_info->dev_capa = RTE_DMA_CAPA_MEM_TO_MEM | RTE_DMA_CAPA_MEM_TO_DEV |
 			     RTE_DMA_CAPA_DEV_TO_MEM | RTE_DMA_CAPA_DEV_TO_DEV |
 			     RTE_DMA_CAPA_OPS_COPY | RTE_DMA_CAPA_OPS_COPY_SG;
 	dev_info->max_desc = DPI_MAX_DESC;
-	dev_info->min_desc = 2;
+	dev_info->min_desc = DPI_MIN_DESC;
 	dev_info->max_sges = DPI_MAX_POINTER;
 
 	return 0;
 }
 
+static int
+cnxk_dmadev_vchan_free(struct cnxk_dpi_vf_s *dpivf)
+{
+	struct cnxk_dpi_conf *dpi_conf;
+	uint16_t num_vchans;
+	uint16_t max_desc;
+	int i, j;
+
+	num_vchans = dpivf->num_vchans;
+	for (i = 0; i < num_vchans; i++) {
+		dpi_conf = &dpivf->conf[i];
+		max_desc = dpi_conf->c_desc.max_cnt;
+		if (dpi_conf->c_desc.compl_ptr) {
+			for (j = 0; j < max_desc; j++)
+				rte_free(dpi_conf->c_desc.compl_ptr[j]);
+		}
+
+		rte_free(dpi_conf->c_desc.compl_ptr);
+		dpi_conf->c_desc.compl_ptr = NULL;
+	}
+
+	return 0;
+}
+
 static int
 cnxk_dmadev_configure(struct rte_dma_dev *dev, const struct rte_dma_conf *conf, uint32_t conf_sz)
 {
 	struct cnxk_dpi_vf_s *dpivf = NULL;
 	int rc = 0;
 
-	RTE_SET_USED(conf);
 	RTE_SET_USED(conf_sz);
 
 	dpivf = dev->fp_obj->dev_private;
 
+	/* Accept only number of vchans as config from application. */
+	if (!(dpivf->flag & CNXK_DPI_DEV_START)) {
+		/* After config function, vchan setup function has to be called.
+		 * Free up vchan memory if any, before configuring num_vchans.
+		 */
+		cnxk_dmadev_vchan_free(dpivf);
+		dpivf->num_vchans = conf->nb_vchans;
+	}
+
 	if (dpivf->flag & CNXK_DPI_DEV_CONFIG)
 		return rc;
 
@@ -73,7 +105,7 @@ cnxk_dmadev_vchan_setup(struct rte_dma_dev *dev, uint16_t vchan,
 
 	RTE_SET_USED(conf_sz);
 
-	if (dpivf->flag & CNXK_DPI_VCHAN_CONFIG)
+	if (dpivf->flag & CNXK_DPI_DEV_START)
 		return 0;
 
 	header->cn9k.pt = DPI_HDR_PT_ZBW_CA;
@@ -112,6 +144,9 @@ cnxk_dmadev_vchan_setup(struct rte_dma_dev *dev, uint16_t vchan,
 		header->cn9k.pvfe = 0;
 	};
 
+	/* Free up descriptor memory before allocating. */
+	cnxk_dmadev_vchan_free(dpivf);
+
 	max_desc = conf->nb_desc;
 	if (!rte_is_power_of_2(max_desc))
 		max_desc = rte_align32pow2(max_desc);
@@ -130,15 +165,20 @@ cnxk_dmadev_vchan_setup(struct rte_dma_dev *dev, uint16_t vchan,
 	for (i = 0; i < max_desc; i++) {
 		dpi_conf->c_desc.compl_ptr[i] =
 			rte_zmalloc(NULL, sizeof(struct cnxk_dpi_compl_s), 0);
+		if (!dpi_conf->c_desc.compl_ptr[i]) {
+			plt_err("Failed to allocate for descriptor memory");
+			return -ENOMEM;
+		}
+
 		dpi_conf->c_desc.compl_ptr[i]->cdata = DPI_REQ_CDATA;
 	}
 
 	dpi_conf->c_desc.max_cnt = (max_desc - 1);
 	dpi_conf->c_desc.head = 0;
 	dpi_conf->c_desc.tail = 0;
-	dpivf->pnum_words = 0;
-	dpivf->pending = 0;
-	dpivf->flag |= CNXK_DPI_VCHAN_CONFIG;
+	dpi_conf->pnum_words = 0;
+	dpi_conf->pending = 0;
+	dpi_conf->desc_idx = 0;
 
 	return 0;
 }
@@ -156,7 +196,7 @@ cn10k_dmadev_vchan_setup(struct rte_dma_dev *dev, uint16_t vchan,
 
 	RTE_SET_USED(conf_sz);
 
-	if (dpivf->flag & CNXK_DPI_VCHAN_CONFIG)
+	if (dpivf->flag & CNXK_DPI_DEV_START)
 		return 0;
 
 	header->cn10k.pt = DPI_HDR_PT_ZBW_CA;
@@ -195,6 +235,9 @@ cn10k_dmadev_vchan_setup(struct rte_dma_dev *dev, uint16_t vchan,
 		header->cn10k.pvfe = 0;
 	};
 
+	/* Free up descriptor memory before allocating. */
+	cnxk_dmadev_vchan_free(dpivf);
+
 	max_desc = conf->nb_desc;
 	if (!rte_is_power_of_2(max_desc))
 		max_desc = rte_align32pow2(max_desc);
@@ -213,15 +256,19 @@ cn10k_dmadev_vchan_setup(struct rte_dma_dev *dev, uint16_t vchan,
 	for (i = 0; i < max_desc; i++) {
 		dpi_conf->c_desc.compl_ptr[i] =
 			rte_zmalloc(NULL, sizeof(struct cnxk_dpi_compl_s), 0);
+		if (!dpi_conf->c_desc.compl_ptr[i]) {
+			plt_err("Failed to allocate for descriptor memory");
+			return -ENOMEM;
+		}
 		dpi_conf->c_desc.compl_ptr[i]->cdata = DPI_REQ_CDATA;
 	}
 
 	dpi_conf->c_desc.max_cnt = (max_desc - 1);
 	dpi_conf->c_desc.head = 0;
 	dpi_conf->c_desc.tail = 0;
-	dpivf->pnum_words = 0;
-	dpivf->pending = 0;
-	dpivf->flag |= CNXK_DPI_VCHAN_CONFIG;
+	dpi_conf->pnum_words = 0;
+	dpi_conf->pending = 0;
+	dpi_conf->desc_idx = 0;
 
 	return 0;
 }
@@ -230,15 +277,27 @@ static int
 cnxk_dmadev_start(struct rte_dma_dev *dev)
 {
 	struct cnxk_dpi_vf_s *dpivf = dev->fp_obj->dev_private;
+	struct cnxk_dpi_conf *dpi_conf;
+	int i, j;
 
 	if (dpivf->flag & CNXK_DPI_DEV_START)
 		return 0;
 
-	dpivf->desc_idx = 0;
-	dpivf->pending = 0;
-	dpivf->pnum_words = 0;
 	roc_dpi_enable(&dpivf->rdpi);
 
+	for (i = 0; i < dpivf->num_vchans; i++) {
+		dpi_conf = &dpivf->conf[i];
+		dpi_conf->c_desc.head = 0;
+		dpi_conf->c_desc.tail = 0;
+		dpi_conf->pnum_words = 0;
+		dpi_conf->pending = 0;
+		dpi_conf->desc_idx = 0;
+		for (j = 0; j < dpi_conf->c_desc.max_cnt; j++) {
+			if (dpi_conf->c_desc.compl_ptr[j])
+				dpi_conf->c_desc.compl_ptr[j]->cdata = DPI_REQ_CDATA;
+		}
+	}
+
 	dpivf->flag |= CNXK_DPI_DEV_START;
 
 	return 0;
@@ -250,7 +309,6 @@ cnxk_dmadev_stop(struct rte_dma_dev *dev)
 	struct cnxk_dpi_vf_s *dpivf = dev->fp_obj->dev_private;
 
 	roc_dpi_disable(&dpivf->rdpi);
-
 	dpivf->flag &= ~CNXK_DPI_DEV_START;
 
 	return 0;
@@ -262,8 +320,10 @@ cnxk_dmadev_close(struct rte_dma_dev *dev)
 	struct cnxk_dpi_vf_s *dpivf = dev->fp_obj->dev_private;
 
 	roc_dpi_disable(&dpivf->rdpi);
+	cnxk_dmadev_vchan_free(dpivf);
 	roc_dpi_dev_fini(&dpivf->rdpi);
 
+	/* Clear all flags as we close the device. */
 	dpivf->flag = 0;
 
 	return 0;
@@ -404,13 +464,13 @@ cnxk_dmadev_copy(void *dev_private, uint16_t vchan, rte_iova_t src, rte_iova_t d
 	rte_wmb();
 	if (flags & RTE_DMA_OP_FLAG_SUBMIT) {
 		plt_write64(num_words, dpivf->rdpi.rbase + DPI_VDMA_DBELL);
-		dpivf->stats.submitted++;
+		dpi_conf->stats.submitted++;
 	} else {
-		dpivf->pnum_words += num_words;
-		dpivf->pending++;
+		dpi_conf->pnum_words += num_words;
+		dpi_conf->pending++;
 	}
 
-	return (dpivf->desc_idx++);
+	return (dpi_conf->desc_idx++);
 }
 
 static int
@@ -471,13 +531,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);
-		dpivf->stats.submitted += nb_src;
+		dpi_conf->stats.submitted += nb_src;
 	} else {
-		dpivf->pnum_words += num_words;
-		dpivf->pending++;
+		dpi_conf->pnum_words += num_words;
+		dpi_conf->pending++;
 	}
 
-	return (dpivf->desc_idx++);
+	return (dpi_conf->desc_idx++);
 }
 
 static int
@@ -522,13 +582,13 @@ cn10k_dmadev_copy(void *dev_private, uint16_t vchan, rte_iova_t src, rte_iova_t
 	if (flags & RTE_DMA_OP_FLAG_SUBMIT) {
 		rte_wmb();
 		plt_write64(num_words, dpivf->rdpi.rbase + DPI_VDMA_DBELL);
-		dpivf->stats.submitted++;
+		dpi_conf->stats.submitted++;
 	} else {
-		dpivf->pnum_words += num_words;
-		dpivf->pending++;
+		dpi_conf->pnum_words += num_words;
+		dpi_conf->pending++;
 	}
 
-	return dpivf->desc_idx++;
+	return dpi_conf->desc_idx++;
 }
 
 static int
@@ -580,13 +640,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);
-		dpivf->stats.submitted += nb_src;
+		dpi_conf->stats.submitted += nb_src;
 	} else {
-		dpivf->pnum_words += num_words;
-		dpivf->pending++;
+		dpi_conf->pnum_words += num_words;
+		dpi_conf->pending++;
 	}
 
-	return (dpivf->desc_idx++);
+	return (dpi_conf->desc_idx++);
 }
 
 static uint16_t
@@ -606,7 +666,7 @@ cnxk_dmadev_completed(void *dev_private, uint16_t vchan, const uint16_t nb_cpls,
 			if (comp_ptr->cdata == DPI_REQ_CDATA)
 				break;
 			*has_error = 1;
-			dpivf->stats.errors++;
+			dpi_conf->stats.errors++;
 			STRM_INC(*c_desc, head);
 			break;
 		}
@@ -615,8 +675,8 @@ cnxk_dmadev_completed(void *dev_private, uint16_t vchan, const uint16_t nb_cpls,
 		STRM_INC(*c_desc, head);
 	}
 
-	dpivf->stats.completed += cnt;
-	*last_idx = dpivf->stats.completed - 1;
+	dpi_conf->stats.completed += cnt;
+	*last_idx = dpi_conf->stats.completed - 1;
 
 	return cnt;
 }
@@ -640,14 +700,14 @@ cnxk_dmadev_completed_status(void *dev_private, uint16_t vchan, const uint16_t n
 			if (status[cnt] == DPI_REQ_CDATA)
 				break;
 
-			dpivf->stats.errors++;
+			dpi_conf->stats.errors++;
 		}
 		comp_ptr->cdata = DPI_REQ_CDATA;
 		STRM_INC(*c_desc, head);
 	}
 
-	dpivf->stats.completed += cnt;
-	*last_idx = dpivf->stats.completed - 1;
+	dpi_conf->stats.completed += cnt;
+	*last_idx = dpi_conf->stats.completed - 1;
 
 	return cnt;
 }
@@ -660,26 +720,28 @@ cnxk_damdev_burst_capacity(const void *dev_private, uint16_t vchan)
 	uint16_t burst_cap;
 
 	burst_cap = dpi_conf->c_desc.max_cnt -
-		    ((dpivf->stats.submitted - dpivf->stats.completed) + dpivf->pending) + 1;
+		    ((dpi_conf->stats.submitted - dpi_conf->stats.completed) + dpi_conf->pending) +
+		    1;
 
 	return burst_cap;
 }
 
 static int
-cnxk_dmadev_submit(void *dev_private, uint16_t vchan __rte_unused)
+cnxk_dmadev_submit(void *dev_private, uint16_t vchan)
 {
 	struct cnxk_dpi_vf_s *dpivf = dev_private;
-	uint32_t num_words = dpivf->pnum_words;
+	struct cnxk_dpi_conf *dpi_conf = &dpivf->conf[vchan];
+	uint32_t num_words = dpi_conf->pnum_words;
 
-	if (!dpivf->pnum_words)
+	if (!dpi_conf->pnum_words)
 		return 0;
 
 	rte_wmb();
 	plt_write64(num_words, dpivf->rdpi.rbase + DPI_VDMA_DBELL);
 
-	dpivf->stats.submitted += dpivf->pending;
-	dpivf->pnum_words = 0;
-	dpivf->pending = 0;
+	dpi_conf->stats.submitted += dpi_conf->pending;
+	dpi_conf->pnum_words = 0;
+	dpi_conf->pending = 0;
 
 	return 0;
 }
@@ -689,25 +751,59 @@ cnxk_stats_get(const struct rte_dma_dev *dev, uint16_t vchan, struct rte_dma_sta
 	       uint32_t size)
 {
 	struct cnxk_dpi_vf_s *dpivf = dev->fp_obj->dev_private;
-	struct rte_dma_stats *stats = &dpivf->stats;
-
-	RTE_SET_USED(vchan);
+	struct cnxk_dpi_conf *dpi_conf;
+	int i;
 
 	if (size < sizeof(rte_stats))
 		return -EINVAL;
 	if (rte_stats == NULL)
 		return -EINVAL;
 
-	*rte_stats = *stats;
+	/* Stats of all vchans requested. */
+	if (vchan == RTE_DMA_ALL_VCHAN) {
+		for (i = 0; i < dpivf->num_vchans; i++) {
+			dpi_conf = &dpivf->conf[i];
+			rte_stats->submitted += dpi_conf->stats.submitted;
+			rte_stats->completed += dpi_conf->stats.completed;
+			rte_stats->errors += dpi_conf->stats.errors;
+		}
+
+		goto done;
+	}
+
+	if (vchan >= MAX_VCHANS_PER_QUEUE)
+		return -EINVAL;
+
+	dpi_conf = &dpivf->conf[vchan];
+	*rte_stats = dpi_conf->stats;
+
+done:
 	return 0;
 }
 
 static int
-cnxk_stats_reset(struct rte_dma_dev *dev, uint16_t vchan __rte_unused)
+cnxk_stats_reset(struct rte_dma_dev *dev, uint16_t vchan)
 {
 	struct cnxk_dpi_vf_s *dpivf = dev->fp_obj->dev_private;
+	struct cnxk_dpi_conf *dpi_conf;
+	int i;
+
+	/* clear stats of all vchans. */
+	if (vchan == RTE_DMA_ALL_VCHAN) {
+		for (i = 0; i < dpivf->num_vchans; i++) {
+			dpi_conf = &dpivf->conf[i];
+			dpi_conf->stats = (struct rte_dma_stats){0};
+		}
+
+		return 0;
+	}
+
+	if (vchan >= MAX_VCHANS_PER_QUEUE)
+		return -EINVAL;
+
+	dpi_conf = &dpivf->conf[vchan];
+	dpi_conf->stats = (struct rte_dma_stats){0};
 
-	dpivf->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 4693960a19..f375143b16 100644
--- a/drivers/dma/cnxk/cnxk_dmadev.h
+++ b/drivers/dma/cnxk/cnxk_dmadev.h
@@ -10,6 +10,7 @@
 #define STRM_INC(s, var)     ((s).var = ((s).var + 1) & (s).max_cnt)
 #define STRM_DEC(s, var)     ((s).var = ((s).var - 1) == -1 ? (s).max_cnt : ((s).var - 1))
 #define DPI_MAX_DESC	     1024
+#define DPI_MIN_DESC	     2
 #define MAX_VCHANS_PER_QUEUE 4
 
 /* Set Completion data to 0xFF when request submitted,
@@ -17,9 +18,8 @@
  */
 #define DPI_REQ_CDATA 0xFF
 
-#define CNXK_DPI_DEV_CONFIG   (1ULL << 0)
-#define CNXK_DPI_VCHAN_CONFIG (1ULL << 1)
-#define CNXK_DPI_DEV_START    (1ULL << 2)
+#define CNXK_DPI_DEV_CONFIG (1ULL << 0)
+#define CNXK_DPI_DEV_START  (1ULL << 1)
 
 struct cnxk_dpi_compl_s {
 	uint64_t cdata;
@@ -36,16 +36,18 @@ struct cnxk_dpi_cdesc_data_s {
 struct cnxk_dpi_conf {
 	union dpi_instr_hdr_s hdr;
 	struct cnxk_dpi_cdesc_data_s c_desc;
+	uint16_t pnum_words;
+	uint16_t pending;
+	uint16_t desc_idx;
+	uint16_t pad0;
+	struct rte_dma_stats stats;
 };
 
 struct cnxk_dpi_vf_s {
 	struct roc_dpi rdpi;
 	struct cnxk_dpi_conf conf[MAX_VCHANS_PER_QUEUE];
-	struct rte_dma_stats stats;
-	uint16_t pending;
-	uint16_t pnum_words;
-	uint16_t desc_idx;
+	uint16_t num_vchans;
 	uint16_t flag;
-};
+} __plt_cache_aligned;
 
 #endif
-- 
2.25.1


^ permalink raw reply	[flat|nested] 46+ messages in thread

* [PATCH 7/7] common/cnxk: use unique name for DPI memzone
  2023-06-28 17:18 [PATCH 1/7] dma/cnxk: changes for dmadev autotest Amit Prakash Shukla
                   ` (4 preceding siblings ...)
  2023-06-28 17:18 ` [PATCH 6/7] dma/cnxk: vchan support enhancement Amit Prakash Shukla
@ 2023-06-28 17:18 ` Amit Prakash Shukla
  2023-07-31 12:12 ` [PATCH v2 1/7] drivers: changes for dmadev driver Amit Prakash Shukla
  6 siblings, 0 replies; 46+ messages in thread
From: Amit Prakash Shukla @ 2023-06-28 17:18 UTC (permalink / raw)
  To: Nithin Dabilpuram, Kiran Kumar K, Sunil Kumar Kori, Satha Rao
  Cc: dev, jerinj, Amit Prakash Shukla, Radha Mohan Chintakuntla

roc_dpi was using vfid as part of name for memzone allocation.
This led to memzone allocation failure in case of multiple
physical functions.
vfid is not unique by itself since multiple physical functions
can have the same virtual function indices.
So use complete DBDF as part of memzone name to make it unique.

Signed-off-by: Radha Mohan Chintakuntla <radhac@marvell.com>
Signed-off-by: Amit Prakash Shukla <amitprakashs@marvell.com>
---
 drivers/common/cnxk/roc_dpi.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/drivers/common/cnxk/roc_dpi.c b/drivers/common/cnxk/roc_dpi.c
index 93c8318a3d..0e2f803077 100644
--- a/drivers/common/cnxk/roc_dpi.c
+++ b/drivers/common/cnxk/roc_dpi.c
@@ -81,10 +81,10 @@ roc_dpi_configure(struct roc_dpi *roc_dpi)
 		return rc;
 	}
 
-	snprintf(name, sizeof(name), "dpimem%d", roc_dpi->vfid);
+	snprintf(name, sizeof(name), "dpimem%d:%d:%d:%d", pci_dev->addr.domain, pci_dev->addr.bus,
+		 pci_dev->addr.devid, pci_dev->addr.function);
 	buflen = DPI_CMD_QUEUE_SIZE * DPI_CMD_QUEUE_BUFS;
-	dpi_mz = plt_memzone_reserve_aligned(name, buflen, 0,
-					     DPI_CMD_QUEUE_SIZE);
+	dpi_mz = plt_memzone_reserve_aligned(name, buflen, 0, DPI_CMD_QUEUE_SIZE);
 	if (dpi_mz == NULL) {
 		plt_err("dpi memzone reserve failed");
 		rc = -ENOMEM;
-- 
2.25.1


^ permalink raw reply	[flat|nested] 46+ messages in thread

* [PATCH v2 1/7] drivers: changes for dmadev driver
  2023-06-28 17:18 [PATCH 1/7] dma/cnxk: changes for dmadev autotest Amit Prakash Shukla
                   ` (5 preceding siblings ...)
  2023-06-28 17:18 ` [PATCH 7/7] common/cnxk: use unique name for DPI memzone Amit Prakash Shukla
@ 2023-07-31 12:12 ` Amit Prakash Shukla
  2023-07-31 12:12   ` [PATCH v2 2/7] dma/cnxk: add DMA devops for all models of cn10xxx Amit Prakash Shukla
                     ` (7 more replies)
  6 siblings, 8 replies; 46+ messages in thread
From: Amit Prakash Shukla @ 2023-07-31 12:12 UTC (permalink / raw)
  To: Vamsi Attunuru; +Cc: dev, jerinj, Amit Prakash Shukla

Dmadev driver changes to align with dpdk spec.

Signed-off-by: Amit Prakash Shukla <amitprakashs@marvell.com>
---
v2:
- Fix for bugs observed in v1.
- Squashed few commits.

 drivers/dma/cnxk/cnxk_dmadev.c | 464 ++++++++++++++++++++-------------
 drivers/dma/cnxk/cnxk_dmadev.h |  24 +-
 2 files changed, 294 insertions(+), 194 deletions(-)

diff --git a/drivers/dma/cnxk/cnxk_dmadev.c b/drivers/dma/cnxk/cnxk_dmadev.c
index a6f4a31e0e..a0152fc6df 100644
--- a/drivers/dma/cnxk/cnxk_dmadev.c
+++ b/drivers/dma/cnxk/cnxk_dmadev.c
@@ -7,68 +7,76 @@
 
 #include <bus_pci_driver.h>
 #include <rte_common.h>
+#include <rte_dmadev.h>
+#include <rte_dmadev_pmd.h>
 #include <rte_eal.h>
 #include <rte_lcore.h>
 #include <rte_mempool.h>
 #include <rte_pci.h>
-#include <rte_dmadev.h>
-#include <rte_dmadev_pmd.h>
 
-#include <roc_api.h>
 #include <cnxk_dmadev.h>
 
 static int
-cnxk_dmadev_info_get(const struct rte_dma_dev *dev,
-		     struct rte_dma_info *dev_info, uint32_t size)
+cnxk_dmadev_info_get(const struct rte_dma_dev *dev, struct rte_dma_info *dev_info, uint32_t size)
 {
 	RTE_SET_USED(dev);
 	RTE_SET_USED(size);
 
 	dev_info->max_vchans = 1;
 	dev_info->nb_vchans = 1;
-	dev_info->dev_capa = RTE_DMA_CAPA_MEM_TO_MEM |
-		RTE_DMA_CAPA_MEM_TO_DEV | RTE_DMA_CAPA_DEV_TO_MEM |
-		RTE_DMA_CAPA_DEV_TO_DEV | RTE_DMA_CAPA_OPS_COPY |
-		RTE_DMA_CAPA_OPS_COPY_SG;
+	dev_info->dev_capa = RTE_DMA_CAPA_MEM_TO_MEM | RTE_DMA_CAPA_MEM_TO_DEV |
+			     RTE_DMA_CAPA_DEV_TO_MEM | RTE_DMA_CAPA_DEV_TO_DEV |
+			     RTE_DMA_CAPA_OPS_COPY | RTE_DMA_CAPA_OPS_COPY_SG;
 	dev_info->max_desc = DPI_MAX_DESC;
-	dev_info->min_desc = 1;
+	dev_info->min_desc = 2;
 	dev_info->max_sges = DPI_MAX_POINTER;
 
 	return 0;
 }
 
 static int
-cnxk_dmadev_configure(struct rte_dma_dev *dev,
-		      const struct rte_dma_conf *conf, uint32_t conf_sz)
+cnxk_dmadev_configure(struct rte_dma_dev *dev, const struct rte_dma_conf *conf, uint32_t conf_sz)
 {
 	struct cnxk_dpi_vf_s *dpivf = NULL;
 	int rc = 0;
 
 	RTE_SET_USED(conf);
-	RTE_SET_USED(conf);
-	RTE_SET_USED(conf_sz);
 	RTE_SET_USED(conf_sz);
+
 	dpivf = dev->fp_obj->dev_private;
+
+	if (dpivf->flag & CNXK_DPI_DEV_CONFIG)
+		return rc;
+
 	rc = roc_dpi_configure(&dpivf->rdpi);
-	if (rc < 0)
+	if (rc < 0) {
 		plt_err("DMA configure failed err = %d", rc);
+		goto done;
+	}
 
+	dpivf->flag |= CNXK_DPI_DEV_CONFIG;
+
+done:
 	return rc;
 }
 
 static int
 cnxk_dmadev_vchan_setup(struct rte_dma_dev *dev, uint16_t vchan,
-			const struct rte_dma_vchan_conf *conf,
-			uint32_t conf_sz)
+			const struct rte_dma_vchan_conf *conf, uint32_t conf_sz)
 {
 	struct cnxk_dpi_vf_s *dpivf = dev->fp_obj->dev_private;
-	struct cnxk_dpi_compl_s *comp_data;
-	union dpi_instr_hdr_s *header = &dpivf->conf.hdr;
+	struct cnxk_dpi_conf *dpi_conf = &dpivf->conf;
+	union dpi_instr_hdr_s *header = &dpi_conf->hdr;
+	uint16_t max_desc;
+	uint32_t size;
 	int i;
 
 	RTE_SET_USED(vchan);
 	RTE_SET_USED(conf_sz);
 
+	if (dpivf->flag & CNXK_DPI_VCHAN_CONFIG)
+		return 0;
+
 	header->cn9k.pt = DPI_HDR_PT_ZBW_CA;
 
 	switch (conf->direction) {
@@ -96,35 +104,54 @@ cnxk_dmadev_vchan_setup(struct rte_dma_dev *dev, uint16_t vchan,
 		header->cn9k.fport = conf->dst_port.pcie.coreid;
 	};
 
-	for (i = 0; i < conf->nb_desc; i++) {
-		comp_data = rte_zmalloc(NULL, sizeof(*comp_data), 0);
-		if (comp_data == NULL) {
-			plt_err("Failed to allocate for comp_data");
-			return -ENOMEM;
-		}
-		comp_data->cdata = DPI_REQ_CDATA;
-		dpivf->conf.c_desc.compl_ptr[i] = comp_data;
-	};
-	dpivf->conf.c_desc.max_cnt = DPI_MAX_DESC;
-	dpivf->conf.c_desc.head = 0;
-	dpivf->conf.c_desc.tail = 0;
+	max_desc = conf->nb_desc;
+	if (!rte_is_power_of_2(max_desc))
+		max_desc = rte_align32pow2(max_desc);
+
+	if (max_desc > DPI_MAX_DESC)
+		max_desc = DPI_MAX_DESC;
+
+	size = (max_desc * sizeof(struct cnxk_dpi_compl_s *));
+	dpi_conf->c_desc.compl_ptr = rte_zmalloc(NULL, size, 0);
+
+	if (dpi_conf->c_desc.compl_ptr == NULL) {
+		plt_err("Failed to allocate for comp_data");
+		return -ENOMEM;
+	}
+
+	for (i = 0; i < max_desc; i++) {
+		dpi_conf->c_desc.compl_ptr[i] =
+			rte_zmalloc(NULL, sizeof(struct cnxk_dpi_compl_s), 0);
+		dpi_conf->c_desc.compl_ptr[i]->cdata = DPI_REQ_CDATA;
+	}
+
+	dpi_conf->c_desc.max_cnt = (max_desc - 1);
+	dpi_conf->c_desc.head = 0;
+	dpi_conf->c_desc.tail = 0;
+	dpivf->pnum_words = 0;
+	dpivf->pending = 0;
+	dpivf->flag |= CNXK_DPI_VCHAN_CONFIG;
 
 	return 0;
 }
 
 static int
 cn10k_dmadev_vchan_setup(struct rte_dma_dev *dev, uint16_t vchan,
-			 const struct rte_dma_vchan_conf *conf,
-			 uint32_t conf_sz)
+			 const struct rte_dma_vchan_conf *conf, uint32_t conf_sz)
 {
 	struct cnxk_dpi_vf_s *dpivf = dev->fp_obj->dev_private;
-	struct cnxk_dpi_compl_s *comp_data;
-	union dpi_instr_hdr_s *header = &dpivf->conf.hdr;
+	struct cnxk_dpi_conf *dpi_conf = &dpivf->conf;
+	union dpi_instr_hdr_s *header = &dpi_conf->hdr;
+	uint16_t max_desc;
+	uint32_t size;
 	int i;
 
 	RTE_SET_USED(vchan);
 	RTE_SET_USED(conf_sz);
 
+	if (dpivf->flag & CNXK_DPI_VCHAN_CONFIG)
+		return 0;
+
 	header->cn10k.pt = DPI_HDR_PT_ZBW_CA;
 
 	switch (conf->direction) {
@@ -152,18 +179,33 @@ cn10k_dmadev_vchan_setup(struct rte_dma_dev *dev, uint16_t vchan,
 		header->cn10k.fport = conf->dst_port.pcie.coreid;
 	};
 
-	for (i = 0; i < conf->nb_desc; i++) {
-		comp_data = rte_zmalloc(NULL, sizeof(*comp_data), 0);
-		if (comp_data == NULL) {
-			plt_err("Failed to allocate for comp_data");
-			return -ENOMEM;
-		}
-		comp_data->cdata = DPI_REQ_CDATA;
-		dpivf->conf.c_desc.compl_ptr[i] = comp_data;
-	};
-	dpivf->conf.c_desc.max_cnt = DPI_MAX_DESC;
-	dpivf->conf.c_desc.head = 0;
-	dpivf->conf.c_desc.tail = 0;
+	max_desc = conf->nb_desc;
+	if (!rte_is_power_of_2(max_desc))
+		max_desc = rte_align32pow2(max_desc);
+
+	if (max_desc > DPI_MAX_DESC)
+		max_desc = DPI_MAX_DESC;
+
+	size = (max_desc * sizeof(struct cnxk_dpi_compl_s *));
+	dpi_conf->c_desc.compl_ptr = rte_zmalloc(NULL, size, 0);
+
+	if (dpi_conf->c_desc.compl_ptr == NULL) {
+		plt_err("Failed to allocate for comp_data");
+		return -ENOMEM;
+	}
+
+	for (i = 0; i < max_desc; i++) {
+		dpi_conf->c_desc.compl_ptr[i] =
+			rte_zmalloc(NULL, sizeof(struct cnxk_dpi_compl_s), 0);
+		dpi_conf->c_desc.compl_ptr[i]->cdata = DPI_REQ_CDATA;
+	}
+
+	dpi_conf->c_desc.max_cnt = (max_desc - 1);
+	dpi_conf->c_desc.head = 0;
+	dpi_conf->c_desc.tail = 0;
+	dpivf->pnum_words = 0;
+	dpivf->pending = 0;
+	dpivf->flag |= CNXK_DPI_VCHAN_CONFIG;
 
 	return 0;
 }
@@ -173,10 +215,16 @@ cnxk_dmadev_start(struct rte_dma_dev *dev)
 {
 	struct cnxk_dpi_vf_s *dpivf = dev->fp_obj->dev_private;
 
+	if (dpivf->flag & CNXK_DPI_DEV_START)
+		return 0;
+
 	dpivf->desc_idx = 0;
-	dpivf->num_words = 0;
+	dpivf->pending = 0;
+	dpivf->pnum_words = 0;
 	roc_dpi_enable(&dpivf->rdpi);
 
+	dpivf->flag |= CNXK_DPI_DEV_START;
+
 	return 0;
 }
 
@@ -187,6 +235,8 @@ cnxk_dmadev_stop(struct rte_dma_dev *dev)
 
 	roc_dpi_disable(&dpivf->rdpi);
 
+	dpivf->flag &= ~CNXK_DPI_DEV_START;
+
 	return 0;
 }
 
@@ -198,6 +248,8 @@ cnxk_dmadev_close(struct rte_dma_dev *dev)
 	roc_dpi_disable(&dpivf->rdpi);
 	roc_dpi_dev_fini(&dpivf->rdpi);
 
+	dpivf->flag = 0;
+
 	return 0;
 }
 
@@ -206,8 +258,7 @@ __dpi_queue_write(struct roc_dpi *dpi, uint64_t *cmds, int cmd_count)
 {
 	uint64_t *ptr = dpi->chunk_base;
 
-	if ((cmd_count < DPI_MIN_CMD_SIZE) || (cmd_count > DPI_MAX_CMD_SIZE) ||
-	    cmds == NULL)
+	if ((cmd_count < DPI_MIN_CMD_SIZE) || (cmd_count > DPI_MAX_CMD_SIZE) || cmds == NULL)
 		return -EINVAL;
 
 	/*
@@ -223,11 +274,15 @@ __dpi_queue_write(struct roc_dpi *dpi, uint64_t *cmds, int cmd_count)
 		int count;
 		uint64_t *new_buff = dpi->chunk_next;
 
-		dpi->chunk_next =
-			(void *)roc_npa_aura_op_alloc(dpi->aura_handle, 0);
+		dpi->chunk_next = (void *)roc_npa_aura_op_alloc(dpi->aura_handle, 0);
 		if (!dpi->chunk_next) {
-			plt_err("Failed to alloc next buffer from NPA");
-			return -ENOMEM;
+			plt_dp_dbg("Failed to alloc next buffer from NPA");
+
+			/* NPA failed to allocate a buffer. Restoring chunk_next
+			 * to its original address.
+			 */
+			dpi->chunk_next = new_buff;
+			return -ENOSPC;
 		}
 
 		/*
@@ -261,13 +316,17 @@ __dpi_queue_write(struct roc_dpi *dpi, uint64_t *cmds, int cmd_count)
 		/* queue index may be greater than pool size */
 		if (dpi->chunk_head >= dpi->pool_size_m1) {
 			new_buff = dpi->chunk_next;
-			dpi->chunk_next =
-				(void *)roc_npa_aura_op_alloc(dpi->aura_handle,
-							      0);
+			dpi->chunk_next = (void *)roc_npa_aura_op_alloc(dpi->aura_handle, 0);
 			if (!dpi->chunk_next) {
-				plt_err("Failed to alloc next buffer from NPA");
-				return -ENOMEM;
+				plt_dp_dbg("Failed to alloc next buffer from NPA");
+
+				/* NPA failed to allocate a buffer. Restoring chunk_next
+				 * to its original address.
+				 */
+				dpi->chunk_next = new_buff;
+				return -ENOSPC;
 			}
+
 			/* Write next buffer address */
 			*ptr = (uint64_t)new_buff;
 			dpi->chunk_base = new_buff;
@@ -279,12 +338,13 @@ __dpi_queue_write(struct roc_dpi *dpi, uint64_t *cmds, int cmd_count)
 }
 
 static int
-cnxk_dmadev_copy(void *dev_private, uint16_t vchan, rte_iova_t src,
-		 rte_iova_t dst, uint32_t length, uint64_t flags)
+cnxk_dmadev_copy(void *dev_private, uint16_t vchan, rte_iova_t src, rte_iova_t dst, uint32_t length,
+		 uint64_t flags)
 {
 	struct cnxk_dpi_vf_s *dpivf = dev_private;
 	union dpi_instr_hdr_s *header = &dpivf->conf.hdr;
 	struct cnxk_dpi_compl_s *comp_ptr;
+	uint64_t cmd[DPI_MAX_CMD_SIZE];
 	rte_iova_t fptr, lptr;
 	int num_words = 0;
 	int rc;
@@ -292,9 +352,8 @@ cnxk_dmadev_copy(void *dev_private, uint16_t vchan, rte_iova_t src,
 	RTE_SET_USED(vchan);
 
 	comp_ptr = dpivf->conf.c_desc.compl_ptr[dpivf->conf.c_desc.tail];
-	comp_ptr->cdata = DPI_REQ_CDATA;
 	header->cn9k.ptr = (uint64_t)comp_ptr;
-	STRM_INC(dpivf->conf.c_desc);
+	STRM_INC(dpivf->conf.c_desc, tail);
 
 	header->cn9k.nfst = 1;
 	header->cn9k.nlst = 1;
@@ -311,103 +370,110 @@ cnxk_dmadev_copy(void *dev_private, uint16_t vchan, rte_iova_t src,
 		lptr = dst;
 	}
 
-	dpivf->cmd[0] = header->u[0];
-	dpivf->cmd[1] = header->u[1];
-	dpivf->cmd[2] = header->u[2];
+	cmd[0] = header->u[0];
+	cmd[1] = header->u[1];
+	cmd[2] = header->u[2];
 	/* word3 is always 0 */
 	num_words += 4;
-	dpivf->cmd[num_words++] = length;
-	dpivf->cmd[num_words++] = fptr;
-	dpivf->cmd[num_words++] = length;
-	dpivf->cmd[num_words++] = lptr;
-
-	rc = __dpi_queue_write(&dpivf->rdpi, dpivf->cmd, num_words);
-	if (!rc) {
-		if (flags & RTE_DMA_OP_FLAG_SUBMIT) {
-			rte_wmb();
-			plt_write64(num_words,
-				    dpivf->rdpi.rbase + DPI_VDMA_DBELL);
-			dpivf->stats.submitted++;
-		}
-		dpivf->num_words += num_words;
+	cmd[num_words++] = length;
+	cmd[num_words++] = fptr;
+	cmd[num_words++] = length;
+	cmd[num_words++] = lptr;
+
+	rc = __dpi_queue_write(&dpivf->rdpi, cmd, num_words);
+	if (unlikely(rc)) {
+		STRM_DEC(dpivf->conf.c_desc, tail);
+		return rc;
 	}
 
-	return dpivf->desc_idx++;
+	rte_wmb();
+	if (flags & RTE_DMA_OP_FLAG_SUBMIT) {
+		plt_write64(num_words, dpivf->rdpi.rbase + DPI_VDMA_DBELL);
+		dpivf->stats.submitted++;
+	} else {
+		dpivf->pnum_words += num_words;
+		dpivf->pending++;
+	}
+
+	return (dpivf->desc_idx++);
 }
 
 static int
-cnxk_dmadev_copy_sg(void *dev_private, uint16_t vchan,
-		    const struct rte_dma_sge *src,
-		    const struct rte_dma_sge *dst,
-		    uint16_t nb_src, uint16_t nb_dst, uint64_t flags)
+cnxk_dmadev_copy_sg(void *dev_private, uint16_t vchan, const struct rte_dma_sge *src,
+		    const struct rte_dma_sge *dst, uint16_t nb_src, uint16_t nb_dst, uint64_t flags)
 {
 	struct cnxk_dpi_vf_s *dpivf = dev_private;
 	union dpi_instr_hdr_s *header = &dpivf->conf.hdr;
 	const struct rte_dma_sge *fptr, *lptr;
 	struct cnxk_dpi_compl_s *comp_ptr;
+	uint64_t cmd[DPI_MAX_CMD_SIZE];
 	int num_words = 0;
 	int i, rc;
 
 	RTE_SET_USED(vchan);
 
 	comp_ptr = dpivf->conf.c_desc.compl_ptr[dpivf->conf.c_desc.tail];
-	comp_ptr->cdata = DPI_REQ_CDATA;
 	header->cn9k.ptr = (uint64_t)comp_ptr;
-	STRM_INC(dpivf->conf.c_desc);
+	STRM_INC(dpivf->conf.c_desc, tail);
 
 	/*
 	 * For inbound case, src pointers are last pointers.
 	 * For all other cases, src pointers are first pointers.
 	 */
 	if (header->cn9k.xtype == DPI_XTYPE_INBOUND) {
-		header->cn9k.nfst = nb_dst & 0xf;
-		header->cn9k.nlst = nb_src & 0xf;
+		header->cn9k.nfst = nb_dst & DPI_MAX_POINTER;
+		header->cn9k.nlst = nb_src & DPI_MAX_POINTER;
 		fptr = &dst[0];
 		lptr = &src[0];
 	} else {
-		header->cn9k.nfst = nb_src & 0xf;
-		header->cn9k.nlst = nb_dst & 0xf;
+		header->cn9k.nfst = nb_src & DPI_MAX_POINTER;
+		header->cn9k.nlst = nb_dst & DPI_MAX_POINTER;
 		fptr = &src[0];
 		lptr = &dst[0];
 	}
 
-	dpivf->cmd[0] = header->u[0];
-	dpivf->cmd[1] = header->u[1];
-	dpivf->cmd[2] = header->u[2];
+	cmd[0] = header->u[0];
+	cmd[1] = header->u[1];
+	cmd[2] = header->u[2];
 	num_words += 4;
 	for (i = 0; i < header->cn9k.nfst; i++) {
-		dpivf->cmd[num_words++] = (uint64_t)fptr->length;
-		dpivf->cmd[num_words++] = fptr->addr;
+		cmd[num_words++] = (uint64_t)fptr->length;
+		cmd[num_words++] = fptr->addr;
 		fptr++;
 	}
 
 	for (i = 0; i < header->cn9k.nlst; i++) {
-		dpivf->cmd[num_words++] = (uint64_t)lptr->length;
-		dpivf->cmd[num_words++] = lptr->addr;
+		cmd[num_words++] = (uint64_t)lptr->length;
+		cmd[num_words++] = lptr->addr;
 		lptr++;
 	}
 
-	rc = __dpi_queue_write(&dpivf->rdpi, dpivf->cmd, num_words);
-	if (!rc) {
-		if (flags & RTE_DMA_OP_FLAG_SUBMIT) {
-			rte_wmb();
-			plt_write64(num_words,
-				    dpivf->rdpi.rbase + DPI_VDMA_DBELL);
-			dpivf->stats.submitted += nb_src;
-		}
-		dpivf->num_words += num_words;
+	rc = __dpi_queue_write(&dpivf->rdpi, cmd, num_words);
+	if (unlikely(rc)) {
+		STRM_DEC(dpivf->conf.c_desc, tail);
+		return rc;
 	}
 
-	return (rc < 0) ? rc : dpivf->desc_idx++;
+	if (flags & RTE_DMA_OP_FLAG_SUBMIT) {
+		rte_wmb();
+		plt_write64(num_words, dpivf->rdpi.rbase + DPI_VDMA_DBELL);
+		dpivf->stats.submitted += nb_src;
+	} else {
+		dpivf->pnum_words += num_words;
+		dpivf->pending++;
+	}
+
+	return (dpivf->desc_idx++);
 }
 
 static int
-cn10k_dmadev_copy(void *dev_private, uint16_t vchan, rte_iova_t src,
-		  rte_iova_t dst, uint32_t length, uint64_t flags)
+cn10k_dmadev_copy(void *dev_private, uint16_t vchan, rte_iova_t src, rte_iova_t dst,
+		  uint32_t length, uint64_t flags)
 {
 	struct cnxk_dpi_vf_s *dpivf = dev_private;
 	union dpi_instr_hdr_s *header = &dpivf->conf.hdr;
 	struct cnxk_dpi_compl_s *comp_ptr;
+	uint64_t cmd[DPI_MAX_CMD_SIZE];
 	rte_iova_t fptr, lptr;
 	int num_words = 0;
 	int rc;
@@ -415,9 +481,8 @@ cn10k_dmadev_copy(void *dev_private, uint16_t vchan, rte_iova_t src,
 	RTE_SET_USED(vchan);
 
 	comp_ptr = dpivf->conf.c_desc.compl_ptr[dpivf->conf.c_desc.tail];
-	comp_ptr->cdata = DPI_REQ_CDATA;
 	header->cn10k.ptr = (uint64_t)comp_ptr;
-	STRM_INC(dpivf->conf.c_desc);
+	STRM_INC(dpivf->conf.c_desc, tail);
 
 	header->cn10k.nfst = 1;
 	header->cn10k.nlst = 1;
@@ -425,131 +490,140 @@ cn10k_dmadev_copy(void *dev_private, uint16_t vchan, rte_iova_t src,
 	fptr = src;
 	lptr = dst;
 
-	dpivf->cmd[0] = header->u[0];
-	dpivf->cmd[1] = header->u[1];
-	dpivf->cmd[2] = header->u[2];
+	cmd[0] = header->u[0];
+	cmd[1] = header->u[1];
+	cmd[2] = header->u[2];
 	/* word3 is always 0 */
 	num_words += 4;
-	dpivf->cmd[num_words++] = length;
-	dpivf->cmd[num_words++] = fptr;
-	dpivf->cmd[num_words++] = length;
-	dpivf->cmd[num_words++] = lptr;
-
-	rc = __dpi_queue_write(&dpivf->rdpi, dpivf->cmd, num_words);
-	if (!rc) {
-		if (flags & RTE_DMA_OP_FLAG_SUBMIT) {
-			rte_wmb();
-			plt_write64(num_words,
-				    dpivf->rdpi.rbase + DPI_VDMA_DBELL);
-			dpivf->stats.submitted++;
-		}
-		dpivf->num_words += num_words;
+	cmd[num_words++] = length;
+	cmd[num_words++] = fptr;
+	cmd[num_words++] = length;
+	cmd[num_words++] = lptr;
+
+	rc = __dpi_queue_write(&dpivf->rdpi, cmd, num_words);
+	if (unlikely(rc)) {
+		STRM_DEC(dpivf->conf.c_desc, tail);
+		return rc;
+	}
+
+	if (flags & RTE_DMA_OP_FLAG_SUBMIT) {
+		rte_wmb();
+		plt_write64(num_words, dpivf->rdpi.rbase + DPI_VDMA_DBELL);
+		dpivf->stats.submitted++;
+	} else {
+		dpivf->pnum_words += num_words;
+		dpivf->pending++;
 	}
 
 	return dpivf->desc_idx++;
 }
 
 static int
-cn10k_dmadev_copy_sg(void *dev_private, uint16_t vchan,
-		     const struct rte_dma_sge *src,
-		     const struct rte_dma_sge *dst, uint16_t nb_src,
-		     uint16_t nb_dst, uint64_t flags)
+cn10k_dmadev_copy_sg(void *dev_private, uint16_t vchan, const struct rte_dma_sge *src,
+		     const struct rte_dma_sge *dst, uint16_t nb_src, uint16_t nb_dst,
+		     uint64_t flags)
 {
 	struct cnxk_dpi_vf_s *dpivf = dev_private;
 	union dpi_instr_hdr_s *header = &dpivf->conf.hdr;
 	const struct rte_dma_sge *fptr, *lptr;
 	struct cnxk_dpi_compl_s *comp_ptr;
+	uint64_t cmd[DPI_MAX_CMD_SIZE];
 	int num_words = 0;
 	int i, rc;
 
 	RTE_SET_USED(vchan);
 
 	comp_ptr = dpivf->conf.c_desc.compl_ptr[dpivf->conf.c_desc.tail];
-	comp_ptr->cdata = DPI_REQ_CDATA;
 	header->cn10k.ptr = (uint64_t)comp_ptr;
-	STRM_INC(dpivf->conf.c_desc);
+	STRM_INC(dpivf->conf.c_desc, tail);
 
-	header->cn10k.nfst = nb_src & 0xf;
-	header->cn10k.nlst = nb_dst & 0xf;
+	header->cn10k.nfst = nb_src & DPI_MAX_POINTER;
+	header->cn10k.nlst = nb_dst & DPI_MAX_POINTER;
 	fptr = &src[0];
 	lptr = &dst[0];
 
-	dpivf->cmd[0] = header->u[0];
-	dpivf->cmd[1] = header->u[1];
-	dpivf->cmd[2] = header->u[2];
+	cmd[0] = header->u[0];
+	cmd[1] = header->u[1];
+	cmd[2] = header->u[2];
 	num_words += 4;
 
 	for (i = 0; i < header->cn10k.nfst; i++) {
-		dpivf->cmd[num_words++] = (uint64_t)fptr->length;
-		dpivf->cmd[num_words++] = fptr->addr;
+		cmd[num_words++] = (uint64_t)fptr->length;
+		cmd[num_words++] = fptr->addr;
 		fptr++;
 	}
 
 	for (i = 0; i < header->cn10k.nlst; i++) {
-		dpivf->cmd[num_words++] = (uint64_t)lptr->length;
-		dpivf->cmd[num_words++] = lptr->addr;
+		cmd[num_words++] = (uint64_t)lptr->length;
+		cmd[num_words++] = lptr->addr;
 		lptr++;
 	}
 
-	rc = __dpi_queue_write(&dpivf->rdpi, dpivf->cmd, num_words);
-	if (!rc) {
-		if (flags & RTE_DMA_OP_FLAG_SUBMIT) {
-			rte_wmb();
-			plt_write64(num_words,
-				    dpivf->rdpi.rbase + DPI_VDMA_DBELL);
-			dpivf->stats.submitted += nb_src;
-		}
-		dpivf->num_words += num_words;
+	rc = __dpi_queue_write(&dpivf->rdpi, cmd, num_words);
+	if (unlikely(rc)) {
+		STRM_DEC(dpivf->conf.c_desc, tail);
+		return rc;
+	}
+
+	if (flags & RTE_DMA_OP_FLAG_SUBMIT) {
+		rte_wmb();
+		plt_write64(num_words, dpivf->rdpi.rbase + DPI_VDMA_DBELL);
+		dpivf->stats.submitted += nb_src;
+	} else {
+		dpivf->pnum_words += num_words;
+		dpivf->pending++;
 	}
 
-	return (rc < 0) ? rc : dpivf->desc_idx++;
+	return (dpivf->desc_idx++);
 }
 
 static uint16_t
-cnxk_dmadev_completed(void *dev_private, uint16_t vchan, const uint16_t nb_cpls,
-		      uint16_t *last_idx, bool *has_error)
+cnxk_dmadev_completed(void *dev_private, uint16_t vchan, const uint16_t nb_cpls, uint16_t *last_idx,
+		      bool *has_error)
 {
 	struct cnxk_dpi_vf_s *dpivf = dev_private;
+	struct cnxk_dpi_cdesc_data_s *c_desc = &dpivf->conf.c_desc;
+	struct cnxk_dpi_compl_s *comp_ptr;
 	int cnt;
 
 	RTE_SET_USED(vchan);
 
-	if (dpivf->stats.submitted == dpivf->stats.completed)
-		return 0;
-
 	for (cnt = 0; cnt < nb_cpls; cnt++) {
-		struct cnxk_dpi_compl_s *comp_ptr =
-			dpivf->conf.c_desc.compl_ptr[cnt];
+		comp_ptr = c_desc->compl_ptr[c_desc->head];
 
 		if (comp_ptr->cdata) {
 			if (comp_ptr->cdata == DPI_REQ_CDATA)
 				break;
 			*has_error = 1;
 			dpivf->stats.errors++;
+			STRM_INC(*c_desc, head);
 			break;
 		}
+
+		comp_ptr->cdata = DPI_REQ_CDATA;
+		STRM_INC(*c_desc, head);
 	}
 
-	*last_idx = cnt - 1;
-	dpivf->conf.c_desc.tail = cnt;
 	dpivf->stats.completed += cnt;
+	*last_idx = dpivf->stats.completed - 1;
 
 	return cnt;
 }
 
 static uint16_t
-cnxk_dmadev_completed_status(void *dev_private, uint16_t vchan,
-			     const uint16_t nb_cpls, uint16_t *last_idx,
-			     enum rte_dma_status_code *status)
+cnxk_dmadev_completed_status(void *dev_private, uint16_t vchan, const uint16_t nb_cpls,
+			     uint16_t *last_idx, enum rte_dma_status_code *status)
 {
 	struct cnxk_dpi_vf_s *dpivf = dev_private;
+	struct cnxk_dpi_cdesc_data_s *c_desc = &dpivf->conf.c_desc;
+	struct cnxk_dpi_compl_s *comp_ptr;
 	int cnt;
 
 	RTE_SET_USED(vchan);
 	RTE_SET_USED(last_idx);
+
 	for (cnt = 0; cnt < nb_cpls; cnt++) {
-		struct cnxk_dpi_compl_s *comp_ptr =
-			dpivf->conf.c_desc.compl_ptr[cnt];
+		comp_ptr = c_desc->compl_ptr[c_desc->head];
 		status[cnt] = comp_ptr->cdata;
 		if (status[cnt]) {
 			if (status[cnt] == DPI_REQ_CDATA)
@@ -557,30 +631,52 @@ cnxk_dmadev_completed_status(void *dev_private, uint16_t vchan,
 
 			dpivf->stats.errors++;
 		}
+		comp_ptr->cdata = DPI_REQ_CDATA;
+		STRM_INC(*c_desc, head);
 	}
 
-	*last_idx = cnt - 1;
-	dpivf->conf.c_desc.tail = 0;
 	dpivf->stats.completed += cnt;
+	*last_idx = dpivf->stats.completed - 1;
 
 	return cnt;
 }
 
+static uint16_t
+cnxk_damdev_burst_capacity(const void *dev_private, uint16_t vchan)
+{
+	const struct cnxk_dpi_vf_s *dpivf = (const struct cnxk_dpi_vf_s *)dev_private;
+	uint16_t burst_cap;
+
+	RTE_SET_USED(vchan);
+
+	burst_cap = dpivf->conf.c_desc.max_cnt -
+		    ((dpivf->stats.submitted - dpivf->stats.completed) + dpivf->pending) + 1;
+
+	return burst_cap;
+}
+
 static int
 cnxk_dmadev_submit(void *dev_private, uint16_t vchan __rte_unused)
 {
 	struct cnxk_dpi_vf_s *dpivf = dev_private;
+	uint32_t num_words = dpivf->pnum_words;
+
+	if (!dpivf->pnum_words)
+		return 0;
 
 	rte_wmb();
-	plt_write64(dpivf->num_words, dpivf->rdpi.rbase + DPI_VDMA_DBELL);
-	dpivf->stats.submitted++;
+	plt_write64(num_words, dpivf->rdpi.rbase + DPI_VDMA_DBELL);
+
+	dpivf->stats.submitted += dpivf->pending;
+	dpivf->pnum_words = 0;
+	dpivf->pending = 0;
 
 	return 0;
 }
 
 static int
-cnxk_stats_get(const struct rte_dma_dev *dev, uint16_t vchan,
-	       struct rte_dma_stats *rte_stats, uint32_t size)
+cnxk_stats_get(const struct rte_dma_dev *dev, uint16_t vchan, struct rte_dma_stats *rte_stats,
+	       uint32_t size)
 {
 	struct cnxk_dpi_vf_s *dpivf = dev->fp_obj->dev_private;
 	struct rte_dma_stats *stats = &dpivf->stats;
@@ -628,8 +724,7 @@ static const struct rte_dma_dev_ops cnxk_dmadev_ops = {
 };
 
 static int
-cnxk_dmadev_probe(struct rte_pci_driver *pci_drv __rte_unused,
-		  struct rte_pci_device *pci_dev)
+cnxk_dmadev_probe(struct rte_pci_driver *pci_drv __rte_unused, struct rte_pci_device *pci_dev)
 {
 	struct cnxk_dpi_vf_s *dpivf = NULL;
 	char name[RTE_DEV_NAME_MAX_LEN];
@@ -648,8 +743,7 @@ cnxk_dmadev_probe(struct rte_pci_driver *pci_drv __rte_unused,
 	memset(name, 0, sizeof(name));
 	rte_pci_device_name(&pci_dev->addr, name, sizeof(name));
 
-	dmadev = rte_dma_pmd_allocate(name, pci_dev->device.numa_node,
-				      sizeof(*dpivf));
+	dmadev = rte_dma_pmd_allocate(name, pci_dev->device.numa_node, sizeof(*dpivf));
 	if (dmadev == NULL) {
 		plt_err("dma device allocation failed for %s", name);
 		return -ENOMEM;
@@ -666,6 +760,7 @@ cnxk_dmadev_probe(struct rte_pci_driver *pci_drv __rte_unused,
 	dmadev->fp_obj->submit = cnxk_dmadev_submit;
 	dmadev->fp_obj->completed = cnxk_dmadev_completed;
 	dmadev->fp_obj->completed_status = cnxk_dmadev_completed_status;
+	dmadev->fp_obj->burst_capacity = cnxk_damdev_burst_capacity;
 
 	if (pci_dev->id.subsystem_device_id == PCI_SUBSYSTEM_DEVID_CN10KA ||
 	    pci_dev->id.subsystem_device_id == PCI_SUBSYSTEM_DEVID_CNF10KA ||
@@ -682,6 +777,8 @@ cnxk_dmadev_probe(struct rte_pci_driver *pci_drv __rte_unused,
 	if (rc < 0)
 		goto err_out_free;
 
+	dmadev->state = RTE_DMA_DEV_READY;
+
 	return 0;
 
 err_out_free:
@@ -703,20 +800,17 @@ cnxk_dmadev_remove(struct rte_pci_device *pci_dev)
 }
 
 static const struct rte_pci_id cnxk_dma_pci_map[] = {
-	{
-		RTE_PCI_DEVICE(PCI_VENDOR_ID_CAVIUM,
-			       PCI_DEVID_CNXK_DPI_VF)
-	},
+	{RTE_PCI_DEVICE(PCI_VENDOR_ID_CAVIUM, PCI_DEVID_CNXK_DPI_VF)},
 	{
 		.vendor_id = 0,
 	},
 };
 
 static struct rte_pci_driver cnxk_dmadev = {
-	.id_table  = cnxk_dma_pci_map,
+	.id_table = cnxk_dma_pci_map,
 	.drv_flags = RTE_PCI_DRV_NEED_MAPPING | RTE_PCI_DRV_NEED_IOVA_AS_VA,
-	.probe     = cnxk_dmadev_probe,
-	.remove    = cnxk_dmadev_remove,
+	.probe = cnxk_dmadev_probe,
+	.remove = cnxk_dmadev_remove,
 };
 
 RTE_PMD_REGISTER_PCI(cnxk_dmadev_pci_driver, cnxk_dmadev);
diff --git a/drivers/dma/cnxk/cnxk_dmadev.h b/drivers/dma/cnxk/cnxk_dmadev.h
index e1f5694f50..9563295af0 100644
--- a/drivers/dma/cnxk/cnxk_dmadev.h
+++ b/drivers/dma/cnxk/cnxk_dmadev.h
@@ -4,16 +4,21 @@
 #ifndef CNXK_DMADEV_H
 #define CNXK_DMADEV_H
 
-#define DPI_MAX_POINTER		15
-#define DPI_QUEUE_STOP		0x0
-#define DPI_QUEUE_START		0x1
-#define STRM_INC(s)		((s).tail = ((s).tail + 1) % (s).max_cnt)
-#define DPI_MAX_DESC		1024
+#include <roc_api.h>
+
+#define DPI_MAX_POINTER	 15
+#define STRM_INC(s, var) ((s).var = ((s).var + 1) & (s).max_cnt)
+#define STRM_DEC(s, var) ((s).var = ((s).var - 1) == -1 ? (s).max_cnt : ((s).var - 1))
+#define DPI_MAX_DESC	 1024
 
 /* Set Completion data to 0xFF when request submitted,
  * upon successful request completion engine reset to completion status
  */
-#define DPI_REQ_CDATA		0xFF
+#define DPI_REQ_CDATA 0xFF
+
+#define CNXK_DPI_DEV_CONFIG   (1ULL << 0)
+#define CNXK_DPI_VCHAN_CONFIG (1ULL << 1)
+#define CNXK_DPI_DEV_START    (1ULL << 2)
 
 struct cnxk_dpi_compl_s {
 	uint64_t cdata;
@@ -21,7 +26,7 @@ struct cnxk_dpi_compl_s {
 };
 
 struct cnxk_dpi_cdesc_data_s {
-	struct cnxk_dpi_compl_s *compl_ptr[DPI_MAX_DESC];
+	struct cnxk_dpi_compl_s **compl_ptr;
 	uint16_t max_cnt;
 	uint16_t head;
 	uint16_t tail;
@@ -36,9 +41,10 @@ struct cnxk_dpi_vf_s {
 	struct roc_dpi rdpi;
 	struct cnxk_dpi_conf conf;
 	struct rte_dma_stats stats;
-	uint64_t cmd[DPI_MAX_CMD_SIZE];
-	uint32_t num_words;
+	uint16_t pending;
+	uint16_t pnum_words;
 	uint16_t desc_idx;
+	uint16_t flag;
 };
 
 #endif
-- 
2.25.1


^ permalink raw reply	[flat|nested] 46+ messages in thread

* [PATCH v2 2/7] dma/cnxk: add DMA devops for all models of cn10xxx
  2023-07-31 12:12 ` [PATCH v2 1/7] drivers: changes for dmadev driver Amit Prakash Shukla
@ 2023-07-31 12:12   ` Amit Prakash Shukla
  2023-07-31 12:12   ` [PATCH v2 3/7] dma/cnxk: update func field based on transfer type Amit Prakash Shukla
                     ` (6 subsequent siblings)
  7 siblings, 0 replies; 46+ messages in thread
From: Amit Prakash Shukla @ 2023-07-31 12:12 UTC (permalink / raw)
  To: Vamsi Attunuru; +Cc: dev, jerinj, Amit Prakash Shukla, Radha Mohan Chintakuntla

Valid function pointers are set for DMA device operations
i.e. cn10k_dmadev_ops are used for all cn10k devices.

Signed-off-by: Radha Mohan Chintakuntla <radhac@marvell.com>
Signed-off-by: Amit Prakash Shukla <amitprakashs@marvell.com>
---
v2:
- Fix for bugs observed in v1.
- Squashed few commits.

 drivers/dma/cnxk/cnxk_dmadev.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/drivers/dma/cnxk/cnxk_dmadev.c b/drivers/dma/cnxk/cnxk_dmadev.c
index a0152fc6df..1dc124e68f 100644
--- a/drivers/dma/cnxk/cnxk_dmadev.c
+++ b/drivers/dma/cnxk/cnxk_dmadev.c
@@ -763,7 +763,9 @@ cnxk_dmadev_probe(struct rte_pci_driver *pci_drv __rte_unused, struct rte_pci_de
 	dmadev->fp_obj->burst_capacity = cnxk_damdev_burst_capacity;
 
 	if (pci_dev->id.subsystem_device_id == PCI_SUBSYSTEM_DEVID_CN10KA ||
+	    pci_dev->id.subsystem_device_id == PCI_SUBSYSTEM_DEVID_CN10KAS ||
 	    pci_dev->id.subsystem_device_id == PCI_SUBSYSTEM_DEVID_CNF10KA ||
+	    pci_dev->id.subsystem_device_id == PCI_SUBSYSTEM_DEVID_CNF10KB ||
 	    pci_dev->id.subsystem_device_id == PCI_SUBSYSTEM_DEVID_CN10KB) {
 		dmadev->dev_ops = &cn10k_dmadev_ops;
 		dmadev->fp_obj->copy = cn10k_dmadev_copy;
-- 
2.25.1


^ permalink raw reply	[flat|nested] 46+ messages in thread

* [PATCH v2 3/7] dma/cnxk: update func field based on transfer type
  2023-07-31 12:12 ` [PATCH v2 1/7] drivers: changes for dmadev driver Amit Prakash Shukla
  2023-07-31 12:12   ` [PATCH v2 2/7] dma/cnxk: add DMA devops for all models of cn10xxx Amit Prakash Shukla
@ 2023-07-31 12:12   ` Amit Prakash Shukla
  2023-07-31 12:12   ` [PATCH v2 4/7] dma/cnxk: increase vchan per queue to max 4 Amit Prakash Shukla
                     ` (5 subsequent siblings)
  7 siblings, 0 replies; 46+ messages in thread
From: Amit Prakash Shukla @ 2023-07-31 12:12 UTC (permalink / raw)
  To: Vamsi Attunuru; +Cc: dev, jerinj, Amit Prakash Shukla, Radha Mohan Chintakuntla

Use pfid and vfid of src_port for incoming DMA transfers and dst_port
for outgoing DMA transfers.

Signed-off-by: Radha Mohan Chintakuntla <radhac@marvell.com>
Signed-off-by: Amit Prakash Shukla <amitprakashs@marvell.com>
---
v2:
- Fix for bugs observed in v1.
- Squashed few commits.

 drivers/dma/cnxk/cnxk_dmadev.c | 26 ++++++++++++++++++++++----
 1 file changed, 22 insertions(+), 4 deletions(-)

diff --git a/drivers/dma/cnxk/cnxk_dmadev.c b/drivers/dma/cnxk/cnxk_dmadev.c
index 1dc124e68f..d8cfb98cd7 100644
--- a/drivers/dma/cnxk/cnxk_dmadev.c
+++ b/drivers/dma/cnxk/cnxk_dmadev.c
@@ -84,13 +84,21 @@ cnxk_dmadev_vchan_setup(struct rte_dma_dev *dev, uint16_t vchan,
 		header->cn9k.xtype = DPI_XTYPE_INBOUND;
 		header->cn9k.lport = conf->src_port.pcie.coreid;
 		header->cn9k.fport = 0;
-		header->cn9k.pvfe = 1;
+		header->cn9k.pvfe = conf->src_port.pcie.vfen;
+		if (header->cn9k.pvfe) {
+			header->cn9k.func = conf->src_port.pcie.pfid << 12;
+			header->cn9k.func |= conf->src_port.pcie.vfid;
+		}
 		break;
 	case RTE_DMA_DIR_MEM_TO_DEV:
 		header->cn9k.xtype = DPI_XTYPE_OUTBOUND;
 		header->cn9k.lport = 0;
 		header->cn9k.fport = conf->dst_port.pcie.coreid;
-		header->cn9k.pvfe = 1;
+		header->cn9k.pvfe = conf->dst_port.pcie.vfen;
+		if (header->cn9k.pvfe) {
+			header->cn9k.func = conf->dst_port.pcie.pfid << 12;
+			header->cn9k.func |= conf->dst_port.pcie.vfid;
+		}
 		break;
 	case RTE_DMA_DIR_MEM_TO_MEM:
 		header->cn9k.xtype = DPI_XTYPE_INTERNAL_ONLY;
@@ -102,6 +110,7 @@ cnxk_dmadev_vchan_setup(struct rte_dma_dev *dev, uint16_t vchan,
 		header->cn9k.xtype = DPI_XTYPE_EXTERNAL_ONLY;
 		header->cn9k.lport = conf->src_port.pcie.coreid;
 		header->cn9k.fport = conf->dst_port.pcie.coreid;
+		header->cn9k.pvfe = 0;
 	};
 
 	max_desc = conf->nb_desc;
@@ -159,13 +168,21 @@ cn10k_dmadev_vchan_setup(struct rte_dma_dev *dev, uint16_t vchan,
 		header->cn10k.xtype = DPI_XTYPE_INBOUND;
 		header->cn10k.lport = conf->src_port.pcie.coreid;
 		header->cn10k.fport = 0;
-		header->cn10k.pvfe = 1;
+		header->cn10k.pvfe = conf->src_port.pcie.vfen;
+		if (header->cn10k.pvfe) {
+			header->cn10k.func = conf->src_port.pcie.pfid << 12;
+			header->cn10k.func |= conf->src_port.pcie.vfid;
+		}
 		break;
 	case RTE_DMA_DIR_MEM_TO_DEV:
 		header->cn10k.xtype = DPI_XTYPE_OUTBOUND;
 		header->cn10k.lport = 0;
 		header->cn10k.fport = conf->dst_port.pcie.coreid;
-		header->cn10k.pvfe = 1;
+		header->cn10k.pvfe = conf->dst_port.pcie.vfen;
+		if (header->cn10k.pvfe) {
+			header->cn10k.func = conf->dst_port.pcie.pfid << 12;
+			header->cn10k.func |= conf->dst_port.pcie.vfid;
+		}
 		break;
 	case RTE_DMA_DIR_MEM_TO_MEM:
 		header->cn10k.xtype = DPI_XTYPE_INTERNAL_ONLY;
@@ -177,6 +194,7 @@ cn10k_dmadev_vchan_setup(struct rte_dma_dev *dev, uint16_t vchan,
 		header->cn10k.xtype = DPI_XTYPE_EXTERNAL_ONLY;
 		header->cn10k.lport = conf->src_port.pcie.coreid;
 		header->cn10k.fport = conf->dst_port.pcie.coreid;
+		header->cn10k.pvfe = 0;
 	};
 
 	max_desc = conf->nb_desc;
-- 
2.25.1


^ permalink raw reply	[flat|nested] 46+ messages in thread

* [PATCH v2 4/7] dma/cnxk: increase vchan per queue to max 4
  2023-07-31 12:12 ` [PATCH v2 1/7] drivers: changes for dmadev driver Amit Prakash Shukla
  2023-07-31 12:12   ` [PATCH v2 2/7] dma/cnxk: add DMA devops for all models of cn10xxx Amit Prakash Shukla
  2023-07-31 12:12   ` [PATCH v2 3/7] dma/cnxk: update func field based on transfer type Amit Prakash Shukla
@ 2023-07-31 12:12   ` Amit Prakash Shukla
  2023-07-31 12:12   ` [PATCH v2 5/7] dma/cnxk: vchan support enhancement Amit Prakash Shukla
                     ` (4 subsequent siblings)
  7 siblings, 0 replies; 46+ messages in thread
From: Amit Prakash Shukla @ 2023-07-31 12:12 UTC (permalink / raw)
  To: Vamsi Attunuru; +Cc: dev, jerinj, Amit Prakash Shukla, Radha Mohan Chintakuntla

To support multiple directions in same queue make use of multiple vchan
per queue. Each vchan can be configured in some direction and used.

Signed-off-by: Amit Prakash Shukla <amitprakashs@marvell.com>
Signed-off-by: Radha Mohan Chintakuntla <radhac@marvell.com>
---
v2:
- Fix for bugs observed in v1.
- Squashed few commits.

 drivers/dma/cnxk/cnxk_dmadev.c | 68 +++++++++++++++-------------------
 drivers/dma/cnxk/cnxk_dmadev.h | 11 +++---
 2 files changed, 36 insertions(+), 43 deletions(-)

diff --git a/drivers/dma/cnxk/cnxk_dmadev.c b/drivers/dma/cnxk/cnxk_dmadev.c
index d8cfb98cd7..7d83b70e8b 100644
--- a/drivers/dma/cnxk/cnxk_dmadev.c
+++ b/drivers/dma/cnxk/cnxk_dmadev.c
@@ -22,8 +22,8 @@ cnxk_dmadev_info_get(const struct rte_dma_dev *dev, struct rte_dma_info *dev_inf
 	RTE_SET_USED(dev);
 	RTE_SET_USED(size);
 
-	dev_info->max_vchans = 1;
-	dev_info->nb_vchans = 1;
+	dev_info->max_vchans = MAX_VCHANS_PER_QUEUE;
+	dev_info->nb_vchans = MAX_VCHANS_PER_QUEUE;
 	dev_info->dev_capa = RTE_DMA_CAPA_MEM_TO_MEM | RTE_DMA_CAPA_MEM_TO_DEV |
 			     RTE_DMA_CAPA_DEV_TO_MEM | RTE_DMA_CAPA_DEV_TO_DEV |
 			     RTE_DMA_CAPA_OPS_COPY | RTE_DMA_CAPA_OPS_COPY_SG;
@@ -65,13 +65,12 @@ cnxk_dmadev_vchan_setup(struct rte_dma_dev *dev, uint16_t vchan,
 			const struct rte_dma_vchan_conf *conf, uint32_t conf_sz)
 {
 	struct cnxk_dpi_vf_s *dpivf = dev->fp_obj->dev_private;
-	struct cnxk_dpi_conf *dpi_conf = &dpivf->conf;
+	struct cnxk_dpi_conf *dpi_conf = &dpivf->conf[vchan];
 	union dpi_instr_hdr_s *header = &dpi_conf->hdr;
 	uint16_t max_desc;
 	uint32_t size;
 	int i;
 
-	RTE_SET_USED(vchan);
 	RTE_SET_USED(conf_sz);
 
 	if (dpivf->flag & CNXK_DPI_VCHAN_CONFIG)
@@ -149,13 +148,12 @@ cn10k_dmadev_vchan_setup(struct rte_dma_dev *dev, uint16_t vchan,
 			 const struct rte_dma_vchan_conf *conf, uint32_t conf_sz)
 {
 	struct cnxk_dpi_vf_s *dpivf = dev->fp_obj->dev_private;
-	struct cnxk_dpi_conf *dpi_conf = &dpivf->conf;
+	struct cnxk_dpi_conf *dpi_conf = &dpivf->conf[vchan];
 	union dpi_instr_hdr_s *header = &dpi_conf->hdr;
 	uint16_t max_desc;
 	uint32_t size;
 	int i;
 
-	RTE_SET_USED(vchan);
 	RTE_SET_USED(conf_sz);
 
 	if (dpivf->flag & CNXK_DPI_VCHAN_CONFIG)
@@ -360,18 +358,17 @@ cnxk_dmadev_copy(void *dev_private, uint16_t vchan, rte_iova_t src, rte_iova_t d
 		 uint64_t flags)
 {
 	struct cnxk_dpi_vf_s *dpivf = dev_private;
-	union dpi_instr_hdr_s *header = &dpivf->conf.hdr;
+	struct cnxk_dpi_conf *dpi_conf = &dpivf->conf[vchan];
+	union dpi_instr_hdr_s *header = &dpi_conf->hdr;
 	struct cnxk_dpi_compl_s *comp_ptr;
 	uint64_t cmd[DPI_MAX_CMD_SIZE];
 	rte_iova_t fptr, lptr;
 	int num_words = 0;
 	int rc;
 
-	RTE_SET_USED(vchan);
-
-	comp_ptr = dpivf->conf.c_desc.compl_ptr[dpivf->conf.c_desc.tail];
+	comp_ptr = dpi_conf->c_desc.compl_ptr[dpi_conf->c_desc.tail];
 	header->cn9k.ptr = (uint64_t)comp_ptr;
-	STRM_INC(dpivf->conf.c_desc, tail);
+	STRM_INC(dpi_conf->c_desc, tail);
 
 	header->cn9k.nfst = 1;
 	header->cn9k.nlst = 1;
@@ -400,7 +397,7 @@ cnxk_dmadev_copy(void *dev_private, uint16_t vchan, rte_iova_t src, rte_iova_t d
 
 	rc = __dpi_queue_write(&dpivf->rdpi, cmd, num_words);
 	if (unlikely(rc)) {
-		STRM_DEC(dpivf->conf.c_desc, tail);
+		STRM_DEC(dpi_conf->c_desc, tail);
 		return rc;
 	}
 
@@ -421,18 +418,17 @@ cnxk_dmadev_copy_sg(void *dev_private, uint16_t vchan, const struct rte_dma_sge
 		    const struct rte_dma_sge *dst, uint16_t nb_src, uint16_t nb_dst, uint64_t flags)
 {
 	struct cnxk_dpi_vf_s *dpivf = dev_private;
-	union dpi_instr_hdr_s *header = &dpivf->conf.hdr;
+	struct cnxk_dpi_conf *dpi_conf = &dpivf->conf[vchan];
+	union dpi_instr_hdr_s *header = &dpi_conf->hdr;
 	const struct rte_dma_sge *fptr, *lptr;
 	struct cnxk_dpi_compl_s *comp_ptr;
 	uint64_t cmd[DPI_MAX_CMD_SIZE];
 	int num_words = 0;
 	int i, rc;
 
-	RTE_SET_USED(vchan);
-
-	comp_ptr = dpivf->conf.c_desc.compl_ptr[dpivf->conf.c_desc.tail];
+	comp_ptr = dpi_conf->c_desc.compl_ptr[dpi_conf->c_desc.tail];
 	header->cn9k.ptr = (uint64_t)comp_ptr;
-	STRM_INC(dpivf->conf.c_desc, tail);
+	STRM_INC(dpi_conf->c_desc, tail);
 
 	/*
 	 * For inbound case, src pointers are last pointers.
@@ -468,7 +464,7 @@ cnxk_dmadev_copy_sg(void *dev_private, uint16_t vchan, const struct rte_dma_sge
 
 	rc = __dpi_queue_write(&dpivf->rdpi, cmd, num_words);
 	if (unlikely(rc)) {
-		STRM_DEC(dpivf->conf.c_desc, tail);
+		STRM_DEC(dpi_conf->c_desc, tail);
 		return rc;
 	}
 
@@ -489,18 +485,17 @@ cn10k_dmadev_copy(void *dev_private, uint16_t vchan, rte_iova_t src, rte_iova_t
 		  uint32_t length, uint64_t flags)
 {
 	struct cnxk_dpi_vf_s *dpivf = dev_private;
-	union dpi_instr_hdr_s *header = &dpivf->conf.hdr;
+	struct cnxk_dpi_conf *dpi_conf = &dpivf->conf[vchan];
+	union dpi_instr_hdr_s *header = &dpi_conf->hdr;
 	struct cnxk_dpi_compl_s *comp_ptr;
 	uint64_t cmd[DPI_MAX_CMD_SIZE];
 	rte_iova_t fptr, lptr;
 	int num_words = 0;
 	int rc;
 
-	RTE_SET_USED(vchan);
-
-	comp_ptr = dpivf->conf.c_desc.compl_ptr[dpivf->conf.c_desc.tail];
+	comp_ptr = dpi_conf->c_desc.compl_ptr[dpi_conf->c_desc.tail];
 	header->cn10k.ptr = (uint64_t)comp_ptr;
-	STRM_INC(dpivf->conf.c_desc, tail);
+	STRM_INC(dpi_conf->c_desc, tail);
 
 	header->cn10k.nfst = 1;
 	header->cn10k.nlst = 1;
@@ -520,7 +515,7 @@ cn10k_dmadev_copy(void *dev_private, uint16_t vchan, rte_iova_t src, rte_iova_t
 
 	rc = __dpi_queue_write(&dpivf->rdpi, cmd, num_words);
 	if (unlikely(rc)) {
-		STRM_DEC(dpivf->conf.c_desc, tail);
+		STRM_DEC(dpi_conf->c_desc, tail);
 		return rc;
 	}
 
@@ -542,18 +537,17 @@ cn10k_dmadev_copy_sg(void *dev_private, uint16_t vchan, const struct rte_dma_sge
 		     uint64_t flags)
 {
 	struct cnxk_dpi_vf_s *dpivf = dev_private;
-	union dpi_instr_hdr_s *header = &dpivf->conf.hdr;
+	struct cnxk_dpi_conf *dpi_conf = &dpivf->conf[vchan];
+	union dpi_instr_hdr_s *header = &dpi_conf->hdr;
 	const struct rte_dma_sge *fptr, *lptr;
 	struct cnxk_dpi_compl_s *comp_ptr;
 	uint64_t cmd[DPI_MAX_CMD_SIZE];
 	int num_words = 0;
 	int i, rc;
 
-	RTE_SET_USED(vchan);
-
-	comp_ptr = dpivf->conf.c_desc.compl_ptr[dpivf->conf.c_desc.tail];
+	comp_ptr = dpi_conf->c_desc.compl_ptr[dpi_conf->c_desc.tail];
 	header->cn10k.ptr = (uint64_t)comp_ptr;
-	STRM_INC(dpivf->conf.c_desc, tail);
+	STRM_INC(dpi_conf->c_desc, tail);
 
 	header->cn10k.nfst = nb_src & DPI_MAX_POINTER;
 	header->cn10k.nlst = nb_dst & DPI_MAX_POINTER;
@@ -579,7 +573,7 @@ cn10k_dmadev_copy_sg(void *dev_private, uint16_t vchan, const struct rte_dma_sge
 
 	rc = __dpi_queue_write(&dpivf->rdpi, cmd, num_words);
 	if (unlikely(rc)) {
-		STRM_DEC(dpivf->conf.c_desc, tail);
+		STRM_DEC(dpi_conf->c_desc, tail);
 		return rc;
 	}
 
@@ -600,12 +594,11 @@ cnxk_dmadev_completed(void *dev_private, uint16_t vchan, const uint16_t nb_cpls,
 		      bool *has_error)
 {
 	struct cnxk_dpi_vf_s *dpivf = dev_private;
-	struct cnxk_dpi_cdesc_data_s *c_desc = &dpivf->conf.c_desc;
+	struct cnxk_dpi_conf *dpi_conf = &dpivf->conf[vchan];
+	struct cnxk_dpi_cdesc_data_s *c_desc = &dpi_conf->c_desc;
 	struct cnxk_dpi_compl_s *comp_ptr;
 	int cnt;
 
-	RTE_SET_USED(vchan);
-
 	for (cnt = 0; cnt < nb_cpls; cnt++) {
 		comp_ptr = c_desc->compl_ptr[c_desc->head];
 
@@ -633,11 +626,11 @@ cnxk_dmadev_completed_status(void *dev_private, uint16_t vchan, const uint16_t n
 			     uint16_t *last_idx, enum rte_dma_status_code *status)
 {
 	struct cnxk_dpi_vf_s *dpivf = dev_private;
-	struct cnxk_dpi_cdesc_data_s *c_desc = &dpivf->conf.c_desc;
+	struct cnxk_dpi_conf *dpi_conf = &dpivf->conf[vchan];
+	struct cnxk_dpi_cdesc_data_s *c_desc = &dpi_conf->c_desc;
 	struct cnxk_dpi_compl_s *comp_ptr;
 	int cnt;
 
-	RTE_SET_USED(vchan);
 	RTE_SET_USED(last_idx);
 
 	for (cnt = 0; cnt < nb_cpls; cnt++) {
@@ -663,11 +656,10 @@ static uint16_t
 cnxk_damdev_burst_capacity(const void *dev_private, uint16_t vchan)
 {
 	const struct cnxk_dpi_vf_s *dpivf = (const struct cnxk_dpi_vf_s *)dev_private;
+	const struct cnxk_dpi_conf *dpi_conf = &dpivf->conf[vchan];
 	uint16_t burst_cap;
 
-	RTE_SET_USED(vchan);
-
-	burst_cap = dpivf->conf.c_desc.max_cnt -
+	burst_cap = dpi_conf->c_desc.max_cnt -
 		    ((dpivf->stats.submitted - dpivf->stats.completed) + dpivf->pending) + 1;
 
 	return burst_cap;
diff --git a/drivers/dma/cnxk/cnxk_dmadev.h b/drivers/dma/cnxk/cnxk_dmadev.h
index 9563295af0..4693960a19 100644
--- a/drivers/dma/cnxk/cnxk_dmadev.h
+++ b/drivers/dma/cnxk/cnxk_dmadev.h
@@ -6,10 +6,11 @@
 
 #include <roc_api.h>
 
-#define DPI_MAX_POINTER	 15
-#define STRM_INC(s, var) ((s).var = ((s).var + 1) & (s).max_cnt)
-#define STRM_DEC(s, var) ((s).var = ((s).var - 1) == -1 ? (s).max_cnt : ((s).var - 1))
-#define DPI_MAX_DESC	 1024
+#define DPI_MAX_POINTER	     15
+#define STRM_INC(s, var)     ((s).var = ((s).var + 1) & (s).max_cnt)
+#define STRM_DEC(s, var)     ((s).var = ((s).var - 1) == -1 ? (s).max_cnt : ((s).var - 1))
+#define DPI_MAX_DESC	     1024
+#define MAX_VCHANS_PER_QUEUE 4
 
 /* Set Completion data to 0xFF when request submitted,
  * upon successful request completion engine reset to completion status
@@ -39,7 +40,7 @@ struct cnxk_dpi_conf {
 
 struct cnxk_dpi_vf_s {
 	struct roc_dpi rdpi;
-	struct cnxk_dpi_conf conf;
+	struct cnxk_dpi_conf conf[MAX_VCHANS_PER_QUEUE];
 	struct rte_dma_stats stats;
 	uint16_t pending;
 	uint16_t pnum_words;
-- 
2.25.1


^ permalink raw reply	[flat|nested] 46+ messages in thread

* [PATCH v2 5/7] dma/cnxk: vchan support enhancement
  2023-07-31 12:12 ` [PATCH v2 1/7] drivers: changes for dmadev driver Amit Prakash Shukla
                     ` (2 preceding siblings ...)
  2023-07-31 12:12   ` [PATCH v2 4/7] dma/cnxk: increase vchan per queue to max 4 Amit Prakash Shukla
@ 2023-07-31 12:12   ` Amit Prakash Shukla
  2023-07-31 12:12   ` [PATCH v2 6/7] common/cnxk: use unique name for DPI memzone Amit Prakash Shukla
                     ` (3 subsequent siblings)
  7 siblings, 0 replies; 46+ messages in thread
From: Amit Prakash Shukla @ 2023-07-31 12:12 UTC (permalink / raw)
  To: Vamsi Attunuru; +Cc: dev, jerinj, Amit Prakash Shukla

Code changes to realign dpi private structure based on vchan.
Changeset also resets DMA dev stats while starting dma device.

Signed-off-by: Amit Prakash Shukla <amitprakashs@marvell.com>
---
v2:
- Fix for bugs observed in v1.
- Squashed few commits.

 drivers/dma/cnxk/cnxk_dmadev.c | 210 ++++++++++++++++++++++++---------
 drivers/dma/cnxk/cnxk_dmadev.h |  18 +--
 2 files changed, 165 insertions(+), 63 deletions(-)

diff --git a/drivers/dma/cnxk/cnxk_dmadev.c b/drivers/dma/cnxk/cnxk_dmadev.c
index 7d83b70e8b..9fb3bb264a 100644
--- a/drivers/dma/cnxk/cnxk_dmadev.c
+++ b/drivers/dma/cnxk/cnxk_dmadev.c
@@ -16,35 +16,79 @@
 
 #include <cnxk_dmadev.h>
 
+static int cnxk_stats_reset(struct rte_dma_dev *dev, uint16_t vchan);
+
 static int
 cnxk_dmadev_info_get(const struct rte_dma_dev *dev, struct rte_dma_info *dev_info, uint32_t size)
 {
-	RTE_SET_USED(dev);
+	struct cnxk_dpi_vf_s *dpivf = dev->fp_obj->dev_private;
 	RTE_SET_USED(size);
 
 	dev_info->max_vchans = MAX_VCHANS_PER_QUEUE;
-	dev_info->nb_vchans = MAX_VCHANS_PER_QUEUE;
+	dev_info->nb_vchans = dpivf->num_vchans;
 	dev_info->dev_capa = RTE_DMA_CAPA_MEM_TO_MEM | RTE_DMA_CAPA_MEM_TO_DEV |
 			     RTE_DMA_CAPA_DEV_TO_MEM | RTE_DMA_CAPA_DEV_TO_DEV |
 			     RTE_DMA_CAPA_OPS_COPY | RTE_DMA_CAPA_OPS_COPY_SG;
 	dev_info->max_desc = DPI_MAX_DESC;
-	dev_info->min_desc = 2;
+	dev_info->min_desc = DPI_MIN_DESC;
 	dev_info->max_sges = DPI_MAX_POINTER;
 
 	return 0;
 }
 
+static int
+cnxk_dmadev_vchan_free(struct cnxk_dpi_vf_s *dpivf, uint16_t vchan)
+{
+	struct cnxk_dpi_conf *dpi_conf;
+	uint16_t num_vchans;
+	uint16_t max_desc;
+	int i, j;
+
+	if (vchan == RTE_DMA_ALL_VCHAN) {
+		num_vchans = dpivf->num_vchans;
+		i = 0;
+	} else {
+		if (vchan >= MAX_VCHANS_PER_QUEUE)
+			return -EINVAL;
+
+		num_vchans = vchan + 1;
+		i = vchan;
+	}
+
+	for (; i < num_vchans; i++) {
+		dpi_conf = &dpivf->conf[i];
+		max_desc = dpi_conf->c_desc.max_cnt;
+		if (dpi_conf->c_desc.compl_ptr) {
+			for (j = 0; j < max_desc; j++)
+				rte_free(dpi_conf->c_desc.compl_ptr[j]);
+		}
+
+		rte_free(dpi_conf->c_desc.compl_ptr);
+		dpi_conf->c_desc.compl_ptr = NULL;
+	}
+
+	return 0;
+}
+
 static int
 cnxk_dmadev_configure(struct rte_dma_dev *dev, const struct rte_dma_conf *conf, uint32_t conf_sz)
 {
 	struct cnxk_dpi_vf_s *dpivf = NULL;
 	int rc = 0;
 
-	RTE_SET_USED(conf);
 	RTE_SET_USED(conf_sz);
 
 	dpivf = dev->fp_obj->dev_private;
 
+	/* Accept only number of vchans as config from application. */
+	if (!(dpivf->flag & CNXK_DPI_DEV_START)) {
+		/* After config function, vchan setup function has to be called.
+		 * Free up vchan memory if any, before configuring num_vchans.
+		 */
+		cnxk_dmadev_vchan_free(dpivf, RTE_DMA_ALL_VCHAN);
+		dpivf->num_vchans = conf->nb_vchans;
+	}
+
 	if (dpivf->flag & CNXK_DPI_DEV_CONFIG)
 		return rc;
 
@@ -73,7 +117,7 @@ cnxk_dmadev_vchan_setup(struct rte_dma_dev *dev, uint16_t vchan,
 
 	RTE_SET_USED(conf_sz);
 
-	if (dpivf->flag & CNXK_DPI_VCHAN_CONFIG)
+	if (dpivf->flag & CNXK_DPI_DEV_START)
 		return 0;
 
 	header->cn9k.pt = DPI_HDR_PT_ZBW_CA;
@@ -112,6 +156,9 @@ cnxk_dmadev_vchan_setup(struct rte_dma_dev *dev, uint16_t vchan,
 		header->cn9k.pvfe = 0;
 	};
 
+	/* Free up descriptor memory before allocating. */
+	cnxk_dmadev_vchan_free(dpivf, vchan);
+
 	max_desc = conf->nb_desc;
 	if (!rte_is_power_of_2(max_desc))
 		max_desc = rte_align32pow2(max_desc);
@@ -130,15 +177,15 @@ cnxk_dmadev_vchan_setup(struct rte_dma_dev *dev, uint16_t vchan,
 	for (i = 0; i < max_desc; i++) {
 		dpi_conf->c_desc.compl_ptr[i] =
 			rte_zmalloc(NULL, sizeof(struct cnxk_dpi_compl_s), 0);
+		if (!dpi_conf->c_desc.compl_ptr[i]) {
+			plt_err("Failed to allocate for descriptor memory");
+			return -ENOMEM;
+		}
+
 		dpi_conf->c_desc.compl_ptr[i]->cdata = DPI_REQ_CDATA;
 	}
 
 	dpi_conf->c_desc.max_cnt = (max_desc - 1);
-	dpi_conf->c_desc.head = 0;
-	dpi_conf->c_desc.tail = 0;
-	dpivf->pnum_words = 0;
-	dpivf->pending = 0;
-	dpivf->flag |= CNXK_DPI_VCHAN_CONFIG;
 
 	return 0;
 }
@@ -156,7 +203,7 @@ cn10k_dmadev_vchan_setup(struct rte_dma_dev *dev, uint16_t vchan,
 
 	RTE_SET_USED(conf_sz);
 
-	if (dpivf->flag & CNXK_DPI_VCHAN_CONFIG)
+	if (dpivf->flag & CNXK_DPI_DEV_START)
 		return 0;
 
 	header->cn10k.pt = DPI_HDR_PT_ZBW_CA;
@@ -195,6 +242,9 @@ cn10k_dmadev_vchan_setup(struct rte_dma_dev *dev, uint16_t vchan,
 		header->cn10k.pvfe = 0;
 	};
 
+	/* Free up descriptor memory before allocating. */
+	cnxk_dmadev_vchan_free(dpivf, vchan);
+
 	max_desc = conf->nb_desc;
 	if (!rte_is_power_of_2(max_desc))
 		max_desc = rte_align32pow2(max_desc);
@@ -213,15 +263,14 @@ cn10k_dmadev_vchan_setup(struct rte_dma_dev *dev, uint16_t vchan,
 	for (i = 0; i < max_desc; i++) {
 		dpi_conf->c_desc.compl_ptr[i] =
 			rte_zmalloc(NULL, sizeof(struct cnxk_dpi_compl_s), 0);
+		if (!dpi_conf->c_desc.compl_ptr[i]) {
+			plt_err("Failed to allocate for descriptor memory");
+			return -ENOMEM;
+		}
 		dpi_conf->c_desc.compl_ptr[i]->cdata = DPI_REQ_CDATA;
 	}
 
 	dpi_conf->c_desc.max_cnt = (max_desc - 1);
-	dpi_conf->c_desc.head = 0;
-	dpi_conf->c_desc.tail = 0;
-	dpivf->pnum_words = 0;
-	dpivf->pending = 0;
-	dpivf->flag |= CNXK_DPI_VCHAN_CONFIG;
 
 	return 0;
 }
@@ -230,13 +279,27 @@ static int
 cnxk_dmadev_start(struct rte_dma_dev *dev)
 {
 	struct cnxk_dpi_vf_s *dpivf = dev->fp_obj->dev_private;
+	struct cnxk_dpi_conf *dpi_conf;
+	int i, j;
 
 	if (dpivf->flag & CNXK_DPI_DEV_START)
 		return 0;
 
-	dpivf->desc_idx = 0;
-	dpivf->pending = 0;
-	dpivf->pnum_words = 0;
+	for (i = 0; i < dpivf->num_vchans; i++) {
+		dpi_conf = &dpivf->conf[i];
+		dpi_conf->c_desc.head = 0;
+		dpi_conf->c_desc.tail = 0;
+		dpi_conf->pnum_words = 0;
+		dpi_conf->pending = 0;
+		dpi_conf->desc_idx = 0;
+		for (j = 0; j < dpi_conf->c_desc.max_cnt; j++) {
+			if (dpi_conf->c_desc.compl_ptr[j])
+				dpi_conf->c_desc.compl_ptr[j]->cdata = DPI_REQ_CDATA;
+		}
+
+		cnxk_stats_reset(dev, i);
+	}
+
 	roc_dpi_enable(&dpivf->rdpi);
 
 	dpivf->flag |= CNXK_DPI_DEV_START;
@@ -250,7 +313,6 @@ cnxk_dmadev_stop(struct rte_dma_dev *dev)
 	struct cnxk_dpi_vf_s *dpivf = dev->fp_obj->dev_private;
 
 	roc_dpi_disable(&dpivf->rdpi);
-
 	dpivf->flag &= ~CNXK_DPI_DEV_START;
 
 	return 0;
@@ -262,8 +324,10 @@ cnxk_dmadev_close(struct rte_dma_dev *dev)
 	struct cnxk_dpi_vf_s *dpivf = dev->fp_obj->dev_private;
 
 	roc_dpi_disable(&dpivf->rdpi);
+	cnxk_dmadev_vchan_free(dpivf, RTE_DMA_ALL_VCHAN);
 	roc_dpi_dev_fini(&dpivf->rdpi);
 
+	/* Clear all flags as we close the device. */
 	dpivf->flag = 0;
 
 	return 0;
@@ -404,13 +468,13 @@ cnxk_dmadev_copy(void *dev_private, uint16_t vchan, rte_iova_t src, rte_iova_t d
 	rte_wmb();
 	if (flags & RTE_DMA_OP_FLAG_SUBMIT) {
 		plt_write64(num_words, dpivf->rdpi.rbase + DPI_VDMA_DBELL);
-		dpivf->stats.submitted++;
+		dpi_conf->stats.submitted++;
 	} else {
-		dpivf->pnum_words += num_words;
-		dpivf->pending++;
+		dpi_conf->pnum_words += num_words;
+		dpi_conf->pending++;
 	}
 
-	return (dpivf->desc_idx++);
+	return (dpi_conf->desc_idx++);
 }
 
 static int
@@ -471,13 +535,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);
-		dpivf->stats.submitted += nb_src;
+		dpi_conf->stats.submitted += nb_src;
 	} else {
-		dpivf->pnum_words += num_words;
-		dpivf->pending++;
+		dpi_conf->pnum_words += num_words;
+		dpi_conf->pending++;
 	}
 
-	return (dpivf->desc_idx++);
+	return (dpi_conf->desc_idx++);
 }
 
 static int
@@ -522,13 +586,13 @@ cn10k_dmadev_copy(void *dev_private, uint16_t vchan, rte_iova_t src, rte_iova_t
 	if (flags & RTE_DMA_OP_FLAG_SUBMIT) {
 		rte_wmb();
 		plt_write64(num_words, dpivf->rdpi.rbase + DPI_VDMA_DBELL);
-		dpivf->stats.submitted++;
+		dpi_conf->stats.submitted++;
 	} else {
-		dpivf->pnum_words += num_words;
-		dpivf->pending++;
+		dpi_conf->pnum_words += num_words;
+		dpi_conf->pending++;
 	}
 
-	return dpivf->desc_idx++;
+	return dpi_conf->desc_idx++;
 }
 
 static int
@@ -580,13 +644,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);
-		dpivf->stats.submitted += nb_src;
+		dpi_conf->stats.submitted += nb_src;
 	} else {
-		dpivf->pnum_words += num_words;
-		dpivf->pending++;
+		dpi_conf->pnum_words += num_words;
+		dpi_conf->pending++;
 	}
 
-	return (dpivf->desc_idx++);
+	return (dpi_conf->desc_idx++);
 }
 
 static uint16_t
@@ -606,7 +670,7 @@ cnxk_dmadev_completed(void *dev_private, uint16_t vchan, const uint16_t nb_cpls,
 			if (comp_ptr->cdata == DPI_REQ_CDATA)
 				break;
 			*has_error = 1;
-			dpivf->stats.errors++;
+			dpi_conf->stats.errors++;
 			STRM_INC(*c_desc, head);
 			break;
 		}
@@ -615,8 +679,8 @@ cnxk_dmadev_completed(void *dev_private, uint16_t vchan, const uint16_t nb_cpls,
 		STRM_INC(*c_desc, head);
 	}
 
-	dpivf->stats.completed += cnt;
-	*last_idx = dpivf->stats.completed - 1;
+	dpi_conf->stats.completed += cnt;
+	*last_idx = dpi_conf->stats.completed - 1;
 
 	return cnt;
 }
@@ -640,14 +704,14 @@ cnxk_dmadev_completed_status(void *dev_private, uint16_t vchan, const uint16_t n
 			if (status[cnt] == DPI_REQ_CDATA)
 				break;
 
-			dpivf->stats.errors++;
+			dpi_conf->stats.errors++;
 		}
 		comp_ptr->cdata = DPI_REQ_CDATA;
 		STRM_INC(*c_desc, head);
 	}
 
-	dpivf->stats.completed += cnt;
-	*last_idx = dpivf->stats.completed - 1;
+	dpi_conf->stats.completed += cnt;
+	*last_idx = dpi_conf->stats.completed - 1;
 
 	return cnt;
 }
@@ -660,26 +724,28 @@ cnxk_damdev_burst_capacity(const void *dev_private, uint16_t vchan)
 	uint16_t burst_cap;
 
 	burst_cap = dpi_conf->c_desc.max_cnt -
-		    ((dpivf->stats.submitted - dpivf->stats.completed) + dpivf->pending) + 1;
+		    ((dpi_conf->stats.submitted - dpi_conf->stats.completed) + dpi_conf->pending) +
+		    1;
 
 	return burst_cap;
 }
 
 static int
-cnxk_dmadev_submit(void *dev_private, uint16_t vchan __rte_unused)
+cnxk_dmadev_submit(void *dev_private, uint16_t vchan)
 {
 	struct cnxk_dpi_vf_s *dpivf = dev_private;
-	uint32_t num_words = dpivf->pnum_words;
+	struct cnxk_dpi_conf *dpi_conf = &dpivf->conf[vchan];
+	uint32_t num_words = dpi_conf->pnum_words;
 
-	if (!dpivf->pnum_words)
+	if (!dpi_conf->pnum_words)
 		return 0;
 
 	rte_wmb();
 	plt_write64(num_words, dpivf->rdpi.rbase + DPI_VDMA_DBELL);
 
-	dpivf->stats.submitted += dpivf->pending;
-	dpivf->pnum_words = 0;
-	dpivf->pending = 0;
+	dpi_conf->stats.submitted += dpi_conf->pending;
+	dpi_conf->pnum_words = 0;
+	dpi_conf->pending = 0;
 
 	return 0;
 }
@@ -689,25 +755,59 @@ cnxk_stats_get(const struct rte_dma_dev *dev, uint16_t vchan, struct rte_dma_sta
 	       uint32_t size)
 {
 	struct cnxk_dpi_vf_s *dpivf = dev->fp_obj->dev_private;
-	struct rte_dma_stats *stats = &dpivf->stats;
-
-	RTE_SET_USED(vchan);
+	struct cnxk_dpi_conf *dpi_conf;
+	int i;
 
 	if (size < sizeof(rte_stats))
 		return -EINVAL;
 	if (rte_stats == NULL)
 		return -EINVAL;
 
-	*rte_stats = *stats;
+	/* Stats of all vchans requested. */
+	if (vchan == RTE_DMA_ALL_VCHAN) {
+		for (i = 0; i < dpivf->num_vchans; i++) {
+			dpi_conf = &dpivf->conf[i];
+			rte_stats->submitted += dpi_conf->stats.submitted;
+			rte_stats->completed += dpi_conf->stats.completed;
+			rte_stats->errors += dpi_conf->stats.errors;
+		}
+
+		goto done;
+	}
+
+	if (vchan >= MAX_VCHANS_PER_QUEUE)
+		return -EINVAL;
+
+	dpi_conf = &dpivf->conf[vchan];
+	*rte_stats = dpi_conf->stats;
+
+done:
 	return 0;
 }
 
 static int
-cnxk_stats_reset(struct rte_dma_dev *dev, uint16_t vchan __rte_unused)
+cnxk_stats_reset(struct rte_dma_dev *dev, uint16_t vchan)
 {
 	struct cnxk_dpi_vf_s *dpivf = dev->fp_obj->dev_private;
+	struct cnxk_dpi_conf *dpi_conf;
+	int i;
+
+	/* clear stats of all vchans. */
+	if (vchan == RTE_DMA_ALL_VCHAN) {
+		for (i = 0; i < dpivf->num_vchans; i++) {
+			dpi_conf = &dpivf->conf[i];
+			dpi_conf->stats = (struct rte_dma_stats){0};
+		}
+
+		return 0;
+	}
+
+	if (vchan >= MAX_VCHANS_PER_QUEUE)
+		return -EINVAL;
+
+	dpi_conf = &dpivf->conf[vchan];
+	dpi_conf->stats = (struct rte_dma_stats){0};
 
-	dpivf->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 4693960a19..f375143b16 100644
--- a/drivers/dma/cnxk/cnxk_dmadev.h
+++ b/drivers/dma/cnxk/cnxk_dmadev.h
@@ -10,6 +10,7 @@
 #define STRM_INC(s, var)     ((s).var = ((s).var + 1) & (s).max_cnt)
 #define STRM_DEC(s, var)     ((s).var = ((s).var - 1) == -1 ? (s).max_cnt : ((s).var - 1))
 #define DPI_MAX_DESC	     1024
+#define DPI_MIN_DESC	     2
 #define MAX_VCHANS_PER_QUEUE 4
 
 /* Set Completion data to 0xFF when request submitted,
@@ -17,9 +18,8 @@
  */
 #define DPI_REQ_CDATA 0xFF
 
-#define CNXK_DPI_DEV_CONFIG   (1ULL << 0)
-#define CNXK_DPI_VCHAN_CONFIG (1ULL << 1)
-#define CNXK_DPI_DEV_START    (1ULL << 2)
+#define CNXK_DPI_DEV_CONFIG (1ULL << 0)
+#define CNXK_DPI_DEV_START  (1ULL << 1)
 
 struct cnxk_dpi_compl_s {
 	uint64_t cdata;
@@ -36,16 +36,18 @@ struct cnxk_dpi_cdesc_data_s {
 struct cnxk_dpi_conf {
 	union dpi_instr_hdr_s hdr;
 	struct cnxk_dpi_cdesc_data_s c_desc;
+	uint16_t pnum_words;
+	uint16_t pending;
+	uint16_t desc_idx;
+	uint16_t pad0;
+	struct rte_dma_stats stats;
 };
 
 struct cnxk_dpi_vf_s {
 	struct roc_dpi rdpi;
 	struct cnxk_dpi_conf conf[MAX_VCHANS_PER_QUEUE];
-	struct rte_dma_stats stats;
-	uint16_t pending;
-	uint16_t pnum_words;
-	uint16_t desc_idx;
+	uint16_t num_vchans;
 	uint16_t flag;
-};
+} __plt_cache_aligned;
 
 #endif
-- 
2.25.1


^ permalink raw reply	[flat|nested] 46+ messages in thread

* [PATCH v2 6/7] common/cnxk: use unique name for DPI memzone
  2023-07-31 12:12 ` [PATCH v2 1/7] drivers: changes for dmadev driver Amit Prakash Shukla
                     ` (3 preceding siblings ...)
  2023-07-31 12:12   ` [PATCH v2 5/7] dma/cnxk: vchan support enhancement Amit Prakash Shukla
@ 2023-07-31 12:12   ` Amit Prakash Shukla
  2023-07-31 12:12   ` [PATCH v2 7/7] dma/cnxk: add completion ring tail wrap check Amit Prakash Shukla
                     ` (2 subsequent siblings)
  7 siblings, 0 replies; 46+ messages in thread
From: Amit Prakash Shukla @ 2023-07-31 12:12 UTC (permalink / raw)
  To: Nithin Dabilpuram, Kiran Kumar K, Sunil Kumar Kori, Satha Rao
  Cc: dev, jerinj, Amit Prakash Shukla, Radha Mohan Chintakuntla

roc_dpi was using vfid as part of name for memzone allocation.
This led to memzone allocation failure in case of multiple
physical functions.
vfid is not unique by itself since multiple physical functions
can have the same virtual function indices.
So use complete DBDF as part of memzone name to make it unique.

Signed-off-by: Radha Mohan Chintakuntla <radhac@marvell.com>
Signed-off-by: Amit Prakash Shukla <amitprakashs@marvell.com>
---
v2:
- Fix for bugs observed in v1.
- Squashed few commits.

 drivers/common/cnxk/roc_dpi.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/drivers/common/cnxk/roc_dpi.c b/drivers/common/cnxk/roc_dpi.c
index 93c8318a3d..0e2f803077 100644
--- a/drivers/common/cnxk/roc_dpi.c
+++ b/drivers/common/cnxk/roc_dpi.c
@@ -81,10 +81,10 @@ roc_dpi_configure(struct roc_dpi *roc_dpi)
 		return rc;
 	}
 
-	snprintf(name, sizeof(name), "dpimem%d", roc_dpi->vfid);
+	snprintf(name, sizeof(name), "dpimem%d:%d:%d:%d", pci_dev->addr.domain, pci_dev->addr.bus,
+		 pci_dev->addr.devid, pci_dev->addr.function);
 	buflen = DPI_CMD_QUEUE_SIZE * DPI_CMD_QUEUE_BUFS;
-	dpi_mz = plt_memzone_reserve_aligned(name, buflen, 0,
-					     DPI_CMD_QUEUE_SIZE);
+	dpi_mz = plt_memzone_reserve_aligned(name, buflen, 0, DPI_CMD_QUEUE_SIZE);
 	if (dpi_mz == NULL) {
 		plt_err("dpi memzone reserve failed");
 		rc = -ENOMEM;
-- 
2.25.1


^ permalink raw reply	[flat|nested] 46+ messages in thread

* [PATCH v2 7/7] dma/cnxk: add completion ring tail wrap check
  2023-07-31 12:12 ` [PATCH v2 1/7] drivers: changes for dmadev driver Amit Prakash Shukla
                     ` (4 preceding siblings ...)
  2023-07-31 12:12   ` [PATCH v2 6/7] common/cnxk: use unique name for DPI memzone Amit Prakash Shukla
@ 2023-07-31 12:12   ` Amit Prakash Shukla
  2023-08-16  8:13   ` [PATCH v2 1/7] drivers: changes for dmadev driver Jerin Jacob
  2023-08-18  9:01   ` [PATCH v3 1/8] common/cnxk: use unique name for DPI memzone Amit Prakash Shukla
  7 siblings, 0 replies; 46+ messages in thread
From: Amit Prakash Shukla @ 2023-07-31 12:12 UTC (permalink / raw)
  To: Vamsi Attunuru; +Cc: dev, jerinj

From: Vamsi Attunuru <vattunuru@marvell.com>

Adds a check to avoid tail wrap when completion desc ring
is full. Also patch increase max desc size to 2048.

Signed-off-by: Vamsi Attunuru <vattunuru@marvell.com>
---
v2:
- Fix for bugs observed in v1.
- Squashed few commits.

 drivers/dma/cnxk/cnxk_dmadev.c | 22 ++++++++++++++++++++--
 drivers/dma/cnxk/cnxk_dmadev.h |  2 +-
 2 files changed, 21 insertions(+), 3 deletions(-)

diff --git a/drivers/dma/cnxk/cnxk_dmadev.c b/drivers/dma/cnxk/cnxk_dmadev.c
index 9fb3bb264a..288606bb3d 100644
--- a/drivers/dma/cnxk/cnxk_dmadev.c
+++ b/drivers/dma/cnxk/cnxk_dmadev.c
@@ -434,6 +434,11 @@ cnxk_dmadev_copy(void *dev_private, uint16_t vchan, rte_iova_t src, rte_iova_t d
 	header->cn9k.ptr = (uint64_t)comp_ptr;
 	STRM_INC(dpi_conf->c_desc, tail);
 
+	if (unlikely(dpi_conf->c_desc.tail == dpi_conf->c_desc.head)) {
+		STRM_DEC(dpi_conf->c_desc, tail);
+		return -ENOSPC;
+	}
+
 	header->cn9k.nfst = 1;
 	header->cn9k.nlst = 1;
 
@@ -494,6 +499,11 @@ cnxk_dmadev_copy_sg(void *dev_private, uint16_t vchan, const struct rte_dma_sge
 	header->cn9k.ptr = (uint64_t)comp_ptr;
 	STRM_INC(dpi_conf->c_desc, tail);
 
+	if (unlikely(dpi_conf->c_desc.tail == dpi_conf->c_desc.head)) {
+		STRM_DEC(dpi_conf->c_desc, tail);
+		return -ENOSPC;
+	}
+
 	/*
 	 * For inbound case, src pointers are last pointers.
 	 * For all other cases, src pointers are first pointers.
@@ -561,6 +571,11 @@ cn10k_dmadev_copy(void *dev_private, uint16_t vchan, rte_iova_t src, rte_iova_t
 	header->cn10k.ptr = (uint64_t)comp_ptr;
 	STRM_INC(dpi_conf->c_desc, tail);
 
+	if (unlikely(dpi_conf->c_desc.tail == dpi_conf->c_desc.head)) {
+		STRM_DEC(dpi_conf->c_desc, tail);
+		return -ENOSPC;
+	}
+
 	header->cn10k.nfst = 1;
 	header->cn10k.nlst = 1;
 
@@ -613,6 +628,11 @@ cn10k_dmadev_copy_sg(void *dev_private, uint16_t vchan, const struct rte_dma_sge
 	header->cn10k.ptr = (uint64_t)comp_ptr;
 	STRM_INC(dpi_conf->c_desc, tail);
 
+	if (unlikely(dpi_conf->c_desc.tail == dpi_conf->c_desc.head)) {
+		STRM_DEC(dpi_conf->c_desc, tail);
+		return -ENOSPC;
+	}
+
 	header->cn10k.nfst = nb_src & DPI_MAX_POINTER;
 	header->cn10k.nlst = nb_dst & DPI_MAX_POINTER;
 	fptr = &src[0];
@@ -695,8 +715,6 @@ cnxk_dmadev_completed_status(void *dev_private, uint16_t vchan, const uint16_t n
 	struct cnxk_dpi_compl_s *comp_ptr;
 	int cnt;
 
-	RTE_SET_USED(last_idx);
-
 	for (cnt = 0; cnt < nb_cpls; cnt++) {
 		comp_ptr = c_desc->compl_ptr[c_desc->head];
 		status[cnt] = comp_ptr->cdata;
diff --git a/drivers/dma/cnxk/cnxk_dmadev.h b/drivers/dma/cnxk/cnxk_dmadev.h
index f375143b16..9c6c898d23 100644
--- a/drivers/dma/cnxk/cnxk_dmadev.h
+++ b/drivers/dma/cnxk/cnxk_dmadev.h
@@ -9,7 +9,7 @@
 #define DPI_MAX_POINTER	     15
 #define STRM_INC(s, var)     ((s).var = ((s).var + 1) & (s).max_cnt)
 #define STRM_DEC(s, var)     ((s).var = ((s).var - 1) == -1 ? (s).max_cnt : ((s).var - 1))
-#define DPI_MAX_DESC	     1024
+#define DPI_MAX_DESC	     2048
 #define DPI_MIN_DESC	     2
 #define MAX_VCHANS_PER_QUEUE 4
 
-- 
2.25.1


^ permalink raw reply	[flat|nested] 46+ messages in thread

* Re: [PATCH v2 1/7] drivers: changes for dmadev driver
  2023-07-31 12:12 ` [PATCH v2 1/7] drivers: changes for dmadev driver Amit Prakash Shukla
                     ` (5 preceding siblings ...)
  2023-07-31 12:12   ` [PATCH v2 7/7] dma/cnxk: add completion ring tail wrap check Amit Prakash Shukla
@ 2023-08-16  8:13   ` Jerin Jacob
  2023-08-16 10:09     ` [EXT] " Amit Prakash Shukla
  2023-08-18  9:01   ` [PATCH v3 1/8] common/cnxk: use unique name for DPI memzone Amit Prakash Shukla
  7 siblings, 1 reply; 46+ messages in thread
From: Jerin Jacob @ 2023-08-16  8:13 UTC (permalink / raw)
  To: Amit Prakash Shukla; +Cc: Vamsi Attunuru, dev, jerinj

On Mon, Jul 31, 2023 at 5:50 PM Amit Prakash Shukla
<amitprakashs@marvell.com> wrote:
>
> Dmadev driver changes to align with dpdk spec.


1) Change the subject to dma/cnxk: ...
2) Tell what is changed and why changed?
3) Across the series and this patches, if something is "fix" change as
dma/cnxk: fix .... and add Fixes:
4) If there are N fixes make it as N patches.

^ permalink raw reply	[flat|nested] 46+ messages in thread

* RE: [EXT] Re: [PATCH v2 1/7] drivers: changes for dmadev driver
  2023-08-16  8:13   ` [PATCH v2 1/7] drivers: changes for dmadev driver Jerin Jacob
@ 2023-08-16 10:09     ` Amit Prakash Shukla
  0 siblings, 0 replies; 46+ messages in thread
From: Amit Prakash Shukla @ 2023-08-16 10:09 UTC (permalink / raw)
  To: Jerin Jacob; +Cc: Vamsi Krishna Attunuru, dev, Jerin Jacob Kollanukkaran

Thanks Jerin for the feedback.

I will send the next version of patch with suggested changes.


> -----Original Message-----
> From: Jerin Jacob <jerinjacobk@gmail.com>
> Sent: Wednesday, August 16, 2023 1:44 PM
> To: Amit Prakash Shukla <amitprakashs@marvell.com>
> Cc: Vamsi Krishna Attunuru <vattunuru@marvell.com>; dev@dpdk.org; Jerin
> Jacob Kollanukkaran <jerinj@marvell.com>
> Subject: [EXT] Re: [PATCH v2 1/7] drivers: changes for dmadev driver
> 
> External Email
> 
> ----------------------------------------------------------------------
> On Mon, Jul 31, 2023 at 5:50 PM Amit Prakash Shukla
> <amitprakashs@marvell.com> wrote:
> >
> > Dmadev driver changes to align with dpdk spec.
> 
> 
> 1) Change the subject to dma/cnxk: ...
> 2) Tell what is changed and why changed?
> 3) Across the series and this patches, if something is "fix" change as
> dma/cnxk: fix .... and add Fixes:
> 4) If there are N fixes make it as N patches.

^ permalink raw reply	[flat|nested] 46+ messages in thread

* [PATCH v3 1/8] common/cnxk: use unique name for DPI memzone
  2023-07-31 12:12 ` [PATCH v2 1/7] drivers: changes for dmadev driver Amit Prakash Shukla
                     ` (6 preceding siblings ...)
  2023-08-16  8:13   ` [PATCH v2 1/7] drivers: changes for dmadev driver Jerin Jacob
@ 2023-08-18  9:01   ` Amit Prakash Shukla
  2023-08-18  9:01     ` [PATCH v3 2/8] dma/cnxk: changes for dmadev driver Amit Prakash Shukla
                       ` (8 more replies)
  7 siblings, 9 replies; 46+ messages in thread
From: Amit Prakash Shukla @ 2023-08-18  9:01 UTC (permalink / raw)
  To: Nithin Dabilpuram, Kiran Kumar K, Sunil Kumar Kori, Satha Rao
  Cc: dev, jerinj, Amit Prakash Shukla, stable, Radha Mohan Chintakuntla

roc_dpi was using vfid as part of name for memzone allocation.
This led to memzone allocation failure in case of multiple
physical functions. vfid is not unique by itself since multiple
physical functions can have the same virtual function indices.
So use complete DBDF as part of memzone name to make it unique.

Fixes: b6e395692b6d ("common/cnxk: add DPI DMA support")
Cc: stable@dpdk.org

Signed-off-by: Radha Mohan Chintakuntla <radhac@marvell.com>
---
v2:
- Fix for bugs observed in v1.
- Squashed few commits.

v3:
- Resolved review suggestions.
- Code improvement.

 drivers/common/cnxk/roc_dpi.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/drivers/common/cnxk/roc_dpi.c b/drivers/common/cnxk/roc_dpi.c
index 93c8318a3d..0e2f803077 100644
--- a/drivers/common/cnxk/roc_dpi.c
+++ b/drivers/common/cnxk/roc_dpi.c
@@ -81,10 +81,10 @@ roc_dpi_configure(struct roc_dpi *roc_dpi)
 		return rc;
 	}
 
-	snprintf(name, sizeof(name), "dpimem%d", roc_dpi->vfid);
+	snprintf(name, sizeof(name), "dpimem%d:%d:%d:%d", pci_dev->addr.domain, pci_dev->addr.bus,
+		 pci_dev->addr.devid, pci_dev->addr.function);
 	buflen = DPI_CMD_QUEUE_SIZE * DPI_CMD_QUEUE_BUFS;
-	dpi_mz = plt_memzone_reserve_aligned(name, buflen, 0,
-					     DPI_CMD_QUEUE_SIZE);
+	dpi_mz = plt_memzone_reserve_aligned(name, buflen, 0, DPI_CMD_QUEUE_SIZE);
 	if (dpi_mz == NULL) {
 		plt_err("dpi memzone reserve failed");
 		rc = -ENOMEM;
-- 
2.25.1


^ permalink raw reply	[flat|nested] 46+ messages in thread

* [PATCH v3 2/8] dma/cnxk: changes for dmadev driver
  2023-08-18  9:01   ` [PATCH v3 1/8] common/cnxk: use unique name for DPI memzone Amit Prakash Shukla
@ 2023-08-18  9:01     ` Amit Prakash Shukla
  2023-08-18  9:01     ` [PATCH v3 3/8] dma/cnxk: add DMA devops for all models of cn10xxx Amit Prakash Shukla
                       ` (7 subsequent siblings)
  8 siblings, 0 replies; 46+ messages in thread
From: Amit Prakash Shukla @ 2023-08-18  9:01 UTC (permalink / raw)
  To: Vamsi Attunuru; +Cc: dev, jerinj, Amit Prakash Shukla, stable

Dmadev driver changes to align with dpdk spec.

Fixes: 681851b347ad ("dma/cnxk: support CN10K DMA engine")
Cc: stable@dpdk.org

Signed-off-by: Amit Prakash Shukla <amitprakashs@marvell.com>
---
v2:
- Fix for bugs observed in v1.
- Squashed few commits.

v3:
- Resolved review suggestions.
- Code improvement.

 drivers/dma/cnxk/cnxk_dmadev.c | 464 ++++++++++++++++++++-------------
 drivers/dma/cnxk/cnxk_dmadev.h |  24 +-
 2 files changed, 294 insertions(+), 194 deletions(-)

diff --git a/drivers/dma/cnxk/cnxk_dmadev.c b/drivers/dma/cnxk/cnxk_dmadev.c
index a6f4a31e0e..a0152fc6df 100644
--- a/drivers/dma/cnxk/cnxk_dmadev.c
+++ b/drivers/dma/cnxk/cnxk_dmadev.c
@@ -7,68 +7,76 @@
 
 #include <bus_pci_driver.h>
 #include <rte_common.h>
+#include <rte_dmadev.h>
+#include <rte_dmadev_pmd.h>
 #include <rte_eal.h>
 #include <rte_lcore.h>
 #include <rte_mempool.h>
 #include <rte_pci.h>
-#include <rte_dmadev.h>
-#include <rte_dmadev_pmd.h>
 
-#include <roc_api.h>
 #include <cnxk_dmadev.h>
 
 static int
-cnxk_dmadev_info_get(const struct rte_dma_dev *dev,
-		     struct rte_dma_info *dev_info, uint32_t size)
+cnxk_dmadev_info_get(const struct rte_dma_dev *dev, struct rte_dma_info *dev_info, uint32_t size)
 {
 	RTE_SET_USED(dev);
 	RTE_SET_USED(size);
 
 	dev_info->max_vchans = 1;
 	dev_info->nb_vchans = 1;
-	dev_info->dev_capa = RTE_DMA_CAPA_MEM_TO_MEM |
-		RTE_DMA_CAPA_MEM_TO_DEV | RTE_DMA_CAPA_DEV_TO_MEM |
-		RTE_DMA_CAPA_DEV_TO_DEV | RTE_DMA_CAPA_OPS_COPY |
-		RTE_DMA_CAPA_OPS_COPY_SG;
+	dev_info->dev_capa = RTE_DMA_CAPA_MEM_TO_MEM | RTE_DMA_CAPA_MEM_TO_DEV |
+			     RTE_DMA_CAPA_DEV_TO_MEM | RTE_DMA_CAPA_DEV_TO_DEV |
+			     RTE_DMA_CAPA_OPS_COPY | RTE_DMA_CAPA_OPS_COPY_SG;
 	dev_info->max_desc = DPI_MAX_DESC;
-	dev_info->min_desc = 1;
+	dev_info->min_desc = 2;
 	dev_info->max_sges = DPI_MAX_POINTER;
 
 	return 0;
 }
 
 static int
-cnxk_dmadev_configure(struct rte_dma_dev *dev,
-		      const struct rte_dma_conf *conf, uint32_t conf_sz)
+cnxk_dmadev_configure(struct rte_dma_dev *dev, const struct rte_dma_conf *conf, uint32_t conf_sz)
 {
 	struct cnxk_dpi_vf_s *dpivf = NULL;
 	int rc = 0;
 
 	RTE_SET_USED(conf);
-	RTE_SET_USED(conf);
-	RTE_SET_USED(conf_sz);
 	RTE_SET_USED(conf_sz);
+
 	dpivf = dev->fp_obj->dev_private;
+
+	if (dpivf->flag & CNXK_DPI_DEV_CONFIG)
+		return rc;
+
 	rc = roc_dpi_configure(&dpivf->rdpi);
-	if (rc < 0)
+	if (rc < 0) {
 		plt_err("DMA configure failed err = %d", rc);
+		goto done;
+	}
 
+	dpivf->flag |= CNXK_DPI_DEV_CONFIG;
+
+done:
 	return rc;
 }
 
 static int
 cnxk_dmadev_vchan_setup(struct rte_dma_dev *dev, uint16_t vchan,
-			const struct rte_dma_vchan_conf *conf,
-			uint32_t conf_sz)
+			const struct rte_dma_vchan_conf *conf, uint32_t conf_sz)
 {
 	struct cnxk_dpi_vf_s *dpivf = dev->fp_obj->dev_private;
-	struct cnxk_dpi_compl_s *comp_data;
-	union dpi_instr_hdr_s *header = &dpivf->conf.hdr;
+	struct cnxk_dpi_conf *dpi_conf = &dpivf->conf;
+	union dpi_instr_hdr_s *header = &dpi_conf->hdr;
+	uint16_t max_desc;
+	uint32_t size;
 	int i;
 
 	RTE_SET_USED(vchan);
 	RTE_SET_USED(conf_sz);
 
+	if (dpivf->flag & CNXK_DPI_VCHAN_CONFIG)
+		return 0;
+
 	header->cn9k.pt = DPI_HDR_PT_ZBW_CA;
 
 	switch (conf->direction) {
@@ -96,35 +104,54 @@ cnxk_dmadev_vchan_setup(struct rte_dma_dev *dev, uint16_t vchan,
 		header->cn9k.fport = conf->dst_port.pcie.coreid;
 	};
 
-	for (i = 0; i < conf->nb_desc; i++) {
-		comp_data = rte_zmalloc(NULL, sizeof(*comp_data), 0);
-		if (comp_data == NULL) {
-			plt_err("Failed to allocate for comp_data");
-			return -ENOMEM;
-		}
-		comp_data->cdata = DPI_REQ_CDATA;
-		dpivf->conf.c_desc.compl_ptr[i] = comp_data;
-	};
-	dpivf->conf.c_desc.max_cnt = DPI_MAX_DESC;
-	dpivf->conf.c_desc.head = 0;
-	dpivf->conf.c_desc.tail = 0;
+	max_desc = conf->nb_desc;
+	if (!rte_is_power_of_2(max_desc))
+		max_desc = rte_align32pow2(max_desc);
+
+	if (max_desc > DPI_MAX_DESC)
+		max_desc = DPI_MAX_DESC;
+
+	size = (max_desc * sizeof(struct cnxk_dpi_compl_s *));
+	dpi_conf->c_desc.compl_ptr = rte_zmalloc(NULL, size, 0);
+
+	if (dpi_conf->c_desc.compl_ptr == NULL) {
+		plt_err("Failed to allocate for comp_data");
+		return -ENOMEM;
+	}
+
+	for (i = 0; i < max_desc; i++) {
+		dpi_conf->c_desc.compl_ptr[i] =
+			rte_zmalloc(NULL, sizeof(struct cnxk_dpi_compl_s), 0);
+		dpi_conf->c_desc.compl_ptr[i]->cdata = DPI_REQ_CDATA;
+	}
+
+	dpi_conf->c_desc.max_cnt = (max_desc - 1);
+	dpi_conf->c_desc.head = 0;
+	dpi_conf->c_desc.tail = 0;
+	dpivf->pnum_words = 0;
+	dpivf->pending = 0;
+	dpivf->flag |= CNXK_DPI_VCHAN_CONFIG;
 
 	return 0;
 }
 
 static int
 cn10k_dmadev_vchan_setup(struct rte_dma_dev *dev, uint16_t vchan,
-			 const struct rte_dma_vchan_conf *conf,
-			 uint32_t conf_sz)
+			 const struct rte_dma_vchan_conf *conf, uint32_t conf_sz)
 {
 	struct cnxk_dpi_vf_s *dpivf = dev->fp_obj->dev_private;
-	struct cnxk_dpi_compl_s *comp_data;
-	union dpi_instr_hdr_s *header = &dpivf->conf.hdr;
+	struct cnxk_dpi_conf *dpi_conf = &dpivf->conf;
+	union dpi_instr_hdr_s *header = &dpi_conf->hdr;
+	uint16_t max_desc;
+	uint32_t size;
 	int i;
 
 	RTE_SET_USED(vchan);
 	RTE_SET_USED(conf_sz);
 
+	if (dpivf->flag & CNXK_DPI_VCHAN_CONFIG)
+		return 0;
+
 	header->cn10k.pt = DPI_HDR_PT_ZBW_CA;
 
 	switch (conf->direction) {
@@ -152,18 +179,33 @@ cn10k_dmadev_vchan_setup(struct rte_dma_dev *dev, uint16_t vchan,
 		header->cn10k.fport = conf->dst_port.pcie.coreid;
 	};
 
-	for (i = 0; i < conf->nb_desc; i++) {
-		comp_data = rte_zmalloc(NULL, sizeof(*comp_data), 0);
-		if (comp_data == NULL) {
-			plt_err("Failed to allocate for comp_data");
-			return -ENOMEM;
-		}
-		comp_data->cdata = DPI_REQ_CDATA;
-		dpivf->conf.c_desc.compl_ptr[i] = comp_data;
-	};
-	dpivf->conf.c_desc.max_cnt = DPI_MAX_DESC;
-	dpivf->conf.c_desc.head = 0;
-	dpivf->conf.c_desc.tail = 0;
+	max_desc = conf->nb_desc;
+	if (!rte_is_power_of_2(max_desc))
+		max_desc = rte_align32pow2(max_desc);
+
+	if (max_desc > DPI_MAX_DESC)
+		max_desc = DPI_MAX_DESC;
+
+	size = (max_desc * sizeof(struct cnxk_dpi_compl_s *));
+	dpi_conf->c_desc.compl_ptr = rte_zmalloc(NULL, size, 0);
+
+	if (dpi_conf->c_desc.compl_ptr == NULL) {
+		plt_err("Failed to allocate for comp_data");
+		return -ENOMEM;
+	}
+
+	for (i = 0; i < max_desc; i++) {
+		dpi_conf->c_desc.compl_ptr[i] =
+			rte_zmalloc(NULL, sizeof(struct cnxk_dpi_compl_s), 0);
+		dpi_conf->c_desc.compl_ptr[i]->cdata = DPI_REQ_CDATA;
+	}
+
+	dpi_conf->c_desc.max_cnt = (max_desc - 1);
+	dpi_conf->c_desc.head = 0;
+	dpi_conf->c_desc.tail = 0;
+	dpivf->pnum_words = 0;
+	dpivf->pending = 0;
+	dpivf->flag |= CNXK_DPI_VCHAN_CONFIG;
 
 	return 0;
 }
@@ -173,10 +215,16 @@ cnxk_dmadev_start(struct rte_dma_dev *dev)
 {
 	struct cnxk_dpi_vf_s *dpivf = dev->fp_obj->dev_private;
 
+	if (dpivf->flag & CNXK_DPI_DEV_START)
+		return 0;
+
 	dpivf->desc_idx = 0;
-	dpivf->num_words = 0;
+	dpivf->pending = 0;
+	dpivf->pnum_words = 0;
 	roc_dpi_enable(&dpivf->rdpi);
 
+	dpivf->flag |= CNXK_DPI_DEV_START;
+
 	return 0;
 }
 
@@ -187,6 +235,8 @@ cnxk_dmadev_stop(struct rte_dma_dev *dev)
 
 	roc_dpi_disable(&dpivf->rdpi);
 
+	dpivf->flag &= ~CNXK_DPI_DEV_START;
+
 	return 0;
 }
 
@@ -198,6 +248,8 @@ cnxk_dmadev_close(struct rte_dma_dev *dev)
 	roc_dpi_disable(&dpivf->rdpi);
 	roc_dpi_dev_fini(&dpivf->rdpi);
 
+	dpivf->flag = 0;
+
 	return 0;
 }
 
@@ -206,8 +258,7 @@ __dpi_queue_write(struct roc_dpi *dpi, uint64_t *cmds, int cmd_count)
 {
 	uint64_t *ptr = dpi->chunk_base;
 
-	if ((cmd_count < DPI_MIN_CMD_SIZE) || (cmd_count > DPI_MAX_CMD_SIZE) ||
-	    cmds == NULL)
+	if ((cmd_count < DPI_MIN_CMD_SIZE) || (cmd_count > DPI_MAX_CMD_SIZE) || cmds == NULL)
 		return -EINVAL;
 
 	/*
@@ -223,11 +274,15 @@ __dpi_queue_write(struct roc_dpi *dpi, uint64_t *cmds, int cmd_count)
 		int count;
 		uint64_t *new_buff = dpi->chunk_next;
 
-		dpi->chunk_next =
-			(void *)roc_npa_aura_op_alloc(dpi->aura_handle, 0);
+		dpi->chunk_next = (void *)roc_npa_aura_op_alloc(dpi->aura_handle, 0);
 		if (!dpi->chunk_next) {
-			plt_err("Failed to alloc next buffer from NPA");
-			return -ENOMEM;
+			plt_dp_dbg("Failed to alloc next buffer from NPA");
+
+			/* NPA failed to allocate a buffer. Restoring chunk_next
+			 * to its original address.
+			 */
+			dpi->chunk_next = new_buff;
+			return -ENOSPC;
 		}
 
 		/*
@@ -261,13 +316,17 @@ __dpi_queue_write(struct roc_dpi *dpi, uint64_t *cmds, int cmd_count)
 		/* queue index may be greater than pool size */
 		if (dpi->chunk_head >= dpi->pool_size_m1) {
 			new_buff = dpi->chunk_next;
-			dpi->chunk_next =
-				(void *)roc_npa_aura_op_alloc(dpi->aura_handle,
-							      0);
+			dpi->chunk_next = (void *)roc_npa_aura_op_alloc(dpi->aura_handle, 0);
 			if (!dpi->chunk_next) {
-				plt_err("Failed to alloc next buffer from NPA");
-				return -ENOMEM;
+				plt_dp_dbg("Failed to alloc next buffer from NPA");
+
+				/* NPA failed to allocate a buffer. Restoring chunk_next
+				 * to its original address.
+				 */
+				dpi->chunk_next = new_buff;
+				return -ENOSPC;
 			}
+
 			/* Write next buffer address */
 			*ptr = (uint64_t)new_buff;
 			dpi->chunk_base = new_buff;
@@ -279,12 +338,13 @@ __dpi_queue_write(struct roc_dpi *dpi, uint64_t *cmds, int cmd_count)
 }
 
 static int
-cnxk_dmadev_copy(void *dev_private, uint16_t vchan, rte_iova_t src,
-		 rte_iova_t dst, uint32_t length, uint64_t flags)
+cnxk_dmadev_copy(void *dev_private, uint16_t vchan, rte_iova_t src, rte_iova_t dst, uint32_t length,
+		 uint64_t flags)
 {
 	struct cnxk_dpi_vf_s *dpivf = dev_private;
 	union dpi_instr_hdr_s *header = &dpivf->conf.hdr;
 	struct cnxk_dpi_compl_s *comp_ptr;
+	uint64_t cmd[DPI_MAX_CMD_SIZE];
 	rte_iova_t fptr, lptr;
 	int num_words = 0;
 	int rc;
@@ -292,9 +352,8 @@ cnxk_dmadev_copy(void *dev_private, uint16_t vchan, rte_iova_t src,
 	RTE_SET_USED(vchan);
 
 	comp_ptr = dpivf->conf.c_desc.compl_ptr[dpivf->conf.c_desc.tail];
-	comp_ptr->cdata = DPI_REQ_CDATA;
 	header->cn9k.ptr = (uint64_t)comp_ptr;
-	STRM_INC(dpivf->conf.c_desc);
+	STRM_INC(dpivf->conf.c_desc, tail);
 
 	header->cn9k.nfst = 1;
 	header->cn9k.nlst = 1;
@@ -311,103 +370,110 @@ cnxk_dmadev_copy(void *dev_private, uint16_t vchan, rte_iova_t src,
 		lptr = dst;
 	}
 
-	dpivf->cmd[0] = header->u[0];
-	dpivf->cmd[1] = header->u[1];
-	dpivf->cmd[2] = header->u[2];
+	cmd[0] = header->u[0];
+	cmd[1] = header->u[1];
+	cmd[2] = header->u[2];
 	/* word3 is always 0 */
 	num_words += 4;
-	dpivf->cmd[num_words++] = length;
-	dpivf->cmd[num_words++] = fptr;
-	dpivf->cmd[num_words++] = length;
-	dpivf->cmd[num_words++] = lptr;
-
-	rc = __dpi_queue_write(&dpivf->rdpi, dpivf->cmd, num_words);
-	if (!rc) {
-		if (flags & RTE_DMA_OP_FLAG_SUBMIT) {
-			rte_wmb();
-			plt_write64(num_words,
-				    dpivf->rdpi.rbase + DPI_VDMA_DBELL);
-			dpivf->stats.submitted++;
-		}
-		dpivf->num_words += num_words;
+	cmd[num_words++] = length;
+	cmd[num_words++] = fptr;
+	cmd[num_words++] = length;
+	cmd[num_words++] = lptr;
+
+	rc = __dpi_queue_write(&dpivf->rdpi, cmd, num_words);
+	if (unlikely(rc)) {
+		STRM_DEC(dpivf->conf.c_desc, tail);
+		return rc;
 	}
 
-	return dpivf->desc_idx++;
+	rte_wmb();
+	if (flags & RTE_DMA_OP_FLAG_SUBMIT) {
+		plt_write64(num_words, dpivf->rdpi.rbase + DPI_VDMA_DBELL);
+		dpivf->stats.submitted++;
+	} else {
+		dpivf->pnum_words += num_words;
+		dpivf->pending++;
+	}
+
+	return (dpivf->desc_idx++);
 }
 
 static int
-cnxk_dmadev_copy_sg(void *dev_private, uint16_t vchan,
-		    const struct rte_dma_sge *src,
-		    const struct rte_dma_sge *dst,
-		    uint16_t nb_src, uint16_t nb_dst, uint64_t flags)
+cnxk_dmadev_copy_sg(void *dev_private, uint16_t vchan, const struct rte_dma_sge *src,
+		    const struct rte_dma_sge *dst, uint16_t nb_src, uint16_t nb_dst, uint64_t flags)
 {
 	struct cnxk_dpi_vf_s *dpivf = dev_private;
 	union dpi_instr_hdr_s *header = &dpivf->conf.hdr;
 	const struct rte_dma_sge *fptr, *lptr;
 	struct cnxk_dpi_compl_s *comp_ptr;
+	uint64_t cmd[DPI_MAX_CMD_SIZE];
 	int num_words = 0;
 	int i, rc;
 
 	RTE_SET_USED(vchan);
 
 	comp_ptr = dpivf->conf.c_desc.compl_ptr[dpivf->conf.c_desc.tail];
-	comp_ptr->cdata = DPI_REQ_CDATA;
 	header->cn9k.ptr = (uint64_t)comp_ptr;
-	STRM_INC(dpivf->conf.c_desc);
+	STRM_INC(dpivf->conf.c_desc, tail);
 
 	/*
 	 * For inbound case, src pointers are last pointers.
 	 * For all other cases, src pointers are first pointers.
 	 */
 	if (header->cn9k.xtype == DPI_XTYPE_INBOUND) {
-		header->cn9k.nfst = nb_dst & 0xf;
-		header->cn9k.nlst = nb_src & 0xf;
+		header->cn9k.nfst = nb_dst & DPI_MAX_POINTER;
+		header->cn9k.nlst = nb_src & DPI_MAX_POINTER;
 		fptr = &dst[0];
 		lptr = &src[0];
 	} else {
-		header->cn9k.nfst = nb_src & 0xf;
-		header->cn9k.nlst = nb_dst & 0xf;
+		header->cn9k.nfst = nb_src & DPI_MAX_POINTER;
+		header->cn9k.nlst = nb_dst & DPI_MAX_POINTER;
 		fptr = &src[0];
 		lptr = &dst[0];
 	}
 
-	dpivf->cmd[0] = header->u[0];
-	dpivf->cmd[1] = header->u[1];
-	dpivf->cmd[2] = header->u[2];
+	cmd[0] = header->u[0];
+	cmd[1] = header->u[1];
+	cmd[2] = header->u[2];
 	num_words += 4;
 	for (i = 0; i < header->cn9k.nfst; i++) {
-		dpivf->cmd[num_words++] = (uint64_t)fptr->length;
-		dpivf->cmd[num_words++] = fptr->addr;
+		cmd[num_words++] = (uint64_t)fptr->length;
+		cmd[num_words++] = fptr->addr;
 		fptr++;
 	}
 
 	for (i = 0; i < header->cn9k.nlst; i++) {
-		dpivf->cmd[num_words++] = (uint64_t)lptr->length;
-		dpivf->cmd[num_words++] = lptr->addr;
+		cmd[num_words++] = (uint64_t)lptr->length;
+		cmd[num_words++] = lptr->addr;
 		lptr++;
 	}
 
-	rc = __dpi_queue_write(&dpivf->rdpi, dpivf->cmd, num_words);
-	if (!rc) {
-		if (flags & RTE_DMA_OP_FLAG_SUBMIT) {
-			rte_wmb();
-			plt_write64(num_words,
-				    dpivf->rdpi.rbase + DPI_VDMA_DBELL);
-			dpivf->stats.submitted += nb_src;
-		}
-		dpivf->num_words += num_words;
+	rc = __dpi_queue_write(&dpivf->rdpi, cmd, num_words);
+	if (unlikely(rc)) {
+		STRM_DEC(dpivf->conf.c_desc, tail);
+		return rc;
 	}
 
-	return (rc < 0) ? rc : dpivf->desc_idx++;
+	if (flags & RTE_DMA_OP_FLAG_SUBMIT) {
+		rte_wmb();
+		plt_write64(num_words, dpivf->rdpi.rbase + DPI_VDMA_DBELL);
+		dpivf->stats.submitted += nb_src;
+	} else {
+		dpivf->pnum_words += num_words;
+		dpivf->pending++;
+	}
+
+	return (dpivf->desc_idx++);
 }
 
 static int
-cn10k_dmadev_copy(void *dev_private, uint16_t vchan, rte_iova_t src,
-		  rte_iova_t dst, uint32_t length, uint64_t flags)
+cn10k_dmadev_copy(void *dev_private, uint16_t vchan, rte_iova_t src, rte_iova_t dst,
+		  uint32_t length, uint64_t flags)
 {
 	struct cnxk_dpi_vf_s *dpivf = dev_private;
 	union dpi_instr_hdr_s *header = &dpivf->conf.hdr;
 	struct cnxk_dpi_compl_s *comp_ptr;
+	uint64_t cmd[DPI_MAX_CMD_SIZE];
 	rte_iova_t fptr, lptr;
 	int num_words = 0;
 	int rc;
@@ -415,9 +481,8 @@ cn10k_dmadev_copy(void *dev_private, uint16_t vchan, rte_iova_t src,
 	RTE_SET_USED(vchan);
 
 	comp_ptr = dpivf->conf.c_desc.compl_ptr[dpivf->conf.c_desc.tail];
-	comp_ptr->cdata = DPI_REQ_CDATA;
 	header->cn10k.ptr = (uint64_t)comp_ptr;
-	STRM_INC(dpivf->conf.c_desc);
+	STRM_INC(dpivf->conf.c_desc, tail);
 
 	header->cn10k.nfst = 1;
 	header->cn10k.nlst = 1;
@@ -425,131 +490,140 @@ cn10k_dmadev_copy(void *dev_private, uint16_t vchan, rte_iova_t src,
 	fptr = src;
 	lptr = dst;
 
-	dpivf->cmd[0] = header->u[0];
-	dpivf->cmd[1] = header->u[1];
-	dpivf->cmd[2] = header->u[2];
+	cmd[0] = header->u[0];
+	cmd[1] = header->u[1];
+	cmd[2] = header->u[2];
 	/* word3 is always 0 */
 	num_words += 4;
-	dpivf->cmd[num_words++] = length;
-	dpivf->cmd[num_words++] = fptr;
-	dpivf->cmd[num_words++] = length;
-	dpivf->cmd[num_words++] = lptr;
-
-	rc = __dpi_queue_write(&dpivf->rdpi, dpivf->cmd, num_words);
-	if (!rc) {
-		if (flags & RTE_DMA_OP_FLAG_SUBMIT) {
-			rte_wmb();
-			plt_write64(num_words,
-				    dpivf->rdpi.rbase + DPI_VDMA_DBELL);
-			dpivf->stats.submitted++;
-		}
-		dpivf->num_words += num_words;
+	cmd[num_words++] = length;
+	cmd[num_words++] = fptr;
+	cmd[num_words++] = length;
+	cmd[num_words++] = lptr;
+
+	rc = __dpi_queue_write(&dpivf->rdpi, cmd, num_words);
+	if (unlikely(rc)) {
+		STRM_DEC(dpivf->conf.c_desc, tail);
+		return rc;
+	}
+
+	if (flags & RTE_DMA_OP_FLAG_SUBMIT) {
+		rte_wmb();
+		plt_write64(num_words, dpivf->rdpi.rbase + DPI_VDMA_DBELL);
+		dpivf->stats.submitted++;
+	} else {
+		dpivf->pnum_words += num_words;
+		dpivf->pending++;
 	}
 
 	return dpivf->desc_idx++;
 }
 
 static int
-cn10k_dmadev_copy_sg(void *dev_private, uint16_t vchan,
-		     const struct rte_dma_sge *src,
-		     const struct rte_dma_sge *dst, uint16_t nb_src,
-		     uint16_t nb_dst, uint64_t flags)
+cn10k_dmadev_copy_sg(void *dev_private, uint16_t vchan, const struct rte_dma_sge *src,
+		     const struct rte_dma_sge *dst, uint16_t nb_src, uint16_t nb_dst,
+		     uint64_t flags)
 {
 	struct cnxk_dpi_vf_s *dpivf = dev_private;
 	union dpi_instr_hdr_s *header = &dpivf->conf.hdr;
 	const struct rte_dma_sge *fptr, *lptr;
 	struct cnxk_dpi_compl_s *comp_ptr;
+	uint64_t cmd[DPI_MAX_CMD_SIZE];
 	int num_words = 0;
 	int i, rc;
 
 	RTE_SET_USED(vchan);
 
 	comp_ptr = dpivf->conf.c_desc.compl_ptr[dpivf->conf.c_desc.tail];
-	comp_ptr->cdata = DPI_REQ_CDATA;
 	header->cn10k.ptr = (uint64_t)comp_ptr;
-	STRM_INC(dpivf->conf.c_desc);
+	STRM_INC(dpivf->conf.c_desc, tail);
 
-	header->cn10k.nfst = nb_src & 0xf;
-	header->cn10k.nlst = nb_dst & 0xf;
+	header->cn10k.nfst = nb_src & DPI_MAX_POINTER;
+	header->cn10k.nlst = nb_dst & DPI_MAX_POINTER;
 	fptr = &src[0];
 	lptr = &dst[0];
 
-	dpivf->cmd[0] = header->u[0];
-	dpivf->cmd[1] = header->u[1];
-	dpivf->cmd[2] = header->u[2];
+	cmd[0] = header->u[0];
+	cmd[1] = header->u[1];
+	cmd[2] = header->u[2];
 	num_words += 4;
 
 	for (i = 0; i < header->cn10k.nfst; i++) {
-		dpivf->cmd[num_words++] = (uint64_t)fptr->length;
-		dpivf->cmd[num_words++] = fptr->addr;
+		cmd[num_words++] = (uint64_t)fptr->length;
+		cmd[num_words++] = fptr->addr;
 		fptr++;
 	}
 
 	for (i = 0; i < header->cn10k.nlst; i++) {
-		dpivf->cmd[num_words++] = (uint64_t)lptr->length;
-		dpivf->cmd[num_words++] = lptr->addr;
+		cmd[num_words++] = (uint64_t)lptr->length;
+		cmd[num_words++] = lptr->addr;
 		lptr++;
 	}
 
-	rc = __dpi_queue_write(&dpivf->rdpi, dpivf->cmd, num_words);
-	if (!rc) {
-		if (flags & RTE_DMA_OP_FLAG_SUBMIT) {
-			rte_wmb();
-			plt_write64(num_words,
-				    dpivf->rdpi.rbase + DPI_VDMA_DBELL);
-			dpivf->stats.submitted += nb_src;
-		}
-		dpivf->num_words += num_words;
+	rc = __dpi_queue_write(&dpivf->rdpi, cmd, num_words);
+	if (unlikely(rc)) {
+		STRM_DEC(dpivf->conf.c_desc, tail);
+		return rc;
+	}
+
+	if (flags & RTE_DMA_OP_FLAG_SUBMIT) {
+		rte_wmb();
+		plt_write64(num_words, dpivf->rdpi.rbase + DPI_VDMA_DBELL);
+		dpivf->stats.submitted += nb_src;
+	} else {
+		dpivf->pnum_words += num_words;
+		dpivf->pending++;
 	}
 
-	return (rc < 0) ? rc : dpivf->desc_idx++;
+	return (dpivf->desc_idx++);
 }
 
 static uint16_t
-cnxk_dmadev_completed(void *dev_private, uint16_t vchan, const uint16_t nb_cpls,
-		      uint16_t *last_idx, bool *has_error)
+cnxk_dmadev_completed(void *dev_private, uint16_t vchan, const uint16_t nb_cpls, uint16_t *last_idx,
+		      bool *has_error)
 {
 	struct cnxk_dpi_vf_s *dpivf = dev_private;
+	struct cnxk_dpi_cdesc_data_s *c_desc = &dpivf->conf.c_desc;
+	struct cnxk_dpi_compl_s *comp_ptr;
 	int cnt;
 
 	RTE_SET_USED(vchan);
 
-	if (dpivf->stats.submitted == dpivf->stats.completed)
-		return 0;
-
 	for (cnt = 0; cnt < nb_cpls; cnt++) {
-		struct cnxk_dpi_compl_s *comp_ptr =
-			dpivf->conf.c_desc.compl_ptr[cnt];
+		comp_ptr = c_desc->compl_ptr[c_desc->head];
 
 		if (comp_ptr->cdata) {
 			if (comp_ptr->cdata == DPI_REQ_CDATA)
 				break;
 			*has_error = 1;
 			dpivf->stats.errors++;
+			STRM_INC(*c_desc, head);
 			break;
 		}
+
+		comp_ptr->cdata = DPI_REQ_CDATA;
+		STRM_INC(*c_desc, head);
 	}
 
-	*last_idx = cnt - 1;
-	dpivf->conf.c_desc.tail = cnt;
 	dpivf->stats.completed += cnt;
+	*last_idx = dpivf->stats.completed - 1;
 
 	return cnt;
 }
 
 static uint16_t
-cnxk_dmadev_completed_status(void *dev_private, uint16_t vchan,
-			     const uint16_t nb_cpls, uint16_t *last_idx,
-			     enum rte_dma_status_code *status)
+cnxk_dmadev_completed_status(void *dev_private, uint16_t vchan, const uint16_t nb_cpls,
+			     uint16_t *last_idx, enum rte_dma_status_code *status)
 {
 	struct cnxk_dpi_vf_s *dpivf = dev_private;
+	struct cnxk_dpi_cdesc_data_s *c_desc = &dpivf->conf.c_desc;
+	struct cnxk_dpi_compl_s *comp_ptr;
 	int cnt;
 
 	RTE_SET_USED(vchan);
 	RTE_SET_USED(last_idx);
+
 	for (cnt = 0; cnt < nb_cpls; cnt++) {
-		struct cnxk_dpi_compl_s *comp_ptr =
-			dpivf->conf.c_desc.compl_ptr[cnt];
+		comp_ptr = c_desc->compl_ptr[c_desc->head];
 		status[cnt] = comp_ptr->cdata;
 		if (status[cnt]) {
 			if (status[cnt] == DPI_REQ_CDATA)
@@ -557,30 +631,52 @@ cnxk_dmadev_completed_status(void *dev_private, uint16_t vchan,
 
 			dpivf->stats.errors++;
 		}
+		comp_ptr->cdata = DPI_REQ_CDATA;
+		STRM_INC(*c_desc, head);
 	}
 
-	*last_idx = cnt - 1;
-	dpivf->conf.c_desc.tail = 0;
 	dpivf->stats.completed += cnt;
+	*last_idx = dpivf->stats.completed - 1;
 
 	return cnt;
 }
 
+static uint16_t
+cnxk_damdev_burst_capacity(const void *dev_private, uint16_t vchan)
+{
+	const struct cnxk_dpi_vf_s *dpivf = (const struct cnxk_dpi_vf_s *)dev_private;
+	uint16_t burst_cap;
+
+	RTE_SET_USED(vchan);
+
+	burst_cap = dpivf->conf.c_desc.max_cnt -
+		    ((dpivf->stats.submitted - dpivf->stats.completed) + dpivf->pending) + 1;
+
+	return burst_cap;
+}
+
 static int
 cnxk_dmadev_submit(void *dev_private, uint16_t vchan __rte_unused)
 {
 	struct cnxk_dpi_vf_s *dpivf = dev_private;
+	uint32_t num_words = dpivf->pnum_words;
+
+	if (!dpivf->pnum_words)
+		return 0;
 
 	rte_wmb();
-	plt_write64(dpivf->num_words, dpivf->rdpi.rbase + DPI_VDMA_DBELL);
-	dpivf->stats.submitted++;
+	plt_write64(num_words, dpivf->rdpi.rbase + DPI_VDMA_DBELL);
+
+	dpivf->stats.submitted += dpivf->pending;
+	dpivf->pnum_words = 0;
+	dpivf->pending = 0;
 
 	return 0;
 }
 
 static int
-cnxk_stats_get(const struct rte_dma_dev *dev, uint16_t vchan,
-	       struct rte_dma_stats *rte_stats, uint32_t size)
+cnxk_stats_get(const struct rte_dma_dev *dev, uint16_t vchan, struct rte_dma_stats *rte_stats,
+	       uint32_t size)
 {
 	struct cnxk_dpi_vf_s *dpivf = dev->fp_obj->dev_private;
 	struct rte_dma_stats *stats = &dpivf->stats;
@@ -628,8 +724,7 @@ static const struct rte_dma_dev_ops cnxk_dmadev_ops = {
 };
 
 static int
-cnxk_dmadev_probe(struct rte_pci_driver *pci_drv __rte_unused,
-		  struct rte_pci_device *pci_dev)
+cnxk_dmadev_probe(struct rte_pci_driver *pci_drv __rte_unused, struct rte_pci_device *pci_dev)
 {
 	struct cnxk_dpi_vf_s *dpivf = NULL;
 	char name[RTE_DEV_NAME_MAX_LEN];
@@ -648,8 +743,7 @@ cnxk_dmadev_probe(struct rte_pci_driver *pci_drv __rte_unused,
 	memset(name, 0, sizeof(name));
 	rte_pci_device_name(&pci_dev->addr, name, sizeof(name));
 
-	dmadev = rte_dma_pmd_allocate(name, pci_dev->device.numa_node,
-				      sizeof(*dpivf));
+	dmadev = rte_dma_pmd_allocate(name, pci_dev->device.numa_node, sizeof(*dpivf));
 	if (dmadev == NULL) {
 		plt_err("dma device allocation failed for %s", name);
 		return -ENOMEM;
@@ -666,6 +760,7 @@ cnxk_dmadev_probe(struct rte_pci_driver *pci_drv __rte_unused,
 	dmadev->fp_obj->submit = cnxk_dmadev_submit;
 	dmadev->fp_obj->completed = cnxk_dmadev_completed;
 	dmadev->fp_obj->completed_status = cnxk_dmadev_completed_status;
+	dmadev->fp_obj->burst_capacity = cnxk_damdev_burst_capacity;
 
 	if (pci_dev->id.subsystem_device_id == PCI_SUBSYSTEM_DEVID_CN10KA ||
 	    pci_dev->id.subsystem_device_id == PCI_SUBSYSTEM_DEVID_CNF10KA ||
@@ -682,6 +777,8 @@ cnxk_dmadev_probe(struct rte_pci_driver *pci_drv __rte_unused,
 	if (rc < 0)
 		goto err_out_free;
 
+	dmadev->state = RTE_DMA_DEV_READY;
+
 	return 0;
 
 err_out_free:
@@ -703,20 +800,17 @@ cnxk_dmadev_remove(struct rte_pci_device *pci_dev)
 }
 
 static const struct rte_pci_id cnxk_dma_pci_map[] = {
-	{
-		RTE_PCI_DEVICE(PCI_VENDOR_ID_CAVIUM,
-			       PCI_DEVID_CNXK_DPI_VF)
-	},
+	{RTE_PCI_DEVICE(PCI_VENDOR_ID_CAVIUM, PCI_DEVID_CNXK_DPI_VF)},
 	{
 		.vendor_id = 0,
 	},
 };
 
 static struct rte_pci_driver cnxk_dmadev = {
-	.id_table  = cnxk_dma_pci_map,
+	.id_table = cnxk_dma_pci_map,
 	.drv_flags = RTE_PCI_DRV_NEED_MAPPING | RTE_PCI_DRV_NEED_IOVA_AS_VA,
-	.probe     = cnxk_dmadev_probe,
-	.remove    = cnxk_dmadev_remove,
+	.probe = cnxk_dmadev_probe,
+	.remove = cnxk_dmadev_remove,
 };
 
 RTE_PMD_REGISTER_PCI(cnxk_dmadev_pci_driver, cnxk_dmadev);
diff --git a/drivers/dma/cnxk/cnxk_dmadev.h b/drivers/dma/cnxk/cnxk_dmadev.h
index e1f5694f50..9563295af0 100644
--- a/drivers/dma/cnxk/cnxk_dmadev.h
+++ b/drivers/dma/cnxk/cnxk_dmadev.h
@@ -4,16 +4,21 @@
 #ifndef CNXK_DMADEV_H
 #define CNXK_DMADEV_H
 
-#define DPI_MAX_POINTER		15
-#define DPI_QUEUE_STOP		0x0
-#define DPI_QUEUE_START		0x1
-#define STRM_INC(s)		((s).tail = ((s).tail + 1) % (s).max_cnt)
-#define DPI_MAX_DESC		1024
+#include <roc_api.h>
+
+#define DPI_MAX_POINTER	 15
+#define STRM_INC(s, var) ((s).var = ((s).var + 1) & (s).max_cnt)
+#define STRM_DEC(s, var) ((s).var = ((s).var - 1) == -1 ? (s).max_cnt : ((s).var - 1))
+#define DPI_MAX_DESC	 1024
 
 /* Set Completion data to 0xFF when request submitted,
  * upon successful request completion engine reset to completion status
  */
-#define DPI_REQ_CDATA		0xFF
+#define DPI_REQ_CDATA 0xFF
+
+#define CNXK_DPI_DEV_CONFIG   (1ULL << 0)
+#define CNXK_DPI_VCHAN_CONFIG (1ULL << 1)
+#define CNXK_DPI_DEV_START    (1ULL << 2)
 
 struct cnxk_dpi_compl_s {
 	uint64_t cdata;
@@ -21,7 +26,7 @@ struct cnxk_dpi_compl_s {
 };
 
 struct cnxk_dpi_cdesc_data_s {
-	struct cnxk_dpi_compl_s *compl_ptr[DPI_MAX_DESC];
+	struct cnxk_dpi_compl_s **compl_ptr;
 	uint16_t max_cnt;
 	uint16_t head;
 	uint16_t tail;
@@ -36,9 +41,10 @@ struct cnxk_dpi_vf_s {
 	struct roc_dpi rdpi;
 	struct cnxk_dpi_conf conf;
 	struct rte_dma_stats stats;
-	uint64_t cmd[DPI_MAX_CMD_SIZE];
-	uint32_t num_words;
+	uint16_t pending;
+	uint16_t pnum_words;
 	uint16_t desc_idx;
+	uint16_t flag;
 };
 
 #endif
-- 
2.25.1


^ permalink raw reply	[flat|nested] 46+ messages in thread

* [PATCH v3 3/8] dma/cnxk: add DMA devops for all models of cn10xxx
  2023-08-18  9:01   ` [PATCH v3 1/8] common/cnxk: use unique name for DPI memzone Amit Prakash Shukla
  2023-08-18  9:01     ` [PATCH v3 2/8] dma/cnxk: changes for dmadev driver Amit Prakash Shukla
@ 2023-08-18  9:01     ` Amit Prakash Shukla
  2023-08-18  9:01     ` [PATCH v3 4/8] dma/cnxk: update func field based on transfer type Amit Prakash Shukla
                       ` (6 subsequent siblings)
  8 siblings, 0 replies; 46+ messages in thread
From: Amit Prakash Shukla @ 2023-08-18  9:01 UTC (permalink / raw)
  To: Vamsi Attunuru; +Cc: dev, jerinj, Amit Prakash Shukla, Radha Mohan Chintakuntla

Valid function pointers are set for DMA device operations
i.e. cn10k_dmadev_ops are used for all cn10k devices.

Signed-off-by: Radha Mohan Chintakuntla <radhac@marvell.com>
---
v2:
- Fix for bugs observed in v1.
- Squashed few commits.

v3:
- Resolved review suggestions.
- Code improvement.

 drivers/dma/cnxk/cnxk_dmadev.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/drivers/dma/cnxk/cnxk_dmadev.c b/drivers/dma/cnxk/cnxk_dmadev.c
index a0152fc6df..1dc124e68f 100644
--- a/drivers/dma/cnxk/cnxk_dmadev.c
+++ b/drivers/dma/cnxk/cnxk_dmadev.c
@@ -763,7 +763,9 @@ cnxk_dmadev_probe(struct rte_pci_driver *pci_drv __rte_unused, struct rte_pci_de
 	dmadev->fp_obj->burst_capacity = cnxk_damdev_burst_capacity;
 
 	if (pci_dev->id.subsystem_device_id == PCI_SUBSYSTEM_DEVID_CN10KA ||
+	    pci_dev->id.subsystem_device_id == PCI_SUBSYSTEM_DEVID_CN10KAS ||
 	    pci_dev->id.subsystem_device_id == PCI_SUBSYSTEM_DEVID_CNF10KA ||
+	    pci_dev->id.subsystem_device_id == PCI_SUBSYSTEM_DEVID_CNF10KB ||
 	    pci_dev->id.subsystem_device_id == PCI_SUBSYSTEM_DEVID_CN10KB) {
 		dmadev->dev_ops = &cn10k_dmadev_ops;
 		dmadev->fp_obj->copy = cn10k_dmadev_copy;
-- 
2.25.1


^ permalink raw reply	[flat|nested] 46+ messages in thread

* [PATCH v3 4/8] dma/cnxk: update func field based on transfer type
  2023-08-18  9:01   ` [PATCH v3 1/8] common/cnxk: use unique name for DPI memzone Amit Prakash Shukla
  2023-08-18  9:01     ` [PATCH v3 2/8] dma/cnxk: changes for dmadev driver Amit Prakash Shukla
  2023-08-18  9:01     ` [PATCH v3 3/8] dma/cnxk: add DMA devops for all models of cn10xxx Amit Prakash Shukla
@ 2023-08-18  9:01     ` Amit Prakash Shukla
  2023-08-18  9:01     ` [PATCH v3 5/8] dma/cnxk: increase vchan per queue to max 4 Amit Prakash Shukla
                       ` (5 subsequent siblings)
  8 siblings, 0 replies; 46+ messages in thread
From: Amit Prakash Shukla @ 2023-08-18  9:01 UTC (permalink / raw)
  To: Vamsi Attunuru; +Cc: dev, jerinj, Amit Prakash Shukla, Radha Mohan Chintakuntla

Use pfid and vfid of src_port for incoming DMA transfers and dst_port
for outgoing DMA transfers.

Signed-off-by: Radha Mohan Chintakuntla <radhac@marvell.com>
Signed-off-by: Amit Prakash Shukla <amitprakashs@marvell.com>
---
v2:
- Fix for bugs observed in v1.
- Squashed few commits.

v3:
- Resolved review suggestions.
- Code improvement.

 drivers/dma/cnxk/cnxk_dmadev.c | 26 ++++++++++++++++++++++----
 1 file changed, 22 insertions(+), 4 deletions(-)

diff --git a/drivers/dma/cnxk/cnxk_dmadev.c b/drivers/dma/cnxk/cnxk_dmadev.c
index 1dc124e68f..d8cfb98cd7 100644
--- a/drivers/dma/cnxk/cnxk_dmadev.c
+++ b/drivers/dma/cnxk/cnxk_dmadev.c
@@ -84,13 +84,21 @@ cnxk_dmadev_vchan_setup(struct rte_dma_dev *dev, uint16_t vchan,
 		header->cn9k.xtype = DPI_XTYPE_INBOUND;
 		header->cn9k.lport = conf->src_port.pcie.coreid;
 		header->cn9k.fport = 0;
-		header->cn9k.pvfe = 1;
+		header->cn9k.pvfe = conf->src_port.pcie.vfen;
+		if (header->cn9k.pvfe) {
+			header->cn9k.func = conf->src_port.pcie.pfid << 12;
+			header->cn9k.func |= conf->src_port.pcie.vfid;
+		}
 		break;
 	case RTE_DMA_DIR_MEM_TO_DEV:
 		header->cn9k.xtype = DPI_XTYPE_OUTBOUND;
 		header->cn9k.lport = 0;
 		header->cn9k.fport = conf->dst_port.pcie.coreid;
-		header->cn9k.pvfe = 1;
+		header->cn9k.pvfe = conf->dst_port.pcie.vfen;
+		if (header->cn9k.pvfe) {
+			header->cn9k.func = conf->dst_port.pcie.pfid << 12;
+			header->cn9k.func |= conf->dst_port.pcie.vfid;
+		}
 		break;
 	case RTE_DMA_DIR_MEM_TO_MEM:
 		header->cn9k.xtype = DPI_XTYPE_INTERNAL_ONLY;
@@ -102,6 +110,7 @@ cnxk_dmadev_vchan_setup(struct rte_dma_dev *dev, uint16_t vchan,
 		header->cn9k.xtype = DPI_XTYPE_EXTERNAL_ONLY;
 		header->cn9k.lport = conf->src_port.pcie.coreid;
 		header->cn9k.fport = conf->dst_port.pcie.coreid;
+		header->cn9k.pvfe = 0;
 	};
 
 	max_desc = conf->nb_desc;
@@ -159,13 +168,21 @@ cn10k_dmadev_vchan_setup(struct rte_dma_dev *dev, uint16_t vchan,
 		header->cn10k.xtype = DPI_XTYPE_INBOUND;
 		header->cn10k.lport = conf->src_port.pcie.coreid;
 		header->cn10k.fport = 0;
-		header->cn10k.pvfe = 1;
+		header->cn10k.pvfe = conf->src_port.pcie.vfen;
+		if (header->cn10k.pvfe) {
+			header->cn10k.func = conf->src_port.pcie.pfid << 12;
+			header->cn10k.func |= conf->src_port.pcie.vfid;
+		}
 		break;
 	case RTE_DMA_DIR_MEM_TO_DEV:
 		header->cn10k.xtype = DPI_XTYPE_OUTBOUND;
 		header->cn10k.lport = 0;
 		header->cn10k.fport = conf->dst_port.pcie.coreid;
-		header->cn10k.pvfe = 1;
+		header->cn10k.pvfe = conf->dst_port.pcie.vfen;
+		if (header->cn10k.pvfe) {
+			header->cn10k.func = conf->dst_port.pcie.pfid << 12;
+			header->cn10k.func |= conf->dst_port.pcie.vfid;
+		}
 		break;
 	case RTE_DMA_DIR_MEM_TO_MEM:
 		header->cn10k.xtype = DPI_XTYPE_INTERNAL_ONLY;
@@ -177,6 +194,7 @@ cn10k_dmadev_vchan_setup(struct rte_dma_dev *dev, uint16_t vchan,
 		header->cn10k.xtype = DPI_XTYPE_EXTERNAL_ONLY;
 		header->cn10k.lport = conf->src_port.pcie.coreid;
 		header->cn10k.fport = conf->dst_port.pcie.coreid;
+		header->cn10k.pvfe = 0;
 	};
 
 	max_desc = conf->nb_desc;
-- 
2.25.1


^ permalink raw reply	[flat|nested] 46+ messages in thread

* [PATCH v3 5/8] dma/cnxk: increase vchan per queue to max 4
  2023-08-18  9:01   ` [PATCH v3 1/8] common/cnxk: use unique name for DPI memzone Amit Prakash Shukla
                       ` (2 preceding siblings ...)
  2023-08-18  9:01     ` [PATCH v3 4/8] dma/cnxk: update func field based on transfer type Amit Prakash Shukla
@ 2023-08-18  9:01     ` Amit Prakash Shukla
  2023-08-18  9:01     ` [PATCH v3 6/8] dma/cnxk: vchan support enhancement Amit Prakash Shukla
                       ` (4 subsequent siblings)
  8 siblings, 0 replies; 46+ messages in thread
From: Amit Prakash Shukla @ 2023-08-18  9:01 UTC (permalink / raw)
  To: Vamsi Attunuru; +Cc: dev, jerinj, Amit Prakash Shukla, Radha Mohan Chintakuntla

To support multiple directions in same queue make use of multiple vchan
per queue. Each vchan can be configured in some direction and used.

Signed-off-by: Amit Prakash Shukla <amitprakashs@marvell.com>
Signed-off-by: Radha Mohan Chintakuntla <radhac@marvell.com>
---
v2:
- Fix for bugs observed in v1.
- Squashed few commits.

v3:
- Resolved review suggestions.
- Code improvement.

 drivers/dma/cnxk/cnxk_dmadev.c | 68 +++++++++++++++-------------------
 drivers/dma/cnxk/cnxk_dmadev.h | 11 +++---
 2 files changed, 36 insertions(+), 43 deletions(-)

diff --git a/drivers/dma/cnxk/cnxk_dmadev.c b/drivers/dma/cnxk/cnxk_dmadev.c
index d8cfb98cd7..7d83b70e8b 100644
--- a/drivers/dma/cnxk/cnxk_dmadev.c
+++ b/drivers/dma/cnxk/cnxk_dmadev.c
@@ -22,8 +22,8 @@ cnxk_dmadev_info_get(const struct rte_dma_dev *dev, struct rte_dma_info *dev_inf
 	RTE_SET_USED(dev);
 	RTE_SET_USED(size);
 
-	dev_info->max_vchans = 1;
-	dev_info->nb_vchans = 1;
+	dev_info->max_vchans = MAX_VCHANS_PER_QUEUE;
+	dev_info->nb_vchans = MAX_VCHANS_PER_QUEUE;
 	dev_info->dev_capa = RTE_DMA_CAPA_MEM_TO_MEM | RTE_DMA_CAPA_MEM_TO_DEV |
 			     RTE_DMA_CAPA_DEV_TO_MEM | RTE_DMA_CAPA_DEV_TO_DEV |
 			     RTE_DMA_CAPA_OPS_COPY | RTE_DMA_CAPA_OPS_COPY_SG;
@@ -65,13 +65,12 @@ cnxk_dmadev_vchan_setup(struct rte_dma_dev *dev, uint16_t vchan,
 			const struct rte_dma_vchan_conf *conf, uint32_t conf_sz)
 {
 	struct cnxk_dpi_vf_s *dpivf = dev->fp_obj->dev_private;
-	struct cnxk_dpi_conf *dpi_conf = &dpivf->conf;
+	struct cnxk_dpi_conf *dpi_conf = &dpivf->conf[vchan];
 	union dpi_instr_hdr_s *header = &dpi_conf->hdr;
 	uint16_t max_desc;
 	uint32_t size;
 	int i;
 
-	RTE_SET_USED(vchan);
 	RTE_SET_USED(conf_sz);
 
 	if (dpivf->flag & CNXK_DPI_VCHAN_CONFIG)
@@ -149,13 +148,12 @@ cn10k_dmadev_vchan_setup(struct rte_dma_dev *dev, uint16_t vchan,
 			 const struct rte_dma_vchan_conf *conf, uint32_t conf_sz)
 {
 	struct cnxk_dpi_vf_s *dpivf = dev->fp_obj->dev_private;
-	struct cnxk_dpi_conf *dpi_conf = &dpivf->conf;
+	struct cnxk_dpi_conf *dpi_conf = &dpivf->conf[vchan];
 	union dpi_instr_hdr_s *header = &dpi_conf->hdr;
 	uint16_t max_desc;
 	uint32_t size;
 	int i;
 
-	RTE_SET_USED(vchan);
 	RTE_SET_USED(conf_sz);
 
 	if (dpivf->flag & CNXK_DPI_VCHAN_CONFIG)
@@ -360,18 +358,17 @@ cnxk_dmadev_copy(void *dev_private, uint16_t vchan, rte_iova_t src, rte_iova_t d
 		 uint64_t flags)
 {
 	struct cnxk_dpi_vf_s *dpivf = dev_private;
-	union dpi_instr_hdr_s *header = &dpivf->conf.hdr;
+	struct cnxk_dpi_conf *dpi_conf = &dpivf->conf[vchan];
+	union dpi_instr_hdr_s *header = &dpi_conf->hdr;
 	struct cnxk_dpi_compl_s *comp_ptr;
 	uint64_t cmd[DPI_MAX_CMD_SIZE];
 	rte_iova_t fptr, lptr;
 	int num_words = 0;
 	int rc;
 
-	RTE_SET_USED(vchan);
-
-	comp_ptr = dpivf->conf.c_desc.compl_ptr[dpivf->conf.c_desc.tail];
+	comp_ptr = dpi_conf->c_desc.compl_ptr[dpi_conf->c_desc.tail];
 	header->cn9k.ptr = (uint64_t)comp_ptr;
-	STRM_INC(dpivf->conf.c_desc, tail);
+	STRM_INC(dpi_conf->c_desc, tail);
 
 	header->cn9k.nfst = 1;
 	header->cn9k.nlst = 1;
@@ -400,7 +397,7 @@ cnxk_dmadev_copy(void *dev_private, uint16_t vchan, rte_iova_t src, rte_iova_t d
 
 	rc = __dpi_queue_write(&dpivf->rdpi, cmd, num_words);
 	if (unlikely(rc)) {
-		STRM_DEC(dpivf->conf.c_desc, tail);
+		STRM_DEC(dpi_conf->c_desc, tail);
 		return rc;
 	}
 
@@ -421,18 +418,17 @@ cnxk_dmadev_copy_sg(void *dev_private, uint16_t vchan, const struct rte_dma_sge
 		    const struct rte_dma_sge *dst, uint16_t nb_src, uint16_t nb_dst, uint64_t flags)
 {
 	struct cnxk_dpi_vf_s *dpivf = dev_private;
-	union dpi_instr_hdr_s *header = &dpivf->conf.hdr;
+	struct cnxk_dpi_conf *dpi_conf = &dpivf->conf[vchan];
+	union dpi_instr_hdr_s *header = &dpi_conf->hdr;
 	const struct rte_dma_sge *fptr, *lptr;
 	struct cnxk_dpi_compl_s *comp_ptr;
 	uint64_t cmd[DPI_MAX_CMD_SIZE];
 	int num_words = 0;
 	int i, rc;
 
-	RTE_SET_USED(vchan);
-
-	comp_ptr = dpivf->conf.c_desc.compl_ptr[dpivf->conf.c_desc.tail];
+	comp_ptr = dpi_conf->c_desc.compl_ptr[dpi_conf->c_desc.tail];
 	header->cn9k.ptr = (uint64_t)comp_ptr;
-	STRM_INC(dpivf->conf.c_desc, tail);
+	STRM_INC(dpi_conf->c_desc, tail);
 
 	/*
 	 * For inbound case, src pointers are last pointers.
@@ -468,7 +464,7 @@ cnxk_dmadev_copy_sg(void *dev_private, uint16_t vchan, const struct rte_dma_sge
 
 	rc = __dpi_queue_write(&dpivf->rdpi, cmd, num_words);
 	if (unlikely(rc)) {
-		STRM_DEC(dpivf->conf.c_desc, tail);
+		STRM_DEC(dpi_conf->c_desc, tail);
 		return rc;
 	}
 
@@ -489,18 +485,17 @@ cn10k_dmadev_copy(void *dev_private, uint16_t vchan, rte_iova_t src, rte_iova_t
 		  uint32_t length, uint64_t flags)
 {
 	struct cnxk_dpi_vf_s *dpivf = dev_private;
-	union dpi_instr_hdr_s *header = &dpivf->conf.hdr;
+	struct cnxk_dpi_conf *dpi_conf = &dpivf->conf[vchan];
+	union dpi_instr_hdr_s *header = &dpi_conf->hdr;
 	struct cnxk_dpi_compl_s *comp_ptr;
 	uint64_t cmd[DPI_MAX_CMD_SIZE];
 	rte_iova_t fptr, lptr;
 	int num_words = 0;
 	int rc;
 
-	RTE_SET_USED(vchan);
-
-	comp_ptr = dpivf->conf.c_desc.compl_ptr[dpivf->conf.c_desc.tail];
+	comp_ptr = dpi_conf->c_desc.compl_ptr[dpi_conf->c_desc.tail];
 	header->cn10k.ptr = (uint64_t)comp_ptr;
-	STRM_INC(dpivf->conf.c_desc, tail);
+	STRM_INC(dpi_conf->c_desc, tail);
 
 	header->cn10k.nfst = 1;
 	header->cn10k.nlst = 1;
@@ -520,7 +515,7 @@ cn10k_dmadev_copy(void *dev_private, uint16_t vchan, rte_iova_t src, rte_iova_t
 
 	rc = __dpi_queue_write(&dpivf->rdpi, cmd, num_words);
 	if (unlikely(rc)) {
-		STRM_DEC(dpivf->conf.c_desc, tail);
+		STRM_DEC(dpi_conf->c_desc, tail);
 		return rc;
 	}
 
@@ -542,18 +537,17 @@ cn10k_dmadev_copy_sg(void *dev_private, uint16_t vchan, const struct rte_dma_sge
 		     uint64_t flags)
 {
 	struct cnxk_dpi_vf_s *dpivf = dev_private;
-	union dpi_instr_hdr_s *header = &dpivf->conf.hdr;
+	struct cnxk_dpi_conf *dpi_conf = &dpivf->conf[vchan];
+	union dpi_instr_hdr_s *header = &dpi_conf->hdr;
 	const struct rte_dma_sge *fptr, *lptr;
 	struct cnxk_dpi_compl_s *comp_ptr;
 	uint64_t cmd[DPI_MAX_CMD_SIZE];
 	int num_words = 0;
 	int i, rc;
 
-	RTE_SET_USED(vchan);
-
-	comp_ptr = dpivf->conf.c_desc.compl_ptr[dpivf->conf.c_desc.tail];
+	comp_ptr = dpi_conf->c_desc.compl_ptr[dpi_conf->c_desc.tail];
 	header->cn10k.ptr = (uint64_t)comp_ptr;
-	STRM_INC(dpivf->conf.c_desc, tail);
+	STRM_INC(dpi_conf->c_desc, tail);
 
 	header->cn10k.nfst = nb_src & DPI_MAX_POINTER;
 	header->cn10k.nlst = nb_dst & DPI_MAX_POINTER;
@@ -579,7 +573,7 @@ cn10k_dmadev_copy_sg(void *dev_private, uint16_t vchan, const struct rte_dma_sge
 
 	rc = __dpi_queue_write(&dpivf->rdpi, cmd, num_words);
 	if (unlikely(rc)) {
-		STRM_DEC(dpivf->conf.c_desc, tail);
+		STRM_DEC(dpi_conf->c_desc, tail);
 		return rc;
 	}
 
@@ -600,12 +594,11 @@ cnxk_dmadev_completed(void *dev_private, uint16_t vchan, const uint16_t nb_cpls,
 		      bool *has_error)
 {
 	struct cnxk_dpi_vf_s *dpivf = dev_private;
-	struct cnxk_dpi_cdesc_data_s *c_desc = &dpivf->conf.c_desc;
+	struct cnxk_dpi_conf *dpi_conf = &dpivf->conf[vchan];
+	struct cnxk_dpi_cdesc_data_s *c_desc = &dpi_conf->c_desc;
 	struct cnxk_dpi_compl_s *comp_ptr;
 	int cnt;
 
-	RTE_SET_USED(vchan);
-
 	for (cnt = 0; cnt < nb_cpls; cnt++) {
 		comp_ptr = c_desc->compl_ptr[c_desc->head];
 
@@ -633,11 +626,11 @@ cnxk_dmadev_completed_status(void *dev_private, uint16_t vchan, const uint16_t n
 			     uint16_t *last_idx, enum rte_dma_status_code *status)
 {
 	struct cnxk_dpi_vf_s *dpivf = dev_private;
-	struct cnxk_dpi_cdesc_data_s *c_desc = &dpivf->conf.c_desc;
+	struct cnxk_dpi_conf *dpi_conf = &dpivf->conf[vchan];
+	struct cnxk_dpi_cdesc_data_s *c_desc = &dpi_conf->c_desc;
 	struct cnxk_dpi_compl_s *comp_ptr;
 	int cnt;
 
-	RTE_SET_USED(vchan);
 	RTE_SET_USED(last_idx);
 
 	for (cnt = 0; cnt < nb_cpls; cnt++) {
@@ -663,11 +656,10 @@ static uint16_t
 cnxk_damdev_burst_capacity(const void *dev_private, uint16_t vchan)
 {
 	const struct cnxk_dpi_vf_s *dpivf = (const struct cnxk_dpi_vf_s *)dev_private;
+	const struct cnxk_dpi_conf *dpi_conf = &dpivf->conf[vchan];
 	uint16_t burst_cap;
 
-	RTE_SET_USED(vchan);
-
-	burst_cap = dpivf->conf.c_desc.max_cnt -
+	burst_cap = dpi_conf->c_desc.max_cnt -
 		    ((dpivf->stats.submitted - dpivf->stats.completed) + dpivf->pending) + 1;
 
 	return burst_cap;
diff --git a/drivers/dma/cnxk/cnxk_dmadev.h b/drivers/dma/cnxk/cnxk_dmadev.h
index 9563295af0..4693960a19 100644
--- a/drivers/dma/cnxk/cnxk_dmadev.h
+++ b/drivers/dma/cnxk/cnxk_dmadev.h
@@ -6,10 +6,11 @@
 
 #include <roc_api.h>
 
-#define DPI_MAX_POINTER	 15
-#define STRM_INC(s, var) ((s).var = ((s).var + 1) & (s).max_cnt)
-#define STRM_DEC(s, var) ((s).var = ((s).var - 1) == -1 ? (s).max_cnt : ((s).var - 1))
-#define DPI_MAX_DESC	 1024
+#define DPI_MAX_POINTER	     15
+#define STRM_INC(s, var)     ((s).var = ((s).var + 1) & (s).max_cnt)
+#define STRM_DEC(s, var)     ((s).var = ((s).var - 1) == -1 ? (s).max_cnt : ((s).var - 1))
+#define DPI_MAX_DESC	     1024
+#define MAX_VCHANS_PER_QUEUE 4
 
 /* Set Completion data to 0xFF when request submitted,
  * upon successful request completion engine reset to completion status
@@ -39,7 +40,7 @@ struct cnxk_dpi_conf {
 
 struct cnxk_dpi_vf_s {
 	struct roc_dpi rdpi;
-	struct cnxk_dpi_conf conf;
+	struct cnxk_dpi_conf conf[MAX_VCHANS_PER_QUEUE];
 	struct rte_dma_stats stats;
 	uint16_t pending;
 	uint16_t pnum_words;
-- 
2.25.1


^ permalink raw reply	[flat|nested] 46+ messages in thread

* [PATCH v3 6/8] dma/cnxk: vchan support enhancement
  2023-08-18  9:01   ` [PATCH v3 1/8] common/cnxk: use unique name for DPI memzone Amit Prakash Shukla
                       ` (3 preceding siblings ...)
  2023-08-18  9:01     ` [PATCH v3 5/8] dma/cnxk: increase vchan per queue to max 4 Amit Prakash Shukla
@ 2023-08-18  9:01     ` Amit Prakash Shukla
  2023-08-18  9:01     ` [PATCH v3 7/8] dma/cnxk: add completion ring tail wrap check Amit Prakash Shukla
                       ` (3 subsequent siblings)
  8 siblings, 0 replies; 46+ messages in thread
From: Amit Prakash Shukla @ 2023-08-18  9:01 UTC (permalink / raw)
  To: Vamsi Attunuru; +Cc: dev, jerinj, Amit Prakash Shukla

Code changes to realign dpi private structure based on vchan.
Changeset also resets DMA dev stats while starting dma device.

Signed-off-by: Amit Prakash Shukla <amitprakashs@marvell.com>
---
v2:
- Fix for bugs observed in v1.
- Squashed few commits.

v3:
- Resolved review suggestions.
- Code improvement.

 drivers/dma/cnxk/cnxk_dmadev.c | 210 ++++++++++++++++++++++++---------
 drivers/dma/cnxk/cnxk_dmadev.h |  18 +--
 2 files changed, 165 insertions(+), 63 deletions(-)

diff --git a/drivers/dma/cnxk/cnxk_dmadev.c b/drivers/dma/cnxk/cnxk_dmadev.c
index 7d83b70e8b..9fb3bb264a 100644
--- a/drivers/dma/cnxk/cnxk_dmadev.c
+++ b/drivers/dma/cnxk/cnxk_dmadev.c
@@ -16,35 +16,79 @@
 
 #include <cnxk_dmadev.h>
 
+static int cnxk_stats_reset(struct rte_dma_dev *dev, uint16_t vchan);
+
 static int
 cnxk_dmadev_info_get(const struct rte_dma_dev *dev, struct rte_dma_info *dev_info, uint32_t size)
 {
-	RTE_SET_USED(dev);
+	struct cnxk_dpi_vf_s *dpivf = dev->fp_obj->dev_private;
 	RTE_SET_USED(size);
 
 	dev_info->max_vchans = MAX_VCHANS_PER_QUEUE;
-	dev_info->nb_vchans = MAX_VCHANS_PER_QUEUE;
+	dev_info->nb_vchans = dpivf->num_vchans;
 	dev_info->dev_capa = RTE_DMA_CAPA_MEM_TO_MEM | RTE_DMA_CAPA_MEM_TO_DEV |
 			     RTE_DMA_CAPA_DEV_TO_MEM | RTE_DMA_CAPA_DEV_TO_DEV |
 			     RTE_DMA_CAPA_OPS_COPY | RTE_DMA_CAPA_OPS_COPY_SG;
 	dev_info->max_desc = DPI_MAX_DESC;
-	dev_info->min_desc = 2;
+	dev_info->min_desc = DPI_MIN_DESC;
 	dev_info->max_sges = DPI_MAX_POINTER;
 
 	return 0;
 }
 
+static int
+cnxk_dmadev_vchan_free(struct cnxk_dpi_vf_s *dpivf, uint16_t vchan)
+{
+	struct cnxk_dpi_conf *dpi_conf;
+	uint16_t num_vchans;
+	uint16_t max_desc;
+	int i, j;
+
+	if (vchan == RTE_DMA_ALL_VCHAN) {
+		num_vchans = dpivf->num_vchans;
+		i = 0;
+	} else {
+		if (vchan >= MAX_VCHANS_PER_QUEUE)
+			return -EINVAL;
+
+		num_vchans = vchan + 1;
+		i = vchan;
+	}
+
+	for (; i < num_vchans; i++) {
+		dpi_conf = &dpivf->conf[i];
+		max_desc = dpi_conf->c_desc.max_cnt;
+		if (dpi_conf->c_desc.compl_ptr) {
+			for (j = 0; j < max_desc; j++)
+				rte_free(dpi_conf->c_desc.compl_ptr[j]);
+		}
+
+		rte_free(dpi_conf->c_desc.compl_ptr);
+		dpi_conf->c_desc.compl_ptr = NULL;
+	}
+
+	return 0;
+}
+
 static int
 cnxk_dmadev_configure(struct rte_dma_dev *dev, const struct rte_dma_conf *conf, uint32_t conf_sz)
 {
 	struct cnxk_dpi_vf_s *dpivf = NULL;
 	int rc = 0;
 
-	RTE_SET_USED(conf);
 	RTE_SET_USED(conf_sz);
 
 	dpivf = dev->fp_obj->dev_private;
 
+	/* Accept only number of vchans as config from application. */
+	if (!(dpivf->flag & CNXK_DPI_DEV_START)) {
+		/* After config function, vchan setup function has to be called.
+		 * Free up vchan memory if any, before configuring num_vchans.
+		 */
+		cnxk_dmadev_vchan_free(dpivf, RTE_DMA_ALL_VCHAN);
+		dpivf->num_vchans = conf->nb_vchans;
+	}
+
 	if (dpivf->flag & CNXK_DPI_DEV_CONFIG)
 		return rc;
 
@@ -73,7 +117,7 @@ cnxk_dmadev_vchan_setup(struct rte_dma_dev *dev, uint16_t vchan,
 
 	RTE_SET_USED(conf_sz);
 
-	if (dpivf->flag & CNXK_DPI_VCHAN_CONFIG)
+	if (dpivf->flag & CNXK_DPI_DEV_START)
 		return 0;
 
 	header->cn9k.pt = DPI_HDR_PT_ZBW_CA;
@@ -112,6 +156,9 @@ cnxk_dmadev_vchan_setup(struct rte_dma_dev *dev, uint16_t vchan,
 		header->cn9k.pvfe = 0;
 	};
 
+	/* Free up descriptor memory before allocating. */
+	cnxk_dmadev_vchan_free(dpivf, vchan);
+
 	max_desc = conf->nb_desc;
 	if (!rte_is_power_of_2(max_desc))
 		max_desc = rte_align32pow2(max_desc);
@@ -130,15 +177,15 @@ cnxk_dmadev_vchan_setup(struct rte_dma_dev *dev, uint16_t vchan,
 	for (i = 0; i < max_desc; i++) {
 		dpi_conf->c_desc.compl_ptr[i] =
 			rte_zmalloc(NULL, sizeof(struct cnxk_dpi_compl_s), 0);
+		if (!dpi_conf->c_desc.compl_ptr[i]) {
+			plt_err("Failed to allocate for descriptor memory");
+			return -ENOMEM;
+		}
+
 		dpi_conf->c_desc.compl_ptr[i]->cdata = DPI_REQ_CDATA;
 	}
 
 	dpi_conf->c_desc.max_cnt = (max_desc - 1);
-	dpi_conf->c_desc.head = 0;
-	dpi_conf->c_desc.tail = 0;
-	dpivf->pnum_words = 0;
-	dpivf->pending = 0;
-	dpivf->flag |= CNXK_DPI_VCHAN_CONFIG;
 
 	return 0;
 }
@@ -156,7 +203,7 @@ cn10k_dmadev_vchan_setup(struct rte_dma_dev *dev, uint16_t vchan,
 
 	RTE_SET_USED(conf_sz);
 
-	if (dpivf->flag & CNXK_DPI_VCHAN_CONFIG)
+	if (dpivf->flag & CNXK_DPI_DEV_START)
 		return 0;
 
 	header->cn10k.pt = DPI_HDR_PT_ZBW_CA;
@@ -195,6 +242,9 @@ cn10k_dmadev_vchan_setup(struct rte_dma_dev *dev, uint16_t vchan,
 		header->cn10k.pvfe = 0;
 	};
 
+	/* Free up descriptor memory before allocating. */
+	cnxk_dmadev_vchan_free(dpivf, vchan);
+
 	max_desc = conf->nb_desc;
 	if (!rte_is_power_of_2(max_desc))
 		max_desc = rte_align32pow2(max_desc);
@@ -213,15 +263,14 @@ cn10k_dmadev_vchan_setup(struct rte_dma_dev *dev, uint16_t vchan,
 	for (i = 0; i < max_desc; i++) {
 		dpi_conf->c_desc.compl_ptr[i] =
 			rte_zmalloc(NULL, sizeof(struct cnxk_dpi_compl_s), 0);
+		if (!dpi_conf->c_desc.compl_ptr[i]) {
+			plt_err("Failed to allocate for descriptor memory");
+			return -ENOMEM;
+		}
 		dpi_conf->c_desc.compl_ptr[i]->cdata = DPI_REQ_CDATA;
 	}
 
 	dpi_conf->c_desc.max_cnt = (max_desc - 1);
-	dpi_conf->c_desc.head = 0;
-	dpi_conf->c_desc.tail = 0;
-	dpivf->pnum_words = 0;
-	dpivf->pending = 0;
-	dpivf->flag |= CNXK_DPI_VCHAN_CONFIG;
 
 	return 0;
 }
@@ -230,13 +279,27 @@ static int
 cnxk_dmadev_start(struct rte_dma_dev *dev)
 {
 	struct cnxk_dpi_vf_s *dpivf = dev->fp_obj->dev_private;
+	struct cnxk_dpi_conf *dpi_conf;
+	int i, j;
 
 	if (dpivf->flag & CNXK_DPI_DEV_START)
 		return 0;
 
-	dpivf->desc_idx = 0;
-	dpivf->pending = 0;
-	dpivf->pnum_words = 0;
+	for (i = 0; i < dpivf->num_vchans; i++) {
+		dpi_conf = &dpivf->conf[i];
+		dpi_conf->c_desc.head = 0;
+		dpi_conf->c_desc.tail = 0;
+		dpi_conf->pnum_words = 0;
+		dpi_conf->pending = 0;
+		dpi_conf->desc_idx = 0;
+		for (j = 0; j < dpi_conf->c_desc.max_cnt; j++) {
+			if (dpi_conf->c_desc.compl_ptr[j])
+				dpi_conf->c_desc.compl_ptr[j]->cdata = DPI_REQ_CDATA;
+		}
+
+		cnxk_stats_reset(dev, i);
+	}
+
 	roc_dpi_enable(&dpivf->rdpi);
 
 	dpivf->flag |= CNXK_DPI_DEV_START;
@@ -250,7 +313,6 @@ cnxk_dmadev_stop(struct rte_dma_dev *dev)
 	struct cnxk_dpi_vf_s *dpivf = dev->fp_obj->dev_private;
 
 	roc_dpi_disable(&dpivf->rdpi);
-
 	dpivf->flag &= ~CNXK_DPI_DEV_START;
 
 	return 0;
@@ -262,8 +324,10 @@ cnxk_dmadev_close(struct rte_dma_dev *dev)
 	struct cnxk_dpi_vf_s *dpivf = dev->fp_obj->dev_private;
 
 	roc_dpi_disable(&dpivf->rdpi);
+	cnxk_dmadev_vchan_free(dpivf, RTE_DMA_ALL_VCHAN);
 	roc_dpi_dev_fini(&dpivf->rdpi);
 
+	/* Clear all flags as we close the device. */
 	dpivf->flag = 0;
 
 	return 0;
@@ -404,13 +468,13 @@ cnxk_dmadev_copy(void *dev_private, uint16_t vchan, rte_iova_t src, rte_iova_t d
 	rte_wmb();
 	if (flags & RTE_DMA_OP_FLAG_SUBMIT) {
 		plt_write64(num_words, dpivf->rdpi.rbase + DPI_VDMA_DBELL);
-		dpivf->stats.submitted++;
+		dpi_conf->stats.submitted++;
 	} else {
-		dpivf->pnum_words += num_words;
-		dpivf->pending++;
+		dpi_conf->pnum_words += num_words;
+		dpi_conf->pending++;
 	}
 
-	return (dpivf->desc_idx++);
+	return (dpi_conf->desc_idx++);
 }
 
 static int
@@ -471,13 +535,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);
-		dpivf->stats.submitted += nb_src;
+		dpi_conf->stats.submitted += nb_src;
 	} else {
-		dpivf->pnum_words += num_words;
-		dpivf->pending++;
+		dpi_conf->pnum_words += num_words;
+		dpi_conf->pending++;
 	}
 
-	return (dpivf->desc_idx++);
+	return (dpi_conf->desc_idx++);
 }
 
 static int
@@ -522,13 +586,13 @@ cn10k_dmadev_copy(void *dev_private, uint16_t vchan, rte_iova_t src, rte_iova_t
 	if (flags & RTE_DMA_OP_FLAG_SUBMIT) {
 		rte_wmb();
 		plt_write64(num_words, dpivf->rdpi.rbase + DPI_VDMA_DBELL);
-		dpivf->stats.submitted++;
+		dpi_conf->stats.submitted++;
 	} else {
-		dpivf->pnum_words += num_words;
-		dpivf->pending++;
+		dpi_conf->pnum_words += num_words;
+		dpi_conf->pending++;
 	}
 
-	return dpivf->desc_idx++;
+	return dpi_conf->desc_idx++;
 }
 
 static int
@@ -580,13 +644,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);
-		dpivf->stats.submitted += nb_src;
+		dpi_conf->stats.submitted += nb_src;
 	} else {
-		dpivf->pnum_words += num_words;
-		dpivf->pending++;
+		dpi_conf->pnum_words += num_words;
+		dpi_conf->pending++;
 	}
 
-	return (dpivf->desc_idx++);
+	return (dpi_conf->desc_idx++);
 }
 
 static uint16_t
@@ -606,7 +670,7 @@ cnxk_dmadev_completed(void *dev_private, uint16_t vchan, const uint16_t nb_cpls,
 			if (comp_ptr->cdata == DPI_REQ_CDATA)
 				break;
 			*has_error = 1;
-			dpivf->stats.errors++;
+			dpi_conf->stats.errors++;
 			STRM_INC(*c_desc, head);
 			break;
 		}
@@ -615,8 +679,8 @@ cnxk_dmadev_completed(void *dev_private, uint16_t vchan, const uint16_t nb_cpls,
 		STRM_INC(*c_desc, head);
 	}
 
-	dpivf->stats.completed += cnt;
-	*last_idx = dpivf->stats.completed - 1;
+	dpi_conf->stats.completed += cnt;
+	*last_idx = dpi_conf->stats.completed - 1;
 
 	return cnt;
 }
@@ -640,14 +704,14 @@ cnxk_dmadev_completed_status(void *dev_private, uint16_t vchan, const uint16_t n
 			if (status[cnt] == DPI_REQ_CDATA)
 				break;
 
-			dpivf->stats.errors++;
+			dpi_conf->stats.errors++;
 		}
 		comp_ptr->cdata = DPI_REQ_CDATA;
 		STRM_INC(*c_desc, head);
 	}
 
-	dpivf->stats.completed += cnt;
-	*last_idx = dpivf->stats.completed - 1;
+	dpi_conf->stats.completed += cnt;
+	*last_idx = dpi_conf->stats.completed - 1;
 
 	return cnt;
 }
@@ -660,26 +724,28 @@ cnxk_damdev_burst_capacity(const void *dev_private, uint16_t vchan)
 	uint16_t burst_cap;
 
 	burst_cap = dpi_conf->c_desc.max_cnt -
-		    ((dpivf->stats.submitted - dpivf->stats.completed) + dpivf->pending) + 1;
+		    ((dpi_conf->stats.submitted - dpi_conf->stats.completed) + dpi_conf->pending) +
+		    1;
 
 	return burst_cap;
 }
 
 static int
-cnxk_dmadev_submit(void *dev_private, uint16_t vchan __rte_unused)
+cnxk_dmadev_submit(void *dev_private, uint16_t vchan)
 {
 	struct cnxk_dpi_vf_s *dpivf = dev_private;
-	uint32_t num_words = dpivf->pnum_words;
+	struct cnxk_dpi_conf *dpi_conf = &dpivf->conf[vchan];
+	uint32_t num_words = dpi_conf->pnum_words;
 
-	if (!dpivf->pnum_words)
+	if (!dpi_conf->pnum_words)
 		return 0;
 
 	rte_wmb();
 	plt_write64(num_words, dpivf->rdpi.rbase + DPI_VDMA_DBELL);
 
-	dpivf->stats.submitted += dpivf->pending;
-	dpivf->pnum_words = 0;
-	dpivf->pending = 0;
+	dpi_conf->stats.submitted += dpi_conf->pending;
+	dpi_conf->pnum_words = 0;
+	dpi_conf->pending = 0;
 
 	return 0;
 }
@@ -689,25 +755,59 @@ cnxk_stats_get(const struct rte_dma_dev *dev, uint16_t vchan, struct rte_dma_sta
 	       uint32_t size)
 {
 	struct cnxk_dpi_vf_s *dpivf = dev->fp_obj->dev_private;
-	struct rte_dma_stats *stats = &dpivf->stats;
-
-	RTE_SET_USED(vchan);
+	struct cnxk_dpi_conf *dpi_conf;
+	int i;
 
 	if (size < sizeof(rte_stats))
 		return -EINVAL;
 	if (rte_stats == NULL)
 		return -EINVAL;
 
-	*rte_stats = *stats;
+	/* Stats of all vchans requested. */
+	if (vchan == RTE_DMA_ALL_VCHAN) {
+		for (i = 0; i < dpivf->num_vchans; i++) {
+			dpi_conf = &dpivf->conf[i];
+			rte_stats->submitted += dpi_conf->stats.submitted;
+			rte_stats->completed += dpi_conf->stats.completed;
+			rte_stats->errors += dpi_conf->stats.errors;
+		}
+
+		goto done;
+	}
+
+	if (vchan >= MAX_VCHANS_PER_QUEUE)
+		return -EINVAL;
+
+	dpi_conf = &dpivf->conf[vchan];
+	*rte_stats = dpi_conf->stats;
+
+done:
 	return 0;
 }
 
 static int
-cnxk_stats_reset(struct rte_dma_dev *dev, uint16_t vchan __rte_unused)
+cnxk_stats_reset(struct rte_dma_dev *dev, uint16_t vchan)
 {
 	struct cnxk_dpi_vf_s *dpivf = dev->fp_obj->dev_private;
+	struct cnxk_dpi_conf *dpi_conf;
+	int i;
+
+	/* clear stats of all vchans. */
+	if (vchan == RTE_DMA_ALL_VCHAN) {
+		for (i = 0; i < dpivf->num_vchans; i++) {
+			dpi_conf = &dpivf->conf[i];
+			dpi_conf->stats = (struct rte_dma_stats){0};
+		}
+
+		return 0;
+	}
+
+	if (vchan >= MAX_VCHANS_PER_QUEUE)
+		return -EINVAL;
+
+	dpi_conf = &dpivf->conf[vchan];
+	dpi_conf->stats = (struct rte_dma_stats){0};
 
-	dpivf->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 4693960a19..f375143b16 100644
--- a/drivers/dma/cnxk/cnxk_dmadev.h
+++ b/drivers/dma/cnxk/cnxk_dmadev.h
@@ -10,6 +10,7 @@
 #define STRM_INC(s, var)     ((s).var = ((s).var + 1) & (s).max_cnt)
 #define STRM_DEC(s, var)     ((s).var = ((s).var - 1) == -1 ? (s).max_cnt : ((s).var - 1))
 #define DPI_MAX_DESC	     1024
+#define DPI_MIN_DESC	     2
 #define MAX_VCHANS_PER_QUEUE 4
 
 /* Set Completion data to 0xFF when request submitted,
@@ -17,9 +18,8 @@
  */
 #define DPI_REQ_CDATA 0xFF
 
-#define CNXK_DPI_DEV_CONFIG   (1ULL << 0)
-#define CNXK_DPI_VCHAN_CONFIG (1ULL << 1)
-#define CNXK_DPI_DEV_START    (1ULL << 2)
+#define CNXK_DPI_DEV_CONFIG (1ULL << 0)
+#define CNXK_DPI_DEV_START  (1ULL << 1)
 
 struct cnxk_dpi_compl_s {
 	uint64_t cdata;
@@ -36,16 +36,18 @@ struct cnxk_dpi_cdesc_data_s {
 struct cnxk_dpi_conf {
 	union dpi_instr_hdr_s hdr;
 	struct cnxk_dpi_cdesc_data_s c_desc;
+	uint16_t pnum_words;
+	uint16_t pending;
+	uint16_t desc_idx;
+	uint16_t pad0;
+	struct rte_dma_stats stats;
 };
 
 struct cnxk_dpi_vf_s {
 	struct roc_dpi rdpi;
 	struct cnxk_dpi_conf conf[MAX_VCHANS_PER_QUEUE];
-	struct rte_dma_stats stats;
-	uint16_t pending;
-	uint16_t pnum_words;
-	uint16_t desc_idx;
+	uint16_t num_vchans;
 	uint16_t flag;
-};
+} __plt_cache_aligned;
 
 #endif
-- 
2.25.1


^ permalink raw reply	[flat|nested] 46+ messages in thread

* [PATCH v3 7/8] dma/cnxk: add completion ring tail wrap check
  2023-08-18  9:01   ` [PATCH v3 1/8] common/cnxk: use unique name for DPI memzone Amit Prakash Shukla
                       ` (4 preceding siblings ...)
  2023-08-18  9:01     ` [PATCH v3 6/8] dma/cnxk: vchan support enhancement Amit Prakash Shukla
@ 2023-08-18  9:01     ` Amit Prakash Shukla
  2023-08-18  9:01     ` [PATCH v3 8/8] dma/cnxk: fix last index return value Amit Prakash Shukla
                       ` (2 subsequent siblings)
  8 siblings, 0 replies; 46+ messages in thread
From: Amit Prakash Shukla @ 2023-08-18  9:01 UTC (permalink / raw)
  To: Vamsi Attunuru; +Cc: dev, jerinj

From: Vamsi Attunuru <vattunuru@marvell.com>

Adds a check to avoid tail wrap when completion desc ring
is full. Also patch increase max desc size to 2048.

Signed-off-by: Vamsi Attunuru <vattunuru@marvell.com>
---
v2:
- Fix for bugs observed in v1.
- Squashed few commits.

v3:
- Resolved review suggestions.
- Code improvement.

 drivers/dma/cnxk/cnxk_dmadev.c | 22 ++++++++++++++++++++--
 drivers/dma/cnxk/cnxk_dmadev.h |  2 +-
 2 files changed, 21 insertions(+), 3 deletions(-)

diff --git a/drivers/dma/cnxk/cnxk_dmadev.c b/drivers/dma/cnxk/cnxk_dmadev.c
index 9fb3bb264a..288606bb3d 100644
--- a/drivers/dma/cnxk/cnxk_dmadev.c
+++ b/drivers/dma/cnxk/cnxk_dmadev.c
@@ -434,6 +434,11 @@ cnxk_dmadev_copy(void *dev_private, uint16_t vchan, rte_iova_t src, rte_iova_t d
 	header->cn9k.ptr = (uint64_t)comp_ptr;
 	STRM_INC(dpi_conf->c_desc, tail);
 
+	if (unlikely(dpi_conf->c_desc.tail == dpi_conf->c_desc.head)) {
+		STRM_DEC(dpi_conf->c_desc, tail);
+		return -ENOSPC;
+	}
+
 	header->cn9k.nfst = 1;
 	header->cn9k.nlst = 1;
 
@@ -494,6 +499,11 @@ cnxk_dmadev_copy_sg(void *dev_private, uint16_t vchan, const struct rte_dma_sge
 	header->cn9k.ptr = (uint64_t)comp_ptr;
 	STRM_INC(dpi_conf->c_desc, tail);
 
+	if (unlikely(dpi_conf->c_desc.tail == dpi_conf->c_desc.head)) {
+		STRM_DEC(dpi_conf->c_desc, tail);
+		return -ENOSPC;
+	}
+
 	/*
 	 * For inbound case, src pointers are last pointers.
 	 * For all other cases, src pointers are first pointers.
@@ -561,6 +571,11 @@ cn10k_dmadev_copy(void *dev_private, uint16_t vchan, rte_iova_t src, rte_iova_t
 	header->cn10k.ptr = (uint64_t)comp_ptr;
 	STRM_INC(dpi_conf->c_desc, tail);
 
+	if (unlikely(dpi_conf->c_desc.tail == dpi_conf->c_desc.head)) {
+		STRM_DEC(dpi_conf->c_desc, tail);
+		return -ENOSPC;
+	}
+
 	header->cn10k.nfst = 1;
 	header->cn10k.nlst = 1;
 
@@ -613,6 +628,11 @@ cn10k_dmadev_copy_sg(void *dev_private, uint16_t vchan, const struct rte_dma_sge
 	header->cn10k.ptr = (uint64_t)comp_ptr;
 	STRM_INC(dpi_conf->c_desc, tail);
 
+	if (unlikely(dpi_conf->c_desc.tail == dpi_conf->c_desc.head)) {
+		STRM_DEC(dpi_conf->c_desc, tail);
+		return -ENOSPC;
+	}
+
 	header->cn10k.nfst = nb_src & DPI_MAX_POINTER;
 	header->cn10k.nlst = nb_dst & DPI_MAX_POINTER;
 	fptr = &src[0];
@@ -695,8 +715,6 @@ cnxk_dmadev_completed_status(void *dev_private, uint16_t vchan, const uint16_t n
 	struct cnxk_dpi_compl_s *comp_ptr;
 	int cnt;
 
-	RTE_SET_USED(last_idx);
-
 	for (cnt = 0; cnt < nb_cpls; cnt++) {
 		comp_ptr = c_desc->compl_ptr[c_desc->head];
 		status[cnt] = comp_ptr->cdata;
diff --git a/drivers/dma/cnxk/cnxk_dmadev.h b/drivers/dma/cnxk/cnxk_dmadev.h
index f375143b16..9c6c898d23 100644
--- a/drivers/dma/cnxk/cnxk_dmadev.h
+++ b/drivers/dma/cnxk/cnxk_dmadev.h
@@ -9,7 +9,7 @@
 #define DPI_MAX_POINTER	     15
 #define STRM_INC(s, var)     ((s).var = ((s).var + 1) & (s).max_cnt)
 #define STRM_DEC(s, var)     ((s).var = ((s).var - 1) == -1 ? (s).max_cnt : ((s).var - 1))
-#define DPI_MAX_DESC	     1024
+#define DPI_MAX_DESC	     2048
 #define DPI_MIN_DESC	     2
 #define MAX_VCHANS_PER_QUEUE 4
 
-- 
2.25.1


^ permalink raw reply	[flat|nested] 46+ messages in thread

* [PATCH v3 8/8] dma/cnxk: fix last index return value
  2023-08-18  9:01   ` [PATCH v3 1/8] common/cnxk: use unique name for DPI memzone Amit Prakash Shukla
                       ` (5 preceding siblings ...)
  2023-08-18  9:01     ` [PATCH v3 7/8] dma/cnxk: add completion ring tail wrap check Amit Prakash Shukla
@ 2023-08-18  9:01     ` Amit Prakash Shukla
  2023-08-21 13:27     ` [PATCH v3 1/8] common/cnxk: use unique name for DPI memzone Jerin Jacob
  2023-08-21 17:49     ` [PATCH v4 " Amit Prakash Shukla
  8 siblings, 0 replies; 46+ messages in thread
From: Amit Prakash Shukla @ 2023-08-18  9:01 UTC (permalink / raw)
  To: Vamsi Attunuru; +Cc: dev, jerinj

From: Vamsi Attunuru <vattunuru@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 <vattunuru@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


^ permalink raw reply	[flat|nested] 46+ messages in thread

* Re: [PATCH v3 1/8] common/cnxk: use unique name for DPI memzone
  2023-08-18  9:01   ` [PATCH v3 1/8] common/cnxk: use unique name for DPI memzone Amit Prakash Shukla
                       ` (6 preceding siblings ...)
  2023-08-18  9:01     ` [PATCH v3 8/8] dma/cnxk: fix last index return value Amit Prakash Shukla
@ 2023-08-21 13:27     ` Jerin Jacob
  2023-08-21 17:49     ` [PATCH v4 " Amit Prakash Shukla
  8 siblings, 0 replies; 46+ messages in thread
From: Jerin Jacob @ 2023-08-21 13:27 UTC (permalink / raw)
  To: Amit Prakash Shukla
  Cc: Nithin Dabilpuram, Kiran Kumar K, Sunil Kumar Kori, Satha Rao,
	dev, jerinj, stable, Radha Mohan Chintakuntla

On Fri, Aug 18, 2023 at 2:32 PM Amit Prakash Shukla
<amitprakashs@marvell.com> wrote:
>
> roc_dpi was using vfid as part of name for memzone allocation.
> This led to memzone allocation failure in case of multiple
> physical functions. vfid is not unique by itself since multiple
> physical functions can have the same virtual function indices.
> So use complete DBDF as part of memzone name to make it unique.
>
> Fixes: b6e395692b6d ("common/cnxk: add DPI DMA support")
> Cc: stable@dpdk.org
>
> Signed-off-by: Radha Mohan Chintakuntla <radhac@marvell.com>

> ---
> v2:
> - Fix for bugs observed in v1.
> - Squashed few commits.
>
> v3:
> - Resolved review suggestions.
> - Code improvement.


Please fix below issues

Missing 'Fixes' tag:
        dma/cnxk: fix last index return value

Invalid patch(es) found - checked 8 patches
check-git-log failed

### [PATCH] common/cnxk: use unique name for DPI memzone

ERROR:NO_AUTHOR_SIGN_OFF: Missing Signed-off-by: line by nominal patch
author 'Amit Prakash Shukla <amitprakashs@marvell.com>'

total: 1 errors, 0 warnings, 13 lines checked

### [PATCH] dma/cnxk: add DMA devops for all models of cn10xxx

ERROR:NO_AUTHOR_SIGN_OFF: Missing Signed-off-by: line by nominal patch
author 'Amit Prakash Shukla <amitprakashs@marvell.com>'

total: 1 errors, 0 warnings, 9 lines checked

6/8 valid patches

^ permalink raw reply	[flat|nested] 46+ messages in thread

* [PATCH v4 1/8] common/cnxk: use unique name for DPI memzone
  2023-08-18  9:01   ` [PATCH v3 1/8] common/cnxk: use unique name for DPI memzone Amit Prakash Shukla
                       ` (7 preceding siblings ...)
  2023-08-21 13:27     ` [PATCH v3 1/8] common/cnxk: use unique name for DPI memzone Jerin Jacob
@ 2023-08-21 17:49     ` Amit Prakash Shukla
  2023-08-21 17:49       ` [PATCH v4 2/8] dma/cnxk: changes for dmadev driver Amit Prakash Shukla
                         ` (7 more replies)
  8 siblings, 8 replies; 46+ messages in thread
From: Amit Prakash Shukla @ 2023-08-21 17:49 UTC (permalink / raw)
  To: Nithin Dabilpuram, Kiran Kumar K, Sunil Kumar Kori, Satha Rao
  Cc: dev, jerinj, Amit Prakash Shukla, stable, Radha Mohan Chintakuntla

roc_dpi was using vfid as part of name for memzone allocation.
This led to memzone allocation failure in case of multiple
physical functions. vfid is not unique by itself since multiple
physical functions can have the same virtual function indices.
So use complete DBDF as part of memzone name to make it unique.

Fixes: b6e395692b6d ("common/cnxk: add DPI DMA support")
Cc: stable@dpdk.org

Signed-off-by: Radha Mohan Chintakuntla <radhac@marvell.com>
Signed-off-by: Amit Prakash Shukla <amitprakashs@marvell.com>
---
v2:
- Fix for bugs observed in v1.
- Squashed few commits.

v3:
- Resolved review suggestions.
- Code improvement.

v4:
- Resolved checkpatch warnings.

 drivers/common/cnxk/roc_dpi.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/drivers/common/cnxk/roc_dpi.c b/drivers/common/cnxk/roc_dpi.c
index 93c8318a3d..0e2f803077 100644
--- a/drivers/common/cnxk/roc_dpi.c
+++ b/drivers/common/cnxk/roc_dpi.c
@@ -81,10 +81,10 @@ roc_dpi_configure(struct roc_dpi *roc_dpi)
 		return rc;
 	}
 
-	snprintf(name, sizeof(name), "dpimem%d", roc_dpi->vfid);
+	snprintf(name, sizeof(name), "dpimem%d:%d:%d:%d", pci_dev->addr.domain, pci_dev->addr.bus,
+		 pci_dev->addr.devid, pci_dev->addr.function);
 	buflen = DPI_CMD_QUEUE_SIZE * DPI_CMD_QUEUE_BUFS;
-	dpi_mz = plt_memzone_reserve_aligned(name, buflen, 0,
-					     DPI_CMD_QUEUE_SIZE);
+	dpi_mz = plt_memzone_reserve_aligned(name, buflen, 0, DPI_CMD_QUEUE_SIZE);
 	if (dpi_mz == NULL) {
 		plt_err("dpi memzone reserve failed");
 		rc = -ENOMEM;
-- 
2.25.1


^ permalink raw reply	[flat|nested] 46+ messages in thread

* [PATCH v4 2/8] dma/cnxk: changes for dmadev driver
  2023-08-21 17:49     ` [PATCH v4 " Amit Prakash Shukla
@ 2023-08-21 17:49       ` Amit Prakash Shukla
  2023-08-21 17:49       ` [PATCH v4 3/8] dma/cnxk: add DMA devops for all models of cn10xxx Amit Prakash Shukla
                         ` (6 subsequent siblings)
  7 siblings, 0 replies; 46+ messages in thread
From: Amit Prakash Shukla @ 2023-08-21 17:49 UTC (permalink / raw)
  To: Vamsi Attunuru; +Cc: dev, jerinj, Amit Prakash Shukla, stable

Dmadev driver changes to align with dpdk spec.

Fixes: 681851b347ad ("dma/cnxk: support CN10K DMA engine")
Cc: stable@dpdk.org

Signed-off-by: Amit Prakash Shukla <amitprakashs@marvell.com>
---
v2:
- Fix for bugs observed in v1.
- Squashed few commits.

v3:
- Resolved review suggestions.
- Code improvement.

v4:
- Resolved checkpatch warnings.

 drivers/dma/cnxk/cnxk_dmadev.c | 464 ++++++++++++++++++++-------------
 drivers/dma/cnxk/cnxk_dmadev.h |  24 +-
 2 files changed, 294 insertions(+), 194 deletions(-)

diff --git a/drivers/dma/cnxk/cnxk_dmadev.c b/drivers/dma/cnxk/cnxk_dmadev.c
index a6f4a31e0e..a0152fc6df 100644
--- a/drivers/dma/cnxk/cnxk_dmadev.c
+++ b/drivers/dma/cnxk/cnxk_dmadev.c
@@ -7,68 +7,76 @@
 
 #include <bus_pci_driver.h>
 #include <rte_common.h>
+#include <rte_dmadev.h>
+#include <rte_dmadev_pmd.h>
 #include <rte_eal.h>
 #include <rte_lcore.h>
 #include <rte_mempool.h>
 #include <rte_pci.h>
-#include <rte_dmadev.h>
-#include <rte_dmadev_pmd.h>
 
-#include <roc_api.h>
 #include <cnxk_dmadev.h>
 
 static int
-cnxk_dmadev_info_get(const struct rte_dma_dev *dev,
-		     struct rte_dma_info *dev_info, uint32_t size)
+cnxk_dmadev_info_get(const struct rte_dma_dev *dev, struct rte_dma_info *dev_info, uint32_t size)
 {
 	RTE_SET_USED(dev);
 	RTE_SET_USED(size);
 
 	dev_info->max_vchans = 1;
 	dev_info->nb_vchans = 1;
-	dev_info->dev_capa = RTE_DMA_CAPA_MEM_TO_MEM |
-		RTE_DMA_CAPA_MEM_TO_DEV | RTE_DMA_CAPA_DEV_TO_MEM |
-		RTE_DMA_CAPA_DEV_TO_DEV | RTE_DMA_CAPA_OPS_COPY |
-		RTE_DMA_CAPA_OPS_COPY_SG;
+	dev_info->dev_capa = RTE_DMA_CAPA_MEM_TO_MEM | RTE_DMA_CAPA_MEM_TO_DEV |
+			     RTE_DMA_CAPA_DEV_TO_MEM | RTE_DMA_CAPA_DEV_TO_DEV |
+			     RTE_DMA_CAPA_OPS_COPY | RTE_DMA_CAPA_OPS_COPY_SG;
 	dev_info->max_desc = DPI_MAX_DESC;
-	dev_info->min_desc = 1;
+	dev_info->min_desc = 2;
 	dev_info->max_sges = DPI_MAX_POINTER;
 
 	return 0;
 }
 
 static int
-cnxk_dmadev_configure(struct rte_dma_dev *dev,
-		      const struct rte_dma_conf *conf, uint32_t conf_sz)
+cnxk_dmadev_configure(struct rte_dma_dev *dev, const struct rte_dma_conf *conf, uint32_t conf_sz)
 {
 	struct cnxk_dpi_vf_s *dpivf = NULL;
 	int rc = 0;
 
 	RTE_SET_USED(conf);
-	RTE_SET_USED(conf);
-	RTE_SET_USED(conf_sz);
 	RTE_SET_USED(conf_sz);
+
 	dpivf = dev->fp_obj->dev_private;
+
+	if (dpivf->flag & CNXK_DPI_DEV_CONFIG)
+		return rc;
+
 	rc = roc_dpi_configure(&dpivf->rdpi);
-	if (rc < 0)
+	if (rc < 0) {
 		plt_err("DMA configure failed err = %d", rc);
+		goto done;
+	}
 
+	dpivf->flag |= CNXK_DPI_DEV_CONFIG;
+
+done:
 	return rc;
 }
 
 static int
 cnxk_dmadev_vchan_setup(struct rte_dma_dev *dev, uint16_t vchan,
-			const struct rte_dma_vchan_conf *conf,
-			uint32_t conf_sz)
+			const struct rte_dma_vchan_conf *conf, uint32_t conf_sz)
 {
 	struct cnxk_dpi_vf_s *dpivf = dev->fp_obj->dev_private;
-	struct cnxk_dpi_compl_s *comp_data;
-	union dpi_instr_hdr_s *header = &dpivf->conf.hdr;
+	struct cnxk_dpi_conf *dpi_conf = &dpivf->conf;
+	union dpi_instr_hdr_s *header = &dpi_conf->hdr;
+	uint16_t max_desc;
+	uint32_t size;
 	int i;
 
 	RTE_SET_USED(vchan);
 	RTE_SET_USED(conf_sz);
 
+	if (dpivf->flag & CNXK_DPI_VCHAN_CONFIG)
+		return 0;
+
 	header->cn9k.pt = DPI_HDR_PT_ZBW_CA;
 
 	switch (conf->direction) {
@@ -96,35 +104,54 @@ cnxk_dmadev_vchan_setup(struct rte_dma_dev *dev, uint16_t vchan,
 		header->cn9k.fport = conf->dst_port.pcie.coreid;
 	};
 
-	for (i = 0; i < conf->nb_desc; i++) {
-		comp_data = rte_zmalloc(NULL, sizeof(*comp_data), 0);
-		if (comp_data == NULL) {
-			plt_err("Failed to allocate for comp_data");
-			return -ENOMEM;
-		}
-		comp_data->cdata = DPI_REQ_CDATA;
-		dpivf->conf.c_desc.compl_ptr[i] = comp_data;
-	};
-	dpivf->conf.c_desc.max_cnt = DPI_MAX_DESC;
-	dpivf->conf.c_desc.head = 0;
-	dpivf->conf.c_desc.tail = 0;
+	max_desc = conf->nb_desc;
+	if (!rte_is_power_of_2(max_desc))
+		max_desc = rte_align32pow2(max_desc);
+
+	if (max_desc > DPI_MAX_DESC)
+		max_desc = DPI_MAX_DESC;
+
+	size = (max_desc * sizeof(struct cnxk_dpi_compl_s *));
+	dpi_conf->c_desc.compl_ptr = rte_zmalloc(NULL, size, 0);
+
+	if (dpi_conf->c_desc.compl_ptr == NULL) {
+		plt_err("Failed to allocate for comp_data");
+		return -ENOMEM;
+	}
+
+	for (i = 0; i < max_desc; i++) {
+		dpi_conf->c_desc.compl_ptr[i] =
+			rte_zmalloc(NULL, sizeof(struct cnxk_dpi_compl_s), 0);
+		dpi_conf->c_desc.compl_ptr[i]->cdata = DPI_REQ_CDATA;
+	}
+
+	dpi_conf->c_desc.max_cnt = (max_desc - 1);
+	dpi_conf->c_desc.head = 0;
+	dpi_conf->c_desc.tail = 0;
+	dpivf->pnum_words = 0;
+	dpivf->pending = 0;
+	dpivf->flag |= CNXK_DPI_VCHAN_CONFIG;
 
 	return 0;
 }
 
 static int
 cn10k_dmadev_vchan_setup(struct rte_dma_dev *dev, uint16_t vchan,
-			 const struct rte_dma_vchan_conf *conf,
-			 uint32_t conf_sz)
+			 const struct rte_dma_vchan_conf *conf, uint32_t conf_sz)
 {
 	struct cnxk_dpi_vf_s *dpivf = dev->fp_obj->dev_private;
-	struct cnxk_dpi_compl_s *comp_data;
-	union dpi_instr_hdr_s *header = &dpivf->conf.hdr;
+	struct cnxk_dpi_conf *dpi_conf = &dpivf->conf;
+	union dpi_instr_hdr_s *header = &dpi_conf->hdr;
+	uint16_t max_desc;
+	uint32_t size;
 	int i;
 
 	RTE_SET_USED(vchan);
 	RTE_SET_USED(conf_sz);
 
+	if (dpivf->flag & CNXK_DPI_VCHAN_CONFIG)
+		return 0;
+
 	header->cn10k.pt = DPI_HDR_PT_ZBW_CA;
 
 	switch (conf->direction) {
@@ -152,18 +179,33 @@ cn10k_dmadev_vchan_setup(struct rte_dma_dev *dev, uint16_t vchan,
 		header->cn10k.fport = conf->dst_port.pcie.coreid;
 	};
 
-	for (i = 0; i < conf->nb_desc; i++) {
-		comp_data = rte_zmalloc(NULL, sizeof(*comp_data), 0);
-		if (comp_data == NULL) {
-			plt_err("Failed to allocate for comp_data");
-			return -ENOMEM;
-		}
-		comp_data->cdata = DPI_REQ_CDATA;
-		dpivf->conf.c_desc.compl_ptr[i] = comp_data;
-	};
-	dpivf->conf.c_desc.max_cnt = DPI_MAX_DESC;
-	dpivf->conf.c_desc.head = 0;
-	dpivf->conf.c_desc.tail = 0;
+	max_desc = conf->nb_desc;
+	if (!rte_is_power_of_2(max_desc))
+		max_desc = rte_align32pow2(max_desc);
+
+	if (max_desc > DPI_MAX_DESC)
+		max_desc = DPI_MAX_DESC;
+
+	size = (max_desc * sizeof(struct cnxk_dpi_compl_s *));
+	dpi_conf->c_desc.compl_ptr = rte_zmalloc(NULL, size, 0);
+
+	if (dpi_conf->c_desc.compl_ptr == NULL) {
+		plt_err("Failed to allocate for comp_data");
+		return -ENOMEM;
+	}
+
+	for (i = 0; i < max_desc; i++) {
+		dpi_conf->c_desc.compl_ptr[i] =
+			rte_zmalloc(NULL, sizeof(struct cnxk_dpi_compl_s), 0);
+		dpi_conf->c_desc.compl_ptr[i]->cdata = DPI_REQ_CDATA;
+	}
+
+	dpi_conf->c_desc.max_cnt = (max_desc - 1);
+	dpi_conf->c_desc.head = 0;
+	dpi_conf->c_desc.tail = 0;
+	dpivf->pnum_words = 0;
+	dpivf->pending = 0;
+	dpivf->flag |= CNXK_DPI_VCHAN_CONFIG;
 
 	return 0;
 }
@@ -173,10 +215,16 @@ cnxk_dmadev_start(struct rte_dma_dev *dev)
 {
 	struct cnxk_dpi_vf_s *dpivf = dev->fp_obj->dev_private;
 
+	if (dpivf->flag & CNXK_DPI_DEV_START)
+		return 0;
+
 	dpivf->desc_idx = 0;
-	dpivf->num_words = 0;
+	dpivf->pending = 0;
+	dpivf->pnum_words = 0;
 	roc_dpi_enable(&dpivf->rdpi);
 
+	dpivf->flag |= CNXK_DPI_DEV_START;
+
 	return 0;
 }
 
@@ -187,6 +235,8 @@ cnxk_dmadev_stop(struct rte_dma_dev *dev)
 
 	roc_dpi_disable(&dpivf->rdpi);
 
+	dpivf->flag &= ~CNXK_DPI_DEV_START;
+
 	return 0;
 }
 
@@ -198,6 +248,8 @@ cnxk_dmadev_close(struct rte_dma_dev *dev)
 	roc_dpi_disable(&dpivf->rdpi);
 	roc_dpi_dev_fini(&dpivf->rdpi);
 
+	dpivf->flag = 0;
+
 	return 0;
 }
 
@@ -206,8 +258,7 @@ __dpi_queue_write(struct roc_dpi *dpi, uint64_t *cmds, int cmd_count)
 {
 	uint64_t *ptr = dpi->chunk_base;
 
-	if ((cmd_count < DPI_MIN_CMD_SIZE) || (cmd_count > DPI_MAX_CMD_SIZE) ||
-	    cmds == NULL)
+	if ((cmd_count < DPI_MIN_CMD_SIZE) || (cmd_count > DPI_MAX_CMD_SIZE) || cmds == NULL)
 		return -EINVAL;
 
 	/*
@@ -223,11 +274,15 @@ __dpi_queue_write(struct roc_dpi *dpi, uint64_t *cmds, int cmd_count)
 		int count;
 		uint64_t *new_buff = dpi->chunk_next;
 
-		dpi->chunk_next =
-			(void *)roc_npa_aura_op_alloc(dpi->aura_handle, 0);
+		dpi->chunk_next = (void *)roc_npa_aura_op_alloc(dpi->aura_handle, 0);
 		if (!dpi->chunk_next) {
-			plt_err("Failed to alloc next buffer from NPA");
-			return -ENOMEM;
+			plt_dp_dbg("Failed to alloc next buffer from NPA");
+
+			/* NPA failed to allocate a buffer. Restoring chunk_next
+			 * to its original address.
+			 */
+			dpi->chunk_next = new_buff;
+			return -ENOSPC;
 		}
 
 		/*
@@ -261,13 +316,17 @@ __dpi_queue_write(struct roc_dpi *dpi, uint64_t *cmds, int cmd_count)
 		/* queue index may be greater than pool size */
 		if (dpi->chunk_head >= dpi->pool_size_m1) {
 			new_buff = dpi->chunk_next;
-			dpi->chunk_next =
-				(void *)roc_npa_aura_op_alloc(dpi->aura_handle,
-							      0);
+			dpi->chunk_next = (void *)roc_npa_aura_op_alloc(dpi->aura_handle, 0);
 			if (!dpi->chunk_next) {
-				plt_err("Failed to alloc next buffer from NPA");
-				return -ENOMEM;
+				plt_dp_dbg("Failed to alloc next buffer from NPA");
+
+				/* NPA failed to allocate a buffer. Restoring chunk_next
+				 * to its original address.
+				 */
+				dpi->chunk_next = new_buff;
+				return -ENOSPC;
 			}
+
 			/* Write next buffer address */
 			*ptr = (uint64_t)new_buff;
 			dpi->chunk_base = new_buff;
@@ -279,12 +338,13 @@ __dpi_queue_write(struct roc_dpi *dpi, uint64_t *cmds, int cmd_count)
 }
 
 static int
-cnxk_dmadev_copy(void *dev_private, uint16_t vchan, rte_iova_t src,
-		 rte_iova_t dst, uint32_t length, uint64_t flags)
+cnxk_dmadev_copy(void *dev_private, uint16_t vchan, rte_iova_t src, rte_iova_t dst, uint32_t length,
+		 uint64_t flags)
 {
 	struct cnxk_dpi_vf_s *dpivf = dev_private;
 	union dpi_instr_hdr_s *header = &dpivf->conf.hdr;
 	struct cnxk_dpi_compl_s *comp_ptr;
+	uint64_t cmd[DPI_MAX_CMD_SIZE];
 	rte_iova_t fptr, lptr;
 	int num_words = 0;
 	int rc;
@@ -292,9 +352,8 @@ cnxk_dmadev_copy(void *dev_private, uint16_t vchan, rte_iova_t src,
 	RTE_SET_USED(vchan);
 
 	comp_ptr = dpivf->conf.c_desc.compl_ptr[dpivf->conf.c_desc.tail];
-	comp_ptr->cdata = DPI_REQ_CDATA;
 	header->cn9k.ptr = (uint64_t)comp_ptr;
-	STRM_INC(dpivf->conf.c_desc);
+	STRM_INC(dpivf->conf.c_desc, tail);
 
 	header->cn9k.nfst = 1;
 	header->cn9k.nlst = 1;
@@ -311,103 +370,110 @@ cnxk_dmadev_copy(void *dev_private, uint16_t vchan, rte_iova_t src,
 		lptr = dst;
 	}
 
-	dpivf->cmd[0] = header->u[0];
-	dpivf->cmd[1] = header->u[1];
-	dpivf->cmd[2] = header->u[2];
+	cmd[0] = header->u[0];
+	cmd[1] = header->u[1];
+	cmd[2] = header->u[2];
 	/* word3 is always 0 */
 	num_words += 4;
-	dpivf->cmd[num_words++] = length;
-	dpivf->cmd[num_words++] = fptr;
-	dpivf->cmd[num_words++] = length;
-	dpivf->cmd[num_words++] = lptr;
-
-	rc = __dpi_queue_write(&dpivf->rdpi, dpivf->cmd, num_words);
-	if (!rc) {
-		if (flags & RTE_DMA_OP_FLAG_SUBMIT) {
-			rte_wmb();
-			plt_write64(num_words,
-				    dpivf->rdpi.rbase + DPI_VDMA_DBELL);
-			dpivf->stats.submitted++;
-		}
-		dpivf->num_words += num_words;
+	cmd[num_words++] = length;
+	cmd[num_words++] = fptr;
+	cmd[num_words++] = length;
+	cmd[num_words++] = lptr;
+
+	rc = __dpi_queue_write(&dpivf->rdpi, cmd, num_words);
+	if (unlikely(rc)) {
+		STRM_DEC(dpivf->conf.c_desc, tail);
+		return rc;
 	}
 
-	return dpivf->desc_idx++;
+	rte_wmb();
+	if (flags & RTE_DMA_OP_FLAG_SUBMIT) {
+		plt_write64(num_words, dpivf->rdpi.rbase + DPI_VDMA_DBELL);
+		dpivf->stats.submitted++;
+	} else {
+		dpivf->pnum_words += num_words;
+		dpivf->pending++;
+	}
+
+	return (dpivf->desc_idx++);
 }
 
 static int
-cnxk_dmadev_copy_sg(void *dev_private, uint16_t vchan,
-		    const struct rte_dma_sge *src,
-		    const struct rte_dma_sge *dst,
-		    uint16_t nb_src, uint16_t nb_dst, uint64_t flags)
+cnxk_dmadev_copy_sg(void *dev_private, uint16_t vchan, const struct rte_dma_sge *src,
+		    const struct rte_dma_sge *dst, uint16_t nb_src, uint16_t nb_dst, uint64_t flags)
 {
 	struct cnxk_dpi_vf_s *dpivf = dev_private;
 	union dpi_instr_hdr_s *header = &dpivf->conf.hdr;
 	const struct rte_dma_sge *fptr, *lptr;
 	struct cnxk_dpi_compl_s *comp_ptr;
+	uint64_t cmd[DPI_MAX_CMD_SIZE];
 	int num_words = 0;
 	int i, rc;
 
 	RTE_SET_USED(vchan);
 
 	comp_ptr = dpivf->conf.c_desc.compl_ptr[dpivf->conf.c_desc.tail];
-	comp_ptr->cdata = DPI_REQ_CDATA;
 	header->cn9k.ptr = (uint64_t)comp_ptr;
-	STRM_INC(dpivf->conf.c_desc);
+	STRM_INC(dpivf->conf.c_desc, tail);
 
 	/*
 	 * For inbound case, src pointers are last pointers.
 	 * For all other cases, src pointers are first pointers.
 	 */
 	if (header->cn9k.xtype == DPI_XTYPE_INBOUND) {
-		header->cn9k.nfst = nb_dst & 0xf;
-		header->cn9k.nlst = nb_src & 0xf;
+		header->cn9k.nfst = nb_dst & DPI_MAX_POINTER;
+		header->cn9k.nlst = nb_src & DPI_MAX_POINTER;
 		fptr = &dst[0];
 		lptr = &src[0];
 	} else {
-		header->cn9k.nfst = nb_src & 0xf;
-		header->cn9k.nlst = nb_dst & 0xf;
+		header->cn9k.nfst = nb_src & DPI_MAX_POINTER;
+		header->cn9k.nlst = nb_dst & DPI_MAX_POINTER;
 		fptr = &src[0];
 		lptr = &dst[0];
 	}
 
-	dpivf->cmd[0] = header->u[0];
-	dpivf->cmd[1] = header->u[1];
-	dpivf->cmd[2] = header->u[2];
+	cmd[0] = header->u[0];
+	cmd[1] = header->u[1];
+	cmd[2] = header->u[2];
 	num_words += 4;
 	for (i = 0; i < header->cn9k.nfst; i++) {
-		dpivf->cmd[num_words++] = (uint64_t)fptr->length;
-		dpivf->cmd[num_words++] = fptr->addr;
+		cmd[num_words++] = (uint64_t)fptr->length;
+		cmd[num_words++] = fptr->addr;
 		fptr++;
 	}
 
 	for (i = 0; i < header->cn9k.nlst; i++) {
-		dpivf->cmd[num_words++] = (uint64_t)lptr->length;
-		dpivf->cmd[num_words++] = lptr->addr;
+		cmd[num_words++] = (uint64_t)lptr->length;
+		cmd[num_words++] = lptr->addr;
 		lptr++;
 	}
 
-	rc = __dpi_queue_write(&dpivf->rdpi, dpivf->cmd, num_words);
-	if (!rc) {
-		if (flags & RTE_DMA_OP_FLAG_SUBMIT) {
-			rte_wmb();
-			plt_write64(num_words,
-				    dpivf->rdpi.rbase + DPI_VDMA_DBELL);
-			dpivf->stats.submitted += nb_src;
-		}
-		dpivf->num_words += num_words;
+	rc = __dpi_queue_write(&dpivf->rdpi, cmd, num_words);
+	if (unlikely(rc)) {
+		STRM_DEC(dpivf->conf.c_desc, tail);
+		return rc;
 	}
 
-	return (rc < 0) ? rc : dpivf->desc_idx++;
+	if (flags & RTE_DMA_OP_FLAG_SUBMIT) {
+		rte_wmb();
+		plt_write64(num_words, dpivf->rdpi.rbase + DPI_VDMA_DBELL);
+		dpivf->stats.submitted += nb_src;
+	} else {
+		dpivf->pnum_words += num_words;
+		dpivf->pending++;
+	}
+
+	return (dpivf->desc_idx++);
 }
 
 static int
-cn10k_dmadev_copy(void *dev_private, uint16_t vchan, rte_iova_t src,
-		  rte_iova_t dst, uint32_t length, uint64_t flags)
+cn10k_dmadev_copy(void *dev_private, uint16_t vchan, rte_iova_t src, rte_iova_t dst,
+		  uint32_t length, uint64_t flags)
 {
 	struct cnxk_dpi_vf_s *dpivf = dev_private;
 	union dpi_instr_hdr_s *header = &dpivf->conf.hdr;
 	struct cnxk_dpi_compl_s *comp_ptr;
+	uint64_t cmd[DPI_MAX_CMD_SIZE];
 	rte_iova_t fptr, lptr;
 	int num_words = 0;
 	int rc;
@@ -415,9 +481,8 @@ cn10k_dmadev_copy(void *dev_private, uint16_t vchan, rte_iova_t src,
 	RTE_SET_USED(vchan);
 
 	comp_ptr = dpivf->conf.c_desc.compl_ptr[dpivf->conf.c_desc.tail];
-	comp_ptr->cdata = DPI_REQ_CDATA;
 	header->cn10k.ptr = (uint64_t)comp_ptr;
-	STRM_INC(dpivf->conf.c_desc);
+	STRM_INC(dpivf->conf.c_desc, tail);
 
 	header->cn10k.nfst = 1;
 	header->cn10k.nlst = 1;
@@ -425,131 +490,140 @@ cn10k_dmadev_copy(void *dev_private, uint16_t vchan, rte_iova_t src,
 	fptr = src;
 	lptr = dst;
 
-	dpivf->cmd[0] = header->u[0];
-	dpivf->cmd[1] = header->u[1];
-	dpivf->cmd[2] = header->u[2];
+	cmd[0] = header->u[0];
+	cmd[1] = header->u[1];
+	cmd[2] = header->u[2];
 	/* word3 is always 0 */
 	num_words += 4;
-	dpivf->cmd[num_words++] = length;
-	dpivf->cmd[num_words++] = fptr;
-	dpivf->cmd[num_words++] = length;
-	dpivf->cmd[num_words++] = lptr;
-
-	rc = __dpi_queue_write(&dpivf->rdpi, dpivf->cmd, num_words);
-	if (!rc) {
-		if (flags & RTE_DMA_OP_FLAG_SUBMIT) {
-			rte_wmb();
-			plt_write64(num_words,
-				    dpivf->rdpi.rbase + DPI_VDMA_DBELL);
-			dpivf->stats.submitted++;
-		}
-		dpivf->num_words += num_words;
+	cmd[num_words++] = length;
+	cmd[num_words++] = fptr;
+	cmd[num_words++] = length;
+	cmd[num_words++] = lptr;
+
+	rc = __dpi_queue_write(&dpivf->rdpi, cmd, num_words);
+	if (unlikely(rc)) {
+		STRM_DEC(dpivf->conf.c_desc, tail);
+		return rc;
+	}
+
+	if (flags & RTE_DMA_OP_FLAG_SUBMIT) {
+		rte_wmb();
+		plt_write64(num_words, dpivf->rdpi.rbase + DPI_VDMA_DBELL);
+		dpivf->stats.submitted++;
+	} else {
+		dpivf->pnum_words += num_words;
+		dpivf->pending++;
 	}
 
 	return dpivf->desc_idx++;
 }
 
 static int
-cn10k_dmadev_copy_sg(void *dev_private, uint16_t vchan,
-		     const struct rte_dma_sge *src,
-		     const struct rte_dma_sge *dst, uint16_t nb_src,
-		     uint16_t nb_dst, uint64_t flags)
+cn10k_dmadev_copy_sg(void *dev_private, uint16_t vchan, const struct rte_dma_sge *src,
+		     const struct rte_dma_sge *dst, uint16_t nb_src, uint16_t nb_dst,
+		     uint64_t flags)
 {
 	struct cnxk_dpi_vf_s *dpivf = dev_private;
 	union dpi_instr_hdr_s *header = &dpivf->conf.hdr;
 	const struct rte_dma_sge *fptr, *lptr;
 	struct cnxk_dpi_compl_s *comp_ptr;
+	uint64_t cmd[DPI_MAX_CMD_SIZE];
 	int num_words = 0;
 	int i, rc;
 
 	RTE_SET_USED(vchan);
 
 	comp_ptr = dpivf->conf.c_desc.compl_ptr[dpivf->conf.c_desc.tail];
-	comp_ptr->cdata = DPI_REQ_CDATA;
 	header->cn10k.ptr = (uint64_t)comp_ptr;
-	STRM_INC(dpivf->conf.c_desc);
+	STRM_INC(dpivf->conf.c_desc, tail);
 
-	header->cn10k.nfst = nb_src & 0xf;
-	header->cn10k.nlst = nb_dst & 0xf;
+	header->cn10k.nfst = nb_src & DPI_MAX_POINTER;
+	header->cn10k.nlst = nb_dst & DPI_MAX_POINTER;
 	fptr = &src[0];
 	lptr = &dst[0];
 
-	dpivf->cmd[0] = header->u[0];
-	dpivf->cmd[1] = header->u[1];
-	dpivf->cmd[2] = header->u[2];
+	cmd[0] = header->u[0];
+	cmd[1] = header->u[1];
+	cmd[2] = header->u[2];
 	num_words += 4;
 
 	for (i = 0; i < header->cn10k.nfst; i++) {
-		dpivf->cmd[num_words++] = (uint64_t)fptr->length;
-		dpivf->cmd[num_words++] = fptr->addr;
+		cmd[num_words++] = (uint64_t)fptr->length;
+		cmd[num_words++] = fptr->addr;
 		fptr++;
 	}
 
 	for (i = 0; i < header->cn10k.nlst; i++) {
-		dpivf->cmd[num_words++] = (uint64_t)lptr->length;
-		dpivf->cmd[num_words++] = lptr->addr;
+		cmd[num_words++] = (uint64_t)lptr->length;
+		cmd[num_words++] = lptr->addr;
 		lptr++;
 	}
 
-	rc = __dpi_queue_write(&dpivf->rdpi, dpivf->cmd, num_words);
-	if (!rc) {
-		if (flags & RTE_DMA_OP_FLAG_SUBMIT) {
-			rte_wmb();
-			plt_write64(num_words,
-				    dpivf->rdpi.rbase + DPI_VDMA_DBELL);
-			dpivf->stats.submitted += nb_src;
-		}
-		dpivf->num_words += num_words;
+	rc = __dpi_queue_write(&dpivf->rdpi, cmd, num_words);
+	if (unlikely(rc)) {
+		STRM_DEC(dpivf->conf.c_desc, tail);
+		return rc;
+	}
+
+	if (flags & RTE_DMA_OP_FLAG_SUBMIT) {
+		rte_wmb();
+		plt_write64(num_words, dpivf->rdpi.rbase + DPI_VDMA_DBELL);
+		dpivf->stats.submitted += nb_src;
+	} else {
+		dpivf->pnum_words += num_words;
+		dpivf->pending++;
 	}
 
-	return (rc < 0) ? rc : dpivf->desc_idx++;
+	return (dpivf->desc_idx++);
 }
 
 static uint16_t
-cnxk_dmadev_completed(void *dev_private, uint16_t vchan, const uint16_t nb_cpls,
-		      uint16_t *last_idx, bool *has_error)
+cnxk_dmadev_completed(void *dev_private, uint16_t vchan, const uint16_t nb_cpls, uint16_t *last_idx,
+		      bool *has_error)
 {
 	struct cnxk_dpi_vf_s *dpivf = dev_private;
+	struct cnxk_dpi_cdesc_data_s *c_desc = &dpivf->conf.c_desc;
+	struct cnxk_dpi_compl_s *comp_ptr;
 	int cnt;
 
 	RTE_SET_USED(vchan);
 
-	if (dpivf->stats.submitted == dpivf->stats.completed)
-		return 0;
-
 	for (cnt = 0; cnt < nb_cpls; cnt++) {
-		struct cnxk_dpi_compl_s *comp_ptr =
-			dpivf->conf.c_desc.compl_ptr[cnt];
+		comp_ptr = c_desc->compl_ptr[c_desc->head];
 
 		if (comp_ptr->cdata) {
 			if (comp_ptr->cdata == DPI_REQ_CDATA)
 				break;
 			*has_error = 1;
 			dpivf->stats.errors++;
+			STRM_INC(*c_desc, head);
 			break;
 		}
+
+		comp_ptr->cdata = DPI_REQ_CDATA;
+		STRM_INC(*c_desc, head);
 	}
 
-	*last_idx = cnt - 1;
-	dpivf->conf.c_desc.tail = cnt;
 	dpivf->stats.completed += cnt;
+	*last_idx = dpivf->stats.completed - 1;
 
 	return cnt;
 }
 
 static uint16_t
-cnxk_dmadev_completed_status(void *dev_private, uint16_t vchan,
-			     const uint16_t nb_cpls, uint16_t *last_idx,
-			     enum rte_dma_status_code *status)
+cnxk_dmadev_completed_status(void *dev_private, uint16_t vchan, const uint16_t nb_cpls,
+			     uint16_t *last_idx, enum rte_dma_status_code *status)
 {
 	struct cnxk_dpi_vf_s *dpivf = dev_private;
+	struct cnxk_dpi_cdesc_data_s *c_desc = &dpivf->conf.c_desc;
+	struct cnxk_dpi_compl_s *comp_ptr;
 	int cnt;
 
 	RTE_SET_USED(vchan);
 	RTE_SET_USED(last_idx);
+
 	for (cnt = 0; cnt < nb_cpls; cnt++) {
-		struct cnxk_dpi_compl_s *comp_ptr =
-			dpivf->conf.c_desc.compl_ptr[cnt];
+		comp_ptr = c_desc->compl_ptr[c_desc->head];
 		status[cnt] = comp_ptr->cdata;
 		if (status[cnt]) {
 			if (status[cnt] == DPI_REQ_CDATA)
@@ -557,30 +631,52 @@ cnxk_dmadev_completed_status(void *dev_private, uint16_t vchan,
 
 			dpivf->stats.errors++;
 		}
+		comp_ptr->cdata = DPI_REQ_CDATA;
+		STRM_INC(*c_desc, head);
 	}
 
-	*last_idx = cnt - 1;
-	dpivf->conf.c_desc.tail = 0;
 	dpivf->stats.completed += cnt;
+	*last_idx = dpivf->stats.completed - 1;
 
 	return cnt;
 }
 
+static uint16_t
+cnxk_damdev_burst_capacity(const void *dev_private, uint16_t vchan)
+{
+	const struct cnxk_dpi_vf_s *dpivf = (const struct cnxk_dpi_vf_s *)dev_private;
+	uint16_t burst_cap;
+
+	RTE_SET_USED(vchan);
+
+	burst_cap = dpivf->conf.c_desc.max_cnt -
+		    ((dpivf->stats.submitted - dpivf->stats.completed) + dpivf->pending) + 1;
+
+	return burst_cap;
+}
+
 static int
 cnxk_dmadev_submit(void *dev_private, uint16_t vchan __rte_unused)
 {
 	struct cnxk_dpi_vf_s *dpivf = dev_private;
+	uint32_t num_words = dpivf->pnum_words;
+
+	if (!dpivf->pnum_words)
+		return 0;
 
 	rte_wmb();
-	plt_write64(dpivf->num_words, dpivf->rdpi.rbase + DPI_VDMA_DBELL);
-	dpivf->stats.submitted++;
+	plt_write64(num_words, dpivf->rdpi.rbase + DPI_VDMA_DBELL);
+
+	dpivf->stats.submitted += dpivf->pending;
+	dpivf->pnum_words = 0;
+	dpivf->pending = 0;
 
 	return 0;
 }
 
 static int
-cnxk_stats_get(const struct rte_dma_dev *dev, uint16_t vchan,
-	       struct rte_dma_stats *rte_stats, uint32_t size)
+cnxk_stats_get(const struct rte_dma_dev *dev, uint16_t vchan, struct rte_dma_stats *rte_stats,
+	       uint32_t size)
 {
 	struct cnxk_dpi_vf_s *dpivf = dev->fp_obj->dev_private;
 	struct rte_dma_stats *stats = &dpivf->stats;
@@ -628,8 +724,7 @@ static const struct rte_dma_dev_ops cnxk_dmadev_ops = {
 };
 
 static int
-cnxk_dmadev_probe(struct rte_pci_driver *pci_drv __rte_unused,
-		  struct rte_pci_device *pci_dev)
+cnxk_dmadev_probe(struct rte_pci_driver *pci_drv __rte_unused, struct rte_pci_device *pci_dev)
 {
 	struct cnxk_dpi_vf_s *dpivf = NULL;
 	char name[RTE_DEV_NAME_MAX_LEN];
@@ -648,8 +743,7 @@ cnxk_dmadev_probe(struct rte_pci_driver *pci_drv __rte_unused,
 	memset(name, 0, sizeof(name));
 	rte_pci_device_name(&pci_dev->addr, name, sizeof(name));
 
-	dmadev = rte_dma_pmd_allocate(name, pci_dev->device.numa_node,
-				      sizeof(*dpivf));
+	dmadev = rte_dma_pmd_allocate(name, pci_dev->device.numa_node, sizeof(*dpivf));
 	if (dmadev == NULL) {
 		plt_err("dma device allocation failed for %s", name);
 		return -ENOMEM;
@@ -666,6 +760,7 @@ cnxk_dmadev_probe(struct rte_pci_driver *pci_drv __rte_unused,
 	dmadev->fp_obj->submit = cnxk_dmadev_submit;
 	dmadev->fp_obj->completed = cnxk_dmadev_completed;
 	dmadev->fp_obj->completed_status = cnxk_dmadev_completed_status;
+	dmadev->fp_obj->burst_capacity = cnxk_damdev_burst_capacity;
 
 	if (pci_dev->id.subsystem_device_id == PCI_SUBSYSTEM_DEVID_CN10KA ||
 	    pci_dev->id.subsystem_device_id == PCI_SUBSYSTEM_DEVID_CNF10KA ||
@@ -682,6 +777,8 @@ cnxk_dmadev_probe(struct rte_pci_driver *pci_drv __rte_unused,
 	if (rc < 0)
 		goto err_out_free;
 
+	dmadev->state = RTE_DMA_DEV_READY;
+
 	return 0;
 
 err_out_free:
@@ -703,20 +800,17 @@ cnxk_dmadev_remove(struct rte_pci_device *pci_dev)
 }
 
 static const struct rte_pci_id cnxk_dma_pci_map[] = {
-	{
-		RTE_PCI_DEVICE(PCI_VENDOR_ID_CAVIUM,
-			       PCI_DEVID_CNXK_DPI_VF)
-	},
+	{RTE_PCI_DEVICE(PCI_VENDOR_ID_CAVIUM, PCI_DEVID_CNXK_DPI_VF)},
 	{
 		.vendor_id = 0,
 	},
 };
 
 static struct rte_pci_driver cnxk_dmadev = {
-	.id_table  = cnxk_dma_pci_map,
+	.id_table = cnxk_dma_pci_map,
 	.drv_flags = RTE_PCI_DRV_NEED_MAPPING | RTE_PCI_DRV_NEED_IOVA_AS_VA,
-	.probe     = cnxk_dmadev_probe,
-	.remove    = cnxk_dmadev_remove,
+	.probe = cnxk_dmadev_probe,
+	.remove = cnxk_dmadev_remove,
 };
 
 RTE_PMD_REGISTER_PCI(cnxk_dmadev_pci_driver, cnxk_dmadev);
diff --git a/drivers/dma/cnxk/cnxk_dmadev.h b/drivers/dma/cnxk/cnxk_dmadev.h
index e1f5694f50..9563295af0 100644
--- a/drivers/dma/cnxk/cnxk_dmadev.h
+++ b/drivers/dma/cnxk/cnxk_dmadev.h
@@ -4,16 +4,21 @@
 #ifndef CNXK_DMADEV_H
 #define CNXK_DMADEV_H
 
-#define DPI_MAX_POINTER		15
-#define DPI_QUEUE_STOP		0x0
-#define DPI_QUEUE_START		0x1
-#define STRM_INC(s)		((s).tail = ((s).tail + 1) % (s).max_cnt)
-#define DPI_MAX_DESC		1024
+#include <roc_api.h>
+
+#define DPI_MAX_POINTER	 15
+#define STRM_INC(s, var) ((s).var = ((s).var + 1) & (s).max_cnt)
+#define STRM_DEC(s, var) ((s).var = ((s).var - 1) == -1 ? (s).max_cnt : ((s).var - 1))
+#define DPI_MAX_DESC	 1024
 
 /* Set Completion data to 0xFF when request submitted,
  * upon successful request completion engine reset to completion status
  */
-#define DPI_REQ_CDATA		0xFF
+#define DPI_REQ_CDATA 0xFF
+
+#define CNXK_DPI_DEV_CONFIG   (1ULL << 0)
+#define CNXK_DPI_VCHAN_CONFIG (1ULL << 1)
+#define CNXK_DPI_DEV_START    (1ULL << 2)
 
 struct cnxk_dpi_compl_s {
 	uint64_t cdata;
@@ -21,7 +26,7 @@ struct cnxk_dpi_compl_s {
 };
 
 struct cnxk_dpi_cdesc_data_s {
-	struct cnxk_dpi_compl_s *compl_ptr[DPI_MAX_DESC];
+	struct cnxk_dpi_compl_s **compl_ptr;
 	uint16_t max_cnt;
 	uint16_t head;
 	uint16_t tail;
@@ -36,9 +41,10 @@ struct cnxk_dpi_vf_s {
 	struct roc_dpi rdpi;
 	struct cnxk_dpi_conf conf;
 	struct rte_dma_stats stats;
-	uint64_t cmd[DPI_MAX_CMD_SIZE];
-	uint32_t num_words;
+	uint16_t pending;
+	uint16_t pnum_words;
 	uint16_t desc_idx;
+	uint16_t flag;
 };
 
 #endif
-- 
2.25.1


^ permalink raw reply	[flat|nested] 46+ messages in thread

* [PATCH v4 3/8] dma/cnxk: add DMA devops for all models of cn10xxx
  2023-08-21 17:49     ` [PATCH v4 " Amit Prakash Shukla
  2023-08-21 17:49       ` [PATCH v4 2/8] dma/cnxk: changes for dmadev driver Amit Prakash Shukla
@ 2023-08-21 17:49       ` Amit Prakash Shukla
  2023-08-21 17:49       ` [PATCH v4 4/8] dma/cnxk: update func field based on transfer type Amit Prakash Shukla
                         ` (5 subsequent siblings)
  7 siblings, 0 replies; 46+ messages in thread
From: Amit Prakash Shukla @ 2023-08-21 17:49 UTC (permalink / raw)
  To: Vamsi Attunuru; +Cc: dev, jerinj, Amit Prakash Shukla, Radha Mohan Chintakuntla

Valid function pointers are set for DMA device operations
i.e. cn10k_dmadev_ops are used for all cn10k devices.

Signed-off-by: Radha Mohan Chintakuntla <radhac@marvell.com>
Signed-off-by: Amit Prakash Shukla <amitprakashs@marvell.com>
---
v2:
- Fix for bugs observed in v1.
- Squashed few commits.

v3:
- Resolved review suggestions.
- Code improvement.

v4:
- Resolved checkpatch warnings.

 drivers/dma/cnxk/cnxk_dmadev.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/drivers/dma/cnxk/cnxk_dmadev.c b/drivers/dma/cnxk/cnxk_dmadev.c
index a0152fc6df..1dc124e68f 100644
--- a/drivers/dma/cnxk/cnxk_dmadev.c
+++ b/drivers/dma/cnxk/cnxk_dmadev.c
@@ -763,7 +763,9 @@ cnxk_dmadev_probe(struct rte_pci_driver *pci_drv __rte_unused, struct rte_pci_de
 	dmadev->fp_obj->burst_capacity = cnxk_damdev_burst_capacity;
 
 	if (pci_dev->id.subsystem_device_id == PCI_SUBSYSTEM_DEVID_CN10KA ||
+	    pci_dev->id.subsystem_device_id == PCI_SUBSYSTEM_DEVID_CN10KAS ||
 	    pci_dev->id.subsystem_device_id == PCI_SUBSYSTEM_DEVID_CNF10KA ||
+	    pci_dev->id.subsystem_device_id == PCI_SUBSYSTEM_DEVID_CNF10KB ||
 	    pci_dev->id.subsystem_device_id == PCI_SUBSYSTEM_DEVID_CN10KB) {
 		dmadev->dev_ops = &cn10k_dmadev_ops;
 		dmadev->fp_obj->copy = cn10k_dmadev_copy;
-- 
2.25.1


^ permalink raw reply	[flat|nested] 46+ messages in thread

* [PATCH v4 4/8] dma/cnxk: update func field based on transfer type
  2023-08-21 17:49     ` [PATCH v4 " Amit Prakash Shukla
  2023-08-21 17:49       ` [PATCH v4 2/8] dma/cnxk: changes for dmadev driver Amit Prakash Shukla
  2023-08-21 17:49       ` [PATCH v4 3/8] dma/cnxk: add DMA devops for all models of cn10xxx Amit Prakash Shukla
@ 2023-08-21 17:49       ` Amit Prakash Shukla
  2023-08-21 17:49       ` [PATCH v4 5/8] dma/cnxk: increase vchan per queue to max 4 Amit Prakash Shukla
                         ` (4 subsequent siblings)
  7 siblings, 0 replies; 46+ messages in thread
From: Amit Prakash Shukla @ 2023-08-21 17:49 UTC (permalink / raw)
  To: Vamsi Attunuru; +Cc: dev, jerinj, Amit Prakash Shukla, Radha Mohan Chintakuntla

Use pfid and vfid of src_port for incoming DMA transfers and dst_port
for outgoing DMA transfers.

Signed-off-by: Radha Mohan Chintakuntla <radhac@marvell.com>
Signed-off-by: Amit Prakash Shukla <amitprakashs@marvell.com>
---
v2:
- Fix for bugs observed in v1.
- Squashed few commits.

v3:
- Resolved review suggestions.
- Code improvement.

v4:
- Resolved checkpatch warnings.

 drivers/dma/cnxk/cnxk_dmadev.c | 26 ++++++++++++++++++++++----
 1 file changed, 22 insertions(+), 4 deletions(-)

diff --git a/drivers/dma/cnxk/cnxk_dmadev.c b/drivers/dma/cnxk/cnxk_dmadev.c
index 1dc124e68f..d8cfb98cd7 100644
--- a/drivers/dma/cnxk/cnxk_dmadev.c
+++ b/drivers/dma/cnxk/cnxk_dmadev.c
@@ -84,13 +84,21 @@ cnxk_dmadev_vchan_setup(struct rte_dma_dev *dev, uint16_t vchan,
 		header->cn9k.xtype = DPI_XTYPE_INBOUND;
 		header->cn9k.lport = conf->src_port.pcie.coreid;
 		header->cn9k.fport = 0;
-		header->cn9k.pvfe = 1;
+		header->cn9k.pvfe = conf->src_port.pcie.vfen;
+		if (header->cn9k.pvfe) {
+			header->cn9k.func = conf->src_port.pcie.pfid << 12;
+			header->cn9k.func |= conf->src_port.pcie.vfid;
+		}
 		break;
 	case RTE_DMA_DIR_MEM_TO_DEV:
 		header->cn9k.xtype = DPI_XTYPE_OUTBOUND;
 		header->cn9k.lport = 0;
 		header->cn9k.fport = conf->dst_port.pcie.coreid;
-		header->cn9k.pvfe = 1;
+		header->cn9k.pvfe = conf->dst_port.pcie.vfen;
+		if (header->cn9k.pvfe) {
+			header->cn9k.func = conf->dst_port.pcie.pfid << 12;
+			header->cn9k.func |= conf->dst_port.pcie.vfid;
+		}
 		break;
 	case RTE_DMA_DIR_MEM_TO_MEM:
 		header->cn9k.xtype = DPI_XTYPE_INTERNAL_ONLY;
@@ -102,6 +110,7 @@ cnxk_dmadev_vchan_setup(struct rte_dma_dev *dev, uint16_t vchan,
 		header->cn9k.xtype = DPI_XTYPE_EXTERNAL_ONLY;
 		header->cn9k.lport = conf->src_port.pcie.coreid;
 		header->cn9k.fport = conf->dst_port.pcie.coreid;
+		header->cn9k.pvfe = 0;
 	};
 
 	max_desc = conf->nb_desc;
@@ -159,13 +168,21 @@ cn10k_dmadev_vchan_setup(struct rte_dma_dev *dev, uint16_t vchan,
 		header->cn10k.xtype = DPI_XTYPE_INBOUND;
 		header->cn10k.lport = conf->src_port.pcie.coreid;
 		header->cn10k.fport = 0;
-		header->cn10k.pvfe = 1;
+		header->cn10k.pvfe = conf->src_port.pcie.vfen;
+		if (header->cn10k.pvfe) {
+			header->cn10k.func = conf->src_port.pcie.pfid << 12;
+			header->cn10k.func |= conf->src_port.pcie.vfid;
+		}
 		break;
 	case RTE_DMA_DIR_MEM_TO_DEV:
 		header->cn10k.xtype = DPI_XTYPE_OUTBOUND;
 		header->cn10k.lport = 0;
 		header->cn10k.fport = conf->dst_port.pcie.coreid;
-		header->cn10k.pvfe = 1;
+		header->cn10k.pvfe = conf->dst_port.pcie.vfen;
+		if (header->cn10k.pvfe) {
+			header->cn10k.func = conf->dst_port.pcie.pfid << 12;
+			header->cn10k.func |= conf->dst_port.pcie.vfid;
+		}
 		break;
 	case RTE_DMA_DIR_MEM_TO_MEM:
 		header->cn10k.xtype = DPI_XTYPE_INTERNAL_ONLY;
@@ -177,6 +194,7 @@ cn10k_dmadev_vchan_setup(struct rte_dma_dev *dev, uint16_t vchan,
 		header->cn10k.xtype = DPI_XTYPE_EXTERNAL_ONLY;
 		header->cn10k.lport = conf->src_port.pcie.coreid;
 		header->cn10k.fport = conf->dst_port.pcie.coreid;
+		header->cn10k.pvfe = 0;
 	};
 
 	max_desc = conf->nb_desc;
-- 
2.25.1


^ permalink raw reply	[flat|nested] 46+ messages in thread

* [PATCH v4 5/8] dma/cnxk: increase vchan per queue to max 4
  2023-08-21 17:49     ` [PATCH v4 " Amit Prakash Shukla
                         ` (2 preceding siblings ...)
  2023-08-21 17:49       ` [PATCH v4 4/8] dma/cnxk: update func field based on transfer type Amit Prakash Shukla
@ 2023-08-21 17:49       ` Amit Prakash Shukla
  2023-08-21 17:49       ` [PATCH v4 6/8] dma/cnxk: vchan support enhancement Amit Prakash Shukla
                         ` (3 subsequent siblings)
  7 siblings, 0 replies; 46+ messages in thread
From: Amit Prakash Shukla @ 2023-08-21 17:49 UTC (permalink / raw)
  To: Vamsi Attunuru; +Cc: dev, jerinj, Amit Prakash Shukla, Radha Mohan Chintakuntla

To support multiple directions in same queue make use of multiple vchan
per queue. Each vchan can be configured in some direction and used.

Signed-off-by: Amit Prakash Shukla <amitprakashs@marvell.com>
Signed-off-by: Radha Mohan Chintakuntla <radhac@marvell.com>
---
v2:
- Fix for bugs observed in v1.
- Squashed few commits.

v3:
- Resolved review suggestions.
- Code improvement.

v4:
- Resolved checkpatch warnings.

 drivers/dma/cnxk/cnxk_dmadev.c | 68 +++++++++++++++-------------------
 drivers/dma/cnxk/cnxk_dmadev.h | 11 +++---
 2 files changed, 36 insertions(+), 43 deletions(-)

diff --git a/drivers/dma/cnxk/cnxk_dmadev.c b/drivers/dma/cnxk/cnxk_dmadev.c
index d8cfb98cd7..7d83b70e8b 100644
--- a/drivers/dma/cnxk/cnxk_dmadev.c
+++ b/drivers/dma/cnxk/cnxk_dmadev.c
@@ -22,8 +22,8 @@ cnxk_dmadev_info_get(const struct rte_dma_dev *dev, struct rte_dma_info *dev_inf
 	RTE_SET_USED(dev);
 	RTE_SET_USED(size);
 
-	dev_info->max_vchans = 1;
-	dev_info->nb_vchans = 1;
+	dev_info->max_vchans = MAX_VCHANS_PER_QUEUE;
+	dev_info->nb_vchans = MAX_VCHANS_PER_QUEUE;
 	dev_info->dev_capa = RTE_DMA_CAPA_MEM_TO_MEM | RTE_DMA_CAPA_MEM_TO_DEV |
 			     RTE_DMA_CAPA_DEV_TO_MEM | RTE_DMA_CAPA_DEV_TO_DEV |
 			     RTE_DMA_CAPA_OPS_COPY | RTE_DMA_CAPA_OPS_COPY_SG;
@@ -65,13 +65,12 @@ cnxk_dmadev_vchan_setup(struct rte_dma_dev *dev, uint16_t vchan,
 			const struct rte_dma_vchan_conf *conf, uint32_t conf_sz)
 {
 	struct cnxk_dpi_vf_s *dpivf = dev->fp_obj->dev_private;
-	struct cnxk_dpi_conf *dpi_conf = &dpivf->conf;
+	struct cnxk_dpi_conf *dpi_conf = &dpivf->conf[vchan];
 	union dpi_instr_hdr_s *header = &dpi_conf->hdr;
 	uint16_t max_desc;
 	uint32_t size;
 	int i;
 
-	RTE_SET_USED(vchan);
 	RTE_SET_USED(conf_sz);
 
 	if (dpivf->flag & CNXK_DPI_VCHAN_CONFIG)
@@ -149,13 +148,12 @@ cn10k_dmadev_vchan_setup(struct rte_dma_dev *dev, uint16_t vchan,
 			 const struct rte_dma_vchan_conf *conf, uint32_t conf_sz)
 {
 	struct cnxk_dpi_vf_s *dpivf = dev->fp_obj->dev_private;
-	struct cnxk_dpi_conf *dpi_conf = &dpivf->conf;
+	struct cnxk_dpi_conf *dpi_conf = &dpivf->conf[vchan];
 	union dpi_instr_hdr_s *header = &dpi_conf->hdr;
 	uint16_t max_desc;
 	uint32_t size;
 	int i;
 
-	RTE_SET_USED(vchan);
 	RTE_SET_USED(conf_sz);
 
 	if (dpivf->flag & CNXK_DPI_VCHAN_CONFIG)
@@ -360,18 +358,17 @@ cnxk_dmadev_copy(void *dev_private, uint16_t vchan, rte_iova_t src, rte_iova_t d
 		 uint64_t flags)
 {
 	struct cnxk_dpi_vf_s *dpivf = dev_private;
-	union dpi_instr_hdr_s *header = &dpivf->conf.hdr;
+	struct cnxk_dpi_conf *dpi_conf = &dpivf->conf[vchan];
+	union dpi_instr_hdr_s *header = &dpi_conf->hdr;
 	struct cnxk_dpi_compl_s *comp_ptr;
 	uint64_t cmd[DPI_MAX_CMD_SIZE];
 	rte_iova_t fptr, lptr;
 	int num_words = 0;
 	int rc;
 
-	RTE_SET_USED(vchan);
-
-	comp_ptr = dpivf->conf.c_desc.compl_ptr[dpivf->conf.c_desc.tail];
+	comp_ptr = dpi_conf->c_desc.compl_ptr[dpi_conf->c_desc.tail];
 	header->cn9k.ptr = (uint64_t)comp_ptr;
-	STRM_INC(dpivf->conf.c_desc, tail);
+	STRM_INC(dpi_conf->c_desc, tail);
 
 	header->cn9k.nfst = 1;
 	header->cn9k.nlst = 1;
@@ -400,7 +397,7 @@ cnxk_dmadev_copy(void *dev_private, uint16_t vchan, rte_iova_t src, rte_iova_t d
 
 	rc = __dpi_queue_write(&dpivf->rdpi, cmd, num_words);
 	if (unlikely(rc)) {
-		STRM_DEC(dpivf->conf.c_desc, tail);
+		STRM_DEC(dpi_conf->c_desc, tail);
 		return rc;
 	}
 
@@ -421,18 +418,17 @@ cnxk_dmadev_copy_sg(void *dev_private, uint16_t vchan, const struct rte_dma_sge
 		    const struct rte_dma_sge *dst, uint16_t nb_src, uint16_t nb_dst, uint64_t flags)
 {
 	struct cnxk_dpi_vf_s *dpivf = dev_private;
-	union dpi_instr_hdr_s *header = &dpivf->conf.hdr;
+	struct cnxk_dpi_conf *dpi_conf = &dpivf->conf[vchan];
+	union dpi_instr_hdr_s *header = &dpi_conf->hdr;
 	const struct rte_dma_sge *fptr, *lptr;
 	struct cnxk_dpi_compl_s *comp_ptr;
 	uint64_t cmd[DPI_MAX_CMD_SIZE];
 	int num_words = 0;
 	int i, rc;
 
-	RTE_SET_USED(vchan);
-
-	comp_ptr = dpivf->conf.c_desc.compl_ptr[dpivf->conf.c_desc.tail];
+	comp_ptr = dpi_conf->c_desc.compl_ptr[dpi_conf->c_desc.tail];
 	header->cn9k.ptr = (uint64_t)comp_ptr;
-	STRM_INC(dpivf->conf.c_desc, tail);
+	STRM_INC(dpi_conf->c_desc, tail);
 
 	/*
 	 * For inbound case, src pointers are last pointers.
@@ -468,7 +464,7 @@ cnxk_dmadev_copy_sg(void *dev_private, uint16_t vchan, const struct rte_dma_sge
 
 	rc = __dpi_queue_write(&dpivf->rdpi, cmd, num_words);
 	if (unlikely(rc)) {
-		STRM_DEC(dpivf->conf.c_desc, tail);
+		STRM_DEC(dpi_conf->c_desc, tail);
 		return rc;
 	}
 
@@ -489,18 +485,17 @@ cn10k_dmadev_copy(void *dev_private, uint16_t vchan, rte_iova_t src, rte_iova_t
 		  uint32_t length, uint64_t flags)
 {
 	struct cnxk_dpi_vf_s *dpivf = dev_private;
-	union dpi_instr_hdr_s *header = &dpivf->conf.hdr;
+	struct cnxk_dpi_conf *dpi_conf = &dpivf->conf[vchan];
+	union dpi_instr_hdr_s *header = &dpi_conf->hdr;
 	struct cnxk_dpi_compl_s *comp_ptr;
 	uint64_t cmd[DPI_MAX_CMD_SIZE];
 	rte_iova_t fptr, lptr;
 	int num_words = 0;
 	int rc;
 
-	RTE_SET_USED(vchan);
-
-	comp_ptr = dpivf->conf.c_desc.compl_ptr[dpivf->conf.c_desc.tail];
+	comp_ptr = dpi_conf->c_desc.compl_ptr[dpi_conf->c_desc.tail];
 	header->cn10k.ptr = (uint64_t)comp_ptr;
-	STRM_INC(dpivf->conf.c_desc, tail);
+	STRM_INC(dpi_conf->c_desc, tail);
 
 	header->cn10k.nfst = 1;
 	header->cn10k.nlst = 1;
@@ -520,7 +515,7 @@ cn10k_dmadev_copy(void *dev_private, uint16_t vchan, rte_iova_t src, rte_iova_t
 
 	rc = __dpi_queue_write(&dpivf->rdpi, cmd, num_words);
 	if (unlikely(rc)) {
-		STRM_DEC(dpivf->conf.c_desc, tail);
+		STRM_DEC(dpi_conf->c_desc, tail);
 		return rc;
 	}
 
@@ -542,18 +537,17 @@ cn10k_dmadev_copy_sg(void *dev_private, uint16_t vchan, const struct rte_dma_sge
 		     uint64_t flags)
 {
 	struct cnxk_dpi_vf_s *dpivf = dev_private;
-	union dpi_instr_hdr_s *header = &dpivf->conf.hdr;
+	struct cnxk_dpi_conf *dpi_conf = &dpivf->conf[vchan];
+	union dpi_instr_hdr_s *header = &dpi_conf->hdr;
 	const struct rte_dma_sge *fptr, *lptr;
 	struct cnxk_dpi_compl_s *comp_ptr;
 	uint64_t cmd[DPI_MAX_CMD_SIZE];
 	int num_words = 0;
 	int i, rc;
 
-	RTE_SET_USED(vchan);
-
-	comp_ptr = dpivf->conf.c_desc.compl_ptr[dpivf->conf.c_desc.tail];
+	comp_ptr = dpi_conf->c_desc.compl_ptr[dpi_conf->c_desc.tail];
 	header->cn10k.ptr = (uint64_t)comp_ptr;
-	STRM_INC(dpivf->conf.c_desc, tail);
+	STRM_INC(dpi_conf->c_desc, tail);
 
 	header->cn10k.nfst = nb_src & DPI_MAX_POINTER;
 	header->cn10k.nlst = nb_dst & DPI_MAX_POINTER;
@@ -579,7 +573,7 @@ cn10k_dmadev_copy_sg(void *dev_private, uint16_t vchan, const struct rte_dma_sge
 
 	rc = __dpi_queue_write(&dpivf->rdpi, cmd, num_words);
 	if (unlikely(rc)) {
-		STRM_DEC(dpivf->conf.c_desc, tail);
+		STRM_DEC(dpi_conf->c_desc, tail);
 		return rc;
 	}
 
@@ -600,12 +594,11 @@ cnxk_dmadev_completed(void *dev_private, uint16_t vchan, const uint16_t nb_cpls,
 		      bool *has_error)
 {
 	struct cnxk_dpi_vf_s *dpivf = dev_private;
-	struct cnxk_dpi_cdesc_data_s *c_desc = &dpivf->conf.c_desc;
+	struct cnxk_dpi_conf *dpi_conf = &dpivf->conf[vchan];
+	struct cnxk_dpi_cdesc_data_s *c_desc = &dpi_conf->c_desc;
 	struct cnxk_dpi_compl_s *comp_ptr;
 	int cnt;
 
-	RTE_SET_USED(vchan);
-
 	for (cnt = 0; cnt < nb_cpls; cnt++) {
 		comp_ptr = c_desc->compl_ptr[c_desc->head];
 
@@ -633,11 +626,11 @@ cnxk_dmadev_completed_status(void *dev_private, uint16_t vchan, const uint16_t n
 			     uint16_t *last_idx, enum rte_dma_status_code *status)
 {
 	struct cnxk_dpi_vf_s *dpivf = dev_private;
-	struct cnxk_dpi_cdesc_data_s *c_desc = &dpivf->conf.c_desc;
+	struct cnxk_dpi_conf *dpi_conf = &dpivf->conf[vchan];
+	struct cnxk_dpi_cdesc_data_s *c_desc = &dpi_conf->c_desc;
 	struct cnxk_dpi_compl_s *comp_ptr;
 	int cnt;
 
-	RTE_SET_USED(vchan);
 	RTE_SET_USED(last_idx);
 
 	for (cnt = 0; cnt < nb_cpls; cnt++) {
@@ -663,11 +656,10 @@ static uint16_t
 cnxk_damdev_burst_capacity(const void *dev_private, uint16_t vchan)
 {
 	const struct cnxk_dpi_vf_s *dpivf = (const struct cnxk_dpi_vf_s *)dev_private;
+	const struct cnxk_dpi_conf *dpi_conf = &dpivf->conf[vchan];
 	uint16_t burst_cap;
 
-	RTE_SET_USED(vchan);
-
-	burst_cap = dpivf->conf.c_desc.max_cnt -
+	burst_cap = dpi_conf->c_desc.max_cnt -
 		    ((dpivf->stats.submitted - dpivf->stats.completed) + dpivf->pending) + 1;
 
 	return burst_cap;
diff --git a/drivers/dma/cnxk/cnxk_dmadev.h b/drivers/dma/cnxk/cnxk_dmadev.h
index 9563295af0..4693960a19 100644
--- a/drivers/dma/cnxk/cnxk_dmadev.h
+++ b/drivers/dma/cnxk/cnxk_dmadev.h
@@ -6,10 +6,11 @@
 
 #include <roc_api.h>
 
-#define DPI_MAX_POINTER	 15
-#define STRM_INC(s, var) ((s).var = ((s).var + 1) & (s).max_cnt)
-#define STRM_DEC(s, var) ((s).var = ((s).var - 1) == -1 ? (s).max_cnt : ((s).var - 1))
-#define DPI_MAX_DESC	 1024
+#define DPI_MAX_POINTER	     15
+#define STRM_INC(s, var)     ((s).var = ((s).var + 1) & (s).max_cnt)
+#define STRM_DEC(s, var)     ((s).var = ((s).var - 1) == -1 ? (s).max_cnt : ((s).var - 1))
+#define DPI_MAX_DESC	     1024
+#define MAX_VCHANS_PER_QUEUE 4
 
 /* Set Completion data to 0xFF when request submitted,
  * upon successful request completion engine reset to completion status
@@ -39,7 +40,7 @@ struct cnxk_dpi_conf {
 
 struct cnxk_dpi_vf_s {
 	struct roc_dpi rdpi;
-	struct cnxk_dpi_conf conf;
+	struct cnxk_dpi_conf conf[MAX_VCHANS_PER_QUEUE];
 	struct rte_dma_stats stats;
 	uint16_t pending;
 	uint16_t pnum_words;
-- 
2.25.1


^ permalink raw reply	[flat|nested] 46+ messages in thread

* [PATCH v4 6/8] dma/cnxk: vchan support enhancement
  2023-08-21 17:49     ` [PATCH v4 " Amit Prakash Shukla
                         ` (3 preceding siblings ...)
  2023-08-21 17:49       ` [PATCH v4 5/8] dma/cnxk: increase vchan per queue to max 4 Amit Prakash Shukla
@ 2023-08-21 17:49       ` Amit Prakash Shukla
  2023-08-21 17:49       ` [PATCH v4 7/8] dma/cnxk: add completion ring tail wrap check Amit Prakash Shukla
                         ` (2 subsequent siblings)
  7 siblings, 0 replies; 46+ messages in thread
From: Amit Prakash Shukla @ 2023-08-21 17:49 UTC (permalink / raw)
  To: Vamsi Attunuru; +Cc: dev, jerinj, Amit Prakash Shukla

Code changes to realign dpi private structure based on vchan.
Changeset also resets DMA dev stats while starting dma device.

Signed-off-by: Amit Prakash Shukla <amitprakashs@marvell.com>
---
v2:
- Fix for bugs observed in v1.
- Squashed few commits.

v3:
- Resolved review suggestions.
- Code improvement.

v4:
- Resolved checkpatch warnings.

 drivers/dma/cnxk/cnxk_dmadev.c | 210 ++++++++++++++++++++++++---------
 drivers/dma/cnxk/cnxk_dmadev.h |  18 +--
 2 files changed, 165 insertions(+), 63 deletions(-)

diff --git a/drivers/dma/cnxk/cnxk_dmadev.c b/drivers/dma/cnxk/cnxk_dmadev.c
index 7d83b70e8b..9fb3bb264a 100644
--- a/drivers/dma/cnxk/cnxk_dmadev.c
+++ b/drivers/dma/cnxk/cnxk_dmadev.c
@@ -16,35 +16,79 @@
 
 #include <cnxk_dmadev.h>
 
+static int cnxk_stats_reset(struct rte_dma_dev *dev, uint16_t vchan);
+
 static int
 cnxk_dmadev_info_get(const struct rte_dma_dev *dev, struct rte_dma_info *dev_info, uint32_t size)
 {
-	RTE_SET_USED(dev);
+	struct cnxk_dpi_vf_s *dpivf = dev->fp_obj->dev_private;
 	RTE_SET_USED(size);
 
 	dev_info->max_vchans = MAX_VCHANS_PER_QUEUE;
-	dev_info->nb_vchans = MAX_VCHANS_PER_QUEUE;
+	dev_info->nb_vchans = dpivf->num_vchans;
 	dev_info->dev_capa = RTE_DMA_CAPA_MEM_TO_MEM | RTE_DMA_CAPA_MEM_TO_DEV |
 			     RTE_DMA_CAPA_DEV_TO_MEM | RTE_DMA_CAPA_DEV_TO_DEV |
 			     RTE_DMA_CAPA_OPS_COPY | RTE_DMA_CAPA_OPS_COPY_SG;
 	dev_info->max_desc = DPI_MAX_DESC;
-	dev_info->min_desc = 2;
+	dev_info->min_desc = DPI_MIN_DESC;
 	dev_info->max_sges = DPI_MAX_POINTER;
 
 	return 0;
 }
 
+static int
+cnxk_dmadev_vchan_free(struct cnxk_dpi_vf_s *dpivf, uint16_t vchan)
+{
+	struct cnxk_dpi_conf *dpi_conf;
+	uint16_t num_vchans;
+	uint16_t max_desc;
+	int i, j;
+
+	if (vchan == RTE_DMA_ALL_VCHAN) {
+		num_vchans = dpivf->num_vchans;
+		i = 0;
+	} else {
+		if (vchan >= MAX_VCHANS_PER_QUEUE)
+			return -EINVAL;
+
+		num_vchans = vchan + 1;
+		i = vchan;
+	}
+
+	for (; i < num_vchans; i++) {
+		dpi_conf = &dpivf->conf[i];
+		max_desc = dpi_conf->c_desc.max_cnt;
+		if (dpi_conf->c_desc.compl_ptr) {
+			for (j = 0; j < max_desc; j++)
+				rte_free(dpi_conf->c_desc.compl_ptr[j]);
+		}
+
+		rte_free(dpi_conf->c_desc.compl_ptr);
+		dpi_conf->c_desc.compl_ptr = NULL;
+	}
+
+	return 0;
+}
+
 static int
 cnxk_dmadev_configure(struct rte_dma_dev *dev, const struct rte_dma_conf *conf, uint32_t conf_sz)
 {
 	struct cnxk_dpi_vf_s *dpivf = NULL;
 	int rc = 0;
 
-	RTE_SET_USED(conf);
 	RTE_SET_USED(conf_sz);
 
 	dpivf = dev->fp_obj->dev_private;
 
+	/* Accept only number of vchans as config from application. */
+	if (!(dpivf->flag & CNXK_DPI_DEV_START)) {
+		/* After config function, vchan setup function has to be called.
+		 * Free up vchan memory if any, before configuring num_vchans.
+		 */
+		cnxk_dmadev_vchan_free(dpivf, RTE_DMA_ALL_VCHAN);
+		dpivf->num_vchans = conf->nb_vchans;
+	}
+
 	if (dpivf->flag & CNXK_DPI_DEV_CONFIG)
 		return rc;
 
@@ -73,7 +117,7 @@ cnxk_dmadev_vchan_setup(struct rte_dma_dev *dev, uint16_t vchan,
 
 	RTE_SET_USED(conf_sz);
 
-	if (dpivf->flag & CNXK_DPI_VCHAN_CONFIG)
+	if (dpivf->flag & CNXK_DPI_DEV_START)
 		return 0;
 
 	header->cn9k.pt = DPI_HDR_PT_ZBW_CA;
@@ -112,6 +156,9 @@ cnxk_dmadev_vchan_setup(struct rte_dma_dev *dev, uint16_t vchan,
 		header->cn9k.pvfe = 0;
 	};
 
+	/* Free up descriptor memory before allocating. */
+	cnxk_dmadev_vchan_free(dpivf, vchan);
+
 	max_desc = conf->nb_desc;
 	if (!rte_is_power_of_2(max_desc))
 		max_desc = rte_align32pow2(max_desc);
@@ -130,15 +177,15 @@ cnxk_dmadev_vchan_setup(struct rte_dma_dev *dev, uint16_t vchan,
 	for (i = 0; i < max_desc; i++) {
 		dpi_conf->c_desc.compl_ptr[i] =
 			rte_zmalloc(NULL, sizeof(struct cnxk_dpi_compl_s), 0);
+		if (!dpi_conf->c_desc.compl_ptr[i]) {
+			plt_err("Failed to allocate for descriptor memory");
+			return -ENOMEM;
+		}
+
 		dpi_conf->c_desc.compl_ptr[i]->cdata = DPI_REQ_CDATA;
 	}
 
 	dpi_conf->c_desc.max_cnt = (max_desc - 1);
-	dpi_conf->c_desc.head = 0;
-	dpi_conf->c_desc.tail = 0;
-	dpivf->pnum_words = 0;
-	dpivf->pending = 0;
-	dpivf->flag |= CNXK_DPI_VCHAN_CONFIG;
 
 	return 0;
 }
@@ -156,7 +203,7 @@ cn10k_dmadev_vchan_setup(struct rte_dma_dev *dev, uint16_t vchan,
 
 	RTE_SET_USED(conf_sz);
 
-	if (dpivf->flag & CNXK_DPI_VCHAN_CONFIG)
+	if (dpivf->flag & CNXK_DPI_DEV_START)
 		return 0;
 
 	header->cn10k.pt = DPI_HDR_PT_ZBW_CA;
@@ -195,6 +242,9 @@ cn10k_dmadev_vchan_setup(struct rte_dma_dev *dev, uint16_t vchan,
 		header->cn10k.pvfe = 0;
 	};
 
+	/* Free up descriptor memory before allocating. */
+	cnxk_dmadev_vchan_free(dpivf, vchan);
+
 	max_desc = conf->nb_desc;
 	if (!rte_is_power_of_2(max_desc))
 		max_desc = rte_align32pow2(max_desc);
@@ -213,15 +263,14 @@ cn10k_dmadev_vchan_setup(struct rte_dma_dev *dev, uint16_t vchan,
 	for (i = 0; i < max_desc; i++) {
 		dpi_conf->c_desc.compl_ptr[i] =
 			rte_zmalloc(NULL, sizeof(struct cnxk_dpi_compl_s), 0);
+		if (!dpi_conf->c_desc.compl_ptr[i]) {
+			plt_err("Failed to allocate for descriptor memory");
+			return -ENOMEM;
+		}
 		dpi_conf->c_desc.compl_ptr[i]->cdata = DPI_REQ_CDATA;
 	}
 
 	dpi_conf->c_desc.max_cnt = (max_desc - 1);
-	dpi_conf->c_desc.head = 0;
-	dpi_conf->c_desc.tail = 0;
-	dpivf->pnum_words = 0;
-	dpivf->pending = 0;
-	dpivf->flag |= CNXK_DPI_VCHAN_CONFIG;
 
 	return 0;
 }
@@ -230,13 +279,27 @@ static int
 cnxk_dmadev_start(struct rte_dma_dev *dev)
 {
 	struct cnxk_dpi_vf_s *dpivf = dev->fp_obj->dev_private;
+	struct cnxk_dpi_conf *dpi_conf;
+	int i, j;
 
 	if (dpivf->flag & CNXK_DPI_DEV_START)
 		return 0;
 
-	dpivf->desc_idx = 0;
-	dpivf->pending = 0;
-	dpivf->pnum_words = 0;
+	for (i = 0; i < dpivf->num_vchans; i++) {
+		dpi_conf = &dpivf->conf[i];
+		dpi_conf->c_desc.head = 0;
+		dpi_conf->c_desc.tail = 0;
+		dpi_conf->pnum_words = 0;
+		dpi_conf->pending = 0;
+		dpi_conf->desc_idx = 0;
+		for (j = 0; j < dpi_conf->c_desc.max_cnt; j++) {
+			if (dpi_conf->c_desc.compl_ptr[j])
+				dpi_conf->c_desc.compl_ptr[j]->cdata = DPI_REQ_CDATA;
+		}
+
+		cnxk_stats_reset(dev, i);
+	}
+
 	roc_dpi_enable(&dpivf->rdpi);
 
 	dpivf->flag |= CNXK_DPI_DEV_START;
@@ -250,7 +313,6 @@ cnxk_dmadev_stop(struct rte_dma_dev *dev)
 	struct cnxk_dpi_vf_s *dpivf = dev->fp_obj->dev_private;
 
 	roc_dpi_disable(&dpivf->rdpi);
-
 	dpivf->flag &= ~CNXK_DPI_DEV_START;
 
 	return 0;
@@ -262,8 +324,10 @@ cnxk_dmadev_close(struct rte_dma_dev *dev)
 	struct cnxk_dpi_vf_s *dpivf = dev->fp_obj->dev_private;
 
 	roc_dpi_disable(&dpivf->rdpi);
+	cnxk_dmadev_vchan_free(dpivf, RTE_DMA_ALL_VCHAN);
 	roc_dpi_dev_fini(&dpivf->rdpi);
 
+	/* Clear all flags as we close the device. */
 	dpivf->flag = 0;
 
 	return 0;
@@ -404,13 +468,13 @@ cnxk_dmadev_copy(void *dev_private, uint16_t vchan, rte_iova_t src, rte_iova_t d
 	rte_wmb();
 	if (flags & RTE_DMA_OP_FLAG_SUBMIT) {
 		plt_write64(num_words, dpivf->rdpi.rbase + DPI_VDMA_DBELL);
-		dpivf->stats.submitted++;
+		dpi_conf->stats.submitted++;
 	} else {
-		dpivf->pnum_words += num_words;
-		dpivf->pending++;
+		dpi_conf->pnum_words += num_words;
+		dpi_conf->pending++;
 	}
 
-	return (dpivf->desc_idx++);
+	return (dpi_conf->desc_idx++);
 }
 
 static int
@@ -471,13 +535,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);
-		dpivf->stats.submitted += nb_src;
+		dpi_conf->stats.submitted += nb_src;
 	} else {
-		dpivf->pnum_words += num_words;
-		dpivf->pending++;
+		dpi_conf->pnum_words += num_words;
+		dpi_conf->pending++;
 	}
 
-	return (dpivf->desc_idx++);
+	return (dpi_conf->desc_idx++);
 }
 
 static int
@@ -522,13 +586,13 @@ cn10k_dmadev_copy(void *dev_private, uint16_t vchan, rte_iova_t src, rte_iova_t
 	if (flags & RTE_DMA_OP_FLAG_SUBMIT) {
 		rte_wmb();
 		plt_write64(num_words, dpivf->rdpi.rbase + DPI_VDMA_DBELL);
-		dpivf->stats.submitted++;
+		dpi_conf->stats.submitted++;
 	} else {
-		dpivf->pnum_words += num_words;
-		dpivf->pending++;
+		dpi_conf->pnum_words += num_words;
+		dpi_conf->pending++;
 	}
 
-	return dpivf->desc_idx++;
+	return dpi_conf->desc_idx++;
 }
 
 static int
@@ -580,13 +644,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);
-		dpivf->stats.submitted += nb_src;
+		dpi_conf->stats.submitted += nb_src;
 	} else {
-		dpivf->pnum_words += num_words;
-		dpivf->pending++;
+		dpi_conf->pnum_words += num_words;
+		dpi_conf->pending++;
 	}
 
-	return (dpivf->desc_idx++);
+	return (dpi_conf->desc_idx++);
 }
 
 static uint16_t
@@ -606,7 +670,7 @@ cnxk_dmadev_completed(void *dev_private, uint16_t vchan, const uint16_t nb_cpls,
 			if (comp_ptr->cdata == DPI_REQ_CDATA)
 				break;
 			*has_error = 1;
-			dpivf->stats.errors++;
+			dpi_conf->stats.errors++;
 			STRM_INC(*c_desc, head);
 			break;
 		}
@@ -615,8 +679,8 @@ cnxk_dmadev_completed(void *dev_private, uint16_t vchan, const uint16_t nb_cpls,
 		STRM_INC(*c_desc, head);
 	}
 
-	dpivf->stats.completed += cnt;
-	*last_idx = dpivf->stats.completed - 1;
+	dpi_conf->stats.completed += cnt;
+	*last_idx = dpi_conf->stats.completed - 1;
 
 	return cnt;
 }
@@ -640,14 +704,14 @@ cnxk_dmadev_completed_status(void *dev_private, uint16_t vchan, const uint16_t n
 			if (status[cnt] == DPI_REQ_CDATA)
 				break;
 
-			dpivf->stats.errors++;
+			dpi_conf->stats.errors++;
 		}
 		comp_ptr->cdata = DPI_REQ_CDATA;
 		STRM_INC(*c_desc, head);
 	}
 
-	dpivf->stats.completed += cnt;
-	*last_idx = dpivf->stats.completed - 1;
+	dpi_conf->stats.completed += cnt;
+	*last_idx = dpi_conf->stats.completed - 1;
 
 	return cnt;
 }
@@ -660,26 +724,28 @@ cnxk_damdev_burst_capacity(const void *dev_private, uint16_t vchan)
 	uint16_t burst_cap;
 
 	burst_cap = dpi_conf->c_desc.max_cnt -
-		    ((dpivf->stats.submitted - dpivf->stats.completed) + dpivf->pending) + 1;
+		    ((dpi_conf->stats.submitted - dpi_conf->stats.completed) + dpi_conf->pending) +
+		    1;
 
 	return burst_cap;
 }
 
 static int
-cnxk_dmadev_submit(void *dev_private, uint16_t vchan __rte_unused)
+cnxk_dmadev_submit(void *dev_private, uint16_t vchan)
 {
 	struct cnxk_dpi_vf_s *dpivf = dev_private;
-	uint32_t num_words = dpivf->pnum_words;
+	struct cnxk_dpi_conf *dpi_conf = &dpivf->conf[vchan];
+	uint32_t num_words = dpi_conf->pnum_words;
 
-	if (!dpivf->pnum_words)
+	if (!dpi_conf->pnum_words)
 		return 0;
 
 	rte_wmb();
 	plt_write64(num_words, dpivf->rdpi.rbase + DPI_VDMA_DBELL);
 
-	dpivf->stats.submitted += dpivf->pending;
-	dpivf->pnum_words = 0;
-	dpivf->pending = 0;
+	dpi_conf->stats.submitted += dpi_conf->pending;
+	dpi_conf->pnum_words = 0;
+	dpi_conf->pending = 0;
 
 	return 0;
 }
@@ -689,25 +755,59 @@ cnxk_stats_get(const struct rte_dma_dev *dev, uint16_t vchan, struct rte_dma_sta
 	       uint32_t size)
 {
 	struct cnxk_dpi_vf_s *dpivf = dev->fp_obj->dev_private;
-	struct rte_dma_stats *stats = &dpivf->stats;
-
-	RTE_SET_USED(vchan);
+	struct cnxk_dpi_conf *dpi_conf;
+	int i;
 
 	if (size < sizeof(rte_stats))
 		return -EINVAL;
 	if (rte_stats == NULL)
 		return -EINVAL;
 
-	*rte_stats = *stats;
+	/* Stats of all vchans requested. */
+	if (vchan == RTE_DMA_ALL_VCHAN) {
+		for (i = 0; i < dpivf->num_vchans; i++) {
+			dpi_conf = &dpivf->conf[i];
+			rte_stats->submitted += dpi_conf->stats.submitted;
+			rte_stats->completed += dpi_conf->stats.completed;
+			rte_stats->errors += dpi_conf->stats.errors;
+		}
+
+		goto done;
+	}
+
+	if (vchan >= MAX_VCHANS_PER_QUEUE)
+		return -EINVAL;
+
+	dpi_conf = &dpivf->conf[vchan];
+	*rte_stats = dpi_conf->stats;
+
+done:
 	return 0;
 }
 
 static int
-cnxk_stats_reset(struct rte_dma_dev *dev, uint16_t vchan __rte_unused)
+cnxk_stats_reset(struct rte_dma_dev *dev, uint16_t vchan)
 {
 	struct cnxk_dpi_vf_s *dpivf = dev->fp_obj->dev_private;
+	struct cnxk_dpi_conf *dpi_conf;
+	int i;
+
+	/* clear stats of all vchans. */
+	if (vchan == RTE_DMA_ALL_VCHAN) {
+		for (i = 0; i < dpivf->num_vchans; i++) {
+			dpi_conf = &dpivf->conf[i];
+			dpi_conf->stats = (struct rte_dma_stats){0};
+		}
+
+		return 0;
+	}
+
+	if (vchan >= MAX_VCHANS_PER_QUEUE)
+		return -EINVAL;
+
+	dpi_conf = &dpivf->conf[vchan];
+	dpi_conf->stats = (struct rte_dma_stats){0};
 
-	dpivf->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 4693960a19..f375143b16 100644
--- a/drivers/dma/cnxk/cnxk_dmadev.h
+++ b/drivers/dma/cnxk/cnxk_dmadev.h
@@ -10,6 +10,7 @@
 #define STRM_INC(s, var)     ((s).var = ((s).var + 1) & (s).max_cnt)
 #define STRM_DEC(s, var)     ((s).var = ((s).var - 1) == -1 ? (s).max_cnt : ((s).var - 1))
 #define DPI_MAX_DESC	     1024
+#define DPI_MIN_DESC	     2
 #define MAX_VCHANS_PER_QUEUE 4
 
 /* Set Completion data to 0xFF when request submitted,
@@ -17,9 +18,8 @@
  */
 #define DPI_REQ_CDATA 0xFF
 
-#define CNXK_DPI_DEV_CONFIG   (1ULL << 0)
-#define CNXK_DPI_VCHAN_CONFIG (1ULL << 1)
-#define CNXK_DPI_DEV_START    (1ULL << 2)
+#define CNXK_DPI_DEV_CONFIG (1ULL << 0)
+#define CNXK_DPI_DEV_START  (1ULL << 1)
 
 struct cnxk_dpi_compl_s {
 	uint64_t cdata;
@@ -36,16 +36,18 @@ struct cnxk_dpi_cdesc_data_s {
 struct cnxk_dpi_conf {
 	union dpi_instr_hdr_s hdr;
 	struct cnxk_dpi_cdesc_data_s c_desc;
+	uint16_t pnum_words;
+	uint16_t pending;
+	uint16_t desc_idx;
+	uint16_t pad0;
+	struct rte_dma_stats stats;
 };
 
 struct cnxk_dpi_vf_s {
 	struct roc_dpi rdpi;
 	struct cnxk_dpi_conf conf[MAX_VCHANS_PER_QUEUE];
-	struct rte_dma_stats stats;
-	uint16_t pending;
-	uint16_t pnum_words;
-	uint16_t desc_idx;
+	uint16_t num_vchans;
 	uint16_t flag;
-};
+} __plt_cache_aligned;
 
 #endif
-- 
2.25.1


^ permalink raw reply	[flat|nested] 46+ messages in thread

* [PATCH v4 7/8] dma/cnxk: add completion ring tail wrap check
  2023-08-21 17:49     ` [PATCH v4 " Amit Prakash Shukla
                         ` (4 preceding siblings ...)
  2023-08-21 17:49       ` [PATCH v4 6/8] dma/cnxk: vchan support enhancement Amit Prakash Shukla
@ 2023-08-21 17:49       ` Amit Prakash Shukla
  2023-08-21 17:49       ` [PATCH v4 8/8] dma/cnxk: track last index return value Amit Prakash Shukla
  2023-08-23 11:15       ` [PATCH v5 01/12] common/cnxk: use unique name for DPI memzone Amit Prakash Shukla
  7 siblings, 0 replies; 46+ messages in thread
From: Amit Prakash Shukla @ 2023-08-21 17:49 UTC (permalink / raw)
  To: Vamsi Attunuru; +Cc: dev, jerinj

From: Vamsi Attunuru <vattunuru@marvell.com>

Adds a check to avoid tail wrap when completion desc ring
is full. Also patch increase max desc size to 2048.

Signed-off-by: Vamsi Attunuru <vattunuru@marvell.com>
---
v2:
- Fix for bugs observed in v1.
- Squashed few commits.

v3:
- Resolved review suggestions.
- Code improvement.

v4:
- Resolved checkpatch warnings.

 drivers/dma/cnxk/cnxk_dmadev.c | 22 ++++++++++++++++++++--
 drivers/dma/cnxk/cnxk_dmadev.h |  2 +-
 2 files changed, 21 insertions(+), 3 deletions(-)

diff --git a/drivers/dma/cnxk/cnxk_dmadev.c b/drivers/dma/cnxk/cnxk_dmadev.c
index 9fb3bb264a..288606bb3d 100644
--- a/drivers/dma/cnxk/cnxk_dmadev.c
+++ b/drivers/dma/cnxk/cnxk_dmadev.c
@@ -434,6 +434,11 @@ cnxk_dmadev_copy(void *dev_private, uint16_t vchan, rte_iova_t src, rte_iova_t d
 	header->cn9k.ptr = (uint64_t)comp_ptr;
 	STRM_INC(dpi_conf->c_desc, tail);
 
+	if (unlikely(dpi_conf->c_desc.tail == dpi_conf->c_desc.head)) {
+		STRM_DEC(dpi_conf->c_desc, tail);
+		return -ENOSPC;
+	}
+
 	header->cn9k.nfst = 1;
 	header->cn9k.nlst = 1;
 
@@ -494,6 +499,11 @@ cnxk_dmadev_copy_sg(void *dev_private, uint16_t vchan, const struct rte_dma_sge
 	header->cn9k.ptr = (uint64_t)comp_ptr;
 	STRM_INC(dpi_conf->c_desc, tail);
 
+	if (unlikely(dpi_conf->c_desc.tail == dpi_conf->c_desc.head)) {
+		STRM_DEC(dpi_conf->c_desc, tail);
+		return -ENOSPC;
+	}
+
 	/*
 	 * For inbound case, src pointers are last pointers.
 	 * For all other cases, src pointers are first pointers.
@@ -561,6 +571,11 @@ cn10k_dmadev_copy(void *dev_private, uint16_t vchan, rte_iova_t src, rte_iova_t
 	header->cn10k.ptr = (uint64_t)comp_ptr;
 	STRM_INC(dpi_conf->c_desc, tail);
 
+	if (unlikely(dpi_conf->c_desc.tail == dpi_conf->c_desc.head)) {
+		STRM_DEC(dpi_conf->c_desc, tail);
+		return -ENOSPC;
+	}
+
 	header->cn10k.nfst = 1;
 	header->cn10k.nlst = 1;
 
@@ -613,6 +628,11 @@ cn10k_dmadev_copy_sg(void *dev_private, uint16_t vchan, const struct rte_dma_sge
 	header->cn10k.ptr = (uint64_t)comp_ptr;
 	STRM_INC(dpi_conf->c_desc, tail);
 
+	if (unlikely(dpi_conf->c_desc.tail == dpi_conf->c_desc.head)) {
+		STRM_DEC(dpi_conf->c_desc, tail);
+		return -ENOSPC;
+	}
+
 	header->cn10k.nfst = nb_src & DPI_MAX_POINTER;
 	header->cn10k.nlst = nb_dst & DPI_MAX_POINTER;
 	fptr = &src[0];
@@ -695,8 +715,6 @@ cnxk_dmadev_completed_status(void *dev_private, uint16_t vchan, const uint16_t n
 	struct cnxk_dpi_compl_s *comp_ptr;
 	int cnt;
 
-	RTE_SET_USED(last_idx);
-
 	for (cnt = 0; cnt < nb_cpls; cnt++) {
 		comp_ptr = c_desc->compl_ptr[c_desc->head];
 		status[cnt] = comp_ptr->cdata;
diff --git a/drivers/dma/cnxk/cnxk_dmadev.h b/drivers/dma/cnxk/cnxk_dmadev.h
index f375143b16..9c6c898d23 100644
--- a/drivers/dma/cnxk/cnxk_dmadev.h
+++ b/drivers/dma/cnxk/cnxk_dmadev.h
@@ -9,7 +9,7 @@
 #define DPI_MAX_POINTER	     15
 #define STRM_INC(s, var)     ((s).var = ((s).var + 1) & (s).max_cnt)
 #define STRM_DEC(s, var)     ((s).var = ((s).var - 1) == -1 ? (s).max_cnt : ((s).var - 1))
-#define DPI_MAX_DESC	     1024
+#define DPI_MAX_DESC	     2048
 #define DPI_MIN_DESC	     2
 #define MAX_VCHANS_PER_QUEUE 4
 
-- 
2.25.1


^ permalink raw reply	[flat|nested] 46+ messages in thread

* [PATCH v4 8/8] dma/cnxk: track last index return value
  2023-08-21 17:49     ` [PATCH v4 " Amit Prakash Shukla
                         ` (5 preceding siblings ...)
  2023-08-21 17:49       ` [PATCH v4 7/8] dma/cnxk: add completion ring tail wrap check Amit Prakash Shukla
@ 2023-08-21 17:49       ` Amit Prakash Shukla
  2023-08-23 11:15       ` [PATCH v5 01/12] common/cnxk: use unique name for DPI memzone Amit Prakash Shukla
  7 siblings, 0 replies; 46+ messages in thread
From: Amit Prakash Shukla @ 2023-08-21 17:49 UTC (permalink / raw)
  To: Vamsi Attunuru; +Cc: dev, jerinj

From: Vamsi Attunuru <vattunuru@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 changes.

Signed-off-by: Vamsi Attunuru <vattunuru@marvell.com>
---
v2:
- Fix for bugs observed in v1.
- Squashed few commits.

v3:
- Resolved review suggestions.
- Code improvement.

v4:
- Resolved checkpatch warnings.

 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


^ permalink raw reply	[flat|nested] 46+ messages in thread

* [PATCH v5 01/12] common/cnxk: use unique name for DPI memzone
  2023-08-21 17:49     ` [PATCH v4 " Amit Prakash Shukla
                         ` (6 preceding siblings ...)
  2023-08-21 17:49       ` [PATCH v4 8/8] dma/cnxk: track last index return value Amit Prakash Shukla
@ 2023-08-23 11:15       ` Amit Prakash Shukla
  2023-08-23 11:15         ` [PATCH v5 02/12] dma/cnxk: support for burst capacity Amit Prakash Shukla
                           ` (11 more replies)
  7 siblings, 12 replies; 46+ messages in thread
From: Amit Prakash Shukla @ 2023-08-23 11:15 UTC (permalink / raw)
  To: Nithin Dabilpuram, Kiran Kumar K, Sunil Kumar Kori, Satha Rao
  Cc: dev, jerinj, Amit Prakash Shukla, stable, Radha Mohan Chintakuntla

roc_dpi was using vfid as part of name for memzone allocation.
This led to memzone allocation failure in case of multiple
physical functions. vfid is not unique by itself since multiple
physical functions can have the same virtual function indices.
So use complete DBDF as part of memzone name to make it unique.

Fixes: b6e395692b6d ("common/cnxk: add DPI DMA support")
Cc: stable@dpdk.org

Signed-off-by: Radha Mohan Chintakuntla <radhac@marvell.com>
Signed-off-by: Amit Prakash Shukla <amitprakashs@marvell.com>
---
v2:
- Fix for bugs observed in v1.
- Squashed few commits.

v3:
- Resolved review suggestions.
- Code improvement.

v4:
- Resolved checkpatch warnings.

v5:
- Updated commit message.
- Split the commits.

 drivers/common/cnxk/roc_dpi.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/drivers/common/cnxk/roc_dpi.c b/drivers/common/cnxk/roc_dpi.c
index 93c8318a3d..0e2f803077 100644
--- a/drivers/common/cnxk/roc_dpi.c
+++ b/drivers/common/cnxk/roc_dpi.c
@@ -81,10 +81,10 @@ roc_dpi_configure(struct roc_dpi *roc_dpi)
 		return rc;
 	}
 
-	snprintf(name, sizeof(name), "dpimem%d", roc_dpi->vfid);
+	snprintf(name, sizeof(name), "dpimem%d:%d:%d:%d", pci_dev->addr.domain, pci_dev->addr.bus,
+		 pci_dev->addr.devid, pci_dev->addr.function);
 	buflen = DPI_CMD_QUEUE_SIZE * DPI_CMD_QUEUE_BUFS;
-	dpi_mz = plt_memzone_reserve_aligned(name, buflen, 0,
-					     DPI_CMD_QUEUE_SIZE);
+	dpi_mz = plt_memzone_reserve_aligned(name, buflen, 0, DPI_CMD_QUEUE_SIZE);
 	if (dpi_mz == NULL) {
 		plt_err("dpi memzone reserve failed");
 		rc = -ENOMEM;
-- 
2.25.1


^ permalink raw reply	[flat|nested] 46+ messages in thread

* [PATCH v5 02/12] dma/cnxk: support for burst capacity
  2023-08-23 11:15       ` [PATCH v5 01/12] common/cnxk: use unique name for DPI memzone Amit Prakash Shukla
@ 2023-08-23 11:15         ` Amit Prakash Shukla
  2023-08-23 11:15         ` [PATCH v5 03/12] dma/cnxk: set dmadev to ready state Amit Prakash Shukla
                           ` (10 subsequent siblings)
  11 siblings, 0 replies; 46+ messages in thread
From: Amit Prakash Shukla @ 2023-08-23 11:15 UTC (permalink / raw)
  To: Vamsi Attunuru; +Cc: dev, jerinj, Amit Prakash Shukla

Adds support for the burst capacity. Call to the function return
number of vacant space in descriptor ring for the current burst.

Signed-off-by: Amit Prakash Shukla <amitprakashs@marvell.com>
---
v2:
- Fix for bugs observed in v1.
- Squashed few commits.

v3:
- Resolved review suggestions.
- Code improvement.

v4:
- Resolved checkpatch warnings.

v5:
- Updated commit message.
- Split the commits.

 drivers/dma/cnxk/cnxk_dmadev.c | 125 ++++++++++++++++++++++-----------
 drivers/dma/cnxk/cnxk_dmadev.h |   6 +-
 2 files changed, 87 insertions(+), 44 deletions(-)

diff --git a/drivers/dma/cnxk/cnxk_dmadev.c b/drivers/dma/cnxk/cnxk_dmadev.c
index a6f4a31e0e..f06c979b9c 100644
--- a/drivers/dma/cnxk/cnxk_dmadev.c
+++ b/drivers/dma/cnxk/cnxk_dmadev.c
@@ -108,6 +108,7 @@ cnxk_dmadev_vchan_setup(struct rte_dma_dev *dev, uint16_t vchan,
 	dpivf->conf.c_desc.max_cnt = DPI_MAX_DESC;
 	dpivf->conf.c_desc.head = 0;
 	dpivf->conf.c_desc.tail = 0;
+	dpivf->pending = 0;
 
 	return 0;
 }
@@ -164,6 +165,7 @@ cn10k_dmadev_vchan_setup(struct rte_dma_dev *dev, uint16_t vchan,
 	dpivf->conf.c_desc.max_cnt = DPI_MAX_DESC;
 	dpivf->conf.c_desc.head = 0;
 	dpivf->conf.c_desc.tail = 0;
+	dpivf->pending = 0;
 
 	return 0;
 }
@@ -174,7 +176,8 @@ cnxk_dmadev_start(struct rte_dma_dev *dev)
 	struct cnxk_dpi_vf_s *dpivf = dev->fp_obj->dev_private;
 
 	dpivf->desc_idx = 0;
-	dpivf->num_words = 0;
+	dpivf->pending = 0;
+	dpivf->pnum_words = 0;
 	roc_dpi_enable(&dpivf->rdpi);
 
 	return 0;
@@ -294,7 +297,7 @@ cnxk_dmadev_copy(void *dev_private, uint16_t vchan, rte_iova_t src,
 	comp_ptr = dpivf->conf.c_desc.compl_ptr[dpivf->conf.c_desc.tail];
 	comp_ptr->cdata = DPI_REQ_CDATA;
 	header->cn9k.ptr = (uint64_t)comp_ptr;
-	STRM_INC(dpivf->conf.c_desc);
+	STRM_INC(dpivf->conf.c_desc, tail);
 
 	header->cn9k.nfst = 1;
 	header->cn9k.nlst = 1;
@@ -322,17 +325,21 @@ cnxk_dmadev_copy(void *dev_private, uint16_t vchan, rte_iova_t src,
 	dpivf->cmd[num_words++] = lptr;
 
 	rc = __dpi_queue_write(&dpivf->rdpi, dpivf->cmd, num_words);
-	if (!rc) {
-		if (flags & RTE_DMA_OP_FLAG_SUBMIT) {
-			rte_wmb();
-			plt_write64(num_words,
-				    dpivf->rdpi.rbase + DPI_VDMA_DBELL);
-			dpivf->stats.submitted++;
-		}
-		dpivf->num_words += num_words;
+	if (unlikely(rc)) {
+		STRM_DEC(dpivf->conf.c_desc, tail);
+		return rc;
 	}
 
-	return dpivf->desc_idx++;
+	if (flags & RTE_DMA_OP_FLAG_SUBMIT) {
+		rte_wmb();
+		plt_write64(num_words, dpivf->rdpi.rbase + DPI_VDMA_DBELL);
+		dpivf->stats.submitted++;
+	} else {
+		dpivf->pnum_words += num_words;
+		dpivf->pending++;
+	}
+
+	return (dpivf->desc_idx++);
 }
 
 static int
@@ -353,7 +360,7 @@ cnxk_dmadev_copy_sg(void *dev_private, uint16_t vchan,
 	comp_ptr = dpivf->conf.c_desc.compl_ptr[dpivf->conf.c_desc.tail];
 	comp_ptr->cdata = DPI_REQ_CDATA;
 	header->cn9k.ptr = (uint64_t)comp_ptr;
-	STRM_INC(dpivf->conf.c_desc);
+	STRM_INC(dpivf->conf.c_desc, tail);
 
 	/*
 	 * For inbound case, src pointers are last pointers.
@@ -388,17 +395,21 @@ cnxk_dmadev_copy_sg(void *dev_private, uint16_t vchan,
 	}
 
 	rc = __dpi_queue_write(&dpivf->rdpi, dpivf->cmd, num_words);
-	if (!rc) {
-		if (flags & RTE_DMA_OP_FLAG_SUBMIT) {
-			rte_wmb();
-			plt_write64(num_words,
-				    dpivf->rdpi.rbase + DPI_VDMA_DBELL);
-			dpivf->stats.submitted += nb_src;
-		}
-		dpivf->num_words += num_words;
+	if (unlikely(rc)) {
+		STRM_DEC(dpivf->conf.c_desc, tail);
+		return rc;
 	}
 
-	return (rc < 0) ? rc : dpivf->desc_idx++;
+	if (flags & RTE_DMA_OP_FLAG_SUBMIT) {
+		rte_wmb();
+		plt_write64(num_words, dpivf->rdpi.rbase + DPI_VDMA_DBELL);
+		dpivf->stats.submitted += nb_src;
+	} else {
+		dpivf->pnum_words += num_words;
+		dpivf->pending++;
+	}
+
+	return (dpivf->desc_idx++);
 }
 
 static int
@@ -417,7 +428,7 @@ cn10k_dmadev_copy(void *dev_private, uint16_t vchan, rte_iova_t src,
 	comp_ptr = dpivf->conf.c_desc.compl_ptr[dpivf->conf.c_desc.tail];
 	comp_ptr->cdata = DPI_REQ_CDATA;
 	header->cn10k.ptr = (uint64_t)comp_ptr;
-	STRM_INC(dpivf->conf.c_desc);
+	STRM_INC(dpivf->conf.c_desc, tail);
 
 	header->cn10k.nfst = 1;
 	header->cn10k.nlst = 1;
@@ -436,14 +447,18 @@ cn10k_dmadev_copy(void *dev_private, uint16_t vchan, rte_iova_t src,
 	dpivf->cmd[num_words++] = lptr;
 
 	rc = __dpi_queue_write(&dpivf->rdpi, dpivf->cmd, num_words);
-	if (!rc) {
-		if (flags & RTE_DMA_OP_FLAG_SUBMIT) {
-			rte_wmb();
-			plt_write64(num_words,
-				    dpivf->rdpi.rbase + DPI_VDMA_DBELL);
-			dpivf->stats.submitted++;
-		}
-		dpivf->num_words += num_words;
+	if (unlikely(rc)) {
+		STRM_DEC(dpivf->conf.c_desc, tail);
+		return rc;
+	}
+
+	if (flags & RTE_DMA_OP_FLAG_SUBMIT) {
+		rte_wmb();
+		plt_write64(num_words, dpivf->rdpi.rbase + DPI_VDMA_DBELL);
+		dpivf->stats.submitted++;
+	} else {
+		dpivf->pnum_words += num_words;
+		dpivf->pending++;
 	}
 
 	return dpivf->desc_idx++;
@@ -467,7 +482,7 @@ cn10k_dmadev_copy_sg(void *dev_private, uint16_t vchan,
 	comp_ptr = dpivf->conf.c_desc.compl_ptr[dpivf->conf.c_desc.tail];
 	comp_ptr->cdata = DPI_REQ_CDATA;
 	header->cn10k.ptr = (uint64_t)comp_ptr;
-	STRM_INC(dpivf->conf.c_desc);
+	STRM_INC(dpivf->conf.c_desc, tail);
 
 	header->cn10k.nfst = nb_src & 0xf;
 	header->cn10k.nlst = nb_dst & 0xf;
@@ -492,17 +507,21 @@ cn10k_dmadev_copy_sg(void *dev_private, uint16_t vchan,
 	}
 
 	rc = __dpi_queue_write(&dpivf->rdpi, dpivf->cmd, num_words);
-	if (!rc) {
-		if (flags & RTE_DMA_OP_FLAG_SUBMIT) {
-			rte_wmb();
-			plt_write64(num_words,
-				    dpivf->rdpi.rbase + DPI_VDMA_DBELL);
-			dpivf->stats.submitted += nb_src;
-		}
-		dpivf->num_words += num_words;
+	if (unlikely(rc)) {
+		STRM_DEC(dpivf->conf.c_desc, tail);
+		return rc;
+	}
+
+	if (flags & RTE_DMA_OP_FLAG_SUBMIT) {
+		rte_wmb();
+		plt_write64(num_words, dpivf->rdpi.rbase + DPI_VDMA_DBELL);
+		dpivf->stats.submitted += nb_src;
+	} else {
+		dpivf->pnum_words += num_words;
+		dpivf->pending++;
 	}
 
-	return (rc < 0) ? rc : dpivf->desc_idx++;
+	return (dpivf->desc_idx++);
 }
 
 static uint16_t
@@ -566,14 +585,35 @@ cnxk_dmadev_completed_status(void *dev_private, uint16_t vchan,
 	return cnt;
 }
 
+static uint16_t
+cnxk_damdev_burst_capacity(const void *dev_private, uint16_t vchan)
+{
+	const struct cnxk_dpi_vf_s *dpivf = (const struct cnxk_dpi_vf_s *)dev_private;
+	uint16_t burst_cap;
+
+	RTE_SET_USED(vchan);
+
+	burst_cap = dpivf->conf.c_desc.max_cnt -
+		    ((dpivf->stats.submitted - dpivf->stats.completed) + dpivf->pending) + 1;
+
+	return burst_cap;
+}
+
 static int
 cnxk_dmadev_submit(void *dev_private, uint16_t vchan __rte_unused)
 {
 	struct cnxk_dpi_vf_s *dpivf = dev_private;
+	uint32_t num_words = dpivf->pnum_words;
+
+	if (!dpivf->pnum_words)
+		return 0;
 
 	rte_wmb();
-	plt_write64(dpivf->num_words, dpivf->rdpi.rbase + DPI_VDMA_DBELL);
-	dpivf->stats.submitted++;
+	plt_write64(num_words, dpivf->rdpi.rbase + DPI_VDMA_DBELL);
+
+	dpivf->stats.submitted += dpivf->pending;
+	dpivf->pnum_words = 0;
+	dpivf->pending = 0;
 
 	return 0;
 }
@@ -666,6 +706,7 @@ cnxk_dmadev_probe(struct rte_pci_driver *pci_drv __rte_unused,
 	dmadev->fp_obj->submit = cnxk_dmadev_submit;
 	dmadev->fp_obj->completed = cnxk_dmadev_completed;
 	dmadev->fp_obj->completed_status = cnxk_dmadev_completed_status;
+	dmadev->fp_obj->burst_capacity = cnxk_damdev_burst_capacity;
 
 	if (pci_dev->id.subsystem_device_id == PCI_SUBSYSTEM_DEVID_CN10KA ||
 	    pci_dev->id.subsystem_device_id == PCI_SUBSYSTEM_DEVID_CNF10KA ||
diff --git a/drivers/dma/cnxk/cnxk_dmadev.h b/drivers/dma/cnxk/cnxk_dmadev.h
index e1f5694f50..943e9e3013 100644
--- a/drivers/dma/cnxk/cnxk_dmadev.h
+++ b/drivers/dma/cnxk/cnxk_dmadev.h
@@ -7,7 +7,8 @@
 #define DPI_MAX_POINTER		15
 #define DPI_QUEUE_STOP		0x0
 #define DPI_QUEUE_START		0x1
-#define STRM_INC(s)		((s).tail = ((s).tail + 1) % (s).max_cnt)
+#define STRM_INC(s, var) ((s).var = ((s).var + 1) & (s).max_cnt)
+#define STRM_DEC(s, var) ((s).var = ((s).var - 1) == -1 ? (s).max_cnt : ((s).var - 1))
 #define DPI_MAX_DESC		1024
 
 /* Set Completion data to 0xFF when request submitted,
@@ -37,7 +38,8 @@ struct cnxk_dpi_vf_s {
 	struct cnxk_dpi_conf conf;
 	struct rte_dma_stats stats;
 	uint64_t cmd[DPI_MAX_CMD_SIZE];
-	uint32_t num_words;
+	uint16_t pending;
+	uint16_t pnum_words;
 	uint16_t desc_idx;
 };
 
-- 
2.25.1


^ permalink raw reply	[flat|nested] 46+ messages in thread

* [PATCH v5 03/12] dma/cnxk: set dmadev to ready state
  2023-08-23 11:15       ` [PATCH v5 01/12] common/cnxk: use unique name for DPI memzone Amit Prakash Shukla
  2023-08-23 11:15         ` [PATCH v5 02/12] dma/cnxk: support for burst capacity Amit Prakash Shukla
@ 2023-08-23 11:15         ` Amit Prakash Shukla
  2023-08-23 11:15         ` [PATCH v5 04/12] dma/cnxk: flag support for dma device Amit Prakash Shukla
                           ` (9 subsequent siblings)
  11 siblings, 0 replies; 46+ messages in thread
From: Amit Prakash Shukla @ 2023-08-23 11:15 UTC (permalink / raw)
  To: Vamsi Attunuru; +Cc: dev, jerinj, Amit Prakash Shukla, stable

When a device is not set to a ready state, on exiting the application
proper cleanup is not done. This causes the application to fail on
trying to run next time.

Setting the device to ready state on successful probe fixes the issue.

Fixes: 53f6d7328bf4 ("dma/cnxk: create and initialize device on PCI probing")
Cc: stable@dpdk.org

Signed-off-by: Amit Prakash Shukla <amitprakashs@marvell.com>
---
v2:
- Fix for bugs observed in v1.
- Squashed few commits.

v3:
- Resolved review suggestions.
- Code improvement.

v4:
- Resolved checkpatch warnings.

v5:
- Updated commit message.
- Split the commits.

 drivers/dma/cnxk/cnxk_dmadev.c | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/drivers/dma/cnxk/cnxk_dmadev.c b/drivers/dma/cnxk/cnxk_dmadev.c
index f06c979b9c..d8bd61a048 100644
--- a/drivers/dma/cnxk/cnxk_dmadev.c
+++ b/drivers/dma/cnxk/cnxk_dmadev.c
@@ -668,8 +668,7 @@ static const struct rte_dma_dev_ops cnxk_dmadev_ops = {
 };
 
 static int
-cnxk_dmadev_probe(struct rte_pci_driver *pci_drv __rte_unused,
-		  struct rte_pci_device *pci_dev)
+cnxk_dmadev_probe(struct rte_pci_driver *pci_drv __rte_unused, struct rte_pci_device *pci_dev)
 {
 	struct cnxk_dpi_vf_s *dpivf = NULL;
 	char name[RTE_DEV_NAME_MAX_LEN];
@@ -688,8 +687,7 @@ cnxk_dmadev_probe(struct rte_pci_driver *pci_drv __rte_unused,
 	memset(name, 0, sizeof(name));
 	rte_pci_device_name(&pci_dev->addr, name, sizeof(name));
 
-	dmadev = rte_dma_pmd_allocate(name, pci_dev->device.numa_node,
-				      sizeof(*dpivf));
+	dmadev = rte_dma_pmd_allocate(name, pci_dev->device.numa_node, sizeof(*dpivf));
 	if (dmadev == NULL) {
 		plt_err("dma device allocation failed for %s", name);
 		return -ENOMEM;
@@ -723,6 +721,8 @@ cnxk_dmadev_probe(struct rte_pci_driver *pci_drv __rte_unused,
 	if (rc < 0)
 		goto err_out_free;
 
+	dmadev->state = RTE_DMA_DEV_READY;
+
 	return 0;
 
 err_out_free:
-- 
2.25.1


^ permalink raw reply	[flat|nested] 46+ messages in thread

* [PATCH v5 04/12] dma/cnxk: flag support for dma device
  2023-08-23 11:15       ` [PATCH v5 01/12] common/cnxk: use unique name for DPI memzone Amit Prakash Shukla
  2023-08-23 11:15         ` [PATCH v5 02/12] dma/cnxk: support for burst capacity Amit Prakash Shukla
  2023-08-23 11:15         ` [PATCH v5 03/12] dma/cnxk: set dmadev to ready state Amit Prakash Shukla
@ 2023-08-23 11:15         ` Amit Prakash Shukla
  2023-08-23 11:15         ` [PATCH v5 05/12] dma/cnxk: allocate completion ring buffer Amit Prakash Shukla
                           ` (8 subsequent siblings)
  11 siblings, 0 replies; 46+ messages in thread
From: Amit Prakash Shukla @ 2023-08-23 11:15 UTC (permalink / raw)
  To: Vamsi Attunuru; +Cc: dev, jerinj, Amit Prakash Shukla, stable

Multiple call to configure, setup queues without stopping the device
would leak the ring descriptor and hardware queue memory. This patch
adds flags support to prevent configuring without stopping the
device.

Fixes: b56f1e2dad38 ("dma/cnxk: add channel operations")
Cc: stable@dpdk.org

Signed-off-by: Amit Prakash Shukla <amitprakashs@marvell.com>
---
v2:
- Fix for bugs observed in v1.
- Squashed few commits.

v3:
- Resolved review suggestions.
- Code improvement.

v4:
- Resolved checkpatch warnings.

v5:
- Updated commit message.
- Split the commits.

 drivers/dma/cnxk/cnxk_dmadev.c | 32 +++++++++++++++++++++++++++++---
 drivers/dma/cnxk/cnxk_dmadev.h |  5 +++++
 2 files changed, 34 insertions(+), 3 deletions(-)

diff --git a/drivers/dma/cnxk/cnxk_dmadev.c b/drivers/dma/cnxk/cnxk_dmadev.c
index d8bd61a048..a7279fbd3a 100644
--- a/drivers/dma/cnxk/cnxk_dmadev.c
+++ b/drivers/dma/cnxk/cnxk_dmadev.c
@@ -45,14 +45,22 @@ cnxk_dmadev_configure(struct rte_dma_dev *dev,
 	int rc = 0;
 
 	RTE_SET_USED(conf);
-	RTE_SET_USED(conf);
-	RTE_SET_USED(conf_sz);
 	RTE_SET_USED(conf_sz);
+
 	dpivf = dev->fp_obj->dev_private;
+
+	if (dpivf->flag & CNXK_DPI_DEV_CONFIG)
+		return rc;
+
 	rc = roc_dpi_configure(&dpivf->rdpi);
-	if (rc < 0)
+	if (rc < 0) {
 		plt_err("DMA configure failed err = %d", rc);
+		goto done;
+	}
 
+	dpivf->flag |= CNXK_DPI_DEV_CONFIG;
+
+done:
 	return rc;
 }
 
@@ -69,6 +77,9 @@ cnxk_dmadev_vchan_setup(struct rte_dma_dev *dev, uint16_t vchan,
 	RTE_SET_USED(vchan);
 	RTE_SET_USED(conf_sz);
 
+	if (dpivf->flag & CNXK_DPI_VCHAN_CONFIG)
+		return 0;
+
 	header->cn9k.pt = DPI_HDR_PT_ZBW_CA;
 
 	switch (conf->direction) {
@@ -109,6 +120,7 @@ cnxk_dmadev_vchan_setup(struct rte_dma_dev *dev, uint16_t vchan,
 	dpivf->conf.c_desc.head = 0;
 	dpivf->conf.c_desc.tail = 0;
 	dpivf->pending = 0;
+	dpivf->flag |= CNXK_DPI_VCHAN_CONFIG;
 
 	return 0;
 }
@@ -126,6 +138,10 @@ cn10k_dmadev_vchan_setup(struct rte_dma_dev *dev, uint16_t vchan,
 	RTE_SET_USED(vchan);
 	RTE_SET_USED(conf_sz);
 
+
+	if (dpivf->flag & CNXK_DPI_VCHAN_CONFIG)
+		return 0;
+
 	header->cn10k.pt = DPI_HDR_PT_ZBW_CA;
 
 	switch (conf->direction) {
@@ -166,6 +182,7 @@ cn10k_dmadev_vchan_setup(struct rte_dma_dev *dev, uint16_t vchan,
 	dpivf->conf.c_desc.head = 0;
 	dpivf->conf.c_desc.tail = 0;
 	dpivf->pending = 0;
+	dpivf->flag |= CNXK_DPI_VCHAN_CONFIG;
 
 	return 0;
 }
@@ -175,11 +192,16 @@ cnxk_dmadev_start(struct rte_dma_dev *dev)
 {
 	struct cnxk_dpi_vf_s *dpivf = dev->fp_obj->dev_private;
 
+	if (dpivf->flag & CNXK_DPI_DEV_START)
+		return 0;
+
 	dpivf->desc_idx = 0;
 	dpivf->pending = 0;
 	dpivf->pnum_words = 0;
 	roc_dpi_enable(&dpivf->rdpi);
 
+	dpivf->flag |= CNXK_DPI_DEV_START;
+
 	return 0;
 }
 
@@ -190,6 +212,8 @@ cnxk_dmadev_stop(struct rte_dma_dev *dev)
 
 	roc_dpi_disable(&dpivf->rdpi);
 
+	dpivf->flag &= ~CNXK_DPI_DEV_START;
+
 	return 0;
 }
 
@@ -201,6 +225,8 @@ cnxk_dmadev_close(struct rte_dma_dev *dev)
 	roc_dpi_disable(&dpivf->rdpi);
 	roc_dpi_dev_fini(&dpivf->rdpi);
 
+	dpivf->flag = 0;
+
 	return 0;
 }
 
diff --git a/drivers/dma/cnxk/cnxk_dmadev.h b/drivers/dma/cnxk/cnxk_dmadev.h
index 943e9e3013..573bcff165 100644
--- a/drivers/dma/cnxk/cnxk_dmadev.h
+++ b/drivers/dma/cnxk/cnxk_dmadev.h
@@ -16,6 +16,10 @@
  */
 #define DPI_REQ_CDATA		0xFF
 
+#define CNXK_DPI_DEV_CONFIG   (1ULL << 0)
+#define CNXK_DPI_VCHAN_CONFIG (1ULL << 1)
+#define CNXK_DPI_DEV_START    (1ULL << 2)
+
 struct cnxk_dpi_compl_s {
 	uint64_t cdata;
 	void *cb_data;
@@ -41,6 +45,7 @@ struct cnxk_dpi_vf_s {
 	uint16_t pending;
 	uint16_t pnum_words;
 	uint16_t desc_idx;
+	uint16_t flag;
 };
 
 #endif
-- 
2.25.1


^ permalink raw reply	[flat|nested] 46+ messages in thread

* [PATCH v5 05/12] dma/cnxk: allocate completion ring buffer
  2023-08-23 11:15       ` [PATCH v5 01/12] common/cnxk: use unique name for DPI memzone Amit Prakash Shukla
                           ` (2 preceding siblings ...)
  2023-08-23 11:15         ` [PATCH v5 04/12] dma/cnxk: flag support for dma device Amit Prakash Shukla
@ 2023-08-23 11:15         ` Amit Prakash Shukla
  2023-08-23 11:15         ` [PATCH v5 06/12] dma/cnxk: chunk buffer failure return code Amit Prakash Shukla
                           ` (7 subsequent siblings)
  11 siblings, 0 replies; 46+ messages in thread
From: Amit Prakash Shukla @ 2023-08-23 11:15 UTC (permalink / raw)
  To: Vamsi Attunuru; +Cc: dev, jerinj, Amit Prakash Shukla, stable

Completion buffer was a static array per dma device. This would
consume memory for max number of descriptor supported by device
which might be more than configured by application. The patchset
allocates the memory for completion buffer based on the number
of descriptor configured by application.

Fixes: b56f1e2dad38 ("dma/cnxk: add channel operations")
Cc: stable@dpdk.org

Signed-off-by: Amit Prakash Shukla <amitprakashs@marvell.com>
---
v2:
- Fix for bugs observed in v1.
- Squashed few commits.

v3:
- Resolved review suggestions.
- Code improvement.

v4:
- Resolved checkpatch warnings.

v5:
- Updated commit message.
- Split the commits.

 drivers/dma/cnxk/cnxk_dmadev.c | 265 ++++++++++++++++++---------------
 drivers/dma/cnxk/cnxk_dmadev.h |  13 +-
 2 files changed, 148 insertions(+), 130 deletions(-)

diff --git a/drivers/dma/cnxk/cnxk_dmadev.c b/drivers/dma/cnxk/cnxk_dmadev.c
index a7279fbd3a..0db74b454d 100644
--- a/drivers/dma/cnxk/cnxk_dmadev.c
+++ b/drivers/dma/cnxk/cnxk_dmadev.c
@@ -7,39 +7,35 @@
 
 #include <bus_pci_driver.h>
 #include <rte_common.h>
+#include <rte_dmadev.h>
+#include <rte_dmadev_pmd.h>
 #include <rte_eal.h>
 #include <rte_lcore.h>
 #include <rte_mempool.h>
 #include <rte_pci.h>
-#include <rte_dmadev.h>
-#include <rte_dmadev_pmd.h>
 
-#include <roc_api.h>
 #include <cnxk_dmadev.h>
 
 static int
-cnxk_dmadev_info_get(const struct rte_dma_dev *dev,
-		     struct rte_dma_info *dev_info, uint32_t size)
+cnxk_dmadev_info_get(const struct rte_dma_dev *dev, struct rte_dma_info *dev_info, uint32_t size)
 {
 	RTE_SET_USED(dev);
 	RTE_SET_USED(size);
 
 	dev_info->max_vchans = 1;
 	dev_info->nb_vchans = 1;
-	dev_info->dev_capa = RTE_DMA_CAPA_MEM_TO_MEM |
-		RTE_DMA_CAPA_MEM_TO_DEV | RTE_DMA_CAPA_DEV_TO_MEM |
-		RTE_DMA_CAPA_DEV_TO_DEV | RTE_DMA_CAPA_OPS_COPY |
-		RTE_DMA_CAPA_OPS_COPY_SG;
+	dev_info->dev_capa = RTE_DMA_CAPA_MEM_TO_MEM | RTE_DMA_CAPA_MEM_TO_DEV |
+			     RTE_DMA_CAPA_DEV_TO_MEM | RTE_DMA_CAPA_DEV_TO_DEV |
+			     RTE_DMA_CAPA_OPS_COPY | RTE_DMA_CAPA_OPS_COPY_SG;
 	dev_info->max_desc = DPI_MAX_DESC;
-	dev_info->min_desc = 1;
+	dev_info->min_desc = 2;
 	dev_info->max_sges = DPI_MAX_POINTER;
 
 	return 0;
 }
 
 static int
-cnxk_dmadev_configure(struct rte_dma_dev *dev,
-		      const struct rte_dma_conf *conf, uint32_t conf_sz)
+cnxk_dmadev_configure(struct rte_dma_dev *dev, const struct rte_dma_conf *conf, uint32_t conf_sz)
 {
 	struct cnxk_dpi_vf_s *dpivf = NULL;
 	int rc = 0;
@@ -66,12 +62,13 @@ cnxk_dmadev_configure(struct rte_dma_dev *dev,
 
 static int
 cnxk_dmadev_vchan_setup(struct rte_dma_dev *dev, uint16_t vchan,
-			const struct rte_dma_vchan_conf *conf,
-			uint32_t conf_sz)
+			const struct rte_dma_vchan_conf *conf, uint32_t conf_sz)
 {
 	struct cnxk_dpi_vf_s *dpivf = dev->fp_obj->dev_private;
-	struct cnxk_dpi_compl_s *comp_data;
-	union dpi_instr_hdr_s *header = &dpivf->conf.hdr;
+	struct cnxk_dpi_conf *dpi_conf = &dpivf->conf;
+	union dpi_instr_hdr_s *header = &dpi_conf->hdr;
+	uint16_t max_desc;
+	uint32_t size;
 	int i;
 
 	RTE_SET_USED(vchan);
@@ -107,18 +104,30 @@ cnxk_dmadev_vchan_setup(struct rte_dma_dev *dev, uint16_t vchan,
 		header->cn9k.fport = conf->dst_port.pcie.coreid;
 	};
 
-	for (i = 0; i < conf->nb_desc; i++) {
-		comp_data = rte_zmalloc(NULL, sizeof(*comp_data), 0);
-		if (comp_data == NULL) {
-			plt_err("Failed to allocate for comp_data");
-			return -ENOMEM;
-		}
-		comp_data->cdata = DPI_REQ_CDATA;
-		dpivf->conf.c_desc.compl_ptr[i] = comp_data;
-	};
-	dpivf->conf.c_desc.max_cnt = DPI_MAX_DESC;
-	dpivf->conf.c_desc.head = 0;
-	dpivf->conf.c_desc.tail = 0;
+	max_desc = conf->nb_desc;
+	if (!rte_is_power_of_2(max_desc))
+		max_desc = rte_align32pow2(max_desc);
+
+	if (max_desc > DPI_MAX_DESC)
+		max_desc = DPI_MAX_DESC;
+
+	size = (max_desc * sizeof(struct cnxk_dpi_compl_s *));
+	dpi_conf->c_desc.compl_ptr = rte_zmalloc(NULL, size, 0);
+
+	if (dpi_conf->c_desc.compl_ptr == NULL) {
+		plt_err("Failed to allocate for comp_data");
+		return -ENOMEM;
+	}
+
+	for (i = 0; i < max_desc; i++) {
+		dpi_conf->c_desc.compl_ptr[i] =
+			rte_zmalloc(NULL, sizeof(struct cnxk_dpi_compl_s), 0);
+		dpi_conf->c_desc.compl_ptr[i]->cdata = DPI_REQ_CDATA;
+	}
+
+	dpi_conf->c_desc.max_cnt = (max_desc - 1);
+	dpi_conf->c_desc.head = 0;
+	dpi_conf->c_desc.tail = 0;
 	dpivf->pending = 0;
 	dpivf->flag |= CNXK_DPI_VCHAN_CONFIG;
 
@@ -127,12 +136,13 @@ cnxk_dmadev_vchan_setup(struct rte_dma_dev *dev, uint16_t vchan,
 
 static int
 cn10k_dmadev_vchan_setup(struct rte_dma_dev *dev, uint16_t vchan,
-			 const struct rte_dma_vchan_conf *conf,
-			 uint32_t conf_sz)
+			 const struct rte_dma_vchan_conf *conf, uint32_t conf_sz)
 {
 	struct cnxk_dpi_vf_s *dpivf = dev->fp_obj->dev_private;
-	struct cnxk_dpi_compl_s *comp_data;
-	union dpi_instr_hdr_s *header = &dpivf->conf.hdr;
+	struct cnxk_dpi_conf *dpi_conf = &dpivf->conf;
+	union dpi_instr_hdr_s *header = &dpi_conf->hdr;
+	uint16_t max_desc;
+	uint32_t size;
 	int i;
 
 	RTE_SET_USED(vchan);
@@ -169,18 +179,30 @@ cn10k_dmadev_vchan_setup(struct rte_dma_dev *dev, uint16_t vchan,
 		header->cn10k.fport = conf->dst_port.pcie.coreid;
 	};
 
-	for (i = 0; i < conf->nb_desc; i++) {
-		comp_data = rte_zmalloc(NULL, sizeof(*comp_data), 0);
-		if (comp_data == NULL) {
-			plt_err("Failed to allocate for comp_data");
-			return -ENOMEM;
-		}
-		comp_data->cdata = DPI_REQ_CDATA;
-		dpivf->conf.c_desc.compl_ptr[i] = comp_data;
-	};
-	dpivf->conf.c_desc.max_cnt = DPI_MAX_DESC;
-	dpivf->conf.c_desc.head = 0;
-	dpivf->conf.c_desc.tail = 0;
+	max_desc = conf->nb_desc;
+	if (!rte_is_power_of_2(max_desc))
+		max_desc = rte_align32pow2(max_desc);
+
+	if (max_desc > DPI_MAX_DESC)
+		max_desc = DPI_MAX_DESC;
+
+	size = (max_desc * sizeof(struct cnxk_dpi_compl_s *));
+	dpi_conf->c_desc.compl_ptr = rte_zmalloc(NULL, size, 0);
+
+	if (dpi_conf->c_desc.compl_ptr == NULL) {
+		plt_err("Failed to allocate for comp_data");
+		return -ENOMEM;
+	}
+
+	for (i = 0; i < max_desc; i++) {
+		dpi_conf->c_desc.compl_ptr[i] =
+			rte_zmalloc(NULL, sizeof(struct cnxk_dpi_compl_s), 0);
+		dpi_conf->c_desc.compl_ptr[i]->cdata = DPI_REQ_CDATA;
+	}
+
+	dpi_conf->c_desc.max_cnt = (max_desc - 1);
+	dpi_conf->c_desc.head = 0;
+	dpi_conf->c_desc.tail = 0;
 	dpivf->pending = 0;
 	dpivf->flag |= CNXK_DPI_VCHAN_CONFIG;
 
@@ -308,12 +330,13 @@ __dpi_queue_write(struct roc_dpi *dpi, uint64_t *cmds, int cmd_count)
 }
 
 static int
-cnxk_dmadev_copy(void *dev_private, uint16_t vchan, rte_iova_t src,
-		 rte_iova_t dst, uint32_t length, uint64_t flags)
+cnxk_dmadev_copy(void *dev_private, uint16_t vchan, rte_iova_t src, rte_iova_t dst, uint32_t length,
+		 uint64_t flags)
 {
 	struct cnxk_dpi_vf_s *dpivf = dev_private;
 	union dpi_instr_hdr_s *header = &dpivf->conf.hdr;
 	struct cnxk_dpi_compl_s *comp_ptr;
+	uint64_t cmd[DPI_MAX_CMD_SIZE];
 	rte_iova_t fptr, lptr;
 	int num_words = 0;
 	int rc;
@@ -321,7 +344,6 @@ cnxk_dmadev_copy(void *dev_private, uint16_t vchan, rte_iova_t src,
 	RTE_SET_USED(vchan);
 
 	comp_ptr = dpivf->conf.c_desc.compl_ptr[dpivf->conf.c_desc.tail];
-	comp_ptr->cdata = DPI_REQ_CDATA;
 	header->cn9k.ptr = (uint64_t)comp_ptr;
 	STRM_INC(dpivf->conf.c_desc, tail);
 
@@ -340,17 +362,17 @@ cnxk_dmadev_copy(void *dev_private, uint16_t vchan, rte_iova_t src,
 		lptr = dst;
 	}
 
-	dpivf->cmd[0] = header->u[0];
-	dpivf->cmd[1] = header->u[1];
-	dpivf->cmd[2] = header->u[2];
+	cmd[0] = header->u[0];
+	cmd[1] = header->u[1];
+	cmd[2] = header->u[2];
 	/* word3 is always 0 */
 	num_words += 4;
-	dpivf->cmd[num_words++] = length;
-	dpivf->cmd[num_words++] = fptr;
-	dpivf->cmd[num_words++] = length;
-	dpivf->cmd[num_words++] = lptr;
+	cmd[num_words++] = length;
+	cmd[num_words++] = fptr;
+	cmd[num_words++] = length;
+	cmd[num_words++] = lptr;
 
-	rc = __dpi_queue_write(&dpivf->rdpi, dpivf->cmd, num_words);
+	rc = __dpi_queue_write(&dpivf->rdpi, cmd, num_words);
 	if (unlikely(rc)) {
 		STRM_DEC(dpivf->conf.c_desc, tail);
 		return rc;
@@ -369,22 +391,20 @@ cnxk_dmadev_copy(void *dev_private, uint16_t vchan, rte_iova_t src,
 }
 
 static int
-cnxk_dmadev_copy_sg(void *dev_private, uint16_t vchan,
-		    const struct rte_dma_sge *src,
-		    const struct rte_dma_sge *dst,
-		    uint16_t nb_src, uint16_t nb_dst, uint64_t flags)
+cnxk_dmadev_copy_sg(void *dev_private, uint16_t vchan, const struct rte_dma_sge *src,
+		    const struct rte_dma_sge *dst, uint16_t nb_src, uint16_t nb_dst, uint64_t flags)
 {
 	struct cnxk_dpi_vf_s *dpivf = dev_private;
 	union dpi_instr_hdr_s *header = &dpivf->conf.hdr;
 	const struct rte_dma_sge *fptr, *lptr;
 	struct cnxk_dpi_compl_s *comp_ptr;
+	uint64_t cmd[DPI_MAX_CMD_SIZE];
 	int num_words = 0;
 	int i, rc;
 
 	RTE_SET_USED(vchan);
 
 	comp_ptr = dpivf->conf.c_desc.compl_ptr[dpivf->conf.c_desc.tail];
-	comp_ptr->cdata = DPI_REQ_CDATA;
 	header->cn9k.ptr = (uint64_t)comp_ptr;
 	STRM_INC(dpivf->conf.c_desc, tail);
 
@@ -393,34 +413,34 @@ cnxk_dmadev_copy_sg(void *dev_private, uint16_t vchan,
 	 * For all other cases, src pointers are first pointers.
 	 */
 	if (header->cn9k.xtype == DPI_XTYPE_INBOUND) {
-		header->cn9k.nfst = nb_dst & 0xf;
-		header->cn9k.nlst = nb_src & 0xf;
+		header->cn9k.nfst = nb_dst & DPI_MAX_POINTER;
+		header->cn9k.nlst = nb_src & DPI_MAX_POINTER;
 		fptr = &dst[0];
 		lptr = &src[0];
 	} else {
-		header->cn9k.nfst = nb_src & 0xf;
-		header->cn9k.nlst = nb_dst & 0xf;
+		header->cn9k.nfst = nb_src & DPI_MAX_POINTER;
+		header->cn9k.nlst = nb_dst & DPI_MAX_POINTER;
 		fptr = &src[0];
 		lptr = &dst[0];
 	}
 
-	dpivf->cmd[0] = header->u[0];
-	dpivf->cmd[1] = header->u[1];
-	dpivf->cmd[2] = header->u[2];
+	cmd[0] = header->u[0];
+	cmd[1] = header->u[1];
+	cmd[2] = header->u[2];
 	num_words += 4;
 	for (i = 0; i < header->cn9k.nfst; i++) {
-		dpivf->cmd[num_words++] = (uint64_t)fptr->length;
-		dpivf->cmd[num_words++] = fptr->addr;
+		cmd[num_words++] = (uint64_t)fptr->length;
+		cmd[num_words++] = fptr->addr;
 		fptr++;
 	}
 
 	for (i = 0; i < header->cn9k.nlst; i++) {
-		dpivf->cmd[num_words++] = (uint64_t)lptr->length;
-		dpivf->cmd[num_words++] = lptr->addr;
+		cmd[num_words++] = (uint64_t)lptr->length;
+		cmd[num_words++] = lptr->addr;
 		lptr++;
 	}
 
-	rc = __dpi_queue_write(&dpivf->rdpi, dpivf->cmd, num_words);
+	rc = __dpi_queue_write(&dpivf->rdpi, cmd, num_words);
 	if (unlikely(rc)) {
 		STRM_DEC(dpivf->conf.c_desc, tail);
 		return rc;
@@ -439,12 +459,13 @@ cnxk_dmadev_copy_sg(void *dev_private, uint16_t vchan,
 }
 
 static int
-cn10k_dmadev_copy(void *dev_private, uint16_t vchan, rte_iova_t src,
-		  rte_iova_t dst, uint32_t length, uint64_t flags)
+cn10k_dmadev_copy(void *dev_private, uint16_t vchan, rte_iova_t src, rte_iova_t dst,
+		  uint32_t length, uint64_t flags)
 {
 	struct cnxk_dpi_vf_s *dpivf = dev_private;
 	union dpi_instr_hdr_s *header = &dpivf->conf.hdr;
 	struct cnxk_dpi_compl_s *comp_ptr;
+	uint64_t cmd[DPI_MAX_CMD_SIZE];
 	rte_iova_t fptr, lptr;
 	int num_words = 0;
 	int rc;
@@ -452,7 +473,6 @@ cn10k_dmadev_copy(void *dev_private, uint16_t vchan, rte_iova_t src,
 	RTE_SET_USED(vchan);
 
 	comp_ptr = dpivf->conf.c_desc.compl_ptr[dpivf->conf.c_desc.tail];
-	comp_ptr->cdata = DPI_REQ_CDATA;
 	header->cn10k.ptr = (uint64_t)comp_ptr;
 	STRM_INC(dpivf->conf.c_desc, tail);
 
@@ -462,17 +482,17 @@ cn10k_dmadev_copy(void *dev_private, uint16_t vchan, rte_iova_t src,
 	fptr = src;
 	lptr = dst;
 
-	dpivf->cmd[0] = header->u[0];
-	dpivf->cmd[1] = header->u[1];
-	dpivf->cmd[2] = header->u[2];
+	cmd[0] = header->u[0];
+	cmd[1] = header->u[1];
+	cmd[2] = header->u[2];
 	/* word3 is always 0 */
 	num_words += 4;
-	dpivf->cmd[num_words++] = length;
-	dpivf->cmd[num_words++] = fptr;
-	dpivf->cmd[num_words++] = length;
-	dpivf->cmd[num_words++] = lptr;
+	cmd[num_words++] = length;
+	cmd[num_words++] = fptr;
+	cmd[num_words++] = length;
+	cmd[num_words++] = lptr;
 
-	rc = __dpi_queue_write(&dpivf->rdpi, dpivf->cmd, num_words);
+	rc = __dpi_queue_write(&dpivf->rdpi, cmd, num_words);
 	if (unlikely(rc)) {
 		STRM_DEC(dpivf->conf.c_desc, tail);
 		return rc;
@@ -491,48 +511,47 @@ cn10k_dmadev_copy(void *dev_private, uint16_t vchan, rte_iova_t src,
 }
 
 static int
-cn10k_dmadev_copy_sg(void *dev_private, uint16_t vchan,
-		     const struct rte_dma_sge *src,
-		     const struct rte_dma_sge *dst, uint16_t nb_src,
-		     uint16_t nb_dst, uint64_t flags)
+cn10k_dmadev_copy_sg(void *dev_private, uint16_t vchan, const struct rte_dma_sge *src,
+		     const struct rte_dma_sge *dst, uint16_t nb_src, uint16_t nb_dst,
+		     uint64_t flags)
 {
 	struct cnxk_dpi_vf_s *dpivf = dev_private;
 	union dpi_instr_hdr_s *header = &dpivf->conf.hdr;
 	const struct rte_dma_sge *fptr, *lptr;
 	struct cnxk_dpi_compl_s *comp_ptr;
+	uint64_t cmd[DPI_MAX_CMD_SIZE];
 	int num_words = 0;
 	int i, rc;
 
 	RTE_SET_USED(vchan);
 
 	comp_ptr = dpivf->conf.c_desc.compl_ptr[dpivf->conf.c_desc.tail];
-	comp_ptr->cdata = DPI_REQ_CDATA;
 	header->cn10k.ptr = (uint64_t)comp_ptr;
 	STRM_INC(dpivf->conf.c_desc, tail);
 
-	header->cn10k.nfst = nb_src & 0xf;
-	header->cn10k.nlst = nb_dst & 0xf;
+	header->cn10k.nfst = nb_src & DPI_MAX_POINTER;
+	header->cn10k.nlst = nb_dst & DPI_MAX_POINTER;
 	fptr = &src[0];
 	lptr = &dst[0];
 
-	dpivf->cmd[0] = header->u[0];
-	dpivf->cmd[1] = header->u[1];
-	dpivf->cmd[2] = header->u[2];
+	cmd[0] = header->u[0];
+	cmd[1] = header->u[1];
+	cmd[2] = header->u[2];
 	num_words += 4;
 
 	for (i = 0; i < header->cn10k.nfst; i++) {
-		dpivf->cmd[num_words++] = (uint64_t)fptr->length;
-		dpivf->cmd[num_words++] = fptr->addr;
+		cmd[num_words++] = (uint64_t)fptr->length;
+		cmd[num_words++] = fptr->addr;
 		fptr++;
 	}
 
 	for (i = 0; i < header->cn10k.nlst; i++) {
-		dpivf->cmd[num_words++] = (uint64_t)lptr->length;
-		dpivf->cmd[num_words++] = lptr->addr;
+		cmd[num_words++] = (uint64_t)lptr->length;
+		cmd[num_words++] = lptr->addr;
 		lptr++;
 	}
 
-	rc = __dpi_queue_write(&dpivf->rdpi, dpivf->cmd, num_words);
+	rc = __dpi_queue_write(&dpivf->rdpi, cmd, num_words);
 	if (unlikely(rc)) {
 		STRM_DEC(dpivf->conf.c_desc, tail);
 		return rc;
@@ -551,50 +570,52 @@ cn10k_dmadev_copy_sg(void *dev_private, uint16_t vchan,
 }
 
 static uint16_t
-cnxk_dmadev_completed(void *dev_private, uint16_t vchan, const uint16_t nb_cpls,
-		      uint16_t *last_idx, bool *has_error)
+cnxk_dmadev_completed(void *dev_private, uint16_t vchan, const uint16_t nb_cpls, uint16_t *last_idx,
+		      bool *has_error)
 {
 	struct cnxk_dpi_vf_s *dpivf = dev_private;
+	struct cnxk_dpi_cdesc_data_s *c_desc = &dpivf->conf.c_desc;
+	struct cnxk_dpi_compl_s *comp_ptr;
 	int cnt;
 
 	RTE_SET_USED(vchan);
 
-	if (dpivf->stats.submitted == dpivf->stats.completed)
-		return 0;
-
 	for (cnt = 0; cnt < nb_cpls; cnt++) {
-		struct cnxk_dpi_compl_s *comp_ptr =
-			dpivf->conf.c_desc.compl_ptr[cnt];
+		comp_ptr = c_desc->compl_ptr[c_desc->head];
 
 		if (comp_ptr->cdata) {
 			if (comp_ptr->cdata == DPI_REQ_CDATA)
 				break;
 			*has_error = 1;
 			dpivf->stats.errors++;
+			STRM_INC(*c_desc, head);
 			break;
 		}
+
+		comp_ptr->cdata = DPI_REQ_CDATA;
+		STRM_INC(*c_desc, head);
 	}
 
-	*last_idx = cnt - 1;
-	dpivf->conf.c_desc.tail = cnt;
 	dpivf->stats.completed += cnt;
+	*last_idx = dpivf->stats.completed - 1;
 
 	return cnt;
 }
 
 static uint16_t
-cnxk_dmadev_completed_status(void *dev_private, uint16_t vchan,
-			     const uint16_t nb_cpls, uint16_t *last_idx,
-			     enum rte_dma_status_code *status)
+cnxk_dmadev_completed_status(void *dev_private, uint16_t vchan, const uint16_t nb_cpls,
+			     uint16_t *last_idx, enum rte_dma_status_code *status)
 {
 	struct cnxk_dpi_vf_s *dpivf = dev_private;
+	struct cnxk_dpi_cdesc_data_s *c_desc = &dpivf->conf.c_desc;
+	struct cnxk_dpi_compl_s *comp_ptr;
 	int cnt;
 
 	RTE_SET_USED(vchan);
 	RTE_SET_USED(last_idx);
+
 	for (cnt = 0; cnt < nb_cpls; cnt++) {
-		struct cnxk_dpi_compl_s *comp_ptr =
-			dpivf->conf.c_desc.compl_ptr[cnt];
+		comp_ptr = c_desc->compl_ptr[c_desc->head];
 		status[cnt] = comp_ptr->cdata;
 		if (status[cnt]) {
 			if (status[cnt] == DPI_REQ_CDATA)
@@ -602,11 +623,12 @@ cnxk_dmadev_completed_status(void *dev_private, uint16_t vchan,
 
 			dpivf->stats.errors++;
 		}
+		comp_ptr->cdata = DPI_REQ_CDATA;
+		STRM_INC(*c_desc, head);
 	}
 
-	*last_idx = cnt - 1;
-	dpivf->conf.c_desc.tail = 0;
 	dpivf->stats.completed += cnt;
+	*last_idx = dpivf->stats.completed - 1;
 
 	return cnt;
 }
@@ -645,8 +667,8 @@ cnxk_dmadev_submit(void *dev_private, uint16_t vchan __rte_unused)
 }
 
 static int
-cnxk_stats_get(const struct rte_dma_dev *dev, uint16_t vchan,
-	       struct rte_dma_stats *rte_stats, uint32_t size)
+cnxk_stats_get(const struct rte_dma_dev *dev, uint16_t vchan, struct rte_dma_stats *rte_stats,
+	       uint32_t size)
 {
 	struct cnxk_dpi_vf_s *dpivf = dev->fp_obj->dev_private;
 	struct rte_dma_stats *stats = &dpivf->stats;
@@ -770,20 +792,17 @@ cnxk_dmadev_remove(struct rte_pci_device *pci_dev)
 }
 
 static const struct rte_pci_id cnxk_dma_pci_map[] = {
-	{
-		RTE_PCI_DEVICE(PCI_VENDOR_ID_CAVIUM,
-			       PCI_DEVID_CNXK_DPI_VF)
-	},
+	{RTE_PCI_DEVICE(PCI_VENDOR_ID_CAVIUM, PCI_DEVID_CNXK_DPI_VF)},
 	{
 		.vendor_id = 0,
 	},
 };
 
 static struct rte_pci_driver cnxk_dmadev = {
-	.id_table  = cnxk_dma_pci_map,
+	.id_table = cnxk_dma_pci_map,
 	.drv_flags = RTE_PCI_DRV_NEED_MAPPING | RTE_PCI_DRV_NEED_IOVA_AS_VA,
-	.probe     = cnxk_dmadev_probe,
-	.remove    = cnxk_dmadev_remove,
+	.probe = cnxk_dmadev_probe,
+	.remove = cnxk_dmadev_remove,
 };
 
 RTE_PMD_REGISTER_PCI(cnxk_dmadev_pci_driver, cnxk_dmadev);
diff --git a/drivers/dma/cnxk/cnxk_dmadev.h b/drivers/dma/cnxk/cnxk_dmadev.h
index 573bcff165..9563295af0 100644
--- a/drivers/dma/cnxk/cnxk_dmadev.h
+++ b/drivers/dma/cnxk/cnxk_dmadev.h
@@ -4,17 +4,17 @@
 #ifndef CNXK_DMADEV_H
 #define CNXK_DMADEV_H
 
-#define DPI_MAX_POINTER		15
-#define DPI_QUEUE_STOP		0x0
-#define DPI_QUEUE_START		0x1
+#include <roc_api.h>
+
+#define DPI_MAX_POINTER	 15
 #define STRM_INC(s, var) ((s).var = ((s).var + 1) & (s).max_cnt)
 #define STRM_DEC(s, var) ((s).var = ((s).var - 1) == -1 ? (s).max_cnt : ((s).var - 1))
-#define DPI_MAX_DESC		1024
+#define DPI_MAX_DESC	 1024
 
 /* Set Completion data to 0xFF when request submitted,
  * upon successful request completion engine reset to completion status
  */
-#define DPI_REQ_CDATA		0xFF
+#define DPI_REQ_CDATA 0xFF
 
 #define CNXK_DPI_DEV_CONFIG   (1ULL << 0)
 #define CNXK_DPI_VCHAN_CONFIG (1ULL << 1)
@@ -26,7 +26,7 @@ struct cnxk_dpi_compl_s {
 };
 
 struct cnxk_dpi_cdesc_data_s {
-	struct cnxk_dpi_compl_s *compl_ptr[DPI_MAX_DESC];
+	struct cnxk_dpi_compl_s **compl_ptr;
 	uint16_t max_cnt;
 	uint16_t head;
 	uint16_t tail;
@@ -41,7 +41,6 @@ struct cnxk_dpi_vf_s {
 	struct roc_dpi rdpi;
 	struct cnxk_dpi_conf conf;
 	struct rte_dma_stats stats;
-	uint64_t cmd[DPI_MAX_CMD_SIZE];
 	uint16_t pending;
 	uint16_t pnum_words;
 	uint16_t desc_idx;
-- 
2.25.1


^ permalink raw reply	[flat|nested] 46+ messages in thread

* [PATCH v5 06/12] dma/cnxk: chunk buffer failure return code
  2023-08-23 11:15       ` [PATCH v5 01/12] common/cnxk: use unique name for DPI memzone Amit Prakash Shukla
                           ` (3 preceding siblings ...)
  2023-08-23 11:15         ` [PATCH v5 05/12] dma/cnxk: allocate completion ring buffer Amit Prakash Shukla
@ 2023-08-23 11:15         ` Amit Prakash Shukla
  2023-08-23 11:15         ` [PATCH v5 07/12] dma/cnxk: add DMA devops for all models of cn10xxx Amit Prakash Shukla
                           ` (6 subsequent siblings)
  11 siblings, 0 replies; 46+ messages in thread
From: Amit Prakash Shukla @ 2023-08-23 11:15 UTC (permalink / raw)
  To: Vamsi Attunuru; +Cc: dev, jerinj, Amit Prakash Shukla, stable

On chunk buffer alloc failure, ENOMEM is returned. As per DMA spec
ENOSPC shall be returned on failure to allocate memory. This
changeset fixes the same.

Fixes: b56f1e2dad38 ("dma/cnxk: add channel operations")
Cc: stable@dpdk.org

Signed-off-by: Amit Prakash Shukla <amitprakashs@marvell.com>
---
v2:
- Fix for bugs observed in v1.
- Squashed few commits.

v3:
- Resolved review suggestions.
- Code improvement.

v4:
- Resolved checkpatch warnings.

v5:
- Updated commit message.
- Split the commits.

 drivers/dma/cnxk/cnxk_dmadev.c | 29 ++++++++++++++++++-----------
 1 file changed, 18 insertions(+), 11 deletions(-)

diff --git a/drivers/dma/cnxk/cnxk_dmadev.c b/drivers/dma/cnxk/cnxk_dmadev.c
index 0db74b454d..aa6f6c710c 100644
--- a/drivers/dma/cnxk/cnxk_dmadev.c
+++ b/drivers/dma/cnxk/cnxk_dmadev.c
@@ -257,8 +257,7 @@ __dpi_queue_write(struct roc_dpi *dpi, uint64_t *cmds, int cmd_count)
 {
 	uint64_t *ptr = dpi->chunk_base;
 
-	if ((cmd_count < DPI_MIN_CMD_SIZE) || (cmd_count > DPI_MAX_CMD_SIZE) ||
-	    cmds == NULL)
+	if ((cmd_count < DPI_MIN_CMD_SIZE) || (cmd_count > DPI_MAX_CMD_SIZE) || cmds == NULL)
 		return -EINVAL;
 
 	/*
@@ -274,11 +273,15 @@ __dpi_queue_write(struct roc_dpi *dpi, uint64_t *cmds, int cmd_count)
 		int count;
 		uint64_t *new_buff = dpi->chunk_next;
 
-		dpi->chunk_next =
-			(void *)roc_npa_aura_op_alloc(dpi->aura_handle, 0);
+		dpi->chunk_next = (void *)roc_npa_aura_op_alloc(dpi->aura_handle, 0);
 		if (!dpi->chunk_next) {
-			plt_err("Failed to alloc next buffer from NPA");
-			return -ENOMEM;
+			plt_dp_dbg("Failed to alloc next buffer from NPA");
+
+			/* NPA failed to allocate a buffer. Restoring chunk_next
+			 * to its original address.
+			 */
+			dpi->chunk_next = new_buff;
+			return -ENOSPC;
 		}
 
 		/*
@@ -312,13 +315,17 @@ __dpi_queue_write(struct roc_dpi *dpi, uint64_t *cmds, int cmd_count)
 		/* queue index may be greater than pool size */
 		if (dpi->chunk_head >= dpi->pool_size_m1) {
 			new_buff = dpi->chunk_next;
-			dpi->chunk_next =
-				(void *)roc_npa_aura_op_alloc(dpi->aura_handle,
-							      0);
+			dpi->chunk_next = (void *)roc_npa_aura_op_alloc(dpi->aura_handle, 0);
 			if (!dpi->chunk_next) {
-				plt_err("Failed to alloc next buffer from NPA");
-				return -ENOMEM;
+				plt_dp_dbg("Failed to alloc next buffer from NPA");
+
+				/* NPA failed to allocate a buffer. Restoring chunk_next
+				 * to its original address.
+				 */
+				dpi->chunk_next = new_buff;
+				return -ENOSPC;
 			}
+
 			/* Write next buffer address */
 			*ptr = (uint64_t)new_buff;
 			dpi->chunk_base = new_buff;
-- 
2.25.1


^ permalink raw reply	[flat|nested] 46+ messages in thread

* [PATCH v5 07/12] dma/cnxk: add DMA devops for all models of cn10xxx
  2023-08-23 11:15       ` [PATCH v5 01/12] common/cnxk: use unique name for DPI memzone Amit Prakash Shukla
                           ` (4 preceding siblings ...)
  2023-08-23 11:15         ` [PATCH v5 06/12] dma/cnxk: chunk buffer failure return code Amit Prakash Shukla
@ 2023-08-23 11:15         ` Amit Prakash Shukla
  2023-08-23 11:15         ` [PATCH v5 08/12] dma/cnxk: update func field based on transfer type Amit Prakash Shukla
                           ` (5 subsequent siblings)
  11 siblings, 0 replies; 46+ messages in thread
From: Amit Prakash Shukla @ 2023-08-23 11:15 UTC (permalink / raw)
  To: Vamsi Attunuru; +Cc: dev, jerinj, Amit Prakash Shukla, Radha Mohan Chintakuntla

Valid function pointers are set for DMA device operations
i.e. cn10k_dmadev_ops are used for all cn10k devices.

Signed-off-by: Radha Mohan Chintakuntla <radhac@marvell.com>
Signed-off-by: Amit Prakash Shukla <amitprakashs@marvell.com>
---
v2:
- Fix for bugs observed in v1.
- Squashed few commits.

v3:
- Resolved review suggestions.
- Code improvement.

v4:
- Resolved checkpatch warnings.

v5:
- Updated commit message.
- Split the commits.

 drivers/dma/cnxk/cnxk_dmadev.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/drivers/dma/cnxk/cnxk_dmadev.c b/drivers/dma/cnxk/cnxk_dmadev.c
index aa6f6c710c..b0de0cf215 100644
--- a/drivers/dma/cnxk/cnxk_dmadev.c
+++ b/drivers/dma/cnxk/cnxk_dmadev.c
@@ -762,7 +762,9 @@ cnxk_dmadev_probe(struct rte_pci_driver *pci_drv __rte_unused, struct rte_pci_de
 	dmadev->fp_obj->burst_capacity = cnxk_damdev_burst_capacity;
 
 	if (pci_dev->id.subsystem_device_id == PCI_SUBSYSTEM_DEVID_CN10KA ||
+	    pci_dev->id.subsystem_device_id == PCI_SUBSYSTEM_DEVID_CN10KAS ||
 	    pci_dev->id.subsystem_device_id == PCI_SUBSYSTEM_DEVID_CNF10KA ||
+	    pci_dev->id.subsystem_device_id == PCI_SUBSYSTEM_DEVID_CNF10KB ||
 	    pci_dev->id.subsystem_device_id == PCI_SUBSYSTEM_DEVID_CN10KB) {
 		dmadev->dev_ops = &cn10k_dmadev_ops;
 		dmadev->fp_obj->copy = cn10k_dmadev_copy;
-- 
2.25.1


^ permalink raw reply	[flat|nested] 46+ messages in thread

* [PATCH v5 08/12] dma/cnxk: update func field based on transfer type
  2023-08-23 11:15       ` [PATCH v5 01/12] common/cnxk: use unique name for DPI memzone Amit Prakash Shukla
                           ` (5 preceding siblings ...)
  2023-08-23 11:15         ` [PATCH v5 07/12] dma/cnxk: add DMA devops for all models of cn10xxx Amit Prakash Shukla
@ 2023-08-23 11:15         ` Amit Prakash Shukla
  2023-08-23 11:15         ` [PATCH v5 09/12] dma/cnxk: increase vchan per queue to max 4 Amit Prakash Shukla
                           ` (4 subsequent siblings)
  11 siblings, 0 replies; 46+ messages in thread
From: Amit Prakash Shukla @ 2023-08-23 11:15 UTC (permalink / raw)
  To: Vamsi Attunuru; +Cc: dev, jerinj, Amit Prakash Shukla, Radha Mohan Chintakuntla

Use pfid and vfid of src_port for incoming DMA transfers and dst_port
for outgoing DMA transfers.

Signed-off-by: Radha Mohan Chintakuntla <radhac@marvell.com>
Signed-off-by: Amit Prakash Shukla <amitprakashs@marvell.com>
---
v2:
- Fix for bugs observed in v1.
- Squashed few commits.

v3:
- Resolved review suggestions.
- Code improvement.

v4:
- Resolved checkpatch warnings.

v5:
- Updated commit message.
- Split the commits.

 drivers/dma/cnxk/cnxk_dmadev.c | 26 ++++++++++++++++++++++----
 1 file changed, 22 insertions(+), 4 deletions(-)

diff --git a/drivers/dma/cnxk/cnxk_dmadev.c b/drivers/dma/cnxk/cnxk_dmadev.c
index b0de0cf215..4793c93ca8 100644
--- a/drivers/dma/cnxk/cnxk_dmadev.c
+++ b/drivers/dma/cnxk/cnxk_dmadev.c
@@ -84,13 +84,21 @@ cnxk_dmadev_vchan_setup(struct rte_dma_dev *dev, uint16_t vchan,
 		header->cn9k.xtype = DPI_XTYPE_INBOUND;
 		header->cn9k.lport = conf->src_port.pcie.coreid;
 		header->cn9k.fport = 0;
-		header->cn9k.pvfe = 1;
+		header->cn9k.pvfe = conf->src_port.pcie.vfen;
+		if (header->cn9k.pvfe) {
+			header->cn9k.func = conf->src_port.pcie.pfid << 12;
+			header->cn9k.func |= conf->src_port.pcie.vfid;
+		}
 		break;
 	case RTE_DMA_DIR_MEM_TO_DEV:
 		header->cn9k.xtype = DPI_XTYPE_OUTBOUND;
 		header->cn9k.lport = 0;
 		header->cn9k.fport = conf->dst_port.pcie.coreid;
-		header->cn9k.pvfe = 1;
+		header->cn9k.pvfe = conf->dst_port.pcie.vfen;
+		if (header->cn9k.pvfe) {
+			header->cn9k.func = conf->dst_port.pcie.pfid << 12;
+			header->cn9k.func |= conf->dst_port.pcie.vfid;
+		}
 		break;
 	case RTE_DMA_DIR_MEM_TO_MEM:
 		header->cn9k.xtype = DPI_XTYPE_INTERNAL_ONLY;
@@ -102,6 +110,7 @@ cnxk_dmadev_vchan_setup(struct rte_dma_dev *dev, uint16_t vchan,
 		header->cn9k.xtype = DPI_XTYPE_EXTERNAL_ONLY;
 		header->cn9k.lport = conf->src_port.pcie.coreid;
 		header->cn9k.fport = conf->dst_port.pcie.coreid;
+		header->cn9k.pvfe = 0;
 	};
 
 	max_desc = conf->nb_desc;
@@ -159,13 +168,21 @@ cn10k_dmadev_vchan_setup(struct rte_dma_dev *dev, uint16_t vchan,
 		header->cn10k.xtype = DPI_XTYPE_INBOUND;
 		header->cn10k.lport = conf->src_port.pcie.coreid;
 		header->cn10k.fport = 0;
-		header->cn10k.pvfe = 1;
+		header->cn10k.pvfe = conf->src_port.pcie.vfen;
+		if (header->cn10k.pvfe) {
+			header->cn10k.func = conf->src_port.pcie.pfid << 12;
+			header->cn10k.func |= conf->src_port.pcie.vfid;
+		}
 		break;
 	case RTE_DMA_DIR_MEM_TO_DEV:
 		header->cn10k.xtype = DPI_XTYPE_OUTBOUND;
 		header->cn10k.lport = 0;
 		header->cn10k.fport = conf->dst_port.pcie.coreid;
-		header->cn10k.pvfe = 1;
+		header->cn10k.pvfe = conf->dst_port.pcie.vfen;
+		if (header->cn10k.pvfe) {
+			header->cn10k.func = conf->dst_port.pcie.pfid << 12;
+			header->cn10k.func |= conf->dst_port.pcie.vfid;
+		}
 		break;
 	case RTE_DMA_DIR_MEM_TO_MEM:
 		header->cn10k.xtype = DPI_XTYPE_INTERNAL_ONLY;
@@ -177,6 +194,7 @@ cn10k_dmadev_vchan_setup(struct rte_dma_dev *dev, uint16_t vchan,
 		header->cn10k.xtype = DPI_XTYPE_EXTERNAL_ONLY;
 		header->cn10k.lport = conf->src_port.pcie.coreid;
 		header->cn10k.fport = conf->dst_port.pcie.coreid;
+		header->cn10k.pvfe = 0;
 	};
 
 	max_desc = conf->nb_desc;
-- 
2.25.1


^ permalink raw reply	[flat|nested] 46+ messages in thread

* [PATCH v5 09/12] dma/cnxk: increase vchan per queue to max 4
  2023-08-23 11:15       ` [PATCH v5 01/12] common/cnxk: use unique name for DPI memzone Amit Prakash Shukla
                           ` (6 preceding siblings ...)
  2023-08-23 11:15         ` [PATCH v5 08/12] dma/cnxk: update func field based on transfer type Amit Prakash Shukla
@ 2023-08-23 11:15         ` Amit Prakash Shukla
  2023-08-23 11:15         ` [PATCH v5 10/12] dma/cnxk: vchan support enhancement Amit Prakash Shukla
                           ` (3 subsequent siblings)
  11 siblings, 0 replies; 46+ messages in thread
From: Amit Prakash Shukla @ 2023-08-23 11:15 UTC (permalink / raw)
  To: Vamsi Attunuru; +Cc: dev, jerinj, Amit Prakash Shukla, Radha Mohan Chintakuntla

To support multiple directions in same queue make use of multiple vchan
per queue. Each vchan can be configured in some direction and used.

Signed-off-by: Amit Prakash Shukla <amitprakashs@marvell.com>
Signed-off-by: Radha Mohan Chintakuntla <radhac@marvell.com>
---
v2:
- Fix for bugs observed in v1.
- Squashed few commits.

v3:
- Resolved review suggestions.
- Code improvement.

v4:
- Resolved checkpatch warnings.

v5:
- Updated commit message.
- Split the commits.

 drivers/dma/cnxk/cnxk_dmadev.c | 68 +++++++++++++++-------------------
 drivers/dma/cnxk/cnxk_dmadev.h | 11 +++---
 2 files changed, 36 insertions(+), 43 deletions(-)

diff --git a/drivers/dma/cnxk/cnxk_dmadev.c b/drivers/dma/cnxk/cnxk_dmadev.c
index 4793c93ca8..2193b4628f 100644
--- a/drivers/dma/cnxk/cnxk_dmadev.c
+++ b/drivers/dma/cnxk/cnxk_dmadev.c
@@ -22,8 +22,8 @@ cnxk_dmadev_info_get(const struct rte_dma_dev *dev, struct rte_dma_info *dev_inf
 	RTE_SET_USED(dev);
 	RTE_SET_USED(size);
 
-	dev_info->max_vchans = 1;
-	dev_info->nb_vchans = 1;
+	dev_info->max_vchans = MAX_VCHANS_PER_QUEUE;
+	dev_info->nb_vchans = MAX_VCHANS_PER_QUEUE;
 	dev_info->dev_capa = RTE_DMA_CAPA_MEM_TO_MEM | RTE_DMA_CAPA_MEM_TO_DEV |
 			     RTE_DMA_CAPA_DEV_TO_MEM | RTE_DMA_CAPA_DEV_TO_DEV |
 			     RTE_DMA_CAPA_OPS_COPY | RTE_DMA_CAPA_OPS_COPY_SG;
@@ -65,13 +65,12 @@ cnxk_dmadev_vchan_setup(struct rte_dma_dev *dev, uint16_t vchan,
 			const struct rte_dma_vchan_conf *conf, uint32_t conf_sz)
 {
 	struct cnxk_dpi_vf_s *dpivf = dev->fp_obj->dev_private;
-	struct cnxk_dpi_conf *dpi_conf = &dpivf->conf;
+	struct cnxk_dpi_conf *dpi_conf = &dpivf->conf[vchan];
 	union dpi_instr_hdr_s *header = &dpi_conf->hdr;
 	uint16_t max_desc;
 	uint32_t size;
 	int i;
 
-	RTE_SET_USED(vchan);
 	RTE_SET_USED(conf_sz);
 
 	if (dpivf->flag & CNXK_DPI_VCHAN_CONFIG)
@@ -148,13 +147,12 @@ cn10k_dmadev_vchan_setup(struct rte_dma_dev *dev, uint16_t vchan,
 			 const struct rte_dma_vchan_conf *conf, uint32_t conf_sz)
 {
 	struct cnxk_dpi_vf_s *dpivf = dev->fp_obj->dev_private;
-	struct cnxk_dpi_conf *dpi_conf = &dpivf->conf;
+	struct cnxk_dpi_conf *dpi_conf = &dpivf->conf[vchan];
 	union dpi_instr_hdr_s *header = &dpi_conf->hdr;
 	uint16_t max_desc;
 	uint32_t size;
 	int i;
 
-	RTE_SET_USED(vchan);
 	RTE_SET_USED(conf_sz);
 
 
@@ -359,18 +357,17 @@ cnxk_dmadev_copy(void *dev_private, uint16_t vchan, rte_iova_t src, rte_iova_t d
 		 uint64_t flags)
 {
 	struct cnxk_dpi_vf_s *dpivf = dev_private;
-	union dpi_instr_hdr_s *header = &dpivf->conf.hdr;
+	struct cnxk_dpi_conf *dpi_conf = &dpivf->conf[vchan];
+	union dpi_instr_hdr_s *header = &dpi_conf->hdr;
 	struct cnxk_dpi_compl_s *comp_ptr;
 	uint64_t cmd[DPI_MAX_CMD_SIZE];
 	rte_iova_t fptr, lptr;
 	int num_words = 0;
 	int rc;
 
-	RTE_SET_USED(vchan);
-
-	comp_ptr = dpivf->conf.c_desc.compl_ptr[dpivf->conf.c_desc.tail];
+	comp_ptr = dpi_conf->c_desc.compl_ptr[dpi_conf->c_desc.tail];
 	header->cn9k.ptr = (uint64_t)comp_ptr;
-	STRM_INC(dpivf->conf.c_desc, tail);
+	STRM_INC(dpi_conf->c_desc, tail);
 
 	header->cn9k.nfst = 1;
 	header->cn9k.nlst = 1;
@@ -399,7 +396,7 @@ cnxk_dmadev_copy(void *dev_private, uint16_t vchan, rte_iova_t src, rte_iova_t d
 
 	rc = __dpi_queue_write(&dpivf->rdpi, cmd, num_words);
 	if (unlikely(rc)) {
-		STRM_DEC(dpivf->conf.c_desc, tail);
+		STRM_DEC(dpi_conf->c_desc, tail);
 		return rc;
 	}
 
@@ -420,18 +417,17 @@ cnxk_dmadev_copy_sg(void *dev_private, uint16_t vchan, const struct rte_dma_sge
 		    const struct rte_dma_sge *dst, uint16_t nb_src, uint16_t nb_dst, uint64_t flags)
 {
 	struct cnxk_dpi_vf_s *dpivf = dev_private;
-	union dpi_instr_hdr_s *header = &dpivf->conf.hdr;
+	struct cnxk_dpi_conf *dpi_conf = &dpivf->conf[vchan];
+	union dpi_instr_hdr_s *header = &dpi_conf->hdr;
 	const struct rte_dma_sge *fptr, *lptr;
 	struct cnxk_dpi_compl_s *comp_ptr;
 	uint64_t cmd[DPI_MAX_CMD_SIZE];
 	int num_words = 0;
 	int i, rc;
 
-	RTE_SET_USED(vchan);
-
-	comp_ptr = dpivf->conf.c_desc.compl_ptr[dpivf->conf.c_desc.tail];
+	comp_ptr = dpi_conf->c_desc.compl_ptr[dpi_conf->c_desc.tail];
 	header->cn9k.ptr = (uint64_t)comp_ptr;
-	STRM_INC(dpivf->conf.c_desc, tail);
+	STRM_INC(dpi_conf->c_desc, tail);
 
 	/*
 	 * For inbound case, src pointers are last pointers.
@@ -467,7 +463,7 @@ cnxk_dmadev_copy_sg(void *dev_private, uint16_t vchan, const struct rte_dma_sge
 
 	rc = __dpi_queue_write(&dpivf->rdpi, cmd, num_words);
 	if (unlikely(rc)) {
-		STRM_DEC(dpivf->conf.c_desc, tail);
+		STRM_DEC(dpi_conf->c_desc, tail);
 		return rc;
 	}
 
@@ -488,18 +484,17 @@ cn10k_dmadev_copy(void *dev_private, uint16_t vchan, rte_iova_t src, rte_iova_t
 		  uint32_t length, uint64_t flags)
 {
 	struct cnxk_dpi_vf_s *dpivf = dev_private;
-	union dpi_instr_hdr_s *header = &dpivf->conf.hdr;
+	struct cnxk_dpi_conf *dpi_conf = &dpivf->conf[vchan];
+	union dpi_instr_hdr_s *header = &dpi_conf->hdr;
 	struct cnxk_dpi_compl_s *comp_ptr;
 	uint64_t cmd[DPI_MAX_CMD_SIZE];
 	rte_iova_t fptr, lptr;
 	int num_words = 0;
 	int rc;
 
-	RTE_SET_USED(vchan);
-
-	comp_ptr = dpivf->conf.c_desc.compl_ptr[dpivf->conf.c_desc.tail];
+	comp_ptr = dpi_conf->c_desc.compl_ptr[dpi_conf->c_desc.tail];
 	header->cn10k.ptr = (uint64_t)comp_ptr;
-	STRM_INC(dpivf->conf.c_desc, tail);
+	STRM_INC(dpi_conf->c_desc, tail);
 
 	header->cn10k.nfst = 1;
 	header->cn10k.nlst = 1;
@@ -519,7 +514,7 @@ cn10k_dmadev_copy(void *dev_private, uint16_t vchan, rte_iova_t src, rte_iova_t
 
 	rc = __dpi_queue_write(&dpivf->rdpi, cmd, num_words);
 	if (unlikely(rc)) {
-		STRM_DEC(dpivf->conf.c_desc, tail);
+		STRM_DEC(dpi_conf->c_desc, tail);
 		return rc;
 	}
 
@@ -541,18 +536,17 @@ cn10k_dmadev_copy_sg(void *dev_private, uint16_t vchan, const struct rte_dma_sge
 		     uint64_t flags)
 {
 	struct cnxk_dpi_vf_s *dpivf = dev_private;
-	union dpi_instr_hdr_s *header = &dpivf->conf.hdr;
+	struct cnxk_dpi_conf *dpi_conf = &dpivf->conf[vchan];
+	union dpi_instr_hdr_s *header = &dpi_conf->hdr;
 	const struct rte_dma_sge *fptr, *lptr;
 	struct cnxk_dpi_compl_s *comp_ptr;
 	uint64_t cmd[DPI_MAX_CMD_SIZE];
 	int num_words = 0;
 	int i, rc;
 
-	RTE_SET_USED(vchan);
-
-	comp_ptr = dpivf->conf.c_desc.compl_ptr[dpivf->conf.c_desc.tail];
+	comp_ptr = dpi_conf->c_desc.compl_ptr[dpi_conf->c_desc.tail];
 	header->cn10k.ptr = (uint64_t)comp_ptr;
-	STRM_INC(dpivf->conf.c_desc, tail);
+	STRM_INC(dpi_conf->c_desc, tail);
 
 	header->cn10k.nfst = nb_src & DPI_MAX_POINTER;
 	header->cn10k.nlst = nb_dst & DPI_MAX_POINTER;
@@ -578,7 +572,7 @@ cn10k_dmadev_copy_sg(void *dev_private, uint16_t vchan, const struct rte_dma_sge
 
 	rc = __dpi_queue_write(&dpivf->rdpi, cmd, num_words);
 	if (unlikely(rc)) {
-		STRM_DEC(dpivf->conf.c_desc, tail);
+		STRM_DEC(dpi_conf->c_desc, tail);
 		return rc;
 	}
 
@@ -599,12 +593,11 @@ cnxk_dmadev_completed(void *dev_private, uint16_t vchan, const uint16_t nb_cpls,
 		      bool *has_error)
 {
 	struct cnxk_dpi_vf_s *dpivf = dev_private;
-	struct cnxk_dpi_cdesc_data_s *c_desc = &dpivf->conf.c_desc;
+	struct cnxk_dpi_conf *dpi_conf = &dpivf->conf[vchan];
+	struct cnxk_dpi_cdesc_data_s *c_desc = &dpi_conf->c_desc;
 	struct cnxk_dpi_compl_s *comp_ptr;
 	int cnt;
 
-	RTE_SET_USED(vchan);
-
 	for (cnt = 0; cnt < nb_cpls; cnt++) {
 		comp_ptr = c_desc->compl_ptr[c_desc->head];
 
@@ -632,11 +625,11 @@ cnxk_dmadev_completed_status(void *dev_private, uint16_t vchan, const uint16_t n
 			     uint16_t *last_idx, enum rte_dma_status_code *status)
 {
 	struct cnxk_dpi_vf_s *dpivf = dev_private;
-	struct cnxk_dpi_cdesc_data_s *c_desc = &dpivf->conf.c_desc;
+	struct cnxk_dpi_conf *dpi_conf = &dpivf->conf[vchan];
+	struct cnxk_dpi_cdesc_data_s *c_desc = &dpi_conf->c_desc;
 	struct cnxk_dpi_compl_s *comp_ptr;
 	int cnt;
 
-	RTE_SET_USED(vchan);
 	RTE_SET_USED(last_idx);
 
 	for (cnt = 0; cnt < nb_cpls; cnt++) {
@@ -662,11 +655,10 @@ static uint16_t
 cnxk_damdev_burst_capacity(const void *dev_private, uint16_t vchan)
 {
 	const struct cnxk_dpi_vf_s *dpivf = (const struct cnxk_dpi_vf_s *)dev_private;
+	const struct cnxk_dpi_conf *dpi_conf = &dpivf->conf[vchan];
 	uint16_t burst_cap;
 
-	RTE_SET_USED(vchan);
-
-	burst_cap = dpivf->conf.c_desc.max_cnt -
+	burst_cap = dpi_conf->c_desc.max_cnt -
 		    ((dpivf->stats.submitted - dpivf->stats.completed) + dpivf->pending) + 1;
 
 	return burst_cap;
diff --git a/drivers/dma/cnxk/cnxk_dmadev.h b/drivers/dma/cnxk/cnxk_dmadev.h
index 9563295af0..4693960a19 100644
--- a/drivers/dma/cnxk/cnxk_dmadev.h
+++ b/drivers/dma/cnxk/cnxk_dmadev.h
@@ -6,10 +6,11 @@
 
 #include <roc_api.h>
 
-#define DPI_MAX_POINTER	 15
-#define STRM_INC(s, var) ((s).var = ((s).var + 1) & (s).max_cnt)
-#define STRM_DEC(s, var) ((s).var = ((s).var - 1) == -1 ? (s).max_cnt : ((s).var - 1))
-#define DPI_MAX_DESC	 1024
+#define DPI_MAX_POINTER	     15
+#define STRM_INC(s, var)     ((s).var = ((s).var + 1) & (s).max_cnt)
+#define STRM_DEC(s, var)     ((s).var = ((s).var - 1) == -1 ? (s).max_cnt : ((s).var - 1))
+#define DPI_MAX_DESC	     1024
+#define MAX_VCHANS_PER_QUEUE 4
 
 /* Set Completion data to 0xFF when request submitted,
  * upon successful request completion engine reset to completion status
@@ -39,7 +40,7 @@ struct cnxk_dpi_conf {
 
 struct cnxk_dpi_vf_s {
 	struct roc_dpi rdpi;
-	struct cnxk_dpi_conf conf;
+	struct cnxk_dpi_conf conf[MAX_VCHANS_PER_QUEUE];
 	struct rte_dma_stats stats;
 	uint16_t pending;
 	uint16_t pnum_words;
-- 
2.25.1


^ permalink raw reply	[flat|nested] 46+ messages in thread

* [PATCH v5 10/12] dma/cnxk: vchan support enhancement
  2023-08-23 11:15       ` [PATCH v5 01/12] common/cnxk: use unique name for DPI memzone Amit Prakash Shukla
                           ` (7 preceding siblings ...)
  2023-08-23 11:15         ` [PATCH v5 09/12] dma/cnxk: increase vchan per queue to max 4 Amit Prakash Shukla
@ 2023-08-23 11:15         ` Amit Prakash Shukla
  2023-08-23 11:15         ` [PATCH v5 11/12] dma/cnxk: add completion ring tail wrap check Amit Prakash Shukla
                           ` (2 subsequent siblings)
  11 siblings, 0 replies; 46+ messages in thread
From: Amit Prakash Shukla @ 2023-08-23 11:15 UTC (permalink / raw)
  To: Vamsi Attunuru; +Cc: dev, jerinj, Amit Prakash Shukla

Code changes to realign dpi private structure based on vchan.
Changeset also resets DMA dev stats while starting dma device.

Signed-off-by: Amit Prakash Shukla <amitprakashs@marvell.com>
---
v2:
- Fix for bugs observed in v1.
- Squashed few commits.

v3:
- Resolved review suggestions.
- Code improvement.

v4:
- Resolved checkpatch warnings.

v5:
- Updated commit message.
- Split the commits.

 drivers/dma/cnxk/cnxk_dmadev.c | 209 ++++++++++++++++++++++++---------
 drivers/dma/cnxk/cnxk_dmadev.h |  18 +--
 2 files changed, 165 insertions(+), 62 deletions(-)

diff --git a/drivers/dma/cnxk/cnxk_dmadev.c b/drivers/dma/cnxk/cnxk_dmadev.c
index 2193b4628f..0b77543f6a 100644
--- a/drivers/dma/cnxk/cnxk_dmadev.c
+++ b/drivers/dma/cnxk/cnxk_dmadev.c
@@ -16,35 +16,79 @@
 
 #include <cnxk_dmadev.h>
 
+static int cnxk_stats_reset(struct rte_dma_dev *dev, uint16_t vchan);
+
 static int
 cnxk_dmadev_info_get(const struct rte_dma_dev *dev, struct rte_dma_info *dev_info, uint32_t size)
 {
-	RTE_SET_USED(dev);
+	struct cnxk_dpi_vf_s *dpivf = dev->fp_obj->dev_private;
 	RTE_SET_USED(size);
 
 	dev_info->max_vchans = MAX_VCHANS_PER_QUEUE;
-	dev_info->nb_vchans = MAX_VCHANS_PER_QUEUE;
+	dev_info->nb_vchans = dpivf->num_vchans;
 	dev_info->dev_capa = RTE_DMA_CAPA_MEM_TO_MEM | RTE_DMA_CAPA_MEM_TO_DEV |
 			     RTE_DMA_CAPA_DEV_TO_MEM | RTE_DMA_CAPA_DEV_TO_DEV |
 			     RTE_DMA_CAPA_OPS_COPY | RTE_DMA_CAPA_OPS_COPY_SG;
 	dev_info->max_desc = DPI_MAX_DESC;
-	dev_info->min_desc = 2;
+	dev_info->min_desc = DPI_MIN_DESC;
 	dev_info->max_sges = DPI_MAX_POINTER;
 
 	return 0;
 }
 
+static int
+cnxk_dmadev_vchan_free(struct cnxk_dpi_vf_s *dpivf, uint16_t vchan)
+{
+	struct cnxk_dpi_conf *dpi_conf;
+	uint16_t num_vchans;
+	uint16_t max_desc;
+	int i, j;
+
+	if (vchan == RTE_DMA_ALL_VCHAN) {
+		num_vchans = dpivf->num_vchans;
+		i = 0;
+	} else {
+		if (vchan >= MAX_VCHANS_PER_QUEUE)
+			return -EINVAL;
+
+		num_vchans = vchan + 1;
+		i = vchan;
+	}
+
+	for (; i < num_vchans; i++) {
+		dpi_conf = &dpivf->conf[i];
+		max_desc = dpi_conf->c_desc.max_cnt;
+		if (dpi_conf->c_desc.compl_ptr) {
+			for (j = 0; j < max_desc; j++)
+				rte_free(dpi_conf->c_desc.compl_ptr[j]);
+		}
+
+		rte_free(dpi_conf->c_desc.compl_ptr);
+		dpi_conf->c_desc.compl_ptr = NULL;
+	}
+
+	return 0;
+}
+
 static int
 cnxk_dmadev_configure(struct rte_dma_dev *dev, const struct rte_dma_conf *conf, uint32_t conf_sz)
 {
 	struct cnxk_dpi_vf_s *dpivf = NULL;
 	int rc = 0;
 
-	RTE_SET_USED(conf);
 	RTE_SET_USED(conf_sz);
 
 	dpivf = dev->fp_obj->dev_private;
 
+	/* Accept only number of vchans as config from application. */
+	if (!(dpivf->flag & CNXK_DPI_DEV_START)) {
+		/* After config function, vchan setup function has to be called.
+		 * Free up vchan memory if any, before configuring num_vchans.
+		 */
+		cnxk_dmadev_vchan_free(dpivf, RTE_DMA_ALL_VCHAN);
+		dpivf->num_vchans = conf->nb_vchans;
+	}
+
 	if (dpivf->flag & CNXK_DPI_DEV_CONFIG)
 		return rc;
 
@@ -73,7 +117,7 @@ cnxk_dmadev_vchan_setup(struct rte_dma_dev *dev, uint16_t vchan,
 
 	RTE_SET_USED(conf_sz);
 
-	if (dpivf->flag & CNXK_DPI_VCHAN_CONFIG)
+	if (dpivf->flag & CNXK_DPI_DEV_START)
 		return 0;
 
 	header->cn9k.pt = DPI_HDR_PT_ZBW_CA;
@@ -112,6 +156,9 @@ cnxk_dmadev_vchan_setup(struct rte_dma_dev *dev, uint16_t vchan,
 		header->cn9k.pvfe = 0;
 	};
 
+	/* Free up descriptor memory before allocating. */
+	cnxk_dmadev_vchan_free(dpivf, vchan);
+
 	max_desc = conf->nb_desc;
 	if (!rte_is_power_of_2(max_desc))
 		max_desc = rte_align32pow2(max_desc);
@@ -130,14 +177,15 @@ cnxk_dmadev_vchan_setup(struct rte_dma_dev *dev, uint16_t vchan,
 	for (i = 0; i < max_desc; i++) {
 		dpi_conf->c_desc.compl_ptr[i] =
 			rte_zmalloc(NULL, sizeof(struct cnxk_dpi_compl_s), 0);
+		if (!dpi_conf->c_desc.compl_ptr[i]) {
+			plt_err("Failed to allocate for descriptor memory");
+			return -ENOMEM;
+		}
+
 		dpi_conf->c_desc.compl_ptr[i]->cdata = DPI_REQ_CDATA;
 	}
 
 	dpi_conf->c_desc.max_cnt = (max_desc - 1);
-	dpi_conf->c_desc.head = 0;
-	dpi_conf->c_desc.tail = 0;
-	dpivf->pending = 0;
-	dpivf->flag |= CNXK_DPI_VCHAN_CONFIG;
 
 	return 0;
 }
@@ -155,8 +203,7 @@ cn10k_dmadev_vchan_setup(struct rte_dma_dev *dev, uint16_t vchan,
 
 	RTE_SET_USED(conf_sz);
 
-
-	if (dpivf->flag & CNXK_DPI_VCHAN_CONFIG)
+	if (dpivf->flag & CNXK_DPI_DEV_START)
 		return 0;
 
 	header->cn10k.pt = DPI_HDR_PT_ZBW_CA;
@@ -195,6 +242,9 @@ cn10k_dmadev_vchan_setup(struct rte_dma_dev *dev, uint16_t vchan,
 		header->cn10k.pvfe = 0;
 	};
 
+	/* Free up descriptor memory before allocating. */
+	cnxk_dmadev_vchan_free(dpivf, vchan);
+
 	max_desc = conf->nb_desc;
 	if (!rte_is_power_of_2(max_desc))
 		max_desc = rte_align32pow2(max_desc);
@@ -213,14 +263,14 @@ cn10k_dmadev_vchan_setup(struct rte_dma_dev *dev, uint16_t vchan,
 	for (i = 0; i < max_desc; i++) {
 		dpi_conf->c_desc.compl_ptr[i] =
 			rte_zmalloc(NULL, sizeof(struct cnxk_dpi_compl_s), 0);
+		if (!dpi_conf->c_desc.compl_ptr[i]) {
+			plt_err("Failed to allocate for descriptor memory");
+			return -ENOMEM;
+		}
 		dpi_conf->c_desc.compl_ptr[i]->cdata = DPI_REQ_CDATA;
 	}
 
 	dpi_conf->c_desc.max_cnt = (max_desc - 1);
-	dpi_conf->c_desc.head = 0;
-	dpi_conf->c_desc.tail = 0;
-	dpivf->pending = 0;
-	dpivf->flag |= CNXK_DPI_VCHAN_CONFIG;
 
 	return 0;
 }
@@ -229,13 +279,27 @@ static int
 cnxk_dmadev_start(struct rte_dma_dev *dev)
 {
 	struct cnxk_dpi_vf_s *dpivf = dev->fp_obj->dev_private;
+	struct cnxk_dpi_conf *dpi_conf;
+	int i, j;
 
 	if (dpivf->flag & CNXK_DPI_DEV_START)
 		return 0;
 
-	dpivf->desc_idx = 0;
-	dpivf->pending = 0;
-	dpivf->pnum_words = 0;
+	for (i = 0; i < dpivf->num_vchans; i++) {
+		dpi_conf = &dpivf->conf[i];
+		dpi_conf->c_desc.head = 0;
+		dpi_conf->c_desc.tail = 0;
+		dpi_conf->pnum_words = 0;
+		dpi_conf->pending = 0;
+		dpi_conf->desc_idx = 0;
+		for (j = 0; j < dpi_conf->c_desc.max_cnt; j++) {
+			if (dpi_conf->c_desc.compl_ptr[j])
+				dpi_conf->c_desc.compl_ptr[j]->cdata = DPI_REQ_CDATA;
+		}
+
+		cnxk_stats_reset(dev, i);
+	}
+
 	roc_dpi_enable(&dpivf->rdpi);
 
 	dpivf->flag |= CNXK_DPI_DEV_START;
@@ -249,7 +313,6 @@ cnxk_dmadev_stop(struct rte_dma_dev *dev)
 	struct cnxk_dpi_vf_s *dpivf = dev->fp_obj->dev_private;
 
 	roc_dpi_disable(&dpivf->rdpi);
-
 	dpivf->flag &= ~CNXK_DPI_DEV_START;
 
 	return 0;
@@ -261,8 +324,10 @@ cnxk_dmadev_close(struct rte_dma_dev *dev)
 	struct cnxk_dpi_vf_s *dpivf = dev->fp_obj->dev_private;
 
 	roc_dpi_disable(&dpivf->rdpi);
+	cnxk_dmadev_vchan_free(dpivf, RTE_DMA_ALL_VCHAN);
 	roc_dpi_dev_fini(&dpivf->rdpi);
 
+	/* Clear all flags as we close the device. */
 	dpivf->flag = 0;
 
 	return 0;
@@ -403,13 +468,13 @@ cnxk_dmadev_copy(void *dev_private, uint16_t vchan, rte_iova_t src, rte_iova_t d
 	if (flags & RTE_DMA_OP_FLAG_SUBMIT) {
 		rte_wmb();
 		plt_write64(num_words, dpivf->rdpi.rbase + DPI_VDMA_DBELL);
-		dpivf->stats.submitted++;
+		dpi_conf->stats.submitted++;
 	} else {
-		dpivf->pnum_words += num_words;
-		dpivf->pending++;
+		dpi_conf->pnum_words += num_words;
+		dpi_conf->pending++;
 	}
 
-	return (dpivf->desc_idx++);
+	return (dpi_conf->desc_idx++);
 }
 
 static int
@@ -470,13 +535,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);
-		dpivf->stats.submitted += nb_src;
+		dpi_conf->stats.submitted += nb_src;
 	} else {
-		dpivf->pnum_words += num_words;
-		dpivf->pending++;
+		dpi_conf->pnum_words += num_words;
+		dpi_conf->pending++;
 	}
 
-	return (dpivf->desc_idx++);
+	return (dpi_conf->desc_idx++);
 }
 
 static int
@@ -521,13 +586,13 @@ cn10k_dmadev_copy(void *dev_private, uint16_t vchan, rte_iova_t src, rte_iova_t
 	if (flags & RTE_DMA_OP_FLAG_SUBMIT) {
 		rte_wmb();
 		plt_write64(num_words, dpivf->rdpi.rbase + DPI_VDMA_DBELL);
-		dpivf->stats.submitted++;
+		dpi_conf->stats.submitted++;
 	} else {
-		dpivf->pnum_words += num_words;
-		dpivf->pending++;
+		dpi_conf->pnum_words += num_words;
+		dpi_conf->pending++;
 	}
 
-	return dpivf->desc_idx++;
+	return dpi_conf->desc_idx++;
 }
 
 static int
@@ -579,13 +644,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);
-		dpivf->stats.submitted += nb_src;
+		dpi_conf->stats.submitted += nb_src;
 	} else {
-		dpivf->pnum_words += num_words;
-		dpivf->pending++;
+		dpi_conf->pnum_words += num_words;
+		dpi_conf->pending++;
 	}
 
-	return (dpivf->desc_idx++);
+	return (dpi_conf->desc_idx++);
 }
 
 static uint16_t
@@ -605,7 +670,7 @@ cnxk_dmadev_completed(void *dev_private, uint16_t vchan, const uint16_t nb_cpls,
 			if (comp_ptr->cdata == DPI_REQ_CDATA)
 				break;
 			*has_error = 1;
-			dpivf->stats.errors++;
+			dpi_conf->stats.errors++;
 			STRM_INC(*c_desc, head);
 			break;
 		}
@@ -614,8 +679,8 @@ cnxk_dmadev_completed(void *dev_private, uint16_t vchan, const uint16_t nb_cpls,
 		STRM_INC(*c_desc, head);
 	}
 
-	dpivf->stats.completed += cnt;
-	*last_idx = dpivf->stats.completed - 1;
+	dpi_conf->stats.completed += cnt;
+	*last_idx = dpi_conf->stats.completed - 1;
 
 	return cnt;
 }
@@ -639,14 +704,14 @@ cnxk_dmadev_completed_status(void *dev_private, uint16_t vchan, const uint16_t n
 			if (status[cnt] == DPI_REQ_CDATA)
 				break;
 
-			dpivf->stats.errors++;
+			dpi_conf->stats.errors++;
 		}
 		comp_ptr->cdata = DPI_REQ_CDATA;
 		STRM_INC(*c_desc, head);
 	}
 
-	dpivf->stats.completed += cnt;
-	*last_idx = dpivf->stats.completed - 1;
+	dpi_conf->stats.completed += cnt;
+	*last_idx = dpi_conf->stats.completed - 1;
 
 	return cnt;
 }
@@ -659,26 +724,28 @@ cnxk_damdev_burst_capacity(const void *dev_private, uint16_t vchan)
 	uint16_t burst_cap;
 
 	burst_cap = dpi_conf->c_desc.max_cnt -
-		    ((dpivf->stats.submitted - dpivf->stats.completed) + dpivf->pending) + 1;
+		    ((dpi_conf->stats.submitted - dpi_conf->stats.completed) + dpi_conf->pending) +
+		    1;
 
 	return burst_cap;
 }
 
 static int
-cnxk_dmadev_submit(void *dev_private, uint16_t vchan __rte_unused)
+cnxk_dmadev_submit(void *dev_private, uint16_t vchan)
 {
 	struct cnxk_dpi_vf_s *dpivf = dev_private;
-	uint32_t num_words = dpivf->pnum_words;
+	struct cnxk_dpi_conf *dpi_conf = &dpivf->conf[vchan];
+	uint32_t num_words = dpi_conf->pnum_words;
 
-	if (!dpivf->pnum_words)
+	if (!dpi_conf->pnum_words)
 		return 0;
 
 	rte_wmb();
 	plt_write64(num_words, dpivf->rdpi.rbase + DPI_VDMA_DBELL);
 
-	dpivf->stats.submitted += dpivf->pending;
-	dpivf->pnum_words = 0;
-	dpivf->pending = 0;
+	dpi_conf->stats.submitted += dpi_conf->pending;
+	dpi_conf->pnum_words = 0;
+	dpi_conf->pending = 0;
 
 	return 0;
 }
@@ -688,25 +755,59 @@ cnxk_stats_get(const struct rte_dma_dev *dev, uint16_t vchan, struct rte_dma_sta
 	       uint32_t size)
 {
 	struct cnxk_dpi_vf_s *dpivf = dev->fp_obj->dev_private;
-	struct rte_dma_stats *stats = &dpivf->stats;
-
-	RTE_SET_USED(vchan);
+	struct cnxk_dpi_conf *dpi_conf;
+	int i;
 
 	if (size < sizeof(rte_stats))
 		return -EINVAL;
 	if (rte_stats == NULL)
 		return -EINVAL;
 
-	*rte_stats = *stats;
+	/* Stats of all vchans requested. */
+	if (vchan == RTE_DMA_ALL_VCHAN) {
+		for (i = 0; i < dpivf->num_vchans; i++) {
+			dpi_conf = &dpivf->conf[i];
+			rte_stats->submitted += dpi_conf->stats.submitted;
+			rte_stats->completed += dpi_conf->stats.completed;
+			rte_stats->errors += dpi_conf->stats.errors;
+		}
+
+		goto done;
+	}
+
+	if (vchan >= MAX_VCHANS_PER_QUEUE)
+		return -EINVAL;
+
+	dpi_conf = &dpivf->conf[vchan];
+	*rte_stats = dpi_conf->stats;
+
+done:
 	return 0;
 }
 
 static int
-cnxk_stats_reset(struct rte_dma_dev *dev, uint16_t vchan __rte_unused)
+cnxk_stats_reset(struct rte_dma_dev *dev, uint16_t vchan)
 {
 	struct cnxk_dpi_vf_s *dpivf = dev->fp_obj->dev_private;
+	struct cnxk_dpi_conf *dpi_conf;
+	int i;
+
+	/* clear stats of all vchans. */
+	if (vchan == RTE_DMA_ALL_VCHAN) {
+		for (i = 0; i < dpivf->num_vchans; i++) {
+			dpi_conf = &dpivf->conf[i];
+			dpi_conf->stats = (struct rte_dma_stats){0};
+		}
+
+		return 0;
+	}
+
+	if (vchan >= MAX_VCHANS_PER_QUEUE)
+		return -EINVAL;
+
+	dpi_conf = &dpivf->conf[vchan];
+	dpi_conf->stats = (struct rte_dma_stats){0};
 
-	dpivf->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 4693960a19..f375143b16 100644
--- a/drivers/dma/cnxk/cnxk_dmadev.h
+++ b/drivers/dma/cnxk/cnxk_dmadev.h
@@ -10,6 +10,7 @@
 #define STRM_INC(s, var)     ((s).var = ((s).var + 1) & (s).max_cnt)
 #define STRM_DEC(s, var)     ((s).var = ((s).var - 1) == -1 ? (s).max_cnt : ((s).var - 1))
 #define DPI_MAX_DESC	     1024
+#define DPI_MIN_DESC	     2
 #define MAX_VCHANS_PER_QUEUE 4
 
 /* Set Completion data to 0xFF when request submitted,
@@ -17,9 +18,8 @@
  */
 #define DPI_REQ_CDATA 0xFF
 
-#define CNXK_DPI_DEV_CONFIG   (1ULL << 0)
-#define CNXK_DPI_VCHAN_CONFIG (1ULL << 1)
-#define CNXK_DPI_DEV_START    (1ULL << 2)
+#define CNXK_DPI_DEV_CONFIG (1ULL << 0)
+#define CNXK_DPI_DEV_START  (1ULL << 1)
 
 struct cnxk_dpi_compl_s {
 	uint64_t cdata;
@@ -36,16 +36,18 @@ struct cnxk_dpi_cdesc_data_s {
 struct cnxk_dpi_conf {
 	union dpi_instr_hdr_s hdr;
 	struct cnxk_dpi_cdesc_data_s c_desc;
+	uint16_t pnum_words;
+	uint16_t pending;
+	uint16_t desc_idx;
+	uint16_t pad0;
+	struct rte_dma_stats stats;
 };
 
 struct cnxk_dpi_vf_s {
 	struct roc_dpi rdpi;
 	struct cnxk_dpi_conf conf[MAX_VCHANS_PER_QUEUE];
-	struct rte_dma_stats stats;
-	uint16_t pending;
-	uint16_t pnum_words;
-	uint16_t desc_idx;
+	uint16_t num_vchans;
 	uint16_t flag;
-};
+} __plt_cache_aligned;
 
 #endif
-- 
2.25.1


^ permalink raw reply	[flat|nested] 46+ messages in thread

* [PATCH v5 11/12] dma/cnxk: add completion ring tail wrap check
  2023-08-23 11:15       ` [PATCH v5 01/12] common/cnxk: use unique name for DPI memzone Amit Prakash Shukla
                           ` (8 preceding siblings ...)
  2023-08-23 11:15         ` [PATCH v5 10/12] dma/cnxk: vchan support enhancement Amit Prakash Shukla
@ 2023-08-23 11:15         ` Amit Prakash Shukla
  2023-08-23 11:15         ` [PATCH v5 12/12] dma/cnxk: track last index return value Amit Prakash Shukla
  2023-08-23 15:30         ` [PATCH v5 01/12] common/cnxk: use unique name for DPI memzone Jerin Jacob
  11 siblings, 0 replies; 46+ messages in thread
From: Amit Prakash Shukla @ 2023-08-23 11:15 UTC (permalink / raw)
  To: Vamsi Attunuru; +Cc: dev, jerinj, stable

From: Vamsi Attunuru <vattunuru@marvell.com>

Adds a check to avoid tail wrap when completion desc ring
is full. Also patch increase max desc size to 2048.

Fixes: b56f1e2dad38 ("dma/cnxk: add channel operations")
Fixes: 3340c3e22783 ("dma/cnxk: add scatter-gather copy")
Fixes: 681851b347ad ("dma/cnxk: support CN10K DMA engine")
Cc: stable@dpdk.org

Signed-off-by: Vamsi Attunuru <vattunuru@marvell.com>
---
v2:
- Fix for bugs observed in v1.
- Squashed few commits.

v3:
- Resolved review suggestions.
- Code improvement.

v4:
- Resolved checkpatch warnings.

v5:
- Updated commit message.
- Split the commits.

 drivers/dma/cnxk/cnxk_dmadev.c | 22 ++++++++++++++++++++--
 drivers/dma/cnxk/cnxk_dmadev.h |  2 +-
 2 files changed, 21 insertions(+), 3 deletions(-)

diff --git a/drivers/dma/cnxk/cnxk_dmadev.c b/drivers/dma/cnxk/cnxk_dmadev.c
index 0b77543f6a..89ff4c18ac 100644
--- a/drivers/dma/cnxk/cnxk_dmadev.c
+++ b/drivers/dma/cnxk/cnxk_dmadev.c
@@ -434,6 +434,11 @@ cnxk_dmadev_copy(void *dev_private, uint16_t vchan, rte_iova_t src, rte_iova_t d
 	header->cn9k.ptr = (uint64_t)comp_ptr;
 	STRM_INC(dpi_conf->c_desc, tail);
 
+	if (unlikely(dpi_conf->c_desc.tail == dpi_conf->c_desc.head)) {
+		STRM_DEC(dpi_conf->c_desc, tail);
+		return -ENOSPC;
+	}
+
 	header->cn9k.nfst = 1;
 	header->cn9k.nlst = 1;
 
@@ -494,6 +499,11 @@ cnxk_dmadev_copy_sg(void *dev_private, uint16_t vchan, const struct rte_dma_sge
 	header->cn9k.ptr = (uint64_t)comp_ptr;
 	STRM_INC(dpi_conf->c_desc, tail);
 
+	if (unlikely(dpi_conf->c_desc.tail == dpi_conf->c_desc.head)) {
+		STRM_DEC(dpi_conf->c_desc, tail);
+		return -ENOSPC;
+	}
+
 	/*
 	 * For inbound case, src pointers are last pointers.
 	 * For all other cases, src pointers are first pointers.
@@ -561,6 +571,11 @@ cn10k_dmadev_copy(void *dev_private, uint16_t vchan, rte_iova_t src, rte_iova_t
 	header->cn10k.ptr = (uint64_t)comp_ptr;
 	STRM_INC(dpi_conf->c_desc, tail);
 
+	if (unlikely(dpi_conf->c_desc.tail == dpi_conf->c_desc.head)) {
+		STRM_DEC(dpi_conf->c_desc, tail);
+		return -ENOSPC;
+	}
+
 	header->cn10k.nfst = 1;
 	header->cn10k.nlst = 1;
 
@@ -613,6 +628,11 @@ cn10k_dmadev_copy_sg(void *dev_private, uint16_t vchan, const struct rte_dma_sge
 	header->cn10k.ptr = (uint64_t)comp_ptr;
 	STRM_INC(dpi_conf->c_desc, tail);
 
+	if (unlikely(dpi_conf->c_desc.tail == dpi_conf->c_desc.head)) {
+		STRM_DEC(dpi_conf->c_desc, tail);
+		return -ENOSPC;
+	}
+
 	header->cn10k.nfst = nb_src & DPI_MAX_POINTER;
 	header->cn10k.nlst = nb_dst & DPI_MAX_POINTER;
 	fptr = &src[0];
@@ -695,8 +715,6 @@ cnxk_dmadev_completed_status(void *dev_private, uint16_t vchan, const uint16_t n
 	struct cnxk_dpi_compl_s *comp_ptr;
 	int cnt;
 
-	RTE_SET_USED(last_idx);
-
 	for (cnt = 0; cnt < nb_cpls; cnt++) {
 		comp_ptr = c_desc->compl_ptr[c_desc->head];
 		status[cnt] = comp_ptr->cdata;
diff --git a/drivers/dma/cnxk/cnxk_dmadev.h b/drivers/dma/cnxk/cnxk_dmadev.h
index f375143b16..9c6c898d23 100644
--- a/drivers/dma/cnxk/cnxk_dmadev.h
+++ b/drivers/dma/cnxk/cnxk_dmadev.h
@@ -9,7 +9,7 @@
 #define DPI_MAX_POINTER	     15
 #define STRM_INC(s, var)     ((s).var = ((s).var + 1) & (s).max_cnt)
 #define STRM_DEC(s, var)     ((s).var = ((s).var - 1) == -1 ? (s).max_cnt : ((s).var - 1))
-#define DPI_MAX_DESC	     1024
+#define DPI_MAX_DESC	     2048
 #define DPI_MIN_DESC	     2
 #define MAX_VCHANS_PER_QUEUE 4
 
-- 
2.25.1


^ permalink raw reply	[flat|nested] 46+ messages in thread

* [PATCH v5 12/12] dma/cnxk: track last index return value
  2023-08-23 11:15       ` [PATCH v5 01/12] common/cnxk: use unique name for DPI memzone Amit Prakash Shukla
                           ` (9 preceding siblings ...)
  2023-08-23 11:15         ` [PATCH v5 11/12] dma/cnxk: add completion ring tail wrap check Amit Prakash Shukla
@ 2023-08-23 11:15         ` Amit Prakash Shukla
  2023-08-23 15:30         ` [PATCH v5 01/12] common/cnxk: use unique name for DPI memzone Jerin Jacob
  11 siblings, 0 replies; 46+ messages in thread
From: Amit Prakash Shukla @ 2023-08-23 11:15 UTC (permalink / raw)
  To: Vamsi Attunuru; +Cc: dev, jerinj

From: Vamsi Attunuru <vattunuru@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 changes.

Signed-off-by: Vamsi Attunuru <vattunuru@marvell.com>
---
v2:
- Fix for bugs observed in v1.
- Squashed few commits.

v3:
- Resolved review suggestions.
- Code improvement.

v4:
- Resolved checkpatch warnings.

v5:
- Updated commit message.
- Split the commits.

 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 89ff4c18ac..eec6a897e2 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


^ permalink raw reply	[flat|nested] 46+ messages in thread

* Re: [PATCH v5 01/12] common/cnxk: use unique name for DPI memzone
  2023-08-23 11:15       ` [PATCH v5 01/12] common/cnxk: use unique name for DPI memzone Amit Prakash Shukla
                           ` (10 preceding siblings ...)
  2023-08-23 11:15         ` [PATCH v5 12/12] dma/cnxk: track last index return value Amit Prakash Shukla
@ 2023-08-23 15:30         ` Jerin Jacob
  11 siblings, 0 replies; 46+ messages in thread
From: Jerin Jacob @ 2023-08-23 15:30 UTC (permalink / raw)
  To: Amit Prakash Shukla
  Cc: Nithin Dabilpuram, Kiran Kumar K, Sunil Kumar Kori, Satha Rao,
	dev, jerinj, stable, Radha Mohan Chintakuntla

On Wed, Aug 23, 2023 at 4:45 PM Amit Prakash Shukla
<amitprakashs@marvell.com> wrote:
>
> roc_dpi was using vfid as part of name for memzone allocation.
> This led to memzone allocation failure in case of multiple
> physical functions. vfid is not unique by itself since multiple
> physical functions can have the same virtual function indices.
> So use complete DBDF as part of memzone name to make it unique.
>
> Fixes: b6e395692b6d ("common/cnxk: add DPI DMA support")
> Cc: stable@dpdk.org
>
> Signed-off-by: Radha Mohan Chintakuntla <radhac@marvell.com>
> Signed-off-by: Amit Prakash Shukla <amitprakashs@marvell.com>


Updated the git commit as follows and series applied to
dpdk-next-net-mrvl/for-next-net. Thanks


commit 33e784c82a1f0e97cbc10e5a5bcd0bdc4738b3de (HEAD -> for-next-net)
Author: Vamsi Attunuru <vattunuru@marvell.com>
Date:   Wed Aug 23 16:45:25 2023 +0530

    dma/cnxk: track last index return value

    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 changes.

    Signed-off-by: Vamsi Attunuru <vattunuru@marvell.com>

commit 93d72a0046aa924b9f36848b73027c181347c9e8
Author: Vamsi Attunuru <vattunuru@marvell.com>
Date:   Wed Aug 23 16:45:24 2023 +0530

    dma/cnxk: fix completion ring tail wrap

    Adds a check to avoid tail wrap when completion desc ring
    is full. Also patch increase max desc size to 2048.

    Fixes: b56f1e2dad38 ("dma/cnxk: add channel operations")
    Fixes: 3340c3e22783 ("dma/cnxk: add scatter-gather copy")
    Fixes: 681851b347ad ("dma/cnxk: support CN10K DMA engine")
    Cc: stable@dpdk.org

    Signed-off-by: Vamsi Attunuru <vattunuru@marvell.com>

commit 71d2cd2221fcd4715eb33a866a33ba8bc8be54f5
Author: Amit Prakash Shukla <amitprakashs@marvell.com>
Date:   Wed Aug 23 16:45:23 2023 +0530

    dma/cnxk: enhance vchan support

    Added changes to realign dpi private structure based on vchan.
    Also resets DMA dev stats while starting dma device.

    Signed-off-by: Amit Prakash Shukla <amitprakashs@marvell.com>

commit 370fabc5515b3b459c0bf21596a26bd3ca754bf8
Author: Amit Prakash Shukla <amitprakashs@marvell.com>
Date:   Wed Aug 23 16:45:22 2023 +0530

    dma/cnxk: increase vchan per queue to max 4

    To support multiple directions in same queue make use of multiple vchan
    per queue. Each vchan can be configured in some direction and used.

    Signed-off-by: Amit Prakash Shukla <amitprakashs@marvell.com>
    Signed-off-by: Radha Mohan Chintakuntla <radhac@marvell.com>

commit 495d2689eb21fffe0c2cc9a090971f656c736770
Author: Amit Prakash Shukla <amitprakashs@marvell.com>
Date:   Wed Aug 23 16:45:21 2023 +0530

    dma/cnxk: update func field based on transfer type

    Use pfid and vfid of src_port for incoming DMA transfers and dst_port
    for outgoing DMA transfers.

    Signed-off-by: Radha Mohan Chintakuntla <radhac@marvell.com>
    Signed-off-by: Amit Prakash Shukla <amitprakashs@marvell.com>

commit b938db4eb11b4b9dfdd9929516cdb9d714942189
Author: Amit Prakash Shukla <amitprakashs@marvell.com>
Date:   Wed Aug 23 16:45:20 2023 +0530

    dma/cnxk: support all models of cn10xxx

    Valid function pointers are set for DMA device operations
    i.e. cn10k_dmadev_ops are used for all cn10k devices.

    Signed-off-by: Radha Mohan Chintakuntla <radhac@marvell.com>
    Signed-off-by: Amit Prakash Shukla <amitprakashs@marvell.com>

commit a3b4b6da918c7380d9ffbf24f670c4bcf1e27494
Author: Amit Prakash Shukla <amitprakashs@marvell.com>
Date:   Wed Aug 23 16:45:19 2023 +0530

    dma/cnxk: fix chunk buffer failure return code

    On chunk buffer alloc failure, ENOMEM is returned. As per DMA spec
    ENOSPC shall be returned on failure to allocate memory. This
    changeset fixes the same.

    Fixes: b56f1e2dad38 ("dma/cnxk: add channel operations")
    Cc: stable@dpdk.org

    Signed-off-by: Amit Prakash Shukla <amitprakashs@marvell.com>

commit 28392a849e9e04040ad49a3c61d0d0f3f39ff6e3
Author: Amit Prakash Shukla <amitprakashs@marvell.com>
Date:   Wed Aug 23 16:45:18 2023 +0530

    dma/cnxk: make completion ring buffer as dynamic

    Completion buffer was a static array per dma device. This would
    consume memory for max number of descriptor supported by device
    which might be more than configured by application. The change
    allocates the memory for completion buffer based on the number
    of descriptor configured by application.

    Signed-off-by: Amit Prakash Shukla <amitprakashs@marvell.com>

Author: Amit Prakash Shukla <amitprakashs@marvell.com>
Date:   Wed Aug 23 16:45:17 2023 +0530

    dma/cnxk: fix device reconfigure

    Multiple call to configure, setup queues without stopping the device
    would leak the ring descriptor and hardware queue memory. This patch
    adds flags support to prevent configuring without stopping the
    device.

    Fixes: b56f1e2dad38 ("dma/cnxk: add channel operations")
    Cc: stable@dpdk.org

    Signed-off-by: Amit Prakash Shukla <amitprakashs@marvell.com>

commit d32fabfad6a62959d2196a342605f64b787cd936
Author: Amit Prakash Shukla <amitprakashs@marvell.com>
Date:   Wed Aug 23 16:45:16 2023 +0530

    dma/cnxk: fix device state

    When a device is not set to a ready state, on exiting the application
    proper cleanup is not done. This causes the application to fail on
    trying to run next time.

    Setting the device to ready state on successful probe fixes the issue.

    Fixes: 53f6d7328bf4 ("dma/cnxk: create and initialize device on
PCI probing")
    Cc: stable@dpdk.org

    Signed-off-by: Amit Prakash Shukla <amitprakashs@marvell.com>

commit 8c0b8bfa4b7d6ead026d2e22ac91f219303baa30
Author: Amit Prakash Shukla <amitprakashs@marvell.com>
Date:   Wed Aug 23 16:45:15 2023 +0530

    dma/cnxk: support for burst capacity

    Adds support for the burst capacity. Call to the function return
    number of vacant space in descriptor ring for the current burst.

    Signed-off-by: Amit Prakash Shukla <amitprakashs@marvell.com>

commit 9b6dc3fc98ad0be2f45b6eadbd88e13f0f0e1492
Author: Amit Prakash Shukla <amitprakashs@marvell.com>
Date:   Wed Aug 23 16:45:14 2023 +0530

    common/cnxk: fix DPI memzone name

    roc_dpi was using vfid as part of name for memzone allocation.
    This led to memzone allocation failure in case of multiple
    physical functions. vfid is not unique by itself since multiple
    physical functions can have the same virtual function indices.
    So use complete DBDF as part of memzone name to make it unique.

    Fixes: b6e395692b6d ("common/cnxk: add DPI DMA support")
    Cc: stable@dpdk.org

    Signed-off-by: Radha Mohan Chintakuntla <radhac@marvell.com>
    Signed-off-by: Amit Prakash Shukla <amitprakashs@marvell.com>

^ permalink raw reply	[flat|nested] 46+ messages in thread

end of thread, other threads:[~2023-08-23 15:31 UTC | newest]

Thread overview: 46+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-06-28 17:18 [PATCH 1/7] dma/cnxk: changes for dmadev autotest Amit Prakash Shukla
2023-06-28 17:18 ` [PATCH 2/7] drivers: changes for dmadev driver Amit Prakash Shukla
2023-06-28 17:18 ` [PATCH 3/7] dma/cnxk: add DMA devops for all models of cn10xxx Amit Prakash Shukla
2023-06-28 17:18 ` [PATCH 4/7] dma/cnxk: update func field based on transfer type Amit Prakash Shukla
2023-06-28 17:18 ` [PATCH 5/7] dma/cnxk: increase vchan per queue to max 4 Amit Prakash Shukla
2023-06-28 17:18 ` [PATCH 6/7] dma/cnxk: vchan support enhancement Amit Prakash Shukla
2023-06-28 17:18 ` [PATCH 7/7] common/cnxk: use unique name for DPI memzone Amit Prakash Shukla
2023-07-31 12:12 ` [PATCH v2 1/7] drivers: changes for dmadev driver Amit Prakash Shukla
2023-07-31 12:12   ` [PATCH v2 2/7] dma/cnxk: add DMA devops for all models of cn10xxx Amit Prakash Shukla
2023-07-31 12:12   ` [PATCH v2 3/7] dma/cnxk: update func field based on transfer type Amit Prakash Shukla
2023-07-31 12:12   ` [PATCH v2 4/7] dma/cnxk: increase vchan per queue to max 4 Amit Prakash Shukla
2023-07-31 12:12   ` [PATCH v2 5/7] dma/cnxk: vchan support enhancement Amit Prakash Shukla
2023-07-31 12:12   ` [PATCH v2 6/7] common/cnxk: use unique name for DPI memzone Amit Prakash Shukla
2023-07-31 12:12   ` [PATCH v2 7/7] dma/cnxk: add completion ring tail wrap check Amit Prakash Shukla
2023-08-16  8:13   ` [PATCH v2 1/7] drivers: changes for dmadev driver Jerin Jacob
2023-08-16 10:09     ` [EXT] " Amit Prakash Shukla
2023-08-18  9:01   ` [PATCH v3 1/8] common/cnxk: use unique name for DPI memzone Amit Prakash Shukla
2023-08-18  9:01     ` [PATCH v3 2/8] dma/cnxk: changes for dmadev driver Amit Prakash Shukla
2023-08-18  9:01     ` [PATCH v3 3/8] dma/cnxk: add DMA devops for all models of cn10xxx Amit Prakash Shukla
2023-08-18  9:01     ` [PATCH v3 4/8] dma/cnxk: update func field based on transfer type Amit Prakash Shukla
2023-08-18  9:01     ` [PATCH v3 5/8] dma/cnxk: increase vchan per queue to max 4 Amit Prakash Shukla
2023-08-18  9:01     ` [PATCH v3 6/8] dma/cnxk: vchan support enhancement Amit Prakash Shukla
2023-08-18  9:01     ` [PATCH v3 7/8] dma/cnxk: add completion ring tail wrap check Amit Prakash Shukla
2023-08-18  9:01     ` [PATCH v3 8/8] dma/cnxk: fix last index return value Amit Prakash Shukla
2023-08-21 13:27     ` [PATCH v3 1/8] common/cnxk: use unique name for DPI memzone Jerin Jacob
2023-08-21 17:49     ` [PATCH v4 " Amit Prakash Shukla
2023-08-21 17:49       ` [PATCH v4 2/8] dma/cnxk: changes for dmadev driver Amit Prakash Shukla
2023-08-21 17:49       ` [PATCH v4 3/8] dma/cnxk: add DMA devops for all models of cn10xxx Amit Prakash Shukla
2023-08-21 17:49       ` [PATCH v4 4/8] dma/cnxk: update func field based on transfer type Amit Prakash Shukla
2023-08-21 17:49       ` [PATCH v4 5/8] dma/cnxk: increase vchan per queue to max 4 Amit Prakash Shukla
2023-08-21 17:49       ` [PATCH v4 6/8] dma/cnxk: vchan support enhancement Amit Prakash Shukla
2023-08-21 17:49       ` [PATCH v4 7/8] dma/cnxk: add completion ring tail wrap check Amit Prakash Shukla
2023-08-21 17:49       ` [PATCH v4 8/8] dma/cnxk: track last index return value Amit Prakash Shukla
2023-08-23 11:15       ` [PATCH v5 01/12] common/cnxk: use unique name for DPI memzone Amit Prakash Shukla
2023-08-23 11:15         ` [PATCH v5 02/12] dma/cnxk: support for burst capacity Amit Prakash Shukla
2023-08-23 11:15         ` [PATCH v5 03/12] dma/cnxk: set dmadev to ready state Amit Prakash Shukla
2023-08-23 11:15         ` [PATCH v5 04/12] dma/cnxk: flag support for dma device Amit Prakash Shukla
2023-08-23 11:15         ` [PATCH v5 05/12] dma/cnxk: allocate completion ring buffer Amit Prakash Shukla
2023-08-23 11:15         ` [PATCH v5 06/12] dma/cnxk: chunk buffer failure return code Amit Prakash Shukla
2023-08-23 11:15         ` [PATCH v5 07/12] dma/cnxk: add DMA devops for all models of cn10xxx Amit Prakash Shukla
2023-08-23 11:15         ` [PATCH v5 08/12] dma/cnxk: update func field based on transfer type Amit Prakash Shukla
2023-08-23 11:15         ` [PATCH v5 09/12] dma/cnxk: increase vchan per queue to max 4 Amit Prakash Shukla
2023-08-23 11:15         ` [PATCH v5 10/12] dma/cnxk: vchan support enhancement Amit Prakash Shukla
2023-08-23 11:15         ` [PATCH v5 11/12] dma/cnxk: add completion ring tail wrap check Amit Prakash Shukla
2023-08-23 11:15         ` [PATCH v5 12/12] dma/cnxk: track last index return value Amit Prakash Shukla
2023-08-23 15:30         ` [PATCH v5 01/12] common/cnxk: use unique name for DPI memzone Jerin Jacob

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).