diff mbox series

[for-next,1/6] RDMA/hns: Simplify function's resource related command

Message ID 1617353896-40727-2-git-send-email-liweihang@huawei.com (mailing list archive)
State Superseded
Headers show
Series RDMA/hns: Support RoCE on virtual functions of HIP09 | expand

Commit Message

Weihang Li April 2, 2021, 8:58 a.m. UTC
From: Xi Wang <wangxi11@huawei.com>

Use hr_reg_write/read() to simplify codes about configuring function's
resource. And because the design of PF/VF fields is same, they can be
defined only once.

Signed-off-by: Xi Wang <wangxi11@huawei.com>
Signed-off-by: Weihang Li <liweihang@huawei.com>
---
 drivers/infiniband/hw/hns/hns_roce_common.h |  11 ++
 drivers/infiniband/hw/hns/hns_roce_hw_v2.c  | 161 ++++++--------------
 drivers/infiniband/hw/hns/hns_roce_hw_v2.h  | 223 +++++-----------------------
 3 files changed, 90 insertions(+), 305 deletions(-)

Comments

Lang Cheng April 2, 2021, 12:17 p.m. UTC | #1
在 2021/4/2 16:58, Weihang Li 写道:
> From: Xi Wang <wangxi11@huawei.com>
> 
> Use hr_reg_write/read() to simplify codes about configuring function's
> resource. And because the design of PF/VF fields is same, they can be
> defined only once.
> 
> Signed-off-by: Xi Wang <wangxi11@huawei.com>
> Signed-off-by: Weihang Li <liweihang@huawei.com>
> ---
>   drivers/infiniband/hw/hns/hns_roce_common.h |  11 ++
>   drivers/infiniband/hw/hns/hns_roce_hw_v2.c  | 161 ++++++--------------
>   drivers/infiniband/hw/hns/hns_roce_hw_v2.h  | 223 +++++-----------------------
>   3 files changed, 90 insertions(+), 305 deletions(-)
> 
> diff --git a/drivers/infiniband/hw/hns/hns_roce_common.h b/drivers/infiniband/hw/hns/hns_roce_common.h
> index 23c438c..5b5fedf 100644
> --- a/drivers/infiniband/hw/hns/hns_roce_common.h
> +++ b/drivers/infiniband/hw/hns/hns_roce_common.h
> @@ -87,6 +87,17 @@
>   
>   #define hr_reg_write(ptr, field, val) _hr_reg_write(ptr, field, val)
>   
> +#define _hr_reg_read(ptr, field_type, field_h, field_l)                        \
> +	({                                                                     \
> +		const field_type *_ptr = ptr;                                  \
> +		BUILD_BUG_ON(((field_h) / 32) != ((field_l) / 32));            \
> +		((le32_to_cpu(*((__le32 *)_ptr + (field_h) / 32)) &            \
> +		  GENMASK((field_h) % 32, (field_l) % 32)) >>                  \
> +		 ((field_l) % 32));                                            \
> +	})

I will try this:

#define _hr_reg_read(ptr, field_type, field_h, field_l) 

	({
		const field_type *_ptr = ptr;
		FIELD_GET(GENMASK((field_h) % 32, (field_l) % 32),
			  le32_to_cpu(*((__le32 *)_ptr +(field_h)/32)))
		+ BUILD_BUG_ON_ZERO(((field_h) / 32) != ((field_l) / 32));
	})


Thanks.

