Skip to content

Commit 8947c39

Browse files
committed
Merge branch 'mlxsw-add-spectrum-4-support'
Ido Schimmel says: ==================== mlxsw: Add Spectrum-4 support This patchset adds Spectrum-4 support in mlxsw. It builds on top of a previous patchset merged in commit 10184da ("Merge branch 'mlxsw-Spectrum-4-prep'") and makes two additional changes before adding Spectrum-4 support. Patchset overview: Patches #1-#2 add a few Spectrum-4 specific variants of existing ACL keys. The new variants are needed because the size of certain key elements (e.g., local port) was increased in Spectrum-4. Patches #3-#6 are preparations. Patch #7 implements the Spectrum-4 variant of the Bloom filter hash function. The Bloom filter is used to optimize ACL lookups by potentially skipping certain lookups if they are guaranteed not to match. See additional info in merge commit ae6750e ("Merge branch 'mlxsw-spectrum_acl-Add-Bloom-filter-support'"). Patch #8 finally adds Spectrum-4 support. ==================== Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Jakub Kicinski <[email protected]>
2 parents 42379b9 + 4735402 commit 8947c39

File tree

11 files changed

+468
-62
lines changed

11 files changed

+468
-62
lines changed

drivers/net/ethernet/mellanox/mlxsw/Kconfig

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ config MLXSW_SPECTRUM
6666
default m
6767
help
6868
This driver supports Mellanox Technologies
69-
Spectrum/Spectrum-2/Spectrum-3 Ethernet Switch ASICs.
69+
Spectrum/Spectrum-2/Spectrum-3/Spectrum-4 Ethernet Switch ASICs.
7070

