]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
net/mlx5: DR, Allow SW steering for sw_owner_v2 devices
authorYevgeny Kliteynik <kliteyn@nvidia.com>
Mon, 25 Jan 2021 00:26:45 +0000 (02:26 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 23 Jun 2021 12:42:43 +0000 (14:42 +0200)
[ 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>
drivers/net/ethernet/mellanox/mlx5/core/steering/dr_cmd.c
drivers/net/ethernet/mellanox/mlx5/core/steering/dr_domain.c
drivers/net/ethernet/mellanox/mlx5/core/steering/dr_types.h
drivers/net/ethernet/mellanox/mlx5/core/steering/mlx5dr.h

index 51bbd88ff021cce252c6dc1738279c55bbf89075..fd56cae0d54fc4e6a725775634735643e26a0b36 100644 (file)
@@ -78,9 +78,9 @@ int mlx5dr_cmd_query_esw_caps(struct mlx5_core_dev *mdev,
        caps->uplink_icm_address_tx =
                MLX5_CAP64_ESW_FLOWTABLE(mdev,
                                         sw_steering_uplink_icm_address_tx);
-       caps->sw_owner =
-               MLX5_CAP_ESW_FLOWTABLE_FDB(mdev,
-                                          sw_owner);
+       caps->sw_owner_v2 = MLX5_CAP_ESW_FLOWTABLE_FDB(mdev, sw_owner_v2);
+       if (!caps->sw_owner_v2)
+               caps->sw_owner = MLX5_CAP_ESW_FLOWTABLE_FDB(mdev, sw_owner);
 
        return 0;
 }
@@ -113,10 +113,15 @@ int mlx5dr_cmd_query_device(struct mlx5_core_dev *mdev,
        caps->nic_tx_allow_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->max_ft_level = MLX5_CAP_FLOWTABLE_NIC_RX(mdev, max_ft_level);
+       caps->rx_sw_owner_v2 = MLX5_CAP_FLOWTABLE_NIC_RX(mdev, sw_owner_v2);
+       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->hdr_modify_icm_addr =
index aa2c2d6c44e6bb26a9ad500c63df30c1319a4293..00d861361428f30532a225157e375c831658f6fb 100644 (file)
@@ -4,6 +4,11 @@
 #include <linux/mlx5/eswitch.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)
 {
        /* 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;
 
        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_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)
                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);
        if (ret)
                return ret;
 
        switch (dmn->type) {
        case MLX5DR_DOMAIN_TYPE_NIC_RX:
-               if (!dmn->info.caps.rx_sw_owner)
+               if (!DR_DOMAIN_SW_STEERING_SUPPORTED(dmn, rx))
                        return -ENOTSUPP;
 
                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;
                break;
        case MLX5DR_DOMAIN_TYPE_NIC_TX:
-               if (!dmn->info.caps.tx_sw_owner)
+               if (!DR_DOMAIN_SW_STEERING_SUPPORTED(dmn, tx))
                        return -ENOTSUPP;
 
                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)
                        return -ENOTSUPP;
 
-               if (!dmn->info.caps.fdb_sw_owner)
+               if (!DR_DOMAIN_SW_STEERING_SUPPORTED(dmn, fdb))
                        return -ENOTSUPP;
 
                dmn->info.rx.ste_type = MLX5DR_STE_TYPE_RX;
index cf62ea4f882e68df95cd2dd69275b5eff35e5a6c..42c49f09e9d3fe488fe9e92f57f86100f54b227d 100644 (file)
@@ -597,7 +597,8 @@ struct mlx5dr_esw_caps {
        u64 drop_icm_address_tx;
        u64 uplink_icm_address_rx;
        u64 uplink_icm_address_tx;
-       bool sw_owner;
+       u8 sw_owner:1;
+       u8 sw_owner_v2:1;
 };
 
 struct mlx5dr_cmd_vport_cap {
@@ -630,6 +631,9 @@ struct mlx5dr_cmd_caps {
        bool rx_sw_owner;
        bool tx_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;
        struct mlx5dr_esw_caps esw_caps;
        struct mlx5dr_cmd_vport_cap *vports_caps;
index 7914fe3fc68d8dd276093ea80c6419bb4d37bf63..6f3db8dc896cb4c1e736e832bba74af06d0b0f9c 100644 (file)
@@ -124,7 +124,10 @@ int mlx5dr_action_destroy(struct mlx5dr_action *action);
 static inline bool
 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_ */