xref: /openbmc/linux/include/rdma/uverbs_ioctl.h (revision fac9658cabb98afb68ef1630c558864e6f559c07)
1a0aa309cSMatan Barak /*
2a0aa309cSMatan Barak  * Copyright (c) 2017, Mellanox Technologies inc.  All rights reserved.
3a0aa309cSMatan Barak  *
4a0aa309cSMatan Barak  * This software is available to you under a choice of one of two
5a0aa309cSMatan Barak  * licenses.  You may choose to be licensed under the terms of the GNU
6a0aa309cSMatan Barak  * General Public License (GPL) Version 2, available from the file
7a0aa309cSMatan Barak  * COPYING in the main directory of this source tree, or the
8a0aa309cSMatan Barak  * OpenIB.org BSD license below:
9a0aa309cSMatan Barak  *
10a0aa309cSMatan Barak  *     Redistribution and use in source and binary forms, with or
11a0aa309cSMatan Barak  *     without modification, are permitted provided that the following
12a0aa309cSMatan Barak  *     conditions are met:
13a0aa309cSMatan Barak  *
14a0aa309cSMatan Barak  *      - Redistributions of source code must retain the above
15a0aa309cSMatan Barak  *        copyright notice, this list of conditions and the following
16a0aa309cSMatan Barak  *        disclaimer.
17a0aa309cSMatan Barak  *
18a0aa309cSMatan Barak  *      - Redistributions in binary form must reproduce the above
19a0aa309cSMatan Barak  *        copyright notice, this list of conditions and the following
20a0aa309cSMatan Barak  *        disclaimer in the documentation and/or other materials
21a0aa309cSMatan Barak  *        provided with the distribution.
22a0aa309cSMatan Barak  *
23a0aa309cSMatan Barak  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
24a0aa309cSMatan Barak  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
25a0aa309cSMatan Barak  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
26a0aa309cSMatan Barak  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
27a0aa309cSMatan Barak  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
28a0aa309cSMatan Barak  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
29a0aa309cSMatan Barak  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
30a0aa309cSMatan Barak  * SOFTWARE.
31a0aa309cSMatan Barak  */
32a0aa309cSMatan Barak 
33a0aa309cSMatan Barak #ifndef _UVERBS_IOCTL_
34a0aa309cSMatan Barak #define _UVERBS_IOCTL_
35a0aa309cSMatan Barak 
36a0aa309cSMatan Barak #include <rdma/uverbs_types.h>
37a0aa309cSMatan Barak 
38a0aa309cSMatan Barak /*
39a0aa309cSMatan Barak  * =======================================
40a0aa309cSMatan Barak  *	Verbs action specifications
41a0aa309cSMatan Barak  * =======================================
42a0aa309cSMatan Barak  */
43a0aa309cSMatan Barak 
44f43dbebfSMatan Barak enum uverbs_attr_type {
45f43dbebfSMatan Barak 	UVERBS_ATTR_TYPE_NA,
46*fac9658cSMatan Barak 	UVERBS_ATTR_TYPE_PTR_IN,
47*fac9658cSMatan Barak 	UVERBS_ATTR_TYPE_PTR_OUT,
48f43dbebfSMatan Barak 	UVERBS_ATTR_TYPE_IDR,
49f43dbebfSMatan Barak 	UVERBS_ATTR_TYPE_FD,
50f43dbebfSMatan Barak };
51f43dbebfSMatan Barak 
52a0aa309cSMatan Barak enum uverbs_obj_access {
53a0aa309cSMatan Barak 	UVERBS_ACCESS_READ,
54a0aa309cSMatan Barak 	UVERBS_ACCESS_WRITE,
55a0aa309cSMatan Barak 	UVERBS_ACCESS_NEW,
56a0aa309cSMatan Barak 	UVERBS_ACCESS_DESTROY
57a0aa309cSMatan Barak };
58a0aa309cSMatan Barak 
59*fac9658cSMatan Barak enum {
60*fac9658cSMatan Barak 	UVERBS_ATTR_SPEC_F_MANDATORY	= 1U << 0,
61*fac9658cSMatan Barak 	/* Support extending attributes by length */
62*fac9658cSMatan Barak 	UVERBS_ATTR_SPEC_F_MIN_SZ	= 1U << 1,
63*fac9658cSMatan Barak };
64*fac9658cSMatan Barak 
65f43dbebfSMatan Barak struct uverbs_attr_spec {
66f43dbebfSMatan Barak 	enum uverbs_attr_type		type;
67*fac9658cSMatan Barak 	union {
68*fac9658cSMatan Barak 		u16				len;
69f43dbebfSMatan Barak 		struct {
70f43dbebfSMatan Barak 			/*
71f43dbebfSMatan Barak 			 * higher bits mean the namespace and lower bits mean
72f43dbebfSMatan Barak 			 * the type id within the namespace.
73f43dbebfSMatan Barak 			 */
74f43dbebfSMatan Barak 			u16			obj_type;
75f43dbebfSMatan Barak 			u8			access;
76f43dbebfSMatan Barak 		} obj;
77f43dbebfSMatan Barak 	};
78*fac9658cSMatan Barak 	/* Combination of bits from enum UVERBS_ATTR_SPEC_F_XXXX */
79*fac9658cSMatan Barak 	u8				flags;
80*fac9658cSMatan Barak };
81f43dbebfSMatan Barak 
82f43dbebfSMatan Barak struct uverbs_attr_spec_hash {
83f43dbebfSMatan Barak 	size_t				num_attrs;
84*fac9658cSMatan Barak 	unsigned long			*mandatory_attrs_bitmask;
85f43dbebfSMatan Barak 	struct uverbs_attr_spec		attrs[0];
86f43dbebfSMatan Barak };
87f43dbebfSMatan Barak 
88*fac9658cSMatan Barak struct uverbs_attr_bundle;
89*fac9658cSMatan Barak struct ib_uverbs_file;
90*fac9658cSMatan Barak 
91*fac9658cSMatan Barak enum {
92*fac9658cSMatan Barak 	/*
93*fac9658cSMatan Barak 	 * Action marked with this flag creates a context (or root for all
94*fac9658cSMatan Barak 	 * objects).
95*fac9658cSMatan Barak 	 */
96*fac9658cSMatan Barak 	UVERBS_ACTION_FLAG_CREATE_ROOT = 1U << 0,
97*fac9658cSMatan Barak };
98*fac9658cSMatan Barak 
99*fac9658cSMatan Barak struct uverbs_method_spec {
100*fac9658cSMatan Barak 	/* Combination of bits from enum UVERBS_ACTION_FLAG_XXXX */
101*fac9658cSMatan Barak 	u32						flags;
102*fac9658cSMatan Barak 	size_t						num_buckets;
103*fac9658cSMatan Barak 	size_t						num_child_attrs;
104*fac9658cSMatan Barak 	int (*handler)(struct ib_device *ib_dev, struct ib_uverbs_file *ufile,
105*fac9658cSMatan Barak 		       struct uverbs_attr_bundle *ctx);
106*fac9658cSMatan Barak 	struct uverbs_attr_spec_hash		*attr_buckets[0];
107*fac9658cSMatan Barak };
108*fac9658cSMatan Barak 
109*fac9658cSMatan Barak struct uverbs_method_spec_hash {
110*fac9658cSMatan Barak 	size_t					num_methods;
111*fac9658cSMatan Barak 	struct uverbs_method_spec		*methods[0];
112*fac9658cSMatan Barak };
113*fac9658cSMatan Barak 
114*fac9658cSMatan Barak struct uverbs_object_spec {
115*fac9658cSMatan Barak 	const struct uverbs_obj_type		*type_attrs;
116*fac9658cSMatan Barak 	size_t					num_buckets;
117*fac9658cSMatan Barak 	struct uverbs_method_spec_hash		*method_buckets[0];
118*fac9658cSMatan Barak };
119*fac9658cSMatan Barak 
120*fac9658cSMatan Barak struct uverbs_object_spec_hash {
121*fac9658cSMatan Barak 	size_t					num_objects;
122*fac9658cSMatan Barak 	struct uverbs_object_spec		*objects[0];
123*fac9658cSMatan Barak };
124*fac9658cSMatan Barak 
125*fac9658cSMatan Barak struct uverbs_root_spec {
126*fac9658cSMatan Barak 	size_t					num_buckets;
127*fac9658cSMatan Barak 	struct uverbs_object_spec_hash		*object_buckets[0];
128*fac9658cSMatan Barak };
129*fac9658cSMatan Barak 
130*fac9658cSMatan Barak /* =================================================
131*fac9658cSMatan Barak  *              Parsing infrastructure
132*fac9658cSMatan Barak  * =================================================
133*fac9658cSMatan Barak  */
134*fac9658cSMatan Barak 
135*fac9658cSMatan Barak struct uverbs_ptr_attr {
136*fac9658cSMatan Barak 	union {
137*fac9658cSMatan Barak 		u64		data;
138*fac9658cSMatan Barak 		void	__user *ptr;
139*fac9658cSMatan Barak 	};
140*fac9658cSMatan Barak 	u16		len;
141*fac9658cSMatan Barak 	/* Combination of bits from enum UVERBS_ATTR_F_XXXX */
142*fac9658cSMatan Barak 	u16		flags;
143*fac9658cSMatan Barak };
144*fac9658cSMatan Barak 
145f43dbebfSMatan Barak struct uverbs_obj_attr {
146*fac9658cSMatan Barak 	/* pointer to the kernel descriptor -> type, access, etc */
147*fac9658cSMatan Barak 	const struct uverbs_obj_type	*type;
148f43dbebfSMatan Barak 	struct ib_uobject		*uobject;
149*fac9658cSMatan Barak 	/* fd or id in idr of this object */
150*fac9658cSMatan Barak 	int				id;
151f43dbebfSMatan Barak };
152f43dbebfSMatan Barak 
153f43dbebfSMatan Barak struct uverbs_attr {
154*fac9658cSMatan Barak 	/*
155*fac9658cSMatan Barak 	 * pointer to the user-space given attribute, in order to write the
156*fac9658cSMatan Barak 	 * new uobject's id or update flags.
157*fac9658cSMatan Barak 	 */
158*fac9658cSMatan Barak 	struct ib_uverbs_attr __user	*uattr;
159*fac9658cSMatan Barak 	union {
160*fac9658cSMatan Barak 		struct uverbs_ptr_attr	ptr_attr;
161f43dbebfSMatan Barak 		struct uverbs_obj_attr	obj_attr;
162f43dbebfSMatan Barak 	};
163*fac9658cSMatan Barak };
164f43dbebfSMatan Barak 
165f43dbebfSMatan Barak struct uverbs_attr_bundle_hash {
166f43dbebfSMatan Barak 	/* if bit i is set, it means attrs[i] contains valid information */
167f43dbebfSMatan Barak 	unsigned long *valid_bitmap;
168f43dbebfSMatan Barak 	size_t num_attrs;
169f43dbebfSMatan Barak 	/*
170f43dbebfSMatan Barak 	 * arrays of attributes, each element corresponds to the specification
171f43dbebfSMatan Barak 	 * of the attribute in the same index.
172f43dbebfSMatan Barak 	 */
173f43dbebfSMatan Barak 	struct uverbs_attr *attrs;
174f43dbebfSMatan Barak };
175f43dbebfSMatan Barak 
176f43dbebfSMatan Barak struct uverbs_attr_bundle {
177f43dbebfSMatan Barak 	size_t				num_buckets;
178f43dbebfSMatan Barak 	struct uverbs_attr_bundle_hash  hash[];
179f43dbebfSMatan Barak };
180f43dbebfSMatan Barak 
181f43dbebfSMatan Barak static inline bool uverbs_attr_is_valid_in_hash(const struct uverbs_attr_bundle_hash *attrs_hash,
182f43dbebfSMatan Barak 						unsigned int idx)
183f43dbebfSMatan Barak {
184f43dbebfSMatan Barak 	return test_bit(idx, attrs_hash->valid_bitmap);
185f43dbebfSMatan Barak }
186f43dbebfSMatan Barak 
187a0aa309cSMatan Barak #endif
188a0aa309cSMatan Barak 
189