]> Git Repo - linux.git/blobdiff - drivers/infiniband/hw/mlx5/cq.c
Merge tag 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dledford/rdma
[linux.git] / drivers / infiniband / hw / mlx5 / cq.c
index fcd04b881ec1924eb679827e18c0a2f8f6f3fd39..b3ef47c3ab732a9588cd79f8d5ac2f24c68366ac 100644 (file)
@@ -731,7 +731,7 @@ static int create_cq_user(struct mlx5_ib_dev *dev, struct ib_udata *udata,
                          int entries, u32 **cqb,
                          int *cqe_size, int *index, int *inlen)
 {
-       struct mlx5_ib_create_cq ucmd;
+       struct mlx5_ib_create_cq ucmd = {};
        size_t ucmdlen;
        int page_shift;
        __be64 *pas;
@@ -770,7 +770,7 @@ static int create_cq_user(struct mlx5_ib_dev *dev, struct ib_udata *udata,
        if (err)
                goto err_umem;
 
-       mlx5_ib_cont_pages(cq->buf.umem, ucmd.buf_addr, &npages, &page_shift,
+       mlx5_ib_cont_pages(cq->buf.umem, ucmd.buf_addr, 0, &npages, &page_shift,
                           &ncont, NULL);
        mlx5_ib_dbg(dev, "addr 0x%llx, size %u, npages %d, page_shift %d, ncont %d\n",
                    ucmd.buf_addr, entries * ucmd.cqe_size, npages, page_shift, ncont);
@@ -792,8 +792,36 @@ static int create_cq_user(struct mlx5_ib_dev *dev, struct ib_udata *udata,
 
        *index = to_mucontext(context)->uuari.uars[0].index;
 
+       if (ucmd.cqe_comp_en == 1) {
+               if (unlikely((*cqe_size != 64) ||
+                            !MLX5_CAP_GEN(dev->mdev, cqe_compression))) {
+                       err = -EOPNOTSUPP;
+                       mlx5_ib_warn(dev, "CQE compression is not supported for size %d!\n",
+                                    *cqe_size);
+                       goto err_cqb;
+               }
+
+               if (unlikely(!ucmd.cqe_comp_res_format ||
+                            !(ucmd.cqe_comp_res_format <
+                              MLX5_IB_CQE_RES_RESERVED) ||
+                            (ucmd.cqe_comp_res_format &
+                             (ucmd.cqe_comp_res_format - 1)))) {
+                       err = -EOPNOTSUPP;
+                       mlx5_ib_warn(dev, "CQE compression res format %d is not supported!\n",
+                                    ucmd.cqe_comp_res_format);
+                       goto err_cqb;
+               }
+
+               MLX5_SET(cqc, cqc, cqe_comp_en, 1);
+               MLX5_SET(cqc, cqc, mini_cqe_res_format,
+                        ilog2(ucmd.cqe_comp_res_format));
+       }
+
        return 0;
 
+err_cqb:
+       kfree(cqb);
+
 err_db:
        mlx5_ib_db_unmap_user(to_mucontext(context), &cq->db);
 
@@ -1124,7 +1152,7 @@ static int resize_user(struct mlx5_ib_dev *dev, struct mlx5_ib_cq *cq,
                return err;
        }
 
-       mlx5_ib_cont_pages(umem, ucmd.buf_addr, &npages, page_shift,
+       mlx5_ib_cont_pages(umem, ucmd.buf_addr, 0, &npages, page_shift,
                           npas, NULL);
 
        cq->resize_umem = umem;
This page took 0.037483 seconds and 4 git commands to generate.