Skip to content

Commit c3ab435

Browse files
jpirkodavem330
authored andcommitted
mlxsw: spectrum: Extend to support Spectrum-2 ASIC
Extend existing driver for Spectrum ASIC to support Spectrum-2 ASIC. Signed-off-by: Jiri Pirko <[email protected]> Signed-off-by: Ido Schimmel <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 9912e6b commit c3ab435

File tree

2 files changed

+139
-32
lines changed

2 files changed

+139
-32
lines changed

drivers/net/ethernet/mellanox/mlxsw/pci.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939

4040
#define PCI_DEVICE_ID_MELLANOX_SWITCHX2 0xc738
4141
#define PCI_DEVICE_ID_MELLANOX_SPECTRUM 0xcb84
42+
#define PCI_DEVICE_ID_MELLANOX_SPECTRUM2 0xcf6c
4243
#define PCI_DEVICE_ID_MELLANOX_SWITCHIB 0xcb20
4344
#define PCI_DEVICE_ID_MELLANOX_SWITCHIB2 0xcf08
4445

drivers/net/ethernet/mellanox/mlxsw/spectrum.c

Lines changed: 138 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,8 @@ static const struct mlxsw_fw_rev mlxsw_sp1_fw_rev = {
9191
"." __stringify(MLXSW_SP1_FWREV_MINOR) \
9292
"." __stringify(MLXSW_SP1_FWREV_SUBMINOR) ".mfa2"
9393

94-
static const char mlxsw_sp_driver_name[] = "mlxsw_spectrum";
94+
static const char mlxsw_sp1_driver_name[] = "mlxsw_spectrum";
95+
static const char mlxsw_sp2_driver_name[] = "mlxsw_spectrum2";
9596
static const char mlxsw_sp_driver_version[] = "1.0";
9697

9798
/* tx_hdr_version
@@ -1727,7 +1728,8 @@ static void mlxsw_sp_port_get_drvinfo(struct net_device *dev,
17271728
struct mlxsw_sp_port *mlxsw_sp_port = netdev_priv(dev);
17281729
struct mlxsw_sp *mlxsw_sp = mlxsw_sp_port->mlxsw_sp;
17291730

1730-
strlcpy(drvinfo->driver, mlxsw_sp_driver_name, sizeof(drvinfo->driver));
1731+
strlcpy(drvinfo->driver, mlxsw_sp->bus_info->device_kind,
1732+
sizeof(drvinfo->driver));
17311733
strlcpy(drvinfo->version, mlxsw_sp_driver_version,
17321734
sizeof(drvinfo->version));
17331735
snprintf(drvinfo->fw_version, sizeof(drvinfo->fw_version),
@@ -3696,14 +3698,6 @@ static int mlxsw_sp_init(struct mlxsw_core *mlxsw_core,
36963698
struct mlxsw_sp *mlxsw_sp = mlxsw_core_driver_priv(mlxsw_core);
36973699
int err;
36983700

3699-
mlxsw_sp->req_rev = &mlxsw_sp1_fw_rev;
3700-
mlxsw_sp->fw_filename = MLXSW_SP1_FW_FILENAME;
3701-
mlxsw_sp->kvdl_ops = &mlxsw_sp1_kvdl_ops;
3702-
mlxsw_sp->afa_ops = &mlxsw_sp1_act_afa_ops;
3703-
mlxsw_sp->afk_ops = &mlxsw_sp1_afk_ops;
3704-
mlxsw_sp->mr_tcam_ops = &mlxsw_sp1_mr_tcam_ops;
3705-
mlxsw_sp->acl_tcam_ops = &mlxsw_sp1_acl_tcam_ops;
3706-
37073701
mlxsw_sp->core = mlxsw_core;
37083702
mlxsw_sp->bus_info = mlxsw_bus_info;
37093703

@@ -3842,6 +3836,36 @@ static int mlxsw_sp_init(struct mlxsw_core *mlxsw_core,
38423836
return err;
38433837
}
38443838

3839+
static int mlxsw_sp1_init(struct mlxsw_core *mlxsw_core,
3840+
const struct mlxsw_bus_info *mlxsw_bus_info)
3841+
{
3842+
struct mlxsw_sp *mlxsw_sp = mlxsw_core_driver_priv(mlxsw_core);
3843+
3844+
mlxsw_sp->req_rev = &mlxsw_sp1_fw_rev;
3845+
mlxsw_sp->fw_filename = MLXSW_SP1_FW_FILENAME;
3846+
mlxsw_sp->kvdl_ops = &mlxsw_sp1_kvdl_ops;
3847+
mlxsw_sp->afa_ops = &mlxsw_sp1_act_afa_ops;
3848+
mlxsw_sp->afk_ops = &mlxsw_sp1_afk_ops;
3849+
mlxsw_sp->mr_tcam_ops = &mlxsw_sp1_mr_tcam_ops;
3850+
mlxsw_sp->acl_tcam_ops = &mlxsw_sp1_acl_tcam_ops;
3851+
3852+
return mlxsw_sp_init(mlxsw_core, mlxsw_bus_info);
3853+
}
3854+
3855+
static int mlxsw_sp2_init(struct mlxsw_core *mlxsw_core,
3856+
const struct mlxsw_bus_info *mlxsw_bus_info)
3857+
{
3858+
struct mlxsw_sp *mlxsw_sp = mlxsw_core_driver_priv(mlxsw_core);
3859+
3860+
mlxsw_sp->kvdl_ops = &mlxsw_sp2_kvdl_ops;
3861+
mlxsw_sp->afa_ops = &mlxsw_sp2_act_afa_ops;
3862+
mlxsw_sp->afk_ops = &mlxsw_sp2_afk_ops;
3863+
mlxsw_sp->mr_tcam_ops = &mlxsw_sp2_mr_tcam_ops;
3864+
mlxsw_sp->acl_tcam_ops = &mlxsw_sp2_acl_tcam_ops;
3865+
3866+
return mlxsw_sp_init(mlxsw_core, mlxsw_bus_info);
3867+
}
3868+
38453869
static void mlxsw_sp_fini(struct mlxsw_core *mlxsw_core)
38463870
{
38473871
struct mlxsw_sp *mlxsw_sp = mlxsw_core_driver_priv(mlxsw_core);
@@ -3862,7 +3886,7 @@ static void mlxsw_sp_fini(struct mlxsw_core *mlxsw_core)
38623886
mlxsw_sp_kvdl_fini(mlxsw_sp);
38633887
}
38643888

3865-
static const struct mlxsw_config_profile mlxsw_sp_config_profile = {
3889+
static const struct mlxsw_config_profile mlxsw_sp1_config_profile = {
38663890
.used_max_mid = 1,
38673891
.max_mid = MLXSW_SP_MID_MAX,
38683892
.used_flood_tables = 1,
@@ -3888,6 +3912,28 @@ static const struct mlxsw_config_profile mlxsw_sp_config_profile = {
38883912
},
38893913
};
38903914

3915+
static const struct mlxsw_config_profile mlxsw_sp2_config_profile = {
3916+
.used_max_mid = 1,
3917+
.max_mid = MLXSW_SP_MID_MAX,
3918+
.used_flood_tables = 1,
3919+
.used_flood_mode = 1,
3920+
.flood_mode = 3,
3921+
.max_fid_offset_flood_tables = 3,
3922+
.fid_offset_flood_table_size = VLAN_N_VID - 1,
3923+
.max_fid_flood_tables = 3,
3924+
.fid_flood_table_size = MLXSW_SP_FID_8021D_MAX,
3925+
.used_max_ib_mc = 1,
3926+
.max_ib_mc = 0,
3927+
.used_max_pkey = 1,
3928+
.max_pkey = 0,
3929+
.swid_config = {
3930+
{
3931+
.used_type = 1,
3932+
.type = MLXSW_PORT_SWID_TYPE_ETH,
3933+
}
3934+
},
3935+
};
3936+
38913937
static void
38923938
mlxsw_sp_resource_size_params_prepare(struct mlxsw_core *mlxsw_core,
38933939
struct devlink_resource_size_params *kvd_size_params,
@@ -3924,7 +3970,7 @@ mlxsw_sp_resource_size_params_prepare(struct mlxsw_core *mlxsw_core,
39243970
DEVLINK_RESOURCE_UNIT_ENTRY);
39253971
}
39263972

3927-
static int mlxsw_sp_resources_register(struct mlxsw_core *mlxsw_core)
3973+
static int mlxsw_sp1_resources_kvd_register(struct mlxsw_core *mlxsw_core)
39283974
{
39293975
struct devlink *devlink = priv_to_devlink(mlxsw_core);
39303976
struct devlink_resource_size_params hash_single_size_params;
@@ -3935,7 +3981,7 @@ static int mlxsw_sp_resources_register(struct mlxsw_core *mlxsw_core)
39353981
const struct mlxsw_config_profile *profile;
39363982
int err;
39373983

3938-
profile = &mlxsw_sp_config_profile;
3984+
profile = &mlxsw_sp1_config_profile;
39393985
if (!MLXSW_CORE_RES_VALID(mlxsw_core, KVD_SIZE))
39403986
return -EIO;
39413987

@@ -3990,6 +4036,16 @@ static int mlxsw_sp_resources_register(struct mlxsw_core *mlxsw_core)
39904036
return 0;
39914037
}
39924038

4039+
static int mlxsw_sp1_resources_register(struct mlxsw_core *mlxsw_core)
4040+
{
4041+
return mlxsw_sp1_resources_kvd_register(mlxsw_core);
4042+
}
4043+
4044+
static int mlxsw_sp2_resources_register(struct mlxsw_core *mlxsw_core)
4045+
{
4046+
return 0;
4047+
}
4048+
39934049
static int mlxsw_sp_kvd_sizes_get(struct mlxsw_core *mlxsw_core,
39944050
const struct mlxsw_config_profile *profile,
39954051
u64 *p_single_size, u64 *p_double_size,
@@ -4045,10 +4101,10 @@ static int mlxsw_sp_kvd_sizes_get(struct mlxsw_core *mlxsw_core,
40454101
return 0;
40464102
}
40474103

4048-
static struct mlxsw_driver mlxsw_sp_driver = {
4049-
.kind = mlxsw_sp_driver_name,
4104+
static struct mlxsw_driver mlxsw_sp1_driver = {
4105+
.kind = mlxsw_sp1_driver_name,
40504106
.priv_size = sizeof(struct mlxsw_sp),
4051-
.init = mlxsw_sp_init,
4107+
.init = mlxsw_sp1_init,
40524108
.fini = mlxsw_sp_fini,
40534109
.basic_trap_groups_set = mlxsw_sp_basic_trap_groups_set,
40544110
.port_split = mlxsw_sp_port_split,
@@ -4064,10 +4120,35 @@ static struct mlxsw_driver mlxsw_sp_driver = {
40644120
.sb_occ_port_pool_get = mlxsw_sp_sb_occ_port_pool_get,
40654121
.sb_occ_tc_port_bind_get = mlxsw_sp_sb_occ_tc_port_bind_get,
40664122
.txhdr_construct = mlxsw_sp_txhdr_construct,
4067-
.resources_register = mlxsw_sp_resources_register,
4123+
.resources_register = mlxsw_sp1_resources_register,
40684124
.kvd_sizes_get = mlxsw_sp_kvd_sizes_get,
40694125
.txhdr_len = MLXSW_TXHDR_LEN,
4070-
.profile = &mlxsw_sp_config_profile,
4126+
.profile = &mlxsw_sp1_config_profile,
4127+
.res_query_enabled = true,
4128+
};
4129+
4130+
static struct mlxsw_driver mlxsw_sp2_driver = {
4131+
.kind = mlxsw_sp2_driver_name,
4132+
.priv_size = sizeof(struct mlxsw_sp),
4133+
.init = mlxsw_sp2_init,
4134+
.fini = mlxsw_sp_fini,
4135+
.basic_trap_groups_set = mlxsw_sp_basic_trap_groups_set,
4136+
.port_split = mlxsw_sp_port_split,
4137+
.port_unsplit = mlxsw_sp_port_unsplit,
4138+
.sb_pool_get = mlxsw_sp_sb_pool_get,
4139+
.sb_pool_set = mlxsw_sp_sb_pool_set,
4140+
.sb_port_pool_get = mlxsw_sp_sb_port_pool_get,
4141+
.sb_port_pool_set = mlxsw_sp_sb_port_pool_set,
4142+
.sb_tc_pool_bind_get = mlxsw_sp_sb_tc_pool_bind_get,
4143+
.sb_tc_pool_bind_set = mlxsw_sp_sb_tc_pool_bind_set,
4144+
.sb_occ_snapshot = mlxsw_sp_sb_occ_snapshot,
4145+
.sb_occ_max_clear = mlxsw_sp_sb_occ_max_clear,
4146+
.sb_occ_port_pool_get = mlxsw_sp_sb_occ_port_pool_get,
4147+
.sb_occ_tc_port_bind_get = mlxsw_sp_sb_occ_tc_port_bind_get,
4148+
.txhdr_construct = mlxsw_sp_txhdr_construct,
4149+
.resources_register = mlxsw_sp2_resources_register,
4150+
.txhdr_len = MLXSW_TXHDR_LEN,
4151+
.profile = &mlxsw_sp2_config_profile,
40714152
.res_query_enabled = true,
40724153
};
40734154

@@ -4846,14 +4927,24 @@ static struct notifier_block mlxsw_sp_inet6addr_nb __read_mostly = {
48464927
.notifier_call = mlxsw_sp_inet6addr_event,
48474928
};
48484929

4849-
static const struct pci_device_id mlxsw_sp_pci_id_table[] = {
4930+
static const struct pci_device_id mlxsw_sp1_pci_id_table[] = {
48504931
{PCI_VDEVICE(MELLANOX, PCI_DEVICE_ID_MELLANOX_SPECTRUM), 0},
48514932
{0, },
48524933
};
48534934

4854-
static struct pci_driver mlxsw_sp_pci_driver = {
4855-
.name = mlxsw_sp_driver_name,
4856-
.id_table = mlxsw_sp_pci_id_table,
4935+
static struct pci_driver mlxsw_sp1_pci_driver = {
4936+
.name = mlxsw_sp1_driver_name,
4937+
.id_table = mlxsw_sp1_pci_id_table,
4938+
};
4939+
4940+
static const struct pci_device_id mlxsw_sp2_pci_id_table[] = {
4941+
{PCI_VDEVICE(MELLANOX, PCI_DEVICE_ID_MELLANOX_SPECTRUM2), 0},
4942+
{0, },
4943+
};
4944+
4945+
static struct pci_driver mlxsw_sp2_pci_driver = {
4946+
.name = mlxsw_sp2_driver_name,
4947+
.id_table = mlxsw_sp2_pci_id_table,
48574948
};
48584949

48594950
static int __init mlxsw_sp_module_init(void)
@@ -4865,19 +4956,31 @@ static int __init mlxsw_sp_module_init(void)
48654956
register_inet6addr_validator_notifier(&mlxsw_sp_inet6addr_valid_nb);
48664957
register_inet6addr_notifier(&mlxsw_sp_inet6addr_nb);
48674958

4868-
err = mlxsw_core_driver_register(&mlxsw_sp_driver);
4959+
err = mlxsw_core_driver_register(&mlxsw_sp1_driver);
4960+
if (err)
4961+
goto err_sp1_core_driver_register;
4962+
4963+
err = mlxsw_core_driver_register(&mlxsw_sp2_driver);
4964+
if (err)
4965+
goto err_sp2_core_driver_register;
4966+
4967+
err = mlxsw_pci_driver_register(&mlxsw_sp1_pci_driver);
48694968
if (err)
4870-
goto err_core_driver_register;
4969+
goto err_sp1_pci_driver_register;
48714970

4872-
err = mlxsw_pci_driver_register(&mlxsw_sp_pci_driver);
4971+
err = mlxsw_pci_driver_register(&mlxsw_sp2_pci_driver);
48734972
if (err)
4874-
goto err_pci_driver_register;
4973+
goto err_sp2_pci_driver_register;
48754974

48764975
return 0;
48774976

4878-
err_pci_driver_register:
4879-
mlxsw_core_driver_unregister(&mlxsw_sp_driver);
4880-
err_core_driver_register:
4977+
err_sp2_pci_driver_register:
4978+
mlxsw_pci_driver_unregister(&mlxsw_sp2_pci_driver);
4979+
err_sp1_pci_driver_register:
4980+
mlxsw_core_driver_unregister(&mlxsw_sp2_driver);
4981+
err_sp2_core_driver_register:
4982+
mlxsw_core_driver_unregister(&mlxsw_sp1_driver);
4983+
err_sp1_core_driver_register:
48814984
unregister_inet6addr_notifier(&mlxsw_sp_inet6addr_nb);
48824985
unregister_inet6addr_validator_notifier(&mlxsw_sp_inet6addr_valid_nb);
48834986
unregister_inetaddr_notifier(&mlxsw_sp_inetaddr_nb);
@@ -4887,8 +4990,10 @@ static int __init mlxsw_sp_module_init(void)
48874990

48884991
static void __exit mlxsw_sp_module_exit(void)
48894992
{
4890-
mlxsw_pci_driver_unregister(&mlxsw_sp_pci_driver);
4891-
mlxsw_core_driver_unregister(&mlxsw_sp_driver);
4993+
mlxsw_pci_driver_unregister(&mlxsw_sp2_pci_driver);
4994+
mlxsw_pci_driver_unregister(&mlxsw_sp1_pci_driver);
4995+
mlxsw_core_driver_unregister(&mlxsw_sp2_driver);
4996+
mlxsw_core_driver_unregister(&mlxsw_sp1_driver);
48924997
unregister_inet6addr_notifier(&mlxsw_sp_inet6addr_nb);
48934998
unregister_inet6addr_validator_notifier(&mlxsw_sp_inet6addr_valid_nb);
48944999
unregister_inetaddr_notifier(&mlxsw_sp_inetaddr_nb);
@@ -4901,5 +5006,6 @@ module_exit(mlxsw_sp_module_exit);
49015006
MODULE_LICENSE("Dual BSD/GPL");
49025007
MODULE_AUTHOR("Jiri Pirko <[email protected]>");
49035008
MODULE_DESCRIPTION("Mellanox Spectrum driver");
4904-
MODULE_DEVICE_TABLE(pci, mlxsw_sp_pci_id_table);
5009+
MODULE_DEVICE_TABLE(pci, mlxsw_sp1_pci_id_table);
5010+
MODULE_DEVICE_TABLE(pci, mlxsw_sp2_pci_id_table);
49055011
MODULE_FIRMWARE(MLXSW_SP1_FW_FILENAME);

0 commit comments

Comments
 (0)