IB/mlx5: Set valid umem bit on DEVX
authorYishai Hadas <yishaih@mellanox.com>
Thu, 20 Sep 2018 18:39:33 +0000 (21:39 +0300)
committerJason Gunthorpe <jgg@mellanox.com>
Tue, 25 Sep 2018 20:06:38 +0000 (14:06 -0600)
Set valid umem bit on DEVX commands that use umem.
This will enforce the umem usage by the firmware and not the 'pas' info.

Signed-off-by: Yishai Hadas <yishaih@mellanox.com>
Signed-off-by: Leon Romanovsky <leonro@mellanox.com>
Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
drivers/infiniband/hw/mlx5/devx.c

index 25dafa4..562c793 100644 (file)
@@ -264,6 +264,97 @@ static int devx_is_valid_obj_id(struct devx_obj *obj, const void *in)
        return false;
 }
 
+static void devx_set_umem_valid(const void *in)
+{
+       u16 opcode = MLX5_GET(general_obj_in_cmd_hdr, in, opcode);
+
+       switch (opcode) {
+       case MLX5_CMD_OP_CREATE_MKEY:
+               MLX5_SET(create_mkey_in, in, mkey_umem_valid, 1);
+               break;
+       case MLX5_CMD_OP_CREATE_CQ:
+       {
+               void *cqc;
+
+               MLX5_SET(create_cq_in, in, cq_umem_valid, 1);
+               cqc = MLX5_ADDR_OF(create_cq_in, in, cq_context);
+               MLX5_SET(cqc, cqc, dbr_umem_valid, 1);
+               break;
+       }
+       case MLX5_CMD_OP_CREATE_QP:
+       {
+               void *qpc;
+
+               qpc = MLX5_ADDR_OF(create_qp_in, in, qpc);
+               MLX5_SET(qpc, qpc, dbr_umem_valid, 1);
+               MLX5_SET(create_qp_in, in, wq_umem_valid, 1);
+               break;
+       }
+
+       case MLX5_CMD_OP_CREATE_RQ:
+       {
+               void *rqc, *wq;
+
+               rqc = MLX5_ADDR_OF(create_rq_in, in, ctx);
+               wq  = MLX5_ADDR_OF(rqc, rqc, wq);
+               MLX5_SET(wq, wq, dbr_umem_valid, 1);
+               MLX5_SET(wq, wq, wq_umem_valid, 1);
+               break;
+       }
+
+       case MLX5_CMD_OP_CREATE_SQ:
+       {
+               void *sqc, *wq;
+
+               sqc = MLX5_ADDR_OF(create_sq_in, in, ctx);
+               wq = MLX5_ADDR_OF(sqc, sqc, wq);
+               MLX5_SET(wq, wq, dbr_umem_valid, 1);
+               MLX5_SET(wq, wq, wq_umem_valid, 1);
+               break;
+       }
+
+       case MLX5_CMD_OP_MODIFY_CQ:
+               MLX5_SET(modify_cq_in, in, cq_umem_valid, 1);
+               break;
+
+       case MLX5_CMD_OP_CREATE_RMP:
+       {
+               void *rmpc, *wq;
+
+               rmpc = MLX5_ADDR_OF(create_rmp_in, in, ctx);
+               wq = MLX5_ADDR_OF(rmpc, rmpc, wq);
+               MLX5_SET(wq, wq, dbr_umem_valid, 1);
+               MLX5_SET(wq, wq, wq_umem_valid, 1);
+               break;
+       }
+
+       case MLX5_CMD_OP_CREATE_XRQ:
+       {
+               void *xrqc, *wq;
+
+               xrqc = MLX5_ADDR_OF(create_xrq_in, in, xrq_context);
+               wq = MLX5_ADDR_OF(xrqc, xrqc, wq);
+               MLX5_SET(wq, wq, dbr_umem_valid, 1);
+               MLX5_SET(wq, wq, wq_umem_valid, 1);
+               break;
+       }
+
+       case MLX5_CMD_OP_CREATE_XRC_SRQ:
+       {
+               void *xrc_srqc;
+
+               MLX5_SET(create_xrc_srq_in, in, xrc_srq_umem_valid, 1);
+               xrc_srqc = MLX5_ADDR_OF(create_xrc_srq_in, in,
+                                       xrc_srq_context_entry);
+               MLX5_SET(xrc_srqc, xrc_srqc, dbr_umem_valid, 1);
+               break;
+       }
+
+       default:
+               return;
+       }
+}
+
 static bool devx_is_obj_create_cmd(const void *in)
 {
        u16 opcode = MLX5_GET(general_obj_in_cmd_hdr, in, opcode);
@@ -741,6 +832,8 @@ static int UVERBS_HANDLER(MLX5_IB_METHOD_DEVX_OBJ_CREATE)(
                return -ENOMEM;
 
        MLX5_SET(general_obj_in_cmd_hdr, cmd_in, uid, c->devx_uid);
+       devx_set_umem_valid(cmd_in);
+
        err = mlx5_cmd_exec(dev->mdev, cmd_in,
                            uverbs_attr_get_len(attrs, MLX5_IB_ATTR_DEVX_OBJ_CREATE_CMD_IN),
                            cmd_out, cmd_out_len);
@@ -790,6 +883,8 @@ static int UVERBS_HANDLER(MLX5_IB_METHOD_DEVX_OBJ_MODIFY)(
                return PTR_ERR(cmd_out);
 
        MLX5_SET(general_obj_in_cmd_hdr, cmd_in, uid, c->devx_uid);
+       devx_set_umem_valid(cmd_in);
+
        err = mlx5_cmd_exec(obj->mdev, cmd_in,
                            uverbs_attr_get_len(attrs, MLX5_IB_ATTR_DEVX_OBJ_MODIFY_CMD_IN),
                            cmd_out, cmd_out_len);