Re: [PATCH v4 for-next 1/3] RDMA/hns: Add SCC context allocation support for hip08

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Wed, Dec 05, 2018 at 05:41:42PM +0800, Lijun Ou wrote:
> From: Yangyang Li <liyangyang20@xxxxxxxxxx>
>
> This patch adds SCC context allocation and initialization support
> for DCQCN in kernel space driver.
>
> Signed-off-by: Yangyang Li <liyangyang20@xxxxxxxxxx>
> ---
>  drivers/infiniband/hw/hns/hns_roce_cmd.h    |  4 ++++
>  drivers/infiniband/hw/hns/hns_roce_device.h |  6 +++++
>  drivers/infiniband/hw/hns/hns_roce_hem.c    | 26 ++++++++++++++++++---
>  drivers/infiniband/hw/hns/hns_roce_hem.h    |  1 +
>  drivers/infiniband/hw/hns/hns_roce_hw_v2.c  | 35 ++++++++++++++++++++++++++++-
>  drivers/infiniband/hw/hns/hns_roce_hw_v2.h  | 23 +++++++++++++++++--
>  drivers/infiniband/hw/hns/hns_roce_main.c   | 18 +++++++++++++++
>  drivers/infiniband/hw/hns/hns_roce_qp.c     | 20 ++++++++++++++++-
>  8 files changed, 126 insertions(+), 7 deletions(-)
>
> diff --git a/drivers/infiniband/hw/hns/hns_roce_cmd.h b/drivers/infiniband/hw/hns/hns_roce_cmd.h
> index 927701d..5348282 100644
> --- a/drivers/infiniband/hw/hns/hns_roce_cmd.h
> +++ b/drivers/infiniband/hw/hns/hns_roce_cmd.h
> @@ -89,6 +89,10 @@ enum {
>  	HNS_ROCE_CMD_DESTROY_SRQC_BT1	= 0x39,
>  	HNS_ROCE_CMD_DESTROY_SRQC_BT2	= 0x3a,
>
> +	/* SCC CTX BT commands */
> +	HNS_ROCE_CMD_READ_SCC_CTX_BT0	= 0xa4,
> +	HNS_ROCE_CMD_WRITE_SCC_CTX_BT0	= 0xa5,
> +
>  	/* EQC commands */
>  	HNS_ROCE_CMD_CREATE_AEQC	= 0x80,
>  	HNS_ROCE_CMD_MODIFY_AEQC	= 0x81,
> diff --git a/drivers/infiniband/hw/hns/hns_roce_device.h b/drivers/infiniband/hw/hns/hns_roce_device.h
> index 779dd4c4..718b415 100644
> --- a/drivers/infiniband/hw/hns/hns_roce_device.h
> +++ b/drivers/infiniband/hw/hns/hns_roce_device.h
> @@ -482,6 +482,7 @@ struct hns_roce_qp_table {
>  	struct hns_roce_hem_table	qp_table;
>  	struct hns_roce_hem_table	irrl_table;
>  	struct hns_roce_hem_table	trrl_table;
> +	struct hns_roce_hem_table	scc_ctx_table;
>  };
>
>  struct hns_roce_cq_table {
> @@ -768,6 +769,7 @@ struct hns_roce_caps {
>  	int		irrl_entry_sz;
>  	int		trrl_entry_sz;
>  	int		cqc_entry_sz;
> +	int		scc_ctx_entry_sz;
>  	int		srqc_entry_sz;
>  	int		idx_entry_sz;
>  	u32		pbl_ba_pg_sz;
> @@ -780,6 +782,7 @@ struct hns_roce_caps {
>  	u32		srqc_bt_num;
>  	u32		cqc_bt_num;
>  	u32		mpt_bt_num;
> +	u32		scc_ctx_bt_num;
>  	u32		qpc_ba_pg_sz;
>  	u32		qpc_buf_pg_sz;
>  	u32		qpc_hop_num;
> @@ -795,6 +798,9 @@ struct hns_roce_caps {
>  	u32		mtt_ba_pg_sz;
>  	u32		mtt_buf_pg_sz;
>  	u32		mtt_hop_num;
> +	u32		scc_ctx_ba_pg_sz;
> +	u32		scc_ctx_buf_pg_sz;
> +	u32		scc_ctx_hop_num;
>  	u32		cqe_ba_pg_sz;
>  	u32		cqe_buf_pg_sz;
>  	u32		cqe_hop_num;
> diff --git a/drivers/infiniband/hw/hns/hns_roce_hem.c b/drivers/infiniband/hw/hns/hns_roce_hem.c
> index 4cdbcaf..9e4a2ba 100644
> --- a/drivers/infiniband/hw/hns/hns_roce_hem.c
> +++ b/drivers/infiniband/hw/hns/hns_roce_hem.c
> @@ -45,6 +45,7 @@ bool hns_roce_check_whether_mhop(struct hns_roce_dev *hr_dev, u32 type)
>  	    (hr_dev->caps.mpt_hop_num && type == HEM_TYPE_MTPT) ||
>  	    (hr_dev->caps.cqc_hop_num && type == HEM_TYPE_CQC) ||
>  	    (hr_dev->caps.srqc_hop_num && type == HEM_TYPE_SRQC) ||
> +	    (hr_dev->caps.scc_ctx_hop_num && type == HEM_TYPE_SCC_CTX) ||
>  	    (hr_dev->caps.cqe_hop_num && type == HEM_TYPE_CQE) ||
>  	    (hr_dev->caps.mtt_hop_num && type == HEM_TYPE_MTT) ||
>  	    (hr_dev->caps.srqwqe_hop_num && type == HEM_TYPE_SRQWQE) ||
> @@ -125,6 +126,14 @@ int hns_roce_calc_hem_mhop(struct hns_roce_dev *hr_dev,
>  		mhop->ba_l0_num = hr_dev->caps.cqc_bt_num;
>  		mhop->hop_num = hr_dev->caps.cqc_hop_num;
>  		break;
> +	case HEM_TYPE_SCC_CTX:
> +		mhop->buf_chunk_size = 1 << (hr_dev->caps.scc_ctx_buf_pg_sz
> +					     + PAGE_SHIFT);
> +		mhop->bt_chunk_size = 1 << (hr_dev->caps.scc_ctx_ba_pg_sz
> +					    + PAGE_SHIFT);
> +		mhop->ba_l0_num = hr_dev->caps.scc_ctx_bt_num;
> +		mhop->hop_num = hr_dev->caps.scc_ctx_hop_num;
> +		break;
>  	case HEM_TYPE_SRQC:
>  		mhop->buf_chunk_size = 1 << (hr_dev->caps.srqc_buf_pg_sz
>  					     + PAGE_SHIFT);
> @@ -175,7 +184,7 @@ int hns_roce_calc_hem_mhop(struct hns_roce_dev *hr_dev,
>  		return 0;
>
>  	/*
> -	 * QPC/MTPT/CQC/SRQC alloc hem for buffer pages.
> +	 * QPC/MTPT/CQC/SRQC/SCC_CTX alloc hem for buffer pages.
>  	 * MTT/CQE alloc hem for bt pages.
>  	 */
>  	bt_num = hns_roce_get_bt_num(table->type, mhop->hop_num);
> @@ -486,7 +495,7 @@ static int hns_roce_table_mhop_get(struct hns_roce_dev *hr_dev,
>  	}
>
>  	/*
> -	 * alloc buffer space chunk for QPC/MTPT/CQC/SRQC.
> +	 * alloc buffer space chunk for QPC/MTPT/CQC/SRQC/SCC_CTX.
>  	 * alloc bt space chunk for MTT/CQE.
>  	 */
>  	size = table->type < HEM_TYPE_MTT ? buf_chunk_size : bt_chunk_size;
> @@ -658,7 +667,7 @@ static void hns_roce_table_mhop_put(struct hns_roce_dev *hr_dev,
>  	}
>
>  	/*
> -	 * free buffer space chunk for QPC/MTPT/CQC/SRQC.
> +	 * free buffer space chunk for QPC/MTPT/CQC/SRQC/SCC_CTX.
>  	 * free bt space chunk for MTT/CQE.
>  	 */
>  	hns_roce_free_hem(hr_dev, table->hem[hem_idx]);
> @@ -904,6 +913,14 @@ int hns_roce_init_hem_table(struct hns_roce_dev *hr_dev,
>  			num_bt_l0 = hr_dev->caps.cqc_bt_num;
>  			hop_num = hr_dev->caps.cqc_hop_num;
>  			break;
> +		case HEM_TYPE_SCC_CTX:
> +			buf_chunk_size = 1 << (hr_dev->caps.scc_ctx_buf_pg_sz
> +					+ PAGE_SHIFT);
> +			bt_chunk_size = 1 << (hr_dev->caps.scc_ctx_ba_pg_sz
> +					+ PAGE_SHIFT);
> +			num_bt_l0 = hr_dev->caps.scc_ctx_bt_num;
> +			hop_num = hr_dev->caps.scc_ctx_hop_num;
> +			break;
>  		case HEM_TYPE_SRQC:
>  			buf_chunk_size = 1 << (hr_dev->caps.srqc_buf_pg_sz
>  					+ PAGE_SHIFT);
> @@ -1081,6 +1098,9 @@ void hns_roce_cleanup_hem(struct hns_roce_dev *hr_dev)
>  		hns_roce_cleanup_hem_table(hr_dev,
>  					   &hr_dev->srq_table.table);
>  	hns_roce_cleanup_hem_table(hr_dev, &hr_dev->cq_table.table);
> +	if (hr_dev->caps.scc_ctx_entry_sz)
> +		hns_roce_cleanup_hem_table(hr_dev,
> +					   &hr_dev->qp_table.scc_ctx_table);
>  	if (hr_dev->caps.trrl_entry_sz)
>  		hns_roce_cleanup_hem_table(hr_dev,
>  					   &hr_dev->qp_table.trrl_table);
> diff --git a/drivers/infiniband/hw/hns/hns_roce_hem.h b/drivers/infiniband/hw/hns/hns_roce_hem.h
> index a650278..6e4fe97 100644
> --- a/drivers/infiniband/hw/hns/hns_roce_hem.h
> +++ b/drivers/infiniband/hw/hns/hns_roce_hem.h
> @@ -44,6 +44,7 @@ enum {
>  	HEM_TYPE_MTPT,
>  	HEM_TYPE_CQC,
>  	HEM_TYPE_SRQC,
> +	HEM_TYPE_SCC_CTX,
>
>  	 /* UNMAP HEM */
>  	HEM_TYPE_MTT,
> diff --git a/drivers/infiniband/hw/hns/hns_roce_hw_v2.c b/drivers/infiniband/hw/hns/hns_roce_hw_v2.c
> index 835b783..77cfd9b 100644
> --- a/drivers/infiniband/hw/hns/hns_roce_hw_v2.c
> +++ b/drivers/infiniband/hw/hns/hns_roce_hw_v2.c
> @@ -1078,6 +1078,9 @@ static int hns_roce_query_pf_resource(struct hns_roce_dev *hr_dev)
>  	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.scc_ctx_bt_num = roce_get_field(req_b->scc_ctx_bt_idx_num,
> +					     PF_RES_DATA_4_PF_SCC_CTX_BT_NUM_M,
> +					     PF_RES_DATA_4_PF_SCC_CTX_BT_NUM_S);
>
>  	return 0;
>  }
> @@ -1178,6 +1181,7 @@ static int hns_roce_v2_set_bt(struct hns_roce_dev *hr_dev)
>  	u8 qpc_hop_num = hr_dev->caps.qpc_hop_num;
>  	u8 cqc_hop_num = hr_dev->caps.cqc_hop_num;
>  	u8 mpt_hop_num = hr_dev->caps.mpt_hop_num;
> +	u8 scc_ctx_hop_num = hr_dev->caps.scc_ctx_hop_num;
>  	struct hns_roce_cfg_bt_attr *req;
>  	struct hns_roce_cmq_desc desc;
>
> @@ -1225,6 +1229,20 @@ static int hns_roce_v2_set_bt(struct hns_roce_dev *hr_dev)
>  		       CFG_BT_ATTR_DATA_3_VF_MPT_HOPNUM_S,
>  		       mpt_hop_num == HNS_ROCE_HOP_NUM_0 ? 0 : mpt_hop_num);
>
> +	roce_set_field(req->vf_scc_ctx_cfg,
> +		       CFG_BT_ATTR_DATA_4_VF_SCC_CTX_BA_PGSZ_M,
> +		       CFG_BT_ATTR_DATA_4_VF_SCC_CTX_BA_PGSZ_S,
> +		       hr_dev->caps.scc_ctx_ba_pg_sz + PG_SHIFT_OFFSET);
> +	roce_set_field(req->vf_scc_ctx_cfg,
> +		       CFG_BT_ATTR_DATA_4_VF_SCC_CTX_BUF_PGSZ_M,
> +		       CFG_BT_ATTR_DATA_4_VF_SCC_CTX_BUF_PGSZ_S,
> +		       hr_dev->caps.scc_ctx_buf_pg_sz + PG_SHIFT_OFFSET);
> +	roce_set_field(req->vf_scc_ctx_cfg,
> +		       CFG_BT_ATTR_DATA_4_VF_SCC_CTX_HOPNUM_M,
> +		       CFG_BT_ATTR_DATA_4_VF_SCC_CTX_HOPNUM_S,
> +		       scc_ctx_hop_num ==
> +			      HNS_ROCE_HOP_NUM_0 ? 0 : scc_ctx_hop_num);
> +
>  	return hns_roce_cmq_send(hr_dev, &desc, 1);
>  }
>
> @@ -1372,9 +1390,14 @@ static int hns_roce_v2_profile(struct hns_roce_dev *hr_dev)
>  	caps->max_srq_wrs	= HNS_ROCE_V2_MAX_SRQ_WR;
>  	caps->max_srq_sges	= HNS_ROCE_V2_MAX_SRQ_SGE;
>
> -	if (hr_dev->pci_dev->revision == 0x21)
> +	if (hr_dev->pci_dev->revision == 0x21) {
>  		caps->flags |= HNS_ROCE_CAP_FLAG_ATOMIC |
>  			       HNS_ROCE_CAP_FLAG_SRQ;
> +		caps->scc_ctx_entry_sz	= HNS_ROCE_V2_SCC_CTX_ENTRY_SZ;
> +		caps->scc_ctx_ba_pg_sz	= 0;
> +		caps->scc_ctx_buf_pg_sz = 0;
> +		caps->scc_ctx_hop_num	= HNS_ROCE_SCC_CTX_HOP_NUM;
> +	}
>
>  	ret = hns_roce_v2_set_bt(hr_dev);
>  	if (ret)
> @@ -2618,6 +2641,13 @@ static int hns_roce_v2_set_hem(struct hns_roce_dev *hr_dev,
>  	case HEM_TYPE_SRQC:
>  		op = HNS_ROCE_CMD_WRITE_SRQC_BT0;
>  		break;
> +	case HEM_TYPE_SCC_CTX:
> +		if (step_idx) {
> +			/* No need to notify Hardware when step_idx is 1 or 2*/
> +			return 0;
> +		}
> +		op = HNS_ROCE_CMD_WRITE_SCC_CTX_BT0;
> +		break;
>  	default:
>  		dev_warn(dev, "Table %d not to be written by mailbox!\n",
>  			 table->type);
> @@ -2677,6 +2707,9 @@ static int hns_roce_v2_clear_hem(struct hns_roce_dev *hr_dev,
>  	case HEM_TYPE_CQC:
>  		op = HNS_ROCE_CMD_DESTROY_CQC_BT0;
>  		break;
> +	case HEM_TYPE_SCC_CTX:
> +		/* there is no need to destroy scc ctx */
> +		return 0;

Combination of "break" and "return" constructions in the same
switch<->case is a great way to shot yourself into the head.

Please don't mix them.

Thanks

Attachment: signature.asc
Description: PGP signature


[Index of Archives]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Photo]     [Yosemite News]     [Yosemite Photos]     [Linux Kernel]     [Linux SCSI]     [XFree86]

  Powered by Linux