break;
 
+       case UVERBS_ATTR_TYPE_RAW_FD:
+               if (uattr->attr_data.reserved || uattr->len != 0 ||
+                   uattr->data_s64 < INT_MIN || uattr->data_s64 > INT_MAX)
+                       return -EINVAL;
+               /* _uverbs_get_const_signed() is the accessor */
+               e->ptr_attr.data = uattr->data_s64;
+               break;
+
        case UVERBS_ATTR_TYPE_IDRS_ARRAY:
                return uverbs_process_idrs_array(pbundle, attr_uapi,
                                                 &e->objs_arr_attr, uattr,
 
        UVERBS_ATTR_TYPE_PTR_OUT,
        UVERBS_ATTR_TYPE_IDR,
        UVERBS_ATTR_TYPE_FD,
+       UVERBS_ATTR_TYPE_RAW_FD,
        UVERBS_ATTR_TYPE_ENUM_IN,
        UVERBS_ATTR_TYPE_IDRS_ARRAY,
 };
                          .u.obj.access = _access,                             \
                          __VA_ARGS__ } })
 
+#define UVERBS_ATTR_RAW_FD(_attr_id, ...)                                      \
+       (&(const struct uverbs_attr_def){                                      \
+               .id = (_attr_id),                                              \
+               .attr = { .type = UVERBS_ATTR_TYPE_RAW_FD, __VA_ARGS__ } })
+
 #define UVERBS_ATTR_PTR_IN(_attr_id, _type, ...)                               \
        (&(const struct uverbs_attr_def){                                      \
                .id = _attr_id,                                                \
                 uverbs_get_const_default_unsigned(_to, _attrs_bundle, _idx,   \
                                                    _default))
 
+static inline int
+uverbs_get_raw_fd(int *to, const struct uverbs_attr_bundle *attrs_bundle,
+                 size_t idx)
+{
+       return uverbs_get_const_signed(to, attrs_bundle, idx);
+}
+
 #endif