OSDN Git Service

mlxsw: spectrum: Extend to support Spectrum-4 ASIC
authorAmit Cohen <amcohen@nvidia.com>
Thu, 6 Jan 2022 16:06:52 +0000 (18:06 +0200)
committerJakub Kicinski <kuba@kernel.org>
Fri, 7 Jan 2022 04:00:46 +0000 (20:00 -0800)
Extend existing driver for Spectrum, Spectrum-2 and Spectrum-3 ASICs
to support Spectrum-4 ASIC as well.

Currently there is no released firmware version for Spectrum-4, so the
driver is not enforcing a minimum version.

Signed-off-by: Amit Cohen <amcohen@nvidia.com>
Signed-off-by: Ido Schimmel <idosch@nvidia.com>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/mellanox/mlxsw/Kconfig
drivers/net/ethernet/mellanox/mlxsw/pci.h
drivers/net/ethernet/mellanox/mlxsw/reg.h
drivers/net/ethernet/mellanox/mlxsw/spectrum.c

index d1ae248..4683312 100644 (file)
@@ -66,7 +66,7 @@ config MLXSW_SPECTRUM
        default m
        help
          This driver supports Mellanox Technologies
-         Spectrum/Spectrum-2/Spectrum-3 Ethernet Switch ASICs.
+         Spectrum/Spectrum-2/Spectrum-3/Spectrum-4 Ethernet Switch ASICs.
 
          To compile this driver as a module, choose M here: the
          module will be called mlxsw_spectrum.
index 9899c1a..cacc2f9 100644 (file)
@@ -9,6 +9,7 @@
 #define PCI_DEVICE_ID_MELLANOX_SPECTRUM                0xcb84
 #define PCI_DEVICE_ID_MELLANOX_SPECTRUM2       0xcf6c
 #define PCI_DEVICE_ID_MELLANOX_SPECTRUM3       0xcf70
+#define PCI_DEVICE_ID_MELLANOX_SPECTRUM4       0xcf80
 
 #if IS_ENABLED(CONFIG_MLXSW_PCI)
 
index c97d2c7..24cc650 100644 (file)
@@ -3914,6 +3914,7 @@ MLXSW_ITEM32(reg, qeec, max_shaper_bs, 0x1C, 0, 6);
 #define MLXSW_REG_QEEC_LOWEST_SHAPER_BS_SP1    5
 #define MLXSW_REG_QEEC_LOWEST_SHAPER_BS_SP2    11
 #define MLXSW_REG_QEEC_LOWEST_SHAPER_BS_SP3    11
