mlx5_devlink_eth_param_unregister(devlink);
 }
 
+static int mlx5_devlink_max_uc_list_validate(struct devlink *devlink, u32 id,
+                                            union devlink_param_value val,
+                                            struct netlink_ext_ack *extack)
+{
+       struct mlx5_core_dev *dev = devlink_priv(devlink);
+
+       if (val.vu32 == 0) {
+               NL_SET_ERR_MSG_MOD(extack, "max_macs value must be greater than 0");
+               return -EINVAL;
+       }
+
+       if (!is_power_of_2(val.vu32)) {
+               NL_SET_ERR_MSG_MOD(extack, "Only power of 2 values are supported for max_macs");
+               return -EINVAL;
+       }
+
+       if (ilog2(val.vu32) >
+           MLX5_CAP_GEN_MAX(dev, log_max_current_uc_list)) {
+               NL_SET_ERR_MSG_MOD(extack, "max_macs value is out of the supported range");
+               return -EINVAL;
+       }
+
+       return 0;
+}
+
+static const struct devlink_param max_uc_list_param =
+       DEVLINK_PARAM_GENERIC(MAX_MACS, BIT(DEVLINK_PARAM_CMODE_DRIVERINIT),
+                             NULL, NULL, mlx5_devlink_max_uc_list_validate);
+
+static int mlx5_devlink_max_uc_list_param_register(struct devlink *devlink)
+{
+       struct mlx5_core_dev *dev = devlink_priv(devlink);
+       union devlink_param_value value;
+       int err;
+
+       if (!MLX5_CAP_GEN_MAX(dev, log_max_current_uc_list_wr_supported))
+               return 0;
+
+       err = devlink_param_register(devlink, &max_uc_list_param);
+       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);
+       return 0;
+}
+
+static void
+mlx5_devlink_max_uc_list_param_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);
+}
+
 #define MLX5_TRAP_DROP(_id, _group_id)                                 \
        DEVLINK_TRAP_GENERIC(DROP, DROP, _id,                           \
                             DEVLINK_TRAP_GROUP_GENERIC_ID_##_group_id, \
        if (err)
                goto auxdev_reg_err;
 
+       err = mlx5_devlink_max_uc_list_param_register(devlink);
+       if (err)
+               goto max_uc_list_err;
+
        err = mlx5_devlink_traps_register(devlink);
        if (err)
                goto traps_reg_err;
        return 0;
 
 traps_reg_err:
+       mlx5_devlink_max_uc_list_param_unregister(devlink);
+max_uc_list_err:
        mlx5_devlink_auxdev_params_unregister(devlink);
 auxdev_reg_err:
        devlink_params_unregister(devlink, mlx5_devlink_params,
 void mlx5_devlink_unregister(struct devlink *devlink)
 {
        mlx5_devlink_traps_unregister(devlink);
+       mlx5_devlink_max_uc_list_param_unregister(devlink);
        mlx5_devlink_auxdev_params_unregister(devlink);
        devlink_params_unregister(devlink, mlx5_devlink_params,
                                  ARRAY_SIZE(mlx5_devlink_params));
 
        return set_caps(dev, set_ctx, MLX5_SET_HCA_CAP_OP_MOD_ODP);
 }
 
+static int max_uc_list_get_devlink_param(struct mlx5_core_dev *dev)
+{
+       struct devlink *devlink = priv_to_devlink(dev);
+       union devlink_param_value val;
+       int err;
+
+       err = devlink_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);
+       return err;
+}
+
 static int handle_hca_cap(struct mlx5_core_dev *dev, void *set_ctx)
 {
        struct mlx5_profile *prof = &dev->profile;
        void *set_hca_cap;
+       int max_uc_list;
        int err;
 
        err = mlx5_core_get_caps(dev, MLX5_CAP_GENERAL);
        if (MLX5_CAP_GEN(dev, roce_rw_supported))
                MLX5_SET(cmd_hca_cap, set_hca_cap, roce, mlx5_is_roce_init_enabled(dev));
 
+       max_uc_list = max_uc_list_get_devlink_param(dev);
+       if (max_uc_list > 0)
+               MLX5_SET(cmd_hca_cap, set_hca_cap, log_max_current_uc_list,
+                        ilog2(max_uc_list));
+
        return set_caps(dev, set_ctx, MLX5_SET_HCA_CAP_OP_MOD_GENERAL_DEVICE);
 }