diff --git a/drivers/common/mlx5/mlx5_common.c b/drivers/common/mlx5/mlx5_common.c
index 459cf4bcc4..4ac4794983 100644
--- a/drivers/common/mlx5/mlx5_common.c
+++ b/drivers/common/mlx5/mlx5_common.c
@@ -8,13 +8,16 @@
 
 #include <rte_errno.h>
 #include <rte_mempool.h>
+#include <rte_common.h>
 #include <rte_class.h>
 #include <rte_malloc.h>
+#include <rte_mbuf.h>
 
 #include "mlx5_common.h"
 #include "mlx5_common_os.h"
 #include "mlx5_common_log.h"
 #include "mlx5_common_private.h"
+#include "rte_pmd_mlx5.h"
 
 uint8_t haswell_broadwell_cpu;
 
@@ -51,6 +54,25 @@ static TAILQ_HEAD(mlx5_drivers, mlx5_class_driver) drivers_list =
 static TAILQ_HEAD(mlx5_devices, mlx5_common_device) devices_list =
 				TAILQ_HEAD_INITIALIZER(devices_list);
 
+int
+rte_pmd_common_mlx5_get_dyn_flag_names(char *names[], unsigned int n)
+{
+	static const char *const dynf_names[] = {
+		RTE_PMD_MLX5_FINE_GRANULARITY_INLINE,
+		RTE_PMD_MLX5_PRIVATE_IOVA,
+	};
+	unsigned int i;
+
+	if (n < RTE_DIM(dynf_names))
+		return -ENOMEM;
+	for (i = 0; i < RTE_DIM(dynf_names); i++) {
+		if (names[i] == NULL)
+			return -EINVAL;
+		strcpy(names[i], dynf_names[i]);
+	}
+	return RTE_DIM(dynf_names);
+}
+
 static const struct {
 	const char *name;
 	unsigned int drv_class;
diff --git a/drivers/common/mlx5/rte_pmd_mlx5.h b/drivers/common/mlx5/rte_pmd_mlx5.h
new file mode 100644
index 0000000000..b032996917
--- /dev/null
+++ b/drivers/common/mlx5/rte_pmd_mlx5.h
@@ -0,0 +1,105 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright 2021 Mellanox Technologies, Ltd
+ */
+
+#ifndef RTE_PMD_PRIVATE_MLX5_H_
+#define RTE_PMD_PRIVATE_MLX5_H_
+
+/**
+ * @file
+ * MLX5 public header.
+ *
+ * This interface provides the ability to support private PMD dynamic flags.
+ */
+
+#define RTE_PMD_MLX5_PRIVATE_IOVA "mlx5_privet_iova"
+
+/**
+ * Returns the dynamic flags name, that are supported.
+ *
+ * @param[out] names
+ *   Array that is used to return the supported dynamic flags names.
+ * @param[in] n
+ *   The number of elements in the names array.
+ *
+ * @return
+ *   The number of dynamic flags that were copied if not negative.
+ *   Otherwise:
+ *   - ENOMEM - not enough entries in the array
+ *   - EINVAL - invalid array entry
+ */
+__rte_experimental
+int rte_pmd_common_mlx5_get_dyn_flag_names(char *names[], unsigned int n);
+
+/**
+ * Returns the device context and its Protection Domain, for given device.
+ *
+ * @param[in] dev
+ *   Pointer to the generic device.
+ * @param[out] ctx
+ *   Pointer that is used to return the context device pointer.
+ * @param[out] pd
+ *   Pointer that is used to return the protection domain pointer.
+ *
+ * @return
+ *   0 on success, a negative errno value otherwise and rte_errno is set.
+ *   Possible values for rte_errno:
+ *   - EINVAL - invalid parameters (dev, ctx, or pd).
+ *   - ENODEV - the given device doesn't exist.
+ */
+__rte_experimental
+int rte_pmd_mlx5_get_dev_ctx_and_pd(rte_device *dev, void **ctx, void **pd);
+
+/**
+ * A PMD API to create cross virtual HCA MKey.
+ * In BlueField family devices, there are some vHCA under same device.
+ * Each of them represents a different part of the device (host / guest), and
+ * it has id for itself.
+ *
+ * This API creates for the user cross vHCA MKey and returns it in rte_iova_t
+ * variable.
+ *
+ * @param[in] dev
+ *   Pointer to the generic device.
+ * @param[in] remote_vhca_id
+ *   ID of remote vHCA.
+ * @param[in] remote_mkey
+ *   The MKey created by remote vHCA.
+ *
+ * @return
+ *   Cross vHCA MKey for buf_iova mbuf field on success, 0 otherwise.
+ *   Possible values for rte_errno:
+ *   - ENOMEM - allocation failure.
+ *   - EINVAL - invalid parameters (dev).
+ *   - ENODEV - the given device doesn't exist.
+ */
+__rte_experimental
+rte_iova_t rte_pmd_mlx5_create_cross_vhca_mkey(rte_device *dev,
+					       uint32_t remote_vhca_id,
+					       uint32_t remote_mkey);
+
+/**
+ * A PMD API to get mlx5 IOVA on local process VA.
+ * This function creates memory regions for given virtual addresses on control
+ * path, and returns it in rte_iova_t variable.
+ *
+ * @param[in] dev
+ *   Pointer to the generic device.
+ * @param[in] va
+ *   Pointer to memory start virtual address.
+ * @param[in] len
+ *   Length of the memory to register.
+ *
+ * @return
+ *   Compatible MKey for buf_iova mbuf field on success, 0 otherwise.
+ *   Possible values for rte_errno:
+ *   - ENOMEM - allocation failure.
+ *   - EINVAL - invalid parameters (dev or va).
+ *   - ENODEV - the given device doesn't exist.
+ */
+__rte_experimental
+rte_iova_t rte_pmd_mlx5_get_buf_private_iova(rte_device *dev, void *va,
+					     uint32_t len);
+
+
+#endif /* RTE_PMD_PRIVATE_MLX5_H_ */
