diff mbox series

[v4,16/34] event/cnxk: add SSO GWS dequeue fastpath functions

Message ID 20210503152238.2437-17-pbhagavatula@marvell.com (mailing list archive)
State Superseded, archived
Headers show
Series Marvell CNXK Event device Driver | expand

Checks

Context Check Description
ci/checkpatch success coding style OK

Commit Message

Pavan Nikhilesh Bhagavatula May 3, 2021, 3:22 p.m. UTC
From: Pavan Nikhilesh <pbhagavatula@marvell.com>

Add SSO GWS event dequeue fastpath functions.

Signed-off-by: Pavan Nikhilesh <pbhagavatula@marvell.com>
---
 drivers/event/cnxk/cn10k_eventdev.c |  10 ++-
 drivers/event/cnxk/cn10k_worker.c   |  54 +++++++++++++
 drivers/event/cnxk/cn10k_worker.h   |  12 +++
 drivers/event/cnxk/cn9k_eventdev.c  |  15 ++++
 drivers/event/cnxk/cn9k_worker.c    | 117 ++++++++++++++++++++++++++++
 drivers/event/cnxk/cn9k_worker.h    |  24 ++++++
 6 files changed, 231 insertions(+), 1 deletion(-)
diff mbox series

Patch

diff --git a/drivers/event/cnxk/cn10k_eventdev.c b/drivers/event/cnxk/cn10k_eventdev.c
index a1b44744b..37a7c8a8e 100644
--- a/drivers/event/cnxk/cn10k_eventdev.c
+++ b/drivers/event/cnxk/cn10k_eventdev.c
@@ -135,11 +135,19 @@  cn10k_sso_rsrc_init(void *arg, uint8_t hws, uint8_t hwgrp)
 static void
 cn10k_sso_fp_fns_set(struct rte_eventdev *event_dev)
 {
-	PLT_SET_USED(event_dev);
+	struct cnxk_sso_evdev *dev = cnxk_sso_pmd_priv(event_dev);
+
 	event_dev->enqueue = cn10k_sso_hws_enq;
 	event_dev->enqueue_burst = cn10k_sso_hws_enq_burst;
 	event_dev->enqueue_new_burst = cn10k_sso_hws_enq_new_burst;
 	event_dev->enqueue_forward_burst = cn10k_sso_hws_enq_fwd_burst;
+
+	event_dev->dequeue = cn10k_sso_hws_deq;
+	event_dev->dequeue_burst = cn10k_sso_hws_deq_burst;
+	if (dev->is_timeout_deq) {
+		event_dev->dequeue = cn10k_sso_hws_tmo_deq;
+		event_dev->dequeue_burst = cn10k_sso_hws_tmo_deq_burst;
+	}
 }
 
 static void
diff --git a/drivers/event/cnxk/cn10k_worker.c b/drivers/event/cnxk/cn10k_worker.c
index 9b5cb7be6..e2aa534c6 100644
--- a/drivers/event/cnxk/cn10k_worker.c
+++ b/drivers/event/cnxk/cn10k_worker.c
@@ -59,3 +59,57 @@  cn10k_sso_hws_enq_fwd_burst(void *port, const struct rte_event ev[],
 
 	return 1;
 }
+
+uint16_t __rte_hot
+cn10k_sso_hws_deq(void *port, struct rte_event *ev, uint64_t timeout_ticks)
+{
+	struct cn10k_sso_hws *ws = port;
+
+	RTE_SET_USED(timeout_ticks);
+
+	if (ws->swtag_req) {
+		ws->swtag_req = 0;
+		cnxk_sso_hws_swtag_wait(ws->tag_wqe_op);
+		return 1;
+	}
+
+	return cn10k_sso_hws_get_work(ws, ev);
+}
+
+uint16_t __rte_hot
+cn10k_sso_hws_deq_burst(void *port, struct rte_event ev[], uint16_t nb_events,
+			uint64_t timeout_ticks)
+{
+	RTE_SET_USED(nb_events);
+
+	return cn10k_sso_hws_deq(port, ev, timeout_ticks);
+}
+
+uint16_t __rte_hot
+cn10k_sso_hws_tmo_deq(void *port, struct rte_event *ev, uint64_t timeout_ticks)
+{
+	struct cn10k_sso_hws *ws = port;
+	uint16_t ret = 1;
+	uint64_t iter;
+
+	if (ws->swtag_req) {
+		ws->swtag_req = 0;
+		cnxk_sso_hws_swtag_wait(ws->tag_wqe_op);
+		return ret;
+	}
+
+	ret = cn10k_sso_hws_get_work(ws, ev);
+	for (iter = 1; iter < timeout_ticks && (ret == 0); iter++)
+		ret = cn10k_sso_hws_get_work(ws, ev);
+
+	return ret;
+}
+
+uint16_t __rte_hot
+cn10k_sso_hws_tmo_deq_burst(void *port, struct rte_event ev[],
+			    uint16_t nb_events, uint64_t timeout_ticks)
+{
+	RTE_SET_USED(nb_events);
+
+	return cn10k_sso_hws_tmo_deq(port, ev, timeout_ticks);
+}
diff --git a/drivers/event/cnxk/cn10k_worker.h b/drivers/event/cnxk/cn10k_worker.h
index 48158b320..2f093a8dd 100644
--- a/drivers/event/cnxk/cn10k_worker.h
+++ b/drivers/event/cnxk/cn10k_worker.h
@@ -160,4 +160,16 @@  uint16_t __rte_hot cn10k_sso_hws_enq_fwd_burst(void *port,
 					       const struct rte_event ev[],
 					       uint16_t nb_events);
 
