The branch main has been updated by np:

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

commit 1ba1c783296bc651e1af3174a1643dff39edf05a
Author:     Navdeep Parhar <[email protected]>
AuthorDate: 2025-09-29 07:54:13 +0000
Commit:     Navdeep Parhar <[email protected]>
CommitDate: 2025-09-29 14:25:58 +0000

    cxgbe(4): Claim T7 based devices
    
    The nexus/ifnet names are chnex/che respectively.
    
    MFC after:      3 days
    Sponsored by:   Chelsio Communications
---
 share/man/man4/cxgbe.4  |   5 +-
 sys/dev/cxgbe/t4_iov.c  |  67 ++++++++++++++++++++++++
 sys/dev/cxgbe/t4_main.c | 133 ++++++++++++++++++++++++++++++++++++++++++++++--
 sys/dev/cxgbe/t4_vf.c   |  65 +++++++++++++++++++++++
 4 files changed, 265 insertions(+), 5 deletions(-)

diff --git a/share/man/man4/cxgbe.4 b/share/man/man4/cxgbe.4
index bfba202d1fec..77465a3ae590 100644
--- a/share/man/man4/cxgbe.4
+++ b/share/man/man4/cxgbe.4
@@ -29,7 +29,7 @@
 .\"
 .\" * Other names and brands may be claimed as the property of others.
 .\"
-.Dd November 10, 2022
+.Dd September 29, 2025
 .Dt CXGBE 4
 .Os
 .Sh NAME
@@ -73,6 +73,7 @@ driver uses different names for devices based on the 
associated ASIC:
 .It T4 Ta cxgbe Ta t4nex Ta vcxgbe
 .It T5 Ta cxl Ta t5nex Ta vcxl
 .It T6 Ta cc Ta t6nex Ta vcc
+.It T7 Ta che Ta chnex Ta vche
 .El
 .Pp
 Loader tunables with the hw.cxgbe prefix apply to all cards.
@@ -416,6 +417,8 @@ Support for T6 cards first appeared in
 .Fx 11.1
 and
 .Fx 12.0 .
+Support for T7 cards first appeared in
+.Fx 15.0 .
 .Sh AUTHORS
 .An -nosplit
 The
diff --git a/sys/dev/cxgbe/t4_iov.c b/sys/dev/cxgbe/t4_iov.c
index bfd1613e9795..452ebaaf0172 100644
--- a/sys/dev/cxgbe/t4_iov.c
+++ b/sys/dev/cxgbe/t4_iov.c
@@ -119,6 +119,28 @@ struct {
        {0x6085, "Chelsio T6240-SO 85"},
        {0x6086, "Chelsio T6225-SO-CR 86"},
        {0x6087, "Chelsio T6225-CR 87"},
+}, t7iov_pciids[] = {
+       {0xd000, "Chelsio Terminator 7 FPGA"},  /* T7 PE12K FPGA */
+       {0x7000, "Chelsio T72200-DBG"},         /* 2 x 200G, debug */
+       {0x7001, "Chelsio T7250"},              /* 2 x 10/25/50G, 1 mem */
+       {0x7002, "Chelsio S7250"},              /* 2 x 10/25/50G, nomem */
+       {0x7003, "Chelsio T7450"},              /* 4 x 10/25/50G, 1 mem */
+       {0x7004, "Chelsio S7450"},              /* 4 x 10/25/50G, nomem */
+       {0x7005, "Chelsio T72200"},             /* 2 x 40/100/200G, 1 mem */
+       {0x7006, "Chelsio S72200"},             /* 2 x 40/100/200G, nomem */
+       {0x7007, "Chelsio T72200-FH"},          /* 2 x 40/100/200G, 2 mem */
+       {0x7008, "Chelsio T71400"},             /* 1 x 400G, nomem */
+       {0x7009, "Chelsio S7210-BT"},           /* 2 x 10GBASE-T, nomem */
+       {0x700a, "Chelsio T7450-RC"},           /* 4 x 10/25/50G, 1 mem, RC */
+       {0x700b, "Chelsio T72200-RC"},          /* 2 x 40/100/200G, 1 mem, RC */
+       {0x700c, "Chelsio T72200-FH-RC"},       /* 2 x 40/100/200G, 2 mem, RC */
+       {0x700d, "Chelsio S72200-OCP3"},        /* 2 x 40/100/200G OCP3 */
+       {0x700e, "Chelsio S7450-OCP3"},         /* 4 x 1/20/25/50G OCP3 */
+       {0x700f, "Chelsio S7410-BT-OCP3"},      /* 4 x 10GBASE-T OCP3 */
+       {0x7010, "Chelsio S7210-BT-A"},         /* 2 x 10GBASE-T */
+       {0x7011, "Chelsio T7_MAYRA_7"},         /* Motherboard */
+
+       {0x7080, "Custom T7"},
 };
 
 static inline uint32_t
