]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - include/rdma/uverbs_named_ioctl.h
IB/mlx5: Introduce driver create and destroy flow methods
[linux.git] / include / rdma / uverbs_named_ioctl.h
index 228421f2a427b64784b1668bbb3024d9583b77d7..b3b21733cc557a03521fd60e147b8c3feb996aa6 100644 (file)
 #define UVERBS_HANDLER(id)     _UVERBS_NAME(UVERBS_MODULE_NAME, _handler_##id)
 #define UVERBS_OBJECT(id)      _UVERBS_NAME(UVERBS_MOUDLE_NAME, _object_##id)
 
-#define DECLARE_UVERBS_NAMED_METHOD(id, ...)   \
-       DECLARE_UVERBS_METHOD(UVERBS_METHOD(id), id, UVERBS_HANDLER(id), ##__VA_ARGS__)
+/* These are static so they do not need to be qualified */
+#define UVERBS_METHOD_ATTRS(method_id) _method_attrs_##method_id
+#define UVERBS_OBJECT_METHODS(object_id) _object_methods_##object_id
 
-#define DECLARE_UVERBS_NAMED_METHOD_WITH_HANDLER(id, handler, ...)     \
-       DECLARE_UVERBS_METHOD(UVERBS_METHOD(id), id, handler, ##__VA_ARGS__)
+#define DECLARE_UVERBS_NAMED_METHOD(_method_id, ...)                           \
+       static const struct uverbs_attr_def *const UVERBS_METHOD_ATTRS(        \
+               _method_id)[] = { __VA_ARGS__ };                               \
+       static const struct uverbs_method_def UVERBS_METHOD(_method_id) = {    \
+               .id = _method_id,                                              \
+               .handler = UVERBS_HANDLER(_method_id),                         \
+               .num_attrs = ARRAY_SIZE(UVERBS_METHOD_ATTRS(_method_id)),      \
+               .attrs = &UVERBS_METHOD_ATTRS(_method_id),                     \
+       }
 
-#define DECLARE_UVERBS_NAMED_METHOD_NO_OVERRIDE(id, handler, ...)      \
-       DECLARE_UVERBS_METHOD(UVERBS_METHOD(id), id, NULL, ##__VA_ARGS__)
-
-#define DECLARE_UVERBS_NAMED_OBJECT(id, ...)   \
-       DECLARE_UVERBS_OBJECT(UVERBS_OBJECT(id), id, ##__VA_ARGS__)
-
-#define DECLARE_UVERBS_GLOBAL_METHODS(_name, ...)      \
-       DECLARE_UVERBS_NAMED_OBJECT(_name, NULL, ##__VA_ARGS__)
+/* Create a standard destroy method using the default handler. The handle_attr
+ * argument must be the attribute specifying the handle to destroy, the
+ * default handler does not support any other attributes.
+ */
+#define DECLARE_UVERBS_NAMED_METHOD_DESTROY(_method_id, _handle_attr)          \
+       static const struct uverbs_attr_def *const UVERBS_METHOD_ATTRS(        \
+               _method_id)[] = { _handle_attr };                              \
+       static const struct uverbs_method_def UVERBS_METHOD(_method_id) = {    \
+               .id = _method_id,                                              \
+               .handler = uverbs_destroy_def_handler,                         \
+               .num_attrs = ARRAY_SIZE(UVERBS_METHOD_ATTRS(_method_id)),      \
+               .attrs = &UVERBS_METHOD_ATTRS(_method_id),                     \
+       }
 
-#define _UVERBS_COMP_NAME(x, y, z) _UVERBS_NAME(_UVERBS_NAME(x, y), z)
+#define DECLARE_UVERBS_NAMED_OBJECT(_object_id, _type_attrs, ...)              \
+       static const struct uverbs_method_def *const UVERBS_OBJECT_METHODS(    \
+               _object_id)[] = { __VA_ARGS__ };                               \
+       const struct uverbs_object_def UVERBS_OBJECT(_object_id) = {           \
+               .id = _object_id,                                              \
+               .type_attrs = &_type_attrs,                                    \
+               .num_methods = ARRAY_SIZE(UVERBS_OBJECT_METHODS(_object_id)),  \
+               .methods = &UVERBS_OBJECT_METHODS(_object_id)                  \
+       }
 
-#define UVERBS_NO_OVERRIDE     NULL
+/*
+ * Declare global methods. These still have a unique object_id because we
+ * identify all uapi methods with a (object,method) tuple. However, they have
+ * no type pointer.
+ */
+#define DECLARE_UVERBS_GLOBAL_METHODS(_object_id, ...) \
+       static const struct uverbs_method_def *const UVERBS_OBJECT_METHODS(    \
+               _object_id)[] = { __VA_ARGS__ };                               \
+       const struct uverbs_object_def UVERBS_OBJECT(_object_id) = {           \
+               .id = _object_id,                                              \
+               .num_methods = ARRAY_SIZE(UVERBS_OBJECT_METHODS(_object_id)),  \
+               .methods = &UVERBS_OBJECT_METHODS(_object_id)                  \
+       }
 
-/* This declares a parsing tree with one object and one method. This is usually
- * used for merging driver attributes to the common attributes. The driver has
- * a chance to override the handler and type attrs of the original object.
- * The __VA_ARGS__ just contains a list of attributes.
+/* Used by drivers to declare a complete parsing tree for new methods
  */
-#define ADD_UVERBS_ATTRIBUTES(_name, _object, _method, _type_attrs, _handler, ...) \
-static DECLARE_UVERBS_METHOD(_UVERBS_COMP_NAME(UVERBS_MODULE_NAME,          \
-                                              _method_, _name),             \
-                            _method, _handler, ##__VA_ARGS__);              \
-                                                                            \
-static DECLARE_UVERBS_OBJECT(_UVERBS_COMP_NAME(UVERBS_MODULE_NAME,          \
-                                              _object_, _name),             \
-                            _object, _type_attrs,                           \
-                            &_UVERBS_COMP_NAME(UVERBS_MODULE_NAME,          \
-                                              _method_, _name));            \
-                                                                            \
-static DECLARE_UVERBS_OBJECT_TREE(_name,                                    \
-                                 &_UVERBS_COMP_NAME(UVERBS_MODULE_NAME,     \
-                                                    _object_, _name))
+#define ADD_UVERBS_METHODS(_name, _object_id, ...)                             \
+       static const struct uverbs_method_def *const UVERBS_OBJECT_METHODS(    \
+               _object_id)[] = { __VA_ARGS__ };                               \
+       static const struct uverbs_object_def _name##_struct = {               \
+               .id = _object_id,                                              \
+               .num_methods = ARRAY_SIZE(UVERBS_OBJECT_METHODS(_object_id)),  \
+               .methods = &UVERBS_OBJECT_METHODS(_object_id)                  \
+       };                                                                     \
+       static const struct uverbs_object_def *const _name##_ptrs[] = {        \
+               &_name##_struct,                                               \
+       };                                                                     \
+       static const struct uverbs_object_tree_def _name = {                   \
+               .num_objects = 1,                                              \
+               .objects = &_name##_ptrs,                                      \
+       }
 
-/* A very common use case is that the driver doesn't override the handler and
- * type_attrs. Therefore, we provide a simplified macro for this common case.
+/* Used by drivers to declare a complete parsing tree for a single method that
+ * differs only in having additional driver specific attributes.
  */
-#define ADD_UVERBS_ATTRIBUTES_SIMPLE(_name, _object, _method, ...)          \
-       ADD_UVERBS_ATTRIBUTES(_name, _object, _method, UVERBS_NO_OVERRIDE,   \
-                             UVERBS_NO_OVERRIDE, ##__VA_ARGS__)
+#define ADD_UVERBS_ATTRIBUTES_SIMPLE(_name, _object_id, _method_id, ...)       \
+       static const struct uverbs_attr_def *const UVERBS_METHOD_ATTRS(        \
+               _method_id)[] = { __VA_ARGS__ };                               \
+       static const struct uverbs_method_def UVERBS_METHOD(_method_id) = {    \
+               .id = _method_id,                                              \
+               .num_attrs = ARRAY_SIZE(UVERBS_METHOD_ATTRS(_method_id)),      \
+               .attrs = &UVERBS_METHOD_ATTRS(_method_id),                     \
+       };                                                                     \
+       ADD_UVERBS_METHODS(_name, _object_id, &UVERBS_METHOD(_method_id))
 
 #endif