+#define MLXSW_REG_QEEC_LOWEST_SHAPER_BS_SP4    11
 
 static inline void mlxsw_reg_qeec_pack(char *payload, u16 local_port,
                                       enum mlxsw_reg_qeec_hr hr, u8 index,
index 6e4265c..aa411de 100644 (file)
@@ -95,6 +95,7 @@ static const struct mlxsw_fw_rev mlxsw_sp3_fw_rev = {
 static const char mlxsw_sp1_driver_name[] = "mlxsw_spectrum";
 static const char mlxsw_sp2_driver_name[] = "mlxsw_spectrum2";
 static const char mlxsw_sp3_driver_name[] = "mlxsw_spectrum3";
+static const char mlxsw_sp4_driver_name[] = "mlxsw_spectrum4";
 
 static const unsigned char mlxsw_sp1_mac_mask[ETH_ALEN] = {
        0xff, 0xff, 0xff, 0xff, 0xfc, 0x00
@@ -3202,6 +3203,36 @@ static int mlxsw_sp3_init(struct mlxsw_core *mlxsw_core,
        return mlxsw_sp_init(mlxsw_core, mlxsw_bus_info, extack);
 }
 
+static int mlxsw_sp4_init(struct mlxsw_core *mlxsw_core,
+                         const struct mlxsw_bus_info *mlxsw_bus_info,
+                         struct netlink_ext_ack *extack)
+{
+       struct mlxsw_sp *mlxsw_sp = mlxsw_core_driver_priv(mlxsw_core);
+
+       mlxsw_sp->switchdev_ops = &mlxsw_sp2_switchdev_ops;
+       mlxsw_sp->kvdl_ops = &mlxsw_sp2_kvdl_ops;
+       mlxsw_sp->afa_ops = &mlxsw_sp2_act_afa_ops;
+       mlxsw_sp->afk_ops = &mlxsw_sp4_afk_ops;
+       mlxsw_sp->mr_tcam_ops = &mlxsw_sp2_mr_tcam_ops;
+       mlxsw_sp->acl_rulei_ops = &mlxsw_sp2_acl_rulei_ops;
+       mlxsw_sp->acl_tcam_ops = &mlxsw_sp2_acl_tcam_ops;
+       mlxsw_sp->acl_bf_ops = &mlxsw_sp4_acl_bf_ops;
+       mlxsw_sp->nve_ops_arr = mlxsw_sp2_nve_ops_arr;
+       mlxsw_sp->mac_mask = mlxsw_sp2_mac_mask;
+       mlxsw_sp->sb_vals = &mlxsw_sp2_sb_vals;
+       mlxsw_sp->sb_ops = &mlxsw_sp3_sb_ops;
+       mlxsw_sp->port_type_speed_ops = &mlxsw_sp2_port_type_speed_ops;
+       mlxsw_sp->ptp_ops = &mlxsw_sp2_ptp_ops;
+       mlxsw_sp->span_ops = &mlxsw_sp3_span_ops;
+       mlxsw_sp->policer_core_ops = &mlxsw_sp2_policer_core_ops;
+       mlxsw_sp->trap_ops = &mlxsw_sp2_trap_ops;
+       mlxsw_sp->mall_ops = &mlxsw_sp2_mall_ops;
+       mlxsw_sp->router_ops = &mlxsw_sp2_router_ops;
+       mlxsw_sp->lowest_shaper_bs = MLXSW_REG_QEEC_LOWEST_SHAPER_BS_SP4;
+
+       return mlxsw_sp_init(mlxsw_core, mlxsw_bus_info, extack);
+}
+
 static void mlxsw_sp_fini(struct mlxsw_core *mlxsw_core)
 {
        struct mlxsw_sp *mlxsw_sp = mlxsw_core_driver_priv(mlxsw_core);
@@ -3761,6 +3792,45 @@ static struct mlxsw_driver mlxsw_sp3_driver = {
        .temp_warn_enabled              = true,
 };
 
+static struct mlxsw_driver mlxsw_sp4_driver = {
+       .kind                           = mlxsw_sp4_driver_name,
+       .priv_size                      = sizeof(struct mlxsw_sp),
+       .init                           = mlxsw_sp4_init,
+       .fini                           = mlxsw_sp_fini,
+       .basic_trap_groups_set          = mlxsw_sp_basic_trap_groups_set,
+       .port_split                     = mlxsw_sp_port_split,
+       .port_unsplit                   = mlxsw_sp_port_unsplit,
+       .sb_pool_get                    = mlxsw_sp_sb_pool_get,
+       .sb_pool_set                    = mlxsw_sp_sb_pool_set,
+       .sb_port_pool_get               = mlxsw_sp_sb_port_pool_get,
+       .sb_port_pool_set               = mlxsw_sp_sb_port_pool_set,
+       .sb_tc_pool_bind_get            = mlxsw_sp_sb_tc_pool_bind_get,
+       .sb_tc_pool_bind_set            = mlxsw_sp_sb_tc_pool_bind_set,
+       .sb_occ_snapshot                = mlxsw_sp_sb_occ_snapshot,
+       .sb_occ_max_clear               = mlxsw_sp_sb_occ_max_clear,
+       .sb_occ_port_pool_get           = mlxsw_sp_sb_occ_port_pool_get,
+       .sb_occ_tc_port_bind_get        = mlxsw_sp_sb_occ_tc_port_bind_get,
+       .trap_init                      = mlxsw_sp_trap_init,
+       .trap_fini                      = mlxsw_sp_trap_fini,
+       .trap_action_set                = mlxsw_sp_trap_action_set,
+       .trap_group_init                = mlxsw_sp_trap_group_init,
+       .trap_group_set                 = mlxsw_sp_trap_group_set,
+       .trap_policer_init              = mlxsw_sp_trap_policer_init,
+       .trap_policer_fini              = mlxsw_sp_trap_policer_fini,
+       .trap_policer_set               = mlxsw_sp_trap_policer_set,
+       .trap_policer_counter_get       = mlxsw_sp_trap_policer_counter_get,
+       .txhdr_construct                = mlxsw_sp_txhdr_construct,
+       .resources_register             = mlxsw_sp2_resources_register,
+       .params_register                = mlxsw_sp2_params_register,
+       .params_unregister              = mlxsw_sp2_params_unregister,
+       .ptp_transmitted                = mlxsw_sp_ptp_transmitted,
+       .txhdr_len                      = MLXSW_TXHDR_LEN,
+       .profile                        = &mlxsw_sp2_config_profile,
+       .res_query_enabled              = true,
+       .fw_fatal_enabled               = true,
+       .temp_warn_enabled              = true,
+};
+
 bool mlxsw_sp_port_dev_check(const struct net_device *dev)
 {
        return dev->netdev_ops == &mlxsw_sp_port_netdev_ops;
@@ -4928,6 +4998,16 @@ static struct pci_driver mlxsw_sp3_pci_driver = {
        .id_table = mlxsw_sp3_pci_id_table,
 };
 
+static const struct pci_device_id mlxsw_sp4_pci_id_table[] = {
+       {PCI_VDEVICE(MELLANOX, PCI_DEVICE_ID_MELLANOX_SPECTRUM4), 0},
+       {0, },
+};
+
+static struct pci_driver mlxsw_sp4_pci_driver = {
+       .name = mlxsw_sp4_driver_name,
+       .id_table = mlxsw_sp4_pci_id_table,
+};
+
 static int __init mlxsw_sp_module_init(void)
 {
        int err;
@@ -4947,6 +5027,10 @@ static int __init mlxsw_sp_module_init(void)
        if (err)
                goto err_sp3_core_driver_register;
 
+       err = mlxsw_core_driver_register(&mlxsw_sp4_driver);
+       if (err)
+               goto err_sp4_core_driver_register;
+
        err = mlxsw_pci_driver_register(&mlxsw_sp1_pci_driver);
        if (err)
                goto err_sp1_pci_driver_register;
@@ -4959,13 +5043,21 @@ static int __init mlxsw_sp_module_init(void)
        if (err)
                goto err_sp3_pci_driver_register;
 
+       err = mlxsw_pci_driver_register(&mlxsw_sp4_pci_driver);
+       if (err)
+               goto err_sp4_pci_driver_register;
+
        return 0;
 
+err_sp4_pci_driver_register:
+       mlxsw_pci_driver_unregister(&mlxsw_sp3_pci_driver);
 err_sp3_pci_driver_register:
        mlxsw_pci_driver_unregister(&mlxsw_sp2_pci_driver);
 err_sp2_pci_driver_register:
        mlxsw_pci_driver_unregister(&mlxsw_sp1_pci_driver);
 err_sp1_pci_driver_register:
+       mlxsw_core_driver_unregister(&mlxsw_sp4_driver);
+err_sp4_core_driver_register:
        mlxsw_core_driver_unregister(&mlxsw_sp3_driver);
 err_sp3_core_driver_register:
        mlxsw_core_driver_unregister(&mlxsw_sp2_driver);
@@ -4979,9 +5071,11 @@ err_sp1_core_driver_register:
 
 static void __exit mlxsw_sp_module_exit(void)
 {
+       mlxsw_pci_driver_unregister(&mlxsw_sp4_pci_driver);
        mlxsw_pci_driver_unregister(&mlxsw_sp3_pci_driver);
        mlxsw_pci_driver_unregister(&mlxsw_sp2_pci_driver);
        mlxsw_pci_driver_unregister(&mlxsw_sp1_pci_driver);
+       mlxsw_core_driver_unregister(&mlxsw_sp4_driver);
        mlxsw_core_driver_unregister(&mlxsw_sp3_driver);
        mlxsw_core_driver_unregister(&mlxsw_sp2_driver);
        mlxsw_core_driver_unregister(&mlxsw_sp1_driver);
@@ -4998,6 +5092,7 @@ MODULE_DESCRIPTION("Mellanox Spectrum driver");
 MODULE_DEVICE_TABLE(pci, mlxsw_sp1_pci_id_table);
 MODULE_DEVICE_TABLE(pci, mlxsw_sp2_pci_id_table);
 MODULE_DEVICE_TABLE(pci, mlxsw_sp3_pci_id_table);
+MODULE_DEVICE_TABLE(pci, mlxsw_sp4_pci_id_table);
 MODULE_FIRMWARE(MLXSW_SP1_FW_FILENAME);
 MODULE_FIRMWARE(MLXSW_SP2_FW_FILENAME);
 MODULE_FIRMWARE(MLXSW_SP3_FW_FILENAME);