@@ -190,6 +212,26 @@ t6iov_probe(device_t dev)
        return (ENXIO);
 }
 
+static int
+chiov_probe(device_t dev)
+{
+       uint16_t d;
+       size_t i;
+
+       if (pci_get_vendor(dev) != PCI_VENDOR_ID_CHELSIO)
+               return (ENXIO);
+
+       d = pci_get_device(dev);
+       for (i = 0; i < nitems(t7iov_pciids); i++) {
+               if (d == t7iov_pciids[i].device) {
+                       device_set_desc(dev, t7iov_pciids[i].desc);
+                       device_quiet(dev);
+                       return (BUS_PROBE_DEFAULT);
+               }
+       }
+       return (ENXIO);
+}
+
 static int
 t4iov_attach(device_t dev)
 {
@@ -460,6 +502,28 @@ static driver_t t6iov_driver = {
        sizeof(struct t4iov_softc)
 };
 
+static device_method_t chiov_methods[] = {
+       DEVMETHOD(device_probe,         chiov_probe),
+       DEVMETHOD(device_attach,        t4iov_attach),
+       DEVMETHOD(device_detach,        t4iov_detach),
+
+#ifdef PCI_IOV
+       DEVMETHOD(pci_iov_init,         t4iov_iov_init),
+       DEVMETHOD(pci_iov_uninit,       t4iov_iov_uninit),
+       DEVMETHOD(pci_iov_add_vf,       t4iov_add_vf),
+#endif
+
+       DEVMETHOD(t4_attach_child,      t4iov_attach_child),
+       DEVMETHOD(t4_detach_child,      t4iov_detach_child),
+
+       DEVMETHOD_END
+};
+
+static driver_t chiov_driver = {
+       "chiov",
+       chiov_methods,
+       sizeof(struct t4iov_softc)
+};
 DRIVER_MODULE(t4iov, pci, t4iov_driver, 0, 0);
 MODULE_VERSION(t4iov, 1);
 
@@ -468,3 +532,6 @@ MODULE_VERSION(t5iov, 1);
 
 DRIVER_MODULE(t6iov, pci, t6iov_driver, 0, 0);
 MODULE_VERSION(t6iov, 1);
+
+DRIVER_MODULE(chiov, pci, chiov_driver, 0, 0);
+MODULE_VERSION(chiov, 1);
diff --git a/sys/dev/cxgbe/t4_main.c b/sys/dev/cxgbe/t4_main.c
index 42f56179845c..6a52810c5d8d 100644
--- a/sys/dev/cxgbe/t4_main.c
+++ b/sys/dev/cxgbe/t4_main.c
@@ -241,6 +241,45 @@ static driver_t vcc_driver = {
        sizeof(struct vi_info)
 };
 
+/* T7+ bus driver interface */
+static int ch_probe(device_t);
+static device_method_t ch_methods[] = {
+       DEVMETHOD(device_probe,         ch_probe),
+       DEVMETHOD(device_attach,        t4_attach),
+       DEVMETHOD(device_detach,        t4_detach),
+       DEVMETHOD(device_suspend,       t4_suspend),
+       DEVMETHOD(device_resume,        t4_resume),
+
+       DEVMETHOD(bus_child_location,   t4_child_location),
+       DEVMETHOD(bus_reset_prepare,    t4_reset_prepare),
+       DEVMETHOD(bus_reset_post,       t4_reset_post),
+
+       DEVMETHOD(t4_is_main_ready,     t4_ready),
+       DEVMETHOD(t4_read_port_device,  t4_read_port_device),
+
+       DEVMETHOD_END
+};
+static driver_t ch_driver = {
+       "chnex",
+       ch_methods,
+       sizeof(struct adapter)
+};
+
+
+/* T7+ port (che) interface */
+static driver_t che_driver = {
+       "che",
+       cxgbe_methods,
+       sizeof(struct port_info)
+};
+
+/* T7+ VI (vche) interface */
+static driver_t vche_driver = {
+       "vche",
+       vcxgbe_methods,
+       sizeof(struct vi_info)
+};
+
 /* ifnet interface */
 static void cxgbe_init(void *);
 static int cxgbe_ioctl(if_t, unsigned long, caddr_t);
@@ -960,6 +999,29 @@ struct {
        {0x6485, "Custom T6240-SO"},
        {0x6486, "Custom T6225-SO-CR"},
        {0x6487, "Custom T6225-CR"},
+}, t7_pciids[] = {
+       {0xd000, "Chelsio Terminator 7 FPGA"},  /* T7 PE12K FPGA */
+       {0x7400, "Chelsio T72200-DBG"},         /* 2 x 200G, debug */
+       {0x7401, "Chelsio T7250"},              /* 2 x 10/25/50G, 1 mem */
+       {0x7402, "Chelsio S7250"},              /* 2 x 10/25/50G, nomem */
+       {0x7403, "Chelsio T7450"},              /* 4 x 10/25/50G, 1 mem */
+       {0x7404, "Chelsio S7450"},              /* 4 x 10/25/50G, nomem */
+       {0x7405, "Chelsio T72200"},             /* 2 x 40/100/200G, 1 mem */
+       {0x7406, "Chelsio S72200"},             /* 2 x 40/100/200G, nomem */
+       {0x7407, "Chelsio T72200-FH"},          /* 2 x 40/100/200G, 2 mem */
+       {0x7408, "Chelsio S71400"},             /* 1 x 400G, nomem */
+       {0x7409, "Chelsio S7210-BT"},           /* 2 x 10GBASE-T, nomem */
+       {0x740a, "Chelsio T7450-RC"},           /* 4 x 10/25/50G, 1 mem, RC */
+       {0x740b, "Chelsio T72200-RC"},          /* 2 x 40/100/200G, 1 mem, RC */
+       {0x740c, "Chelsio T72200-FH-RC"},       /* 2 x 40/100/200G, 2 mem, RC */
+       {0x740d, "Chelsio S72200-OCP3"},        /* 2 x 40/100/200G OCP3 */
+       {0x740e, "Chelsio S7450-OCP3"},         /* 4 x 1/20/25/50G OCP3 */
+       {0x740f, "Chelsio S7410-BT-OCP3"},      /* 4 x 10GBASE-T OCP3 */
+       {0x7410, "Chelsio S7210-BT-A"},         /* 2 x 10GBASE-T */
+       {0x7411, "Chelsio T7_MAYRA_7"},         /* Motherboard */
+
+       /* Custom */
+       {0x7480, "Custom T7"},
 };
 
 #ifdef TCP_OFFLOAD
@@ -1042,6 +1104,31 @@ t6_probe(device_t dev)
        return (ENXIO);
 }
 