+uint16_t __rte_hot cn10k_sso_hws_deq(void *port, struct rte_event *ev,
+				     uint64_t timeout_ticks);
+uint16_t __rte_hot cn10k_sso_hws_deq_burst(void *port, struct rte_event ev[],
+					   uint16_t nb_events,
+					   uint64_t timeout_ticks);
+uint16_t __rte_hot cn10k_sso_hws_tmo_deq(void *port, struct rte_event *ev,
+					 uint64_t timeout_ticks);
+uint16_t __rte_hot cn10k_sso_hws_tmo_deq_burst(void *port,
+					       struct rte_event ev[],
+					       uint16_t nb_events,
+					       uint64_t timeout_ticks);
+
 #endif
diff --git a/drivers/event/cnxk/cn9k_eventdev.c b/drivers/event/cnxk/cn9k_eventdev.c
index 61a4d0823..6ba3d1466 100644
--- a/drivers/event/cnxk/cn9k_eventdev.c
+++ b/drivers/event/cnxk/cn9k_eventdev.c
@@ -162,12 +162,27 @@  cn9k_sso_fp_fns_set(struct rte_eventdev *event_dev)
 	event_dev->enqueue_new_burst = cn9k_sso_hws_enq_new_burst;
 	event_dev->enqueue_forward_burst = cn9k_sso_hws_enq_fwd_burst;
 
+	event_dev->dequeue = cn9k_sso_hws_deq;
+	event_dev->dequeue_burst = cn9k_sso_hws_deq_burst;
+	if (dev->deq_tmo_ns) {
+		event_dev->dequeue = cn9k_sso_hws_tmo_deq;
+		event_dev->dequeue_burst = cn9k_sso_hws_tmo_deq_burst;
+	}
+
 	if (dev->dual_ws) {
 		event_dev->enqueue = cn9k_sso_hws_dual_enq;
 		event_dev->enqueue_burst = cn9k_sso_hws_dual_enq_burst;
 		event_dev->enqueue_new_burst = cn9k_sso_hws_dual_enq_new_burst;
 		event_dev->enqueue_forward_burst =
 			cn9k_sso_hws_dual_enq_fwd_burst;
+
+		event_dev->dequeue = cn9k_sso_hws_dual_deq;
+		event_dev->dequeue_burst = cn9k_sso_hws_dual_deq_burst;
+		if (dev->deq_tmo_ns) {
+			event_dev->dequeue = cn9k_sso_hws_dual_tmo_deq;
+			event_dev->dequeue_burst =
+				cn9k_sso_hws_dual_tmo_deq_burst;
+		}
 	}
 }
 
diff --git a/drivers/event/cnxk/cn9k_worker.c b/drivers/event/cnxk/cn9k_worker.c
index 538bc4b0b..9ceacc98d 100644
--- a/drivers/event/cnxk/cn9k_worker.c
+++ b/drivers/event/cnxk/cn9k_worker.c
@@ -60,6 +60,60 @@  cn9k_sso_hws_enq_fwd_burst(void *port, const struct rte_event ev[],
 	return 1;
 }
 
+uint16_t __rte_hot
+cn9k_sso_hws_deq(void *port, struct rte_event *ev, uint64_t timeout_ticks)
+{
+	struct cn9k_sso_hws *ws = port;
+
+	RTE_SET_USED(timeout_ticks);
+
+	if (ws->swtag_req) {
+		ws->swtag_req = 0;
+		cnxk_sso_hws_swtag_wait(ws->tag_op);
+		return 1;
+	}
+
+	return cn9k_sso_hws_get_work(ws, ev);
+}
+
+uint16_t __rte_hot
+cn9k_sso_hws_deq_burst(void *port, struct rte_event ev[], uint16_t nb_events,
+		       uint64_t timeout_ticks)
+{
+	RTE_SET_USED(nb_events);
+
+	return cn9k_sso_hws_deq(port, ev, timeout_ticks);
+}
+
+uint16_t __rte_hot
+cn9k_sso_hws_tmo_deq(void *port, struct rte_event *ev, uint64_t timeout_ticks)
+{
+	struct cn9k_sso_hws *ws = port;
+	uint16_t ret = 1;
+	uint64_t iter;
+
+	if (ws->swtag_req) {
+		ws->swtag_req = 0;
+		cnxk_sso_hws_swtag_wait(ws->tag_op);
+		return ret;
+	}
+
+	ret = cn9k_sso_hws_get_work(ws, ev);
+	for (iter = 1; iter < timeout_ticks && (ret == 0); iter++)
+		ret = cn9k_sso_hws_get_work(ws, ev);
+
+	return ret;
+}
+
+uint16_t __rte_hot
+cn9k_sso_hws_tmo_deq_burst(void *port, struct rte_event ev[],
+			   uint16_t nb_events, uint64_t timeout_ticks)
+{
+	RTE_SET_USED(nb_events);
+
+	return cn9k_sso_hws_tmo_deq(port, ev, timeout_ticks);
+}
+
 /* Dual ws ops. */
 
 uint16_t __rte_hot
