From: Jun Yang <[email protected]> Add burst orp queue create parameter and burst enqueue API.
Signed-off-by: Jun Yang <[email protected]> --- drivers/bus/dpaa/base/qbman/qman.c | 73 +++++++++++++++++++++++++++++ drivers/bus/dpaa/include/fsl_qman.h | 28 +++++++++++ 2 files changed, 101 insertions(+) diff --git a/drivers/bus/dpaa/base/qbman/qman.c b/drivers/bus/dpaa/base/qbman/qman.c index bb936f8f9b..092dbc9fd7 100644 --- a/drivers/bus/dpaa/base/qbman/qman.c +++ b/drivers/bus/dpaa/base/qbman/qman.c @@ -2401,6 +2401,76 @@ int qman_enqueue_multi(struct qman_fq *fq, return sent; } +RTE_EXPORT_INTERNAL_SYMBOL(qman_enqueue_multi_orp) +int +qman_enqueue_multi_orp(struct qman_fq *fq, + const struct qm_fd *fd, struct qman_fq *orp, + uint32_t *flags, uint16_t *orp_seqnum, + int frames_to_send) +{ + struct qman_portal *p = get_affine_portal(); + struct qm_portal *portal = &p->p; + + register struct qm_eqcr *eqcr = &portal->eqcr; + struct qm_eqcr_entry *eq = eqcr->cursor; + + uint8_t i = 0, diff, old_ci, sent = 0; + uint8_t eq_verbs; + + if (unlikely(!orp || !orp_seqnum || fq->force_ooo)) + return qman_enqueue_multi(fq, fd, flags, frames_to_send); + + if (!eqcr->available) { + old_ci = eqcr->ci; + eqcr->ci = qm_cl_in(EQCR_CI) & (QM_EQCR_SIZE - 1); + diff = qm_cyc_diff(QM_EQCR_SIZE, old_ci, eqcr->ci); + eqcr->available += diff; + if (!diff) + return 0; + } + + /* try to send as many frames as possible */ + while (eqcr->available && frames_to_send--) { + eq->fqid = fq->fqid_be; + eq->fd.opaque_addr = fd->opaque_addr; + eq->fd.addr = cpu_to_be40(fd->addr); + eq->fd.status = cpu_to_be32(fd->status); + eq->fd.opaque = cpu_to_be32(fd->opaque); + + eq->orp = orp->fqid; + if (flags && flags[i] & QMAN_ENQUEUE_FLAG_NLIS) { + orp_seqnum[i] |= QM_EQCR_SEQNUM_NLIS; + } else if (flags) { + orp_seqnum[i] &= ~QM_EQCR_SEQNUM_NLIS; + if (flags[i] & QMAN_ENQUEUE_FLAG_NESN) + orp_seqnum[i] |= QM_EQCR_SEQNUM_NESN; + else + orp_seqnum[i] &= ~QM_EQCR_SEQNUM_NESN; + } + eq->seqnum = cpu_to_be16(orp_seqnum[i]); + eq_verbs = QM_EQCR_VERB_ORP | eqcr->vbit; + if (likely(!flags || (~(flags[i] & (QMAN_ENQUEUE_FLAG_HOLE | + QMAN_ENQUEUE_FLAG_NESN))))) + eq_verbs |= QM_EQCR_VERB_CMD_ENQUEUE; + + eq->__dont_write_directly__verb = eq_verbs; + dcbf(eq); + lwsync(); + i++; + eq++; + if (unlikely(eq >= (eqcr->ring + QM_EQCR_SIZE))) { + eqcr->vbit ^= QM_EQCR_VERB_VBIT; + eq = eqcr->ring; + } + eqcr->available--; + sent++; + fd++; + } + + eqcr->cursor = eq; + return sent; +} + int qman_enqueue_multi_fq(struct qman_fq *fq[], const struct qm_fd *fd, u32 *flags, int frames_to_send) @@ -2480,6 +2550,9 @@ int qman_enqueue_orp(struct qman_fq *fq, const struct qm_fd *fd, u32 flags, struct qman_portal *p = get_affine_portal(); struct qm_eqcr_entry *eq; + if (unlikely(fq->force_ooo)) + return qman_enqueue(fq, fd, flags); + eq = try_p_eq_start(p, fq, fd, flags); if (!eq) return -EBUSY; diff --git a/drivers/bus/dpaa/include/fsl_qman.h b/drivers/bus/dpaa/include/fsl_qman.h index 16fb4da98d..13795f04fd 100644 --- a/drivers/bus/dpaa/include/fsl_qman.h +++ b/drivers/bus/dpaa/include/fsl_qman.h @@ -584,6 +584,29 @@ static inline u32 qm_fqd_taildrop_get(const struct qm_fqd_taildrop *td) return (u32)td->mant << td->exp; } +/**Order restoration point (ORP) restoration window size*/ +enum { + ORP_RWS_WIN_32_FRMS = 0, + ORP_RWS_WIN_64_FRMS = 1, + ORP_RWS_WIN_128_FRMS = 2, + ORP_RWS_WIN_256_FRMS = 3, + ORP_RWS_WIN_512_FRMS = 4, + ORP_RWS_WIN_1024_FRMS = 5, + ORP_RWS_WIN_2048_FRMS = 6, + ORP_RWS_WIN_4096_FRMS = 7 +}; + +enum { + ORP_AUTO_ADVANCE_DISABLE = 0, + ORP_AUTO_ADVANCE_ENABLE = 1 +}; + +enum { + ORP_LATE_ARRIVE_REJECT = 0, + ORP_LATE_ARRIVE_WIN_32 = 1, + ORP_LATE_ARRIVE_WIN_RWS = 2, + ORP_LATE_ARRIVE_WIN_8192 = 3 +}; /* See "Frame Queue Descriptor (FQD)" */ /* Frame Queue Descriptor (FQD) field 'fq_ctrl' uses these constants */ @@ -1258,6 +1281,7 @@ struct qman_fq { u16 nb_desc; u16 resv; u64 offloads; + int force_ooo; }; /* @@ -1858,6 +1882,10 @@ typedef int (*qman_cb_precommit) (void *arg); int qman_enqueue_orp(struct qman_fq *fq, const struct qm_fd *fd, u32 flags, struct qman_fq *orp, u16 orp_seqnum); +__rte_internal +int qman_enqueue_multi_orp(struct qman_fq *fq, const struct qm_fd *fd, + struct qman_fq *orp, uint32_t *flags, uint16_t *orp_seqnum, + int frames_to_send); /** * qman_alloc_fqid_range - Allocate a contiguous range of FQIDs * @result: is set by the API to the base FQID of the allocated range -- 2.25.1

