[PATCH v8 18/26] bus/dpaa: orp queue create and burst enqueue
Hemant Agrawal
hemant.agrawal at nxp.com
Tue Aug 11 13:57:23 CEST 2026
From: Jun Yang <jun.yang at nxp.com>
Add burst orp queue create parameter and burst enqueue API.
Signed-off-by: Jun Yang <jun.yang at nxp.com>
---
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
More information about the dev
mailing list