git: dcd99de90d92 - main - dpaa_eth: refactor RX FQ state into an array (N=1)
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Mon, 24 Aug 2026 03:11:51 UTC
The branch main has been updated by jhibbits:
URL: https://cgit.FreeBSD.org/src/commit/?id=dcd99de90d92542fbf4377a4ca16ee6a09ae4a37
commit dcd99de90d92542fbf4377a4ca16ee6a09ae4a37
Author: Justin Hibbits <jhibbits@FreeBSD.org>
AuthorDate: 2026-08-10 13:48:18 +0000
Commit: Justin Hibbits <jhibbits@FreeBSD.org>
CommitDate: 2026-08-24 03:11:25 +0000
dpaa_eth: refactor RX FQ state into an array (N=1)
Preparation for FMan KeyGen-driven multi-queue RX. Replace the
single sc_rx_fq / sc_rx_fqid pair with a sc_rx_fqs[] array (currently
one entry) and sc_rx_fqid_base. Each entry carries a back-pointer
to the softc for use by the RX callback.
---
sys/dev/dpaa/dpaa_eth.c | 38 +++++++++++++++++++++++++++-----------
sys/dev/dpaa/dpaa_eth.h | 22 +++++++++++++++++++---
2 files changed, 46 insertions(+), 14 deletions(-)
diff --git a/sys/dev/dpaa/dpaa_eth.c b/sys/dev/dpaa/dpaa_eth.c
index e2826eb70b14..29161d528f71 100644
--- a/sys/dev/dpaa/dpaa_eth.c
+++ b/sys/dev/dpaa/dpaa_eth.c
@@ -194,8 +194,8 @@ dpaa_eth_fm_port_rx_init(struct dpaa_eth_softc *sc)
struct fman_port_params params;
int error;
- params.dflt_fqid = sc->sc_rx_fqid;
- params.err_fqid = sc->sc_rx_fqid;
+ params.dflt_fqid = sc->sc_rx_fqid_base;
+ params.err_fqid = sc->sc_rx_fqid_base;
params.rx_params.num_pools = 1;
params.rx_params.bpools[0].bpid = bman_get_bpid(sc->sc_rx_pool);
params.rx_params.bpools[0].size = MCLBYTES;
@@ -398,13 +398,15 @@ static int
dpaa_eth_fq_rx_callback(device_t portal, struct qman_fq *fq,
struct qman_fd *frame, void *app)
{
+ struct dpaa_eth_rx_fq *rxfq;
struct dpaa_eth_softc *sc;
struct mbuf *m;
struct fman_internal_context *frame_ic;
void *frame_va;
m = NULL;
- sc = app;
+ rxfq = app;
+ sc = rxfq->sc;
frame_va = DPAA_FD_GET_ADDR(frame);
frame_ic = frame_va; /* internal context at head of the frame */
@@ -514,10 +516,17 @@ dpaa_eth_fq_tx_confirm_callback(device_t portal, struct qman_fq *fq,
void
dpaa_eth_fq_rx_free(struct dpaa_eth_softc *sc)
{
- int cpu;
+ int cpu, i;
- if (sc->sc_rx_fq)
- qman_fq_free(sc->sc_rx_fq);
+ if (sc->sc_rx_fqs != NULL) {
+ for (i = 0; i < sc->sc_nrxfqs; i++) {
+ if (sc->sc_rx_fqs[i].fq != NULL)
+ qman_fq_free(sc->sc_rx_fqs[i].fq);
+ }
+ free(sc->sc_rx_fqs, M_DEVBUF);
+ sc->sc_rx_fqs = NULL;
+ sc->sc_nrxfqs = 0;
+ }
if (sc->sc_rx_channel != 0) {
CPU_FOREACH(cpu) {
device_t portal = DPCPU_ID_GET(cpu, qman_affine_portal);
@@ -531,7 +540,7 @@ dpaa_eth_fq_rx_free(struct dpaa_eth_softc *sc)
int
dpaa_eth_fq_rx_init(struct dpaa_eth_softc *sc)
{
- void *fq;
+ struct qman_fq *fq;
int error;
int cpu;
@@ -556,10 +565,17 @@ dpaa_eth_fq_rx_init(struct dpaa_eth_softc *sc)
QMAN_PORTAL_STATIC_DEQUEUE_CHANNEL(portal, sc->sc_rx_channel);
}
- sc->sc_rx_fq = fq;
- sc->sc_rx_fqid = qman_fq_get_fqid(fq);
-
- error = qman_fq_register_cb(fq, dpaa_eth_fq_rx_callback, sc);
+ sc->sc_nrxfqs = 1;
+ sc->sc_rx_fqs = malloc(sc->sc_nrxfqs * sizeof(*sc->sc_rx_fqs),
+ M_DEVBUF, M_WAITOK | M_ZERO);
+ sc->sc_rx_fqs[0].fq = fq;
+ sc->sc_rx_fqs[0].fqid = qman_fq_get_fqid(fq);
+ sc->sc_rx_fqs[0].cpu = -1; /* not pinned; any portal may drain */
+ sc->sc_rx_fqs[0].sc = sc;
+ sc->sc_rx_fqid_base = sc->sc_rx_fqs[0].fqid;
+
+ error = qman_fq_register_cb(fq, dpaa_eth_fq_rx_callback,
+ &sc->sc_rx_fqs[0]);
if (error != 0) {
device_printf(sc->sc_dev, "could not register RX callback\n");
dpaa_eth_fq_rx_free(sc);
diff --git a/sys/dev/dpaa/dpaa_eth.h b/sys/dev/dpaa/dpaa_eth.h
index a897b43b725e..e4090f8521cb 100644
--- a/sys/dev/dpaa/dpaa_eth.h
+++ b/sys/dev/dpaa/dpaa_eth.h
@@ -35,6 +35,21 @@ struct dpaa_pcpu_cnt {
u_int cnt;
} __aligned(CACHE_LINE_SIZE);
+struct dpaa_eth_softc;
+
+/*
+ * Per RX Frame Queue state. Today there is exactly one of these per
+ * port; a follow-on adds FMan KeyGen-driven hash distribution across
+ * N per-CPU FQs and this struct becomes the per-CPU RX slot. The
+ * back-pointer keeps the RX callback signature single-argument.
+ */
+struct dpaa_eth_rx_fq {
+ struct qman_fq *fq;
+ uint32_t fqid;
+ int cpu; /* CPU pin, or -1 if unpinned */
+ struct dpaa_eth_softc *sc;
+};
+
struct dpaa_eth_softc {
/* XXX MII bus requires that struct ifnet is first!!! */
if_t sc_ifnet;
@@ -52,9 +67,10 @@ struct dpaa_eth_softc {
char sc_rx_zname[64];
struct dpaa_pcpu_cnt *sc_rx_pool_check_cnt; /* per-CPU */
- /* RX Frame Queue */
- struct qman_fq *sc_rx_fq;
- uint32_t sc_rx_fqid;
+ /* RX Frame Queues (array of sc_nrxfqs entries). */
+ struct dpaa_eth_rx_fq *sc_rx_fqs;
+ int sc_nrxfqs;
+ uint32_t sc_rx_fqid_base;
/* TX Frame Queue */
struct qman_fq *sc_tx_fq;