Reading a CPT_LF_CTX_ERR csr will ensure writes for
FLUSH are complete and also tell whether flush is
complete or not.

Signed-off-by: Nithin Dabilpuram <ndabilpu...@marvell.com>
---
 drivers/common/cnxk/roc_nix_inl.c | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/drivers/common/cnxk/roc_nix_inl.c 
b/drivers/common/cnxk/roc_nix_inl.c
index a984ac56d9..d0328921a7 100644
--- a/drivers/common/cnxk/roc_nix_inl.c
+++ b/drivers/common/cnxk/roc_nix_inl.c
@@ -1748,6 +1748,7 @@ roc_nix_inl_ctx_write(struct roc_nix *roc_nix, void 
*sa_dptr, void *sa_cptr,
        struct nix_inl_dev *inl_dev = NULL;
        struct roc_cpt_lf *outb_lf = NULL;
        union cpt_lf_ctx_flush flush;
+       union cpt_lf_ctx_err err;
        bool get_inl_lf = true;
        uintptr_t rbase;
        struct nix *nix;
@@ -1789,6 +1790,13 @@ roc_nix_inl_ctx_write(struct roc_nix *roc_nix, void 
*sa_dptr, void *sa_cptr,
                flush.s.cptr = ((uintptr_t)sa_cptr) >> 7;
                plt_write64(flush.u, rbase + CPT_LF_CTX_FLUSH);
 
+               plt_atomic_thread_fence(__ATOMIC_ACQ_REL);
+
+               /* Read a CSR to ensure that the FLUSH operation is complete */
+               err.u = plt_read64(rbase + CPT_LF_CTX_ERR);
+
+               if (err.s.flush_st_flt)
+                       plt_warn("CTX flush could not complete");
                return 0;
        }
        plt_nix_dbg("Could not get CPT LF for CTX write");
-- 
2.34.1

Reply via email to