> +
> +#define hr_reg_read(ptr, field) _hr_reg_read(ptr, field)
> +
>   #define ROCEE_GLB_CFG_ROCEE_DB_SQ_MODE_S 3
>   #define ROCEE_GLB_CFG_ROCEE_DB_OTH_MODE_S 4
>   
> diff --git a/drivers/infiniband/hw/hns/hns_roce_hw_v2.c b/drivers/infiniband/hw/hns/hns_roce_hw_v2.c
> index cc334d5c..0695c2c 100644
> --- a/drivers/infiniband/hw/hns/hns_roce_hw_v2.c
> +++ b/drivers/infiniband/hw/hns/hns_roce_hw_v2.c
> @@ -1623,21 +1623,14 @@ static int hns_roce_query_func_info(struct hns_roce_dev *hr_dev)
>   
>   static int hns_roce_config_global_param(struct hns_roce_dev *hr_dev)
>   {
> -	struct hns_roce_cfg_global_param *req;
>   	struct hns_roce_cmq_desc desc;
> +	struct hns_roce_cmq_req *req = (struct hns_roce_cmq_req *)desc.data;
>   
>   	hns_roce_cmq_setup_basic_desc(&desc, HNS_ROCE_OPC_CFG_GLOBAL_PARAM,
>   				      false);
>   
> -	req = (struct hns_roce_cfg_global_param *)desc.data;
> -	memset(req, 0, sizeof(*req));
> -	roce_set_field(req->time_cfg_udp_port,
> -		       CFG_GLOBAL_PARAM_DATA_0_ROCEE_TIME_1US_CFG_M,
> -		       CFG_GLOBAL_PARAM_DATA_0_ROCEE_TIME_1US_CFG_S, 0x3e8);
> -	roce_set_field(req->time_cfg_udp_port,
> -		       CFG_GLOBAL_PARAM_DATA_0_ROCEE_UDP_PORT_M,
> -		       CFG_GLOBAL_PARAM_DATA_0_ROCEE_UDP_PORT_S,
> -		       ROCE_V2_UDP_DPORT);
> +	hr_reg_write(req, CFG_GLOBAL_PARAM_1US_CYCLES, 0x3e8);
> +	hr_reg_write(req, CFG_GLOBAL_PARAM_UDP_PORT, ROCE_V2_UDP_DPORT);
>   
>   	return hns_roce_cmq_send(hr_dev, &desc, 1);
>   }
> @@ -1645,55 +1638,36 @@ static int hns_roce_config_global_param(struct hns_roce_dev *hr_dev)
>   static int hns_roce_query_pf_resource(struct hns_roce_dev *hr_dev)
>   {
>   	struct hns_roce_cmq_desc desc[2];
> -	struct hns_roce_pf_res_a *req_a;
> -	struct hns_roce_pf_res_b *req_b;
> +	struct hns_roce_cmq_req *r_a = (struct hns_roce_cmq_req *)desc[0].data;
> +	struct hns_roce_cmq_req *r_b = (struct hns_roce_cmq_req *)desc[1].data;
> +	enum hns_roce_opcode_type opcode = HNS_ROCE_OPC_QUERY_PF_RES;
> +	struct hns_roce_caps *caps = &hr_dev->caps;
>   	int ret;
>   
> -	hns_roce_cmq_setup_basic_desc(&desc[0], HNS_ROCE_OPC_QUERY_PF_RES,
> -				      true);
> +	hns_roce_cmq_setup_basic_desc(&desc[0], opcode, true);
>   	desc[0].flag |= cpu_to_le16(HNS_ROCE_CMD_FLAG_NEXT);
> -
> -	hns_roce_cmq_setup_basic_desc(&desc[1], HNS_ROCE_OPC_QUERY_PF_RES,
> -				      true);
> +	hns_roce_cmq_setup_basic_desc(&desc[1], opcode, true);
>   
>   	ret = hns_roce_cmq_send(hr_dev, desc, 2);
>   	if (ret)
>   		return ret;
>   
> -	req_a = (struct hns_roce_pf_res_a *)desc[0].data;
> -	req_b = (struct hns_roce_pf_res_b *)desc[1].data;
> -
> -	hr_dev->caps.qpc_bt_num = roce_get_field(req_a->qpc_bt_idx_num,
> -						 PF_RES_DATA_1_PF_QPC_BT_NUM_M,
> -						 PF_RES_DATA_1_PF_QPC_BT_NUM_S);
> -	hr_dev->caps.srqc_bt_num = roce_get_field(req_a->srqc_bt_idx_num,
> -						PF_RES_DATA_2_PF_SRQC_BT_NUM_M,
> -						PF_RES_DATA_2_PF_SRQC_BT_NUM_S);
> -	hr_dev->caps.cqc_bt_num = roce_get_field(req_a->cqc_bt_idx_num,
> -						 PF_RES_DATA_3_PF_CQC_BT_NUM_M,
> -						 PF_RES_DATA_3_PF_CQC_BT_NUM_S);
> -	hr_dev->caps.mpt_bt_num = roce_get_field(req_a->mpt_bt_idx_num,
> -						 PF_RES_DATA_4_PF_MPT_BT_NUM_M,
> -						 PF_RES_DATA_4_PF_MPT_BT_NUM_S);
> -
> -	hr_dev->caps.sl_num = roce_get_field(req_b->qid_idx_sl_num,
> -					     PF_RES_DATA_3_PF_SL_NUM_M,
> -					     PF_RES_DATA_3_PF_SL_NUM_S);
> -	hr_dev->caps.sccc_bt_num = roce_get_field(req_b->sccc_bt_idx_num,
> -					     PF_RES_DATA_4_PF_SCCC_BT_NUM_M,
> -					     PF_RES_DATA_4_PF_SCCC_BT_NUM_S);
> -
> -	hr_dev->caps.gmv_bt_num = roce_get_field(req_b->gmv_idx_num,
> -						 PF_RES_DATA_5_PF_GMV_BT_NUM_M,
> -						 PF_RES_DATA_5_PF_GMV_BT_NUM_S);
> +	caps->qpc_bt_num = hr_reg_read(r_a, FUNC_RES_A_QPC_BT_NUM);
> +	caps->srqc_bt_num = hr_reg_read(r_a, FUNC_RES_A_SRQC_BT_NUM);
> +	caps->cqc_bt_num = hr_reg_read(r_a, FUNC_RES_A_CQC_BT_NUM);
> +	caps->mpt_bt_num = hr_reg_read(r_a, FUNC_RES_A_MPT_BT_NUM);
> +	caps->sccc_bt_num = hr_reg_read(r_b, FUNC_RES_B_SCCC_BT_NUM);
> +	caps->sl_num = hr_reg_read(r_b, FUNC_RES_B_QID_NUM);
> +	caps->gmv_bt_num = hr_reg_read(r_b, FUNC_RES_B_GMV_BT_NUM);
>   
>   	return 0;
>   }
>   
>   static int hns_roce_query_pf_timer_resource(struct hns_roce_dev *hr_dev)
>   {
> -	struct hns_roce_pf_timer_res_a *req_a;
>   	struct hns_roce_cmq_desc desc;
> +	struct hns_roce_cmq_req *req = (struct hns_roce_cmq_req *)desc.data;
> +	struct hns_roce_caps *caps = &hr_dev->caps;
>   	int ret;
>   
>   	hns_roce_cmq_setup_basic_desc(&desc, HNS_ROCE_OPC_QUERY_PF_TIMER_RES,
> @@ -1703,16 +1677,8 @@ static int hns_roce_query_pf_timer_resource(struct hns_roce_dev *hr_dev)
>   	if (ret)
>   		return ret;
>   
> -	req_a = (struct hns_roce_pf_timer_res_a *)desc.data;
> -
> -	hr_dev->caps.qpc_timer_bt_num =
> -		roce_get_field(req_a->qpc_timer_bt_idx_num,
> -			       PF_RES_DATA_1_PF_QPC_TIMER_BT_NUM_M,
> -			       PF_RES_DATA_1_PF_QPC_TIMER_BT_NUM_S);
> -	hr_dev->caps.cqc_timer_bt_num =
> -		roce_get_field(req_a->cqc_timer_bt_idx_num,
> -			       PF_RES_DATA_2_PF_CQC_TIMER_BT_NUM_M,
> -			       PF_RES_DATA_2_PF_CQC_TIMER_BT_NUM_S);
> +	caps->qpc_timer_bt_num = hr_reg_read(req, PF_TIMER_RES_QPC_ITEM_NUM);
> +	caps->cqc_timer_bt_num = hr_reg_read(req, PF_TIMER_RES_CQC_ITEM_NUM);
>   
>   	return 0;
>   }
> @@ -1745,73 +1711,32 @@ static int hns_roce_set_vf_switch_param(struct hns_roce_dev *hr_dev, int vf_id)
>   static int hns_roce_alloc_vf_resource(struct hns_roce_dev *hr_dev)
>   {
>   	struct hns_roce_cmq_desc desc[2];
> -	struct hns_roce_vf_res_a *req_a;
> -	struct hns_roce_vf_res_b *req_b;
> -
> -	req_a = (struct hns_roce_vf_res_a *)desc[0].data;
> -	req_b = (struct hns_roce_vf_res_b *)desc[1].data;
> +	struct hns_roce_cmq_req *r_a = (struct hns_roce_cmq_req *)desc[0].data;
> +	struct hns_roce_cmq_req *r_b = (struct hns_roce_cmq_req *)desc[1].data;
> +	enum hns_roce_opcode_type opcode = HNS_ROCE_OPC_ALLOC_VF_RES;
>   
> -	hns_roce_cmq_setup_basic_desc(&desc[0], HNS_ROCE_OPC_ALLOC_VF_RES,
> -				      false);
> +	hns_roce_cmq_setup_basic_desc(&desc[0], opcode, false);
>   	desc[0].flag |= cpu_to_le16(HNS_ROCE_CMD_FLAG_NEXT);
> +	hns_roce_cmq_setup_basic_desc(&desc[1], opcode, false);
>   
> -	hns_roce_cmq_setup_basic_desc(&desc[1], HNS_ROCE_OPC_ALLOC_VF_RES,
> -				      false);
> -
> -	roce_set_field(req_a->vf_qpc_bt_idx_num,
> -		       VF_RES_A_DATA_1_VF_QPC_BT_IDX_M,
> -		       VF_RES_A_DATA_1_VF_QPC_BT_IDX_S, 0);
> -	roce_set_field(req_a->vf_qpc_bt_idx_num,
> -		       VF_RES_A_DATA_1_VF_QPC_BT_NUM_M,
> -		       VF_RES_A_DATA_1_VF_QPC_BT_NUM_S, HNS_ROCE_VF_QPC_BT_NUM);
> -
> -	roce_set_field(req_a->vf_srqc_bt_idx_num,
> -		       VF_RES_A_DATA_2_VF_SRQC_BT_IDX_M,
> -		       VF_RES_A_DATA_2_VF_SRQC_BT_IDX_S, 0);
> -	roce_set_field(req_a->vf_srqc_bt_idx_num,
> -		       VF_RES_A_DATA_2_VF_SRQC_BT_NUM_M,
> -		       VF_RES_A_DATA_2_VF_SRQC_BT_NUM_S,
> -		       HNS_ROCE_VF_SRQC_BT_NUM);
> -
> -	roce_set_field(req_a->vf_cqc_bt_idx_num,
> -		       VF_RES_A_DATA_3_VF_CQC_BT_IDX_M,
> -		       VF_RES_A_DATA_3_VF_CQC_BT_IDX_S, 0);
> -	roce_set_field(req_a->vf_cqc_bt_idx_num,
> -		       VF_RES_A_DATA_3_VF_CQC_BT_NUM_M,
> -		       VF_RES_A_DATA_3_VF_CQC_BT_NUM_S, HNS_ROCE_VF_CQC_BT_NUM);
> -
> -	roce_set_field(req_a->vf_mpt_bt_idx_num,
> -		       VF_RES_A_DATA_4_VF_MPT_BT_IDX_M,
> -		       VF_RES_A_DATA_4_VF_MPT_BT_IDX_S, 0);
> -	roce_set_field(req_a->vf_mpt_bt_idx_num,
> -		       VF_RES_A_DATA_4_VF_MPT_BT_NUM_M,
> -		       VF_RES_A_DATA_4_VF_MPT_BT_NUM_S, HNS_ROCE_VF_MPT_BT_NUM);
> -
> -	roce_set_field(req_a->vf_eqc_bt_idx_num, VF_RES_A_DATA_5_VF_EQC_IDX_M,
> -		       VF_RES_A_DATA_5_VF_EQC_IDX_S, 0);
> -	roce_set_field(req_a->vf_eqc_bt_idx_num, VF_RES_A_DATA_5_VF_EQC_NUM_M,
> -		       VF_RES_A_DATA_5_VF_EQC_NUM_S, HNS_ROCE_VF_EQC_NUM);
> -
> -	roce_set_field(req_b->vf_smac_idx_num, VF_RES_B_DATA_1_VF_SMAC_IDX_M,
> -		       VF_RES_B_DATA_1_VF_SMAC_IDX_S, 0);
> -	roce_set_field(req_b->vf_smac_idx_num, VF_RES_B_DATA_1_VF_SMAC_NUM_M,
> -		       VF_RES_B_DATA_1_VF_SMAC_NUM_S, HNS_ROCE_VF_SMAC_NUM);
> -
> -	roce_set_field(req_b->vf_sgid_idx_num, VF_RES_B_DATA_2_VF_SGID_IDX_M,
> -		       VF_RES_B_DATA_2_VF_SGID_IDX_S, 0);
> -	roce_set_field(req_b->vf_sgid_idx_num, VF_RES_B_DATA_2_VF_SGID_NUM_M,
> -		       VF_RES_B_DATA_2_VF_SGID_NUM_S, HNS_ROCE_VF_SGID_NUM);
> -
> -	roce_set_field(req_b->vf_qid_idx_sl_num, VF_RES_B_DATA_3_VF_QID_IDX_M,
> -		       VF_RES_B_DATA_3_VF_QID_IDX_S, 0);
> -	roce_set_field(req_b->vf_qid_idx_sl_num, VF_RES_B_DATA_3_VF_SL_NUM_M,
> -		       VF_RES_B_DATA_3_VF_SL_NUM_S, HNS_ROCE_VF_SL_NUM);
> -
> -	roce_set_field(req_b->vf_sccc_idx_num, VF_RES_B_DATA_4_VF_SCCC_BT_IDX_M,
> -		       VF_RES_B_DATA_4_VF_SCCC_BT_IDX_S, 0);
> -	roce_set_field(req_b->vf_sccc_idx_num, VF_RES_B_DATA_4_VF_SCCC_BT_NUM_M,
> -		       VF_RES_B_DATA_4_VF_SCCC_BT_NUM_S,
> -		       HNS_ROCE_VF_SCCC_BT_NUM);
> +	hr_reg_write(r_a, FUNC_RES_A_QPC_BT_NUM, HNS_ROCE_VF_QPC_BT_NUM);
> +	hr_reg_write(r_a, FUNC_RES_A_QPC_BT_IDX, 0);
> +	hr_reg_write(r_a, FUNC_RES_A_SRQC_BT_NUM, HNS_ROCE_VF_SRQC_BT_NUM);
> +	hr_reg_write(r_a, FUNC_RES_A_SRQC_BT_IDX, 0);
> +	hr_reg_write(r_a, FUNC_RES_A_CQC_BT_NUM, HNS_ROCE_VF_CQC_BT_NUM);
> +	hr_reg_write(r_a, FUNC_RES_A_CQC_BT_IDX, 0);
> +	hr_reg_write(r_a, FUNC_RES_A_MPT_BT_NUM, HNS_ROCE_VF_MPT_BT_NUM);
> +	hr_reg_write(r_a, FUNC_RES_A_MPT_BT_IDX, 0);
> +	hr_reg_write(r_a, FUNC_RES_A_EQC_BT_NUM, HNS_ROCE_VF_EQC_NUM);
> +	hr_reg_write(r_a, FUNC_RES_A_EQC_BT_IDX, 0);
> +	hr_reg_write(r_b, FUNC_RES_B_SMAC_NUM, HNS_ROCE_VF_SMAC_NUM);
> +	hr_reg_write(r_b, FUNC_RES_B_SMAC_IDX, 0);
> +	hr_reg_write(r_b, FUNC_RES_B_SGID_NUM, HNS_ROCE_VF_SGID_NUM);
> +	hr_reg_write(r_b, FUNC_RES_B_SGID_IDX, 0);
> +	hr_reg_write(r_b, FUNC_RES_V_QID_NUM, HNS_ROCE_VF_SL_NUM);
> +	hr_reg_write(r_b, FUNC_RES_B_QID_IDX, 0);
> +	hr_reg_write(r_b, FUNC_RES_B_SCCC_BT_NUM, HNS_ROCE_VF_SCCC_BT_NUM);
> +	hr_reg_write(r_b, FUNC_RES_B_SCCC_BT_IDX, 0);
>   
>   	return hns_roce_cmq_send(hr_dev, desc, 2);
>   }
> diff --git a/drivers/infiniband/hw/hns/hns_roce_hw_v2.h b/drivers/infiniband/hw/hns/hns_roce_hw_v2.h
> index 44a3abdd..44be39a 100644
> --- a/drivers/infiniband/hw/hns/hns_roce_hw_v2.h
> +++ b/drivers/infiniband/hw/hns/hns_roce_hw_v2.h
> @@ -1363,194 +1363,43 @@ struct hns_roce_cfg_llm_b {
>   #define CFG_LLM_TAIL_PTR_S 0
>   #define CFG_LLM_TAIL_PTR_M GENMASK(11, 0)
>   
> -struct hns_roce_cfg_global_param {
> -	__le32 time_cfg_udp_port;
> -	__le32 rsv[5];
> -};
> -
> -#define CFG_GLOBAL_PARAM_DATA_0_ROCEE_TIME_1US_CFG_S 0
> -#define CFG_GLOBAL_PARAM_DATA_0_ROCEE_TIME_1US_CFG_M GENMASK(9, 0)
> -
> -#define CFG_GLOBAL_PARAM_DATA_0_ROCEE_UDP_PORT_S 16
> -#define CFG_GLOBAL_PARAM_DATA_0_ROCEE_UDP_PORT_M GENMASK(31, 16)
> -
> -struct hns_roce_pf_res_a {
> -	__le32	rsv;
> -	__le32	qpc_bt_idx_num;
> -	__le32	srqc_bt_idx_num;
> -	__le32	cqc_bt_idx_num;
> -	__le32	mpt_bt_idx_num;
> -	__le32	eqc_bt_idx_num;
> -};
> -
> -#define PF_RES_DATA_1_PF_QPC_BT_IDX_S 0
> -#define PF_RES_DATA_1_PF_QPC_BT_IDX_M GENMASK(10, 0)
> -
> -#define PF_RES_DATA_1_PF_QPC_BT_NUM_S 16
> -#define PF_RES_DATA_1_PF_QPC_BT_NUM_M GENMASK(27, 16)
> -
> -#define PF_RES_DATA_2_PF_SRQC_BT_IDX_S 0
> -#define PF_RES_DATA_2_PF_SRQC_BT_IDX_M GENMASK(8, 0)
> -
> -#define PF_RES_DATA_2_PF_SRQC_BT_NUM_S 16
> -#define PF_RES_DATA_2_PF_SRQC_BT_NUM_M GENMASK(25, 16)
> -
> -#define PF_RES_DATA_3_PF_CQC_BT_IDX_S 0
> -#define PF_RES_DATA_3_PF_CQC_BT_IDX_M GENMASK(8, 0)
> -
> -#define PF_RES_DATA_3_PF_CQC_BT_NUM_S 16
> -#define PF_RES_DATA_3_PF_CQC_BT_NUM_M GENMASK(25, 16)
> -
> -#define PF_RES_DATA_4_PF_MPT_BT_IDX_S 0
> -#define PF_RES_DATA_4_PF_MPT_BT_IDX_M GENMASK(8, 0)
> -
> -#define PF_RES_DATA_4_PF_MPT_BT_NUM_S 16
> -#define PF_RES_DATA_4_PF_MPT_BT_NUM_M GENMASK(25, 16)
> -
> -#define PF_RES_DATA_5_PF_EQC_BT_IDX_S 0
> -#define PF_RES_DATA_5_PF_EQC_BT_IDX_M GENMASK(8, 0)
> -
> -#define PF_RES_DATA_5_PF_EQC_BT_NUM_S 16
> -#define PF_RES_DATA_5_PF_EQC_BT_NUM_M GENMASK(25, 16)
> -
> -struct hns_roce_pf_res_b {
> -	__le32	rsv0;
> -	__le32	smac_idx_num;
> -	__le32	sgid_idx_num;
> -	__le32	qid_idx_sl_num;
> -	__le32	sccc_bt_idx_num;
> -	__le32	gmv_idx_num;
> -};
> -
> -#define PF_RES_DATA_1_PF_SMAC_IDX_S 0
> -#define PF_RES_DATA_1_PF_SMAC_IDX_M GENMASK(7, 0)
> -
> -#define PF_RES_DATA_1_PF_SMAC_NUM_S 8
> -#define PF_RES_DATA_1_PF_SMAC_NUM_M GENMASK(16, 8)
> -
> -#define PF_RES_DATA_2_PF_SGID_IDX_S 0
> -#define PF_RES_DATA_2_PF_SGID_IDX_M GENMASK(7, 0)
> -
> -#define PF_RES_DATA_2_PF_SGID_NUM_S 8
> -#define PF_RES_DATA_2_PF_SGID_NUM_M GENMASK(16, 8)
> -
> -#define PF_RES_DATA_3_PF_QID_IDX_S 0
> -#define PF_RES_DATA_3_PF_QID_IDX_M GENMASK(9, 0)
> -
> -#define PF_RES_DATA_3_PF_SL_NUM_S 16
> -#define PF_RES_DATA_3_PF_SL_NUM_M GENMASK(26, 16)
> -
> -#define PF_RES_DATA_4_PF_SCCC_BT_IDX_S 0
> -#define PF_RES_DATA_4_PF_SCCC_BT_IDX_M GENMASK(8, 0)
> -
> -#define PF_RES_DATA_4_PF_SCCC_BT_NUM_S 9
> -#define PF_RES_DATA_4_PF_SCCC_BT_NUM_M GENMASK(17, 9)
> -
> -#define PF_RES_DATA_5_PF_GMV_BT_IDX_S 0
> -#define PF_RES_DATA_5_PF_GMV_BT_IDX_M GENMASK(7, 0)
> -
> -#define PF_RES_DATA_5_PF_GMV_BT_NUM_S 8
> -#define PF_RES_DATA_5_PF_GMV_BT_NUM_M GENMASK(16, 8)
> -
> -struct hns_roce_pf_timer_res_a {
> -	__le32	rsv0;
> -	__le32	qpc_timer_bt_idx_num;
> -	__le32	cqc_timer_bt_idx_num;
> -	__le32	rsv[3];
> -};
> +/* Fields of HNS_ROCE_OPC_CFG_GLOBAL_PARAM */
> +#define CFG_GLOBAL_PARAM_1US_CYCLES CMQ_REQ_FIELD_LOC(9, 0)
> +#define CFG_GLOBAL_PARAM_UDP_PORT CMQ_REQ_FIELD_LOC(31, 16)
>   
> -#define PF_RES_DATA_1_PF_QPC_TIMER_BT_IDX_S 0
> -#define PF_RES_DATA_1_PF_QPC_TIMER_BT_IDX_M GENMASK(11, 0)
> -
> -#define PF_RES_DATA_1_PF_QPC_TIMER_BT_NUM_S 16
> -#define PF_RES_DATA_1_PF_QPC_TIMER_BT_NUM_M GENMASK(28, 16)
> -
> -#define PF_RES_DATA_2_PF_CQC_TIMER_BT_IDX_S 0
> -#define PF_RES_DATA_2_PF_CQC_TIMER_BT_IDX_M GENMASK(10, 0)
> -
> -#define PF_RES_DATA_2_PF_CQC_TIMER_BT_NUM_S 16
> -#define PF_RES_DATA_2_PF_CQC_TIMER_BT_NUM_M GENMASK(27, 16)
> -
> -struct hns_roce_vf_res_a {
> -	__le32 vf_id;
> -	__le32 vf_qpc_bt_idx_num;
> -	__le32 vf_srqc_bt_idx_num;
> -	__le32 vf_cqc_bt_idx_num;
> -	__le32 vf_mpt_bt_idx_num;
> -	__le32 vf_eqc_bt_idx_num;
> -};
> -
> -#define VF_RES_A_DATA_1_VF_QPC_BT_IDX_S 0
> -#define VF_RES_A_DATA_1_VF_QPC_BT_IDX_M GENMASK(10, 0)
> -
> -#define VF_RES_A_DATA_1_VF_QPC_BT_NUM_S 16
> -#define VF_RES_A_DATA_1_VF_QPC_BT_NUM_M GENMASK(27, 16)
> -
> -#define VF_RES_A_DATA_2_VF_SRQC_BT_IDX_S 0
> -#define VF_RES_A_DATA_2_VF_SRQC_BT_IDX_M GENMASK(8, 0)
> -
> -#define VF_RES_A_DATA_2_VF_SRQC_BT_NUM_S 16
> -#define VF_RES_A_DATA_2_VF_SRQC_BT_NUM_M GENMASK(25, 16)
> -
> -#define VF_RES_A_DATA_3_VF_CQC_BT_IDX_S 0
> -#define VF_RES_A_DATA_3_VF_CQC_BT_IDX_M GENMASK(8, 0)
> -
> -#define VF_RES_A_DATA_3_VF_CQC_BT_NUM_S 16
> -#define VF_RES_A_DATA_3_VF_CQC_BT_NUM_M GENMASK(25, 16)
> -
> -#define VF_RES_A_DATA_4_VF_MPT_BT_IDX_S 0
> -#define VF_RES_A_DATA_4_VF_MPT_BT_IDX_M GENMASK(8, 0)
> -
> -#define VF_RES_A_DATA_4_VF_MPT_BT_NUM_S 16
> -#define VF_RES_A_DATA_4_VF_MPT_BT_NUM_M GENMASK(25, 16)
> -
> -#define VF_RES_A_DATA_5_VF_EQC_IDX_S 0
> -#define VF_RES_A_DATA_5_VF_EQC_IDX_M GENMASK(8, 0)
> -
> -#define VF_RES_A_DATA_5_VF_EQC_NUM_S 16
> -#define VF_RES_A_DATA_5_VF_EQC_NUM_M GENMASK(25, 16)
> -
> -struct hns_roce_vf_res_b {
> -	__le32 rsv0;
> -	__le32 vf_smac_idx_num;
> -	__le32 vf_sgid_idx_num;
> -	__le32 vf_qid_idx_sl_num;
> -	__le32 vf_sccc_idx_num;
> -	__le32 vf_gmv_idx_num;
> -};
> -
> -#define VF_RES_B_DATA_0_VF_ID_S 0
> -#define VF_RES_B_DATA_0_VF_ID_M GENMASK(7, 0)
> -
> -#define VF_RES_B_DATA_1_VF_SMAC_IDX_S 0
> -#define VF_RES_B_DATA_1_VF_SMAC_IDX_M GENMASK(7, 0)
> -
> -#define VF_RES_B_DATA_1_VF_SMAC_NUM_S 8
> -#define VF_RES_B_DATA_1_VF_SMAC_NUM_M GENMASK(16, 8)
> -
> -#define VF_RES_B_DATA_2_VF_SGID_IDX_S 0
> -#define VF_RES_B_DATA_2_VF_SGID_IDX_M GENMASK(7, 0)
> -
> -#define VF_RES_B_DATA_2_VF_SGID_NUM_S 8
> -#define VF_RES_B_DATA_2_VF_SGID_NUM_M GENMASK(16, 8)
> -
> -#define VF_RES_B_DATA_3_VF_QID_IDX_S 0
> -#define VF_RES_B_DATA_3_VF_QID_IDX_M GENMASK(9, 0)
> -
> -#define VF_RES_B_DATA_3_VF_SL_NUM_S 16
> -#define VF_RES_B_DATA_3_VF_SL_NUM_M GENMASK(19, 16)
> -
> -#define VF_RES_B_DATA_4_VF_SCCC_BT_IDX_S 0
> -#define VF_RES_B_DATA_4_VF_SCCC_BT_IDX_M GENMASK(8, 0)
> -
> -#define VF_RES_B_DATA_4_VF_SCCC_BT_NUM_S 9
> -#define VF_RES_B_DATA_4_VF_SCCC_BT_NUM_M GENMASK(17, 9)
> -
> -#define VF_RES_B_DATA_5_VF_GMV_BT_IDX_S 0
> -#define VF_RES_B_DATA_5_VF_GMV_BT_IDX_M GENMASK(7, 0)
> -
> -#define VF_RES_B_DATA_5_VF_GMV_BT_NUM_S 16
> -#define VF_RES_B_DATA_5_VF_GMV_BT_NUM_M GENMASK(24, 16)
> +/*
> + * Fields of HNS_ROCE_OPC_QUERY_PF_RES and HNS_ROCE_OPC_ALLOC_VF_RES
> + */
> +#define FUNC_RES_A_VF_ID CMQ_REQ_FIELD_LOC(7, 0)
> +#define FUNC_RES_A_QPC_BT_IDX CMQ_REQ_FIELD_LOC(42, 32)
> +#define FUNC_RES_A_QPC_BT_NUM CMQ_REQ_FIELD_LOC(59, 48)
> +#define FUNC_RES_A_SRQC_BT_IDX CMQ_REQ_FIELD_LOC(72, 64)
> +#define FUNC_RES_A_SRQC_BT_NUM CMQ_REQ_FIELD_LOC(89, 80)
> +#define FUNC_RES_A_CQC_BT_IDX CMQ_REQ_FIELD_LOC(104, 96)
> +#define FUNC_RES_A_CQC_BT_NUM CMQ_REQ_FIELD_LOC(121, 112)
> +#define FUNC_RES_A_MPT_BT_IDX CMQ_REQ_FIELD_LOC(136, 128)
> +#define FUNC_RES_A_MPT_BT_NUM CMQ_REQ_FIELD_LOC(153, 144)
> +#define FUNC_RES_A_EQC_BT_IDX CMQ_REQ_FIELD_LOC(168, 160)
> +#define FUNC_RES_A_EQC_BT_NUM CMQ_REQ_FIELD_LOC(185, 176)
> +#define FUNC_RES_B_SMAC_IDX CMQ_REQ_FIELD_LOC(39, 32)
> +#define FUNC_RES_B_SMAC_NUM CMQ_REQ_FIELD_LOC(48, 40)
> +#define FUNC_RES_B_SGID_IDX CMQ_REQ_FIELD_LOC(71, 64)
> +#define FUNC_RES_B_SGID_NUM CMQ_REQ_FIELD_LOC(80, 72)
> +#define FUNC_RES_B_QID_IDX CMQ_REQ_FIELD_LOC(105, 96)
> +#define FUNC_RES_B_QID_NUM CMQ_REQ_FIELD_LOC(122, 112)
> +#define FUNC_RES_V_QID_NUM CMQ_REQ_FIELD_LOC(115, 112)
> +
> +#define FUNC_RES_B_SCCC_BT_IDX CMQ_REQ_FIELD_LOC(136, 128)
> +#define FUNC_RES_B_SCCC_BT_NUM CMQ_REQ_FIELD_LOC(145, 137)
> +#define FUNC_RES_B_GMV_BT_IDX CMQ_REQ_FIELD_LOC(167, 160)
> +#define FUNC_RES_B_GMV_BT_NUM CMQ_REQ_FIELD_LOC(176, 168)
> +#define FUNC_RES_V_GMV_BT_NUM CMQ_REQ_FIELD_LOC(184, 176)
> +
> +/* Fields of HNS_ROCE_OPC_QUERY_PF_TIMER_RES */
> +#define PF_TIMER_RES_QPC_ITEM_IDX CMQ_REQ_FIELD_LOC(43, 32)
> +#define PF_TIMER_RES_QPC_ITEM_NUM CMQ_REQ_FIELD_LOC(60, 48)
> +#define PF_TIMER_RES_CQC_ITEM_IDX CMQ_REQ_FIELD_LOC(74, 64)
> +#define PF_TIMER_RES_CQC_ITEM_NUM CMQ_REQ_FIELD_LOC(91, 80)
>   
>   struct hns_roce_vf_switch {
>   	__le32 rocee_sel;
>
Weihang Li April 6, 2021, 11:56 a.m. UTC | #2
On 2021/4/2 20:17, chenglang wrote:
>> diff --git a/drivers/infiniband/hw/hns/hns_roce_common.h b/drivers/infiniband/hw/hns/hns_roce_common.h
>> index 23c438c..5b5fedf 100644
>> --- a/drivers/infiniband/hw/hns/hns_roce_common.h
>> +++ b/drivers/infiniband/hw/hns/hns_roce_common.h
>> @@ -87,6 +87,17 @@
>>   
>>   #define hr_reg_write(ptr, field, val) _hr_reg_write(ptr, field, val)
>>   
>> +#define _hr_reg_read(ptr, field_type, field_h, field_l)                        \
>> +	({                                                                     \
>> +		const field_type *_ptr = ptr;                                  \
>> +		BUILD_BUG_ON(((field_h) / 32) != ((field_l) / 32));            \
>> +		((le32_to_cpu(*((__le32 *)_ptr + (field_h) / 32)) &            \
>> +		  GENMASK((field_h) % 32, (field_l) % 32)) >>                  \
>> +		 ((field_l) % 32));                                            \
>> +	})
> I will try this:
> 
> #define _hr_reg_read(ptr, field_type, field_h, field_l) 
> 
> 	({
> 		const field_type *_ptr = ptr;
> 		FIELD_GET(GENMASK((field_h) % 32, (field_l) % 32),
> 			  le32_to_cpu(*((__le32 *)_ptr +(field_h)/32)))
> 		+ BUILD_BUG_ON_ZERO(((field_h) / 32) != ((field_l) / 32));
> 	})
> 
> 
> Thanks.
> 

OK, I will send v2 instead.

Thanks
Weihang
diff mbox series

Patch

diff --git a/drivers/infiniband/hw/hns/hns_roce_common.h b/drivers/infiniband/hw/hns/hns_roce_common.h
index 23c438c..5b5fedf 100644
--- a/drivers/infiniband/hw/hns/hns_roce_common.h
+++ b/drivers/infiniband/hw/hns/hns_roce_common.h
@@ -87,6 +87,17 @@ 
 
 #define hr_reg_write(ptr, field, val) _hr_reg_write(ptr, field, val)
 
+#define _hr_reg_read(ptr, field_type, field_h, field_l)                        \
+	({                                                                     \
+		const field_type *_ptr = ptr;                                  \
+		BUILD_BUG_ON(((field_h) / 32) != ((field_l) / 32));            \
+		((le32_to_cpu(*((__le32 *)_ptr + (field_h) / 32)) &            \
+		  GENMASK((field_h) % 32, (field_l) % 32)) >>                  \
+		 ((field_l) % 32));                                            \
+	})
+
+#define hr_reg_read(ptr, field) _hr_reg_read(ptr, field)
+
 #define ROCEE_GLB_CFG_ROCEE_DB_SQ_MODE_S 3
 #define ROCEE_GLB_CFG_ROCEE_DB_OTH_MODE_S 4
 
diff --git a/drivers/infiniband/hw/hns/hns_roce_hw_v2.c b/drivers/infiniband/hw/hns/hns_roce_hw_v2.c
index cc334d5c..0695c2c 100644
--- a/drivers/infiniband/hw/hns/hns_roce_hw_v2.c
+++ b/drivers/infiniband/hw/hns/hns_roce_hw_v2.c
@@ -1623,21 +1623,14 @@  static int hns_roce_query_func_info(struct hns_roce_dev *hr_dev)
 
 static int hns_roce_config_global_param(struct hns_roce_dev *hr_dev)
 {
-	struct hns_roce_cfg_global_param *req;
 	struct hns_roce_cmq_desc desc;
+	struct hns_roce_cmq_req *req = (struct hns_roce_cmq_req *)desc.data;
 
 	hns_roce_cmq_setup_basic_desc(&desc, HNS_ROCE_OPC_CFG_GLOBAL_PARAM,
 				      false);
 
-	req = (struct hns_roce_cfg_global_param *)desc.data;
-	memset(req, 0, sizeof(*req));
-	roce_set_field(req->time_cfg_udp_port,
-		       CFG_GLOBAL_PARAM_DATA_0_ROCEE_TIME_1US_CFG_M,
-		       CFG_GLOBAL_PARAM_DATA_0_ROCEE_TIME_1US_CFG_S, 0x3e8);
-	roce_set_field(req->time_cfg_udp_port,
-		       CFG_GLOBAL_PARAM_DATA_0_ROCEE_UDP_PORT_M,
-		       CFG_GLOBAL_PARAM_DATA_0_ROCEE_UDP_PORT_S,
-		       ROCE_V2_UDP_DPORT);
+	hr_reg_write(req, CFG_GLOBAL_PARAM_1US_CYCLES, 0x3e8);
+	hr_reg_write(req, CFG_GLOBAL_PARAM_UDP_PORT, ROCE_V2_UDP_DPORT);
 
 	return hns_roce_cmq_send(hr_dev, &desc, 1);
 }
@@ -1645,55 +1638,36 @@  static int hns_roce_config_global_param(struct hns_roce_dev *hr_dev)
 static int hns_roce_query_pf_resource(struct hns_roce_dev *hr_dev)
 {
 	struct hns_roce_cmq_desc desc[2];
-	struct hns_roce_pf_res_a *req_a;
-	struct hns_roce_pf_res_b *req_b;
+	struct hns_roce_cmq_req *r_a = (struct hns_roce_cmq_req *)desc[0].data;
+	struct hns_roce_cmq_req *r_b = (struct hns_roce_cmq_req *)desc[1].data;
+	enum hns_roce_opcode_type opcode = HNS_ROCE_OPC_QUERY_PF_RES;
+	struct hns_roce_caps *caps = &hr_dev->caps;
 	int ret;
 
-	hns_roce_cmq_setup_basic_desc(&desc[0], HNS_ROCE_OPC_QUERY_PF_RES,
-				      true);
+	hns_roce_cmq_setup_basic_desc(&desc[0], opcode, true);
 	desc[0].flag |= cpu_to_le16(HNS_ROCE_CMD_FLAG_NEXT);
-
-	hns_roce_cmq_setup_basic_desc(&desc[1], HNS_ROCE_OPC_QUERY_PF_RES,
-				      true);
+	hns_roce_cmq_setup_basic_desc(&desc[1], opcode, true);
 
 	ret = hns_roce_cmq_send(hr_dev, desc, 2);
 	if (ret)
 		return ret;
 
-	req_a = (struct hns_roce_pf_res_a *)desc[0].data;
-	req_b = (struct hns_roce_pf_res_b *)desc[1].data;
-
-	hr_dev->caps.qpc_bt_num = roce_get_field(req_a->qpc_bt_idx_num,
-						 PF_RES_DATA_1_PF_QPC_BT_NUM_M,
-						 PF_RES_DATA_1_PF_QPC_BT_NUM_S);
-	hr_dev->caps.srqc_bt_num = roce_get_field(req_a->srqc_bt_idx_num,
-						PF_RES_DATA_2_PF_SRQC_BT_NUM_M,
-						PF_RES_DATA_2_PF_SRQC_BT_NUM_S);
-	hr_dev->caps.cqc_bt_num = roce_get_field(req_a->cqc_bt_idx_num,
-						 PF_RES_DATA_3_PF_CQC_BT_NUM_M,
-						 PF_RES_DATA_3_PF_CQC_BT_NUM_S);
-	hr_dev->caps.mpt_bt_num = roce_get_field(req_a->mpt_bt_idx_num,
-						 PF_RES_DATA_4_PF_MPT_BT_NUM_M,
-						 PF_RES_DATA_4_PF_MPT_BT_NUM_S);
-
-	hr_dev->caps.sl_num = roce_get_field(req_b->qid_idx_sl_num,
-					     PF_RES_DATA_3_PF_SL_NUM_M,
-					     PF_RES_DATA_3_PF_SL_NUM_S);
-	hr_dev->caps.sccc_bt_num = roce_get_field(req_b->sccc_bt_idx_num,
-					     PF_RES_DATA_4_PF_SCCC_BT_NUM_M,
-					     PF_RES_DATA_4_PF_SCCC_BT_NUM_S);
-
-	hr_dev->caps.gmv_bt_num = roce_get_field(req_b->gmv_idx_num,
-						 PF_RES_DATA_5_PF_GMV_BT_NUM_M,
-						 PF_RES_DATA_5_PF_GMV_BT_NUM_S);
+	caps->qpc_bt_num = hr_reg_read(r_a, FUNC_RES_A_QPC_BT_NUM);
+	caps->srqc_bt_num = hr_reg_read(r_a, FUNC_RES_A_SRQC_BT_NUM);
+	caps->cqc_bt_num = hr_reg_read(r_a, FUNC_RES_A_CQC_BT_NUM);
+	caps->mpt_bt_num = hr_reg_read(r_a, FUNC_RES_A_MPT_BT_NUM);
+	caps->sccc_bt_num = hr_reg_read(r_b, FUNC_RES_B_SCCC_BT_NUM);
+	caps->sl_num = hr_reg_read(r_b, FUNC_RES_B_QID_NUM);
+	caps->gmv_bt_num = hr_reg_read(r_b, FUNC_RES_B_GMV_BT_NUM);
 
 	return 0;
 }
 
 static int hns_roce_query_pf_timer_resource(struct hns_roce_dev *hr_dev)
 {
-	struct hns_roce_pf_timer_res_a *req_a;
 	struct hns_roce_cmq_desc desc;
+	struct hns_roce_cmq_req *req = (struct hns_roce_cmq_req *)desc.data;
+	struct hns_roce_caps *caps = &hr_dev->caps;
 	int ret;
 
 	hns_roce_cmq_setup_basic_desc(&desc, HNS_ROCE_OPC_QUERY_PF_TIMER_RES,
@@ -1703,16 +1677,8 @@  static int hns_roce_query_pf_timer_resource(struct hns_roce_dev *hr_dev)
 	if (ret)
 		return ret;
 
-	req_a = (struct hns_roce_pf_timer_res_a *)desc.data;
-
-	hr_dev->caps.qpc_timer_bt_num =
-		roce_get_field(req_a->qpc_timer_bt_idx_num,
-			       PF_RES_DATA_1_PF_QPC_TIMER_BT_NUM_M,
-			       PF_RES_DATA_1_PF_QPC_TIMER_BT_NUM_S);
-	hr_dev->caps.cqc_timer_bt_num =
-		roce_get_field(req_a->cqc_timer_bt_idx_num,
-			       PF_RES_DATA_2_PF_CQC_TIMER_BT_NUM_M,
-			       PF_RES_DATA_2_PF_CQC_TIMER_BT_NUM_S);
+	caps->qpc_timer_bt_num = hr_reg_read(req, PF_TIMER_RES_QPC_ITEM_NUM);
+	caps->cqc_timer_bt_num = hr_reg_read(req, PF_TIMER_RES_CQC_ITEM_NUM);
 
 	return 0;
 }
@@ -1745,73 +1711,32 @@  static int hns_roce_set_vf_switch_param(struct hns_roce_dev *hr_dev, int vf_id)
 static int hns_roce_alloc_vf_resource(struct hns_roce_dev *hr_dev)
 {
 	struct hns_roce_cmq_desc desc[2];
-	struct hns_roce_vf_res_a *req_a;
-	struct hns_roce_vf_res_b *req_b;
-
-	req_a = (struct hns_roce_vf_res_a *)desc[0].data;
-	req_b = (struct hns_roce_vf_res_b *)desc[1].data;
+	struct hns_roce_cmq_req *r_a = (struct hns_roce_cmq_req *)desc[0].data;
+	struct hns_roce_cmq_req *r_b = (struct hns_roce_cmq_req *)desc[1].data;
+	enum hns_roce_opcode_type opcode = HNS_ROCE_OPC_ALLOC_VF_RES;
 
-	hns_roce_cmq_setup_basic_desc(&desc[0], HNS_ROCE_OPC_ALLOC_VF_RES,
-				      false);
+	hns_roce_cmq_setup_basic_desc(&desc[0], opcode, false);
 	desc[0].flag |= cpu_to_le16(HNS_ROCE_CMD_FLAG_NEXT);
+	hns_roce_cmq_setup_basic_desc(&desc[1], opcode, false);
 
-	hns_roce_cmq_setup_basic_desc(&desc[1], HNS_ROCE_OPC_ALLOC_VF_RES,
-				      false);
-
-	roce_set_field(req_a->vf_qpc_bt_idx_num,
-		       VF_RES_A_DATA_1_VF_QPC_BT_IDX_M,
-		       VF_RES_A_DATA_1_VF_QPC_BT_IDX_S, 0);
-	roce_set_field(req_a->vf_qpc_bt_idx_num,
-		       VF_RES_A_DATA_1_VF_QPC_BT_NUM_M,
-		       VF_RES_A_DATA_1_VF_QPC_BT_NUM_S, HNS_ROCE_VF_QPC_BT_NUM);
-
-	roce_set_field(req_a->vf_srqc_bt_idx_num,
-		       VF_RES_A_DATA_2_VF_SRQC_BT_IDX_M,
-		       VF_RES_A_DATA_2_VF_SRQC_BT_IDX_S, 0);
-	roce_set_field(req_a->vf_srqc_bt_idx_num,
-		       VF_RES_A_DATA_2_VF_SRQC_BT_NUM_M,
-		       VF_RES_A_DATA_2_VF_SRQC_BT_NUM_S,
-		       HNS_ROCE_VF_SRQC_BT_NUM);
-
-	roce_set_field(req_a->vf_cqc_bt_idx_num,
-		       VF_RES_A_DATA_3_VF_CQC_BT_IDX_M,
-		       VF_RES_A_DATA_3_VF_CQC_BT_IDX_S, 0);
-	roce_set_field(req_a->vf_cqc_bt_idx_num,
-		       VF_RES_A_DATA_3_VF_CQC_BT_NUM_M,
-		       VF_RES_A_DATA_3_VF_CQC_BT_NUM_S, HNS_ROCE_VF_CQC_BT_NUM);
-
-	roce_set_field(req_a->vf_mpt_bt_idx_num,
-		       VF_RES_A_DATA_4_VF_MPT_BT_IDX_M,
-		       VF_RES_A_DATA_4_VF_MPT_BT_IDX_S, 0);
-	roce_set_field(req_a->vf_mpt_bt_idx_num,
-		       VF_RES_A_DATA_4_VF_MPT_BT_NUM_M,
-		       VF_RES_A_DATA_4_VF_MPT_BT_NUM_S, HNS_ROCE_VF_MPT_BT_NUM);
-
-	roce_set_field(req_a->vf_eqc_bt_idx_num, VF_RES_A_DATA_5_VF_EQC_IDX_M,
-		       VF_RES_A_DATA_5_VF_EQC_IDX_S, 0);
-	roce_set_field(req_a->vf_eqc_bt_idx_num, VF_RES_A_DATA_5_VF_EQC_NUM_M,
-		       VF_RES_A_DATA_5_VF_EQC_NUM_S, HNS_ROCE_VF_EQC_NUM);
-
-	roce_set_field(req_b->vf_smac_idx_num, VF_RES_B_DATA_1_VF_SMAC_IDX_M,
-		       VF_RES_B_DATA_1_VF_SMAC_IDX_S, 0);
-	roce_set_field(req_b->vf_smac_idx_num, VF_RES_B_DATA_1_VF_SMAC_NUM_M,
-		       VF_RES_B_DATA_1_VF_SMAC_NUM_S, HNS_ROCE_VF_SMAC_NUM);
-
-	roce_set_field(req_b->vf_sgid_idx_num, VF_RES_B_DATA_2_VF_SGID_IDX_M,
-		       VF_RES_B_DATA_2_VF_SGID_IDX_S, 0);
-	roce_set_field(req_b->vf_sgid_idx_num, VF_RES_B_DATA_2_VF_SGID_NUM_M,
-		       VF_RES_B_DATA_2_VF_SGID_NUM_S, HNS_ROCE_VF_SGID_NUM);
-
-	roce_set_field(req_b->vf_qid_idx_sl_num, VF_RES_B_DATA_3_VF_QID_IDX_M,
-		       VF_RES_B_DATA_3_VF_QID_IDX_S, 0);
-	roce_set_field(req_b->vf_qid_idx_sl_num, VF_RES_B_DATA_3_VF_SL_NUM_M,
-		       VF_RES_B_DATA_3_VF_SL_NUM_S, HNS_ROCE_VF_SL_NUM);
-
-	roce_set_field(req_b->vf_sccc_idx_num, VF_RES_B_DATA_4_VF_SCCC_BT_IDX_M,
-		       VF_RES_B_DATA_4_VF_SCCC_BT_IDX_S, 0);
-	roce_set_field(req_b->vf_sccc_idx_num, VF_RES_B_DATA_4_VF_SCCC_BT_NUM_M,
-		       VF_RES_B_DATA_4_VF_SCCC_BT_NUM_S,
-		       HNS_ROCE_VF_SCCC_BT_NUM);
+	hr_reg_write(r_a, FUNC_RES_A_QPC_BT_NUM, HNS_ROCE_VF_QPC_BT_NUM);
+	hr_reg_write(r_a, FUNC_RES_A_QPC_BT_IDX, 0);
+	hr_reg_write(r_a, FUNC_RES_A_SRQC_BT_NUM, HNS_ROCE_VF_SRQC_BT_NUM);
+	hr_reg_write(r_a, FUNC_RES_A_SRQC_BT_IDX, 0);
+	hr_reg_write(r_a, FUNC_RES_A_CQC_BT_NUM, HNS_ROCE_VF_CQC_BT_NUM);
+	hr_reg_write(r_a, FUNC_RES_A_CQC_BT_IDX, 0);
+	hr_reg_write(r_a, FUNC_RES_A_MPT_BT_NUM, HNS_ROCE_VF_MPT_BT_NUM);
+	hr_reg_write(r_a, FUNC_RES_A_MPT_BT_IDX, 0);
+	hr_reg_write(r_a, FUNC_RES_A_EQC_BT_NUM, HNS_ROCE_VF_EQC_NUM);
+	hr_reg_write(r_a, FUNC_RES_A_EQC_BT_IDX, 0);
+	hr_reg_write(r_b, FUNC_RES_B_SMAC_NUM, HNS_ROCE_VF_SMAC_NUM);
+	hr_reg_write(r_b, FUNC_RES_B_SMAC_IDX, 0);
+	hr_reg_write(r_b, FUNC_RES_B_SGID_NUM, HNS_ROCE_VF_SGID_NUM);
+	hr_reg_write(r_b, FUNC_RES_B_SGID_IDX, 0);
+	hr_reg_write(r_b, FUNC_RES_V_QID_NUM, HNS_ROCE_VF_SL_NUM);
+	hr_reg_write(r_b, FUNC_RES_B_QID_IDX, 0);
+	hr_reg_write(r_b, FUNC_RES_B_SCCC_BT_NUM, HNS_ROCE_VF_SCCC_BT_NUM);
+	hr_reg_write(r_b, FUNC_RES_B_SCCC_BT_IDX, 0);
 
 	return hns_roce_cmq_send(hr_dev, desc, 2);
 }
diff --git a/drivers/infiniband/hw/hns/hns_roce_hw_v2.h b/drivers/infiniband/hw/hns/hns_roce_hw_v2.h
index 44a3abdd..44be39a 100644
--- a/drivers/infiniband/hw/hns/hns_roce_hw_v2.h
+++ b/drivers/infiniband/hw/hns/hns_roce_hw_v2.h
@@ -1363,194 +1363,43 @@  struct hns_roce_cfg_llm_b {
 #define CFG_LLM_TAIL_PTR_S 0
 #define CFG_LLM_TAIL_PTR_M GENMASK(11, 0)
 
-struct hns_roce_cfg_global_param {
-	__le32 time_cfg_udp_port;
-	__le32 rsv[5];
-};
-
-#define CFG_GLOBAL_PARAM_DATA_0_ROCEE_TIME_1US_CFG_S 0
-#define CFG_GLOBAL_PARAM_DATA_0_ROCEE_TIME_1US_CFG_M GENMASK(9, 0)
-
-#define CFG_GLOBAL_PARAM_DATA_0_ROCEE_UDP_PORT_S 16
-#define CFG_GLOBAL_PARAM_DATA_0_ROCEE_UDP_PORT_M GENMASK(31, 16)
-
-struct hns_roce_pf_res_a {
-	__le32	rsv;
-	__le32	qpc_bt_idx_num;
-	__le32	srqc_bt_idx_num;
-	__le32	cqc_bt_idx_num;
-	__le32	mpt_bt_idx_num;
-	__le32	eqc_bt_idx_num;
-};
-
-#define PF_RES_DATA_1_PF_QPC_BT_IDX_S 0
-#define PF_RES_DATA_1_PF_QPC_BT_IDX_M GENMASK(10, 0)
-
-#define PF_RES_DATA_1_PF_QPC_BT_NUM_S 16
-#define PF_RES_DATA_1_PF_QPC_BT_NUM_M GENMASK(27, 16)
-
-#define PF_RES_DATA_2_PF_SRQC_BT_IDX_S 0
-#define PF_RES_DATA_2_PF_SRQC_BT_IDX_M GENMASK(8, 0)
-
-#define PF_RES_DATA_2_PF_SRQC_BT_NUM_S 16
-#define PF_RES_DATA_2_PF_SRQC_BT_NUM_M GENMASK(25, 16)
-
-#define PF_RES_DATA_3_PF_CQC_BT_IDX_S 0
-#define PF_RES_DATA_3_PF_CQC_BT_IDX_M GENMASK(8, 0)
-
-#define PF_RES_DATA_3_PF_CQC_BT_NUM_S 16
-#define PF_RES_DATA_3_PF_CQC_BT_NUM_M GENMASK(25, 16)
-
-#define PF_RES_DATA_4_PF_MPT_BT_IDX_S 0
-#define PF_RES_DATA_4_PF_MPT_BT_IDX_M GENMASK(8, 0)
-
-#define PF_RES_DATA_4_PF_MPT_BT_NUM_S 16
-#define PF_RES_DATA_4_PF_MPT_BT_NUM_M GENMASK(25, 16)
-
-#define PF_RES_DATA_5_PF_EQC_BT_IDX_S 0
-#define PF_RES_DATA_5_PF_EQC_BT_IDX_M GENMASK(8, 0)
-
-#define PF_RES_DATA_5_PF_EQC_BT_NUM_S 16
-#define PF_RES_DATA_5_PF_EQC_BT_NUM_M GENMASK(25, 16)
-
-struct hns_roce_pf_res_b {
-	__le32	rsv0;
-	__le32	smac_idx_num;
-	__le32	sgid_idx_num;
-	__le32	qid_idx_sl_num;
-	__le32	sccc_bt_idx_num;
-	__le32	gmv_idx_num;
-};
-
-#define PF_RES_DATA_1_PF_SMAC_IDX_S 0
-#define PF_RES_DATA_1_PF_SMAC_IDX_M GENMASK(7, 0)
-
-#define PF_RES_DATA_1_PF_SMAC_NUM_S 8
-#define PF_RES_DATA_1_PF_SMAC_NUM_M GENMASK(16, 8)
-
-#define PF_RES_DATA_2_PF_SGID_IDX_S 0
-#define PF_RES_DATA_2_PF_SGID_IDX_M GENMASK(7, 0)
-
-#define PF_RES_DATA_2_PF_SGID_NUM_S 8
-#define PF_RES_DATA_2_PF_SGID_NUM_M GENMASK(16, 8)
-
-#define PF_RES_DATA_3_PF_QID_IDX_S 0
-#define PF_RES_DATA_3_PF_QID_IDX_M GENMASK(9, 0)
-
-#define PF_RES_DATA_3_PF_SL_NUM_S 16
-#define PF_RES_DATA_3_PF_SL_NUM_M GENMASK(26, 16)
-
-#define PF_RES_DATA_4_PF_SCCC_BT_IDX_S 0
-#define PF_RES_DATA_4_PF_SCCC_BT_IDX_M GENMASK(8, 0)
-
-#define PF_RES_DATA_4_PF_SCCC_BT_NUM_S 9
-#define PF_RES_DATA_4_PF_SCCC_BT_NUM_M GENMASK(17, 9)
-
-#define PF_RES_DATA_5_PF_GMV_BT_IDX_S 0
-#define PF_RES_DATA_5_PF_GMV_BT_IDX_M GENMASK(7, 0)
-
-#define PF_RES_DATA_5_PF_GMV_BT_NUM_S 8
-#define PF_RES_DATA_5_PF_GMV_BT_NUM_M GENMASK(16, 8)
-
-struct hns_roce_pf_timer_res_a {
-	__le32	rsv0;
-	__le32	qpc_timer_bt_idx_num;
-	__le32	cqc_timer_bt_idx_num;
-	__le32	rsv[3];
-};
+/* Fields of HNS_ROCE_OPC_CFG_GLOBAL_PARAM */
+#define CFG_GLOBAL_PARAM_1US_CYCLES CMQ_REQ_FIELD_LOC(9, 0)
+#define CFG_GLOBAL_PARAM_UDP_PORT CMQ_REQ_FIELD_LOC(31, 16)
 
-#define PF_RES_DATA_1_PF_QPC_TIMER_BT_IDX_S 0
-#define PF_RES_DATA_1_PF_QPC_TIMER_BT_IDX_M GENMASK(11, 0)
-
-#define PF_RES_DATA_1_PF_QPC_TIMER_BT_NUM_S 16
-#define PF_RES_DATA_1_PF_QPC_TIMER_BT_NUM_M GENMASK(28, 16)
-
-#define PF_RES_DATA_2_PF_CQC_TIMER_BT_IDX_S 0
-#define PF_RES_DATA_2_PF_CQC_TIMER_BT_IDX_M GENMASK(10, 0)
-
-#define PF_RES_DATA_2_PF_CQC_TIMER_BT_NUM_S 16
-#define PF_RES_DATA_2_PF_CQC_TIMER_BT_NUM_M GENMASK(27, 16)
-
-struct hns_roce_vf_res_a {
-	__le32 vf_id;
-	__le32 vf_qpc_bt_idx_num;
-	__le32 vf_srqc_bt_idx_num;
-	__le32 vf_cqc_bt_idx_num;
-	__le32 vf_mpt_bt_idx_num;
-	__le32 vf_eqc_bt_idx_num;
-};
-
-#define VF_RES_A_DATA_1_VF_QPC_BT_IDX_S 0
-#define VF_RES_A_DATA_1_VF_QPC_BT_IDX_M GENMASK(10, 0)
-
-#define VF_RES_A_DATA_1_VF_QPC_BT_NUM_S 16
-#define VF_RES_A_DATA_1_VF_QPC_BT_NUM_M GENMASK(27, 16)
-
-#define VF_RES_A_DATA_2_VF_SRQC_BT_IDX_S 0
-#define VF_RES_A_DATA_2_VF_SRQC_BT_IDX_M GENMASK(8, 0)
-
-#define VF_RES_A_DATA_2_VF_SRQC_BT_NUM_S 16
-#define VF_RES_A_DATA_2_VF_SRQC_BT_NUM_M GENMASK(25, 16)
-
-#define VF_RES_A_DATA_3_VF_CQC_BT_IDX_S 0
-#define VF_RES_A_DATA_3_VF_CQC_BT_IDX_M GENMASK(8, 0)
-
-#define VF_RES_A_DATA_3_VF_CQC_BT_NUM_S 16
-#define VF_RES_A_DATA_3_VF_CQC_BT_NUM_M GENMASK(25, 16)
-
-#define VF_RES_A_DATA_4_VF_MPT_BT_IDX_S 0
-#define VF_RES_A_DATA_4_VF_MPT_BT_IDX_M GENMASK(8, 0)
-
-#define VF_RES_A_DATA_4_VF_MPT_BT_NUM_S 16
-#define VF_RES_A_DATA_4_VF_MPT_BT_NUM_M GENMASK(25, 16)
-
-#define VF_RES_A_DATA_5_VF_EQC_IDX_S 0
-#define VF_RES_A_DATA_5_VF_EQC_IDX_M GENMASK(8, 0)
-
-#define VF_RES_A_DATA_5_VF_EQC_NUM_S 16
-#define VF_RES_A_DATA_5_VF_EQC_NUM_M GENMASK(25, 16)
-
-struct hns_roce_vf_res_b {
-	__le32 rsv0;
-	__le32 vf_smac_idx_num;
-	__le32 vf_sgid_idx_num;
-	__le32 vf_qid_idx_sl_num;
-	__le32 vf_sccc_idx_num;
-	__le32 vf_gmv_idx_num;
-};
-
-#define VF_RES_B_DATA_0_VF_ID_S 0
-#define VF_RES_B_DATA_0_VF_ID_M GENMASK(7, 0)
-
-#define VF_RES_B_DATA_1_VF_SMAC_IDX_S 0
-#define VF_RES_B_DATA_1_VF_SMAC_IDX_M GENMASK(7, 0)
-
-#define VF_RES_B_DATA_1_VF_SMAC_NUM_S 8
-#define VF_RES_B_DATA_1_VF_SMAC_NUM_M GENMASK(16, 8)
-
-#define VF_RES_B_DATA_2_VF_SGID_IDX_S 0
-#define VF_RES_B_DATA_2_VF_SGID_IDX_M GENMASK(7, 0)
-
-#define VF_RES_B_DATA_2_VF_SGID_NUM_S 8
-#define VF_RES_B_DATA_2_VF_SGID_NUM_M GENMASK(16, 8)
-
-#define VF_RES_B_DATA_3_VF_QID_IDX_S 0
-#define VF_RES_B_DATA_3_VF_QID_IDX_M GENMASK(9, 0)
-
-#define VF_RES_B_DATA_3_VF_SL_NUM_S 16
-#define VF_RES_B_DATA_3_VF_SL_NUM_M GENMASK(19, 16)
-
-#define VF_RES_B_DATA_4_VF_SCCC_BT_IDX_S 0
-#define VF_RES_B_DATA_4_VF_SCCC_BT_IDX_M GENMASK(8, 0)
-
-#define VF_RES_B_DATA_4_VF_SCCC_BT_NUM_S 9
-#define VF_RES_B_DATA_4_VF_SCCC_BT_NUM_M GENMASK(17, 9)
-
-#define VF_RES_B_DATA_5_VF_GMV_BT_IDX_S 0
-#define VF_RES_B_DATA_5_VF_GMV_BT_IDX_M GENMASK(7, 0)
-
-#define VF_RES_B_DATA_5_VF_GMV_BT_NUM_S 16
-#define VF_RES_B_DATA_5_VF_GMV_BT_NUM_M GENMASK(24, 16)
+/*
+ * Fields of HNS_ROCE_OPC_QUERY_PF_RES and HNS_ROCE_OPC_ALLOC_VF_RES
+ */
+#define FUNC_RES_A_VF_ID CMQ_REQ_FIELD_LOC(7, 0)
+#define FUNC_RES_A_QPC_BT_IDX CMQ_REQ_FIELD_LOC(42, 32)
+#define FUNC_RES_A_QPC_BT_NUM CMQ_REQ_FIELD_LOC(59, 48)
+#define FUNC_RES_A_SRQC_BT_IDX CMQ_REQ_FIELD_LOC(72, 64)
+#define FUNC_RES_A_SRQC_BT_NUM CMQ_REQ_FIELD_LOC(89, 80)
+#define FUNC_RES_A_CQC_BT_IDX CMQ_REQ_FIELD_LOC(104, 96)
+#define FUNC_RES_A_CQC_BT_NUM CMQ_REQ_FIELD_LOC(121, 112)
+#define FUNC_RES_A_MPT_BT_IDX CMQ_REQ_FIELD_LOC(136, 128)
+#define FUNC_RES_A_MPT_BT_NUM CMQ_REQ_FIELD_LOC(153, 144)
+#define FUNC_RES_A_EQC_BT_IDX CMQ_REQ_FIELD_LOC(168, 160)
+#define FUNC_RES_A_EQC_BT_NUM CMQ_REQ_FIELD_LOC(185, 176)
+#define FUNC_RES_B_SMAC_IDX CMQ_REQ_FIELD_LOC(39, 32)
+#define FUNC_RES_B_SMAC_NUM CMQ_REQ_FIELD_LOC(48, 40)
+#define FUNC_RES_B_SGID_IDX CMQ_REQ_FIELD_LOC(71, 64)
+#define FUNC_RES_B_SGID_NUM CMQ_REQ_FIELD_LOC(80, 72)
+#define FUNC_RES_B_QID_IDX CMQ_REQ_FIELD_LOC(105, 96)
+#define FUNC_RES_B_QID_NUM CMQ_REQ_FIELD_LOC(122, 112)
+#define FUNC_RES_V_QID_NUM CMQ_REQ_FIELD_LOC(115, 112)
+
+#define FUNC_RES_B_SCCC_BT_IDX CMQ_REQ_FIELD_LOC(136, 128)
+#define FUNC_RES_B_SCCC_BT_NUM CMQ_REQ_FIELD_LOC(145, 137)
+#define FUNC_RES_B_GMV_BT_IDX CMQ_REQ_FIELD_LOC(167, 160)
+#define FUNC_RES_B_GMV_BT_NUM CMQ_REQ_FIELD_LOC(176, 168)
+#define FUNC_RES_V_GMV_BT_NUM CMQ_REQ_FIELD_LOC(184, 176)
+
+/* Fields of HNS_ROCE_OPC_QUERY_PF_TIMER_RES */
+#define PF_TIMER_RES_QPC_ITEM_IDX CMQ_REQ_FIELD_LOC(43, 32)
+#define PF_TIMER_RES_QPC_ITEM_NUM CMQ_REQ_FIELD_LOC(60, 48)
+#define PF_TIMER_RES_CQC_ITEM_IDX CMQ_REQ_FIELD_LOC(74, 64)
+#define PF_TIMER_RES_CQC_ITEM_NUM CMQ_REQ_FIELD_LOC(91, 80)
 
 struct hns_roce_vf_switch {
 	__le32 rocee_sel;