| 4103 | } |
| 4104 | |
| 4105 | static inline int16_t |
| 4106 | dlb2_hw_dequeue(struct dlb2_eventdev *dlb2, |
| 4107 | struct dlb2_eventdev_port *ev_port, |
| 4108 | struct rte_event *events, |
| 4109 | uint16_t max_num, |
| 4110 | uint64_t dequeue_timeout_ticks) |
| 4111 | { |
| 4112 | uint64_t timeout; |
| 4113 | uint64_t start_ticks = 0ULL; |
| 4114 | struct dlb2_port *qm_port; |
| 4115 | int num = 0; |
| 4116 | |
| 4117 | qm_port = &ev_port->qm_port; |
| 4118 | |
| 4119 | /* We have a special implementation for waiting. Wait can be: |
| 4120 | * 1) no waiting at all |
| 4121 | * 2) busy poll only |
| 4122 | * 3) wait for interrupt. If wakeup and poll time |
| 4123 | * has expired, then return to caller |
| 4124 | * 4) umonitor/umwait repeatedly up to poll time |
| 4125 | */ |
| 4126 | |
| 4127 | /* If configured for per dequeue wait, then use wait value provided |
| 4128 | * to this API. Otherwise we must use the global |
| 4129 | * value from eventdev config time. |
| 4130 | */ |
| 4131 | if (!dlb2->global_dequeue_wait) |
| 4132 | timeout = dequeue_timeout_ticks; |
| 4133 | else |
| 4134 | timeout = dlb2->global_dequeue_wait_ticks; |
| 4135 | |
| 4136 | start_ticks = rte_get_timer_cycles(); |
| 4137 | |
| 4138 | while (num < max_num) { |
| 4139 | struct dlb2_dequeue_qe qes[DLB2_NUM_QES_PER_CACHE_LINE]; |
| 4140 | uint8_t offset; |
| 4141 | int num_avail; |
| 4142 | |
| 4143 | /* Copy up to 4 QEs from the current cache line into qes */ |
| 4144 | num_avail = dlb2_recv_qe(qm_port, qes, &offset); |
| 4145 | |
| 4146 | /* But don't process more than the user requested */ |
| 4147 | num_avail = RTE_MIN(num_avail, max_num - num); |
| 4148 | |
| 4149 | dlb2_inc_cq_idx(qm_port, num_avail); |
| 4150 | |
| 4151 | if (num_avail == DLB2_NUM_QES_PER_CACHE_LINE) |
| 4152 | num += dlb2_process_dequeue_four_qes(ev_port, |
| 4153 | qm_port, |
| 4154 | &events[num], |
| 4155 | &qes[offset]); |
| 4156 | else if (num_avail) |
| 4157 | num += dlb2_process_dequeue_qes(ev_port, |
| 4158 | qm_port, |
| 4159 | &events[num], |
| 4160 | &qes[offset], |
| 4161 | num_avail); |
| 4162 | else if ((timeout == 0) || (num > 0)) |
no test coverage detected