DPDK patches and discussions
 help / color / mirror / Atom feed
From: Jerin Jacob <jerin.jacob@caviumnetworks.com>
To: dev@dpdk.org
Cc: ferruh.yigit@intel.com, santosh.shukla@caviumnetworks.com,
	Jerin Jacob <jerin.jacob@caviumnetworks.com>
Subject: [dpdk-dev] [PATCH 09/26] net/octeontx/base: add base PKO operations
Date: Thu, 31 Aug 2017 20:24:19 +0530	[thread overview]
Message-ID: <20170831145436.5397-10-jerin.jacob@caviumnetworks.com> (raw)
In-Reply-To: <20170831145436.5397-1-jerin.jacob@caviumnetworks.com>

PKO is the packet output processing unit, which receives the packet
from the core and sends to the BGX interface. This patch adds the
basic PKO operation like open, close, start and stop. These operations
are implemented through mailbox messages and kernel PF driver being the
server to process the message with the logical port identifier.

Signed-off-by: Jerin Jacob <jerin.jacob@caviumnetworks.com>
Co-authored-by: Santosh Shukla <santosh.shukla@caviumnetworks.com>
---
 drivers/net/octeontx/base/octeontx_pkovf.c | 327 +++++++++++++++++++++++++++++
 drivers/net/octeontx/base/octeontx_pkovf.h |  17 ++
 2 files changed, 344 insertions(+)

