use crate::ioctl;
const BASE: u32 = uapi::DRM_IOCTL_BASE as u32;
#[allow(non_snake_case)]
#[inline(always)]
pub const fn IO(nr: u32) -> u32 {
ioctl::_IO(BASE, nr)
}
#[allow(non_snake_case)]
#[inline(always)]
pub const fn IOR<T>(nr: u32) -> u32 {
ioctl::_IOR::<T>(BASE, nr)
}
#[allow(non_snake_case)]
#[inline(always)]
pub const fn IOW<T>(nr: u32) -> u32 {
ioctl::_IOW::<T>(BASE, nr)
}
#[allow(non_snake_case)]
#[inline(always)]
pub const fn IOWR<T>(nr: u32) -> u32 {
ioctl::_IOWR::<T>(BASE, nr)
}
pub type DrmIoctlDescriptor = bindings::drm_ioctl_desc;
pub const AUTH: u32 = bindings::drm_ioctl_flags_DRM_AUTH;
pub const MASTER: u32 = bindings::drm_ioctl_flags_DRM_MASTER;
pub const ROOT_ONLY: u32 = bindings::drm_ioctl_flags_DRM_ROOT_ONLY;
pub const RENDER_ALLOW: u32 = bindings::drm_ioctl_flags_DRM_RENDER_ALLOW;
#[doc(hidden)]
pub mod internal {
pub use bindings::drm_device;
pub use bindings::drm_file;
pub use bindings::drm_ioctl_desc;
}
#[macro_export]
macro_rules! declare_drm_ioctls {
( $(($cmd:ident, $struct:ident, $flags:expr, $func:expr)),* $(,)? ) => {
const IOCTLS: &'static [$crate::drm::ioctl::DrmIoctlDescriptor] = {
use $crate::uapi::*;
const _:() = {
let i: u32 = $crate::uapi::DRM_COMMAND_BASE;
$(
let cmd: u32 = $crate::macros::concat_idents!(DRM_IOCTL_, $cmd);
::core::assert!(i == $crate::ioctl::_IOC_NR(cmd));
::core::assert!(core::mem::size_of::<$crate::uapi::$struct>() ==
$crate::ioctl::_IOC_SIZE(cmd));
let i: u32 = i + 1;
)*
};
let ioctls = &[$(
$crate::drm::ioctl::internal::drm_ioctl_desc {
cmd: $crate::macros::concat_idents!(DRM_IOCTL_, $cmd) as u32,
func: {
#[allow(non_snake_case)]
unsafe extern "C" fn $cmd(
raw_dev: *mut $crate::drm::ioctl::internal::drm_device,
raw_data: *mut ::core::ffi::c_void,
raw_file: *mut $crate::drm::ioctl::internal::drm_file,
) -> core::ffi::c_int {
let dev = $crate::drm::device::Device::from_raw(raw_dev);
let data = unsafe { &mut *(raw_data.cast::<$crate::uapi::$struct>()) };
let file = unsafe { $crate::drm::File::from_raw(raw_file) };
match $func(dev, data, file) {
Err(e) => e.to_errno(),
Ok(i) => i.try_into()
.unwrap_or($crate::error::code::ERANGE.to_errno()),
}
}
Some($cmd)
},
flags: $flags,
name: $crate::str::as_char_ptr_in_const_context(
$crate::c_str!(::core::stringify!($cmd)),
),
}
),*];
ioctls
};
};
}