7171
To compile this driver as a module, choose M here: the
7272
module will be called mlxsw_spectrum.

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,8 @@ static const struct mlxsw_afk_element_info mlxsw_afk_element_infos[] = {
3232
MLXSW_AFK_ELEMENT_INFO_U32(IP_TTL_, 0x18, 0, 8),
3333
MLXSW_AFK_ELEMENT_INFO_U32(IP_ECN, 0x18, 9, 2),
3434
MLXSW_AFK_ELEMENT_INFO_U32(IP_DSCP, 0x18, 11, 6),
35-
MLXSW_AFK_ELEMENT_INFO_U32(VIRT_ROUTER_8_10, 0x18, 17, 3),
36-
MLXSW_AFK_ELEMENT_INFO_U32(VIRT_ROUTER_0_7, 0x18, 20, 8),
35+
MLXSW_AFK_ELEMENT_INFO_U32(VIRT_ROUTER_MSB, 0x18, 17, 3),
36+
MLXSW_AFK_ELEMENT_INFO_U32(VIRT_ROUTER_LSB, 0x18, 20, 8),
3737
MLXSW_AFK_ELEMENT_INFO_BUF(SRC_IP_96_127, 0x20, 4),
3838
MLXSW_AFK_ELEMENT_INFO_BUF(SRC_IP_64_95, 0x24, 4),
3939
MLXSW_AFK_ELEMENT_INFO_BUF(SRC_IP_32_63, 0x28, 4),

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,8 @@ enum mlxsw_afk_element {
3333
MLXSW_AFK_ELEMENT_IP_TTL_,
3434
MLXSW_AFK_ELEMENT_IP_ECN,
3535
MLXSW_AFK_ELEMENT_IP_DSCP,
36-
MLXSW_AFK_ELEMENT_VIRT_ROUTER_8_10,
37-
MLXSW_AFK_ELEMENT_VIRT_ROUTER_0_7,
36+
MLXSW_AFK_ELEMENT_VIRT_ROUTER_MSB,
37+
MLXSW_AFK_ELEMENT_VIRT_ROUTER_LSB,
3838
MLXSW_AFK_ELEMENT_MAX,
3939
};
4040

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
#define PCI_DEVICE_ID_MELLANOX_SPECTRUM 0xcb84
1010
#define PCI_DEVICE_ID_MELLANOX_SPECTRUM2 0xcf6c
1111
#define PCI_DEVICE_ID_MELLANOX_SPECTRUM3 0xcf70
12+
#define PCI_DEVICE_ID_MELLANOX_SPECTRUM4 0xcf80
1213

1314
#if IS_ENABLED(CONFIG_MLXSW_PCI)
1415

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3914,6 +3914,7 @@ MLXSW_ITEM32(reg, qeec, max_shaper_bs, 0x1C, 0, 6);
39143914
#define MLXSW_REG_QEEC_LOWEST_SHAPER_BS_SP1 5
39153915
#define MLXSW_REG_QEEC_LOWEST_SHAPER_BS_SP2 11
39163916
#define MLXSW_REG_QEEC_LOWEST_SHAPER_BS_SP3 11
3917+
#define MLXSW_REG_QEEC_LOWEST_SHAPER_BS_SP4 11
39173918

39183919
static inline void mlxsw_reg_qeec_pack(char *payload, u16 local_port,
39193920
enum mlxsw_reg_qeec_hr hr, u8 index,

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

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@ static const struct mlxsw_fw_rev mlxsw_sp3_fw_rev = {
9595
static const char mlxsw_sp1_driver_name[] = "mlxsw_spectrum";
9696
static const char mlxsw_sp2_driver_name[] = "mlxsw_spectrum2";
9797
static const char mlxsw_sp3_driver_name[] = "mlxsw_spectrum3";
98+
static const char mlxsw_sp4_driver_name[] = "mlxsw_spectrum4";
9899

99100
static const unsigned char mlxsw_sp1_mac_mask[ETH_ALEN] = {
100101
0xff, 0xff, 0xff, 0xff, 0xfc, 0x00
@@ -3155,6 +3156,7 @@ static int mlxsw_sp2_init(struct mlxsw_core *mlxsw_core,
31553156
mlxsw_sp->mr_tcam_ops = &mlxsw_sp2_mr_tcam_ops;
31563157
mlxsw_sp->acl_rulei_ops = &mlxsw_sp2_acl_rulei_ops;
31573158
mlxsw_sp->acl_tcam_ops = &mlxsw_sp2_acl_tcam_ops;
3159+
mlxsw_sp->acl_bf_ops = &mlxsw_sp2_acl_bf_ops;
31583160
mlxsw_sp->nve_ops_arr = mlxsw_sp2_nve_ops_arr;
31593161
mlxsw_sp->mac_mask = mlxsw_sp2_mac_mask;
31603162
mlxsw_sp->sb_vals = &mlxsw_sp2_sb_vals;
@@ -3184,6 +3186,7 @@ static int mlxsw_sp3_init(struct mlxsw_core *mlxsw_core,
31843186
mlxsw_sp->mr_tcam_ops = &mlxsw_sp2_mr_tcam_ops;
31853187
mlxsw_sp->acl_rulei_ops = &mlxsw_sp2_acl_rulei_ops;
31863188
mlxsw_sp->acl_tcam_ops = &mlxsw_sp2_acl_tcam_ops;
3189+
mlxsw_sp->acl_bf_ops = &mlxsw_sp2_acl_bf_ops;
31873190
mlxsw_sp->nve_ops_arr = mlxsw_sp2_nve_ops_arr;
31883191
mlxsw_sp->mac_mask = mlxsw_sp2_mac_mask;
31893192
mlxsw_sp->sb_vals = &mlxsw_sp2_sb_vals;
@@ -3200,6 +3203,36 @@ static int mlxsw_sp3_init(struct mlxsw_core *mlxsw_core,
32003203
return mlxsw_sp_init(mlxsw_core, mlxsw_bus_info, extack);
32013204
}
32023205

3206+
static int mlxsw_sp4_init(struct mlxsw_core *mlxsw_core,
3207+
const struct mlxsw_bus_info *mlxsw_bus_info,
3208+
struct netlink_ext_ack *extack)
3209+
{
3210+
struct mlxsw_sp *mlxsw_sp = mlxsw_core_driver_priv(mlxsw_core);
3211+
3212+
mlxsw_sp->switchdev_ops = &mlxsw_sp2_switchdev_ops;
3213+
mlxsw_sp->kvdl_ops = &mlxsw_sp2_kvdl_ops;
3214+
mlxsw_sp->afa_ops = &mlxsw_sp2_act_afa_ops;
3215+
mlxsw_sp->afk_ops = &mlxsw_sp4_afk_ops;
3216+
mlxsw_sp->mr_tcam_ops = &mlxsw_sp2_mr_tcam_ops;
3217+
mlxsw_sp->acl_rulei_ops = &mlxsw_sp2_acl_rulei_ops;
3218+
mlxsw_sp->acl_tcam_ops = &mlxsw_sp2_acl_tcam_ops;
3219+
mlxsw_sp->acl_bf_ops = &mlxsw_sp4_acl_bf_ops;
3220+
mlxsw_sp->nve_ops_arr = mlxsw_sp2_nve_ops_arr;
3221+
mlxsw_sp->mac_mask = mlxsw_sp2_mac_mask;
3222+
mlxsw_sp->sb_vals = &mlxsw_sp2_sb_vals;
3223+
mlxsw_sp->sb_ops = &mlxsw_sp3_sb_ops;
3224+
mlxsw_sp->port_type_speed_ops = &mlxsw_sp2_port_type_speed_ops;
3225+
mlxsw_sp->ptp_ops = &mlxsw_sp2_ptp_ops;
3226+
mlxsw_sp->span_ops = &mlxsw_sp3_span_ops;
3227+
mlxsw_sp->policer_core_ops = &mlxsw_sp2_policer_core_ops;
3228+
mlxsw_sp->trap_ops = &mlxsw_sp2_trap_ops;
3229+
mlxsw_sp->mall_ops = &mlxsw_sp2_mall_ops;
3230+
mlxsw_sp->router_ops = &mlxsw_sp2_router_ops;
3231+
mlxsw_sp->lowest_shaper_bs = MLXSW_REG_QEEC_LOWEST_SHAPER_BS_SP4;
3232+
3233+
return mlxsw_sp_init(mlxsw_core, mlxsw_bus_info, extack);
3234+
}
3235+
32033236
static void mlxsw_sp_fini(struct mlxsw_core *mlxsw_core)
32043237
{
32053238
struct mlxsw_sp *mlxsw_sp = mlxsw_core_driver_priv(mlxsw_core);
@@ -3759,6 +3792,45 @@ static struct mlxsw_driver mlxsw_sp3_driver = {
37593792
.temp_warn_enabled = true,
37603793
};
37613794

3795+
static struct mlxsw_driver mlxsw_sp4_driver = {
3796+
.kind = mlxsw_sp4_driver_name,
3797+
.priv_size = sizeof(struct mlxsw_sp),
3798+
.init = mlxsw_sp4_init,
3799+
.fini = mlxsw_sp_fini,
3800+
.basic_trap_groups_set = mlxsw_sp_basic_trap_groups_set,
3801+
.port_split = mlxsw_sp_port_split,
3802+
.port_unsplit = mlxsw_sp_port_unsplit,
3803+
.sb_pool_get = mlxsw_sp_sb_pool_get,
3804+
.sb_pool_set = mlxsw_sp_sb_pool_set,
3805+
.sb_port_pool_get = mlxsw_sp_sb_port_pool_get,
3806+
.sb_port_pool_set = mlxsw_sp_sb_port_pool_set,
3807+
.sb_tc_pool_bind_get = mlxsw_sp_sb_tc_pool_bind_get,
3808+
.sb_tc_pool_bind_set = mlxsw_sp_sb_tc_pool_bind_set,
3809+
.sb_occ_snapshot = mlxsw_sp_sb_occ_snapshot,
3810+
.sb_occ_max_clear = mlxsw_sp_sb_occ_max_clear,
3811+
.sb_occ_port_pool_get = mlxsw_sp_sb_occ_port_pool_get,
3812+
.sb_occ_tc_port_bind_get = mlxsw_sp_sb_occ_tc_port_bind_get,
3813+
.trap_init = mlxsw_sp_trap_init,
3814+
.trap_fini = mlxsw_sp_trap_fini,
3815+
.trap_action_set = mlxsw_sp_trap_action_set,
3816+
.trap_group_init = mlxsw_sp_trap_group_init,
3817+
.trap_group_set = mlxsw_sp_trap_group_set,
3818+
.trap_policer_init = mlxsw_sp_trap_policer_init,
3819+
.trap_policer_fini = mlxsw_sp_trap_policer_fini,
3820+
.trap_policer_set = mlxsw_sp_trap_policer_set,
3821+
.trap_policer_counter_get = mlxsw_sp_trap_policer_counter_get,
3822+
.txhdr_construct = mlxsw_sp_txhdr_construct,
3823+
.resources_register = mlxsw_sp2_resources_register,
3824+
.params_register = mlxsw_sp2_params_register,
3825+
.params_unregister = mlxsw_sp2_params_unregister,
3826+
.ptp_transmitted = mlxsw_sp_ptp_transmitted,
3827+
.txhdr_len = MLXSW_TXHDR_LEN,
3828+
.profile = &mlxsw_sp2_config_profile,
3829+
.res_query_enabled = true,
3830+
.fw_fatal_enabled = true,
3831+
.temp_warn_enabled = true,
3832+
};
3833+
37623834
bool mlxsw_sp_port_dev_check(const struct net_device *dev)
37633835
{
37643836
return dev->netdev_ops == &mlxsw_sp_port_netdev_ops;
@@ -4926,6 +4998,16 @@ static struct pci_driver mlxsw_sp3_pci_driver = {
49264998
.id_table = mlxsw_sp3_pci_id_table,
49274999
};
49285000

5001+
static const struct pci_device_id mlxsw_sp4_pci_id_table[] = {
5002+
{PCI_VDEVICE(MELLANOX, PCI_DEVICE_ID_MELLANOX_SPECTRUM4), 0},
5003+
{0, },
5004+
};
5005+
5006+
static struct pci_driver mlxsw_sp4_pci_driver = {
5007+
.name = mlxsw_sp4_driver_name,
5008+
.id_table = mlxsw_sp4_pci_id_table,
5009+
};
5010+
49295011
static int __init mlxsw_sp_module_init(void)
49305012
{
49315013
int err;
@@ -4945,6 +5027,10 @@ static int __init mlxsw_sp_module_init(void)
49455027
if (err)
49465028
goto err_sp3_core_driver_register;
49475029

5030+
err = mlxsw_core_driver_register(&mlxsw_sp4_driver);
5031+
if (err)
5032+
goto err_sp4_core_driver_register;
5033+
49485034
err = mlxsw_pci_driver_register(&mlxsw_sp1_pci_driver);
49495035
if (err)
49505036
goto err_sp1_pci_driver_register;
@@ -4957,13 +5043,21 @@ static int __init mlxsw_sp_module_init(void)
49575043
if (err)
49585044
goto err_sp3_pci_driver_register;
49595045

5046+
err = mlxsw_pci_driver_register(&mlxsw_sp4_pci_driver);
5047+
if (err)
5048+
goto err_sp4_pci_driver_register;
5049+
49605050
return 0;
49615051

5052+
err_sp4_pci_driver_register:
5053+
mlxsw_pci_driver_unregister(&mlxsw_sp3_pci_driver);
49625054
err_sp3_pci_driver_register:
49635055
mlxsw_pci_driver_unregister(&mlxsw_sp2_pci_driver);
49645056
err_sp2_pci_driver_register:
49655057
mlxsw_pci_driver_unregister(&mlxsw_sp1_pci_driver);
49665058
err_sp1_pci_driver_register:
5059+
mlxsw_core_driver_unregister(&mlxsw_sp4_driver);
5060+
err_sp4_core_driver_register:
49675061
mlxsw_core_driver_unregister(&mlxsw_sp3_driver);
49685062
err_sp3_core_driver_register:
49695063
mlxsw_core_driver_unregister(&mlxsw_sp2_driver);
@@ -4977,9 +5071,11 @@ static int __init mlxsw_sp_module_init(void)
49775071

49785072
static void __exit mlxsw_sp_module_exit(void)
49795073
{
5074+
mlxsw_pci_driver_unregister(&mlxsw_sp4_pci_driver);
49805075
mlxsw_pci_driver_unregister(&mlxsw_sp3_pci_driver);
49815076
mlxsw_pci_driver_unregister(&mlxsw_sp2_pci_driver);
49825077
mlxsw_pci_driver_unregister(&mlxsw_sp1_pci_driver);
5078+
mlxsw_core_driver_unregister(&mlxsw_sp4_driver);
49835079
mlxsw_core_driver_unregister(&mlxsw_sp3_driver);
49845080
mlxsw_core_driver_unregister(&mlxsw_sp2_driver);
49855081
mlxsw_core_driver_unregister(&mlxsw_sp1_driver);
@@ -4996,6 +5092,7 @@ MODULE_DESCRIPTION("Mellanox Spectrum driver");
49965092
MODULE_DEVICE_TABLE(pci, mlxsw_sp1_pci_id_table);
49975093
MODULE_DEVICE_TABLE(pci, mlxsw_sp2_pci_id_table);
49985094
MODULE_DEVICE_TABLE(pci, mlxsw_sp3_pci_id_table);
5095+
MODULE_DEVICE_TABLE(pci, mlxsw_sp4_pci_id_table);
49995096
MODULE_FIRMWARE(MLXSW_SP1_FW_FILENAME);
50005097
MODULE_FIRMWARE(MLXSW_SP2_FW_FILENAME);
50015098
MODULE_FIRMWARE(MLXSW_SP3_FW_FILENAME);

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,7 @@ struct mlxsw_sp {
190190
const struct mlxsw_sp_mr_tcam_ops *mr_tcam_ops;
191191
const struct mlxsw_sp_acl_rulei_ops *acl_rulei_ops;
192192
const struct mlxsw_sp_acl_tcam_ops *acl_tcam_ops;
193+
const struct mlxsw_sp_acl_bf_ops *acl_bf_ops;
193194
const struct mlxsw_sp_nve_ops **nve_ops_arr;
194195
const struct mlxsw_sp_sb_vals *sb_vals;
195196
const struct mlxsw_sp_sb_ops *sb_ops;
@@ -1106,6 +1107,11 @@ extern const struct mlxsw_afa_ops mlxsw_sp2_act_afa_ops;
11061107
/* spectrum_acl_flex_keys.c */
11071108
extern const struct mlxsw_afk_ops mlxsw_sp1_afk_ops;
11081109
extern const struct mlxsw_afk_ops mlxsw_sp2_afk_ops;
1110+
extern const struct mlxsw_afk_ops mlxsw_sp4_afk_ops;
1111+
1112+
/* spectrum_acl_bloom_filter.c */
1113+
extern const struct mlxsw_sp_acl_bf_ops mlxsw_sp2_acl_bf_ops;
1114+
extern const struct mlxsw_sp_acl_bf_ops mlxsw_sp4_acl_bf_ops;
11091115

11101116
/* spectrum_matchall.c */
11111117
struct mlxsw_sp_mall_ops {

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

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,8 @@ static int mlxsw_sp2_mr_tcam_bind_group(struct mlxsw_sp *mlxsw_sp,
4545
}
4646

4747
static const enum mlxsw_afk_element mlxsw_sp2_mr_tcam_usage_ipv4[] = {
48-
MLXSW_AFK_ELEMENT_VIRT_ROUTER_8_10,
49-
MLXSW_AFK_ELEMENT_VIRT_ROUTER_0_7,
48+
MLXSW_AFK_ELEMENT_VIRT_ROUTER_MSB,
49+
MLXSW_AFK_ELEMENT_VIRT_ROUTER_LSB,
5050
MLXSW_AFK_ELEMENT_SRC_IP_0_31,
5151
MLXSW_AFK_ELEMENT_DST_IP_0_31,
5252
};
@@ -89,8 +89,8 @@ static void mlxsw_sp2_mr_tcam_ipv4_fini(struct mlxsw_sp2_mr_tcam *mr_tcam)
8989
}
9090

9191
static const enum mlxsw_afk_element mlxsw_sp2_mr_tcam_usage_ipv6[] = {
92-
MLXSW_AFK_ELEMENT_VIRT_ROUTER_8_10,
93-
MLXSW_AFK_ELEMENT_VIRT_ROUTER_0_7,
92+
MLXSW_AFK_ELEMENT_VIRT_ROUTER_MSB,
93+
MLXSW_AFK_ELEMENT_VIRT_ROUTER_LSB,
9494
MLXSW_AFK_ELEMENT_SRC_IP_96_127,
9595
MLXSW_AFK_ELEMENT_SRC_IP_64_95,
9696
MLXSW_AFK_ELEMENT_SRC_IP_32_63,
@@ -189,10 +189,10 @@ mlxsw_sp2_mr_tcam_rule_parse(struct mlxsw_sp_acl_rule *rule,
189189

190190
rulei = mlxsw_sp_acl_rule_rulei(rule);
191191
rulei->priority = priority;
192-
mlxsw_sp_acl_rulei_keymask_u32(rulei, MLXSW_AFK_ELEMENT_VIRT_ROUTER_0_7,
192+
mlxsw_sp_acl_rulei_keymask_u32(rulei, MLXSW_AFK_ELEMENT_VIRT_ROUTER_LSB,
193193
key->vrid, GENMASK(7, 0));
194194
mlxsw_sp_acl_rulei_keymask_u32(rulei,
195-
MLXSW_AFK_ELEMENT_VIRT_ROUTER_8_10,
195+
MLXSW_AFK_ELEMENT_VIRT_ROUTER_MSB,
196196
key->vrid >> 8, GENMASK(2, 0));
197197
switch (key->proto) {
198198
case MLXSW_SP_L3_PROTO_IPV4:

0 commit comments

Comments
 (0)