+static int
+ch_probe(device_t dev)
+{
+       int i;
+       uint16_t v = pci_get_vendor(dev);
+       uint16_t d = pci_get_device(dev);
+       uint8_t f = pci_get_function(dev);
+
+       if (v != PCI_VENDOR_ID_CHELSIO)
+               return (ENXIO);
+
+       /* Attach only to PF0 of the FPGA */
+       if (d == 0xd000 && f != 0)
+               return (ENXIO);
+
+       for (i = 0; i < nitems(t7_pciids); i++) {
+               if (d == t7_pciids[i].device) {
+                       device_set_desc(dev, t7_pciids[i].desc);
+                       return (BUS_PROBE_DEFAULT);
+               }
+       }
+
+       return (ENXIO);
+}
+
 static void
 t5_attribute_workaround(device_t dev)
 {
@@ -1091,6 +1178,13 @@ static const struct devnames devnames[] = {
                .pf03_drv_name = "t6iov",
                .vf_nexus_name = "t6vf",
                .vf_ifnet_name = "ccv"
+       }, {
+               .nexus_name = "chnex",
+               .ifnet_name = "che",
+               .vi_ifnet_name = "vche",
+               .pf03_drv_name = "chiov",
+               .vf_nexus_name = "chvf",
+               .vf_ifnet_name = "chev"
        }
 };
 
@@ -1100,12 +1194,13 @@ t4_init_devnames(struct adapter *sc)
        int id;
 
        id = chip_id(sc);
-       if (id >= CHELSIO_T4 && id - CHELSIO_T4 < nitems(devnames))
-               sc->names = &devnames[id - CHELSIO_T4];
-       else {
+       if (id < CHELSIO_T4) {
                device_printf(sc->dev, "chip id %d is not supported.\n", id);
                sc->names = NULL;
-       }
+       } else if (id - CHELSIO_T4 < nitems(devnames))
+               sc->names = &devnames[id - CHELSIO_T4];
+       else
+               sc->names = &devnames[nitems(devnames) - 1];
 }
 
 static int
