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;

Reply via email to