74 "queue_elem ptr NULL!");
75 return ODP_QUEUE_INVALID;
83 const queue_elem_t *queue_elem = odp_queue_context(queue);
87 unlikely(!queue_elem || queue_elem->
valid_check != QUEUE_ELEM_VALID))
90 if (
EM_CHECK_LEVEL >= 2 && unlikely(!queue_allocated(queue_elem))) {
92 "EM Queue deleted (or not created)! ODP-queue:%" PRIu64
"",
93 odp_queue_to_u64(queue));
97 return (em_queue_t)(uintptr_t)queue_elem->
queue;
108static em_queue_t pktin_event_queue2em(odp_queue_t odp_queue)
111 const char *err_str =
"";
112 odp_queue_info_t odp_qinfo;
115 if (unlikely(odp_queue == ODP_QUEUE_INVALID)) {
117 "Bad arg: ODP queue invalid!");
127 ret = odp_queue_info(odp_queue, &odp_qinfo);
128 if (unlikely(ret || odp_qinfo.param.type != ODP_QUEUE_TYPE_SCHED)) {
129 err_str =
"odp_queue_info(): unsuitable odp queue";
136 odp_schedule_prio_t odp_prio = odp_schedule_default_prio();
140 for (
int i = 0; i < num_prio; i++) {
141 int err = prio_em2odp(i, &odp_prio);
143 if (!err && odp_prio == odp_qinfo.param.sched.prio) {
149 err_str =
"Can't convert ODP qprio to EM qprio";
158 ret = scheduled_queue_type_odp2em(odp_qinfo.param.sched.sync,
161 err_str =
"Can't convert ODP qtype to EM qtype";
168 em_queue_group_t queue_group;
173 qgrp_elem = queue_group_elem_get(queue_group);
180 err_str =
"No matching EM Queue Group found";
187 char q_name[ODP_QUEUE_NAME_LEN];
189 snprintf(q_name,
sizeof(q_name),
"EM:%s", odp_qinfo.name);
190 q_name[ODP_QUEUE_NAME_LEN - 1] =
'\0';
198 param.
type = queue_type;
208 if (unlikely(!q_elem)) {
209 err_str =
"Queue elem NULL!";
214 queue_setup_common(q_name, ¶m, q_elem );
232 ret = odp_queue_context_set(odp_queue, q_elem,
sizeof(*q_elem));
234 err_str =
"odp_queue_context_set() failed";
242 "%s (ret=%d)", err_str, ret);
244 odp_queue_print(odp_queue);
251 em_queue_t queues[],
int num)
255 for (i = 0; i < num; i++) {
256 queues[i] = pktin_event_queue2em(odp_pktin_event_queues[i]);
259 "Cannot create EM-Q using pktin-queue:%d (hdl:%" PRIu64
")",
260 i, odp_queue_to_u64(odp_pktin_event_queues[i]));
275 return event_em2odp(event);
279 odp_event_t odp_events[],
int num)
281 if (unlikely(num <= 0))
284 events_em2odp(events, odp_events, num);
289 em_event_t
event = event_init_odp(odp_event,
false,
296 em_event_t events[],
int num)
298 if (unlikely(num <= 0))
303 event_init_odp_multi(odp_events, events, ev_hdrs, num,
312 unlikely(!pool_elem || !odp_pools || num <= 0)) {
314 "Inv.args: pool:%" PRI_POOL " odp_pools:%p num:%d",
315 pool, odp_pools, num);
320 "Pool:%" PRI_POOL " not created", pool);
322 const int num_subpools = MIN(num, pool_elem->
num_subpools);
325 memcpy(odp_pools, pool_elem->
odp_pool, num_subpools *
sizeof(odp_pool_t));
333 if (
EM_CHECK_LEVEL > 0 && unlikely(odp_pool == ODP_POOL_INVALID)) {
335 "Inv.arg: odp_pool invalid");
339 return pool_odp2em(odp_pool);
343pkt_enqueue_scheduled(
const odp_packet_t pkt_tbl[],
int num,
346 odp_event_t odp_event_tbl[num];
348 odp_packet_to_event_multi(pkt_tbl, odp_event_tbl, num);
354 int sent = odp_queue_enq_multi(q_elem->
odp_queue,
356 if (unlikely(sent < num)) {
357 sent = unlikely(sent < 0) ? 0 : sent;
358 odp_packet_free_multi(&pkt_tbl[sent], num - sent);
369pkt_enqueue_local(
const odp_packet_t pkt_tbl[],
int num,
372 odp_event_t odp_event_tbl[num];
373 em_event_t event_tbl[num];
375 odp_packet_to_event_multi(pkt_tbl, odp_event_tbl, num);
377 events_odp2em(odp_event_tbl, event_tbl, num);
383 int sent = send_local_multi(event_tbl, num, q_elem);
385 if (unlikely(sent < num)) {
386 sent = unlikely(sent < 0) ? 0 : sent;
387 odp_packet_free_multi(&pkt_tbl[sent], num - sent);
398pkt_enqueue_chaining_out(
const odp_packet_t pkt_tbl[],
int num,
401 odp_event_t odp_event_tbl[num];
402 em_event_t event_tbl[num];
406 odp_packet_to_event_multi(pkt_tbl, odp_event_tbl, num);
408 events_odp2em(odp_event_tbl, event_tbl, num);
411 event_init_pkt_multi(pkt_tbl, event_tbl,
412 evhdr_tbl, num,
true );
415 if (likely(queue_external(queue)))
416 sent = send_chaining_multi(event_tbl, num, queue);
418 if (unlikely(sent < num)) {
419 sent = unlikely(sent < 0) ? 0 : sent;
427pkt_enqueue_unscheduled(
const odp_packet_t pkt_tbl[],
int num,
430 odp_event_t odp_event_tbl[num];
431 em_event_t event_tbl[num];
434 odp_packet_to_event_multi(pkt_tbl, odp_event_tbl, num);
436 events_odp2em(odp_event_tbl, event_tbl, num);
439 event_init_pkt_multi(pkt_tbl, event_tbl,
440 evhdr_tbl, num,
true );
443 int sent = odp_queue_enq_multi(q_elem->
odp_queue, odp_event_tbl, num);
445 if (unlikely(sent < num)) {
446 sent = unlikely(sent < 0) ? 0 : sent;
454pkt_enqueue_output(
const odp_packet_t pkt_tbl[],
int num,
457 odp_event_t odp_event_tbl[num];
458 em_event_t event_tbl[num];
461 odp_packet_to_event_multi(pkt_tbl, odp_event_tbl, num);
463 events_odp2em(odp_event_tbl, event_tbl, num);
466 event_init_pkt_multi(pkt_tbl, event_tbl,
467 evhdr_tbl, num,
true );
470 int sent = send_output_multi(event_tbl, num, q_elem);
472 if (unlikely(sent < num)) {
473 sent = unlikely(sent < 0) ? 0 : sent;
482 if (unlikely(!pkt_tbl || num <= 0))
489 return pkt_enqueue_chaining_out(pkt_tbl, num, queue);
492 return pkt_enqueue_scheduled(pkt_tbl, num, q_elem);
495 return pkt_enqueue_local(pkt_tbl, num, q_elem);
498 return pkt_enqueue_unscheduled(pkt_tbl, num, q_elem);
501 return pkt_enqueue_output(pkt_tbl, num, q_elem);
504 odp_packet_free_multi(pkt_tbl, num);
518 "Invalid queue group:%" PRI_QGRP "", queue_group);
519 return ODP_SCHED_GROUP_INVALID;
521 if (unlikely(
EM_CHECK_LEVEL >= 2 && !queue_group_allocated(qgrp_elem))) {
523 "Queue group:%" PRI_QGRP " not created", queue_group);
524 return ODP_SCHED_GROUP_INVALID;
532 unsigned int i = ((
unsigned int)((uintptr_t)(tmr) - 1));
535 return ODP_TIMER_POOL_INVALID;
539 return tmrs->timer[i].odp_tmr_pool;
545 return ODP_TIMER_INVALID;
547 return tmo->odp_timer;
#define INTERNAL_ERROR(error, escope, fmt,...)
struct event_hdr event_hdr_t
#define EM_DEBUG_PRINT_BASE
#define EM_QUEUE_GROUP_UNDEF
#define EM_ESCOPE_ODP_EXT
@ EM_ERR_OPERATION_FAILED
void em_free_multi(em_event_t events[], int num)
int em_odp_pkt_enqueue(const odp_packet_t pkt_tbl[], int num, em_queue_t queue)
odp_schedule_group_t em_odp_qgrp2odp(em_queue_group_t queue_group)
Get the ODP schedule group that corresponds to the given EM queue group.
int em_odp_pool2odp(em_pool_t pool, odp_pool_t odp_pools[], int num)
Get the ODP pools used as subpools in a given EM event pool.
em_pool_t em_odp_pool2em(odp_pool_t odp_pool)
Get the EM event pool that the given ODP pool belongs to.
odp_event_t em_odp_event2odp(em_event_t event)
odp_timer_t em_odp_tmo2odp(em_tmo_t tmo)
Get the odp timer from EM timeout handle.
int em_odp_pktin_event_queues2em(const odp_queue_t odp_pktin_event_queues[], em_queue_t queues[], int num)
Map the given scheduled ODP pktin event queues to new EM queues.
em_queue_t em_odp_queue_em(odp_queue_t queue)
void em_odp_events2em(const odp_event_t odp_events[], em_event_t events[], int num)
odp_timer_pool_t em_odp_timer2odp(em_timer_t tmr)
Get the odp timer_pool from EM timer handle.
uint32_t em_odp_event_hdr_size(void)
void em_odp_events2odp(const em_event_t events[], odp_event_t odp_events[], int num)
odp_queue_t em_odp_queue_odp(em_queue_t queue)
em_event_t em_odp_event2em(odp_event_t odp_event)
em_queue_group_t em_queue_group_first(unsigned int *num)
em_queue_group_t em_queue_group_next(void)
#define EM_QUEUE_PRIO_UNDEF
void em_queue_param_init(em_queue_param_t *param)
int em_queue_num_prio(int *num_runtime)
@ EM_QUEUE_TYPE_UNSCHEDULED
em_queue_group_t queue_group
odp_pool_t odp_pool[EM_MAX_SUBPOOLS]
odp_schedule_group_t odp_sched_group