git: dcd99de90d92 - main - dpaa_eth: refactor RX FQ state into an array (N=1)

From: Justin Hibbits <jhibbits_at_FreeBSD.org>
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;