diff --git a/sys/dev/cxgbe/t4_main.c b/sys/dev/cxgbe/t4_main.c index 4e8e75edfd8c..48263bf5fef7 100644 --- a/sys/dev/cxgbe/t4_main.c +++ b/sys/dev/cxgbe/t4_main.c @@ -401,6 +401,22 @@ SYSCTL_INT(_hw_cxgbe_toe_rexmt_backoff, OID_AUTO, 15, CTLFLAG_RDTUN, #endif #ifdef DEV_NETMAP +#define NN_MAIN_VI (1 << 0) /* Native netmap on the main VI */ +#define NN_EXTRA_VI (1 << 1) /* Native netmap on the extra VI(s) */ +static int t4_native_netmap = NN_EXTRA_VI; +SYSCTL_INT(_hw_cxgbe, OID_AUTO, native_netmap, CTLFLAG_RDTUN, &t4_native_netmap, + 0, "Native netmap support. bit 0 = main VI, bit 1 = extra VIs"); + +#define NNMTXQ 8 +static int t4_nnmtxq = -NNMTXQ; +SYSCTL_INT(_hw_cxgbe, OID_AUTO, nnmtxq, CTLFLAG_RDTUN, &t4_nnmtxq, 0, + "Number of netmap TX queues"); + +#define NNMRXQ 8 +static int t4_nnmrxq = -NNMRXQ; +SYSCTL_INT(_hw_cxgbe, OID_AUTO, nnmrxq, CTLFLAG_RDTUN, &t4_nnmrxq, 0, + "Number of netmap RX queues"); + #define NNMTXQ_VI 2 static int t4_nnmtxq_vi = -NNMTXQ_VI; SYSCTL_INT(_hw_cxgbe, OID_AUTO, nnmtxq_vi, CTLFLAG_RDTUN, &t4_nnmtxq_vi, 0, @@ -621,6 +637,8 @@ struct intrs_and_queues { uint16_t nrxq; /* # of NIC rxq's for each port */ uint16_t nofldtxq; /* # of TOE/ETHOFLD txq's for each port */ uint16_t nofldrxq; /* # of TOE rxq's for each port */ + uint16_t nnmtxq; /* # of netmap txq's */ + uint16_t nnmrxq; /* # of netmap rxq's */ /* The vcxgbe/vcxl interfaces use these and not the ones above. */ uint16_t ntxq_vi; /* # of NIC txq's */ @@ -1247,9 +1265,15 @@ t4_attach(device_t dev) } #endif #ifdef DEV_NETMAP - if (num_vis > 1) { - s->nnmrxq = nports * (num_vis - 1) * iaq.nnmrxq_vi; - s->nnmtxq = nports * (num_vis - 1) * iaq.nnmtxq_vi; + s->nnmrxq = 0; + s->nnmtxq = 0; + if (t4_native_netmap & NN_MAIN_VI) { + s->nnmrxq += nports * iaq.nnmrxq; + s->nnmtxq += nports * iaq.nnmtxq; + } + if (num_vis > 1 && t4_native_netmap & NN_EXTRA_VI) { + s->nnmrxq += nports * (num_vis - 1) * iaq.nnmrxq_vi; + s->nnmtxq += nports * (num_vis - 1) * iaq.nnmtxq_vi; } s->neq += s->nnmtxq + s->nnmrxq; s->niq += s->nnmrxq; @@ -1344,14 +1368,17 @@ t4_attach(device_t dev) ofld_rqidx += vi->nofldrxq; #endif #ifdef DEV_NETMAP - if (j > 0) { - vi->first_nm_rxq = nm_rqidx; - vi->first_nm_txq = nm_tqidx; + vi->first_nm_rxq = nm_rqidx; + vi->first_nm_txq = nm_tqidx; + if (j == 0) { + vi->nnmrxq = iaq.nnmrxq; + vi->nnmtxq = iaq.nnmtxq; + } else { vi->nnmrxq = iaq.nnmrxq_vi; vi->nnmtxq = iaq.nnmtxq_vi; - nm_rqidx += vi->nnmrxq; - nm_tqidx += vi->nnmtxq; } + nm_rqidx += vi->nnmrxq; + nm_tqidx += vi->nnmtxq; #endif } } @@ -3316,10 +3343,10 @@ fixup_devlog_params(struct adapter *sc) static void update_nirq(struct intrs_and_queues *iaq, int nports) { - int extra = T4_EXTRA_INTR; - iaq->nirq = extra; - iaq->nirq += nports * (iaq->nrxq + iaq->nofldrxq); + iaq->nirq = T4_EXTRA_INTR; + iaq->nirq += nports * max(iaq->nrxq, iaq->nnmrxq); + iaq->nirq += nports * iaq->nofldrxq; iaq->nirq += nports * (iaq->num_vis - 1) * max(iaq->nrxq_vi, iaq->nnmrxq_vi); iaq->nirq += nports * (iaq->num_vis - 1) * iaq->nofldrxq_vi; @@ -3358,8 +3385,14 @@ calculate_iaq(struct adapter *sc, struct intrs_and_queues *iaq, int itype, } #endif #ifdef DEV_NETMAP - iaq->nnmtxq_vi = t4_nnmtxq_vi; - iaq->nnmrxq_vi = t4_nnmrxq_vi; + if (t4_native_netmap & NN_MAIN_VI) { + iaq->nnmtxq = t4_nnmtxq; + iaq->nnmrxq = t4_nnmrxq; + } + if (t4_native_netmap & NN_EXTRA_VI) { + iaq->nnmtxq_vi = t4_nnmtxq_vi; + iaq->nnmrxq_vi = t4_nnmrxq_vi; + } #endif update_nirq(iaq, nports); @@ -3417,6 +3450,8 @@ calculate_iaq(struct adapter *sc, struct intrs_and_queues *iaq, int itype, do { iaq->nrxq--; } while (!powerof2(iaq->nrxq)); + if (iaq->nnmrxq > iaq->nrxq) + iaq->nnmrxq = iaq->nrxq; } if (iaq->nofldrxq > 1) iaq->nofldrxq >>= 1; @@ -3438,10 +3473,14 @@ calculate_iaq(struct adapter *sc, struct intrs_and_queues *iaq, int itype, device_printf(sc->dev, "running with minimal number of queues. " "itype %d, navail %u.\n", itype, navail); iaq->nirq = 1; - MPASS(iaq->nrxq == 1); + iaq->nrxq = 1; iaq->ntxq = 1; - if (iaq->nofldrxq > 1) + if (iaq->nofldrxq > 0) { + iaq->nofldrxq = 1; iaq->nofldtxq = 1; + } + iaq->nnmtxq = 0; + iaq->nnmrxq = 0; done: MPASS(iaq->num_vis > 0); if (iaq->num_vis > 1) { @@ -10892,6 +10931,8 @@ tweak_tunables(void) #endif #ifdef DEV_NETMAP + calculate_nqueues(&t4_nnmtxq, nc, NNMTXQ); + calculate_nqueues(&t4_nnmrxq, nc, NNMRXQ); calculate_nqueues(&t4_nnmtxq_vi, nc, NNMTXQ_VI); calculate_nqueues(&t4_nnmrxq_vi, nc, NNMRXQ_VI); #endif