1be934ccaSAriel Levkovich /*
2be934ccaSAriel Levkovich  * Copyright (c) 2018, Mellanox Technologies inc.  All rights reserved.
3bfe0cc6eSJianxin Xiong  * Copyright (c) 2020, Intel Corporation.  All rights reserved.
4be934ccaSAriel Levkovich  *
5be934ccaSAriel Levkovich  * This software is available to you under a choice of one of two
6be934ccaSAriel Levkovich  * licenses.  You may choose to be licensed under the terms of the GNU
7be934ccaSAriel Levkovich  * General Public License (GPL) Version 2, available from the file
8be934ccaSAriel Levkovich  * COPYING in the main directory of this source tree, or the
9be934ccaSAriel Levkovich  * OpenIB.org BSD license below:
10be934ccaSAriel Levkovich  *
11be934ccaSAriel Levkovich  *     Redistribution and use in source and binary forms, with or
12be934ccaSAriel Levkovich  *     without modification, are permitted provided that the following
13be934ccaSAriel Levkovich  *     conditions are met:
14be934ccaSAriel Levkovich  *
15be934ccaSAriel Levkovich  *      - Redistributions of source code must retain the above
16be934ccaSAriel Levkovich  *        copyright notice, this list of conditions and the following
17be934ccaSAriel Levkovich  *        disclaimer.
18be934ccaSAriel Levkovich  *
19be934ccaSAriel Levkovich  *      - Redistributions in binary form must reproduce the above
20be934ccaSAriel Levkovich  *        copyright notice, this list of conditions and the following
21be934ccaSAriel Levkovich  *        disclaimer in the documentation and/or other materials
22be934ccaSAriel Levkovich  *        provided with the distribution.
23be934ccaSAriel Levkovich  *
24be934ccaSAriel Levkovich  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
25be934ccaSAriel Levkovich  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
26be934ccaSAriel Levkovich  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
27be934ccaSAriel Levkovich  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
28be934ccaSAriel Levkovich  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
29be934ccaSAriel Levkovich  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
30be934ccaSAriel Levkovich  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
31be934ccaSAriel Levkovich  * SOFTWARE.
32be934ccaSAriel Levkovich  */
33be934ccaSAriel Levkovich 
340080aed4SBart Van Assche #include "rdma_core.h"
35be934ccaSAriel Levkovich #include "uverbs.h"
36be934ccaSAriel Levkovich #include <rdma/uverbs_std_types.h>
37b47a98efSLeon Romanovsky #include "restrack.h"
38be934ccaSAriel Levkovich 
uverbs_free_mr(struct ib_uobject * uobject,enum rdma_remove_reason why,struct uverbs_attr_bundle * attrs)39be934ccaSAriel Levkovich static int uverbs_free_mr(struct ib_uobject *uobject,
40a6a3797dSShamir Rabinovitch 			  enum rdma_remove_reason why,
41a6a3797dSShamir Rabinovitch 			  struct uverbs_attr_bundle *attrs)
42be934ccaSAriel Levkovich {
43c4367a26SShamir Rabinovitch 	return ib_dereg_mr_user((struct ib_mr *)uobject->object,
44c4367a26SShamir Rabinovitch 				&attrs->driver_udata);
45be934ccaSAriel Levkovich }
46be934ccaSAriel Levkovich 
UVERBS_HANDLER(UVERBS_METHOD_ADVISE_MR)47ad8a4496SMoni Shoua static int UVERBS_HANDLER(UVERBS_METHOD_ADVISE_MR)(
48ad8a4496SMoni Shoua 	struct uverbs_attr_bundle *attrs)
49ad8a4496SMoni Shoua {
50ad8a4496SMoni Shoua 	struct ib_pd *pd =
51ad8a4496SMoni Shoua 		uverbs_attr_get_obj(attrs, UVERBS_ATTR_ADVISE_MR_PD_HANDLE);
52ad8a4496SMoni Shoua 	enum ib_uverbs_advise_mr_advice advice;
53ad8a4496SMoni Shoua 	struct ib_device *ib_dev = pd->device;
54ad8a4496SMoni Shoua 	struct ib_sge *sg_list;
55573671a5SDan Carpenter 	int num_sge;
56ad8a4496SMoni Shoua 	u32 flags;
57ad8a4496SMoni Shoua 	int ret;
58ad8a4496SMoni Shoua 
59ad8a4496SMoni Shoua 	/* FIXME: Extend the UAPI_DEF_OBJ_NEEDS_FN stuff.. */
60ad8a4496SMoni Shoua 	if (!ib_dev->ops.advise_mr)
61ad8a4496SMoni Shoua 		return -EOPNOTSUPP;
62ad8a4496SMoni Shoua 
63ad8a4496SMoni Shoua 	ret = uverbs_get_const(&advice, attrs, UVERBS_ATTR_ADVISE_MR_ADVICE);
64ad8a4496SMoni Shoua 	if (ret)
65ad8a4496SMoni Shoua 		return ret;
66ad8a4496SMoni Shoua 
67ad8a4496SMoni Shoua 	ret = uverbs_get_flags32(&flags, attrs, UVERBS_ATTR_ADVISE_MR_FLAGS,
68ad8a4496SMoni Shoua 				 IB_UVERBS_ADVISE_MR_FLAG_FLUSH);
69ad8a4496SMoni Shoua 	if (ret)
70ad8a4496SMoni Shoua 		return ret;
71ad8a4496SMoni Shoua 
72ad8a4496SMoni Shoua 	num_sge = uverbs_attr_ptr_get_array_size(
73ad8a4496SMoni Shoua 		attrs, UVERBS_ATTR_ADVISE_MR_SGE_LIST, sizeof(struct ib_sge));
74d4d7f596SMaor Gottlieb 	if (num_sge <= 0)
75ad8a4496SMoni Shoua 		return num_sge;
76ad8a4496SMoni Shoua 
77ad8a4496SMoni Shoua 	sg_list = uverbs_attr_get_alloced_ptr(attrs,
78ad8a4496SMoni Shoua 					      UVERBS_ATTR_ADVISE_MR_SGE_LIST);
79ad8a4496SMoni Shoua 	return ib_dev->ops.advise_mr(pd, advice, flags, sg_list, num_sge,
80ad8a4496SMoni Shoua 				     attrs);
81ad8a4496SMoni Shoua }
82ad8a4496SMoni Shoua 
UVERBS_HANDLER(UVERBS_METHOD_DM_MR_REG)83e83f0ecdSJason Gunthorpe static int UVERBS_HANDLER(UVERBS_METHOD_DM_MR_REG)(
8415a1b4beSJason Gunthorpe 	struct uverbs_attr_bundle *attrs)
85be934ccaSAriel Levkovich {
86be934ccaSAriel Levkovich 	struct ib_dm_mr_attr attr = {};
87e83f0ecdSJason Gunthorpe 	struct ib_uobject *uobj =
88e83f0ecdSJason Gunthorpe 		uverbs_attr_get_uobject(attrs, UVERBS_ATTR_REG_DM_MR_HANDLE);
89e83f0ecdSJason Gunthorpe 	struct ib_dm *dm =
90e83f0ecdSJason Gunthorpe 		uverbs_attr_get_obj(attrs, UVERBS_ATTR_REG_DM_MR_DM_HANDLE);
91e83f0ecdSJason Gunthorpe 	struct ib_pd *pd =
92e83f0ecdSJason Gunthorpe 		uverbs_attr_get_obj(attrs, UVERBS_ATTR_REG_DM_MR_PD_HANDLE);
93e83f0ecdSJason Gunthorpe 	struct ib_device *ib_dev = pd->device;
94e83f0ecdSJason Gunthorpe 
95be934ccaSAriel Levkovich 	struct ib_mr *mr;
96be934ccaSAriel Levkovich 	int ret;
97be934ccaSAriel Levkovich 
983023a1e9SKamal Heib 	if (!ib_dev->ops.reg_dm_mr)
99be934ccaSAriel Levkovich 		return -EOPNOTSUPP;
100be934ccaSAriel Levkovich 
101be934ccaSAriel Levkovich 	ret = uverbs_copy_from(&attr.offset, attrs, UVERBS_ATTR_REG_DM_MR_OFFSET);
102be934ccaSAriel Levkovich 	if (ret)
103be934ccaSAriel Levkovich 		return ret;
104be934ccaSAriel Levkovich 
105be934ccaSAriel Levkovich 	ret = uverbs_copy_from(&attr.length, attrs,
106be934ccaSAriel Levkovich 			       UVERBS_ATTR_REG_DM_MR_LENGTH);
107be934ccaSAriel Levkovich 	if (ret)
108be934ccaSAriel Levkovich 		return ret;
109be934ccaSAriel Levkovich 
110bccd0622SJason Gunthorpe 	ret = uverbs_get_flags32(&attr.access_flags, attrs,
111bccd0622SJason Gunthorpe 				 UVERBS_ATTR_REG_DM_MR_ACCESS_FLAGS,
112bccd0622SJason Gunthorpe 				 IB_ACCESS_SUPPORTED);
113be934ccaSAriel Levkovich 	if (ret)
114be934ccaSAriel Levkovich 		return ret;
115be934ccaSAriel Levkovich 
116be934ccaSAriel Levkovich 	if (!(attr.access_flags & IB_ZERO_BASED))
117be934ccaSAriel Levkovich 		return -EINVAL;
118be934ccaSAriel Levkovich 
119adac4cb3SJason Gunthorpe 	ret = ib_check_mr_access(ib_dev, attr.access_flags);
120be934ccaSAriel Levkovich 	if (ret)
121be934ccaSAriel Levkovich 		return ret;
122be934ccaSAriel Levkovich 
123be934ccaSAriel Levkovich 	if (attr.offset > dm->length || attr.length > dm->length ||
124be934ccaSAriel Levkovich 	    attr.length > dm->length - attr.offset)
125be934ccaSAriel Levkovich 		return -EINVAL;
126be934ccaSAriel Levkovich 
1273023a1e9SKamal Heib 	mr = pd->device->ops.reg_dm_mr(pd, dm, &attr, attrs);
128be934ccaSAriel Levkovich 	if (IS_ERR(mr))
129be934ccaSAriel Levkovich 		return PTR_ERR(mr);
130be934ccaSAriel Levkovich 
131be934ccaSAriel Levkovich 	mr->device  = pd->device;
132be934ccaSAriel Levkovich 	mr->pd      = pd;
133a0bc099aSMax Gurtovoy 	mr->type    = IB_MR_TYPE_DM;
134be934ccaSAriel Levkovich 	mr->dm      = dm;
135be934ccaSAriel Levkovich 	mr->uobject = uobj;
136be934ccaSAriel Levkovich 	atomic_inc(&pd->usecnt);
137be934ccaSAriel Levkovich 	atomic_inc(&dm->usecnt);
138be934ccaSAriel Levkovich 
139b47a98efSLeon Romanovsky 	rdma_restrack_new(&mr->res, RDMA_RESTRACK_MR);
140b47a98efSLeon Romanovsky 	rdma_restrack_set_name(&mr->res, NULL);
141b47a98efSLeon Romanovsky 	rdma_restrack_add(&mr->res);
142be934ccaSAriel Levkovich 	uobj->object = mr;
143be934ccaSAriel Levkovich 
1440ac8903cSJason Gunthorpe 	uverbs_finalize_uobj_create(attrs, UVERBS_ATTR_REG_DM_MR_HANDLE);
1450ac8903cSJason Gunthorpe 
146be934ccaSAriel Levkovich 	ret = uverbs_copy_to(attrs, UVERBS_ATTR_REG_DM_MR_RESP_LKEY, &mr->lkey,
147be934ccaSAriel Levkovich 			     sizeof(mr->lkey));
148be934ccaSAriel Levkovich 	if (ret)
1490ac8903cSJason Gunthorpe 		return ret;
150be934ccaSAriel Levkovich 
151be934ccaSAriel Levkovich 	ret = uverbs_copy_to(attrs, UVERBS_ATTR_REG_DM_MR_RESP_RKEY,
152be934ccaSAriel Levkovich 			     &mr->rkey, sizeof(mr->rkey));
153be934ccaSAriel Levkovich 	return ret;
154be934ccaSAriel Levkovich }
155be934ccaSAriel Levkovich 
UVERBS_HANDLER(UVERBS_METHOD_QUERY_MR)1566c01e6b2SYishai Hadas static int UVERBS_HANDLER(UVERBS_METHOD_QUERY_MR)(
1576c01e6b2SYishai Hadas 	struct uverbs_attr_bundle *attrs)
1586c01e6b2SYishai Hadas {
1596c01e6b2SYishai Hadas 	struct ib_mr *mr =
1606c01e6b2SYishai Hadas 		uverbs_attr_get_obj(attrs, UVERBS_ATTR_QUERY_MR_HANDLE);
1616c01e6b2SYishai Hadas 	int ret;
1626c01e6b2SYishai Hadas 
1636c01e6b2SYishai Hadas 	ret = uverbs_copy_to(attrs, UVERBS_ATTR_QUERY_MR_RESP_LKEY, &mr->lkey,
1646c01e6b2SYishai Hadas 			     sizeof(mr->lkey));
1656c01e6b2SYishai Hadas 	if (ret)
1666c01e6b2SYishai Hadas 		return ret;
1676c01e6b2SYishai Hadas 
1686c01e6b2SYishai Hadas 	ret = uverbs_copy_to(attrs, UVERBS_ATTR_QUERY_MR_RESP_RKEY,
1696c01e6b2SYishai Hadas 			     &mr->rkey, sizeof(mr->rkey));
1706c01e6b2SYishai Hadas 
1716c01e6b2SYishai Hadas 	if (ret)
1726c01e6b2SYishai Hadas 		return ret;
1736c01e6b2SYishai Hadas 
1746c01e6b2SYishai Hadas 	ret = uverbs_copy_to(attrs, UVERBS_ATTR_QUERY_MR_RESP_LENGTH,
1756c01e6b2SYishai Hadas 			     &mr->length, sizeof(mr->length));
1766c01e6b2SYishai Hadas 
1776c01e6b2SYishai Hadas 	if (ret)
1786c01e6b2SYishai Hadas 		return ret;
1796c01e6b2SYishai Hadas 
1806c01e6b2SYishai Hadas 	ret = uverbs_copy_to(attrs, UVERBS_ATTR_QUERY_MR_RESP_IOVA,
1816c01e6b2SYishai Hadas 			     &mr->iova, sizeof(mr->iova));
1826c01e6b2SYishai Hadas 
1836c01e6b2SYishai Hadas 	return IS_UVERBS_COPY_ERR(ret) ? ret : 0;
1846c01e6b2SYishai Hadas }
1856c01e6b2SYishai Hadas 
UVERBS_HANDLER(UVERBS_METHOD_REG_DMABUF_MR)186bfe0cc6eSJianxin Xiong static int UVERBS_HANDLER(UVERBS_METHOD_REG_DMABUF_MR)(
187bfe0cc6eSJianxin Xiong 	struct uverbs_attr_bundle *attrs)
188bfe0cc6eSJianxin Xiong {
189bfe0cc6eSJianxin Xiong 	struct ib_uobject *uobj =
190bfe0cc6eSJianxin Xiong 		uverbs_attr_get_uobject(attrs, UVERBS_ATTR_REG_DMABUF_MR_HANDLE);
191bfe0cc6eSJianxin Xiong 	struct ib_pd *pd =
192bfe0cc6eSJianxin Xiong 		uverbs_attr_get_obj(attrs, UVERBS_ATTR_REG_DMABUF_MR_PD_HANDLE);
193bfe0cc6eSJianxin Xiong 	struct ib_device *ib_dev = pd->device;
194bfe0cc6eSJianxin Xiong 
195bfe0cc6eSJianxin Xiong 	u64 offset, length, iova;
196bfe0cc6eSJianxin Xiong 	u32 fd, access_flags;
197bfe0cc6eSJianxin Xiong 	struct ib_mr *mr;
198bfe0cc6eSJianxin Xiong 	int ret;
199bfe0cc6eSJianxin Xiong 
200bfe0cc6eSJianxin Xiong 	if (!ib_dev->ops.reg_user_mr_dmabuf)
201bfe0cc6eSJianxin Xiong 		return -EOPNOTSUPP;
202bfe0cc6eSJianxin Xiong 
203bfe0cc6eSJianxin Xiong 	ret = uverbs_copy_from(&offset, attrs,
204bfe0cc6eSJianxin Xiong 			       UVERBS_ATTR_REG_DMABUF_MR_OFFSET);
205bfe0cc6eSJianxin Xiong 	if (ret)
206bfe0cc6eSJianxin Xiong 		return ret;
207bfe0cc6eSJianxin Xiong 
208bfe0cc6eSJianxin Xiong 	ret = uverbs_copy_from(&length, attrs,
209bfe0cc6eSJianxin Xiong 			       UVERBS_ATTR_REG_DMABUF_MR_LENGTH);
210bfe0cc6eSJianxin Xiong 	if (ret)
211bfe0cc6eSJianxin Xiong 		return ret;
212bfe0cc6eSJianxin Xiong 
213bfe0cc6eSJianxin Xiong 	ret = uverbs_copy_from(&iova, attrs,
214bfe0cc6eSJianxin Xiong 			       UVERBS_ATTR_REG_DMABUF_MR_IOVA);
215bfe0cc6eSJianxin Xiong 	if (ret)
216bfe0cc6eSJianxin Xiong 		return ret;
217bfe0cc6eSJianxin Xiong 
218bfe0cc6eSJianxin Xiong 	if ((offset & ~PAGE_MASK) != (iova & ~PAGE_MASK))
219bfe0cc6eSJianxin Xiong 		return -EINVAL;
220bfe0cc6eSJianxin Xiong 
221bfe0cc6eSJianxin Xiong 	ret = uverbs_copy_from(&fd, attrs,
222bfe0cc6eSJianxin Xiong 			       UVERBS_ATTR_REG_DMABUF_MR_FD);
223bfe0cc6eSJianxin Xiong 	if (ret)
224bfe0cc6eSJianxin Xiong 		return ret;
225bfe0cc6eSJianxin Xiong 
226bfe0cc6eSJianxin Xiong 	ret = uverbs_get_flags32(&access_flags, attrs,
227bfe0cc6eSJianxin Xiong 				 UVERBS_ATTR_REG_DMABUF_MR_ACCESS_FLAGS,
228bfe0cc6eSJianxin Xiong 				 IB_ACCESS_LOCAL_WRITE |
229bfe0cc6eSJianxin Xiong 				 IB_ACCESS_REMOTE_READ |
230bfe0cc6eSJianxin Xiong 				 IB_ACCESS_REMOTE_WRITE |
231bfe0cc6eSJianxin Xiong 				 IB_ACCESS_REMOTE_ATOMIC |
232bfe0cc6eSJianxin Xiong 				 IB_ACCESS_RELAXED_ORDERING);
233bfe0cc6eSJianxin Xiong 	if (ret)
234bfe0cc6eSJianxin Xiong 		return ret;
235bfe0cc6eSJianxin Xiong 
236bfe0cc6eSJianxin Xiong 	ret = ib_check_mr_access(ib_dev, access_flags);
237bfe0cc6eSJianxin Xiong 	if (ret)
238bfe0cc6eSJianxin Xiong 		return ret;
239bfe0cc6eSJianxin Xiong 
240bfe0cc6eSJianxin Xiong 	mr = pd->device->ops.reg_user_mr_dmabuf(pd, offset, length, iova, fd,
241bfe0cc6eSJianxin Xiong 						access_flags,
242bfe0cc6eSJianxin Xiong 						&attrs->driver_udata);
243bfe0cc6eSJianxin Xiong 	if (IS_ERR(mr))
244bfe0cc6eSJianxin Xiong 		return PTR_ERR(mr);
245bfe0cc6eSJianxin Xiong 
246bfe0cc6eSJianxin Xiong 	mr->device = pd->device;
247bfe0cc6eSJianxin Xiong 	mr->pd = pd;
248bfe0cc6eSJianxin Xiong 	mr->type = IB_MR_TYPE_USER;
249bfe0cc6eSJianxin Xiong 	mr->uobject = uobj;
250bfe0cc6eSJianxin Xiong 	atomic_inc(&pd->usecnt);
251bfe0cc6eSJianxin Xiong 
252*f6018cc4SGal Pressman 	rdma_restrack_new(&mr->res, RDMA_RESTRACK_MR);
253*f6018cc4SGal Pressman 	rdma_restrack_set_name(&mr->res, NULL);
254*f6018cc4SGal Pressman 	rdma_restrack_add(&mr->res);
255bfe0cc6eSJianxin Xiong 	uobj->object = mr;
256bfe0cc6eSJianxin Xiong 
257bfe0cc6eSJianxin Xiong 	uverbs_finalize_uobj_create(attrs, UVERBS_ATTR_REG_DMABUF_MR_HANDLE);
258bfe0cc6eSJianxin Xiong 
259bfe0cc6eSJianxin Xiong 	ret = uverbs_copy_to(attrs, UVERBS_ATTR_REG_DMABUF_MR_RESP_LKEY,
260bfe0cc6eSJianxin Xiong 			     &mr->lkey, sizeof(mr->lkey));
261bfe0cc6eSJianxin Xiong 	if (ret)
262bfe0cc6eSJianxin Xiong 		return ret;
263bfe0cc6eSJianxin Xiong 
264bfe0cc6eSJianxin Xiong 	ret = uverbs_copy_to(attrs, UVERBS_ATTR_REG_DMABUF_MR_RESP_RKEY,
265bfe0cc6eSJianxin Xiong 			     &mr->rkey, sizeof(mr->rkey));
266bfe0cc6eSJianxin Xiong 	return ret;
267bfe0cc6eSJianxin Xiong }
268bfe0cc6eSJianxin Xiong 
2699a119cd5SJason Gunthorpe DECLARE_UVERBS_NAMED_METHOD(
270ad8a4496SMoni Shoua 	UVERBS_METHOD_ADVISE_MR,
271ad8a4496SMoni Shoua 	UVERBS_ATTR_IDR(UVERBS_ATTR_ADVISE_MR_PD_HANDLE,
272ad8a4496SMoni Shoua 			UVERBS_OBJECT_PD,
273ad8a4496SMoni Shoua 			UVERBS_ACCESS_READ,
274ad8a4496SMoni Shoua 			UA_MANDATORY),
275ad8a4496SMoni Shoua 	UVERBS_ATTR_CONST_IN(UVERBS_ATTR_ADVISE_MR_ADVICE,
276ad8a4496SMoni Shoua 			     enum ib_uverbs_advise_mr_advice,
277ad8a4496SMoni Shoua 			     UA_MANDATORY),
278ad8a4496SMoni Shoua 	UVERBS_ATTR_FLAGS_IN(UVERBS_ATTR_ADVISE_MR_FLAGS,
279ad8a4496SMoni Shoua 			     enum ib_uverbs_advise_mr_flag,
280ad8a4496SMoni Shoua 			     UA_MANDATORY),
281ad8a4496SMoni Shoua 	UVERBS_ATTR_PTR_IN(UVERBS_ATTR_ADVISE_MR_SGE_LIST,
282ad8a4496SMoni Shoua 			   UVERBS_ATTR_MIN_SIZE(sizeof(struct ib_uverbs_sge)),
283ad8a4496SMoni Shoua 			   UA_MANDATORY,
284ad8a4496SMoni Shoua 			   UA_ALLOC_AND_COPY));
285ad8a4496SMoni Shoua 
286ad8a4496SMoni Shoua DECLARE_UVERBS_NAMED_METHOD(
2876c01e6b2SYishai Hadas 	UVERBS_METHOD_QUERY_MR,
2886c01e6b2SYishai Hadas 	UVERBS_ATTR_IDR(UVERBS_ATTR_QUERY_MR_HANDLE,
2896c01e6b2SYishai Hadas 			UVERBS_OBJECT_MR,
2906c01e6b2SYishai Hadas 			UVERBS_ACCESS_READ,
2916c01e6b2SYishai Hadas 			UA_MANDATORY),
2926c01e6b2SYishai Hadas 	UVERBS_ATTR_PTR_OUT(UVERBS_ATTR_QUERY_MR_RESP_RKEY,
2936c01e6b2SYishai Hadas 			    UVERBS_ATTR_TYPE(u32),
2946c01e6b2SYishai Hadas 			    UA_MANDATORY),
2956c01e6b2SYishai Hadas 	UVERBS_ATTR_PTR_OUT(UVERBS_ATTR_QUERY_MR_RESP_LKEY,
2966c01e6b2SYishai Hadas 			    UVERBS_ATTR_TYPE(u32),
2976c01e6b2SYishai Hadas 			    UA_MANDATORY),
2986c01e6b2SYishai Hadas 	UVERBS_ATTR_PTR_OUT(UVERBS_ATTR_QUERY_MR_RESP_LENGTH,
2996c01e6b2SYishai Hadas 			    UVERBS_ATTR_TYPE(u64),
3006c01e6b2SYishai Hadas 			    UA_MANDATORY),
3016c01e6b2SYishai Hadas 	UVERBS_ATTR_PTR_OUT(UVERBS_ATTR_QUERY_MR_RESP_IOVA,
3026c01e6b2SYishai Hadas 			    UVERBS_ATTR_TYPE(u64),
3036c01e6b2SYishai Hadas 			    UA_OPTIONAL));
3046c01e6b2SYishai Hadas 
3056c01e6b2SYishai Hadas DECLARE_UVERBS_NAMED_METHOD(
3069a119cd5SJason Gunthorpe 	UVERBS_METHOD_DM_MR_REG,
3079a119cd5SJason Gunthorpe 	UVERBS_ATTR_IDR(UVERBS_ATTR_REG_DM_MR_HANDLE,
3089a119cd5SJason Gunthorpe 			UVERBS_OBJECT_MR,
309be934ccaSAriel Levkovich 			UVERBS_ACCESS_NEW,
31083bb4442SJason Gunthorpe 			UA_MANDATORY),
3119a119cd5SJason Gunthorpe 	UVERBS_ATTR_PTR_IN(UVERBS_ATTR_REG_DM_MR_OFFSET,
312be934ccaSAriel Levkovich 			   UVERBS_ATTR_TYPE(u64),
31383bb4442SJason Gunthorpe 			   UA_MANDATORY),
3149a119cd5SJason Gunthorpe 	UVERBS_ATTR_PTR_IN(UVERBS_ATTR_REG_DM_MR_LENGTH,
315be934ccaSAriel Levkovich 			   UVERBS_ATTR_TYPE(u64),
31683bb4442SJason Gunthorpe 			   UA_MANDATORY),
3179a119cd5SJason Gunthorpe 	UVERBS_ATTR_IDR(UVERBS_ATTR_REG_DM_MR_PD_HANDLE,
3189a119cd5SJason Gunthorpe 			UVERBS_OBJECT_PD,
319be934ccaSAriel Levkovich 			UVERBS_ACCESS_READ,
32083bb4442SJason Gunthorpe 			UA_MANDATORY),
321bccd0622SJason Gunthorpe 	UVERBS_ATTR_FLAGS_IN(UVERBS_ATTR_REG_DM_MR_ACCESS_FLAGS,
322bccd0622SJason Gunthorpe 			     enum ib_access_flags),
3239a119cd5SJason Gunthorpe 	UVERBS_ATTR_IDR(UVERBS_ATTR_REG_DM_MR_DM_HANDLE,
3249a119cd5SJason Gunthorpe 			UVERBS_OBJECT_DM,
325be934ccaSAriel Levkovich 			UVERBS_ACCESS_READ,
32683bb4442SJason Gunthorpe 			UA_MANDATORY),
3279a119cd5SJason Gunthorpe 	UVERBS_ATTR_PTR_OUT(UVERBS_ATTR_REG_DM_MR_RESP_LKEY,
328be934ccaSAriel Levkovich 			    UVERBS_ATTR_TYPE(u32),
32983bb4442SJason Gunthorpe 			    UA_MANDATORY),
3309a119cd5SJason Gunthorpe 	UVERBS_ATTR_PTR_OUT(UVERBS_ATTR_REG_DM_MR_RESP_RKEY,
331be934ccaSAriel Levkovich 			    UVERBS_ATTR_TYPE(u32),
33283bb4442SJason Gunthorpe 			    UA_MANDATORY));
333be934ccaSAriel Levkovich 
334bfe0cc6eSJianxin Xiong DECLARE_UVERBS_NAMED_METHOD(
335bfe0cc6eSJianxin Xiong 	UVERBS_METHOD_REG_DMABUF_MR,
336bfe0cc6eSJianxin Xiong 	UVERBS_ATTR_IDR(UVERBS_ATTR_REG_DMABUF_MR_HANDLE,
337bfe0cc6eSJianxin Xiong 			UVERBS_OBJECT_MR,
338bfe0cc6eSJianxin Xiong 			UVERBS_ACCESS_NEW,
339bfe0cc6eSJianxin Xiong 			UA_MANDATORY),
340bfe0cc6eSJianxin Xiong 	UVERBS_ATTR_IDR(UVERBS_ATTR_REG_DMABUF_MR_PD_HANDLE,
341bfe0cc6eSJianxin Xiong 			UVERBS_OBJECT_PD,
342bfe0cc6eSJianxin Xiong 			UVERBS_ACCESS_READ,
343bfe0cc6eSJianxin Xiong 			UA_MANDATORY),
344bfe0cc6eSJianxin Xiong 	UVERBS_ATTR_PTR_IN(UVERBS_ATTR_REG_DMABUF_MR_OFFSET,
345bfe0cc6eSJianxin Xiong 			   UVERBS_ATTR_TYPE(u64),
346bfe0cc6eSJianxin Xiong 			   UA_MANDATORY),
347bfe0cc6eSJianxin Xiong 	UVERBS_ATTR_PTR_IN(UVERBS_ATTR_REG_DMABUF_MR_LENGTH,
348bfe0cc6eSJianxin Xiong 			   UVERBS_ATTR_TYPE(u64),
349bfe0cc6eSJianxin Xiong 			   UA_MANDATORY),
350bfe0cc6eSJianxin Xiong 	UVERBS_ATTR_PTR_IN(UVERBS_ATTR_REG_DMABUF_MR_IOVA,
351bfe0cc6eSJianxin Xiong 			   UVERBS_ATTR_TYPE(u64),
352bfe0cc6eSJianxin Xiong 			   UA_MANDATORY),
353bfe0cc6eSJianxin Xiong 	UVERBS_ATTR_PTR_IN(UVERBS_ATTR_REG_DMABUF_MR_FD,
354bfe0cc6eSJianxin Xiong 			   UVERBS_ATTR_TYPE(u32),
355bfe0cc6eSJianxin Xiong 			   UA_MANDATORY),
356bfe0cc6eSJianxin Xiong 	UVERBS_ATTR_FLAGS_IN(UVERBS_ATTR_REG_DMABUF_MR_ACCESS_FLAGS,
357bfe0cc6eSJianxin Xiong 			     enum ib_access_flags),
358bfe0cc6eSJianxin Xiong 	UVERBS_ATTR_PTR_OUT(UVERBS_ATTR_REG_DMABUF_MR_RESP_LKEY,
359bfe0cc6eSJianxin Xiong 			    UVERBS_ATTR_TYPE(u32),
360bfe0cc6eSJianxin Xiong 			    UA_MANDATORY),
361bfe0cc6eSJianxin Xiong 	UVERBS_ATTR_PTR_OUT(UVERBS_ATTR_REG_DMABUF_MR_RESP_RKEY,
362bfe0cc6eSJianxin Xiong 			    UVERBS_ATTR_TYPE(u32),
363bfe0cc6eSJianxin Xiong 			    UA_MANDATORY));
364bfe0cc6eSJianxin Xiong 
365bbc13cdaSParav Pandit DECLARE_UVERBS_NAMED_METHOD_DESTROY(
366bbc13cdaSParav Pandit 	UVERBS_METHOD_MR_DESTROY,
367bbc13cdaSParav Pandit 	UVERBS_ATTR_IDR(UVERBS_ATTR_DESTROY_MR_HANDLE,
368bbc13cdaSParav Pandit 			UVERBS_OBJECT_MR,
369bbc13cdaSParav Pandit 			UVERBS_ACCESS_DESTROY,
370bbc13cdaSParav Pandit 			UA_MANDATORY));
371bbc13cdaSParav Pandit 
3729a119cd5SJason Gunthorpe DECLARE_UVERBS_NAMED_OBJECT(
3739a119cd5SJason Gunthorpe 	UVERBS_OBJECT_MR,
3749a119cd5SJason Gunthorpe 	UVERBS_TYPE_ALLOC_IDR(uverbs_free_mr),
375bfe0cc6eSJianxin Xiong 	&UVERBS_METHOD(UVERBS_METHOD_ADVISE_MR),
376bbc13cdaSParav Pandit 	&UVERBS_METHOD(UVERBS_METHOD_DM_MR_REG),
377ad8a4496SMoni Shoua 	&UVERBS_METHOD(UVERBS_METHOD_MR_DESTROY),
378bfe0cc6eSJianxin Xiong 	&UVERBS_METHOD(UVERBS_METHOD_QUERY_MR),
379bfe0cc6eSJianxin Xiong 	&UVERBS_METHOD(UVERBS_METHOD_REG_DMABUF_MR));
3800bd01f3dSJason Gunthorpe 
3810bd01f3dSJason Gunthorpe const struct uapi_definition uverbs_def_obj_mr[] = {
3820bd01f3dSJason Gunthorpe 	UAPI_DEF_CHAIN_OBJ_TREE_NAMED(UVERBS_OBJECT_MR,
3830bd01f3dSJason Gunthorpe 				      UAPI_DEF_OBJ_NEEDS_FN(dereg_mr)),
3840bd01f3dSJason Gunthorpe 	{}
3850bd01f3dSJason Gunthorpe };
386