diff --git a/Cargo.lock b/Cargo.lock index c194a25be8..29af2ad0a1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -179,6 +179,16 @@ dependencies = [ "windows-sys", ] +[[package]] +name = "drm-sys" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bafb66c8dbc944d69e15cfcc661df7e703beffbaec8bd63151368b06c5f9858c" +dependencies = [ + "libc", + "linux-raw-sys", +] + [[package]] name = "generic-array" version = "0.14.7" @@ -248,6 +258,12 @@ dependencies = [ "libc", ] +[[package]] +name = "linux-raw-sys" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a385b1be4e5c3e362ad2ffa73c392e53f031eaa5b7d648e64cd87f27f6063d7" + [[package]] name = "lock_api" version = "0.4.14" @@ -449,6 +465,7 @@ dependencies = [ "chrono", "chrono-tz", "dlmalloc", + "drm-sys", "generic-rt", "libc", "libm", diff --git a/Cargo.toml b/Cargo.toml index be96f42c01..29550d0ddf 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -62,6 +62,7 @@ features = ["c_api"] sc = "0.2.7" [target.'cfg(target_os = "redox")'.dependencies] +drm-sys = "0.8.0" redox_syscall = "0.5.13" redox-rt = { path = "redox-rt" } redox-path = "0.3" diff --git a/src/header/sys_ioctl/redox/drm.rs b/src/header/sys_ioctl/redox/drm.rs index 5c1b5c707a..d3dc635b54 100644 --- a/src/header/sys_ioctl/redox/drm.rs +++ b/src/header/sys_ioctl/redox/drm.rs @@ -1,5 +1,10 @@ use alloc::vec::Vec; use core::{mem, slice}; +use drm_sys::{ + drm_get_cap, drm_mode_card_res, drm_mode_crtc, drm_mode_fb_cmd, drm_mode_fb_cmd2, + drm_mode_get_connector, drm_mode_get_encoder, drm_mode_get_plane, drm_mode_get_plane_res, + drm_mode_obj_get_properties, drm_set_client_cap, drm_version, +}; use crate::{ error::{Errno, Result}, @@ -82,7 +87,7 @@ impl Dev { } fn get_cap(&self, capability: u64) -> Result { - let mut cmd = ipc::GetCap { + let mut cmd = drm_get_cap { capability, value: 0, }; @@ -93,7 +98,7 @@ impl Dev { } fn set_client_cap(&self, capability: u64, value: u64) -> Result<()> { - let mut cmd = ipc::SetClientCap { capability, value }; + let mut cmd = drm_set_client_cap { capability, value }; unsafe { self.call(&mut cmd, ipc::SET_CLIENT_CAP)?; } @@ -121,22 +126,6 @@ impl Dev { } } -// Structs adapted from drm-sys bindings: https://docs.rs/drm-sys/0.8.0/src/drm_sys/bindings.rs.html -//TODO: can we auto generate these from libdrm without causing dependency issues? -#[repr(C)] -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -struct drm_version { - pub version_major: c_int, - pub version_minor: c_int, - pub version_patchlevel: c_int, - pub name_len: size_t, - pub name: *mut c_char, - pub date_len: size_t, - pub date: *mut c_char, - pub desc_len: size_t, - pub desc: *mut c_char, -} - unsafe fn version(dev: Dev, mut buf: IoctlBuffer) -> Result { let mut vers = buf.read::()?; let version = dev.version()?; @@ -158,13 +147,6 @@ unsafe fn version(dev: Dev, mut buf: IoctlBuffer) -> Result { Ok(0) } -#[repr(C)] -#[derive(Debug, Default, Copy, Clone, Hash, PartialEq, Eq)] -pub struct drm_get_cap { - pub capability: u64, - pub value: u64, -} - unsafe fn get_cap(dev: Dev, mut buf: IoctlBuffer) -> Result { let mut cap = buf.read::()?; cap.value = dev.get_cap(cap.capability)?; @@ -172,36 +154,12 @@ unsafe fn get_cap(dev: Dev, mut buf: IoctlBuffer) -> Result { Ok(0) } -#[repr(C)] -#[derive(Debug, Default, Copy, Clone, Hash, PartialEq, Eq)] -pub struct drm_set_client_cap { - pub capability: u64, - pub value: u64, -} - unsafe fn set_client_cap(dev: Dev, mut buf: IoctlBuffer) -> Result { let mut cap = buf.read::()?; dev.set_client_cap(cap.capability, cap.value)?; Ok(0) } -#[repr(C)] -#[derive(Debug, Default, Copy, Clone, Hash, PartialEq, Eq)] -pub struct drm_mode_card_res { - 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, -} - unsafe fn mode_card_res(dev: Dev, mut buf: IoctlBuffer) -> Result { let mut res = buf.read::()?; let count = dev.display_count()?; @@ -239,40 +197,6 @@ unsafe fn mode_card_res(dev: Dev, mut buf: IoctlBuffer) -> Result { Ok(0) } -#[repr(C)] -#[derive(Debug, Default, Copy, Clone, Hash, PartialEq, Eq)] -pub struct drm_mode_modeinfo { - 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 type_: u32, - pub name: [c_char; 32], -} - -#[repr(C)] -#[derive(Debug, Default, Copy, Clone, Hash, PartialEq, Eq)] -pub struct drm_mode_crtc { - 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: drm_mode_modeinfo, -} - unsafe fn mode_get_crtc(dev: Dev, mut buf: IoctlBuffer) -> Result { let mut crtc = buf.read::()?; let i = id_index(crtc.crtc_id); @@ -289,16 +213,6 @@ unsafe fn mode_get_crtc(dev: Dev, mut buf: IoctlBuffer) -> Result { Ok(0) } -#[repr(C)] -#[derive(Debug, Default, Copy, Clone, Hash, PartialEq, Eq)] -pub struct drm_mode_get_encoder { - pub encoder_id: u32, - pub encoder_type: u32, - pub crtc_id: u32, - pub possible_crtcs: u32, - pub possible_clones: u32, -} - unsafe fn mode_get_encoder(dev: Dev, mut buf: IoctlBuffer) -> Result { let mut enc = buf.read::()?; let i = id_index(enc.encoder_id); @@ -310,27 +224,6 @@ unsafe fn mode_get_encoder(dev: Dev, mut buf: IoctlBuffer) -> Result { Ok(0) } -#[repr(C)] -#[derive(Debug, Default, Copy, Clone, Hash, PartialEq, Eq)] -pub struct drm_mode_get_connector { - 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, -} - unsafe fn mode_get_connector(dev: Dev, mut buf: IoctlBuffer) -> Result { let mut conn = buf.read::()?; let i = id_index(conn.connector_id); @@ -346,18 +239,6 @@ unsafe fn mode_get_connector(dev: Dev, mut buf: IoctlBuffer) -> Result { Ok(0) } -#[repr(C)] -#[derive(Debug, Default, Copy, Clone, Hash, PartialEq, Eq)] -pub struct drm_mode_fb_cmd { - pub fb_id: u32, - pub width: u32, - pub height: u32, - pub pitch: u32, - pub bpp: u32, - pub depth: u32, - pub handle: u32, -} - unsafe fn mode_get_fb(dev: Dev, mut buf: IoctlBuffer) -> Result { let mut fb = buf.read::()?; let i = id_index(fb.fb_id); @@ -372,13 +253,6 @@ unsafe fn mode_get_fb(dev: Dev, mut buf: IoctlBuffer) -> Result { Ok(0) } -#[repr(C)] -#[derive(Debug, Default, Copy, Clone, Hash, PartialEq, Eq)] -pub struct drm_mode_get_plane_res { - pub plane_id_ptr: u64, - pub count_planes: u32, -} - unsafe fn mode_get_plane_res(dev: Dev, mut buf: IoctlBuffer) -> Result { let mut res = buf.read::()?; let count = dev.display_count()?; @@ -395,18 +269,6 @@ unsafe fn mode_get_plane_res(dev: Dev, mut buf: IoctlBuffer) -> Result { Ok(0) } -#[repr(C)] -#[derive(Debug, Default, Copy, Clone, Hash, PartialEq, Eq)] -pub struct drm_mode_get_plane { - 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, -} - unsafe fn mode_get_plane(dev: Dev, mut buf: IoctlBuffer) -> Result { let mut plane = buf.read::()?; let i = id_index(plane.plane_id); @@ -423,16 +285,6 @@ unsafe fn mode_get_plane(dev: Dev, mut buf: IoctlBuffer) -> Result { Ok(0) } -#[repr(C)] -#[derive(Debug, Default, Copy, Clone, Hash, PartialEq, Eq)] -pub struct drm_mode_obj_get_properties { - pub props_ptr: u64, - pub prop_values_ptr: u64, - pub count_props: u32, - pub obj_id: u32, - pub obj_type: u32, -} - unsafe fn mode_obj_get_properties(dev: Dev, mut buf: IoctlBuffer) -> Result { let mut props = buf.read::()?; //TODO @@ -441,20 +293,6 @@ unsafe fn mode_obj_get_properties(dev: Dev, mut buf: IoctlBuffer) -> Result Result { let mut fb = buf.read::()?; let i = id_index(fb.fb_id); diff --git a/src/header/sys_ioctl/redox/graphics_ipc.rs b/src/header/sys_ioctl/redox/graphics_ipc.rs index 517fe6e8b6..374bd97ca0 100644 --- a/src/header/sys_ioctl/redox/graphics_ipc.rs +++ b/src/header/sys_ioctl/redox/graphics_ipc.rs @@ -22,20 +22,10 @@ pub struct Version { } pub const GET_CAP: u64 = 0x0C; -pub const CAP_DUMB_BUFFER: u64 = 0x1; -#[repr(C, packed)] -pub struct GetCap { - pub capability: u64, - pub value: u64, -} +pub use drm_sys::DRM_CAP_DUMB_BUFFER; pub const SET_CLIENT_CAP: u64 = 0x0D; -pub const CLIENT_CAP_CURSOR_PLANE_HOTSPOT: u64 = 6; -#[repr(C, packed)] -pub struct SetClientCap { - pub capability: u64, - pub value: u64, -} +pub use drm_sys::DRM_CLIENT_CAP_CURSOR_PLANE_HOTSPOT; // FIXME replace these with proper drm interfaces pub const DISPLAY_COUNT: u64 = 1;