#include "en/htb.h"
 #include "qos.h"
 #include "en/trap.h"
+#include "lib/devcom.h"
 
 bool mlx5e_check_fragmented_striding_rq_cap(struct mlx5_core_dev *mdev, u8 page_shift,
                                            enum mlx5e_mpwrq_umr_mode umr_mode)
        mlx5_notifier_unregister(priv->mdev, &priv->events_nb);
 }
 
+static int mlx5e_devcom_event_mpv(int event, void *my_data, void *event_data)
+{
+       struct mlx5e_priv *slave_priv = my_data;
+
+       mlx5_devcom_comp_set_ready(slave_priv->devcom, true);
+
+       return 0;
+}
+
+static int mlx5e_devcom_init_mpv(struct mlx5e_priv *priv, u64 *data)
+{
+       priv->devcom = mlx5_devcom_register_component(priv->mdev->priv.devc,
+                                                     MLX5_DEVCOM_MPV,
+                                                     *data,
+                                                     mlx5e_devcom_event_mpv,
+                                                     priv);
+       if (IS_ERR_OR_NULL(priv->devcom))
+               return -EOPNOTSUPP;
+
+       if (mlx5_core_is_mp_master(priv->mdev))
+               mlx5_devcom_send_event(priv->devcom, MPV_DEVCOM_MASTER_UP,
+                                      MPV_DEVCOM_MASTER_UP, priv);
+
+       return 0;
+}
+
+static void mlx5e_devcom_cleanup_mpv(struct mlx5e_priv *priv)
+{
+       mlx5_devcom_unregister_component(priv->devcom);
+}
+
 static int blocking_event(struct notifier_block *nb, unsigned long event, void *data)
 {
        struct mlx5e_priv *priv = container_of(nb, struct mlx5e_priv, blocking_events_nb);
                        return NOTIFY_BAD;
                }
                break;
+       case MLX5_DRIVER_EVENT_AFFILIATION_DONE:
+               if (mlx5e_devcom_init_mpv(priv, data))
+                       return NOTIFY_BAD;
+               break;
+       case MLX5_DRIVER_EVENT_AFFILIATION_REMOVED:
+               mlx5e_devcom_cleanup_mpv(priv);
+               break;
        default:
                return NOTIFY_DONE;
        }