mirror of
https://github.com/FEX-Emu/linux.git
synced 2025-01-10 03:20:49 +00:00
IB/mlx4: Support modify_qp for RoCE v2
In order to support modify_qp for RoCE v2, we need to set the gid_type in the QP context. Signed-off-by: Moni Shoua <monis@mellanox.com> Signed-off-by: Matan Barak <matanb@mellanox.com> Signed-off-by: Doug Ledford <dledford@redhat.com>
This commit is contained in:
parent
7ead4bcb1b
commit
3b5daf28ac
@ -1509,6 +1509,24 @@ static int create_qp_lb_counter(struct mlx4_ib_dev *dev, struct mlx4_ib_qp *qp)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
enum {
|
||||||
|
MLX4_QPC_ROCE_MODE_1 = 0,
|
||||||
|
MLX4_QPC_ROCE_MODE_2 = 2,
|
||||||
|
MLX4_QPC_ROCE_MODE_UNDEFINED = 0xff
|
||||||
|
};
|
||||||
|
|
||||||
|
static u8 gid_type_to_qpc(enum ib_gid_type gid_type)
|
||||||
|
{
|
||||||
|
switch (gid_type) {
|
||||||
|
case IB_GID_TYPE_ROCE:
|
||||||
|
return MLX4_QPC_ROCE_MODE_1;
|
||||||
|
case IB_GID_TYPE_ROCE_UDP_ENCAP:
|
||||||
|
return MLX4_QPC_ROCE_MODE_2;
|
||||||
|
default:
|
||||||
|
return MLX4_QPC_ROCE_MODE_UNDEFINED;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static int __mlx4_ib_modify_qp(struct ib_qp *ibqp,
|
static int __mlx4_ib_modify_qp(struct ib_qp *ibqp,
|
||||||
const struct ib_qp_attr *attr, int attr_mask,
|
const struct ib_qp_attr *attr, int attr_mask,
|
||||||
enum ib_qp_state cur_state, enum ib_qp_state new_state)
|
enum ib_qp_state cur_state, enum ib_qp_state new_state)
|
||||||
@ -1652,9 +1670,10 @@ static int __mlx4_ib_modify_qp(struct ib_qp *ibqp,
|
|||||||
u16 vlan = 0xffff;
|
u16 vlan = 0xffff;
|
||||||
u8 smac[ETH_ALEN];
|
u8 smac[ETH_ALEN];
|
||||||
int status = 0;
|
int status = 0;
|
||||||
|
int is_eth = rdma_cap_eth_ah(&dev->ib_dev, port_num) &&
|
||||||
|
attr->ah_attr.ah_flags & IB_AH_GRH;
|
||||||
|
|
||||||
if (rdma_cap_eth_ah(&dev->ib_dev, port_num) &&
|
if (is_eth) {
|
||||||
attr->ah_attr.ah_flags & IB_AH_GRH) {
|
|
||||||
int index = attr->ah_attr.grh.sgid_index;
|
int index = attr->ah_attr.grh.sgid_index;
|
||||||
|
|
||||||
status = ib_get_cached_gid(ibqp->device, port_num,
|
status = ib_get_cached_gid(ibqp->device, port_num,
|
||||||
@ -1676,6 +1695,18 @@ static int __mlx4_ib_modify_qp(struct ib_qp *ibqp,
|
|||||||
|
|
||||||
optpar |= (MLX4_QP_OPTPAR_PRIMARY_ADDR_PATH |
|
optpar |= (MLX4_QP_OPTPAR_PRIMARY_ADDR_PATH |
|
||||||
MLX4_QP_OPTPAR_SCHED_QUEUE);
|
MLX4_QP_OPTPAR_SCHED_QUEUE);
|
||||||
|
|
||||||
|
if (is_eth &&
|
||||||
|
(cur_state == IB_QPS_INIT && new_state == IB_QPS_RTR)) {
|
||||||
|
u8 qpc_roce_mode = gid_type_to_qpc(gid_attr.gid_type);
|
||||||
|
|
||||||
|
if (qpc_roce_mode == MLX4_QPC_ROCE_MODE_UNDEFINED) {
|
||||||
|
err = -EINVAL;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
context->rlkey_roce_mode |= (qpc_roce_mode << 6);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (attr_mask & IB_QP_TIMEOUT) {
|
if (attr_mask & IB_QP_TIMEOUT) {
|
||||||
@ -1847,7 +1878,7 @@ static int __mlx4_ib_modify_qp(struct ib_qp *ibqp,
|
|||||||
sqd_event = 0;
|
sqd_event = 0;
|
||||||
|
|
||||||
if (!ibqp->uobject && cur_state == IB_QPS_RESET && new_state == IB_QPS_INIT)
|
if (!ibqp->uobject && cur_state == IB_QPS_RESET && new_state == IB_QPS_INIT)
|
||||||
context->rlkey |= (1 << 4);
|
context->rlkey_roce_mode |= (1 << 4);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Before passing a kernel QP to the HW, make sure that the
|
* Before passing a kernel QP to the HW, make sure that the
|
||||||
|
@ -194,7 +194,7 @@ struct mlx4_qp_context {
|
|||||||
u8 mtu_msgmax;
|
u8 mtu_msgmax;
|
||||||
u8 rq_size_stride;
|
u8 rq_size_stride;
|
||||||
u8 sq_size_stride;
|
u8 sq_size_stride;
|
||||||
u8 rlkey;
|
u8 rlkey_roce_mode;
|
||||||
__be32 usr_page;
|
__be32 usr_page;
|
||||||
__be32 local_qpn;
|
__be32 local_qpn;
|
||||||
__be32 remote_qpn;
|
__be32 remote_qpn;
|
||||||
|
Loading…
Reference in New Issue
Block a user