| 203 | } |
| 204 | |
| 205 | void |
| 206 | ssows_flush_events(struct ssows *ws, uint8_t queue_id, |
| 207 | ssows_handle_event_t fn, void *arg) |
| 208 | { |
| 209 | uint32_t reg_off; |
| 210 | struct rte_event ev; |
| 211 | uint64_t enable, aq_cnt = 1, cq_ds_cnt = 1; |
| 212 | uint64_t get_work0, get_work1; |
| 213 | uint64_t sched_type_queue; |
| 214 | uint8_t *base = ssovf_bar(OCTEONTX_SSO_GROUP, queue_id, 0); |
| 215 | |
| 216 | enable = ssovf_read64(base + SSO_VHGRP_QCTL); |
| 217 | if (!enable) |
| 218 | return; |
| 219 | |
| 220 | reg_off = SSOW_VHWS_OP_GET_WORK0; |
| 221 | reg_off |= 1 << 17; /* Grouped */ |
| 222 | reg_off |= 1 << 16; /* WAIT */ |
| 223 | reg_off |= queue_id << 4; /* INDEX_GGRP_MASK(group number) */ |
| 224 | while (aq_cnt || cq_ds_cnt) { |
| 225 | aq_cnt = ssovf_read64(base + SSO_VHGRP_AQ_CNT); |
| 226 | cq_ds_cnt = ssovf_read64(base + SSO_VHGRP_INT_CNT); |
| 227 | /* Extract cq and ds count */ |
| 228 | cq_ds_cnt &= 0x1FFF1FFF0000; |
| 229 | |
| 230 | ssovf_load_pair(get_work0, get_work1, ws->base + reg_off); |
| 231 | |
| 232 | sched_type_queue = (get_work0 >> 32) & 0xfff; |
| 233 | ws->cur_tt = sched_type_queue & 0x3; |
| 234 | ws->cur_grp = sched_type_queue >> 2; |
| 235 | sched_type_queue = sched_type_queue << 38; |
| 236 | ev.event = sched_type_queue | (get_work0 & 0xffffffff); |
| 237 | if (get_work1 && ev.event_type == RTE_EVENT_TYPE_ETHDEV) |
| 238 | ev.mbuf = ssovf_octeontx_wqe_to_pkt(get_work1, |
| 239 | (ev.event >> 20) & 0x7F, |
| 240 | OCCTX_RX_OFFLOAD_NONE | |
| 241 | OCCTX_RX_MULTI_SEG_F, |
| 242 | ws->lookup_mem); |
| 243 | else |
| 244 | ev.u64 = get_work1; |
| 245 | |
| 246 | if (fn != NULL && ev.u64 != 0) |
| 247 | fn(arg, ev); |
| 248 | } |
| 249 | } |
| 250 | |
| 251 | void |
| 252 | ssows_reset(struct ssows *ws) |
no test coverage detected