@@ -3,6 +3,7 @@ rdma_man_pages(
mlx5dv_create_flow_action_modify_header.3.md
mlx5dv_create_flow_action_packet_reformat.3.md
mlx5dv_create_flow_matcher.3.md
+ mlx5dv_create_qp.3.md
mlx5dv_flow_action_esp.3.md
mlx5dv_get_clock_info.3
mlx5dv_init_obj.3
new file mode 100644
@@ -0,0 +1,98 @@
+---
+layout: page
+title: mlx5dv_create_qp
+section: 3
+tagline: Verbs
+date: 2018-9-1
+header: "mlx5 Programmer's Manual"
+footer: mlx5
+---
+
+# NAME
+
+mlx5dv_create_qp - creates a queue pair (QP)
+
+# SYNOPSIS
+
+```c
+#include <infiniband/mlx5dv.h>
+
+struct ibv_qp *mlx5dv_create_qp(struct ibv_context *context,
+ struct ibv_qp_init_attr_ex *qp_attr,
+ struct mlx5dv_qp_init_attr *mlx5_qp_attr)
+```
+
+
+# DESCRIPTION
+
+**mlx5dv_create_qp()** creates a queue pair (QP) with specific driver properties.
+
+# ARGUMENTS
+
+Please see *ibv_create_qp_ex(3)* man page for *context* and *qp_attr*.
+
+## mlx5_qp_attr
+
+```c
+struct mlx5dv_qp_init_attr {
+ uint64_t comp_mask;
+ uint32_t create_flags;
+ struct mlx5dv_dc_init_attr dc_init_attr;
+};
+```
+
+*comp_mask*
+: Bitmask specifying what fields in the structure are valid:
+ MLX5DV_QP_INIT_ATTR_MASK_QP_CREATE_FLAGS:
+ valid values in *create_flags*
+ MLX5DV_QP_INIT_ATTR_MASK_DC:
+ valid values in *dc_init_attr*
+
+*create_flags*
+: A bitwise OR of the various values described below.
+
+ MLX5DV_QP_CREATE_TUNNEL_OFFLOADS:
+ Enable offloading such as checksum and LRO for incoming
+ tunneling traffic.
+
+ MLX5DV_QP_CREATE_TIR_ALLOW_SELF_LOOPBACK_UC:
+ Allow receiving loopback unicast traffic.
+
+ MLX5DV_QP_CREATE_TIR_ALLOW_SELF_LOOPBACK_MC:
+ Allow receiving loopback multicast traffic.
+
+*dc_init_attr*
+: DC init attributes.
+
+## *dc_init_attr*
+
+```c
+struct mlx5dv_dc_init_attr {
+ enum mlx5dv_dc_type dc_type;
+ uint64_t dct_access_key;
+};
+```
+
+*dc_type*
+: MLX5DV_DCTYPE_DCT
+ QP type: Target DC.
+ MLX5DV_DCTYPE_DCI
+ QP type: Initiator DC.
+
+*dct_access_key*
+: used to create a DCT QP.
+
+
+# RETURN VALUE
+
+**mlx5dv_create_qp()**
+returns a pointer to the created QP, on error NULL will be returned and errno will be set.
+
+
+# SEE ALSO
+
+**ibv_query_device_ex**(3), **ibv_create_qp_ex**(3),
+
+# AUTHOR
+
+Yonatan Cohen <yonatanc@mellanox.com>
@@ -158,6 +158,8 @@ struct ibv_cq_ex *mlx5dv_create_cq(struct ibv_context *context,
enum mlx5dv_qp_create_flags {
MLX5DV_QP_CREATE_TUNNEL_OFFLOADS = 1 << 0,
+ MLX5DV_QP_CREATE_TIR_ALLOW_SELF_LOOPBACK_UC = 1 << 1,
+ MLX5DV_QP_CREATE_TIR_ALLOW_SELF_LOOPBACK_MC = 1 << 2,
};
enum mlx5dv_qp_init_attr_mask {
@@ -1598,6 +1598,13 @@ enum {
IBV_QP_INIT_ATTR_RX_HASH),
};
+enum {
+ MLX5DV_QP_CREATE_SUP_FLAGS =
+ (MLX5DV_QP_CREATE_TUNNEL_OFFLOADS |
+ MLX5DV_QP_CREATE_TIR_ALLOW_SELF_LOOPBACK_UC |
+ MLX5DV_QP_CREATE_TIR_ALLOW_SELF_LOOPBACK_MC),
+};
+
static int create_dct(struct ibv_context *context,
struct ibv_qp_init_attr_ex *attr,
struct mlx5dv_qp_init_attr *mlx5_qp_attr,
@@ -1720,15 +1727,27 @@ static struct ibv_qp *create_qp(struct ibv_context *context,
}
if (mlx5_qp_attr->comp_mask &
MLX5DV_QP_INIT_ATTR_MASK_QP_CREATE_FLAGS) {
- if (mlx5_qp_attr->create_flags &
- MLX5DV_QP_CREATE_TUNNEL_OFFLOADS) {
- mlx5_create_flags = MLX5_QP_FLAG_TUNNEL_OFFLOADS;
- } else {
+ if (!check_comp_mask(mlx5_qp_attr->create_flags,
+ MLX5DV_QP_CREATE_SUP_FLAGS)) {
mlx5_dbg(fp, MLX5_DBG_QP,
"Unsupported creation flags requested for create_qp\n");
errno = EINVAL;
goto err;
}
+ if (mlx5_qp_attr->create_flags &
+ MLX5DV_QP_CREATE_TUNNEL_OFFLOADS) {
+ mlx5_create_flags |= MLX5_QP_FLAG_TUNNEL_OFFLOADS;
+ }
+ if (mlx5_qp_attr->create_flags &
+ MLX5DV_QP_CREATE_TIR_ALLOW_SELF_LOOPBACK_UC) {
+ mlx5_create_flags |=
+ MLX5_QP_FLAG_TIR_ALLOW_SELF_LB_UC;
+ }
+ if (mlx5_qp_attr->create_flags &
+ MLX5DV_QP_CREATE_TIR_ALLOW_SELF_LOOPBACK_MC) {
+ mlx5_create_flags |=
+ MLX5_QP_FLAG_TIR_ALLOW_SELF_LB_MC;
+ }
}
if (attr->qp_type == IBV_QPT_DRIVER) {