event/octeontx2: add switch tag flush operation

Add SWTAG flush operation at the end of transmit sequence to
immediately release the tag held by the core.
Reuse Tag address to check SWTAG completion status.

Signed-off-by: Pavan Nikhilesh <pbhagavatula@marvell.com>
This commit is contained in:
Pavan Nikhilesh 2020-10-09 00:18:43 +05:30 committed by Jerin Jacob
parent 55bc2eadae
commit a34971baa4
3 changed files with 23 additions and 24 deletions

View File

@ -771,7 +771,7 @@ sso_set_port_ops(struct otx2_ssogws *ws, uintptr_t base)
ws->tag_op = base + SSOW_LF_GWS_TAG;
ws->wqp_op = base + SSOW_LF_GWS_WQP;
ws->getwrk_op = base + SSOW_LF_GWS_OP_GET_WORK;
ws->swtp_op = base + SSOW_LF_GWS_SWTP;
ws->swtag_flush_op = base + SSOW_LF_GWS_OP_SWTAG_FLUSH;
ws->swtag_norm_op = base + SSOW_LF_GWS_OP_SWTAG_NORM;
ws->swtag_desched_op = base + SSOW_LF_GWS_OP_SWTAG_DESCHED;
}

View File

@ -162,15 +162,15 @@ struct otx2_sso_evdev {
struct otx2_timesync_info *tstamp;
} __rte_cache_aligned;
#define OTX2_SSOGWS_OPS \
/* WS ops */ \
uintptr_t getwrk_op; \
uintptr_t tag_op; \
uintptr_t wqp_op; \
uintptr_t swtp_op; \
uintptr_t swtag_norm_op; \
uintptr_t swtag_desched_op; \
uint8_t cur_tt; \
#define OTX2_SSOGWS_OPS \
/* WS ops */ \
uintptr_t getwrk_op; \
uintptr_t tag_op; \
uintptr_t wqp_op; \
uintptr_t swtag_flush_op; \
uintptr_t swtag_norm_op; \
uintptr_t swtag_desched_op; \
uint8_t cur_tt; \
uint8_t cur_grp
/* Event port aka GWS */

View File

@ -198,8 +198,7 @@ otx2_ssogws_swtag_untag(struct otx2_ssogws *ws)
static __rte_always_inline void
otx2_ssogws_swtag_flush(struct otx2_ssogws *ws)
{
otx2_write64(0, OTX2_SSOW_GET_BASE_ADDR(ws->getwrk_op) +
SSOW_LF_GWS_OP_SWTAG_FLUSH);
otx2_write64(0, ws->swtag_flush_op);
ws->cur_tt = SSO_SYNC_EMPTY;
}
@ -216,20 +215,18 @@ otx2_ssogws_swtag_wait(struct otx2_ssogws *ws)
#ifdef RTE_ARCH_ARM64
uint64_t swtp;
asm volatile (
" ldr %[swtb], [%[swtp_loc]] \n"
" cbz %[swtb], done%= \n"
" sevl \n"
"rty%=: wfe \n"
" ldr %[swtb], [%[swtp_loc]] \n"
" cbnz %[swtb], rty%= \n"
"done%=: \n"
: [swtb] "=&r" (swtp)
: [swtp_loc] "r" (ws->swtp_op)
);
asm volatile(" ldr %[swtb], [%[swtp_loc]] \n"
" tbz %[swtb], 62, done%= \n"
" sevl \n"
"rty%=: wfe \n"
" ldr %[swtb], [%[swtp_loc]] \n"
" tbnz %[swtb], 62, rty%= \n"
"done%=: \n"
: [swtb] "=&r" (swtp)
: [swtp_loc] "r" (ws->tag_op));
#else
/* Wait for the SWTAG/SWTAG_FULL operation */
while (otx2_read64(ws->swtp_op))
while (otx2_read64(ws->tag_op) & BIT_ULL(62))
;
#endif
}
@ -317,6 +314,8 @@ otx2_ssogws_event_tx(struct otx2_ssogws *ws, struct rte_event ev[],
otx2_nix_xmit_one(cmd, txq->lmt_addr, txq->io_addr, flags);
}
otx2_write64(0, ws->swtag_flush_op);
return 1;
}