1 // SPDX-License-Identifier: GPL-2.0-only
3 * Copyright (c) 2022, Microsoft Corporation. All rights reserved.
8 int mana_ib_create_cq(struct ib_cq *ibcq, const struct ib_cq_init_attr *attr,
9 struct ib_udata *udata)
11 struct mana_ib_cq *cq = container_of(ibcq, struct mana_ib_cq, ibcq);
12 struct ib_device *ibdev = ibcq->device;
13 struct mana_ib_create_cq ucmd = {};
14 struct mana_ib_dev *mdev;
17 mdev = container_of(ibdev, struct mana_ib_dev, ib_dev);
19 if (udata->inlen < sizeof(ucmd))
22 err = ib_copy_from_udata(&ucmd, udata, min(sizeof(ucmd), udata->inlen));
25 "Failed to copy from udata for create cq, %d\n", err);
29 if (attr->cqe > mdev->adapter_caps.max_qp_wr) {
30 ibdev_dbg(ibdev, "CQE %d exceeding limit\n", attr->cqe);
35 cq->umem = ib_umem_get(ibdev, ucmd.buf_addr, cq->cqe * COMP_ENTRY_SIZE,
36 IB_ACCESS_LOCAL_WRITE);
37 if (IS_ERR(cq->umem)) {
38 err = PTR_ERR(cq->umem);
39 ibdev_dbg(ibdev, "Failed to get umem for create cq, err %d\n",
44 err = mana_ib_gd_create_dma_region(mdev, cq->umem, &cq->gdma_region);
47 "Failed to create dma region for create cq, %d\n",
49 goto err_release_umem;
53 "mana_ib_gd_create_dma_region ret %d gdma_region 0x%llx\n",
54 err, cq->gdma_region);
57 * The CQ ID is not known at this time. The ID is generated at create_qp
63 ib_umem_release(cq->umem);
67 int mana_ib_destroy_cq(struct ib_cq *ibcq, struct ib_udata *udata)
69 struct mana_ib_cq *cq = container_of(ibcq, struct mana_ib_cq, ibcq);
70 struct ib_device *ibdev = ibcq->device;
71 struct mana_ib_dev *mdev;
73 mdev = container_of(ibdev, struct mana_ib_dev, ib_dev);
75 mana_ib_gd_destroy_dma_region(mdev, cq->gdma_region);
76 ib_umem_release(cq->umem);