From a34971baa490d6336513a9b9409b6eff6daf7d01 Mon Sep 17 00:00:00 2001 From: Pavan Nikhilesh Date: Fri, 9 Oct 2020 00:18:43 +0530 Subject: [PATCH] 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 --- drivers/event/octeontx2/otx2_evdev.c | 2 +- drivers/event/octeontx2/otx2_evdev.h | 18 +++++++++--------- drivers/event/octeontx2/otx2_worker.h | 27 +++++++++++++-------------- 3 files changed, 23 insertions(+), 24 deletions(-) diff --git a/drivers/event/octeontx2/otx2_evdev.c b/drivers/event/octeontx2/otx2_evdev.c index 461ad57f5d..256b6a55d8 100644 --- a/drivers/event/octeontx2/otx2_evdev.c +++ b/drivers/event/octeontx2/otx2_evdev.c @@ -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; } diff --git a/drivers/event/octeontx2/otx2_evdev.h b/drivers/event/octeontx2/otx2_evdev.h index 4bf715c035..547e29d4a7 100644 --- a/drivers/event/octeontx2/otx2_evdev.h +++ b/drivers/event/octeontx2/otx2_evdev.h @@ -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 */ diff --git a/drivers/event/octeontx2/otx2_worker.h b/drivers/event/octeontx2/otx2_worker.h index 3a3ec0fd4d..771f75efd7 100644 --- a/drivers/event/octeontx2/otx2_worker.h +++ b/drivers/event/octeontx2/otx2_worker.h @@ -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; } -- 2.20.1