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