lkml.org 
[lkml]   [2020]   [Jul]   [27]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH net-next RFC 12/13] net/mlx5: Add support for devlink reload level live patch
    Date
    Add support for devlink reload level fw_live_patch which does live
    patching to firmware.
    The driver checks if the firmware is capable of handling the pending
    firmware changes as a live patch. If it is then it triggers
    fw_live_patch flow.

    Signed-off-by: Moshe Shemesh <moshe@mellanox.com>
    ---
    .../net/ethernet/mellanox/mlx5/core/devlink.c | 30 ++++++++++++++++++-
    1 file changed, 29 insertions(+), 1 deletion(-)

    diff --git a/drivers/net/ethernet/mellanox/mlx5/core/devlink.c b/drivers/net/ethernet/mellanox/mlx5/core/devlink.c
    index a81204b3dd7c..804e1e7b25cc 100644
    --- a/drivers/net/ethernet/mellanox/mlx5/core/devlink.c
    +++ b/drivers/net/ethernet/mellanox/mlx5/core/devlink.c
    @@ -115,6 +115,29 @@ static int mlx5_devlink_trigger_fw_reset(struct devlink *devlink, struct netlink
    return err;
    }

    +static int mlx5_devlink_trigger_fw_live_patch(struct devlink *devlink,
    + struct netlink_ext_ack *extack)
    +{
    + struct mlx5_core_dev *dev = devlink_priv(devlink);
    + u8 reset_level;
    + int err;
    +
    + err = mlx5_reg_mfrl_query(dev, &reset_level, NULL);
    + if (err)
    + return err;
    + if (!(reset_level & MLX5_MFRL_REG_RESET_LEVEL0)) {
    + NL_SET_ERR_MSG_MOD(extack,
    + "FW upgrade to the stored FW can't be done by FW live patching");
    + return -EINVAL;
    + }
    +
    + err = mlx5_fw_set_live_patch(dev);
    + if (err)
    + return err;
    +
    + return 0;
    +}
    +
    static int mlx5_devlink_reload_down(struct devlink *devlink, bool netns_change,
    enum devlink_reload_level level, struct netlink_ext_ack *extack)
    {
    @@ -126,6 +149,8 @@ static int mlx5_devlink_reload_down(struct devlink *devlink, bool netns_change,
    return 0;
    case DEVLINK_RELOAD_LEVEL_FW_RESET:
    return mlx5_devlink_trigger_fw_reset(devlink, extack);
    + case DEVLINK_RELOAD_LEVEL_FW_LIVE_PATCH:
    + return mlx5_devlink_trigger_fw_live_patch(devlink, extack);
    default:
    /* Unsupported level should not get to this function */
    WARN_ON(1);
    @@ -142,6 +167,8 @@ static int mlx5_devlink_reload_up(struct devlink *devlink, enum devlink_reload_l
    case DEVLINK_RELOAD_LEVEL_DRIVER:
    case DEVLINK_RELOAD_LEVEL_FW_RESET:
    return mlx5_load_one(dev, false);
    + case DEVLINK_RELOAD_LEVEL_FW_LIVE_PATCH:
    + return 0;
    default:
    /* Unsupported level should not get to this function */
    WARN_ON(1);
    @@ -163,7 +190,8 @@ static const struct devlink_ops mlx5_devlink_ops = {
    .flash_update = mlx5_devlink_flash_update,
    .info_get = mlx5_devlink_info_get,
    .supported_reload_levels = BIT(DEVLINK_RELOAD_LEVEL_DRIVER) |
    - BIT(DEVLINK_RELOAD_LEVEL_FW_RESET),
    + BIT(DEVLINK_RELOAD_LEVEL_FW_RESET) |
    + BIT(DEVLINK_RELOAD_LEVEL_FW_LIVE_PATCH),
    .default_reload_level = DEVLINK_RELOAD_LEVEL_DRIVER,
    .reload_down = mlx5_devlink_reload_down,
    .reload_up = mlx5_devlink_reload_up,
    --
    2.17.1
    \
     
     \ /
      Last update: 2020-07-27 13:06    [W:2.386 / U:0.016 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site