The branch main has been updated by jhibbits: URL: https://cgit.FreeBSD.org/src/commit/?id=dcd99de90d92542fbf4377a4ca16ee6a09ae4a37
commit dcd99de90d92542fbf4377a4ca16ee6a09ae4a37 Author: Justin Hibbits <[email protected]> AuthorDate: 2026-08-10 13:48:18 +0000 Commit: Justin Hibbits <[email protected]> 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;
