event/octeontx2: add worker dual GWS dequeue functions
authorPavan Nikhilesh <pbhagavatula@marvell.com>
Fri, 28 Jun 2019 18:23:31 +0000 (23:53 +0530)
committerJerin Jacob <jerinj@marvell.com>
Wed, 3 Jul 2019 04:56:16 +0000 (06:56 +0200)
Add workder dual workslot mode dequeue functions.

Signed-off-by: Pavan Nikhilesh <pbhagavatula@marvell.com>
drivers/event/octeontx2/otx2_evdev.h
drivers/event/octeontx2/otx2_worker_dual.c

index fd2a4c3..30b5d2c 100644 (file)
@@ -214,6 +214,15 @@ uint16_t otx2_ssogws_dual_enq_new_burst(void *port, const struct rte_event ev[],
 uint16_t otx2_ssogws_dual_enq_fwd_burst(void *port, const struct rte_event ev[],
                                        uint16_t nb_events);
 
+uint16_t otx2_ssogws_dual_deq(void *port, struct rte_event *ev,
+                             uint64_t timeout_ticks);
+uint16_t otx2_ssogws_dual_deq_burst(void *port, struct rte_event ev[],
+                                   uint16_t nb_events, uint64_t timeout_ticks);
+uint16_t otx2_ssogws_dual_deq_timeout(void *port, struct rte_event *ev,
+                                     uint64_t timeout_ticks);
+uint16_t otx2_ssogws_dual_deq_timeout_burst(void *port, struct rte_event ev[],
+                                           uint16_t nb_events,
+                                           uint64_t timeout_ticks);
 /* Init and Fini API's */
 int otx2_sso_init(struct rte_eventdev *event_dev);
 int otx2_sso_fini(struct rte_eventdev *event_dev);
index 661c78c..58fd588 100644 (file)
@@ -139,3 +139,69 @@ otx2_ssogws_dual_enq_fwd_burst(void *port, const struct rte_event ev[],
 
        return 1;
 }
+
+uint16_t __hot
+otx2_ssogws_dual_deq(void *port, struct rte_event *ev, uint64_t timeout_ticks)
+{
+       struct otx2_ssogws_dual *ws = port;
+       uint8_t gw;
+
+       RTE_SET_USED(timeout_ticks);
+       if (ws->swtag_req) {
+               otx2_ssogws_swtag_wait((struct otx2_ssogws *)
+                                      &ws->ws_state[!ws->vws]);
+               ws->swtag_req = 0;
+               return 1;
+       }
+
+       gw = otx2_ssogws_dual_get_work(&ws->ws_state[ws->vws],
+                                      &ws->ws_state[!ws->vws], ev);
+       ws->vws = !ws->vws;
+
+       return gw;
+}
+
+uint16_t __hot
+otx2_ssogws_dual_deq_burst(void *port, struct rte_event ev[],
+                          uint16_t nb_events, uint64_t timeout_ticks)
+{
+       RTE_SET_USED(nb_events);
+
+       return otx2_ssogws_dual_deq(port, ev, timeout_ticks);
+}
+
+uint16_t __hot
+otx2_ssogws_dual_deq_timeout(void *port, struct rte_event *ev,
+                            uint64_t timeout_ticks)
+{
+       struct otx2_ssogws_dual *ws = port;
+       uint64_t iter;
+       uint8_t gw;
+
+       if (ws->swtag_req) {
+               otx2_ssogws_swtag_wait((struct otx2_ssogws *)
+                                      &ws->ws_state[!ws->vws]);
+               ws->swtag_req = 0;
+               return 1;
+       }
+
+       gw = otx2_ssogws_dual_get_work(&ws->ws_state[ws->vws],
+                                      &ws->ws_state[!ws->vws], ev);
+       ws->vws = !ws->vws;
+       for (iter = 1; iter < timeout_ticks && (gw == 0); iter++) {
+               gw = otx2_ssogws_dual_get_work(&ws->ws_state[ws->vws],
+                                              &ws->ws_state[!ws->vws], ev);
+               ws->vws = !ws->vws;
+       }
+
+       return gw;
+}
+
+uint16_t __hot
+otx2_ssogws_dual_deq_timeout_burst(void *port, struct rte_event ev[],
+                                  uint16_t nb_events, uint64_t timeout_ticks)
+{
+       RTE_SET_USED(nb_events);
+
+       return otx2_ssogws_dual_deq_timeout(port, ev, timeout_ticks);
+}