Skip to content

Commit ace1c54

Browse files
oulijunjgunthorpe
authored andcommitted
RDMA/hns: Set access flags of hip08 RoCE
This patch refactors the code of setting access flags for RDMA operation as well as adds the scene when attr->max_dest_rd_atomic is zero. Signed-off-by: Lijun Ou <[email protected]> Signed-off-by: Jason Gunthorpe <[email protected]>
1 parent 4f3f7a7 commit ace1c54

File tree

2 files changed

+37
-12
lines changed

2 files changed

+37
-12
lines changed

drivers/infiniband/hw/hns/hns_roce_device.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -483,6 +483,7 @@ struct hns_roce_qp {
483483
u8 resp_depth;
484484
u8 state;
485485
u32 access_flags;
486+
u32 atomic_rd_en;
486487
u32 pkey_index;
487488
void (*event)(struct hns_roce_qp *,
488489
enum hns_roce_event);

drivers/infiniband/hw/hns/hns_roce_hw_v2.c

Lines changed: 36 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1931,6 +1931,36 @@ static int hns_roce_v2_qp_modify(struct hns_roce_dev *hr_dev,
19311931
return ret;
19321932
}
19331933

1934+
static void set_access_flags(struct hns_roce_qp *hr_qp,
1935+
struct hns_roce_v2_qp_context *context,
1936+
struct hns_roce_v2_qp_context *qpc_mask,
1937+
const struct ib_qp_attr *attr, int attr_mask)
1938+
{
1939+
u8 dest_rd_atomic;
1940+
u32 access_flags;
1941+
1942+
dest_rd_atomic = !!(attr_mask & IB_QP_MAX_DEST_RD_ATOMIC) ?
1943+
attr->max_dest_rd_atomic : hr_qp->resp_depth;
1944+
1945+
access_flags = !!(attr_mask & IB_QP_ACCESS_FLAGS) ?
1946+
attr->qp_access_flags : hr_qp->atomic_rd_en;
1947+
1948+
if (!dest_rd_atomic)
1949+
access_flags &= IB_ACCESS_REMOTE_WRITE;
1950+
1951+
roce_set_bit(context->byte_76_srqn_op_en, V2_QPC_BYTE_76_RRE_S,
1952+
!!(access_flags & IB_ACCESS_REMOTE_READ));
1953+
roce_set_bit(qpc_mask->byte_76_srqn_op_en, V2_QPC_BYTE_76_RRE_S, 0);
1954+
1955+
roce_set_bit(context->byte_76_srqn_op_en, V2_QPC_BYTE_76_RWE_S,
1956+
!!(access_flags & IB_ACCESS_REMOTE_WRITE));
1957+
roce_set_bit(qpc_mask->byte_76_srqn_op_en, V2_QPC_BYTE_76_RWE_S, 0);
1958+
1959+
roce_set_bit(context->byte_76_srqn_op_en, V2_QPC_BYTE_76_ATE_S,
1960+
!!(access_flags & IB_ACCESS_REMOTE_ATOMIC));
1961+
roce_set_bit(qpc_mask->byte_76_srqn_op_en, V2_QPC_BYTE_76_ATE_S, 0);
1962+
}
1963+
19341964
static void modify_qp_reset_to_init(struct ib_qp *ibqp,
19351965
const struct ib_qp_attr *attr,
19361966
struct hns_roce_v2_qp_context *context,
@@ -2016,18 +2046,6 @@ static void modify_qp_reset_to_init(struct ib_qp *ibqp,
20162046
roce_set_bit(qpc_mask->byte_28_at_fl, V2_QPC_BYTE_28_CNP_TX_FLAG_S, 0);
20172047
roce_set_bit(qpc_mask->byte_28_at_fl, V2_QPC_BYTE_28_CE_FLAG_S, 0);
20182048

2019-
roce_set_bit(context->byte_76_srqn_op_en, V2_QPC_BYTE_76_RRE_S,
2020-
!!(attr->qp_access_flags & IB_ACCESS_REMOTE_READ));
2021-
roce_set_bit(qpc_mask->byte_76_srqn_op_en, V2_QPC_BYTE_76_RRE_S, 0);
2022-
2023-
roce_set_bit(context->byte_76_srqn_op_en, V2_QPC_BYTE_76_RWE_S,
2024-
!!(attr->qp_access_flags & IB_ACCESS_REMOTE_WRITE));
2025-
roce_set_bit(qpc_mask->byte_76_srqn_op_en, V2_QPC_BYTE_76_RWE_S, 0);
2026-
2027-
roce_set_bit(context->byte_76_srqn_op_en, V2_QPC_BYTE_76_ATE_S,
2028-
!!(attr->qp_access_flags & IB_ACCESS_REMOTE_ATOMIC));
2029-
roce_set_bit(qpc_mask->byte_76_srqn_op_en, V2_QPC_BYTE_76_ATE_S, 0);
2030-
20312049
roce_set_bit(context->byte_76_srqn_op_en, V2_QPC_BYTE_76_RQIE_S, 1);
20322050
roce_set_bit(qpc_mask->byte_76_srqn_op_en, V2_QPC_BYTE_76_RQIE_S, 0);
20332051

@@ -2907,6 +2925,9 @@ static int hns_roce_v2_modify_qp(struct ib_qp *ibqp,
29072925
goto out;
29082926
}
29092927

2928+
if (attr_mask & (IB_QP_ACCESS_FLAGS | IB_QP_MAX_DEST_RD_ATOMIC))
2929+
set_access_flags(hr_qp, context, qpc_mask, attr, attr_mask);
2930+
29102931
/* Every status migrate must change state */
29112932
roce_set_field(context->byte_60_qpst_mapid, V2_QPC_BYTE_60_QP_ST_M,
29122933
V2_QPC_BYTE_60_QP_ST_S, new_state);
@@ -2923,6 +2944,9 @@ static int hns_roce_v2_modify_qp(struct ib_qp *ibqp,
29232944

29242945
hr_qp->state = new_state;
29252946

2947+
if (attr_mask & IB_QP_ACCESS_FLAGS)
2948+
hr_qp->atomic_rd_en = attr->qp_access_flags;
2949+
29262950
if (attr_mask & IB_QP_MAX_DEST_RD_ATOMIC)
29272951
hr_qp->resp_depth = attr->max_dest_rd_atomic;
29282952
if (attr_mask & IB_QP_PORT) {

0 commit comments

Comments
 (0)