use core::ffi::c_int;
use bytemuck::{AnyBitPattern, NoUninit};
const IOC_READ: u32 = 2;
const IOC_WRITE: u32 = 1;
const fn ioc(dir: u32, ty: u8, nr: u8, size: u16) -> u32 {
(dir << 30) | ((size as u32) << 16) | ((ty as u32) << 8) | (nr as u32)
}
#[inline]
const fn iowr<T>(ty: u8, nr: u8) -> u32 {
ioc(
IOC_READ | IOC_WRITE,
ty,
nr,
core::mem::size_of::<T>() as u16,
)
}
#[inline]
const fn io(ty: u8, nr: u8) -> u32 {
ioc(0, ty, nr, 0)
}
pub const DRM_TYPE: u8 = b'd';
pub const DRM_IOCTL_VERSION: u32 = iowr::<DrmVersion>(DRM_TYPE, 0x00);
pub const DRM_IOCTL_GET_UNIQUE: u32 = iowr::<DrmUnique>(DRM_TYPE, 0x01);
pub const DRM_IOCTL_SET_VERSION: u32 = iowr::<DrmSetVersion>(DRM_TYPE, 0x07);
pub const DRM_IOCTL_GET_CAP: u32 = iowr::<DrmGetCap>(DRM_TYPE, 0x0c);
pub const DRM_IOCTL_SET_CLIENT_CAP: u32 = ioc(
IOC_WRITE,
DRM_TYPE,
0x0d,
core::mem::size_of::<DrmSetClientCap>() as u16,
);
pub const DRM_IOCTL_SET_MASTER: u32 = io(DRM_TYPE, 0x1e);
pub const DRM_IOCTL_DROP_MASTER: u32 = io(DRM_TYPE, 0x1f);
#[repr(C)]
#[derive(Debug, Default, Clone, Copy, AnyBitPattern)]
pub struct DrmVersion {
pub version_major: c_int,
pub version_minor: c_int,
pub version_patchlevel: c_int,
pub name_len: usize,
pub name: u64,
pub date_len: usize,
pub date: u64,
pub desc_len: usize,
pub desc: u64,
}
#[repr(C)]
#[derive(Debug, Default, Clone, Copy, AnyBitPattern)]
pub struct DrmUnique {
pub unique_len: usize,
pub unique: u64,
}
#[repr(C)]
#[derive(Debug, Default, Clone, Copy, AnyBitPattern)]
pub struct DrmSetVersion {
pub drm_di_major: c_int,
pub drm_di_minor: c_int,
pub drm_dd_major: c_int,
pub drm_dd_minor: c_int,
}
#[repr(C)]
#[derive(Debug, Default, Clone, Copy, AnyBitPattern)]
pub struct DrmGetCap {
pub capability: u64,
pub value: u64,
}
pub const DRM_CAP_DUMB_BUFFER: u64 = 0x1;
pub const DRM_CAP_TIMESTAMP_MONOTONIC: u64 = 0x6;
pub const DRM_CAP_CRTC_IN_VBLANK_EVENT: u64 = 0x12;
pub const DRM_CAP_ADDFB2_MODIFIERS: u64 = 0x10;
pub const DRM_MODE_FB_MODIFIERS: u32 = 0x2;
pub const DRM_FORMAT_MOD_INVALID: u64 = 0x00ff_ffff_ffff_ffff;
pub const DRM_FORMAT_MOD_LINEAR: u64 = 0;
#[repr(C)]
#[derive(Debug, Default, Clone, Copy, AnyBitPattern)]
pub struct DrmSetClientCap {
pub capability: u64,
pub value: u64,
}
pub const DRM_IOCTL_MODE_GETRESOURCES: u32 = iowr::<DrmModeCardRes>(DRM_TYPE, 0xA0);
pub const DRM_IOCTL_MODE_GETCRTC: u32 = iowr::<DrmModeCrtc>(DRM_TYPE, 0xA1);
pub const DRM_IOCTL_MODE_SETCRTC: u32 = iowr::<DrmModeCrtc>(DRM_TYPE, 0xA2);
pub const DRM_IOCTL_MODE_GETENCODER: u32 = iowr::<DrmModeGetEncoder>(DRM_TYPE, 0xA6);
pub const DRM_IOCTL_MODE_GETCONNECTOR: u32 = iowr::<DrmModeGetConnector>(DRM_TYPE, 0xA7);
pub const DRM_IOCTL_MODE_GETPROPERTY: u32 = iowr::<DrmModeGetProperty>(DRM_TYPE, 0xAA);
pub const DRM_IOCTL_MODE_RMFB: u32 = iowr::<u32>(DRM_TYPE, 0xAF);
pub const DRM_IOCTL_MODE_PAGE_FLIP: u32 = iowr::<DrmModeCrtcPageFlip>(DRM_TYPE, 0xB0);
pub const DRM_IOCTL_MODE_CREATE_DUMB: u32 = iowr::<DrmModeCreateDumb>(DRM_TYPE, 0xB2);
pub const DRM_IOCTL_MODE_MAP_DUMB: u32 = iowr::<DrmModeMapDumb>(DRM_TYPE, 0xB3);
pub const DRM_IOCTL_MODE_DESTROY_DUMB: u32 = iowr::<DrmModeDestroyDumb>(DRM_TYPE, 0xB4);
pub const DRM_IOCTL_MODE_GETPLANERESOURCES: u32 = iowr::<DrmModeGetPlaneRes>(DRM_TYPE, 0xB5);
pub const DRM_IOCTL_MODE_GETPLANE: u32 = iowr::<DrmModeGetPlane>(DRM_TYPE, 0xB6);
pub const DRM_IOCTL_MODE_ADDFB2: u32 = iowr::<DrmModeFbCmd2>(DRM_TYPE, 0xB8);
pub const DRM_IOCTL_MODE_OBJ_GETPROPERTIES: u32 = iowr::<DrmModeObjGetProperties>(DRM_TYPE, 0xB9);
pub const DRM_IOCTL_MODE_ATOMIC: u32 = iowr::<DrmModeAtomic>(DRM_TYPE, 0xBC);
pub const DRM_IOCTL_MODE_CREATEPROPBLOB: u32 = iowr::<DrmModeCreateBlob>(DRM_TYPE, 0xBD);
pub const DRM_IOCTL_MODE_DESTROYPROPBLOB: u32 = iowr::<DrmModeDestroyBlob>(DRM_TYPE, 0xBE);
pub const DRM_IOCTL_MODE_GETPROPBLOB: u32 = iowr::<DrmModeGetBlob>(DRM_TYPE, 0xAC);
pub const DRM_IOCTL_WAIT_VBLANK: u32 = ioc(
IOC_READ | IOC_WRITE,
DRM_TYPE,
0x3A,
core::mem::size_of::<DrmWaitVblank>() as u16,
);
pub const DRM_MODE_NAME_LEN: usize = 32;
#[repr(C)]
#[derive(Debug, Default, Clone, Copy, AnyBitPattern)]
pub struct DrmModeCardRes {
pub fb_id_ptr: u64,
pub crtc_id_ptr: u64,
pub connector_id_ptr: u64,
pub encoder_id_ptr: u64,
pub count_fbs: u32,
pub count_crtcs: u32,
pub count_connectors: u32,
pub count_encoders: u32,
pub min_width: u32,
pub max_width: u32,
pub min_height: u32,
pub max_height: u32,
}
#[repr(C)]
#[derive(Debug, Default, Clone, Copy, AnyBitPattern)]
pub struct DrmModeModeInfo {
pub clock: u32,
pub hdisplay: u16,
pub hsync_start: u16,
pub hsync_end: u16,
pub htotal: u16,
pub hskew: u16,
pub vdisplay: u16,
pub vsync_start: u16,
pub vsync_end: u16,
pub vtotal: u16,
pub vscan: u16,
pub vrefresh: u32,
pub flags: u32,
pub kind: u32,
pub name: [u8; DRM_MODE_NAME_LEN],
}
#[repr(C)]
#[derive(Debug, Default, Clone, Copy, AnyBitPattern)]
pub struct DrmModeCrtc {
pub set_connectors_ptr: u64,
pub count_connectors: u32,
pub crtc_id: u32,
pub fb_id: u32,
pub x: u32,
pub y: u32,
pub gamma_size: u32,
pub mode_valid: u32,
pub mode: DrmModeModeInfo,
}
#[repr(C)]
#[derive(Debug, Default, Clone, Copy, AnyBitPattern)]
pub struct DrmModeGetEncoder {
pub encoder_id: u32,
pub encoder_type: u32,
pub crtc_id: u32,
pub possible_crtcs: u32,
pub possible_clones: u32,
}
#[repr(C)]
#[derive(Debug, Default, Clone, Copy, AnyBitPattern)]
pub struct DrmModeGetConnector {
pub encoders_ptr: u64,
pub modes_ptr: u64,
pub props_ptr: u64,
pub prop_values_ptr: u64,
pub count_modes: u32,
pub count_props: u32,
pub count_encoders: u32,
pub encoder_id: u32,
pub connector_id: u32,
pub connector_type: u32,
pub connector_type_id: u32,
pub connection: u32,
pub mm_width: u32,
pub mm_height: u32,
pub subpixel: u32,
pub pad: u32,
}
pub const DRM_MODE_CONNECTED: u32 = 1;
pub const DRM_MODE_CONNECTOR_VIRTUAL: u32 = 15;
pub const DRM_MODE_ENCODER_VIRTUAL: u32 = 5;
#[repr(C)]
#[derive(Debug, Default, Clone, Copy, AnyBitPattern)]
pub struct DrmModeFbCmd2 {
pub fb_id: u32,
pub width: u32,
pub height: u32,
pub pixel_format: u32,
pub flags: u32,
pub handles: [u32; 4],
pub pitches: [u32; 4],
pub offsets: [u32; 4],
pub modifier: [u64; 4],
}
#[repr(C)]
#[derive(Debug, Default, Clone, Copy, AnyBitPattern)]
pub struct DrmModeCreateDumb {
pub height: u32,
pub width: u32,
pub bpp: u32,
pub flags: u32,
pub handle: u32,
pub pitch: u32,
pub size: u64,
}
#[repr(C)]
#[derive(Debug, Default, Clone, Copy, AnyBitPattern)]
pub struct DrmModeMapDumb {
pub handle: u32,
pub pad: u32,
pub offset: u64,
}
#[repr(C)]
#[derive(Debug, Default, Clone, Copy, AnyBitPattern)]
pub struct DrmModeDestroyDumb {
pub handle: u32,
}
pub const DRM_FORMAT_XRGB8888: u32 =
(b'X' as u32) | ((b'R' as u32) << 8) | ((b'2' as u32) << 16) | ((b'4' as u32) << 24);
pub const DRM_FORMAT_ARGB8888: u32 =
(b'A' as u32) | ((b'R' as u32) << 8) | ((b'2' as u32) << 16) | ((b'4' as u32) << 24);
#[repr(C)]
#[derive(Debug, Default, Clone, Copy, AnyBitPattern)]
pub struct DrmModeGetPlaneRes {
pub plane_id_ptr: u64,
pub count_planes: u32,
}
#[repr(C)]
#[derive(Debug, Default, Clone, Copy, AnyBitPattern)]
pub struct DrmModeGetPlane {
pub plane_id: u32,
pub crtc_id: u32,
pub fb_id: u32,
pub possible_crtcs: u32,
pub gamma_size: u32,
pub count_format_types: u32,
pub format_type_ptr: u64,
}
pub const DRM_MODE_OBJECT_CRTC: u32 = 0xcccc_cccc;
pub const DRM_MODE_OBJECT_CONNECTOR: u32 = 0xc0c0_c0c0;
pub const DRM_MODE_OBJECT_PLANE: u32 = 0xeeee_eeee;
pub const DRM_PLANE_TYPE_PRIMARY: u64 = 1;
#[repr(C)]
#[derive(Debug, Default, Clone, Copy, AnyBitPattern)]
pub struct DrmModeObjGetProperties {
pub props_ptr: u64,
pub prop_values_ptr: u64,
pub count_props: u32,
pub obj_id: u32,
pub obj_type: u32,
}
pub const DRM_MODE_PROP_RANGE: u32 = 1 << 1;
pub const DRM_MODE_PROP_IMMUTABLE: u32 = 1 << 2;
pub const DRM_MODE_PROP_ENUM: u32 = 1 << 3;
pub const DRM_MODE_PROP_BLOB: u32 = 1 << 4;
pub const DRM_MODE_PROP_OBJECT: u32 = 1 << 6;
pub const DRM_MODE_PROP_ATOMIC: u32 = 0x8000_0000;
pub const DRM_PROP_NAME_LEN: usize = 32;
#[repr(C)]
#[derive(Debug, Default, Clone, Copy, AnyBitPattern)]
pub struct DrmModePropertyEnum {
pub value: u64,
pub name: [u8; DRM_PROP_NAME_LEN],
}
#[repr(C)]
#[derive(Debug, Default, Clone, Copy, AnyBitPattern)]
pub struct DrmModeGetProperty {
pub values_ptr: u64,
pub enum_blob_ptr: u64,
pub prop_id: u32,
pub flags: u32,
pub name: [u8; DRM_PROP_NAME_LEN],
pub count_values: u32,
pub count_enum_blobs: u32,
}
#[repr(C)]
#[derive(Debug, Default, Clone, Copy, AnyBitPattern)]
pub struct DrmModeCrtcPageFlip {
pub crtc_id: u32,
pub fb_id: u32,
pub flags: u32,
pub reserved: u32,
pub user_data: u64,
}
pub const DRM_MODE_PAGE_FLIP_EVENT: u32 = 0x01;
#[repr(C)]
#[derive(Debug, Default, Clone, Copy, AnyBitPattern)]
pub struct DrmWaitVblank {
pub rep_type: u32,
pub sequence: u32,
pub tv_sec: i64,
pub tv_usec: i64,
}
pub const DRM_VBLANK_RELATIVE: u32 = 0x1;
#[repr(C)]
#[derive(Debug, Default, Clone, Copy, AnyBitPattern, NoUninit)]
pub struct DrmEvent {
pub event_type: u32,
pub length: u32,
}
#[repr(C)]
#[derive(Debug, Default, Clone, Copy, AnyBitPattern, NoUninit)]
pub struct DrmEventVblank {
pub base: DrmEvent,
pub user_data: u64,
pub tv_sec: u32,
pub tv_usec: u32,
pub sequence: u32,
pub crtc_id: u32,
}
pub const DRM_EVENT_FLIP_COMPLETE: u32 = 0x02;
#[repr(C)]
#[derive(Debug, Default, Clone, Copy, AnyBitPattern)]
pub struct DrmModeAtomic {
pub flags: u32,
pub count_objs: u32,
pub objs_ptr: u64,
pub count_props_ptr: u64,
pub props_ptr: u64,
pub prop_values_ptr: u64,
pub reserved: u64,
pub user_data: u64,
}
pub const DRM_MODE_ATOMIC_TEST_ONLY: u32 = 0x0100;
pub const DRM_MODE_ATOMIC_NONBLOCK: u32 = 0x0200;
pub const DRM_MODE_ATOMIC_ALLOW_MODESET: u32 = 0x0400;
#[repr(C)]
#[derive(Debug, Default, Clone, Copy, AnyBitPattern)]
pub struct DrmModeCreateBlob {
pub data: u64,
pub length: u32,
pub blob_id: u32,
}
#[repr(C)]
#[derive(Debug, Default, Clone, Copy, AnyBitPattern)]
pub struct DrmModeDestroyBlob {
pub blob_id: u32,
}
#[repr(C)]
#[derive(Debug, Default, Clone, Copy, AnyBitPattern)]
pub struct DrmModeGetBlob {
pub blob_id: u32,
pub length: u32,
pub data: u64,
}