net/mlx5: E-Switch, Replace host_params event with functions_changed event
authorVu Pham <vuhuong@mellanox.com>
Wed, 29 May 2019 22:50:34 +0000 (22:50 +0000)
committerSaeed Mahameed <saeedm@mellanox.com>
Fri, 31 May 2019 19:28:14 +0000 (12:28 -0700)
To support sriov on a E-Switch manager, num_vfs are queried
to the firmware whenever E-Switch manager is notified by
esw_functions_changed event.

Replace host_params event with esw_functions_changed event that reflects
more appropriate naming.

While at it, also correct num_vfs type from int to u16 as expected by
the function mlx5_esw_query_functions().

Signed-off-by: Vu Pham <vuhuong@mellanox.com>
Reviewed-by: Parav Pandit <parav@mellanox.com>
Reviewed-by: Bodong Wang <bodong@mellanox.com>
Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
drivers/net/ethernet/mellanox/mlx5/core/cmd.c
drivers/net/ethernet/mellanox/mlx5/core/ecpf.c
drivers/net/ethernet/mellanox/mlx5/core/ecpf.h
drivers/net/ethernet/mellanox/mlx5/core/eq.c
drivers/net/ethernet/mellanox/mlx5/core/eswitch.c
drivers/net/ethernet/mellanox/mlx5/core/eswitch.h
drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c
drivers/net/ethernet/mellanox/mlx5/core/events.c
include/linux/mlx5/device.h
include/linux/mlx5/mlx5_ifc.h

index 937ba4b..7d3aec9 100644 (file)
@@ -316,7 +316,7 @@ static int mlx5_internal_err_ret_value(struct mlx5_core_dev *dev, u16 op,
        case MLX5_CMD_OP_DESTROY_GENERAL_OBJECT:
        case MLX5_CMD_OP_DEALLOC_MEMIC:
        case MLX5_CMD_OP_PAGE_FAULT_RESUME:
-       case MLX5_CMD_OP_QUERY_HOST_PARAMS:
+       case MLX5_CMD_OP_QUERY_ESW_FUNCTIONS:
                return MLX5_CMD_STAT_OK;
 
        case MLX5_CMD_OP_QUERY_HCA_CAP:
@@ -628,7 +628,7 @@ const char *mlx5_command_str(int command)
        MLX5_COMMAND_STR_CASE(QUERY_MODIFY_HEADER_CONTEXT);
        MLX5_COMMAND_STR_CASE(ALLOC_MEMIC);
        MLX5_COMMAND_STR_CASE(DEALLOC_MEMIC);
-       MLX5_COMMAND_STR_CASE(QUERY_HOST_PARAMS);
+       MLX5_COMMAND_STR_CASE(QUERY_ESW_FUNCTIONS);
        default: return "unknown command opcode";
        }
 }
index 4746f2d..1bcf8b8 100644 (file)
@@ -83,30 +83,3 @@ void mlx5_ec_cleanup(struct mlx5_core_dev *dev)
 
        mlx5_peer_pf_cleanup(dev);
 }
-
-static int mlx5_query_host_params_context(struct mlx5_core_dev *dev,
-                                         u32 *out, int outlen)
-{
-       u32 in[MLX5_ST_SZ_DW(query_host_params_in)] = {};
-
-       MLX5_SET(query_host_params_in, in, opcode,
-                MLX5_CMD_OP_QUERY_HOST_PARAMS);
-
-       return mlx5_cmd_exec(dev, in, sizeof(in), out, outlen);
-}
-
-int mlx5_query_host_params_num_vfs(struct mlx5_core_dev *dev, int *num_vf)
-{
-       u32 out[MLX5_ST_SZ_DW(query_host_params_out)] = {};
-       int err;
-
-       err = mlx5_query_host_params_context(dev, out, sizeof(out));
-       if (err)
-               return err;
-
-       *num_vf = MLX5_GET(query_host_params_out, out,
-                          host_params_context.host_num_of_vfs);
-       mlx5_core_dbg(dev, "host_num_of_vfs %d\n", *num_vf);
-
-       return 0;
-}
index 346372d..d3d7a00 100644 (file)
@@ -16,7 +16,6 @@ enum {
 bool mlx5_read_embedded_cpu(struct mlx5_core_dev *dev);
 int mlx5_ec_init(struct mlx5_core_dev *dev);
 void mlx5_ec_cleanup(struct mlx5_core_dev *dev);
-int mlx5_query_host_params_num_vfs(struct mlx5_core_dev *dev, int *num_vf);
 
 #else  /* CONFIG_MLX5_ESWITCH */
 
@@ -24,9 +23,6 @@ static inline bool
 mlx5_read_embedded_cpu(struct mlx5_core_dev *dev) { return false; }
 static inline int mlx5_ec_init(struct mlx5_core_dev *dev) { return 0; }
 static inline void mlx5_ec_cleanup(struct mlx5_core_dev *dev) {}
-static inline int
-mlx5_query_host_params_num_vfs(struct mlx5_core_dev *dev, int *num_vf)
-{ return -EOPNOTSUPP; }
 
 #endif /* CONFIG_MLX5_ESWITCH */
 
index 23883d1..052bd70 100644 (file)
@@ -534,7 +534,8 @@ static u64 gather_async_events_mask(struct mlx5_core_dev *dev)
                async_event_mask |= (1ull << MLX5_EVENT_TYPE_MONITOR_COUNTER);
 
        if (mlx5_core_is_ecpf_esw_manager(dev))
-               async_event_mask |= (1ull << MLX5_EVENT_TYPE_HOST_PARAMS_CHANGE);
+               async_event_mask |=
+                       (1ull << MLX5_EVENT_TYPE_ESW_FUNCTIONS_CHANGED);
 
        return async_event_mask;
 }
