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