Reprogram completion queue base and size registers in
roc_cpt_cq_enable as hardware clears them after fatal error.
Also reset pending queue head and tail during queue pair reset so
software completion state stays aligned with the reset hardware
queue.
Fixes: 13ce9121c3c0 ("common/cnxk: add routines to operate CPT CQ")
Fixes: 4e8a41acaffb ("crypto/cnxk: support CPT CQ for CN20K")
Signed-off-by: Tejasree Kondoj <[email protected]>
---
drivers/common/cnxk/roc_cpt.c | 13 +++++++++++++
drivers/crypto/cnxk/cnxk_cryptodev_ops.c | 6 ++++++
2 files changed, 19 insertions(+)
diff --git a/drivers/common/cnxk/roc_cpt.c b/drivers/common/cnxk/roc_cpt.c
index 8c60a28fff..eae3f134e9 100644
--- a/drivers/common/cnxk/roc_cpt.c
+++ b/drivers/common/cnxk/roc_cpt.c
@@ -1147,7 +1147,20 @@ roc_cpt_eng_grp_add(struct roc_cpt *roc_cpt, enum
cpt_eng_type eng_type)
void
roc_cpt_cq_enable(struct roc_cpt_lf *lf)
{
+ union cpt_lf_cq_base lf_cq_base = {.u = 0x0};
+ union cpt_lf_cq_size lf_cq_size = {.u = 0x0};
union cpt_lf_cq_ctl lf_cq_ctl = {.u = 0x0};
+ uintptr_t addr;
+
+ /* Disable completion queue */
+ roc_cpt_cq_disable(lf);
+
+ /* Reconfigure CQ base and size, same as cpt_lf_cq_init() */
+ addr = (uintptr_t)lf->cq_vaddr;
+ lf_cq_base.s.addr = addr >> 7;
+ plt_write64(lf_cq_base.u, lf->rbase + CPT_LF_CQ_BASE);
+ lf_cq_size.s.size = lf->cq_size;
+ plt_write64(lf_cq_size.u, lf->rbase + CPT_LF_CQ_SIZE);
lf_cq_ctl.s.ena = 1;
lf_cq_ctl.s.dq_ack_ena = lf->dq_ack_ena;
diff --git a/drivers/crypto/cnxk/cnxk_cryptodev_ops.c
b/drivers/crypto/cnxk/cnxk_cryptodev_ops.c
index 1e0ea9d358..95f64a79ae 100644
--- a/drivers/crypto/cnxk/cnxk_cryptodev_ops.c
+++ b/drivers/crypto/cnxk/cnxk_cryptodev_ops.c
@@ -596,6 +596,7 @@ cnxk_cpt_queue_pair_reset(struct rte_cryptodev *dev,
uint16_t qp_id,
{
if (conf == NULL) {
struct cnxk_cpt_vf *vf = dev->data->dev_private;
+ struct cnxk_cpt_qp *qp;
struct roc_cpt_lf *lf;
if (vf == NULL)
@@ -603,6 +604,11 @@ cnxk_cpt_queue_pair_reset(struct rte_cryptodev *dev,
uint16_t qp_id,
lf = vf->cpt.lf[qp_id];
roc_cpt_lf_reset(lf);
+
+ qp = dev->data->queue_pairs[qp_id];
+ qp->pend_q.head = 0;
+ qp->pend_q.tail = 0;
+
roc_cpt_iq_enable(lf);
if (lf->cpt_cq_ena)
--
2.43.0