index 9ea0ccf..d893523 100644 (file)
@@ -1686,13 +1686,41 @@ static int eswitch_vport_event(struct notifier_block *nb,
        return NOTIFY_OK;
 }
 
+static int query_esw_functions(struct mlx5_core_dev *dev,
+                              u32 *out, int outlen)
+{
+       u32 in[MLX5_ST_SZ_DW(query_esw_functions_in)] = {0};
+
+       MLX5_SET(query_esw_functions_in, in, opcode,
+                MLX5_CMD_OP_QUERY_ESW_FUNCTIONS);
+
+       return mlx5_cmd_exec(dev, in, sizeof(in), out, outlen);
+}
+
+int mlx5_esw_query_functions(struct mlx5_core_dev *dev, u16 *num_vfs)
+{
+       u32 out[MLX5_ST_SZ_DW(query_esw_functions_out)] = {0};
+       int err;
+
+       err = query_esw_functions(dev, out, sizeof(out));
+       if (err)
+               return err;
+
+       *num_vfs = MLX5_GET(query_esw_functions_out, out,
+                           host_params_context.host_num_of_vfs);
+       esw_debug(dev, "host_num_of_vfs=%d\n", *num_vfs);
+
+       return 0;
+}
+
 /* Public E-Switch API */
 #define ESW_ALLOWED(esw) ((esw) && MLX5_ESWITCH_MANAGER((esw)->dev))
 
 int mlx5_eswitch_enable_sriov(struct mlx5_eswitch *esw, int nvfs, int mode)
 {
-       int vf_nvports = 0, total_nvports = 0;
        struct mlx5_vport *vport;
+       int total_nvports = 0;
+       u16 vf_nvports = 0;
        int err;
        int i, enabled_events;
 
@@ -1712,7 +1740,7 @@ int mlx5_eswitch_enable_sriov(struct mlx5_eswitch *esw, int nvfs, int mode)
 
        if (mode == SRIOV_OFFLOADS) {
                if (mlx5_core_is_ecpf_esw_manager(esw->dev)) {
-                       err = mlx5_query_host_params_num_vfs(esw->dev, &vf_nvports);
+                       err = mlx5_esw_query_functions(esw->dev, &vf_nvports);
                        if (err)
                                return err;
                        total_nvports = esw->total_vports;
index ed3fad6..320dd83 100644 (file)
@@ -190,7 +190,7 @@ struct mlx5_host_work {
        struct mlx5_eswitch     *esw;
 };
 
-struct mlx5_host_info {
+struct mlx5_esw_functions {
        struct mlx5_nb          nb;
        u16                     num_vfs;
 };
@@ -219,7 +219,7 @@ struct mlx5_eswitch {
        int                     mode;
        int                     nvports;
        u16                     manager_vport;
-       struct mlx5_host_info   host_info;
+       struct mlx5_esw_functions esw_funcs;
 };
 
 void esw_offloads_cleanup(struct mlx5_eswitch *esw);
@@ -386,6 +386,8 @@ bool mlx5_esw_lag_prereq(struct mlx5_core_dev *dev0,
 bool mlx5_esw_multipath_prereq(struct mlx5_core_dev *dev0,
                               struct mlx5_core_dev *dev1);
 
+int mlx5_esw_query_functions(struct mlx5_core_dev *dev, u16 *num_vfs);
+
 #define MLX5_DEBUG_ESWITCH_MASK BIT(3)
 
 #define esw_info(__dev, format, ...)                   \
index e09ae27..8368967 100644 (file)
@@ -41,7 +41,6 @@
 #include "en.h"
 #include "fs_core.h"
 #include "lib/devcom.h"
-#include "ecpf.h"
 #include "lib/eq.h"
 
 /* There are two match-all miss flows, one for unicast dst mac and
@@ -1782,57 +1781,79 @@ static void esw_offloads_steering_cleanup(struct mlx5_eswitch *esw)
                esw_prio_tag_acls_cleanup(esw);
 }
 
-static void esw_host_params_event_handler(struct work_struct *work)
+static void esw_functions_changed_event_handler(struct work_struct *work)
 {
        struct mlx5_host_work *host_work;
        struct mlx5_eswitch *esw;
-       int err, num_vf = 0;
+       u16 num_vfs = 0;
+       int err;
 
        host_work = container_of(work, struct mlx5_host_work, work);
        esw = host_work->esw;
 
-       err = mlx5_query_host_params_num_vfs(esw->dev, &num_vf);
-       if (err || num_vf == esw->host_info.num_vfs)
+       err = mlx5_esw_query_functions(esw->dev, &num_vfs);
+       if (err || num_vfs == esw->esw_funcs.num_vfs)
                goto out;
 
        /* Number of VFs can only change from "0 to x" or "x to 0". */
-       if (esw->host_info.num_vfs > 0) {
-               esw_offloads_unload_vf_reps(esw, esw->host_info.num_vfs);
+       if (esw->esw_funcs.num_vfs > 0) {
+               esw_offloads_unload_vf_reps(esw, esw->esw_funcs.num_vfs);
        } else {
-               err = esw_offloads_load_vf_reps(esw, num_vf);
+               err = esw_offloads_load_vf_reps(esw, num_vfs);
 
                if (err)
                        goto out;
        }
 
-       esw->host_info.num_vfs = num_vf;
+       esw->esw_funcs.num_vfs = num_vfs;
 
 out:
        kfree(host_work);
 }
 
-static int esw_host_params_event(struct notifier_block *nb,
-                                unsigned long type, void *data)
+static int esw_functions_changed_event(struct notifier_block *nb,
+                                      unsigned long type, void *data)
 {
+       struct mlx5_esw_functions *esw_funcs;
        struct mlx5_host_work *host_work;
-       struct mlx5_host_info *host_info;
        struct mlx5_eswitch *esw;
 
        host_work = kzalloc(sizeof(*host_work), GFP_ATOMIC);
        if (!host_work)
                return NOTIFY_DONE;
 
-       host_info = mlx5_nb_cof(nb, struct mlx5_host_info, nb);
-       esw = container_of(host_info, struct mlx5_eswitch, host_info);
+       esw_funcs = mlx5_nb_cof(nb, struct mlx5_esw_functions, nb);
+       esw = container_of(esw_funcs, struct mlx5_eswitch, esw_funcs);
 
        host_work->esw = esw;
 
-       INIT_WORK(&host_work->work, esw_host_params_event_handler);
+       INIT_WORK(&host_work->work, esw_functions_changed_event_handler);
        queue_work(esw->work_queue, &host_work->work);
 
        return NOTIFY_OK;
 }
 
+static void esw_functions_changed_event_init(struct mlx5_eswitch *esw,
+                                            u16 vf_nvports)
+{
+       if (!mlx5_core_is_ecpf_esw_manager(esw->dev))
+               return;
+
+       MLX5_NB_INIT(&esw->esw_funcs.nb, esw_functions_changed_event,
+                    ESW_FUNCTIONS_CHANGED);
+       mlx5_eq_notifier_register(esw->dev, &esw->esw_funcs.nb);
+       esw->esw_funcs.num_vfs = vf_nvports;
+}
+
+static void esw_functions_changed_event_cleanup(struct mlx5_eswitch *esw)
+{
+       if (!mlx5_core_is_ecpf_esw_manager(esw->dev))
+               return;
+
+       mlx5_eq_notifier_unregister(esw->dev, &esw->esw_funcs.nb);
+       flush_workqueue(esw->work_queue);
+}
+
 int esw_offloads_init(struct mlx5_eswitch *esw, int vf_nvports,
                      int total_nvports)
 {
@@ -1848,12 +1869,7 @@ int esw_offloads_init(struct mlx5_eswitch *esw, int vf_nvports,
 
        esw_offloads_devcom_init(esw);
 
-       if (mlx5_core_is_ecpf_esw_manager(esw->dev)) {
-               MLX5_NB_INIT(&esw->host_info.nb, esw_host_params_event,
-                            HOST_PARAMS_CHANGE);
-               mlx5_eq_notifier_register(esw->dev, &esw->host_info.nb);
-               esw->host_info.num_vfs = vf_nvports;
-       }
+       esw_functions_changed_event_init(esw, vf_nvports);
 
        mlx5_rdma_enable_roce(esw->dev);
 
@@ -1887,13 +1903,12 @@ void esw_offloads_cleanup(struct mlx5_eswitch *esw)
 {
        u16 num_vfs;
 
-       if (mlx5_core_is_ecpf_esw_manager(esw->dev)) {
-               mlx5_eq_notifier_unregister(esw->dev, &esw->host_info.nb);
-               flush_workqueue(esw->work_queue);
-               num_vfs = esw->host_info.num_vfs;
-       } else {
+       esw_functions_changed_event_cleanup(esw);
+
+       if (mlx5_core_is_ecpf_esw_manager(esw->dev))
+               num_vfs = esw->esw_funcs.num_vfs;
+       else
                num_vfs = esw->dev->priv.sriov.num_vfs;
-       }
 
        mlx5_rdma_disable_roce(esw->dev);
        esw_offloads_devcom_cleanup(esw);
index a81e8d2..8bcf342 100644 (file)
@@ -108,8 +108,8 @@ static const char *eqe_type_str(u8 type)
                return "MLX5_EVENT_TYPE_STALL_EVENT";
        case MLX5_EVENT_TYPE_CMD:
                return "MLX5_EVENT_TYPE_CMD";
-       case MLX5_EVENT_TYPE_HOST_PARAMS_CHANGE:
-               return "MLX5_EVENT_TYPE_HOST_PARAMS_CHANGE";
+       case MLX5_EVENT_TYPE_ESW_FUNCTIONS_CHANGED:
+               return "MLX5_EVENT_TYPE_ESW_FUNCTIONS_CHANGED";
        case MLX5_EVENT_TYPE_PAGE_REQUEST:
                return "MLX5_EVENT_TYPE_PAGE_REQUEST";
        case MLX5_EVENT_TYPE_PAGE_FAULT:
index fc2b6e8..5e76006 100644 (file)
@@ -342,7 +342,7 @@ enum mlx5_event {
        MLX5_EVENT_TYPE_PAGE_FAULT         = 0xc,
        MLX5_EVENT_TYPE_NIC_VPORT_CHANGE   = 0xd,
 
-       MLX5_EVENT_TYPE_HOST_PARAMS_CHANGE = 0xe,
+       MLX5_EVENT_TYPE_ESW_FUNCTIONS_CHANGED = 0xe,
 
        MLX5_EVENT_TYPE_DCT_DRAINED        = 0x1c,
 
index feaa909..0780242 100644 (file)
@@ -155,7 +155,7 @@ enum {
        MLX5_CMD_OP_QUERY_XRQ_DC_PARAMS_ENTRY     = 0x725,
        MLX5_CMD_OP_SET_XRQ_DC_PARAMS_ENTRY       = 0x726,
        MLX5_CMD_OP_QUERY_XRQ_ERROR_PARAMS        = 0x727,
-       MLX5_CMD_OP_QUERY_HOST_PARAMS             = 0x740,
+       MLX5_CMD_OP_QUERY_ESW_FUNCTIONS           = 0x740,
        MLX5_CMD_OP_QUERY_VPORT_STATE             = 0x750,
        MLX5_CMD_OP_MODIFY_VPORT_STATE            = 0x751,
        MLX5_CMD_OP_QUERY_ESW_VPORT_CONTEXT       = 0x752,
@@ -9721,7 +9721,7 @@ struct mlx5_ifc_host_params_context_bits {
        u8         reserved_at_80[0x180];
 };
 
-struct mlx5_ifc_query_host_params_in_bits {
+struct mlx5_ifc_query_esw_functions_in_bits {
        u8         opcode[0x10];
        u8         reserved_at_10[0x10];
 
@@ -9731,7 +9731,7 @@ struct mlx5_ifc_query_host_params_in_bits {
        u8         reserved_at_40[0x40];
 };
 
-struct mlx5_ifc_query_host_params_out_bits {
+struct mlx5_ifc_query_esw_functions_out_bits {
        u8         status[0x8];
        u8         reserved_at_8[0x18];