Branch data Line data Source code
1 : : /* SPDX-License-Identifier: BSD-3-Clause
2 : : * Copyright(c) 2017 Cavium, Inc
3 : : */
4 : :
5 : : #ifndef _EVT_OPTIONS_
6 : : #define _EVT_OPTIONS_
7 : :
8 : : #include <stdio.h>
9 : : #include <stdbool.h>
10 : :
11 : : #include <rte_common.h>
12 : : #include <rte_cryptodev.h>
13 : : #include <rte_ethdev.h>
14 : : #include <rte_eventdev.h>
15 : : #include <rte_lcore.h>
16 : :
17 : : #include "evt_common.h"
18 : :
19 : : #define EVT_BOOL_FMT(x) ((x) ? "true" : "false")
20 : :
21 : : #define EVT_VERBOSE ("verbose")
22 : : #define EVT_DEVICE ("dev")
23 : : #define EVT_TEST ("test")
24 : : #define EVT_PROD_LCORES ("plcores")
25 : : #define EVT_WORK_LCORES ("wlcores")
26 : : #define EVT_NB_FLOWS ("nb_flows")
27 : : #define EVT_SOCKET_ID ("socket_id")
28 : : #define EVT_POOL_SZ ("pool_sz")
29 : : #define EVT_WKR_DEQ_DEP ("worker_deq_depth")
30 : : #define EVT_NB_PKTS ("nb_pkts")
31 : : #define EVT_NB_STAGES ("nb_stages")
32 : : #define EVT_SCHED_TYPE_LIST ("stlist")
33 : : #define EVT_FWD_LATENCY ("fwd_latency")
34 : : #define EVT_QUEUE_PRIORITY ("queue_priority")
35 : : #define EVT_DEQ_TMO_NSEC ("deq_tmo_nsec")
36 : : #define EVT_PROD_ETHDEV ("prod_type_ethdev")
37 : : #define EVT_PROD_CRYPTODEV ("prod_type_cryptodev")
38 : : #define EVT_PROD_DMADEV ("prod_type_dmadev")
39 : : #define EVT_PROD_TIMERDEV ("prod_type_timerdev")
40 : : #define EVT_PROD_TIMERDEV_BURST ("prod_type_timerdev_burst")
41 : : #define EVT_DMA_ADPTR_MODE ("dma_adptr_mode")
42 : : #define EVT_CRYPTO_ADPTR_MODE ("crypto_adptr_mode")
43 : : #define EVT_CRYPTO_OP_TYPE ("crypto_op_type")
44 : : #define EVT_CRYPTO_CIPHER_ALG ("crypto_cipher_alg")
45 : : #define EVT_CRYPTO_CIPHER_KEY ("crypto_cipher_key")
46 : : #define EVT_CRYPTO_CIPHER_IV_SZ ("crypto_cipher_iv_sz")
47 : : #define EVT_NB_TIMERS ("nb_timers")
48 : : #define EVT_NB_TIMER_ADPTRS ("nb_timer_adptrs")
49 : : #define EVT_TIMER_TICK_NSEC ("timer_tick_nsec")
50 : : #define EVT_MAX_TMO_NSEC ("max_tmo_nsec")
51 : : #define EVT_EXPIRY_NSEC ("expiry_nsec")
52 : : #define EVT_MBUF_SZ ("mbuf_sz")
53 : : #define EVT_MAX_PKT_SZ ("max_pkt_sz")
54 : : #define EVT_PROD_ENQ_BURST_SZ ("prod_enq_burst_sz")
55 : : #define EVT_NB_ETH_QUEUES ("nb_eth_queues")
56 : : #define EVT_ENA_VECTOR ("enable_vector")
57 : : #define EVT_VECTOR_SZ ("vector_size")
58 : : #define EVT_VECTOR_TMO ("vector_tmo_ns")
59 : : #define EVT_PER_PORT_POOL ("per_port_pool")
60 : : #define EVT_TX_FIRST ("tx_first")
61 : : #define EVT_TX_PKT_SZ ("tx_pkt_sz")
62 : : #define EVT_PRESCHEDULE ("preschedule")
63 : : #define EVT_HELP ("help")
64 : :
65 : : void evt_options_default(struct evt_options *opt);
66 : : int evt_options_parse(struct evt_options *opt, int argc, char **argv);
67 : : void evt_options_dump(struct evt_options *opt);
68 : :
69 : : /* options check helpers */
70 : : static inline bool
71 : : evt_lcores_has_overlap(bool lcores[], int lcore)
72 : : {
73 : 0 : if (lcores[lcore] == true) {
74 : 0 : evt_err("lcore overlaps at %d", lcore);
75 : : return true;
76 : : }
77 : :
78 : : return false;
79 : : }
80 : :
81 : : static inline bool
82 : 0 : evt_lcores_has_overlap_multi(bool lcoresx[], bool lcoresy[])
83 : : {
84 : : int i;
85 : :
86 : 0 : for (i = 0; i < RTE_MAX_LCORE; i++) {
87 : 0 : if (lcoresx[i] && lcoresy[i]) {
88 : 0 : evt_err("lcores overlaps at %d", i);
89 : 0 : return true;
90 : : }
91 : : }
92 : : return false;
93 : : }
94 : :
95 : : static inline bool
96 : : evt_has_active_lcore(bool lcores[])
97 : : {
98 : : int i;
99 : :
100 : 0 : for (i = 0; i < RTE_MAX_LCORE; i++)
101 : 0 : if (lcores[i])
102 : : return true;
103 : : return false;
104 : : }
105 : :
106 : : static inline int
107 : : evt_nr_active_lcores(bool lcores[])
108 : : {
109 : : int i;
110 : : int c = 0;
111 : :
112 : 0 : for (i = 0; i < RTE_MAX_LCORE; i++)
113 : 0 : if (lcores[i])
114 : 0 : c++;
115 : : return c;
116 : : }
117 : :
118 : : static inline int
119 : : evt_get_first_active_lcore(bool lcores[])
120 : : {
121 : : int i;
122 : :
123 : 0 : for (i = 0; i < RTE_MAX_LCORE; i++)
124 : 0 : if (lcores[i])
125 : : return i;
126 : : return -1;
127 : : }
128 : :
129 : : static inline bool
130 : 0 : evt_has_disabled_lcore(bool lcores[])
131 : : {
132 : : int i;
133 : :
134 : 0 : for (i = 0; i < RTE_MAX_LCORE; i++)
135 : 0 : if ((lcores[i] == true) && !(rte_lcore_is_enabled(i)))
136 : : return true;
137 : : return false;
138 : : }
139 : :
140 : : static inline bool
141 : 0 : evt_has_invalid_stage(struct evt_options *opt)
142 : : {
143 : 0 : if (!opt->nb_stages) {
144 : 0 : evt_err("need minimum one stage, check --stlist");
145 : 0 : return true;
146 : : }
147 : 0 : if (opt->nb_stages > EVT_MAX_STAGES) {
148 : 0 : evt_err("requested changes are beyond EVT_MAX_STAGES=%d",
149 : : EVT_MAX_STAGES);
150 : 0 : return true;
151 : : }
152 : : return false;
153 : : }
154 : :
155 : : static inline bool
156 : 0 : evt_has_invalid_sched_type(struct evt_options *opt)
157 : : {
158 : : int i;
159 : :
160 : 0 : for (i = 0; i < opt->nb_stages; i++) {
161 : 0 : if (opt->sched_type_list[i] > RTE_SCHED_TYPE_PARALLEL) {
162 : 0 : evt_err("invalid sched_type %d at %d",
163 : : opt->sched_type_list[i], i);
164 : 0 : return true;
165 : : }
166 : : }
167 : : return false;
168 : : }
169 : :
170 : : /* option dump helpers */
171 : : static inline void
172 : 0 : evt_dump_worker_lcores(struct evt_options *opt)
173 : : {
174 : : int c;
175 : :
176 : : evt_dump_begin("worker lcores");
177 : 0 : for (c = 0; c < RTE_MAX_LCORE; c++) {
178 : 0 : if (opt->wlcores[c])
179 : : printf("%d ", c);
180 : : }
181 : : evt_dump_end;
182 : 0 : }
183 : :
184 : : static inline void
185 : 0 : evt_dump_producer_lcores(struct evt_options *opt)
186 : : {
187 : : int c;
188 : :
189 : : evt_dump_begin("producer lcores");
190 : 0 : for (c = 0; c < RTE_MAX_LCORE; c++) {
191 : 0 : if (opt->plcores[c])
192 : : printf("%d ", c);
193 : : }
194 : : evt_dump_end;
195 : 0 : }
196 : :
197 : : static inline void
198 : : evt_dump_nb_flows(struct evt_options *opt)
199 : : {
200 : 0 : evt_dump("nb_flows", "%d", opt->nb_flows);
201 : : }
202 : :
203 : : static inline void
204 : : evt_dump_worker_dequeue_depth(struct evt_options *opt)
205 : : {
206 : 0 : evt_dump("worker deq depth", "%d", opt->wkr_deq_dep);
207 : : }
208 : :
209 : : static inline void
210 : : evt_dump_nb_stages(struct evt_options *opt)
211 : : {
212 : 0 : evt_dump("nb_stages", "%d", opt->nb_stages);
213 : : }
214 : :
215 : : static inline void
216 : 0 : evt_dump_fwd_latency(struct evt_options *opt)
217 : : {
218 : 0 : evt_dump("fwd_latency", "%s", EVT_BOOL_FMT(opt->fwd_latency));
219 : 0 : }
220 : :
221 : : static inline void
222 : 0 : evt_dump_queue_priority(struct evt_options *opt)
223 : : {
224 : 0 : evt_dump("queue_priority", "%s", EVT_BOOL_FMT(opt->q_priority));
225 : 0 : }
226 : :
227 : : static inline const char*
228 : : evt_sched_type_2_str(uint8_t sched_type)
229 : : {
230 : :
231 : 0 : if (sched_type == RTE_SCHED_TYPE_ORDERED)
232 : : return "O";
233 : 0 : else if (sched_type == RTE_SCHED_TYPE_ATOMIC)
234 : : return "A";
235 : 0 : else if (sched_type == RTE_SCHED_TYPE_PARALLEL)
236 : : return "P";
237 : : else
238 : 0 : return "I";
239 : : }
240 : :
241 : : static inline void
242 : 0 : evt_dump_sched_type_list(struct evt_options *opt)
243 : : {
244 : : int i;
245 : :
246 : : evt_dump_begin("sched_type_list");
247 : 0 : for (i = 0; i < opt->nb_stages; i++)
248 : 0 : printf("%s ", evt_sched_type_2_str(opt->sched_type_list[i]));
249 : :
250 : : evt_dump_end;
251 : 0 : }
252 : :
253 : : static inline const char *
254 : : evt_prod_id_to_name(enum evt_prod_type prod_type)
255 : : {
256 : 0 : switch (prod_type) {
257 : : default:
258 : : case EVT_PROD_TYPE_SYNT:
259 : : return "Synthetic producer lcores";
260 : 0 : case EVT_PROD_TYPE_ETH_RX_ADPTR:
261 : 0 : return "Ethdev Rx Adapter";
262 : 0 : case EVT_PROD_TYPE_EVENT_TIMER_ADPTR:
263 : 0 : return "Event timer adapter";
264 : 0 : case EVT_PROD_TYPE_EVENT_CRYPTO_ADPTR:
265 : 0 : return "Event crypto adapter";
266 : 0 : case EVT_PROD_TYPE_EVENT_DMA_ADPTR:
267 : 0 : return "Event dma adapter";
268 : : }
269 : :
270 : : return "";
271 : : }
272 : :
273 : : #define EVT_PROD_MAX_NAME_LEN 50
274 : : static inline void
275 : 0 : evt_dump_producer_type(struct evt_options *opt)
276 : : {
277 : : char name[EVT_PROD_MAX_NAME_LEN];
278 : :
279 : 0 : switch (opt->prod_type) {
280 : : default:
281 : : case EVT_PROD_TYPE_SYNT:
282 : : snprintf(name, EVT_PROD_MAX_NAME_LEN,
283 : : "Synthetic producer lcores");
284 : : break;
285 : : case EVT_PROD_TYPE_ETH_RX_ADPTR:
286 : : snprintf(name, EVT_PROD_MAX_NAME_LEN,
287 : : "Ethdev Rx Adapter producers");
288 : 0 : evt_dump("nb_ethdev", "%d", rte_eth_dev_count_avail());
289 : : break;
290 : 0 : case EVT_PROD_TYPE_EVENT_TIMER_ADPTR:
291 : 0 : if (opt->timdev_use_burst)
292 : : snprintf(name, EVT_PROD_MAX_NAME_LEN,
293 : : "Event timer adapter burst mode producer");
294 : : else
295 : : snprintf(name, EVT_PROD_MAX_NAME_LEN,
296 : : "Event timer adapter producer");
297 : 0 : evt_dump("nb_timer_adapters", "%d", opt->nb_timer_adptrs);
298 : 0 : evt_dump("max_tmo_nsec", "%"PRIu64"", opt->max_tmo_nsec);
299 : 0 : evt_dump("expiry_nsec", "%"PRIu64"", opt->expiry_nsec);
300 : 0 : if (opt->optm_timer_tick_nsec)
301 : : evt_dump("optm_timer_tick_nsec", "%"PRIu64"",
302 : : opt->optm_timer_tick_nsec);
303 : : else
304 : 0 : evt_dump("timer_tick_nsec", "%"PRIu64"",
305 : : opt->timer_tick_nsec);
306 : : break;
307 : : case EVT_PROD_TYPE_EVENT_CRYPTO_ADPTR:
308 : : snprintf(name, EVT_PROD_MAX_NAME_LEN,
309 : : "Event crypto adapter producers");
310 : 0 : evt_dump("crypto adapter mode", "%s",
311 : : opt->crypto_adptr_mode ? "OP_FORWARD" : "OP_NEW");
312 : 0 : evt_dump("crypto op type", "%s",
313 : : (opt->crypto_op_type == RTE_CRYPTO_OP_TYPE_SYMMETRIC) ?
314 : : "SYMMETRIC" : "ASYMMETRIC");
315 : 0 : evt_dump("nb_cryptodev", "%u", rte_cryptodev_count());
316 : 0 : if (opt->crypto_op_type == RTE_CRYPTO_OP_TYPE_SYMMETRIC) {
317 : 0 : evt_dump("cipher algo", "%s",
318 : : rte_cryptodev_get_cipher_algo_string(opt->crypto_cipher_alg));
319 : 0 : evt_dump("cipher key sz", "%u",
320 : : opt->crypto_cipher_key_sz);
321 : 0 : evt_dump("cipher iv sz", "%u", opt->crypto_cipher_iv_sz);
322 : : }
323 : : break;
324 : : case EVT_PROD_TYPE_EVENT_DMA_ADPTR:
325 : : snprintf(name, EVT_PROD_MAX_NAME_LEN,
326 : : "Event dma adapter producers");
327 : 0 : evt_dump("dma adapter mode", "%s",
328 : : opt->dma_adptr_mode ? "OP_FORWARD" : "OP_NEW");
329 : 0 : evt_dump("nb_dmadev", "%u", rte_dma_count_avail());
330 : : break;
331 : :
332 : : }
333 : : evt_dump("prod_type", "%s", name);
334 : 0 : }
335 : :
336 : : #endif /* _EVT_OPTIONS_ */
|