net/mlx5: DR, Allow SW steering for sw_owner_v2 devices

[ Upstream commit 64f45c0fc4c71f577506c5a7a7956ae3bc3388ea ]

Allow sw_owner_v2 based on sw_format_version.

Signed-off-by: Alex Vesker <valex@nvidia.com>
Signed-off-by: Yevgeny Kliteynik <kliteyn@nvidia.com>
Signed-off-by: Saeed Mahameed <saeedm@nvidia.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
Yevgeny Kliteynik
2021-01-25 02:26:45 +02:00
committed by Greg Kroah-Hartman
parent 792f16e083
commit 3623bfcab3
4 changed files with 29 additions and 16 deletions

View File

@@ -78,9 +78,9 @@ int mlx5dr_cmd_query_esw_caps(struct mlx5_core_dev *mdev,
caps->uplink_icm_address_tx = caps->uplink_icm_address_tx =
MLX5_CAP64_ESW_FLOWTABLE(mdev, MLX5_CAP64_ESW_FLOWTABLE(mdev,
sw_steering_uplink_icm_address_tx); sw_steering_uplink_icm_address_tx);
caps->sw_owner = caps->sw_owner_v2 = MLX5_CAP_ESW_FLOWTABLE_FDB(mdev, sw_owner_v2);
MLX5_CAP_ESW_FLOWTABLE_FDB(mdev, if (!caps->sw_owner_v2)
sw_owner); caps->sw_owner = MLX5_CAP_ESW_FLOWTABLE_FDB(mdev, sw_owner);
return 0; return 0;
} }
@@ -113,11 +113,16 @@ int mlx5dr_cmd_query_device(struct mlx5_core_dev *mdev,
caps->nic_tx_allow_address = caps->nic_tx_allow_address =
MLX5_CAP64_FLOWTABLE(mdev, sw_steering_nic_tx_action_allow_icm_address); MLX5_CAP64_FLOWTABLE(mdev, sw_steering_nic_tx_action_allow_icm_address);
caps->rx_sw_owner = MLX5_CAP_FLOWTABLE_NIC_RX(mdev, sw_owner); caps->rx_sw_owner_v2 = MLX5_CAP_FLOWTABLE_NIC_RX(mdev, sw_owner_v2);
caps->max_ft_level = MLX5_CAP_FLOWTABLE_NIC_RX(mdev, max_ft_level); caps->tx_sw_owner_v2 = MLX5_CAP_FLOWTABLE_NIC_TX(mdev, sw_owner_v2);
if (!caps->rx_sw_owner_v2)
caps->rx_sw_owner = MLX5_CAP_FLOWTABLE_NIC_RX(mdev, sw_owner);
if (!caps->tx_sw_owner_v2)
caps->tx_sw_owner = MLX5_CAP_FLOWTABLE_NIC_TX(mdev, sw_owner); caps->tx_sw_owner = MLX5_CAP_FLOWTABLE_NIC_TX(mdev, sw_owner);
caps->max_ft_level = MLX5_CAP_FLOWTABLE_NIC_RX(mdev, max_ft_level);
caps->log_icm_size = MLX5_CAP_DEV_MEM(mdev, log_steering_sw_icm_size); caps->log_icm_size = MLX5_CAP_DEV_MEM(mdev, log_steering_sw_icm_size);
caps->hdr_modify_icm_addr = caps->hdr_modify_icm_addr =
MLX5_CAP64_DEV_MEM(mdev, header_modify_sw_icm_start_address); MLX5_CAP64_DEV_MEM(mdev, header_modify_sw_icm_start_address);

View File

@@ -4,6 +4,11 @@
#include <linux/mlx5/eswitch.h> #include <linux/mlx5/eswitch.h>
#include "dr_types.h" #include "dr_types.h"
#define DR_DOMAIN_SW_STEERING_SUPPORTED(dmn, dmn_type) \
((dmn)->info.caps.dmn_type##_sw_owner || \
((dmn)->info.caps.dmn_type##_sw_owner_v2 && \
(dmn)->info.caps.sw_format_ver <= MLX5_STEERING_FORMAT_CONNECTX_6DX))
static int dr_domain_init_cache(struct mlx5dr_domain *dmn) static int dr_domain_init_cache(struct mlx5dr_domain *dmn)
{ {
/* Per vport cached FW FT for checksum recalculation, this /* Per vport cached FW FT for checksum recalculation, this
@@ -181,6 +186,7 @@ static int dr_domain_query_fdb_caps(struct mlx5_core_dev *mdev,
return ret; return ret;
dmn->info.caps.fdb_sw_owner = dmn->info.caps.esw_caps.sw_owner; dmn->info.caps.fdb_sw_owner = dmn->info.caps.esw_caps.sw_owner;
dmn->info.caps.fdb_sw_owner_v2 = dmn->info.caps.esw_caps.sw_owner_v2;
dmn->info.caps.esw_rx_drop_address = dmn->info.caps.esw_caps.drop_icm_address_rx; dmn->info.caps.esw_rx_drop_address = dmn->info.caps.esw_caps.drop_icm_address_rx;
dmn->info.caps.esw_tx_drop_address = dmn->info.caps.esw_caps.drop_icm_address_tx; dmn->info.caps.esw_tx_drop_address = dmn->info.caps.esw_caps.drop_icm_address_tx;
@@ -223,18 +229,13 @@ static int dr_domain_caps_init(struct mlx5_core_dev *mdev,
if (ret) if (ret)
return ret; return ret;
if (dmn->info.caps.sw_format_ver != MLX5_STEERING_FORMAT_CONNECTX_5) {
mlx5dr_err(dmn, "SW steering is not supported on this device\n");
return -EOPNOTSUPP;
}
ret = dr_domain_query_fdb_caps(mdev, dmn); ret = dr_domain_query_fdb_caps(mdev, dmn);
if (ret) if (ret)
return ret; return ret;
switch (dmn->type) { switch (dmn->type) {
case MLX5DR_DOMAIN_TYPE_NIC_RX: case MLX5DR_DOMAIN_TYPE_NIC_RX:
if (!dmn->info.caps.rx_sw_owner) if (!DR_DOMAIN_SW_STEERING_SUPPORTED(dmn, rx))
return -ENOTSUPP; return -ENOTSUPP;
dmn->info.supp_sw_steering = true; dmn->info.supp_sw_steering = true;
@@ -243,7 +244,7 @@ static int dr_domain_caps_init(struct mlx5_core_dev *mdev,
dmn->info.rx.drop_icm_addr = dmn->info.caps.nic_rx_drop_address; dmn->info.rx.drop_icm_addr = dmn->info.caps.nic_rx_drop_address;
break; break;
case MLX5DR_DOMAIN_TYPE_NIC_TX: case MLX5DR_DOMAIN_TYPE_NIC_TX:
if (!dmn->info.caps.tx_sw_owner) if (!DR_DOMAIN_SW_STEERING_SUPPORTED(dmn, tx))
return -ENOTSUPP; return -ENOTSUPP;
dmn->info.supp_sw_steering = true; dmn->info.supp_sw_steering = true;
@@ -255,7 +256,7 @@ static int dr_domain_caps_init(struct mlx5_core_dev *mdev,
if (!dmn->info.caps.eswitch_manager) if (!dmn->info.caps.eswitch_manager)
return -ENOTSUPP; return -ENOTSUPP;
if (!dmn->info.caps.fdb_sw_owner) if (!DR_DOMAIN_SW_STEERING_SUPPORTED(dmn, fdb))
return -ENOTSUPP; return -ENOTSUPP;
dmn->info.rx.ste_type = MLX5DR_STE_TYPE_RX; dmn->info.rx.ste_type = MLX5DR_STE_TYPE_RX;

View File

@@ -597,7 +597,8 @@ struct mlx5dr_esw_caps {
u64 drop_icm_address_tx; u64 drop_icm_address_tx;
u64 uplink_icm_address_rx; u64 uplink_icm_address_rx;
u64 uplink_icm_address_tx; u64 uplink_icm_address_tx;
bool sw_owner; u8 sw_owner:1;
u8 sw_owner_v2:1;
}; };
struct mlx5dr_cmd_vport_cap { struct mlx5dr_cmd_vport_cap {
@@ -630,6 +631,9 @@ struct mlx5dr_cmd_caps {
bool rx_sw_owner; bool rx_sw_owner;
bool tx_sw_owner; bool tx_sw_owner;
bool fdb_sw_owner; bool fdb_sw_owner;
u8 rx_sw_owner_v2:1;
u8 tx_sw_owner_v2:1;
u8 fdb_sw_owner_v2:1;
u32 num_vports; u32 num_vports;
struct mlx5dr_esw_caps esw_caps; struct mlx5dr_esw_caps esw_caps;
struct mlx5dr_cmd_vport_cap *vports_caps; struct mlx5dr_cmd_vport_cap *vports_caps;

View File

@@ -124,7 +124,10 @@ int mlx5dr_action_destroy(struct mlx5dr_action *action);
static inline bool static inline bool
mlx5dr_is_supported(struct mlx5_core_dev *dev) mlx5dr_is_supported(struct mlx5_core_dev *dev)
{ {
return MLX5_CAP_ESW_FLOWTABLE_FDB(dev, sw_owner); return MLX5_CAP_ESW_FLOWTABLE_FDB(dev, sw_owner) ||
(MLX5_CAP_ESW_FLOWTABLE_FDB(dev, sw_owner_v2) &&
(MLX5_CAP_GEN(dev, steering_format_version) <=
MLX5_STEERING_FORMAT_CONNECTX_6DX));
} }
#endif /* _MLX5DR_H_ */ #endif /* _MLX5DR_H_ */