@@ -117,3 +171,66 @@  cn9k_sso_hws_dual_enq_fwd_burst(void *port, const struct rte_event ev[],
 
 	return 1;
 }
+
+uint16_t __rte_hot
+cn9k_sso_hws_dual_deq(void *port, struct rte_event *ev, uint64_t timeout_ticks)
+{
+	struct cn9k_sso_hws_dual *dws = port;
+	uint16_t gw;
+
+	RTE_SET_USED(timeout_ticks);
+	if (dws->swtag_req) {
+		dws->swtag_req = 0;
+		cnxk_sso_hws_swtag_wait(dws->ws_state[!dws->vws].tag_op);
+		return 1;
+	}
+
+	gw = cn9k_sso_hws_dual_get_work(&dws->ws_state[dws->vws],
+					&dws->ws_state[!dws->vws], ev);
+	dws->vws = !dws->vws;
+	return gw;
+}
+
+uint16_t __rte_hot
+cn9k_sso_hws_dual_deq_burst(void *port, struct rte_event ev[],
+			    uint16_t nb_events, uint64_t timeout_ticks)
+{
+	RTE_SET_USED(nb_events);
+
+	return cn9k_sso_hws_dual_deq(port, ev, timeout_ticks);
+}
+
+uint16_t __rte_hot
+cn9k_sso_hws_dual_tmo_deq(void *port, struct rte_event *ev,
+			  uint64_t timeout_ticks)
+{
+	struct cn9k_sso_hws_dual *dws = port;
+	uint16_t ret = 1;
+	uint64_t iter;
+
+	if (dws->swtag_req) {
+		dws->swtag_req = 0;
+		cnxk_sso_hws_swtag_wait(dws->ws_state[!dws->vws].tag_op);
+		return ret;
+	}
+
+	ret = cn9k_sso_hws_dual_get_work(&dws->ws_state[dws->vws],
+					 &dws->ws_state[!dws->vws], ev);
+	dws->vws = !dws->vws;
+	for (iter = 1; iter < timeout_ticks && (ret == 0); iter++) {
+		ret = cn9k_sso_hws_dual_get_work(&dws->ws_state[dws->vws],
+						 &dws->ws_state[!dws->vws], ev);
+		dws->vws = !dws->vws;
+	}
+
+	return ret;
+}
+
+uint16_t __rte_hot
+cn9k_sso_hws_dual_tmo_deq_burst(void *port, struct rte_event ev[],
+				uint16_t nb_events, uint64_t timeout_ticks)
+{
+	RTE_SET_USED(nb_events);
+
+	return cn9k_sso_hws_dual_tmo_deq(port, ev, timeout_ticks);
+}
diff --git a/drivers/event/cnxk/cn9k_worker.h b/drivers/event/cnxk/cn9k_worker.h
index aa321d0e4..38fca08fb 100644
--- a/drivers/event/cnxk/cn9k_worker.h
+++ b/drivers/event/cnxk/cn9k_worker.h
@@ -270,4 +270,28 @@  uint16_t __rte_hot cn9k_sso_hws_dual_enq_fwd_burst(void *port,
 						   const struct rte_event ev[],
 						   uint16_t nb_events);
 
+uint16_t __rte_hot cn9k_sso_hws_deq(void *port, struct rte_event *ev,
+				    uint64_t timeout_ticks);
+uint16_t __rte_hot cn9k_sso_hws_deq_burst(void *port, struct rte_event ev[],
+					  uint16_t nb_events,
+					  uint64_t timeout_ticks);
+uint16_t __rte_hot cn9k_sso_hws_tmo_deq(void *port, struct rte_event *ev,
+					uint64_t timeout_ticks);
+uint16_t __rte_hot cn9k_sso_hws_tmo_deq_burst(void *port, struct rte_event ev[],
+					      uint16_t nb_events,
+					      uint64_t timeout_ticks);
+
+uint16_t __rte_hot cn9k_sso_hws_dual_deq(void *port, struct rte_event *ev,
+					 uint64_t timeout_ticks);
+uint16_t __rte_hot cn9k_sso_hws_dual_deq_burst(void *port,
+					       struct rte_event ev[],
+					       uint16_t nb_events,
+					       uint64_t timeout_ticks);
+uint16_t __rte_hot cn9k_sso_hws_dual_tmo_deq(void *port, struct rte_event *ev,
+					     uint64_t timeout_ticks);
+uint16_t __rte_hot cn9k_sso_hws_dual_tmo_deq_burst(void *port,
+						   struct rte_event ev[],
+						   uint16_t nb_events,
+						   uint64_t timeout_ticks);
+
 #endif