git: e03c00b47b1a - main - cxgbe(4): Query and report IPsec offload related parameters

From: Navdeep Parhar <np_at_FreeBSD.org>
Date: Wed, 13 May 2026 16:00:37 UTC
The branch main has been updated by np:

URL: https://cgit.FreeBSD.org/src/commit/?id=e03c00b47b1af560b280c32576e7fc06b0a58224

commit e03c00b47b1af560b280c32576e7fc06b0a58224
Author:     Navdeep Parhar <np@FreeBSD.org>
AuthorDate: 2026-05-12 18:04:55 +0000
Commit:     Navdeep Parhar <np@FreeBSD.org>
CommitDate: 2026-05-13 15:51:46 +0000

    cxgbe(4): Query and report IPsec offload related parameters
    
    MFC after:      2 weeks
    Sponsored by:   Chelsio Communications
---
 sys/dev/cxgbe/common/common.h |  4 ++++
 sys/dev/cxgbe/t4_main.c       | 33 ++++++++++++++++++++++++++++++++-
 2 files changed, 36 insertions(+), 1 deletion(-)

diff --git a/sys/dev/cxgbe/common/common.h b/sys/dev/cxgbe/common/common.h
index 2033967ffb94..fcc728a8bf31 100644
--- a/sys/dev/cxgbe/common/common.h
+++ b/sys/dev/cxgbe/common/common.h
@@ -457,6 +457,10 @@ struct adapter_params {
 	unsigned int max_ordird_qp;	  /* Max read depth per RDMA QP */
 	unsigned int max_ird_adapter;	  /* Max read depth per adapter */
 
+	unsigned int nipsec_tunnel;
+	unsigned int nipsec_transport;
+	unsigned int nofld_ipsec_tunnel;
+
 	/* These values are for all ports (8b/port, upto 4 ports) */
 	uint32_t mps_bg_map;	/* MPS rx buffer group map */
 	uint32_t tp_ch_map;	/* TPCHMAP from firmware */
diff --git a/sys/dev/cxgbe/t4_main.c b/sys/dev/cxgbe/t4_main.c
index d73204eb808c..07906dac00a8 100644
--- a/sys/dev/cxgbe/t4_main.c
+++ b/sys/dev/cxgbe/t4_main.c
@@ -5998,7 +5998,29 @@ get_params__post_init(struct adapter *sc)
 		sc->vres.key.start = val[0];
 		sc->vres.key.size = val[1] - val[0] + 1;
 	}
-
+	if (sc->cryptocaps & FW_CAPS_CONFIG_IPSEC_INLINE) {
+		param[0] = FW_PARAM_PFVF(NIPSEC_TUNNEL);
+		param[1] = FW_PARAM_PFVF(NIPSEC_TRANSPORT);
+		rc = -t4_query_params(sc, sc->mbox, sc->pf, 0, 2, param, val);
+		if (rc == 0) {
+			sc->params.nipsec_tunnel = val[0];
+			sc->params.nipsec_transport = val[1];
+		} else {
+			CH_ERR(sc, "failed to query IPsec params: %d.\n", rc);
+			MPASS(sc->params.nipsec_tunnel == 0);
+			MPASS(sc->params.nipsec_transport == 0);
+		}
+	}
+	if (sc->cryptocaps & FW_CAPS_CONFIG_OFLD_OVER_IPSEC_INLINE) {
+		param[0] = FW_PARAM_PFVF(OFLD_NIPSEC_TUNNEL);
+		rc = -t4_query_params(sc, sc->mbox, sc->pf, 0, 1, param, val);
+		if (rc == 0) {
+			sc->params.nofld_ipsec_tunnel = val[0];
+		} else {
+			CH_ERR(sc, "failed to query TOE IPsec params: %d.\n", rc);
+			MPASS(sc->params.nofld_ipsec_tunnel == 0);
+		}
+	}
 	/*
 	 * We've got the params we wanted to query directly from the firmware.
 	 * Grab some others via other means.
@@ -7987,6 +8009,15 @@ t4_sysctls(struct adapter *sc)
 	SYSCTL_ADD_INT(ctx, children, OID_AUTO, "nfilters", CTLFLAG_RD,
 	    NULL, sc->tids.nftids, "number of filters");
 
+	SYSCTL_ADD_UINT(ctx, children, OID_AUTO, "nipsec_tunnel", CTLFLAG_RD,
+	    NULL, sc->params.nipsec_tunnel, "max hw IPsec tunnels");
+
+	SYSCTL_ADD_UINT(ctx, children, OID_AUTO, "nipsec_transport", CTLFLAG_RD,
+	    NULL, sc->params.nipsec_transport, "max hw IPsec transport pairs");
+
+	SYSCTL_ADD_UINT(ctx, children, OID_AUTO, "nofld_ipsec_tunnel", CTLFLAG_RD,
+	    NULL, sc->params.nofld_ipsec_tunnel, "max hw IPsec tunnels (TOE)");
+
 	SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "temperature",
 	    CTLTYPE_INT | CTLFLAG_RD | CTLFLAG_MPSAFE, sc, 0,
 	    sysctl_temperature, "I", "chip temperature (in Celsius)");