@@ -1931,6 +1931,36 @@ static int hns_roce_v2_qp_modify(struct hns_roce_dev *hr_dev,
1931
1931
return ret ;
1932
1932
}
1933
1933
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
+
1934
1964
static void modify_qp_reset_to_init (struct ib_qp * ibqp ,
1935
1965
const struct ib_qp_attr * attr ,
1936
1966
struct hns_roce_v2_qp_context * context ,
@@ -2016,18 +2046,6 @@ static void modify_qp_reset_to_init(struct ib_qp *ibqp,
2016
2046
roce_set_bit (qpc_mask -> byte_28_at_fl , V2_QPC_BYTE_28_CNP_TX_FLAG_S , 0 );
2017
2047
roce_set_bit (qpc_mask -> byte_28_at_fl , V2_QPC_BYTE_28_CE_FLAG_S , 0 );
2018
2048
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
-
2031
2049
roce_set_bit (context -> byte_76_srqn_op_en , V2_QPC_BYTE_76_RQIE_S , 1 );
2032
2050
roce_set_bit (qpc_mask -> byte_76_srqn_op_en , V2_QPC_BYTE_76_RQIE_S , 0 );
2033
2051
@@ -2907,6 +2925,9 @@ static int hns_roce_v2_modify_qp(struct ib_qp *ibqp,
2907
2925
goto out ;
2908
2926
}
2909
2927
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
+
2910
2931
/* Every status migrate must change state */
2911
2932
roce_set_field (context -> byte_60_qpst_mapid , V2_QPC_BYTE_60_QP_ST_M ,
2912
2933
V2_QPC_BYTE_60_QP_ST_S , new_state );
@@ -2923,6 +2944,9 @@ static int hns_roce_v2_modify_qp(struct ib_qp *ibqp,
2923
2944
2924
2945
hr_qp -> state = new_state ;
2925
2946
2947
+ if (attr_mask & IB_QP_ACCESS_FLAGS )
2948
+ hr_qp -> atomic_rd_en = attr -> qp_access_flags ;
2949
+
2926
2950
if (attr_mask & IB_QP_MAX_DEST_RD_ATOMIC )
2927
2951
hr_qp -> resp_depth = attr -> max_dest_rd_atomic ;
2928
2952
if (attr_mask & IB_QP_PORT ) {
0 commit comments