Branch data Line data Source code
1 : : /* SPDX-License-Identifier: BSD-3-Clause
2 : : * Copyright(c) 2016-2020 Intel Corporation
3 : : */
4 : :
5 : : #include <inttypes.h>
6 : :
7 : : #include <rte_malloc.h>
8 : : #include <rte_eventdev.h>
9 : :
10 : : #include "dlb2_priv.h"
11 : : #include "dlb2_inline_fns.h"
12 : : #include "pf/base/dlb2_regs.h"
13 : :
14 : : enum dlb2_xstats_type {
15 : : /* common to device and port */
16 : : rx_ok, /**< Receive an event */
17 : : rx_drop, /**< Error bit set in received QE */
18 : : rx_interrupt_wait, /**< Wait on an interrupt */
19 : : rx_umonitor_umwait, /**< Block using umwait */
20 : : tx_ok, /**< Transmit an event */
21 : : total_polls, /**< Call dequeue_burst */
22 : : zero_polls, /**< Call dequeue burst and return 0 */
23 : : tx_nospc_ldb_hw_credits, /**< Insufficient LDB h/w credits */
24 : : tx_nospc_dir_hw_credits, /**< Insufficient DIR h/w credits */
25 : : tx_nospc_hw_credits, /**< Insufficient h/w credits */
26 : : tx_nospc_inflight_max, /**< Reach the new_event_threshold */
27 : : tx_nospc_new_event_limit, /**< Insufficient s/w credits */
28 : : tx_nospc_inflight_credits, /**< Port has too few s/w credits */
29 : : /* device specific */
30 : : nb_events_limit,
31 : : inflight_events,
32 : : ldb_pool_size,
33 : : dir_pool_size,
34 : : pool_size,
35 : : /* port specific */
36 : : tx_new, /**< Send an OP_NEW event */
37 : : tx_fwd, /**< Send an OP_FORWARD event */
38 : : tx_rel, /**< Send an OP_RELEASE event */
39 : : tx_implicit_rel, /**< Issue an implicit event release */
40 : : tx_sched_ordered, /**< Send a SCHED_TYPE_ORDERED event */
41 : : tx_sched_unordered, /**< Send a SCHED_TYPE_PARALLEL event */
42 : : tx_sched_atomic, /**< Send a SCHED_TYPE_ATOMIC event */
43 : : tx_sched_directed, /**< Send a directed event */
44 : : tx_invalid, /**< Send an event with an invalid op */
45 : : outstanding_releases, /**< # of releases a port owes */
46 : : max_outstanding_releases, /**< max # of releases a port can owe */
47 : : rx_sched_ordered, /**< Dequeue an ordered event */
48 : : rx_sched_unordered, /**< Dequeue an unordered event */
49 : : rx_sched_atomic, /**< Dequeue an atomic event */
50 : : rx_sched_directed, /**< Dequeue an directed event */
51 : : rx_sched_invalid, /**< Dequeue event sched type invalid */
52 : : /* common to port and queue */
53 : : is_configured, /**< Port is configured */
54 : : is_load_balanced, /**< Port is LDB */
55 : : hw_id, /**< Hardware ID */
56 : : /* queue specific */
57 : : num_links, /**< Number of ports linked */
58 : : sched_type, /**< Queue sched type */
59 : : enq_ok, /**< # events enqueued to the queue */
60 : : current_depth, /**< Current queue depth */
61 : : depth_threshold, /**< Programmed depth threshold */
62 : : depth_le50_threshold,
63 : : /**< Depth LE to 50% of the configured hardware threshold */
64 : : depth_gt50_le75_threshold,
65 : : /**< Depth GT 50%, but LE to 75% of the configured hardware threshold */
66 : : depth_gt75_le100_threshold,
67 : : /**< Depth GT 75%. but LE to the configured hardware threshold */
68 : : depth_gt100_threshold
69 : : /**< Depth GT 100% of the configured hw threshold */
70 : : };
71 : :
72 : : typedef uint64_t (*dlb2_xstats_fn)(struct dlb2_eventdev *dlb2,
73 : : uint16_t obj_idx, /* port or queue id */
74 : : enum dlb2_xstats_type stat, int extra_arg);
75 : :
76 : : enum dlb2_xstats_fn_type {
77 : : DLB2_XSTATS_FN_DEV,
78 : : DLB2_XSTATS_FN_PORT,
79 : : DLB2_XSTATS_FN_QUEUE
80 : : };
81 : :
82 : : struct dlb2_xstats_entry {
83 : : struct rte_event_dev_xstats_name name;
84 : : uint64_t reset_value; /* an offset to be taken away to emulate resets */
85 : : enum dlb2_xstats_fn_type fn_id;
86 : : enum dlb2_xstats_type stat;
87 : : enum rte_event_dev_xstats_mode mode;
88 : : int extra_arg;
89 : : uint16_t obj_idx;
90 : : uint8_t reset_allowed; /* when set, this value can be reset */
91 : : };
92 : :
93 : : /* Some device stats are simply a summation of the corresponding port values */
94 : : static uint64_t
95 : 0 : dlb2_device_traffic_stat_get(struct dlb2_eventdev *dlb2,
96 : : int which_stat)
97 : : {
98 : : int i;
99 : : uint64_t val = 0;
100 : :
101 [ # # # # ]: 0 : for (i = 0; i < DLB2_MAX_NUM_PORTS(dlb2->version); i++) {
102 : : struct dlb2_eventdev_port *port = &dlb2->ev_ports[i];
103 : :
104 [ # # ]: 0 : if (!port->setup_done)
105 : 0 : continue;
106 : :
107 [ # # # # : 0 : switch (which_stat) {
# # # # #
# # # #
# ]
108 : 0 : case rx_ok:
109 : 0 : val += port->stats.traffic.rx_ok;
110 : 0 : break;
111 : 0 : case rx_drop:
112 : 0 : val += port->stats.traffic.rx_drop;
113 : 0 : break;
114 : 0 : case rx_interrupt_wait:
115 : 0 : val += port->stats.traffic.rx_interrupt_wait;
116 : 0 : break;
117 : 0 : case rx_umonitor_umwait:
118 : 0 : val += port->stats.traffic.rx_umonitor_umwait;
119 : 0 : break;
120 : 0 : case tx_ok:
121 : 0 : val += port->stats.traffic.tx_ok;
122 : 0 : break;
123 : 0 : case total_polls:
124 : 0 : val += port->stats.traffic.total_polls;
125 : 0 : break;
126 : 0 : case zero_polls:
127 : 0 : val += port->stats.traffic.zero_polls;
128 : 0 : break;
129 : 0 : case tx_nospc_ldb_hw_credits:
130 : 0 : val += port->stats.traffic.tx_nospc_ldb_hw_credits;
131 : 0 : break;
132 : 0 : case tx_nospc_dir_hw_credits:
133 : 0 : val += port->stats.traffic.tx_nospc_dir_hw_credits;
134 : 0 : break;
135 : 0 : case tx_nospc_hw_credits:
136 : 0 : val += port->stats.traffic.tx_nospc_hw_credits;
137 : 0 : break;
138 : 0 : case tx_nospc_inflight_max:
139 : 0 : val += port->stats.traffic.tx_nospc_inflight_max;
140 : 0 : break;
141 : 0 : case tx_nospc_new_event_limit:
142 : 0 : val += port->stats.traffic.tx_nospc_new_event_limit;
143 : 0 : break;
144 : 0 : case tx_nospc_inflight_credits:
145 : 0 : val += port->stats.traffic.tx_nospc_inflight_credits;
146 : 0 : break;
147 : : default:
148 : : return -1;
149 : : }
150 : : }
151 : : return val;
152 : : }
153 : :
154 : : static uint64_t
155 : 0 : get_dev_stat(struct dlb2_eventdev *dlb2, uint16_t obj_idx __rte_unused,
156 : : enum dlb2_xstats_type type, int extra_arg __rte_unused)
157 : : {
158 [ # # # # : 0 : switch (type) {
# # # ]
159 : 0 : case rx_ok:
160 : : case rx_drop:
161 : : case rx_interrupt_wait:
162 : : case rx_umonitor_umwait:
163 : : case tx_ok:
164 : : case total_polls:
165 : : case zero_polls:
166 : : case tx_nospc_ldb_hw_credits:
167 : : case tx_nospc_dir_hw_credits:
168 : : case tx_nospc_hw_credits:
169 : : case tx_nospc_inflight_max:
170 : : case tx_nospc_new_event_limit:
171 : : case tx_nospc_inflight_credits:
172 : 0 : return dlb2_device_traffic_stat_get(dlb2, type);
173 : 0 : case nb_events_limit:
174 : 0 : return dlb2->new_event_limit;
175 : 0 : case inflight_events:
176 : 0 : return rte_atomic_load_explicit(&dlb2->inflights, rte_memory_order_seq_cst);
177 : 0 : case ldb_pool_size:
178 : 0 : return dlb2->num_ldb_credits;
179 : 0 : case dir_pool_size:
180 : 0 : return dlb2->num_dir_credits;
181 : 0 : case pool_size:
182 : 0 : return dlb2->num_credits;
183 : : default: return -1;
184 : : }
185 : : }
186 : :
187 : : static uint64_t
188 : 0 : get_port_stat(struct dlb2_eventdev *dlb2, uint16_t obj_idx,
189 : : enum dlb2_xstats_type type, int extra_arg __rte_unused)
190 : : {
191 : 0 : struct dlb2_eventdev_port *ev_port = &dlb2->ev_ports[obj_idx];
192 : :
193 [ # # # # : 0 : switch (type) {
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # ]
194 : 0 : case rx_ok: return ev_port->stats.traffic.rx_ok;
195 : :
196 : 0 : case rx_drop: return ev_port->stats.traffic.rx_drop;
197 : :
198 : 0 : case rx_interrupt_wait: return ev_port->stats.traffic.rx_interrupt_wait;
199 : :
200 : 0 : case rx_umonitor_umwait:
201 : 0 : return ev_port->stats.traffic.rx_umonitor_umwait;
202 : :
203 : 0 : case tx_ok: return ev_port->stats.traffic.tx_ok;
204 : :
205 : 0 : case total_polls: return ev_port->stats.traffic.total_polls;
206 : :
207 : 0 : case zero_polls: return ev_port->stats.traffic.zero_polls;
208 : :
209 : 0 : case tx_nospc_ldb_hw_credits:
210 : 0 : return ev_port->stats.traffic.tx_nospc_ldb_hw_credits;
211 : :
212 : 0 : case tx_nospc_dir_hw_credits:
213 : 0 : return ev_port->stats.traffic.tx_nospc_dir_hw_credits;
214 : :
215 : 0 : case tx_nospc_hw_credits:
216 : 0 : return ev_port->stats.traffic.tx_nospc_hw_credits;
217 : :
218 : 0 : case tx_nospc_inflight_max:
219 : 0 : return ev_port->stats.traffic.tx_nospc_inflight_max;
220 : :
221 : 0 : case tx_nospc_new_event_limit:
222 : 0 : return ev_port->stats.traffic.tx_nospc_new_event_limit;
223 : :
224 : 0 : case tx_nospc_inflight_credits:
225 : 0 : return ev_port->stats.traffic.tx_nospc_inflight_credits;
226 : :
227 : 0 : case is_configured: return ev_port->setup_done;
228 : :
229 : 0 : case is_load_balanced: return !ev_port->qm_port.is_directed;
230 : :
231 : 0 : case hw_id: return ev_port->qm_port.id;
232 : :
233 : 0 : case tx_new: return ev_port->stats.tx_op_cnt[RTE_EVENT_OP_NEW];
234 : :
235 : 0 : case tx_fwd: return ev_port->stats.tx_op_cnt[RTE_EVENT_OP_FORWARD];
236 : :
237 : 0 : case tx_rel: return ev_port->stats.tx_op_cnt[RTE_EVENT_OP_RELEASE];
238 : :
239 : 0 : case tx_implicit_rel: return ev_port->stats.tx_implicit_rel;
240 : :
241 : 0 : case tx_sched_ordered:
242 : 0 : return ev_port->stats.tx_sched_cnt[DLB2_SCHED_ORDERED];
243 : :
244 : 0 : case tx_sched_unordered:
245 : 0 : return ev_port->stats.tx_sched_cnt[DLB2_SCHED_UNORDERED];
246 : :
247 : 0 : case tx_sched_atomic:
248 : 0 : return ev_port->stats.tx_sched_cnt[DLB2_SCHED_ATOMIC];
249 : :
250 : 0 : case tx_sched_directed:
251 : 0 : return ev_port->stats.tx_sched_cnt[DLB2_SCHED_DIRECTED];
252 : :
253 : 0 : case tx_invalid: return ev_port->stats.tx_invalid;
254 : :
255 : 0 : case outstanding_releases: return ev_port->outstanding_releases;
256 : :
257 : : case max_outstanding_releases:
258 : : return DLB2_NUM_HIST_LIST_ENTRIES_PER_LDB_PORT;
259 : :
260 : 0 : case rx_sched_ordered:
261 : 0 : return ev_port->stats.rx_sched_cnt[DLB2_SCHED_ORDERED];
262 : :
263 : 0 : case rx_sched_unordered:
264 : 0 : return ev_port->stats.rx_sched_cnt[DLB2_SCHED_UNORDERED];
265 : :
266 : 0 : case rx_sched_atomic:
267 : 0 : return ev_port->stats.rx_sched_cnt[DLB2_SCHED_ATOMIC];
268 : :
269 : 0 : case rx_sched_directed:
270 : 0 : return ev_port->stats.rx_sched_cnt[DLB2_SCHED_DIRECTED];
271 : :
272 : 0 : case rx_sched_invalid: return ev_port->stats.rx_sched_invalid;
273 : :
274 : 0 : default: return -1;
275 : : }
276 : : }
277 : :
278 : : static uint64_t
279 : : dlb2_get_threshold_stat(struct dlb2_eventdev *dlb2, int qid, int stat)
280 : : {
281 : : int port = 0;
282 : : uint64_t tally = 0;
283 : :
284 [ # # # # : 0 : for (port = 0; port < DLB2_MAX_NUM_PORTS(dlb2->version); port++)
# # # # #
# # # # #
# # ]
285 : 0 : tally += dlb2->ev_ports[port].stats.queue[qid].qid_depth[stat];
286 : :
287 : : return tally;
288 : : }
289 : :
290 : : static uint64_t
291 : : dlb2_get_enq_ok_stat(struct dlb2_eventdev *dlb2, int qid)
292 : : {
293 : : int port = 0;
294 : : uint64_t enq_ok_tally = 0;
295 : :
296 [ # # # # ]: 0 : for (port = 0; port < DLB2_MAX_NUM_PORTS(dlb2->version); port++)
297 : 0 : enq_ok_tally += dlb2->ev_ports[port].stats.queue[qid].enq_ok;
298 : :
299 : : return enq_ok_tally;
300 : : }
301 : :
302 : : static uint64_t
303 : 0 : get_queue_stat(struct dlb2_eventdev *dlb2, uint16_t obj_idx,
304 : : enum dlb2_xstats_type type, int extra_arg __rte_unused)
305 : : {
306 : 0 : struct dlb2_eventdev_queue *ev_queue =
307 : 0 : &dlb2->ev_queues[obj_idx];
308 : :
309 [ # # # # : 0 : switch (type) {
# # # # #
# # # # ]
310 : 0 : case is_configured: return ev_queue->setup_done;
311 : :
312 : 0 : case is_load_balanced: return !ev_queue->qm_queue.is_directed;
313 : :
314 : 0 : case hw_id: return ev_queue->qm_queue.id;
315 : :
316 : 0 : case num_links: return ev_queue->num_links;
317 : :
318 : 0 : case sched_type: return ev_queue->qm_queue.sched_type;
319 : :
320 : : case enq_ok: return dlb2_get_enq_ok_stat(dlb2, obj_idx);
321 : :
322 : 0 : case current_depth: return dlb2_get_queue_depth(dlb2, ev_queue);
323 : :
324 : 0 : case depth_threshold: return ev_queue->depth_threshold;
325 : :
326 : 0 : case depth_le50_threshold:
327 : 0 : return dlb2_get_threshold_stat(dlb2, ev_queue->id,
328 : : DLB2_QID_DEPTH_LE50);
329 : :
330 : 0 : case depth_gt50_le75_threshold:
331 : 0 : return dlb2_get_threshold_stat(dlb2, ev_queue->id,
332 : : DLB2_QID_DEPTH_GT50_LE75);
333 : :
334 : 0 : case depth_gt75_le100_threshold:
335 : 0 : return dlb2_get_threshold_stat(dlb2, ev_queue->id,
336 : : DLB2_QID_DEPTH_GT75_LE100);
337 : :
338 : 0 : case depth_gt100_threshold:
339 : 0 : return dlb2_get_threshold_stat(dlb2, ev_queue->id,
340 : : DLB2_QID_DEPTH_GT100);
341 : :
342 : : default: return -1;
343 : : }
344 : : }
345 : :
346 : : int
347 : 0 : dlb2_xstats_init(struct dlb2_eventdev *dlb2)
348 : : {
349 : : /*
350 : : * define the stats names and types. Used to build up the device
351 : : * xstats array
352 : : * There are multiple set of stats:
353 : : * - device-level,
354 : : * - per-port,
355 : : * - per-qid,
356 : : *
357 : : * For each of these sets, we have three parallel arrays, one for the
358 : : * names, the other for the stat type parameter to be passed in the fn
359 : : * call to get that stat. The third array allows resetting or not.
360 : : * All these arrays must be kept in sync
361 : : */
362 : : static const char * const dev_stats[] = {
363 : : "rx_ok",
364 : : "rx_drop",
365 : : "rx_interrupt_wait",
366 : : "rx_umonitor_umwait",
367 : : "tx_ok",
368 : : "total_polls",
369 : : "zero_polls",
370 : : "tx_nospc_ldb_hw_credits",
371 : : "tx_nospc_dir_hw_credits",
372 : : "tx_nospc_hw_credits",
373 : : "tx_nospc_inflight_max",
374 : : "tx_nospc_new_event_limit",
375 : : "tx_nospc_inflight_credits",
376 : : "nb_events_limit",
377 : : "inflight_events",
378 : : "ldb_pool_size",
379 : : "dir_pool_size",
380 : : "pool_size",
381 : : };
382 : : static const enum dlb2_xstats_type dev_types[] = {
383 : : rx_ok,
384 : : rx_drop,
385 : : rx_interrupt_wait,
386 : : rx_umonitor_umwait,
387 : : tx_ok,
388 : : total_polls,
389 : : zero_polls,
390 : : tx_nospc_ldb_hw_credits,
391 : : tx_nospc_dir_hw_credits,
392 : : tx_nospc_hw_credits,
393 : : tx_nospc_inflight_max,
394 : : tx_nospc_new_event_limit,
395 : : tx_nospc_inflight_credits,
396 : : nb_events_limit,
397 : : inflight_events,
398 : : ldb_pool_size,
399 : : dir_pool_size,
400 : : pool_size,
401 : : };
402 : : /* Note: generated device stats are not allowed to be reset. */
403 : : static const uint8_t dev_reset_allowed[] = {
404 : : 0, /* rx_ok */
405 : : 0, /* rx_drop */
406 : : 0, /* rx_interrupt_wait */
407 : : 0, /* rx_umonitor_umwait */
408 : : 0, /* tx_ok */
409 : : 0, /* total_polls */
410 : : 0, /* zero_polls */
411 : : 0, /* tx_nospc_ldb_hw_credits */
412 : : 0, /* tx_nospc_dir_hw_credits */
413 : : 0, /* tx_nospc_hw_credits */
414 : : 0, /* tx_nospc_inflight_max */
415 : : 0, /* tx_nospc_new_event_limit */
416 : : 0, /* tx_nospc_inflight_credits */
417 : : 0, /* nb_events_limit */
418 : : 0, /* inflight_events */
419 : : 0, /* ldb_pool_size */
420 : : 0, /* dir_pool_size */
421 : : 0, /* pool_size */
422 : : };
423 : : static const char * const port_stats[] = {
424 : : "is_configured",
425 : : "is_load_balanced",
426 : : "hw_id",
427 : : "rx_ok",
428 : : "rx_drop",
429 : : "rx_interrupt_wait",
430 : : "rx_umonitor_umwait",
431 : : "tx_ok",
432 : : "total_polls",
433 : : "zero_polls",
434 : : "tx_nospc_ldb_hw_credits",
435 : : "tx_nospc_dir_hw_credits",
436 : : "tx_nospc_hw_credits",
437 : : "tx_nospc_inflight_max",
438 : : "tx_nospc_new_event_limit",
439 : : "tx_nospc_inflight_credits",
440 : : "tx_new",
441 : : "tx_fwd",
442 : : "tx_rel",
443 : : "tx_implicit_rel",
444 : : "tx_sched_ordered",
445 : : "tx_sched_unordered",
446 : : "tx_sched_atomic",
447 : : "tx_sched_directed",
448 : : "tx_invalid",
449 : : "outstanding_releases",
450 : : "max_outstanding_releases",
451 : : "rx_sched_ordered",
452 : : "rx_sched_unordered",
453 : : "rx_sched_atomic",
454 : : "rx_sched_directed",
455 : : "rx_sched_invalid"
456 : : };
457 : : static const enum dlb2_xstats_type port_types[] = {
458 : : is_configured,
459 : : is_load_balanced,
460 : : hw_id,
461 : : rx_ok,
462 : : rx_drop,
463 : : rx_interrupt_wait,
464 : : rx_umonitor_umwait,
465 : : tx_ok,
466 : : total_polls,
467 : : zero_polls,
468 : : tx_nospc_ldb_hw_credits,
469 : : tx_nospc_dir_hw_credits,
470 : : tx_nospc_hw_credits,
471 : : tx_nospc_inflight_max,
472 : : tx_nospc_new_event_limit,
473 : : tx_nospc_inflight_credits,
474 : : tx_new,
475 : : tx_fwd,
476 : : tx_rel,
477 : : tx_implicit_rel,
478 : : tx_sched_ordered,
479 : : tx_sched_unordered,
480 : : tx_sched_atomic,
481 : : tx_sched_directed,
482 : : tx_invalid,
483 : : outstanding_releases,
484 : : max_outstanding_releases,
485 : : rx_sched_ordered,
486 : : rx_sched_unordered,
487 : : rx_sched_atomic,
488 : : rx_sched_directed,
489 : : rx_sched_invalid
490 : : };
491 : : static const uint8_t port_reset_allowed[] = {
492 : : 0, /* is_configured */
493 : : 0, /* is_load_balanced */
494 : : 0, /* hw_id */
495 : : 1, /* rx_ok */
496 : : 1, /* rx_drop */
497 : : 1, /* rx_interrupt_wait */
498 : : 1, /* rx_umonitor_umwait */
499 : : 1, /* tx_ok */
500 : : 1, /* total_polls */
501 : : 1, /* zero_polls */
502 : : 1, /* tx_nospc_ldb_hw_credits */
503 : : 1, /* tx_nospc_dir_hw_credits */
504 : : 1, /* tx_nospc_hw_credits */
505 : : 1, /* tx_nospc_inflight_max */
506 : : 1, /* tx_nospc_new_event_limit */
507 : : 1, /* tx_nospc_inflight_credits */
508 : : 1, /* tx_new */
509 : : 1, /* tx_fwd */
510 : : 1, /* tx_rel */
511 : : 1, /* tx_implicit_rel */
512 : : 1, /* tx_sched_ordered */
513 : : 1, /* tx_sched_unordered */
514 : : 1, /* tx_sched_atomic */
515 : : 1, /* tx_sched_directed */
516 : : 1, /* tx_invalid */
517 : : 0, /* outstanding_releases */
518 : : 0, /* max_outstanding_releases */
519 : : 1, /* rx_sched_ordered */
520 : : 1, /* rx_sched_unordered */
521 : : 1, /* rx_sched_atomic */
522 : : 1, /* rx_sched_directed */
523 : : 1 /* rx_sched_invalid */
524 : : };
525 : :
526 : : /* QID specific stats */
527 : : static const char * const qid_stats[] = {
528 : : "is_configured",
529 : : "is_load_balanced",
530 : : "hw_id",
531 : : "num_links",
532 : : "sched_type",
533 : : "enq_ok",
534 : : "current_depth",
535 : : "depth_threshold",
536 : : "depth_le50_threshold",
537 : : "depth_gt50_le75_threshold",
538 : : "depth_gt75_le100_threshold",
539 : : "depth_gt100_threshold",
540 : : };
541 : : static const enum dlb2_xstats_type qid_types[] = {
542 : : is_configured,
543 : : is_load_balanced,
544 : : hw_id,
545 : : num_links,
546 : : sched_type,
547 : : enq_ok,
548 : : current_depth,
549 : : depth_threshold,
550 : : depth_le50_threshold,
551 : : depth_gt50_le75_threshold,
552 : : depth_gt75_le100_threshold,
553 : : depth_gt100_threshold,
554 : : };
555 : : static const uint8_t qid_reset_allowed[] = {
556 : : 0, /* is_configured */
557 : : 0, /* is_load_balanced */
558 : : 0, /* hw_id */
559 : : 0, /* num_links */
560 : : 0, /* sched_type */
561 : : 1, /* enq_ok */
562 : : 0, /* current_depth */
563 : : 0, /* depth_threshold */
564 : : 1, /* depth_le50_threshold */
565 : : 1, /* depth_gt50_le75_threshold */
566 : : 1, /* depth_gt75_le100_threshold */
567 : : 1, /* depth_gt100_threshold */
568 : : };
569 : :
570 : : /* ---- end of stat definitions ---- */
571 : :
572 : : /* check sizes, since a missed comma can lead to strings being
573 : : * joined by the compiler.
574 : : */
575 : : RTE_BUILD_BUG_ON(RTE_DIM(dev_stats) != RTE_DIM(dev_types));
576 : : RTE_BUILD_BUG_ON(RTE_DIM(port_stats) != RTE_DIM(port_types));
577 : : RTE_BUILD_BUG_ON(RTE_DIM(qid_stats) != RTE_DIM(qid_types));
578 : :
579 : : RTE_BUILD_BUG_ON(RTE_DIM(dev_stats) != RTE_DIM(dev_reset_allowed));
580 : : RTE_BUILD_BUG_ON(RTE_DIM(port_stats) != RTE_DIM(port_reset_allowed));
581 : : RTE_BUILD_BUG_ON(RTE_DIM(qid_stats) != RTE_DIM(qid_reset_allowed));
582 : :
583 : : /* other vars */
584 : 0 : const unsigned int count = RTE_DIM(dev_stats) +
585 [ # # # # ]: 0 : DLB2_MAX_NUM_PORTS(dlb2->version) * RTE_DIM(port_stats) +
586 : : DLB2_MAX_NUM_QUEUES(dlb2->version) * RTE_DIM(qid_stats);
587 : : unsigned int i, port, qid, stat_id = 0;
588 : :
589 : 0 : dlb2->xstats = rte_zmalloc_socket(NULL,
590 : : sizeof(dlb2->xstats[0]) * count, 0,
591 : 0 : dlb2->qm_instance.info.socket_id);
592 [ # # ]: 0 : if (dlb2->xstats == NULL)
593 : : return -ENOMEM;
594 : :
595 : : #define sname dlb2->xstats[stat_id].name.name
596 [ # # ]: 0 : for (i = 0; i < RTE_DIM(dev_stats); i++, stat_id++) {
597 : 0 : dlb2->xstats[stat_id] = (struct dlb2_xstats_entry) {
598 : : .fn_id = DLB2_XSTATS_FN_DEV,
599 : 0 : .stat = dev_types[i],
600 : : .mode = RTE_EVENT_DEV_XSTATS_DEVICE,
601 : 0 : .reset_allowed = dev_reset_allowed[i],
602 : : };
603 : 0 : snprintf(sname, sizeof(sname), "dev_%s", dev_stats[i]);
604 : : }
605 : 0 : dlb2->xstats_count_mode_dev = stat_id;
606 : :
607 [ # # # # ]: 0 : for (port = 0; port < DLB2_MAX_NUM_PORTS(dlb2->version); port++) {
608 : 0 : dlb2->xstats_offset_for_port[port] = stat_id;
609 : :
610 : : uint32_t count_offset = stat_id;
611 : :
612 [ # # ]: 0 : for (i = 0; i < RTE_DIM(port_stats); i++, stat_id++) {
613 : 0 : dlb2->xstats[stat_id] = (struct dlb2_xstats_entry){
614 : : .fn_id = DLB2_XSTATS_FN_PORT,
615 : : .obj_idx = port,
616 : 0 : .stat = port_types[i],
617 : : .mode = RTE_EVENT_DEV_XSTATS_PORT,
618 : 0 : .reset_allowed = port_reset_allowed[i],
619 : : };
620 : 0 : snprintf(sname, sizeof(sname), "port_%u_%s",
621 : 0 : port, port_stats[i]);
622 : : }
623 : :
624 : 0 : dlb2->xstats_count_per_port[port] = stat_id - count_offset;
625 : : }
626 : :
627 : 0 : dlb2->xstats_count_mode_port = stat_id - dlb2->xstats_count_mode_dev;
628 : :
629 [ # # # # ]: 0 : for (qid = 0; qid < DLB2_MAX_NUM_QUEUES(dlb2->version); qid++) {
630 : : uint32_t count_offset = stat_id;
631 : :
632 : 0 : dlb2->xstats_offset_for_qid[qid] = stat_id;
633 : :
634 [ # # ]: 0 : for (i = 0; i < RTE_DIM(qid_stats); i++, stat_id++) {
635 : 0 : dlb2->xstats[stat_id] = (struct dlb2_xstats_entry){
636 : : .fn_id = DLB2_XSTATS_FN_QUEUE,
637 : : .obj_idx = qid,
638 : 0 : .stat = qid_types[i],
639 : : .mode = RTE_EVENT_DEV_XSTATS_QUEUE,
640 : 0 : .reset_allowed = qid_reset_allowed[i],
641 : : };
642 : 0 : snprintf(sname, sizeof(sname), "qid_%u_%s",
643 : 0 : qid, qid_stats[i]);
644 : : }
645 : :
646 : 0 : dlb2->xstats_count_per_qid[qid] = stat_id - count_offset;
647 : : }
648 : :
649 : 0 : dlb2->xstats_count_mode_queue = stat_id -
650 : 0 : (dlb2->xstats_count_mode_dev + dlb2->xstats_count_mode_port);
651 : : #undef sname
652 : :
653 : 0 : dlb2->xstats_count = stat_id;
654 : :
655 : 0 : return 0;
656 : : }
657 : :
658 : : void
659 : 0 : dlb2_xstats_uninit(struct dlb2_eventdev *dlb2)
660 : : {
661 : 0 : rte_free(dlb2->xstats);
662 : 0 : dlb2->xstats_count = 0;
663 : 0 : }
664 : :
665 : : int
666 [ # # # # ]: 0 : dlb2_eventdev_xstats_get_names(const struct rte_eventdev *dev,
667 : : enum rte_event_dev_xstats_mode mode, uint8_t queue_port_id,
668 : : struct rte_event_dev_xstats_name *xstats_names,
669 : : uint64_t *ids, unsigned int size)
670 : : {
671 : : const struct dlb2_eventdev *dlb2 = dlb2_pmd_priv(dev);
672 : : unsigned int i;
673 : : unsigned int xidx = 0;
674 : : uint32_t xstats_mode_count = 0;
675 : : uint32_t start_offset = 0;
676 : :
677 [ # # # # ]: 0 : switch (mode) {
678 : 0 : case RTE_EVENT_DEV_XSTATS_DEVICE:
679 : 0 : xstats_mode_count = dlb2->xstats_count_mode_dev;
680 : 0 : break;
681 : 0 : case RTE_EVENT_DEV_XSTATS_PORT:
682 [ # # # # ]: 0 : if (queue_port_id >= DLB2_MAX_NUM_PORTS(dlb2->version))
683 : : break;
684 : 0 : xstats_mode_count = dlb2->xstats_count_per_port[queue_port_id];
685 : 0 : start_offset = dlb2->xstats_offset_for_port[queue_port_id];
686 : 0 : break;
687 : 0 : case RTE_EVENT_DEV_XSTATS_QUEUE:
688 [ # # # # ]: 0 : if (queue_port_id >= DLB2_MAX_NUM_QUEUES(dlb2->version) &&
689 : : (DLB2_MAX_NUM_QUEUES(dlb2->version) <= 255))
690 : : break;
691 : 0 : xstats_mode_count = dlb2->xstats_count_per_qid[queue_port_id];
692 : 0 : start_offset = dlb2->xstats_offset_for_qid[queue_port_id];
693 : 0 : break;
694 : : default:
695 : : return -EINVAL;
696 : : };
697 : :
698 [ # # # # ]: 0 : if (xstats_mode_count > size || ids == NULL || xstats_names == NULL)
699 : 0 : return xstats_mode_count;
700 : :
701 [ # # # # ]: 0 : for (i = 0; i < dlb2->xstats_count && xidx < size; i++) {
702 [ # # ]: 0 : if (dlb2->xstats[i].mode != mode)
703 : 0 : continue;
704 : :
705 [ # # ]: 0 : if (mode != RTE_EVENT_DEV_XSTATS_DEVICE &&
706 [ # # ]: 0 : queue_port_id != dlb2->xstats[i].obj_idx)
707 : 0 : continue;
708 : :
709 : 0 : xstats_names[xidx] = dlb2->xstats[i].name;
710 : : if (ids)
711 : 0 : ids[xidx] = start_offset + xidx;
712 : 0 : xidx++;
713 : : }
714 : 0 : return xidx;
715 : : }
716 : :
717 : : static int
718 : 0 : dlb2_xstats_update(struct dlb2_eventdev *dlb2,
719 : : enum rte_event_dev_xstats_mode mode,
720 : : uint8_t queue_port_id, const uint64_t ids[],
721 : : uint64_t values[], unsigned int n, const uint32_t reset)
722 : : {
723 : : unsigned int i;
724 : : unsigned int xidx = 0;
725 : : uint32_t xstats_mode_count = 0;
726 : :
727 [ # # # # ]: 0 : switch (mode) {
728 : 0 : case RTE_EVENT_DEV_XSTATS_DEVICE:
729 : 0 : xstats_mode_count = dlb2->xstats_count_mode_dev;
730 : 0 : break;
731 : 0 : case RTE_EVENT_DEV_XSTATS_PORT:
732 [ # # # # ]: 0 : if (queue_port_id >= DLB2_MAX_NUM_PORTS(dlb2->version))
733 : 0 : goto invalid_value;
734 : 0 : xstats_mode_count = dlb2->xstats_count_per_port[queue_port_id];
735 : 0 : break;
736 : 0 : case RTE_EVENT_DEV_XSTATS_QUEUE:
737 : : #if (DLB2_MAX_NUM_QUEUES(DLB2_HW_V2_5) <= 255) /* max 8 bit value */
738 [ # # # # ]: 0 : if (queue_port_id >= DLB2_MAX_NUM_QUEUES(dlb2->version))
739 : 0 : goto invalid_value;
740 : : #endif
741 : 0 : xstats_mode_count = dlb2->xstats_count_per_qid[queue_port_id];
742 : 0 : break;
743 : 0 : default:
744 : 0 : goto invalid_value;
745 : : };
746 : :
747 [ # # ]: 0 : for (i = 0; i < n && xidx < xstats_mode_count; i++) {
748 : 0 : struct dlb2_xstats_entry *xs = &dlb2->xstats[ids[i]];
749 : : dlb2_xstats_fn fn;
750 : :
751 [ # # # # ]: 0 : if (ids[i] > dlb2->xstats_count || xs->mode != mode)
752 : 0 : continue;
753 : :
754 [ # # ]: 0 : if (mode != RTE_EVENT_DEV_XSTATS_DEVICE &&
755 [ # # ]: 0 : queue_port_id != xs->obj_idx)
756 : 0 : continue;
757 : :
758 [ # # # # ]: 0 : switch (xs->fn_id) {
759 : : case DLB2_XSTATS_FN_DEV:
760 : : fn = get_dev_stat;
761 : : break;
762 : 0 : case DLB2_XSTATS_FN_PORT:
763 : : fn = get_port_stat;
764 : 0 : break;
765 : 0 : case DLB2_XSTATS_FN_QUEUE:
766 : : fn = get_queue_stat;
767 : 0 : break;
768 : 0 : default:
769 : 0 : DLB2_LOG_ERR("Unexpected xstat fn_id %d", xs->fn_id);
770 : 0 : goto invalid_value;
771 : : }
772 : :
773 : 0 : uint64_t val = fn(dlb2, xs->obj_idx, xs->stat,
774 : 0 : xs->extra_arg) - xs->reset_value;
775 : :
776 [ # # ]: 0 : if (values)
777 : 0 : values[xidx] = val;
778 : :
779 [ # # # # ]: 0 : if (xs->reset_allowed && reset)
780 : 0 : xs->reset_value += val;
781 : :
782 : 0 : xidx++;
783 : : }
784 : :
785 : 0 : return xidx;
786 : :
787 : : invalid_value:
788 : : return -EINVAL;
789 : : }
790 : :
791 : : int
792 : 0 : dlb2_eventdev_xstats_get(const struct rte_eventdev *dev,
793 : : enum rte_event_dev_xstats_mode mode, uint8_t queue_port_id,
794 : : const uint64_t ids[], uint64_t values[], unsigned int n)
795 : : {
796 : : struct dlb2_eventdev *dlb2 = dlb2_pmd_priv(dev);
797 : : const uint32_t reset = 0;
798 : :
799 : 0 : return dlb2_xstats_update(dlb2, mode, queue_port_id, ids, values, n,
800 : : reset);
801 : : }
802 : :
803 : : uint64_t
804 : 0 : dlb2_eventdev_xstats_get_by_name(const struct rte_eventdev *dev,
805 : : const char *name, uint64_t *id)
806 : : {
807 : : struct dlb2_eventdev *dlb2 = dlb2_pmd_priv(dev);
808 : : unsigned int i;
809 : : dlb2_xstats_fn fn;
810 : :
811 [ # # ]: 0 : for (i = 0; i < dlb2->xstats_count; i++) {
812 : 0 : struct dlb2_xstats_entry *xs = &dlb2->xstats[i];
813 : :
814 [ # # ]: 0 : if (strncmp(xs->name.name, name,
815 : : RTE_EVENT_DEV_XSTATS_NAME_SIZE) == 0){
816 [ # # ]: 0 : if (id != NULL)
817 : 0 : *id = i;
818 : :
819 [ # # # # ]: 0 : switch (xs->fn_id) {
820 : : case DLB2_XSTATS_FN_DEV:
821 : : fn = get_dev_stat;
822 : : break;
823 : 0 : case DLB2_XSTATS_FN_PORT:
824 : : fn = get_port_stat;
825 : 0 : break;
826 : 0 : case DLB2_XSTATS_FN_QUEUE:
827 : : fn = get_queue_stat;
828 : 0 : break;
829 : 0 : default:
830 : 0 : DLB2_LOG_ERR("Unexpected xstat fn_id %d",
831 : : xs->fn_id);
832 : 0 : return (uint64_t)-1;
833 : : }
834 : :
835 : 0 : return fn(dlb2, xs->obj_idx, xs->stat,
836 : 0 : xs->extra_arg) - xs->reset_value;
837 : : }
838 : : }
839 [ # # ]: 0 : if (id != NULL)
840 : 0 : *id = (uint32_t)-1;
841 : : return (uint64_t)-1;
842 : : }
843 : :
844 : : static void
845 : 0 : dlb2_xstats_reset_range(struct dlb2_eventdev *dlb2, uint32_t start,
846 : : uint32_t num)
847 : : {
848 : : uint32_t i;
849 : : dlb2_xstats_fn fn;
850 : :
851 [ # # ]: 0 : for (i = start; i < start + num; i++) {
852 : 0 : struct dlb2_xstats_entry *xs = &dlb2->xstats[i];
853 : :
854 [ # # ]: 0 : if (!xs->reset_allowed)
855 : 0 : continue;
856 : :
857 [ # # # # ]: 0 : switch (xs->fn_id) {
858 : : case DLB2_XSTATS_FN_DEV:
859 : : fn = get_dev_stat;
860 : : break;
861 : 0 : case DLB2_XSTATS_FN_PORT:
862 : : fn = get_port_stat;
863 : 0 : break;
864 : 0 : case DLB2_XSTATS_FN_QUEUE:
865 : : fn = get_queue_stat;
866 : 0 : break;
867 : 0 : default:
868 : 0 : DLB2_LOG_ERR("Unexpected xstat fn_id %d", xs->fn_id);
869 : 0 : return;
870 : : }
871 : :
872 : 0 : uint64_t val = fn(dlb2, xs->obj_idx, xs->stat, xs->extra_arg);
873 : 0 : xs->reset_value = val;
874 : : }
875 : : }
876 : :
877 : : static int
878 : 0 : dlb2_xstats_reset_queue(struct dlb2_eventdev *dlb2, uint8_t queue_id,
879 : : const uint64_t ids[], uint32_t nb_ids)
880 : : {
881 : : const uint32_t reset = 1;
882 : :
883 [ # # ]: 0 : if (ids) {
884 : 0 : uint32_t nb_reset = dlb2_xstats_update(dlb2,
885 : : RTE_EVENT_DEV_XSTATS_QUEUE,
886 : : queue_id, ids, NULL, nb_ids,
887 : : reset);
888 [ # # ]: 0 : return nb_reset == nb_ids ? 0 : -EINVAL;
889 : : }
890 : :
891 : : if (ids == NULL)
892 : 0 : dlb2_xstats_reset_range(dlb2,
893 : 0 : dlb2->xstats_offset_for_qid[queue_id],
894 : 0 : dlb2->xstats_count_per_qid[queue_id]);
895 : :
896 : 0 : return 0;
897 : : }
898 : :
899 : : static int
900 : 0 : dlb2_xstats_reset_port(struct dlb2_eventdev *dlb2, uint8_t port_id,
901 : : const uint64_t ids[], uint32_t nb_ids)
902 : : {
903 : : const uint32_t reset = 1;
904 : 0 : int offset = dlb2->xstats_offset_for_port[port_id];
905 : 0 : int nb_stat = dlb2->xstats_count_per_port[port_id];
906 : :
907 [ # # ]: 0 : if (ids) {
908 : 0 : uint32_t nb_reset = dlb2_xstats_update(dlb2,
909 : : RTE_EVENT_DEV_XSTATS_PORT, port_id,
910 : : ids, NULL, nb_ids,
911 : : reset);
912 [ # # ]: 0 : return nb_reset == nb_ids ? 0 : -EINVAL;
913 : : }
914 : :
915 : 0 : dlb2_xstats_reset_range(dlb2, offset, nb_stat);
916 : 0 : return 0;
917 : : }
918 : :
919 : : static int
920 : 0 : dlb2_xstats_reset_dev(struct dlb2_eventdev *dlb2, const uint64_t ids[],
921 : : uint32_t nb_ids)
922 : : {
923 : : uint32_t i;
924 : :
925 [ # # ]: 0 : if (ids) {
926 [ # # ]: 0 : for (i = 0; i < nb_ids; i++) {
927 : 0 : uint64_t id = ids[i];
928 : :
929 [ # # ]: 0 : if (id >= dlb2->xstats_count_mode_dev)
930 : : return -EINVAL;
931 : 0 : dlb2_xstats_reset_range(dlb2, id, 1);
932 : : }
933 : : } else {
934 [ # # ]: 0 : for (i = 0; i < dlb2->xstats_count_mode_dev; i++)
935 : 0 : dlb2_xstats_reset_range(dlb2, i, 1);
936 : : }
937 : :
938 : : return 0;
939 : : }
940 : :
941 : : int
942 [ # # # # ]: 0 : dlb2_eventdev_xstats_reset(struct rte_eventdev *dev,
943 : : enum rte_event_dev_xstats_mode mode,
944 : : int16_t queue_port_id,
945 : : const uint64_t ids[],
946 : : uint32_t nb_ids)
947 : : {
948 : : struct dlb2_eventdev *dlb2 = dlb2_pmd_priv(dev);
949 : : uint32_t i;
950 : :
951 : : /* handle -1 for queue_port_id here, looping over all ports/queues */
952 [ # # # # ]: 0 : switch (mode) {
953 : 0 : case RTE_EVENT_DEV_XSTATS_DEVICE:
954 [ # # ]: 0 : if (dlb2_xstats_reset_dev(dlb2, ids, nb_ids))
955 : 0 : return -EINVAL;
956 : : break;
957 : 0 : case RTE_EVENT_DEV_XSTATS_PORT:
958 [ # # ]: 0 : if (queue_port_id == -1) {
959 : : for (i = 0;
960 [ # # # # ]: 0 : i < DLB2_MAX_NUM_PORTS(dlb2->version); i++) {
961 [ # # ]: 0 : if (dlb2_xstats_reset_port(dlb2, i,
962 : : ids, nb_ids))
963 : : return -EINVAL;
964 : : }
965 [ # # # # ]: 0 : } else if (queue_port_id < DLB2_MAX_NUM_PORTS(dlb2->version)) {
966 [ # # ]: 0 : if (dlb2_xstats_reset_port(dlb2, queue_port_id,
967 : : ids, nb_ids))
968 : 0 : return -EINVAL;
969 : : }
970 : : break;
971 : 0 : case RTE_EVENT_DEV_XSTATS_QUEUE:
972 [ # # ]: 0 : if (queue_port_id == -1) {
973 : : for (i = 0;
974 [ # # # # ]: 0 : i < DLB2_MAX_NUM_QUEUES(dlb2->version); i++) {
975 [ # # ]: 0 : if (dlb2_xstats_reset_queue(dlb2, i,
976 : : ids, nb_ids))
977 : : return -EINVAL;
978 : : }
979 [ # # # # ]: 0 : } else if (queue_port_id < DLB2_MAX_NUM_QUEUES(dlb2->version)) {
980 [ # # ]: 0 : if (dlb2_xstats_reset_queue(dlb2, queue_port_id,
981 : : ids, nb_ids))
982 : 0 : return -EINVAL;
983 : : }
984 : : break;
985 : : };
986 : :
987 : : return 0;
988 : : }
989 : :
990 : : void
991 [ # # ]: 0 : dlb2_eventdev_dump(struct rte_eventdev *dev, FILE *f)
992 : : {
993 : : struct dlb2_eventdev *dlb2;
994 : : struct dlb2_hw_dev *handle;
995 : : int i;
996 : :
997 : : dlb2 = dlb2_pmd_priv(dev);
998 : :
999 [ # # ]: 0 : if (dlb2 == NULL) {
1000 : : fprintf(f, "DLB2 Event device cannot be dumped!\n");
1001 : 0 : return;
1002 : : }
1003 : :
1004 [ # # ]: 0 : if (!dlb2->configured)
1005 : : fprintf(f, "DLB2 Event device is not configured\n");
1006 : :
1007 : : handle = &dlb2->qm_instance;
1008 : :
1009 : : fprintf(f, "================\n");
1010 : : fprintf(f, "DLB2 Device Dump\n");
1011 : : fprintf(f, "================\n");
1012 : :
1013 : 0 : fprintf(f, "Processor supports umonitor/umwait instructions = %s\n",
1014 [ # # ]: 0 : dlb2->umwait_allowed ? "yes" : "no");
1015 : :
1016 : : /* Generic top level device information */
1017 : :
1018 : : fprintf(f, "device is configured and run state =");
1019 [ # # ]: 0 : if (dlb2->run_state == DLB2_RUN_STATE_STOPPED)
1020 : : fprintf(f, "STOPPED\n");
1021 [ # # ]: 0 : else if (dlb2->run_state == DLB2_RUN_STATE_STOPPING)
1022 : : fprintf(f, "STOPPING\n");
1023 [ # # ]: 0 : else if (dlb2->run_state == DLB2_RUN_STATE_STARTING)
1024 : : fprintf(f, "STARTING\n");
1025 [ # # ]: 0 : else if (dlb2->run_state == DLB2_RUN_STATE_STARTED)
1026 : : fprintf(f, "STARTED\n");
1027 : : else
1028 : : fprintf(f, "UNEXPECTED\n");
1029 : :
1030 : 0 : fprintf(f, "domain ID=%u, socket_id=%u, evdev=%p\n",
1031 : : handle->domain_id, handle->info.socket_id, dlb2->event_dev);
1032 : :
1033 : 0 : fprintf(f, "num dir ports=%u, num dir queues=%u\n",
1034 : 0 : dlb2->num_dir_ports, dlb2->num_dir_queues);
1035 : :
1036 : 0 : fprintf(f, "num ldb ports=%u, num ldb queues=%u\n",
1037 : 0 : dlb2->num_ldb_ports, dlb2->num_ldb_queues);
1038 : :
1039 : 0 : fprintf(f, "num atomic inflights=%u, hist list entries=%u\n",
1040 : : handle->cfg.resources.num_atomic_inflights,
1041 : : handle->cfg.resources.num_hist_list_entries);
1042 : :
1043 : : fprintf(f, "results from most recent hw resource query:\n");
1044 : :
1045 : 0 : fprintf(f, "\tnum_sched_domains = %u\n",
1046 : : dlb2->hw_rsrc_query_results.num_sched_domains);
1047 : :
1048 : 0 : fprintf(f, "\tnum_ldb_queues = %u\n",
1049 : : dlb2->hw_rsrc_query_results.num_ldb_queues);
1050 : :
1051 : 0 : fprintf(f, "\tnum_ldb_ports = %u\n",
1052 : : dlb2->hw_rsrc_query_results.num_ldb_ports);
1053 : :
1054 : 0 : fprintf(f, "\tnum_dir_ports = %u\n",
1055 : : dlb2->hw_rsrc_query_results.num_dir_ports);
1056 : :
1057 : 0 : fprintf(f, "\tnum_atomic_inflights = %u\n",
1058 : : dlb2->hw_rsrc_query_results.num_atomic_inflights);
1059 : :
1060 : 0 : fprintf(f, "\tnum_hist_list_entries = %u\n",
1061 : : dlb2->hw_rsrc_query_results.num_hist_list_entries);
1062 : :
1063 : 0 : fprintf(f, "\tmax_contiguous_hist_list_entries = %u\n",
1064 : : dlb2->hw_rsrc_query_results.max_contiguous_hist_list_entries);
1065 : :
1066 : 0 : fprintf(f, "\tnum_ldb_credits = %u\n",
1067 : : dlb2->hw_rsrc_query_results.num_ldb_credits);
1068 : :
1069 : 0 : fprintf(f, "\tnum_dir_credits = %u\n",
1070 : : dlb2->hw_rsrc_query_results.num_dir_credits);
1071 : :
1072 : 0 : fprintf(f, "\tnum_credits = %u\n",
1073 : : dlb2->hw_rsrc_query_results.num_credits);
1074 : :
1075 : : /* Port level information */
1076 : :
1077 [ # # ]: 0 : for (i = 0; i < dlb2->num_ports; i++) {
1078 : : struct dlb2_eventdev_port *p = &dlb2->ev_ports[i];
1079 : : int j;
1080 : :
1081 [ # # ]: 0 : if (!p->enq_configured)
1082 : : fprintf(f, "Port_%d is not configured\n", i);
1083 : :
1084 : : fprintf(f, "Port_%d\n", i);
1085 : : fprintf(f, "=======\n");
1086 : :
1087 : 0 : fprintf(f, "\tevport_%u is configured, setup done=%d\n",
1088 : 0 : p->id, p->setup_done);
1089 : :
1090 : : fprintf(f, "\tconfig state=%d, port state=%d\n",
1091 : 0 : p->qm_port.config_state, p->qm_port.state);
1092 : :
1093 : 0 : fprintf(f, "\tport is %s\n",
1094 [ # # ]: 0 : p->qm_port.is_directed ? "directed" : "load balanced");
1095 : :
1096 : 0 : fprintf(f, "\toutstanding releases=%u\n",
1097 : 0 : p->outstanding_releases);
1098 : :
1099 : 0 : fprintf(f, "\tinflight max=%u, inflight credits=%u\n",
1100 : 0 : p->inflight_max, p->inflight_credits);
1101 : :
1102 : 0 : fprintf(f, "\tcredit update quanta=%u, implicit release =%u\n",
1103 : 0 : p->credit_update_quanta, p->implicit_release);
1104 : :
1105 : 0 : fprintf(f, "\tnum_links=%d, queues -> ", p->num_links);
1106 : :
1107 [ # # ]: 0 : for (j = 0; j < DLB2_MAX_NUM_QIDS_PER_LDB_CQ; j++) {
1108 [ # # ]: 0 : if (p->link[j].valid)
1109 : 0 : fprintf(f, "id=%u prio=%u ",
1110 : 0 : p->link[j].queue_id,
1111 : 0 : p->link[j].priority);
1112 : : }
1113 : : fprintf(f, "\n");
1114 : :
1115 : 0 : fprintf(f, "\thardware port id=%u\n", p->qm_port.id);
1116 : :
1117 : 0 : fprintf(f, "\tcached_ldb_credits=%u\n",
1118 : 0 : p->qm_port.cached_ldb_credits);
1119 : :
1120 : 0 : fprintf(f, "\tldb_credits = %u\n",
1121 : 0 : p->qm_port.ldb_credits);
1122 : :
1123 : 0 : fprintf(f, "\tcached_dir_credits = %u\n",
1124 : 0 : p->qm_port.cached_dir_credits);
1125 : :
1126 : 0 : fprintf(f, "\tdir_credits = %u\n",
1127 : 0 : p->qm_port.dir_credits);
1128 : :
1129 : 0 : fprintf(f, "\tcached_credits = %u\n",
1130 : 0 : p->qm_port.cached_credits);
1131 : :
1132 : 0 : fprintf(f, "\tdir_credits = %u\n",
1133 : 0 : p->qm_port.credits);
1134 : :
1135 : 0 : fprintf(f, "\tgenbit=%d, cq_idx=%d, cq_depth=%d\n",
1136 : 0 : p->qm_port.gen_bit,
1137 : 0 : p->qm_port.cq_idx,
1138 : : p->qm_port.cq_depth);
1139 : :
1140 : 0 : fprintf(f, "\tinterrupt armed=%d\n",
1141 : 0 : p->qm_port.int_armed);
1142 : :
1143 : : fprintf(f, "\tPort statistics\n");
1144 : :
1145 : 0 : fprintf(f, "\t\trx_ok %" PRIu64 "\n",
1146 : : p->stats.traffic.rx_ok);
1147 : :
1148 : 0 : fprintf(f, "\t\trx_drop %" PRIu64 "\n",
1149 : : p->stats.traffic.rx_drop);
1150 : :
1151 : 0 : fprintf(f, "\t\trx_interrupt_wait %" PRIu64 "\n",
1152 : : p->stats.traffic.rx_interrupt_wait);
1153 : :
1154 : 0 : fprintf(f, "\t\trx_umonitor_umwait %" PRIu64 "\n",
1155 : : p->stats.traffic.rx_umonitor_umwait);
1156 : :
1157 : 0 : fprintf(f, "\t\ttx_ok %" PRIu64 "\n",
1158 : : p->stats.traffic.tx_ok);
1159 : :
1160 : 0 : fprintf(f, "\t\ttotal_polls %" PRIu64 "\n",
1161 : : p->stats.traffic.total_polls);
1162 : :
1163 : 0 : fprintf(f, "\t\tzero_polls %" PRIu64 "\n",
1164 : : p->stats.traffic.zero_polls);
1165 : :
1166 : 0 : fprintf(f, "\t\ttx_nospc_ldb_hw_credits %" PRIu64 "\n",
1167 : : p->stats.traffic.tx_nospc_ldb_hw_credits);
1168 : :
1169 : 0 : fprintf(f, "\t\ttx_nospc_dir_hw_credits %" PRIu64 "\n",
1170 : : p->stats.traffic.tx_nospc_dir_hw_credits);
1171 : :
1172 : 0 : fprintf(f, "\t\ttx_nospc_hw_credits %" PRIu64 "\n",
1173 : : p->stats.traffic.tx_nospc_hw_credits);
1174 : :
1175 : 0 : fprintf(f, "\t\ttx_nospc_inflight_max %" PRIu64 "\n",
1176 : : p->stats.traffic.tx_nospc_inflight_max);
1177 : :
1178 : 0 : fprintf(f, "\t\ttx_nospc_new_event_limit %" PRIu64 "\n",
1179 : : p->stats.traffic.tx_nospc_new_event_limit);
1180 : :
1181 : 0 : fprintf(f, "\t\ttx_nospc_inflight_credits %" PRIu64 "\n",
1182 : : p->stats.traffic.tx_nospc_inflight_credits);
1183 : :
1184 : 0 : fprintf(f, "\t\ttx_new %" PRIu64 "\n",
1185 : : p->stats.tx_op_cnt[RTE_EVENT_OP_NEW]);
1186 : :
1187 : 0 : fprintf(f, "\t\ttx_fwd %" PRIu64 "\n",
1188 : : p->stats.tx_op_cnt[RTE_EVENT_OP_FORWARD]);
1189 : :
1190 : 0 : fprintf(f, "\t\ttx_rel %" PRIu64 "\n",
1191 : : p->stats.tx_op_cnt[RTE_EVENT_OP_RELEASE]);
1192 : :
1193 : 0 : fprintf(f, "\t\ttx_implicit_rel %" PRIu64 "\n",
1194 : : p->stats.tx_implicit_rel);
1195 : :
1196 : 0 : fprintf(f, "\t\ttx_sched_ordered %" PRIu64 "\n",
1197 : : p->stats.tx_sched_cnt[DLB2_SCHED_ORDERED]);
1198 : :
1199 : 0 : fprintf(f, "\t\ttx_sched_unordered %" PRIu64 "\n",
1200 : : p->stats.tx_sched_cnt[DLB2_SCHED_UNORDERED]);
1201 : :
1202 : 0 : fprintf(f, "\t\ttx_sched_atomic %" PRIu64 "\n",
1203 : : p->stats.tx_sched_cnt[DLB2_SCHED_ATOMIC]);
1204 : :
1205 : 0 : fprintf(f, "\t\ttx_sched_directed %" PRIu64 "\n",
1206 : : p->stats.tx_sched_cnt[DLB2_SCHED_DIRECTED]);
1207 : :
1208 : 0 : fprintf(f, "\t\ttx_invalid %" PRIu64 "\n",
1209 : : p->stats.tx_invalid);
1210 : :
1211 : 0 : fprintf(f, "\t\trx_sched_ordered %" PRIu64 "\n",
1212 : : p->stats.rx_sched_cnt[DLB2_SCHED_ORDERED]);
1213 : :
1214 : 0 : fprintf(f, "\t\trx_sched_unordered %" PRIu64 "\n",
1215 : : p->stats.rx_sched_cnt[DLB2_SCHED_UNORDERED]);
1216 : :
1217 : 0 : fprintf(f, "\t\trx_sched_atomic %" PRIu64 "\n",
1218 : : p->stats.rx_sched_cnt[DLB2_SCHED_ATOMIC]);
1219 : :
1220 : 0 : fprintf(f, "\t\trx_sched_directed %" PRIu64 "\n",
1221 : : p->stats.rx_sched_cnt[DLB2_SCHED_DIRECTED]);
1222 : :
1223 : 0 : fprintf(f, "\t\trx_sched_invalid %" PRIu64 "\n",
1224 : : p->stats.rx_sched_invalid);
1225 : : }
1226 : :
1227 : : /* Queue level information */
1228 : :
1229 [ # # ]: 0 : for (i = 0; i < dlb2->num_queues; i++) {
1230 : 0 : struct dlb2_eventdev_queue *q = &dlb2->ev_queues[i];
1231 : : int j, k;
1232 : :
1233 [ # # ]: 0 : if (!q->setup_done)
1234 : : fprintf(f, "Queue_%d is not configured\n", i);
1235 : :
1236 : : fprintf(f, "Queue_%d\n", i);
1237 : : fprintf(f, "========\n");
1238 : :
1239 : 0 : fprintf(f, "\tevqueue_%u is set up\n", q->id);
1240 : :
1241 : 0 : fprintf(f, "\tqueue is %s\n",
1242 [ # # ]: 0 : q->qm_queue.is_directed ? "directed" : "load balanced");
1243 : :
1244 : 0 : fprintf(f, "\tnum_links=%d, ports -> ", q->num_links);
1245 : :
1246 [ # # ]: 0 : for (j = 0; j < dlb2->num_ports; j++) {
1247 : : struct dlb2_eventdev_port *p = &dlb2->ev_ports[j];
1248 : :
1249 [ # # ]: 0 : for (k = 0; k < DLB2_MAX_NUM_QIDS_PER_LDB_CQ; k++) {
1250 [ # # ]: 0 : if (p->link[k].valid &&
1251 [ # # ]: 0 : p->link[k].queue_id == q->id)
1252 : 0 : fprintf(f, "id=%u prio=%u ",
1253 : 0 : p->id, p->link[k].priority);
1254 : : }
1255 : : }
1256 : : fprintf(f, "\n");
1257 : :
1258 : 0 : fprintf(f, "\tcurrent depth: %u events\n",
1259 : : dlb2_get_queue_depth(dlb2, q));
1260 : :
1261 : 0 : fprintf(f, "\tnum qid inflights=%u, sched_type=%d\n",
1262 : : q->qm_queue.num_qid_inflights, q->qm_queue.sched_type);
1263 : : }
1264 : : }
|