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, 46fac9658cSMatan Barak UVERBS_ATTR_TYPE_PTR_IN, 47fac9658cSMatan 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 59fac9658cSMatan Barak enum { 60fac9658cSMatan Barak UVERBS_ATTR_SPEC_F_MANDATORY = 1U << 0, 61fac9658cSMatan Barak /* Support extending attributes by length */ 62fac9658cSMatan Barak UVERBS_ATTR_SPEC_F_MIN_SZ = 1U << 1, 63fac9658cSMatan Barak }; 64fac9658cSMatan Barak 65f43dbebfSMatan Barak struct uverbs_attr_spec { 66f43dbebfSMatan Barak enum uverbs_attr_type type; 67fac9658cSMatan Barak union { 68fac9658cSMatan 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 }; 78fac9658cSMatan Barak /* Combination of bits from enum UVERBS_ATTR_SPEC_F_XXXX */ 79fac9658cSMatan Barak u8 flags; 80fac9658cSMatan Barak }; 81f43dbebfSMatan Barak 82f43dbebfSMatan Barak struct uverbs_attr_spec_hash { 83f43dbebfSMatan Barak size_t num_attrs; 84fac9658cSMatan Barak unsigned long *mandatory_attrs_bitmask; 85f43dbebfSMatan Barak struct uverbs_attr_spec attrs[0]; 86f43dbebfSMatan Barak }; 87f43dbebfSMatan Barak 88fac9658cSMatan Barak struct uverbs_attr_bundle; 89fac9658cSMatan Barak struct ib_uverbs_file; 90fac9658cSMatan Barak 91fac9658cSMatan Barak enum { 92fac9658cSMatan Barak /* 93fac9658cSMatan Barak * Action marked with this flag creates a context (or root for all 94fac9658cSMatan Barak * objects). 95fac9658cSMatan Barak */ 96fac9658cSMatan Barak UVERBS_ACTION_FLAG_CREATE_ROOT = 1U << 0, 97fac9658cSMatan Barak }; 98fac9658cSMatan Barak 99fac9658cSMatan Barak struct uverbs_method_spec { 100fac9658cSMatan Barak /* Combination of bits from enum UVERBS_ACTION_FLAG_XXXX */ 101fac9658cSMatan Barak u32 flags; 102fac9658cSMatan Barak size_t num_buckets; 103fac9658cSMatan Barak size_t num_child_attrs; 104fac9658cSMatan Barak int (*handler)(struct ib_device *ib_dev, struct ib_uverbs_file *ufile, 105fac9658cSMatan Barak struct uverbs_attr_bundle *ctx); 106fac9658cSMatan Barak struct uverbs_attr_spec_hash *attr_buckets[0]; 107fac9658cSMatan Barak }; 108fac9658cSMatan Barak 109fac9658cSMatan Barak struct uverbs_method_spec_hash { 110fac9658cSMatan Barak size_t num_methods; 111fac9658cSMatan Barak struct uverbs_method_spec *methods[0]; 112fac9658cSMatan Barak }; 113fac9658cSMatan Barak 114fac9658cSMatan Barak struct uverbs_object_spec { 115fac9658cSMatan Barak const struct uverbs_obj_type *type_attrs; 116fac9658cSMatan Barak size_t num_buckets; 117fac9658cSMatan Barak struct uverbs_method_spec_hash *method_buckets[0]; 118fac9658cSMatan Barak }; 119fac9658cSMatan Barak 120fac9658cSMatan Barak struct uverbs_object_spec_hash { 121fac9658cSMatan Barak size_t num_objects; 122fac9658cSMatan Barak struct uverbs_object_spec *objects[0]; 123fac9658cSMatan Barak }; 124fac9658cSMatan Barak 125fac9658cSMatan Barak struct uverbs_root_spec { 126fac9658cSMatan Barak size_t num_buckets; 127fac9658cSMatan Barak struct uverbs_object_spec_hash *object_buckets[0]; 128fac9658cSMatan Barak }; 129fac9658cSMatan Barak 130*5009010fSMatan Barak /* 131*5009010fSMatan Barak * ======================================= 132*5009010fSMatan Barak * Verbs definitions 133*5009010fSMatan Barak * ======================================= 134*5009010fSMatan Barak */ 135*5009010fSMatan Barak 136*5009010fSMatan Barak struct uverbs_object_def { 137*5009010fSMatan Barak const struct uverbs_obj_type *type_attrs; 138*5009010fSMatan Barak }; 139*5009010fSMatan Barak 140*5009010fSMatan Barak #define _UVERBS_OBJECT(_id, _type_attrs, ...) \ 141*5009010fSMatan Barak ((const struct uverbs_object_def) { \ 142*5009010fSMatan Barak .type_attrs = _type_attrs}) 143*5009010fSMatan Barak #define DECLARE_UVERBS_OBJECT(_name, _id, _type_attrs, ...) \ 144*5009010fSMatan Barak const struct uverbs_object_def _name = \ 145*5009010fSMatan Barak _UVERBS_OBJECT(_id, _type_attrs, ##__VA_ARGS__) 146fac9658cSMatan Barak /* ================================================= 147fac9658cSMatan Barak * Parsing infrastructure 148fac9658cSMatan Barak * ================================================= 149fac9658cSMatan Barak */ 150fac9658cSMatan Barak 151fac9658cSMatan Barak struct uverbs_ptr_attr { 152fac9658cSMatan Barak union { 153fac9658cSMatan Barak u64 data; 154fac9658cSMatan Barak void __user *ptr; 155fac9658cSMatan Barak }; 156fac9658cSMatan Barak u16 len; 157fac9658cSMatan Barak /* Combination of bits from enum UVERBS_ATTR_F_XXXX */ 158fac9658cSMatan Barak u16 flags; 159fac9658cSMatan Barak }; 160fac9658cSMatan Barak 161f43dbebfSMatan Barak struct uverbs_obj_attr { 162fac9658cSMatan Barak /* pointer to the kernel descriptor -> type, access, etc */ 163fac9658cSMatan Barak const struct uverbs_obj_type *type; 164f43dbebfSMatan Barak struct ib_uobject *uobject; 165fac9658cSMatan Barak /* fd or id in idr of this object */ 166fac9658cSMatan Barak int id; 167f43dbebfSMatan Barak }; 168f43dbebfSMatan Barak 169f43dbebfSMatan Barak struct uverbs_attr { 170fac9658cSMatan Barak /* 171fac9658cSMatan Barak * pointer to the user-space given attribute, in order to write the 172fac9658cSMatan Barak * new uobject's id or update flags. 173fac9658cSMatan Barak */ 174fac9658cSMatan Barak struct ib_uverbs_attr __user *uattr; 175fac9658cSMatan Barak union { 176fac9658cSMatan Barak struct uverbs_ptr_attr ptr_attr; 177f43dbebfSMatan Barak struct uverbs_obj_attr obj_attr; 178f43dbebfSMatan Barak }; 179fac9658cSMatan Barak }; 180f43dbebfSMatan Barak 181f43dbebfSMatan Barak struct uverbs_attr_bundle_hash { 182f43dbebfSMatan Barak /* if bit i is set, it means attrs[i] contains valid information */ 183f43dbebfSMatan Barak unsigned long *valid_bitmap; 184f43dbebfSMatan Barak size_t num_attrs; 185f43dbebfSMatan Barak /* 186f43dbebfSMatan Barak * arrays of attributes, each element corresponds to the specification 187f43dbebfSMatan Barak * of the attribute in the same index. 188f43dbebfSMatan Barak */ 189f43dbebfSMatan Barak struct uverbs_attr *attrs; 190f43dbebfSMatan Barak }; 191f43dbebfSMatan Barak 192f43dbebfSMatan Barak struct uverbs_attr_bundle { 193f43dbebfSMatan Barak size_t num_buckets; 194f43dbebfSMatan Barak struct uverbs_attr_bundle_hash hash[]; 195f43dbebfSMatan Barak }; 196f43dbebfSMatan Barak 197f43dbebfSMatan Barak static inline bool uverbs_attr_is_valid_in_hash(const struct uverbs_attr_bundle_hash *attrs_hash, 198f43dbebfSMatan Barak unsigned int idx) 199f43dbebfSMatan Barak { 200f43dbebfSMatan Barak return test_bit(idx, attrs_hash->valid_bitmap); 201f43dbebfSMatan Barak } 202f43dbebfSMatan Barak 203a0aa309cSMatan Barak #endif 204a0aa309cSMatan Barak 205