1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright(C) 2019 Marvell International Ltd.
5 #ifndef __OTX2_WORKER_DUAL_H__
6 #define __OTX2_WORKER_DUAL_H__
8 #include <rte_branch_prediction.h>
9 #include <rte_common.h>
11 #include <otx2_common.h>
12 #include "otx2_evdev.h"
15 static __rte_always_inline uint16_t
16 otx2_ssogws_dual_get_work(struct otx2_ssogws_state *ws,
17 struct otx2_ssogws_state *ws_pair,
20 const uint64_t set_gw = BIT_ULL(16) | 1;
21 union otx2_sso_event event;
26 " ldr %[tag], [%[tag_loc]] \n"
27 " ldr %[wqp], [%[wqp_loc]] \n"
28 " tbz %[tag], 63, done%= \n"
31 " ldr %[tag], [%[tag_loc]] \n"
32 " ldr %[wqp], [%[wqp_loc]] \n"
33 " tbnz %[tag], 63, rty%= \n"
34 "done%=: str %[gw], [%[pong]] \n"
36 " prfm pldl1keep, [%[wqp]] \n"
37 : [tag] "=&r" (event.get_work0),
38 [wqp] "=&r" (get_work1)
39 : [tag_loc] "r" (ws->tag_op),
40 [wqp_loc] "r" (ws->wqp_op),
42 [pong] "r" (ws_pair->getwrk_op)
45 event.get_work0 = otx2_read64(ws->tag_op);
46 while ((BIT_ULL(63)) & event.get_work0)
47 event.get_work0 = otx2_read64(ws->tag_op);
48 get_work1 = otx2_read64(ws->wqp_op);
49 otx2_write64(set_gw, ws_pair->getwrk_op);
51 rte_prefetch0((const void *)get_work1);
53 event.get_work0 = (event.get_work0 & (0x3ull << 32)) << 6 |
54 (event.get_work0 & (0x3FFull << 36)) << 4 |
55 (event.get_work0 & 0xffffffff);
56 ws->cur_tt = event.sched_type;
57 ws->cur_grp = event.queue_id;
59 ev->event = event.get_work0;
65 static __rte_always_inline void
66 otx2_ssogws_dual_add_work(struct otx2_ssogws_dual *ws, const uint64_t event_ptr,
67 const uint32_t tag, const uint8_t new_tt,
72 add_work0 = tag | ((uint64_t)(new_tt) << 32);
73 otx2_store_pair(add_work0, event_ptr, ws->grps_base[grp]);