mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-05 18:41:58 +09:00
RDMA/erdma: Use fixed hardware page size
[ Upstream commitd649c638dc] Hardware's page size is 4096, but the kernel's page size may vary. Driver should use hardware's page size when communicating with hardware. Fixes:1550557717("RDMA/erdma: Add verbs implementation") Link: https://lore.kernel.org/r/20230307102924.70577-2-chengyou@linux.alibaba.com Signed-off-by: Cheng Xu <chengyou@linux.alibaba.com> Signed-off-by: Jason Gunthorpe <jgg@nvidia.com> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
bb0433ae6f
commit
7d374becc0
@@ -112,6 +112,10 @@
|
|||||||
|
|
||||||
#define ERDMA_PAGE_SIZE_SUPPORT 0x7FFFF000
|
#define ERDMA_PAGE_SIZE_SUPPORT 0x7FFFF000
|
||||||
|
|
||||||
|
/* Hardware page size definition */
|
||||||
|
#define ERDMA_HW_PAGE_SHIFT 12
|
||||||
|
#define ERDMA_HW_PAGE_SIZE 4096
|
||||||
|
|
||||||
/* WQE related. */
|
/* WQE related. */
|
||||||
#define EQE_SIZE 16
|
#define EQE_SIZE 16
|
||||||
#define EQE_SHIFT 4
|
#define EQE_SHIFT 4
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ static int create_qp_cmd(struct erdma_dev *dev, struct erdma_qp *qp)
|
|||||||
FIELD_PREP(ERDMA_CMD_CREATE_QP_PD_MASK, pd->pdn);
|
FIELD_PREP(ERDMA_CMD_CREATE_QP_PD_MASK, pd->pdn);
|
||||||
|
|
||||||
if (rdma_is_kernel_res(&qp->ibqp.res)) {
|
if (rdma_is_kernel_res(&qp->ibqp.res)) {
|
||||||
u32 pgsz_range = ilog2(SZ_1M) - PAGE_SHIFT;
|
u32 pgsz_range = ilog2(SZ_1M) - ERDMA_HW_PAGE_SHIFT;
|
||||||
|
|
||||||
req.sq_cqn_mtt_cfg =
|
req.sq_cqn_mtt_cfg =
|
||||||
FIELD_PREP(ERDMA_CMD_CREATE_QP_PAGE_SIZE_MASK,
|
FIELD_PREP(ERDMA_CMD_CREATE_QP_PAGE_SIZE_MASK,
|
||||||
@@ -66,13 +66,13 @@ static int create_qp_cmd(struct erdma_dev *dev, struct erdma_qp *qp)
|
|||||||
user_qp = &qp->user_qp;
|
user_qp = &qp->user_qp;
|
||||||
req.sq_cqn_mtt_cfg = FIELD_PREP(
|
req.sq_cqn_mtt_cfg = FIELD_PREP(
|
||||||
ERDMA_CMD_CREATE_QP_PAGE_SIZE_MASK,
|
ERDMA_CMD_CREATE_QP_PAGE_SIZE_MASK,
|
||||||
ilog2(user_qp->sq_mtt.page_size) - PAGE_SHIFT);
|
ilog2(user_qp->sq_mtt.page_size) - ERDMA_HW_PAGE_SHIFT);
|
||||||
req.sq_cqn_mtt_cfg |=
|
req.sq_cqn_mtt_cfg |=
|
||||||
FIELD_PREP(ERDMA_CMD_CREATE_QP_CQN_MASK, qp->scq->cqn);
|
FIELD_PREP(ERDMA_CMD_CREATE_QP_CQN_MASK, qp->scq->cqn);
|
||||||
|
|
||||||
req.rq_cqn_mtt_cfg = FIELD_PREP(
|
req.rq_cqn_mtt_cfg = FIELD_PREP(
|
||||||
ERDMA_CMD_CREATE_QP_PAGE_SIZE_MASK,
|
ERDMA_CMD_CREATE_QP_PAGE_SIZE_MASK,
|
||||||
ilog2(user_qp->rq_mtt.page_size) - PAGE_SHIFT);
|
ilog2(user_qp->rq_mtt.page_size) - ERDMA_HW_PAGE_SHIFT);
|
||||||
req.rq_cqn_mtt_cfg |=
|
req.rq_cqn_mtt_cfg |=
|
||||||
FIELD_PREP(ERDMA_CMD_CREATE_QP_CQN_MASK, qp->rcq->cqn);
|
FIELD_PREP(ERDMA_CMD_CREATE_QP_CQN_MASK, qp->rcq->cqn);
|
||||||
|
|
||||||
@@ -163,7 +163,7 @@ static int create_cq_cmd(struct erdma_dev *dev, struct erdma_cq *cq)
|
|||||||
if (rdma_is_kernel_res(&cq->ibcq.res)) {
|
if (rdma_is_kernel_res(&cq->ibcq.res)) {
|
||||||
page_size = SZ_32M;
|
page_size = SZ_32M;
|
||||||
req.cfg0 |= FIELD_PREP(ERDMA_CMD_CREATE_CQ_PAGESIZE_MASK,
|
req.cfg0 |= FIELD_PREP(ERDMA_CMD_CREATE_CQ_PAGESIZE_MASK,
|
||||||
ilog2(page_size) - PAGE_SHIFT);
|
ilog2(page_size) - ERDMA_HW_PAGE_SHIFT);
|
||||||
req.qbuf_addr_l = lower_32_bits(cq->kern_cq.qbuf_dma_addr);
|
req.qbuf_addr_l = lower_32_bits(cq->kern_cq.qbuf_dma_addr);
|
||||||
req.qbuf_addr_h = upper_32_bits(cq->kern_cq.qbuf_dma_addr);
|
req.qbuf_addr_h = upper_32_bits(cq->kern_cq.qbuf_dma_addr);
|
||||||
|
|
||||||
@@ -176,8 +176,9 @@ static int create_cq_cmd(struct erdma_dev *dev, struct erdma_cq *cq)
|
|||||||
cq->kern_cq.qbuf_dma_addr + (cq->depth << CQE_SHIFT);
|
cq->kern_cq.qbuf_dma_addr + (cq->depth << CQE_SHIFT);
|
||||||
} else {
|
} else {
|
||||||
mtt = &cq->user_cq.qbuf_mtt;
|
mtt = &cq->user_cq.qbuf_mtt;
|
||||||
req.cfg0 |= FIELD_PREP(ERDMA_CMD_CREATE_CQ_PAGESIZE_MASK,
|
req.cfg0 |=
|
||||||
ilog2(mtt->page_size) - PAGE_SHIFT);
|
FIELD_PREP(ERDMA_CMD_CREATE_CQ_PAGESIZE_MASK,
|
||||||
|
ilog2(mtt->page_size) - ERDMA_HW_PAGE_SHIFT);
|
||||||
if (mtt->mtt_nents == 1) {
|
if (mtt->mtt_nents == 1) {
|
||||||
req.qbuf_addr_l = lower_32_bits(*(u64 *)mtt->mtt_buf);
|
req.qbuf_addr_l = lower_32_bits(*(u64 *)mtt->mtt_buf);
|
||||||
req.qbuf_addr_h = upper_32_bits(*(u64 *)mtt->mtt_buf);
|
req.qbuf_addr_h = upper_32_bits(*(u64 *)mtt->mtt_buf);
|
||||||
@@ -618,7 +619,7 @@ static int init_user_qp(struct erdma_qp *qp, struct erdma_ucontext *uctx,
|
|||||||
u32 rq_offset;
|
u32 rq_offset;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
if (len < (PAGE_ALIGN(qp->attrs.sq_size * SQEBB_SIZE) +
|
if (len < (ALIGN(qp->attrs.sq_size * SQEBB_SIZE, ERDMA_HW_PAGE_SIZE) +
|
||||||
qp->attrs.rq_size * RQE_SIZE))
|
qp->attrs.rq_size * RQE_SIZE))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
@@ -628,7 +629,7 @@ static int init_user_qp(struct erdma_qp *qp, struct erdma_ucontext *uctx,
|
|||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
rq_offset = PAGE_ALIGN(qp->attrs.sq_size << SQEBB_SHIFT);
|
rq_offset = ALIGN(qp->attrs.sq_size << SQEBB_SHIFT, ERDMA_HW_PAGE_SIZE);
|
||||||
qp->user_qp.rq_offset = rq_offset;
|
qp->user_qp.rq_offset = rq_offset;
|
||||||
|
|
||||||
ret = get_mtt_entries(qp->dev, &qp->user_qp.rq_mtt, va + rq_offset,
|
ret = get_mtt_entries(qp->dev, &qp->user_qp.rq_mtt, va + rq_offset,
|
||||||
|
|||||||
Reference in New Issue
Block a user