event/cnxk: rework enqueue path
[dpdk.git] / drivers / event / cnxk / cn9k_worker_dual_deq_tmo.c
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(C) 2021 Marvell.
3  */
4
5 #include "cn9k_worker.h"
6 #include "cnxk_eventdev.h"
7 #include "cnxk_worker.h"
8
9 #define R(name, f6, f5, f4, f3, f2, f1, f0, flags)                             \
10         uint16_t __rte_hot cn9k_sso_hws_dual_deq_tmo_##name(                   \
11                 void *port, struct rte_event *ev, uint64_t timeout_ticks)      \
12         {                                                                      \
13                 struct cn9k_sso_hws_dual *dws = port;                          \
14                 uint16_t ret = 1;                                              \
15                 uint64_t iter;                                                 \
16                                                                                \
17                 if (dws->swtag_req) {                                          \
18                         dws->swtag_req = 0;                                    \
19                         cnxk_sso_hws_swtag_wait(dws->base[!dws->vws] +         \
20                                                 SSOW_LF_GWS_TAG);              \
21                         return ret;                                            \
22                 }                                                              \
23                                                                                \
24                 ret = cn9k_sso_hws_dual_get_work(                              \
25                         dws->base[dws->vws], dws->base[!dws->vws], ev, flags,  \
26                         dws->lookup_mem, dws->tstamp);                         \
27                 dws->vws = !dws->vws;                                          \
28                 for (iter = 1; iter < timeout_ticks && (ret == 0); iter++) {   \
29                         ret = cn9k_sso_hws_dual_get_work(                      \
30                                 dws->base[dws->vws], dws->base[!dws->vws], ev, \
31                                 flags, dws->lookup_mem, dws->tstamp);          \
32                         dws->vws = !dws->vws;                                  \
33                 }                                                              \
34                                                                                \
35                 return ret;                                                    \
36         }                                                                      \
37                                                                                \
38         uint16_t __rte_hot cn9k_sso_hws_dual_deq_tmo_burst_##name(             \
39                 void *port, struct rte_event ev[], uint16_t nb_events,         \
40                 uint64_t timeout_ticks)                                        \
41         {                                                                      \
42                 RTE_SET_USED(nb_events);                                       \
43                                                                                \
44                 return cn9k_sso_hws_dual_deq_tmo_##name(port, ev,              \
45                                                         timeout_ticks);        \
46         }                                                                      \
47                                                                                \
48         uint16_t __rte_hot cn9k_sso_hws_dual_deq_tmo_seg_##name(               \
49                 void *port, struct rte_event *ev, uint64_t timeout_ticks)      \
50         {                                                                      \
51                 struct cn9k_sso_hws_dual *dws = port;                          \
52                 uint16_t ret = 1;                                              \
53                 uint64_t iter;                                                 \
54                                                                                \
55                 if (dws->swtag_req) {                                          \
56                         dws->swtag_req = 0;                                    \
57                         cnxk_sso_hws_swtag_wait(dws->base[!dws->vws] +         \
58                                                 SSOW_LF_GWS_TAG);              \
59                         return ret;                                            \
60                 }                                                              \
61                                                                                \
62                 ret = cn9k_sso_hws_dual_get_work(                              \
63                         dws->base[dws->vws], dws->base[!dws->vws], ev, flags,  \
64                         dws->lookup_mem, dws->tstamp);                         \
65                 dws->vws = !dws->vws;                                          \
66                 for (iter = 1; iter < timeout_ticks && (ret == 0); iter++) {   \
67                         ret = cn9k_sso_hws_dual_get_work(                      \
68                                 dws->base[dws->vws], dws->base[!dws->vws], ev, \
69                                 flags, dws->lookup_mem, dws->tstamp);          \
70                         dws->vws = !dws->vws;                                  \
71                 }                                                              \
72                                                                                \
73                 return ret;                                                    \
74         }                                                                      \
75                                                                                \
76         uint16_t __rte_hot cn9k_sso_hws_dual_deq_tmo_seg_burst_##name(         \
77                 void *port, struct rte_event ev[], uint16_t nb_events,         \
78                 uint64_t timeout_ticks)                                        \
79         {                                                                      \
80                 RTE_SET_USED(nb_events);                                       \
81                                                                                \
82                 return cn9k_sso_hws_dual_deq_tmo_seg_##name(port, ev,          \
83                                                             timeout_ticks);    \
84         }
85
86 NIX_RX_FASTPATH_MODES
87 #undef R