@@ -4713,6 +4808,22 @@ struct fw_info {
                        .intfver_fcoepdu = FW_INTFVER(T6, FCOEPDU),
                        .intfver_fcoe = FW_INTFVER(T6, FCOE),
                },
+       }, {
+               .chip = CHELSIO_T7,
+               .kld_name = "t7fw_cfg",
+               .fw_mod_name = "t7fw",
+               .fw_h = {
+                       .chip = FW_HDR_CHIP_T7,
+                       .fw_ver = htobe32(FW_VERSION(T7)),
+                       .intfver_nic = FW_INTFVER(T7, NIC),
+                       .intfver_vnic = FW_INTFVER(T7, VNIC),
+                       .intfver_ofld = FW_INTFVER(T7, OFLD),
+                       .intfver_ri = FW_INTFVER(T7, RI),
+                       .intfver_iscsipdu = FW_INTFVER(T7, ISCSIPDU),
+                       .intfver_iscsi = FW_INTFVER(T7, ISCSI),
+                       .intfver_fcoepdu = FW_INTFVER(T7, FCOEPDU),
+                       .intfver_fcoe = FW_INTFVER(T7, FCOE),
+               },
        }
 };
 
@@ -13387,6 +13498,14 @@ MODULE_DEPEND(t6nex, firmware, 1, 1, 1);
 MODULE_DEPEND(t6nex, netmap, 1, 1, 1);
 #endif /* DEV_NETMAP */
 
+DRIVER_MODULE(chnex, pci, ch_driver, mod_event, 0);
+MODULE_VERSION(chnex, 1);
+MODULE_DEPEND(chnex, crypto, 1, 1, 1);
+MODULE_DEPEND(chnex, firmware, 1, 1, 1);
+#ifdef DEV_NETMAP
+MODULE_DEPEND(chnex, netmap, 1, 1, 1);
+#endif /* DEV_NETMAP */
+
 DRIVER_MODULE(cxgbe, t4nex, cxgbe_driver, 0, 0);
 MODULE_VERSION(cxgbe, 1);
 
@@ -13396,6 +13515,9 @@ MODULE_VERSION(cxl, 1);
 DRIVER_MODULE(cc, t6nex, cc_driver, 0, 0);
 MODULE_VERSION(cc, 1);
 
+DRIVER_MODULE(che, chnex, che_driver, 0, 0);
+MODULE_VERSION(che, 1);
+
 DRIVER_MODULE(vcxgbe, cxgbe, vcxgbe_driver, 0, 0);
 MODULE_VERSION(vcxgbe, 1);
 
@@ -13404,3 +13526,6 @@ MODULE_VERSION(vcxl, 1);
 
 DRIVER_MODULE(vcc, cc, vcc_driver, 0, 0);
 MODULE_VERSION(vcc, 1);