diff --git a/drivers/net/octeontx/base/octeontx_pkovf.c b/drivers/net/octeontx/base/octeontx_pkovf.c
index 599edefd0..38693a9bc 100644
--- a/drivers/net/octeontx/base/octeontx_pkovf.c
+++ b/drivers/net/octeontx/base/octeontx_pkovf.c
@@ -77,6 +77,333 @@ struct octeontx_pko_vf_ctl_s {
 
 static struct octeontx_pko_vf_ctl_s pko_vf_ctl;
 
+static void *
+octeontx_pko_dq_vf_bar0(uint16_t txq)
+{
+	int vf_ix;
+
+	vf_ix = txq / PKO_VF_NUM_DQ;
+	return pko_vf_ctl.pko[vf_ix].bar0;
+}
+
+static int
+octeontx_pko_dq_gdq(uint16_t txq)
+{
+	return txq % PKO_VF_NUM_DQ;
+}
+
+/**
+ * Open a PKO DQ.
+ */
+static inline
+int octeontx_pko_dq_open(uint16_t txq)
+{
+	unsigned int reg_off;
+	uint8_t *vf_bar0;
+	uint64_t rtn;
+	int gdq;
+
+	vf_bar0 = octeontx_pko_dq_vf_bar0(txq);
+	gdq = octeontx_pko_dq_gdq(txq);
+
+	if (unlikely(gdq < 0 || vf_bar0 == NULL))
+		return -EINVAL;
+	*(volatile int64_t*)(pko_vf_ctl.fc_ctl + txq) =
+		PKO_DQ_FC_DEPTH_PAGES - PKO_DQ_FC_SKID;
+
+	rte_wmb();
+
+	octeontx_write64(PKO_DQ_FC_DEPTH_PAGES,
+			 vf_bar0 + PKO_VF_DQ_FC_STATUS(gdq));
+
+	/* Set the register to return descriptor (packet) count as DEPTH */
+	/* KIND=1, NCB_QUERY_RSP=0 */
+	octeontx_write64(1ull << PKO_DQ_KIND_BIT,
+				vf_bar0 + PKO_VF_DQ_WM_CTL(gdq));
+	reg_off = PKO_VF_DQ_OP_OPEN(gdq);
+
+	rtn = octeontx_reg_ldadd_u64(vf_bar0 + reg_off, 0);
+
+	/* PKO_DQOP_E::OPEN */
+	if (((rtn >> PKO_DQ_OP_BIT) & 0x3) != 0x1)
+		return -EIO;
+
+	switch (rtn >> PKO_DQ_STATUS_BIT) {
+	case 0xC:	/* DQALREADYCREATED */
+	case 0x0:	/* PASS */
+		break;
+	default:
+		return -EIO;
+	}
+
+	/* DRAIN=0, DRAIN_NULL_LINK=0, SW_XOFF=0 */
+	octeontx_write64(0, vf_bar0 + PKO_VF_DQ_SW_XOFF(gdq));
+
+	return rtn & ((1ull << PKO_DQ_OP_BIT) - 1);
+}
+
+/**
+ * Close a PKO DQ
+ * Flush all packets pending.
+ */
+static inline
+int octeontx_pko_dq_close(uint16_t txq)
+{
+	unsigned int reg_off;
+	uint8_t *vf_bar0;
+	uint64_t rtn;
+	int res;
+
+	vf_bar0 = octeontx_pko_dq_vf_bar0(txq);
+	res = octeontx_pko_dq_gdq(txq);
+
+	if (unlikely(res < 0 || vf_bar0 == NULL))
+		return -EINVAL;
+
+	reg_off = PKO_VF_DQ_OP_CLOSE(res);
+
+	rtn = octeontx_reg_ldadd_u64(vf_bar0 + reg_off, 0);
+
+	/* PKO_DQOP_E::CLOSE */
+	if (((rtn >> PKO_DQ_OP_BIT) & 0x3) != 0x2)
+		return -EIO;
+
+	switch (rtn >> PKO_DQ_STATUS_BIT) {
+	case 0xD:	/* DQNOTCREATED */
+	case 0x0:	/* PASS */
+		break;
+	default:
+		return -EIO;
+	}
+
+	res = rtn & ((1ull << PKO_DQ_OP_BIT) - 1); /* DEPTH */
+	return res;
+}
+
+/* Flush all packets pending on a DQ */
+static inline
+int octeontx_pko_dq_drain(uint16_t txq)
+{
+	unsigned int gdq;
+	uint8_t *vf_bar0;
+	uint64_t reg;
+	int res, timo = PKO_DQ_DRAIN_TO;
+
+	vf_bar0 = octeontx_pko_dq_vf_bar0(txq);
+	res = octeontx_pko_dq_gdq(txq);
+	gdq = res;
+
+	 /* DRAIN=1, DRAIN_NULL_LINK=0, SW_XOFF=1 */
+	 octeontx_write64(0x3, vf_bar0 + PKO_VF_DQ_SW_XOFF(gdq));
+	/* Wait until buffers leave DQs */
+	reg = octeontx_read64(vf_bar0 + PKO_VF_DQ_WM_CNT(gdq));
+	while (reg && timo > 0) {
+		rte_delay_us(100);
+		timo--;
+		reg = octeontx_read64(vf_bar0 + PKO_VF_DQ_WM_CNT(gdq));
+	}
+	/* DRAIN=0, DRAIN_NULL_LINK=0, SW_XOFF=0 */
+	octeontx_write64(0, vf_bar0 + PKO_VF_DQ_SW_XOFF(gdq));
+
+	return reg;
+}
+
+static inline int
+octeontx_pko_dq_range_lookup(struct octeontx_pko_vf_ctl_s *ctl, uint64_t chanid,
+			     unsigned int dq_num, unsigned int dq_from)
+{
+	unsigned int dq, dq_cnt;
+	unsigned int dq_base;
+
+	dq_cnt = 0;
+	dq = dq_from;
+	while (dq < RTE_DIM(ctl->dq_map)) {
+		dq_base = dq;
+		dq_cnt = 0;
+		while (ctl->dq_map[dq].chanid == ~chanid &&
+			dq < RTE_DIM(ctl->dq_map)) {
+			dq_cnt++;
+			if (dq_cnt == dq_num)
+				return dq_base;
+			dq++;
+		}
+		dq++;
+	}
+	return -1;
+}
+
+static inline void
+octeontx_pko_dq_range_assign(struct octeontx_pko_vf_ctl_s *ctl, uint64_t chanid,
+			     unsigned int dq_base, unsigned int dq_num)
+{
+	unsigned int dq, dq_cnt;
+
+	dq_cnt = 0;
+	while (dq_cnt < dq_num) {
+		dq = dq_base + dq_cnt;
+
+		octeontx_log_dbg("DQ# %u assigned to CHAN# %lx", dq, chanid);
+
+		ctl->dq_map[dq].chanid = ~chanid;
+		dq_cnt++;
+	}
+}
+
+static inline int
+octeontx_pko_dq_claim(struct octeontx_pko_vf_ctl_s *ctl, unsigned int dq_base,
+		      unsigned int dq_num, uint64_t chanid)
+{
+	const uint64_t null_chanid = ~0ull;
+	int dq;
+
+	rte_spinlock_lock(&ctl->lock);
+
+	dq = octeontx_pko_dq_range_lookup(ctl, null_chanid, dq_num, dq_base);
+	if (dq < 0 || (unsigned int)dq != dq_base) {
+		rte_spinlock_unlock(&ctl->lock);
+		return -1;
+	}
+	octeontx_pko_dq_range_assign(ctl, chanid, dq_base, dq_num);
+
+	rte_spinlock_unlock(&ctl->lock);
+
+	return 0;
+}
+
+static inline int
+octeontx_pko_dq_free(struct octeontx_pko_vf_ctl_s *ctl, uint64_t chanid)
+{
+	const uint64_t null_chanid = ~0ull;
+	unsigned int dq = 0, dq_cnt = 0;
+
+	rte_spinlock_lock(&ctl->lock);
+	while (dq < RTE_DIM(ctl->dq_map)) {
+		if (ctl->dq_map[dq].chanid == ~chanid) {
+			ctl->dq_map[dq].chanid = ~null_chanid;
+			dq_cnt++;
+		}
+		dq++;
+	}
+	rte_spinlock_unlock(&ctl->lock);
+
+	return dq_cnt > 0 ? 0 : -EINVAL;
+}
+
+int
+octeontx_pko_channel_open(int dq_base, int dq_num, int chanid)
+{
+	struct octeontx_pko_vf_ctl_s *ctl = &pko_vf_ctl;
+	int res;
+
+	res = octeontx_pko_dq_claim(ctl, dq_base, dq_num, chanid);
+	if (res < 0)
+		return -1;
+
+	return 0;
+}
+
+int
+octeontx_pko_channel_close(int chanid)
+{
+	struct octeontx_pko_vf_ctl_s *ctl = &pko_vf_ctl;
+	int res;
+
+	res = octeontx_pko_dq_free(ctl, chanid);
+	if (res < 0)
+		return -1;
+
+	return 0;
+}
+
+static inline int
+octeontx_pko_chan_start(struct octeontx_pko_vf_ctl_s *ctl, uint64_t chanid)
+{
+	unsigned int dq_vf;
+	unsigned int dq, dq_cnt;
+
+	dq_cnt = 0;
+	dq = 0;
+	while (dq < RTE_DIM(ctl->dq_map)) {
+		dq_vf = dq / PKO_VF_NUM_DQ;
+
+		if (!ctl->pko[dq_vf].bar0) {
+			dq += PKO_VF_NUM_DQ;
+			continue;
+		}
+
+		if (ctl->dq_map[dq].chanid != ~chanid) {
+			dq++;
+			continue;
+		}
+
+		if (octeontx_pko_dq_open(dq) < 0)
+			break;
+
+		dq_cnt++;
+		dq++;
+	}
+
+	return dq_cnt;
+}
+
+int
+octeontx_pko_channel_start(int chanid)
+{
+	struct octeontx_pko_vf_ctl_s *ctl = &pko_vf_ctl;
+	int dq_cnt;
+
+	dq_cnt = octeontx_pko_chan_start(ctl, chanid);
+	if (dq_cnt < 0)
+		return -1;
+
+	return dq_cnt;
+}
+
+static inline int
+octeontx_pko_chan_stop(struct octeontx_pko_vf_ctl_s *ctl, uint64_t chanid)
+{
+	unsigned int dq, dq_cnt, dq_vf;
+	int res;
+
+	dq_cnt = 0;
+	dq = 0;
+	while (dq < RTE_DIM(ctl->dq_map)) {
+		dq_vf = dq / PKO_VF_NUM_DQ;
+
+		if (!ctl->pko[dq_vf].bar0) {
+			dq += PKO_VF_NUM_DQ;
+			continue;
+		}
+
+		if (ctl->dq_map[dq].chanid != ~chanid) {
+			dq++;
+			continue;
+		}
+
+		res = octeontx_pko_dq_drain(dq);
+		if (res > 0)
+			octeontx_log_err("draining DQ%d, buffers left: %x",
+					 dq, res);
+
+		res = octeontx_pko_dq_close(dq);
+		if (res < 0)
+			octeontx_log_err("closing DQ%d failed\n", dq);
+
+		dq_cnt++;
+		dq++;
+	}
+	return dq_cnt;
+}
+
+int
+octeontx_pko_channel_stop(int chanid)
+{
+	struct octeontx_pko_vf_ctl_s *ctl = &pko_vf_ctl;
+
+	octeontx_pko_chan_stop(ctl, chanid);
+	return 0;
+}
+
 static void
 octeontx_pkovf_setup(void)
 {
diff --git a/drivers/net/octeontx/base/octeontx_pkovf.h b/drivers/net/octeontx/base/octeontx_pkovf.h
index bca4b2836..b33796a29 100644
--- a/drivers/net/octeontx/base/octeontx_pkovf.h
+++ b/drivers/net/octeontx/base/octeontx_pkovf.h
@@ -60,4 +60,21 @@
 #define	PKO_VF_DQ_OP_CLOSE(gdq)		(0x001200 | (gdq) << 17)
 #define	PKO_VF_DQ_OP_QUERY(gdq)		(0x001300 | (gdq) << 17)
 
+/* pko_send_hdr_s + pko_send_link */
+#define PKO_CMD_SZ			(2 << 1)
+#define PKO_SEND_GATHER_SUBDC		(0x0ull << 60)
+#define PKO_SEND_GATHER_LDTYPE(x)	((x) << 58)
+#define PKO_SEND_GATHER_GAUAR(x)	((x) << 24)
+
+typedef struct octeontx_dq_s {
+	void *lmtline_va;
+	void *ioreg_va;
+	void *fc_status_va;
+} octeontx_dq_t;
+
+int octeontx_pko_channel_open(int dq_base, int dq_num, int chanid);
+int octeontx_pko_channel_close(int chanid);
+int octeontx_pko_channel_start(int chanid);
+int octeontx_pko_channel_stop(int chanid);
+
 #endif /* __OCTEONTX_PKO_H__ */
-- 
2.14.1

  parent reply	other threads:[~2017-08-31 14:55 UTC|newest]

Thread overview: 65+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-08-31 14:54 [dpdk-dev] [PATCH 00/26] DPDK PMD for OCTEONTX NW device Jerin Jacob
2017-08-31 14:54 ` [dpdk-dev] [PATCH 01/26] net/octeontx: add build infrastructure Jerin Jacob
2017-08-31 14:54 ` [dpdk-dev] [PATCH 02/26] net/octeontx/base: add octeontx io operations Jerin Jacob
2017-08-31 14:54 ` [dpdk-dev] [PATCH 03/26] event/octeontx: introduce specialized mbox message copy Jerin Jacob
2017-08-31 14:54 ` [dpdk-dev] [PATCH 04/26] net/octeontx/base: add base BGX operations Jerin Jacob
2017-08-31 14:54 ` [dpdk-dev] [PATCH 05/26] net/octeontx/base: add remaining " Jerin Jacob
2017-08-31 14:54 ` [dpdk-dev] [PATCH 06/26] net/octeontx/base: probe PKI and PKO PCIe VF devices Jerin Jacob
2017-09-05 17:44   ` Ferruh Yigit
2017-09-11 18:27     ` Jerin Jacob
2017-08-31 14:54 ` [dpdk-dev] [PATCH 07/26] net/octeontx/base: add base PKI operations Jerin Jacob
2017-08-31 14:54 ` [dpdk-dev] [PATCH 08/26] net/octeontx/base: add remaining " Jerin Jacob
2017-08-31 14:54 ` Jerin Jacob [this message]
2017-08-31 14:54 ` [dpdk-dev] [PATCH 10/26] net/octeontx/base: add remaining PKO operations Jerin Jacob
2017-08-31 14:54 ` [dpdk-dev] [PATCH 11/26] net/octeontx: add eth device probe and remove Jerin Jacob
2017-08-31 14:54 ` [dpdk-dev] [PATCH 12/26] net/octeontx: create ethdev ports Jerin Jacob
2017-08-31 14:54 ` [dpdk-dev] [PATCH 13/26] net/octeontx: add device configure Jerin Jacob
2017-08-31 14:54 ` [dpdk-dev] [PATCH 14/26] net/octeontx: add device info Jerin Jacob
2017-08-31 14:54 ` [dpdk-dev] [PATCH 15/26] net/octeontx: add link update Jerin Jacob
2017-08-31 14:54 ` [dpdk-dev] [PATCH 16/26] net/octeontx: add promiscuous mode ops Jerin Jacob
2017-08-31 14:54 ` [dpdk-dev] [PATCH 17/26] net/octeontx: add basic stats support Jerin Jacob
2017-08-31 14:54 ` [dpdk-dev] [PATCH 18/26] net/octeontx: add MAC addr set op Jerin Jacob
2017-08-31 14:54 ` [dpdk-dev] [PATCH 19/26] net/octeontx: add Rx queue setup and release ops Jerin Jacob
2017-08-31 14:54 ` [dpdk-dev] [PATCH 20/26] net/octeontx: add Tx queue start and stop Jerin Jacob
2017-08-31 14:54 ` [dpdk-dev] [PATCH 21/26] net/octeontx: add Tx queue setup and release ops Jerin Jacob
2017-08-31 14:54 ` [dpdk-dev] [PATCH 22/26] net/octeontx: add packet transmit burst function Jerin Jacob
2017-08-31 14:54 ` [dpdk-dev] [PATCH 23/26] net/octeontx: add packet receive " Jerin Jacob
2017-08-31 14:54 ` [dpdk-dev] [PATCH 24/26] net/octeontx: add packet type parsing support Jerin Jacob
2017-08-31 14:54 ` [dpdk-dev] [PATCH 25/26] net/octeontx: add start and stop support Jerin Jacob
2017-08-31 14:54 ` [dpdk-dev] [PATCH 26/26] doc: add octeontx ethdev driver documentation Jerin Jacob
2017-09-19 13:59   ` Mcnamara, John
2017-09-05 17:43 ` [dpdk-dev] [PATCH 00/26] DPDK PMD for OCTEONTX NW device Ferruh Yigit
2017-09-11 18:15   ` Jerin Jacob
2017-10-03 19:01     ` Ferruh Yigit
2017-10-04  5:27       ` santosh
2017-10-08 12:44 ` [dpdk-dev] [PATCH v2 " Santosh Shukla
2017-10-08 12:44   ` [dpdk-dev] [PATCH v2 01/26] net/octeontx: add build infrastructure Santosh Shukla
2017-10-08 12:44   ` [dpdk-dev] [PATCH v2 02/26] net/octeontx/base: add octeontx io operations Santosh Shukla
2017-10-08 12:44   ` [dpdk-dev] [PATCH v2 03/26] event/octeontx: introduce specialized mbox message copy Santosh Shukla
2017-10-08 12:44   ` [dpdk-dev] [PATCH v2 04/26] net/octeontx/base: add base BGX operations Santosh Shukla
2017-10-08 12:44   ` [dpdk-dev] [PATCH v2 05/26] net/octeontx/base: add remaining " Santosh Shukla
2017-10-08 12:44   ` [dpdk-dev] [PATCH v2 06/26] net/octeontx/base: probe PKI and PKO PCIe VF devices Santosh Shukla
2017-10-08 12:44   ` [dpdk-dev] [PATCH v2 07/26] net/octeontx/base: add base PKI operations Santosh Shukla
2017-10-08 12:44   ` [dpdk-dev] [PATCH v2 08/26] net/octeontx/base: add remaining " Santosh Shukla
2017-10-08 12:44   ` [dpdk-dev] [PATCH v2 09/26] net/octeontx/base: add base PKO operations Santosh Shukla
2017-10-08 12:44   ` [dpdk-dev] [PATCH v2 10/26] net/octeontx/base: add remaining " Santosh Shukla
2017-10-08 12:44   ` [dpdk-dev] [PATCH v2 11/26] net/octeontx: add eth device probe and remove Santosh Shukla
2017-10-08 12:44   ` [dpdk-dev] [PATCH v2 12/26] net/octeontx: create ethdev ports Santosh Shukla
2017-10-08 12:44   ` [dpdk-dev] [PATCH v2 13/26] net/octeontx: add device configure Santosh Shukla
2017-10-08 12:44   ` [dpdk-dev] [PATCH v2 14/26] net/octeontx: add device info Santosh Shukla
2017-10-08 12:44   ` [dpdk-dev] [PATCH v2 15/26] net/octeontx: add link update Santosh Shukla
2017-10-08 12:44   ` [dpdk-dev] [PATCH v2 16/26] net/octeontx: add promiscuous mode ops Santosh Shukla
2017-10-08 12:44   ` [dpdk-dev] [PATCH v2 17/26] net/octeontx: add basic stats support Santosh Shukla
2017-10-08 12:44   ` [dpdk-dev] [PATCH v2 18/26] net/octeontx: add MAC addr set op Santosh Shukla
2017-10-08 12:44   ` [dpdk-dev] [PATCH v2 19/26] net/octeontx: add Rx queue setup and release ops Santosh Shukla
2017-10-08 12:44   ` [dpdk-dev] [PATCH v2 20/26] net/octeontx: add Tx queue start and stop Santosh Shukla
2017-10-08 12:44   ` [dpdk-dev] [PATCH v2 21/26] net/octeontx: add Tx queue setup and release ops Santosh Shukla
2017-10-08 12:44   ` [dpdk-dev] [PATCH v2 22/26] net/octeontx: add packet transmit burst function Santosh Shukla
2017-10-08 12:44   ` [dpdk-dev] [PATCH v2 23/26] net/octeontx: add packet receive " Santosh Shukla
2017-10-08 12:44   ` [dpdk-dev] [PATCH v2 24/26] net/octeontx: add packet type parsing support Santosh Shukla
2017-10-08 12:44   ` [dpdk-dev] [PATCH v2 25/26] net/octeontx: add start and stop support Santosh Shukla
2017-10-08 12:44   ` [dpdk-dev] [PATCH v2 26/26] doc: add octeontx ethdev driver documentation Santosh Shukla
2017-10-09  2:07   ` [dpdk-dev] [PATCH v2 00/26] DPDK PMD for OCTEONTX NW device Ferruh Yigit
2017-10-09  5:12     ` santosh
2017-10-11 10:35     ` Thomas Monjalon
2017-10-11 10:58       ` Jerin Jacob

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20170831145436.5397-10-jerin.jacob@caviumnetworks.com \
    --to=jerin.jacob@caviumnetworks.com \
    --cc=dev@dpdk.org \
    --cc=ferruh.yigit@intel.com \
    --cc=santosh.shukla@caviumnetworks.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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).