Add SSO GWS event dequeue fastpath functions.
Signed-off-by: Pavan Nikhilesh <pbhagavatula@marvell.com>
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
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);
+}
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
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;
+ }
}
}
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
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);
+}
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