67 lines
1.5 KiB
C
67 lines
1.5 KiB
C
// SPDX-License-Identifier: GPL-2.0
|
|
// Copyright(c) 2024 Huawei Technologies Co., Ltd
|
|
|
|
#include <linux/slab.h>
|
|
|
|
#include "roce.h"
|
|
#include "roce_main_extension.h"
|
|
#include "roce_pd.h"
|
|
|
|
int roce3_alloc_pd(struct ib_pd *ibpd, struct ib_udata *udata)
|
|
{
|
|
int ret;
|
|
struct roce3_pd *pd = to_roce3_pd(ibpd);
|
|
struct roce3_device *rdev = to_roce3_dev(ibpd->device);
|
|
|
|
if (roce3_hca_is_present(rdev) == 0) {
|
|
dev_err(rdev->hwdev_hdl,
|
|
"[ROCE] %s: HCA not present(return fail), func_id(%u)\n",
|
|
__func__, rdev->glb_func_id);
|
|
return -EPERM;
|
|
}
|
|
|
|
ret = roce3_rdma_pd_alloc(rdev->hwdev, &pd->pdn);
|
|
if (ret != 0) {
|
|
dev_err(rdev->hwdev_hdl,
|
|
"[ROCE, ERR] %s: Failed to alloc pdn, ret(%d), func_id(%u)\n",
|
|
__func__, ret, rdev->glb_func_id);
|
|
goto err_out;
|
|
}
|
|
|
|
pd->func_id = rdev->glb_func_id;
|
|
if (udata) {
|
|
if (ib_copy_to_udata(udata, &pd->pdn, PD_RESP_SIZE) != 0) {
|
|
ret = -EFAULT;
|
|
dev_err(rdev->hwdev_hdl,
|
|
"[ROCE, ERR] %s: Failed to copy data to user space, func_id(%u)\n",
|
|
__func__, rdev->glb_func_id);
|
|
goto err_copy_to_user;
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
|
|
err_copy_to_user:
|
|
roce3_rdma_pd_free(rdev->hwdev, pd->pdn);
|
|
err_out:
|
|
return ret;
|
|
}
|
|
|
|
int roce3_dealloc_pd(struct ib_pd *ibpd, struct ib_udata *udata)
|
|
{
|
|
struct roce3_pd *pd = NULL;
|
|
struct roce3_device *rdev = NULL;
|
|
|
|
if (ibpd == NULL) {
|
|
pr_err("[ROCE, ERR] %s: Ibpd is null\n", __func__);
|
|
return -EINVAL;
|
|
}
|
|
|
|
pd = to_roce3_pd(ibpd);
|
|
rdev = to_roce3_dev(ibpd->device);
|
|
|
|
roce3_rdma_pd_free(rdev->hwdev, pd->pdn);
|
|
|
|
return 0;
|
|
}
|