+
+DRIVER_MODULE(vche, che, vche_driver, 0, 0);
+MODULE_VERSION(vche, 1);
diff --git a/sys/dev/cxgbe/t4_vf.c b/sys/dev/cxgbe/t4_vf.c
index b7b08e226a57..89dae02e9332 100644
--- a/sys/dev/cxgbe/t4_vf.c
+++ b/sys/dev/cxgbe/t4_vf.c
@@ -125,6 +125,28 @@ struct {
        {0x6885, "Chelsio T6240-SO 85 VF"},
        {0x6886, "Chelsio T6225-SO-CR 86 VF"},
        {0x6887, "Chelsio T6225-CR 87 VF"},
+}, t7vf_pciids[] = {
+       {0xd800, "Chelsio T7 FPGA VF"},         /* T7 PE12K FPGA */
+       {0x7800, "Chelsio T72200-DBG VF"},      /* 2 x 200G, debug */
+       {0x7801, "Chelsio T7250 VF"},           /* 2 x 10/25/50G, 1 mem */
+       {0x7802, "Chelsio S7250 VF"},           /* 2 x 10/25/50G, nomem */
+       {0x7803, "Chelsio T7450 VF"},           /* 4 x 10/25/50G, 1 mem */
+       {0x7804, "Chelsio S7450 VF"},           /* 4 x 10/25/50G, nomem */
+       {0x7805, "Chelsio T72200 VF"},          /* 2 x 40/100/200G, 1 mem */
+       {0x7806, "Chelsio S72200 VF"},          /* 2 x 40/100/200G, nomem */
+       {0x7807, "Chelsio T72200-FH VF"},       /* 2 x 40/100/200G, 2 mem */
+       {0x7808, "Chelsio T71400 VF"},          /* 1 x 400G, nomem */
+       {0x7809, "Chelsio S7210-BT VF"},        /* 2 x 10GBASE-T, nomem */
+       {0x780a, "Chelsio T7450-RC VF"},        /* 4 x 10/25/50G, 1 mem, RC */
+       {0x780b, "Chelsio T72200-RC VF"},       /* 2 x 40/100/200G, 1 mem, RC */
+       {0x780c, "Chelsio T72200-FH-RC VF"},    /* 2 x 40/100/200G, 2 mem, RC */
+       {0x780d, "Chelsio S72200-OCP3 VF"},     /* 2 x 40/100/200G OCP3 */
+       {0x780e, "Chelsio S7450-OCP3 VF"},      /* 4 x 1/20/25/50G OCP3 */
+       {0x780f, "Chelsio S7410-BT-OCP3 VF"},   /* 4 x 10GBASE-T OCP3 */
+       {0x7810, "Chelsio S7210-BT-A VF"},      /* 2 x 10GBASE-T */
+       {0x7811, "Chelsio T7_MAYRA_7 VF"},      /* Motherboard */
+
+       {0x7880, "Custom T7 VF"},
 };
 
 static d_ioctl_t t4vf_ioctl;
@@ -183,6 +205,22 @@ t6vf_probe(device_t dev)
        return (ENXIO);
 }
 
+static int
+chvf_probe(device_t dev)
+{
+       uint16_t d;
+       size_t i;
+
+       d = pci_get_device(dev);
+       for (i = 0; i < nitems(t7vf_pciids); i++) {
+               if (d == t7vf_pciids[i].device) {
+                       device_set_desc(dev, t7vf_pciids[i].desc);
+                       return (BUS_PROBE_DEFAULT);
+               }
+       }
+       return (ENXIO);
+}
+
 #define FW_PARAM_DEV(param) \
        (V_FW_PARAMS_MNEM(FW_PARAMS_MNEM_DEV) | \
         V_FW_PARAMS_PARAM_X(FW_PARAMS_PARAM_DEV_##param))
@@ -956,6 +994,20 @@ static driver_t t6vf_driver = {
        sizeof(struct adapter)
 };
 
+static device_method_t chvf_methods[] = {
+       DEVMETHOD(device_probe,         chvf_probe),
+       DEVMETHOD(device_attach,        t4vf_attach),
+       DEVMETHOD(device_detach,        t4_detach_common),
+
+       DEVMETHOD_END
+};
+
+static driver_t chvf_driver = {
+       "chvf",
+       chvf_methods,
+       sizeof(struct adapter)
+};
+
 static driver_t cxgbev_driver = {
        "cxgbev",
        cxgbe_methods,
@@ -974,6 +1026,12 @@ static driver_t ccv_driver = {
        sizeof(struct port_info)
 };
 
+static driver_t chev_driver = {
+       "chev",
+       cxgbe_methods,
+       sizeof(struct port_info)
+};
+
 DRIVER_MODULE(t4vf, pci, t4vf_driver, 0, 0);
 MODULE_VERSION(t4vf, 1);
 MODULE_DEPEND(t4vf, t4nex, 1, 1, 1);
@@ -986,6 +1044,10 @@ DRIVER_MODULE(t6vf, pci, t6vf_driver, 0, 0);
 MODULE_VERSION(t6vf, 1);
 MODULE_DEPEND(t6vf, t6nex, 1, 1, 1);
 
+DRIVER_MODULE(chvf, pci, chvf_driver, 0, 0);
+MODULE_VERSION(chvf, 1);
+MODULE_DEPEND(chvf, chnex, 1, 1, 1);
+
 DRIVER_MODULE(cxgbev, t4vf, cxgbev_driver, 0, 0);
 MODULE_VERSION(cxgbev, 1);
 
@@ -994,3 +1056,6 @@ MODULE_VERSION(cxlv, 1);
 
 DRIVER_MODULE(ccv, t6vf, ccv_driver, 0, 0);
 MODULE_VERSION(ccv, 1);
+
+DRIVER_MODULE(chev, chvf, chev_driver, 0, 0);
+MODULE_VERSION(chev, 1);

Reply via email to