Merge branch 'devlink-parama-cleanup'
Jiri Pirko says: ==================== devlink: Cleanup params usage This patchset takes care of small cleanup of devlink params usage. Some of the patches (first 2/3) are cosmetic, but I would like to point couple of interesting ones: Patch 9 is the main one of this set and introduces devlink instance locking for params, similar to other devlink objects. That allows params to be registered/unregistered when devlink instance is registered. Patches 10-12 change mlx5 code to register non-driverinit params in the code they are related to, and thanks to patch 8 this might be when devlink instance is registered - for example during devlink reload. --- v1->v2: - Just small fix in the last patch ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
commit
c2ea552065
@ -1411,25 +1411,9 @@ ice_devlink_set_switch_id(struct ice_pf *pf, struct netdev_phys_item_id *ppid)
|
||||
int ice_devlink_register_params(struct ice_pf *pf)
|
||||
{
|
||||
struct devlink *devlink = priv_to_devlink(pf);
|
||||
union devlink_param_value value;
|
||||
int err;
|
||||
|
||||
err = devlink_params_register(devlink, ice_devlink_params,
|
||||
ARRAY_SIZE(ice_devlink_params));
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
value.vbool = false;
|
||||
devlink_param_driverinit_value_set(devlink,
|
||||
DEVLINK_PARAM_GENERIC_ID_ENABLE_IWARP,
|
||||
value);
|
||||
|
||||
value.vbool = test_bit(ICE_FLAG_RDMA_ENA, pf->flags) ? true : false;
|
||||
devlink_param_driverinit_value_set(devlink,
|
||||
DEVLINK_PARAM_GENERIC_ID_ENABLE_ROCE,
|
||||
value);
|
||||
|
||||
return 0;
|
||||
return devlink_params_register(devlink, ice_devlink_params,
|
||||
ARRAY_SIZE(ice_devlink_params));
|
||||
}
|
||||
|
||||
void ice_devlink_unregister_params(struct ice_pf *pf)
|
||||
|
@ -265,29 +265,29 @@ static void mlx4_devlink_set_params_init_values(struct devlink *devlink)
|
||||
union devlink_param_value value;
|
||||
|
||||
value.vbool = !!mlx4_internal_err_reset;
|
||||
devlink_param_driverinit_value_set(devlink,
|
||||
DEVLINK_PARAM_GENERIC_ID_INT_ERR_RESET,
|
||||
value);
|
||||
devl_param_driverinit_value_set(devlink,
|
||||
DEVLINK_PARAM_GENERIC_ID_INT_ERR_RESET,
|
||||
value);
|
||||
|
||||
value.vu32 = 1UL << log_num_mac;
|
||||
devlink_param_driverinit_value_set(devlink,
|
||||
DEVLINK_PARAM_GENERIC_ID_MAX_MACS,
|
||||
value);
|
||||
devl_param_driverinit_value_set(devlink,
|
||||
DEVLINK_PARAM_GENERIC_ID_MAX_MACS,
|
||||
value);
|
||||
|
||||
value.vbool = enable_64b_cqe_eqe;
|
||||
devlink_param_driverinit_value_set(devlink,
|
||||
MLX4_DEVLINK_PARAM_ID_ENABLE_64B_CQE_EQE,
|
||||
value);
|
||||
devl_param_driverinit_value_set(devlink,
|
||||
MLX4_DEVLINK_PARAM_ID_ENABLE_64B_CQE_EQE,
|
||||
value);
|
||||
|
||||
value.vbool = enable_4k_uar;
|
||||
devlink_param_driverinit_value_set(devlink,
|
||||
MLX4_DEVLINK_PARAM_ID_ENABLE_4K_UAR,
|
||||
value);
|
||||
devl_param_driverinit_value_set(devlink,
|
||||
MLX4_DEVLINK_PARAM_ID_ENABLE_4K_UAR,
|
||||
value);
|
||||
|
||||
value.vbool = false;
|
||||
devlink_param_driverinit_value_set(devlink,
|
||||
DEVLINK_PARAM_GENERIC_ID_REGION_SNAPSHOT,
|
||||
value);
|
||||
devl_param_driverinit_value_set(devlink,
|
||||
DEVLINK_PARAM_GENERIC_ID_REGION_SNAPSHOT,
|
||||
value);
|
||||
}
|
||||
|
||||
static inline void mlx4_set_num_reserved_uars(struct mlx4_dev *dev,
|
||||
@ -3910,37 +3910,37 @@ static void mlx4_devlink_param_load_driverinit_values(struct devlink *devlink)
|
||||
union devlink_param_value saved_value;
|
||||
int err;
|
||||
|
||||
err = devlink_param_driverinit_value_get(devlink,
|
||||
DEVLINK_PARAM_GENERIC_ID_INT_ERR_RESET,
|
||||
&saved_value);
|
||||
err = devl_param_driverinit_value_get(devlink,
|
||||
DEVLINK_PARAM_GENERIC_ID_INT_ERR_RESET,
|
||||
&saved_value);
|
||||
if (!err && mlx4_internal_err_reset != saved_value.vbool) {
|
||||
mlx4_internal_err_reset = saved_value.vbool;
|
||||
/* Notify on value changed on runtime configuration mode */
|
||||
devlink_param_value_changed(devlink,
|
||||
DEVLINK_PARAM_GENERIC_ID_INT_ERR_RESET);
|
||||
devl_param_value_changed(devlink,
|
||||
DEVLINK_PARAM_GENERIC_ID_INT_ERR_RESET);
|
||||
}
|
||||
err = devlink_param_driverinit_value_get(devlink,
|
||||
DEVLINK_PARAM_GENERIC_ID_MAX_MACS,
|
||||
&saved_value);
|
||||
err = devl_param_driverinit_value_get(devlink,
|
||||
DEVLINK_PARAM_GENERIC_ID_MAX_MACS,
|
||||
&saved_value);
|
||||
if (!err)
|
||||
log_num_mac = order_base_2(saved_value.vu32);
|
||||
err = devlink_param_driverinit_value_get(devlink,
|
||||
MLX4_DEVLINK_PARAM_ID_ENABLE_64B_CQE_EQE,
|
||||
&saved_value);
|
||||
err = devl_param_driverinit_value_get(devlink,
|
||||
MLX4_DEVLINK_PARAM_ID_ENABLE_64B_CQE_EQE,
|
||||
&saved_value);
|
||||
if (!err)
|
||||
enable_64b_cqe_eqe = saved_value.vbool;
|
||||
err = devlink_param_driverinit_value_get(devlink,
|
||||
MLX4_DEVLINK_PARAM_ID_ENABLE_4K_UAR,
|
||||
&saved_value);
|
||||
err = devl_param_driverinit_value_get(devlink,
|
||||
MLX4_DEVLINK_PARAM_ID_ENABLE_4K_UAR,
|
||||
&saved_value);
|
||||
if (!err)
|
||||
enable_4k_uar = saved_value.vbool;
|
||||
err = devlink_param_driverinit_value_get(devlink,
|
||||
DEVLINK_PARAM_GENERIC_ID_REGION_SNAPSHOT,
|
||||
&saved_value);
|
||||
err = devl_param_driverinit_value_get(devlink,
|
||||
DEVLINK_PARAM_GENERIC_ID_REGION_SNAPSHOT,
|
||||
&saved_value);
|
||||
if (!err && crdump->snapshot_enable != saved_value.vbool) {
|
||||
crdump->snapshot_enable = saved_value.vbool;
|
||||
devlink_param_value_changed(devlink,
|
||||
DEVLINK_PARAM_GENERIC_ID_REGION_SNAPSHOT);
|
||||
devl_param_value_changed(devlink,
|
||||
DEVLINK_PARAM_GENERIC_ID_REGION_SNAPSHOT);
|
||||
}
|
||||
}
|
||||
|
||||
@ -4021,8 +4021,8 @@ static int mlx4_init_one(struct pci_dev *pdev, const struct pci_device_id *id)
|
||||
mutex_init(&dev->persist->interface_state_mutex);
|
||||
mutex_init(&dev->persist->pci_status_mutex);
|
||||
|
||||
ret = devlink_params_register(devlink, mlx4_devlink_params,
|
||||
ARRAY_SIZE(mlx4_devlink_params));
|
||||
ret = devl_params_register(devlink, mlx4_devlink_params,
|
||||
ARRAY_SIZE(mlx4_devlink_params));
|
||||
if (ret)
|
||||
goto err_devlink_unregister;
|
||||
mlx4_devlink_set_params_init_values(devlink);
|
||||
@ -4037,8 +4037,8 @@ static int mlx4_init_one(struct pci_dev *pdev, const struct pci_device_id *id)
|
||||
return 0;
|
||||
|
||||
err_params_unregister:
|
||||
devlink_params_unregister(devlink, mlx4_devlink_params,
|
||||
ARRAY_SIZE(mlx4_devlink_params));
|
||||
devl_params_unregister(devlink, mlx4_devlink_params,
|
||||
ARRAY_SIZE(mlx4_devlink_params));
|
||||
err_devlink_unregister:
|
||||
kfree(dev->persist);
|
||||
err_devlink_free:
|
||||
@ -4181,8 +4181,8 @@ static void mlx4_remove_one(struct pci_dev *pdev)
|
||||
|
||||
pci_release_regions(pdev);
|
||||
mlx4_pci_disable_device(dev);
|
||||
devlink_params_unregister(devlink, mlx4_devlink_params,
|
||||
ARRAY_SIZE(mlx4_devlink_params));
|
||||
devl_params_unregister(devlink, mlx4_devlink_params,
|
||||
ARRAY_SIZE(mlx4_devlink_params));
|
||||
kfree(dev->persist);
|
||||
devl_unlock(devlink);
|
||||
devlink_free(devlink);
|
||||
|
@ -114,9 +114,9 @@ static bool is_eth_enabled(struct mlx5_core_dev *dev)
|
||||
union devlink_param_value val;
|
||||
int err;
|
||||
|
||||
err = devlink_param_driverinit_value_get(priv_to_devlink(dev),
|
||||
DEVLINK_PARAM_GENERIC_ID_ENABLE_ETH,
|
||||
&val);
|
||||
err = devl_param_driverinit_value_get(priv_to_devlink(dev),
|
||||
DEVLINK_PARAM_GENERIC_ID_ENABLE_ETH,
|
||||
&val);
|
||||
return err ? false : val.vbool;
|
||||
}
|
||||
|
||||
@ -147,9 +147,9 @@ static bool is_vnet_enabled(struct mlx5_core_dev *dev)
|
||||
union devlink_param_value val;
|
||||
int err;
|
||||
|
||||
err = devlink_param_driverinit_value_get(priv_to_devlink(dev),
|
||||
DEVLINK_PARAM_GENERIC_ID_ENABLE_VNET,
|
||||
&val);
|
||||
err = devl_param_driverinit_value_get(priv_to_devlink(dev),
|
||||
DEVLINK_PARAM_GENERIC_ID_ENABLE_VNET,
|
||||
&val);
|
||||
return err ? false : val.vbool;
|
||||
}
|
||||
|
||||
@ -221,9 +221,9 @@ static bool is_ib_enabled(struct mlx5_core_dev *dev)
|
||||
union devlink_param_value val;
|
||||
int err;
|
||||
|
||||
err = devlink_param_driverinit_value_get(priv_to_devlink(dev),
|
||||
DEVLINK_PARAM_GENERIC_ID_ENABLE_RDMA,
|
||||
&val);
|
||||
err = devl_param_driverinit_value_get(priv_to_devlink(dev),
|
||||
DEVLINK_PARAM_GENERIC_ID_ENABLE_RDMA,
|
||||
&val);
|
||||
return err ? false : val.vbool;
|
||||
}
|
||||
|
||||
|
@ -396,70 +396,6 @@ void mlx5_devlink_free(struct devlink *devlink)
|
||||
devlink_free(devlink);
|
||||
}
|
||||
|
||||
static int mlx5_devlink_fs_mode_validate(struct devlink *devlink, u32 id,
|
||||
union devlink_param_value val,
|
||||
struct netlink_ext_ack *extack)
|
||||
{
|
||||
struct mlx5_core_dev *dev = devlink_priv(devlink);
|
||||
char *value = val.vstr;
|
||||
int err = 0;
|
||||
|
||||
if (!strcmp(value, "dmfs")) {
|
||||
return 0;
|
||||
} else if (!strcmp(value, "smfs")) {
|
||||
u8 eswitch_mode;
|
||||
bool smfs_cap;
|
||||
|
||||
eswitch_mode = mlx5_eswitch_mode(dev);
|
||||
smfs_cap = mlx5_fs_dr_is_supported(dev);
|
||||
|
||||
if (!smfs_cap) {
|
||||
err = -EOPNOTSUPP;
|
||||
NL_SET_ERR_MSG_MOD(extack,
|
||||
"Software managed steering is not supported by current device");
|
||||
}
|
||||
|
||||
else if (eswitch_mode == MLX5_ESWITCH_OFFLOADS) {
|
||||
NL_SET_ERR_MSG_MOD(extack,
|
||||
"Software managed steering is not supported when eswitch offloads enabled.");
|
||||
err = -EOPNOTSUPP;
|
||||
}
|
||||
} else {
|
||||
NL_SET_ERR_MSG_MOD(extack,
|
||||
"Bad parameter: supported values are [\"dmfs\", \"smfs\"]");
|
||||
err = -EINVAL;
|
||||
}
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
static int mlx5_devlink_fs_mode_set(struct devlink *devlink, u32 id,
|
||||
struct devlink_param_gset_ctx *ctx)
|
||||
{
|
||||
struct mlx5_core_dev *dev = devlink_priv(devlink);
|
||||
enum mlx5_flow_steering_mode mode;
|
||||
|
||||
if (!strcmp(ctx->val.vstr, "smfs"))
|
||||
mode = MLX5_FLOW_STEERING_MODE_SMFS;
|
||||
else
|
||||
mode = MLX5_FLOW_STEERING_MODE_DMFS;
|
||||
dev->priv.steering->mode = mode;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int mlx5_devlink_fs_mode_get(struct devlink *devlink, u32 id,
|
||||
struct devlink_param_gset_ctx *ctx)
|
||||
{
|
||||
struct mlx5_core_dev *dev = devlink_priv(devlink);
|
||||
|
||||
if (dev->priv.steering->mode == MLX5_FLOW_STEERING_MODE_SMFS)
|
||||
strcpy(ctx->val.vstr, "smfs");
|
||||
else
|
||||
strcpy(ctx->val.vstr, "dmfs");
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int mlx5_devlink_enable_roce_validate(struct devlink *devlink, u32 id,
|
||||
union devlink_param_value val,
|
||||
struct netlink_ext_ack *extack)
|
||||
@ -496,69 +432,8 @@ static int mlx5_devlink_large_group_num_validate(struct devlink *devlink, u32 id
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int mlx5_devlink_esw_port_metadata_set(struct devlink *devlink, u32 id,
|
||||
struct devlink_param_gset_ctx *ctx)
|
||||
{
|
||||
struct mlx5_core_dev *dev = devlink_priv(devlink);
|
||||
|
||||
if (!MLX5_ESWITCH_MANAGER(dev))
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
return mlx5_esw_offloads_vport_metadata_set(dev->priv.eswitch, ctx->val.vbool);
|
||||
}
|
||||
|
||||
static int mlx5_devlink_esw_port_metadata_get(struct devlink *devlink, u32 id,
|
||||
struct devlink_param_gset_ctx *ctx)
|
||||
{
|
||||
struct mlx5_core_dev *dev = devlink_priv(devlink);
|
||||
|
||||
if (!MLX5_ESWITCH_MANAGER(dev))
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
ctx->val.vbool = mlx5_eswitch_vport_match_metadata_enabled(dev->priv.eswitch);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int mlx5_devlink_esw_port_metadata_validate(struct devlink *devlink, u32 id,
|
||||
union devlink_param_value val,
|
||||
struct netlink_ext_ack *extack)
|
||||
{
|
||||
struct mlx5_core_dev *dev = devlink_priv(devlink);
|
||||
u8 esw_mode;
|
||||
|
||||
if (!MLX5_ESWITCH_MANAGER(dev)) {
|
||||
NL_SET_ERR_MSG_MOD(extack, "E-Switch is unsupported");
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
esw_mode = mlx5_eswitch_mode(dev);
|
||||
if (esw_mode == MLX5_ESWITCH_OFFLOADS) {
|
||||
NL_SET_ERR_MSG_MOD(extack,
|
||||
"E-Switch must either disabled or non switchdev mode");
|
||||
return -EBUSY;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
static int mlx5_devlink_enable_remote_dev_reset_set(struct devlink *devlink, u32 id,
|
||||
struct devlink_param_gset_ctx *ctx)
|
||||
{
|
||||
struct mlx5_core_dev *dev = devlink_priv(devlink);
|
||||
|
||||
mlx5_fw_reset_enable_remote_dev_reset_set(dev, ctx->val.vbool);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int mlx5_devlink_enable_remote_dev_reset_get(struct devlink *devlink, u32 id,
|
||||
struct devlink_param_gset_ctx *ctx)
|
||||
{
|
||||
struct mlx5_core_dev *dev = devlink_priv(devlink);
|
||||
|
||||
ctx->val.vbool = mlx5_fw_reset_enable_remote_dev_reset_get(dev);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int mlx5_devlink_eq_depth_validate(struct devlink *devlink, u32 id,
|
||||
union devlink_param_value val,
|
||||
struct netlink_ext_ack *extack)
|
||||
@ -567,11 +442,6 @@ static int mlx5_devlink_eq_depth_validate(struct devlink *devlink, u32 id,
|
||||
}
|
||||
|
||||
static const struct devlink_param mlx5_devlink_params[] = {
|
||||
DEVLINK_PARAM_DRIVER(MLX5_DEVLINK_PARAM_ID_FLOW_STEERING_MODE,
|
||||
"flow_steering_mode", DEVLINK_PARAM_TYPE_STRING,
|
||||
BIT(DEVLINK_PARAM_CMODE_RUNTIME),
|
||||
mlx5_devlink_fs_mode_get, mlx5_devlink_fs_mode_set,
|
||||
mlx5_devlink_fs_mode_validate),
|
||||
DEVLINK_PARAM_GENERIC(ENABLE_ROCE, BIT(DEVLINK_PARAM_CMODE_DRIVERINIT),
|
||||
NULL, NULL, mlx5_devlink_enable_roce_validate),
|
||||
#ifdef CONFIG_MLX5_ESWITCH
|
||||
@ -580,16 +450,7 @@ static const struct devlink_param mlx5_devlink_params[] = {
|
||||
BIT(DEVLINK_PARAM_CMODE_DRIVERINIT),
|
||||
NULL, NULL,
|
||||
mlx5_devlink_large_group_num_validate),
|
||||
DEVLINK_PARAM_DRIVER(MLX5_DEVLINK_PARAM_ID_ESW_PORT_METADATA,
|
||||
"esw_port_metadata", DEVLINK_PARAM_TYPE_BOOL,
|
||||
BIT(DEVLINK_PARAM_CMODE_RUNTIME),
|
||||
mlx5_devlink_esw_port_metadata_get,
|
||||
mlx5_devlink_esw_port_metadata_set,
|
||||
mlx5_devlink_esw_port_metadata_validate),
|
||||
#endif
|
||||
DEVLINK_PARAM_GENERIC(ENABLE_REMOTE_DEV_RESET, BIT(DEVLINK_PARAM_CMODE_RUNTIME),
|
||||
mlx5_devlink_enable_remote_dev_reset_get,
|
||||
mlx5_devlink_enable_remote_dev_reset_set, NULL),
|
||||
DEVLINK_PARAM_GENERIC(IO_EQ_SIZE, BIT(DEVLINK_PARAM_CMODE_DRIVERINIT),
|
||||
NULL, NULL, mlx5_devlink_eq_depth_validate),
|
||||
DEVLINK_PARAM_GENERIC(EVENT_EQ_SIZE, BIT(DEVLINK_PARAM_CMODE_DRIVERINIT),
|
||||
@ -602,33 +463,34 @@ static void mlx5_devlink_set_params_init_values(struct devlink *devlink)
|
||||
union devlink_param_value value;
|
||||
|
||||
value.vbool = MLX5_CAP_GEN(dev, roce);
|
||||
devlink_param_driverinit_value_set(devlink,
|
||||
DEVLINK_PARAM_GENERIC_ID_ENABLE_ROCE,
|
||||
value);
|
||||
devl_param_driverinit_value_set(devlink,
|
||||
DEVLINK_PARAM_GENERIC_ID_ENABLE_ROCE,
|
||||
value);
|
||||
|
||||
#ifdef CONFIG_MLX5_ESWITCH
|
||||
value.vu32 = ESW_OFFLOADS_DEFAULT_NUM_GROUPS;
|
||||
devlink_param_driverinit_value_set(devlink,
|
||||
MLX5_DEVLINK_PARAM_ID_ESW_LARGE_GROUP_NUM,
|
||||
value);
|
||||
devl_param_driverinit_value_set(devlink,
|
||||
MLX5_DEVLINK_PARAM_ID_ESW_LARGE_GROUP_NUM,
|
||||
value);
|
||||
#endif
|
||||
|
||||
value.vu32 = MLX5_COMP_EQ_SIZE;
|
||||
devlink_param_driverinit_value_set(devlink,
|
||||
DEVLINK_PARAM_GENERIC_ID_IO_EQ_SIZE,
|
||||
value);
|
||||
devl_param_driverinit_value_set(devlink,
|
||||
DEVLINK_PARAM_GENERIC_ID_IO_EQ_SIZE,
|
||||
value);
|
||||
|
||||
value.vu32 = MLX5_NUM_ASYNC_EQE;
|
||||
devlink_param_driverinit_value_set(devlink,
|
||||
DEVLINK_PARAM_GENERIC_ID_EVENT_EQ_SIZE,
|
||||
value);
|
||||
devl_param_driverinit_value_set(devlink,
|
||||
DEVLINK_PARAM_GENERIC_ID_EVENT_EQ_SIZE,
|
||||
value);
|
||||
}
|
||||
|
||||
static const struct devlink_param enable_eth_param =
|
||||
static const struct devlink_param mlx5_devlink_eth_params[] = {
|
||||
DEVLINK_PARAM_GENERIC(ENABLE_ETH, BIT(DEVLINK_PARAM_CMODE_DRIVERINIT),
|
||||
NULL, NULL, NULL);
|
||||
NULL, NULL, NULL),
|
||||
};
|
||||
|
||||
static int mlx5_devlink_eth_param_register(struct devlink *devlink)
|
||||
static int mlx5_devlink_eth_params_register(struct devlink *devlink)
|
||||
{
|
||||
struct mlx5_core_dev *dev = devlink_priv(devlink);
|
||||
union devlink_param_value value;
|
||||
@ -637,25 +499,27 @@ static int mlx5_devlink_eth_param_register(struct devlink *devlink)
|
||||
if (!mlx5_eth_supported(dev))
|
||||
return 0;
|
||||
|
||||
err = devlink_param_register(devlink, &enable_eth_param);
|
||||
err = devl_params_register(devlink, mlx5_devlink_eth_params,
|
||||
ARRAY_SIZE(mlx5_devlink_eth_params));
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
value.vbool = true;
|
||||
devlink_param_driverinit_value_set(devlink,
|
||||
DEVLINK_PARAM_GENERIC_ID_ENABLE_ETH,
|
||||
value);
|
||||
devl_param_driverinit_value_set(devlink,
|
||||
DEVLINK_PARAM_GENERIC_ID_ENABLE_ETH,
|
||||
value);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void mlx5_devlink_eth_param_unregister(struct devlink *devlink)
|
||||
static void mlx5_devlink_eth_params_unregister(struct devlink *devlink)
|
||||
{
|
||||
struct mlx5_core_dev *dev = devlink_priv(devlink);
|
||||
|
||||
if (!mlx5_eth_supported(dev))
|
||||
return;
|
||||
|
||||
devlink_param_unregister(devlink, &enable_eth_param);
|
||||
devl_params_unregister(devlink, mlx5_devlink_eth_params,
|
||||
ARRAY_SIZE(mlx5_devlink_eth_params));
|
||||
}
|
||||
|
||||
static int mlx5_devlink_enable_rdma_validate(struct devlink *devlink, u32 id,
|
||||
@ -670,11 +534,12 @@ static int mlx5_devlink_enable_rdma_validate(struct devlink *devlink, u32 id,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct devlink_param enable_rdma_param =
|
||||
static const struct devlink_param mlx5_devlink_rdma_params[] = {
|
||||
DEVLINK_PARAM_GENERIC(ENABLE_RDMA, BIT(DEVLINK_PARAM_CMODE_DRIVERINIT),
|
||||
NULL, NULL, mlx5_devlink_enable_rdma_validate);
|
||||
NULL, NULL, mlx5_devlink_enable_rdma_validate),
|
||||
};
|
||||
|
||||
static int mlx5_devlink_rdma_param_register(struct devlink *devlink)
|
||||
static int mlx5_devlink_rdma_params_register(struct devlink *devlink)
|
||||
{
|
||||
union devlink_param_value value;
|
||||
int err;
|
||||
@ -682,30 +547,33 @@ static int mlx5_devlink_rdma_param_register(struct devlink *devlink)
|
||||
if (!IS_ENABLED(CONFIG_MLX5_INFINIBAND))
|
||||
return 0;
|
||||
|
||||
err = devlink_param_register(devlink, &enable_rdma_param);
|
||||
err = devl_params_register(devlink, mlx5_devlink_rdma_params,
|
||||
ARRAY_SIZE(mlx5_devlink_rdma_params));
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
value.vbool = true;
|
||||
devlink_param_driverinit_value_set(devlink,
|
||||
DEVLINK_PARAM_GENERIC_ID_ENABLE_RDMA,
|
||||
value);
|
||||
devl_param_driverinit_value_set(devlink,
|
||||
DEVLINK_PARAM_GENERIC_ID_ENABLE_RDMA,
|
||||
value);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void mlx5_devlink_rdma_param_unregister(struct devlink *devlink)
|
||||
static void mlx5_devlink_rdma_params_unregister(struct devlink *devlink)
|
||||
{
|
||||
if (!IS_ENABLED(CONFIG_MLX5_INFINIBAND))
|
||||
return;
|
||||
|
||||
devlink_param_unregister(devlink, &enable_rdma_param);
|
||||
devl_params_unregister(devlink, mlx5_devlink_rdma_params,
|
||||
ARRAY_SIZE(mlx5_devlink_rdma_params));
|
||||
}
|
||||
|
||||
static const struct devlink_param enable_vnet_param =
|
||||
static const struct devlink_param mlx5_devlink_vnet_params[] = {
|
||||
DEVLINK_PARAM_GENERIC(ENABLE_VNET, BIT(DEVLINK_PARAM_CMODE_DRIVERINIT),
|
||||
NULL, NULL, NULL);
|
||||
NULL, NULL, NULL),
|
||||
};
|
||||
|
||||
static int mlx5_devlink_vnet_param_register(struct devlink *devlink)
|
||||
static int mlx5_devlink_vnet_params_register(struct devlink *devlink)
|
||||
{
|
||||
struct mlx5_core_dev *dev = devlink_priv(devlink);
|
||||
union devlink_param_value value;
|
||||
@ -714,56 +582,58 @@ static int mlx5_devlink_vnet_param_register(struct devlink *devlink)
|
||||
if (!mlx5_vnet_supported(dev))
|
||||
return 0;
|
||||
|
||||
err = devlink_param_register(devlink, &enable_vnet_param);
|
||||
err = devl_params_register(devlink, mlx5_devlink_vnet_params,
|
||||
ARRAY_SIZE(mlx5_devlink_vnet_params));
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
value.vbool = true;
|
||||
devlink_param_driverinit_value_set(devlink,
|
||||
DEVLINK_PARAM_GENERIC_ID_ENABLE_VNET,
|
||||
value);
|
||||
devl_param_driverinit_value_set(devlink,
|
||||
DEVLINK_PARAM_GENERIC_ID_ENABLE_VNET,
|
||||
value);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void mlx5_devlink_vnet_param_unregister(struct devlink *devlink)
|
||||
static void mlx5_devlink_vnet_params_unregister(struct devlink *devlink)
|
||||
{
|
||||
struct mlx5_core_dev *dev = devlink_priv(devlink);
|
||||
|
||||
if (!mlx5_vnet_supported(dev))
|
||||
return;
|
||||
|
||||
devlink_param_unregister(devlink, &enable_vnet_param);
|
||||
devl_params_unregister(devlink, mlx5_devlink_vnet_params,
|
||||
ARRAY_SIZE(mlx5_devlink_vnet_params));
|
||||
}
|
||||
|
||||
static int mlx5_devlink_auxdev_params_register(struct devlink *devlink)
|
||||
{
|
||||
int err;
|
||||
|
||||
err = mlx5_devlink_eth_param_register(devlink);
|
||||
err = mlx5_devlink_eth_params_register(devlink);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
err = mlx5_devlink_rdma_param_register(devlink);
|
||||
err = mlx5_devlink_rdma_params_register(devlink);
|
||||
if (err)
|
||||
goto rdma_err;
|
||||
|
||||
err = mlx5_devlink_vnet_param_register(devlink);
|
||||
err = mlx5_devlink_vnet_params_register(devlink);
|
||||
if (err)
|
||||
goto vnet_err;
|
||||
return 0;
|
||||
|
||||
vnet_err:
|
||||
mlx5_devlink_rdma_param_unregister(devlink);
|
||||
mlx5_devlink_rdma_params_unregister(devlink);
|
||||
rdma_err:
|
||||
mlx5_devlink_eth_param_unregister(devlink);
|
||||
mlx5_devlink_eth_params_unregister(devlink);
|
||||
return err;
|
||||
}
|
||||
|
||||
static void mlx5_devlink_auxdev_params_unregister(struct devlink *devlink)
|
||||
{
|
||||
mlx5_devlink_vnet_param_unregister(devlink);
|
||||
mlx5_devlink_rdma_param_unregister(devlink);
|
||||
mlx5_devlink_eth_param_unregister(devlink);
|
||||
mlx5_devlink_vnet_params_unregister(devlink);
|
||||
mlx5_devlink_rdma_params_unregister(devlink);
|
||||
mlx5_devlink_eth_params_unregister(devlink);
|
||||
}
|
||||
|
||||
static int mlx5_devlink_max_uc_list_validate(struct devlink *devlink, u32 id,
|
||||
@ -791,11 +661,12 @@ static int mlx5_devlink_max_uc_list_validate(struct devlink *devlink, u32 id,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct devlink_param max_uc_list_param =
|
||||
static const struct devlink_param mlx5_devlink_max_uc_list_params[] = {
|
||||
DEVLINK_PARAM_GENERIC(MAX_MACS, BIT(DEVLINK_PARAM_CMODE_DRIVERINIT),
|
||||
NULL, NULL, mlx5_devlink_max_uc_list_validate);
|
||||
NULL, NULL, mlx5_devlink_max_uc_list_validate),
|
||||
};
|
||||
|
||||
static int mlx5_devlink_max_uc_list_param_register(struct devlink *devlink)
|
||||
static int mlx5_devlink_max_uc_list_params_register(struct devlink *devlink)
|
||||
{
|
||||
struct mlx5_core_dev *dev = devlink_priv(devlink);
|
||||
union devlink_param_value value;
|
||||
@ -804,26 +675,28 @@ static int mlx5_devlink_max_uc_list_param_register(struct devlink *devlink)
|
||||
if (!MLX5_CAP_GEN_MAX(dev, log_max_current_uc_list_wr_supported))
|
||||
return 0;
|
||||
|
||||
err = devlink_param_register(devlink, &max_uc_list_param);
|
||||
err = devl_params_register(devlink, mlx5_devlink_max_uc_list_params,
|
||||
ARRAY_SIZE(mlx5_devlink_max_uc_list_params));
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
value.vu32 = 1 << MLX5_CAP_GEN(dev, log_max_current_uc_list);
|
||||
devlink_param_driverinit_value_set(devlink,
|
||||
DEVLINK_PARAM_GENERIC_ID_MAX_MACS,
|
||||
value);
|
||||
devl_param_driverinit_value_set(devlink,
|
||||
DEVLINK_PARAM_GENERIC_ID_MAX_MACS,
|
||||
value);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
mlx5_devlink_max_uc_list_param_unregister(struct devlink *devlink)
|
||||
mlx5_devlink_max_uc_list_params_unregister(struct devlink *devlink)
|
||||
{
|
||||
struct mlx5_core_dev *dev = devlink_priv(devlink);
|
||||
|
||||
if (!MLX5_CAP_GEN_MAX(dev, log_max_current_uc_list_wr_supported))
|
||||
return;
|
||||
|
||||
devlink_param_unregister(devlink, &max_uc_list_param);
|
||||
devl_params_unregister(devlink, mlx5_devlink_max_uc_list_params,
|
||||
ARRAY_SIZE(mlx5_devlink_max_uc_list_params));
|
||||
}
|
||||
|
||||
#define MLX5_TRAP_DROP(_id, _group_id) \
|
||||
@ -869,13 +742,13 @@ void mlx5_devlink_traps_unregister(struct devlink *devlink)
|
||||
ARRAY_SIZE(mlx5_trap_groups_arr));
|
||||
}
|
||||
|
||||
int mlx5_devlink_register(struct devlink *devlink)
|
||||
int mlx5_devlink_params_register(struct devlink *devlink)
|
||||
{
|
||||
struct mlx5_core_dev *dev = devlink_priv(devlink);
|
||||
int err;
|
||||
|
||||
err = devlink_params_register(devlink, mlx5_devlink_params,
|
||||
ARRAY_SIZE(mlx5_devlink_params));
|
||||
err = devl_params_register(devlink, mlx5_devlink_params,
|
||||
ARRAY_SIZE(mlx5_devlink_params));
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
@ -885,7 +758,7 @@ int mlx5_devlink_register(struct devlink *devlink)
|
||||
if (err)
|
||||
goto auxdev_reg_err;
|
||||
|
||||
err = mlx5_devlink_max_uc_list_param_register(devlink);
|
||||
err = mlx5_devlink_max_uc_list_params_register(devlink);
|
||||
if (err)
|
||||
goto max_uc_list_err;
|
||||
|
||||
@ -897,15 +770,15 @@ int mlx5_devlink_register(struct devlink *devlink)
|
||||
max_uc_list_err:
|
||||
mlx5_devlink_auxdev_params_unregister(devlink);
|
||||
auxdev_reg_err:
|
||||
devlink_params_unregister(devlink, mlx5_devlink_params,
|
||||
ARRAY_SIZE(mlx5_devlink_params));
|
||||
devl_params_unregister(devlink, mlx5_devlink_params,
|
||||
ARRAY_SIZE(mlx5_devlink_params));
|
||||
return err;
|
||||
}
|
||||
|
||||
void mlx5_devlink_unregister(struct devlink *devlink)
|
||||
void mlx5_devlink_params_unregister(struct devlink *devlink)
|
||||
{
|
||||
mlx5_devlink_max_uc_list_param_unregister(devlink);
|
||||
mlx5_devlink_max_uc_list_params_unregister(devlink);
|
||||
mlx5_devlink_auxdev_params_unregister(devlink);
|
||||
devlink_params_unregister(devlink, mlx5_devlink_params,
|
||||
ARRAY_SIZE(mlx5_devlink_params));
|
||||
devl_params_unregister(devlink, mlx5_devlink_params,
|
||||
ARRAY_SIZE(mlx5_devlink_params));
|
||||
}
|
||||
|
@ -35,7 +35,7 @@ void mlx5_devlink_traps_unregister(struct devlink *devlink);
|
||||
|
||||
struct devlink *mlx5_devlink_alloc(struct device *dev);
|
||||
void mlx5_devlink_free(struct devlink *devlink);
|
||||
int mlx5_devlink_register(struct devlink *devlink);
|
||||
void mlx5_devlink_unregister(struct devlink *devlink);
|
||||
int mlx5_devlink_params_register(struct devlink *devlink);
|
||||
void mlx5_devlink_params_unregister(struct devlink *devlink);
|
||||
|
||||
#endif /* __MLX5_DEVLINK_H__ */
|
||||
|
@ -629,9 +629,9 @@ static u16 async_eq_depth_devlink_param_get(struct mlx5_core_dev *dev)
|
||||
union devlink_param_value val;
|
||||
int err;
|
||||
|
||||
err = devlink_param_driverinit_value_get(devlink,
|
||||
DEVLINK_PARAM_GENERIC_ID_EVENT_EQ_SIZE,
|
||||
&val);
|
||||
err = devl_param_driverinit_value_get(devlink,
|
||||
DEVLINK_PARAM_GENERIC_ID_EVENT_EQ_SIZE,
|
||||
&val);
|
||||
if (!err)
|
||||
return val.vu32;
|
||||
mlx5_core_dbg(dev, "Failed to get param. using default. err = %d\n", err);
|
||||
@ -874,9 +874,9 @@ static u16 comp_eq_depth_devlink_param_get(struct mlx5_core_dev *dev)
|
||||
union devlink_param_value val;
|
||||
int err;
|
||||
|
||||
err = devlink_param_driverinit_value_get(devlink,
|
||||
DEVLINK_PARAM_GENERIC_ID_IO_EQ_SIZE,
|
||||
&val);
|
||||
err = devl_param_driverinit_value_get(devlink,
|
||||
DEVLINK_PARAM_GENERIC_ID_IO_EQ_SIZE,
|
||||
&val);
|
||||
if (!err)
|
||||
return val.vu32;
|
||||
mlx5_core_dbg(dev, "Failed to get param. using default. err = %d\n", err);
|
||||
|
@ -1190,9 +1190,9 @@ static void mlx5_eswitch_get_devlink_param(struct mlx5_eswitch *esw)
|
||||
union devlink_param_value val;
|
||||
int err;
|
||||
|
||||
err = devlink_param_driverinit_value_get(devlink,
|
||||
MLX5_DEVLINK_PARAM_ID_ESW_LARGE_GROUP_NUM,
|
||||
&val);
|
||||
err = devl_param_driverinit_value_get(devlink,
|
||||
MLX5_DEVLINK_PARAM_ID_ESW_LARGE_GROUP_NUM,
|
||||
&val);
|
||||
if (!err) {
|
||||
esw->params.large_group_num = val.vu32;
|
||||
} else {
|
||||
@ -1640,7 +1640,7 @@ int mlx5_eswitch_init(struct mlx5_core_dev *dev)
|
||||
if (err)
|
||||
goto abort;
|
||||
|
||||
err = esw_offloads_init_reps(esw);
|
||||
err = esw_offloads_init(esw);
|
||||
if (err)
|
||||
goto reps_err;
|
||||
|
||||
@ -1706,7 +1706,7 @@ void mlx5_eswitch_cleanup(struct mlx5_eswitch *esw)
|
||||
mlx5e_mod_hdr_tbl_destroy(&esw->offloads.mod_hdr);
|
||||
mutex_destroy(&esw->offloads.encap_tbl_lock);
|
||||
mutex_destroy(&esw->offloads.decap_tbl_lock);
|
||||
esw_offloads_cleanup_reps(esw);
|
||||
esw_offloads_cleanup(esw);
|
||||
mlx5_esw_vports_cleanup(esw);
|
||||
kfree(esw);
|
||||
}
|
||||
|
@ -346,8 +346,8 @@ struct mlx5_eswitch {
|
||||
|
||||
void esw_offloads_disable(struct mlx5_eswitch *esw);
|
||||
int esw_offloads_enable(struct mlx5_eswitch *esw);
|
||||
void esw_offloads_cleanup_reps(struct mlx5_eswitch *esw);
|
||||
int esw_offloads_init_reps(struct mlx5_eswitch *esw);
|
||||
void esw_offloads_cleanup(struct mlx5_eswitch *esw);
|
||||
int esw_offloads_init(struct mlx5_eswitch *esw);
|
||||
|
||||
struct mlx5_flow_handle *
|
||||
mlx5_eswitch_add_send_to_vport_meta_rule(struct mlx5_eswitch *esw, u16 vport_num);
|
||||
|
@ -2403,7 +2403,7 @@ static void mlx5_esw_offloads_rep_cleanup(struct mlx5_eswitch *esw,
|
||||
kfree(rep);
|
||||
}
|
||||
|
||||
void esw_offloads_cleanup_reps(struct mlx5_eswitch *esw)
|
||||
static void esw_offloads_cleanup_reps(struct mlx5_eswitch *esw)
|
||||
{
|
||||
struct mlx5_eswitch_rep *rep;
|
||||
unsigned long i;
|
||||
@ -2413,7 +2413,7 @@ void esw_offloads_cleanup_reps(struct mlx5_eswitch *esw)
|
||||
xa_destroy(&esw->offloads.vport_reps);
|
||||
}
|
||||
|
||||
int esw_offloads_init_reps(struct mlx5_eswitch *esw)
|
||||
static int esw_offloads_init_reps(struct mlx5_eswitch *esw)
|
||||
{
|
||||
struct mlx5_vport *vport;
|
||||
unsigned long i;
|
||||
@ -2433,6 +2433,94 @@ err:
|
||||
return err;
|
||||
}
|
||||
|
||||
static int esw_port_metadata_set(struct devlink *devlink, u32 id,
|
||||
struct devlink_param_gset_ctx *ctx)
|
||||
{
|
||||
struct mlx5_core_dev *dev = devlink_priv(devlink);
|
||||
struct mlx5_eswitch *esw = dev->priv.eswitch;
|
||||
int err = 0;
|
||||
|
||||
down_write(&esw->mode_lock);
|
||||
if (mlx5_esw_is_fdb_created(esw)) {
|
||||
err = -EBUSY;
|
||||
goto done;
|
||||
}
|
||||
if (!mlx5_esw_vport_match_metadata_supported(esw)) {
|
||||
err = -EOPNOTSUPP;
|
||||
goto done;
|
||||
}
|
||||
if (ctx->val.vbool)
|
||||
esw->flags |= MLX5_ESWITCH_VPORT_MATCH_METADATA;
|
||||
else
|
||||
esw->flags &= ~MLX5_ESWITCH_VPORT_MATCH_METADATA;
|
||||
done:
|
||||
up_write(&esw->mode_lock);
|
||||
return err;
|
||||
}
|
||||
|
||||
static int esw_port_metadata_get(struct devlink *devlink, u32 id,
|
||||
struct devlink_param_gset_ctx *ctx)
|
||||
{
|
||||
struct mlx5_core_dev *dev = devlink_priv(devlink);
|
||||
|
||||
ctx->val.vbool = mlx5_eswitch_vport_match_metadata_enabled(dev->priv.eswitch);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int esw_port_metadata_validate(struct devlink *devlink, u32 id,
|
||||
union devlink_param_value val,
|
||||
struct netlink_ext_ack *extack)
|
||||
{
|
||||
struct mlx5_core_dev *dev = devlink_priv(devlink);
|
||||
u8 esw_mode;
|
||||
|
||||
esw_mode = mlx5_eswitch_mode(dev);
|
||||
if (esw_mode == MLX5_ESWITCH_OFFLOADS) {
|
||||
NL_SET_ERR_MSG_MOD(extack,
|
||||
"E-Switch must either disabled or non switchdev mode");
|
||||
return -EBUSY;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct devlink_param esw_devlink_params[] = {
|
||||
DEVLINK_PARAM_DRIVER(MLX5_DEVLINK_PARAM_ID_ESW_PORT_METADATA,
|
||||
"esw_port_metadata", DEVLINK_PARAM_TYPE_BOOL,
|
||||
BIT(DEVLINK_PARAM_CMODE_RUNTIME),
|
||||
esw_port_metadata_get,
|
||||
esw_port_metadata_set,
|
||||
esw_port_metadata_validate),
|
||||
};
|
||||
|
||||
int esw_offloads_init(struct mlx5_eswitch *esw)
|
||||
{
|
||||
int err;
|
||||
|
||||
err = esw_offloads_init_reps(esw);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
err = devl_params_register(priv_to_devlink(esw->dev),
|
||||
esw_devlink_params,
|
||||
ARRAY_SIZE(esw_devlink_params));
|
||||
if (err)
|
||||
goto err_params;
|
||||
|
||||
return 0;
|
||||
|
||||
err_params:
|
||||
esw_offloads_cleanup_reps(esw);
|
||||
return err;
|
||||
}
|
||||
|
||||
void esw_offloads_cleanup(struct mlx5_eswitch *esw)
|
||||
{
|
||||
devl_params_unregister(priv_to_devlink(esw->dev),
|
||||
esw_devlink_params,
|
||||
ARRAY_SIZE(esw_devlink_params));
|
||||
esw_offloads_cleanup_reps(esw);
|
||||
}
|
||||
|
||||
static void __esw_offloads_unload_rep(struct mlx5_eswitch *esw,
|
||||
struct mlx5_eswitch_rep *rep, u8 rep_type)
|
||||
{
|
||||
|
@ -34,12 +34,14 @@
|
||||
#include <linux/mlx5/driver.h>
|
||||
#include <linux/mlx5/vport.h>
|
||||
#include <linux/mlx5/eswitch.h>
|
||||
#include <net/devlink.h>
|
||||
|
||||
#include "mlx5_core.h"
|
||||
#include "fs_core.h"
|
||||
#include "fs_cmd.h"
|
||||
#include "fs_ft_pool.h"
|
||||
#include "diag/fs_tracepoint.h"
|
||||
#include "devlink.h"
|
||||
|
||||
#define INIT_TREE_NODE_ARRAY_SIZE(...) (sizeof((struct init_tree_node[]){__VA_ARGS__}) /\
|
||||
sizeof(struct init_tree_node))
|
||||
@ -3143,6 +3145,78 @@ cleanup:
|
||||
return err;
|
||||
}
|
||||
|
||||
static int mlx5_fs_mode_validate(struct devlink *devlink, u32 id,
|
||||
union devlink_param_value val,
|
||||
struct netlink_ext_ack *extack)
|
||||
{
|
||||
struct mlx5_core_dev *dev = devlink_priv(devlink);
|
||||
char *value = val.vstr;
|
||||
int err = 0;
|
||||
|
||||
if (!strcmp(value, "dmfs")) {
|
||||
return 0;
|
||||
} else if (!strcmp(value, "smfs")) {
|
||||
u8 eswitch_mode;
|
||||
bool smfs_cap;
|
||||
|
||||
eswitch_mode = mlx5_eswitch_mode(dev);
|
||||
smfs_cap = mlx5_fs_dr_is_supported(dev);
|
||||
|
||||
if (!smfs_cap) {
|
||||
err = -EOPNOTSUPP;
|
||||
NL_SET_ERR_MSG_MOD(extack,
|
||||
"Software managed steering is not supported by current device");
|
||||
}
|
||||
|
||||
else if (eswitch_mode == MLX5_ESWITCH_OFFLOADS) {
|
||||
NL_SET_ERR_MSG_MOD(extack,
|
||||
"Software managed steering is not supported when eswitch offloads enabled.");
|
||||
err = -EOPNOTSUPP;
|
||||
}
|
||||
} else {
|
||||
NL_SET_ERR_MSG_MOD(extack,
|
||||
"Bad parameter: supported values are [\"dmfs\", \"smfs\"]");
|
||||
err = -EINVAL;
|
||||
}
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
static int mlx5_fs_mode_set(struct devlink *devlink, u32 id,
|
||||
struct devlink_param_gset_ctx *ctx)
|
||||
{
|
||||
struct mlx5_core_dev *dev = devlink_priv(devlink);
|
||||
enum mlx5_flow_steering_mode mode;
|
||||
|
||||
if (!strcmp(ctx->val.vstr, "smfs"))
|
||||
mode = MLX5_FLOW_STEERING_MODE_SMFS;
|
||||
else
|
||||
mode = MLX5_FLOW_STEERING_MODE_DMFS;
|
||||
dev->priv.steering->mode = mode;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int mlx5_fs_mode_get(struct devlink *devlink, u32 id,
|
||||
struct devlink_param_gset_ctx *ctx)
|
||||
{
|
||||
struct mlx5_core_dev *dev = devlink_priv(devlink);
|
||||
|
||||
if (dev->priv.steering->mode == MLX5_FLOW_STEERING_MODE_SMFS)
|
||||
strcpy(ctx->val.vstr, "smfs");
|
||||
else
|
||||
strcpy(ctx->val.vstr, "dmfs");
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct devlink_param mlx5_fs_params[] = {
|
||||
DEVLINK_PARAM_DRIVER(MLX5_DEVLINK_PARAM_ID_FLOW_STEERING_MODE,
|
||||
"flow_steering_mode", DEVLINK_PARAM_TYPE_STRING,
|
||||
BIT(DEVLINK_PARAM_CMODE_RUNTIME),
|
||||
mlx5_fs_mode_get, mlx5_fs_mode_set,
|
||||
mlx5_fs_mode_validate),
|
||||
};
|
||||
|
||||
void mlx5_fs_core_cleanup(struct mlx5_core_dev *dev)
|
||||
{
|
||||
struct mlx5_flow_steering *steering = dev->priv.steering;
|
||||
@ -3155,12 +3229,20 @@ void mlx5_fs_core_cleanup(struct mlx5_core_dev *dev)
|
||||
cleanup_root_ns(steering->rdma_rx_root_ns);
|
||||
cleanup_root_ns(steering->rdma_tx_root_ns);
|
||||
cleanup_root_ns(steering->egress_root_ns);
|
||||
|
||||
devl_params_unregister(priv_to_devlink(dev), mlx5_fs_params,
|
||||
ARRAY_SIZE(mlx5_fs_params));
|
||||
}
|
||||
|
||||
int mlx5_fs_core_init(struct mlx5_core_dev *dev)
|
||||
{
|
||||
struct mlx5_flow_steering *steering = dev->priv.steering;
|
||||
int err = 0;
|
||||
int err;
|
||||
|
||||
err = devl_params_register(priv_to_devlink(dev), mlx5_fs_params,
|
||||
ARRAY_SIZE(mlx5_fs_params));
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
if ((((MLX5_CAP_GEN(dev, port_type) == MLX5_CAP_PORT_TYPE_ETH) &&
|
||||
(MLX5_CAP_GEN(dev, nic_flow_table))) ||
|
||||
|
@ -1,6 +1,8 @@
|
||||
// SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB
|
||||
/* Copyright (c) 2020, Mellanox Technologies inc. All rights reserved. */
|
||||
|
||||
#include <devlink.h>
|
||||
|
||||
#include "fw_reset.h"
|
||||
#include "diag/fw_tracer.h"
|
||||
#include "lib/tout.h"
|
||||
@ -28,21 +30,32 @@ struct mlx5_fw_reset {
|
||||
int ret;
|
||||
};
|
||||
|
||||
void mlx5_fw_reset_enable_remote_dev_reset_set(struct mlx5_core_dev *dev, bool enable)
|
||||
static int mlx5_fw_reset_enable_remote_dev_reset_set(struct devlink *devlink, u32 id,
|
||||
struct devlink_param_gset_ctx *ctx)
|
||||
{
|
||||
struct mlx5_fw_reset *fw_reset = dev->priv.fw_reset;
|
||||
struct mlx5_core_dev *dev = devlink_priv(devlink);
|
||||
struct mlx5_fw_reset *fw_reset;
|
||||
|
||||
if (enable)
|
||||
fw_reset = dev->priv.fw_reset;
|
||||
|
||||
if (ctx->val.vbool)
|
||||
clear_bit(MLX5_FW_RESET_FLAGS_NACK_RESET_REQUEST, &fw_reset->reset_flags);
|
||||
else
|
||||
set_bit(MLX5_FW_RESET_FLAGS_NACK_RESET_REQUEST, &fw_reset->reset_flags);
|
||||
return 0;
|
||||
}
|
||||
|
||||
bool mlx5_fw_reset_enable_remote_dev_reset_get(struct mlx5_core_dev *dev)
|
||||
static int mlx5_fw_reset_enable_remote_dev_reset_get(struct devlink *devlink, u32 id,
|
||||
struct devlink_param_gset_ctx *ctx)
|
||||
{
|
||||
struct mlx5_fw_reset *fw_reset = dev->priv.fw_reset;
|
||||
struct mlx5_core_dev *dev = devlink_priv(devlink);
|
||||
struct mlx5_fw_reset *fw_reset;
|
||||
|
||||
return !test_bit(MLX5_FW_RESET_FLAGS_NACK_RESET_REQUEST, &fw_reset->reset_flags);
|
||||
fw_reset = dev->priv.fw_reset;
|
||||
|
||||
ctx->val.vbool = !test_bit(MLX5_FW_RESET_FLAGS_NACK_RESET_REQUEST,
|
||||
&fw_reset->reset_flags);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int mlx5_reg_mfrl_set(struct mlx5_core_dev *dev, u8 reset_level,
|
||||
@ -517,9 +530,16 @@ void mlx5_drain_fw_reset(struct mlx5_core_dev *dev)
|
||||
cancel_work_sync(&fw_reset->reset_abort_work);
|
||||
}
|
||||
|
||||
static const struct devlink_param mlx5_fw_reset_devlink_params[] = {
|
||||
DEVLINK_PARAM_GENERIC(ENABLE_REMOTE_DEV_RESET, BIT(DEVLINK_PARAM_CMODE_RUNTIME),
|
||||
mlx5_fw_reset_enable_remote_dev_reset_get,
|
||||
mlx5_fw_reset_enable_remote_dev_reset_set, NULL),
|
||||
};
|
||||
|
||||
int mlx5_fw_reset_init(struct mlx5_core_dev *dev)
|
||||
{
|
||||
struct mlx5_fw_reset *fw_reset = kzalloc(sizeof(*fw_reset), GFP_KERNEL);
|
||||
int err;
|
||||
|
||||
if (!fw_reset)
|
||||
return -ENOMEM;
|
||||
@ -532,6 +552,15 @@ int mlx5_fw_reset_init(struct mlx5_core_dev *dev)
|
||||
fw_reset->dev = dev;
|
||||
dev->priv.fw_reset = fw_reset;
|
||||
|
||||
err = devl_params_register(priv_to_devlink(dev),
|
||||
mlx5_fw_reset_devlink_params,
|
||||
ARRAY_SIZE(mlx5_fw_reset_devlink_params));
|
||||
if (err) {
|
||||
destroy_workqueue(fw_reset->wq);
|
||||
kfree(fw_reset);
|
||||
return err;
|
||||
}
|
||||
|
||||
INIT_WORK(&fw_reset->fw_live_patch_work, mlx5_fw_live_patch_event);
|
||||
INIT_WORK(&fw_reset->reset_request_work, mlx5_sync_reset_request_event);
|
||||
INIT_WORK(&fw_reset->reset_reload_work, mlx5_sync_reset_reload_work);
|
||||
@ -546,6 +575,9 @@ void mlx5_fw_reset_cleanup(struct mlx5_core_dev *dev)
|
||||
{
|
||||
struct mlx5_fw_reset *fw_reset = dev->priv.fw_reset;
|
||||
|
||||
devl_params_unregister(priv_to_devlink(dev),
|
||||
mlx5_fw_reset_devlink_params,
|
||||
ARRAY_SIZE(mlx5_fw_reset_devlink_params));
|
||||
destroy_workqueue(fw_reset->wq);
|
||||
kfree(dev->priv.fw_reset);
|
||||
}
|
||||
|
@ -6,8 +6,6 @@
|
||||
|
||||
#include "mlx5_core.h"
|
||||
|
||||
void mlx5_fw_reset_enable_remote_dev_reset_set(struct mlx5_core_dev *dev, bool enable);
|
||||
bool mlx5_fw_reset_enable_remote_dev_reset_get(struct mlx5_core_dev *dev);
|
||||
int mlx5_fw_reset_query(struct mlx5_core_dev *dev, u8 *reset_level, u8 *reset_type);
|
||||
int mlx5_fw_reset_set_reset_sync(struct mlx5_core_dev *dev, u8 reset_type_sel,
|
||||
struct netlink_ext_ack *extack);
|
||||
|
@ -484,9 +484,9 @@ static int max_uc_list_get_devlink_param(struct mlx5_core_dev *dev)
|
||||
union devlink_param_value val;
|
||||
int err;
|
||||
|
||||
err = devlink_param_driverinit_value_get(devlink,
|
||||
DEVLINK_PARAM_GENERIC_ID_MAX_MACS,
|
||||
&val);
|
||||
err = devl_param_driverinit_value_get(devlink,
|
||||
DEVLINK_PARAM_GENERIC_ID_MAX_MACS,
|
||||
&val);
|
||||
if (!err)
|
||||
return val.vu32;
|
||||
mlx5_core_dbg(dev, "Failed to get param. err = %d\n", err);
|
||||
@ -499,9 +499,9 @@ bool mlx5_is_roce_on(struct mlx5_core_dev *dev)
|
||||
union devlink_param_value val;
|
||||
int err;
|
||||
|
||||
err = devlink_param_driverinit_value_get(devlink,
|
||||
DEVLINK_PARAM_GENERIC_ID_ENABLE_ROCE,
|
||||
&val);
|
||||
err = devl_param_driverinit_value_get(devlink,
|
||||
DEVLINK_PARAM_GENERIC_ID_ENABLE_ROCE,
|
||||
&val);
|
||||
|
||||
if (!err)
|
||||
return val.vbool;
|
||||
@ -1390,9 +1390,9 @@ int mlx5_init_one(struct mlx5_core_dev *dev)
|
||||
|
||||
set_bit(MLX5_INTERFACE_STATE_UP, &dev->intf_state);
|
||||
|
||||
err = mlx5_devlink_register(priv_to_devlink(dev));
|
||||
err = mlx5_devlink_params_register(priv_to_devlink(dev));
|
||||
if (err)
|
||||
goto err_devlink_reg;
|
||||
goto err_devlink_params_reg;
|
||||
|
||||
err = mlx5_register_device(dev);
|
||||
if (err)
|
||||
@ -1403,8 +1403,8 @@ int mlx5_init_one(struct mlx5_core_dev *dev)
|
||||
return 0;
|
||||
|
||||
err_register:
|
||||
mlx5_devlink_unregister(priv_to_devlink(dev));
|
||||
err_devlink_reg:
|
||||
mlx5_devlink_params_unregister(priv_to_devlink(dev));
|
||||
err_devlink_params_reg:
|
||||
clear_bit(MLX5_INTERFACE_STATE_UP, &dev->intf_state);
|
||||
mlx5_unload(dev);
|
||||
err_load:
|
||||
@ -1426,7 +1426,7 @@ void mlx5_uninit_one(struct mlx5_core_dev *dev)
|
||||
mutex_lock(&dev->intf_state_mutex);
|
||||
|
||||
mlx5_unregister_device(dev);
|
||||
mlx5_devlink_unregister(priv_to_devlink(dev));
|
||||
mlx5_devlink_params_unregister(priv_to_devlink(dev));
|
||||
|
||||
if (!test_bit(MLX5_INTERFACE_STATE_UP, &dev->intf_state)) {
|
||||
mlx5_core_warn(dev, "%s: interface is down, NOP\n",
|
||||
|
@ -1243,9 +1243,9 @@ static int mlxsw_core_fw_rev_validate(struct mlxsw_core *mlxsw_core,
|
||||
return 0;
|
||||
|
||||
/* Don't check if devlink 'fw_load_policy' param is 'flash' */
|
||||
err = devlink_param_driverinit_value_get(priv_to_devlink(mlxsw_core),
|
||||
DEVLINK_PARAM_GENERIC_ID_FW_LOAD_POLICY,
|
||||
&value);
|
||||
err = devl_param_driverinit_value_get(priv_to_devlink(mlxsw_core),
|
||||
DEVLINK_PARAM_GENERIC_ID_FW_LOAD_POLICY,
|
||||
&value);
|
||||
if (err)
|
||||
return err;
|
||||
if (value.vu8 == DEVLINK_PARAM_FW_LOAD_POLICY_VALUE_FLASH)
|
||||
@ -1316,20 +1316,22 @@ static int mlxsw_core_fw_params_register(struct mlxsw_core *mlxsw_core)
|
||||
union devlink_param_value value;
|
||||
int err;
|
||||
|
||||
err = devlink_params_register(devlink, mlxsw_core_fw_devlink_params,
|
||||
ARRAY_SIZE(mlxsw_core_fw_devlink_params));
|
||||
err = devl_params_register(devlink, mlxsw_core_fw_devlink_params,
|
||||
ARRAY_SIZE(mlxsw_core_fw_devlink_params));
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
value.vu8 = DEVLINK_PARAM_FW_LOAD_POLICY_VALUE_DRIVER;
|
||||
devlink_param_driverinit_value_set(devlink, DEVLINK_PARAM_GENERIC_ID_FW_LOAD_POLICY, value);
|
||||
devl_param_driverinit_value_set(devlink,
|
||||
DEVLINK_PARAM_GENERIC_ID_FW_LOAD_POLICY,
|
||||
value);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void mlxsw_core_fw_params_unregister(struct mlxsw_core *mlxsw_core)
|
||||
{
|
||||
devlink_params_unregister(priv_to_devlink(mlxsw_core), mlxsw_core_fw_devlink_params,
|
||||
ARRAY_SIZE(mlxsw_core_fw_devlink_params));
|
||||
devl_params_unregister(priv_to_devlink(mlxsw_core), mlxsw_core_fw_devlink_params,
|
||||
ARRAY_SIZE(mlxsw_core_fw_devlink_params));
|
||||
}
|
||||
|
||||
static void *__dl_port(struct devlink_port *devlink_port)
|
||||
|
@ -3898,23 +3898,23 @@ static int mlxsw_sp2_params_register(struct mlxsw_core *mlxsw_core)
|
||||
union devlink_param_value value;
|
||||
int err;
|
||||
|
||||
err = devlink_params_register(devlink, mlxsw_sp2_devlink_params,
|
||||
ARRAY_SIZE(mlxsw_sp2_devlink_params));
|
||||
err = devl_params_register(devlink, mlxsw_sp2_devlink_params,
|
||||
ARRAY_SIZE(mlxsw_sp2_devlink_params));
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
value.vu32 = 0;
|
||||
devlink_param_driverinit_value_set(devlink,
|
||||
MLXSW_DEVLINK_PARAM_ID_ACL_REGION_REHASH_INTERVAL,
|
||||
value);
|
||||
devl_param_driverinit_value_set(devlink,
|
||||
MLXSW_DEVLINK_PARAM_ID_ACL_REGION_REHASH_INTERVAL,
|
||||
value);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void mlxsw_sp2_params_unregister(struct mlxsw_core *mlxsw_core)
|
||||
{
|
||||
devlink_params_unregister(priv_to_devlink(mlxsw_core),
|
||||
mlxsw_sp2_devlink_params,
|
||||
ARRAY_SIZE(mlxsw_sp2_devlink_params));
|
||||
devl_params_unregister(priv_to_devlink(mlxsw_core),
|
||||
mlxsw_sp2_devlink_params,
|
||||
ARRAY_SIZE(mlxsw_sp2_devlink_params));
|
||||
}
|
||||
|
||||
static void mlxsw_sp_ptp_transmitted(struct mlxsw_core *mlxsw_core,
|
||||
|
@ -233,8 +233,8 @@ int nfp_devlink_params_register(struct nfp_pf *pf)
|
||||
if (err <= 0)
|
||||
return err;
|
||||
|
||||
return devlink_params_register(devlink, nfp_devlink_params,
|
||||
ARRAY_SIZE(nfp_devlink_params));
|
||||
return devl_params_register(devlink, nfp_devlink_params,
|
||||
ARRAY_SIZE(nfp_devlink_params));
|
||||
}
|
||||
|
||||
void nfp_devlink_params_unregister(struct nfp_pf *pf)
|
||||
@ -245,6 +245,6 @@ void nfp_devlink_params_unregister(struct nfp_pf *pf)
|
||||
if (err <= 0)
|
||||
return;
|
||||
|
||||
devlink_params_unregister(priv_to_devlink(pf), nfp_devlink_params,
|
||||
ARRAY_SIZE(nfp_devlink_params));
|
||||
devl_params_unregister(priv_to_devlink(pf), nfp_devlink_params,
|
||||
ARRAY_SIZE(nfp_devlink_params));
|
||||
}
|
||||
|
@ -754,11 +754,11 @@ int nfp_net_pci_probe(struct nfp_pf *pf)
|
||||
if (err)
|
||||
goto err_devlink_unreg;
|
||||
|
||||
devl_lock(devlink);
|
||||
err = nfp_devlink_params_register(pf);
|
||||
if (err)
|
||||
goto err_shared_buf_unreg;
|
||||
|
||||
devl_lock(devlink);
|
||||
pf->ddir = nfp_net_debugfs_device_add(pf->pdev);
|
||||
|
||||
/* Allocate the vnics and do basic init */
|
||||
@ -791,9 +791,9 @@ err_free_vnics:
|
||||
nfp_net_pf_free_vnics(pf);
|
||||
err_clean_ddir:
|
||||
nfp_net_debugfs_dir_clean(&pf->ddir);
|
||||
devl_unlock(devlink);
|
||||
nfp_devlink_params_unregister(pf);
|
||||
err_shared_buf_unreg:
|
||||
devl_unlock(devlink);
|
||||
nfp_shared_buf_unregister(pf);
|
||||
err_devlink_unreg:
|
||||
cancel_work_sync(&pf->port_refresh_work);
|
||||
@ -821,9 +821,10 @@ void nfp_net_pci_remove(struct nfp_pf *pf)
|
||||
/* stop app first, to avoid double free of ctrl vNIC's ddir */
|
||||
nfp_net_debugfs_dir_clean(&pf->ddir);
|
||||
|
||||
nfp_devlink_params_unregister(pf);
|
||||
|
||||
devl_unlock(devlink);
|
||||
|
||||
nfp_devlink_params_unregister(pf);
|
||||
nfp_shared_buf_unregister(pf);
|
||||
|
||||
nfp_net_pf_free_irqs(pf);
|
||||
|
@ -198,7 +198,6 @@ static const struct devlink_ops qed_dl_ops = {
|
||||
|
||||
struct devlink *qed_devlink_register(struct qed_dev *cdev)
|
||||
{
|
||||
union devlink_param_value value;
|
||||
struct qed_devlink *qdevlink;
|
||||
struct devlink *dl;
|
||||
int rc;
|
||||
@ -216,11 +215,6 @@ struct devlink *qed_devlink_register(struct qed_dev *cdev)
|
||||
if (rc)
|
||||
goto err_unregister;
|
||||
|
||||
value.vbool = false;
|
||||
devlink_param_driverinit_value_set(dl,
|
||||
QED_DEVLINK_PARAM_ID_IWARP_CMT,
|
||||
value);
|
||||
|
||||
cdev->iwarp_cmt = false;
|
||||
|
||||
qed_fw_reporters_create(dl);
|
||||
|
@ -527,13 +527,13 @@ static void nsim_devlink_set_params_init_values(struct nsim_dev *nsim_dev,
|
||||
union devlink_param_value value;
|
||||
|
||||
value.vu32 = nsim_dev->max_macs;
|
||||
devlink_param_driverinit_value_set(devlink,
|
||||
DEVLINK_PARAM_GENERIC_ID_MAX_MACS,
|
||||
value);
|
||||
devl_param_driverinit_value_set(devlink,
|
||||
DEVLINK_PARAM_GENERIC_ID_MAX_MACS,
|
||||
value);
|
||||
value.vbool = nsim_dev->test1;
|
||||
devlink_param_driverinit_value_set(devlink,
|
||||
NSIM_DEVLINK_PARAM_ID_TEST1,
|
||||
value);
|
||||
devl_param_driverinit_value_set(devlink,
|
||||
NSIM_DEVLINK_PARAM_ID_TEST1,
|
||||
value);
|
||||
}
|
||||
|
||||
static void nsim_devlink_param_load_driverinit_values(struct devlink *devlink)
|
||||
@ -542,14 +542,14 @@ static void nsim_devlink_param_load_driverinit_values(struct devlink *devlink)
|
||||
union devlink_param_value saved_value;
|
||||
int err;
|
||||
|
||||
err = devlink_param_driverinit_value_get(devlink,
|
||||
DEVLINK_PARAM_GENERIC_ID_MAX_MACS,
|
||||
&saved_value);
|
||||
err = devl_param_driverinit_value_get(devlink,
|
||||
DEVLINK_PARAM_GENERIC_ID_MAX_MACS,
|
||||
&saved_value);
|
||||
if (!err)
|
||||
nsim_dev->max_macs = saved_value.vu32;
|
||||
err = devlink_param_driverinit_value_get(devlink,
|
||||
NSIM_DEVLINK_PARAM_ID_TEST1,
|
||||
&saved_value);
|
||||
err = devl_param_driverinit_value_get(devlink,
|
||||
NSIM_DEVLINK_PARAM_ID_TEST1,
|
||||
&saved_value);
|
||||
if (!err)
|
||||
nsim_dev->test1 = saved_value.vbool;
|
||||
}
|
||||
@ -1564,8 +1564,8 @@ int nsim_drv_probe(struct nsim_bus_dev *nsim_bus_dev)
|
||||
if (err)
|
||||
goto err_dl_unregister;
|
||||
|
||||
err = devlink_params_register(devlink, nsim_devlink_params,
|
||||
ARRAY_SIZE(nsim_devlink_params));
|
||||
err = devl_params_register(devlink, nsim_devlink_params,
|
||||
ARRAY_SIZE(nsim_devlink_params));
|
||||
if (err)
|
||||
goto err_resource_unregister;
|
||||
nsim_devlink_set_params_init_values(nsim_dev, devlink);
|
||||
@ -1630,8 +1630,8 @@ err_traps_exit:
|
||||
err_dummy_region_exit:
|
||||
nsim_dev_dummy_region_exit(nsim_dev);
|
||||
err_params_unregister:
|
||||
devlink_params_unregister(devlink, nsim_devlink_params,
|
||||
ARRAY_SIZE(nsim_devlink_params));
|
||||
devl_params_unregister(devlink, nsim_devlink_params,
|
||||
ARRAY_SIZE(nsim_devlink_params));
|
||||
err_resource_unregister:
|
||||
devl_resources_unregister(devlink);
|
||||
err_dl_unregister:
|
||||
@ -1678,8 +1678,8 @@ void nsim_drv_remove(struct nsim_bus_dev *nsim_bus_dev)
|
||||
|
||||
nsim_bpf_dev_exit(nsim_dev);
|
||||
nsim_dev_debugfs_exit(nsim_dev);
|
||||
devlink_params_unregister(devlink, nsim_devlink_params,
|
||||
ARRAY_SIZE(nsim_devlink_params));
|
||||
devl_params_unregister(devlink, nsim_devlink_params,
|
||||
ARRAY_SIZE(nsim_devlink_params));
|
||||
devl_resources_unregister(devlink);
|
||||
devl_unregister(devlink);
|
||||
kfree(nsim_dev->vfconfigs);
|
||||
|
@ -1767,21 +1767,23 @@ void devl_resource_occ_get_unregister(struct devlink *devlink,
|
||||
|
||||
void devlink_resource_occ_get_unregister(struct devlink *devlink,
|
||||
u64 resource_id);
|
||||
int devl_params_register(struct devlink *devlink,
|
||||
const struct devlink_param *params,
|
||||
size_t params_count);
|
||||
int devlink_params_register(struct devlink *devlink,
|
||||
const struct devlink_param *params,
|
||||
size_t params_count);
|
||||
void devl_params_unregister(struct devlink *devlink,
|
||||
const struct devlink_param *params,
|
||||
size_t params_count);
|
||||
void devlink_params_unregister(struct devlink *devlink,
|
||||
const struct devlink_param *params,
|
||||
size_t params_count);
|
||||
int devlink_param_register(struct devlink *devlink,
|
||||
const struct devlink_param *param);
|
||||
void devlink_param_unregister(struct devlink *devlink,
|
||||
const struct devlink_param *param);
|
||||
int devlink_param_driverinit_value_get(struct devlink *devlink, u32 param_id,
|
||||
union devlink_param_value *init_val);
|
||||
int devlink_param_driverinit_value_set(struct devlink *devlink, u32 param_id,
|
||||
union devlink_param_value init_val);
|
||||
void devlink_param_value_changed(struct devlink *devlink, u32 param_id);
|
||||
int devl_param_driverinit_value_get(struct devlink *devlink, u32 param_id,
|
||||
union devlink_param_value *init_val);
|
||||
void devl_param_driverinit_value_set(struct devlink *devlink, u32 param_id,
|
||||
union devlink_param_value init_val);
|
||||
void devl_param_value_changed(struct devlink *devlink, u32 param_id);
|
||||
struct devlink_region *devl_region_create(struct devlink *devlink,
|
||||
const struct devlink_region_ops *ops,
|
||||
u32 region_max_snapshots,
|
||||
|
@ -10793,68 +10793,8 @@ static int devlink_param_verify(const struct devlink_param *param)
|
||||
return devlink_param_driver_verify(param);
|
||||
}
|
||||
|
||||
/**
|
||||
* devlink_params_register - register configuration parameters
|
||||
*
|
||||
* @devlink: devlink
|
||||
* @params: configuration parameters array
|
||||
* @params_count: number of parameters provided
|
||||
*
|
||||
* Register the configuration parameters supported by the driver.
|
||||
*/
|
||||
int devlink_params_register(struct devlink *devlink,
|
||||
const struct devlink_param *params,
|
||||
size_t params_count)
|
||||
{
|
||||
const struct devlink_param *param = params;
|
||||
int i, err;
|
||||
|
||||
for (i = 0; i < params_count; i++, param++) {
|
||||
err = devlink_param_register(devlink, param);
|
||||
if (err)
|
||||
goto rollback;
|
||||
}
|
||||
return 0;
|
||||
|
||||
rollback:
|
||||
if (!i)
|
||||
return err;
|
||||
|
||||
for (param--; i > 0; i--, param--)
|
||||
devlink_param_unregister(devlink, param);
|
||||
return err;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(devlink_params_register);
|
||||
|
||||
/**
|
||||
* devlink_params_unregister - unregister configuration parameters
|
||||
* @devlink: devlink
|
||||
* @params: configuration parameters to unregister
|
||||
* @params_count: number of parameters provided
|
||||
*/
|
||||
void devlink_params_unregister(struct devlink *devlink,
|
||||
const struct devlink_param *params,
|
||||
size_t params_count)
|
||||
{
|
||||
const struct devlink_param *param = params;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < params_count; i++, param++)
|
||||
devlink_param_unregister(devlink, param);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(devlink_params_unregister);
|
||||
|
||||
/**
|
||||
* devlink_param_register - register one configuration parameter
|
||||
*
|
||||
* @devlink: devlink
|
||||
* @param: one configuration parameter
|
||||
*
|
||||
* Register the configuration parameter supported by the driver.
|
||||
* Return: returns 0 on successful registration or error code otherwise.
|
||||
*/
|
||||
int devlink_param_register(struct devlink *devlink,
|
||||
const struct devlink_param *param)
|
||||
static int devlink_param_register(struct devlink *devlink,
|
||||
const struct devlink_param *param)
|
||||
{
|
||||
struct devlink_param_item *param_item;
|
||||
|
||||
@ -10876,30 +10816,102 @@ int devlink_param_register(struct devlink *devlink,
|
||||
devlink_param_notify(devlink, 0, param_item, DEVLINK_CMD_PARAM_NEW);
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(devlink_param_register);
|
||||
|
||||
/**
|
||||
* devlink_param_unregister - unregister one configuration parameter
|
||||
* @devlink: devlink
|
||||
* @param: configuration parameter to unregister
|
||||
*/
|
||||
void devlink_param_unregister(struct devlink *devlink,
|
||||
const struct devlink_param *param)
|
||||
static void devlink_param_unregister(struct devlink *devlink,
|
||||
const struct devlink_param *param)
|
||||
{
|
||||
struct devlink_param_item *param_item;
|
||||
|
||||
param_item =
|
||||
devlink_param_find_by_name(&devlink->param_list, param->name);
|
||||
WARN_ON(!param_item);
|
||||
if (WARN_ON(!param_item))
|
||||
return;
|
||||
devlink_param_notify(devlink, 0, param_item, DEVLINK_CMD_PARAM_DEL);
|
||||
list_del(¶m_item->list);
|
||||
kfree(param_item);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(devlink_param_unregister);
|
||||
|
||||
/**
|
||||
* devlink_param_driverinit_value_get - get configuration parameter
|
||||
* value for driver initializing
|
||||
* devl_params_register - register configuration parameters
|
||||
*
|
||||
* @devlink: devlink
|
||||
* @params: configuration parameters array
|
||||
* @params_count: number of parameters provided
|
||||
*
|
||||
* Register the configuration parameters supported by the driver.
|
||||
*/
|
||||
int devl_params_register(struct devlink *devlink,
|
||||
const struct devlink_param *params,
|
||||
size_t params_count)
|
||||
{
|
||||
const struct devlink_param *param = params;
|
||||
int i, err;
|
||||
|
||||
lockdep_assert_held(&devlink->lock);
|
||||
|
||||
for (i = 0; i < params_count; i++, param++) {
|
||||
err = devlink_param_register(devlink, param);
|
||||
if (err)
|
||||
goto rollback;
|
||||
}
|
||||
return 0;
|
||||
|
||||
rollback:
|
||||
if (!i)
|
||||
return err;
|
||||
|
||||
for (param--; i > 0; i--, param--)
|
||||
devlink_param_unregister(devlink, param);
|
||||
return err;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(devl_params_register);
|
||||
|
||||
int devlink_params_register(struct devlink *devlink,
|
||||
const struct devlink_param *params,
|
||||
size_t params_count)
|
||||
{
|
||||
int err;
|
||||
|
||||
devl_lock(devlink);
|
||||
err = devl_params_register(devlink, params, params_count);
|
||||
devl_unlock(devlink);
|
||||
return err;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(devlink_params_register);
|
||||
|
||||
/**
|
||||
* devl_params_unregister - unregister configuration parameters
|
||||
* @devlink: devlink
|
||||
* @params: configuration parameters to unregister
|
||||
* @params_count: number of parameters provided
|
||||
*/
|
||||
void devl_params_unregister(struct devlink *devlink,
|
||||
const struct devlink_param *params,
|
||||
size_t params_count)
|
||||
{
|
||||
const struct devlink_param *param = params;
|
||||
int i;
|
||||
|
||||
lockdep_assert_held(&devlink->lock);
|
||||
|
||||
for (i = 0; i < params_count; i++, param++)
|
||||
devlink_param_unregister(devlink, param);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(devl_params_unregister);
|
||||
|
||||
void devlink_params_unregister(struct devlink *devlink,
|
||||
const struct devlink_param *params,
|
||||
size_t params_count)
|
||||
{
|
||||
devl_lock(devlink);
|
||||
devl_params_unregister(devlink, params, params_count);
|
||||
devl_unlock(devlink);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(devlink_params_unregister);
|
||||
|
||||
/**
|
||||
* devl_param_driverinit_value_get - get configuration parameter
|
||||
* value for driver initializing
|
||||
*
|
||||
* @devlink: devlink
|
||||
* @param_id: parameter ID
|
||||
@ -10908,21 +10920,25 @@ EXPORT_SYMBOL_GPL(devlink_param_unregister);
|
||||
* This function should be used by the driver to get driverinit
|
||||
* configuration for initialization after reload command.
|
||||
*/
|
||||
int devlink_param_driverinit_value_get(struct devlink *devlink, u32 param_id,
|
||||
union devlink_param_value *init_val)
|
||||
int devl_param_driverinit_value_get(struct devlink *devlink, u32 param_id,
|
||||
union devlink_param_value *init_val)
|
||||
{
|
||||
struct devlink_param_item *param_item;
|
||||
|
||||
if (!devlink_reload_supported(devlink->ops))
|
||||
lockdep_assert_held(&devlink->lock);
|
||||
|
||||
if (WARN_ON(!devlink_reload_supported(devlink->ops)))
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
param_item = devlink_param_find_by_id(&devlink->param_list, param_id);
|
||||
if (!param_item)
|
||||
return -EINVAL;
|
||||
|
||||
if (!param_item->driverinit_value_valid ||
|
||||
!devlink_param_cmode_is_supported(param_item->param,
|
||||
DEVLINK_PARAM_CMODE_DRIVERINIT))
|
||||
if (!param_item->driverinit_value_valid)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
if (WARN_ON(!devlink_param_cmode_is_supported(param_item->param,
|
||||
DEVLINK_PARAM_CMODE_DRIVERINIT)))
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
if (param_item->param->type == DEVLINK_PARAM_TYPE_STRING)
|
||||
@ -10932,12 +10948,12 @@ int devlink_param_driverinit_value_get(struct devlink *devlink, u32 param_id,
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(devlink_param_driverinit_value_get);
|
||||
EXPORT_SYMBOL_GPL(devl_param_driverinit_value_get);
|
||||
|
||||
/**
|
||||
* devlink_param_driverinit_value_set - set value of configuration
|
||||
* parameter for driverinit
|
||||
* configuration mode
|
||||
* devl_param_driverinit_value_set - set value of configuration
|
||||
* parameter for driverinit
|
||||
* configuration mode
|
||||
*
|
||||
* @devlink: devlink
|
||||
* @param_id: parameter ID
|
||||
@ -10946,18 +10962,18 @@ EXPORT_SYMBOL_GPL(devlink_param_driverinit_value_get);
|
||||
* This function should be used by the driver to set driverinit
|
||||
* configuration mode default value.
|
||||
*/
|
||||
int devlink_param_driverinit_value_set(struct devlink *devlink, u32 param_id,
|
||||
union devlink_param_value init_val)
|
||||
void devl_param_driverinit_value_set(struct devlink *devlink, u32 param_id,
|
||||
union devlink_param_value init_val)
|
||||
{
|
||||
struct devlink_param_item *param_item;
|
||||
|
||||
param_item = devlink_param_find_by_id(&devlink->param_list, param_id);
|
||||
if (!param_item)
|
||||
return -EINVAL;
|
||||
if (WARN_ON(!param_item))
|
||||
return;
|
||||
|
||||
if (!devlink_param_cmode_is_supported(param_item->param,
|
||||
DEVLINK_PARAM_CMODE_DRIVERINIT))
|
||||
return -EOPNOTSUPP;
|
||||
if (WARN_ON(!devlink_param_cmode_is_supported(param_item->param,
|
||||
DEVLINK_PARAM_CMODE_DRIVERINIT)))
|
||||
return;
|
||||
|
||||
if (param_item->param->type == DEVLINK_PARAM_TYPE_STRING)
|
||||
strcpy(param_item->driverinit_value.vstr, init_val.vstr);
|
||||
@ -10966,14 +10982,13 @@ int devlink_param_driverinit_value_set(struct devlink *devlink, u32 param_id,
|
||||
param_item->driverinit_value_valid = true;
|
||||
|
||||
devlink_param_notify(devlink, 0, param_item, DEVLINK_CMD_PARAM_NEW);
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(devlink_param_driverinit_value_set);
|
||||
EXPORT_SYMBOL_GPL(devl_param_driverinit_value_set);
|
||||
|
||||
/**
|
||||
* devlink_param_value_changed - notify devlink on a parameter's value
|
||||
* change. Should be called by the driver
|
||||
* right after the change.
|
||||
* devl_param_value_changed - notify devlink on a parameter's value
|
||||
* change. Should be called by the driver
|
||||
* right after the change.
|
||||
*
|
||||
* @devlink: devlink
|
||||
* @param_id: parameter ID
|
||||
@ -10982,7 +10997,7 @@ EXPORT_SYMBOL_GPL(devlink_param_driverinit_value_set);
|
||||
* change, excluding driverinit configuration mode.
|
||||
* For driverinit configuration mode driver should use the function
|
||||
*/
|
||||
void devlink_param_value_changed(struct devlink *devlink, u32 param_id)
|
||||
void devl_param_value_changed(struct devlink *devlink, u32 param_id)
|
||||
{
|
||||
struct devlink_param_item *param_item;
|
||||
|
||||
@ -10991,7 +11006,7 @@ void devlink_param_value_changed(struct devlink *devlink, u32 param_id)
|
||||
|
||||
devlink_param_notify(devlink, 0, param_item, DEVLINK_CMD_PARAM_NEW);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(devlink_param_value_changed);
|
||||
EXPORT_SYMBOL_GPL(devl_param_value_changed);
|
||||
|
||||
/**
|
||||
* devl_region_create - create a new address region
|
||||
|
Loading…
x
Reference in New Issue
Block a user