RDMA/ocrdma: Prevent allocation of DPP PDs if FW doesnt support it
If DPP PDs are not supported by the FW, allocate only normal PDs. Signed-off-by: Mitesh Ahuja <mitesh.ahuja@avagotech.com> Signed-off-by: Padmanabh Ratnakar <padmanabh.ratnakar@avagotech.com> Signed-off-by: Selvin Xavier <selvin.xavier@avagotech.com> Signed-off-by: Doug Ledford <dledford@redhat.com>
This commit is contained in:
Родитель
038ab8b743
Коммит
59582d86e2
|
@ -1440,27 +1440,30 @@ static int ocrdma_mbx_alloc_pd_range(struct ocrdma_dev *dev)
|
|||
struct ocrdma_alloc_pd_range_rsp *rsp;
|
||||
|
||||
/* Pre allocate the DPP PDs */
|
||||
cmd = ocrdma_init_emb_mqe(OCRDMA_CMD_ALLOC_PD_RANGE, sizeof(*cmd));
|
||||
if (!cmd)
|
||||
return -ENOMEM;
|
||||
cmd->pd_count = dev->attr.max_dpp_pds;
|
||||
cmd->enable_dpp_rsvd |= OCRDMA_ALLOC_PD_ENABLE_DPP;
|
||||
status = ocrdma_mbx_cmd(dev, (struct ocrdma_mqe *)cmd);
|
||||
if (status)
|
||||
goto mbx_err;
|
||||
rsp = (struct ocrdma_alloc_pd_range_rsp *)cmd;
|
||||
if (dev->attr.max_dpp_pds) {
|
||||
cmd = ocrdma_init_emb_mqe(OCRDMA_CMD_ALLOC_PD_RANGE,
|
||||
sizeof(*cmd));
|
||||
if (!cmd)
|
||||
return -ENOMEM;
|
||||
cmd->pd_count = dev->attr.max_dpp_pds;
|
||||
cmd->enable_dpp_rsvd |= OCRDMA_ALLOC_PD_ENABLE_DPP;
|
||||
status = ocrdma_mbx_cmd(dev, (struct ocrdma_mqe *)cmd);
|
||||
rsp = (struct ocrdma_alloc_pd_range_rsp *)cmd;
|
||||
|
||||
if ((rsp->dpp_page_pdid & OCRDMA_ALLOC_PD_RSP_DPP) && rsp->pd_count) {
|
||||
dev->pd_mgr->dpp_page_index = rsp->dpp_page_pdid >>
|
||||
OCRDMA_ALLOC_PD_RSP_DPP_PAGE_SHIFT;
|
||||
dev->pd_mgr->pd_dpp_start = rsp->dpp_page_pdid &
|
||||
OCRDMA_ALLOC_PD_RNG_RSP_START_PDID_MASK;
|
||||
dev->pd_mgr->max_dpp_pd = rsp->pd_count;
|
||||
pd_bitmap_size = BITS_TO_LONGS(rsp->pd_count) * sizeof(long);
|
||||
dev->pd_mgr->pd_dpp_bitmap = kzalloc(pd_bitmap_size,
|
||||
GFP_KERNEL);
|
||||
if (!status && (rsp->dpp_page_pdid & OCRDMA_ALLOC_PD_RSP_DPP) &&
|
||||
rsp->pd_count) {
|
||||
dev->pd_mgr->dpp_page_index = rsp->dpp_page_pdid >>
|
||||
OCRDMA_ALLOC_PD_RSP_DPP_PAGE_SHIFT;
|
||||
dev->pd_mgr->pd_dpp_start = rsp->dpp_page_pdid &
|
||||
OCRDMA_ALLOC_PD_RNG_RSP_START_PDID_MASK;
|
||||
dev->pd_mgr->max_dpp_pd = rsp->pd_count;
|
||||
pd_bitmap_size =
|
||||
BITS_TO_LONGS(rsp->pd_count) * sizeof(long);
|
||||
dev->pd_mgr->pd_dpp_bitmap = kzalloc(pd_bitmap_size,
|
||||
GFP_KERNEL);
|
||||
}
|
||||
kfree(cmd);
|
||||
}
|
||||
kfree(cmd);
|
||||
|
||||
cmd = ocrdma_init_emb_mqe(OCRDMA_CMD_ALLOC_PD_RANGE, sizeof(*cmd));
|
||||
if (!cmd)
|
||||
|
@ -1468,10 +1471,8 @@ static int ocrdma_mbx_alloc_pd_range(struct ocrdma_dev *dev)
|
|||
|
||||
cmd->pd_count = dev->attr.max_pd - dev->attr.max_dpp_pds;
|
||||
status = ocrdma_mbx_cmd(dev, (struct ocrdma_mqe *)cmd);
|
||||
if (status)
|
||||
goto mbx_err;
|
||||
rsp = (struct ocrdma_alloc_pd_range_rsp *)cmd;
|
||||
if (rsp->pd_count) {
|
||||
if (!status && rsp->pd_count) {
|
||||
dev->pd_mgr->pd_norm_start = rsp->dpp_page_pdid &
|
||||
OCRDMA_ALLOC_PD_RNG_RSP_START_PDID_MASK;
|
||||
dev->pd_mgr->max_normal_pd = rsp->pd_count;
|
||||
|
@ -1479,15 +1480,13 @@ static int ocrdma_mbx_alloc_pd_range(struct ocrdma_dev *dev)
|
|||
dev->pd_mgr->pd_norm_bitmap = kzalloc(pd_bitmap_size,
|
||||
GFP_KERNEL);
|
||||
}
|
||||
kfree(cmd);
|
||||
|
||||
if (dev->pd_mgr->pd_norm_bitmap || dev->pd_mgr->pd_dpp_bitmap) {
|
||||
/* Enable PD resource manager */
|
||||
dev->pd_mgr->pd_prealloc_valid = true;
|
||||
} else {
|
||||
return -ENOMEM;
|
||||
return 0;
|
||||
}
|
||||
mbx_err:
|
||||
kfree(cmd);
|
||||
return status;
|
||||
}
|
||||
|
||||
|
|
|
@ -365,7 +365,7 @@ static struct ocrdma_pd *_ocrdma_alloc_pd(struct ocrdma_dev *dev,
|
|||
if (!pd)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
|
||||
if (udata && uctx) {
|
||||
if (udata && uctx && dev->attr.max_dpp_pds) {
|
||||
pd->dpp_enabled =
|
||||
ocrdma_get_asic_type(dev) == OCRDMA_ASIC_GEN_SKH_R;
|
||||
pd->num_dpp_qp =
|
||||
|
|
Загрузка…
Ссылка в новой задаче