diff --git a/providers/bnxt_re/bnxt_re-abi.h b/providers/bnxt_re/bnxt_re-abi.h index b9166cb2e..6382dcb74 100644 --- a/providers/bnxt_re/bnxt_re-abi.h +++ b/providers/bnxt_re/bnxt_re-abi.h @@ -145,7 +145,7 @@ enum bnxt_re_db_que_type { }; enum bnxt_re_db_mask { - BNXT_RE_DB_INDX_MASK = 0xFFFFFUL, + BNXT_RE_DB_INDX_MASK = 0xFFFFFFUL, BNXT_RE_DB_PILO_MASK = 0x0FFUL, BNXT_RE_DB_PILO_SHIFT = 0x18, BNXT_RE_DB_QID_MASK = 0xFFFFFUL, @@ -154,7 +154,8 @@ enum bnxt_re_db_mask { BNXT_RE_DB_TYP_MASK = 0x0FUL, BNXT_RE_DB_TYP_SHIFT = 0x1C, BNXT_RE_DB_VALID_SHIFT = 0x1A, - BNXT_RE_DB_EPOCH_SHIFT = 0x18 + BNXT_RE_DB_EPOCH_SHIFT = 0x18, + BNXT_RE_DB_TOGGLE_SHIFT = 0x19, }; enum bnxt_re_psns_mask { @@ -170,6 +171,8 @@ enum bnxt_re_bcqe_mask { BNXT_RE_BCQE_PH_MASK = 0x01, BNXT_RE_BCQE_TYPE_MASK = 0x0F, BNXT_RE_BCQE_TYPE_SHIFT = 0x01, + BNXT_RE_BCQE_RESIZE_TOG_MASK = 0x03, + BNXT_RE_BCQE_RESIZE_TOG_SHIFT = 0x05, BNXT_RE_BCQE_STATUS_MASK = 0xFF, BNXT_RE_BCQE_STATUS_SHIFT = 0x08, BNXT_RE_BCQE_FLAGS_MASK = 0xFFFFU, @@ -215,6 +218,18 @@ enum { BNXT_RE_COMP_MASK_UCNTX_POW2_DISABLED = 0x04, }; +enum bnxt_re_que_flags_mask { + BNXT_RE_FLAG_EPOCH_TAIL_SHIFT = 0x0UL, + BNXT_RE_FLAG_EPOCH_HEAD_SHIFT = 0x1UL, + BNXT_RE_FLAG_EPOCH_TAIL_MASK = 0x1UL, + BNXT_RE_FLAG_EPOCH_HEAD_MASK = 0x2UL, +}; + +enum bnxt_re_db_epoch_flag_shift { + BNXT_RE_DB_EPOCH_TAIL_SHIFT = BNXT_RE_DB_EPOCH_SHIFT, + BNXT_RE_DB_EPOCH_HEAD_SHIFT = (BNXT_RE_DB_EPOCH_SHIFT - 1) +}; + enum bnxt_re_modes { BNXT_RE_WQE_MODE_STATIC = 0x00, BNXT_RE_WQE_MODE_VARIABLE = 0x01 diff --git a/providers/bnxt_re/db.c b/providers/bnxt_re/db.c index 17ec435cf..566697b11 100644 --- a/providers/bnxt_re/db.c +++ b/providers/bnxt_re/db.c @@ -106,43 +106,52 @@ static void bnxt_re_ring_db(struct bnxt_re_dpi *dpi, } static void bnxt_re_init_db_hdr(struct bnxt_re_db_hdr *hdr, uint32_t indx, - uint32_t qid, uint32_t typ) + uint32_t qid, uint32_t toggle, uint32_t typ) { - hdr->indx = htole32(indx & BNXT_RE_DB_INDX_MASK); + hdr->indx = htole32(indx | toggle << BNXT_RE_DB_TOGGLE_SHIFT); hdr->typ_qid = htole32(qid & BNXT_RE_DB_QID_MASK); hdr->typ_qid |= htole32(((typ & BNXT_RE_DB_TYP_MASK) << - BNXT_RE_DB_TYP_SHIFT)); + BNXT_RE_DB_TYP_SHIFT) | (0x1UL << BNXT_RE_DB_VALID_SHIFT)); } void bnxt_re_ring_rq_db(struct bnxt_re_qp *qp) { struct bnxt_re_db_hdr hdr; + uint32_t epoch; uint32_t tail; bnxt_re_do_pacing(qp->cntx, &qp->rand); tail = *qp->jrqq->hwque->dbtail; - bnxt_re_init_db_hdr(&hdr, tail, qp->qpid, BNXT_RE_QUE_TYPE_RQ); + epoch = (qp->jrqq->hwque->flags & BNXT_RE_FLAG_EPOCH_TAIL_MASK) << + BNXT_RE_DB_EPOCH_TAIL_SHIFT; + bnxt_re_init_db_hdr(&hdr, tail | epoch, + qp->qpid, 0, BNXT_RE_QUE_TYPE_RQ); bnxt_re_ring_db(qp->udpi, &hdr); } void bnxt_re_ring_sq_db(struct bnxt_re_qp *qp) { struct bnxt_re_db_hdr hdr; + uint32_t epoch; uint32_t tail; bnxt_re_do_pacing(qp->cntx, &qp->rand); tail = *qp->jsqq->hwque->dbtail; - bnxt_re_init_db_hdr(&hdr, tail, qp->qpid, BNXT_RE_QUE_TYPE_SQ); + epoch = (qp->jsqq->hwque->flags & BNXT_RE_FLAG_EPOCH_TAIL_MASK) << + BNXT_RE_DB_EPOCH_TAIL_SHIFT; + bnxt_re_init_db_hdr(&hdr, tail | epoch, qp->qpid, 0, BNXT_RE_QUE_TYPE_SQ); bnxt_re_ring_db(qp->udpi, &hdr); } void bnxt_re_ring_srq_db(struct bnxt_re_srq *srq) { struct bnxt_re_db_hdr hdr; + uint32_t epoch; bnxt_re_do_pacing(srq->cntx, &srq->rand); - bnxt_re_init_db_hdr(&hdr, srq->srqq->tail, srq->srqid, - BNXT_RE_QUE_TYPE_SRQ); + epoch = (srq->srqq->flags & BNXT_RE_FLAG_EPOCH_TAIL_MASK) << + BNXT_RE_DB_EPOCH_TAIL_SHIFT; + bnxt_re_init_db_hdr(&hdr, srq->srqq->tail | epoch, srq->srqid, 0, BNXT_RE_QUE_TYPE_SRQ); bnxt_re_ring_db(srq->udpi, &hdr); } @@ -151,7 +160,7 @@ void bnxt_re_ring_srq_arm(struct bnxt_re_srq *srq) struct bnxt_re_db_hdr hdr; bnxt_re_do_pacing(srq->cntx, &srq->rand); - bnxt_re_init_db_hdr(&hdr, srq->cap.srq_limit, srq->srqid, + bnxt_re_init_db_hdr(&hdr, srq->cap.srq_limit, srq->srqid, 0, BNXT_RE_QUE_TYPE_SRQ_ARM); bnxt_re_ring_db(srq->udpi, &hdr); } @@ -159,18 +168,22 @@ void bnxt_re_ring_srq_arm(struct bnxt_re_srq *srq) void bnxt_re_ring_cq_db(struct bnxt_re_cq *cq) { struct bnxt_re_db_hdr hdr; + uint32_t epoch; bnxt_re_do_pacing(cq->cntx, &cq->rand); - bnxt_re_init_db_hdr(&hdr, cq->cqq.head, cq->cqid, BNXT_RE_QUE_TYPE_CQ); + epoch = (cq->cqq.flags & BNXT_RE_FLAG_EPOCH_HEAD_MASK) << BNXT_RE_DB_EPOCH_HEAD_SHIFT; + bnxt_re_init_db_hdr(&hdr, cq->cqq.head | epoch, cq->cqid, 0, BNXT_RE_QUE_TYPE_CQ); bnxt_re_ring_db(cq->udpi, &hdr); } void bnxt_re_ring_cq_arm_db(struct bnxt_re_cq *cq, uint8_t aflag) { struct bnxt_re_db_hdr hdr; + uint32_t epoch; bnxt_re_do_pacing(cq->cntx, &cq->rand); - bnxt_re_init_db_hdr(&hdr, cq->cqq.head, cq->cqid, aflag); + epoch = (cq->cqq.flags & BNXT_RE_FLAG_EPOCH_HEAD_MASK) << BNXT_RE_DB_EPOCH_HEAD_SHIFT; + bnxt_re_init_db_hdr(&hdr, cq->cqq.head | epoch, cq->cqid, 0, aflag); bnxt_re_ring_db(cq->udpi, &hdr); } diff --git a/providers/bnxt_re/memory.h b/providers/bnxt_re/memory.h index ee13b798b..329e14a8e 100644 --- a/providers/bnxt_re/memory.h +++ b/providers/bnxt_re/memory.h @@ -44,6 +44,7 @@ struct bnxt_re_queue { void *va; + uint32_t flags; uint32_t *dbtail; uint32_t bytes; /* for munmap */ uint32_t depth; /* no. of entries */ @@ -101,15 +102,21 @@ static inline uint32_t bnxt_re_is_que_empty(struct bnxt_re_queue *que) static inline void bnxt_re_incr_tail(struct bnxt_re_queue *que, uint8_t cnt) { que->tail += cnt; - if (que->tail >= que->depth) + if (que->tail >= que->depth) { que->tail %= que->depth; + /* Rolled over, Toggle Tail bit in epoch flags */ + que->flags ^= 1UL << BNXT_RE_FLAG_EPOCH_TAIL_SHIFT; + } } static inline void bnxt_re_incr_head(struct bnxt_re_queue *que, uint8_t cnt) { que->head += cnt; - if (que->head >= que->depth) + if (que->head >= que->depth) { que->head %= que->depth; + /* Rolled over, Toggle HEAD bit in epoch flags */ + que->flags ^= 1UL << BNXT_RE_FLAG_EPOCH_HEAD_SHIFT; + } } #endif